From 15c04ebe04dbe9051b29d894e3500defe961f222 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 19 Nov 2016 18:43:45 +0100 Subject: [PATCH 001/230] updated app list --- docs/content/ref/apps.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/content/ref/apps.md b/docs/content/ref/apps.md index 818cb3ad..fb6be760 100644 --- a/docs/content/ref/apps.md +++ b/docs/content/ref/apps.md @@ -90,7 +90,7 @@ weight = 1 | `Npm` | [NPM](#Npm) | >=3.7.0 <4.0.0 | | | `NuGet` | [NuGet](#NuGet) | latest | | | `NUnit.Runners` | [NUnit 3 Runners](#NUnit.Runners) | latest | | -| `OpenSSL` | [OpenSSL](#OpenSSL) | 1.0.2h | | +| `OpenSSL` | [OpenSSL](#OpenSSL) | 1.1.0c | | | `Pandoc` | [Pandoc](#Pandoc) | 1.17.2 | | | `PHP5` | [PHP 5](#PHP5) | 5.6.23 | | | `PHP7` | [PHP 7](#PHP7) | 7.0.8 | | @@ -102,6 +102,7 @@ weight = 1 | `Python3` | [Python 3](#Python3) | 3.4.4 | | | `RabbitMQ` | [RabbitMQ](#RabbitMQ) | 3.6.5 | | | `Ruby` | [Ruby](#Ruby) | 2.3.1 | | +| `RubyGems` | [RubyGems](#RubyGems) | 2.6.8 | | | `Sass` | [SASS](#Sass) | latest | | | `Scribus` | [Scribus](#Scribus) | 1.4.6 | | | `Sift` | [Sift](#Sift) | 0.8.0 | | @@ -626,7 +627,7 @@ weight = 1 * ID: `OpenSSL` * Typ: `default` * Website: -* Version: 1.0.2h +* Version: 1.1.0c ### Pandoc {#Pandoc} @@ -708,13 +709,21 @@ weight = 1 * Website: * Version: 2.3.1 +### RubyGems {#RubyGems} + +* ID: `RubyGems` +* Typ: `default` +* Website: +* Version: 2.6.8 +* Dependencies: [Ruby](#Ruby) + ### SASS {#Sass} * ID: `Sass` * Typ: `ruby-package` * Website: * Version: latest -* Dependencies: [Ruby](#Ruby) +* Dependencies: [RubyGems](#RubyGems) ### Scribus {#Scribus} From e988d2f685c2feb9c308af4bae604d38e199b67a Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 22 Nov 2016 11:55:35 +0100 Subject: [PATCH 002/230] initialized Bench CLI project with ArgumentParser --- BenchManager/BenchCLI/ArgumentParser.cs | 297 ++++++++++++++++++ BenchManager/BenchCLI/BenchCLI.csproj | 60 ++++ BenchManager/BenchCLI/Program.cs | 36 +++ .../BenchCLI/Properties/AssemblyInfo.cs | 36 +++ BenchManager/BenchManager.sln | 6 + 5 files changed, 435 insertions(+) create mode 100644 BenchManager/BenchCLI/ArgumentParser.cs create mode 100644 BenchManager/BenchCLI/BenchCLI.csproj create mode 100644 BenchManager/BenchCLI/Program.cs create mode 100644 BenchManager/BenchCLI/Properties/AssemblyInfo.cs diff --git a/BenchManager/BenchCLI/ArgumentParser.cs b/BenchManager/BenchCLI/ArgumentParser.cs new file mode 100644 index 00000000..76705ed5 --- /dev/null +++ b/BenchManager/BenchCLI/ArgumentParser.cs @@ -0,0 +1,297 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Mastersign.Bench.Cli +{ + class ArgumentParser + { + public ParserType ParserType { get; set; } + + public string[] HelpIndicators = new[] { "/?", "-?", "-h", "--help" }; + + private readonly List arguments = new List(); + + public ArgumentParser(IEnumerable arguments) + { + ParserType = ParserType.CaseSensitive; + foreach (var arg in arguments) + { + RegisterArgument(arg); + } + } + + public ArgumentParser(params Argument[] arguments) + : this((IEnumerable)arguments) + { + } + + public void RegisterArgument(Argument arg) + { + arguments.Add(arg); + } + + private bool IsHelpIndicator(string v) + { + foreach (var i in HelpIndicators) + { + if (i.Equals(v, StringComparison.InvariantCultureIgnoreCase)) + { + return true; + } + } + return false; + } + + public ParsingResult Parse(string[] args) + { + var index = new ArgumentIndex(ParserType == ParserType.CaseSensitive, arguments); + IDictionary flagValues = new Dictionary(); + IDictionary optionValues = new Dictionary(); + string command = null; + var position = 0; + var help = false; + var invalid = false; + + while (position < args.Length && command == null) + { + var arg = args[position]; + if (IsHelpIndicator(arg)) + { + help = true; + break; + } + var a = index.LookUp(args[position]); + if (a == null) + { + invalid = true; + break; + } + switch (a.Type) + { + case ArgumentType.Flag: + flagValues[a.Name] = true; + break; + case ArgumentType.Option: + position++; + optionValues[a.Name] = args[position]; + break; + case ArgumentType.Command: + command = a.Name; + break; + default: + throw new NotSupportedException(); + } + position++; + } + if (help) + { + return new ParsingResult(ParsingResultType.Help, null, null, null, null); + } + if (invalid) + { + return new ParsingResult(ParsingResultType.InvalidArgument, args[position], null, null, null); + } + var rest = new string[args.Length - position]; + Array.Copy(args, position, rest, 0, rest.Length); + if (command != null) + { + return new ParsingResult(ParsingResultType.Command, null, rest, optionValues, flagValues); + } + return new ParsingResult(ParsingResultType.NoCommand, null, rest, optionValues, flagValues); + } + } + + class ArgumentIndex + { + private readonly Dictionary flags = new Dictionary(); + private readonly Dictionary flagMnemonics = new Dictionary(); + private readonly Dictionary options = new Dictionary(); + private readonly Dictionary optionMnemonics = new Dictionary(); + private readonly Dictionary commands = new Dictionary(); + + private readonly bool CaseSensitive; + + public ArgumentIndex(bool caseSensitive, IEnumerable args) + { + CaseSensitive = caseSensitive; + foreach (var arg in args) + { + AddArgument(arg); + } + } + + private string PrepareArgument(string arg) + { + if (arg == null) throw new ArgumentNullException(); + return CaseSensitive ? arg : arg.ToLowerInvariant(); + } + + private void AddArgument(Argument arg) + { + switch (arg.Type) + { + case ArgumentType.Flag: + flags[PrepareArgument(arg.Name)] = arg; + foreach (var alias in arg.Aliases) + { + flags[PrepareArgument(alias)] = arg; + } + flagMnemonics[PrepareArgument(arg.Mnemonic)] = arg; + break; + case ArgumentType.Option: + options[PrepareArgument(arg.Name)] = arg; + foreach (var alias in arg.Aliases) + { + options[PrepareArgument(alias)] = arg; + } + optionMnemonics[PrepareArgument(arg.Mnemonic)] = arg; + break; + case ArgumentType.Command: + commands[PrepareArgument(arg.Name)] = arg; + foreach (var alias in arg.Aliases) + { + commands[PrepareArgument(alias)] = arg; + } + break; + default: + throw new NotSupportedException(); + } + } + + public Argument LookUp(string v) + { + Argument a; + v = PrepareArgument(v); + if (v.StartsWith("--")) + { + var name = v.Substring(2); + if (flags.TryGetValue(name, out a)) return a; + if (options.TryGetValue(name, out a)) return a; + return null; + } + if (v.StartsWith("-")) + { + var mnemonic = v.Substring(1); + if (flagMnemonics.TryGetValue(mnemonic, out a)) return a; + if (optionMnemonics.TryGetValue(mnemonic, out a)) return a; + return null; + } + if (commands.TryGetValue(v, out a)) return a; + return null; + } + } + + enum ParserType + { + CaseSensitive, + CaseInsensitive + } + + enum ArgumentType + { + Flag, + Option, + Command + } + + class Argument + { + public ArgumentType Type { get; private set; } + + public string Name { get; private set; } + + public string Mnemonic { get; private set; } + + public string[] Aliases { get; private set; } + + public Argument(ArgumentType type, string name, string mnemonic = null, params string[] aliases) + { + Type = type; + Name = name; + Mnemonic = mnemonic ?? name.Substring(0, 1); + Aliases = aliases; + } + } + + class ParsingResult + { + public ParsingResultType Type { get; private set; } + + public string InvalidArgument { get; private set; } + + public string[] Rest { get; private set; } + + private readonly IDictionary options = new Dictionary(); + + private readonly IDictionary flags = new Dictionary(); + + public ParsingResult(ParsingResultType type, + string invalidArgument, string[] rest, + IDictionary options, IDictionary flags) + { + Type = type; + InvalidArgument = invalidArgument; + Rest = rest; + this.options = options; + this.flags = flags; + } + + public string GetOptionValue(string name, string def = null) + { + if (options == null) throw new InvalidOperationException(); + string res; + return options.TryGetValue(name, out res) ? res : def; + } + + public bool GetFlag(string name) + { + if (flags == null) throw new InvalidOperationException(); + return flags.ContainsKey(name); + } + + public override string ToString() + { + var sb = new StringBuilder(); + sb.AppendLine("Result Type: " + Type); + switch (Type) + { + case ParsingResultType.InvalidArgument: + sb.AppendLine("Invalid Argument: " + InvalidArgument); + break; + case ParsingResultType.Command: + case ParsingResultType.NoCommand: + if (flags.Count > 0) { + var flagNames = new List(flags.Keys); + sb.AppendLine("Flags: " + string.Join(", ", flagNames.ToArray())); + } + if (options.Count > 0) + { + sb.AppendLine("Options:"); + var optionNames = new List(options.Keys); + optionNames.Sort(); + foreach(var n in optionNames) + { + sb.AppendLine(" * " + n + " = " + options[n]); + } + } + if (Rest != null && Rest.Length > 0) + { + sb.AppendLine("Rest: " + string.Join(" ", Rest)); + } + break; + default: + break; + } + return sb.ToString(); + } + } + + enum ParsingResultType + { + InvalidArgument, + Help, + Command, + NoCommand + } +} diff --git a/BenchManager/BenchCLI/BenchCLI.csproj b/BenchManager/BenchCLI/BenchCLI.csproj new file mode 100644 index 00000000..cdbed5d1 --- /dev/null +++ b/BenchManager/BenchCLI/BenchCLI.csproj @@ -0,0 +1,60 @@ + + + + + Debug + AnyCPU + {64E94A41-026F-473C-BC48-70F8D5EB977A} + Exe + Properties + Mastersign.Bench.Cli + bench + v2.0 + 512 + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + {3ff60d62-d733-40e8-b759-848fae5fea93} + BenchLib + + + + + \ No newline at end of file diff --git a/BenchManager/BenchCLI/Program.cs b/BenchManager/BenchCLI/Program.cs new file mode 100644 index 00000000..6d0ca006 --- /dev/null +++ b/BenchManager/BenchCLI/Program.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Mastersign.Bench.Cli +{ + class Program + { + static void Main(string[] args) + { + var parser = MainParser(); + var result = parser.Parse(args); + Console.WriteLine(result); + } + + static ArgumentParser MainParser() + { + return new ArgumentParser( + new Argument(ArgumentType.Option, "verbosity", "v", "verb"), + new Argument(ArgumentType.Option, "logfile", "l", "log"), + new Argument(ArgumentType.Option, "root"), + + new Argument(ArgumentType.Command, "initialize"), + new Argument(ArgumentType.Command, "setup"), + new Argument(ArgumentType.Command, "update-env", "e"), + new Argument(ArgumentType.Command, "reinstall"), + new Argument(ArgumentType.Command, "renew", "n"), + new Argument(ArgumentType.Command, "upgrade"), + + new Argument(ArgumentType.Command, "config"), + new Argument(ArgumentType.Command, "downloads", "d", "dl"), + new Argument(ArgumentType.Command, "app"), + new Argument(ArgumentType.Command, "project")); + } + } +} diff --git a/BenchManager/BenchCLI/Properties/AssemblyInfo.cs b/BenchManager/BenchCLI/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..ff352f6d --- /dev/null +++ b/BenchManager/BenchCLI/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("Bench CLI")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Tobias Kiertscher")] +[assembly: AssemblyProduct("Bench")] +[assembly: AssemblyCopyright("Copyright © Tobias Kiertscher 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("64e94a41-026f-473c-bc48-70f8d5eb977a")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.14.0.0")] +[assembly: AssemblyFileVersion("0.14.0.0")] diff --git a/BenchManager/BenchManager.sln b/BenchManager/BenchManager.sln index ec6ac068..280015a2 100644 --- a/BenchManager/BenchManager.sln +++ b/BenchManager/BenchManager.sln @@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchLib.Test", "BenchLib.T EndProject Project("{7CF6DF6D-3B04-46F8-A40B-537D21BCA0B4}") = "BenchLibDocs", "BenchLibDocs\BenchLibDocs.shfbproj", "{64100396-695D-4424-8A39-9BA1849C49C7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchCLI", "BenchCLI\BenchCLI.csproj", "{64E94A41-026F-473C-BC48-70F8D5EB977A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -31,6 +33,10 @@ Global {B3109E41-23AA-4B9A-B701-4D2463B1EF1E}.Release|Any CPU.Build.0 = Release|Any CPU {64100396-695D-4424-8A39-9BA1849C49C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {64100396-695D-4424-8A39-9BA1849C49C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64E94A41-026F-473C-BC48-70F8D5EB977A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64E94A41-026F-473C-BC48-70F8D5EB977A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64E94A41-026F-473C-BC48-70F8D5EB977A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64E94A41-026F-473C-BC48-70F8D5EB977A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 865b9efa27096d5e31b897f3792f86abaa0bb696 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 22 Nov 2016 18:01:21 +0100 Subject: [PATCH 003/230] made IBenchManager disposable for Downloader and ProcessExecutionHost --- BenchManager/BenchLib/DefaultBenchManager.cs | 29 ++++++++++++++++++++ BenchManager/BenchLib/IBenchManager.cs | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/BenchManager/BenchLib/DefaultBenchManager.cs b/BenchManager/BenchLib/DefaultBenchManager.cs index 51dcd2c6..3174bb4a 100644 --- a/BenchManager/BenchLib/DefaultBenchManager.cs +++ b/BenchManager/BenchLib/DefaultBenchManager.cs @@ -53,6 +53,35 @@ public DefaultBenchManager(BenchConfiguration config) UI = new ConsoleUserInterface(); } + /// + /// Returns a value, indicating of this instance was already disposed. + /// + public bool IsDisposed { get; private set; } + + /// + /// Disposes all disposable child objects. + /// + public void Dispose() + { + if (IsDisposed) return; + IsDisposed = true; + var d = Downloader; + if (d != null) + { + Downloader = null; + d.Dispose(); + } + var peh = ProcessExecutionHost; + if (peh != null) + { + ProcessExecutionHost = null; + peh.Dispose(); + } + Config = null; + Env = null; + UI = null; + } + /// /// A flag, controlling if non error messages should be displayed to the user. /// If it is set to true, all messages are displayed; otherwise only diff --git a/BenchManager/BenchLib/IBenchManager.cs b/BenchManager/BenchLib/IBenchManager.cs index 28a86c3e..357ef9e8 100644 --- a/BenchManager/BenchLib/IBenchManager.cs +++ b/BenchManager/BenchLib/IBenchManager.cs @@ -7,7 +7,7 @@ namespace Mastersign.Bench /// /// A Bench manager is an object which knows the most important components of a Bench system. /// - public interface IBenchManager + public interface IBenchManager : IDisposable { /// /// The configuration of the Bench system. From 69f3bb1df7da7ebf6860766bc37a596e9379c2ce Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 22 Nov 2016 18:02:23 +0100 Subject: [PATCH 004/230] implemented first CLI commands bench initialize, setup, update-env, reinstall, renew bench app property --- BenchManager/BenchCLI/AppController.cs | 83 +++++++ BenchManager/BenchCLI/ArgumentParser.cs | 102 +++++++-- BenchManager/BenchCLI/BenchCLI.csproj | 4 + BenchManager/BenchCLI/Controller.cs | 86 +++++++ BenchManager/BenchCLI/HelpFormatter.cs | 79 +++++++ BenchManager/BenchCLI/MainController.cs | 293 ++++++++++++++++++++++++ BenchManager/BenchCLI/Program.cs | 31 +-- 7 files changed, 638 insertions(+), 40 deletions(-) create mode 100644 BenchManager/BenchCLI/AppController.cs create mode 100644 BenchManager/BenchCLI/Controller.cs create mode 100644 BenchManager/BenchCLI/HelpFormatter.cs create mode 100644 BenchManager/BenchCLI/MainController.cs diff --git a/BenchManager/BenchCLI/AppController.cs b/BenchManager/BenchCLI/AppController.cs new file mode 100644 index 00000000..1d5a87bf --- /dev/null +++ b/BenchManager/BenchCLI/AppController.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Mastersign.Bench.Cli +{ + class AppController : Controller + { + private readonly ArgumentParser parser = + new ArgumentParser( + new Argument(ArgumentType.Command, "property", "p", + "Reads an app property value.", + "prop")); + + private readonly MainController mainController; + + public AppController(MainController mainController, string[] args) + { + this.mainController = mainController; + Verbose = mainController.Verbose; + Arguments = parser.Parse(args); + } + + protected override void PrintHelp() + { + Console.WriteLine("Bench CLI v" + Program.Version()); + Console.WriteLine("Command: app"); + Console.WriteLine("----------------------------------------"); + Console.WriteLine(); + Console.WriteLine("Usage:"); + Console.WriteLine(" bench app arg*"); + Console.WriteLine(" bench app (/? | -? | -h | --help)"); + Console.WriteLine(HelpFormatter.GenerateHelp(parser)); + } + + protected override void PrintHelpHint() + { + WriteLine("Use 'bench app -?' to display the help."); + } + + protected override bool ExecuteCommand(string command, string[] args) + { + WriteDetail("App Command: " + command); + WriteDetail(""); + switch (command) + { + case "property": + return TaskReadProperty(args); + + default: + WriteError("Unsupported command: " + command + "."); + return false; + } + } + + private bool TaskReadProperty(string[] args) + { + if (args.Length != 2) + { + WriteError("Invalid arguments."); + WriteError("Expected: bench app property "); + return false; + } + var appId = args[0]; + var propertyName = args[1]; + + var cfg = mainController.LoadConfiguration(); + if (!cfg.Apps.Exists(appId)) + { + WriteError("Unknown app ID: " + appId); + return false; + } + WriteDetail("App ID: " + appId); + if (!cfg.ContainsGroupValue(appId, propertyName)) + { + WriteError("Unknown property: " + propertyName); + } + WriteDetail("Property: " + propertyName); + Console.Write(cfg.GetGroupValue(appId, propertyName)); + return true; + } + } +} diff --git a/BenchManager/BenchCLI/ArgumentParser.cs b/BenchManager/BenchCLI/ArgumentParser.cs index 76705ed5..27010177 100644 --- a/BenchManager/BenchCLI/ArgumentParser.cs +++ b/BenchManager/BenchCLI/ArgumentParser.cs @@ -6,7 +6,7 @@ namespace Mastersign.Bench.Cli { class ArgumentParser { - public ParserType ParserType { get; set; } + public ArgumentParserType ParserType { get; set; } public string[] HelpIndicators = new[] { "/?", "-?", "-h", "--help" }; @@ -14,7 +14,7 @@ class ArgumentParser public ArgumentParser(IEnumerable arguments) { - ParserType = ParserType.CaseSensitive; + ParserType = ArgumentParserType.CaseSensitive; foreach (var arg in arguments) { RegisterArgument(arg); @@ -31,6 +31,35 @@ public void RegisterArgument(Argument arg) arguments.Add(arg); } + private Argument[] FilterArguments(ArgumentType type) + { + var res = new List(); + foreach (var a in arguments) + { + if (a.Type == type) + { + res.Add(a); + } + } + res.Sort((a, b) => a.Name.CompareTo(b.Name)); + return res.ToArray(); + } + + public Argument[] GetFlags() + { + return FilterArguments(ArgumentType.Flag); + } + + public Argument[] GetOptions() + { + return FilterArguments(ArgumentType.Option); + } + + public Argument[] GetCommands() + { + return FilterArguments(ArgumentType.Command); + } + private bool IsHelpIndicator(string v) { foreach (var i in HelpIndicators) @@ -43,9 +72,9 @@ private bool IsHelpIndicator(string v) return false; } - public ParsingResult Parse(string[] args) + public ArgumentParsingResult Parse(string[] args) { - var index = new ArgumentIndex(ParserType == ParserType.CaseSensitive, arguments); + var index = new ArgumentIndex(ParserType == ArgumentParserType.CaseSensitive, arguments); IDictionary flagValues = new Dictionary(); IDictionary optionValues = new Dictionary(); string command = null; @@ -86,19 +115,19 @@ public ParsingResult Parse(string[] args) } if (help) { - return new ParsingResult(ParsingResultType.Help, null, null, null, null); + return new ArgumentParsingResult(ArgumentParsingResultType.Help, null, null, null, null, null); } if (invalid) { - return new ParsingResult(ParsingResultType.InvalidArgument, args[position], null, null, null); + return new ArgumentParsingResult(ArgumentParsingResultType.InvalidArgument, null, args[position], null, null, null); } var rest = new string[args.Length - position]; Array.Copy(args, position, rest, 0, rest.Length); if (command != null) { - return new ParsingResult(ParsingResultType.Command, null, rest, optionValues, flagValues); + return new ArgumentParsingResult(ArgumentParsingResultType.Command, command, null, rest, optionValues, flagValues); } - return new ParsingResult(ParsingResultType.NoCommand, null, rest, optionValues, flagValues); + return new ArgumentParsingResult(ArgumentParsingResultType.NoCommand, null, null, rest, optionValues, flagValues); } } @@ -109,6 +138,7 @@ class ArgumentIndex private readonly Dictionary options = new Dictionary(); private readonly Dictionary optionMnemonics = new Dictionary(); private readonly Dictionary commands = new Dictionary(); + private readonly Dictionary commandMnemonics = new Dictionary(); private readonly bool CaseSensitive; @@ -153,6 +183,7 @@ private void AddArgument(Argument arg) { commands[PrepareArgument(alias)] = arg; } + commandMnemonics[PrepareArgument(arg.Mnemonic)] = arg; break; default: throw new NotSupportedException(); @@ -178,11 +209,12 @@ public Argument LookUp(string v) return null; } if (commands.TryGetValue(v, out a)) return a; + if (commandMnemonics.TryGetValue(v, out a)) return a; return null; } } - enum ParserType + enum ArgumentParserType { CaseSensitive, CaseInsensitive @@ -205,18 +237,46 @@ class Argument public string[] Aliases { get; private set; } - public Argument(ArgumentType type, string name, string mnemonic = null, params string[] aliases) + public string Description { get; private set; } + + public Argument(ArgumentType type, string name, string mnemonic, + string description, params string[] aliases) { Type = type; Name = name; Mnemonic = mnemonic ?? name.Substring(0, 1); Aliases = aliases; + Description = description; + } + } + + delegate bool OptionValuePredicate(string value); + + class OptionArgument : Argument + { + public string PossibleValueInfo { get; private set; } + + public string DefaultValueInfo { get; private set; } + + public OptionValuePredicate ValuePredicate { get; private set; } + + public OptionArgument(string name, string mnemonic, + string description, string possibleValueInfo, string defaultValueInfo, + OptionValuePredicate valuePredicate, + params string[] aliases) + : base(ArgumentType.Option, name, mnemonic, description, aliases) + { + PossibleValueInfo = possibleValueInfo; + DefaultValueInfo = defaultValueInfo; + ValuePredicate = valuePredicate; } } - class ParsingResult + class ArgumentParsingResult { - public ParsingResultType Type { get; private set; } + public ArgumentParsingResultType Type { get; private set; } + + public string Command { get; private set; } public string InvalidArgument { get; private set; } @@ -226,11 +286,12 @@ class ParsingResult private readonly IDictionary flags = new Dictionary(); - public ParsingResult(ParsingResultType type, - string invalidArgument, string[] rest, + public ArgumentParsingResult(ArgumentParsingResultType type, + string command, string invalidArgument, string[] rest, IDictionary options, IDictionary flags) { Type = type; + Command = command; InvalidArgument = invalidArgument; Rest = rest; this.options = options; @@ -256,12 +317,13 @@ public override string ToString() sb.AppendLine("Result Type: " + Type); switch (Type) { - case ParsingResultType.InvalidArgument: + case ArgumentParsingResultType.InvalidArgument: sb.AppendLine("Invalid Argument: " + InvalidArgument); break; - case ParsingResultType.Command: - case ParsingResultType.NoCommand: - if (flags.Count > 0) { + case ArgumentParsingResultType.Command: + case ArgumentParsingResultType.NoCommand: + if (flags.Count > 0) + { var flagNames = new List(flags.Keys); sb.AppendLine("Flags: " + string.Join(", ", flagNames.ToArray())); } @@ -270,7 +332,7 @@ public override string ToString() sb.AppendLine("Options:"); var optionNames = new List(options.Keys); optionNames.Sort(); - foreach(var n in optionNames) + foreach (var n in optionNames) { sb.AppendLine(" * " + n + " = " + options[n]); } @@ -287,7 +349,7 @@ public override string ToString() } } - enum ParsingResultType + enum ArgumentParsingResultType { InvalidArgument, Help, diff --git a/BenchManager/BenchCLI/BenchCLI.csproj b/BenchManager/BenchCLI/BenchCLI.csproj index cdbed5d1..f3b4174c 100644 --- a/BenchManager/BenchCLI/BenchCLI.csproj +++ b/BenchManager/BenchCLI/BenchCLI.csproj @@ -39,7 +39,11 @@ + + + + diff --git a/BenchManager/BenchCLI/Controller.cs b/BenchManager/BenchCLI/Controller.cs new file mode 100644 index 00000000..7646aa4a --- /dev/null +++ b/BenchManager/BenchCLI/Controller.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Mastersign.Bench.Cli +{ + abstract class Controller + { + protected ArgumentParsingResult Arguments { get; set; } + + public bool Verbose { get; protected set; } + + protected void WriteError(string message) + { + var colorBackup = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine(message); + Console.ForegroundColor = colorBackup; + } + + protected void WriteLine(string message) + { + Console.WriteLine(message); + } + + protected void WriteInfo(string message) + { + if (!Verbose) return; + var colorBackup = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Cyan; + Console.WriteLine(message); + Console.ForegroundColor = colorBackup; + } + + protected void WriteDetail(string message) + { + if (!Verbose) return; + var colorBackup = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.DarkGray; + Console.WriteLine(message); + Console.ForegroundColor = colorBackup; + } + + public bool Execute() + { + switch (Arguments.Type) + { + case ArgumentParsingResultType.Help: + PrintHelp(); + return true; + case ArgumentParsingResultType.InvalidArgument: + PrintInvalidArgumentWarning(Arguments.InvalidArgument); + return false; + case ArgumentParsingResultType.Command: + return ExecuteCommand(Arguments.Command, Arguments.Rest); + case ArgumentParsingResultType.NoCommand: + PrintNoCommandWarning(); + return false; + default: + WriteError("Argument parsing result not supported."); + return false; + } + } + + protected virtual void PrintHelpHint() + { + WriteLine("Use 'bench -?' to display the help."); + } + + private void PrintInvalidArgumentWarning(string arg) + { + WriteError("Invalid Argument: " + arg); + PrintHelpHint(); + } + + private void PrintNoCommandWarning() + { + WriteError("No command given."); + PrintHelpHint(); + } + + protected abstract void PrintHelp(); + + protected abstract bool ExecuteCommand(string command, string[] args); + } +} diff --git a/BenchManager/BenchCLI/HelpFormatter.cs b/BenchManager/BenchCLI/HelpFormatter.cs new file mode 100644 index 00000000..4e987774 --- /dev/null +++ b/BenchManager/BenchCLI/HelpFormatter.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Mastersign.Bench.Cli +{ + static class HelpFormatter + { + private static string FormatFlag(Argument a) + { + return "--" + a.Name + + (a.Aliases.Length > 0 + ? " | --" + string.Join(" | --", a.Aliases) + : "") + + " | -" + a.Mnemonic; + } + + private static string FormatOption(Argument a) + { + return FormatFlag(a) + " "; + } + + private static string FormatCommand(Argument a) + { + return a.Name + + (a.Aliases.Length > 0 + ? ", " + string.Join(", ", a.Aliases) + : "") + + ", " + a.Mnemonic; + } + + public static string GenerateHelp(ArgumentParser parser) + { + var sb = new StringBuilder(); + sb.AppendLine(" /? | -? | -h | --help"); + sb.AppendLine(" Display the help."); + var flags = parser.GetFlags(); + if (flags.Length > 0) + { + sb.AppendLine(); + sb.AppendLine("Flags:"); + foreach (var flag in flags) + { + sb.AppendLine(" " + FormatFlag(flag)); + sb.AppendLine(" " + flag.Description); + } + } + var options = parser.GetOptions(); + if (options.Length > 0) + { + sb.AppendLine(); + sb.AppendLine("Options:"); + foreach (OptionArgument option in options) + { + sb.AppendLine(); + sb.AppendLine(FormatOption(option)); + sb.AppendLine(" " + option.Description); + sb.AppendLine(); + sb.AppendLine(" Expected: " + option.PossibleValueInfo); + sb.AppendLine(" Default: " + option.DefaultValueInfo); + } + } + var commands = parser.GetCommands(); + if (commands.Length > 0) + { + sb.AppendLine(); + sb.AppendLine("Commands:"); + foreach (var cmd in parser.GetCommands()) + { + sb.AppendLine(); + sb.AppendLine(FormatCommand(cmd)); + sb.AppendLine(" " + cmd.Description); + } + } + + return sb.ToString(); + } + } +} diff --git a/BenchManager/BenchCLI/MainController.cs b/BenchManager/BenchCLI/MainController.cs new file mode 100644 index 00000000..f981be70 --- /dev/null +++ b/BenchManager/BenchCLI/MainController.cs @@ -0,0 +1,293 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; + +namespace Mastersign.Bench.Cli +{ + class MainController : Controller + { + private static bool ContainsOneOfChars(string v, char[] chars) + { + foreach (var c in chars) + { + if (v.Contains(new string(new[] { c }))) return true; + } + return false; + } + + private static bool IsValidPath(string v) + { + return !ContainsOneOfChars(v, Path.GetInvalidFileNameChars()) + && !ContainsOneOfChars(v, Path.GetInvalidPathChars()); + } + + private static ArgumentParser parser + = new ArgumentParser( + new OptionArgument("verbosity", "v", + "Controls the verbosity of the output.", + "s(ilent), v(erbose", "silent", + v => !string.IsNullOrEmpty(v) && + ("silent".StartsWith(v, StringComparison.OrdinalIgnoreCase) || + "verbose".StartsWith(v, StringComparison.OrdinalIgnoreCase)), + "verb"), + new OptionArgument("logfile", "l", + "Specifies a custom location for the log file.", + "A path to the log file.", + "Auto generated filename in \\log\\.", + IsValidPath, + "log"), + new OptionArgument("root", "r", + "Specifies the root directory of the Bench environment.", + "A path to a valid Bench root directory.", + "The root directory of the Bench environment, this Bench CLI belongs to.", + v => IsValidPath(v) && Directory.Exists(v), + "base"), + + new Argument(ArgumentType.Command, "initialize", "i", + "Initialize the Bench configuration and start the setup process."), + new Argument(ArgumentType.Command, "setup", "s", + "Run the auto-setup for the active Bench apps."), + new Argument(ArgumentType.Command, "update-env", "e", + "Update the paths in the Bench environment."), + new Argument(ArgumentType.Command, "reinstall", "r", + "Remove all installed apps, then install all active apps."), + new Argument(ArgumentType.Command, "renew", "n", + "Redownload all app resources, remove all installed apps, then install all active apps."), + new Argument(ArgumentType.Command, "upgrade", "u", + "Download the latest Bench release and run the auto-setup."), + + new Argument(ArgumentType.Command, "config", "c", + "Read or write values from the user configuration.", + "cfg"), + new Argument(ArgumentType.Command, "downloads", "d", + "Manage the app resource cache.", + "cache", "dl"), + new Argument(ArgumentType.Command, "app", "a", + "Manage individual apps."), + new Argument(ArgumentType.Command, "project", "p", + "Manage projects in the Bench environment.", + "prj")); + + public MainController(string[] args) + { + Arguments = parser.Parse(args); + Verbose = GetVerboseValue(Arguments); + } + + private static bool GetVerboseValue(ArgumentParsingResult arguments) + { + return "verbose".StartsWith( + arguments.GetOptionValue("verbosity", "silent"), + StringComparison.OrdinalIgnoreCase); + } + + private static string MyPath() + { + return Path.GetDirectoryName(Program.CliExecutable()); + } + + private static string DefaultRootPath() + { + var rootPath = Path.GetFullPath(Path.Combine(Path.Combine(MyPath(), ".."), "..")); + return File.Exists(Path.Combine(rootPath, @"res\apps.md")) ? rootPath : null; + } + + private string DashboardExecutable() + { + if (!BenchTasks.IsDashboardSupported) return null; + var path = Path.Combine(MyPath(), "BenchDashboard.exe"); + return File.Exists(path) ? path : null; + } + + public string RootPath + { + get + { + var p = Arguments.GetOptionValue("root", DefaultRootPath()); + return Path.IsPathRooted(p) + ? p : Path.Combine(Environment.CurrentDirectory, p); + } + } + + public string LogFilePath + { + get + { + var p = Arguments.GetOptionValue("logfile"); + return p == null || Path.IsPathRooted(p) + ? p : Path.Combine(Environment.CurrentDirectory, p); + } + } + + protected override void PrintHelp() + { + Console.WriteLine("Bench CLI v" + Program.Version()); + Console.WriteLine("----------------------------------------"); + Console.WriteLine(); + Console.WriteLine("Usage:"); + Console.WriteLine(" bench (/? | -? | -h | --help)"); + Console.WriteLine(" bench ( | public string ID { get { return AppName; } } + internal static string NamespaceFromId(string id) + { + var p = id.LastIndexOf(NS_SEPARATOR); + return p < 0 ? string.Empty : id.Substring(0, p); + } + + /// + /// Gets the namespace part of the apps ID. + /// + public string Namespace => NamespaceFromId(ID); + + internal static string PathSegmentFromId(string id) + { + return id.ToLowerInvariant().Replace(NS_SEPARATOR, IOPath.DirectorySeparatorChar); + } + + /// + /// Gets a part for a filesystem path, which represents the id of this app. + /// + public string PathSegment => PathSegmentFromId(ID); + + internal static string NamespacePathSegmentFromId(string id) + { + var ns = NamespaceFromId(id); + return string.IsNullOrEmpty(ns) + ? string.Empty + : ns.ToLowerInvariant().Replace(NS_SEPARATOR, IOPath.DirectorySeparatorChar); + } + + /// + /// Gets a part for a filesystem path, which represents the namespace of this app. + /// + public string NamespacePathSegment => NamespacePathSegmentFromId(ID); + + internal static string NameFromId(string id) + { + var p = id.LastIndexOf(NS_SEPARATOR); + return p < 0 ? id : id.Substring(p + 1); + } + + /// + /// Gets the name part of the apps ID. + /// + public string Name => NameFromId(ID); + + /// + /// Gets the app library, this app is defined in. + /// + public AppLibrary AppLibrary => AppIndex.GetGroupMetadata(AppName) as AppLibrary; + /// /// Gets the label of the app. /// @@ -408,8 +463,8 @@ public bool IsAdornmentRequired get { return (RegistryKeys.Length > 0 && AppIndex.GetBooleanValue(PropertyKeys.UseRegistryIsolation)) - || File.Exists(GetCustomScriptFile("pre-run")) - || File.Exists(GetCustomScriptFile("post-run")); + || File.Exists(GetCustomScript("pre-run")) + || File.Exists(GetCustomScript("post-run")); } } @@ -502,16 +557,58 @@ internal string GetLauncherScriptFile() ID.ToLowerInvariant() + ".cmd"); } - internal string GetCustomScriptFile(string typ) + /// + /// Gets a path to a custom script file for this app. + /// + /// The typ of the custom script (e.g. setup). + /// A path to the script file or null if no custom script exists. + public string GetCustomScript(string typ) { + var relativePath = IOPath.Combine( + AppIndex.GetStringValue(PropertyKeys.AppLibCustomScriptDirName), + NamespacePathSegment); + var scriptName = string.Format("{0}.{1}.ps1", Name.ToLowerInvariant(), typ); + var userPath = IOPath.Combine( - IOPath.Combine(AppIndex.GetStringValue(PropertyKeys.CustomConfigDir), "apps"), - ID.ToLowerInvariant() + "." + typ + ".ps1"); + IOPath.Combine(AppIndex.GetStringValue(PropertyKeys.CustomConfigDir), relativePath), + scriptName); if (File.Exists(userPath)) return userPath; - var integratedPath = IOPath.Combine( - IOPath.Combine(AppIndex.GetStringValue(PropertyKeys.BenchAuto), "apps"), - ID.ToLowerInvariant() + "." + typ + ".ps1"); - if (File.Exists(integratedPath)) return integratedPath; + + if (AppLibrary != null) + { + var libraryPath = IOPath.Combine( + IOPath.Combine(AppLibrary.BaseDir, relativePath), + scriptName); + if (File.Exists(libraryPath)) return libraryPath; + } + return null; + } + + /// + /// Gets a path to a setup resource file or directory. + /// + /// A relative path to a setup resource. + /// An absolute path to the resource or null, if the resource does not exists. + public string GetSetupResource(string relativeResourcePath) + { + var relativeDirPath = IOPath.Combine( + AppIndex.GetStringValue(PropertyKeys.AppLibResourceDirName), + NamespacePathSegment); + + var userPath = IOPath.Combine( + IOPath.Combine( + AppIndex.GetStringValue(PropertyKeys.CustomConfigDir), + relativeDirPath), + relativeResourcePath); + if (File.Exists(relativeResourcePath) || Directory.Exists(relativeResourcePath)) return userPath; + + if (AppLibrary != null) + { + var libraryPath = IOPath.Combine( + IOPath.Combine(AppLibrary.BaseDir, relativeDirPath), + relativeResourcePath); + if (File.Exists(libraryPath)) return libraryPath; + } return null; } @@ -1020,7 +1117,7 @@ public bool CanInstall get { return CanCheckInstallation && (!IsInstalled || Force) - || !CanCheckInstallation && GetCustomScriptFile("setup") != null; + || !CanCheckInstallation && GetCustomScript("setup") != null; } } @@ -1032,7 +1129,7 @@ public bool CanUninstall get { return CanCheckInstallation && IsInstalled - || !CanCheckInstallation && GetCustomScriptFile("remove") != null; + || !CanCheckInstallation && GetCustomScript("remove") != null; } } @@ -1047,8 +1144,8 @@ public bool CanReinstall && (!HasResource || IsResourceCached) && !IsManagedPackage || !CanCheckInstallation - && GetCustomScriptFile("remove") != null - && GetCustomScriptFile("setup") != null; + && GetCustomScript("remove") != null + && GetCustomScript("setup") != null; } } @@ -1070,8 +1167,8 @@ public bool CanUpgrade // Default app with custom setup and remove || !CanCheckInstallation && !IsManagedPackage - && GetCustomScriptFile("remove") != null - && GetCustomScriptFile("setup") != null; + && GetCustomScript("remove") != null + && GetCustomScript("setup") != null; } } @@ -1084,7 +1181,7 @@ public bool ShouldBeInstalled { return IsActive && (CanCheckInstallation && !IsInstalled - || !CanCheckInstallation && GetCustomScriptFile("setup") != null); + || !CanCheckInstallation && GetCustomScript("setup") != null); } } @@ -1097,7 +1194,7 @@ public bool ShouldBeRemoved { return !IsActive && (CanCheckInstallation && IsInstalled - || !CanCheckInstallation && GetCustomScriptFile("remove") != null); + || !CanCheckInstallation && GetCustomScript("remove") != null); } } diff --git a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs index 4f8fe0f8..ec31dfac 100644 --- a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs +++ b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs @@ -23,21 +23,26 @@ public string GetGroupCategory(string group) throw new NotSupportedException(); } - public object GetGroupValue(string appName, string key) + public object GetGroupMetadata(string group) + { + throw new NotSupportedException(); + } + + public object GetGroupValue(string appId, string key) { string appTyp; switch (key) { case PropertyKeys.AppLabel: - return appName; + return AppFacade.NameFromId(appId); case PropertyKeys.AppTyp: return AppTyps.Default; case PropertyKeys.AppArchiveTyp: return AppArchiveTyps.Auto; case PropertyKeys.AppPackageName: - return appName.ToLowerInvariant(); + return appId.ToLowerInvariant(); case PropertyKeys.AppDir: - appTyp = AppIndex.GetGroupValue(appName, PropertyKeys.AppTyp) as string; + appTyp = AppIndex.GetGroupValue(appId, PropertyKeys.AppTyp) as string; switch (appTyp) { case AppTyps.NodePackage: @@ -51,10 +56,10 @@ public object GetGroupValue(string appName, string key) case AppTyps.Meta: return null; default: - return appName.ToLowerInvariant(); + return AppFacade.PathSegmentFromId(appId); } case PropertyKeys.AppPath: - appTyp = AppIndex.GetGroupValue(appName, PropertyKeys.AppTyp) as string; + appTyp = AppIndex.GetGroupValue(appId, PropertyKeys.AppTyp) as string; switch (appTyp) { case AppTyps.NodePackage: @@ -72,41 +77,41 @@ public object GetGroupValue(string appName, string key) case AppTyps.NuGetPackage: return Path.Combine( Path.Combine( - AppIndex.GetGroupValue(appName, PropertyKeys.AppDir) as string, - AppIndex.GetGroupValue(appName, PropertyKeys.AppPackageName) as string), + AppIndex.GetGroupValue(appId, PropertyKeys.AppDir) as string, + AppIndex.GetGroupValue(appId, PropertyKeys.AppPackageName) as string), "tools"); default: - return AppIndex.GetGroupValue(appName, PropertyKeys.AppDir); + return AppIndex.GetGroupValue(appId, PropertyKeys.AppDir); } case PropertyKeys.AppExe: - appTyp = AppIndex.GetGroupValue(appName, PropertyKeys.AppTyp) as string; + appTyp = AppIndex.GetGroupValue(appId, PropertyKeys.AppTyp) as string; if (appTyp == AppTyps.Default) { return Path.Combine( - AppIndex.GetGroupValue(appName, PropertyKeys.AppDir) as string, - appName.ToLowerInvariant() + ".exe"); + AppIndex.GetGroupValue(appId, PropertyKeys.AppDir) as string, + AppFacade.NameFromId(appId).ToLowerInvariant() + ".exe"); } return null; case PropertyKeys.AppRegister: return true; case PropertyKeys.AppLauncherExecutable: - return AppIndex.GetGroupValue(appName, PropertyKeys.AppExe); + return AppIndex.GetGroupValue(appId, PropertyKeys.AppExe); case PropertyKeys.AppLauncherArguments: return new[] { "%*" }; case PropertyKeys.AppLauncherIcon: - return AppIndex.GetGroupValue(appName, PropertyKeys.AppLauncherExecutable); + return AppIndex.GetGroupValue(appId, PropertyKeys.AppLauncherExecutable); case PropertyKeys.AppSetupTestFile: - appTyp = AppIndex.GetGroupValue(appName, PropertyKeys.AppTyp) as string; + appTyp = AppIndex.GetGroupValue(appId, PropertyKeys.AppTyp) as string; switch (appTyp) { case AppTyps.NuGetPackage: return Path.Combine( Path.Combine( - AppIndex.GetGroupValue(appName, PropertyKeys.AppDir) as string, - AppIndex.GetGroupValue(appName, PropertyKeys.AppPackageName) as string), - AppIndex.GetGroupValue(appName, PropertyKeys.AppPackageName) + ".nupkg"); + AppIndex.GetGroupValue(appId, PropertyKeys.AppDir) as string, + AppIndex.GetGroupValue(appId, PropertyKeys.AppPackageName) as string), + AppIndex.GetGroupValue(appId, PropertyKeys.AppPackageName) + ".nupkg"); default: - return AppIndex.GetGroupValue(appName, PropertyKeys.AppExe); + return AppIndex.GetGroupValue(appId, PropertyKeys.AppExe); } default: throw new NotSupportedException(); diff --git a/BenchManager/BenchLib/AppKeys.cs b/BenchManager/BenchLib/AppKeys.cs index 279f3533..b21c9a02 100644 --- a/BenchManager/BenchLib/AppKeys.cs +++ b/BenchManager/BenchLib/AppKeys.cs @@ -10,39 +10,39 @@ namespace Mastersign.Bench public static class AppKeys { /// The app ID of 7-Zip. - public const string SevenZip = "7z"; + public const string SevenZip = "Bench.7z"; /// The app ID of Less MSI. - public const string LessMSI = "LessMsi"; + public const string LessMSI = "Bench.LessMsi"; /// The app ID of Inno Setup Unpacker. - public const string InnoSetupUnpacker = "InnoUnp"; + public const string InnoSetupUnpacker = "Bench.InnoUnp"; /// The app ID of ConEmu. - public const string ConEmu = "ConEmu"; + public const string ConEmu = "Bench.ConEmu"; /// The app ID of Git. - public const string Git = "Git"; + public const string Git = "Bench.Git"; /// The app ID of Node.js. - public const string NodeJS = "Node"; + public const string NodeJS = "Bench.Node"; /// The app ID of the Node.js package manager. - public const string Npm = "Npm"; + public const string Npm = "Bench.Npm"; /// The app ID of Ruby. - public const string Ruby = "Ruby"; + public const string Ruby = "Bench.Ruby"; /// The app ID of RubyGems. - public const string RubyGems = "RubyGems"; + public const string RubyGems = "Bench.RubyGems"; /// The app ID of Python 2. - public const string Python2 = "Python2"; + public const string Python2 = "Bench.Python2"; /// The app ID of Python 3. - public const string Python3 = "Python3"; + public const string Python3 = "Bench.Python3"; /// The app ID of NuGet. - public const string NuGet = "NuGet"; + public const string NuGet = "Bench.NuGet"; } } diff --git a/BenchManager/BenchLib/AppLibraryFacade.cs b/BenchManager/BenchLib/AppLibrary.cs similarity index 78% rename from BenchManager/BenchLib/AppLibraryFacade.cs rename to BenchManager/BenchLib/AppLibrary.cs index a0220a34..48188e25 100644 --- a/BenchManager/BenchLib/AppLibraryFacade.cs +++ b/BenchManager/BenchLib/AppLibrary.cs @@ -1,14 +1,15 @@ using System; using System.Collections.Generic; +using System.IO; using System.Text; namespace Mastersign.Bench { /// - /// This class is a facade to an app library. + /// This class represents an app library. /// It is initialized with an ID and an URL, and holds a reference to the . /// - public class AppLibraryFacade + public class AppLibrary { private readonly BenchConfiguration config; @@ -27,12 +28,12 @@ public class AppLibraryFacade public Uri Url { get; private set; } /// - /// Initializes a new instance of . + /// Initializes a new instance of . /// /// The Bench configuration. /// The uniqe ID of the app library. /// The URL of the app library. - public AppLibraryFacade(BenchConfiguration config, string id, Uri url) + public AppLibrary(BenchConfiguration config, string id, Uri url) { if (config == null) throw new ArgumentNullException(nameof(config)); if (id == null) throw new ArgumentNullException(nameof(id)); @@ -47,5 +48,12 @@ public AppLibraryFacade(BenchConfiguration config, string id, Uri url) ID = id; Url = url; } + + /// + /// Gets an absolute path to the base directory of the app library. + /// + public string BaseDir => Path.Combine( + config.GetStringValue(PropertyKeys.AppLibsDir), + ID.ToLowerInvariant()); } } diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index ee302699..8bd52c34 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -159,27 +159,36 @@ public BenchConfiguration(string benchRootDir, bool loadAppIndex, bool loadCusto if (loadAppIndex) { - var appIndexFile = GetStringValue(PropertyKeys.AppIndexFile); - Debug.WriteLine("Looking for application index: " + appIndexFile); - if (!File.Exists(appIndexFile)) + foreach (var l in AppLibraries) { - throw new FileNotFoundException("The default app index for Bench was not found.", appIndexFile); - } - using (var appIndexStream = File.OpenRead(appIndexFile)) - { - Debug.WriteLine("Reading default application index ..."); - parser.Parse(appIndexStream); + var appIndexFile = Path.Combine(l.BaseDir, GetStringValue(PropertyKeys.AppLibIndexFileName)); + Debug.WriteLine("Looking for app library index: " + appIndexFile); + if (!File.Exists(appIndexFile)) + { + throw new FileNotFoundException( + string.Format("The index of the app library '{0}' was not found.", l.ID), + appIndexFile); + } + parser.CurrentGroupMetadata = l; + using (var appIndexStream = File.OpenRead(appIndexFile)) + { + Debug.WriteLine("Reading index of app library '{0}' ...", l.ID); + parser.Parse(appIndexStream); + } + parser.CurrentGroupMetadata = null; } if (loadCustomConfiguration) { - var customAppIndexFile = GetStringValue(PropertyKeys.CustomAppIndexFile); - Debug.WriteLine("Looking for custom application index: " + customAppIndexFile); + var customAppIndexFile = Path.Combine( + GetStringValue(PropertyKeys.CustomConfigDir), + GetStringValue(PropertyKeys.AppLibIndexFileName)); + Debug.WriteLine("Looking for custom app library index: " + customAppIndexFile); if (File.Exists(customAppIndexFile)) { using (var customAppIndexStream = File.OpenRead(customAppIndexFile)) { - Debug.WriteLine("Reading custom application index ..."); + Debug.WriteLine("Reading custom app library index ..."); parser.Parse(customAppIndexStream); } } @@ -215,10 +224,12 @@ public string[] Sources } if (WithAppIndex) { - paths.Add(GetStringValue(PropertyKeys.AppIndexFile)); + // TODO paths.Add(GetStringValue(PropertyKeys.AppIndexFile)); if (WithCustomConfiguration) { - paths.Add(GetStringValue(PropertyKeys.CustomAppIndexFile)); + paths.Add(Path.Combine( + GetStringValue(PropertyKeys.CustomConfigDir), + GetStringValue(PropertyKeys.AppLibIndexFileName))); paths.Add(GetStringValue(PropertyKeys.AppActivationFile)); paths.Add(GetStringValue(PropertyKeys.AppDeactivationFile)); } @@ -374,11 +385,11 @@ private string GetBaseForPathProperty(string app, string property) /// /// The app libraries defined in the configuration property AppLibs. /// - public AppLibraryFacade[] AppLibraries + public AppLibrary[] AppLibraries { get { - var result = new List(); + var result = new List(); foreach (var item in GetStringListValue(PropertyKeys.AppLibs)) { var kvp = DictionaryValueResolver.ParseKeyValuePair(item); @@ -400,12 +411,26 @@ public AppLibraryFacade[] AppLibraries break; } } - result.Add(new AppLibraryFacade(this, id, url)); + result.Add(new AppLibrary(this, id, url)); } return result.ToArray(); } } + /// + /// Gets an app library by its ID. + /// + /// The ID of the app library. + /// An object or null if the ID was not found. + public AppLibrary GetAppLibrary(string id) + { + foreach (var l in AppLibraries) + { + if (l.ID == id) return l; + } + return null; + } + private static readonly Regex GitHubUrlPattern = new Regex(@"^github:(?[\dA-Za-z-_]+)/(?[\dA-Za-z-_]+)$"); private static readonly string GitHubUrlTemplate = "https://github.com/{0}/{1}/archive/master.zip"; diff --git a/BenchManager/BenchLib/BenchLib.csproj b/BenchManager/BenchLib/BenchLib.csproj index 4e34006f..7d2d5598 100644 --- a/BenchManager/BenchLib/BenchLib.csproj +++ b/BenchManager/BenchLib/BenchLib.csproj @@ -55,7 +55,7 @@ - + diff --git a/BenchManager/BenchLib/BenchTasks.cs b/BenchManager/BenchLib/BenchTasks.cs index 35dc7f2b..f758a9b5 100644 --- a/BenchManager/BenchLib/BenchTasks.cs +++ b/BenchManager/BenchLib/BenchTasks.cs @@ -160,7 +160,9 @@ public static BenchConfiguration InitializeCustomConfiguration(IBenchManager man FileSystem.AsureDir(cfg.GetStringValue(PropertyKeys.LibDir)); FileSystem.AsureDir(cfg.GetStringValue(PropertyKeys.ProjectRootDir)); - var customAppIndexFile = cfg.GetStringValue(PropertyKeys.CustomAppIndexFile); + var customAppIndexFile = Path.Combine( + cfg.GetStringValue(PropertyKeys.CustomConfigDir), + cfg.GetStringValue(PropertyKeys.AppLibIndexFileName)); if (!File.Exists(customAppIndexFile)) { var customAppIndexTemplateFile = cfg.GetStringValue(PropertyKeys.CustomAppIndexTemplateFile); @@ -1019,7 +1021,7 @@ private static void UnwrapSubDir(string targetDir) private static bool IsAppLibrary(BenchConfiguration config, string directory) { - var appIndexFileName = config.GetStringValue(PropertyKeys.AppIndexFileName); + var appIndexFileName = config.GetStringValue(PropertyKeys.AppLibIndexFileName); return File.Exists(Path.Combine(directory, appIndexFileName)); } @@ -1589,7 +1591,7 @@ private static void UpdateEnvironment(IBenchManager man, app.ID, null, e)); continue; } - var envScript = app.GetCustomScriptFile("env"); + var envScript = app.GetCustomScript("env"); if (envScript != null) { notify(new TaskProgress( @@ -1767,7 +1769,7 @@ private static void ExtractAppArchive(BenchConfiguration config, IProcessExecuti var targetDir = Path.Combine(config.GetStringValue(PropertyKeys.LibDir), app.Dir); var extractDir = app.ResourceArchivePath != null ? tmpDir : targetDir; FileSystem.AsureDir(extractDir); - var customExtractScript = app.GetCustomScriptFile("extract"); + var customExtractScript = app.GetCustomScript("extract"); switch (app.ResourceArchiveTyp) { case AppArchiveTyps.Auto: @@ -2119,7 +2121,7 @@ private static void InstallApps(IBenchManager man, } // 2. Custom Setup-Script - var customSetupScript = app.GetCustomScriptFile("setup"); + var customSetupScript = app.GetCustomScript("setup"); if (customSetupScript != null) { notify(new TaskProgress( @@ -2172,7 +2174,7 @@ private static void InstallApps(IBenchManager man, } // 5. Run Custom Environment Script - var envScript = app.GetCustomScriptFile("env"); + var envScript = app.GetCustomScript("env"); if (envScript != null) { notify(new TaskProgress( @@ -2327,7 +2329,7 @@ private static bool CanOmitUninstall(ICollection selectedApps, AppFac { if (selectedApp.ID == parentAppId) { - return app.GetCustomScriptFile("remove") == null; + return app.GetCustomScript("remove") == null; } } } @@ -2361,7 +2363,7 @@ private static void UninstallApps(IBenchManager man, string.Format("Uninstalling app {0}.", app.ID), progress, app.ID)); - var customScript = app.GetCustomScriptFile("remove"); + var customScript = app.GetCustomScript("remove"); try { if (customScript != null) diff --git a/BenchManager/BenchLib/PropertyKeys.cs b/BenchManager/BenchLib/PropertyKeys.cs index 1dd529e5..2697e509 100644 --- a/BenchManager/BenchLib/PropertyKeys.cs +++ b/BenchManager/BenchLib/PropertyKeys.cs @@ -35,8 +35,6 @@ public static class PropertyKeys public const string SiteConfigFileName = "SiteConfigFileName"; public const string SiteConfigTemplateFile = "SiteConfigTemplateFile"; - public const string AppIndexFile = "AppIndexFile"; - public const string CustomAppIndexFile = "CustomAppIndexFile"; public const string CustomAppIndexTemplateFile = "CustomAppIndexTemplateFile"; public const string AppActivationFile = "AppActivationFile"; public const string AppActivationTemplateFile = "AppActivationTemplateFile"; @@ -56,13 +54,14 @@ public static class PropertyKeys public const string DownloadDir = "DownloadDir"; public const string LibDir = "LibDir"; public const string AppLibs = "AppLibs"; - public const string AppIndexFileName = "AppIndexFileName"; public const string AppLibsDir = "AppLibsDir"; public const string AppLibsDownloadDir = "AppLibsDownloadDir"; + public const string AppLibIndexFileName = "AppLibIndexFileName"; + public const string AppLibCustomScriptDirName = "AppLibCustomScriptDirName"; + public const string AppLibResourceDirName = "AppLibResourceDirName"; public const string LogDir = "LogDir"; public const string LogFile = "LogFile"; public const string LogLevel = "LogLevel"; - public const string AppResourceBaseDir = "AppResourceBaseDir"; public const string AppAdornmentBaseDir = "AppAdornmentBaseDir"; public const string AppRegistryBaseDir = "AppRegistryBaseDir"; public const string LauncherDir = "LauncherDir"; diff --git a/auto/apps/git.env.ps1 b/auto/apps/git.env.ps1 deleted file mode 100644 index d740f0d3..00000000 --- a/auto/apps/git.env.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -$gitDir = App-Dir Git -$git = App-Exe Git - -pushd $gitDir -Write-Host "Running post-install script for Git ..." -copy "post-install.bat.bak" "post-install.bat" -try -{ - cmd /C "post-install.bat" | Out-Null -} -catch { } -popd - -if (Get-ConfigBooleanValue UseProxy) -{ - & $git config --global "http.proxy" $(Get-ConfigValue HttpProxy) - & $git config --global "https.proxy" $(Get-ConfigValue HttpsProxy) - & $git config --global "url.https://.insteadof" "git://" -} -else -{ - & $git config --global --unset "http.proxy" - & $git config --global --unset "https.proxy" - & $git config --global --unset "url.https://.insteadof" -} diff --git a/auto/apps/git.setup.ps1 b/auto/apps/git.setup.ps1 deleted file mode 100644 index b5a5cd23..00000000 --- a/auto/apps/git.setup.ps1 +++ /dev/null @@ -1,64 +0,0 @@ -$gitDir = App-Dir Git -$git = App-Exe Git -if (!$git) { throw "Git not found" } - -if (Test-Path "$gitDir\post-install.bat") -{ - Write-Host "Renaming Git post-install script to prevent deletion" - mv "$gitDir\post-install.bat" "$gitDir\post-install.bat.bak" -} - -pushd $gitDir -Write-Host "Running post-install script for Git ..." -copy "post-install.bat.bak" "post-install.bat" -try -{ - cmd /C "post-install.bat" | Out-Null -} -catch { } -popd - -$autocrlf = & $git config --global core.autocrlf -$pushDefault = & $git config --global push.default -$user = & $git config --global user.name -$email = & $git config --global user.email - -if (!$autocrlf) -{ - & $git config --global "core.autocrlf" "true" -} - -if (!$pushDefault) -{ - & $git config --global "push.default" "simple" -} - -if (Get-ConfigBooleanValue UseProxy) -{ - & $git config --global "http.proxy" $(Get-ConfigValue HttpProxy) - & $git config --global "https.proxy" $(Get-ConfigValue HttpsProxy) - & $git config --global "url.https://.insteadof" "git://" -} -else -{ - & $git config --global --unset "http.proxy" - & $git config --global --unset "https.proxy" - & $git config --global --unset "url.https://.insteadof" -} - -if (!$user -or !$email) -{ - Write-Host "Configuring your GIT identity ..." - if (!$user) - { - $user = Get-ConfigValue UserName - Write-Host "User Name: $user" - & $git config --global "user.name" $user - } - if (!$email) - { - $email = Get-ConfigValue UserEmail - Write-Host "Email: $email" - & $git config --global "user.email" $email - } -} diff --git a/auto/apps/npm.env.ps1 b/auto/apps/npm.env.ps1 deleted file mode 100644 index d2ba5c63..00000000 --- a/auto/apps/npm.env.ps1 +++ /dev/null @@ -1,14 +0,0 @@ -$node = App-Exe Node -$nodeDir = App-Dir Node -if (!$node) { throw "NodeJS not found" } -$npm = App-Exe Npm -if (!$npm) { throw "Node Package Manager not found" } - -& $npm config set registry "http://registry.npmjs.org/" -if (Get-ConfigBooleanValue UseProxy) { - & $npm config set "proxy" $(Get-ConfigValue HttpProxy) - & $npm config set "https-proxy" $(Get-ConfigValue HttpsProxy) -} else { - & $npm config delete "proxy" - & $npm config delete "https-proxy" -} diff --git a/auto/apps/npm.remove.ps1 b/auto/apps/npm.remove.ps1 deleted file mode 100644 index e7ab3105..00000000 --- a/auto/apps/npm.remove.ps1 +++ /dev/null @@ -1,7 +0,0 @@ -$node = App-Exe Node -$nodeDir = App-Dir Node -if (!$node) { throw "NodeJS not found" } -$npm = App-Exe Npm -if (!$npm) { throw "Node Package Manager not found" } - -& $node "$nodeDir\node_modules\npm\bin\npm-cli.js" remove --global "npm" diff --git a/auto/apps/npm.setup.ps1 b/auto/apps/npm.setup.ps1 deleted file mode 100644 index e887247b..00000000 --- a/auto/apps/npm.setup.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -$node = App-Exe Node -$nodeDir = App-Dir Node -if (!$node) { throw "NodeJS not found" } -$npm = App-Exe Npm -if (!$npm) { throw "Node Package Manager not found" } - -$currentNpmVersion = & $npm --version -if ($currentNpmVersion.Trim() -eq "1.4.12") { - $targetNpmVersion = App-Version Npm - & $node "$nodeDir\node_modules\npm\bin\npm-cli.js" install --global "`"npm@$targetNpmVersion`"" -} diff --git a/auto/apps/nuget.env.ps1 b/auto/apps/nuget.env.ps1 deleted file mode 100644 index a3d5384d..00000000 --- a/auto/apps/nuget.env.ps1 +++ /dev/null @@ -1,8 +0,0 @@ -$nugetExe = App-Exe NuGet -if (!$nugetExe) { throw "NuGet executable not found" } - -if (Get-ConfigBooleanValue UseProxy) { - & $nugetExe config -Set "HTTP_PROXY=$(Get-ConfigValue HttpProxy)" -} else { - & $nugetExe config -Set "HTTP_PROXY=" -} diff --git a/auto/apps/python2.setup.ps1 b/auto/apps/python2.setup.ps1 deleted file mode 100644 index 7300c725..00000000 --- a/auto/apps/python2.setup.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -$python = App-Exe Python2 -if (!$python) { throw "Python2 not found" } - -$pythonDir = App-Dir Python2 - -$pythonWrapper = [IO.Path]::Combine($pythonDir, "python2.cmd") -if (!(Test-Path $pythonWrapper)) { - Write-Host "Creating wrapper to call Python 2 via 'python2' ..." - "@CALL `"%~dp0\python.exe`" %*" | Out-File $pythonWrapper -Encoding default -} - -$pipPackageDir = [IO.Path]::Combine($pythonDir, "lib\site-packages\pip") -if (!(Test-Path $pipPackageDir -PathType Container)) { - Write-Host "Setting up PIP ..." - & $python -m ensurepip - pushd $pythonDir - & $python -m pip install --upgrade setuptools - & $python -m pip install --upgrade pip - popd -} diff --git a/auto/apps/python3.setup.ps1 b/auto/apps/python3.setup.ps1 deleted file mode 100644 index 2e2f966f..00000000 --- a/auto/apps/python3.setup.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -$python = App-Exe Python3 -if (!$python) { throw "Python3 not found" } - -$pythonDir = App-Dir Python3 - -$pythonWrapper = [IO.Path]::Combine($pythonDir, "python3.cmd") -if (!(Test-Path $pythonWrapper -PathType Leaf)) { - Write-Host "Creating wrapper to call Python 3 via 'python3' ..." - "@CALL `"%~dp0\python.exe`" %*" | Out-File $pythonWrapper -Encoding default -} - -$pipPackageDir = [IO.Path]::Combine($pythonDir, "lib\site-packages\pip") -if (!(Test-Path $pipPackageDir -PathType Container)) { - Write-Host "Setting up PIP ..." - & $python -m ensurepip - pushd $pythonDir - & $python -m pip install --upgrade setuptools - & $python -m pip install --upgrade pip - popd -} diff --git a/auto/apps/rubygems.setup.ps1 b/auto/apps/rubygems.setup.ps1 deleted file mode 100644 index 0ca65cf0..00000000 --- a/auto/apps/rubygems.setup.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -$ruby = App-Exe Ruby -$gemsTmpDir = App-Dir RubyGems - -$packageDir = gci "$gemsTmpDir\rubygems-*" | Sort-Object -Descending -cd $packageDir -ruby setup.rb diff --git a/res/apps-activated.template.txt b/res/apps-activated.template.txt index 24af1ab1..aa1c4af3 100644 --- a/res/apps-activated.template.txt +++ b/res/apps-activated.template.txt @@ -4,6 +4,6 @@ # This file contains the list with all activated apps. # The first word in a non-empty line, not commented out with #, is treated as an app ID. -Git # activated by default to support project versioning -Yeoman # activated by default to support actions\new-project.cmd -VSCode # activated as default text editor +Bench.Git # activated by default to support project versioning +Bench.Yeoman # activated by default to support actions\new-project.cmd +Bench.VSCode # activated as default text editor diff --git a/res/apps.md b/res/apps.md index 782a94e5..e64acc00 100644 --- a/res/apps.md +++ b/res/apps.md @@ -589,46 +589,6 @@ and much more. Hugo’s speed fosters creativity and makes building a website fu * Url: `https://github.com/spf13/hugo/releases/download/v$:Version$/$:ArchiveName$` * ArchiveName: `hugo_$:Version$_windows-32bit.zip` -### Node.js - -Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. -Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. -Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world. - -* ID: `Node` -* Label: Node.js -* Website: -* Docs: - + API Documentation: - + Guides: -* Version: 6.9.0 -* Url: `https://nodejs.org/dist/v$:Version$/win-x86/node.exe` -* ResourceName: `node.exe` -* Dir: `node` -* Exe: `node.exe` -* Launcher: $:Label$ - -### NPM - -npm is the package manager for JavaScript. -Find, share, and reuse packages of code from hundreds of thousands of -developers — and assemble them in powerful new ways. - -Because _Node.js_ is downloaded as bare executable, _NPM_ must be installed seperately. -But NPM, in its latest versions, is only distributed as part of the _Node.js_ setup. -_NPM_ 1.4.12 is the last version of _NPM_ which was released seperately. -Therefore, the latest version of _NPM_ is installed afterwards via the setup script `auto\apps\npm.setup.ps1`. - -* ID: `Npm` -* Label: NPM -* Dependencies: `Node` -* Website: -* Version: `>=3.7.0 <4.0.0` -* Url: -* ArchiveName: `npm-1.4.12.zip` -* Dir: `$Node:Dir$` -* Exe: `npm.cmd` - ### CoffeeScript * ID: `CoffeeScript` @@ -744,42 +704,6 @@ JSHint is a tool that helps to detect errors and potential problems in your Java * Version: `>=2.8.0 <3.0.0` * Exe: `jshint.cmd` -### Python 2 - -Python is a programming language that lets you work quickly and integrate systems more effectively. - -* ID: `Python2` -* Label: Python 2 -* Website: -* Docs: - + Documentation: - + Language Reference: - + Library Reference: -* Version: 2.7.12 -* Url: `https://www.python.org/ftp/python/$:Version$/$:ArchiveName$` -* ArchiveName: `python-$:Version$.msi` -* ArchivePath: `SourceDir` -* Path: `.`, `Scripts` -* Exe: `python.exe` - -### Python 3 - -Python is a programming language that lets you work quickly and integrate systems more effectively. - -* ID: `Python3` -* Label: Python 3 -* Website: -* Docs: - + Documentation: - + Language Reference: - + Library Reference: -* Version: 3.4.4 -* Url: `https://www.python.org/ftp/python/$:Version$/$:ArchiveName$` -* ArchiveName: `python-$:Version$.msi` -* ArchivePath: `SourceDir` -* Path: `.`, `Scripts` -* Exe: `python.exe` - ### PyReadline Required for colors in IPython. @@ -830,44 +754,6 @@ for Python 3: * Exe: `Scripts\ipython3.exe` * Launcher: $:Label$ -### Ruby - -A dynamic, open source programming language with a focus on simplicity and productivity. -It has an elegant syntax that is natural to read and easy to write. - -* ID: `Ruby` -* Website: -* Docs: - + Documentation: - + Programming Ruby: - + Libraries: -* Version: 2.3.1 -* Url: `http://dl.bintray.com/oneclick/rubyinstaller/$:ArchiveName$` -* ArchiveName: `rubyinstaller-$:Version$.exe` -* ArchiveTyp: `inno` -* ArchivePath: `{app}` -* Path: `bin` -* Exe: `bin\ruby.exe` -* Launcher: `Ruby` -* LauncherArguments: `$:Dir$\bin\irb` - -### RubyGems - -RubyGems is a package management framework for Ruby. - -* ID: `RubyGems` -* Website: -* Docs: - + Gems: - + Documentation: -* Dependencies: `Ruby` -* Version: 2.6.8 -* Url: `https://rubygems.org/rubygems/$:ArchiveName$` -* ArchiveName: `rubygems-$:Version$.zip` -* Dir: `$Ruby:Dir$\tmp` -* Register: false -* SetupTestFile: `$:Dir$\rubygems-$:Version$\setup.rb` - ### SASS Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. @@ -1215,23 +1101,6 @@ Erlang is a programming language used to build massively scalable soft real-time * Launcher: $:Label$ * LauncherExecutable: `$:ErtsDir$\bin\werl.exe` -### NuGet - -NuGet is the package manager for the Microsoft development platform including .NET. -The NuGet client tools provide the ability to produce and consume packages. -The NuGet Gallery is the central package repository used by all package authors and consumers. - -* ID: `NuGet` -* Website: -* Docs: - + Consume: - + Create: - + Command-Line: - + Configuration File: -* Version: latest -* Url: -* ResourceName: `nuget.exe` - ### NUnit 3 Runner NUnit is a unit-testing framework for all .Net languages. diff --git a/res/config.md b/res/config.md index 13aa6de1..1601062a 100644 --- a/res/config.md +++ b/res/config.md @@ -38,9 +38,11 @@ * LibDir: `lib` * AppLibs: + `core`: `github:mastersign/bench-apps-core` -* AppIndexFileName: `apps.md` * AppLibsDir: `$LibDir$\_applibs` * AppLibsDownloadDir: `$DownloadDir$\_applibs` +* AppLibIndexFileName: `apps.md` +* AppLibCustomScriptDirName: `scripts` +* AppLibResourceDirName: `res` * LogDir: `log` * HomeDir: `home` * AppDataDir: `$HomeDir$\AppData\Roaming` From 207b8a704d50155d0ceaeed57eaf0972cd5c6020 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 30 Dec 2016 19:21:04 +0100 Subject: [PATCH 109/230] added functions App-CustomScript and App-SetupResource to PowerShell API --- auto/lib/config.lib.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/auto/lib/config.lib.ps1 b/auto/lib/config.lib.ps1 index e1df34c3..fcd713d4 100644 --- a/auto/lib/config.lib.ps1 +++ b/auto/lib/config.lib.ps1 @@ -43,6 +43,8 @@ function App-LauncherArguments([string]$name) { return $global:BenchConfig.Apps[ function App-LauncherIcon([string]$name) { return $global:BenchConfig.Apps[$name].LauncherIcon } function App-SetupTestFile([string]$name) { return $global:BenchConfig.Apps[$name].SetupTestFile } function Check-App([string]$name) { return $global:BenchConfig.Apps[$name].IsInstalled } +function App-CustomScript([string]$name, [string]$typ) { return $global:BenchConfig.Apps[$name].GetCustomScript($typ) } +function App-SetupResource([string]$name, [string]$relPath) { return $global:BenchConfig.Apps[$name].GetSetupResource($relPath) } function App-Path([string]$name) { $path = $global:BenchConfig.Apps[$name].Path From d71d779efa0265c2a3bda7923dcd0bd6fa4ff345 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 2 Jan 2017 11:27:03 +0100 Subject: [PATCH 110/230] finished loading multiple app libraries --- BenchManager/BenchLib/BenchConfiguration.cs | 33 +++++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index 8bd52c34..35e7ec2e 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -49,7 +49,11 @@ public class BenchConfiguration : ResolvingPropertyCollection private const string AUTO_DIR = @"auto"; private const string BIN_DIR = AUTO_DIR + @"\bin"; private const string SCRIPTS_DIR = AUTO_DIR + @"\lib"; - private const string CONFIG_FILE = @"res\config.md"; + + /// + /// The relative path of the Bench configuration file. + /// + public const string CONFIG_FILE = @"res\config.md"; /// /// The property group category, which contains app definitions of required apps. @@ -163,19 +167,20 @@ public BenchConfiguration(string benchRootDir, bool loadAppIndex, bool loadCusto { var appIndexFile = Path.Combine(l.BaseDir, GetStringValue(PropertyKeys.AppLibIndexFileName)); Debug.WriteLine("Looking for app library index: " + appIndexFile); - if (!File.Exists(appIndexFile)) + if (File.Exists(appIndexFile)) { - throw new FileNotFoundException( - string.Format("The index of the app library '{0}' was not found.", l.ID), - appIndexFile); + parser.CurrentGroupMetadata = l; + using (var appIndexStream = File.OpenRead(appIndexFile)) + { + Debug.WriteLine("Reading index of app library '{0}' ...", l.ID); + parser.Parse(appIndexStream); + } + parser.CurrentGroupMetadata = null; } - parser.CurrentGroupMetadata = l; - using (var appIndexStream = File.OpenRead(appIndexFile)) + else { - Debug.WriteLine("Reading index of app library '{0}' ...", l.ID); - parser.Parse(appIndexStream); + Debug.WriteLine("Index file of app library '{0}' not found.", l.ID); } - parser.CurrentGroupMetadata = null; } if (loadCustomConfiguration) @@ -224,14 +229,16 @@ public string[] Sources } if (WithAppIndex) { - // TODO paths.Add(GetStringValue(PropertyKeys.AppIndexFile)); + foreach (var l in AppLibraries) + { + var appIndexFile = Path.Combine(l.BaseDir, GetStringValue(PropertyKeys.AppLibIndexFileName)); + if (File.Exists(appIndexFile)) paths.Add(appIndexFile); + } if (WithCustomConfiguration) { paths.Add(Path.Combine( GetStringValue(PropertyKeys.CustomConfigDir), GetStringValue(PropertyKeys.AppLibIndexFileName))); - paths.Add(GetStringValue(PropertyKeys.AppActivationFile)); - paths.Add(GetStringValue(PropertyKeys.AppDeactivationFile)); } } return paths.ToArray(); From 2f8b837623ebbf1ffc0f0dfbdcad5ea4be0ff8e9 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 2 Jan 2017 11:27:24 +0100 Subject: [PATCH 111/230] streamlined wording in short descriptions --- BenchManager/BenchCLI/Commands/RootCommand.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/BenchManager/BenchCLI/Commands/RootCommand.cs b/BenchManager/BenchCLI/Commands/RootCommand.cs index 102e4e89..fcafe88e 100644 --- a/BenchManager/BenchCLI/Commands/RootCommand.cs +++ b/BenchManager/BenchCLI/Commands/RootCommand.cs @@ -72,22 +72,22 @@ protected override void InitializeArgumentParser(ArgumentParser parser) var flagVerbose = new FlagArgument(FLAG_VERBOSE, 'v'); flagVerbose.Description - .Text("Activates verbose output."); + .Text("Activate verbose output."); var flagNoAssurance = new FlagArgument(FLAG_YES, 'y', "force"); flagNoAssurance.Description - .Text("Suppresses all assurance questions."); + .Text("Suppress all assurance questions."); var optionHelpFormat = new EnumOptionArgument( OPTION_HELP_FORMAT, 'f', DEF_HELP_FORMAT); optionHelpFormat.Description - .Text("Specifies the output format of help texts."); + .Text("Specify the output format of help texts."); var optionLogFile = new OptionArgument(OPTION_LOGFILE, 'l', ArgumentValidation.IsValidPath, "log"); optionLogFile.Description - .Text("Specifies a custom location for the log file."); + .Text("Specify a custom location for the log file."); optionLogFile.PossibleValueInfo .Text("A path to the log file."); optionLogFile.DefaultValueInfo @@ -100,7 +100,7 @@ protected override void InitializeArgumentParser(ArgumentParser parser) v => ArgumentValidation.IsValidPath(v) && Directory.Exists(v), "base"); optionBenchRoot.Description - .Text("Specifies the root directory of the Bench environment."); + .Text("Specify the root directory of the Bench environment."); optionBenchRoot.PossibleValueInfo .Text("A path to a valid Bench root directory."); optionBenchRoot.DefaultValueInfo @@ -108,19 +108,19 @@ protected override void InitializeArgumentParser(ArgumentParser parser) var commandHelp = new CommandArgument(helpCommand.Name, 'h'); commandHelp.Description - .Text("Displays the full help for all commands."); + .Text("Display the full help for all commands."); var commandList = new CommandArgument(listCommand.Name, 'l'); commandList.Description - .Text("Lists different kinds of objects in the Bench environment."); + .Text("List different kinds of objects in the Bench environment."); var commandDashboard = new CommandArgument(dashboardCommand.Name, 'b', "gui"); commandDashboard.Description - .Text("Starts the ").Emph("Bench Dashboard").Text("."); + .Text("Start the ").Emph("Bench Dashboard").Text("."); var commandManage = new CommandArgument(manageCommand.Name, 'm'); commandManage.Description - .Text("Manages the Bench environment and its configuration."); + .Text("Manage the Bench environment and its configuration."); var commandApp = new CommandArgument(appCommand.Name, 'a'); commandApp.Description From 2f3f0ed0ff9dedfe6223973b1a420ffd25dc3fa2 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 2 Jan 2017 11:27:53 +0100 Subject: [PATCH 112/230] added CLI command 'bench list files' --- BenchManager/BenchCLI/BenchCLI.csproj | 1 + BenchManager/BenchCLI/Commands/ListCommand.cs | 7 + .../Commands/ListConfigFilesCommand.cs | 168 ++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 BenchManager/BenchCLI/Commands/ListConfigFilesCommand.cs diff --git a/BenchManager/BenchCLI/BenchCLI.csproj b/BenchManager/BenchCLI/BenchCLI.csproj index 47516930..10bb14c9 100644 --- a/BenchManager/BenchCLI/BenchCLI.csproj +++ b/BenchManager/BenchCLI/BenchCLI.csproj @@ -68,6 +68,7 @@ + diff --git a/BenchManager/BenchCLI/Commands/ListCommand.cs b/BenchManager/BenchCLI/Commands/ListCommand.cs index 45fa1f0f..9fd94476 100644 --- a/BenchManager/BenchCLI/Commands/ListCommand.cs +++ b/BenchManager/BenchCLI/Commands/ListCommand.cs @@ -15,10 +15,12 @@ class ListCommand : BenchCommand private const DataOutputFormat DEF_FORMAT = DataOutputFormat.Plain; + private readonly BenchCommand listConfigFilesCommand = new ListConfigFilesCommand(); private readonly BenchCommand listAppsCommand = new ListAppsCommand(); public ListCommand() { + RegisterSubCommand(listConfigFilesCommand); RegisterSubCommand(listAppsCommand); } @@ -49,6 +51,10 @@ protected override void InitializeArgumentParser(ArgumentParser parser) optionFormat.Description .Text("Specifies the output format of the listed data."); + var commandListFiles = new CommandArgument(listConfigFilesCommand.Name, 'f'); + commandListFiles.Description + .Text("List configuration and app library index files."); + var commandListApps = new CommandArgument(listAppsCommand.Name, 'a'); commandListApps.Description .Text("List apps from the app library."); @@ -56,6 +62,7 @@ protected override void InitializeArgumentParser(ArgumentParser parser) parser.RegisterArguments( flagTable, optionFormat, + commandListFiles, commandListApps); } } diff --git a/BenchManager/BenchCLI/Commands/ListConfigFilesCommand.cs b/BenchManager/BenchCLI/Commands/ListConfigFilesCommand.cs new file mode 100644 index 00000000..54ea3ab0 --- /dev/null +++ b/BenchManager/BenchCLI/Commands/ListConfigFilesCommand.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Mastersign.CliTools; +using Mastersign.Docs; + +namespace Mastersign.Bench.Cli.Commands +{ + class ListConfigFilesCommand : BenchCommand + { + public override string Name => "files"; + + private const string OPTION_TYPE = "type"; + private const FileType DEF_TYPE = FileType.All; + + [Flags] + public enum FileType : int + { + All = 0xFFFF, + Config = 0x000F, + AppLib = 0x00F0, + AppSelection = 0x0F00, + BenchConfig = 0x0001, + UserConfig = 0x0002, + SiteConfig = 0x0004, + BenchAppLib = 0x0010, + UserAppLib = 0x0020, + Activation = 0x0100, + Deactivation = 0x0200, + } + + public class ConfigurationFile + { + public FileType Type { get; private set; } + + public int OrderIndex { get; private set; } + + public string Path { get; private set; } + + public ConfigurationFile(FileType type, int orderIndex, string path) + { + Type = type; + OrderIndex = orderIndex; + Path = path; + } + } + + protected override void InitializeArgumentParser(ArgumentParser parser) + { + parser.Description + .Begin(BlockType.Paragraph) + .Text("The ").Keyword(Name).Text(" command lists the paths of all loaded configuration files.") + .End(BlockType.Paragraph); + + var optionType = new EnumOptionArgument(OPTION_TYPE, 't', FileType.All); + optionType.Description + .Text("Specify the type of files to show."); + + parser.RegisterArguments( + optionType); + } + + private FileType Type => (FileType)Enum.Parse(typeof(FileType), + Arguments.GetOptionValue(OPTION_TYPE, DEF_TYPE.ToString())); + + private DataOutputFormat Format => ((ListCommand)Parent).Format; + + private bool OutputAsTable => ((ListCommand)Parent).OutputAsTable; + + protected override bool ExecuteCommand(string[] args) + { + List files = GetPaths(Type); + if (OutputAsTable) + { + using (var w = TableWriterFactory.Create(Format)) + { + w.Initialize(new[] { "Order", "Type", "Path" }); + foreach (var f in files) + { + w.Write(f.OrderIndex.ToString().PadLeft(5), f.Type.ToString(), f.Path); + } + } + } + else + { + foreach (var f in files) + { + Console.WriteLine(f.Path); + } + } + return true; + } + + private List GetPaths(FileType type) + { + var cfg = LoadConfiguration(true); + var files = new List(); + if ((type & FileType.BenchConfig) == FileType.BenchConfig) + { + files.Add(new ConfigurationFile(FileType.BenchConfig, 0, + Path.Combine( + cfg.BenchRootDir, + BenchConfiguration.CONFIG_FILE))); + } + if ((type & FileType.UserConfig) == FileType.UserConfig) + { + + var userConfigFile = cfg.GetStringValue(PropertyKeys.CustomConfigFile); + if (File.Exists(userConfigFile)) + { + files.Add(new ConfigurationFile(FileType.UserConfig, 1, + userConfigFile)); + } + } + if ((type & FileType.SiteConfig) == FileType.SiteConfig) + { + var siteConfigFiles = cfg.FindSiteConfigFiles(); + for (int i = 0; i < siteConfigFiles.Length; i++) + { + files.Add(new ConfigurationFile(FileType.SiteConfig, 10 + i, + siteConfigFiles[i])); + } + } + if ((type & FileType.BenchAppLib) == FileType.BenchAppLib) + { + var appLibraries = cfg.AppLibraries; + for (var i = 0; i < appLibraries.Length; i++) + { + files.Add(new ConfigurationFile(FileType.BenchAppLib, 100 + i, + Path.Combine( + appLibraries[i].BaseDir, + cfg.GetStringValue(PropertyKeys.AppLibIndexFileName)))); + } + } + if ((type & FileType.UserAppLib) == FileType.UserAppLib) + { + var userAppLib = Path.Combine( + cfg.GetStringValue(PropertyKeys.CustomConfigDir), + cfg.GetStringValue(PropertyKeys.AppLibIndexFileName)); + if (File.Exists(userAppLib)) + { + files.Add(new ConfigurationFile(FileType.UserAppLib, 999, + userAppLib)); + } + } + if ((type & FileType.Activation) == FileType.Activation) + { + var activationFile = cfg.GetStringValue(PropertyKeys.AppActivationFile); + if (File.Exists(activationFile)) + { + files.Add(new ConfigurationFile(FileType.Activation, 1000, + activationFile)); + } + } + if ((type & FileType.Deactivation) == FileType.Deactivation) + { + var deactivationFile = cfg.GetStringValue(PropertyKeys.AppDeactivationFile); + if (File.Exists(deactivationFile)) + { + files.Add(new ConfigurationFile(FileType.Deactivation, 1001, + deactivationFile)); + } + } + return files; + } + } +} From 0dad5a5ffc09bb76057be9d5ef3ab0bca1603907 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 2 Jan 2017 15:58:13 +0100 Subject: [PATCH 113/230] added default app library to the Bench configuration --- res/config.md | 1 + 1 file changed, 1 insertion(+) diff --git a/res/config.md b/res/config.md index 1601062a..13248b5c 100644 --- a/res/config.md +++ b/res/config.md @@ -38,6 +38,7 @@ * LibDir: `lib` * AppLibs: + `core`: `github:mastersign/bench-apps-core` + + `default`: `github:mastersign/bench-apps-default` * AppLibsDir: `$LibDir$\_applibs` * AppLibsDownloadDir: `$DownloadDir$\_applibs` * AppLibIndexFileName: `apps.md` From a66253110c5ec504321610edfbbb27fe80181832 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 2 Jan 2017 16:02:28 +0100 Subject: [PATCH 114/230] removed obsolete properties from res\config.md --- res/config.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/res/config.md b/res/config.md index 13248b5c..70b62608 100644 --- a/res/config.md +++ b/res/config.md @@ -20,18 +20,15 @@ * CustomConfigTemplateFile: `res\config.template.md` * SiteConfigFileName: `bench-site.md` * SiteConfigTemplateFile: `res\bench-site.template.md` -* AppIndexFile: `res\apps.md` * AppActivationFile: `$CustomConfigDir$\apps-activated.txt` * AppActivationTemplateFile: `res\apps-activated.template.txt` * AppDeactivationFile: `$CustomConfigDir$\apps-deactivated.txt` * AppDeactivationTemplateFile: `res\apps-deactivated.template.txt` -* CustomAppIndexFile: `$CustomConfigDir$\apps.md` * CustomAppIndexTemplateFile: `res\apps.template.md` * AppVersionIndexDir: `$LibDir$\_versions` * ConEmuConfigFile: `$CustomConfigDir$\ConEmu.xml` * ConEmuConfigTemplateFile: `res\ConEmu.template.xml` * DownloadDir: `cache` -* AppResourceBaseDir: `res\apps` * AppAdornmentBaseDir: `$LibDir$\_proxies` * AppRegistryBaseDir: `$HomeDir$\registry_isolation` * TempDir: `tmp` From 1f75ce15ab48e22eb7e0b0b7b04b76293b285374 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 2 Jan 2017 16:10:12 +0100 Subject: [PATCH 115/230] updated changelog --- CHANGELOG.md | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0afe818a..4147f187 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,12 +25,46 @@ Add a link to the GitHub diff like [Dev Changes](https://github.com/mastersign/bench/compare/master...dev), ### Added -- Update check in the About dialog of BenchDashboard +- Bench CLI + ([#87](https://github.com/mastersign/bench/issues/87)) +- Update check in the About dialog of _BenchDashboard_ +- Config properties + + `VersionUrl` + + `UpdateUrlTemplate` + + `BootstrapUrlTemplate` + + `AutoUpdateCheck` +- Support for multiple app libraries + ([#90](https://github.com/mastersign/bench/issues/90)) +- Namespaces for app IDs +- Config properties: + + `AppLibs` + + `AppLibsDownloadDir` + + `AppLibsDir` + + `AppLibIndexFileName` + + `AppLibCustomScriptDirName` + + `AppLibResourceDirName` + +### Changed +- Upgrade process is using the _Bench CLI_ now + ([#84](https://github.com/mastersign/bench/issues/84)) +- Directory for custom scripts in the user app library + was moved from `config\apps` to `config\scripts` +- Moved app definitions into their own Git repositories + + + + ### Fixed - Proxy setup for Maven ([#89](https://github.com/mastersign/bench/issues/89)) +### Removed +- Script based actions +- Config properties + + `ActionDir` + + `AppIndexFile` + + `CustomAppIndexFile` + + `AppResourceBaseDir` + ## [0.13.3] - 2016-11-19 [Full Changelog](https://github.com/mastersign/bench/compare/v0.13.2...v0.13.3) From 3f8a0849a66fc60e5915bd58e5c22e32099f3850 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 2 Jan 2017 17:11:20 +0100 Subject: [PATCH 116/230] updated documentation: config properties, file structure --- docs/content/ref/config.md | 89 +++++++++++++++++-------- docs/content/ref/file-structure.md | 100 ++++++++++++++--------------- docs/content/ref/ps-api.md | 25 +++++++- docs/src-content/ref/config.md | 80 ++++++++++++++++------- docs/src-content/ref/ps-api.md | 23 ++++++- 5 files changed, 216 insertions(+), 101 deletions(-) diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index 030911ae..ef7518e9 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -16,7 +16,7 @@ and can be defined in the following files. The configuration files are applied in the order they are listed above. The site configuration files are applied with the files near the file system root first and the one in the Bench root directory last. -Configuration files applied later override values from files applied earlier. +Configuration files applied later, override values from files applied earlier. Therefore, the site configuration file in the Bench root directory has the highest priority and the default configuration has the lowest. @@ -46,16 +46,19 @@ configuration, but _can_ be overridden in the user or site configuration. | [CustomConfigTemplateFile](#CustomConfigTemplateFile) | path | `res\config.template.md` | | [SiteConfigFileName](#SiteConfigFileName) | string | `bench-site.md` | | [SiteConfigTemplateFile](#SiteConfigTemplateFile) | path | `res\bench-site.template.md` | -| [AppIndexFile](#AppIndexFile) | path | `res\apps.md` | +| [AppLibs](#AppLibs) | dictionary | ... | +| [AppLibsDir](#AppLibsDir) | path | `$LibDir$\_applibs` | +| [AppLibsDownloadDir](#AppLibsDownloadDir) | path | `$DownloadDir$\_applibs` | +| [AppLibIndexFileName](#AppLibIndexFileName) | string | `apps.md` | +| [AppLibCustomScriptDirName](#AppLibCustomScriptDirName) | string | `res` | +| [AppLibResourceDirName](#AppLibResourceDirName) | string | `res` | | [AppActivationFile](#AppActivationFile) | path | `$CustomConfigDir$\apps-activated.txt` | | [AppActivationTemplateFile](#AppActivationTemplateFile) | path | `res\apps-activated.template.txt` | | [AppDeactivationFile](#AppDeactivationFile) | path | `$CustomConfigDir$\apps-deactivated.txt` | | [AppDeactivationTemplateFile](#AppDeactivationTemplateFile) | path | `res\apps-deactivated.template.txt` | -| [CustomAppIndexFile](#CustomAppIndexFile) | path | `$CustomConfigDir$\apps.md` | | [CustomAppIndexTemplateFile](#CustomAppIndexTemplateFile) | path | `res\apps.template.md` | | [ConEmuConfigFile](#ConEmuConfigFile) | path | `$CustomConfigDir$\ConEmu.xml` | | [ConEmuConfigTemplateFile](#ConEmuConfigTemplateFile) | path | `res\ConEmu.template.xml` | -| [AppResourceBaseDir](#AppResourceBaseDir) | path | `res\apps` | | [LibDir](#LibDir) | path | `lib` | | [Website](#Website) | URL | | | [WizzardEditCustomConfigBeforeSetup](#WizzardEditCustomConfigBeforeSetup) | boolean | `false` | @@ -190,15 +193,68 @@ The specified file must be a Markdown file and follow the [Markdown list syntax] * Default: `res\bench-site.template.md` * Type: System -### AppIndexFile {#AppIndexFile} +### AppLibs {#AppLibs} -* Description: The path to a library file for all program definitions, included in Bench. +* Description: A table with URLs of app libraries to load in the Bench environment. +* Data Type: dictionary +* Default: ... + + `core`: `github:mastersign/bench-apps-core` + + `default`: `github:mastersign/bench-apps-default` +* Type: User + +The table consists of key/value pairs. +Where the key is a unique ID for the app library inside the Bench environment, +and the value is an URL to a ZIP file with the app library. +The order of the table entries dictates the order in which the app libraries are loaded. + +The URL can use one of the following protocols: `http`, `https`, `file`. +If the protocol `file` is used, the URL can refer to a ZIP file +or just a directory containing the app library. +If the app library is hosted as a GitHub repository, a short form for the URL +can be used: `github:/`; +which is automatically expanded to an URL with the `https` protocol. + +### AppLibsDir {#AppLibsDir} + +* Description: The path of the directory, where to load the app libraries. +* Data Type: path +* Default: `$LibDir$\_applibs` +* Type: System + +### AppLibsDownloadDir {#AppLibsDownloadDir} + +* Description: The path of the directory, downloaded app libraries are cached. * Data Type: path -* Default: `res\apps.md` +* Default: `$DownloadDir$\_applibs` +* Type: System + +### AppLibIndexFileName {#AppLibIndexFileName} + +* Description: The name of the index file in an app library. +* Data Type: string +* Default: `apps.md` * Type: System The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. +### AppLibCustomScriptDirName {#AppLibCustomScriptDirName} + +* Description: The name of the directory with the custom scripts in an app library. +* Data Type: string +* Default: `res` +* Type: System + +It is used from custom scripts to retrieve paths to app resources during the setup. + +### AppLibResourceDirName {#AppLibResourceDirName} + +* Description: The name of the directory with additional setup resources in an app library. +* Data Type: string +* Default: `res` +* Type: System + +It is used from custom scripts to retrieve paths to resources, e.g. during the app setup. + ### AppActivationFile {#AppActivationFile} * Description: The path to a file with a list of activated apps. @@ -237,15 +293,6 @@ Only non-space characters, up to the first space or the end of a line, are consi * Default: `res\apps-deactivated.template.txt` * Type: System -### CustomAppIndexFile {#CustomAppIndexFile} - -* Description: The path to a library file with custom program definitions from the user. -* Data Type: path -* Default: `$CustomConfigDir$\apps.md` -* Type: System - -The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. - ### CustomAppIndexTemplateFile {#CustomAppIndexTemplateFile} * Description: The path to the user app library template file, @@ -269,16 +316,6 @@ The specified file must be a Markdown file and follow the [Markdown list syntax] * Default: `res\ConEmu.template.xml` * Type: System -### AppResourceBaseDir {#AppResourceBaseDir} - -* Description: The path to a directory, containing additional resource files, - which are used during the execution of custom setup scripts. -* Data Type: path -* Default: `res\apps` -* Type: System - -It is used from custom scripts to retrieve absolute paths to the additional resources. - ### LibDir {#LibDir} * Description: The path to the base directory where Bench apps are installed. diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index f5b70a62..37d68db0 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -1,5 +1,5 @@ +++ -date = "2016-12-22T10:43:00+02:00" +date = "2017-01-02T16:30:00+02:00" description = "The layout of the folders and files in the Bench environment" title = "File Structure" weight = 4 @@ -18,13 +18,6 @@ The core structure consists of directories and files, which are installed during the Bench setup, and _can not_ be moved via custom or site configuration. * [`auto`](#auto-dir) Bench Automation - + [`apps`](#auto-apps-dir) Bench App Automation Directory - - [`.extract.ps1`](#custom-script-extract) - - [`.setup.ps1`](#custom-script-setup) - - [`.env.ps1`](#custom-script-env) - - [`.remove.ps1`](#custom-script-remove) - - [`.pre-run.ps1`](#custom-script-pre-run) - - [`.post-run.ps1`](#custom-script-post-run) + [`bin`](#auto-bin-dir) Bench Binaries - [`bench.exe`](/ref/bench-cli/) - [`BenchDashboard.exe`](/ref/dashboard/) @@ -38,15 +31,21 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. - ... * [`config`](#config-dir) User Configuration ([CustomConfigDir](/ref/config/#CustomConfigDir)) - + [`apps`](#config-apps-dir) User App Automation Directory + + [`scripts`](#config-scripts-dir) User Custom Scripts Directory + ([AppLibCustomScriptDirName](/ref/config/#AppLibCustomScriptDirName)) + - _app namespace_ → - [`.extract.ps1`](#custom-script-extract) - [`.setup.ps1`](#custom-script-setup) - [`.env.ps1`](#custom-script-env) - [`.remove.ps1`](#custom-script-remove) - [`.pre-run.ps1`](#custom-script-pre-run) - [`.post-run.ps1`](#custom-script-post-run) + + [`res`](#config-res-dir) User App Resources Directory + ([AppLibResourceDirName](/ref/config/#AppLibResourceDirName)) + - _app namespace_ → + - ... + [`apps.md`](#config-apps) User App Library - ([CustomAppIndexFile](/ref/config/#CustomAppIndexFile)) + ([AppLibIndexFileName](/ref/config/#AppLibIndexFileName)) + [`apps-activated.txt`](#config-apps-activated) App Activation List ([AppActivationFile](/ref/config/#AppActivationFile)) + [`apps-deactivated.txt`](#config-apps-deactivated) App Deactivation List @@ -58,10 +57,6 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. + [`env.ps1`](#config-env) Environment Setup Hook + [`setup.ps1`](#config-setup) Setup Hook * [`res`](#res-dir) Bench Resources - + [`apps`](#res-apps-dir) Additional App Resources - ([AppResourceBaseDir](/ref/config/#AppResourceBaseDir)) - + [`apps.md`](#res-apps) Bench App Library - ([AppIndexFile](/ref/config/#AppIndexFile)) + [`apps.template.md`](#res-apps-template) ([CustomAppIndexTemplateFile](/ref/config/#CustomAppIndexTemplateFile)) + [`apps-activated.template.txt`](#res-app-activation-template) @@ -80,6 +75,8 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. ([VersionFile](/ref/config/#VersionFile)) * [`lib`](#lib-dir) App Installations ([LibDir](/ref/config/#LibDir)) + + [`_applibs`](#lib-applibs-dir) + ([AppLibsDir](/ref/config/#AppLibsDir)) + [`_proxies`](#lib-proxies-dir) ([AppAdornmentBaseDir](/ref/config/#AppAdornmentBaseDir)) + [`_launcher`](#lib-launcher-dir) @@ -102,6 +99,8 @@ and _can_ be moved via custom or site configuration. ([ProjectArchiveDir](/ref/config/#ProjectArchiveDir)) * [`cache`](#cache-dir) Downloaded App Resources ([DownloadDir](/ref/config/#DownloadDir)) + + [`_applibs`](#cache-applibs-dir) Downloaded App Libraries + ([AppLibsDownloadDir](/ref/config/#AppLibsDownloadDir)) * [`home`](#home-dir) Isolated User Profile ([HomeDir](/ref/config/#HomeDir)) + `AppData` @@ -133,16 +132,10 @@ and _can_ be moved via custom or site configuration. * Path: `auto` * Type: directory -### Bench App Automation Directory {#auto-apps-dir} - -* Description: The directory with the custom scripts of the apps included in Bench. -* Path: `auto\apps` -* Type: directory - ### App Custom Script `extract` {#custom-script-extract} * Description: Custom script for app resource extraction. -* Path: `auto\apps\.extract.ps1` or `config\apps\.extract.ps1` +* Path: `\scripts\\.extract.ps1` or `config\scripts\\.extract.ps1` * Type: file Custom scripts for app resource extraction must be named with the app ID @@ -192,7 +185,7 @@ Purge-Dir $tmpDir ### App Custom Script `setup` {#custom-script-setup} * Description: Custom script for app setup. -* Path: `auto\apps\.setup.md` or `config\apps\.setup.ps1` +* Path: `\scripts\\.setup.md` or `config\scripts\\.setup.ps1` * Type: file Custom scripts for app resource extraction must be named with the app ID @@ -206,7 +199,7 @@ Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) is available ### App Custom Script `env` {#custom-script-env} * Description: Custom script for environment setup. -* Path: `auto\apps\.env.ps1` or `config\apps\.env.ps1` +* Path: `\scripts\\.env.ps1` or `config\scripts\\.env.ps1` * Type: file Custom scripts for environment setup must be named with the app ID @@ -221,7 +214,7 @@ Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. ### App Custom Script `remove` {#custom-script-remove} * Description: Custom script for app deinstallation. -* Path: `auto\apps\.remove.ps1` or `config\apps\.remove.ps1` +* Path: `\scripts\\.remove.ps1` or `config\scripts\\.remove.ps1` * Type: files Custom scripts for deinstallation must be named with the app ID @@ -234,7 +227,7 @@ Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. ### App Custom Script `pre-run` {#custom-script-pre-run} * Description: Pre-run hook for adorned executables of an app. -* Path: `auto\apps\.pre-run.ps1` or `config\apps\.pre-run.ps1` +* Path: `\scripts\\.pre-run.ps1` or `config\scripts\\.pre-run.ps1` * Type: file The _custom pre-run script_ is executed immediately before an app executable is run. @@ -249,7 +242,7 @@ Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. ### App Custom Script `post-run` {#custom-script-post-run} * Description: Post-run hook for adorned executables of an app. -* Path: `auto\apps\.post-run.ps1` or `config\apps\.post-run.ps1` +* Path: `\scripts\\.post-run.ps1` or `config\scripts\\.post-run.ps1` * Type: file The _custom post-run script_ is executed immediately after an app executable is run. @@ -270,7 +263,7 @@ Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. ### Action `bench-bash` {#auto-bin-bench-bash} * Description: Starts a [Git][] shell in the Bench environment. -* Path: `actions\bench-bash.cmd` +* Path: `auto\bin\bench-bash.cmd` * Type: file This action will fail if [Git][] is not installed @@ -278,13 +271,13 @@ This action will fail if [Git][] is not installed ### Action `bench-cmd` {#auto-bin-bench-cmd} * Description: Starts a Windows CMD console in the Bench environment. -* Path: `actions\bench-cmd.cmd` +* Path: `auto\bin\bench-cmd.cmd` * Type: file ### Action `bench-ps` {#auto-bin-bench-ps} * Description: Starts a PowerShell console in the Bench environment. -* Path: `actions\bench-ps.cmd` +* Path: `auto\bin\bench-ps.cmd` * Type: file ### Bench Script Directory {#auto-lib-dir} @@ -303,17 +296,25 @@ This action will fail if [Git][] is not installed This directory is designed to be put under version control, to manage and share Bench configurations. -### User App Automation Directory {#config-apps-dir} +### User Custom Scripts Directory {#config-scripts-dir} * Description: The directory with the custom scripts of the user apps. -* Path: `config\apps` +* Path: `config\scripts` +* Config Property: [AppLibCustomScriptDirName](/ref/config/#AppLibCustomScriptDirName) +* Type: directory + +### User App Resources Directory {#config-res-dir} + +* Description: The directory with custom resources of the user apps. +* Path: `config\res` +* Config Property: [AppLibResourceDirName](/ref/config/#AppLibResourceDirName) * Type: directory ### User App Library {#config-apps} * Description: The user app library. * Path: `config\apps.md` -* Config Property: [CustomAppIndexFile](/ref/config/#CustomAppIndexFile) +* Config Property: [AppLibIndexFileName](/ref/config/#AppLibIndexFileName) * Type: file The app library file is written in [Markdown list syntax](/ref/markup-syntax). @@ -385,24 +386,6 @@ Inside of the _setup hook script_ is the [PowerShell API](/ref/ps-api/) availabl * Path: `res` * Type: directory -### App Custom Resources Directory {#res-apps-dir} - -* Description: This directory contains resources used by custom scripts - of included apps. -* Path: `res\apps` -* Config Property: [AppResourceBaseDir](/ref/config/#AppResourceBaseDir) -* Type: directory - -### Bench App Library {#res-apps} - -* Description: This file contains the libary with all apps included in Bench -* Path: `res\apps.md` -* Config Property: [AppIndexFile](/ref/config/#AppIndexFile) -* Type: file - -The app library file is written in [Markdown list syntax](/ref/markup-syntax). -Every app is defined by a number of [App Properties](/ref/app-properties/). - ### Custom App Library Template {#res-apps-template} * Description: The template for the [custom app library](#config-apps). @@ -484,6 +467,16 @@ Usually the app target directories are direct sub-folders of the _app installati The default value for the [target directory](/ref/app-properties/#Dir) of an app is its ID in lower case. +### App Library Load Directory {#lib-applibs-dir} + +* Description: This diectory is used to load the app libraries. +* Path: `lib\_applibs` +* Config Property: [AppLibsDir](/ref/config/#AppLibsDir) +* Type: directory + +App libraries are loaded as sub-directories, named by their +ID from the [AppLibs](/ref/config/#AppLibs) table. + ### Execution Proxy Directory {#lib-proxies-dir} * Description: Execution proxy scripts for adorned executables are stored in this directory. @@ -578,6 +571,13 @@ project name and a timestamp. * Config Property: [DownloadDir](/ref/config/#DownloadDir) * Type: directory +### App Libary Download Cache {#cache-applibs-dir} + +* Description: This directory contains all downloaded app libraries. +* Path: `cache\_applibs` +* Config Property: [AppLibsDownloadDir](/ref/config/#AppLibsDownloadDir) +* Type: directory + ### Home Directory {#home-dir} * Description: This directory is the isolated user profile root for the Bench environment. diff --git a/docs/content/ref/ps-api.md b/docs/content/ref/ps-api.md index d0dfe0cd..dfadb934 100644 --- a/docs/content/ref/ps-api.md +++ b/docs/content/ref/ps-api.md @@ -1,5 +1,5 @@ +++ -date = "2016-06-22T13:43:35+02:00" +date = "2017-01-02T17:00:00+02:00" description = "The programming interface for hooks and custom scripts" title = "PowerShell API" weight = 9 @@ -63,6 +63,8 @@ available in custom and hook scripts. * [`App-LauncherIcon`](#fun-app-launchericon) * [`App-SetupTestFile`](#fun-app-setuptestfile) * [`Check-App`](#fun-check-app) +* [`App-CustomScriptFile`](#fun-app-customscriptfile) +* [`App-SetupResource`](#fun-app-setupresource) ## Variables {#vars} @@ -464,3 +466,24 @@ If the app ID is not defined, `$null` is returned. * Return Value: `$true` if the app is installed, `$false` if the app is not installed, and `$null` if the app ID is not defined. + +### `App-CustomScriptFile` {#fun-app-customscriptfile} + +* Description: This function retrieves a path to a custom script. +* Parameter: + + `app`: The app ID. + + `type`: The type of cstom script (e.g. `setup` or `env`). +* Return Value: An absolute path to the custom script + or `$null` if this type of custom script does not exists for the specified app. + +### `App-SetupResource` {#fun-app-setupresource} + +* Description: This function retrieves a path to a setup resource for an app. +* Parameter: + + `app`: The app ID. + + `relativePath`: A relative path or simply the filename of the resource. +* Return Value: An absolute path to the resource + or `$null` if the resource does not exists for the specified app. + +A setup resource can be a file or a directory, which is used by custom scripts. +The setup resources of an app are included in the app library. diff --git a/docs/src-content/ref/config.md b/docs/src-content/ref/config.md index d9fd9d7b..d69d7373 100644 --- a/docs/src-content/ref/config.md +++ b/docs/src-content/ref/config.md @@ -16,7 +16,7 @@ and can be defined in the following files. The configuration files are applied in the order they are listed above. The site configuration files are applied with the files near the file system root first and the one in the Bench root directory last. -Configuration files applied later override values from files applied earlier. +Configuration files applied later, override values from files applied earlier. Therefore, the site configuration file in the Bench root directory has the highest priority and the default configuration has the lowest. @@ -144,15 +144,68 @@ The specified file must be a Markdown file and follow the [Markdown list syntax] * Default: `res\bench-site.template.md` * Type: System -### AppIndexFile {#AppIndexFile} +### AppLibs {#AppLibs} -* Description: The path to a library file for all program definitions, included in Bench. +* Description: A table with URLs of app libraries to load in the Bench environment. +* Data Type: dictionary +* Default: ... + + `core`: `github:mastersign/bench-apps-core` + + `default`: `github:mastersign/bench-apps-default` +* Type: User + +The table consists of key/value pairs. +Where the key is a unique ID for the app library inside the Bench environment, +and the value is an URL to a ZIP file with the app library. +The order of the table entries dictates the order in which the app libraries are loaded. + +The URL can use one of the following protocols: `http`, `https`, `file`. +If the protocol `file` is used, the URL can refer to a ZIP file +or just a directory containing the app library. +If the app library is hosted as a GitHub repository, a short form for the URL +can be used: `github:/`; +which is automatically expanded to an URL with the `https` protocol. + +### AppLibsDir {#AppLibsDir} + +* Description: The path of the directory, where to load the app libraries. +* Data Type: path +* Default: `$LibDir$\_applibs` +* Type: System + +### AppLibsDownloadDir {#AppLibsDownloadDir} + +* Description: The path of the directory, downloaded app libraries are cached. * Data Type: path -* Default: `res\apps.md` +* Default: `$DownloadDir$\_applibs` +* Type: System + +### AppLibIndexFileName {#AppLibIndexFileName} + +* Description: The name of the index file in an app library. +* Data Type: string +* Default: `apps.md` * Type: System The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. +### AppLibCustomScriptDirName {#AppLibCustomScriptDirName} + +* Description: The name of the directory with the custom scripts in an app library. +* Data Type: string +* Default: `res` +* Type: System + +It is used from custom scripts to retrieve paths to app resources during the setup. + +### AppLibResourceDirName {#AppLibResourceDirName} + +* Description: The name of the directory with additional setup resources in an app library. +* Data Type: string +* Default: `res` +* Type: System + +It is used from custom scripts to retrieve paths to resources, e.g. during the app setup. + ### AppActivationFile {#AppActivationFile} * Description: The path to a file with a list of activated apps. @@ -191,15 +244,6 @@ Only non-space characters, up to the first space or the end of a line, are consi * Default: `res\apps-deactivated.template.txt` * Type: System -### CustomAppIndexFile {#CustomAppIndexFile} - -* Description: The path to a library file with custom program definitions from the user. -* Data Type: path -* Default: `$CustomConfigDir$\apps.md` -* Type: System - -The specified file must be a Markdown file and follow the [Markdown list syntax][syntax]. - ### CustomAppIndexTemplateFile {#CustomAppIndexTemplateFile} * Description: The path to the user app library template file, @@ -223,16 +267,6 @@ The specified file must be a Markdown file and follow the [Markdown list syntax] * Default: `res\ConEmu.template.xml` * Type: System -### AppResourceBaseDir {#AppResourceBaseDir} - -* Description: The path to a directory, containing additional resource files, - which are used during the execution of custom setup scripts. -* Data Type: path -* Default: `res\apps` -* Type: System - -It is used from custom scripts to retrieve absolute paths to the additional resources. - ### LibDir {#LibDir} * Description: The path to the base directory where Bench apps are installed. diff --git a/docs/src-content/ref/ps-api.md b/docs/src-content/ref/ps-api.md index 2d623da2..de276367 100644 --- a/docs/src-content/ref/ps-api.md +++ b/docs/src-content/ref/ps-api.md @@ -1,5 +1,5 @@ +++ -date = "2016-06-22T13:43:35+02:00" +date = "2017-01-02T17:00:00+02:00" description = "The programming interface for hooks and custom scripts" title = "PowerShell API" weight = 9 @@ -428,3 +428,24 @@ If the app ID is not defined, `$null` is returned. * Return Value: `$true` if the app is installed, `$false` if the app is not installed, and `$null` if the app ID is not defined. + +### `App-CustomScriptFile` {#fun-app-customscriptfile} + +* Description: This function retrieves a path to a custom script. +* Parameter: + + `app`: The app ID. + + `type`: The type of cstom script (e.g. `setup` or `env`). +* Return Value: An absolute path to the custom script + or `$null` if this type of custom script does not exists for the specified app. + +### `App-SetupResource` {#fun-app-setupresource} + +* Description: This function retrieves a path to a setup resource for an app. +* Parameter: + + `app`: The app ID. + + `relativePath`: A relative path or simply the filename of the resource. +* Return Value: An absolute path to the resource + or `$null` if the resource does not exists for the specified app. + +A setup resource can be a file or a directory, which is used by custom scripts. +The setup resources of an app are included in the app library. From db1f6e7a1a556eb8a909df9c314465e69e7684cb Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 3 Jan 2017 09:38:29 +0100 Subject: [PATCH 117/230] refactoring: moved listing of configuration files from BenchCLI into BenchLib --- .../Commands/ListConfigFilesCommand.cs | 114 +------------ BenchManager/BenchLib/BenchConfiguration.cs | 151 +++++++++++++----- BenchManager/BenchLib/BenchLib.csproj | 2 + BenchManager/BenchLib/ConfigurationFile.cs | 40 +++++ .../BenchLib/ConfigurationFileType.cs | 54 +++++++ 5 files changed, 216 insertions(+), 145 deletions(-) create mode 100644 BenchManager/BenchLib/ConfigurationFile.cs create mode 100644 BenchManager/BenchLib/ConfigurationFileType.cs diff --git a/BenchManager/BenchCLI/Commands/ListConfigFilesCommand.cs b/BenchManager/BenchCLI/Commands/ListConfigFilesCommand.cs index 54ea3ab0..be8c0c9f 100644 --- a/BenchManager/BenchCLI/Commands/ListConfigFilesCommand.cs +++ b/BenchManager/BenchCLI/Commands/ListConfigFilesCommand.cs @@ -12,39 +12,7 @@ class ListConfigFilesCommand : BenchCommand public override string Name => "files"; private const string OPTION_TYPE = "type"; - private const FileType DEF_TYPE = FileType.All; - - [Flags] - public enum FileType : int - { - All = 0xFFFF, - Config = 0x000F, - AppLib = 0x00F0, - AppSelection = 0x0F00, - BenchConfig = 0x0001, - UserConfig = 0x0002, - SiteConfig = 0x0004, - BenchAppLib = 0x0010, - UserAppLib = 0x0020, - Activation = 0x0100, - Deactivation = 0x0200, - } - - public class ConfigurationFile - { - public FileType Type { get; private set; } - - public int OrderIndex { get; private set; } - - public string Path { get; private set; } - - public ConfigurationFile(FileType type, int orderIndex, string path) - { - Type = type; - OrderIndex = orderIndex; - Path = path; - } - } + private const ConfigurationFileType DEF_TYPE = ConfigurationFileType.All; protected override void InitializeArgumentParser(ArgumentParser parser) { @@ -53,7 +21,7 @@ protected override void InitializeArgumentParser(ArgumentParser parser) .Text("The ").Keyword(Name).Text(" command lists the paths of all loaded configuration files.") .End(BlockType.Paragraph); - var optionType = new EnumOptionArgument(OPTION_TYPE, 't', FileType.All); + var optionType = new EnumOptionArgument(OPTION_TYPE, 't', ConfigurationFileType.All); optionType.Description .Text("Specify the type of files to show."); @@ -61,7 +29,7 @@ protected override void InitializeArgumentParser(ArgumentParser parser) optionType); } - private FileType Type => (FileType)Enum.Parse(typeof(FileType), + private ConfigurationFileType Type => (ConfigurationFileType)Enum.Parse(typeof(ConfigurationFileType), Arguments.GetOptionValue(OPTION_TYPE, DEF_TYPE.ToString())); private DataOutputFormat Format => ((ListCommand)Parent).Format; @@ -70,7 +38,8 @@ protected override void InitializeArgumentParser(ArgumentParser parser) protected override bool ExecuteCommand(string[] args) { - List files = GetPaths(Type); + var cfg = LoadConfiguration(withApps: true); + var files = cfg.GetConfigurationFiles(Type, actuallyLoaded: true); if (OutputAsTable) { using (var w = TableWriterFactory.Create(Format)) @@ -91,78 +60,5 @@ protected override bool ExecuteCommand(string[] args) } return true; } - - private List GetPaths(FileType type) - { - var cfg = LoadConfiguration(true); - var files = new List(); - if ((type & FileType.BenchConfig) == FileType.BenchConfig) - { - files.Add(new ConfigurationFile(FileType.BenchConfig, 0, - Path.Combine( - cfg.BenchRootDir, - BenchConfiguration.CONFIG_FILE))); - } - if ((type & FileType.UserConfig) == FileType.UserConfig) - { - - var userConfigFile = cfg.GetStringValue(PropertyKeys.CustomConfigFile); - if (File.Exists(userConfigFile)) - { - files.Add(new ConfigurationFile(FileType.UserConfig, 1, - userConfigFile)); - } - } - if ((type & FileType.SiteConfig) == FileType.SiteConfig) - { - var siteConfigFiles = cfg.FindSiteConfigFiles(); - for (int i = 0; i < siteConfigFiles.Length; i++) - { - files.Add(new ConfigurationFile(FileType.SiteConfig, 10 + i, - siteConfigFiles[i])); - } - } - if ((type & FileType.BenchAppLib) == FileType.BenchAppLib) - { - var appLibraries = cfg.AppLibraries; - for (var i = 0; i < appLibraries.Length; i++) - { - files.Add(new ConfigurationFile(FileType.BenchAppLib, 100 + i, - Path.Combine( - appLibraries[i].BaseDir, - cfg.GetStringValue(PropertyKeys.AppLibIndexFileName)))); - } - } - if ((type & FileType.UserAppLib) == FileType.UserAppLib) - { - var userAppLib = Path.Combine( - cfg.GetStringValue(PropertyKeys.CustomConfigDir), - cfg.GetStringValue(PropertyKeys.AppLibIndexFileName)); - if (File.Exists(userAppLib)) - { - files.Add(new ConfigurationFile(FileType.UserAppLib, 999, - userAppLib)); - } - } - if ((type & FileType.Activation) == FileType.Activation) - { - var activationFile = cfg.GetStringValue(PropertyKeys.AppActivationFile); - if (File.Exists(activationFile)) - { - files.Add(new ConfigurationFile(FileType.Activation, 1000, - activationFile)); - } - } - if ((type & FileType.Deactivation) == FileType.Deactivation) - { - var deactivationFile = cfg.GetStringValue(PropertyKeys.AppDeactivationFile); - if (File.Exists(deactivationFile)) - { - files.Add(new ConfigurationFile(FileType.Deactivation, 1001, - deactivationFile)); - } - } - return files; - } } } diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index 35e7ec2e..ee46f718 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -209,42 +209,6 @@ public BenchConfiguration(string benchRootDir, bool loadAppIndex, bool loadCusto RecordResponsibilities(); } - /// - /// Gets an array with absolute paths for all configuration files - /// used to compile this configuration. - /// - public string[] Sources - { - get - { - var paths = new List(); - paths.Add(Path.Combine(BenchRootDir, CONFIG_FILE)); - if (WithCustomConfiguration) - { - paths.Add(GetStringValue(PropertyKeys.CustomConfigFile)); - } - if (WithSiteConfiguration) - { - paths.AddRange(FindSiteConfigFiles(BenchRootDir, siteConfigFileName)); - } - if (WithAppIndex) - { - foreach (var l in AppLibraries) - { - var appIndexFile = Path.Combine(l.BaseDir, GetStringValue(PropertyKeys.AppLibIndexFileName)); - if (File.Exists(appIndexFile)) paths.Add(appIndexFile); - } - if (WithCustomConfiguration) - { - paths.Add(Path.Combine( - GetStringValue(PropertyKeys.CustomConfigDir), - GetStringValue(PropertyKeys.AppLibIndexFileName))); - } - } - return paths.ToArray(); - } - } - private static string[] FindSiteConfigFiles(string benchRootDir, string fileName) { var results = new List(); @@ -269,6 +233,121 @@ public string[] FindSiteConfigFiles() return FindSiteConfigFiles(BenchRootDir, siteConfigFileName); } + /// + /// Lists the configuration files of the Bench environment. + /// + /// The kind of files to list. + /// If true, only files which are actually loaded + /// by this instance are listed. + /// If true, only existing files are listed; + /// otherwise optional and non existing files are listed to. + /// A list with configuration file descriptors. + public ConfigurationFile[] GetConfigurationFiles( + ConfigurationFileType type = ConfigurationFileType.All, + bool actuallyLoaded = false, bool mustExist = true) + { + if (actuallyLoaded) mustExist = true; + var files = new List(); + if ((type & ConfigurationFileType.BenchConfig) == ConfigurationFileType.BenchConfig) + { + files.Add(new ConfigurationFile(ConfigurationFileType.BenchConfig, 0, + Path.Combine(BenchRootDir, CONFIG_FILE))); + } + if (!actuallyLoaded || WithCustomConfiguration) + { + if ((type & ConfigurationFileType.UserConfig) == ConfigurationFileType.UserConfig) + { + + var userConfigFile = GetStringValue(PropertyKeys.CustomConfigFile); + if (!mustExist || File.Exists(userConfigFile)) + { + files.Add(new ConfigurationFile(ConfigurationFileType.UserConfig, 1, + userConfigFile)); + } + } + } + if (!actuallyLoaded || WithSiteConfiguration) + { + if ((type & ConfigurationFileType.SiteConfig) == ConfigurationFileType.SiteConfig) + { + var siteConfigFiles = FindSiteConfigFiles(); + for (int i = 0; i < siteConfigFiles.Length; i++) + { + files.Add(new ConfigurationFile(ConfigurationFileType.SiteConfig, 10 + i, + siteConfigFiles[i])); + } + } + } + if (!actuallyLoaded || WithAppIndex) + { + if ((type & ConfigurationFileType.BenchAppLib) == ConfigurationFileType.BenchAppLib) + { + var appLibraries = AppLibraries; + for (var i = 0; i < appLibraries.Length; i++) + { + files.Add(new ConfigurationFile(ConfigurationFileType.BenchAppLib, 100 + i, + Path.Combine( + appLibraries[i].BaseDir, + GetStringValue(PropertyKeys.AppLibIndexFileName)))); + } + } + } + if (!actuallyLoaded || (WithAppIndex && WithCustomConfiguration)) + { + if ((type & ConfigurationFileType.UserAppLib) == ConfigurationFileType.UserAppLib) + { + var userAppLib = Path.Combine( + GetStringValue(PropertyKeys.CustomConfigDir), + GetStringValue(PropertyKeys.AppLibIndexFileName)); + if (!mustExist || File.Exists(userAppLib)) + { + files.Add(new ConfigurationFile(ConfigurationFileType.UserAppLib, 999, + userAppLib)); + } + } + } + if (!actuallyLoaded || (WithAppIndex && WithCustomConfiguration)) + { + if ((type & ConfigurationFileType.Activation) == ConfigurationFileType.Activation) + { + var activationFile = GetStringValue(PropertyKeys.AppActivationFile); + if (!mustExist || File.Exists(activationFile)) + { + files.Add(new ConfigurationFile(ConfigurationFileType.Activation, 1000, + activationFile)); + } + } + if ((type & ConfigurationFileType.Deactivation) == ConfigurationFileType.Deactivation) + { + var deactivationFile = GetStringValue(PropertyKeys.AppDeactivationFile); + if (!mustExist || File.Exists(deactivationFile)) + { + files.Add(new ConfigurationFile(ConfigurationFileType.Deactivation, 1001, + deactivationFile)); + } + } + } + return files.ToArray(); + } + + /// + /// Gets an array with absolute paths for all configuration files + /// used to compile this configuration. + /// + public string[] Sources + { + get + { + var files = GetConfigurationFiles(actuallyLoaded: true, mustExist: true); + var result = new string[files.Length]; + for (int i = 0; i < files.Length; i++) + { + result[i] = files[i].Path; + } + return result; + } + } + private string GetVolatileEnvironmentVariable(string name) { using (var key = Registry.CurrentUser.OpenSubKey("Volatile Environment", false)) diff --git a/BenchManager/BenchLib/BenchLib.csproj b/BenchManager/BenchLib/BenchLib.csproj index 7d2d5598..15432a8a 100644 --- a/BenchManager/BenchLib/BenchLib.csproj +++ b/BenchManager/BenchLib/BenchLib.csproj @@ -56,6 +56,8 @@ + + diff --git a/BenchManager/BenchLib/ConfigurationFile.cs b/BenchManager/BenchLib/ConfigurationFile.cs new file mode 100644 index 00000000..cec43ea4 --- /dev/null +++ b/BenchManager/BenchLib/ConfigurationFile.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Mastersign.Bench +{ + /// + /// A descriptor of a configuration or app library file. + /// + public class ConfigurationFile + { + /// + /// The kind of file. + /// + public ConfigurationFileType Type { get; private set; } + + /// + /// A number describing the load order of the configuration files. + /// + public int OrderIndex { get; private set; } + + /// + /// The absolute path of the configuration file. + /// + public string Path { get; private set; } + + /// + /// Initializes a new instance of . + /// + /// The kind of file + /// A number describing the load order of the configuration files + /// The absolute path of the configuration file + public ConfigurationFile(ConfigurationFileType type, int orderIndex, string path) + { + Type = type; + OrderIndex = orderIndex; + Path = path; + } + } +} diff --git a/BenchManager/BenchLib/ConfigurationFileType.cs b/BenchManager/BenchLib/ConfigurationFileType.cs new file mode 100644 index 00000000..4dd13b1b --- /dev/null +++ b/BenchManager/BenchLib/ConfigurationFileType.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Mastersign.Bench +{ + /// + /// The different kinds of configuration and app library files. + /// + [Flags] + public enum ConfigurationFileType : int + { + #region File Groups + + /// All kind of configuration and app library files + All = 0xFFFF, + + /// All configuration files (Bench, User, Site) + Config = 0x000F, + + /// All app library index files + AppLib = 0x00F0, + + /// All app selection lists (Activation, Deactivation) + AppSelection = 0x0F00, + + #endregion + + #region Specific File Types + + /// The built-in Bench configuration file + BenchConfig = 0x0001, + + /// The user configuration file + UserConfig = 0x0002, + + /// A site configuration file + SiteConfig = 0x0004, + + /// An index file of a loaded app library + BenchAppLib = 0x0010, + + /// The index file of the user app library + UserAppLib = 0x0020, + + /// The app activation list file + Activation = 0x0100, + + /// The app deactivation list file + Deactivation = 0x0200, + + #endregion + } +} From 7747bca4ca4daee1b6f105938c71129bd7711088 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 3 Jan 2017 11:23:05 +0100 Subject: [PATCH 118/230] added CLI command 'bench list applibs' --- BenchManager/BenchCLI/BenchCLI.csproj | 1 + .../Commands/ListAppLibrariesCommand.cs | 51 +++++++++++++++++++ BenchManager/BenchCLI/Commands/ListCommand.cs | 7 +++ 3 files changed, 59 insertions(+) create mode 100644 BenchManager/BenchCLI/Commands/ListAppLibrariesCommand.cs diff --git a/BenchManager/BenchCLI/BenchCLI.csproj b/BenchManager/BenchCLI/BenchCLI.csproj index 10bb14c9..77d168fa 100644 --- a/BenchManager/BenchCLI/BenchCLI.csproj +++ b/BenchManager/BenchCLI/BenchCLI.csproj @@ -68,6 +68,7 @@ + diff --git a/BenchManager/BenchCLI/Commands/ListAppLibrariesCommand.cs b/BenchManager/BenchCLI/Commands/ListAppLibrariesCommand.cs new file mode 100644 index 00000000..163256f9 --- /dev/null +++ b/BenchManager/BenchCLI/Commands/ListAppLibrariesCommand.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Mastersign.CliTools; +using Mastersign.Docs; + +namespace Mastersign.Bench.Cli.Commands +{ + class ListAppLibrariesCommand : BenchCommand + { + public override string Name => "applibs"; + + protected override void InitializeArgumentParser(ArgumentParser parser) + { + parser.Description + .Begin(BlockType.Paragraph) + .Text("The ").Keyword(Name).Text(" command lists all loaded app libraries.") + .End(BlockType.Paragraph); + } + + private DataOutputFormat Format => ((ListCommand)Parent).Format; + + private bool OutputAsTable => ((ListCommand)Parent).OutputAsTable; + + protected override bool ExecuteCommand(string[] args) + { + var cfg = LoadConfiguration(withApps: true); + var appLibs = cfg.AppLibraries; + if (OutputAsTable) + { + using (var w = TableWriterFactory.Create(Format)) + { + w.Initialize(new[] { "Order", "ID", "Path", "URL" }); + for (int i = 0; i < appLibs.Length; i++) + { + var l = appLibs[i]; + w.Write((i + 1).ToString().PadLeft(5), l.ID, l.BaseDir, l.Url.OriginalString); + } + } + } + else + { + foreach (var l in appLibs) + { + Console.WriteLine("{0}={1}", l.ID, l.Url); + } + } + return true; + } + } +} diff --git a/BenchManager/BenchCLI/Commands/ListCommand.cs b/BenchManager/BenchCLI/Commands/ListCommand.cs index 9fd94476..973ad2f6 100644 --- a/BenchManager/BenchCLI/Commands/ListCommand.cs +++ b/BenchManager/BenchCLI/Commands/ListCommand.cs @@ -16,11 +16,13 @@ class ListCommand : BenchCommand private const DataOutputFormat DEF_FORMAT = DataOutputFormat.Plain; private readonly BenchCommand listConfigFilesCommand = new ListConfigFilesCommand(); + private readonly BenchCommand listAppLibsCommand = new ListAppLibrariesCommand(); private readonly BenchCommand listAppsCommand = new ListAppsCommand(); public ListCommand() { RegisterSubCommand(listConfigFilesCommand); + RegisterSubCommand(listAppLibsCommand); RegisterSubCommand(listAppsCommand); } @@ -55,6 +57,10 @@ protected override void InitializeArgumentParser(ArgumentParser parser) commandListFiles.Description .Text("List configuration and app library index files."); + var commandListAppLibs = new CommandArgument(listAppLibsCommand.Name, 'l'); + commandListAppLibs.Description + .Text("List app libraries with ID and URL."); + var commandListApps = new CommandArgument(listAppsCommand.Name, 'a'); commandListApps.Description .Text("List apps from the app library."); @@ -63,6 +69,7 @@ protected override void InitializeArgumentParser(ArgumentParser parser) flagTable, optionFormat, commandListFiles, + commandListAppLibs, commandListApps); } } From 36d405277a3850c17011581504cc94e703e9db2a Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 3 Jan 2017 11:23:31 +0100 Subject: [PATCH 119/230] fixed incorrect description of CLI flag 'bench list --table' --- BenchManager/BenchCLI/Commands/ListCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchCLI/Commands/ListCommand.cs b/BenchManager/BenchCLI/Commands/ListCommand.cs index 973ad2f6..c443c226 100644 --- a/BenchManager/BenchCLI/Commands/ListCommand.cs +++ b/BenchManager/BenchCLI/Commands/ListCommand.cs @@ -47,7 +47,7 @@ protected override void InitializeArgumentParser(ArgumentParser parser) var flagTable = new FlagArgument(FLAG_TABLE, 't'); flagTable.Description .Text("Prints properties of the listed objects as a table.") - .Text(" Otherwise only the ID is printed."); + .Text(" Otherwise only a short form is printed."); var optionFormat = new EnumOptionArgument(OPTION_FORMAT, 'f', DEF_FORMAT); optionFormat.Description From 67d7af24a69be01662c602cd8a578fe68f075fe6 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 4 Jan 2017 15:47:25 +0100 Subject: [PATCH 120/230] fixed default value for AppPackageName --- BenchManager/BenchLib/AppIndexDefaultValueSource.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs index ec31dfac..5fdd721d 100644 --- a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs +++ b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs @@ -40,7 +40,7 @@ public object GetGroupValue(string appId, string key) case PropertyKeys.AppArchiveTyp: return AppArchiveTyps.Auto; case PropertyKeys.AppPackageName: - return appId.ToLowerInvariant(); + return AppFacade.NameFromId(appId).ToLowerInvariant(); case PropertyKeys.AppDir: appTyp = AppIndex.GetGroupValue(appId, PropertyKeys.AppTyp) as string; switch (appTyp) From ce3368203ef79fc2874253e11671c48911998be8 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 4 Jan 2017 15:48:17 +0100 Subject: [PATCH 121/230] added default value for AppArchivePath if AppArchiveTyp equals 'inno' default value: '{app}' --- BenchManager/BenchLib/AppIndexDefaultValueSource.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs index 5fdd721d..36b49e8a 100644 --- a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs +++ b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs @@ -39,6 +39,12 @@ public object GetGroupValue(string appId, string key) return AppTyps.Default; case PropertyKeys.AppArchiveTyp: return AppArchiveTyps.Auto; + case PropertyKeys.AppArchivePath: + return string.Equals( + AppIndex.GetGroupValue(appId, PropertyKeys.AppArchiveTyp) as string, + AppArchiveTyps.InnoSetup, + StringComparison.InvariantCultureIgnoreCase) + ? "{app}" : null; case PropertyKeys.AppPackageName: return AppFacade.NameFromId(appId).ToLowerInvariant(); case PropertyKeys.AppDir: @@ -123,6 +129,7 @@ public bool CanGetGroupValue(string group, string name) return name == PropertyKeys.AppTyp || name == PropertyKeys.AppLabel || name == PropertyKeys.AppArchiveTyp + || name == PropertyKeys.AppArchivePath || name == PropertyKeys.AppPackageName || name == PropertyKeys.AppDir || name == PropertyKeys.AppPath From 50e3e187bf62ab917cf6fd9cb43eb98cc9087b6a Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 4 Jan 2017 15:49:08 +0100 Subject: [PATCH 122/230] avoid usage of variable $myDir in library scripts --- auto/lib/bench.lib.ps1 | 6 +++--- auto/lib/common.lib.ps1 | 4 ++-- auto/lib/config.lib.ps1 | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/auto/lib/bench.lib.ps1 b/auto/lib/bench.lib.ps1 index d1656d92..2b045ba3 100644 --- a/auto/lib/bench.lib.ps1 +++ b/auto/lib/bench.lib.ps1 @@ -1,6 +1,6 @@ -$myDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) -. "$myDir\profile.ps1" -. "$myDir\config.lib.ps1" +$Script:scriptsDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) +. "$Script:scriptsDir\profile.ps1" +. "$Script:scriptsDir\config.lib.ps1" function Purge-Dir ($path) { diff --git a/auto/lib/common.lib.ps1 b/auto/lib/common.lib.ps1 index 39339659..cc13af63 100644 --- a/auto/lib/common.lib.ps1 +++ b/auto/lib/common.lib.ps1 @@ -1,5 +1,5 @@ -[string]$Script:scriptsLib = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) -[string]$Script:rootDir = Resolve-Path "$scriptsLib\..\.." +$Script:scriptsDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) +[string]$Script:rootDir = Resolve-Path "$scriptsDir\..\.." function Set-Debugging ($enabled) { if ($enabled) { diff --git a/auto/lib/config.lib.ps1 b/auto/lib/config.lib.ps1 index fcd713d4..df9832dc 100644 --- a/auto/lib/config.lib.ps1 +++ b/auto/lib/config.lib.ps1 @@ -1,8 +1,8 @@ -$Script:myDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) -. "$Script:myDir\common.lib.ps1" -& "$Script:myDir\Load-ClrLibs.ps1" +$Script:scriptsDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) +. "$Script:scriptsDir\common.lib.ps1" +& "$Script:scriptsDir\Load-ClrLibs.ps1" -[string]$Script:autoDir = Resolve-Path ([IO.Path]::Combine($myDir, "..")) +[string]$Script:autoDir = Resolve-Path ([IO.Path]::Combine($scriptsDir, "..")) [string]$Script:rootDir = Resolve-Path ([IO.Path]::Combine($autoDir, "..")) $Script:pathBackup = $env:PATH From 442ca257127e2947d344617d1c7796f05a01f8cf Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 4 Jan 2017 15:49:28 +0100 Subject: [PATCH 123/230] fixed path construction --- auto/lib/PsExecHost.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto/lib/PsExecHost.ps1 b/auto/lib/PsExecHost.ps1 index fce44755..2c3f72d2 100644 --- a/auto/lib/PsExecHost.ps1 +++ b/auto/lib/PsExecHost.ps1 @@ -3,7 +3,7 @@ param ($Token = "Bench.Default") $scriptsDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) $rootDir = Resolve-Path "$scriptsDir\..\.." . "$scriptsDir\bench.lib.ps1" -. "$scriptsLib\reg.lib.ps1" +. "$scriptsDir\reg.lib.ps1" $Script:BenchEnv = New-Object Mastersign.Bench.BenchEnvironment ($global:BenchConfig) From 95f47712dfc04b770e4c697f98ca06a9f730621c Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 4 Jan 2017 15:49:57 +0100 Subject: [PATCH 124/230] added automation for app library development --- .gitignore | 1 + build/applibs.txt | 2 ++ build/clone-applibs.ps1 | 39 +++++++++++++++++++++++++++++++++++++++ build/load-applibs.ps1 | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 build/applibs.txt create mode 100644 build/clone-applibs.ps1 create mode 100644 build/load-applibs.ps1 diff --git a/.gitignore b/.gitignore index 0dc4ba7a..8d248eae 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ /projects /archive /release +/applibs /env.cmd /*.zip diff --git a/build/applibs.txt b/build/applibs.txt new file mode 100644 index 00000000..80afe40a --- /dev/null +++ b/build/applibs.txt @@ -0,0 +1,2 @@ +core=https://github.com/mastersign/bench-apps-core.git +default=https://github.com/mastersign/bench-apps-default.git diff --git a/build/clone-applibs.ps1 b/build/clone-applibs.ps1 new file mode 100644 index 00000000..0bb0257c --- /dev/null +++ b/build/clone-applibs.ps1 @@ -0,0 +1,39 @@ +$myDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) +$rootDir = [IO.Path]::GetDirectoryName($myDir) +$scriptsDir = Resolve-Path "$rootDir\auto\lib" + +. "$scriptsDir\bench.lib.ps1" +$benchEnv = New-Object Mastersign.Bench.BenchEnvironment ($global:BenchConfig) +$benchEnv.Load() + +if (!(Get-Command git -ErrorAction Ignore)) +{ + Write-Error "Git is not available." + return +} + +$appLibsDir = Safe-Dir "$rootDir\applibs" +pushd $appLibsDir + +$appLibs = @() +Get-Content "$myDir\applibs.txt" | % { + $parts = $_.Split("=", 2) + $appLibs += @{ "id"=$parts[0]; "url"=$parts[1] } +} + +foreach ($lib in $appLibs) +{ + $p = "$appLibsDir\$($lib.id)" + if (!(Test-Path $p)) + { + echo "Cloning app library '$($lib.id)' ..." + git clone $lib.url $lib.id + } + else + { + echo "App library '$($lib.id)' is already cloned." + } +} +echo "Finished cloning app libraries." + +popd \ No newline at end of file diff --git a/build/load-applibs.ps1 b/build/load-applibs.ps1 new file mode 100644 index 00000000..073e3649 --- /dev/null +++ b/build/load-applibs.ps1 @@ -0,0 +1,35 @@ +$myDir = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) +$rootDir = [IO.Path]::GetDirectoryName($myDir) +$scriptsDir = Resolve-Path "$rootDir\auto\lib" + +. "$scriptsDir\bench.lib.ps1" +$benchEnv = New-Object Mastersign.Bench.BenchEnvironment ($global:BenchConfig) +$benchEnv.Load() + +$appLibsDevDir = Safe-Dir "$rootDir\applibs" +$appLibsDir = Empty-Dir $(Get-ConfigValue "AppLibsDir") + +pushd $appLibsDevDir + +$appLibs = @() +Get-Content "$myDir\applibs.txt" | % { + $parts = $_.Split("=", 2) + $appLibs += @{ "id"=$parts[0]; "url"=$parts[1] } +} + +foreach ($lib in $appLibs) +{ + $id = $lib.id + $p = "$appLibsDevDir\$id" + if (!(Test-Path $p)) + { + echo "App library '$id' is not cloned." + continue + } + echo "Loading app library '$id' ..." + robocopy "$appLibsDevDir\$id" "$appLibsDir\$id" /MIR /XD .git /NJH /NJS + echo "" +} +echo "Finished loading app libraries." + +popd \ No newline at end of file From 0d031f45b3d6775f849be96e5a52b7b8a95458db Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 4 Jan 2017 16:31:59 +0100 Subject: [PATCH 125/230] removed embedded app library --- auto/apps/apache.env.ps1 | 120 -- auto/apps/erlang.env.ps1 | 14 - auto/apps/erlang.setup.ps1 | 29 - auto/apps/gitkraken.env.ps1 | 13 - auto/apps/gitkraken.extract.ps1 | 17 - auto/apps/gitkraken.setup.ps1 | 12 - auto/apps/jdk7.extract.ps1 | 19 - auto/apps/jdk8.extract.ps1 | 19 - auto/apps/leiningen.setup.ps1 | 24 - auto/apps/maven.env.ps1 | 62 - auto/apps/miktex.setup.ps1 | 48 - auto/apps/mingw.setup.ps1 | 10 - auto/apps/mingwget.setup.ps1 | 10 - auto/apps/mysql.setup.ps1 | 26 - auto/apps/php5.setup.ps1 | 3 - auto/apps/php7.setup.ps1 | 3 - auto/apps/postgresql.setup.ps1 | 35 - auto/apps/rabbitmq.setup.ps1 | 10 - auto/apps/scribus.setup.ps1 | 16 - auto/apps/spacemacs.env.ps1 | 30 - auto/apps/spacemacs.remove.ps1 | 12 - auto/apps/spacemacs.setup.ps1 | 35 - auto/apps/vscode.setup.ps1 | 16 - res/apps.md | 1520 ---------------------- res/apps/gitkraken/config | 1 - res/apps/leiningen/profiles.clj | 1 - res/apps/mysql/init.sql | 9 - res/apps/mysql/mysql_log.cmd | 2 - res/apps/mysql/mysql_start.cmd | 4 - res/apps/mysql/mysql_stop.cmd | 2 - res/apps/postgresql/default.reg | Bin 1596 -> 0 bytes res/apps/postgresql/defaultpw.txt | 1 - res/apps/postgresql/postgresql_log.cmd | 2 - res/apps/postgresql/postgresql_start.cmd | 4 - res/apps/postgresql/postgresql_stop.cmd | 4 - res/apps/spacemacs/init.el | 259 ---- res/apps/vscode/keybindings.json | 4 - res/apps/vscode/snippets/markdown.json | 18 - 38 files changed, 2414 deletions(-) delete mode 100644 auto/apps/apache.env.ps1 delete mode 100644 auto/apps/erlang.env.ps1 delete mode 100644 auto/apps/erlang.setup.ps1 delete mode 100644 auto/apps/gitkraken.env.ps1 delete mode 100644 auto/apps/gitkraken.extract.ps1 delete mode 100644 auto/apps/gitkraken.setup.ps1 delete mode 100644 auto/apps/jdk7.extract.ps1 delete mode 100644 auto/apps/jdk8.extract.ps1 delete mode 100644 auto/apps/leiningen.setup.ps1 delete mode 100644 auto/apps/maven.env.ps1 delete mode 100644 auto/apps/miktex.setup.ps1 delete mode 100644 auto/apps/mingw.setup.ps1 delete mode 100644 auto/apps/mingwget.setup.ps1 delete mode 100644 auto/apps/mysql.setup.ps1 delete mode 100644 auto/apps/php5.setup.ps1 delete mode 100644 auto/apps/php7.setup.ps1 delete mode 100644 auto/apps/postgresql.setup.ps1 delete mode 100644 auto/apps/rabbitmq.setup.ps1 delete mode 100644 auto/apps/scribus.setup.ps1 delete mode 100644 auto/apps/spacemacs.env.ps1 delete mode 100644 auto/apps/spacemacs.remove.ps1 delete mode 100644 auto/apps/spacemacs.setup.ps1 delete mode 100644 auto/apps/vscode.setup.ps1 delete mode 100644 res/apps.md delete mode 100644 res/apps/gitkraken/config delete mode 100644 res/apps/leiningen/profiles.clj delete mode 100644 res/apps/mysql/init.sql delete mode 100644 res/apps/mysql/mysql_log.cmd delete mode 100644 res/apps/mysql/mysql_start.cmd delete mode 100644 res/apps/mysql/mysql_stop.cmd delete mode 100644 res/apps/postgresql/default.reg delete mode 100644 res/apps/postgresql/defaultpw.txt delete mode 100644 res/apps/postgresql/postgresql_log.cmd delete mode 100644 res/apps/postgresql/postgresql_start.cmd delete mode 100644 res/apps/postgresql/postgresql_stop.cmd delete mode 100644 res/apps/spacemacs/init.el delete mode 100644 res/apps/vscode/keybindings.json delete mode 100644 res/apps/vscode/snippets/markdown.json diff --git a/auto/apps/apache.env.ps1 b/auto/apps/apache.env.ps1 deleted file mode 100644 index da288aed..00000000 --- a/auto/apps/apache.env.ps1 +++ /dev/null @@ -1,120 +0,0 @@ -$httpdDir = App-Dir Apache - -$confDir = Resolve-Path "$httpdDir\conf" -$confFile = "$confDir\httpd.conf" -$confBackupFile = [IO.Path]::ChangeExtension($confFile, ".conf.bak") - -# Load configuration value - -$wwwDir = Safe-Dir (Get-AppConfigValue Apache HttpdDocumentRoot) -Debug "DocumentRoot = '$wwwDir'" -$wwwListen = Get-AppConfigValue Apache HttpdListen -Debug "Listen = '$wwwListen'" - -# Replay backup if no configuration found - -if ((Test-Path $confBackupFile) -and !(Test-Path $confFile)) { - cp $confBackupFile $confFile -} - -# Make backup of configuration - -if (!(Test-Path $confBackupFile)) { - cp $confFile $confBackupFile -} - -# Helper functions - -function ApacheConformPath([string]$p) { - return $p.Replace('\', '/') -} - -function regex([string]$pattern, [Text.RegularExpressions.RegexOptions]$options) { - return New-Object System.Text.RegularExpressions.Regex ($pattern, $options) -} - -function Clean-Whitespace([string]$txt) { - return ([regex]'(\r?\n){2,}').Replace($txt, '$1$1') -} - -function Remove-PatternLine([string]$txt, [string]$pattern) { - [regex]$r = regex $pattern Multiline - return $r.Replace($txt, '') -} - -function Asure-PatternLine([string]$txt, [string]$pattern, [string]$replacement) { - $txt = Remove-PatternLine $txt $pattern - $txt = Clean-Whitespace $txt - $txt = $txt.TrimEnd() + "`n" + $replacement - return $txt -} - -# Load configuration - -$txt = [IO.File]::ReadAllText($confFile, [Text.Encoding]::UTF8) - -# Modify configuration - -$serverRootP = regex '^ServerRoot\s+"(.*?)"' Multiline - -$txt = $serverRootP.Replace($txt, "ServerRoot `"$(ApacheConformPath $httpdDir)`"") - -$docRootP = regex '^DocumentRoot\s+"(?.*?)"' Multiline - -$docRootM = $docRootP.Match($txt) -if ($docRootM.Success) { - $txt = $docRootP.Replace($txt, "DocumentRoot `"$(ApacheConformPath $wwwDir)`"") - $oldDocRootPath = $docRootM.Groups['path'].Value - $oldDocRootPath = [regex]::Escape((ApacheConformPath $oldDocRootPath)) - $docRootDirP = regex "^\" "Multiline, IgnoreCase, CultureInvariant" - $txt = $docRootDirP.Replace($txt, "") -} - -$listenP = regex '^Listen\s+(\S*)' Multiline -$txt = $listenP.Replace($txt, "Listen $wwwListen") - -# Install PHP - -# Try PHP 7 - -$php7 = App-Exe PHP7 -if ($php7) { - $php7Dir = App-Dir PHP7 - $php7Module = "$(App-Dir PHP7)\php7apache2_4.dll" - - $txt = Asure-PatternLine $txt ` - '^LoadModule\s+php\d_module\s+"(.*?)"' ` - "LoadModule php7_module `"$(ApacheConformPath $php7Module)`"" - - $txt = Asure-PatternLine $txt ` - '^PHPIniDir\s+"(.*?)"' ` - "PHPIniDir `"$(ApacheConformPath $php7Dir)`"" - - $txt = Asure-PatternLine $txt ` - '^AddType\s+application/x-httpd-php\s+(.*?)$' ` - "AddType application/x-httpd-php php php7" -} - -# Try PHP 5 - -$php5 = App-Exe PHP5 -if ($php5 -and !$php7) { - $php5Dir = App-Dir PHP5 - $php5Module = "$(App-Dir PHP5)\php5apache2_4.dll" - - $txt = Asure-PatternLine $txt ` - '^LoadModule\s+php\d_module\s+"(.*?)"' ` - "LoadModule php5_module `"$(ApacheConformPath $php5Module)`"" - - $txt = Asure-PatternLine $txt ` - '^PHPIniDir\s+"(.*?)"' ` - "PHPIniDir `"$(ApacheConformPath $php5Dir)`"" - - $txt = Asure-PatternLine $txt ` - '^AddType\s+application/x-httpd-php\s+(.*?)$' ` - "AddType application/x-httpd-php php php5" -} - -# Write configuration - -[IO.File]::WriteAllText($confFile, $txt, [Text.Encoding]::UTF8) diff --git a/auto/apps/erlang.env.ps1 b/auto/apps/erlang.env.ps1 deleted file mode 100644 index cfb25879..00000000 --- a/auto/apps/erlang.env.ps1 +++ /dev/null @@ -1,14 +0,0 @@ -$erlangDir = App-Dir Erlang -$binDir = "$erlangDir\bin" -$ertsVersion = Get-AppConfigValue Erlang ErtsVersion -$ertsDir = "$erlangDir\erts-${ertsVersion}" - -$bindirPath = $binDir.TrimEnd("\").Replace("\", "\\") -$rootdirPath = $erlangDir.TrimEnd("\").Replace("\", "\\") - -$iniText = @("[erlang]") -$iniText += "Bindir=${bindirPath}" -$iniText += "Progname=erl" -$iniText += "Rootdir=${rootdirPath}" - -$iniText | Out-File "$binDir\erl.ini" -Encoding Default -Force diff --git a/auto/apps/erlang.setup.ps1 b/auto/apps/erlang.setup.ps1 deleted file mode 100644 index 18fd9aba..00000000 --- a/auto/apps/erlang.setup.ps1 +++ /dev/null @@ -1,29 +0,0 @@ -$erlangDir = App-Dir Erlang - -$majorVersion = Get-AppConfigValue Erlang VersionMajor -$ertsVersion = Get-AppConfigValue Erlang ErtsVersion - -$binDir = "$erlangDir\bin" -$ertsDir = "$erlangDir\erts-${ertsVersion}" -$releaseDir = "$erlangDir\releases\${majorVersion}" - -if (!(Test-Path $binDir)) -{ - $_ = mkdir $binDir - cp "$ertsDir\bin\ct_run.exe" $binDir - cp "$ertsDir\bin\dialyzer.exe" $binDir - cp "$ertsDir\bin\erl.exe" $binDir - cp "$ertsDir\bin\erlc.exe" $binDir - cp "$ertsDir\bin\escript.exe" $binDir - cp "$ertsDir\bin\typer.exe" $binDir - cp "$ertsDir\bin\werl.exe" $binDir - cp "$releaseDir\no_dot_erlang.boot" $binDir - cp "$releaseDir\start.boot" $binDir - cp "$releaseDir\start_clean.boot" $binDir - cp "$releaseDir\start_sasl.boot" $binDir -} - -Purge-Dir "$erlangDir\`$PLUGINDIR" -del "$erlangDir\Install.*" -del "$erlangDir\Uninstall.*" -del "$erlangDir\*.template" diff --git a/auto/apps/gitkraken.env.ps1 b/auto/apps/gitkraken.env.ps1 deleted file mode 100644 index c6a400d5..00000000 --- a/auto/apps/gitkraken.env.ps1 +++ /dev/null @@ -1,13 +0,0 @@ -$appData = Get-ConfigValue AppDataDir -$gitKrakenConfig = Resolve-Path "$appData\.gitkraken\config" - -if ($gitKrakenConfig) -{ - $projectsDir = Get-ConfigValue ProjectRootDir - $projectsDir = $projectsDir.Replace("\", "\\") - $enc = New-Object System.Text.UTF8Encoding ($False) - $json = [IO.File]::ReadAllText($gitKrakenConfig, $enc) - [regex]$p = "`"projectsDirectory`"\s*:\s*`".*?`"" - $json = $p.Replace($json, "`"projectsDirectory`":`"$projectsDir`"") - [IO.File]::WriteAllText($gitKrakenConfig, $json, $enc) -} diff --git a/auto/apps/gitkraken.extract.ps1 b/auto/apps/gitkraken.extract.ps1 deleted file mode 100644 index 1d8b0a29..00000000 --- a/auto/apps/gitkraken.extract.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -param ($archive, $targetDir) - -$extractDir = Empty-Dir "$(Get-ConfigValue TempDir)\gitkraken" - -$7z = App-Exe 7z - -& $7z x "-o$extractDir" "$archive" | Out-Null - -if (!(Test-Path "$extractDir\Update.exe")) { - throw "Did not find the expected content in the setup archive" -} - -$nupkg = gci "$extractDir\gitkraken-*-full.nupkg" - -& $7z x "-o$targetDir" $nupkg.FullName | Out-Null - -Purge-Dir $extractDir diff --git a/auto/apps/gitkraken.setup.ps1 b/auto/apps/gitkraken.setup.ps1 deleted file mode 100644 index f3fd3a79..00000000 --- a/auto/apps/gitkraken.setup.ps1 +++ /dev/null @@ -1,12 +0,0 @@ -$configDir = [IO.Path]::Combine((Get-ConfigValue AppDataDir), ".gitkraken") -$configFile = [IO.Path]::Combine($configDir, "config") -$templateFile = [IO.Path]::Combine((Get-ConfigValue AppResourceBaseDir), "gitkraken\config") - -if (!(Test-Path $configDir)) -{ - $_ = mkdir $configDir -} -if (!(Test-Path $configFile)) -{ - copy $templateFile $configFile -} diff --git a/auto/apps/jdk7.extract.ps1 b/auto/apps/jdk7.extract.ps1 deleted file mode 100644 index d49a8a82..00000000 --- a/auto/apps/jdk7.extract.ps1 +++ /dev/null @@ -1,19 +0,0 @@ -param ($archive, $targetDir) - -$jdkexDir = Empty-Dir "$(Get-ConfigValue TempDir)\jdk8ex" - -$7z = App-Exe 7z - -& $7z x "-o$jdkexDir" "$archive" | Out-Null - -if (!(Test-Path "$jdkexDir\tools.zip")) { - throw "Did not find the expected content in the JDK archive" -} - -& $7z x "-o$targetDir" "-x!lib\missioncontrol*" "-x!bin\jmc.exe" "-x!javafx-src.zip" "$jdkexDir\tools.zip" | Out-Null - -Purge-Dir $jdkexDir - -foreach ($f in (Get-ChildItem $targetDir -Include "*.pack" -Recurse)) { - & "$targetDir\bin\unpack200.exe" -r $f.FullName ([IO.Path]::ChangeExtension($f.FullName, ".jar")) | Out-Null -} diff --git a/auto/apps/jdk8.extract.ps1 b/auto/apps/jdk8.extract.ps1 deleted file mode 100644 index d49a8a82..00000000 --- a/auto/apps/jdk8.extract.ps1 +++ /dev/null @@ -1,19 +0,0 @@ -param ($archive, $targetDir) - -$jdkexDir = Empty-Dir "$(Get-ConfigValue TempDir)\jdk8ex" - -$7z = App-Exe 7z - -& $7z x "-o$jdkexDir" "$archive" | Out-Null - -if (!(Test-Path "$jdkexDir\tools.zip")) { - throw "Did not find the expected content in the JDK archive" -} - -& $7z x "-o$targetDir" "-x!lib\missioncontrol*" "-x!bin\jmc.exe" "-x!javafx-src.zip" "$jdkexDir\tools.zip" | Out-Null - -Purge-Dir $jdkexDir - -foreach ($f in (Get-ChildItem $targetDir -Include "*.pack" -Recurse)) { - & "$targetDir\bin\unpack200.exe" -r $f.FullName ([IO.Path]::ChangeExtension($f.FullName, ".jar")) | Out-Null -} diff --git a/auto/apps/leiningen.setup.ps1 b/auto/apps/leiningen.setup.ps1 deleted file mode 100644 index dcb5f689..00000000 --- a/auto/apps/leiningen.setup.ps1 +++ /dev/null @@ -1,24 +0,0 @@ -$lein = App-Exe Leiningen -$leinResourceDir = "$(Get-ConfigValue AppResourceBaseDir)\leiningen" -$leinProfilesTemplate = "$leinResourceDir\profiles.clj" -$leinProfilesDir = "$(Get-ConfigValue HomeDir)\.lein" -$leinProfiles = [IO.Path]::Combine($leinProfilesDir, "profiles.clj") - -$leinEnv = Get-AppConfigValue Leiningen Environment -$leinJar = $leinEnv["LEIN_JAR"] - -if (!(Test-Path $leinJar)) -{ - $env:LEIN_JAR = $leinJar - Write-Host "Installing Leiningen to: $leinJar" - & $lein self-install -} - -if (!(Test-Path $leinProfilesDir)) -{ - $_ = mkdir $leinProfilesDir -} -if (!(Test-Path $leinProfiles)) -{ - copy $leinProfilesTemplate $leinProfiles -} diff --git a/auto/apps/maven.env.ps1 b/auto/apps/maven.env.ps1 deleted file mode 100644 index 573066cf..00000000 --- a/auto/apps/maven.env.ps1 +++ /dev/null @@ -1,62 +0,0 @@ -$settingsFile = "$(App-Dir Maven)\conf\settings.xml" - -function AppendValueElement([Xml.XmlElement]$e, [string]$name, [string]$value) { - $dom = $e.OwnerDocument - $ns = $dom.DocumentElement.NamespaceURI - $vE = $dom.CreateElement($name, $ns) - $vE.InnerText = $value - $_ = $e.AppendChild($vE) -} - -function AddProxy([Xml.XmlElement]$proxiesE, [string]$protocol, [Uri]$uri) { - $dom = $proxiesE.OwnerDocument - $ns = $dom.DocumentElement.NamespaceURI - $proxyE = $dom.CreateElement("proxy", $ns) - AppendValueElement $proxyE "id" "bench_$protocol" - AppendValueElement $proxyE "active" "true" - AppendValueElement $proxyE "protocol" $protocol - AppendValueElement $proxyE "host" $uri.Host - AppendValueElement $proxyE "port" $uri.Port - $_ = $proxiesE.AppendChild($proxyE) -} - -if (Test-Path $settingsFile) { - Debug "Configuring Maven settings ..." - $dom = [xml](Get-Content $settingsFile -Encoding UTF8) - $nameTable = New-Object System.Xml.NameTable - $nsMgr = New-Object System.Xml.XmlNamespaceManager($nameTable) - $doc = $dom.DocumentElement - $ns = $doc.NamespaceURI - $nsMgr.AddNamespace("m", $ns) - - # Update location of local repository - - $repoE = $doc.SelectSingleNode("m:localRepository", $nsMgr) - if (!$repoE) { - $repoE = $dom.CreateElement("localRepository", $ns) - $_ = $doc.AppendChild($repoE) - } - $repoE.InnerText = "`${env.HOME}\m2_repo" - - # Update proxy configuration - - $proxiesE = $doc.SelectSingleNode("m:proxies", $nsMgr) - if (!$proxiesE) { - $proxiesE = $dom.CreateElement("proxies", $ns) - $_ = $doc.AppendChild($proxiesE) - } - $proxiesE.RemoveAll() - - if (Get-ConfigBooleanValue UseProxy) { - [Uri]$httpProxyUri = Get-ConfigValue HttpProxy - if ($httpProxyUri) { - AddProxy $proxiesE "http" $httpProxyUri - } - [Uri]$httpsProxyUri = Get-ConfigValue HttpsProxy - if ($httpsProxyUri) { - AddProxy $proxiesE "https" $httpsProxyUri - } - } - - $dom.Save($settingsFile) -} diff --git a/auto/apps/miktex.setup.ps1 b/auto/apps/miktex.setup.ps1 deleted file mode 100644 index fbcebf42..00000000 --- a/auto/apps/miktex.setup.ps1 +++ /dev/null @@ -1,48 +0,0 @@ -$mpm = "$(App-Path MiKTeX)\mpm.exe" -if (!(Test-Path $mpm)) { - throw "MiKTeX Package Manager not found" -} - -$packages = @( - "koma-script", - "upquote", - "mathspec", - "etoolbox", - "l3kernel", - "l3packages", - "tipa", - "xetex-def", - "realscripts", - "metalogo", - "microtype", - "url", - "polyglossia", - "makecmds", - "fancyvrb", - "booktabs" -) - -function Extract-InstalledPackageNames() { - begin { - [regex]$ex = "\S+$" - } - process { - if ($_.StartsWith("i ")) { - $m = $ex.Match($_) - if ($m.Success) { - return $m.Value - } - } - } -} - -Write-Host "Installing missing LaTeX packages" - -$installed = & $mpm --list | Extract-InstalledPackageNames - -foreach ($package in $packages) { - if (!($installed -contains $package)) { - & $mpm "--install=$package" - $installed = & $mpm --list | Extract-InstalledPackageNames - } -} diff --git a/auto/apps/mingw.setup.ps1 b/auto/apps/mingw.setup.ps1 deleted file mode 100644 index be6b3e10..00000000 --- a/auto/apps/mingw.setup.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -$mingwGet = App-Exe MinGwGet - -$mingwPackages = Get-AppConfigListValue MinGW Packages - -$ErrorActionPreference = "SilentlyContinue" -foreach ($p in $mingwPackages) -{ - Write-Host "Setting up MinGW package $p ..." - & $mingwGet install $p -} diff --git a/auto/apps/mingwget.setup.ps1 b/auto/apps/mingwget.setup.ps1 deleted file mode 100644 index 875ced62..00000000 --- a/auto/apps/mingwget.setup.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -$mingwDir = App-Dir MinGwGet -$mingwGet = App-Exe MinGwGet - -if (!(Test-Path "$mingwDir\var\cache")) -{ - pushd $mingwDir - Write-Host "Updating MinGW catalog ..." - & $mingwGet update - popd -} diff --git a/auto/apps/mysql.setup.ps1 b/auto/apps/mysql.setup.ps1 deleted file mode 100644 index 1bf961a9..00000000 --- a/auto/apps/mysql.setup.ps1 +++ /dev/null @@ -1,26 +0,0 @@ -$mysqlResourceDir = "$(Get-ConfigValue AppResourceBaseDir)\mysql" -$mysqlDir = App-Dir MySQL -$mysqlPath = App-Path MySQL -$dataDir = Get-AppConfigValue MySQL MySqlDataDir - -if (!(Test-Path $dataDir -PathType Container)) { - $_ = mkdir $dataDir - $logFile = "$dataDir\$env:COMPUTERNAME.err" - if (Test-Path $logFile) { - del $logFile - } - & "$mysqlPath\mysqld.exe" --initialize --init-file "$mysqlResourceDir\init.sql" --log_syslog=0 "--basedir=$mysqlDir" "--datadir=$dataDir" -} - -if (!(Test-Path "$mysqlPath\mysql_start.cmd")) { - cp "$mysqlResourceDir\mysql_start.cmd" $mysqlPath - Write-Host "Run 'mysql_start' on the Bench shell to start the MySQL server." -} -if (!(Test-Path "$mysqlPath\mysql_stop.cmd")) { - cp "$mysqlResourceDir\mysql_stop.cmd" $mysqlPath - Write-Host "Run 'mysql_stop' on the Bench shell to stop a running MySQL server." -} -if (!(Test-Path "$mysqlPath\mysql_log.cmd")) { - cp "$mysqlResourceDir\mysql_log.cmd" $mysqlPath - Write-Host "Run 'mysql_log' to open the MySQL log file in the system editor." -} diff --git a/auto/apps/php5.setup.ps1 b/auto/apps/php5.setup.ps1 deleted file mode 100644 index e5d07a8f..00000000 --- a/auto/apps/php5.setup.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -$phpDir = App-Dir PHP5 - -cp "$phpDir\php.ini-development" "$phpDir\php.ini" diff --git a/auto/apps/php7.setup.ps1 b/auto/apps/php7.setup.ps1 deleted file mode 100644 index f48459fb..00000000 --- a/auto/apps/php7.setup.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -$phpDir = App-Dir PHP7 - -cp "$phpDir\php.ini-development" "$phpDir\php.ini" diff --git a/auto/apps/postgresql.setup.ps1 b/auto/apps/postgresql.setup.ps1 deleted file mode 100644 index 8fe06e28..00000000 --- a/auto/apps/postgresql.setup.ps1 +++ /dev/null @@ -1,35 +0,0 @@ -$pgResourceDir = "$(Get-ConfigValue AppResourceBaseDir)\postgresql" -$pgPath = App-Path PostgreSQL - -$dataDir = Get-AppConfigValue PostgreSQL PostgreSqlDataDir -$logFile = Get-AppConfigValue PostgreSQL PostgreSqlLogFile - -if (!(Test-Path $dataDir -PathType Container)) { - Write-Host "Initializing PostgreSQL database in $dataDir" - pushd $pgPath - .\initdb.exe "--pgdata=$dataDir" "--username=postgres" "--pwfile=$pgResourceDir\defaultpw.txt" | Out-File $logFile -Encoding OEM - popd - Write-Host "Login to PostgreSQL with user 'postgres' and password 'bench'." - if ($LASTEXITCODE -ne 0) { - throw "Error during initialization of the PostgreSQL data directory: Exit Code = $LASTEXITCODE." - } -} - -$regFile = Get-AppRegistryFileName PostgreSQL bench -if (!(Test-Path $regFile)) { - cp "$pgResourceDir\default.reg" $regFile - Write-Host "Initialize default registry backup for pgAdmin III." -} - -if (!(Test-Path "$pgPath\postgresql_start.cmd")) { - cp "$pgResourceDir\postgresql_start.cmd" $pgPath - Write-Host "Run 'postgresql_start' on the Bench shell to start the PostgreSQL server." -} -if (!(Test-Path "$pgPath\postgresql_stop.cmd")) { - cp "$pgResourceDir\postgresql_stop.cmd" $pgPath - Write-Host "Run 'postgresql_stop' on the Bench shell to stop a running PostgreSQL server." -} -if (!(Test-Path "$pgPath\postgresql_log.cmd")) { - cp "$pgResourceDir\postgresql_log.cmd" $pgPath - Write-Host "Run 'postgresql_log' to open the PostgreSQL log file in the system editor." -} diff --git a/auto/apps/rabbitmq.setup.ps1 b/auto/apps/rabbitmq.setup.ps1 deleted file mode 100644 index 6a74e39a..00000000 --- a/auto/apps/rabbitmq.setup.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -Start-Process rabbitmq-server - -echo "Waiting 10s for the broker to boot ..." -[Threading.Thread]::Sleep(10000) - -echo "Activating Web UI ..." -rabbitmq-plugins enable rabbitmq_management - -echo "Killing the broker ..." -rabbitmqctl stop diff --git a/auto/apps/scribus.setup.ps1 b/auto/apps/scribus.setup.ps1 deleted file mode 100644 index e9ae972d..00000000 --- a/auto/apps/scribus.setup.ps1 +++ /dev/null @@ -1,16 +0,0 @@ -$scribusDir = App-Dir Scribus - -$nsisDirs = "$scribusDir\`$PLUGINSDIR", "$scribusDir\`$TEMP" -foreach ($d in $nsisDirs) -{ - if (Test-Path $d) - { - Purge-Dir $d - } -} - -$uninst = "$scribusDir\uninst.exe" -if (Test-Path $uninst) -{ - del $uninst -Force -} diff --git a/auto/apps/spacemacs.env.ps1 b/auto/apps/spacemacs.env.ps1 deleted file mode 100644 index e8e8e129..00000000 --- a/auto/apps/spacemacs.env.ps1 +++ /dev/null @@ -1,30 +0,0 @@ -$homeDir = Get-ConfigValue HomeDir -$emacsInitFile = [IO.Path]::Combine($homeDir, ".emacs") -$emacsUserDir = [IO.Path]::Combine($homeDir, ".emacs.d") - -$nl = [Environment]::NewLine -$preamble = ";; BENCH SPACEMACS" - -if (Test-Path $emacsInitFile -PathType Leaf) { - [string]$oldCode = [IO.File]::ReadAllText($emacsInitFile, [Text.Encoding]::UTF8) - if (!$oldCode.StartsWith($preamble)) { - Write-Warning "Could not setup Spacemacs initialization, because an unknown .emacs file exists in the home directory." - return - } -} - -function formatPath ([string]$path) { - return $path.Replace('\', '/') -} - -$initCode = "$preamble$nl$nl" -$initCode += ";; Set path to Spacemacs explicitly, because the recognition$nl" -$initCode += ";; of the directory '%HOME%\.emacs.d' does not work correctly$nl" -$initCode += ";; with overridden HOME environment variable.$nl$nl" -$initCode += "(setq user-emacs-directory `"$(formatPath $emacsUserDir)/`")$nl" -$initCode += "(setq user-init-file `"$(formatPath $emacsUserDir)/init.el`")$nl" -$initCode += "(load user-init-file)$nl" - -Debug "Updating Emacs init file: $emacsInitFile" - -[IO.File]::WriteAllText($emacsInitFile, $initCode, [Text.Encoding]::UTF8) diff --git a/auto/apps/spacemacs.remove.ps1 b/auto/apps/spacemacs.remove.ps1 deleted file mode 100644 index d54b5188..00000000 --- a/auto/apps/spacemacs.remove.ps1 +++ /dev/null @@ -1,12 +0,0 @@ -$homeDir = Get-ConfigValue HomeDir -$spacemacsConfig = [IO.Path]::Combine($homeDir, ".spacemacs") -$spacemacsConfigDir = [IO.Path]::Combine($homeDir, ".spacemacs.d") -$spacemacsDir = [IO.Path]::Combine($homeDir, ".emacs.d") - -if ((Test-Path $spacemacsConfig) -or (Test-Path $spacemacsConfigDir)) -{ - if (Test-Path $spacemacsDir) - { - Purge-Dir $spacemacsDir - } -} diff --git a/auto/apps/spacemacs.setup.ps1 b/auto/apps/spacemacs.setup.ps1 deleted file mode 100644 index 2b996e6b..00000000 --- a/auto/apps/spacemacs.setup.ps1 +++ /dev/null @@ -1,35 +0,0 @@ -$spacemacsResourceDir = "$(Get-ConfigValue AppResourceBaseDir)\spacemacs" -$emacsDir = App-Path Emacs -$git = App-Exe Git - -if (!$git) { throw "Git not found" } - -function Run-Git ($arguments) { - Start-Process $git -Wait -NoNewWindow $arguments -} - -$homeDir = Get-ConfigValue HomeDir -$spacemacsConfig = [IO.Path]::Combine($homeDir, ".spacemacs") -$spacemacsConfigDir = [IO.Path]::Combine($homeDir, ".spacemacs.d") -$spacemacsInitFile = [IO.Path]::Combine($spacemacsConfigDir, "init.el") -$spacemacsInitTemplate = Resolve-Path "$spacemacsResourceDir\init.el" - -if (!(Test-Path $spacemacsConfig -PathType Leaf) -and !(Test-Path $spacemacsConfigDir -PathType Container)) { - Write-Host "Initializing Spacemacs configuration ..." - mkdir $spacemacsConfigDir | Out-Null - cp $spacemacsInitTemplate $spacemacsInitFile - pushd $spacemacsConfigDir | Out-Null - Run-Git @("init") - Run-Git @("add", "-A", ":/") - Run-Git @("commit", "-m", '"Default Spacemacs configuration from Bench template"') - popd | Out-Null -} - -$spacemacsDir = [IO.Path]::Combine($homeDir, ".emacs.d") - -if (!(Test-Path $spacemacsDir -PathType Container)) { - Write-Host "Cloning Spacemacs ..." - Run-Git @("clone", "https://github.com/syl20bnr/spacemacs.git", "`"$spacemacsDir`"") - Write-Host "" - Write-Host "Run 'emacs' once to initialize and start Spacemacs." -} diff --git a/auto/apps/vscode.setup.ps1 b/auto/apps/vscode.setup.ps1 deleted file mode 100644 index 2c3dd897..00000000 --- a/auto/apps/vscode.setup.ps1 +++ /dev/null @@ -1,16 +0,0 @@ -$codeResourceDir = "$(Get-ConfigValue AppResourceBaseDir)\vscode" -$codeAppData = Safe-Dir "$(Get-ConfigValue AppDataDir)\Code\User" - -$snippetSourceDir = "$codeResourceDir\snippets" -$snippetTargetDir = Safe-Dir "$codeAppData\snippets" - -foreach ($f in (Get-ChildItem "$codeResourceDir\*.json")) { - if (!(Test-Path "$codeAppData\$($f.Name)")) { - cp $f "$codeAppData\" - } -} -foreach ($f in (Get-ChildItem "$snippetSourceDir\*.json")) { - if (!(Test-Path "$snippetTargetDir\$($f.Name)")) { - cp $f "$snippetTargetDir\" - } -} diff --git a/res/apps.md b/res/apps.md deleted file mode 100644 index e64acc00..00000000 --- a/res/apps.md +++ /dev/null @@ -1,1520 +0,0 @@ -# Bench Apps - -This document is the registry for the applications, used by _Bench_. - -There are three groups of apps: - -1. **Required** - These apps are required by _Bench_ itself. -2. **Groups** - These apps are defined only by dependencies to optional apps. -3. **Optional** - These apps can be activated optionally. - -## Groups - -### Group: Markdown - -* ID: `Markdown` -* Typ: `meta` -* Dependencies: `MdProc`, `VSCode` - -### Group: Multimedia - -* ID: `Multimedia` -* Typ: `meta` -* Dependencies: `Inkscape`, `Dia`, `Gimp`, `Pandoc`, `MiKTeX`, `GraphicsMagick`, `Graphviz`, `FFmpeg`, `VLC`, `Blender` - -### Group: 3D Modeling - -* ID: `Dev3D` -* Label: 3D Modeling -* Typ: `meta` -* Dependencies: `Blender`, `FreeCAD`, `MeshLab`, `Gimp` - -### Group: Web Development with PHP7 and MySQL - -* ID: `WebDevPHP7` -* Label: Web Development with PHP 7 -* Typ: `meta` -* Dependencies: `PHP7`, `MySQL`, `MySQLWB`, `Apache`, `EclipsePHP` - -### Group: Web Development with PHP5 and MySQL - -* ID: `WebDevPHP5` -* Label: Web Development with PHP 5 -* Typ: `meta` -* Dependencies: `PHP5`, `MySQL`, `MySQLWB`, `Apache`, `EclipsePHP` - -### Group: Java Development - -* ID: `DevJava` -* Label: Java Development -* Typ: `meta` -* Dependencies: `JDK8`, `Maven`, `EclipseJava` - -### Group: Clojure Development - -* ID: `DevClojure` -* Label: Clojure Development -* Typ: `meta` -* Dependencies: `Maven`, `Leiningen`, `LightTable` - -### Group: Python 2 - -* ID: `DevPython2` -* Label: Python 2 Development -* Typ: `meta` -* Dependencies: `Python2`, `SublimeText3`, `IPython2` - -### Group: Python 3 - -* ID: `DevPython3` -* Label: Python 3 Development -* Typ: `meta` -* Dependencies: `Python3`, `SublimeText3`, `IPython3` - -### Group: C++ - -* ID: `DevCpp` -* Label: C++ Development -* Typ: `meta` -* Dependencies: `MinGW`, `EclipseCpp` - -### Group: LaTeX - -* ID: `LaTeX` -* Label: `LaTeX Writing` -* Typ: `meta` -* Dependencies: `MiKTeX`, `JabRef`, `TeXnicCenter` - -## Optional - -### GitKraken - -The downright luxurious Git client, for Windows, Mac & Linux. - -No proxy support yet (Version 1.3.0). - -* ID: `GitKraken` -* Version: latest -* Website: -* Docs: - + FAQ: -* Url: -* ArchiveName: `GitKrakenSetup.exe` -* ArchiveTyp: `custom` -* ArchivePath: `lib\net45` -* Launcher: $:Label$ - -### OpenSSL - -OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. -It is also a general-purpose cryptography library. - -* ID: `OpenSSL` -* Website: -* Docs: - + Overview: - + Commands: - + Windows Build: -* Version: 1.1.0c -* Version2: 1_1_0c -* Url: `http://slproweb.com/download/$:ArchiveName$` -* ArchiveName: `Win32OpenSSL-$:Version2$.exe` -* ArchiveTyp: `inno` -* ArchivePath: `{app}` -* Path: `bin` -* Exe: `bin\openssl.exe` - -### Putty - -PuTTY is a free (MIT-licensed) Win32 Telnet and SSH client. - -* ID: `Putty` -* Website: -* Docs: - + User Manual: -* Version: latest -* Url: -* ArchiveName: `putty.zip` -* RegistryKeys: `Software\SimonTatham` -* Launcher: $:Label$ - -### GNU TLS - -The GnuTLS Transport Layer Security Library. - -* ID: `GnuTLS` -* Label: GNU TLS -* Website: -* Docs: - + Manual: -* Version: 3.3.11 -* Url: `http://sourceforge.net/projects/ezwinports/files/$:ArchiveName$` -* ArchiveName: `gnutls-$:Version$-w32-bin.zip` -* Dir: `gnu` -* Path: `bin` -* Exe: `bin\gnutls-cli.exe` - -### GnuPG - -GnuPG is a complete and free implementation of the OpenPGP standard as defined by RFC4880 (also known as PGP). -GnuPG allows to encrypt and sign your data and communication, features a versatile key management system -as well as access modules for all kinds of public key directories. -GnuPG, also known as GPG, is a command line tool with features for easy integration with other applications. - -* ID: `GnuPG` -* Website: -* Docs: - + Manual: - + Commands: -* Version: 2.0.30 -* Url: `https://sourceforge.net/projects/portableapps/files/GPG Plugin Portable/$:ArchiveName$` -* ArchiveName: `GPG_Plugin_Portable_$:Version$.paf.exe` -* Dir: `gpg` -* Path: `pub` -* Exe: `pub\gpg.exe` - -### Wget - -GNU Wget is a free utility for non-interactive download of files from the Web. -It supports HTTP, HTTPS, and FTP protocols, as well as retrieval through HTTP proxies. - -* ID: `Wget` -* Website: -* Docs: - + Manual: -* Version: 1.11.4-1 -* Dependencies: `WgetDeps` -* Url: `https://sourceforge.net/projects/gnuwin32/files/wget/$:Version$/$:ArchiveName$` -* ArchiveName: `wget-$:Version$-bin.zip` -* Dir: `gnu` -* Path: `bin` -* Exe: `bin\wget.exe` -* Environment: - + `HTTP_CLIENT`: `wget --no-check-certificate -O` - -* ID: `WgetDeps` -* Version: `$Wget:Version$` -* Url: `https://sourceforge.net/projects/gnuwin32/files/wget/$:Version$/$:ArchiveName$` -* ArchiveName: `wget-$:Version$-dep.zip` -* Dir: `gnu` -* SetupTestFile: `bin\libssl32.dll` - -### cURL - -curl is an open source command line tool and library for transferring data with URL syntax, -supporting DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, -RTMP, RTSP, SCP, SFTP, SMB, SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, -HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, HTTP/2, cookies, -user+password authentication (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos), -file transfer resume, proxy tunneling and more. - -* ID: `cURL` -* Website: -* Docs: - + Manual: - + Man Page: -* Version: 7.50.1 -* Url: `https://bintray.com/artifact/download/vszakats/generic/$:ArchiveName$` -* ArchiveName: `curl-$:Version$-win32-mingw.7z` -* ArchivePath: `curl-$:Version$-win32-mingw` -* Path: `bin` -* Exe: `bin\curl.exe` - -### FileZilla - -FileZilla Client is a free, open source FTP client. It supports FTP, SFTP, and FTPS (FTP over SSL/TLS). - -* ID: `FileZilla` -* Website: -* Docs: - + Documentation: - + Usage: - + Tutorial: -* Version: 3.20.1 -* Url: `https://sourceforge.net/projects/portableapps/files/FileZilla%20Portable/$:ArchiveName$` -* ArchiveName: `FileZillaPortable_$:Version$.paf.exe` -* ArchivePath: `App/filezilla` -* Exe: `filezilla.exe` -* Register: `false` -* Launcher: $:Label$ - -### Sift - -Sift - grep on steroids. A fast and powerful alternative to grep. - -* ID: `Sift` -* Website: -* Docs: - + Documentation: -* Version: 0.8.0 -* Url: `https://sift-tool.org/downloads/sift/$:ArchiveName$` -* ArchiveName: `sift_$:Version$_windows_386.zip` - -### WinMerge - -WinMerge is an Open Source differencing and merging tool for Windows. -WinMerge can compare both folders and files, presenting differences in a visual text format -that is easy to understand and handle. - -* ID: `WinMerge` -* Website: -* Docs: - + Quick Tour: - + Manual: -* Version: 2.14.0 -* Url: `https://sourceforge.net/projects/portableapps/files/WinMerge%20Portable/$:ArchiveName$` -* ArchiveName: `WinMergePortable_$:Version$.paf.exe` -* ArchivePath: `App/winmerge` -* Exe: `WinMergeU.exe` -* RegistryKeys: `Software\Thingamahoochie` -* Register: `false` -* Launcher: $:Label$ - -### Ant Renamer - -Ant Renamer is a free program that makes easier the renaming of lots of files and folders -by using specified settings. - -* ID: `AntRenamer` -* Label: Ant Renamer -* Website: -* Docs: - + Forum: -* Version: latest -* Url: -* ArchiveName: `antrenamer2.zip` -* Dir: `renamer` -* Exe: `Renamer.exe` -* Launcher: $:Label$ - -### Pandoc - -Pandoc is a library and command-line tool for converting from one markup format to another. - -* ID: `Pandoc` -* Website: -* Docs: - + User's Guide: - + FAQ: -* Version: 1.17.2 -* Release: $:Version$ -* Url: `https://github.com/jgm/pandoc/releases/download/$:Version$/$:ArchiveName$` -* ArchiveName: `pandoc-$:Release$-windows.msi` -* ArchivePath: `SourceDir\Pandoc` -* Exe: `pandoc.exe` - -### MiKTeX - -MiKTeX (pronounced mick-tech) is an up-to-date implementation of TeX/LaTeX -and related programs for Windows (all current variants). - -* ID: `MiKTeX` -* Website: -* Docs: - + Manual: - + LaTeX Guides: -* Version: 2.9.5987 -* Url: `http://mirrors.ctan.org/systems/win32/miktex/setup/$:ArchiveName$` -* ArchiveName: `miktex-portable-$:Version$.exe` -* ArchivePath: `texmfs` -* Path: `install\miktex\bin` -* Exe: `install\miktex\bin\latex.exe` -* Launcher: `MiKTeX Tray Icon` -* LauncherExecutable: `install\miktex\bin\miktex-taskbar-icon.exe` -* LauncherIcon: `install\miktex\bin\mo.exe` - -### JabRef - -JabRef is an open source bibliography reference manager. -The native file format used by JabRef is BibTeX, the standard LaTeX bibliography format. - -* ID: `JabRef` -* Dependencies: `JRE8` -* Website: -* Docs: - + Help: - + FAQ: -* Version: 3.5 -* Url: `https://github.com/JabRef/jabref/releases/download/v$:Version$/$:ResourceName$` -* ResourceName: `JabRef-$:Version$.jar` -* Exe: `$:ResourceName$` -* Launcher: $:Label$ -* LauncherExecutable: `$JRE8:Path$\javaw.exe` -* LauncherArguments: `-jar`, `$:Exe$` - -### Graphics Magick - -GraphicsMagick is the swiss army knife of image processing. It provides a robust -and efficient collection of tools and libraries which support reading, writing, -and manipulating an image in over 88 major formats including important formats -like DPX, GIF, JPEG, JPEG-2000, PNG, PDF, PNM, and TIFF. - -* ID: `GraphicsMagick` -* Label: Graphics Magick -* Website: -* Docs: - + Utilities: - + FAQ: - + APIs: - + Supported Formats: - + Color Reference: -* Version: 1.3.24 -* Url: `http://sourceforge.net/projects/graphicsmagick/files/graphicsmagick-binaries/$:Version$/$:ArchiveName$` -* ArchiveName: `GraphicsMagick-$:Version$-Q16-win32-dll.exe` -* ArchiveTyp: `inno` -* ArchivePath: `{app}` -* Dir: `gm` -* Exe: `gm.exe` - -### FFmpeg - -FFmpeg is the leading multimedia framework, able to decode, encode, transcode, -mux, demux, stream, filter and play pretty much anything that humans and machines have created. -It supports the most obscure ancient formats up to the cutting edge. -No matter if they were designed by some standards committee, the community or a corporation. - -* ID: `FFmpeg` -* Website: -* Docs: - + Overview: - + ffmpeg Tool: - + ffplay Tool: - + ffprobe Tool: - + ffserver Tool: - + Wiki: -* Version: latest -* Url: `http://ffmpeg.zeranoe.com/builds/win32/shared/$:ArchiveName$` -* ArchiveName: `ffmpeg-$:Version$-win32-shared.7z` -* ArchivePath: `ffmpeg-$:Version$-win32-shared` -* Path: `bin` -* Exe: `bin\ffmpeg.exe` - -### VLC - -VLC is a free and open source cross-platform multimedia player and framework -that plays most multimedia files, and various streaming protocols. - -* ID: `VLC` -* Label: VLC Player -* Website: -* Docs: - + Features: - + Skins: -* Version: 2.2.4 -* Url: `http://get.videolan.org/vlc/$:Version$/win32/$:ArchiveName$` -* ArchiveName: `vlc-$:Version$-win32.7z` -* ArchivePath: `vlc-$:Version$` -* Launcher: $:Label$ - -### Graphviz - -Graphviz is open source graph visualization software. -Graph visualization is a way of representing structural information as diagrams -of abstract graphs and networks. It has important applications in networking, -bioinformatics, software engineering, database and web design, machine learning, -and in visual interfaces for other technical domains. - -* ID: `Graphviz` -* Website: -* Docs: - + Overview: - + The DOT Language: - + Attributes: - + Color Names: - + Node Shapes: - + Arrow Shapes: - + Command-Line Invocation: - + Output Formats: -* Version: 2.38 -* Url:`https://github.com/ErwinJanssen/graphviz/releases/download/v$:Version$/$:ArchiveName$` -* ArchiveName: `graphviz-$:Version$.msi` -* ArchivePath: `SourceDir` -* Path: `bin` -* Exe: `bin\dot.exe` - -### Dia - -Dia is a program to draw structured diagrams. - -* ID: `Dia` -* Website: -* Docs: - + Overview: - + Manual: - + FAQ: -* Version: 0.97.2 -* Release: 0.97.2-2 -* Url: `http://sourceforge.net/projects/dia-installer/files/dia-win32-installer/$:Version$/$:ArchiveName$` -* ArchiveName: `dia-setup-$:Release$-unsigned.exe` -* Path: `bin` -* Exe: `bin\dia.exe` -* Launcher: $:Label$ -* LauncherExecutable: `bin\diaw.exe` -* LauncherArguments: `--integrated`, `%*` - -### Inkscape - -Inkscape is a professional vector graphics editor for Windows, Mac OS X and Linux. -It's free and open source. - -* ID: `Inkscape` -* Website: -* Docs: - + Manual: - + Tutorials: - + FAQ: - + Command Line Reference: - + Keyboard Shortcuts: -* Version: 0.91-1 -* Url: -* ArchiveName: `Inkscape-$:Version$-win32.7z` -* ArchivePath: `inkscape` -* Exe: `inkscape.exe` -* Launcher: $:Label$ - -### GIMP - -The GNU Image Manipulation Program. - -GIMP is a cross-platform image editor. -Whether you are a graphic designer, photographer, illustrator, or scientist, -GIMP provides you with sophisticated tools to get your job done. - -* ID: `Gimp` -* Label: GIMP -* Website: -* Docs: - + Manual: - + Tutorials: -* Version: 2.8.18 -* Url: `https://sourceforge.net/projects/portableapps/files/GIMP Portable/$:ArchiveName$` -* ArchiveName: `GIMPPortable_$:Version$.paf.exe` -* ArchivePath: `App/gimp` -* Exe: `bin\gimp-2.8.exe` -* Launcher: $:Label$ - -### Scribus - -Scribus is a page layout program, available for a lot of operating systems. -Since its humble beginning in the spring of 2001, Scribus has evolved into -one of the premier Open Source desktop applications. - -* ID: `Scribus` -* Website: -* Docs: - + Wiki: - + Manual: - + HowTo: -* Version: 1.4.6 -* Url: `https://sourceforge.net/projects/scribus/files/scribus/$:Version$/$:ArchiveName$` -* ArchiveName: `scribus-$:Version$-windows.exe` -* Register: `false` -* Launcher: $:Label$ - -### MeshLab - -MeshLab is an open source, portable, and extensible system for the processing -and editing of unstructured 3D triangular meshes. -The system is aimed to help the processing of the typical not-so-small -unstructured models arising in 3D scanning, providing a set of tools for editing, -cleaning, healing, inspecting, rendering and converting this kind of meshes. - -* ID: `MeshLab` -* VersionMajor: 1 -* VersionMinor: 3 -* VersionRevision: 3 -* Version: $:VersionMajor$.$:VersionMinor$.$:VersionRevision$ -* Website: -* Url: `https://sourceforge.net/projects/meshlab/files/meshlab/MeshLab%20v$:Version$/$:ArchiveName$` -* ArchiveName: `MeshLab_v$:VersionMajor$$:VersionMinor$$:VersionRevision$.exe` -* Exe: `meshlab_32.exe` -* Launcher: $:Label$ - -### Blender - -Blender is the open source, cross platform suite of tools for 3D creation. - -* ID: `Blender` -* Website: -* Docs: - + Features: - + Tutorials: - + Manual: - + Python API: -* Version: 2.78 -* VersionSuffix: `` -* Url: `http://download.blender.org/release/Blender$:Version$/$:ArchiveName$` -* ArchiveName: `blender-$:Version$$:VersionSuffix$-windows32.zip` -* ArchivePath: `blender-$:Version$$:VersionSuffix$-windows32` -* Launcher: $:Label$ - -### FreeCAD - -* ID: `FreeCAD` -* Version: 0.16 -* Build: 6706 -* Hash: f86a4e4 -* Website: -* Docs: - + Features: - + Documentation: - + User: - + Power User: - + Development: -* Url: `https://github.com/FreeCAD/FreeCAD/releases/download/$:Version$/$:ArchiveName$` -* ArchiveName: `FreeCAD.$:Version$.$:Build$.$:Hash$-WIN-x86-installer.exe` -* Exe: `bin\freecad.exe` -* Launcher: $:Label$ - -### Hugo - -A fast and modern static website engine. - -Hugo flexibly works with many formats and is ideal for blogs, docs, portfolios -and much more. Hugo’s speed fosters creativity and makes building a website fun again. - -* ID: `Hugo` -* Website: -* Docs: - + Introduction: - + Commands: - + Content Organization: - + Templates: - + Taxonomies: - + Theme Showcase: -* Version: 0.16 -* Url: `https://github.com/spf13/hugo/releases/download/v$:Version$/$:ArchiveName$` -* ArchiveName: `hugo_$:Version$_windows-32bit.zip` - -### CoffeeScript - -* ID: `CoffeeScript` -* Typ: `node-package` -* Website: -* Docs: - + Usage: - + Language Reference: - + Resources: -* PackageName: `coffee-script` -* Version: `>=1.10.0 <2.0.0` -* Exe: `coffee.cmd` - -### Gulp - -The streaming build system. - -* ID: `Gulp` -* Typ: `node-package` -* Website: -* Docs: - + npm Package: - + Getting Started: - + Command-Line: - + Unofficial Documentation: -* Version: `>=3.9.0 <4.0.0` -* Exe: `gulp.cmd` - -### Grunt - -The JavaScript Task Runner - -* ID: `Grunt` -* Typ: `node-package` -* Website: -* Docs: - + npm Package: - + Getting Started: - + Sample Gruntfile: - + Creating Tasks: - + Command-Line: - + API: -* Version: `>=0.4.5 <0.5.0` -* Exe: `grunt.cmd` - -### Bower - -Web sites are made of lots of things — frameworks, libraries, assets, and utilities. -Bower manages all these things for you. - -Bower can manage components that contain HTML, CSS, JavaScript, fonts or even image files. -Bower doesn’t concatenate or minify code or do anything else - it just installs -the right versions of the packages you need and their dependencies. - -* ID: `Bower` -* Typ: `node-package` -* Dependencies: `Git` -* Website: -* Docs: - + npm Package: - + Getting Started: - + Commands: -* Version: `>=1.7.0 <2.0.0` -* Exe: `bower.cmd` - -### Yeoman - -The web's scaffolding tool for modern webapps. - -Yeoman helps you to kickstart new projects, prescribing best practices and tools -to help you stay productive. - -* ID: `Yeoman` -* Typ: `node-package` -* PackageName: `yo` -* Website: -* Docs: - + npm Package: - + Getting Started: - + Tutorial: - + Generators: - + Creating a Generator: -* Version: `>=1.5.0 <2.0.0` -* Exe: `yo.cmd` - -### Yeoman Generator for Markdown Projects - -A project generator for Markdown projects with support for building -HTML, PDF, and DOCX output. Leveraging Pandoc, Graphviz and a number of -Node.js packages to pre-process the Markdown and post-process the output. - -* ID: `MdProc` -* Label: Yeoman Generator for Markdown Projects -* Typ: `node-package` -* PackageName: `generator-mdproc` -* Website: -* Version: `>=0.1.6 <0.2.0` -* Dependencies: `Yeoman`, `Gulp`, `Pandoc`, `Graphviz`, `Inkscape`, `MiKTeX` - -### JSHint - -JSHint is a tool that helps to detect errors and potential problems in your JavaScript code. - -* ID: `JSHint` -* Typ: `node-package` -* Website: -* Docs: - + npm Package: - + Documentation: - + Command-Line: - + API: -* Version: `>=2.8.0 <3.0.0` -* Exe: `jshint.cmd` - -### PyReadline - -Required for colors in IPython. - -for Python 2: - -* ID: `PyReadline2` -* Label: PyReadline (Python 2) -* PackageName: `pyreadline` -* Typ: `python2-package` -* Website: - -for Python 3: - -* ID: `PyReadline3` -* Label: PyReadline (Python 3) -* PackageName: `pyreadline` -* Typ: `python3-package` -* Website: - -### IPython - -IPython provides a rich architecture for computing with a powerful interactive shell. - -for Python 2: - -* ID: `IPython2` -* Label: IPython 2 -* Typ: `python2-package` -* PackageName: `ipython` -* Dependencies: `PyReadline2` -* Website: -* Docs: - + Documentation: -* Exe: `Scripts\ipython2.exe` -* Launcher: $:Label$ - -for Python 3: - -* ID: `IPython3` -* Label: IPython 3 -* Typ: `python3-package` -* PackageName: `ipython` -* Dependencies: `PyReadline3` -* Website: -* Docs: - + Documentation: -* Exe: `Scripts\ipython3.exe` -* Launcher: $:Label$ - -### SASS - -Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. - -* ID: `Sass` -* Label: SASS -* Typ: `ruby-package` -* Website: -* Docs: - + Guide: - + Reference: - -### PHP 5 - -PHP is a popular general-purpose scripting language that is especially suited to web development. -Fast, flexible and pragmatic, PHP powers everything from your blog to the most popular websites in the world. - -This application needs the x86 version of the [Visual C++ 11 Redistributable][MS VC11] installed. - -* ID: `PHP5` -* Label: PHP 5 -* Website: -* Docs: - + PHP Manual: -* Version: 5.6.23 -* Url: `http://windows.php.net/downloads/releases/archives/$:ArchiveName$` -* ArchiveName: `php-$:Version$-Win32-VC11-x86.zip` -* Exe: `php.exe` - -### PHP 7 - -PHP is a popular general-purpose scripting language that is especially suited to web development. -Fast, flexible and pragmatic, PHP powers everything from your blog to the most popular websites in the world. - -This application needs the x86 version of the [Visual C++ 14 Redistributable][MS VC14] installed. - -* ID: `PHP7` -* Label: PHP 7 -* Website: -* Docs: - + PHP Manual: -* Version: 7.0.8 -* Url: `http://windows.php.net/downloads/releases/archives/$:ArchiveName$` -* ArchiveName: `php-$:Version$-Win32-VC14-x86.zip` -* Exe: `php.exe` - -### Java Runtime Environment 7 - -According to Oracle, Java is the world's #1 programming language. - -The runtime environment is required for a compiled Java program to get executed. - -* ID: `JRE7` -* Label: Java Runtime Environment 7 -* Website: -* Docs: - + Downloads: -* Version: 7u80 -* Release: b15 -* Url: `http://download.oracle.com/otn-pub/java/jdk/$:Version$-$:Release$/$:ArchiveName$` -* DownloadCookies: `oraclelicense: accept-securebackup-cookie` -* ArchiveName: `jre-$:Version$-windows-i586.tar.gz` -* ArchivePath: `jre1.7.0_80` -* Path: `bin` -* Exe: `bin\java.exe` -* Environment: - + `JAVA_CMD`: `$:Exe$` - -### Java Runtime Environment 8 - -According to Oracle, Java is the world's #1 programming language. - -The runtime environment is required for a compiled Java program to get executed. - -* ID: `JRE8` -* Label: Java Runtime Environment 8 -* Website: -* Docs: - + Downloads: -* Version: 112 -* Release: b15 -* Url: `http://download.oracle.com/otn-pub/java/jdk/8u$:Version$-$:Release$/$:ArchiveName$` -* DownloadCookies: `oraclelicense: accept-securebackup-cookie` -* ArchiveName: `jre-8u$:Version$-windows-i586.tar.gz` -* ArchivePath: `jre1.8.0_$:Version$` -* Path: `bin` -* Exe: `bin\java.exe` -* Environment: - + `JAVA_CMD`: `$:Exe$` - -### Java Development Kit 7 - -According to Oracle, Java is the world's #1 programming language. - -The development kit is required for Java source code to get compiled. - -* ID: `JDK7` -* Label: Java Development Kit 7 -* Website: -* Docs: - + Downloads: - + Documentation: - + Java SE 7 API: -* Version: $JRE7:Version$ -* Release: $JRE7:Release$ -* Url: `http://download.oracle.com/otn-pub/java/jdk/$:Version$-$:Release$/$:ArchiveName$` -* DownloadCookies: `oraclelicense: accept-securebackup-cookie` -* ArchiveName: `jdk-$:Version$-windows-i586.exe` -* Path: `bin` -* Exe: `bin\javac.exe` -* Environment: - + `JAVA_HOME`: `$:Dir$` - + `JAVA_CMD`: `$:Dir$\jre\bin\java.exe` - -### Java Development Kit 8 - -According to Oracle, Java is the world's #1 programming language. - -The development kit is required for Java source code to get compiled. - -* ID: `JDK8` -* Label: Java Development Kit 8 -* Website: -* Docs: - + Downloads: - + Documentation: - + Java SE 8 API: -* Version: $JRE8:Version$ -* Release: $JRE8:Release$ -* Url: `http://download.oracle.com/otn-pub/java/jdk/8u$:Version$-$:Release$/$:ArchiveName$` -* DownloadCookies: `oraclelicense: accept-securebackup-cookie` -* ArchiveName: `jdk-8u$:Version$-windows-i586.exe` -* Path: `bin` -* Exe: `bin\javac.exe` -* Environment: - + `JAVA_HOME`: `$:Dir$` - + `JAVA_CMD`: `$:Dir$\jre\bin\java.exe` - -### Maven - -Apache Maven is a software project management and comprehension tool. -Based on the concept of a project object model (POM), Maven can manage a project's build, -reporting and documentation from a central piece of information. - -* ID: `Maven` -* Dependencies: `JRE8`, `GnuPG` -* Website: -* Docs: - + Reference: `https://maven.apache.org/ref/$:Version$/` - + API Docs: `https://maven.apache.org/ref/$:Version$/apidocs/index.html` -* Version: `3.3.9` -* Url: `http://www-eu.apache.org/dist/maven/maven-3/$:Version$/binaries/$:ArchiveName$` -* ArchiveName: `apache-maven-$:Version$-bin.zip` -* ArchivePath: `apache-maven-$:Version$` -* Dir: `mvn` -* Path: `bin` -* Exe: `bin\mvn.cmd` - -### Leiningen - -Leiningen is the easiest way to use Clojure. -With a focus on project automation and declarative configuration, -it gets out of your way and lets you focus on your code. - -* ID: `Leiningen` -* Dependencies: `JDK8`, `GnuPG`, `Wget` -* Website: -* Docs: - + Tutorial: - + Sample project.clj: - + FAQ: - + Clojure Documentation: - + Clojure Reference: - + Clojure API: -* Version: latest -* Url: -* ResourceName: `lein.bat` -* Dir: `lein` -* Exe: `lein.bat` -* Environment: - + `LEIN_JAR`: `$:Dir$\leiningen.jar` - -### .NET Core SDK - -* ID: `dotnet` -* Label: .NET Core SDK -* Website: -* Docs: - + Docs: - + Getting Started: - + Welcome: - + API Reference: -* Url: `https://go.microsoft.com/fwlink/?LinkID=809127` -* ArchiveName: `DotNetCore.SDK.zip` - -### MinGW - -[MinGW] provides a GNU development environment for Windows, including compilers for C/C++, Objective-C, Fortran, Ada, ... - -The MinGW package manager MinGW Get: - -* ID: `MinGwGet` -* Version: 0.6.2 -* Release: beta-20131004-1 -* Dependencies: `Wget` -* Url: `https://sourceforge.net/projects/mingw/files/Installer/mingw-get/mingw-get-$:Version$-$:Release$/$:ArchiveName$` -* ArchiveName: `mingw-get-$:Version$-mingw32-$:Release$-bin.tar.xz` -* Dir: `mingw` -* Path: `bin` -* Exe: `bin\mingw-get.exe` - -Graphical user interface for MinGW Get: - -* ID: `MinGwGetGui` -* Dependencies: `MinGwGet` -* Url: `https://sourceforge.net/projects/mingw/files/Installer/mingw-get/mingw-get-$MinGwGet:Version$-$MinGwGet:Release$/$:ArchiveName$` -* ArchiveName: `mingw-get-$MinGwGet:Version$-mingw32-$MinGwGet:Release$-gui.tar.xz` -* Dir: `mingw` -* Exe: `libexec\mingw-get\guimain.exe` -* Register: `false` -* Launcher: `MinGW Package Manager` - -Meta app MinGW with package manager and graphical user interface: - -* ID: `MinGW` -* Typ: `meta` -* Dependencies: `MinGwGet`, `MinGwGetGui` -* Website: -* Docs: - + FAQ: - + HOWTO: -* Dir: `mingw` -* Path: `bin`, `msys\1.0\bin` -* Packages: - + `mingw32-base` - + `mingw32-gcc-g++` - -You can adapt the preselected MinGW packages by putting something like this in your `config\config.md`: - -```Markdown -### My MinGW Packages - -* ID: `MinGW` -* Packages: - + `mingw32-base` - + `mingw32-gcc-g++` - + `mingw32-autotools` - + `msys-bash` - + `msys-grep` -``` - -After the automatic setup by _Bench_, you can use the launcher shortcut `MinGW Package Manager` -to start the GUI for _MinGW Get_ and install more MinGW packages. - -### CMake - -CMake is an open-source, cross-platform family of tools designed to build, -test and package software. CMake is used to control the software compilation process -using simple platform and compiler independent configuration files, and generate native -makefiles and workspaces that can be used in the compiler environment of your choice. -The suite of CMake tools were created by Kitware in response to the need for a powerful, -cross-platform build environment for open-source projects such as ITK and VTK. - -Usually you want to use this app with _MinGW_. - -To setup a C/C++ project with CMake and MinGW (`mingw32-make`), you have to activate the _MinGW_ app with the `mingw32-make` package. -Setup your project with a `CMakeLists.txt` file and run `cmake -G "MinGW Makefiles" ` to generate the `Makefile`. Run `cmake --build ` to compile the project. - -* ID: `CMake` -* Website: -* MajorVersion: 3.6 -* Version: $:MajorVersion$.1 -* Url: `https://cmake.org/files/v$:MajorVersion$/$:ArchiveName$` -* ArchiveName: `cmake-$:Version$-win32-x86.zip` -* ArchivePath: `cmake-$:Version$-win32-x86` -* Path: `bin` -* Exe: `bin\cmake.exe` - -### LLVM Clang - -The Clang compiler can act as drop-in replacement for the GCC compilers. - -This app sets the environment variables `CC` and `CXX` to inform _CMake_ -about the C/C++ compiler path. Therefore, if you build your C/C++ projects -with _CMake_, it is sufficient to just activate the _Clang_ app and _CMake_ -will use _Clang_ instead of the GCC compiler from _MinGW_. - -If you want to use the Clang compiler with Eclipse, you must manually -install the LLVM-Plugin for Eclipse CDT. - -* ID: `Clang` -* Label: LLVM Clang -* Version: 3.8.1 -* Website: -* Url: `http://llvm.org/releases/$:Version$/$:ArchiveName$` -* ArchiveName: `LLVM-$:Version$-win32.exe` -* Dir: `llvm` -* Path: `bin` -* Exe: `bin\clang.exe` -* Environment: - + `CC`: `$:Dir$\bin\clang.exe` - + `CXX`: `$:Dir$\bin\clang++.exe` - -### Go - -Go is an open source programming language that makes it easy -to build simple, reliable, and efficient software. - -* ID: `Go` -* Version: 1.6 -* Website: -* Docs: - + Overview: - + FAQ: - + Language Specification: - + Command-Line: - + Packages: -* Url: `https://storage.googleapis.com/golang/$:ArchiveName$` -* ArchiveName: `go$:Version$.windows-386.zip` -* ArchivePath: `go` -* Path: `bin` -* Exe: `bin\go.exe` -* Environment: - + `GOROOT`: `$:Dir$` - -### Erlang - -Erlang is a programming language used to build massively scalable soft real-time systems with requirements on high availability. Some of its uses are in telecoms, banking, e-commerce, computer telephony and instant messaging. Erlang's runtime system has built-in support for concurrency, distribution and fault tolerance. - -* ID: `Erlang` -* Website: -* Docs: - + Documentation: `$:Dir$\doc\index.html` -* VersionMajor: 19 -* VersionMinor: 0 -* ErtsVersion: 8.0 -* Version: $:VersionMajor$.$:VersionMinor$ -* Url: `http://erlang.org/download/$:ArchiveName$` -* ArchiveName: `otp_win32_$:Version$.exe` -* ArchiveType: `generic` -* ErtsDir: `erts-$:ErtsVersion$` -* Path: `$:ErtsDir$\bin` -* Exe: `$:ErtsDir$\bin\erl.exe` -* Environment: `ERLANG_HOME=$:ErtsDir$` -* Launcher: $:Label$ -* LauncherExecutable: `$:ErtsDir$\bin\werl.exe` - -### NUnit 3 Runner - -NUnit is a unit-testing framework for all .Net languages. -The console runner `nunit3-console.exe` executes tests on the console. - -* ID: `NUnit.Runners` -* Label: NUnit 3 Runners -* Typ: nuget-package -* Website: -* Docs: - + Documentation: - + Console Runner: - + Command Line: -* Path: `NUnit.ConsoleRunner\tools` -* Exe: `$:Path$\nunit3-console.exe` - -### Zeal - -An offline documentation browser inspired by [Dash](https://kapeli.com/dash/). - -* ID: `Zeal` -* Label: Zeal Docs -* Website: -* Version: 0.2.1 -* Url: `https://bintray.com/artifact/download/zealdocs/windows/$:ArchiveName$` -* ArchiveName: `zeal-$:Version$-windows-x86.msi` -* ArchivePath: `SourceDir\PFiles\Zeal` -* RegistryKeys: `Software\Zeal` -* Launcher: $:Label$ - -### Atom - -A hackable text editor for the 21st Century. - -_Hint: Install the `env-from-shell` package to make sure the Bench environment -is picked up from Atom._ - -* ID: `Atom` -* Website: -* Docs: - + Packages: - + Themes: - + Flight Manual: - + API Reference: `https://atom.io/docs/api/v$:Version$/AtomEnvironment` -* Version: 1.11.2 -* Url: `https://github.com/atom/atom/releases/download/v$:Version$/atom-windows.zip` -* ArchiveName: `atom-windows-$:Version$.zip` -* ArchivePath: `Atom` -* Environment: - + ATOM_HOME: `$HomeDir$\.atom` -* Launcher: $:Label$ - -### Visual Studio Code - -A cross platform code editor from Microsoft. - -* ID: `VSCode` -* Label: Visual Studio Code -* Website: -* Docs: - + Documentation: -* Version: latest -* Url: -* ArchiveName: `VSCode-win32.zip` -* Dir: `code` -* Exe: `code.exe` -* Launcher: $:Label$ - -### LightTable - -The next generation code editor. - -* ID: `LightTable` -* Website: -* Docs: - + Documentation: -* Version: 0.8.1 -* Url: `https://github.com/LightTable/LightTable/releases/download/$:Version$/$:ArchiveName$` -* ArchiveName: `lighttable-$:Version$-windows.zip` -* ArchivePath: `lighttable-$:Version$-windows` -* Dir: `lt` -* Exe: `LightTable.exe` -* Launcher: $:Label$ - -### Sublime Text 3 - -Sublime Text is a sophisticated text editor for code, markup and prose. -You'll love the slick user interface, extraordinary features and amazing performance. - -* ID: `SublimeText3` -* Label: Sublime Text 3 -* Website: -* Docs: - + Documentation: - + Unofficial Documentation: - + Package Control: -* Version: Build 3126 -* Url: `https://download.sublimetext.com/$:ArchiveName$` -* ArchiveName: `Sublime Text $:Version$.zip` -* Exe: `sublime_text.exe` -* Launcher: $:Label$ - -### TeXnicCenter - -Premium LaTeX Editing for Windows. - -* ID: `TeXnicCenter` -* Dependencies: `MiKTeX` -* Website: -* Docs: - + Features: - + Documentation: -* Version: 2.02 -* Url: `http://sourceforge.net/projects/texniccenter/files/TeXnicCenter/$:Version$%20Stable/$:ArchiveName$` -* ArchiveName: `TXCSetup_$:Version$Stable_Win32.exe` -* ArchiveTyp: `inno` -* ArchivePath: `{app}` -* RegistryKeys: `SOFTWARE\ToolsCenter` -* Launcher: $:Label$ - -### Emacs - -An extensible, customizable, free text editor - and more. - -GNU Emacs at its core is an interpreter for Emacs Lisp, a dialect of the Lisp programming language -with extensions to support text editing. - -* ID: `Emacs` -* Dependencies: `GnuTLS` -* Website: -* Docs: - + Manual: - + Emacs Lisp: - + Other Manuals: -* Version: 24.5 -* Url: `http://ftp.gnu.org/gnu/emacs/windows/$:ArchiveName$` -* ArchiveName: `emacs-$:Version$-bin-i686-mingw32.zip` -* Dir: `gnu` -* Path: `bin` -* Exe: `bin\emacs.exe` -* Launcher: $:Label$ -* LauncherExecutable: `$:Dir$\bin\runemacs.exe` - -### Spacemacs - -The best editor is neither Emacs nor Vim, it's Emacs and Vim! - -* ID: `Spacemacs` -* Typ: `meta` -* Dependencies: `Git`, `Emacs` -* Website: -* Docs: - + Documentation: - + Configuration Layers: - + Layers: -* SetupTestFile: `$HomeDir$\.emacs.d\spacemacs.mk` - -### Vim - -Vim is a highly configurable text editor built to enable efficient text editing. -It is an improved version of the vi editor distributed with most UNIX systems. - -* ID: `VimRT` -* Version: $Vim:Version$ -* Url: `http://ftp.vim.org/pub/vim/pc/$:ArchiveName$` -* ArchiveName: `vim$Vim:Release$rt.zip` -* ArchivePath: `vim\vim$Vim:Release$` -* Dir: `$Vim:Dir$` -* Register: `false` -* SetupTestFile: `scripts.vim` - -* ID: `VimConsole` -* Dependencies: `VimRT` -* Version: $Vim:Version$ -* Url: `http://ftp.vim.org/pub/vim/pc/$:ArchiveName$` -* ArchiveName: `vim$Vim:Release$w32.zip` -* ArchivePath: `vim\vim$Vim:Release$` -* Dir: `$Vim:Dir$` -* Exe: `vim.exe` - -* ID: `Vim` -* Website: -* Docs: - + Overview: - + Vimdoc: - + User Manual: -* Dependencies: `VimRT`, `VimConsole` -* VersionMajor: 7 -* VersionMinor: 4 -* Version: $:VersionMajor$.$:VersionMinor$ -* Release: $:VersionMajor$$:VersionMinor$ -* Url: `http://ftp.vim.org/pub/vim/pc/$:ArchiveName$` -* ArchiveName: `gvim$:Release$.zip` -* ArchivePath: `vim\vim$:Release$` -* Exe: `gvim.exe` -* Launcher: $:Label$ - -### Eclipse - -Eclipse for Java development: - -* ID: `EclipseJava` -* Label: Eclipse for Java -* Version: 4.6 -* CodeName: neon -* Release: R -* Dependencies: `JRE8` -* Website: -* Url: `http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/$:CodeName$/$:Release$/$:ArchiveName$` -* ArchiveName: `eclipse-java-$:CodeName$-$:Release$-win32.zip` -* ArchivePath: `eclipse` -* Dir: `eclipse_java` -* Exe: `eclipse.exe` -* Register: `false` -* Launcher: $:Label$ - -Eclipse for PHP development: - -* ID: `EclipsePHP` -* Label: Eclipse for PHP -* Version: 4.6 -* CodeName: neon -* Release: R -* Dependencies: `JRE8` -* Website: -* Url: `http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/$:CodeName$/$:Release$/$:ArchiveName$` -* ArchiveName: `eclipse-php-$:CodeName$-$:Release$-win32.zip` -* ArchivePath: `eclipse` -* Dir: `eclipse_php` -* Exe: `eclipse.exe` -* Register: `false` -* Launcher: $:Label$ - -Eclipse for C/C++ development: - -* ID: `EclipseCpp` -* Label: Eclipse for C++ -* Version: 4.6 -* CodeName: neon -* Release: R -* Dependencies: `JRE8` -* Website: -* Url: `http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/$:CodeName$/$:Release$/$:ArchiveName$` -* ArchiveName: `eclipse-cpp-$:CodeName$-$:Release$-win32.zip` -* ArchivePath: `eclipse` -* Dir: `eclipse_cpp` -* Exe: `eclipse.exe` -* Register: `false` -* Launcher: $:Label$ - -### SRWare Iron - -A free portable derivative of Chromium, optimized for privacy. - -* ID: `Iron` -* Label: SWare Iron -* Website: -* Version: latest -* Url: -* ArchivePath: `IronPortable\Iron` -* ArchiveName: `IronPortable.zip` -* Exe: `chrome.exe` -* Launcher: $:Label$ - -### MySQL - -According to Oracle: -MySQL Community Edition is the freely downloadable version -of the world's most popular open source database. - -The MySQL data is stored in `%USERPROFILE%\mysql_data`. -You can start the MySQL server by running `mysql_start` in the _Bench_ shell. -You can stop the MySQL server by running `mysql_stop` in the _Bench_ shell. -The initial password for _root_ is `bench`. - -* ID: `MySQL` -* Website: -* Docs: - + Documentation: `http://dev.mysql.com/doc/refman/$:VersionMajor$/en/` - + SQL Syntax: `http://dev.mysql.com/doc/refman/$:VersionMajor$/en/sql-syntax.html` - + Data Types: `http://dev.mysql.com/doc/refman/$:VersionMajor$/en/data-types.html` - + Functions: `http://dev.mysql.com/doc/refman/$:VersionMajor$/en/functions.html` -* VersionMajor: 5.7 -* Version: $:VersionMajor$.14 -* Url: `http://dev.mysql.com/get/Downloads/MySQL-$:VersionMajor$/$:ArchiveName$` -* ArchiveName: `mysql-$:Version$-win32.zip` -* ArchivePath: `mysql-$:Version$-win32` -* Path: `bin` -* Exe: `bin\mysqld.exe` -* MySqlDataDir: `$HomeDir$\mysql_data` -* Environment: - + `MYSQL_DATA`: `$:MySqlDataDir$` - -### MySQL Workbench - -MySQL Workbench is a unified visual tool for database architects, developers, and DBAs. -MySQL Workbench provides data modeling, SQL development, and comprehensive administration -tools for server configuration, user administration, backup, and much more. - -This application needs the x86 version of the [Visual C++ 12 Redistributable][MS VC12], -and the [Microsoft.NET Framework 4.0 Client Profile][CLR40CP] installed. - -* ID: `MySQLWB` -* Label: MySQL Workbench -* Website: -* Docs: - + Documentation: -* Version: 6.3.7 -* Url: `http://dev.mysql.com/get/Downloads/MySQLGUITools/$:ArchiveName$` -* ArchiveName: `mysql-workbench-community-$:Version$-win32-noinstall.zip` -* ArchivePath: `MySQL Workbench $:Version$ CE (win32)` -* Exe: `MySQLWorkbench.exe` -* Register: `false` -* Launcher: $:Label$ - -### PostgreSQL - -PostgreSQL is a powerful, open source object-relational database system. -It has more than 15 years of active development and a proven architecture -that has earned it a strong reputation for reliability, data integrity, and correctness. -It is fully ACID compliant, has full support for foreign keys, joins, views, -triggers, and stored procedures (in multiple languages). -It also supports storage of binary large objects, including pictures, sounds, or video. -It has native programming interfaces for C/C++, Java, .Net, Perl, Python, -Ruby, Tcl, ODBC, among others - -Contains the _PostgreSQL Server_ and the management tool _pgAdminIII_. -The initial password for _postgres_ is `bench`. - -* ID: `PostgreSQL` -* Website: -* Docs: - + Documentation: -* Version: 9.5.3-1 -* Url: `http://get.enterprisedb.com/postgresql/$:ArchiveName$` -* ArchiveName: `postgresql-$:Version$-windows-binaries.zip` -* ArchivePath: `pgsql` -* Dir: `postgres` -* Path: `bin` -* Exe: `bin\postgres.exe` -* RegistryKeys: `Software\pgAdmin III` -* Launcher: `PostgreSQL Admin 3` -* LauncherExecutable: `bin\pgAdmin3.exe` -* AdornedExecutables: `bin\pgAdmin3.exe` -* PostgreSqlDataDir: `$HomeDir$\pg_data` -* PostgreSqlLogFile: `$HomeDir$\pg.log` -* Environment: - + `PGDATA`: `$:PostgreSqlDataDir$` - + `PG_LOG`: `$:PostgreSqlLogFile$` - -### Apache - -The Apache HTTP Server is a secure, efficient and extensible server -that provides HTTP services in sync with the current HTTP standards. -The Apache HTTP Server is the most popular web server since over 20 years. - -This application needs the x86 version of the [Visual C++ 14 Redistributable][MS VC14] installed. - -* ID: `Apache` -* Website: -* Docs: - + Documentation: -* Version: 2.4.23 -* Url: `http://www.apachelounge.com/download/VC14/binaries/$:ArchiveName$` -* ArchiveName: `httpd-$:Version$-win32-VC14.zip` -* ArchivePath: `Apache24` -* Path: `bin` -* Exe: `bin\httpd.exe` -* HttpdDocumentRoot: `$HomeDir$\www` -* HttpdListen: `127.0.0.1:80` - -### RabbitMQ - -RabbitMQ is ... -Robust messaging for applications, -Easy to use, -Runs on all major operating systems, -Supports a huge number of developer platforms, -Open source and commercially supported - -* ID: `RabbitMQ` -* Website: -* Docs: - + Documentation: - + Web Interface: -* Dependencies: `Erlang` -* Version: 3.6.5 -* Url: `http://www.rabbitmq.com/releases/rabbitmq-server/v$:Version$/$:ArchiveName$` -* ArchiveName: `rabbitmq-server-windows-$:Version$.zip` -* ArchivePath: `rabbitmq_server-$:Version$` -* Path: `sbin` -* Exe: `sbin\rabbitmq-server.bat` - -### Windows Sysinternals Suite - -A collection of tools by Mark Russinovich, to inspect and investigate -the Microsoft Windows operating systems and its processes. - -* ID: `SysInternals` -* Website: -* Docs: - + Downloads: - + Forum: - + Blog: - + Learning Resources: -* Version: latest -* Url: -* ArchiveName: `SysinternalsSuite.zip` -* Exe: `procexp.exe` -* Launcher: `Process Explorer` - - -[MS VC11]: https://www.microsoft.com/download/details.aspx?id=30679 "Microsoft Visual C++ Redistributable for Visual Studio 2012" -[MS VC12]: https://www.microsoft.com/download/details.aspx?id=40784 "Microsoft Visual C++ Redistributable for Visual Studio 2013" -[MS VC14]: https://www.microsoft.com/download/details.aspx?id=48145 "Microsoft Visual C++ Redistributable for Visual Studio 2015" -[MinGW]: http://www.mingw.org/ -[CLR40CP]: http://www.microsoft.com/download/details.aspx?id=17113 "Microsoft.NET Framework 4.0 CLient Profile" diff --git a/res/apps/gitkraken/config b/res/apps/gitkraken/config deleted file mode 100644 index f467fb88..00000000 --- a/res/apps/gitkraken/config +++ /dev/null @@ -1 +0,0 @@ -{"projectsDirectory":"","autoFetchInterval":10} \ No newline at end of file diff --git a/res/apps/leiningen/profiles.clj b/res/apps/leiningen/profiles.clj deleted file mode 100644 index 80685c79..00000000 --- a/res/apps/leiningen/profiles.clj +++ /dev/null @@ -1 +0,0 @@ -{:user {:local-repo #=(eval (str (System/getenv "HOME") "\\m2_repo"))}} diff --git a/res/apps/mysql/init.sql b/res/apps/mysql/init.sql deleted file mode 100644 index ff2002c8..00000000 --- a/res/apps/mysql/init.sql +++ /dev/null @@ -1,9 +0,0 @@ -ALTER USER 'root'@'localhost' IDENTIFIED BY 'bench'; -CREATE SCHEMA `bench` DEFAULT CHARACTER SET utf8; -CREATE TABLE `bench`.`demo` ( - `ID` INT NOT NULL, - `A` VARCHAR(255) NULL, - `B` DOUBLE NULL, - PRIMARY KEY (`ID`)); -INSERT INTO `bench`.`demo` (`ID`, `A`, `B`) VALUES ('1', 'Hello World', '1.23'); -INSERT INTO `bench`.`demo` (`ID`, `A`, `B`) VALUES ('2', 'Hello Bench', '2.34'); diff --git a/res/apps/mysql/mysql_log.cmd b/res/apps/mysql/mysql_log.cmd deleted file mode 100644 index 76a535bb..00000000 --- a/res/apps/mysql/mysql_log.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -START notepad "%MYSQL_DATA%\%COMPUTERNAME%.err" diff --git a/res/apps/mysql/mysql_start.cmd b/res/apps/mysql/mysql_start.cmd deleted file mode 100644 index db1e1087..00000000 --- a/res/apps/mysql/mysql_start.cmd +++ /dev/null @@ -1,4 +0,0 @@ -@ECHO OFF -SET mysql_root=%~dp0\.. -CD "%mysql_root%" -START mysqld --log_syslog=0 "--basedir=%mysql_root%" "--datadir=%MYSQL_DATA%" \ No newline at end of file diff --git a/res/apps/mysql/mysql_stop.cmd b/res/apps/mysql/mysql_stop.cmd deleted file mode 100644 index aa3e3c37..00000000 --- a/res/apps/mysql/mysql_stop.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -mysqladmin -u root --password=bench shutdown diff --git a/res/apps/postgresql/default.reg b/res/apps/postgresql/default.reg deleted file mode 100644 index e187ee31c0c845951d7fe86bb6fa64167f943679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1596 zcmchX(Q4a35Jm5Ep#Na>0i`B1ltLaFJ84YPVC*^}G^N;)oERL-NOp~XKJA%ZZCEL( zOCK5*A+2WS&b>3U`|I&aGcA-V*G8pU8Yt5p|4OY?Xv?2ttTT2w`<5=T7g%TP7wq5b zt=_TTXwN<0bgDCAuJuD5jldhQyUG)Zx@p%#$=USs{r9_9Y**MjyK01x2)35d`@w!o4fm_Vj*d?07?v@J9b8}=^PmMO0) zy``&7pFY-NN5$LB*uFkg%7%EFf2Ka&NvnJ|t82&3<}hK#a;joV#!OU`wavIy%j0<6 zO@uCyE1n5Y`Gl|}#v<<=gOW@>-^lqCjeLLdK6jWaD)BElLe$W8CqvixS+yr9_u8zt zw=j)+8`#>E+w81S;ni>Gx1DjTlvgz5gq%BTdv+UtpV(dDnFJ;WvSgb=X(!gm0VoI)k1=vfIphyVc8HarVER MMZ5jlI&d@c8 (Vim style) or - ;; (Emacs style) to install them. - ;; ---------------------------------------------------------------- - ;; auto-completion - ;; better-defaults - emacs-lisp - git - markdown - ;; org - ;; html - ;; javascript - ;; php - ;; python - ;; ruby - ;; yaml - ;; java - ;; clojure - windows-scripts - (shell :variables - shell-default-height 20 - shell-default-position 'bottom) - ;; spell-checking - ;; syntax-checking - version-control - ) - ;; List of additional packages that will be installed without being - ;; wrapped in a layer. If you need some configuration for these - ;; packages, then consider creating a layer. You can also put the - ;; configuration in `dotspacemacs/user-config'. - dotspacemacs-additional-packages '() - ;; A list of packages and/or extensions that will not be install and loaded. - dotspacemacs-excluded-packages '() - ;; If non-nil spacemacs will delete any orphan packages, i.e. packages that - ;; are declared in a layer which is not a member of - ;; the list `dotspacemacs-configuration-layers'. (default t) - dotspacemacs-delete-orphan-packages t)) - -(defun dotspacemacs/init () - "Initialization function. -This function is called at the very startup of Spacemacs initialization -before layers configuration. -You should not put any user code in there besides modifying the variable -values." - ;; This setq-default sexp is an exhaustive list of all the supported - ;; spacemacs settings. - (setq-default - ;; If non nil ELPA repositories are contacted via HTTPS whenever it's - ;; possible. Set it to nil if you have no way to use HTTPS in your - ;; environment, otherwise it is strongly recommended to let it set to t. - ;; This variable has no effect if Emacs is launched with the parameter - ;; `--insecure' which forces the value of this variable to nil. - ;; (default t) - dotspacemacs-elpa-https nil - ;; Maximum allowed time in seconds to contact an ELPA repository. - dotspacemacs-elpa-timeout 5 - ;; If non nil then spacemacs will check for updates at startup - ;; when the current branch is not `develop'. (default t) - dotspacemacs-check-for-update t - ;; One of `vim', `emacs' or `hybrid'. Evil is always enabled but if the - ;; variable is `emacs' then the `holy-mode' is enabled at startup. `hybrid' - ;; uses emacs key bindings for vim's insert mode, but otherwise leaves evil - ;; unchanged. (default 'vim) - dotspacemacs-editing-style 'vim - ;; If non nil output loading progress in `*Messages*' buffer. (default nil) - dotspacemacs-verbose-loading nil - ;; Specify the startup banner. Default value is `official', it displays - ;; the official spacemacs logo. An integer value is the index of text - ;; banner, `random' chooses a random text banner in `core/banners' - ;; directory. A string value must be a path to an image format supported - ;; by your Emacs build. - ;; If the value is nil then no banner is displayed. (default 'official) - dotspacemacs-startup-banner 'official - ;; List of items to show in the startup buffer. If nil it is disabled. - ;; Possible values are: `recents' `bookmarks' `projects'. - ;; (default '(recents projects)) - dotspacemacs-startup-lists '(recents projects) - ;; Number of recent files to show in the startup buffer. Ignored if - ;; `dotspacemacs-startup-lists' doesn't include `recents'. (default 5) - dotspacemacs-startup-recent-list-size 5 - ;; Default major mode of the scratch buffer (default `text-mode') - dotspacemacs-scratch-mode 'text-mode - ;; List of themes, the first of the list is loaded when spacemacs starts. - ;; Press T n to cycle to the next theme in the list (works great - ;; with 2 themes variants, one dark and one light) - dotspacemacs-themes '(spacemacs-dark - spacemacs-light - solarized-light - solarized-dark - leuven - monokai - zenburn) - ;; If non nil the cursor color matches the state color in GUI Emacs. - dotspacemacs-colorize-cursor-according-to-state t - ;; Default font. `powerline-scale' allows to quickly tweak the mode-line - ;; size to make separators look not too crappy. - dotspacemacs-default-font '("Consolas" - :size 16 - :weight normal - :width normal - :powerline-scale 1.1) - ;; The leader key - dotspacemacs-leader-key "SPC" - ;; The leader key accessible in `emacs state' and `insert state' - ;; (default "M-m") - dotspacemacs-emacs-leader-key "M-m" - ;; Major mode leader key is a shortcut key which is the equivalent of - ;; pressing ` m`. Set it to `nil` to disable it. (default ",") - dotspacemacs-major-mode-leader-key "," - ;; Major mode leader key accessible in `emacs state' and `insert state'. - ;; (default "C-M-m) - dotspacemacs-major-mode-emacs-leader-key "C-M-m" - ;; These variables control whether separate commands are bound in the GUI to - ;; the key pairs C-i, TAB and C-m, RET. - ;; Setting it to a non-nil value, allows for separate commands under - ;; and TAB or and RET. - ;; In the terminal, these pairs are generally indistinguishable, so this only - ;; works in the GUI. (default nil) - dotspacemacs-distinguish-gui-tab nil - ;; (Not implemented) dotspacemacs-distinguish-gui-ret nil - ;; The command key used for Evil commands (ex-commands) and - ;; Emacs commands (M-x). - ;; By default the command key is `:' so ex-commands are executed like in Vim - ;; with `:' and Emacs commands are executed with ` :'. - dotspacemacs-command-key ":" - ;; If non nil `Y' is remapped to `y$'. (default t) - dotspacemacs-remap-Y-to-y$ t - ;; Name of the default layout (default "Default") - dotspacemacs-default-layout-name "Default" - ;; If non nil the default layout name is displayed in the mode-line. - ;; (default nil) - dotspacemacs-display-default-layout nil - ;; If non nil then the last auto saved layouts are resume automatically upon - ;; start. (default nil) - dotspacemacs-auto-resume-layouts nil - ;; Location where to auto-save files. Possible values are `original' to - ;; auto-save the file in-place, `cache' to auto-save the file to another - ;; file stored in the cache directory and `nil' to disable auto-saving. - ;; (default 'cache) - dotspacemacs-auto-save-file-location 'cache - ;; Maximum number of rollback slots to keep in the cache. (default 5) - dotspacemacs-max-rollback-slots 5 - ;; If non nil then `ido' replaces `helm' for some commands. For now only - ;; `find-files' (SPC f f), `find-spacemacs-file' (SPC f e s), and - ;; `find-contrib-file' (SPC f e c) are replaced. (default nil) - dotspacemacs-use-ido nil - ;; If non nil, `helm' will try to minimize the space it uses. (default nil) - dotspacemacs-helm-resize nil - ;; if non nil, the helm header is hidden when there is only one source. - ;; (default nil) - dotspacemacs-helm-no-header nil - ;; define the position to display `helm', options are `bottom', `top', - ;; `left', or `right'. (default 'bottom) - dotspacemacs-helm-position 'bottom - ;; If non nil the paste micro-state is enabled. When enabled pressing `p` - ;; several times cycle between the kill ring content. (default nil) - dotspacemacs-enable-paste-micro-state nil - ;; Which-key delay in seconds. The which-key buffer is the popup listing - ;; the commands bound to the current keystroke sequence. (default 0.4) - dotspacemacs-which-key-delay 0.4 - ;; Which-key frame position. Possible values are `right', `bottom' and - ;; `right-then-bottom'. right-then-bottom tries to display the frame to the - ;; right; if there is insufficient space it displays it at the bottom. - ;; (default 'bottom) - dotspacemacs-which-key-position 'bottom - ;; If non nil a progress bar is displayed when spacemacs is loading. This - ;; may increase the boot time on some systems and emacs builds, set it to - ;; nil to boost the loading time. (default t) - dotspacemacs-loading-progress-bar t - ;; If non nil the frame is fullscreen when Emacs starts up. (default nil) - ;; (Emacs 24.4+ only) - dotspacemacs-fullscreen-at-startup nil - ;; If non nil `spacemacs/toggle-fullscreen' will not use native fullscreen. - ;; Use to disable fullscreen animations in OSX. (default nil) - dotspacemacs-fullscreen-use-non-native nil - ;; If non nil the frame is maximized when Emacs starts up. - ;; Takes effect only if `dotspacemacs-fullscreen-at-startup' is nil. - ;; (default nil) (Emacs 24.4+ only) - dotspacemacs-maximized-at-startup t - ;; A value from the range (0..100), in increasing opacity, which describes - ;; the transparency level of a frame when it's active or selected. - ;; Transparency can be toggled through `toggle-transparency'. (default 90) - dotspacemacs-active-transparency 90 - ;; A value from the range (0..100), in increasing opacity, which describes - ;; the transparency level of a frame when it's inactive or deselected. - ;; Transparency can be toggled through `toggle-transparency'. (default 90) - dotspacemacs-inactive-transparency 90 - ;; If non nil unicode symbols are displayed in the mode line. (default t) - dotspacemacs-mode-line-unicode-symbols t - ;; If non nil smooth scrolling (native-scrolling) is enabled. Smooth - ;; scrolling overrides the default behavior of Emacs which recenters the - ;; point when it reaches the top or bottom of the screen. (default t) - dotspacemacs-smooth-scrolling t - ;; If non nil line numbers are turned on in all `prog-mode' and `text-mode' - ;; derivatives. If set to `relative', also turns on relative line numbers. - ;; (default nil) - dotspacemacs-line-numbers nil - ;; If non-nil smartparens-strict-mode will be enabled in programming modes. - ;; (default nil) - dotspacemacs-smartparens-strict-mode nil - ;; Select a scope to highlight delimiters. Possible values are `any', - ;; `current', `all' or `nil'. Default is `all' (highlight any scope and - ;; emphasis the current one). (default 'all) - dotspacemacs-highlight-delimiters 'all - ;; If non nil advises quit functions to keep server open when quitting. - ;; (default nil) - dotspacemacs-persistent-server nil - ;; List of search tool executable names. Spacemacs uses the first installed - ;; tool of the list. Supported tools are `ag', `pt', `ack' and `grep'. - ;; (default '("ag" "pt" "ack" "grep")) - dotspacemacs-search-tools '("ag" "pt" "ack" "grep") - ;; The default package repository used if no explicit repository has been - ;; specified with an installed package. - ;; Not used for now. (default nil) - dotspacemacs-default-package-repository nil - ;; Delete whitespace while saving buffer. Possible values are `all' - ;; to aggressively delete empty line and long sequences of whitespace, - ;; `trailing' to delete only the whitespace at end of lines, `changed'to - ;; delete only whitespace for changed lines or `nil' to disable cleanup. - ;; (default nil) - dotspacemacs-whitespace-cleanup nil - )) - -(defun dotspacemacs/user-init () - "Initialization function for user code. -It is called immediately after `dotspacemacs/init'. You are free to put almost -any user code here. The exception is org related code, which should be placed -in `dotspacemacs/user-config'." - ) - -(defun dotspacemacs/user-config () - "Configuration function for user code. -This function is called at the very end of Spacemacs initialization after -layers configuration. You are free to put any user code." - ) - -;; Do not write anything past this comment. This is where Emacs will -;; auto-generate custom variable definitions. diff --git a/res/apps/vscode/keybindings.json b/res/apps/vscode/keybindings.json deleted file mode 100644 index 91f81da0..00000000 --- a/res/apps/vscode/keybindings.json +++ /dev/null @@ -1,4 +0,0 @@ -// Place your key bindings in this file to overwrite the defaults -[ - { "key": "ctrl+shift+t", "command": "workbench.action.tasks.runTask"} -] \ No newline at end of file diff --git a/res/apps/vscode/snippets/markdown.json b/res/apps/vscode/snippets/markdown.json deleted file mode 100644 index 4837bc53..00000000 --- a/res/apps/vscode/snippets/markdown.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "log-entry": { - "prefix": "log entry", - "body": [ - "### ${1:Entry Title}", - "", - "${2:00}:${3:00}h", - "", - "* $0" - ], - "description": "An entry for the daily log" - }, - "log-link": { - "prefix": "log link", - "body": "[${year}-${month}-${day}](#log_${year}-${month}-${day})$0", - "description": "A link to another day in a daily log." - } -} \ No newline at end of file From e68b850a96da2cbe3ca65368b4556af27f3d9969 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 4 Jan 2017 17:56:19 +0100 Subject: [PATCH 126/230] fixed path resolution of setup resources --- BenchManager/BenchLib/AppFacade.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BenchManager/BenchLib/AppFacade.cs b/BenchManager/BenchLib/AppFacade.cs index b09643c2..7bb07633 100644 --- a/BenchManager/BenchLib/AppFacade.cs +++ b/BenchManager/BenchLib/AppFacade.cs @@ -593,21 +593,21 @@ public string GetSetupResource(string relativeResourcePath) { var relativeDirPath = IOPath.Combine( AppIndex.GetStringValue(PropertyKeys.AppLibResourceDirName), - NamespacePathSegment); + PathSegment); var userPath = IOPath.Combine( IOPath.Combine( AppIndex.GetStringValue(PropertyKeys.CustomConfigDir), relativeDirPath), relativeResourcePath); - if (File.Exists(relativeResourcePath) || Directory.Exists(relativeResourcePath)) return userPath; + if (File.Exists(userPath) || Directory.Exists(userPath)) return userPath; if (AppLibrary != null) { var libraryPath = IOPath.Combine( IOPath.Combine(AppLibrary.BaseDir, relativeDirPath), relativeResourcePath); - if (File.Exists(libraryPath)) return libraryPath; + if (File.Exists(libraryPath) || Directory.Exists(libraryPath)) return libraryPath; } return null; } From f1cb04d493464f5535b8c69d1c0b61ac705ebbb6 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 4 Jan 2017 17:56:48 +0100 Subject: [PATCH 127/230] fixed name construction of registry backup files --- auto/lib/reg.lib.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/auto/lib/reg.lib.ps1 b/auto/lib/reg.lib.ps1 index 6baa516c..e3170998 100644 --- a/auto/lib/reg.lib.ps1 +++ b/auto/lib/reg.lib.ps1 @@ -1,6 +1,7 @@ function Get-AppRegistryFileName([string]$name, [string]$typ, [int]$no = 0) { $regBaseDir = Get-ConfigValue AppRegistryBaseDir - $resDir = Safe-Dir ([IO.Path]::Combine($regBaseDir, $name.ToLowerInvariant())) + $path = $global:BenchConfig.Apps[$name].PathSegment + $resDir = Safe-Dir ([IO.Path]::Combine($regBaseDir, $path)) if ($no -gt 0) { $noPart = "_" + $no.ToString("00") } else { From b495d0bb38964356baa4721f69fb6f3ff15d23d5 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 5 Jan 2017 18:33:03 +0100 Subject: [PATCH 128/230] added capability to parse additional text from Markdown property files into groups --- .../GroupedPropertyCollection.cs | 14 ++++ BenchManager/BenchLib/AppFacade.cs | 5 ++ .../BenchLib/AppIndexDefaultValueSource.cs | 5 ++ BenchManager/BenchLib/BenchConfiguration.cs | 1 + .../BenchLib/GroupedPropertyCollection.cs | 28 ++++++- .../BenchLib/IGroupedPropertySource.cs | 8 ++ .../BenchLib/IGroupedPropertyTarget.cs | 7 ++ .../Markdown/MarkdownPropertyParser.cs | 81 +++++++++++++++++++ 8 files changed, 147 insertions(+), 2 deletions(-) diff --git a/BenchManager/BenchLib.Test/GroupedPropertyCollection.cs b/BenchManager/BenchLib.Test/GroupedPropertyCollection.cs index 3125d904..4a0e7e6f 100644 --- a/BenchManager/BenchLib.Test/GroupedPropertyCollection.cs +++ b/BenchManager/BenchLib.Test/GroupedPropertyCollection.cs @@ -8,17 +8,20 @@ class GroupedPropertyCollection : PropertyCollection, IGroupedPropertyCollection private IDictionary> groups; private IDictionary groupCategories; private IDictionary groupMetadata; + private IDictionary groupDocs; public GroupedPropertyCollection( IDictionary> groups = null, IDictionary groupCategories = null, IDictionary groupMetadata = null, + IDictionary groupDocs = null, IDictionary properties = null) : base(properties) { this.groups = groups ?? new Dictionary>(); this.groupCategories = groupCategories ?? new Dictionary(); this.groupMetadata = groupMetadata ?? new Dictionary(); + this.groupDocs = groupDocs ?? new Dictionary(); } public bool CanGetGroupValue(string group, string name) @@ -52,6 +55,12 @@ public object GetGroupMetadata(string group) ? metadata : null; } + public string GetGroupDocumentation(string group) + { + string docs; + return groupDocs.TryGetValue(group, out docs) ? docs : null; + } + public object GetGroupValue(string group, string name) { if (group == null) return GetValue(name); @@ -101,6 +110,11 @@ public void SetGroupMetadata(string group, object metadata) groupMetadata[group] = metadata; } + public void SetGroupDocumentation(string group, string docs) + { + groupDocs[group] = docs; + } + public void SetGroupValue(string group, string name, object value) { if (group == null) diff --git a/BenchManager/BenchLib/AppFacade.cs b/BenchManager/BenchLib/AppFacade.cs index 7bb07633..cf902ccf 100644 --- a/BenchManager/BenchLib/AppFacade.cs +++ b/BenchManager/BenchLib/AppFacade.cs @@ -146,6 +146,11 @@ internal static string NameFromId(string id) /// public AppLibrary AppLibrary => AppIndex.GetGroupMetadata(AppName) as AppLibrary; + /// + /// Gets the documentation text of this app in Markdown syntax. + /// + public string MarkdownDocumentation => AppIndex.GetGroupDocumentation(AppName); + /// /// Gets the label of the app. /// diff --git a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs index 36b49e8a..427c2b48 100644 --- a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs +++ b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs @@ -28,6 +28,11 @@ public object GetGroupMetadata(string group) throw new NotSupportedException(); } + public string GetGroupDocumentation(string group) + { + throw new NotSupportedException(); + } + public object GetGroupValue(string appId, string key) { string appTyp; diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index ee46f718..4cddf9fe 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -117,6 +117,7 @@ public BenchConfiguration(string benchRootDir, bool loadAppIndex, bool loadCusto Target = this, GroupBeginCue = new Regex("^[\\*\\+-]\\s+ID:\\s*(`?)(?\\S+?)\\1$"), GroupEndCue = new Regex("^\\s*$"), + CollectGroupDocs = true, }; var configFile = Path.Combine(benchRootDir, CONFIG_FILE); diff --git a/BenchManager/BenchLib/GroupedPropertyCollection.cs b/BenchManager/BenchLib/GroupedPropertyCollection.cs index b0262902..cc2429a5 100644 --- a/BenchManager/BenchLib/GroupedPropertyCollection.cs +++ b/BenchManager/BenchLib/GroupedPropertyCollection.cs @@ -17,6 +17,7 @@ public class GroupedPropertyCollection : IConfiguration private readonly List groupNames = new List(); // ordered list for group names private readonly Dictionary groupCategories = new Dictionary(); private readonly Dictionary groupMetadata = new Dictionary(); + private readonly Dictionary groupDocumentation = new Dictionary(); private readonly Dictionary> groupKeys = new Dictionary>(); // ordered lists for property names private readonly Dictionary> groups = new Dictionary>(); @@ -60,7 +61,7 @@ public void SetGroupCategory(string group, string category) public string GetGroupCategory(string group) { string category; - return groupCategories.TryGetValue(group, out category) ? category : null; + return groupCategories.TryGetValue(group ?? string.Empty, out category) ? category : null; } /// @@ -83,7 +84,30 @@ public void SetGroupMetadata(string group, object metadata) public object GetGroupMetadata(string group) { object metadata; - return groupMetadata.TryGetValue(group, out metadata) ? metadata : null; + return groupMetadata.TryGetValue(group ?? string.Empty, out metadata) ? metadata : null; + } + + /// + /// attaches documentation to a group. + /// + /// The group to attach the documentation to. + /// The documentation text. + public void SetGroupDocumentation(string group, string docs) + { + group = group ?? string.Empty; + groupDocumentation[group] = docs; + } + + /// + /// Gets the documentation text, attached to the specified group, + /// or null if the group has no documentation attached. + /// + /// The group in question. + /// A string with the Markdown documentation text, or null. + public string GetGroupDocumentation(string group) + { + string docs; + return groupDocumentation.TryGetValue(group ?? string.Empty, out docs) ? docs : null; } /// diff --git a/BenchManager/BenchLib/IGroupedPropertySource.cs b/BenchManager/BenchLib/IGroupedPropertySource.cs index 67e3f939..4fc55a68 100644 --- a/BenchManager/BenchLib/IGroupedPropertySource.cs +++ b/BenchManager/BenchLib/IGroupedPropertySource.cs @@ -25,6 +25,14 @@ public interface IGroupedPropertySource /// The metadata object attached to the given group, or null. object GetGroupMetadata(string group); + /// + /// Gets the documentation text, attached to the specified group, + /// or null if the group has no documentation attached. + /// + /// The group in question. + /// A string with the Markdown documentation text, or null. + string GetGroupDocumentation(string group); + /// /// Gets the value of the specified property. /// diff --git a/BenchManager/BenchLib/IGroupedPropertyTarget.cs b/BenchManager/BenchLib/IGroupedPropertyTarget.cs index 69967c3b..6aa5f894 100644 --- a/BenchManager/BenchLib/IGroupedPropertyTarget.cs +++ b/BenchManager/BenchLib/IGroupedPropertyTarget.cs @@ -24,6 +24,13 @@ public interface IGroupedPropertyTarget /// The metadata object. void SetGroupMetadata(string group, object metadata); + /// + /// attaches documentation to a group. + /// + /// The group to attach the documentation to. + /// The documentation text. + void SetGroupDocumentation(string group, string docs); + /// /// Sets the value of the specified property. /// If the property did exist until now, it is created. diff --git a/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs b/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs index 3760f667..82fe6a03 100644 --- a/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs +++ b/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs @@ -24,6 +24,8 @@ public class MarkdownPropertyParser private static readonly Regex ListElementExp = new Regex("^(?:\t| +)[\\*\\+-]\\s+(?.*?)\\s*$"); private static readonly string ListElementFormat = "`{0}`"; + private static readonly Regex DefaultGroupDocsBeginCue = new Regex("^###\\s+\\S"); + private static readonly Regex DefaultGroupDocsEndCue = new Regex("^###\\s+\\S"); private static readonly Regex DefaultGroupBeginCue = new Regex("^###\\s+(?.+?)\\s*(?:\\{.*?\\})?\\s*(?:###)?$"); private static readonly Regex DefaultGroupEndCue = new Regex("^\\s*$"); @@ -128,6 +130,13 @@ private static bool IsQuoted(string value) /// public Regex GroupBeginCue { get; set; } + /// + /// This regular expression is used to detect the beginning of the documentation + /// of a group. All lines, which are not recognized as properties or another cue, + /// are collected as the documentation for the group. + /// + public Regex GroupDocsBeginCue { get; set; } + /// /// This regular expression is used to detect the end of a property group. /// Properties, which are recognized after this expression matches a line, @@ -135,6 +144,14 @@ private static bool IsQuoted(string value) /// public Regex GroupEndCue { get; set; } + /// + /// This regular expression is used to detect the end of the documentation + /// of a group. When this cue is triggered, the collected documentation + /// is attached to all groups, which where detected by + /// since the last . + /// + public Regex GroupDocsEndCue { get; set; } + /// /// Gets or sets the property target, where recognized properties are stored in. /// @@ -146,6 +163,15 @@ private static bool IsQuoted(string value) /// public object CurrentGroupMetadata { get; set; } + private readonly List collectedGroupDocs = new List(); + private readonly List docGroups = new List(); + + /// + /// A switch to control, whether non-property lines are collected + /// as the documentation for a group. + /// + public bool CollectGroupDocs { get; set; } + /// /// Initializes a new instance of . /// @@ -156,6 +182,8 @@ public MarkdownPropertyParser() CategoryCue = DefaultCategoryCue; GroupBeginCue = DefaultGroupBeginCue; GroupEndCue = DefaultGroupEndCue; + GroupDocsBeginCue = DefaultGroupDocsBeginCue; + GroupDocsEndCue = DefaultGroupDocsEndCue; } /// @@ -189,6 +217,7 @@ private void OnPropertyValue(string name, object value) private List ListItems = new List(); private MdContext Context; + private bool collectingGroupDocsActive; /// /// Parses the data in the given stream as UTF8 encoded Markdown text @@ -241,24 +270,40 @@ private void ProcessLine(string line) case MdContext.HtmlComment: if (MdSyntax.IsHtmlCommentEnd(line)) Context = MdContext.Text; + ProcessPossibleGroupDocsLine(line); + ProcessPossibleGroupDocsSwitchLine(line); break; case MdContext.CodeBlock: if (MdSyntax.IsCodeBlockEnd(line, ref CodePreamble)) Context = MdContext.Text; + ProcessPossibleGroupDocsLine(line); + ProcessPossibleGroupDocsSwitchLine(line); break; case MdContext.Text: + ProcessPossibleGroupDocsSwitchLine(line); if (MdSyntax.IsYamlHeaderStart(LineNo, line)) Context = MdContext.YamlHeader; else if (MdSyntax.IsHtmlCommentStart(line)) + { Context = MdContext.HtmlComment; + ProcessPossibleGroupDocsLine(line); + ProcessPossibleGroupDocsSwitchLine(line); + } else if (MdSyntax.IsCodeBlockStart(line, ref CodePreamble)) + { Context = MdContext.CodeBlock; + ProcessPossibleGroupDocsLine(line); + ProcessPossibleGroupDocsSwitchLine(line); + } else if (IsDeactivationCue(line)) Context = MdContext.Inactive; else if (IsListStart(line, ref ListKey)) Context = MdContext.List; else + { ProcessTextLine(line); + ProcessPossibleGroupDocsSwitchLine(line); + } break; case MdContext.List: if (!IsListElement(line, ListItems)) @@ -307,6 +352,10 @@ private void ProcessTextLine(string line) { Target.SetGroupCategory(CurrentGroup, CurrentCategory); } + if (collectingGroupDocsActive) + { + docGroups.Add(CurrentGroup); + } return; } } @@ -339,6 +388,38 @@ private void ProcessTextLine(string line) OnPropertyValue(key, value); } } + else + { + ProcessPossibleGroupDocsLine(line); + } + } + + private void ProcessPossibleGroupDocsSwitchLine(string line) + { + if (CollectGroupDocs && GroupDocsEndCue.IsMatch(line)) + { + var docText = string.Join(Environment.NewLine, collectedGroupDocs.ToArray()).Trim(); + foreach (var g in docGroups) + { + Target.SetGroupDocumentation(g, docText); + } + collectedGroupDocs.Clear(); + docGroups.Clear(); + collectingGroupDocsActive = false; + } + if (CollectGroupDocs && GroupDocsBeginCue.IsMatch(line)) + { + collectingGroupDocsActive = true; + } } + + private void ProcessPossibleGroupDocsLine(string line) + { + if (collectingGroupDocsActive) + { + collectedGroupDocs.Add(line); + } + } + } } From dae5514273d486128cbb6af0d876f7e1cdbe0834 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 5 Jan 2017 21:02:06 +0100 Subject: [PATCH 129/230] extracted MarkdownControl from MarkdownViewer --- .../BenchDashboard/BenchDashboard.csproj | 9 ++ .../MarkdownControl.Designer.cs | 57 ++++++++ .../BenchDashboard/MarkdownControl.cs | 125 ++++++++++++++++++ .../BenchDashboard/MarkdownControl.resx | 120 +++++++++++++++++ .../BenchDashboard/MarkdownViewer.Designer.cs | 25 ++-- BenchManager/BenchDashboard/MarkdownViewer.cs | 61 +-------- 6 files changed, 325 insertions(+), 72 deletions(-) create mode 100644 BenchManager/BenchDashboard/MarkdownControl.Designer.cs create mode 100644 BenchManager/BenchDashboard/MarkdownControl.cs create mode 100644 BenchManager/BenchDashboard/MarkdownControl.resx diff --git a/BenchManager/BenchDashboard/BenchDashboard.csproj b/BenchManager/BenchDashboard/BenchDashboard.csproj index 645d1deb..a16e286e 100644 --- a/BenchManager/BenchDashboard/BenchDashboard.csproj +++ b/BenchManager/BenchDashboard/BenchDashboard.csproj @@ -107,6 +107,12 @@ MainForm.cs + + UserControl + + + MarkdownControl.cs + Form @@ -157,6 +163,9 @@ MainForm.cs + + MarkdownControl.cs + MarkdownViewer.cs diff --git a/BenchManager/BenchDashboard/MarkdownControl.Designer.cs b/BenchManager/BenchDashboard/MarkdownControl.Designer.cs new file mode 100644 index 00000000..b5d7944d --- /dev/null +++ b/BenchManager/BenchDashboard/MarkdownControl.Designer.cs @@ -0,0 +1,57 @@ +namespace Mastersign.Bench.Dashboard +{ + partial class MarkdownControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.webBrowser = new System.Windows.Forms.WebBrowser(); + this.SuspendLayout(); + // + // webBrowser + // + this.webBrowser.Dock = System.Windows.Forms.DockStyle.Fill; + this.webBrowser.Location = new System.Drawing.Point(0, 0); + this.webBrowser.MinimumSize = new System.Drawing.Size(20, 20); + this.webBrowser.Name = "webBrowser"; + this.webBrowser.Size = new System.Drawing.Size(150, 150); + this.webBrowser.TabIndex = 1; + // + // MarkdownControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.webBrowser); + this.Name = "MarkdownControl"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.WebBrowser webBrowser; + } +} diff --git a/BenchManager/BenchDashboard/MarkdownControl.cs b/BenchManager/BenchDashboard/MarkdownControl.cs new file mode 100644 index 00000000..01496721 --- /dev/null +++ b/BenchManager/BenchDashboard/MarkdownControl.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Mastersign.Bench.Dashboard.Properties; +using System.IO; +using Mastersign.Bench.Markdown; +using System.Diagnostics; + +namespace Mastersign.Bench.Dashboard +{ + public partial class MarkdownControl : UserControl + { + private readonly static string template; + + static MarkdownControl() + { + template = Resources.MarkdownViewerTemplate.Replace("$CSS$", Resources.MarkdownViewerStyle); + } + + private string tempFile; + + private Uri TempDocumentUrl { get { return new Uri("file:///" + TempFile); } } + + public MarkdownControl() + { + InitializeComponent(); + Disposed += MarkdownControl_Disposed; + webBrowser.Navigating += WebBrowser_Navigating; + } + + private void WebBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e) + { + // force opening URLs in System browser + } + + private void MarkdownControl_Disposed(object sender, EventArgs e) + { + TempFile = null; + } + + private string TempFile + { + get { return tempFile; } + set + { + if (tempFile != null && File.Exists(tempFile)) + { + File.Delete(tempFile); + } + tempFile = value; + } + } + + private string NewTempFilePath() + { + return Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".html"); + } + + public MarkdownToHtmlConverter ShowMarkdownText(string text, string title) + { + TempFile = NewTempFilePath(); + var md2html = new MarkdownToHtmlConverter(); + try + { + string html; + using (var r = new StringReader(text)) + { + html = md2html.ConvertToHtml(r); + } + html = template.Replace("$TITLE$", title).Replace("$CONTENT$", html); + + File.WriteAllText(TempFile, html, Encoding.UTF8); + } + catch (Exception e) + { + Debug.WriteLine(e.ToString()); + TempFile = null; + return null; + } + webBrowser.Navigate(TempDocumentUrl); + return md2html; + } + + public MarkdownToHtmlConverter ShowMarkdownFile(string filePath, string title = null) + { + TempFile = NewTempFilePath(); + title = title ?? Path.GetFileNameWithoutExtension(filePath); + var md2html = new MarkdownToHtmlConverter(); + try + { + string html; + using (var s = File.Open(filePath, FileMode.Open, FileAccess.Read)) + { + html = md2html.ConvertToHtml(s); + } + html = template.Replace("$TITLE$", title).Replace("$CONTENT$", html); + + File.WriteAllText(TempFile, html, Encoding.UTF8); + } + catch (Exception e) + { + Debug.WriteLine(e.ToString()); + TempFile = null; + return null; + } + webBrowser.Navigate(TempDocumentUrl); + return md2html; + } + + public void ScrollToElement(string id) + { + var element = webBrowser.Document.GetElementById(id); + if (element != null) + { + element.ScrollIntoView(true); + } + } + } +} diff --git a/BenchManager/BenchDashboard/MarkdownControl.resx b/BenchManager/BenchDashboard/MarkdownControl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/BenchManager/BenchDashboard/MarkdownControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BenchManager/BenchDashboard/MarkdownViewer.Designer.cs b/BenchManager/BenchDashboard/MarkdownViewer.Designer.cs index 16c60056..176f15db 100644 --- a/BenchManager/BenchDashboard/MarkdownViewer.Designer.cs +++ b/BenchManager/BenchDashboard/MarkdownViewer.Designer.cs @@ -29,21 +29,11 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MarkdownViewer)); - this.webBrowser = new System.Windows.Forms.WebBrowser(); this.treeView = new System.Windows.Forms.TreeView(); this.splitter = new System.Windows.Forms.Splitter(); + this.markdownControl = new Mastersign.Bench.Dashboard.MarkdownControl(); this.SuspendLayout(); // - // webBrowser - // - this.webBrowser.Dock = System.Windows.Forms.DockStyle.Fill; - this.webBrowser.Location = new System.Drawing.Point(206, 0); - this.webBrowser.MinimumSize = new System.Drawing.Size(20, 20); - this.webBrowser.Name = "webBrowser"; - this.webBrowser.Size = new System.Drawing.Size(418, 441); - this.webBrowser.TabIndex = 0; - this.webBrowser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(this.webBrowser_Navigating); - // // treeView // this.treeView.BorderStyle = System.Windows.Forms.BorderStyle.None; @@ -62,12 +52,20 @@ private void InitializeComponent() this.splitter.TabIndex = 2; this.splitter.TabStop = false; // + // markdownControl + // + this.markdownControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.markdownControl.Location = new System.Drawing.Point(206, 0); + this.markdownControl.Name = "markdownControl"; + this.markdownControl.Size = new System.Drawing.Size(418, 441); + this.markdownControl.TabIndex = 3; + // // MarkdownViewer // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(624, 441); - this.Controls.Add(this.webBrowser); + this.Controls.Add(this.markdownControl); this.Controls.Add(this.splitter); this.Controls.Add(this.treeView); this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -81,9 +79,8 @@ private void InitializeComponent() } #endregion - - private System.Windows.Forms.WebBrowser webBrowser; private System.Windows.Forms.TreeView treeView; private System.Windows.Forms.Splitter splitter; + private MarkdownControl markdownControl; } } \ No newline at end of file diff --git a/BenchManager/BenchDashboard/MarkdownViewer.cs b/BenchManager/BenchDashboard/MarkdownViewer.cs index acc11d01..d83cc0c2 100644 --- a/BenchManager/BenchDashboard/MarkdownViewer.cs +++ b/BenchManager/BenchDashboard/MarkdownViewer.cs @@ -16,16 +16,8 @@ namespace Mastersign.Bench.Dashboard { public partial class MarkdownViewer : Form { - private readonly static string template; - - static MarkdownViewer() - { - template = Resources.MarkdownViewerTemplate.Replace("$CSS$", Resources.MarkdownViewerStyle); - } - private readonly IBenchManager core; private readonly string windowTitle; - private string tempFile; public MarkdownViewer(IBenchManager core) { @@ -41,7 +33,6 @@ private void MarkdownViewer_Load(object sender, EventArgs e) private void MarkdownViewer_FormClosed(object sender, FormClosedEventArgs e) { - TempFile = null; } private void InitializeBounds() @@ -54,52 +45,10 @@ private void InitializeBounds() SetBounds(x, y, w, h); } - private string TempFile - { - get { return tempFile; } - set - { - if (tempFile != null && File.Exists(tempFile)) - { - File.Delete(tempFile); - } - tempFile = value; - } - } - - private Uri TempDocumentUrl { get { return new Uri("file:///" + TempFile); } } - - private string NewTempFilePath() - { - return Path.Combine( - core.Config.GetStringValue(PropertyKeys.TempDir), - Path.GetRandomFileName() + ".html"); - } - public void LoadMarkdown(string file, string title = null) { - TempFile = NewTempFilePath(); - title = title ?? Path.GetFileNameWithoutExtension(file); - Text = windowTitle + " - " + title; - string html; - var md2html = new MarkdownToHtmlConverter(); - try - { - using (var s = File.Open(file, FileMode.Open, FileAccess.Read)) - { - html = md2html.ConvertToHtml(s); - } - html = template.Replace("$TITLE$", title).Replace("$CONTENT$", html); - - File.WriteAllText(TempFile, html, Encoding.UTF8); - } - catch (Exception e) - { - Debug.WriteLine(e.ToString()); - TempFile = null; - return; - } - webBrowser.Navigate(TempDocumentUrl); + Text = windowTitle + " - " + (title ?? Path.GetFileNameWithoutExtension(file)); + var md2html = markdownControl.ShowMarkdownFile(file, title); LoadTree(md2html.Anchors); } @@ -143,11 +92,7 @@ private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs var mdElement = e.Node.Tag as MdHeadline; if (mdElement != null) { - var element = webBrowser.Document.GetElementById(mdElement.Id); - if (element != null) - { - element.ScrollIntoView(true); - } + markdownControl.ScrollToElement(mdElement.Id); } } From fc9a39009a7eabb849b6fe2e1e21a6e4384f2ed2 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 5 Jan 2017 21:02:15 +0100 Subject: [PATCH 130/230] set background to white --- BenchManager/BenchDashboard/Resources/MarkdownViewerStyle.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchDashboard/Resources/MarkdownViewerStyle.css b/BenchManager/BenchDashboard/Resources/MarkdownViewerStyle.css index 229098a1..d3f8b0e3 100644 --- a/BenchManager/BenchDashboard/Resources/MarkdownViewerStyle.css +++ b/BenchManager/BenchDashboard/Resources/MarkdownViewerStyle.css @@ -1 +1 @@ -abbr,address,article,aside,audio,b,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,p,pre,q,samp,section,small,span,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,ul,var,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;color:inherit;font-family:inherit}body{line-height:100%;background-color:#fff;color:#000;font-family:sans-serif;text-align:left}h1,h2,h3,h4,h5,h6{font-family:serif}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}code{font-family:monospace}ins{text-decoration:underline}mark{font-style:italic;font-weight:700}del{text-decoration:line-through}a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent}abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}table{border-collapse:collapse;border-spacing:0}hr{display:block;height:1px;border:0;border-top:1px solid #888;margin:1em 0;padding:0}input,select{vertical-align:middle}body{font-family:Calibri,Tahoma,Helvetica,Arial,sans-serif;line-height:115%;margin:1em 1.5em 2em;background-color:#fff;color:#000}h1,h2,h3,h4,h5,h6{margin-top:.66em;margin-bottom:.33em;line-height:100%;color:#252525}h1,h2,h3,h4{font-family:Cambria,Times,Times New Roman,serif;font-weight:400}h1{font-size:2.3em}h2{font-size:1.8em}h3{font-size:1.4em}h4{font-size:1.1em}h5,h6{font-family:Calibri,Tahoma,Helvetica,Arial,sans-serif}h5{font-weight:700}h5,h6{font-size:1em}h6{text-decoration:underline;font-weight:400}hr{clear:both}dl,figure,ol,p,pre,summary,table,ul{margin-top:1em}em{font-style:italic;font-weight:400}strong{font-style:normal;font-weight:600}a{color:#1b58b8;text-decoration:none}a:visited{color:#5f8acd}a:hover{color:#00296a}a:active{color:#1faeff}h1 a,h1 a:visited,h2 a,h2 a:visited,h3 a,h3 a:visited,h4 a,h4 a:visited,h5 a,h5 a:visited,h6 a,h6 a:visited{color:inherit}h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover{color:#00296a}h1 a:active,h2 a:active,h3 a:active,h4 a:active,h5 a:active,h6 a:active{color:#1faeff}img{border:none}ins{color:#093;text-decoration:none}mark{background-color:#ffc;border:1px solid #ffff4d;border-radius:0;padding:0 .25em;color:#000;font-style:normal;font-weight:400}del{color:#f44;text-decoration:line-through}li{margin-left:2em}li ol,li ul{margin-top:.33em;margin-bottom:.33em}li p:first-of-type{margin-top:0}ul li{list-style:disc outside none}ul li li{list-style:circle outside none}ul li li li{list-style:square outside none}ol li{list-style:decimal outside none}ol li li{list-style:lower-latin outside none}ol li li li{list-style:lower-roman outside none}dl{font-weight:300}dt{font-weight:600;font-style:italic}dd{margin-left:2em;padding-bottom:.5em}nav li,nav ul li,nav ul li li,nav ul li li li{list-style:none outside none;margin-left:0}nav li ol,nav li ul{margin:0}nav li ol li:first-child,nav li ul li:first-child{margin-top:.2em}q{quotes:"\201E" "\201C";font-style:italic}q:before{content:open-quote}q:after{content:close-quote}aside,blockquote,figure,pre{background-color:#f8f8f8}blockquote{border:none;border-radius:0;margin:1em 10%;padding:.5em .75em;font-style:italic}blockquote cite{display:block;text-align:right;margin-top:.5em;font-style:normal;font-size:.8em}blockquote>p:first-child{margin-top:0}blockquote blockquote{margin:1em 0 .5em}pre{border:none;border-radius:0;padding:.25em .75em .55em;white-space:pre;overflow:auto}code{font-family:Consolas,Courier New,Courier,monospace;font-size:.8em;color:#024;background-color:#f2f2f2;padding:0 .2em;border:1px solid #ccd3da;border-radius:0}pre code{background-color:inherit;border:none;border-radius:none;padding:0}code span{font-family:Consolas,Courier New,Courier,monospace;font-weight:400;font-size:1em}code span.kw{font-weight:700;color:#2673ec}code span.fu{color:#004d60}code span.dt{color:#b01e00}code span.bn{color:#006ac1}code span.dv{color:#4617b4}code span.fl{color:#7200ac}code span.ch{color:#199900}code span.st{color:#004a00}code span.co{font-weight:300;font-style:italic}code span.co,code span.ot{color:#6f6666}code span.al,code span.er{color:#ae113d;font-weight:700}code span.re{color:#024}table{border-collapse:collapse}td,th{padding:.125em .5em;border:none}tfoot td,th,thead td{font-weight:700}tfoot,thead{background-color:#f2f2f2}figure{border:none;border-radius:0;margin-left:10%;margin-right:10%;padding:.5em;text-align:center;overflow:auto}figure figcaption{display:block;text-align:center;font-style:normal;font-weight:700;font-size:.8em;margin-top:.5em}figure table{width:100%;margin-top:0}section{border-top:1px solid #aaa;margin-top:1.5em}footer{margin-top:2em;text-align:center;color:#888}aside{float:right;width:25%;border:none;border-radius:0;margin-left:1em;padding:0 .75em 1em}details{color:#545454;padding-left:1em;border-left:1px solid #aaa}details p{margin-top:.5em}details summary{display:block;font-weight:500;color:#000;padding-bottom:.5em}.badge{display:inline-block;font-weight:700;font-size:.9em;margin:1em .5em 0 0;padding:.1em .75em .2em;border:1px solid #696969;border-radius:0}span.badge{display:inline;padding:0 .5em .05em;margin:0}.default{border-color:#696969}.highlight{border-color:#00a4a4}.success{border-color:#78ba00}.info{border-color:#f4b300}.warning{border-color:#e46a19}.error{border-color:#ae113d}.passive{border-color:#d5d5d5}.active{border-color:#2673ec}.default,.fg-default{color:#202020}.fg-highlight,.highlight{color:#003131}.fg-success,.success{color:#243800}.fg-info,.info{color:#493600}.fg-warning,.warning{color:#442008}.error,.fg-error{color:#340512}.fg-passive,.passive{color:#777}.active,.fg-active{color:#0b2347}.bg-default,.default{background-color:#d2d2d2}.bg-highlight,.highlight{background-color:#b3e4e4}.bg-success,.success{background-color:#d7eab3}.bg-info,.info{background-color:#fce8b3}.bg-warning,.warning{background-color:#f7d2ba}.bg-error,.error{background-color:#e7b8c5}.bg-passive,.passive{background-color:#eee}.active,.bg-active{background-color:#bed5f9}body{margin:0;padding:0;background-color:#696969}#frame{text-align:left;padding:1em;background-color:#fff;-chrome-box-shadow:0 0 12px #696969;box-shadow:0 0 12px #696969}header{padding-bottom:1em;margin-left:13em}figure{margin-left:0;margin-right:0}nav ul{list-style:none;margin-top:0;padding-top:0;margin-left:0;padding-left:0}nav .menu-title{font-weight:700}nav.horizontal{border-bottom:1px solid #aaa;width:auto;float:none;padding:.25em;margin-left:13em;margin-right:.5em}nav.horizontal .menu-title,nav.horizontal ul{display:inline-block}nav.horizontal .menu-title{padding:0 .5em 0 .25em}nav.horizontal li{display:inline-block}nav.horizontal li:first-of-type{padding-left:.5em}nav.horizontal li+li{margin-left:0}nav.horizontal li+li:before{content:'\00A0\2022\00A0\00A0';color:#8dacdc}nav.vertical{border-bottom:none;width:10em;float:left;padding:1em 1em 1em .5em}nav.vertical .menu-title,nav.vertical ul{display:block}nav.vertical .menu-title{padding:0 0 .5em}nav.vertical li{display:block;padding:0 0 .25em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nav.vertical li li{margin-left:.75em;font-size:small;padding:0}nav.fixed{position:fixed;top:0;height:100%;overflow-y:auto;margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0}nav.fixed>ul{margin-top:3em;margin-bottom:2em}#page{margin:1em .5em 1em 12em;padding-left:1em}footer{border-top:1px solid #aaa;clear:both}@media screen and (min-width:960px){#frame{width:90%;margin-left:auto;margin-right:auto}}@media screen and (max-device-height:720px) and (orientation:landscape),screen and (max-width:720px){#frame{max-width:720px}header{margin-left:0}nav.horizontal{margin:0}nav.vertical{border-bottom:1px solid #aaa;width:auto;float:none;padding:.25em;margin:0}nav.vertical>.menu-title{padding:0 .5em 0 .25em}nav.fixed{position:relative}#page{margin:1em .5em;padding:0}}@media screen and (max-device-height:720px) and (orientation:landscape) and (min-width:480px),screen and (max-device-height:720px) and (orientation:landscape) and (orientation:landscape),screen and (max-width:720px) and (min-width:480px),screen and (max-width:720px) and (orientation:landscape){nav.vertical li{margin:.5em;overflow:auto}nav.vertical>ul{white-space:normal}nav.vertical>ul ul{display:block}nav.vertical>ul ul li{display:inline;margin-right:0;padding:0}nav.vertical>ul ul li+li{margin-left:0}nav.vertical>ul ul li+li:before{content:'\00A0\2022\00A0\00A0';color:#8dacdc}}@media screen and (max-width:480px) and (orientation:portrait){#frame{max-width:480px;padding:.25em}header{padding-bottom:0;margin:0}header h1{padding-bottom:.25em;padding-top:.25em;font-size:1.8em;border-bottom:1px solid #aaa}header h1,nav.horizontal{margin:0;text-align:center}nav.horizontal li,nav.horizontal li:first-of-type{display:block;padding:0 0 .15em}nav.horizontal li+li{margin-left:0}nav.horizontal li+li:before{content:none}nav.horizontal,nav.vertical{position:auto;border-bottom:1px solid #aaa;width:auto;float:none;padding:.5em 0}nav.vertical ul{display:block}nav.vertical>ul{margin:.5em}nav.horizontal .menu-title,nav.vertical .menu-title{display:block;padding:0 0 .5em}aside{width:50%}}body{font-family:Segoe UI,Calibri,Arial,Helvetica,sans-serif;font-size:11.5pt;line-height:130%}aside,footer,h1,h2,h3,h4{font-family:Segoe UI,Calibri Light,Arial,Helvetica,sans-serif}h1,h2{font-weight:200}h3,h4{font-weight:300}h5,h6{font-weight:700}h5{text-decoration:underline}h6{text-decoration:none}ins{color:#199900}del{color:#b81b1b}mark{background-color:#ffa;border:none}aside{font-weight:400;font-size:9.5pt}blockquote{border-left:.5em solid #e0e0e0}figure figcaption{font-weight:400;font-size:10.5pt}code{font-family:Consolas,Courier New,Courier,monospace;line-height:110%}table{background-color:#fff}tfoot td,thead td{background-color:#f8f8f8}td,tfoot td,th,thead td{border:1px solid #ccc}.badge{font-weight:300;font-size:12pt;padding:.33em .66em}.active,.default,.error,.highlight,.info,.passive,.success,.warning{border:none;color:#fff}.default{background-color:#696969}.highlight{background-color:#00a4a4}.success{background-color:#78ba00}.info{background-color:#f4b300}.warning{background-color:#e46a19}.error{background-color:#ae113d}.active{background-color:#2673ec}.passive{background-color:#aaa} \ No newline at end of file +abbr,address,article,aside,audio,b,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,p,pre,q,samp,section,small,span,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,ul,var,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;color:inherit;font-family:inherit}body{line-height:100%;background-color:#fff;color:#000;font-family:sans-serif;text-align:left}h1,h2,h3,h4,h5,h6{font-family:serif}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}code{font-family:monospace}ins{text-decoration:underline}mark{font-style:italic;font-weight:700}del{text-decoration:line-through}a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent}abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}table{border-collapse:collapse;border-spacing:0}hr{display:block;height:1px;border:0;border-top:1px solid #888;margin:1em 0;padding:0}input,select{vertical-align:middle}body{font-family:Calibri,Tahoma,Helvetica,Arial,sans-serif;line-height:115%;margin:1em 1.5em 2em;background-color:#fff;color:#000}h1,h2,h3,h4,h5,h6{margin-top:.66em;margin-bottom:.33em;line-height:100%;color:#252525}h1,h2,h3,h4{font-family:Cambria,Times,Times New Roman,serif;font-weight:400}h1{font-size:2.3em}h2{font-size:1.8em}h3{font-size:1.4em}h4{font-size:1.1em}h5,h6{font-family:Calibri,Tahoma,Helvetica,Arial,sans-serif}h5{font-weight:700}h5,h6{font-size:1em}h6{text-decoration:underline;font-weight:400}hr{clear:both}dl,figure,ol,p,pre,summary,table,ul{margin-top:1em}em{font-style:italic;font-weight:400}strong{font-style:normal;font-weight:600}a{color:#1b58b8;text-decoration:none}a:visited{color:#5f8acd}a:hover{color:#00296a}a:active{color:#1faeff}h1 a,h1 a:visited,h2 a,h2 a:visited,h3 a,h3 a:visited,h4 a,h4 a:visited,h5 a,h5 a:visited,h6 a,h6 a:visited{color:inherit}h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover{color:#00296a}h1 a:active,h2 a:active,h3 a:active,h4 a:active,h5 a:active,h6 a:active{color:#1faeff}img{border:none}ins{color:#093;text-decoration:none}mark{background-color:#ffc;border:1px solid #ffff4d;border-radius:0;padding:0 .25em;color:#000;font-style:normal;font-weight:400}del{color:#f44;text-decoration:line-through}li{margin-left:2em}li ol,li ul{margin-top:.33em;margin-bottom:.33em}li p:first-of-type{margin-top:0}ul li{list-style:disc outside none}ul li li{list-style:circle outside none}ul li li li{list-style:square outside none}ol li{list-style:decimal outside none}ol li li{list-style:lower-latin outside none}ol li li li{list-style:lower-roman outside none}dl{font-weight:300}dt{font-weight:600;font-style:italic}dd{margin-left:2em;padding-bottom:.5em}nav li,nav ul li,nav ul li li,nav ul li li li{list-style:none outside none;margin-left:0}nav li ol,nav li ul{margin:0}nav li ol li:first-child,nav li ul li:first-child{margin-top:.2em}q{quotes:"\201E" "\201C";font-style:italic}q:before{content:open-quote}q:after{content:close-quote}aside,blockquote,figure,pre{background-color:#f8f8f8}blockquote{border:none;border-radius:0;margin:1em 10%;padding:.5em .75em;font-style:italic}blockquote cite{display:block;text-align:right;margin-top:.5em;font-style:normal;font-size:.8em}blockquote>p:first-child{margin-top:0}blockquote blockquote{margin:1em 0 .5em}pre{border:none;border-radius:0;padding:.25em .75em .55em;white-space:pre;overflow:auto}code{font-family:Consolas,Courier New,Courier,monospace;font-size:.8em;color:#024;background-color:#f2f2f2;padding:0 .2em;border:1px solid #ccd3da;border-radius:0}pre code{background-color:inherit;border:none;border-radius:none;padding:0}code span{font-family:Consolas,Courier New,Courier,monospace;font-weight:400;font-size:1em}code span.kw{font-weight:700;color:#2673ec}code span.fu{color:#004d60}code span.dt{color:#b01e00}code span.bn{color:#006ac1}code span.dv{color:#4617b4}code span.fl{color:#7200ac}code span.ch{color:#199900}code span.st{color:#004a00}code span.co{font-weight:300;font-style:italic}code span.co,code span.ot{color:#6f6666}code span.al,code span.er{color:#ae113d;font-weight:700}code span.re{color:#024}table{border-collapse:collapse}td,th{padding:.125em .5em;border:none}tfoot td,th,thead td{font-weight:700}tfoot,thead{background-color:#f2f2f2}figure{border:none;border-radius:0;margin-left:10%;margin-right:10%;padding:.5em;text-align:center;overflow:auto}figure figcaption{display:block;text-align:center;font-style:normal;font-weight:700;font-size:.8em;margin-top:.5em}figure table{width:100%;margin-top:0}section{border-top:1px solid #aaa;margin-top:1.5em}footer{margin-top:2em;text-align:center;color:#888}aside{float:right;width:25%;border:none;border-radius:0;margin-left:1em;padding:0 .75em 1em}details{color:#545454;padding-left:1em;border-left:1px solid #aaa}details p{margin-top:.5em}details summary{display:block;font-weight:500;color:#000;padding-bottom:.5em}.badge{display:inline-block;font-weight:700;font-size:.9em;margin:1em .5em 0 0;padding:.1em .75em .2em;border:1px solid #696969;border-radius:0}span.badge{display:inline;padding:0 .5em .05em;margin:0}.default{border-color:#696969}.highlight{border-color:#00a4a4}.success{border-color:#78ba00}.info{border-color:#f4b300}.warning{border-color:#e46a19}.error{border-color:#ae113d}.passive{border-color:#d5d5d5}.active{border-color:#2673ec}.default,.fg-default{color:#202020}.fg-highlight,.highlight{color:#003131}.fg-success,.success{color:#243800}.fg-info,.info{color:#493600}.fg-warning,.warning{color:#442008}.error,.fg-error{color:#340512}.fg-passive,.passive{color:#777}.active,.fg-active{color:#0b2347}.bg-default,.default{background-color:#d2d2d2}.bg-highlight,.highlight{background-color:#b3e4e4}.bg-success,.success{background-color:#d7eab3}.bg-info,.info{background-color:#fce8b3}.bg-warning,.warning{background-color:#f7d2ba}.bg-error,.error{background-color:#e7b8c5}.bg-passive,.passive{background-color:#eee}.active,.bg-active{background-color:#bed5f9}body{margin:0;padding:0;background-color:#fff}#frame{text-align:left;padding:1em;background-color:#fff;-chrome-box-shadow:0 0 12px #696969;box-shadow:0 0 12px #696969}header{padding-bottom:1em;margin-left:13em}figure{margin-left:0;margin-right:0}nav ul{list-style:none;margin-top:0;padding-top:0;margin-left:0;padding-left:0}nav .menu-title{font-weight:700}nav.horizontal{border-bottom:1px solid #aaa;width:auto;float:none;padding:.25em;margin-left:13em;margin-right:.5em}nav.horizontal .menu-title,nav.horizontal ul{display:inline-block}nav.horizontal .menu-title{padding:0 .5em 0 .25em}nav.horizontal li{display:inline-block}nav.horizontal li:first-of-type{padding-left:.5em}nav.horizontal li+li{margin-left:0}nav.horizontal li+li:before{content:'\00A0\2022\00A0\00A0';color:#8dacdc}nav.vertical{border-bottom:none;width:10em;float:left;padding:1em 1em 1em .5em}nav.vertical .menu-title,nav.vertical ul{display:block}nav.vertical .menu-title{padding:0 0 .5em}nav.vertical li{display:block;padding:0 0 .25em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nav.vertical li li{margin-left:.75em;font-size:small;padding:0}nav.fixed{position:fixed;top:0;height:100%;overflow-y:auto;margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0}nav.fixed>ul{margin-top:3em;margin-bottom:2em}#page{margin:1em .5em 1em 12em;padding-left:1em}footer{border-top:1px solid #aaa;clear:both}@media screen and (min-width:960px){#frame{width:90%;margin-left:auto;margin-right:auto}}@media screen and (max-device-height:720px) and (orientation:landscape),screen and (max-width:720px){#frame{max-width:720px}header{margin-left:0}nav.horizontal{margin:0}nav.vertical{border-bottom:1px solid #aaa;width:auto;float:none;padding:.25em;margin:0}nav.vertical>.menu-title{padding:0 .5em 0 .25em}nav.fixed{position:relative}#page{margin:1em .5em;padding:0}}@media screen and (max-device-height:720px) and (orientation:landscape) and (min-width:480px),screen and (max-device-height:720px) and (orientation:landscape) and (orientation:landscape),screen and (max-width:720px) and (min-width:480px),screen and (max-width:720px) and (orientation:landscape){nav.vertical li{margin:.5em;overflow:auto}nav.vertical>ul{white-space:normal}nav.vertical>ul ul{display:block}nav.vertical>ul ul li{display:inline;margin-right:0;padding:0}nav.vertical>ul ul li+li{margin-left:0}nav.vertical>ul ul li+li:before{content:'\00A0\2022\00A0\00A0';color:#8dacdc}}@media screen and (max-width:480px) and (orientation:portrait){#frame{max-width:480px;padding:.25em}header{padding-bottom:0;margin:0}header h1{padding-bottom:.25em;padding-top:.25em;font-size:1.8em;border-bottom:1px solid #aaa}header h1,nav.horizontal{margin:0;text-align:center}nav.horizontal li,nav.horizontal li:first-of-type{display:block;padding:0 0 .15em}nav.horizontal li+li{margin-left:0}nav.horizontal li+li:before{content:none}nav.horizontal,nav.vertical{position:auto;border-bottom:1px solid #aaa;width:auto;float:none;padding:.5em 0}nav.vertical ul{display:block}nav.vertical>ul{margin:.5em}nav.horizontal .menu-title,nav.vertical .menu-title{display:block;padding:0 0 .5em}aside{width:50%}}body{font-family:Segoe UI,Calibri,Arial,Helvetica,sans-serif;font-size:11.5pt;line-height:130%}aside,footer,h1,h2,h3,h4{font-family:Segoe UI,Calibri Light,Arial,Helvetica,sans-serif}h1,h2{font-weight:200}h3,h4{font-weight:300}h5,h6{font-weight:700}h5{text-decoration:underline}h6{text-decoration:none}ins{color:#199900}del{color:#b81b1b}mark{background-color:#ffa;border:none}aside{font-weight:400;font-size:9.5pt}blockquote{border-left:.5em solid #e0e0e0}figure figcaption{font-weight:400;font-size:10.5pt}code{font-family:Consolas,Courier New,Courier,monospace;line-height:110%}table{background-color:#fff}tfoot td,thead td{background-color:#f8f8f8}td,tfoot td,th,thead td{border:1px solid #ccc}.badge{font-weight:300;font-size:12pt;padding:.33em .66em}.active,.default,.error,.highlight,.info,.passive,.success,.warning{border:none;color:#fff}.default{background-color:#696969}.highlight{background-color:#00a4a4}.success{background-color:#78ba00}.info{background-color:#f4b300}.warning{background-color:#e46a19}.error{background-color:#ae113d}.active{background-color:#2673ec}.passive{background-color:#aaa} \ No newline at end of file From c2255af2704fc534c69b39e7ee102192cba49bc1 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 5 Jan 2017 21:03:44 +0100 Subject: [PATCH 131/230] Added app documentation text to app info dialog --- .../BenchDashboard/AppInfoDialog.Designer.cs | 30 +++++++++++++++++-- BenchManager/BenchDashboard/AppInfoDialog.cs | 16 +++++++++- CHANGELOG.md | 1 + 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/BenchManager/BenchDashboard/AppInfoDialog.Designer.cs b/BenchManager/BenchDashboard/AppInfoDialog.Designer.cs index 4ced2d89..70842cbf 100644 --- a/BenchManager/BenchDashboard/AppInfoDialog.Designer.cs +++ b/BenchManager/BenchDashboard/AppInfoDialog.Designer.cs @@ -39,11 +39,14 @@ private void InitializeComponent() this.gridRaw = new System.Windows.Forms.DataGridView(); this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.tabDocumentation = new System.Windows.Forms.TabPage(); + this.mdDocumentation = new Mastersign.Bench.Dashboard.MarkdownControl(); this.tabControl.SuspendLayout(); this.tabResolved.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.gridResolved)).BeginInit(); this.tabRaw.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.gridRaw)).BeginInit(); + this.tabDocumentation.SuspendLayout(); this.SuspendLayout(); // // lblAppId @@ -59,6 +62,7 @@ private void InitializeComponent() // // tabControl // + this.tabControl.Controls.Add(this.tabDocumentation); this.tabControl.Controls.Add(this.tabResolved); this.tabControl.Controls.Add(this.tabRaw); this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill; @@ -76,7 +80,7 @@ private void InitializeComponent() this.tabResolved.Padding = new System.Windows.Forms.Padding(3); this.tabResolved.Size = new System.Drawing.Size(425, 439); this.tabResolved.TabIndex = 0; - this.tabResolved.Text = "Effective"; + this.tabResolved.Text = "Properties"; this.tabResolved.UseVisualStyleBackColor = true; // // gridResolved @@ -124,7 +128,7 @@ private void InitializeComponent() this.tabRaw.Padding = new System.Windows.Forms.Padding(3); this.tabRaw.Size = new System.Drawing.Size(425, 439); this.tabRaw.TabIndex = 1; - this.tabRaw.Text = "Raw"; + this.tabRaw.Text = "Raw Properties"; this.tabRaw.UseVisualStyleBackColor = true; // // gridRaw @@ -164,6 +168,25 @@ private void InitializeComponent() this.dataGridViewTextBoxColumn2.Name = "dataGridViewTextBoxColumn2"; this.dataGridViewTextBoxColumn2.ReadOnly = true; // + // tabDocumentation + // + this.tabDocumentation.Controls.Add(this.mdDocumentation); + this.tabDocumentation.Location = new System.Drawing.Point(4, 22); + this.tabDocumentation.Name = "tabDocumentation"; + this.tabDocumentation.Padding = new System.Windows.Forms.Padding(3); + this.tabDocumentation.Size = new System.Drawing.Size(425, 439); + this.tabDocumentation.TabIndex = 2; + this.tabDocumentation.Text = "Documentation"; + this.tabDocumentation.UseVisualStyleBackColor = true; + // + // mdDocumentation + // + this.mdDocumentation.Dock = System.Windows.Forms.DockStyle.Fill; + this.mdDocumentation.Location = new System.Drawing.Point(3, 3); + this.mdDocumentation.Name = "mdDocumentation"; + this.mdDocumentation.Size = new System.Drawing.Size(419, 433); + this.mdDocumentation.TabIndex = 0; + // // AppInfoDialog // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -181,6 +204,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.gridResolved)).EndInit(); this.tabRaw.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.gridRaw)).EndInit(); + this.tabDocumentation.ResumeLayout(false); this.ResumeLayout(false); } @@ -196,5 +220,7 @@ private void InitializeComponent() private System.Windows.Forms.DataGridView gridRaw; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn2; + private System.Windows.Forms.TabPage tabDocumentation; + private MarkdownControl mdDocumentation; } } \ No newline at end of file diff --git a/BenchManager/BenchDashboard/AppInfoDialog.cs b/BenchManager/BenchDashboard/AppInfoDialog.cs index 53532550..0fccf260 100644 --- a/BenchManager/BenchDashboard/AppInfoDialog.cs +++ b/BenchManager/BenchDashboard/AppInfoDialog.cs @@ -49,6 +49,7 @@ public AppInfoDialog(BenchConfiguration config, AppFacade app) gridResolved.DoubleBuffered(true); lblAppId.Text = app.Label; LoadProperties(config, app); + LoadDocumentation(app); } private void LoadProperties(BenchConfiguration config, AppFacade app) @@ -66,7 +67,7 @@ private void LoadProperties(BenchConfiguration config, AppFacade app) gridRaw.Rows.Clear(); AddRow(gridRaw, "ID", app.ID); - foreach(var key in config.PropertyNames(app.ID)) + foreach (var key in config.PropertyNames(app.ID)) { AddRow(gridRaw, key, config.GetRawGroupValue(app.ID, key)); } @@ -106,5 +107,18 @@ private void AddRow(DataGridView grid, string name, string value) { grid.Rows.Add(name, value); } + + private void LoadDocumentation(AppFacade app) + { + var docText = app.MarkdownDocumentation; + if (!string.IsNullOrWhiteSpace(docText)) + { + mdDocumentation.ShowMarkdownText(docText, app.Label); + } + else + { + tabControl.TabPages.Remove(tabDocumentation); + } + } } } diff --git a/CHANGELOG.md b/CHANGELOG.md index 4147f187..1307e9c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ Add a link to the GitHub diff like + `AppLibIndexFileName` + `AppLibCustomScriptDirName` + `AppLibResourceDirName` +- Markdown info text in the app info dialog ### Changed - Upgrade process is using the _Bench CLI_ now From 99436f53f58abe80ae6c3d80afea1ce26731f435 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 6 Jan 2017 13:29:34 +0100 Subject: [PATCH 132/230] added AppIndexFacade.All property --- BenchManager/BenchLib/AppIndexFacade.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/BenchManager/BenchLib/AppIndexFacade.cs b/BenchManager/BenchLib/AppIndexFacade.cs index 19b13023..a91b2bed 100644 --- a/BenchManager/BenchLib/AppIndexFacade.cs +++ b/BenchManager/BenchLib/AppIndexFacade.cs @@ -73,6 +73,22 @@ public bool Exists(string appName) return AppIndex.ContainsGroup(appName); } + /// + /// Gets an array with facades for all apps. + /// + public AppFacade[] All + { + get + { + var result = new List(); + foreach (var appName in AppIndex.Groups()) + { + result.Add(GetAppFacade(appName)); + } + return result.ToArray(); + } + } + /// /// Gets all apps of a given category. /// From 4e853bc2f5bd6a1e0fdfcf8b12aca4c040a46433 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 6 Jan 2017 13:30:08 +0100 Subject: [PATCH 133/230] fixed Markdown documentation line collection --- .../Markdown/MarkdownPropertyParser.cs | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs b/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs index 82fe6a03..81801444 100644 --- a/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs +++ b/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs @@ -24,8 +24,8 @@ public class MarkdownPropertyParser private static readonly Regex ListElementExp = new Regex("^(?:\t| +)[\\*\\+-]\\s+(?.*?)\\s*$"); private static readonly string ListElementFormat = "`{0}`"; - private static readonly Regex DefaultGroupDocsBeginCue = new Regex("^###\\s+\\S"); - private static readonly Regex DefaultGroupDocsEndCue = new Regex("^###\\s+\\S"); + private static readonly Regex DefaultGroupDocsBeginCue = new Regex("^#{3}\\s+\\S"); + private static readonly Regex DefaultGroupDocsEndCue = new Regex("^#{1,3}\\s+\\S"); private static readonly Regex DefaultGroupBeginCue = new Regex("^###\\s+(?.+?)\\s*(?:\\{.*?\\})?\\s*(?:###)?$"); private static readonly Regex DefaultGroupEndCue = new Regex("^\\s*$"); @@ -271,29 +271,24 @@ private void ProcessLine(string line) if (MdSyntax.IsHtmlCommentEnd(line)) Context = MdContext.Text; ProcessPossibleGroupDocsLine(line); - ProcessPossibleGroupDocsSwitchLine(line); break; case MdContext.CodeBlock: if (MdSyntax.IsCodeBlockEnd(line, ref CodePreamble)) Context = MdContext.Text; ProcessPossibleGroupDocsLine(line); - ProcessPossibleGroupDocsSwitchLine(line); break; case MdContext.Text: - ProcessPossibleGroupDocsSwitchLine(line); if (MdSyntax.IsYamlHeaderStart(LineNo, line)) Context = MdContext.YamlHeader; else if (MdSyntax.IsHtmlCommentStart(line)) { Context = MdContext.HtmlComment; ProcessPossibleGroupDocsLine(line); - ProcessPossibleGroupDocsSwitchLine(line); } else if (MdSyntax.IsCodeBlockStart(line, ref CodePreamble)) { Context = MdContext.CodeBlock; ProcessPossibleGroupDocsLine(line); - ProcessPossibleGroupDocsSwitchLine(line); } else if (IsDeactivationCue(line)) Context = MdContext.Inactive; @@ -302,7 +297,6 @@ private void ProcessLine(string line) else { ProcessTextLine(line); - ProcessPossibleGroupDocsSwitchLine(line); } break; case MdContext.List: @@ -342,6 +336,14 @@ private void ProcessTextLine(string line) return; } } + if (GroupEndCue != null) + { + var gm = GroupEndCue.Match(line); + if (gm.Success) + { + CurrentGroup = null; + } + } if (GroupBeginCue != null) { var gm = GroupBeginCue.Match(line); @@ -359,15 +361,6 @@ private void ProcessTextLine(string line) return; } } - if (GroupEndCue != null) - { - var gm = GroupEndCue.Match(line); - if (gm.Success) - { - CurrentGroup = null; - return; - } - } var m = MdListExp.Match(line); if (m.Success) { @@ -394,7 +387,15 @@ private void ProcessTextLine(string line) } } - private void ProcessPossibleGroupDocsSwitchLine(string line) + private void CheckForGroupDocsBegin(string line) + { + if (CollectGroupDocs && GroupDocsBeginCue.IsMatch(line)) + { + collectingGroupDocsActive = true; + } + } + + private void CheckForGroupDocsEnd(string line) { if (CollectGroupDocs && GroupDocsEndCue.IsMatch(line)) { @@ -407,18 +408,16 @@ private void ProcessPossibleGroupDocsSwitchLine(string line) docGroups.Clear(); collectingGroupDocsActive = false; } - if (CollectGroupDocs && GroupDocsBeginCue.IsMatch(line)) - { - collectingGroupDocsActive = true; - } } private void ProcessPossibleGroupDocsLine(string line) { + CheckForGroupDocsEnd(line); if (collectingGroupDocsActive) { collectedGroupDocs.Add(line); } + CheckForGroupDocsBegin(line); } } From 84dd1cec50469c5cab8454f613fe68f97fc7346e Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 6 Jan 2017 16:06:13 +0100 Subject: [PATCH 134/230] redirected link navigation to the system browser --- BenchManager/BenchDashboard/MarkdownControl.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/BenchManager/BenchDashboard/MarkdownControl.cs b/BenchManager/BenchDashboard/MarkdownControl.cs index 01496721..742f2905 100644 --- a/BenchManager/BenchDashboard/MarkdownControl.cs +++ b/BenchManager/BenchDashboard/MarkdownControl.cs @@ -36,7 +36,12 @@ public MarkdownControl() private void WebBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e) { - // force opening URLs in System browser + var url = e.Url; + if (url.IsAbsoluteUri && !url.IsFile) + { + e.Cancel = true; + Process.Start(url.AbsoluteUri); + } } private void MarkdownControl_Disposed(object sender, EventArgs e) From 0973d2c0c1fc92fc113f850e81f1347415c8bb3a Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 6 Jan 2017 16:06:26 +0100 Subject: [PATCH 135/230] removed obsolete list of known app properties --- BenchManager/BenchDashboard/AppInfoDialog.cs | 33 -------------------- 1 file changed, 33 deletions(-) diff --git a/BenchManager/BenchDashboard/AppInfoDialog.cs b/BenchManager/BenchDashboard/AppInfoDialog.cs index 0fccf260..5800ef42 100644 --- a/BenchManager/BenchDashboard/AppInfoDialog.cs +++ b/BenchManager/BenchDashboard/AppInfoDialog.cs @@ -12,37 +12,6 @@ namespace Mastersign.Bench.Dashboard { internal partial class AppInfoDialog : Form { - private static readonly string[] KnownProperties = new[] - { - PropertyKeys.AppTyp, - PropertyKeys.AppWebsite, - PropertyKeys.AppDocs, - PropertyKeys.AppVersion, - PropertyKeys.AppInstalledVersion, - PropertyKeys.AppDependencies, - PropertyKeys.AppForce, - PropertyKeys.AppSetupTestFile, - PropertyKeys.AppPackageName, - PropertyKeys.AppUrl, - PropertyKeys.AppDownloadCookies, - PropertyKeys.AppDownloadHeaders, - PropertyKeys.AppResourceName, - PropertyKeys.AppArchiveName, - PropertyKeys.AppArchiveTyp, - PropertyKeys.AppArchivePath, - PropertyKeys.AppDir, - PropertyKeys.AppExe, - PropertyKeys.AppRegister, - PropertyKeys.AppPath, - PropertyKeys.AppEnvironment, - PropertyKeys.AppAdornedExecutables, - PropertyKeys.AppRegistryKeys, - PropertyKeys.AppLauncher, - PropertyKeys.AppLauncherExecutable, - PropertyKeys.AppLauncherArguments, - PropertyKeys.AppLauncherIcon, - }; - public AppInfoDialog(BenchConfiguration config, AppFacade app) { InitializeComponent(); @@ -55,7 +24,6 @@ public AppInfoDialog(BenchConfiguration config, AppFacade app) private void LoadProperties(BenchConfiguration config, AppFacade app) { gridResolved.Rows.Clear(); - AddRow(gridResolved, "ID", app.ID); foreach (var kvp in app.KnownProperties) { AddRow(gridResolved, kvp.Key, kvp.Value); @@ -66,7 +34,6 @@ private void LoadProperties(BenchConfiguration config, AppFacade app) } gridRaw.Rows.Clear(); - AddRow(gridRaw, "ID", app.ID); foreach (var key in config.PropertyNames(app.ID)) { AddRow(gridRaw, key, config.GetRawGroupValue(app.ID, key)); From fe5a0942d166adecca24cd8b8436239b73024692 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 6 Jan 2017 16:06:50 +0100 Subject: [PATCH 136/230] added the apps ID to the known properties --- BenchManager/BenchLib/AppFacade.cs | 2 ++ BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BenchManager/BenchLib/AppFacade.cs b/BenchManager/BenchLib/AppFacade.cs index cf902ccf..0306251e 100644 --- a/BenchManager/BenchLib/AppFacade.cs +++ b/BenchManager/BenchLib/AppFacade.cs @@ -1360,6 +1360,7 @@ private static string[] RemoveFromSet(string[] list, string value) /// public static readonly string[] KnownPropertyKeys = new[] { + "ID", PropertyKeys.AppTyp, PropertyKeys.AppLabel, PropertyKeys.AppWebsite, @@ -1420,6 +1421,7 @@ public KeyValuePair[] KnownProperties get { var result = new List>(); + result.Add(new KeyValuePair("ID", this.ID)); result.Add(new KeyValuePair(PropertyKeys.AppTyp, this.Typ)); result.Add(new KeyValuePair(PropertyKeys.AppLabel, this.Label)); result.Add(new KeyValuePair(PropertyKeys.AppWebsite, this.Website)); diff --git a/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs b/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs index 81801444..515f9d7f 100644 --- a/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs +++ b/BenchManager/BenchLib/Markdown/MarkdownPropertyParser.cs @@ -333,7 +333,6 @@ private void ProcessTextLine(string line) if (cm.Success) { CurrentCategory = cm.Groups["category"].Value; - return; } } if (GroupEndCue != null) @@ -358,7 +357,6 @@ private void ProcessTextLine(string line) { docGroups.Add(CurrentGroup); } - return; } } var m = MdListExp.Match(line); From aebf0fa04a62cb114314a3a1dd279a56bbc75506 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 6 Jan 2017 16:07:50 +0100 Subject: [PATCH 137/230] adapted generation of app list to the new multi app library concept --- build/update-app-list.ps1 | 130 +++- docs/content/app/Bench.7z.md | 32 + docs/content/app/Bench.AntRenamer.md | 32 + docs/content/app/Bench.Apache.md | 35 + docs/content/app/Bench.Atom.md | 34 + docs/content/app/Bench.Blender.md | 31 + docs/content/app/Bench.Bower.md | 37 + docs/content/app/Bench.CMake.md | 41 + docs/content/app/Bench.Clang.md | 39 + docs/content/app/Bench.CoffeeScript.md | 29 + docs/content/app/Bench.ConEmu.md | 31 + docs/content/app/Bench.Dia.md | 31 + docs/content/app/Bench.DotNetCore.md | 28 + docs/content/app/Bench.EclipseCpp.md | 32 + docs/content/app/Bench.EclipseJava.md | 33 + docs/content/app/Bench.EclipsePHP.md | 33 + docs/content/app/Bench.Emacs.md | 36 + docs/content/app/Bench.Erlang.md | 32 + docs/content/app/Bench.FFmpeg.md | 34 + docs/content/app/Bench.FileZilla.md | 31 + docs/content/app/Bench.FreeCAD.md | 28 + docs/content/app/Bench.Gimp.md | 35 + docs/content/app/Bench.Git.md | 32 + docs/content/app/Bench.GitKraken.md | 33 + docs/content/app/Bench.GnuPG.md | 35 + docs/content/app/Bench.GnuTLS.md | 32 + docs/content/app/Bench.Go.md | 32 + docs/content/app/Bench.GraphicsMagick.md | 34 + docs/content/app/Bench.Graphviz.md | 35 + docs/content/app/Bench.Grunt.md | 32 + docs/content/app/Bench.Gulp.md | 32 + docs/content/app/Bench.Hugo.md | 34 + docs/content/app/Bench.IPython2.md | 37 + docs/content/app/Bench.IPython3.md | 37 + docs/content/app/Bench.Inkscape.md | 32 + docs/content/app/Bench.InnoUnp.md | 31 + docs/content/app/Bench.Iron.md | 31 + docs/content/app/Bench.JDK7.md | 33 + docs/content/app/Bench.JDK8.md | 34 + docs/content/app/Bench.JRE7.md | 33 + docs/content/app/Bench.JRE8.md | 34 + docs/content/app/Bench.JSHint.md | 32 + docs/content/app/Bench.JabRef.md | 33 + docs/content/app/Bench.Leiningen.md | 34 + docs/content/app/Bench.LessMsi.md | 31 + docs/content/app/Bench.LightTable.md | 31 + docs/content/app/Bench.Maven.md | 34 + docs/content/app/Bench.MeshLab.md | 35 + docs/content/app/Bench.MiKTeX.md | 33 + docs/content/app/Bench.MinGW.md | 45 ++ docs/content/app/Bench.MinGwGet.md | 45 ++ docs/content/app/Bench.MinGwGetGui.md | 45 ++ docs/content/app/Bench.MySQL.md | 38 + docs/content/app/Bench.MySQLWB.md | 36 + docs/content/app/Bench.NUnitRunners.md | 33 + docs/content/app/Bench.Node.md | 34 + docs/content/app/Bench.Npm.md | 40 + docs/content/app/Bench.NuGet.md | 34 + docs/content/app/Bench.OpenSSL.md | 32 + docs/content/app/Bench.PHP5.md | 34 + docs/content/app/Bench.PHP7.md | 34 + docs/content/app/Bench.Pandoc.md | 31 + docs/content/app/Bench.PostgreSQL.md | 41 + docs/content/app/Bench.Putty.md | 31 + docs/content/app/Bench.PyReadline2.md | 38 + docs/content/app/Bench.PyReadline3.md | 38 + docs/content/app/Bench.Python2.md | 32 + docs/content/app/Bench.Python3.md | 32 + docs/content/app/Bench.RabbitMQ.md | 37 + docs/content/app/Bench.Ruby.md | 33 + docs/content/app/Bench.RubyGems.md | 33 + docs/content/app/Bench.Sass.md | 32 + docs/content/app/Bench.Scribus.md | 33 + docs/content/app/Bench.Sift.md | 31 + docs/content/app/Bench.Spacemacs.md | 32 + docs/content/app/Bench.SublimeText3.md | 32 + docs/content/app/Bench.SysInternals.md | 32 + docs/content/app/Bench.TeXnicCenter.md | 32 + docs/content/app/Bench.VLC.md | 32 + docs/content/app/Bench.VSCode.md | 31 + docs/content/app/Bench.Vim.md | 33 + docs/content/app/Bench.VimConsole.md | 33 + docs/content/app/Bench.VimRT.md | 32 + docs/content/app/Bench.Wget.md | 34 + docs/content/app/Bench.WgetDeps.md | 32 + docs/content/app/Bench.WinMerge.md | 33 + docs/content/app/Bench.Yeoman.md | 35 + docs/content/app/Bench.Zeal.md | 31 + docs/content/app/Bench.cURL.md | 36 + docs/content/ref/apps.md | 938 +++-------------------- docs/src-content/ref/apps.md | 770 ------------------- 91 files changed, 3151 insertions(+), 1659 deletions(-) create mode 100644 docs/content/app/Bench.7z.md create mode 100644 docs/content/app/Bench.AntRenamer.md create mode 100644 docs/content/app/Bench.Apache.md create mode 100644 docs/content/app/Bench.Atom.md create mode 100644 docs/content/app/Bench.Blender.md create mode 100644 docs/content/app/Bench.Bower.md create mode 100644 docs/content/app/Bench.CMake.md create mode 100644 docs/content/app/Bench.Clang.md create mode 100644 docs/content/app/Bench.CoffeeScript.md create mode 100644 docs/content/app/Bench.ConEmu.md create mode 100644 docs/content/app/Bench.Dia.md create mode 100644 docs/content/app/Bench.DotNetCore.md create mode 100644 docs/content/app/Bench.EclipseCpp.md create mode 100644 docs/content/app/Bench.EclipseJava.md create mode 100644 docs/content/app/Bench.EclipsePHP.md create mode 100644 docs/content/app/Bench.Emacs.md create mode 100644 docs/content/app/Bench.Erlang.md create mode 100644 docs/content/app/Bench.FFmpeg.md create mode 100644 docs/content/app/Bench.FileZilla.md create mode 100644 docs/content/app/Bench.FreeCAD.md create mode 100644 docs/content/app/Bench.Gimp.md create mode 100644 docs/content/app/Bench.Git.md create mode 100644 docs/content/app/Bench.GitKraken.md create mode 100644 docs/content/app/Bench.GnuPG.md create mode 100644 docs/content/app/Bench.GnuTLS.md create mode 100644 docs/content/app/Bench.Go.md create mode 100644 docs/content/app/Bench.GraphicsMagick.md create mode 100644 docs/content/app/Bench.Graphviz.md create mode 100644 docs/content/app/Bench.Grunt.md create mode 100644 docs/content/app/Bench.Gulp.md create mode 100644 docs/content/app/Bench.Hugo.md create mode 100644 docs/content/app/Bench.IPython2.md create mode 100644 docs/content/app/Bench.IPython3.md create mode 100644 docs/content/app/Bench.Inkscape.md create mode 100644 docs/content/app/Bench.InnoUnp.md create mode 100644 docs/content/app/Bench.Iron.md create mode 100644 docs/content/app/Bench.JDK7.md create mode 100644 docs/content/app/Bench.JDK8.md create mode 100644 docs/content/app/Bench.JRE7.md create mode 100644 docs/content/app/Bench.JRE8.md create mode 100644 docs/content/app/Bench.JSHint.md create mode 100644 docs/content/app/Bench.JabRef.md create mode 100644 docs/content/app/Bench.Leiningen.md create mode 100644 docs/content/app/Bench.LessMsi.md create mode 100644 docs/content/app/Bench.LightTable.md create mode 100644 docs/content/app/Bench.Maven.md create mode 100644 docs/content/app/Bench.MeshLab.md create mode 100644 docs/content/app/Bench.MiKTeX.md create mode 100644 docs/content/app/Bench.MinGW.md create mode 100644 docs/content/app/Bench.MinGwGet.md create mode 100644 docs/content/app/Bench.MinGwGetGui.md create mode 100644 docs/content/app/Bench.MySQL.md create mode 100644 docs/content/app/Bench.MySQLWB.md create mode 100644 docs/content/app/Bench.NUnitRunners.md create mode 100644 docs/content/app/Bench.Node.md create mode 100644 docs/content/app/Bench.Npm.md create mode 100644 docs/content/app/Bench.NuGet.md create mode 100644 docs/content/app/Bench.OpenSSL.md create mode 100644 docs/content/app/Bench.PHP5.md create mode 100644 docs/content/app/Bench.PHP7.md create mode 100644 docs/content/app/Bench.Pandoc.md create mode 100644 docs/content/app/Bench.PostgreSQL.md create mode 100644 docs/content/app/Bench.Putty.md create mode 100644 docs/content/app/Bench.PyReadline2.md create mode 100644 docs/content/app/Bench.PyReadline3.md create mode 100644 docs/content/app/Bench.Python2.md create mode 100644 docs/content/app/Bench.Python3.md create mode 100644 docs/content/app/Bench.RabbitMQ.md create mode 100644 docs/content/app/Bench.Ruby.md create mode 100644 docs/content/app/Bench.RubyGems.md create mode 100644 docs/content/app/Bench.Sass.md create mode 100644 docs/content/app/Bench.Scribus.md create mode 100644 docs/content/app/Bench.Sift.md create mode 100644 docs/content/app/Bench.Spacemacs.md create mode 100644 docs/content/app/Bench.SublimeText3.md create mode 100644 docs/content/app/Bench.SysInternals.md create mode 100644 docs/content/app/Bench.TeXnicCenter.md create mode 100644 docs/content/app/Bench.VLC.md create mode 100644 docs/content/app/Bench.VSCode.md create mode 100644 docs/content/app/Bench.Vim.md create mode 100644 docs/content/app/Bench.VimConsole.md create mode 100644 docs/content/app/Bench.VimRT.md create mode 100644 docs/content/app/Bench.Wget.md create mode 100644 docs/content/app/Bench.WgetDeps.md create mode 100644 docs/content/app/Bench.WinMerge.md create mode 100644 docs/content/app/Bench.Yeoman.md create mode 100644 docs/content/app/Bench.Zeal.md create mode 100644 docs/content/app/Bench.cURL.md delete mode 100644 docs/src-content/ref/apps.md diff --git a/build/update-app-list.ps1 b/build/update-app-list.ps1 index c903de35..67fd8d70 100644 --- a/build/update-app-list.ps1 +++ b/build/update-app-list.ps1 @@ -1,13 +1,13 @@ $rootDir = [IO.Path]::GetDirectoryName([IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)) $scriptsDir = Resolve-Path "$rootDir\auto\lib" $docsDir = Resolve-Path "$rootDir\docs" -& "$scriptsDir\Load-ClrLibs.ps1" +. "$scriptsDir\bench.lib.ps1" $cfg = New-Object Mastersign.Bench.BenchConfiguration ($rootDir, $true, $false, $false) - $apps = $cfg.Apps -$targetFile = "$docsDir\src-content\ref\apps.md" +$targetFile = "$docsDir\content\ref\apps.md" +$targetDir = Empty-Dir "$docsDir\content\app" function GetFrontMatter($file) { @@ -35,63 +35,109 @@ function GetFrontMatter($file) return "" } -function WriteAppBlock($sb, $app) +function WriteAppFile($app, $no) { - $_ = $sb.AppendLine("### $($app.Label) {#$($app.ID)}") - $_ = $sb.AppendLine() - $_ = $sb.AppendLine("* ID: ``$($app.ID)``") - $_ = $sb.AppendLine("* Typ: ``$($app.Typ)``") - if ($app.Website) { $_ = $sb.AppendLine("* Website: <$($app.Website)>") } $version = $app.Version if (!$version) { $version = "latest" } - $_ = $sb.AppendLine("* Version: $version") - if ($app.Dependencies.Length -gt 0) + $ns = $app.Namespace + if (!$ns) { $ns = "(default)" } + $deps = $app.Dependencies + $resp = $app.Responsibilities + + $f = [IO.Path]::Combine($targetDir, $app.ID + ".md") + $w = New-Object System.IO.StreamWriter @($f, $false, [Text.Encoding]::UTF8) + $w.WriteLine("+++") + $w.WriteLine("date = `"$([DateTime]::Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK"))`"") + $w.WriteLine("title = `"$($app.Label)`"") + $w.WriteLine("weight = $no") + $w.WriteLine("app_lib = `"$($app.AppLibrary.ID)`"") + $w.WriteLine("app_category = `"$($app.Category)`"") + $w.WriteLine("app_ns = `"$ns`"") + $w.WriteLine("app_id = `"$($app.ID)`"") + $w.WriteLine("app_version = `"$version`"") + $w.WriteLine("+++") + $w.WriteLine() + $w.WriteLine("**ID:** ``$($app.ID)`` ") + $w.WriteLine("**Version:** $version ") + $w.WriteLine("") + if ($app.MarkdownDocumentation) { - [array]$deps = $app.Dependencies | % { + $w.WriteLine() + $w.WriteLine("## Description") + $w.WriteLine($app.MarkdownDocumentation) + } + $w.WriteLine() + $w.WriteLine("## Source") + $w.WriteLine() + $w.WriteLine("* Library: ``$($app.AppLibrary.ID)``") + $w.WriteLine("* Category: $($app.Category)") + $w.WriteLine("* Order Index: $no") + $w.WriteLine() + $w.WriteLine("## Properties") + $w.WriteLine() + $w.WriteLine("* Namespace: $ns") + $w.WriteLine("* Name: $($app.Name)") + $w.WriteLine("* Typ: ``$($app.Typ)``") + if ($app.Website) { $w.WriteLine("* Website: <$($app.Website)>") } + + if ($deps.Length -gt 0) + { + [array]$deps2 = $deps | % { $depApp = $apps[$_] - return "[$($depApp.Label)](#$_)" + return "[$($depApp.Label)](/app/$_)" + } + $depsList = [string]::Join(", ", $deps2) + $w.WriteLine("* Dependencies: $depsList") + } + if ($resp.Length -gt 0) + { + [array]$resp2 = $resp | % { + $respApp = $apps[$_] + return "[$($respApp.Label)](/app/$_)" } - $depsList = [string]::Join(", ", $deps) - $_ = $sb.AppendLine("* Dependencies: $depsList") + $respList = [string]::Join(", ", $resp2) + $w.WriteLine("* Responsibilities: $respList") } - $_ = $sb.AppendLine() + $w.WriteLine() + $w.Close() } -function WriteAppTable($sb, $label, $anchor) +function WriteAppTableHeader($sb) { - $_ = $sb.AppendLine("[**$label**](#$anchor)") - $_ = $sb.AppendLine() - $_ = $sb.AppendLine("") - $_ = $sb.AppendLine() + $_ = $sb.AppendLine("| Label | Version | Library | Category |") + $_ = $sb.AppendLine("|-------|---------|---------|----------|") +} + +function WriteAppTableRow($sb, $app) +{ + $id = $app.ID + $label = $app.Label + $version = $app.Version + if (!$version) { $version = "latest" } + $appLib = $app.AppLibrary.ID + $category = $app.Category + $_ = $sb.AppendLine("| [${label}](/app/${id}) | $version | ``$appLib`` | $category |") } -function WriteAppCategory($sb, $label, $anchor, $name) +$no = 0 +foreach ($app in $apps) { - $_ = $sb.AppendLine("## $label {#$anchor}") - $_ = $sb.AppendLine() - $apps.ByCategory($name) | Sort-Object -Property Label | % { WriteAppBlock $sb $_ } + $no++ + Write-Host "$($no.ToString("0000")) $($app.ID)" + WriteAppFile $app $no } +$sortedApps = $apps | sort { $_.Label } + $sb = New-Object System.Text.StringBuilder $_ = $sb.Append((GetFrontMatter $targetFile)) $_ = $sb.AppendLine() $_ = $sb.AppendLine("## Overview") $_ = $sb.AppendLine() -WriteAppTable $sb "Groups" "groups" -WriteAppTable $sb "Required Apps" "apps-required" -WriteAppTable $sb "Optional Apps" "apps-optional" - -WriteAppCategory $sb "Groups" "groups" "Groups" -WriteAppCategory $sb "Required Apps" "apps-required" "Required" -WriteAppCategory $sb "Optional Apps" "apps-optional" "Optional" - +WriteAppTableHeader $sb +foreach ($app in $sortedApps) +{ + WriteAppTableRow $sb $app +} +$_ = $sb.AppendLine() [IO.File]::WriteAllText($targetFile, $sb.ToString(), [Text.Encoding]::UTF8) diff --git a/docs/content/app/Bench.7z.md b/docs/content/app/Bench.7z.md new file mode 100644 index 00000000..2c5b4768 --- /dev/null +++ b/docs/content/app/Bench.7z.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "7-Zip" +weight = 2 +app_lib = "core" +app_category = "Required" +app_ns = "Bench" +app_id = "Bench.7z" +app_version = "16.04" ++++ + +**ID:** `Bench.7z` +**Version:** 16.04 + + +## Description +7-Zip is a file archiver with a high compression ratio. +It comes with a graphical file manager and supports a large range of compression formats for extraction. + +## Source + +* Library: `core` +* Category: Required +* Order Index: 2 + +## Properties + +* Namespace: Bench +* Name: 7z +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.AntRenamer.md b/docs/content/app/Bench.AntRenamer.md new file mode 100644 index 00000000..2092efa5 --- /dev/null +++ b/docs/content/app/Bench.AntRenamer.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Ant Renamer" +weight = 63 +app_lib = "default" +app_category = "Filesystem" +app_ns = "Bench" +app_id = "Bench.AntRenamer" +app_version = "latest" ++++ + +**ID:** `Bench.AntRenamer` +**Version:** latest + + +## Description +Ant Renamer is a free program that makes easier the renaming of lots of files and folders +by using specified settings. + +## Source + +* Library: `default` +* Category: Filesystem +* Order Index: 63 + +## Properties + +* Namespace: Bench +* Name: AntRenamer +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Apache.md b/docs/content/app/Bench.Apache.md new file mode 100644 index 00000000..0119dd82 --- /dev/null +++ b/docs/content/app/Bench.Apache.md @@ -0,0 +1,35 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Apache" +weight = 70 +app_lib = "default" +app_category = "Services" +app_ns = "Bench" +app_id = "Bench.Apache" +app_version = "2.4.23" ++++ + +**ID:** `Bench.Apache` +**Version:** 2.4.23 + + +## Description +The Apache HTTP Server is a secure, efficient and extensible server +that provides HTTP services in sync with the current HTTP standards. +The Apache HTTP Server is the most popular web server since over 20 years. + +This application needs the x86 version of the [Visual C++ 14 Redistributable](https://www.microsoft.com/download/details.aspx?id=48145) installed. + +## Source + +* Library: `default` +* Category: Services +* Order Index: 70 + +## Properties + +* Namespace: Bench +* Name: Apache +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Atom.md b/docs/content/app/Bench.Atom.md new file mode 100644 index 00000000..e470e2d5 --- /dev/null +++ b/docs/content/app/Bench.Atom.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Atom" +weight = 35 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.Atom" +app_version = "1.11.2" ++++ + +**ID:** `Bench.Atom` +**Version:** 1.11.2 + + +## Description +A hackable text editor for the 21st Century. + +_Hint: Install the `env-from-shell` package to make sure the Bench environment +is picked up from Atom._ + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 35 + +## Properties + +* Namespace: Bench +* Name: Atom +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Blender.md b/docs/content/app/Bench.Blender.md new file mode 100644 index 00000000..14e68c3a --- /dev/null +++ b/docs/content/app/Bench.Blender.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:12+01:00" +title = "Blender" +weight = 87 +app_lib = "default" +app_category = "3D Modeling" +app_ns = "Bench" +app_id = "Bench.Blender" +app_version = "2.78" ++++ + +**ID:** `Bench.Blender` +**Version:** 2.78 + + +## Description +Blender is the open source, cross platform suite of tools for 3D creation. + +## Source + +* Library: `default` +* Category: 3D Modeling +* Order Index: 87 + +## Properties + +* Namespace: Bench +* Name: Blender +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Bower.md b/docs/content/app/Bench.Bower.md new file mode 100644 index 00000000..4a68304c --- /dev/null +++ b/docs/content/app/Bench.Bower.md @@ -0,0 +1,37 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Bower" +weight = 49 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.Bower" +app_version = ">=1.7.0 <2.0.0" ++++ + +**ID:** `Bench.Bower` +**Version:** >=1.7.0 <2.0.0 + + +## Description +Web sites are made of lots of things — frameworks, libraries, assets, and utilities. +Bower manages all these things for you. + +Bower can manage components that contain HTML, CSS, JavaScript, fonts or even image files. +Bower doesn’t concatenate or minify code or do anything else - it just installs +the right versions of the packages you need and their dependencies. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 49 + +## Properties + +* Namespace: Bench +* Name: Bower +* Typ: `node-package` +* Website: +* Dependencies: [Git](/app/Bench.Git), [NPM](/app/Bench.Npm) + diff --git a/docs/content/app/Bench.CMake.md b/docs/content/app/Bench.CMake.md new file mode 100644 index 00000000..e46511b7 --- /dev/null +++ b/docs/content/app/Bench.CMake.md @@ -0,0 +1,41 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "CMake" +weight = 53 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.CMake" +app_version = "3.6.1" ++++ + +**ID:** `Bench.CMake` +**Version:** 3.6.1 + + +## Description +CMake is an open-source, cross-platform family of tools designed to build, +test and package software. CMake is used to control the software compilation process +using simple platform and compiler independent configuration files, and generate native +makefiles and workspaces that can be used in the compiler environment of your choice. +The suite of CMake tools were created by Kitware in response to the need for a powerful, +cross-platform build environment for open-source projects such as ITK and VTK. + +Usually you want to use this app with _MinGW_. + +To setup a C/C++ project with CMake and MinGW (`mingw32-make`), you have to activate the _MinGW_ app with the `mingw32-make` package. +Setup your project with a `CMakeLists.txt` file and run `cmake -G "MinGW Makefiles" ` to generate the `Makefile`. Run `cmake --build ` to compile the project. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 53 + +## Properties + +* Namespace: Bench +* Name: CMake +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Clang.md b/docs/content/app/Bench.Clang.md new file mode 100644 index 00000000..615b0ec9 --- /dev/null +++ b/docs/content/app/Bench.Clang.md @@ -0,0 +1,39 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "LLVM Clang" +weight = 31 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.Clang" +app_version = "3.8.1" ++++ + +**ID:** `Bench.Clang` +**Version:** 3.8.1 + + +## Description +The Clang compiler can act as drop-in replacement for the GCC compilers. + +This app sets the environment variables `CC` and `CXX` to inform _CMake_ +about the C/C++ compiler path. Therefore, if you build your C/C++ projects +with _CMake_, it is sufficient to just activate the _Clang_ app and _CMake_ +will use _Clang_ instead of the GCC compiler from _MinGW_. + +If you want to use the Clang compiler with Eclipse, you must manually +install the LLVM-Plugin for Eclipse CDT. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 31 + +## Properties + +* Namespace: Bench +* Name: Clang +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.CoffeeScript.md b/docs/content/app/Bench.CoffeeScript.md new file mode 100644 index 00000000..d6cf321e --- /dev/null +++ b/docs/content/app/Bench.CoffeeScript.md @@ -0,0 +1,29 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "CoffeeScript" +weight = 34 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.CoffeeScript" +app_version = ">=1.10.0 <2.0.0" ++++ + +**ID:** `Bench.CoffeeScript` +**Version:** >=1.10.0 <2.0.0 + + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 34 + +## Properties + +* Namespace: Bench +* Name: CoffeeScript +* Typ: `node-package` +* Website: +* Dependencies: [NPM](/app/Bench.Npm) + diff --git a/docs/content/app/Bench.ConEmu.md b/docs/content/app/Bench.ConEmu.md new file mode 100644 index 00000000..33ede74a --- /dev/null +++ b/docs/content/app/Bench.ConEmu.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "ConEmu" +weight = 4 +app_lib = "core" +app_category = "Required" +app_ns = "Bench" +app_id = "Bench.ConEmu" +app_version = "16.10.09a" ++++ + +**ID:** `Bench.ConEmu` +**Version:** 16.10.09a + + +## Description +ConEmu-Maximus5 is a Windows console emulator with tabs, which presents multiple consoles and simple GUI applications as one customizable GUI window with various features. + +## Source + +* Library: `core` +* Category: Required +* Order Index: 4 + +## Properties + +* Namespace: Bench +* Name: ConEmu +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Dia.md b/docs/content/app/Bench.Dia.md new file mode 100644 index 00000000..0573b9a7 --- /dev/null +++ b/docs/content/app/Bench.Dia.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Dia" +weight = 83 +app_lib = "default" +app_category = "Multimedia" +app_ns = "Bench" +app_id = "Bench.Dia" +app_version = "0.97.2" ++++ + +**ID:** `Bench.Dia` +**Version:** 0.97.2 + + +## Description +Dia is a program to draw structured diagrams. + +## Source + +* Library: `default` +* Category: Multimedia +* Order Index: 83 + +## Properties + +* Namespace: Bench +* Name: Dia +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.DotNetCore.md b/docs/content/app/Bench.DotNetCore.md new file mode 100644 index 00000000..ec404fa9 --- /dev/null +++ b/docs/content/app/Bench.DotNetCore.md @@ -0,0 +1,28 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = ".NET Core SDK" +weight = 27 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.DotNetCore" +app_version = "latest" ++++ + +**ID:** `Bench.DotNetCore` +**Version:** latest + + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 27 + +## Properties + +* Namespace: Bench +* Name: DotNetCore +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.EclipseCpp.md b/docs/content/app/Bench.EclipseCpp.md new file mode 100644 index 00000000..c1229da7 --- /dev/null +++ b/docs/content/app/Bench.EclipseCpp.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Eclipse for C++" +weight = 46 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.EclipseCpp" +app_version = "4.6" ++++ + +**ID:** `Bench.EclipseCpp` +**Version:** 4.6 + + +## Description +An IDE for C/C++ developers with Mylyn integration. + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 46 + +## Properties + +* Namespace: Bench +* Name: EclipseCpp +* Typ: `default` +* Website: +* Dependencies: [Java Runtime Environment 8](/app/Bench.JRE8) + diff --git a/docs/content/app/Bench.EclipseJava.md b/docs/content/app/Bench.EclipseJava.md new file mode 100644 index 00000000..e069ab74 --- /dev/null +++ b/docs/content/app/Bench.EclipseJava.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Eclipse for Java" +weight = 44 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.EclipseJava" +app_version = "4.6" ++++ + +**ID:** `Bench.EclipseJava` +**Version:** 4.6 + + +## Description +The essential tools for any Java developer, including a Java IDE, a Git client, +XML Editor, Mylyn, Maven and Gradle integration... + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 44 + +## Properties + +* Namespace: Bench +* Name: EclipseJava +* Typ: `default` +* Website: +* Dependencies: [Java Runtime Environment 8](/app/Bench.JRE8) + diff --git a/docs/content/app/Bench.EclipsePHP.md b/docs/content/app/Bench.EclipsePHP.md new file mode 100644 index 00000000..b6cfb5ae --- /dev/null +++ b/docs/content/app/Bench.EclipsePHP.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Eclipse for PHP" +weight = 45 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.EclipsePHP" +app_version = "4.6" ++++ + +**ID:** `Bench.EclipsePHP` +**Version:** 4.6 + + +## Description +The essential tools for any PHP developer, including PHP language support, +Git client, Mylyn and editors for JavaScript, HTML, CSS and... + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 45 + +## Properties + +* Namespace: Bench +* Name: EclipsePHP +* Typ: `default` +* Website: +* Dependencies: [Java Runtime Environment 8](/app/Bench.JRE8) + diff --git a/docs/content/app/Bench.Emacs.md b/docs/content/app/Bench.Emacs.md new file mode 100644 index 00000000..ac6c5e27 --- /dev/null +++ b/docs/content/app/Bench.Emacs.md @@ -0,0 +1,36 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Emacs" +weight = 38 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.Emacs" +app_version = "24.5" ++++ + +**ID:** `Bench.Emacs` +**Version:** 24.5 + + +## Description +An extensible, customizable, free text editor - and more. + +GNU Emacs at its core is an interpreter for Emacs Lisp, a dialect of the Lisp programming language +with extensions to support text editing. + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 38 + +## Properties + +* Namespace: Bench +* Name: Emacs +* Typ: `default` +* Website: +* Dependencies: [GNU TLS](/app/Bench.GnuTLS) +* Responsibilities: [Spacemacs](/app/Bench.Spacemacs) + diff --git a/docs/content/app/Bench.Erlang.md b/docs/content/app/Bench.Erlang.md new file mode 100644 index 00000000..22e073e0 --- /dev/null +++ b/docs/content/app/Bench.Erlang.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Erlang" +weight = 33 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.Erlang" +app_version = "19.0" ++++ + +**ID:** `Bench.Erlang` +**Version:** 19.0 + + +## Description +Erlang is a programming language used to build massively scalable soft real-time systems with requirements on high availability. Some of its uses are in telecoms, banking, e-commerce, computer telephony and instant messaging. Erlang's runtime system has built-in support for concurrency, distribution and fault tolerance. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 33 + +## Properties + +* Namespace: Bench +* Name: Erlang +* Typ: `default` +* Website: +* Responsibilities: [RabbitMQ](/app/Bench.RabbitMQ) + diff --git a/docs/content/app/Bench.FFmpeg.md b/docs/content/app/Bench.FFmpeg.md new file mode 100644 index 00000000..345f4556 --- /dev/null +++ b/docs/content/app/Bench.FFmpeg.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "FFmpeg" +weight = 80 +app_lib = "default" +app_category = "Multimedia" +app_ns = "Bench" +app_id = "Bench.FFmpeg" +app_version = "latest" ++++ + +**ID:** `Bench.FFmpeg` +**Version:** latest + + +## Description +FFmpeg is the leading multimedia framework, able to decode, encode, transcode, +mux, demux, stream, filter and play pretty much anything that humans and machines have created. +It supports the most obscure ancient formats up to the cutting edge. +No matter if they were designed by some standards committee, the community or a corporation. + +## Source + +* Library: `default` +* Category: Multimedia +* Order Index: 80 + +## Properties + +* Namespace: Bench +* Name: FFmpeg +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.FileZilla.md b/docs/content/app/Bench.FileZilla.md new file mode 100644 index 00000000..72f703b4 --- /dev/null +++ b/docs/content/app/Bench.FileZilla.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "FileZilla" +weight = 65 +app_lib = "default" +app_category = "Network" +app_ns = "Bench" +app_id = "Bench.FileZilla" +app_version = "3.20.1" ++++ + +**ID:** `Bench.FileZilla` +**Version:** 3.20.1 + + +## Description +FileZilla Client is a free, open source FTP client. It supports FTP, SFTP, and FTPS (FTP over SSL/TLS). + +## Source + +* Library: `default` +* Category: Network +* Order Index: 65 + +## Properties + +* Namespace: Bench +* Name: FileZilla +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.FreeCAD.md b/docs/content/app/Bench.FreeCAD.md new file mode 100644 index 00000000..858d0790 --- /dev/null +++ b/docs/content/app/Bench.FreeCAD.md @@ -0,0 +1,28 @@ ++++ +date = "2017-01-06T16:00:12+01:00" +title = "FreeCAD" +weight = 88 +app_lib = "default" +app_category = "3D Modeling" +app_ns = "Bench" +app_id = "Bench.FreeCAD" +app_version = "0.16" ++++ + +**ID:** `Bench.FreeCAD` +**Version:** 0.16 + + +## Source + +* Library: `default` +* Category: 3D Modeling +* Order Index: 88 + +## Properties + +* Namespace: Bench +* Name: FreeCAD +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Gimp.md b/docs/content/app/Bench.Gimp.md new file mode 100644 index 00000000..4413d121 --- /dev/null +++ b/docs/content/app/Bench.Gimp.md @@ -0,0 +1,35 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "GIMP" +weight = 85 +app_lib = "default" +app_category = "Multimedia" +app_ns = "Bench" +app_id = "Bench.Gimp" +app_version = "2.8.18" ++++ + +**ID:** `Bench.Gimp` +**Version:** 2.8.18 + + +## Description +The GNU Image Manipulation Program. + +GIMP is a cross-platform image editor. +Whether you are a graphic designer, photographer, illustrator, or scientist, +GIMP provides you with sophisticated tools to get your job done. + +## Source + +* Library: `default` +* Category: Multimedia +* Order Index: 85 + +## Properties + +* Namespace: Bench +* Name: Gimp +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Git.md b/docs/content/app/Bench.Git.md new file mode 100644 index 00000000..7825b641 --- /dev/null +++ b/docs/content/app/Bench.Git.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Git" +weight = 5 +app_lib = "core" +app_category = "Core" +app_ns = "Bench" +app_id = "Bench.Git" +app_version = "2.10.1" ++++ + +**ID:** `Bench.Git` +**Version:** 2.10.1 + + +## Description +Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. + +## Source + +* Library: `core` +* Category: Core +* Order Index: 5 + +## Properties + +* Namespace: Bench +* Name: Git +* Typ: `default` +* Website: +* Responsibilities: [Spacemacs](/app/Bench.Spacemacs), [Bower](/app/Bench.Bower) + diff --git a/docs/content/app/Bench.GitKraken.md b/docs/content/app/Bench.GitKraken.md new file mode 100644 index 00000000..c2ad67cd --- /dev/null +++ b/docs/content/app/Bench.GitKraken.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "GitKraken" +weight = 19 +app_lib = "default" +app_category = "Version Control" +app_ns = "Bench" +app_id = "Bench.GitKraken" +app_version = "latest" ++++ + +**ID:** `Bench.GitKraken` +**Version:** latest + + +## Description +The downright luxurious Git client, for Windows, Mac & Linux. + +No proxy support yet (Version 1.3.0). + +## Source + +* Library: `default` +* Category: Version Control +* Order Index: 19 + +## Properties + +* Namespace: Bench +* Name: GitKraken +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.GnuPG.md b/docs/content/app/Bench.GnuPG.md new file mode 100644 index 00000000..e3b91458 --- /dev/null +++ b/docs/content/app/Bench.GnuPG.md @@ -0,0 +1,35 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "GnuPG" +weight = 17 +app_lib = "default" +app_category = "Security" +app_ns = "Bench" +app_id = "Bench.GnuPG" +app_version = "2.0.30" ++++ + +**ID:** `Bench.GnuPG` +**Version:** 2.0.30 + + +## Description +GnuPG is a complete and free implementation of the OpenPGP standard as defined by RFC4880 (also known as PGP). +GnuPG allows to encrypt and sign your data and communication, features a versatile key management system +as well as access modules for all kinds of public key directories. +GnuPG, also known as GPG, is a command line tool with features for easy integration with other applications. + +## Source + +* Library: `default` +* Category: Security +* Order Index: 17 + +## Properties + +* Namespace: Bench +* Name: GnuPG +* Typ: `default` +* Website: +* Responsibilities: [Leiningen](/app/Bench.Leiningen), [Maven](/app/Bench.Maven) + diff --git a/docs/content/app/Bench.GnuTLS.md b/docs/content/app/Bench.GnuTLS.md new file mode 100644 index 00000000..e23b61c0 --- /dev/null +++ b/docs/content/app/Bench.GnuTLS.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "GNU TLS" +weight = 16 +app_lib = "default" +app_category = "Security" +app_ns = "Bench" +app_id = "Bench.GnuTLS" +app_version = "3.3.11" ++++ + +**ID:** `Bench.GnuTLS` +**Version:** 3.3.11 + + +## Description +The GnuTLS Transport Layer Security Library. + +## Source + +* Library: `default` +* Category: Security +* Order Index: 16 + +## Properties + +* Namespace: Bench +* Name: GnuTLS +* Typ: `default` +* Website: +* Responsibilities: [Emacs](/app/Bench.Emacs) + diff --git a/docs/content/app/Bench.Go.md b/docs/content/app/Bench.Go.md new file mode 100644 index 00000000..ecbe544e --- /dev/null +++ b/docs/content/app/Bench.Go.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Go" +weight = 32 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.Go" +app_version = "1.6" ++++ + +**ID:** `Bench.Go` +**Version:** 1.6 + + +## Description +Go is an open source programming language that makes it easy +to build simple, reliable, and efficient software. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 32 + +## Properties + +* Namespace: Bench +* Name: Go +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.GraphicsMagick.md b/docs/content/app/Bench.GraphicsMagick.md new file mode 100644 index 00000000..184e7ef7 --- /dev/null +++ b/docs/content/app/Bench.GraphicsMagick.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Graphics Magick" +weight = 79 +app_lib = "default" +app_category = "Multimedia" +app_ns = "Bench" +app_id = "Bench.GraphicsMagick" +app_version = "1.3.24" ++++ + +**ID:** `Bench.GraphicsMagick` +**Version:** 1.3.24 + + +## Description +GraphicsMagick is the swiss army knife of image processing. It provides a robust +and efficient collection of tools and libraries which support reading, writing, +and manipulating an image in over 88 major formats including important formats +like DPX, GIF, JPEG, JPEG-2000, PNG, PDF, PNM, and TIFF. + +## Source + +* Library: `default` +* Category: Multimedia +* Order Index: 79 + +## Properties + +* Namespace: Bench +* Name: GraphicsMagick +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Graphviz.md b/docs/content/app/Bench.Graphviz.md new file mode 100644 index 00000000..b91af84a --- /dev/null +++ b/docs/content/app/Bench.Graphviz.md @@ -0,0 +1,35 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Graphviz" +weight = 82 +app_lib = "default" +app_category = "Multimedia" +app_ns = "Bench" +app_id = "Bench.Graphviz" +app_version = "2.38" ++++ + +**ID:** `Bench.Graphviz` +**Version:** 2.38 + + +## Description +Graphviz is open source graph visualization software. +Graph visualization is a way of representing structural information as diagrams +of abstract graphs and networks. It has important applications in networking, +bioinformatics, software engineering, database and web design, machine learning, +and in visual interfaces for other technical domains. + +## Source + +* Library: `default` +* Category: Multimedia +* Order Index: 82 + +## Properties + +* Namespace: Bench +* Name: Graphviz +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Grunt.md b/docs/content/app/Bench.Grunt.md new file mode 100644 index 00000000..d975f92c --- /dev/null +++ b/docs/content/app/Bench.Grunt.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Grunt" +weight = 48 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.Grunt" +app_version = ">=0.4.5 <0.5.0" ++++ + +**ID:** `Bench.Grunt` +**Version:** >=0.4.5 <0.5.0 + + +## Description +The JavaScript Task Runner + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 48 + +## Properties + +* Namespace: Bench +* Name: Grunt +* Typ: `node-package` +* Website: +* Dependencies: [NPM](/app/Bench.Npm) + diff --git a/docs/content/app/Bench.Gulp.md b/docs/content/app/Bench.Gulp.md new file mode 100644 index 00000000..9482491a --- /dev/null +++ b/docs/content/app/Bench.Gulp.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Gulp" +weight = 47 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.Gulp" +app_version = ">=3.9.0 <4.0.0" ++++ + +**ID:** `Bench.Gulp` +**Version:** >=3.9.0 <4.0.0 + + +## Description +The streaming build system. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 47 + +## Properties + +* Namespace: Bench +* Name: Gulp +* Typ: `node-package` +* Website: +* Dependencies: [NPM](/app/Bench.Npm) + diff --git a/docs/content/app/Bench.Hugo.md b/docs/content/app/Bench.Hugo.md new file mode 100644 index 00000000..dc19feef --- /dev/null +++ b/docs/content/app/Bench.Hugo.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Hugo" +weight = 78 +app_lib = "default" +app_category = "Web" +app_ns = "Bench" +app_id = "Bench.Hugo" +app_version = "0.16" ++++ + +**ID:** `Bench.Hugo` +**Version:** 0.16 + + +## Description +A fast and modern static website engine. + +Hugo flexibly works with many formats and is ideal for blogs, docs, portfolios +and much more. Hugo’s speed fosters creativity and makes building a website fun again. + +## Source + +* Library: `default` +* Category: Web +* Order Index: 78 + +## Properties + +* Namespace: Bench +* Name: Hugo +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.IPython2.md b/docs/content/app/Bench.IPython2.md new file mode 100644 index 00000000..9ff437cd --- /dev/null +++ b/docs/content/app/Bench.IPython2.md @@ -0,0 +1,37 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "IPython 2" +weight = 57 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.IPython2" +app_version = "latest" ++++ + +**ID:** `Bench.IPython2` +**Version:** latest + + +## Description +IPython provides a rich architecture for computing with a powerful interactive shell. + +for Python 2: + + +for Python 3: + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 57 + +## Properties + +* Namespace: Bench +* Name: IPython2 +* Typ: `python2-package` +* Website: +* Dependencies: [PyReadline (Python 2)](/app/Bench.PyReadline2), [Python 2](/app/Bench.Python2) + diff --git a/docs/content/app/Bench.IPython3.md b/docs/content/app/Bench.IPython3.md new file mode 100644 index 00000000..0650d51d --- /dev/null +++ b/docs/content/app/Bench.IPython3.md @@ -0,0 +1,37 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "IPython 3" +weight = 58 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.IPython3" +app_version = "latest" ++++ + +**ID:** `Bench.IPython3` +**Version:** latest + + +## Description +IPython provides a rich architecture for computing with a powerful interactive shell. + +for Python 2: + + +for Python 3: + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 58 + +## Properties + +* Namespace: Bench +* Name: IPython3 +* Typ: `python3-package` +* Website: +* Dependencies: [PyReadline (Python 3)](/app/Bench.PyReadline3), [Python 3](/app/Bench.Python3) + diff --git a/docs/content/app/Bench.Inkscape.md b/docs/content/app/Bench.Inkscape.md new file mode 100644 index 00000000..3cd626d0 --- /dev/null +++ b/docs/content/app/Bench.Inkscape.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Inkscape" +weight = 84 +app_lib = "default" +app_category = "Multimedia" +app_ns = "Bench" +app_id = "Bench.Inkscape" +app_version = "0.91-1" ++++ + +**ID:** `Bench.Inkscape` +**Version:** 0.91-1 + + +## Description +Inkscape is a professional vector graphics editor for Windows, Mac OS X and Linux. +It's free and open source. + +## Source + +* Library: `default` +* Category: Multimedia +* Order Index: 84 + +## Properties + +* Namespace: Bench +* Name: Inkscape +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.InnoUnp.md b/docs/content/app/Bench.InnoUnp.md new file mode 100644 index 00000000..ac6d479d --- /dev/null +++ b/docs/content/app/Bench.InnoUnp.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Inno Setup Unpacker" +weight = 3 +app_lib = "core" +app_category = "Required" +app_ns = "Bench" +app_id = "Bench.InnoUnp" +app_version = "0.45" ++++ + +**ID:** `Bench.InnoUnp` +**Version:** 0.45 + + +## Description +A tool to extract the files from an Inno Setup executable. + +## Source + +* Library: `core` +* Category: Required +* Order Index: 3 + +## Properties + +* Namespace: Bench +* Name: InnoUnp +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Iron.md b/docs/content/app/Bench.Iron.md new file mode 100644 index 00000000..829fb645 --- /dev/null +++ b/docs/content/app/Bench.Iron.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "SWare Iron" +weight = 66 +app_lib = "default" +app_category = "Network" +app_ns = "Bench" +app_id = "Bench.Iron" +app_version = "latest" ++++ + +**ID:** `Bench.Iron` +**Version:** latest + + +## Description +A free portable derivative of Chromium, optimized for privacy. + +## Source + +* Library: `default` +* Category: Network +* Order Index: 66 + +## Properties + +* Namespace: Bench +* Name: Iron +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.JDK7.md b/docs/content/app/Bench.JDK7.md new file mode 100644 index 00000000..7e8194e4 --- /dev/null +++ b/docs/content/app/Bench.JDK7.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Java Development Kit 7" +weight = 24 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.JDK7" +app_version = "7u80" ++++ + +**ID:** `Bench.JDK7` +**Version:** 7u80 + + +## Description +According to Oracle, Java is the world's #1 programming language. + +The development kit is required for Java source code to get compiled. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 24 + +## Properties + +* Namespace: Bench +* Name: JDK7 +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.JDK8.md b/docs/content/app/Bench.JDK8.md new file mode 100644 index 00000000..09bc8c82 --- /dev/null +++ b/docs/content/app/Bench.JDK8.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Java Development Kit 8" +weight = 25 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.JDK8" +app_version = "112" ++++ + +**ID:** `Bench.JDK8` +**Version:** 112 + + +## Description +According to Oracle, Java is the world's #1 programming language. + +The development kit is required for Java source code to get compiled. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 25 + +## Properties + +* Namespace: Bench +* Name: JDK8 +* Typ: `default` +* Website: +* Responsibilities: [Leiningen](/app/Bench.Leiningen) + diff --git a/docs/content/app/Bench.JRE7.md b/docs/content/app/Bench.JRE7.md new file mode 100644 index 00000000..0e17f8d6 --- /dev/null +++ b/docs/content/app/Bench.JRE7.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Java Runtime Environment 7" +weight = 22 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.JRE7" +app_version = "7u80" ++++ + +**ID:** `Bench.JRE7` +**Version:** 7u80 + + +## Description +According to Oracle, Java is the world's #1 programming language. + +The runtime environment is required for a compiled Java program to get executed. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 22 + +## Properties + +* Namespace: Bench +* Name: JRE7 +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.JRE8.md b/docs/content/app/Bench.JRE8.md new file mode 100644 index 00000000..1dec5fdc --- /dev/null +++ b/docs/content/app/Bench.JRE8.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Java Runtime Environment 8" +weight = 23 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.JRE8" +app_version = "112" ++++ + +**ID:** `Bench.JRE8` +**Version:** 112 + + +## Description +According to Oracle, Java is the world's #1 programming language. + +The runtime environment is required for a compiled Java program to get executed. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 23 + +## Properties + +* Namespace: Bench +* Name: JRE8 +* Typ: `default` +* Website: +* Responsibilities: [Eclipse for Java](/app/Bench.EclipseJava), [Eclipse for PHP](/app/Bench.EclipsePHP), [Eclipse for C++](/app/Bench.EclipseCpp), [Maven](/app/Bench.Maven), [JabRef](/app/Bench.JabRef) + diff --git a/docs/content/app/Bench.JSHint.md b/docs/content/app/Bench.JSHint.md new file mode 100644 index 00000000..b8158814 --- /dev/null +++ b/docs/content/app/Bench.JSHint.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "JSHint" +weight = 54 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.JSHint" +app_version = ">=2.8.0 <3.0.0" ++++ + +**ID:** `Bench.JSHint` +**Version:** >=2.8.0 <3.0.0 + + +## Description +JSHint is a tool that helps to detect errors and potential problems in your JavaScript code. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 54 + +## Properties + +* Namespace: Bench +* Name: JSHint +* Typ: `node-package` +* Website: +* Dependencies: [NPM](/app/Bench.Npm) + diff --git a/docs/content/app/Bench.JabRef.md b/docs/content/app/Bench.JabRef.md new file mode 100644 index 00000000..03ef3607 --- /dev/null +++ b/docs/content/app/Bench.JabRef.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "JabRef" +weight = 74 +app_lib = "default" +app_category = "Writing" +app_ns = "Bench" +app_id = "Bench.JabRef" +app_version = "3.5" ++++ + +**ID:** `Bench.JabRef` +**Version:** 3.5 + + +## Description +JabRef is an open source bibliography reference manager. +The native file format used by JabRef is BibTeX, the standard LaTeX bibliography format. + +## Source + +* Library: `default` +* Category: Writing +* Order Index: 74 + +## Properties + +* Namespace: Bench +* Name: JabRef +* Typ: `default` +* Website: +* Dependencies: [Java Runtime Environment 8](/app/Bench.JRE8) + diff --git a/docs/content/app/Bench.Leiningen.md b/docs/content/app/Bench.Leiningen.md new file mode 100644 index 00000000..b8a94caa --- /dev/null +++ b/docs/content/app/Bench.Leiningen.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Leiningen" +weight = 26 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.Leiningen" +app_version = "latest" ++++ + +**ID:** `Bench.Leiningen` +**Version:** latest + + +## Description +Leiningen is the easiest way to use Clojure. +With a focus on project automation and declarative configuration, +it gets out of your way and lets you focus on your code. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 26 + +## Properties + +* Namespace: Bench +* Name: Leiningen +* Typ: `default` +* Website: +* Dependencies: [Java Development Kit 8](/app/Bench.JDK8), [GnuPG](/app/Bench.GnuPG), [Wget](/app/Bench.Wget) + diff --git a/docs/content/app/Bench.LessMsi.md b/docs/content/app/Bench.LessMsi.md new file mode 100644 index 00000000..c39b4755 --- /dev/null +++ b/docs/content/app/Bench.LessMsi.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Less MSIerables" +weight = 1 +app_lib = "core" +app_category = "Required" +app_ns = "Bench" +app_id = "Bench.LessMsi" +app_version = "1.3" ++++ + +**ID:** `Bench.LessMsi` +**Version:** 1.3 + + +## Description +A tool to view and extract the contents of a Windows Installer (.msi) file. + +## Source + +* Library: `core` +* Category: Required +* Order Index: 1 + +## Properties + +* Namespace: Bench +* Name: LessMsi +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.LightTable.md b/docs/content/app/Bench.LightTable.md new file mode 100644 index 00000000..87c3b582 --- /dev/null +++ b/docs/content/app/Bench.LightTable.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "LightTable" +weight = 43 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.LightTable" +app_version = "0.8.1" ++++ + +**ID:** `Bench.LightTable` +**Version:** 0.8.1 + + +## Description +The next generation code editor. + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 43 + +## Properties + +* Namespace: Bench +* Name: LightTable +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Maven.md b/docs/content/app/Bench.Maven.md new file mode 100644 index 00000000..2763282c --- /dev/null +++ b/docs/content/app/Bench.Maven.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Maven" +weight = 51 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.Maven" +app_version = "3.3.9" ++++ + +**ID:** `Bench.Maven` +**Version:** 3.3.9 + + +## Description +Apache Maven is a software project management and comprehension tool. +Based on the concept of a project object model (POM), Maven can manage a project's build, +reporting and documentation from a central piece of information. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 51 + +## Properties + +* Namespace: Bench +* Name: Maven +* Typ: `default` +* Website: +* Dependencies: [Java Runtime Environment 8](/app/Bench.JRE8), [GnuPG](/app/Bench.GnuPG) + diff --git a/docs/content/app/Bench.MeshLab.md b/docs/content/app/Bench.MeshLab.md new file mode 100644 index 00000000..bae1d710 --- /dev/null +++ b/docs/content/app/Bench.MeshLab.md @@ -0,0 +1,35 @@ ++++ +date = "2017-01-06T16:00:12+01:00" +title = "MeshLab" +weight = 86 +app_lib = "default" +app_category = "3D Modeling" +app_ns = "Bench" +app_id = "Bench.MeshLab" +app_version = "1.3.3" ++++ + +**ID:** `Bench.MeshLab` +**Version:** 1.3.3 + + +## Description +MeshLab is an open source, portable, and extensible system for the processing +and editing of unstructured 3D triangular meshes. +The system is aimed to help the processing of the typical not-so-small +unstructured models arising in 3D scanning, providing a set of tools for editing, +cleaning, healing, inspecting, rendering and converting this kind of meshes. + +## Source + +* Library: `default` +* Category: 3D Modeling +* Order Index: 86 + +## Properties + +* Namespace: Bench +* Name: MeshLab +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.MiKTeX.md b/docs/content/app/Bench.MiKTeX.md new file mode 100644 index 00000000..ba070e90 --- /dev/null +++ b/docs/content/app/Bench.MiKTeX.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "MiKTeX" +weight = 72 +app_lib = "default" +app_category = "Writing" +app_ns = "Bench" +app_id = "Bench.MiKTeX" +app_version = "2.9.5987" ++++ + +**ID:** `Bench.MiKTeX` +**Version:** 2.9.5987 + + +## Description +MiKTeX (pronounced mick-tech) is an up-to-date implementation of TeX/LaTeX +and related programs for Windows (all current variants). + +## Source + +* Library: `default` +* Category: Writing +* Order Index: 72 + +## Properties + +* Namespace: Bench +* Name: MiKTeX +* Typ: `default` +* Website: +* Responsibilities: [TeXnicCenter](/app/Bench.TeXnicCenter) + diff --git a/docs/content/app/Bench.MinGW.md b/docs/content/app/Bench.MinGW.md new file mode 100644 index 00000000..f00e2ab7 --- /dev/null +++ b/docs/content/app/Bench.MinGW.md @@ -0,0 +1,45 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "MinGW" +weight = 30 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.MinGW" +app_version = "0.6.2" ++++ + +**ID:** `Bench.MinGW` +**Version:** 0.6.2 + + +## Description +(http://www.mingw.org/) provides a GNU development environment for Windows, including compilers for C/C++, Objective-C, Fortran, Ada, ... + +The MinGW package manager MinGW Get: + + +Graphical user interface for MinGW Get: + + +Meta app MinGW with package manager and graphical user interface: + + +You can adapt the preselected MinGW packages by putting something like this in your `config\config.md`: + +```Markdown + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 30 + +## Properties + +* Namespace: Bench +* Name: MinGW +* Typ: `meta` +* Website: +* Dependencies: [MinGwGet](/app/Bench.MinGwGet), [MinGwGetGui](/app/Bench.MinGwGetGui) + diff --git a/docs/content/app/Bench.MinGwGet.md b/docs/content/app/Bench.MinGwGet.md new file mode 100644 index 00000000..82ab94ba --- /dev/null +++ b/docs/content/app/Bench.MinGwGet.md @@ -0,0 +1,45 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "MinGwGet" +weight = 28 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.MinGwGet" +app_version = "0.6.2" ++++ + +**ID:** `Bench.MinGwGet` +**Version:** 0.6.2 + + +## Description +(http://www.mingw.org/) provides a GNU development environment for Windows, including compilers for C/C++, Objective-C, Fortran, Ada, ... + +The MinGW package manager MinGW Get: + + +Graphical user interface for MinGW Get: + + +Meta app MinGW with package manager and graphical user interface: + + +You can adapt the preselected MinGW packages by putting something like this in your `config\config.md`: + +```Markdown + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 28 + +## Properties + +* Namespace: Bench +* Name: MinGwGet +* Typ: `default` +* Dependencies: [Wget](/app/Bench.Wget) +* Responsibilities: [MinGwGetGui](/app/Bench.MinGwGetGui), [MinGW](/app/Bench.MinGW) + diff --git a/docs/content/app/Bench.MinGwGetGui.md b/docs/content/app/Bench.MinGwGetGui.md new file mode 100644 index 00000000..9739d51d --- /dev/null +++ b/docs/content/app/Bench.MinGwGetGui.md @@ -0,0 +1,45 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "MinGwGetGui" +weight = 29 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.MinGwGetGui" +app_version = "0.6.2" ++++ + +**ID:** `Bench.MinGwGetGui` +**Version:** 0.6.2 + + +## Description +(http://www.mingw.org/) provides a GNU development environment for Windows, including compilers for C/C++, Objective-C, Fortran, Ada, ... + +The MinGW package manager MinGW Get: + + +Graphical user interface for MinGW Get: + + +Meta app MinGW with package manager and graphical user interface: + + +You can adapt the preselected MinGW packages by putting something like this in your `config\config.md`: + +```Markdown + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 29 + +## Properties + +* Namespace: Bench +* Name: MinGwGetGui +* Typ: `default` +* Dependencies: [MinGwGet](/app/Bench.MinGwGet) +* Responsibilities: [MinGW](/app/Bench.MinGW) + diff --git a/docs/content/app/Bench.MySQL.md b/docs/content/app/Bench.MySQL.md new file mode 100644 index 00000000..a12fa91e --- /dev/null +++ b/docs/content/app/Bench.MySQL.md @@ -0,0 +1,38 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "MySQL" +weight = 67 +app_lib = "default" +app_category = "Services" +app_ns = "Bench" +app_id = "Bench.MySQL" +app_version = "5.7.14" ++++ + +**ID:** `Bench.MySQL` +**Version:** 5.7.14 + + +## Description +According to Oracle: +MySQL Community Edition is the freely downloadable version +of the world's most popular open source database. + +The MySQL data is stored in `%USERPROFILE%\mysql_data`. +You can start the MySQL server by running `mysql_start` in the _Bench_ shell. +You can stop the MySQL server by running `mysql_stop` in the _Bench_ shell. +The initial password for _root_ is `bench`. + +## Source + +* Library: `default` +* Category: Services +* Order Index: 67 + +## Properties + +* Namespace: Bench +* Name: MySQL +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.MySQLWB.md b/docs/content/app/Bench.MySQLWB.md new file mode 100644 index 00000000..185aa559 --- /dev/null +++ b/docs/content/app/Bench.MySQLWB.md @@ -0,0 +1,36 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "MySQL Workbench" +weight = 68 +app_lib = "default" +app_category = "Services" +app_ns = "Bench" +app_id = "Bench.MySQLWB" +app_version = "6.3.7" ++++ + +**ID:** `Bench.MySQLWB` +**Version:** 6.3.7 + + +## Description +MySQL Workbench is a unified visual tool for database architects, developers, and DBAs. +MySQL Workbench provides data modeling, SQL development, and comprehensive administration +tools for server configuration, user administration, backup, and much more. + +This application needs the x86 version of the [Visual C++ 12 Redistributable](https://www.microsoft.com/download/details.aspx?id=40784), +and the [Microsoft.NET Framework 4.0 Client Profile](http://www.microsoft.com/download/details.aspx?id=17113) installed. + +## Source + +* Library: `default` +* Category: Services +* Order Index: 68 + +## Properties + +* Namespace: Bench +* Name: MySQLWB +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.NUnitRunners.md b/docs/content/app/Bench.NUnitRunners.md new file mode 100644 index 00000000..6df28c09 --- /dev/null +++ b/docs/content/app/Bench.NUnitRunners.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "NUnit 3 Runners" +weight = 52 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.NUnitRunners" +app_version = "latest" ++++ + +**ID:** `Bench.NUnitRunners` +**Version:** latest + + +## Description +NUnit is a unit-testing framework for all .Net languages. +The console runner `nunit3-console.exe` executes tests on the console. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 52 + +## Properties + +* Namespace: Bench +* Name: NUnitRunners +* Typ: `nuget-package` +* Website: +* Dependencies: [NuGet](/app/Bench.NuGet) + diff --git a/docs/content/app/Bench.Node.md b/docs/content/app/Bench.Node.md new file mode 100644 index 00000000..da84ff33 --- /dev/null +++ b/docs/content/app/Bench.Node.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Node.js" +weight = 6 +app_lib = "core" +app_category = "Core" +app_ns = "Bench" +app_id = "Bench.Node" +app_version = "6.9.2" ++++ + +**ID:** `Bench.Node` +**Version:** 6.9.2 + + +## Description +Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. +Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. +Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world. + +## Source + +* Library: `core` +* Category: Core +* Order Index: 6 + +## Properties + +* Namespace: Bench +* Name: Node +* Typ: `default` +* Website: +* Responsibilities: [NPM](/app/Bench.Npm) + diff --git a/docs/content/app/Bench.Npm.md b/docs/content/app/Bench.Npm.md new file mode 100644 index 00000000..91917423 --- /dev/null +++ b/docs/content/app/Bench.Npm.md @@ -0,0 +1,40 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "NPM" +weight = 7 +app_lib = "core" +app_category = "Core" +app_ns = "Bench" +app_id = "Bench.Npm" +app_version = ">=4.0.0 <5.0.0" ++++ + +**ID:** `Bench.Npm` +**Version:** >=4.0.0 <5.0.0 + + +## Description +npm is the package manager for JavaScript. +Find, share, and reuse packages of code from hundreds of thousands of +developers — and assemble them in powerful new ways. + +Because _Node.js_ is downloaded as bare executable, _NPM_ must be installed seperately. +But NPM, in its latest versions, is only distributed as part of the _Node.js_ setup. +_NPM_ 1.4.12 is the last version of _NPM_ which was released seperately. +Therefore, the latest version of _NPM_ is installed afterwards via the setup script `auto\apps\npm.setup.ps1`. + +## Source + +* Library: `core` +* Category: Core +* Order Index: 7 + +## Properties + +* Namespace: Bench +* Name: Npm +* Typ: `default` +* Website: +* Dependencies: [Node.js](/app/Bench.Node) +* Responsibilities: [CoffeeScript](/app/Bench.CoffeeScript), [Gulp](/app/Bench.Gulp), [Grunt](/app/Bench.Grunt), [Bower](/app/Bench.Bower), [Yeoman](/app/Bench.Yeoman), [JSHint](/app/Bench.JSHint) + diff --git a/docs/content/app/Bench.NuGet.md b/docs/content/app/Bench.NuGet.md new file mode 100644 index 00000000..0e28c238 --- /dev/null +++ b/docs/content/app/Bench.NuGet.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "NuGet" +weight = 12 +app_lib = "core" +app_category = "Core" +app_ns = "Bench" +app_id = "Bench.NuGet" +app_version = "latest" ++++ + +**ID:** `Bench.NuGet` +**Version:** latest + + +## Description +NuGet is the package manager for the Microsoft development platform including .NET. +The NuGet client tools provide the ability to produce and consume packages. +The NuGet Gallery is the central package repository used by all package authors and consumers. + +## Source + +* Library: `core` +* Category: Core +* Order Index: 12 + +## Properties + +* Namespace: Bench +* Name: NuGet +* Typ: `default` +* Website: +* Responsibilities: [NUnit 3 Runners](/app/Bench.NUnitRunners) + diff --git a/docs/content/app/Bench.OpenSSL.md b/docs/content/app/Bench.OpenSSL.md new file mode 100644 index 00000000..0af03b2f --- /dev/null +++ b/docs/content/app/Bench.OpenSSL.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "OpenSSL" +weight = 15 +app_lib = "default" +app_category = "Security" +app_ns = "Bench" +app_id = "Bench.OpenSSL" +app_version = "1.1.0c" ++++ + +**ID:** `Bench.OpenSSL` +**Version:** 1.1.0c + + +## Description +OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. +It is also a general-purpose cryptography library. + +## Source + +* Library: `default` +* Category: Security +* Order Index: 15 + +## Properties + +* Namespace: Bench +* Name: OpenSSL +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.PHP5.md b/docs/content/app/Bench.PHP5.md new file mode 100644 index 00000000..164eeb2c --- /dev/null +++ b/docs/content/app/Bench.PHP5.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "PHP 5" +weight = 20 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.PHP5" +app_version = "5.6.23" ++++ + +**ID:** `Bench.PHP5` +**Version:** 5.6.23 + + +## Description +PHP is a popular general-purpose scripting language that is especially suited to web development. +Fast, flexible and pragmatic, PHP powers everything from your blog to the most popular websites in the world. + +This application needs the x86 version of the [Visual C++ 11 Redistributable](https://www.microsoft.com/download/details.aspx?id=30679) installed. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 20 + +## Properties + +* Namespace: Bench +* Name: PHP5 +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.PHP7.md b/docs/content/app/Bench.PHP7.md new file mode 100644 index 00000000..e532cfa9 --- /dev/null +++ b/docs/content/app/Bench.PHP7.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "PHP 7" +weight = 21 +app_lib = "default" +app_category = "Platforms and Programming Languages" +app_ns = "Bench" +app_id = "Bench.PHP7" +app_version = "7.0.8" ++++ + +**ID:** `Bench.PHP7` +**Version:** 7.0.8 + + +## Description +PHP is a popular general-purpose scripting language that is especially suited to web development. +Fast, flexible and pragmatic, PHP powers everything from your blog to the most popular websites in the world. + +This application needs the x86 version of the [Visual C++ 14 Redistributable](https://www.microsoft.com/download/details.aspx?id=48145) installed. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 21 + +## Properties + +* Namespace: Bench +* Name: PHP7 +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Pandoc.md b/docs/content/app/Bench.Pandoc.md new file mode 100644 index 00000000..68141478 --- /dev/null +++ b/docs/content/app/Bench.Pandoc.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Pandoc" +weight = 73 +app_lib = "default" +app_category = "Writing" +app_ns = "Bench" +app_id = "Bench.Pandoc" +app_version = "1.17.2" ++++ + +**ID:** `Bench.Pandoc` +**Version:** 1.17.2 + + +## Description +Pandoc is a library and command-line tool for converting from one markup format to another. + +## Source + +* Library: `default` +* Category: Writing +* Order Index: 73 + +## Properties + +* Namespace: Bench +* Name: Pandoc +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.PostgreSQL.md b/docs/content/app/Bench.PostgreSQL.md new file mode 100644 index 00000000..2b4e7328 --- /dev/null +++ b/docs/content/app/Bench.PostgreSQL.md @@ -0,0 +1,41 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "PostgreSQL" +weight = 69 +app_lib = "default" +app_category = "Services" +app_ns = "Bench" +app_id = "Bench.PostgreSQL" +app_version = "9.5.3-1" ++++ + +**ID:** `Bench.PostgreSQL` +**Version:** 9.5.3-1 + + +## Description +PostgreSQL is a powerful, open source object-relational database system. +It has more than 15 years of active development and a proven architecture +that has earned it a strong reputation for reliability, data integrity, and correctness. +It is fully ACID compliant, has full support for foreign keys, joins, views, +triggers, and stored procedures (in multiple languages). +It also supports storage of binary large objects, including pictures, sounds, or video. +It has native programming interfaces for C/C++, Java, .Net, Perl, Python, +Ruby, Tcl, ODBC, among others + +Contains the _PostgreSQL Server_ and the management tool _pgAdminIII_. +The initial password for _postgres_ is `bench`. + +## Source + +* Library: `default` +* Category: Services +* Order Index: 69 + +## Properties + +* Namespace: Bench +* Name: PostgreSQL +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Putty.md b/docs/content/app/Bench.Putty.md new file mode 100644 index 00000000..53064fb4 --- /dev/null +++ b/docs/content/app/Bench.Putty.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Putty" +weight = 18 +app_lib = "default" +app_category = "Security" +app_ns = "Bench" +app_id = "Bench.Putty" +app_version = "latest" ++++ + +**ID:** `Bench.Putty` +**Version:** latest + + +## Description +PuTTY is a free (MIT-licensed) Win32 Telnet and SSH client. + +## Source + +* Library: `default` +* Category: Security +* Order Index: 18 + +## Properties + +* Namespace: Bench +* Name: Putty +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.PyReadline2.md b/docs/content/app/Bench.PyReadline2.md new file mode 100644 index 00000000..851f89b0 --- /dev/null +++ b/docs/content/app/Bench.PyReadline2.md @@ -0,0 +1,38 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "PyReadline (Python 2)" +weight = 55 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.PyReadline2" +app_version = "latest" ++++ + +**ID:** `Bench.PyReadline2` +**Version:** latest + + +## Description +Required for colors in IPython. + +for Python 2: + + +for Python 3: + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 55 + +## Properties + +* Namespace: Bench +* Name: PyReadline2 +* Typ: `python2-package` +* Website: +* Dependencies: [Python 2](/app/Bench.Python2) +* Responsibilities: [IPython 2](/app/Bench.IPython2) + diff --git a/docs/content/app/Bench.PyReadline3.md b/docs/content/app/Bench.PyReadline3.md new file mode 100644 index 00000000..7790fec2 --- /dev/null +++ b/docs/content/app/Bench.PyReadline3.md @@ -0,0 +1,38 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "PyReadline (Python 3)" +weight = 56 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.PyReadline3" +app_version = "latest" ++++ + +**ID:** `Bench.PyReadline3` +**Version:** latest + + +## Description +Required for colors in IPython. + +for Python 2: + + +for Python 3: + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 56 + +## Properties + +* Namespace: Bench +* Name: PyReadline3 +* Typ: `python3-package` +* Website: +* Dependencies: [Python 3](/app/Bench.Python3) +* Responsibilities: [IPython 3](/app/Bench.IPython3) + diff --git a/docs/content/app/Bench.Python2.md b/docs/content/app/Bench.Python2.md new file mode 100644 index 00000000..9b7e958a --- /dev/null +++ b/docs/content/app/Bench.Python2.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Python 2" +weight = 10 +app_lib = "core" +app_category = "Core" +app_ns = "Bench" +app_id = "Bench.Python2" +app_version = "2.7.12" ++++ + +**ID:** `Bench.Python2` +**Version:** 2.7.12 + + +## Description +Python is a programming language that lets you work quickly and integrate systems more effectively. + +## Source + +* Library: `core` +* Category: Core +* Order Index: 10 + +## Properties + +* Namespace: Bench +* Name: Python2 +* Typ: `default` +* Website: +* Responsibilities: [PyReadline (Python 2)](/app/Bench.PyReadline2), [IPython 2](/app/Bench.IPython2) + diff --git a/docs/content/app/Bench.Python3.md b/docs/content/app/Bench.Python3.md new file mode 100644 index 00000000..8960df30 --- /dev/null +++ b/docs/content/app/Bench.Python3.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Python 3" +weight = 11 +app_lib = "core" +app_category = "Core" +app_ns = "Bench" +app_id = "Bench.Python3" +app_version = "3.4.4" ++++ + +**ID:** `Bench.Python3` +**Version:** 3.4.4 + + +## Description +Python is a programming language that lets you work quickly and integrate systems more effectively. + +## Source + +* Library: `core` +* Category: Core +* Order Index: 11 + +## Properties + +* Namespace: Bench +* Name: Python3 +* Typ: `default` +* Website: +* Responsibilities: [PyReadline (Python 3)](/app/Bench.PyReadline3), [IPython 3](/app/Bench.IPython3) + diff --git a/docs/content/app/Bench.RabbitMQ.md b/docs/content/app/Bench.RabbitMQ.md new file mode 100644 index 00000000..0c2e430c --- /dev/null +++ b/docs/content/app/Bench.RabbitMQ.md @@ -0,0 +1,37 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "RabbitMQ" +weight = 71 +app_lib = "default" +app_category = "Services" +app_ns = "Bench" +app_id = "Bench.RabbitMQ" +app_version = "3.6.5" ++++ + +**ID:** `Bench.RabbitMQ` +**Version:** 3.6.5 + + +## Description +RabbitMQ is ... +Robust messaging for applications, +Easy to use, +Runs on all major operating systems, +Supports a huge number of developer platforms, +Open source and commercially supported + +## Source + +* Library: `default` +* Category: Services +* Order Index: 71 + +## Properties + +* Namespace: Bench +* Name: RabbitMQ +* Typ: `default` +* Website: +* Dependencies: [Erlang](/app/Bench.Erlang) + diff --git a/docs/content/app/Bench.Ruby.md b/docs/content/app/Bench.Ruby.md new file mode 100644 index 00000000..a7fed945 --- /dev/null +++ b/docs/content/app/Bench.Ruby.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Ruby" +weight = 8 +app_lib = "core" +app_category = "Core" +app_ns = "Bench" +app_id = "Bench.Ruby" +app_version = "2.3.1" ++++ + +**ID:** `Bench.Ruby` +**Version:** 2.3.1 + + +## Description +A dynamic, open source programming language with a focus on simplicity and productivity. +It has an elegant syntax that is natural to read and easy to write. + +## Source + +* Library: `core` +* Category: Core +* Order Index: 8 + +## Properties + +* Namespace: Bench +* Name: Ruby +* Typ: `default` +* Website: +* Responsibilities: [RubyGems](/app/Bench.RubyGems) + diff --git a/docs/content/app/Bench.RubyGems.md b/docs/content/app/Bench.RubyGems.md new file mode 100644 index 00000000..dd4152ed --- /dev/null +++ b/docs/content/app/Bench.RubyGems.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "RubyGems" +weight = 9 +app_lib = "core" +app_category = "Core" +app_ns = "Bench" +app_id = "Bench.RubyGems" +app_version = "2.6.8" ++++ + +**ID:** `Bench.RubyGems` +**Version:** 2.6.8 + + +## Description +RubyGems is a package management framework for Ruby. + +## Source + +* Library: `core` +* Category: Core +* Order Index: 9 + +## Properties + +* Namespace: Bench +* Name: RubyGems +* Typ: `default` +* Website: +* Dependencies: [Ruby](/app/Bench.Ruby) +* Responsibilities: [SASS](/app/Bench.Sass) + diff --git a/docs/content/app/Bench.Sass.md b/docs/content/app/Bench.Sass.md new file mode 100644 index 00000000..a77f760a --- /dev/null +++ b/docs/content/app/Bench.Sass.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "SASS" +weight = 77 +app_lib = "default" +app_category = "Web" +app_ns = "Bench" +app_id = "Bench.Sass" +app_version = "latest" ++++ + +**ID:** `Bench.Sass` +**Version:** latest + + +## Description +Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. + +## Source + +* Library: `default` +* Category: Web +* Order Index: 77 + +## Properties + +* Namespace: Bench +* Name: Sass +* Typ: `ruby-package` +* Website: +* Dependencies: [RubyGems](/app/Bench.RubyGems) + diff --git a/docs/content/app/Bench.Scribus.md b/docs/content/app/Bench.Scribus.md new file mode 100644 index 00000000..57bf6441 --- /dev/null +++ b/docs/content/app/Bench.Scribus.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Scribus" +weight = 76 +app_lib = "default" +app_category = "Writing" +app_ns = "Bench" +app_id = "Bench.Scribus" +app_version = "1.4.6" ++++ + +**ID:** `Bench.Scribus` +**Version:** 1.4.6 + + +## Description +Scribus is a page layout program, available for a lot of operating systems. +Since its humble beginning in the spring of 2001, Scribus has evolved into +one of the premier Open Source desktop applications. + +## Source + +* Library: `default` +* Category: Writing +* Order Index: 76 + +## Properties + +* Namespace: Bench +* Name: Scribus +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Sift.md b/docs/content/app/Bench.Sift.md new file mode 100644 index 00000000..60fb752f --- /dev/null +++ b/docs/content/app/Bench.Sift.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Sift" +weight = 61 +app_lib = "default" +app_category = "Filesystem" +app_ns = "Bench" +app_id = "Bench.Sift" +app_version = "0.8.0" ++++ + +**ID:** `Bench.Sift` +**Version:** 0.8.0 + + +## Description +Sift - grep on steroids. A fast and powerful alternative to grep. + +## Source + +* Library: `default` +* Category: Filesystem +* Order Index: 61 + +## Properties + +* Namespace: Bench +* Name: Sift +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Spacemacs.md b/docs/content/app/Bench.Spacemacs.md new file mode 100644 index 00000000..d0ace997 --- /dev/null +++ b/docs/content/app/Bench.Spacemacs.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Spacemacs" +weight = 39 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.Spacemacs" +app_version = "latest" ++++ + +**ID:** `Bench.Spacemacs` +**Version:** latest + + +## Description +The best editor is neither Emacs nor Vim, it's Emacs and Vim! + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 39 + +## Properties + +* Namespace: Bench +* Name: Spacemacs +* Typ: `meta` +* Website: +* Dependencies: [Git](/app/Bench.Git), [Emacs](/app/Bench.Emacs) + diff --git a/docs/content/app/Bench.SublimeText3.md b/docs/content/app/Bench.SublimeText3.md new file mode 100644 index 00000000..bb0eaebe --- /dev/null +++ b/docs/content/app/Bench.SublimeText3.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Sublime Text 3" +weight = 37 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.SublimeText3" +app_version = "Build 3126" ++++ + +**ID:** `Bench.SublimeText3` +**Version:** Build 3126 + + +## Description +Sublime Text is a sophisticated text editor for code, markup and prose. +You'll love the slick user interface, extraordinary features and amazing performance. + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 37 + +## Properties + +* Namespace: Bench +* Name: SublimeText3 +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.SysInternals.md b/docs/content/app/Bench.SysInternals.md new file mode 100644 index 00000000..421c0e9f --- /dev/null +++ b/docs/content/app/Bench.SysInternals.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "SysInternals" +weight = 60 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.SysInternals" +app_version = "latest" ++++ + +**ID:** `Bench.SysInternals` +**Version:** latest + + +## Description +A collection of tools by Mark Russinovich, to inspect and investigate +the Microsoft Windows operating systems and its processes. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 60 + +## Properties + +* Namespace: Bench +* Name: SysInternals +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.TeXnicCenter.md b/docs/content/app/Bench.TeXnicCenter.md new file mode 100644 index 00000000..8a4c6761 --- /dev/null +++ b/docs/content/app/Bench.TeXnicCenter.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "TeXnicCenter" +weight = 75 +app_lib = "default" +app_category = "Writing" +app_ns = "Bench" +app_id = "Bench.TeXnicCenter" +app_version = "2.02" ++++ + +**ID:** `Bench.TeXnicCenter` +**Version:** 2.02 + + +## Description +Premium LaTeX Editing for Windows. + +## Source + +* Library: `default` +* Category: Writing +* Order Index: 75 + +## Properties + +* Namespace: Bench +* Name: TeXnicCenter +* Typ: `default` +* Website: +* Dependencies: [MiKTeX](/app/Bench.MiKTeX) + diff --git a/docs/content/app/Bench.VLC.md b/docs/content/app/Bench.VLC.md new file mode 100644 index 00000000..9e07cd9c --- /dev/null +++ b/docs/content/app/Bench.VLC.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "VLC Player" +weight = 81 +app_lib = "default" +app_category = "Multimedia" +app_ns = "Bench" +app_id = "Bench.VLC" +app_version = "2.2.4" ++++ + +**ID:** `Bench.VLC` +**Version:** 2.2.4 + + +## Description +VLC is a free and open source cross-platform multimedia player and framework +that plays most multimedia files, and various streaming protocols. + +## Source + +* Library: `default` +* Category: Multimedia +* Order Index: 81 + +## Properties + +* Namespace: Bench +* Name: VLC +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.VSCode.md b/docs/content/app/Bench.VSCode.md new file mode 100644 index 00000000..a9c23410 --- /dev/null +++ b/docs/content/app/Bench.VSCode.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Visual Studio Code" +weight = 36 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.VSCode" +app_version = "latest" ++++ + +**ID:** `Bench.VSCode` +**Version:** latest + + +## Description +A cross platform code editor from Microsoft. + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 36 + +## Properties + +* Namespace: Bench +* Name: VSCode +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Vim.md b/docs/content/app/Bench.Vim.md new file mode 100644 index 00000000..58d569d9 --- /dev/null +++ b/docs/content/app/Bench.Vim.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Vim" +weight = 42 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.Vim" +app_version = "7.4" ++++ + +**ID:** `Bench.Vim` +**Version:** 7.4 + + +## Description +Vim is a highly configurable text editor built to enable efficient text editing. +It is an improved version of the vi editor distributed with most UNIX systems. + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 42 + +## Properties + +* Namespace: Bench +* Name: Vim +* Typ: `default` +* Website: +* Dependencies: [VimRT](/app/Bench.VimRT), [VimConsole](/app/Bench.VimConsole) + diff --git a/docs/content/app/Bench.VimConsole.md b/docs/content/app/Bench.VimConsole.md new file mode 100644 index 00000000..baef6709 --- /dev/null +++ b/docs/content/app/Bench.VimConsole.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "VimConsole" +weight = 41 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.VimConsole" +app_version = "7.4" ++++ + +**ID:** `Bench.VimConsole` +**Version:** 7.4 + + +## Description +Vim is a highly configurable text editor built to enable efficient text editing. +It is an improved version of the vi editor distributed with most UNIX systems. + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 41 + +## Properties + +* Namespace: Bench +* Name: VimConsole +* Typ: `default` +* Dependencies: [VimRT](/app/Bench.VimRT) +* Responsibilities: [Vim](/app/Bench.Vim) + diff --git a/docs/content/app/Bench.VimRT.md b/docs/content/app/Bench.VimRT.md new file mode 100644 index 00000000..73e2605f --- /dev/null +++ b/docs/content/app/Bench.VimRT.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "VimRT" +weight = 40 +app_lib = "default" +app_category = "Editors" +app_ns = "Bench" +app_id = "Bench.VimRT" +app_version = "7.4" ++++ + +**ID:** `Bench.VimRT` +**Version:** 7.4 + + +## Description +Vim is a highly configurable text editor built to enable efficient text editing. +It is an improved version of the vi editor distributed with most UNIX systems. + +## Source + +* Library: `default` +* Category: Editors +* Order Index: 40 + +## Properties + +* Namespace: Bench +* Name: VimRT +* Typ: `default` +* Responsibilities: [VimConsole](/app/Bench.VimConsole), [Vim](/app/Bench.Vim) + diff --git a/docs/content/app/Bench.Wget.md b/docs/content/app/Bench.Wget.md new file mode 100644 index 00000000..54c78594 --- /dev/null +++ b/docs/content/app/Bench.Wget.md @@ -0,0 +1,34 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "Wget" +weight = 13 +app_lib = "core" +app_category = "Basics" +app_ns = "Bench" +app_id = "Bench.Wget" +app_version = "1.11.4-1" ++++ + +**ID:** `Bench.Wget` +**Version:** 1.11.4-1 + + +## Description +GNU Wget is a free utility for non-interactive download of files from the Web. +It supports HTTP, HTTPS, and FTP protocols, as well as retrieval through HTTP proxies. + +## Source + +* Library: `core` +* Category: Basics +* Order Index: 13 + +## Properties + +* Namespace: Bench +* Name: Wget +* Typ: `default` +* Website: +* Dependencies: [WgetDeps](/app/Bench.WgetDeps) +* Responsibilities: [Leiningen](/app/Bench.Leiningen), [MinGwGet](/app/Bench.MinGwGet) + diff --git a/docs/content/app/Bench.WgetDeps.md b/docs/content/app/Bench.WgetDeps.md new file mode 100644 index 00000000..463db343 --- /dev/null +++ b/docs/content/app/Bench.WgetDeps.md @@ -0,0 +1,32 @@ ++++ +date = "2017-01-06T16:00:10+01:00" +title = "WgetDeps" +weight = 14 +app_lib = "core" +app_category = "Basics" +app_ns = "Bench" +app_id = "Bench.WgetDeps" +app_version = "1.11.4-1" ++++ + +**ID:** `Bench.WgetDeps` +**Version:** 1.11.4-1 + + +## Description +GNU Wget is a free utility for non-interactive download of files from the Web. +It supports HTTP, HTTPS, and FTP protocols, as well as retrieval through HTTP proxies. + +## Source + +* Library: `core` +* Category: Basics +* Order Index: 14 + +## Properties + +* Namespace: Bench +* Name: WgetDeps +* Typ: `default` +* Responsibilities: [Wget](/app/Bench.Wget) + diff --git a/docs/content/app/Bench.WinMerge.md b/docs/content/app/Bench.WinMerge.md new file mode 100644 index 00000000..a5836c0c --- /dev/null +++ b/docs/content/app/Bench.WinMerge.md @@ -0,0 +1,33 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "WinMerge" +weight = 62 +app_lib = "default" +app_category = "Filesystem" +app_ns = "Bench" +app_id = "Bench.WinMerge" +app_version = "2.14.0" ++++ + +**ID:** `Bench.WinMerge` +**Version:** 2.14.0 + + +## Description +WinMerge is an Open Source differencing and merging tool for Windows. +WinMerge can compare both folders and files, presenting differences in a visual text format +that is easy to understand and handle. + +## Source + +* Library: `default` +* Category: Filesystem +* Order Index: 62 + +## Properties + +* Namespace: Bench +* Name: WinMerge +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.Yeoman.md b/docs/content/app/Bench.Yeoman.md new file mode 100644 index 00000000..70e3d472 --- /dev/null +++ b/docs/content/app/Bench.Yeoman.md @@ -0,0 +1,35 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Yeoman" +weight = 50 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.Yeoman" +app_version = ">=1.5.0 <2.0.0" ++++ + +**ID:** `Bench.Yeoman` +**Version:** >=1.5.0 <2.0.0 + + +## Description +The web's scaffolding tool for modern webapps. + +Yeoman helps you to kickstart new projects, prescribing best practices and tools +to help you stay productive. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 50 + +## Properties + +* Namespace: Bench +* Name: Yeoman +* Typ: `node-package` +* Website: +* Dependencies: [NPM](/app/Bench.Npm) + diff --git a/docs/content/app/Bench.Zeal.md b/docs/content/app/Bench.Zeal.md new file mode 100644 index 00000000..c2ccf241 --- /dev/null +++ b/docs/content/app/Bench.Zeal.md @@ -0,0 +1,31 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "Zeal Docs" +weight = 59 +app_lib = "default" +app_category = "Software Development Utilities" +app_ns = "Bench" +app_id = "Bench.Zeal" +app_version = "0.2.1" ++++ + +**ID:** `Bench.Zeal` +**Version:** 0.2.1 + + +## Description +An offline documentation browser inspired by [Dash](https://kapeli.com/dash/). + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 59 + +## Properties + +* Namespace: Bench +* Name: Zeal +* Typ: `default` +* Website: + diff --git a/docs/content/app/Bench.cURL.md b/docs/content/app/Bench.cURL.md new file mode 100644 index 00000000..fa17954e --- /dev/null +++ b/docs/content/app/Bench.cURL.md @@ -0,0 +1,36 @@ ++++ +date = "2017-01-06T16:00:11+01:00" +title = "cURL" +weight = 64 +app_lib = "default" +app_category = "Network" +app_ns = "Bench" +app_id = "Bench.cURL" +app_version = "7.50.1" ++++ + +**ID:** `Bench.cURL` +**Version:** 7.50.1 + + +## Description +curl is an open source command line tool and library for transferring data with URL syntax, +supporting DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, +RTMP, RTSP, SCP, SFTP, SMB, SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, +HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, HTTP/2, cookies, +user+password authentication (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos), +file transfer resume, proxy tunneling and more. + +## Source + +* Library: `default` +* Category: Network +* Order Index: 64 + +## Properties + +* Namespace: Bench +* Name: cURL +* Typ: `default` +* Website: + diff --git a/docs/content/ref/apps.md b/docs/content/ref/apps.md index fb6be760..e2c993df 100644 --- a/docs/content/ref/apps.md +++ b/docs/content/ref/apps.md @@ -1,4 +1,4 @@ -+++ ++++ date = "2016-06-22T13:44:20+02:00" description = "A list with all included apps and app groups" draft = true @@ -8,850 +8,94 @@ weight = 1 ## Overview -[**Groups**](#groups) - -| ID | Name | -|----|------| -| `Dev3D` | [3D Modeling](#Dev3D) | -| `DevCpp` | [C++ Development](#DevCpp) | -| `DevClojure` | [Clojure Development](#DevClojure) | -| `DevJava` | [Java Development](#DevJava) | -| `LaTeX` | [LaTeX Writing](#LaTeX) | -| `Markdown` | [Markdown](#Markdown) | -| `Multimedia` | [Multimedia](#Multimedia) | -| `DevPython2` | [Python 2 Development](#DevPython2) | -| `DevPython3` | [Python 3 Development](#DevPython3) | -| `WebDevPHP5` | [Web Development with PHP 5](#WebDevPHP5) | -| `WebDevPHP7` | [Web Development with PHP 7](#WebDevPHP7) | - -[**Required Apps**](#apps-required) - -| ID | Name | Version | Website | -|----|------|---------|---------| -| `7z` | [7-Zip](#7z) | 16.04 | | -| `ConEmu` | [ConEmu](#ConEmu) | 16.10.09a | | -| `InnoUnp` | [Inno Setup Unpacker](#InnoUnp) | 0.45 | | -| `LessMsi` | [Less MSIerables](#LessMsi) | 1.3 | | - -[**Optional Apps**](#apps-optional) - -| ID | Name | Version | Website | -|----|------|---------|---------| -| `dotnet` | [.NET Core SDK](#dotnet) | latest | | -| `AntRenamer` | [Ant Renamer](#AntRenamer) | latest | | -| `Apache` | [Apache](#Apache) | 2.4.23 | | -| `Atom` | [Atom](#Atom) | 1.11.2 | | -| `Blender` | [Blender](#Blender) | 2.78 | | -| `Bower` | [Bower](#Bower) | >=1.7.0 <2.0.0 | | -| `CMake` | [CMake](#CMake) | 3.6.1 | | -| `CoffeeScript` | [CoffeeScript](#CoffeeScript) | >=1.10.0 <2.0.0 | | -| `cURL` | [cURL](#cURL) | 7.50.1 | | -| `Dia` | [Dia](#Dia) | 0.97.2 | | -| `EclipseCpp` | [Eclipse for C++](#EclipseCpp) | 4.6 | | -| `EclipseJava` | [Eclipse for Java](#EclipseJava) | 4.6 | | -| `EclipsePHP` | [Eclipse for PHP](#EclipsePHP) | 4.6 | | -| `Emacs` | [Emacs](#Emacs) | 24.5 | | -| `Erlang` | [Erlang](#Erlang) | 19.0 | | -| `FFmpeg` | [FFmpeg](#FFmpeg) | latest | | -| `FileZilla` | [FileZilla](#FileZilla) | 3.20.1 | | -| `FreeCAD` | [FreeCAD](#FreeCAD) | 0.16 | | -| `Gimp` | [GIMP](#Gimp) | 2.8.18 | | -| `Git` | [Git](#Git) | 2.10.1 | | -| `GitKraken` | [GitKraken](#GitKraken) | latest | | -| `GnuTLS` | [GNU TLS](#GnuTLS) | 3.3.11 | | -| `GnuPG` | [GnuPG](#GnuPG) | 2.0.30 | | -| `Go` | [Go](#Go) | 1.6 | | -| `GraphicsMagick` | [Graphics Magick](#GraphicsMagick) | 1.3.24 | | -| `Graphviz` | [Graphviz](#Graphviz) | 2.38 | | -| `Grunt` | [Grunt](#Grunt) | >=0.4.5 <0.5.0 | | -| `Gulp` | [Gulp](#Gulp) | >=3.9.0 <4.0.0 | | -| `Hugo` | [Hugo](#Hugo) | 0.16 | | -| `Inkscape` | [Inkscape](#Inkscape) | 0.91-1 | | -| `IPython2` | [IPython 2](#IPython2) | latest | | -| `IPython3` | [IPython 3](#IPython3) | latest | | -| `JabRef` | [JabRef](#JabRef) | 3.5 | | -| `JDK7` | [Java Development Kit 7](#JDK7) | 7u80 | | -| `JDK8` | [Java Development Kit 8](#JDK8) | 112 | | -| `JRE7` | [Java Runtime Environment 7](#JRE7) | 7u80 | | -| `JRE8` | [Java Runtime Environment 8](#JRE8) | 112 | | -| `JSHint` | [JSHint](#JSHint) | >=2.8.0 <3.0.0 | | -| `Leiningen` | [Leiningen](#Leiningen) | latest | | -| `LightTable` | [LightTable](#LightTable) | 0.8.1 | | -| `Clang` | [LLVM Clang](#Clang) | 3.8.1 | | -| `Maven` | [Maven](#Maven) | 3.3.9 | | -| `MeshLab` | [MeshLab](#MeshLab) | 1.3.3 | | -| `MiKTeX` | [MiKTeX](#MiKTeX) | 2.9.5987 | | -| `MinGW` | [MinGW](#MinGW) | latest | | -| `MinGwGet` | [MinGwGet](#MinGwGet) | 0.6.2 | | -| `MinGwGetGui` | [MinGwGetGui](#MinGwGetGui) | latest | | -| `MySQL` | [MySQL](#MySQL) | 5.7.14 | | -| `MySQLWB` | [MySQL Workbench](#MySQLWB) | 6.3.7 | | -| `Node` | [Node.js](#Node) | 6.9.0 | | -| `Npm` | [NPM](#Npm) | >=3.7.0 <4.0.0 | | -| `NuGet` | [NuGet](#NuGet) | latest | | -| `NUnit.Runners` | [NUnit 3 Runners](#NUnit.Runners) | latest | | -| `OpenSSL` | [OpenSSL](#OpenSSL) | 1.1.0c | | -| `Pandoc` | [Pandoc](#Pandoc) | 1.17.2 | | -| `PHP5` | [PHP 5](#PHP5) | 5.6.23 | | -| `PHP7` | [PHP 7](#PHP7) | 7.0.8 | | -| `PostgreSQL` | [PostgreSQL](#PostgreSQL) | 9.5.3-1 | | -| `Putty` | [Putty](#Putty) | latest | | -| `PyReadline2` | [PyReadline (Python 2)](#PyReadline2) | latest | | -| `PyReadline3` | [PyReadline (Python 3)](#PyReadline3) | latest | | -| `Python2` | [Python 2](#Python2) | 2.7.12 | | -| `Python3` | [Python 3](#Python3) | 3.4.4 | | -| `RabbitMQ` | [RabbitMQ](#RabbitMQ) | 3.6.5 | | -| `Ruby` | [Ruby](#Ruby) | 2.3.1 | | -| `RubyGems` | [RubyGems](#RubyGems) | 2.6.8 | | -| `Sass` | [SASS](#Sass) | latest | | -| `Scribus` | [Scribus](#Scribus) | 1.4.6 | | -| `Sift` | [Sift](#Sift) | 0.8.0 | | -| `Spacemacs` | [Spacemacs](#Spacemacs) | latest | | -| `SublimeText3` | [Sublime Text 3](#SublimeText3) | Build 3126 | | -| `Iron` | [SWare Iron](#Iron) | latest | | -| `SysInternals` | [SysInternals](#SysInternals) | latest | | -| `TeXnicCenter` | [TeXnicCenter](#TeXnicCenter) | 2.02 | | -| `Vim` | [Vim](#Vim) | 7.4 | | -| `VimConsole` | [VimConsole](#VimConsole) | 7.4 | | -| `VimRT` | [VimRT](#VimRT) | 7.4 | | -| `VSCode` | [Visual Studio Code](#VSCode) | latest | | -| `VLC` | [VLC Player](#VLC) | 2.2.4 | | -| `Wget` | [Wget](#Wget) | 1.11.4-1 | | -| `WgetDeps` | [WgetDeps](#WgetDeps) | 1.11.4-1 | | -| `WinMerge` | [WinMerge](#WinMerge) | 2.14.0 | | -| `Yeoman` | [Yeoman](#Yeoman) | >=1.5.0 <2.0.0 | | -| `MdProc` | [Yeoman Generator for Markdown Projects](#MdProc) | >=0.1.6 <0.2.0 | | -| `Zeal` | [Zeal Docs](#Zeal) | 0.2.1 | | - -## Groups {#groups} - -### 3D Modeling {#Dev3D} - -* ID: `Dev3D` -* Typ: `meta` -* Version: latest -* Dependencies: [Blender](#Blender), [FreeCAD](#FreeCAD), [MeshLab](#MeshLab), [GIMP](#Gimp) - -### C++ Development {#DevCpp} - -* ID: `DevCpp` -* Typ: `meta` -* Version: latest -* Dependencies: [MinGW](#MinGW), [Eclipse for C++](#EclipseCpp) - -### Clojure Development {#DevClojure} - -* ID: `DevClojure` -* Typ: `meta` -* Version: latest -* Dependencies: [Maven](#Maven), [Leiningen](#Leiningen), [LightTable](#LightTable) - -### Java Development {#DevJava} - -* ID: `DevJava` -* Typ: `meta` -* Version: latest -* Dependencies: [Java Development Kit 8](#JDK8), [Maven](#Maven), [Eclipse for Java](#EclipseJava) - -### LaTeX Writing {#LaTeX} - -* ID: `LaTeX` -* Typ: `meta` -* Version: latest -* Dependencies: [MiKTeX](#MiKTeX), [JabRef](#JabRef), [TeXnicCenter](#TeXnicCenter) - -### Markdown {#Markdown} - -* ID: `Markdown` -* Typ: `meta` -* Version: latest -* Dependencies: [Yeoman Generator for Markdown Projects](#MdProc), [Visual Studio Code](#VSCode) - -### Multimedia {#Multimedia} - -* ID: `Multimedia` -* Typ: `meta` -* Version: latest -* Dependencies: [Inkscape](#Inkscape), [Dia](#Dia), [GIMP](#Gimp), [Pandoc](#Pandoc), [MiKTeX](#MiKTeX), [Graphics Magick](#GraphicsMagick), [Graphviz](#Graphviz), [FFmpeg](#FFmpeg), [VLC Player](#VLC), [Blender](#Blender) - -### Python 2 Development {#DevPython2} - -* ID: `DevPython2` -* Typ: `meta` -* Version: latest -* Dependencies: [Python 2](#Python2), [Sublime Text 3](#SublimeText3), [IPython 2](#IPython2) - -### Python 3 Development {#DevPython3} - -* ID: `DevPython3` -* Typ: `meta` -* Version: latest -* Dependencies: [Python 3](#Python3), [Sublime Text 3](#SublimeText3), [IPython 3](#IPython3) - -### Web Development with PHP 5 {#WebDevPHP5} - -* ID: `WebDevPHP5` -* Typ: `meta` -* Version: latest -* Dependencies: [PHP 5](#PHP5), [MySQL](#MySQL), [MySQL Workbench](#MySQLWB), [Apache](#Apache), [Eclipse for PHP](#EclipsePHP) - -### Web Development with PHP 7 {#WebDevPHP7} - -* ID: `WebDevPHP7` -* Typ: `meta` -* Version: latest -* Dependencies: [PHP 7](#PHP7), [MySQL](#MySQL), [MySQL Workbench](#MySQLWB), [Apache](#Apache), [Eclipse for PHP](#EclipsePHP) - -## Required Apps {#apps-required} - -### 7-Zip {#7z} - -* ID: `7z` -* Typ: `default` -* Website: -* Version: 16.04 - -### ConEmu {#ConEmu} - -* ID: `ConEmu` -* Typ: `default` -* Website: -* Version: 16.10.09a - -### Inno Setup Unpacker {#InnoUnp} - -* ID: `InnoUnp` -* Typ: `default` -* Website: -* Version: 0.45 - -### Less MSIerables {#LessMsi} - -* ID: `LessMsi` -* Typ: `default` -* Website: -* Version: 1.3 - -## Optional Apps {#apps-optional} - -### .NET Core SDK {#dotnet} - -* ID: `dotnet` -* Typ: `default` -* Website: -* Version: latest - -### Ant Renamer {#AntRenamer} - -* ID: `AntRenamer` -* Typ: `default` -* Website: -* Version: latest - -### Apache {#Apache} - -* ID: `Apache` -* Typ: `default` -* Website: -* Version: 2.4.23 - -### Atom {#Atom} - -* ID: `Atom` -* Typ: `default` -* Website: -* Version: 1.11.2 - -### Blender {#Blender} - -* ID: `Blender` -* Typ: `default` -* Website: -* Version: 2.78 - -### Bower {#Bower} - -* ID: `Bower` -* Typ: `node-package` -* Website: -* Version: >=1.7.0 <2.0.0 -* Dependencies: [Git](#Git), [NPM](#Npm) - -### CMake {#CMake} - -* ID: `CMake` -* Typ: `default` -* Website: -* Version: 3.6.1 - -### CoffeeScript {#CoffeeScript} - -* ID: `CoffeeScript` -* Typ: `node-package` -* Website: -* Version: >=1.10.0 <2.0.0 -* Dependencies: [NPM](#Npm) - -### cURL {#cURL} - -* ID: `cURL` -* Typ: `default` -* Website: -* Version: 7.50.1 - -### Dia {#Dia} - -* ID: `Dia` -* Typ: `default` -* Website: -* Version: 0.97.2 - -### Eclipse for C++ {#EclipseCpp} - -* ID: `EclipseCpp` -* Typ: `default` -* Website: -* Version: 4.6 -* Dependencies: [Java Runtime Environment 8](#JRE8) - -### Eclipse for Java {#EclipseJava} - -* ID: `EclipseJava` -* Typ: `default` -* Website: -* Version: 4.6 -* Dependencies: [Java Runtime Environment 8](#JRE8) - -### Eclipse for PHP {#EclipsePHP} - -* ID: `EclipsePHP` -* Typ: `default` -* Website: -* Version: 4.6 -* Dependencies: [Java Runtime Environment 8](#JRE8) - -### Emacs {#Emacs} - -* ID: `Emacs` -* Typ: `default` -* Website: -* Version: 24.5 -* Dependencies: [GNU TLS](#GnuTLS) - -### Erlang {#Erlang} - -* ID: `Erlang` -* Typ: `default` -* Website: -* Version: 19.0 - -### FFmpeg {#FFmpeg} - -* ID: `FFmpeg` -* Typ: `default` -* Website: -* Version: latest - -### FileZilla {#FileZilla} - -* ID: `FileZilla` -* Typ: `default` -* Website: -* Version: 3.20.1 - -### FreeCAD {#FreeCAD} - -* ID: `FreeCAD` -* Typ: `default` -* Website: -* Version: 0.16 - -### GIMP {#Gimp} - -* ID: `Gimp` -* Typ: `default` -* Website: -* Version: 2.8.18 - -### Git {#Git} - -* ID: `Git` -* Typ: `default` -* Website: -* Version: 2.10.1 - -### GitKraken {#GitKraken} - -* ID: `GitKraken` -* Typ: `default` -* Website: -* Version: latest - -### GNU TLS {#GnuTLS} - -* ID: `GnuTLS` -* Typ: `default` -* Website: -* Version: 3.3.11 - -### GnuPG {#GnuPG} - -* ID: `GnuPG` -* Typ: `default` -* Website: -* Version: 2.0.30 - -### Go {#Go} - -* ID: `Go` -* Typ: `default` -* Website: -* Version: 1.6 - -### Graphics Magick {#GraphicsMagick} - -* ID: `GraphicsMagick` -* Typ: `default` -* Website: -* Version: 1.3.24 - -### Graphviz {#Graphviz} - -* ID: `Graphviz` -* Typ: `default` -* Website: -* Version: 2.38 - -### Grunt {#Grunt} - -* ID: `Grunt` -* Typ: `node-package` -* Website: -* Version: >=0.4.5 <0.5.0 -* Dependencies: [NPM](#Npm) - -### Gulp {#Gulp} - -* ID: `Gulp` -* Typ: `node-package` -* Website: -* Version: >=3.9.0 <4.0.0 -* Dependencies: [NPM](#Npm) - -### Hugo {#Hugo} - -* ID: `Hugo` -* Typ: `default` -* Website: -* Version: 0.16 - -### Inkscape {#Inkscape} - -* ID: `Inkscape` -* Typ: `default` -* Website: -* Version: 0.91-1 - -### IPython 2 {#IPython2} - -* ID: `IPython2` -* Typ: `python2-package` -* Website: -* Version: latest -* Dependencies: [PyReadline (Python 2)](#PyReadline2), [Python 2](#Python2) - -### IPython 3 {#IPython3} - -* ID: `IPython3` -* Typ: `python3-package` -* Website: -* Version: latest -* Dependencies: [PyReadline (Python 3)](#PyReadline3), [Python 3](#Python3) - -### JabRef {#JabRef} - -* ID: `JabRef` -* Typ: `default` -* Website: -* Version: 3.5 -* Dependencies: [Java Runtime Environment 8](#JRE8) - -### Java Development Kit 7 {#JDK7} - -* ID: `JDK7` -* Typ: `default` -* Website: -* Version: 7u80 - -### Java Development Kit 8 {#JDK8} - -* ID: `JDK8` -* Typ: `default` -* Website: -* Version: 112 - -### Java Runtime Environment 7 {#JRE7} - -* ID: `JRE7` -* Typ: `default` -* Website: -* Version: 7u80 - -### Java Runtime Environment 8 {#JRE8} - -* ID: `JRE8` -* Typ: `default` -* Website: -* Version: 112 - -### JSHint {#JSHint} - -* ID: `JSHint` -* Typ: `node-package` -* Website: -* Version: >=2.8.0 <3.0.0 -* Dependencies: [NPM](#Npm) - -### Leiningen {#Leiningen} - -* ID: `Leiningen` -* Typ: `default` -* Website: -* Version: latest -* Dependencies: [Java Development Kit 8](#JDK8), [GnuPG](#GnuPG), [Wget](#Wget) - -### LightTable {#LightTable} - -* ID: `LightTable` -* Typ: `default` -* Website: -* Version: 0.8.1 - -### LLVM Clang {#Clang} - -* ID: `Clang` -* Typ: `default` -* Website: -* Version: 3.8.1 - -### Maven {#Maven} - -* ID: `Maven` -* Typ: `default` -* Website: -* Version: 3.3.9 -* Dependencies: [Java Runtime Environment 8](#JRE8), [GnuPG](#GnuPG) - -### MeshLab {#MeshLab} - -* ID: `MeshLab` -* Typ: `default` -* Website: -* Version: 1.3.3 - -### MiKTeX {#MiKTeX} - -* ID: `MiKTeX` -* Typ: `default` -* Website: -* Version: 2.9.5987 - -### MinGW {#MinGW} - -* ID: `MinGW` -* Typ: `meta` -* Website: -* Version: latest -* Dependencies: [MinGwGet](#MinGwGet), [MinGwGetGui](#MinGwGetGui) - -### MinGwGet {#MinGwGet} - -* ID: `MinGwGet` -* Typ: `default` -* Version: 0.6.2 -* Dependencies: [Wget](#Wget) - -### MinGwGetGui {#MinGwGetGui} - -* ID: `MinGwGetGui` -* Typ: `default` -* Version: latest -* Dependencies: [MinGwGet](#MinGwGet) - -### MySQL {#MySQL} - -* ID: `MySQL` -* Typ: `default` -* Website: -* Version: 5.7.14 - -### MySQL Workbench {#MySQLWB} - -* ID: `MySQLWB` -* Typ: `default` -* Website: -* Version: 6.3.7 - -### Node.js {#Node} - -* ID: `Node` -* Typ: `default` -* Website: -* Version: 6.9.0 - -### NPM {#Npm} - -* ID: `Npm` -* Typ: `default` -* Website: -* Version: >=3.7.0 <4.0.0 -* Dependencies: [Node.js](#Node) - -### NuGet {#NuGet} - -* ID: `NuGet` -* Typ: `default` -* Website: -* Version: latest - -### NUnit 3 Runners {#NUnit.Runners} - -* ID: `NUnit.Runners` -* Typ: `nuget-package` -* Website: -* Version: latest -* Dependencies: [NuGet](#NuGet) - -### OpenSSL {#OpenSSL} - -* ID: `OpenSSL` -* Typ: `default` -* Website: -* Version: 1.1.0c - -### Pandoc {#Pandoc} - -* ID: `Pandoc` -* Typ: `default` -* Website: -* Version: 1.17.2 - -### PHP 5 {#PHP5} - -* ID: `PHP5` -* Typ: `default` -* Website: -* Version: 5.6.23 - -### PHP 7 {#PHP7} - -* ID: `PHP7` -* Typ: `default` -* Website: -* Version: 7.0.8 - -### PostgreSQL {#PostgreSQL} - -* ID: `PostgreSQL` -* Typ: `default` -* Website: -* Version: 9.5.3-1 - -### Putty {#Putty} - -* ID: `Putty` -* Typ: `default` -* Website: -* Version: latest - -### PyReadline (Python 2) {#PyReadline2} - -* ID: `PyReadline2` -* Typ: `python2-package` -* Website: -* Version: latest -* Dependencies: [Python 2](#Python2) - -### PyReadline (Python 3) {#PyReadline3} - -* ID: `PyReadline3` -* Typ: `python3-package` -* Website: -* Version: latest -* Dependencies: [Python 3](#Python3) - -### Python 2 {#Python2} - -* ID: `Python2` -* Typ: `default` -* Website: -* Version: 2.7.12 - -### Python 3 {#Python3} - -* ID: `Python3` -* Typ: `default` -* Website: -* Version: 3.4.4 - -### RabbitMQ {#RabbitMQ} - -* ID: `RabbitMQ` -* Typ: `default` -* Website: -* Version: 3.6.5 -* Dependencies: [Erlang](#Erlang) - -### Ruby {#Ruby} - -* ID: `Ruby` -* Typ: `default` -* Website: -* Version: 2.3.1 - -### RubyGems {#RubyGems} - -* ID: `RubyGems` -* Typ: `default` -* Website: -* Version: 2.6.8 -* Dependencies: [Ruby](#Ruby) - -### SASS {#Sass} - -* ID: `Sass` -* Typ: `ruby-package` -* Website: -* Version: latest -* Dependencies: [RubyGems](#RubyGems) - -### Scribus {#Scribus} - -* ID: `Scribus` -* Typ: `default` -* Website: -* Version: 1.4.6 - -### Sift {#Sift} - -* ID: `Sift` -* Typ: `default` -* Website: -* Version: 0.8.0 - -### Spacemacs {#Spacemacs} - -* ID: `Spacemacs` -* Typ: `meta` -* Website: -* Version: latest -* Dependencies: [Git](#Git), [Emacs](#Emacs) - -### Sublime Text 3 {#SublimeText3} - -* ID: `SublimeText3` -* Typ: `default` -* Website: -* Version: Build 3126 - -### SWare Iron {#Iron} - -* ID: `Iron` -* Typ: `default` -* Website: -* Version: latest - -### SysInternals {#SysInternals} - -* ID: `SysInternals` -* Typ: `default` -* Website: -* Version: latest - -### TeXnicCenter {#TeXnicCenter} - -* ID: `TeXnicCenter` -* Typ: `default` -* Website: -* Version: 2.02 -* Dependencies: [MiKTeX](#MiKTeX) - -### Vim {#Vim} - -* ID: `Vim` -* Typ: `default` -* Website: -* Version: 7.4 -* Dependencies: [VimRT](#VimRT), [VimConsole](#VimConsole) - -### VimConsole {#VimConsole} - -* ID: `VimConsole` -* Typ: `default` -* Version: 7.4 -* Dependencies: [VimRT](#VimRT) - -### VimRT {#VimRT} - -* ID: `VimRT` -* Typ: `default` -* Version: 7.4 - -### Visual Studio Code {#VSCode} - -* ID: `VSCode` -* Typ: `default` -* Website: -* Version: latest - -### VLC Player {#VLC} - -* ID: `VLC` -* Typ: `default` -* Website: -* Version: 2.2.4 - -### Wget {#Wget} - -* ID: `Wget` -* Typ: `default` -* Website: -* Version: 1.11.4-1 -* Dependencies: [WgetDeps](#WgetDeps) - -### WgetDeps {#WgetDeps} - -* ID: `WgetDeps` -* Typ: `default` -* Version: 1.11.4-1 - -### WinMerge {#WinMerge} - -* ID: `WinMerge` -* Typ: `default` -* Website: -* Version: 2.14.0 - -### Yeoman {#Yeoman} - -* ID: `Yeoman` -* Typ: `node-package` -* Website: -* Version: >=1.5.0 <2.0.0 -* Dependencies: [NPM](#Npm) - -### Yeoman Generator for Markdown Projects {#MdProc} - -* ID: `MdProc` -* Typ: `node-package` -* Website: -* Version: >=0.1.6 <0.2.0 -* Dependencies: [Yeoman](#Yeoman), [Gulp](#Gulp), [Pandoc](#Pandoc), [Graphviz](#Graphviz), [Inkscape](#Inkscape), [MiKTeX](#MiKTeX), [NPM](#Npm) - -### Zeal Docs {#Zeal} - -* ID: `Zeal` -* Typ: `default` -* Website: -* Version: 0.2.1 +| Label | Version | Library | Category | +|-------|---------|---------|----------| +| [.NET Core SDK](/app/Bench.DotNetCore) | latest | `default` | Platforms and Programming Languages | +| [7-Zip](/app/Bench.7z) | 16.04 | `core` | Required | +| [Ant Renamer](/app/Bench.AntRenamer) | latest | `default` | Filesystem | +| [Apache](/app/Bench.Apache) | 2.4.23 | `default` | Services | +| [Atom](/app/Bench.Atom) | 1.11.2 | `default` | Editors | +| [Blender](/app/Bench.Blender) | 2.78 | `default` | 3D Modeling | +| [Bower](/app/Bench.Bower) | >=1.7.0 <2.0.0 | `default` | Software Development Utilities | +| [CMake](/app/Bench.CMake) | 3.6.1 | `default` | Software Development Utilities | +| [CoffeeScript](/app/Bench.CoffeeScript) | >=1.10.0 <2.0.0 | `default` | Platforms and Programming Languages | +| [ConEmu](/app/Bench.ConEmu) | 16.10.09a | `core` | Required | +| [cURL](/app/Bench.cURL) | 7.50.1 | `default` | Network | +| [Dia](/app/Bench.Dia) | 0.97.2 | `default` | Multimedia | +| [Eclipse for C++](/app/Bench.EclipseCpp) | 4.6 | `default` | Editors | +| [Eclipse for Java](/app/Bench.EclipseJava) | 4.6 | `default` | Editors | +| [Eclipse for PHP](/app/Bench.EclipsePHP) | 4.6 | `default` | Editors | +| [Emacs](/app/Bench.Emacs) | 24.5 | `default` | Editors | +| [Erlang](/app/Bench.Erlang) | 19.0 | `default` | Platforms and Programming Languages | +| [FFmpeg](/app/Bench.FFmpeg) | latest | `default` | Multimedia | +| [FileZilla](/app/Bench.FileZilla) | 3.20.1 | `default` | Network | +| [FreeCAD](/app/Bench.FreeCAD) | 0.16 | `default` | 3D Modeling | +| [GIMP](/app/Bench.Gimp) | 2.8.18 | `default` | Multimedia | +| [Git](/app/Bench.Git) | 2.10.1 | `core` | Core | +| [GitKraken](/app/Bench.GitKraken) | latest | `default` | Version Control | +| [GNU TLS](/app/Bench.GnuTLS) | 3.3.11 | `default` | Security | +| [GnuPG](/app/Bench.GnuPG) | 2.0.30 | `default` | Security | +| [Go](/app/Bench.Go) | 1.6 | `default` | Platforms and Programming Languages | +| [Graphics Magick](/app/Bench.GraphicsMagick) | 1.3.24 | `default` | Multimedia | +| [Graphviz](/app/Bench.Graphviz) | 2.38 | `default` | Multimedia | +| [Grunt](/app/Bench.Grunt) | >=0.4.5 <0.5.0 | `default` | Software Development Utilities | +| [Gulp](/app/Bench.Gulp) | >=3.9.0 <4.0.0 | `default` | Software Development Utilities | +| [Hugo](/app/Bench.Hugo) | 0.16 | `default` | Web | +| [Inkscape](/app/Bench.Inkscape) | 0.91-1 | `default` | Multimedia | +| [Inno Setup Unpacker](/app/Bench.InnoUnp) | 0.45 | `core` | Required | +| [IPython 2](/app/Bench.IPython2) | latest | `default` | Software Development Utilities | +| [IPython 3](/app/Bench.IPython3) | latest | `default` | Software Development Utilities | +| [JabRef](/app/Bench.JabRef) | 3.5 | `default` | Writing | +| [Java Development Kit 7](/app/Bench.JDK7) | 7u80 | `default` | Platforms and Programming Languages | +| [Java Development Kit 8](/app/Bench.JDK8) | 112 | `default` | Platforms and Programming Languages | +| [Java Runtime Environment 7](/app/Bench.JRE7) | 7u80 | `default` | Platforms and Programming Languages | +| [Java Runtime Environment 8](/app/Bench.JRE8) | 112 | `default` | Platforms and Programming Languages | +| [JSHint](/app/Bench.JSHint) | >=2.8.0 <3.0.0 | `default` | Software Development Utilities | +| [Leiningen](/app/Bench.Leiningen) | latest | `default` | Platforms and Programming Languages | +| [Less MSIerables](/app/Bench.LessMsi) | 1.3 | `core` | Required | +| [LightTable](/app/Bench.LightTable) | 0.8.1 | `default` | Editors | +| [LLVM Clang](/app/Bench.Clang) | 3.8.1 | `default` | Platforms and Programming Languages | +| [Maven](/app/Bench.Maven) | 3.3.9 | `default` | Software Development Utilities | +| [MeshLab](/app/Bench.MeshLab) | 1.3.3 | `default` | 3D Modeling | +| [MiKTeX](/app/Bench.MiKTeX) | 2.9.5987 | `default` | Writing | +| [MinGW](/app/Bench.MinGW) | 0.6.2 | `default` | Platforms and Programming Languages | +| [MinGwGet](/app/Bench.MinGwGet) | 0.6.2 | `default` | Platforms and Programming Languages | +| [MinGwGetGui](/app/Bench.MinGwGetGui) | 0.6.2 | `default` | Platforms and Programming Languages | +| [MySQL](/app/Bench.MySQL) | 5.7.14 | `default` | Services | +| [MySQL Workbench](/app/Bench.MySQLWB) | 6.3.7 | `default` | Services | +| [Node.js](/app/Bench.Node) | 6.9.2 | `core` | Core | +| [NPM](/app/Bench.Npm) | >=4.0.0 <5.0.0 | `core` | Core | +| [NuGet](/app/Bench.NuGet) | latest | `core` | Core | +| [NUnit 3 Runners](/app/Bench.NUnitRunners) | latest | `default` | Software Development Utilities | +| [OpenSSL](/app/Bench.OpenSSL) | 1.1.0c | `default` | Security | +| [Pandoc](/app/Bench.Pandoc) | 1.17.2 | `default` | Writing | +| [PHP 5](/app/Bench.PHP5) | 5.6.23 | `default` | Platforms and Programming Languages | +| [PHP 7](/app/Bench.PHP7) | 7.0.8 | `default` | Platforms and Programming Languages | +| [PostgreSQL](/app/Bench.PostgreSQL) | 9.5.3-1 | `default` | Services | +| [Putty](/app/Bench.Putty) | latest | `default` | Security | +| [PyReadline (Python 2)](/app/Bench.PyReadline2) | latest | `default` | Software Development Utilities | +| [PyReadline (Python 3)](/app/Bench.PyReadline3) | latest | `default` | Software Development Utilities | +| [Python 2](/app/Bench.Python2) | 2.7.12 | `core` | Core | +| [Python 3](/app/Bench.Python3) | 3.4.4 | `core` | Core | +| [RabbitMQ](/app/Bench.RabbitMQ) | 3.6.5 | `default` | Services | +| [Ruby](/app/Bench.Ruby) | 2.3.1 | `core` | Core | +| [RubyGems](/app/Bench.RubyGems) | 2.6.8 | `core` | Core | +| [SASS](/app/Bench.Sass) | latest | `default` | Web | +| [Scribus](/app/Bench.Scribus) | 1.4.6 | `default` | Writing | +| [Sift](/app/Bench.Sift) | 0.8.0 | `default` | Filesystem | +| [Spacemacs](/app/Bench.Spacemacs) | latest | `default` | Editors | +| [Sublime Text 3](/app/Bench.SublimeText3) | Build 3126 | `default` | Editors | +| [SWare Iron](/app/Bench.Iron) | latest | `default` | Network | +| [SysInternals](/app/Bench.SysInternals) | latest | `default` | Software Development Utilities | +| [TeXnicCenter](/app/Bench.TeXnicCenter) | 2.02 | `default` | Writing | +| [Vim](/app/Bench.Vim) | 7.4 | `default` | Editors | +| [VimConsole](/app/Bench.VimConsole) | 7.4 | `default` | Editors | +| [VimRT](/app/Bench.VimRT) | 7.4 | `default` | Editors | +| [Visual Studio Code](/app/Bench.VSCode) | latest | `default` | Editors | +| [VLC Player](/app/Bench.VLC) | 2.2.4 | `default` | Multimedia | +| [Wget](/app/Bench.Wget) | 1.11.4-1 | `core` | Basics | +| [WgetDeps](/app/Bench.WgetDeps) | 1.11.4-1 | `core` | Basics | +| [WinMerge](/app/Bench.WinMerge) | 2.14.0 | `default` | Filesystem | +| [Yeoman](/app/Bench.Yeoman) | >=1.5.0 <2.0.0 | `default` | Software Development Utilities | +| [Zeal Docs](/app/Bench.Zeal) | 0.2.1 | `default` | Software Development Utilities | diff --git a/docs/src-content/ref/apps.md b/docs/src-content/ref/apps.md deleted file mode 100644 index 78acd9eb..00000000 --- a/docs/src-content/ref/apps.md +++ /dev/null @@ -1,770 +0,0 @@ -+++ -date = "2016-06-22T13:44:20+02:00" -description = "A list with all included apps and app groups" -draft = true -title = "App Library" -weight = 1 -+++ - -## Overview - -[**Groups**](#groups) - - - -[**Required Apps**](#apps-required) - - - -[**Optional Apps**](#apps-optional) - - - -## Groups {#groups} - -### 3D Modeling {#Dev3D} - -* ID: `Dev3D` -* Typ: `meta` -* Version: latest -* Dependencies: [Blender](#Blender), [FreeCAD](#FreeCAD), [MeshLab](#MeshLab), [GIMP](#Gimp) - -### C++ Development {#DevCpp} - -* ID: `DevCpp` -* Typ: `meta` -* Version: latest -* Dependencies: [MinGW](#MinGW), [Eclipse for C++](#EclipseCpp) - -### Clojure Development {#DevClojure} - -* ID: `DevClojure` -* Typ: `meta` -* Version: latest -* Dependencies: [Maven](#Maven), [Leiningen](#Leiningen), [LightTable](#LightTable) - -### Java Development {#DevJava} - -* ID: `DevJava` -* Typ: `meta` -* Version: latest -* Dependencies: [Java Development Kit 8](#JDK8), [Maven](#Maven), [Eclipse for Java](#EclipseJava) - -### LaTeX Writing {#LaTeX} - -* ID: `LaTeX` -* Typ: `meta` -* Version: latest -* Dependencies: [MiKTeX](#MiKTeX), [JabRef](#JabRef), [TeXnicCenter](#TeXnicCenter) - -### Markdown {#Markdown} - -* ID: `Markdown` -* Typ: `meta` -* Version: latest -* Dependencies: [Yeoman Generator for Markdown Projects](#MdProc), [Visual Studio Code](#VSCode) - -### Multimedia {#Multimedia} - -* ID: `Multimedia` -* Typ: `meta` -* Version: latest -* Dependencies: [Inkscape](#Inkscape), [Dia](#Dia), [GIMP](#Gimp), [Pandoc](#Pandoc), [MiKTeX](#MiKTeX), [Graphics Magick](#GraphicsMagick), [Graphviz](#Graphviz), [FFmpeg](#FFmpeg), [VLC Player](#VLC), [Blender](#Blender) - -### Python 2 Development {#DevPython2} - -* ID: `DevPython2` -* Typ: `meta` -* Version: latest -* Dependencies: [Python 2](#Python2), [Sublime Text 3](#SublimeText3), [IPython 2](#IPython2) - -### Python 3 Development {#DevPython3} - -* ID: `DevPython3` -* Typ: `meta` -* Version: latest -* Dependencies: [Python 3](#Python3), [Sublime Text 3](#SublimeText3), [IPython 3](#IPython3) - -### Web Development with PHP 5 {#WebDevPHP5} - -* ID: `WebDevPHP5` -* Typ: `meta` -* Version: latest -* Dependencies: [PHP 5](#PHP5), [MySQL](#MySQL), [MySQL Workbench](#MySQLWB), [Apache](#Apache), [Eclipse for PHP](#EclipsePHP) - -### Web Development with PHP 7 {#WebDevPHP7} - -* ID: `WebDevPHP7` -* Typ: `meta` -* Version: latest -* Dependencies: [PHP 7](#PHP7), [MySQL](#MySQL), [MySQL Workbench](#MySQLWB), [Apache](#Apache), [Eclipse for PHP](#EclipsePHP) - -## Required Apps {#apps-required} - -### 7-Zip {#7z} - -* ID: `7z` -* Typ: `default` -* Website: -* Version: 16.04 - -### ConEmu {#ConEmu} - -* ID: `ConEmu` -* Typ: `default` -* Website: -* Version: 16.10.09a - -### Inno Setup Unpacker {#InnoUnp} - -* ID: `InnoUnp` -* Typ: `default` -* Website: -* Version: 0.45 - -### Less MSIerables {#LessMsi} - -* ID: `LessMsi` -* Typ: `default` -* Website: -* Version: 1.3 - -## Optional Apps {#apps-optional} - -### .NET Core SDK {#dotnet} - -* ID: `dotnet` -* Typ: `default` -* Website: -* Version: latest - -### Ant Renamer {#AntRenamer} - -* ID: `AntRenamer` -* Typ: `default` -* Website: -* Version: latest - -### Apache {#Apache} - -* ID: `Apache` -* Typ: `default` -* Website: -* Version: 2.4.23 - -### Atom {#Atom} - -* ID: `Atom` -* Typ: `default` -* Website: -* Version: 1.11.2 - -### Blender {#Blender} - -* ID: `Blender` -* Typ: `default` -* Website: -* Version: 2.78 - -### Bower {#Bower} - -* ID: `Bower` -* Typ: `node-package` -* Website: -* Version: >=1.7.0 <2.0.0 -* Dependencies: [Git](#Git), [NPM](#Npm) - -### CMake {#CMake} - -* ID: `CMake` -* Typ: `default` -* Website: -* Version: 3.6.1 - -### CoffeeScript {#CoffeeScript} - -* ID: `CoffeeScript` -* Typ: `node-package` -* Website: -* Version: >=1.10.0 <2.0.0 -* Dependencies: [NPM](#Npm) - -### cURL {#cURL} - -* ID: `cURL` -* Typ: `default` -* Website: -* Version: 7.50.1 - -### Dia {#Dia} - -* ID: `Dia` -* Typ: `default` -* Website: -* Version: 0.97.2 - -### Eclipse for C++ {#EclipseCpp} - -* ID: `EclipseCpp` -* Typ: `default` -* Website: -* Version: 4.6 -* Dependencies: [Java Runtime Environment 8](#JRE8) - -### Eclipse for Java {#EclipseJava} - -* ID: `EclipseJava` -* Typ: `default` -* Website: -* Version: 4.6 -* Dependencies: [Java Runtime Environment 8](#JRE8) - -### Eclipse for PHP {#EclipsePHP} - -* ID: `EclipsePHP` -* Typ: `default` -* Website: -* Version: 4.6 -* Dependencies: [Java Runtime Environment 8](#JRE8) - -### Emacs {#Emacs} - -* ID: `Emacs` -* Typ: `default` -* Website: -* Version: 24.5 -* Dependencies: [GNU TLS](#GnuTLS) - -### Erlang {#Erlang} - -* ID: `Erlang` -* Typ: `default` -* Website: -* Version: 19.0 - -### FFmpeg {#FFmpeg} - -* ID: `FFmpeg` -* Typ: `default` -* Website: -* Version: latest - -### FileZilla {#FileZilla} - -* ID: `FileZilla` -* Typ: `default` -* Website: -* Version: 3.20.1 - -### FreeCAD {#FreeCAD} - -* ID: `FreeCAD` -* Typ: `default` -* Website: -* Version: 0.16 - -### GIMP {#Gimp} - -* ID: `Gimp` -* Typ: `default` -* Website: -* Version: 2.8.18 - -### Git {#Git} - -* ID: `Git` -* Typ: `default` -* Website: -* Version: 2.10.1 - -### GitKraken {#GitKraken} - -* ID: `GitKraken` -* Typ: `default` -* Website: -* Version: latest - -### GNU TLS {#GnuTLS} - -* ID: `GnuTLS` -* Typ: `default` -* Website: -* Version: 3.3.11 - -### GnuPG {#GnuPG} - -* ID: `GnuPG` -* Typ: `default` -* Website: -* Version: 2.0.30 - -### Go {#Go} - -* ID: `Go` -* Typ: `default` -* Website: -* Version: 1.6 - -### Graphics Magick {#GraphicsMagick} - -* ID: `GraphicsMagick` -* Typ: `default` -* Website: -* Version: 1.3.24 - -### Graphviz {#Graphviz} - -* ID: `Graphviz` -* Typ: `default` -* Website: -* Version: 2.38 - -### Grunt {#Grunt} - -* ID: `Grunt` -* Typ: `node-package` -* Website: -* Version: >=0.4.5 <0.5.0 -* Dependencies: [NPM](#Npm) - -### Gulp {#Gulp} - -* ID: `Gulp` -* Typ: `node-package` -* Website: -* Version: >=3.9.0 <4.0.0 -* Dependencies: [NPM](#Npm) - -### Hugo {#Hugo} - -* ID: `Hugo` -* Typ: `default` -* Website: -* Version: 0.16 - -### Inkscape {#Inkscape} - -* ID: `Inkscape` -* Typ: `default` -* Website: -* Version: 0.91-1 - -### IPython 2 {#IPython2} - -* ID: `IPython2` -* Typ: `python2-package` -* Website: -* Version: latest -* Dependencies: [PyReadline (Python 2)](#PyReadline2), [Python 2](#Python2) - -### IPython 3 {#IPython3} - -* ID: `IPython3` -* Typ: `python3-package` -* Website: -* Version: latest -* Dependencies: [PyReadline (Python 3)](#PyReadline3), [Python 3](#Python3) - -### JabRef {#JabRef} - -* ID: `JabRef` -* Typ: `default` -* Website: -* Version: 3.5 -* Dependencies: [Java Runtime Environment 8](#JRE8) - -### Java Development Kit 7 {#JDK7} - -* ID: `JDK7` -* Typ: `default` -* Website: -* Version: 7u80 - -### Java Development Kit 8 {#JDK8} - -* ID: `JDK8` -* Typ: `default` -* Website: -* Version: 112 - -### Java Runtime Environment 7 {#JRE7} - -* ID: `JRE7` -* Typ: `default` -* Website: -* Version: 7u80 - -### Java Runtime Environment 8 {#JRE8} - -* ID: `JRE8` -* Typ: `default` -* Website: -* Version: 112 - -### JSHint {#JSHint} - -* ID: `JSHint` -* Typ: `node-package` -* Website: -* Version: >=2.8.0 <3.0.0 -* Dependencies: [NPM](#Npm) - -### Leiningen {#Leiningen} - -* ID: `Leiningen` -* Typ: `default` -* Website: -* Version: latest -* Dependencies: [Java Development Kit 8](#JDK8), [GnuPG](#GnuPG), [Wget](#Wget) - -### LightTable {#LightTable} - -* ID: `LightTable` -* Typ: `default` -* Website: -* Version: 0.8.1 - -### LLVM Clang {#Clang} - -* ID: `Clang` -* Typ: `default` -* Website: -* Version: 3.8.1 - -### Maven {#Maven} - -* ID: `Maven` -* Typ: `default` -* Website: -* Version: 3.3.9 -* Dependencies: [Java Runtime Environment 8](#JRE8), [GnuPG](#GnuPG) - -### MeshLab {#MeshLab} - -* ID: `MeshLab` -* Typ: `default` -* Website: -* Version: 1.3.3 - -### MiKTeX {#MiKTeX} - -* ID: `MiKTeX` -* Typ: `default` -* Website: -* Version: 2.9.5987 - -### MinGW {#MinGW} - -* ID: `MinGW` -* Typ: `meta` -* Website: -* Version: latest -* Dependencies: [MinGwGet](#MinGwGet), [MinGwGetGui](#MinGwGetGui) - -### MinGwGet {#MinGwGet} - -* ID: `MinGwGet` -* Typ: `default` -* Version: 0.6.2 -* Dependencies: [Wget](#Wget) - -### MinGwGetGui {#MinGwGetGui} - -* ID: `MinGwGetGui` -* Typ: `default` -* Version: latest -* Dependencies: [MinGwGet](#MinGwGet) - -### MySQL {#MySQL} - -* ID: `MySQL` -* Typ: `default` -* Website: -* Version: 5.7.14 - -### MySQL Workbench {#MySQLWB} - -* ID: `MySQLWB` -* Typ: `default` -* Website: -* Version: 6.3.7 - -### Node.js {#Node} - -* ID: `Node` -* Typ: `default` -* Website: -* Version: 6.9.0 - -### NPM {#Npm} - -* ID: `Npm` -* Typ: `default` -* Website: -* Version: >=3.7.0 <4.0.0 -* Dependencies: [Node.js](#Node) - -### NuGet {#NuGet} - -* ID: `NuGet` -* Typ: `default` -* Website: -* Version: latest - -### NUnit 3 Runners {#NUnit.Runners} - -* ID: `NUnit.Runners` -* Typ: `nuget-package` -* Website: -* Version: latest -* Dependencies: [NuGet](#NuGet) - -### OpenSSL {#OpenSSL} - -* ID: `OpenSSL` -* Typ: `default` -* Website: -* Version: 1.1.0c - -### Pandoc {#Pandoc} - -* ID: `Pandoc` -* Typ: `default` -* Website: -* Version: 1.17.2 - -### PHP 5 {#PHP5} - -* ID: `PHP5` -* Typ: `default` -* Website: -* Version: 5.6.23 - -### PHP 7 {#PHP7} - -* ID: `PHP7` -* Typ: `default` -* Website: -* Version: 7.0.8 - -### PostgreSQL {#PostgreSQL} - -* ID: `PostgreSQL` -* Typ: `default` -* Website: -* Version: 9.5.3-1 - -### Putty {#Putty} - -* ID: `Putty` -* Typ: `default` -* Website: -* Version: latest - -### PyReadline (Python 2) {#PyReadline2} - -* ID: `PyReadline2` -* Typ: `python2-package` -* Website: -* Version: latest -* Dependencies: [Python 2](#Python2) - -### PyReadline (Python 3) {#PyReadline3} - -* ID: `PyReadline3` -* Typ: `python3-package` -* Website: -* Version: latest -* Dependencies: [Python 3](#Python3) - -### Python 2 {#Python2} - -* ID: `Python2` -* Typ: `default` -* Website: -* Version: 2.7.12 - -### Python 3 {#Python3} - -* ID: `Python3` -* Typ: `default` -* Website: -* Version: 3.4.4 - -### RabbitMQ {#RabbitMQ} - -* ID: `RabbitMQ` -* Typ: `default` -* Website: -* Version: 3.6.5 -* Dependencies: [Erlang](#Erlang) - -### Ruby {#Ruby} - -* ID: `Ruby` -* Typ: `default` -* Website: -* Version: 2.3.1 - -### RubyGems {#RubyGems} - -* ID: `RubyGems` -* Typ: `default` -* Website: -* Version: 2.6.8 -* Dependencies: [Ruby](#Ruby) - -### SASS {#Sass} - -* ID: `Sass` -* Typ: `ruby-package` -* Website: -* Version: latest -* Dependencies: [RubyGems](#RubyGems) - -### Scribus {#Scribus} - -* ID: `Scribus` -* Typ: `default` -* Website: -* Version: 1.4.6 - -### Sift {#Sift} - -* ID: `Sift` -* Typ: `default` -* Website: -* Version: 0.8.0 - -### Spacemacs {#Spacemacs} - -* ID: `Spacemacs` -* Typ: `meta` -* Website: -* Version: latest -* Dependencies: [Git](#Git), [Emacs](#Emacs) - -### Sublime Text 3 {#SublimeText3} - -* ID: `SublimeText3` -* Typ: `default` -* Website: -* Version: Build 3126 - -### SWare Iron {#Iron} - -* ID: `Iron` -* Typ: `default` -* Website: -* Version: latest - -### SysInternals {#SysInternals} - -* ID: `SysInternals` -* Typ: `default` -* Website: -* Version: latest - -### TeXnicCenter {#TeXnicCenter} - -* ID: `TeXnicCenter` -* Typ: `default` -* Website: -* Version: 2.02 -* Dependencies: [MiKTeX](#MiKTeX) - -### Vim {#Vim} - -* ID: `Vim` -* Typ: `default` -* Website: -* Version: 7.4 -* Dependencies: [VimRT](#VimRT), [VimConsole](#VimConsole) - -### VimConsole {#VimConsole} - -* ID: `VimConsole` -* Typ: `default` -* Version: 7.4 -* Dependencies: [VimRT](#VimRT) - -### VimRT {#VimRT} - -* ID: `VimRT` -* Typ: `default` -* Version: 7.4 - -### Visual Studio Code {#VSCode} - -* ID: `VSCode` -* Typ: `default` -* Website: -* Version: latest - -### VLC Player {#VLC} - -* ID: `VLC` -* Typ: `default` -* Website: -* Version: 2.2.4 - -### Wget {#Wget} - -* ID: `Wget` -* Typ: `default` -* Website: -* Version: 1.11.4-1 -* Dependencies: [WgetDeps](#WgetDeps) - -### WgetDeps {#WgetDeps} - -* ID: `WgetDeps` -* Typ: `default` -* Version: 1.11.4-1 - -### WinMerge {#WinMerge} - -* ID: `WinMerge` -* Typ: `default` -* Website: -* Version: 2.14.0 - -### Yeoman {#Yeoman} - -* ID: `Yeoman` -* Typ: `node-package` -* Website: -* Version: >=1.5.0 <2.0.0 -* Dependencies: [NPM](#Npm) - -### Yeoman Generator for Markdown Projects {#MdProc} - -* ID: `MdProc` -* Typ: `node-package` -* Website: -* Version: >=0.1.6 <0.2.0 -* Dependencies: [Yeoman](#Yeoman), [Gulp](#Gulp), [Pandoc](#Pandoc), [Graphviz](#Graphviz), [Inkscape](#Inkscape), [MiKTeX](#MiKTeX), [NPM](#Npm) - -### Zeal Docs {#Zeal} - -* ID: `Zeal` -* Typ: `default` -* Website: -* Version: 0.2.1 - From 048d3c77f12b24f389424f24d46d81a066fcfa2f Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 6 Jan 2017 16:13:30 +0100 Subject: [PATCH 138/230] removed timestamp from app info pages to prevent unnecessary commits --- build/update-app-list.ps1 | 1 - docs/content/app/Bench.7z.md | 1 - docs/content/app/Bench.AntRenamer.md | 1 - docs/content/app/Bench.Apache.md | 1 - docs/content/app/Bench.Atom.md | 1 - docs/content/app/Bench.Blender.md | 1 - docs/content/app/Bench.Bower.md | 1 - docs/content/app/Bench.CMake.md | 1 - docs/content/app/Bench.Clang.md | 1 - docs/content/app/Bench.CoffeeScript.md | 1 - docs/content/app/Bench.ConEmu.md | 1 - docs/content/app/Bench.Dia.md | 1 - docs/content/app/Bench.DotNetCore.md | 1 - docs/content/app/Bench.EclipseCpp.md | 1 - docs/content/app/Bench.EclipseJava.md | 1 - docs/content/app/Bench.EclipsePHP.md | 1 - docs/content/app/Bench.Emacs.md | 1 - docs/content/app/Bench.Erlang.md | 1 - docs/content/app/Bench.FFmpeg.md | 1 - docs/content/app/Bench.FileZilla.md | 1 - docs/content/app/Bench.FreeCAD.md | 1 - docs/content/app/Bench.Gimp.md | 1 - docs/content/app/Bench.Git.md | 1 - docs/content/app/Bench.GitKraken.md | 1 - docs/content/app/Bench.GnuPG.md | 1 - docs/content/app/Bench.GnuTLS.md | 1 - docs/content/app/Bench.Go.md | 1 - docs/content/app/Bench.GraphicsMagick.md | 1 - docs/content/app/Bench.Graphviz.md | 1 - docs/content/app/Bench.Grunt.md | 1 - docs/content/app/Bench.Gulp.md | 1 - docs/content/app/Bench.Hugo.md | 1 - docs/content/app/Bench.IPython2.md | 1 - docs/content/app/Bench.IPython3.md | 1 - docs/content/app/Bench.Inkscape.md | 1 - docs/content/app/Bench.InnoUnp.md | 1 - docs/content/app/Bench.Iron.md | 1 - docs/content/app/Bench.JDK7.md | 1 - docs/content/app/Bench.JDK8.md | 1 - docs/content/app/Bench.JRE7.md | 1 - docs/content/app/Bench.JRE8.md | 1 - docs/content/app/Bench.JSHint.md | 1 - docs/content/app/Bench.JabRef.md | 1 - docs/content/app/Bench.Leiningen.md | 1 - docs/content/app/Bench.LessMsi.md | 1 - docs/content/app/Bench.LightTable.md | 1 - docs/content/app/Bench.Maven.md | 1 - docs/content/app/Bench.MeshLab.md | 1 - docs/content/app/Bench.MiKTeX.md | 1 - docs/content/app/Bench.MinGW.md | 1 - docs/content/app/Bench.MinGwGet.md | 1 - docs/content/app/Bench.MinGwGetGui.md | 1 - docs/content/app/Bench.MySQL.md | 1 - docs/content/app/Bench.MySQLWB.md | 1 - docs/content/app/Bench.NUnitRunners.md | 1 - docs/content/app/Bench.Node.md | 1 - docs/content/app/Bench.Npm.md | 1 - docs/content/app/Bench.NuGet.md | 1 - docs/content/app/Bench.OpenSSL.md | 1 - docs/content/app/Bench.PHP5.md | 1 - docs/content/app/Bench.PHP7.md | 1 - docs/content/app/Bench.Pandoc.md | 1 - docs/content/app/Bench.PostgreSQL.md | 1 - docs/content/app/Bench.Putty.md | 1 - docs/content/app/Bench.PyReadline2.md | 1 - docs/content/app/Bench.PyReadline3.md | 1 - docs/content/app/Bench.Python2.md | 1 - docs/content/app/Bench.Python3.md | 1 - docs/content/app/Bench.RabbitMQ.md | 1 - docs/content/app/Bench.Ruby.md | 1 - docs/content/app/Bench.RubyGems.md | 1 - docs/content/app/Bench.Sass.md | 1 - docs/content/app/Bench.Scribus.md | 1 - docs/content/app/Bench.Sift.md | 1 - docs/content/app/Bench.Spacemacs.md | 1 - docs/content/app/Bench.SublimeText3.md | 1 - docs/content/app/Bench.SysInternals.md | 1 - docs/content/app/Bench.TeXnicCenter.md | 1 - docs/content/app/Bench.VLC.md | 1 - docs/content/app/Bench.VSCode.md | 1 - docs/content/app/Bench.Vim.md | 1 - docs/content/app/Bench.VimConsole.md | 1 - docs/content/app/Bench.VimRT.md | 1 - docs/content/app/Bench.Wget.md | 1 - docs/content/app/Bench.WgetDeps.md | 1 - docs/content/app/Bench.WinMerge.md | 1 - docs/content/app/Bench.Yeoman.md | 1 - docs/content/app/Bench.Zeal.md | 1 - docs/content/app/Bench.cURL.md | 1 - 89 files changed, 89 deletions(-) diff --git a/build/update-app-list.ps1 b/build/update-app-list.ps1 index 67fd8d70..28267e71 100644 --- a/build/update-app-list.ps1 +++ b/build/update-app-list.ps1 @@ -47,7 +47,6 @@ function WriteAppFile($app, $no) $f = [IO.Path]::Combine($targetDir, $app.ID + ".md") $w = New-Object System.IO.StreamWriter @($f, $false, [Text.Encoding]::UTF8) $w.WriteLine("+++") - $w.WriteLine("date = `"$([DateTime]::Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK"))`"") $w.WriteLine("title = `"$($app.Label)`"") $w.WriteLine("weight = $no") $w.WriteLine("app_lib = `"$($app.AppLibrary.ID)`"") diff --git a/docs/content/app/Bench.7z.md b/docs/content/app/Bench.7z.md index 2c5b4768..2091fa47 100644 --- a/docs/content/app/Bench.7z.md +++ b/docs/content/app/Bench.7z.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "7-Zip" weight = 2 app_lib = "core" diff --git a/docs/content/app/Bench.AntRenamer.md b/docs/content/app/Bench.AntRenamer.md index 2092efa5..cdebe372 100644 --- a/docs/content/app/Bench.AntRenamer.md +++ b/docs/content/app/Bench.AntRenamer.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Ant Renamer" weight = 63 app_lib = "default" diff --git a/docs/content/app/Bench.Apache.md b/docs/content/app/Bench.Apache.md index 0119dd82..1cac1c00 100644 --- a/docs/content/app/Bench.Apache.md +++ b/docs/content/app/Bench.Apache.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Apache" weight = 70 app_lib = "default" diff --git a/docs/content/app/Bench.Atom.md b/docs/content/app/Bench.Atom.md index e470e2d5..963d9128 100644 --- a/docs/content/app/Bench.Atom.md +++ b/docs/content/app/Bench.Atom.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Atom" weight = 35 app_lib = "default" diff --git a/docs/content/app/Bench.Blender.md b/docs/content/app/Bench.Blender.md index 14e68c3a..115f8991 100644 --- a/docs/content/app/Bench.Blender.md +++ b/docs/content/app/Bench.Blender.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:12+01:00" title = "Blender" weight = 87 app_lib = "default" diff --git a/docs/content/app/Bench.Bower.md b/docs/content/app/Bench.Bower.md index 4a68304c..2f06ab31 100644 --- a/docs/content/app/Bench.Bower.md +++ b/docs/content/app/Bench.Bower.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Bower" weight = 49 app_lib = "default" diff --git a/docs/content/app/Bench.CMake.md b/docs/content/app/Bench.CMake.md index e46511b7..bc2dc530 100644 --- a/docs/content/app/Bench.CMake.md +++ b/docs/content/app/Bench.CMake.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "CMake" weight = 53 app_lib = "default" diff --git a/docs/content/app/Bench.Clang.md b/docs/content/app/Bench.Clang.md index 615b0ec9..44b6d783 100644 --- a/docs/content/app/Bench.Clang.md +++ b/docs/content/app/Bench.Clang.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "LLVM Clang" weight = 31 app_lib = "default" diff --git a/docs/content/app/Bench.CoffeeScript.md b/docs/content/app/Bench.CoffeeScript.md index d6cf321e..0272c09d 100644 --- a/docs/content/app/Bench.CoffeeScript.md +++ b/docs/content/app/Bench.CoffeeScript.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "CoffeeScript" weight = 34 app_lib = "default" diff --git a/docs/content/app/Bench.ConEmu.md b/docs/content/app/Bench.ConEmu.md index 33ede74a..f30c415b 100644 --- a/docs/content/app/Bench.ConEmu.md +++ b/docs/content/app/Bench.ConEmu.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "ConEmu" weight = 4 app_lib = "core" diff --git a/docs/content/app/Bench.Dia.md b/docs/content/app/Bench.Dia.md index 0573b9a7..167b6b05 100644 --- a/docs/content/app/Bench.Dia.md +++ b/docs/content/app/Bench.Dia.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Dia" weight = 83 app_lib = "default" diff --git a/docs/content/app/Bench.DotNetCore.md b/docs/content/app/Bench.DotNetCore.md index ec404fa9..a349f834 100644 --- a/docs/content/app/Bench.DotNetCore.md +++ b/docs/content/app/Bench.DotNetCore.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = ".NET Core SDK" weight = 27 app_lib = "default" diff --git a/docs/content/app/Bench.EclipseCpp.md b/docs/content/app/Bench.EclipseCpp.md index c1229da7..eeae7674 100644 --- a/docs/content/app/Bench.EclipseCpp.md +++ b/docs/content/app/Bench.EclipseCpp.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Eclipse for C++" weight = 46 app_lib = "default" diff --git a/docs/content/app/Bench.EclipseJava.md b/docs/content/app/Bench.EclipseJava.md index e069ab74..52113a16 100644 --- a/docs/content/app/Bench.EclipseJava.md +++ b/docs/content/app/Bench.EclipseJava.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Eclipse for Java" weight = 44 app_lib = "default" diff --git a/docs/content/app/Bench.EclipsePHP.md b/docs/content/app/Bench.EclipsePHP.md index b6cfb5ae..1d60f4af 100644 --- a/docs/content/app/Bench.EclipsePHP.md +++ b/docs/content/app/Bench.EclipsePHP.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Eclipse for PHP" weight = 45 app_lib = "default" diff --git a/docs/content/app/Bench.Emacs.md b/docs/content/app/Bench.Emacs.md index ac6c5e27..0899910d 100644 --- a/docs/content/app/Bench.Emacs.md +++ b/docs/content/app/Bench.Emacs.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Emacs" weight = 38 app_lib = "default" diff --git a/docs/content/app/Bench.Erlang.md b/docs/content/app/Bench.Erlang.md index 22e073e0..04310677 100644 --- a/docs/content/app/Bench.Erlang.md +++ b/docs/content/app/Bench.Erlang.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Erlang" weight = 33 app_lib = "default" diff --git a/docs/content/app/Bench.FFmpeg.md b/docs/content/app/Bench.FFmpeg.md index 345f4556..9db15644 100644 --- a/docs/content/app/Bench.FFmpeg.md +++ b/docs/content/app/Bench.FFmpeg.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "FFmpeg" weight = 80 app_lib = "default" diff --git a/docs/content/app/Bench.FileZilla.md b/docs/content/app/Bench.FileZilla.md index 72f703b4..fe0a543a 100644 --- a/docs/content/app/Bench.FileZilla.md +++ b/docs/content/app/Bench.FileZilla.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "FileZilla" weight = 65 app_lib = "default" diff --git a/docs/content/app/Bench.FreeCAD.md b/docs/content/app/Bench.FreeCAD.md index 858d0790..f748f23d 100644 --- a/docs/content/app/Bench.FreeCAD.md +++ b/docs/content/app/Bench.FreeCAD.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:12+01:00" title = "FreeCAD" weight = 88 app_lib = "default" diff --git a/docs/content/app/Bench.Gimp.md b/docs/content/app/Bench.Gimp.md index 4413d121..5385d32a 100644 --- a/docs/content/app/Bench.Gimp.md +++ b/docs/content/app/Bench.Gimp.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "GIMP" weight = 85 app_lib = "default" diff --git a/docs/content/app/Bench.Git.md b/docs/content/app/Bench.Git.md index 7825b641..514d4081 100644 --- a/docs/content/app/Bench.Git.md +++ b/docs/content/app/Bench.Git.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Git" weight = 5 app_lib = "core" diff --git a/docs/content/app/Bench.GitKraken.md b/docs/content/app/Bench.GitKraken.md index c2ad67cd..ab414646 100644 --- a/docs/content/app/Bench.GitKraken.md +++ b/docs/content/app/Bench.GitKraken.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "GitKraken" weight = 19 app_lib = "default" diff --git a/docs/content/app/Bench.GnuPG.md b/docs/content/app/Bench.GnuPG.md index e3b91458..74f61f5a 100644 --- a/docs/content/app/Bench.GnuPG.md +++ b/docs/content/app/Bench.GnuPG.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "GnuPG" weight = 17 app_lib = "default" diff --git a/docs/content/app/Bench.GnuTLS.md b/docs/content/app/Bench.GnuTLS.md index e23b61c0..f9667fc5 100644 --- a/docs/content/app/Bench.GnuTLS.md +++ b/docs/content/app/Bench.GnuTLS.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "GNU TLS" weight = 16 app_lib = "default" diff --git a/docs/content/app/Bench.Go.md b/docs/content/app/Bench.Go.md index ecbe544e..2a8432ce 100644 --- a/docs/content/app/Bench.Go.md +++ b/docs/content/app/Bench.Go.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Go" weight = 32 app_lib = "default" diff --git a/docs/content/app/Bench.GraphicsMagick.md b/docs/content/app/Bench.GraphicsMagick.md index 184e7ef7..a6846e8d 100644 --- a/docs/content/app/Bench.GraphicsMagick.md +++ b/docs/content/app/Bench.GraphicsMagick.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Graphics Magick" weight = 79 app_lib = "default" diff --git a/docs/content/app/Bench.Graphviz.md b/docs/content/app/Bench.Graphviz.md index b91af84a..ca57edd7 100644 --- a/docs/content/app/Bench.Graphviz.md +++ b/docs/content/app/Bench.Graphviz.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Graphviz" weight = 82 app_lib = "default" diff --git a/docs/content/app/Bench.Grunt.md b/docs/content/app/Bench.Grunt.md index d975f92c..acbf8c74 100644 --- a/docs/content/app/Bench.Grunt.md +++ b/docs/content/app/Bench.Grunt.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Grunt" weight = 48 app_lib = "default" diff --git a/docs/content/app/Bench.Gulp.md b/docs/content/app/Bench.Gulp.md index 9482491a..b06dad2c 100644 --- a/docs/content/app/Bench.Gulp.md +++ b/docs/content/app/Bench.Gulp.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Gulp" weight = 47 app_lib = "default" diff --git a/docs/content/app/Bench.Hugo.md b/docs/content/app/Bench.Hugo.md index dc19feef..7952b38c 100644 --- a/docs/content/app/Bench.Hugo.md +++ b/docs/content/app/Bench.Hugo.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Hugo" weight = 78 app_lib = "default" diff --git a/docs/content/app/Bench.IPython2.md b/docs/content/app/Bench.IPython2.md index 9ff437cd..9118b733 100644 --- a/docs/content/app/Bench.IPython2.md +++ b/docs/content/app/Bench.IPython2.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "IPython 2" weight = 57 app_lib = "default" diff --git a/docs/content/app/Bench.IPython3.md b/docs/content/app/Bench.IPython3.md index 0650d51d..38a42a72 100644 --- a/docs/content/app/Bench.IPython3.md +++ b/docs/content/app/Bench.IPython3.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "IPython 3" weight = 58 app_lib = "default" diff --git a/docs/content/app/Bench.Inkscape.md b/docs/content/app/Bench.Inkscape.md index 3cd626d0..751aba2a 100644 --- a/docs/content/app/Bench.Inkscape.md +++ b/docs/content/app/Bench.Inkscape.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Inkscape" weight = 84 app_lib = "default" diff --git a/docs/content/app/Bench.InnoUnp.md b/docs/content/app/Bench.InnoUnp.md index ac6d479d..ad847c24 100644 --- a/docs/content/app/Bench.InnoUnp.md +++ b/docs/content/app/Bench.InnoUnp.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Inno Setup Unpacker" weight = 3 app_lib = "core" diff --git a/docs/content/app/Bench.Iron.md b/docs/content/app/Bench.Iron.md index 829fb645..bf8cf3e9 100644 --- a/docs/content/app/Bench.Iron.md +++ b/docs/content/app/Bench.Iron.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "SWare Iron" weight = 66 app_lib = "default" diff --git a/docs/content/app/Bench.JDK7.md b/docs/content/app/Bench.JDK7.md index 7e8194e4..6ba5f274 100644 --- a/docs/content/app/Bench.JDK7.md +++ b/docs/content/app/Bench.JDK7.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Java Development Kit 7" weight = 24 app_lib = "default" diff --git a/docs/content/app/Bench.JDK8.md b/docs/content/app/Bench.JDK8.md index 09bc8c82..c396fa00 100644 --- a/docs/content/app/Bench.JDK8.md +++ b/docs/content/app/Bench.JDK8.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Java Development Kit 8" weight = 25 app_lib = "default" diff --git a/docs/content/app/Bench.JRE7.md b/docs/content/app/Bench.JRE7.md index 0e17f8d6..17690818 100644 --- a/docs/content/app/Bench.JRE7.md +++ b/docs/content/app/Bench.JRE7.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Java Runtime Environment 7" weight = 22 app_lib = "default" diff --git a/docs/content/app/Bench.JRE8.md b/docs/content/app/Bench.JRE8.md index 1dec5fdc..9f086862 100644 --- a/docs/content/app/Bench.JRE8.md +++ b/docs/content/app/Bench.JRE8.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Java Runtime Environment 8" weight = 23 app_lib = "default" diff --git a/docs/content/app/Bench.JSHint.md b/docs/content/app/Bench.JSHint.md index b8158814..427b9cb9 100644 --- a/docs/content/app/Bench.JSHint.md +++ b/docs/content/app/Bench.JSHint.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "JSHint" weight = 54 app_lib = "default" diff --git a/docs/content/app/Bench.JabRef.md b/docs/content/app/Bench.JabRef.md index 03ef3607..688bd43d 100644 --- a/docs/content/app/Bench.JabRef.md +++ b/docs/content/app/Bench.JabRef.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "JabRef" weight = 74 app_lib = "default" diff --git a/docs/content/app/Bench.Leiningen.md b/docs/content/app/Bench.Leiningen.md index b8a94caa..23b9d62a 100644 --- a/docs/content/app/Bench.Leiningen.md +++ b/docs/content/app/Bench.Leiningen.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Leiningen" weight = 26 app_lib = "default" diff --git a/docs/content/app/Bench.LessMsi.md b/docs/content/app/Bench.LessMsi.md index c39b4755..e186e60e 100644 --- a/docs/content/app/Bench.LessMsi.md +++ b/docs/content/app/Bench.LessMsi.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Less MSIerables" weight = 1 app_lib = "core" diff --git a/docs/content/app/Bench.LightTable.md b/docs/content/app/Bench.LightTable.md index 87c3b582..7442ff3a 100644 --- a/docs/content/app/Bench.LightTable.md +++ b/docs/content/app/Bench.LightTable.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "LightTable" weight = 43 app_lib = "default" diff --git a/docs/content/app/Bench.Maven.md b/docs/content/app/Bench.Maven.md index 2763282c..508accaa 100644 --- a/docs/content/app/Bench.Maven.md +++ b/docs/content/app/Bench.Maven.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Maven" weight = 51 app_lib = "default" diff --git a/docs/content/app/Bench.MeshLab.md b/docs/content/app/Bench.MeshLab.md index bae1d710..49e8672a 100644 --- a/docs/content/app/Bench.MeshLab.md +++ b/docs/content/app/Bench.MeshLab.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:12+01:00" title = "MeshLab" weight = 86 app_lib = "default" diff --git a/docs/content/app/Bench.MiKTeX.md b/docs/content/app/Bench.MiKTeX.md index ba070e90..9798500e 100644 --- a/docs/content/app/Bench.MiKTeX.md +++ b/docs/content/app/Bench.MiKTeX.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "MiKTeX" weight = 72 app_lib = "default" diff --git a/docs/content/app/Bench.MinGW.md b/docs/content/app/Bench.MinGW.md index f00e2ab7..585ffc01 100644 --- a/docs/content/app/Bench.MinGW.md +++ b/docs/content/app/Bench.MinGW.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "MinGW" weight = 30 app_lib = "default" diff --git a/docs/content/app/Bench.MinGwGet.md b/docs/content/app/Bench.MinGwGet.md index 82ab94ba..be204e98 100644 --- a/docs/content/app/Bench.MinGwGet.md +++ b/docs/content/app/Bench.MinGwGet.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "MinGwGet" weight = 28 app_lib = "default" diff --git a/docs/content/app/Bench.MinGwGetGui.md b/docs/content/app/Bench.MinGwGetGui.md index 9739d51d..1c81948d 100644 --- a/docs/content/app/Bench.MinGwGetGui.md +++ b/docs/content/app/Bench.MinGwGetGui.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "MinGwGetGui" weight = 29 app_lib = "default" diff --git a/docs/content/app/Bench.MySQL.md b/docs/content/app/Bench.MySQL.md index a12fa91e..7a96ae77 100644 --- a/docs/content/app/Bench.MySQL.md +++ b/docs/content/app/Bench.MySQL.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "MySQL" weight = 67 app_lib = "default" diff --git a/docs/content/app/Bench.MySQLWB.md b/docs/content/app/Bench.MySQLWB.md index 185aa559..1aca2599 100644 --- a/docs/content/app/Bench.MySQLWB.md +++ b/docs/content/app/Bench.MySQLWB.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "MySQL Workbench" weight = 68 app_lib = "default" diff --git a/docs/content/app/Bench.NUnitRunners.md b/docs/content/app/Bench.NUnitRunners.md index 6df28c09..3eb0bcf0 100644 --- a/docs/content/app/Bench.NUnitRunners.md +++ b/docs/content/app/Bench.NUnitRunners.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "NUnit 3 Runners" weight = 52 app_lib = "default" diff --git a/docs/content/app/Bench.Node.md b/docs/content/app/Bench.Node.md index da84ff33..f18a384c 100644 --- a/docs/content/app/Bench.Node.md +++ b/docs/content/app/Bench.Node.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Node.js" weight = 6 app_lib = "core" diff --git a/docs/content/app/Bench.Npm.md b/docs/content/app/Bench.Npm.md index 91917423..6cd371e2 100644 --- a/docs/content/app/Bench.Npm.md +++ b/docs/content/app/Bench.Npm.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "NPM" weight = 7 app_lib = "core" diff --git a/docs/content/app/Bench.NuGet.md b/docs/content/app/Bench.NuGet.md index 0e28c238..7d0b82ca 100644 --- a/docs/content/app/Bench.NuGet.md +++ b/docs/content/app/Bench.NuGet.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "NuGet" weight = 12 app_lib = "core" diff --git a/docs/content/app/Bench.OpenSSL.md b/docs/content/app/Bench.OpenSSL.md index 0af03b2f..758807a5 100644 --- a/docs/content/app/Bench.OpenSSL.md +++ b/docs/content/app/Bench.OpenSSL.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "OpenSSL" weight = 15 app_lib = "default" diff --git a/docs/content/app/Bench.PHP5.md b/docs/content/app/Bench.PHP5.md index 164eeb2c..9ca65573 100644 --- a/docs/content/app/Bench.PHP5.md +++ b/docs/content/app/Bench.PHP5.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "PHP 5" weight = 20 app_lib = "default" diff --git a/docs/content/app/Bench.PHP7.md b/docs/content/app/Bench.PHP7.md index e532cfa9..2d9dbed2 100644 --- a/docs/content/app/Bench.PHP7.md +++ b/docs/content/app/Bench.PHP7.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "PHP 7" weight = 21 app_lib = "default" diff --git a/docs/content/app/Bench.Pandoc.md b/docs/content/app/Bench.Pandoc.md index 68141478..fc559f8a 100644 --- a/docs/content/app/Bench.Pandoc.md +++ b/docs/content/app/Bench.Pandoc.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Pandoc" weight = 73 app_lib = "default" diff --git a/docs/content/app/Bench.PostgreSQL.md b/docs/content/app/Bench.PostgreSQL.md index 2b4e7328..b4a9aeae 100644 --- a/docs/content/app/Bench.PostgreSQL.md +++ b/docs/content/app/Bench.PostgreSQL.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "PostgreSQL" weight = 69 app_lib = "default" diff --git a/docs/content/app/Bench.Putty.md b/docs/content/app/Bench.Putty.md index 53064fb4..7cad887d 100644 --- a/docs/content/app/Bench.Putty.md +++ b/docs/content/app/Bench.Putty.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Putty" weight = 18 app_lib = "default" diff --git a/docs/content/app/Bench.PyReadline2.md b/docs/content/app/Bench.PyReadline2.md index 851f89b0..f005557d 100644 --- a/docs/content/app/Bench.PyReadline2.md +++ b/docs/content/app/Bench.PyReadline2.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "PyReadline (Python 2)" weight = 55 app_lib = "default" diff --git a/docs/content/app/Bench.PyReadline3.md b/docs/content/app/Bench.PyReadline3.md index 7790fec2..5f05557a 100644 --- a/docs/content/app/Bench.PyReadline3.md +++ b/docs/content/app/Bench.PyReadline3.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "PyReadline (Python 3)" weight = 56 app_lib = "default" diff --git a/docs/content/app/Bench.Python2.md b/docs/content/app/Bench.Python2.md index 9b7e958a..7f0874ef 100644 --- a/docs/content/app/Bench.Python2.md +++ b/docs/content/app/Bench.Python2.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Python 2" weight = 10 app_lib = "core" diff --git a/docs/content/app/Bench.Python3.md b/docs/content/app/Bench.Python3.md index 8960df30..3642a1b7 100644 --- a/docs/content/app/Bench.Python3.md +++ b/docs/content/app/Bench.Python3.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Python 3" weight = 11 app_lib = "core" diff --git a/docs/content/app/Bench.RabbitMQ.md b/docs/content/app/Bench.RabbitMQ.md index 0c2e430c..48f76563 100644 --- a/docs/content/app/Bench.RabbitMQ.md +++ b/docs/content/app/Bench.RabbitMQ.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "RabbitMQ" weight = 71 app_lib = "default" diff --git a/docs/content/app/Bench.Ruby.md b/docs/content/app/Bench.Ruby.md index a7fed945..f926fa75 100644 --- a/docs/content/app/Bench.Ruby.md +++ b/docs/content/app/Bench.Ruby.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Ruby" weight = 8 app_lib = "core" diff --git a/docs/content/app/Bench.RubyGems.md b/docs/content/app/Bench.RubyGems.md index dd4152ed..74163125 100644 --- a/docs/content/app/Bench.RubyGems.md +++ b/docs/content/app/Bench.RubyGems.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "RubyGems" weight = 9 app_lib = "core" diff --git a/docs/content/app/Bench.Sass.md b/docs/content/app/Bench.Sass.md index a77f760a..cc54e3f4 100644 --- a/docs/content/app/Bench.Sass.md +++ b/docs/content/app/Bench.Sass.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "SASS" weight = 77 app_lib = "default" diff --git a/docs/content/app/Bench.Scribus.md b/docs/content/app/Bench.Scribus.md index 57bf6441..4e86588c 100644 --- a/docs/content/app/Bench.Scribus.md +++ b/docs/content/app/Bench.Scribus.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Scribus" weight = 76 app_lib = "default" diff --git a/docs/content/app/Bench.Sift.md b/docs/content/app/Bench.Sift.md index 60fb752f..6c34e6f8 100644 --- a/docs/content/app/Bench.Sift.md +++ b/docs/content/app/Bench.Sift.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Sift" weight = 61 app_lib = "default" diff --git a/docs/content/app/Bench.Spacemacs.md b/docs/content/app/Bench.Spacemacs.md index d0ace997..6aaf4c65 100644 --- a/docs/content/app/Bench.Spacemacs.md +++ b/docs/content/app/Bench.Spacemacs.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Spacemacs" weight = 39 app_lib = "default" diff --git a/docs/content/app/Bench.SublimeText3.md b/docs/content/app/Bench.SublimeText3.md index bb0eaebe..efc98e9c 100644 --- a/docs/content/app/Bench.SublimeText3.md +++ b/docs/content/app/Bench.SublimeText3.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Sublime Text 3" weight = 37 app_lib = "default" diff --git a/docs/content/app/Bench.SysInternals.md b/docs/content/app/Bench.SysInternals.md index 421c0e9f..a4d3bf74 100644 --- a/docs/content/app/Bench.SysInternals.md +++ b/docs/content/app/Bench.SysInternals.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "SysInternals" weight = 60 app_lib = "default" diff --git a/docs/content/app/Bench.TeXnicCenter.md b/docs/content/app/Bench.TeXnicCenter.md index 8a4c6761..8e28fb6b 100644 --- a/docs/content/app/Bench.TeXnicCenter.md +++ b/docs/content/app/Bench.TeXnicCenter.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "TeXnicCenter" weight = 75 app_lib = "default" diff --git a/docs/content/app/Bench.VLC.md b/docs/content/app/Bench.VLC.md index 9e07cd9c..3a6db918 100644 --- a/docs/content/app/Bench.VLC.md +++ b/docs/content/app/Bench.VLC.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "VLC Player" weight = 81 app_lib = "default" diff --git a/docs/content/app/Bench.VSCode.md b/docs/content/app/Bench.VSCode.md index a9c23410..a61b2530 100644 --- a/docs/content/app/Bench.VSCode.md +++ b/docs/content/app/Bench.VSCode.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Visual Studio Code" weight = 36 app_lib = "default" diff --git a/docs/content/app/Bench.Vim.md b/docs/content/app/Bench.Vim.md index 58d569d9..6d61b3bf 100644 --- a/docs/content/app/Bench.Vim.md +++ b/docs/content/app/Bench.Vim.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Vim" weight = 42 app_lib = "default" diff --git a/docs/content/app/Bench.VimConsole.md b/docs/content/app/Bench.VimConsole.md index baef6709..6da31d95 100644 --- a/docs/content/app/Bench.VimConsole.md +++ b/docs/content/app/Bench.VimConsole.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "VimConsole" weight = 41 app_lib = "default" diff --git a/docs/content/app/Bench.VimRT.md b/docs/content/app/Bench.VimRT.md index 73e2605f..7c349bfa 100644 --- a/docs/content/app/Bench.VimRT.md +++ b/docs/content/app/Bench.VimRT.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "VimRT" weight = 40 app_lib = "default" diff --git a/docs/content/app/Bench.Wget.md b/docs/content/app/Bench.Wget.md index 54c78594..581280a7 100644 --- a/docs/content/app/Bench.Wget.md +++ b/docs/content/app/Bench.Wget.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "Wget" weight = 13 app_lib = "core" diff --git a/docs/content/app/Bench.WgetDeps.md b/docs/content/app/Bench.WgetDeps.md index 463db343..a16667e1 100644 --- a/docs/content/app/Bench.WgetDeps.md +++ b/docs/content/app/Bench.WgetDeps.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:10+01:00" title = "WgetDeps" weight = 14 app_lib = "core" diff --git a/docs/content/app/Bench.WinMerge.md b/docs/content/app/Bench.WinMerge.md index a5836c0c..bd6051c4 100644 --- a/docs/content/app/Bench.WinMerge.md +++ b/docs/content/app/Bench.WinMerge.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "WinMerge" weight = 62 app_lib = "default" diff --git a/docs/content/app/Bench.Yeoman.md b/docs/content/app/Bench.Yeoman.md index 70e3d472..770259e1 100644 --- a/docs/content/app/Bench.Yeoman.md +++ b/docs/content/app/Bench.Yeoman.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Yeoman" weight = 50 app_lib = "default" diff --git a/docs/content/app/Bench.Zeal.md b/docs/content/app/Bench.Zeal.md index c2ccf241..017550cf 100644 --- a/docs/content/app/Bench.Zeal.md +++ b/docs/content/app/Bench.Zeal.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "Zeal Docs" weight = 59 app_lib = "default" diff --git a/docs/content/app/Bench.cURL.md b/docs/content/app/Bench.cURL.md index fa17954e..2b37fde0 100644 --- a/docs/content/app/Bench.cURL.md +++ b/docs/content/app/Bench.cURL.md @@ -1,5 +1,4 @@ +++ -date = "2017-01-06T16:00:11+01:00" title = "cURL" weight = 64 app_lib = "default" From c2a6f84de1d1253182ccbe2898ceb6f2498eb462 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 6 Jan 2017 16:13:51 +0100 Subject: [PATCH 139/230] removed unnecessary headline from app library page --- build/update-app-list.ps1 | 2 -- docs/content/ref/apps.md | 2 -- 2 files changed, 4 deletions(-) diff --git a/build/update-app-list.ps1 b/build/update-app-list.ps1 index 28267e71..99e30405 100644 --- a/build/update-app-list.ps1 +++ b/build/update-app-list.ps1 @@ -131,8 +131,6 @@ $sortedApps = $apps | sort { $_.Label } $sb = New-Object System.Text.StringBuilder $_ = $sb.Append((GetFrontMatter $targetFile)) $_ = $sb.AppendLine() -$_ = $sb.AppendLine("## Overview") -$_ = $sb.AppendLine() WriteAppTableHeader $sb foreach ($app in $sortedApps) { diff --git a/docs/content/ref/apps.md b/docs/content/ref/apps.md index e2c993df..d00c6c39 100644 --- a/docs/content/ref/apps.md +++ b/docs/content/ref/apps.md @@ -6,8 +6,6 @@ title = "App Library" weight = 1 +++ -## Overview - | Label | Version | Library | Category | |-------|---------|---------|----------| | [.NET Core SDK](/app/Bench.DotNetCore) | latest | `default` | Platforms and Programming Languages | From 0939b5b413752fc845169762ef9793fe29ec8b44 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 6 Jan 2017 19:45:27 +0100 Subject: [PATCH 140/230] moved app info pages from /app/ to /apps/, added taxonomies --- build/update-app-list.ps1 | 68 ++----------- docs/config.toml | 21 +++- docs/content/about.md | 8 +- docs/content/app/Bench.MinGW.md | 44 --------- docs/content/{app => apps}/Bench.7z.md | 8 +- .../content/{app => apps}/Bench.AntRenamer.md | 8 +- docs/content/{app => apps}/Bench.Apache.md | 8 +- docs/content/{app => apps}/Bench.Atom.md | 8 +- docs/content/{app => apps}/Bench.Blender.md | 8 +- docs/content/{app => apps}/Bench.Bower.md | 8 +- docs/content/{app => apps}/Bench.CMake.md | 8 +- docs/content/{app => apps}/Bench.Clang.md | 8 +- .../{app => apps}/Bench.CoffeeScript.md | 8 +- docs/content/{app => apps}/Bench.ConEmu.md | 8 +- docs/content/{app => apps}/Bench.Dia.md | 8 +- .../content/{app => apps}/Bench.DotNetCore.md | 11 ++- .../content/{app => apps}/Bench.EclipseCpp.md | 8 +- .../{app => apps}/Bench.EclipseJava.md | 8 +- .../content/{app => apps}/Bench.EclipsePHP.md | 8 +- docs/content/{app => apps}/Bench.Emacs.md | 8 +- docs/content/{app => apps}/Bench.Erlang.md | 8 +- docs/content/{app => apps}/Bench.FFmpeg.md | 8 +- docs/content/{app => apps}/Bench.FileZilla.md | 8 +- docs/content/{app => apps}/Bench.FreeCAD.md | 8 +- docs/content/{app => apps}/Bench.Gimp.md | 8 +- docs/content/{app => apps}/Bench.Git.md | 8 +- docs/content/{app => apps}/Bench.GitKraken.md | 8 +- docs/content/{app => apps}/Bench.GnuPG.md | 8 +- docs/content/{app => apps}/Bench.GnuTLS.md | 8 +- docs/content/{app => apps}/Bench.Go.md | 8 +- .../{app => apps}/Bench.GraphicsMagick.md | 8 +- docs/content/{app => apps}/Bench.Graphviz.md | 8 +- docs/content/{app => apps}/Bench.Grunt.md | 8 +- docs/content/{app => apps}/Bench.Gulp.md | 8 +- docs/content/{app => apps}/Bench.Hugo.md | 8 +- docs/content/{app => apps}/Bench.IPython2.md | 8 +- docs/content/{app => apps}/Bench.IPython3.md | 8 +- docs/content/{app => apps}/Bench.Inkscape.md | 8 +- docs/content/{app => apps}/Bench.InnoUnp.md | 8 +- docs/content/{app => apps}/Bench.Iron.md | 8 +- docs/content/{app => apps}/Bench.JDK7.md | 8 +- docs/content/{app => apps}/Bench.JDK8.md | 8 +- docs/content/{app => apps}/Bench.JRE7.md | 8 +- docs/content/{app => apps}/Bench.JRE8.md | 8 +- docs/content/{app => apps}/Bench.JSHint.md | 8 +- docs/content/{app => apps}/Bench.JabRef.md | 8 +- docs/content/{app => apps}/Bench.Leiningen.md | 8 +- docs/content/{app => apps}/Bench.LessMsi.md | 8 +- .../content/{app => apps}/Bench.LightTable.md | 8 +- docs/content/{app => apps}/Bench.Maven.md | 8 +- docs/content/{app => apps}/Bench.MeshLab.md | 8 +- docs/content/{app => apps}/Bench.MiKTeX.md | 8 +- docs/content/apps/Bench.MinGW.md | 55 +++++++++++ docs/content/{app => apps}/Bench.MinGwGet.md | 23 ++--- .../{app => apps}/Bench.MinGwGetGui.md | 23 ++--- docs/content/{app => apps}/Bench.MySQL.md | 8 +- docs/content/{app => apps}/Bench.MySQLWB.md | 8 +- .../{app => apps}/Bench.NUnitRunners.md | 8 +- docs/content/{app => apps}/Bench.Node.md | 8 +- docs/content/{app => apps}/Bench.Npm.md | 8 +- docs/content/{app => apps}/Bench.NuGet.md | 8 +- docs/content/{app => apps}/Bench.OpenSSL.md | 8 +- docs/content/{app => apps}/Bench.PHP5.md | 8 +- docs/content/{app => apps}/Bench.PHP7.md | 8 +- docs/content/{app => apps}/Bench.Pandoc.md | 8 +- .../content/{app => apps}/Bench.PostgreSQL.md | 8 +- docs/content/{app => apps}/Bench.Putty.md | 8 +- .../{app => apps}/Bench.PyReadline2.md | 8 +- .../{app => apps}/Bench.PyReadline3.md | 8 +- docs/content/{app => apps}/Bench.Python2.md | 8 +- docs/content/{app => apps}/Bench.Python3.md | 8 +- docs/content/{app => apps}/Bench.RabbitMQ.md | 8 +- docs/content/{app => apps}/Bench.Ruby.md | 8 +- docs/content/{app => apps}/Bench.RubyGems.md | 8 +- docs/content/{app => apps}/Bench.Sass.md | 8 +- docs/content/{app => apps}/Bench.Scribus.md | 8 +- docs/content/{app => apps}/Bench.Sift.md | 8 +- docs/content/{app => apps}/Bench.Spacemacs.md | 8 +- .../{app => apps}/Bench.SublimeText3.md | 8 +- .../{app => apps}/Bench.SysInternals.md | 8 +- .../{app => apps}/Bench.TeXnicCenter.md | 8 +- docs/content/{app => apps}/Bench.VLC.md | 8 +- docs/content/{app => apps}/Bench.VSCode.md | 8 +- docs/content/{app => apps}/Bench.Vim.md | 8 +- .../content/{app => apps}/Bench.VimConsole.md | 8 +- docs/content/{app => apps}/Bench.VimRT.md | 8 +- docs/content/{app => apps}/Bench.Wget.md | 8 +- docs/content/{app => apps}/Bench.WgetDeps.md | 8 +- docs/content/{app => apps}/Bench.WinMerge.md | 8 +- docs/content/{app => apps}/Bench.Yeoman.md | 8 +- docs/content/{app => apps}/Bench.Zeal.md | 8 +- docs/content/{app => apps}/Bench.cURL.md | 8 +- docs/content/guide/selection.md | 2 - docs/content/guide/setup.md | 4 +- docs/content/home/apps.md | 13 +++ docs/content/home/docs.md | 8 +- docs/content/ref/apps.md | 99 ------------------- docs/content/ref/config.md | 6 +- docs/content/ref/file-structure.md | 2 +- docs/content/start/work.md | 2 +- docs/content/tutorial/apps.md | 2 +- docs/layouts/section/apps.html | 44 +++++++++ docs/layouts/taxonomy/app_category.html | 27 +++++ docs/layouts/taxonomy/app_library.html | 27 +++++ docs/layouts/taxonomy/app_typ.html | 27 +++++ docs/src-content/guide/selection.md | 2 - docs/src-content/guide/setup.md | 4 +- docs/src-content/ref/config.md | 6 +- docs/src-content/tutorial/apps.md | 2 +- 109 files changed, 855 insertions(+), 347 deletions(-) delete mode 100644 docs/content/app/Bench.MinGW.md rename docs/content/{app => apps}/Bench.7z.md (78%) rename docs/content/{app => apps}/Bench.AntRenamer.md (77%) rename docs/content/{app => apps}/Bench.Apache.md (82%) rename docs/content/{app => apps}/Bench.Atom.md (77%) rename docs/content/{app => apps}/Bench.Blender.md (74%) rename docs/content/{app => apps}/Bench.Bower.md (82%) rename docs/content/{app => apps}/Bench.CMake.md (88%) rename docs/content/{app => apps}/Bench.Clang.md (83%) rename docs/content/{app => apps}/Bench.CoffeeScript.md (72%) rename docs/content/{app => apps}/Bench.ConEmu.md (79%) rename docs/content/{app => apps}/Bench.Dia.md (73%) rename docs/content/{app => apps}/Bench.DotNetCore.md (62%) rename docs/content/{app => apps}/Bench.EclipseCpp.md (76%) rename docs/content/{app => apps}/Bench.EclipseJava.md (79%) rename docs/content/{app => apps}/Bench.EclipsePHP.md (79%) rename docs/content/{app => apps}/Bench.Emacs.md (81%) rename docs/content/{app => apps}/Bench.Erlang.md (81%) rename docs/content/{app => apps}/Bench.FFmpeg.md (82%) rename docs/content/{app => apps}/Bench.FileZilla.md (76%) rename docs/content/{app => apps}/Bench.FreeCAD.md (70%) rename docs/content/{app => apps}/Bench.Gimp.md (79%) rename docs/content/{app => apps}/Bench.Git.md (80%) rename docs/content/{app => apps}/Bench.GitKraken.md (76%) rename docs/content/{app => apps}/Bench.GnuPG.md (84%) rename docs/content/{app => apps}/Bench.GnuTLS.md (75%) rename docs/content/{app => apps}/Bench.Go.md (74%) rename docs/content/{app => apps}/Bench.GraphicsMagick.md (82%) rename docs/content/{app => apps}/Bench.Graphviz.md (82%) rename docs/content/{app => apps}/Bench.Grunt.md (73%) rename docs/content/{app => apps}/Bench.Gulp.md (72%) rename docs/content/{app => apps}/Bench.Hugo.md (79%) rename docs/content/{app => apps}/Bench.IPython2.md (77%) rename docs/content/{app => apps}/Bench.IPython3.md (77%) rename docs/content/{app => apps}/Bench.Inkscape.md (76%) rename docs/content/{app => apps}/Bench.InnoUnp.md (75%) rename docs/content/{app => apps}/Bench.Iron.md (74%) rename docs/content/{app => apps}/Bench.JDK7.md (76%) rename docs/content/{app => apps}/Bench.JDK8.md (77%) rename docs/content/{app => apps}/Bench.JRE7.md (76%) rename docs/content/{app => apps}/Bench.JRE8.md (81%) rename docs/content/{app => apps}/Bench.JSHint.md (75%) rename docs/content/{app => apps}/Bench.JabRef.md (79%) rename docs/content/{app => apps}/Bench.Leiningen.md (80%) rename docs/content/{app => apps}/Bench.LessMsi.md (75%) rename docs/content/{app => apps}/Bench.LightTable.md (73%) rename docs/content/{app => apps}/Bench.Maven.md (80%) rename docs/content/{app => apps}/Bench.MeshLab.md (82%) rename docs/content/{app => apps}/Bench.MiKTeX.md (79%) create mode 100644 docs/content/apps/Bench.MinGW.md rename docs/content/{app => apps}/Bench.MinGwGet.md (55%) rename docs/content/{app => apps}/Bench.MinGwGetGui.md (54%) rename docs/content/{app => apps}/Bench.MySQL.md (83%) rename docs/content/{app => apps}/Bench.MySQLWB.md (85%) rename docs/content/{app => apps}/Bench.NUnitRunners.md (76%) rename docs/content/{app => apps}/Bench.Node.md (82%) rename docs/content/{app => apps}/Bench.Npm.md (88%) rename docs/content/{app => apps}/Bench.NuGet.md (82%) rename docs/content/{app => apps}/Bench.OpenSSL.md (80%) rename docs/content/{app => apps}/Bench.PHP5.md (81%) rename docs/content/{app => apps}/Bench.PHP7.md (81%) rename docs/content/{app => apps}/Bench.Pandoc.md (76%) rename docs/content/{app => apps}/Bench.PostgreSQL.md (87%) rename docs/content/{app => apps}/Bench.Putty.md (73%) rename docs/content/{app => apps}/Bench.PyReadline2.md (77%) rename docs/content/{app => apps}/Bench.PyReadline3.md (77%) rename docs/content/{app => apps}/Bench.Python2.md (80%) rename docs/content/{app => apps}/Bench.Python3.md (80%) rename docs/content/{app => apps}/Bench.RabbitMQ.md (80%) rename docs/content/{app => apps}/Bench.Ruby.md (79%) rename docs/content/{app => apps}/Bench.RubyGems.md (78%) rename docs/content/{app => apps}/Bench.Sass.md (76%) rename docs/content/{app => apps}/Bench.Scribus.md (79%) rename docs/content/{app => apps}/Bench.Sift.md (73%) rename docs/content/{app => apps}/Bench.Spacemacs.md (77%) rename docs/content/{app => apps}/Bench.SublimeText3.md (79%) rename docs/content/{app => apps}/Bench.SysInternals.md (77%) rename docs/content/{app => apps}/Bench.TeXnicCenter.md (75%) rename docs/content/{app => apps}/Bench.VLC.md (77%) rename docs/content/{app => apps}/Bench.VSCode.md (74%) rename docs/content/{app => apps}/Bench.Vim.md (79%) rename docs/content/{app => apps}/Bench.VimConsole.md (79%) rename docs/content/{app => apps}/Bench.VimRT.md (78%) rename docs/content/{app => apps}/Bench.Wget.md (82%) rename docs/content/{app => apps}/Bench.WgetDeps.md (79%) rename docs/content/{app => apps}/Bench.WinMerge.md (79%) rename docs/content/{app => apps}/Bench.Yeoman.md (77%) rename docs/content/{app => apps}/Bench.Zeal.md (73%) rename docs/content/{app => apps}/Bench.cURL.md (85%) create mode 100644 docs/content/home/apps.md delete mode 100644 docs/content/ref/apps.md create mode 100644 docs/layouts/section/apps.html create mode 100644 docs/layouts/taxonomy/app_category.html create mode 100644 docs/layouts/taxonomy/app_library.html create mode 100644 docs/layouts/taxonomy/app_typ.html diff --git a/build/update-app-list.ps1 b/build/update-app-list.ps1 index 99e30405..07af74e7 100644 --- a/build/update-app-list.ps1 +++ b/build/update-app-list.ps1 @@ -7,33 +7,7 @@ $cfg = New-Object Mastersign.Bench.BenchConfiguration ($rootDir, $true, $false, $apps = $cfg.Apps $targetFile = "$docsDir\content\ref\apps.md" -$targetDir = Empty-Dir "$docsDir\content\app" - -function GetFrontMatter($file) -{ - $sourceLines = [IO.File]::ReadAllLines($file, [Text.Encoding]::UTF8) - $hits = 0 - $lastHit = -1 - for ($i = 0; $i -lt $sourceLines.Length; $i++) - { - if ($sourceLines[$i] -eq "+++") - { - $hits++ - $lastHit = $i - } - if ($hits -eq 2) { break; } - } - if ($hits -eq 2) - { - $sb = New-Object System.Text.StringBuilder - for ($i = 0; $i -le $lastHit; $i++) - { - $_ = $sb.AppendLine($sourceLines[$i]) - } - return $sb.ToString() - } - return "" -} +$targetDir = Empty-Dir "$docsDir\content\apps" function WriteAppFile($app, $no) { @@ -49,16 +23,24 @@ function WriteAppFile($app, $no) $w.WriteLine("+++") $w.WriteLine("title = `"$($app.Label)`"") $w.WriteLine("weight = $no") - $w.WriteLine("app_lib = `"$($app.AppLibrary.ID)`"") + # Custom page params + $w.WriteLine("app_library = `"$($app.AppLibrary.ID)`"") $w.WriteLine("app_category = `"$($app.Category)`"") + $w.WriteLine("app_typ = `"$($app.Typ)`"") $w.WriteLine("app_ns = `"$ns`"") $w.WriteLine("app_id = `"$($app.ID)`"") $w.WriteLine("app_version = `"$version`"") + # Taxonomies + $w.WriteLine("app_categories = [`"$($app.Category)`"]") + $w.WriteLine("app_libraries = [`"$($app.AppLibrary.ID)`"]") + $w.WriteLine("app_types = [`"$($app.Typ)`"]") $w.WriteLine("+++") $w.WriteLine() $w.WriteLine("**ID:** ``$($app.ID)`` ") $w.WriteLine("**Version:** $version ") $w.WriteLine("") + $w.WriteLine() + $w.WriteLine("[Back to all apps](/apps/)") if ($app.MarkdownDocumentation) { $w.WriteLine() @@ -101,23 +83,6 @@ function WriteAppFile($app, $no) $w.Close() } -function WriteAppTableHeader($sb) -{ - $_ = $sb.AppendLine("| Label | Version | Library | Category |") - $_ = $sb.AppendLine("|-------|---------|---------|----------|") -} - -function WriteAppTableRow($sb, $app) -{ - $id = $app.ID - $label = $app.Label - $version = $app.Version - if (!$version) { $version = "latest" } - $appLib = $app.AppLibrary.ID - $category = $app.Category - $_ = $sb.AppendLine("| [${label}](/app/${id}) | $version | ``$appLib`` | $category |") -} - $no = 0 foreach ($app in $apps) { @@ -125,16 +90,3 @@ foreach ($app in $apps) Write-Host "$($no.ToString("0000")) $($app.ID)" WriteAppFile $app $no } - -$sortedApps = $apps | sort { $_.Label } - -$sb = New-Object System.Text.StringBuilder -$_ = $sb.Append((GetFrontMatter $targetFile)) -$_ = $sb.AppendLine() -WriteAppTableHeader $sb -foreach ($app in $sortedApps) -{ - WriteAppTableRow $sb $app -} -$_ = $sb.AppendLine() -[IO.File]::WriteAllText($targetFile, $sb.ToString(), [Text.Encoding]::UTF8) diff --git a/docs/config.toml b/docs/config.toml index d8742267..5f677fc8 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -10,9 +10,14 @@ canonifyurls = true relativeurls = false paginate = 10 -[indexes] +preserveTaxonomyNames = true + +[taxonomies] tag = "tags" topic = "topics" + app_library = "app_libraries" + app_category = "app_categories" + app_typ = "app_types" [params] # Shown in the home page @@ -51,28 +56,34 @@ paginate = 10 weight = 3 identifier = "start" url = "/start/" + [[menu.main]] + name = "Apps" + pre = "" + weight = 4 + indentifier = "apps" + url = "/apps/" [[menu.main]] name = "Overview" pre = "" - weight = 4 + weight = 5 identifier = "overview" url = "/overview/" [[menu.main]] name = "Tutorials" pre = "" - weight = 5 + weight = 6 identifier = "tutorials" url = "/tutorial/" [[menu.main]] name = "Tech Guides" pre = "" - weight = 6 + weight = 7 identifier = "guides" url = "/guide/" [[menu.main]] name = "Reference Docs" pre = "" - weight = 7 + weight = 8 identifier = "reference" url = "/ref/" [[menu.main]] diff --git a/docs/content/about.md b/docs/content/about.md index 057f1811..73d27de3 100644 --- a/docs/content/about.md +++ b/docs/content/about.md @@ -9,8 +9,8 @@ Bench is a portable environment for software development on Windows. The recurring pain to install and configure numerous command-line tools and other programs under Windows with all its pit falls and side-effects led to the development of Bench. -It evolved from a collection of some PowerShell scripts, into a .NET library -and a GUI for quick and easy configuration of a development environment. +It evolved from a collection of some PowerShell scripts, into a .NET library, +a CLI, and a GUI for quick and easy configuration of a development environment. It aims to feel comfortable from the command-lines perspective but at the same time to be easy to use via a graphical interface. @@ -29,13 +29,13 @@ Bench by-passes the different setup and installation programs and works with its own setup process. ## Batteries Included -Bench comes with a number of [predefined apps](/ref/apps) you just need to activate: +Bench comes with a number of [predefined apps](/apps) you just need to activate: Git, Node.js, Python, PHP, Ruby, Go, JDK, Maven, Leinigen, MinGW, Clang, MiKTeX, Eclipse, Visual Studio Code, Sublime Text 3, Emacs, GIMP, Inkscape, FFmpeg, GraphicsMagick, OpenSSL, GnuPG, ... -Take a look in the [list of included apps](/ref/apps). +Take a look in the [list of included apps](/apps). If the app you need is not included in the app library of Bench you can easily define you own custom apps. diff --git a/docs/content/app/Bench.MinGW.md b/docs/content/app/Bench.MinGW.md deleted file mode 100644 index 585ffc01..00000000 --- a/docs/content/app/Bench.MinGW.md +++ /dev/null @@ -1,44 +0,0 @@ -+++ -title = "MinGW" -weight = 30 -app_lib = "default" -app_category = "Platforms and Programming Languages" -app_ns = "Bench" -app_id = "Bench.MinGW" -app_version = "0.6.2" -+++ - -**ID:** `Bench.MinGW` -**Version:** 0.6.2 - - -## Description -(http://www.mingw.org/) provides a GNU development environment for Windows, including compilers for C/C++, Objective-C, Fortran, Ada, ... - -The MinGW package manager MinGW Get: - - -Graphical user interface for MinGW Get: - - -Meta app MinGW with package manager and graphical user interface: - - -You can adapt the preselected MinGW packages by putting something like this in your `config\config.md`: - -```Markdown - -## Source - -* Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 30 - -## Properties - -* Namespace: Bench -* Name: MinGW -* Typ: `meta` -* Website: -* Dependencies: [MinGwGet](/app/Bench.MinGwGet), [MinGwGetGui](/app/Bench.MinGwGetGui) - diff --git a/docs/content/app/Bench.7z.md b/docs/content/apps/Bench.7z.md similarity index 78% rename from docs/content/app/Bench.7z.md rename to docs/content/apps/Bench.7z.md index 2091fa47..b1452e42 100644 --- a/docs/content/app/Bench.7z.md +++ b/docs/content/apps/Bench.7z.md @@ -1,17 +1,23 @@ +++ title = "7-Zip" weight = 2 -app_lib = "core" +app_library = "core" app_category = "Required" +app_typ = "default" app_ns = "Bench" app_id = "Bench.7z" app_version = "16.04" +app_categories = ["Required"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.7z` **Version:** 16.04 +[Back to all apps](/apps/) + ## Description 7-Zip is a file archiver with a high compression ratio. It comes with a graphical file manager and supports a large range of compression formats for extraction. diff --git a/docs/content/app/Bench.AntRenamer.md b/docs/content/apps/Bench.AntRenamer.md similarity index 77% rename from docs/content/app/Bench.AntRenamer.md rename to docs/content/apps/Bench.AntRenamer.md index cdebe372..2118f953 100644 --- a/docs/content/app/Bench.AntRenamer.md +++ b/docs/content/apps/Bench.AntRenamer.md @@ -1,17 +1,23 @@ +++ title = "Ant Renamer" weight = 63 -app_lib = "default" +app_library = "default" app_category = "Filesystem" +app_typ = "default" app_ns = "Bench" app_id = "Bench.AntRenamer" app_version = "latest" +app_categories = ["Filesystem"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.AntRenamer` **Version:** latest +[Back to all apps](/apps/) + ## Description Ant Renamer is a free program that makes easier the renaming of lots of files and folders by using specified settings. diff --git a/docs/content/app/Bench.Apache.md b/docs/content/apps/Bench.Apache.md similarity index 82% rename from docs/content/app/Bench.Apache.md rename to docs/content/apps/Bench.Apache.md index 1cac1c00..b052054c 100644 --- a/docs/content/app/Bench.Apache.md +++ b/docs/content/apps/Bench.Apache.md @@ -1,17 +1,23 @@ +++ title = "Apache" weight = 70 -app_lib = "default" +app_library = "default" app_category = "Services" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Apache" app_version = "2.4.23" +app_categories = ["Services"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Apache` **Version:** 2.4.23 +[Back to all apps](/apps/) + ## Description The Apache HTTP Server is a secure, efficient and extensible server that provides HTTP services in sync with the current HTTP standards. diff --git a/docs/content/app/Bench.Atom.md b/docs/content/apps/Bench.Atom.md similarity index 77% rename from docs/content/app/Bench.Atom.md rename to docs/content/apps/Bench.Atom.md index 963d9128..cabf4dc7 100644 --- a/docs/content/app/Bench.Atom.md +++ b/docs/content/apps/Bench.Atom.md @@ -1,17 +1,23 @@ +++ title = "Atom" weight = 35 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Atom" app_version = "1.11.2" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Atom` **Version:** 1.11.2 +[Back to all apps](/apps/) + ## Description A hackable text editor for the 21st Century. diff --git a/docs/content/app/Bench.Blender.md b/docs/content/apps/Bench.Blender.md similarity index 74% rename from docs/content/app/Bench.Blender.md rename to docs/content/apps/Bench.Blender.md index 115f8991..cc77bf29 100644 --- a/docs/content/app/Bench.Blender.md +++ b/docs/content/apps/Bench.Blender.md @@ -1,17 +1,23 @@ +++ title = "Blender" weight = 87 -app_lib = "default" +app_library = "default" app_category = "3D Modeling" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Blender" app_version = "2.78" +app_categories = ["3D Modeling"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Blender` **Version:** 2.78 +[Back to all apps](/apps/) + ## Description Blender is the open source, cross platform suite of tools for 3D creation. diff --git a/docs/content/app/Bench.Bower.md b/docs/content/apps/Bench.Bower.md similarity index 82% rename from docs/content/app/Bench.Bower.md rename to docs/content/apps/Bench.Bower.md index 2f06ab31..dacbee4a 100644 --- a/docs/content/app/Bench.Bower.md +++ b/docs/content/apps/Bench.Bower.md @@ -1,17 +1,23 @@ +++ title = "Bower" weight = 49 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "node-package" app_ns = "Bench" app_id = "Bench.Bower" app_version = ">=1.7.0 <2.0.0" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["node-package"] +++ **ID:** `Bench.Bower` **Version:** >=1.7.0 <2.0.0 +[Back to all apps](/apps/) + ## Description Web sites are made of lots of things — frameworks, libraries, assets, and utilities. Bower manages all these things for you. diff --git a/docs/content/app/Bench.CMake.md b/docs/content/apps/Bench.CMake.md similarity index 88% rename from docs/content/app/Bench.CMake.md rename to docs/content/apps/Bench.CMake.md index bc2dc530..2b9e3793 100644 --- a/docs/content/app/Bench.CMake.md +++ b/docs/content/apps/Bench.CMake.md @@ -1,17 +1,23 @@ +++ title = "CMake" weight = 53 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "default" app_ns = "Bench" app_id = "Bench.CMake" app_version = "3.6.1" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.CMake` **Version:** 3.6.1 +[Back to all apps](/apps/) + ## Description CMake is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process diff --git a/docs/content/app/Bench.Clang.md b/docs/content/apps/Bench.Clang.md similarity index 83% rename from docs/content/app/Bench.Clang.md rename to docs/content/apps/Bench.Clang.md index 44b6d783..2172d33f 100644 --- a/docs/content/app/Bench.Clang.md +++ b/docs/content/apps/Bench.Clang.md @@ -1,17 +1,23 @@ +++ title = "LLVM Clang" weight = 31 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Clang" app_version = "3.8.1" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Clang` **Version:** 3.8.1 +[Back to all apps](/apps/) + ## Description The Clang compiler can act as drop-in replacement for the GCC compilers. diff --git a/docs/content/app/Bench.CoffeeScript.md b/docs/content/apps/Bench.CoffeeScript.md similarity index 72% rename from docs/content/app/Bench.CoffeeScript.md rename to docs/content/apps/Bench.CoffeeScript.md index 0272c09d..2f5f85d8 100644 --- a/docs/content/app/Bench.CoffeeScript.md +++ b/docs/content/apps/Bench.CoffeeScript.md @@ -1,17 +1,23 @@ +++ title = "CoffeeScript" weight = 34 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "node-package" app_ns = "Bench" app_id = "Bench.CoffeeScript" app_version = ">=1.10.0 <2.0.0" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["node-package"] +++ **ID:** `Bench.CoffeeScript` **Version:** >=1.10.0 <2.0.0 +[Back to all apps](/apps/) + ## Source * Library: `default` diff --git a/docs/content/app/Bench.ConEmu.md b/docs/content/apps/Bench.ConEmu.md similarity index 79% rename from docs/content/app/Bench.ConEmu.md rename to docs/content/apps/Bench.ConEmu.md index f30c415b..b8c31de0 100644 --- a/docs/content/app/Bench.ConEmu.md +++ b/docs/content/apps/Bench.ConEmu.md @@ -1,17 +1,23 @@ +++ title = "ConEmu" weight = 4 -app_lib = "core" +app_library = "core" app_category = "Required" +app_typ = "default" app_ns = "Bench" app_id = "Bench.ConEmu" app_version = "16.10.09a" +app_categories = ["Required"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.ConEmu` **Version:** 16.10.09a +[Back to all apps](/apps/) + ## Description ConEmu-Maximus5 is a Windows console emulator with tabs, which presents multiple consoles and simple GUI applications as one customizable GUI window with various features. diff --git a/docs/content/app/Bench.Dia.md b/docs/content/apps/Bench.Dia.md similarity index 73% rename from docs/content/app/Bench.Dia.md rename to docs/content/apps/Bench.Dia.md index 167b6b05..72b1f28c 100644 --- a/docs/content/app/Bench.Dia.md +++ b/docs/content/apps/Bench.Dia.md @@ -1,17 +1,23 @@ +++ title = "Dia" weight = 83 -app_lib = "default" +app_library = "default" app_category = "Multimedia" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Dia" app_version = "0.97.2" +app_categories = ["Multimedia"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Dia` **Version:** 0.97.2 +[Back to all apps](/apps/) + ## Description Dia is a program to draw structured diagrams. diff --git a/docs/content/app/Bench.DotNetCore.md b/docs/content/apps/Bench.DotNetCore.md similarity index 62% rename from docs/content/app/Bench.DotNetCore.md rename to docs/content/apps/Bench.DotNetCore.md index a349f834..786da842 100644 --- a/docs/content/app/Bench.DotNetCore.md +++ b/docs/content/apps/Bench.DotNetCore.md @@ -1,17 +1,26 @@ +++ title = ".NET Core SDK" weight = 27 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.DotNetCore" app_version = "latest" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.DotNetCore` **Version:** latest +[Back to all apps](/apps/) + +## Description +The build tools and compilers for platform independent .NET Core applications. + ## Source * Library: `default` diff --git a/docs/content/app/Bench.EclipseCpp.md b/docs/content/apps/Bench.EclipseCpp.md similarity index 76% rename from docs/content/app/Bench.EclipseCpp.md rename to docs/content/apps/Bench.EclipseCpp.md index eeae7674..bab7c6b1 100644 --- a/docs/content/app/Bench.EclipseCpp.md +++ b/docs/content/apps/Bench.EclipseCpp.md @@ -1,17 +1,23 @@ +++ title = "Eclipse for C++" weight = 46 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.EclipseCpp" app_version = "4.6" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.EclipseCpp` **Version:** 4.6 +[Back to all apps](/apps/) + ## Description An IDE for C/C++ developers with Mylyn integration. diff --git a/docs/content/app/Bench.EclipseJava.md b/docs/content/apps/Bench.EclipseJava.md similarity index 79% rename from docs/content/app/Bench.EclipseJava.md rename to docs/content/apps/Bench.EclipseJava.md index 52113a16..89e86e04 100644 --- a/docs/content/app/Bench.EclipseJava.md +++ b/docs/content/apps/Bench.EclipseJava.md @@ -1,17 +1,23 @@ +++ title = "Eclipse for Java" weight = 44 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.EclipseJava" app_version = "4.6" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.EclipseJava` **Version:** 4.6 +[Back to all apps](/apps/) + ## Description The essential tools for any Java developer, including a Java IDE, a Git client, XML Editor, Mylyn, Maven and Gradle integration... diff --git a/docs/content/app/Bench.EclipsePHP.md b/docs/content/apps/Bench.EclipsePHP.md similarity index 79% rename from docs/content/app/Bench.EclipsePHP.md rename to docs/content/apps/Bench.EclipsePHP.md index 1d60f4af..7c6fbbac 100644 --- a/docs/content/app/Bench.EclipsePHP.md +++ b/docs/content/apps/Bench.EclipsePHP.md @@ -1,17 +1,23 @@ +++ title = "Eclipse for PHP" weight = 45 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.EclipsePHP" app_version = "4.6" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.EclipsePHP` **Version:** 4.6 +[Back to all apps](/apps/) + ## Description The essential tools for any PHP developer, including PHP language support, Git client, Mylyn and editors for JavaScript, HTML, CSS and... diff --git a/docs/content/app/Bench.Emacs.md b/docs/content/apps/Bench.Emacs.md similarity index 81% rename from docs/content/app/Bench.Emacs.md rename to docs/content/apps/Bench.Emacs.md index 0899910d..e5d8345b 100644 --- a/docs/content/app/Bench.Emacs.md +++ b/docs/content/apps/Bench.Emacs.md @@ -1,17 +1,23 @@ +++ title = "Emacs" weight = 38 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Emacs" app_version = "24.5" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Emacs` **Version:** 24.5 +[Back to all apps](/apps/) + ## Description An extensible, customizable, free text editor - and more. diff --git a/docs/content/app/Bench.Erlang.md b/docs/content/apps/Bench.Erlang.md similarity index 81% rename from docs/content/app/Bench.Erlang.md rename to docs/content/apps/Bench.Erlang.md index 04310677..177b2533 100644 --- a/docs/content/app/Bench.Erlang.md +++ b/docs/content/apps/Bench.Erlang.md @@ -1,17 +1,23 @@ +++ title = "Erlang" weight = 33 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Erlang" app_version = "19.0" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Erlang` **Version:** 19.0 +[Back to all apps](/apps/) + ## Description Erlang is a programming language used to build massively scalable soft real-time systems with requirements on high availability. Some of its uses are in telecoms, banking, e-commerce, computer telephony and instant messaging. Erlang's runtime system has built-in support for concurrency, distribution and fault tolerance. diff --git a/docs/content/app/Bench.FFmpeg.md b/docs/content/apps/Bench.FFmpeg.md similarity index 82% rename from docs/content/app/Bench.FFmpeg.md rename to docs/content/apps/Bench.FFmpeg.md index 9db15644..47a14fbb 100644 --- a/docs/content/app/Bench.FFmpeg.md +++ b/docs/content/apps/Bench.FFmpeg.md @@ -1,17 +1,23 @@ +++ title = "FFmpeg" weight = 80 -app_lib = "default" +app_library = "default" app_category = "Multimedia" +app_typ = "default" app_ns = "Bench" app_id = "Bench.FFmpeg" app_version = "latest" +app_categories = ["Multimedia"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.FFmpeg` **Version:** latest +[Back to all apps](/apps/) + ## Description FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created. diff --git a/docs/content/app/Bench.FileZilla.md b/docs/content/apps/Bench.FileZilla.md similarity index 76% rename from docs/content/app/Bench.FileZilla.md rename to docs/content/apps/Bench.FileZilla.md index fe0a543a..e6bc8b6d 100644 --- a/docs/content/app/Bench.FileZilla.md +++ b/docs/content/apps/Bench.FileZilla.md @@ -1,17 +1,23 @@ +++ title = "FileZilla" weight = 65 -app_lib = "default" +app_library = "default" app_category = "Network" +app_typ = "default" app_ns = "Bench" app_id = "Bench.FileZilla" app_version = "3.20.1" +app_categories = ["Network"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.FileZilla` **Version:** 3.20.1 +[Back to all apps](/apps/) + ## Description FileZilla Client is a free, open source FTP client. It supports FTP, SFTP, and FTPS (FTP over SSL/TLS). diff --git a/docs/content/app/Bench.FreeCAD.md b/docs/content/apps/Bench.FreeCAD.md similarity index 70% rename from docs/content/app/Bench.FreeCAD.md rename to docs/content/apps/Bench.FreeCAD.md index f748f23d..ca708708 100644 --- a/docs/content/app/Bench.FreeCAD.md +++ b/docs/content/apps/Bench.FreeCAD.md @@ -1,17 +1,23 @@ +++ title = "FreeCAD" weight = 88 -app_lib = "default" +app_library = "default" app_category = "3D Modeling" +app_typ = "default" app_ns = "Bench" app_id = "Bench.FreeCAD" app_version = "0.16" +app_categories = ["3D Modeling"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.FreeCAD` **Version:** 0.16 +[Back to all apps](/apps/) + ## Source * Library: `default` diff --git a/docs/content/app/Bench.Gimp.md b/docs/content/apps/Bench.Gimp.md similarity index 79% rename from docs/content/app/Bench.Gimp.md rename to docs/content/apps/Bench.Gimp.md index 5385d32a..59136071 100644 --- a/docs/content/app/Bench.Gimp.md +++ b/docs/content/apps/Bench.Gimp.md @@ -1,17 +1,23 @@ +++ title = "GIMP" weight = 85 -app_lib = "default" +app_library = "default" app_category = "Multimedia" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Gimp" app_version = "2.8.18" +app_categories = ["Multimedia"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Gimp` **Version:** 2.8.18 +[Back to all apps](/apps/) + ## Description The GNU Image Manipulation Program. diff --git a/docs/content/app/Bench.Git.md b/docs/content/apps/Bench.Git.md similarity index 80% rename from docs/content/app/Bench.Git.md rename to docs/content/apps/Bench.Git.md index 514d4081..30f0ba27 100644 --- a/docs/content/app/Bench.Git.md +++ b/docs/content/apps/Bench.Git.md @@ -1,17 +1,23 @@ +++ title = "Git" weight = 5 -app_lib = "core" +app_library = "core" app_category = "Core" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Git" app_version = "2.10.1" +app_categories = ["Core"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.Git` **Version:** 2.10.1 +[Back to all apps](/apps/) + ## Description Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. diff --git a/docs/content/app/Bench.GitKraken.md b/docs/content/apps/Bench.GitKraken.md similarity index 76% rename from docs/content/app/Bench.GitKraken.md rename to docs/content/apps/Bench.GitKraken.md index ab414646..68d3ae4d 100644 --- a/docs/content/app/Bench.GitKraken.md +++ b/docs/content/apps/Bench.GitKraken.md @@ -1,17 +1,23 @@ +++ title = "GitKraken" weight = 19 -app_lib = "default" +app_library = "default" app_category = "Version Control" +app_typ = "default" app_ns = "Bench" app_id = "Bench.GitKraken" app_version = "latest" +app_categories = ["Version Control"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.GitKraken` **Version:** latest +[Back to all apps](/apps/) + ## Description The downright luxurious Git client, for Windows, Mac & Linux. diff --git a/docs/content/app/Bench.GnuPG.md b/docs/content/apps/Bench.GnuPG.md similarity index 84% rename from docs/content/app/Bench.GnuPG.md rename to docs/content/apps/Bench.GnuPG.md index 74f61f5a..6c6ff5ac 100644 --- a/docs/content/app/Bench.GnuPG.md +++ b/docs/content/apps/Bench.GnuPG.md @@ -1,17 +1,23 @@ +++ title = "GnuPG" weight = 17 -app_lib = "default" +app_library = "default" app_category = "Security" +app_typ = "default" app_ns = "Bench" app_id = "Bench.GnuPG" app_version = "2.0.30" +app_categories = ["Security"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.GnuPG` **Version:** 2.0.30 +[Back to all apps](/apps/) + ## Description GnuPG is a complete and free implementation of the OpenPGP standard as defined by RFC4880 (also known as PGP). GnuPG allows to encrypt and sign your data and communication, features a versatile key management system diff --git a/docs/content/app/Bench.GnuTLS.md b/docs/content/apps/Bench.GnuTLS.md similarity index 75% rename from docs/content/app/Bench.GnuTLS.md rename to docs/content/apps/Bench.GnuTLS.md index f9667fc5..3e765408 100644 --- a/docs/content/app/Bench.GnuTLS.md +++ b/docs/content/apps/Bench.GnuTLS.md @@ -1,17 +1,23 @@ +++ title = "GNU TLS" weight = 16 -app_lib = "default" +app_library = "default" app_category = "Security" +app_typ = "default" app_ns = "Bench" app_id = "Bench.GnuTLS" app_version = "3.3.11" +app_categories = ["Security"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.GnuTLS` **Version:** 3.3.11 +[Back to all apps](/apps/) + ## Description The GnuTLS Transport Layer Security Library. diff --git a/docs/content/app/Bench.Go.md b/docs/content/apps/Bench.Go.md similarity index 74% rename from docs/content/app/Bench.Go.md rename to docs/content/apps/Bench.Go.md index 2a8432ce..65659e3f 100644 --- a/docs/content/app/Bench.Go.md +++ b/docs/content/apps/Bench.Go.md @@ -1,17 +1,23 @@ +++ title = "Go" weight = 32 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Go" app_version = "1.6" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Go` **Version:** 1.6 +[Back to all apps](/apps/) + ## Description Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. diff --git a/docs/content/app/Bench.GraphicsMagick.md b/docs/content/apps/Bench.GraphicsMagick.md similarity index 82% rename from docs/content/app/Bench.GraphicsMagick.md rename to docs/content/apps/Bench.GraphicsMagick.md index a6846e8d..0ec857fa 100644 --- a/docs/content/app/Bench.GraphicsMagick.md +++ b/docs/content/apps/Bench.GraphicsMagick.md @@ -1,17 +1,23 @@ +++ title = "Graphics Magick" weight = 79 -app_lib = "default" +app_library = "default" app_category = "Multimedia" +app_typ = "default" app_ns = "Bench" app_id = "Bench.GraphicsMagick" app_version = "1.3.24" +app_categories = ["Multimedia"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.GraphicsMagick` **Version:** 1.3.24 +[Back to all apps](/apps/) + ## Description GraphicsMagick is the swiss army knife of image processing. It provides a robust and efficient collection of tools and libraries which support reading, writing, diff --git a/docs/content/app/Bench.Graphviz.md b/docs/content/apps/Bench.Graphviz.md similarity index 82% rename from docs/content/app/Bench.Graphviz.md rename to docs/content/apps/Bench.Graphviz.md index ca57edd7..7a468ea6 100644 --- a/docs/content/app/Bench.Graphviz.md +++ b/docs/content/apps/Bench.Graphviz.md @@ -1,17 +1,23 @@ +++ title = "Graphviz" weight = 82 -app_lib = "default" +app_library = "default" app_category = "Multimedia" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Graphviz" app_version = "2.38" +app_categories = ["Multimedia"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Graphviz` **Version:** 2.38 +[Back to all apps](/apps/) + ## Description Graphviz is open source graph visualization software. Graph visualization is a way of representing structural information as diagrams diff --git a/docs/content/app/Bench.Grunt.md b/docs/content/apps/Bench.Grunt.md similarity index 73% rename from docs/content/app/Bench.Grunt.md rename to docs/content/apps/Bench.Grunt.md index acbf8c74..cf8b25cf 100644 --- a/docs/content/app/Bench.Grunt.md +++ b/docs/content/apps/Bench.Grunt.md @@ -1,17 +1,23 @@ +++ title = "Grunt" weight = 48 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "node-package" app_ns = "Bench" app_id = "Bench.Grunt" app_version = ">=0.4.5 <0.5.0" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["node-package"] +++ **ID:** `Bench.Grunt` **Version:** >=0.4.5 <0.5.0 +[Back to all apps](/apps/) + ## Description The JavaScript Task Runner diff --git a/docs/content/app/Bench.Gulp.md b/docs/content/apps/Bench.Gulp.md similarity index 72% rename from docs/content/app/Bench.Gulp.md rename to docs/content/apps/Bench.Gulp.md index b06dad2c..e52c533b 100644 --- a/docs/content/app/Bench.Gulp.md +++ b/docs/content/apps/Bench.Gulp.md @@ -1,17 +1,23 @@ +++ title = "Gulp" weight = 47 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "node-package" app_ns = "Bench" app_id = "Bench.Gulp" app_version = ">=3.9.0 <4.0.0" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["node-package"] +++ **ID:** `Bench.Gulp` **Version:** >=3.9.0 <4.0.0 +[Back to all apps](/apps/) + ## Description The streaming build system. diff --git a/docs/content/app/Bench.Hugo.md b/docs/content/apps/Bench.Hugo.md similarity index 79% rename from docs/content/app/Bench.Hugo.md rename to docs/content/apps/Bench.Hugo.md index 7952b38c..cb1b8e54 100644 --- a/docs/content/app/Bench.Hugo.md +++ b/docs/content/apps/Bench.Hugo.md @@ -1,17 +1,23 @@ +++ title = "Hugo" weight = 78 -app_lib = "default" +app_library = "default" app_category = "Web" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Hugo" app_version = "0.16" +app_categories = ["Web"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Hugo` **Version:** 0.16 +[Back to all apps](/apps/) + ## Description A fast and modern static website engine. diff --git a/docs/content/app/Bench.IPython2.md b/docs/content/apps/Bench.IPython2.md similarity index 77% rename from docs/content/app/Bench.IPython2.md rename to docs/content/apps/Bench.IPython2.md index 9118b733..33a09b20 100644 --- a/docs/content/app/Bench.IPython2.md +++ b/docs/content/apps/Bench.IPython2.md @@ -1,17 +1,23 @@ +++ title = "IPython 2" weight = 57 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "python2-package" app_ns = "Bench" app_id = "Bench.IPython2" app_version = "latest" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["python2-package"] +++ **ID:** `Bench.IPython2` **Version:** latest +[Back to all apps](/apps/) + ## Description IPython provides a rich architecture for computing with a powerful interactive shell. diff --git a/docs/content/app/Bench.IPython3.md b/docs/content/apps/Bench.IPython3.md similarity index 77% rename from docs/content/app/Bench.IPython3.md rename to docs/content/apps/Bench.IPython3.md index 38a42a72..293f1f07 100644 --- a/docs/content/app/Bench.IPython3.md +++ b/docs/content/apps/Bench.IPython3.md @@ -1,17 +1,23 @@ +++ title = "IPython 3" weight = 58 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "python3-package" app_ns = "Bench" app_id = "Bench.IPython3" app_version = "latest" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["python3-package"] +++ **ID:** `Bench.IPython3` **Version:** latest +[Back to all apps](/apps/) + ## Description IPython provides a rich architecture for computing with a powerful interactive shell. diff --git a/docs/content/app/Bench.Inkscape.md b/docs/content/apps/Bench.Inkscape.md similarity index 76% rename from docs/content/app/Bench.Inkscape.md rename to docs/content/apps/Bench.Inkscape.md index 751aba2a..146b9894 100644 --- a/docs/content/app/Bench.Inkscape.md +++ b/docs/content/apps/Bench.Inkscape.md @@ -1,17 +1,23 @@ +++ title = "Inkscape" weight = 84 -app_lib = "default" +app_library = "default" app_category = "Multimedia" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Inkscape" app_version = "0.91-1" +app_categories = ["Multimedia"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Inkscape` **Version:** 0.91-1 +[Back to all apps](/apps/) + ## Description Inkscape is a professional vector graphics editor for Windows, Mac OS X and Linux. It's free and open source. diff --git a/docs/content/app/Bench.InnoUnp.md b/docs/content/apps/Bench.InnoUnp.md similarity index 75% rename from docs/content/app/Bench.InnoUnp.md rename to docs/content/apps/Bench.InnoUnp.md index ad847c24..8b15fd44 100644 --- a/docs/content/app/Bench.InnoUnp.md +++ b/docs/content/apps/Bench.InnoUnp.md @@ -1,17 +1,23 @@ +++ title = "Inno Setup Unpacker" weight = 3 -app_lib = "core" +app_library = "core" app_category = "Required" +app_typ = "default" app_ns = "Bench" app_id = "Bench.InnoUnp" app_version = "0.45" +app_categories = ["Required"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.InnoUnp` **Version:** 0.45 +[Back to all apps](/apps/) + ## Description A tool to extract the files from an Inno Setup executable. diff --git a/docs/content/app/Bench.Iron.md b/docs/content/apps/Bench.Iron.md similarity index 74% rename from docs/content/app/Bench.Iron.md rename to docs/content/apps/Bench.Iron.md index bf8cf3e9..1c3e995e 100644 --- a/docs/content/app/Bench.Iron.md +++ b/docs/content/apps/Bench.Iron.md @@ -1,17 +1,23 @@ +++ title = "SWare Iron" weight = 66 -app_lib = "default" +app_library = "default" app_category = "Network" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Iron" app_version = "latest" +app_categories = ["Network"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Iron` **Version:** latest +[Back to all apps](/apps/) + ## Description A free portable derivative of Chromium, optimized for privacy. diff --git a/docs/content/app/Bench.JDK7.md b/docs/content/apps/Bench.JDK7.md similarity index 76% rename from docs/content/app/Bench.JDK7.md rename to docs/content/apps/Bench.JDK7.md index 6ba5f274..c46db626 100644 --- a/docs/content/app/Bench.JDK7.md +++ b/docs/content/apps/Bench.JDK7.md @@ -1,17 +1,23 @@ +++ title = "Java Development Kit 7" weight = 24 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.JDK7" app_version = "7u80" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.JDK7` **Version:** 7u80 +[Back to all apps](/apps/) + ## Description According to Oracle, Java is the world's #1 programming language. diff --git a/docs/content/app/Bench.JDK8.md b/docs/content/apps/Bench.JDK8.md similarity index 77% rename from docs/content/app/Bench.JDK8.md rename to docs/content/apps/Bench.JDK8.md index c396fa00..85d57a13 100644 --- a/docs/content/app/Bench.JDK8.md +++ b/docs/content/apps/Bench.JDK8.md @@ -1,17 +1,23 @@ +++ title = "Java Development Kit 8" weight = 25 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.JDK8" app_version = "112" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.JDK8` **Version:** 112 +[Back to all apps](/apps/) + ## Description According to Oracle, Java is the world's #1 programming language. diff --git a/docs/content/app/Bench.JRE7.md b/docs/content/apps/Bench.JRE7.md similarity index 76% rename from docs/content/app/Bench.JRE7.md rename to docs/content/apps/Bench.JRE7.md index 17690818..5f3d55b8 100644 --- a/docs/content/app/Bench.JRE7.md +++ b/docs/content/apps/Bench.JRE7.md @@ -1,17 +1,23 @@ +++ title = "Java Runtime Environment 7" weight = 22 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.JRE7" app_version = "7u80" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.JRE7` **Version:** 7u80 +[Back to all apps](/apps/) + ## Description According to Oracle, Java is the world's #1 programming language. diff --git a/docs/content/app/Bench.JRE8.md b/docs/content/apps/Bench.JRE8.md similarity index 81% rename from docs/content/app/Bench.JRE8.md rename to docs/content/apps/Bench.JRE8.md index 9f086862..3f165f11 100644 --- a/docs/content/app/Bench.JRE8.md +++ b/docs/content/apps/Bench.JRE8.md @@ -1,17 +1,23 @@ +++ title = "Java Runtime Environment 8" weight = 23 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.JRE8" app_version = "112" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.JRE8` **Version:** 112 +[Back to all apps](/apps/) + ## Description According to Oracle, Java is the world's #1 programming language. diff --git a/docs/content/app/Bench.JSHint.md b/docs/content/apps/Bench.JSHint.md similarity index 75% rename from docs/content/app/Bench.JSHint.md rename to docs/content/apps/Bench.JSHint.md index 427b9cb9..d76e47cf 100644 --- a/docs/content/app/Bench.JSHint.md +++ b/docs/content/apps/Bench.JSHint.md @@ -1,17 +1,23 @@ +++ title = "JSHint" weight = 54 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "node-package" app_ns = "Bench" app_id = "Bench.JSHint" app_version = ">=2.8.0 <3.0.0" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["node-package"] +++ **ID:** `Bench.JSHint` **Version:** >=2.8.0 <3.0.0 +[Back to all apps](/apps/) + ## Description JSHint is a tool that helps to detect errors and potential problems in your JavaScript code. diff --git a/docs/content/app/Bench.JabRef.md b/docs/content/apps/Bench.JabRef.md similarity index 79% rename from docs/content/app/Bench.JabRef.md rename to docs/content/apps/Bench.JabRef.md index 688bd43d..af99eac6 100644 --- a/docs/content/app/Bench.JabRef.md +++ b/docs/content/apps/Bench.JabRef.md @@ -1,17 +1,23 @@ +++ title = "JabRef" weight = 74 -app_lib = "default" +app_library = "default" app_category = "Writing" +app_typ = "default" app_ns = "Bench" app_id = "Bench.JabRef" app_version = "3.5" +app_categories = ["Writing"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.JabRef` **Version:** 3.5 +[Back to all apps](/apps/) + ## Description JabRef is an open source bibliography reference manager. The native file format used by JabRef is BibTeX, the standard LaTeX bibliography format. diff --git a/docs/content/app/Bench.Leiningen.md b/docs/content/apps/Bench.Leiningen.md similarity index 80% rename from docs/content/app/Bench.Leiningen.md rename to docs/content/apps/Bench.Leiningen.md index 23b9d62a..596a4ed2 100644 --- a/docs/content/app/Bench.Leiningen.md +++ b/docs/content/apps/Bench.Leiningen.md @@ -1,17 +1,23 @@ +++ title = "Leiningen" weight = 26 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Leiningen" app_version = "latest" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Leiningen` **Version:** latest +[Back to all apps](/apps/) + ## Description Leiningen is the easiest way to use Clojure. With a focus on project automation and declarative configuration, diff --git a/docs/content/app/Bench.LessMsi.md b/docs/content/apps/Bench.LessMsi.md similarity index 75% rename from docs/content/app/Bench.LessMsi.md rename to docs/content/apps/Bench.LessMsi.md index e186e60e..0ca817a8 100644 --- a/docs/content/app/Bench.LessMsi.md +++ b/docs/content/apps/Bench.LessMsi.md @@ -1,17 +1,23 @@ +++ title = "Less MSIerables" weight = 1 -app_lib = "core" +app_library = "core" app_category = "Required" +app_typ = "default" app_ns = "Bench" app_id = "Bench.LessMsi" app_version = "1.3" +app_categories = ["Required"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.LessMsi` **Version:** 1.3 +[Back to all apps](/apps/) + ## Description A tool to view and extract the contents of a Windows Installer (.msi) file. diff --git a/docs/content/app/Bench.LightTable.md b/docs/content/apps/Bench.LightTable.md similarity index 73% rename from docs/content/app/Bench.LightTable.md rename to docs/content/apps/Bench.LightTable.md index 7442ff3a..ff27299a 100644 --- a/docs/content/app/Bench.LightTable.md +++ b/docs/content/apps/Bench.LightTable.md @@ -1,17 +1,23 @@ +++ title = "LightTable" weight = 43 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.LightTable" app_version = "0.8.1" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.LightTable` **Version:** 0.8.1 +[Back to all apps](/apps/) + ## Description The next generation code editor. diff --git a/docs/content/app/Bench.Maven.md b/docs/content/apps/Bench.Maven.md similarity index 80% rename from docs/content/app/Bench.Maven.md rename to docs/content/apps/Bench.Maven.md index 508accaa..c9808d4f 100644 --- a/docs/content/app/Bench.Maven.md +++ b/docs/content/apps/Bench.Maven.md @@ -1,17 +1,23 @@ +++ title = "Maven" weight = 51 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Maven" app_version = "3.3.9" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Maven` **Version:** 3.3.9 +[Back to all apps](/apps/) + ## Description Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, diff --git a/docs/content/app/Bench.MeshLab.md b/docs/content/apps/Bench.MeshLab.md similarity index 82% rename from docs/content/app/Bench.MeshLab.md rename to docs/content/apps/Bench.MeshLab.md index 49e8672a..953c8a45 100644 --- a/docs/content/app/Bench.MeshLab.md +++ b/docs/content/apps/Bench.MeshLab.md @@ -1,17 +1,23 @@ +++ title = "MeshLab" weight = 86 -app_lib = "default" +app_library = "default" app_category = "3D Modeling" +app_typ = "default" app_ns = "Bench" app_id = "Bench.MeshLab" app_version = "1.3.3" +app_categories = ["3D Modeling"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.MeshLab` **Version:** 1.3.3 +[Back to all apps](/apps/) + ## Description MeshLab is an open source, portable, and extensible system for the processing and editing of unstructured 3D triangular meshes. diff --git a/docs/content/app/Bench.MiKTeX.md b/docs/content/apps/Bench.MiKTeX.md similarity index 79% rename from docs/content/app/Bench.MiKTeX.md rename to docs/content/apps/Bench.MiKTeX.md index 9798500e..e6405999 100644 --- a/docs/content/app/Bench.MiKTeX.md +++ b/docs/content/apps/Bench.MiKTeX.md @@ -1,17 +1,23 @@ +++ title = "MiKTeX" weight = 72 -app_lib = "default" +app_library = "default" app_category = "Writing" +app_typ = "default" app_ns = "Bench" app_id = "Bench.MiKTeX" app_version = "2.9.5987" +app_categories = ["Writing"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.MiKTeX` **Version:** 2.9.5987 +[Back to all apps](/apps/) + ## Description MiKTeX (pronounced mick-tech) is an up-to-date implementation of TeX/LaTeX and related programs for Windows (all current variants). diff --git a/docs/content/apps/Bench.MinGW.md b/docs/content/apps/Bench.MinGW.md new file mode 100644 index 00000000..6de97e12 --- /dev/null +++ b/docs/content/apps/Bench.MinGW.md @@ -0,0 +1,55 @@ ++++ +title = "MinGW" +weight = 30 +app_library = "default" +app_category = "Platforms and Programming Languages" +app_typ = "meta" +app_ns = "Bench" +app_id = "Bench.MinGW" +app_version = "0.6.2" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["meta"] ++++ + +**ID:** `Bench.MinGW` +**Version:** 0.6.2 + + +[Back to all apps](/apps/) + +## Description +MinGW provides a GNU development environment for Windows, +including compilers for C/C++, Objective-C, Fortran, Ada, ... + + +You can adapt the preselected MinGW packages by putting something like this in your `config\apps.md`: + +```Markdown +* ID: `Bench.MinGW` +* Packages: + + `mingw32-base` + + `mingw32-gcc-g++` + + `mingw32-autotools` + + `msys-bash` + + `msys-grep` +``` + +After the automatic setup by _Bench_, you can use the launcher shortcut +_MinGW Package Manager_ to start the GUI for _MinGW Get_ +and install more MinGW packages. + +## Source + +* Library: `default` +* Category: Platforms and Programming Languages +* Order Index: 30 + +## Properties + +* Namespace: Bench +* Name: MinGW +* Typ: `meta` +* Website: +* Dependencies: [MinGwGet](/app/Bench.MinGwGet), [MinGwGetGui](/app/Bench.MinGwGetGui) + diff --git a/docs/content/app/Bench.MinGwGet.md b/docs/content/apps/Bench.MinGwGet.md similarity index 55% rename from docs/content/app/Bench.MinGwGet.md rename to docs/content/apps/Bench.MinGwGet.md index be204e98..e8f705b2 100644 --- a/docs/content/app/Bench.MinGwGet.md +++ b/docs/content/apps/Bench.MinGwGet.md @@ -1,32 +1,25 @@ +++ title = "MinGwGet" weight = 28 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.MinGwGet" app_version = "0.6.2" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.MinGwGet` **Version:** 0.6.2 -## Description -(http://www.mingw.org/) provides a GNU development environment for Windows, including compilers for C/C++, Objective-C, Fortran, Ada, ... - -The MinGW package manager MinGW Get: - - -Graphical user interface for MinGW Get: - +[Back to all apps](/apps/) -Meta app MinGW with package manager and graphical user interface: - - -You can adapt the preselected MinGW packages by putting something like this in your `config\config.md`: - -```Markdown +## Description +The package manager for [MinGW](http://www.mingw.org/). ## Source diff --git a/docs/content/app/Bench.MinGwGetGui.md b/docs/content/apps/Bench.MinGwGetGui.md similarity index 54% rename from docs/content/app/Bench.MinGwGetGui.md rename to docs/content/apps/Bench.MinGwGetGui.md index 1c81948d..3df2e449 100644 --- a/docs/content/app/Bench.MinGwGetGui.md +++ b/docs/content/apps/Bench.MinGwGetGui.md @@ -1,32 +1,25 @@ +++ title = "MinGwGetGui" weight = 29 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.MinGwGetGui" app_version = "0.6.2" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.MinGwGetGui` **Version:** 0.6.2 -## Description -(http://www.mingw.org/) provides a GNU development environment for Windows, including compilers for C/C++, Objective-C, Fortran, Ada, ... - -The MinGW package manager MinGW Get: - - -Graphical user interface for MinGW Get: - +[Back to all apps](/apps/) -Meta app MinGW with package manager and graphical user interface: - - -You can adapt the preselected MinGW packages by putting something like this in your `config\config.md`: - -```Markdown +## Description +A graphical user interface for the package manager of [MinGW](http://www.mingw.org/). ## Source diff --git a/docs/content/app/Bench.MySQL.md b/docs/content/apps/Bench.MySQL.md similarity index 83% rename from docs/content/app/Bench.MySQL.md rename to docs/content/apps/Bench.MySQL.md index 7a96ae77..b86e055c 100644 --- a/docs/content/app/Bench.MySQL.md +++ b/docs/content/apps/Bench.MySQL.md @@ -1,17 +1,23 @@ +++ title = "MySQL" weight = 67 -app_lib = "default" +app_library = "default" app_category = "Services" +app_typ = "default" app_ns = "Bench" app_id = "Bench.MySQL" app_version = "5.7.14" +app_categories = ["Services"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.MySQL` **Version:** 5.7.14 +[Back to all apps](/apps/) + ## Description According to Oracle: MySQL Community Edition is the freely downloadable version diff --git a/docs/content/app/Bench.MySQLWB.md b/docs/content/apps/Bench.MySQLWB.md similarity index 85% rename from docs/content/app/Bench.MySQLWB.md rename to docs/content/apps/Bench.MySQLWB.md index 1aca2599..8e2411e5 100644 --- a/docs/content/app/Bench.MySQLWB.md +++ b/docs/content/apps/Bench.MySQLWB.md @@ -1,17 +1,23 @@ +++ title = "MySQL Workbench" weight = 68 -app_lib = "default" +app_library = "default" app_category = "Services" +app_typ = "default" app_ns = "Bench" app_id = "Bench.MySQLWB" app_version = "6.3.7" +app_categories = ["Services"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.MySQLWB` **Version:** 6.3.7 +[Back to all apps](/apps/) + ## Description MySQL Workbench is a unified visual tool for database architects, developers, and DBAs. MySQL Workbench provides data modeling, SQL development, and comprehensive administration diff --git a/docs/content/app/Bench.NUnitRunners.md b/docs/content/apps/Bench.NUnitRunners.md similarity index 76% rename from docs/content/app/Bench.NUnitRunners.md rename to docs/content/apps/Bench.NUnitRunners.md index 3eb0bcf0..5090f2f6 100644 --- a/docs/content/app/Bench.NUnitRunners.md +++ b/docs/content/apps/Bench.NUnitRunners.md @@ -1,17 +1,23 @@ +++ title = "NUnit 3 Runners" weight = 52 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "nuget-package" app_ns = "Bench" app_id = "Bench.NUnitRunners" app_version = "latest" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["nuget-package"] +++ **ID:** `Bench.NUnitRunners` **Version:** latest +[Back to all apps](/apps/) + ## Description NUnit is a unit-testing framework for all .Net languages. The console runner `nunit3-console.exe` executes tests on the console. diff --git a/docs/content/app/Bench.Node.md b/docs/content/apps/Bench.Node.md similarity index 82% rename from docs/content/app/Bench.Node.md rename to docs/content/apps/Bench.Node.md index f18a384c..2c00343d 100644 --- a/docs/content/app/Bench.Node.md +++ b/docs/content/apps/Bench.Node.md @@ -1,17 +1,23 @@ +++ title = "Node.js" weight = 6 -app_lib = "core" +app_library = "core" app_category = "Core" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Node" app_version = "6.9.2" +app_categories = ["Core"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.Node` **Version:** 6.9.2 +[Back to all apps](/apps/) + ## Description Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. diff --git a/docs/content/app/Bench.Npm.md b/docs/content/apps/Bench.Npm.md similarity index 88% rename from docs/content/app/Bench.Npm.md rename to docs/content/apps/Bench.Npm.md index 6cd371e2..5e76dc71 100644 --- a/docs/content/app/Bench.Npm.md +++ b/docs/content/apps/Bench.Npm.md @@ -1,17 +1,23 @@ +++ title = "NPM" weight = 7 -app_lib = "core" +app_library = "core" app_category = "Core" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Npm" app_version = ">=4.0.0 <5.0.0" +app_categories = ["Core"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.Npm` **Version:** >=4.0.0 <5.0.0 +[Back to all apps](/apps/) + ## Description npm is the package manager for JavaScript. Find, share, and reuse packages of code from hundreds of thousands of diff --git a/docs/content/app/Bench.NuGet.md b/docs/content/apps/Bench.NuGet.md similarity index 82% rename from docs/content/app/Bench.NuGet.md rename to docs/content/apps/Bench.NuGet.md index 7d0b82ca..afed08cc 100644 --- a/docs/content/app/Bench.NuGet.md +++ b/docs/content/apps/Bench.NuGet.md @@ -1,17 +1,23 @@ +++ title = "NuGet" weight = 12 -app_lib = "core" +app_library = "core" app_category = "Core" +app_typ = "default" app_ns = "Bench" app_id = "Bench.NuGet" app_version = "latest" +app_categories = ["Core"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.NuGet` **Version:** latest +[Back to all apps](/apps/) + ## Description NuGet is the package manager for the Microsoft development platform including .NET. The NuGet client tools provide the ability to produce and consume packages. diff --git a/docs/content/app/Bench.OpenSSL.md b/docs/content/apps/Bench.OpenSSL.md similarity index 80% rename from docs/content/app/Bench.OpenSSL.md rename to docs/content/apps/Bench.OpenSSL.md index 758807a5..5101dc62 100644 --- a/docs/content/app/Bench.OpenSSL.md +++ b/docs/content/apps/Bench.OpenSSL.md @@ -1,17 +1,23 @@ +++ title = "OpenSSL" weight = 15 -app_lib = "default" +app_library = "default" app_category = "Security" +app_typ = "default" app_ns = "Bench" app_id = "Bench.OpenSSL" app_version = "1.1.0c" +app_categories = ["Security"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.OpenSSL` **Version:** 1.1.0c +[Back to all apps](/apps/) + ## Description OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. diff --git a/docs/content/app/Bench.PHP5.md b/docs/content/apps/Bench.PHP5.md similarity index 81% rename from docs/content/app/Bench.PHP5.md rename to docs/content/apps/Bench.PHP5.md index 9ca65573..186c7213 100644 --- a/docs/content/app/Bench.PHP5.md +++ b/docs/content/apps/Bench.PHP5.md @@ -1,17 +1,23 @@ +++ title = "PHP 5" weight = 20 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.PHP5" app_version = "5.6.23" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.PHP5` **Version:** 5.6.23 +[Back to all apps](/apps/) + ## Description PHP is a popular general-purpose scripting language that is especially suited to web development. Fast, flexible and pragmatic, PHP powers everything from your blog to the most popular websites in the world. diff --git a/docs/content/app/Bench.PHP7.md b/docs/content/apps/Bench.PHP7.md similarity index 81% rename from docs/content/app/Bench.PHP7.md rename to docs/content/apps/Bench.PHP7.md index 2d9dbed2..79ac8eef 100644 --- a/docs/content/app/Bench.PHP7.md +++ b/docs/content/apps/Bench.PHP7.md @@ -1,17 +1,23 @@ +++ title = "PHP 7" weight = 21 -app_lib = "default" +app_library = "default" app_category = "Platforms and Programming Languages" +app_typ = "default" app_ns = "Bench" app_id = "Bench.PHP7" app_version = "7.0.8" +app_categories = ["Platforms and Programming Languages"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.PHP7` **Version:** 7.0.8 +[Back to all apps](/apps/) + ## Description PHP is a popular general-purpose scripting language that is especially suited to web development. Fast, flexible and pragmatic, PHP powers everything from your blog to the most popular websites in the world. diff --git a/docs/content/app/Bench.Pandoc.md b/docs/content/apps/Bench.Pandoc.md similarity index 76% rename from docs/content/app/Bench.Pandoc.md rename to docs/content/apps/Bench.Pandoc.md index fc559f8a..70ac1b27 100644 --- a/docs/content/app/Bench.Pandoc.md +++ b/docs/content/apps/Bench.Pandoc.md @@ -1,17 +1,23 @@ +++ title = "Pandoc" weight = 73 -app_lib = "default" +app_library = "default" app_category = "Writing" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Pandoc" app_version = "1.17.2" +app_categories = ["Writing"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Pandoc` **Version:** 1.17.2 +[Back to all apps](/apps/) + ## Description Pandoc is a library and command-line tool for converting from one markup format to another. diff --git a/docs/content/app/Bench.PostgreSQL.md b/docs/content/apps/Bench.PostgreSQL.md similarity index 87% rename from docs/content/app/Bench.PostgreSQL.md rename to docs/content/apps/Bench.PostgreSQL.md index b4a9aeae..519e8c90 100644 --- a/docs/content/app/Bench.PostgreSQL.md +++ b/docs/content/apps/Bench.PostgreSQL.md @@ -1,17 +1,23 @@ +++ title = "PostgreSQL" weight = 69 -app_lib = "default" +app_library = "default" app_category = "Services" +app_typ = "default" app_ns = "Bench" app_id = "Bench.PostgreSQL" app_version = "9.5.3-1" +app_categories = ["Services"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.PostgreSQL` **Version:** 9.5.3-1 +[Back to all apps](/apps/) + ## Description PostgreSQL is a powerful, open source object-relational database system. It has more than 15 years of active development and a proven architecture diff --git a/docs/content/app/Bench.Putty.md b/docs/content/apps/Bench.Putty.md similarity index 73% rename from docs/content/app/Bench.Putty.md rename to docs/content/apps/Bench.Putty.md index 7cad887d..e7454f0d 100644 --- a/docs/content/app/Bench.Putty.md +++ b/docs/content/apps/Bench.Putty.md @@ -1,17 +1,23 @@ +++ title = "Putty" weight = 18 -app_lib = "default" +app_library = "default" app_category = "Security" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Putty" app_version = "latest" +app_categories = ["Security"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Putty` **Version:** latest +[Back to all apps](/apps/) + ## Description PuTTY is a free (MIT-licensed) Win32 Telnet and SSH client. diff --git a/docs/content/app/Bench.PyReadline2.md b/docs/content/apps/Bench.PyReadline2.md similarity index 77% rename from docs/content/app/Bench.PyReadline2.md rename to docs/content/apps/Bench.PyReadline2.md index f005557d..1f4b885a 100644 --- a/docs/content/app/Bench.PyReadline2.md +++ b/docs/content/apps/Bench.PyReadline2.md @@ -1,17 +1,23 @@ +++ title = "PyReadline (Python 2)" weight = 55 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "python2-package" app_ns = "Bench" app_id = "Bench.PyReadline2" app_version = "latest" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["python2-package"] +++ **ID:** `Bench.PyReadline2` **Version:** latest +[Back to all apps](/apps/) + ## Description Required for colors in IPython. diff --git a/docs/content/app/Bench.PyReadline3.md b/docs/content/apps/Bench.PyReadline3.md similarity index 77% rename from docs/content/app/Bench.PyReadline3.md rename to docs/content/apps/Bench.PyReadline3.md index 5f05557a..4d34bbcc 100644 --- a/docs/content/app/Bench.PyReadline3.md +++ b/docs/content/apps/Bench.PyReadline3.md @@ -1,17 +1,23 @@ +++ title = "PyReadline (Python 3)" weight = 56 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "python3-package" app_ns = "Bench" app_id = "Bench.PyReadline3" app_version = "latest" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["python3-package"] +++ **ID:** `Bench.PyReadline3` **Version:** latest +[Back to all apps](/apps/) + ## Description Required for colors in IPython. diff --git a/docs/content/app/Bench.Python2.md b/docs/content/apps/Bench.Python2.md similarity index 80% rename from docs/content/app/Bench.Python2.md rename to docs/content/apps/Bench.Python2.md index 7f0874ef..a944c1b1 100644 --- a/docs/content/app/Bench.Python2.md +++ b/docs/content/apps/Bench.Python2.md @@ -1,17 +1,23 @@ +++ title = "Python 2" weight = 10 -app_lib = "core" +app_library = "core" app_category = "Core" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Python2" app_version = "2.7.12" +app_categories = ["Core"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.Python2` **Version:** 2.7.12 +[Back to all apps](/apps/) + ## Description Python is a programming language that lets you work quickly and integrate systems more effectively. diff --git a/docs/content/app/Bench.Python3.md b/docs/content/apps/Bench.Python3.md similarity index 80% rename from docs/content/app/Bench.Python3.md rename to docs/content/apps/Bench.Python3.md index 3642a1b7..a3e96b0b 100644 --- a/docs/content/app/Bench.Python3.md +++ b/docs/content/apps/Bench.Python3.md @@ -1,17 +1,23 @@ +++ title = "Python 3" weight = 11 -app_lib = "core" +app_library = "core" app_category = "Core" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Python3" app_version = "3.4.4" +app_categories = ["Core"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.Python3` **Version:** 3.4.4 +[Back to all apps](/apps/) + ## Description Python is a programming language that lets you work quickly and integrate systems more effectively. diff --git a/docs/content/app/Bench.RabbitMQ.md b/docs/content/apps/Bench.RabbitMQ.md similarity index 80% rename from docs/content/app/Bench.RabbitMQ.md rename to docs/content/apps/Bench.RabbitMQ.md index 48f76563..ae851207 100644 --- a/docs/content/app/Bench.RabbitMQ.md +++ b/docs/content/apps/Bench.RabbitMQ.md @@ -1,17 +1,23 @@ +++ title = "RabbitMQ" weight = 71 -app_lib = "default" +app_library = "default" app_category = "Services" +app_typ = "default" app_ns = "Bench" app_id = "Bench.RabbitMQ" app_version = "3.6.5" +app_categories = ["Services"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.RabbitMQ` **Version:** 3.6.5 +[Back to all apps](/apps/) + ## Description RabbitMQ is ... Robust messaging for applications, diff --git a/docs/content/app/Bench.Ruby.md b/docs/content/apps/Bench.Ruby.md similarity index 79% rename from docs/content/app/Bench.Ruby.md rename to docs/content/apps/Bench.Ruby.md index f926fa75..28235893 100644 --- a/docs/content/app/Bench.Ruby.md +++ b/docs/content/apps/Bench.Ruby.md @@ -1,17 +1,23 @@ +++ title = "Ruby" weight = 8 -app_lib = "core" +app_library = "core" app_category = "Core" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Ruby" app_version = "2.3.1" +app_categories = ["Core"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.Ruby` **Version:** 2.3.1 +[Back to all apps](/apps/) + ## Description A dynamic, open source programming language with a focus on simplicity and productivity. It has an elegant syntax that is natural to read and easy to write. diff --git a/docs/content/app/Bench.RubyGems.md b/docs/content/apps/Bench.RubyGems.md similarity index 78% rename from docs/content/app/Bench.RubyGems.md rename to docs/content/apps/Bench.RubyGems.md index 74163125..36d1b6e7 100644 --- a/docs/content/app/Bench.RubyGems.md +++ b/docs/content/apps/Bench.RubyGems.md @@ -1,17 +1,23 @@ +++ title = "RubyGems" weight = 9 -app_lib = "core" +app_library = "core" app_category = "Core" +app_typ = "default" app_ns = "Bench" app_id = "Bench.RubyGems" app_version = "2.6.8" +app_categories = ["Core"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.RubyGems` **Version:** 2.6.8 +[Back to all apps](/apps/) + ## Description RubyGems is a package management framework for Ruby. diff --git a/docs/content/app/Bench.Sass.md b/docs/content/apps/Bench.Sass.md similarity index 76% rename from docs/content/app/Bench.Sass.md rename to docs/content/apps/Bench.Sass.md index cc54e3f4..137d93f2 100644 --- a/docs/content/app/Bench.Sass.md +++ b/docs/content/apps/Bench.Sass.md @@ -1,17 +1,23 @@ +++ title = "SASS" weight = 77 -app_lib = "default" +app_library = "default" app_category = "Web" +app_typ = "ruby-package" app_ns = "Bench" app_id = "Bench.Sass" app_version = "latest" +app_categories = ["Web"] +app_libraries = ["default"] +app_types = ["ruby-package"] +++ **ID:** `Bench.Sass` **Version:** latest +[Back to all apps](/apps/) + ## Description Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. diff --git a/docs/content/app/Bench.Scribus.md b/docs/content/apps/Bench.Scribus.md similarity index 79% rename from docs/content/app/Bench.Scribus.md rename to docs/content/apps/Bench.Scribus.md index 4e86588c..6c3dcb93 100644 --- a/docs/content/app/Bench.Scribus.md +++ b/docs/content/apps/Bench.Scribus.md @@ -1,17 +1,23 @@ +++ title = "Scribus" weight = 76 -app_lib = "default" +app_library = "default" app_category = "Writing" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Scribus" app_version = "1.4.6" +app_categories = ["Writing"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Scribus` **Version:** 1.4.6 +[Back to all apps](/apps/) + ## Description Scribus is a page layout program, available for a lot of operating systems. Since its humble beginning in the spring of 2001, Scribus has evolved into diff --git a/docs/content/app/Bench.Sift.md b/docs/content/apps/Bench.Sift.md similarity index 73% rename from docs/content/app/Bench.Sift.md rename to docs/content/apps/Bench.Sift.md index 6c34e6f8..7ff72cd1 100644 --- a/docs/content/app/Bench.Sift.md +++ b/docs/content/apps/Bench.Sift.md @@ -1,17 +1,23 @@ +++ title = "Sift" weight = 61 -app_lib = "default" +app_library = "default" app_category = "Filesystem" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Sift" app_version = "0.8.0" +app_categories = ["Filesystem"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Sift` **Version:** 0.8.0 +[Back to all apps](/apps/) + ## Description Sift - grep on steroids. A fast and powerful alternative to grep. diff --git a/docs/content/app/Bench.Spacemacs.md b/docs/content/apps/Bench.Spacemacs.md similarity index 77% rename from docs/content/app/Bench.Spacemacs.md rename to docs/content/apps/Bench.Spacemacs.md index 6aaf4c65..c49de34f 100644 --- a/docs/content/app/Bench.Spacemacs.md +++ b/docs/content/apps/Bench.Spacemacs.md @@ -1,17 +1,23 @@ +++ title = "Spacemacs" weight = 39 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "meta" app_ns = "Bench" app_id = "Bench.Spacemacs" app_version = "latest" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["meta"] +++ **ID:** `Bench.Spacemacs` **Version:** latest +[Back to all apps](/apps/) + ## Description The best editor is neither Emacs nor Vim, it's Emacs and Vim! diff --git a/docs/content/app/Bench.SublimeText3.md b/docs/content/apps/Bench.SublimeText3.md similarity index 79% rename from docs/content/app/Bench.SublimeText3.md rename to docs/content/apps/Bench.SublimeText3.md index efc98e9c..40fa1742 100644 --- a/docs/content/app/Bench.SublimeText3.md +++ b/docs/content/apps/Bench.SublimeText3.md @@ -1,17 +1,23 @@ +++ title = "Sublime Text 3" weight = 37 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.SublimeText3" app_version = "Build 3126" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.SublimeText3` **Version:** Build 3126 +[Back to all apps](/apps/) + ## Description Sublime Text is a sophisticated text editor for code, markup and prose. You'll love the slick user interface, extraordinary features and amazing performance. diff --git a/docs/content/app/Bench.SysInternals.md b/docs/content/apps/Bench.SysInternals.md similarity index 77% rename from docs/content/app/Bench.SysInternals.md rename to docs/content/apps/Bench.SysInternals.md index a4d3bf74..af095333 100644 --- a/docs/content/app/Bench.SysInternals.md +++ b/docs/content/apps/Bench.SysInternals.md @@ -1,17 +1,23 @@ +++ title = "SysInternals" weight = 60 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "default" app_ns = "Bench" app_id = "Bench.SysInternals" app_version = "latest" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.SysInternals` **Version:** latest +[Back to all apps](/apps/) + ## Description A collection of tools by Mark Russinovich, to inspect and investigate the Microsoft Windows operating systems and its processes. diff --git a/docs/content/app/Bench.TeXnicCenter.md b/docs/content/apps/Bench.TeXnicCenter.md similarity index 75% rename from docs/content/app/Bench.TeXnicCenter.md rename to docs/content/apps/Bench.TeXnicCenter.md index 8e28fb6b..cbf0e6c8 100644 --- a/docs/content/app/Bench.TeXnicCenter.md +++ b/docs/content/apps/Bench.TeXnicCenter.md @@ -1,17 +1,23 @@ +++ title = "TeXnicCenter" weight = 75 -app_lib = "default" +app_library = "default" app_category = "Writing" +app_typ = "default" app_ns = "Bench" app_id = "Bench.TeXnicCenter" app_version = "2.02" +app_categories = ["Writing"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.TeXnicCenter` **Version:** 2.02 +[Back to all apps](/apps/) + ## Description Premium LaTeX Editing for Windows. diff --git a/docs/content/app/Bench.VLC.md b/docs/content/apps/Bench.VLC.md similarity index 77% rename from docs/content/app/Bench.VLC.md rename to docs/content/apps/Bench.VLC.md index 3a6db918..6fddb060 100644 --- a/docs/content/app/Bench.VLC.md +++ b/docs/content/apps/Bench.VLC.md @@ -1,17 +1,23 @@ +++ title = "VLC Player" weight = 81 -app_lib = "default" +app_library = "default" app_category = "Multimedia" +app_typ = "default" app_ns = "Bench" app_id = "Bench.VLC" app_version = "2.2.4" +app_categories = ["Multimedia"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.VLC` **Version:** 2.2.4 +[Back to all apps](/apps/) + ## Description VLC is a free and open source cross-platform multimedia player and framework that plays most multimedia files, and various streaming protocols. diff --git a/docs/content/app/Bench.VSCode.md b/docs/content/apps/Bench.VSCode.md similarity index 74% rename from docs/content/app/Bench.VSCode.md rename to docs/content/apps/Bench.VSCode.md index a61b2530..6d3ed843 100644 --- a/docs/content/app/Bench.VSCode.md +++ b/docs/content/apps/Bench.VSCode.md @@ -1,17 +1,23 @@ +++ title = "Visual Studio Code" weight = 36 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.VSCode" app_version = "latest" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.VSCode` **Version:** latest +[Back to all apps](/apps/) + ## Description A cross platform code editor from Microsoft. diff --git a/docs/content/app/Bench.Vim.md b/docs/content/apps/Bench.Vim.md similarity index 79% rename from docs/content/app/Bench.Vim.md rename to docs/content/apps/Bench.Vim.md index 6d61b3bf..85033604 100644 --- a/docs/content/app/Bench.Vim.md +++ b/docs/content/apps/Bench.Vim.md @@ -1,17 +1,23 @@ +++ title = "Vim" weight = 42 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Vim" app_version = "7.4" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Vim` **Version:** 7.4 +[Back to all apps](/apps/) + ## Description Vim is a highly configurable text editor built to enable efficient text editing. It is an improved version of the vi editor distributed with most UNIX systems. diff --git a/docs/content/app/Bench.VimConsole.md b/docs/content/apps/Bench.VimConsole.md similarity index 79% rename from docs/content/app/Bench.VimConsole.md rename to docs/content/apps/Bench.VimConsole.md index 6da31d95..76edf1b4 100644 --- a/docs/content/app/Bench.VimConsole.md +++ b/docs/content/apps/Bench.VimConsole.md @@ -1,17 +1,23 @@ +++ title = "VimConsole" weight = 41 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.VimConsole" app_version = "7.4" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.VimConsole` **Version:** 7.4 +[Back to all apps](/apps/) + ## Description Vim is a highly configurable text editor built to enable efficient text editing. It is an improved version of the vi editor distributed with most UNIX systems. diff --git a/docs/content/app/Bench.VimRT.md b/docs/content/apps/Bench.VimRT.md similarity index 78% rename from docs/content/app/Bench.VimRT.md rename to docs/content/apps/Bench.VimRT.md index 7c349bfa..5c0fbd4c 100644 --- a/docs/content/app/Bench.VimRT.md +++ b/docs/content/apps/Bench.VimRT.md @@ -1,17 +1,23 @@ +++ title = "VimRT" weight = 40 -app_lib = "default" +app_library = "default" app_category = "Editors" +app_typ = "default" app_ns = "Bench" app_id = "Bench.VimRT" app_version = "7.4" +app_categories = ["Editors"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.VimRT` **Version:** 7.4 +[Back to all apps](/apps/) + ## Description Vim is a highly configurable text editor built to enable efficient text editing. It is an improved version of the vi editor distributed with most UNIX systems. diff --git a/docs/content/app/Bench.Wget.md b/docs/content/apps/Bench.Wget.md similarity index 82% rename from docs/content/app/Bench.Wget.md rename to docs/content/apps/Bench.Wget.md index 581280a7..d699021f 100644 --- a/docs/content/app/Bench.Wget.md +++ b/docs/content/apps/Bench.Wget.md @@ -1,17 +1,23 @@ +++ title = "Wget" weight = 13 -app_lib = "core" +app_library = "core" app_category = "Basics" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Wget" app_version = "1.11.4-1" +app_categories = ["Basics"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.Wget` **Version:** 1.11.4-1 +[Back to all apps](/apps/) + ## Description GNU Wget is a free utility for non-interactive download of files from the Web. It supports HTTP, HTTPS, and FTP protocols, as well as retrieval through HTTP proxies. diff --git a/docs/content/app/Bench.WgetDeps.md b/docs/content/apps/Bench.WgetDeps.md similarity index 79% rename from docs/content/app/Bench.WgetDeps.md rename to docs/content/apps/Bench.WgetDeps.md index a16667e1..9f4ab629 100644 --- a/docs/content/app/Bench.WgetDeps.md +++ b/docs/content/apps/Bench.WgetDeps.md @@ -1,17 +1,23 @@ +++ title = "WgetDeps" weight = 14 -app_lib = "core" +app_library = "core" app_category = "Basics" +app_typ = "default" app_ns = "Bench" app_id = "Bench.WgetDeps" app_version = "1.11.4-1" +app_categories = ["Basics"] +app_libraries = ["core"] +app_types = ["default"] +++ **ID:** `Bench.WgetDeps` **Version:** 1.11.4-1 +[Back to all apps](/apps/) + ## Description GNU Wget is a free utility for non-interactive download of files from the Web. It supports HTTP, HTTPS, and FTP protocols, as well as retrieval through HTTP proxies. diff --git a/docs/content/app/Bench.WinMerge.md b/docs/content/apps/Bench.WinMerge.md similarity index 79% rename from docs/content/app/Bench.WinMerge.md rename to docs/content/apps/Bench.WinMerge.md index bd6051c4..4ca5893b 100644 --- a/docs/content/app/Bench.WinMerge.md +++ b/docs/content/apps/Bench.WinMerge.md @@ -1,17 +1,23 @@ +++ title = "WinMerge" weight = 62 -app_lib = "default" +app_library = "default" app_category = "Filesystem" +app_typ = "default" app_ns = "Bench" app_id = "Bench.WinMerge" app_version = "2.14.0" +app_categories = ["Filesystem"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.WinMerge` **Version:** 2.14.0 +[Back to all apps](/apps/) + ## Description WinMerge is an Open Source differencing and merging tool for Windows. WinMerge can compare both folders and files, presenting differences in a visual text format diff --git a/docs/content/app/Bench.Yeoman.md b/docs/content/apps/Bench.Yeoman.md similarity index 77% rename from docs/content/app/Bench.Yeoman.md rename to docs/content/apps/Bench.Yeoman.md index 770259e1..c16b0b15 100644 --- a/docs/content/app/Bench.Yeoman.md +++ b/docs/content/apps/Bench.Yeoman.md @@ -1,17 +1,23 @@ +++ title = "Yeoman" weight = 50 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "node-package" app_ns = "Bench" app_id = "Bench.Yeoman" app_version = ">=1.5.0 <2.0.0" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["node-package"] +++ **ID:** `Bench.Yeoman` **Version:** >=1.5.0 <2.0.0 +[Back to all apps](/apps/) + ## Description The web's scaffolding tool for modern webapps. diff --git a/docs/content/app/Bench.Zeal.md b/docs/content/apps/Bench.Zeal.md similarity index 73% rename from docs/content/app/Bench.Zeal.md rename to docs/content/apps/Bench.Zeal.md index 017550cf..1f409042 100644 --- a/docs/content/app/Bench.Zeal.md +++ b/docs/content/apps/Bench.Zeal.md @@ -1,17 +1,23 @@ +++ title = "Zeal Docs" weight = 59 -app_lib = "default" +app_library = "default" app_category = "Software Development Utilities" +app_typ = "default" app_ns = "Bench" app_id = "Bench.Zeal" app_version = "0.2.1" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.Zeal` **Version:** 0.2.1 +[Back to all apps](/apps/) + ## Description An offline documentation browser inspired by [Dash](https://kapeli.com/dash/). diff --git a/docs/content/app/Bench.cURL.md b/docs/content/apps/Bench.cURL.md similarity index 85% rename from docs/content/app/Bench.cURL.md rename to docs/content/apps/Bench.cURL.md index 2b37fde0..8814e15a 100644 --- a/docs/content/app/Bench.cURL.md +++ b/docs/content/apps/Bench.cURL.md @@ -1,17 +1,23 @@ +++ title = "cURL" weight = 64 -app_lib = "default" +app_library = "default" app_category = "Network" +app_typ = "default" app_ns = "Bench" app_id = "Bench.cURL" app_version = "7.50.1" +app_categories = ["Network"] +app_libraries = ["default"] +app_types = ["default"] +++ **ID:** `Bench.cURL` **Version:** 7.50.1 +[Back to all apps](/apps/) + ## Description curl is an open source command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, diff --git a/docs/content/guide/selection.md b/docs/content/guide/selection.md index f22b8f8f..fbbc4500 100644 --- a/docs/content/guide/selection.md +++ b/docs/content/guide/selection.md @@ -10,7 +10,6 @@ weight = 5 [Activated Apps]: /ref/file-structure/#config-apps-activated [Deactivated Apps]: /ref/file-structure/#config-apps-deactivated [Meta App]: /ref/app-types/#meta -[Groups]: /ref/apps/#groups [Bench Dashboard]: /ref/dashbord/ [Mastersign.Bench.ActivationFile]: http://mastersign.github.io/bench/clr-api/html/T_Mastersign_Bench_ActivationFile.htm @@ -72,7 +71,6 @@ If such an app is activated, all dependencies are activated implicitely. This pattern is useful to group a number of apps for some scenario under one descriptive name. -The [groups section of the Bench app library][Groups] contains some examples. ## Activation and Deactivation The user currently has two options to activate or deactivate an app. diff --git a/docs/content/guide/setup.md b/docs/content/guide/setup.md index e1613e68..5babad40 100644 --- a/docs/content/guide/setup.md +++ b/docs/content/guide/setup.md @@ -9,7 +9,7 @@ weight = 2 [site configuration]: /ref/file-structure/#bench-site [custom configuration]: /ref/file-structure/#config-dir [Bench CLI]: /ref/bench-cli -[required apps]: /ref/apps/#apps-required +[required apps]: /app_categories/required [Bench environment file]: /ref/file-structure/#env [initialization mode]: /ref/bench-cli/#cmd_bench-manage-initialize [setup mode]: /ref/bench-cli/#cmd_bench-manage-setup @@ -28,7 +28,7 @@ The setup of a Bench installation is performed in the following steps: * Running the [bootstrap file][] ... + Downloading the (latest) Bench archive (`Bench.zip`) from GitHub + Deleting the following folders in the Bench root: `actions`, `auto`, `res`, `tmp`, - and the folders of the required apps in `lib` + and the folders of the [required apps][] in `lib` + Extracting the Bench archive * Running the [Bench CLI][] in [initialization mode][] ... + Initializing the [site configuration][] diff --git a/docs/content/home/apps.md b/docs/content/home/apps.md new file mode 100644 index 00000000..5cd48bdd --- /dev/null +++ b/docs/content/home/apps.md @@ -0,0 +1,13 @@ ++++ +date = "2017-01-06T19:35:00+02:00" +description = "What apps can I use with Bench?" +title = "Apps" +icon = "database" +follow_up_url = "/apps/" +weight = 4 ++++ + +Bench comes with libraries, which contain descriptions of Windows applications. +Such a description is called an app definition and contains the name, +the download URL of the setup package, the version, and more. +Bench uses the app definitions to download and install the apps in the Bench environment. diff --git a/docs/content/home/docs.md b/docs/content/home/docs.md index fa77894d..c113c563 100644 --- a/docs/content/home/docs.md +++ b/docs/content/home/docs.md @@ -4,14 +4,14 @@ description = "Where do I find more info?" title = "Documentation" icon = "question-circle" follow_up_url = "/overview/" -weight = 4 +weight = 5 +++ Checkout the documentation of Bench. It is well organized and structured in practice-oriented levels of detail. -There is the [Quickstart], a number of [Tutorials], [Tech Guides] -and for the details the [Reference Docs]. -If you still have a question feel free to [contact] the author. +There is the [Quickstart][], a number of [Tutorials][], [Tech Guides][] +and for the details the [Reference Docs][]. +If you still have a question feel free to [contact][] the author. [Quickstart]: /start/ [Tutorials]: /tutorial/ diff --git a/docs/content/ref/apps.md b/docs/content/ref/apps.md deleted file mode 100644 index d00c6c39..00000000 --- a/docs/content/ref/apps.md +++ /dev/null @@ -1,99 +0,0 @@ -+++ -date = "2016-06-22T13:44:20+02:00" -description = "A list with all included apps and app groups" -draft = true -title = "App Library" -weight = 1 -+++ - -| Label | Version | Library | Category | -|-------|---------|---------|----------| -| [.NET Core SDK](/app/Bench.DotNetCore) | latest | `default` | Platforms and Programming Languages | -| [7-Zip](/app/Bench.7z) | 16.04 | `core` | Required | -| [Ant Renamer](/app/Bench.AntRenamer) | latest | `default` | Filesystem | -| [Apache](/app/Bench.Apache) | 2.4.23 | `default` | Services | -| [Atom](/app/Bench.Atom) | 1.11.2 | `default` | Editors | -| [Blender](/app/Bench.Blender) | 2.78 | `default` | 3D Modeling | -| [Bower](/app/Bench.Bower) | >=1.7.0 <2.0.0 | `default` | Software Development Utilities | -| [CMake](/app/Bench.CMake) | 3.6.1 | `default` | Software Development Utilities | -| [CoffeeScript](/app/Bench.CoffeeScript) | >=1.10.0 <2.0.0 | `default` | Platforms and Programming Languages | -| [ConEmu](/app/Bench.ConEmu) | 16.10.09a | `core` | Required | -| [cURL](/app/Bench.cURL) | 7.50.1 | `default` | Network | -| [Dia](/app/Bench.Dia) | 0.97.2 | `default` | Multimedia | -| [Eclipse for C++](/app/Bench.EclipseCpp) | 4.6 | `default` | Editors | -| [Eclipse for Java](/app/Bench.EclipseJava) | 4.6 | `default` | Editors | -| [Eclipse for PHP](/app/Bench.EclipsePHP) | 4.6 | `default` | Editors | -| [Emacs](/app/Bench.Emacs) | 24.5 | `default` | Editors | -| [Erlang](/app/Bench.Erlang) | 19.0 | `default` | Platforms and Programming Languages | -| [FFmpeg](/app/Bench.FFmpeg) | latest | `default` | Multimedia | -| [FileZilla](/app/Bench.FileZilla) | 3.20.1 | `default` | Network | -| [FreeCAD](/app/Bench.FreeCAD) | 0.16 | `default` | 3D Modeling | -| [GIMP](/app/Bench.Gimp) | 2.8.18 | `default` | Multimedia | -| [Git](/app/Bench.Git) | 2.10.1 | `core` | Core | -| [GitKraken](/app/Bench.GitKraken) | latest | `default` | Version Control | -| [GNU TLS](/app/Bench.GnuTLS) | 3.3.11 | `default` | Security | -| [GnuPG](/app/Bench.GnuPG) | 2.0.30 | `default` | Security | -| [Go](/app/Bench.Go) | 1.6 | `default` | Platforms and Programming Languages | -| [Graphics Magick](/app/Bench.GraphicsMagick) | 1.3.24 | `default` | Multimedia | -| [Graphviz](/app/Bench.Graphviz) | 2.38 | `default` | Multimedia | -| [Grunt](/app/Bench.Grunt) | >=0.4.5 <0.5.0 | `default` | Software Development Utilities | -| [Gulp](/app/Bench.Gulp) | >=3.9.0 <4.0.0 | `default` | Software Development Utilities | -| [Hugo](/app/Bench.Hugo) | 0.16 | `default` | Web | -| [Inkscape](/app/Bench.Inkscape) | 0.91-1 | `default` | Multimedia | -| [Inno Setup Unpacker](/app/Bench.InnoUnp) | 0.45 | `core` | Required | -| [IPython 2](/app/Bench.IPython2) | latest | `default` | Software Development Utilities | -| [IPython 3](/app/Bench.IPython3) | latest | `default` | Software Development Utilities | -| [JabRef](/app/Bench.JabRef) | 3.5 | `default` | Writing | -| [Java Development Kit 7](/app/Bench.JDK7) | 7u80 | `default` | Platforms and Programming Languages | -| [Java Development Kit 8](/app/Bench.JDK8) | 112 | `default` | Platforms and Programming Languages | -| [Java Runtime Environment 7](/app/Bench.JRE7) | 7u80 | `default` | Platforms and Programming Languages | -| [Java Runtime Environment 8](/app/Bench.JRE8) | 112 | `default` | Platforms and Programming Languages | -| [JSHint](/app/Bench.JSHint) | >=2.8.0 <3.0.0 | `default` | Software Development Utilities | -| [Leiningen](/app/Bench.Leiningen) | latest | `default` | Platforms and Programming Languages | -| [Less MSIerables](/app/Bench.LessMsi) | 1.3 | `core` | Required | -| [LightTable](/app/Bench.LightTable) | 0.8.1 | `default` | Editors | -| [LLVM Clang](/app/Bench.Clang) | 3.8.1 | `default` | Platforms and Programming Languages | -| [Maven](/app/Bench.Maven) | 3.3.9 | `default` | Software Development Utilities | -| [MeshLab](/app/Bench.MeshLab) | 1.3.3 | `default` | 3D Modeling | -| [MiKTeX](/app/Bench.MiKTeX) | 2.9.5987 | `default` | Writing | -| [MinGW](/app/Bench.MinGW) | 0.6.2 | `default` | Platforms and Programming Languages | -| [MinGwGet](/app/Bench.MinGwGet) | 0.6.2 | `default` | Platforms and Programming Languages | -| [MinGwGetGui](/app/Bench.MinGwGetGui) | 0.6.2 | `default` | Platforms and Programming Languages | -| [MySQL](/app/Bench.MySQL) | 5.7.14 | `default` | Services | -| [MySQL Workbench](/app/Bench.MySQLWB) | 6.3.7 | `default` | Services | -| [Node.js](/app/Bench.Node) | 6.9.2 | `core` | Core | -| [NPM](/app/Bench.Npm) | >=4.0.0 <5.0.0 | `core` | Core | -| [NuGet](/app/Bench.NuGet) | latest | `core` | Core | -| [NUnit 3 Runners](/app/Bench.NUnitRunners) | latest | `default` | Software Development Utilities | -| [OpenSSL](/app/Bench.OpenSSL) | 1.1.0c | `default` | Security | -| [Pandoc](/app/Bench.Pandoc) | 1.17.2 | `default` | Writing | -| [PHP 5](/app/Bench.PHP5) | 5.6.23 | `default` | Platforms and Programming Languages | -| [PHP 7](/app/Bench.PHP7) | 7.0.8 | `default` | Platforms and Programming Languages | -| [PostgreSQL](/app/Bench.PostgreSQL) | 9.5.3-1 | `default` | Services | -| [Putty](/app/Bench.Putty) | latest | `default` | Security | -| [PyReadline (Python 2)](/app/Bench.PyReadline2) | latest | `default` | Software Development Utilities | -| [PyReadline (Python 3)](/app/Bench.PyReadline3) | latest | `default` | Software Development Utilities | -| [Python 2](/app/Bench.Python2) | 2.7.12 | `core` | Core | -| [Python 3](/app/Bench.Python3) | 3.4.4 | `core` | Core | -| [RabbitMQ](/app/Bench.RabbitMQ) | 3.6.5 | `default` | Services | -| [Ruby](/app/Bench.Ruby) | 2.3.1 | `core` | Core | -| [RubyGems](/app/Bench.RubyGems) | 2.6.8 | `core` | Core | -| [SASS](/app/Bench.Sass) | latest | `default` | Web | -| [Scribus](/app/Bench.Scribus) | 1.4.6 | `default` | Writing | -| [Sift](/app/Bench.Sift) | 0.8.0 | `default` | Filesystem | -| [Spacemacs](/app/Bench.Spacemacs) | latest | `default` | Editors | -| [Sublime Text 3](/app/Bench.SublimeText3) | Build 3126 | `default` | Editors | -| [SWare Iron](/app/Bench.Iron) | latest | `default` | Network | -| [SysInternals](/app/Bench.SysInternals) | latest | `default` | Software Development Utilities | -| [TeXnicCenter](/app/Bench.TeXnicCenter) | 2.02 | `default` | Writing | -| [Vim](/app/Bench.Vim) | 7.4 | `default` | Editors | -| [VimConsole](/app/Bench.VimConsole) | 7.4 | `default` | Editors | -| [VimRT](/app/Bench.VimRT) | 7.4 | `default` | Editors | -| [Visual Studio Code](/app/Bench.VSCode) | latest | `default` | Editors | -| [VLC Player](/app/Bench.VLC) | 2.2.4 | `default` | Multimedia | -| [Wget](/app/Bench.Wget) | 1.11.4-1 | `core` | Basics | -| [WgetDeps](/app/Bench.WgetDeps) | 1.11.4-1 | `core` | Basics | -| [WinMerge](/app/Bench.WinMerge) | 2.14.0 | `default` | Filesystem | -| [Yeoman](/app/Bench.Yeoman) | >=1.5.0 <2.0.0 | `default` | Software Development Utilities | -| [Zeal Docs](/app/Bench.Zeal) | 0.2.1 | `default` | Software Development Utilities | - diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index ef7518e9..1f160766 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -412,7 +412,7 @@ The usage in the custom scripts for apps is not completely implemented yet. * Type: User/Site This property is used to set the environment variable `USER_NAME` -and in custom scripts e.g. from [Git](/ref/apps/#Git). +and in custom scripts e.g. from [Git](/apps/Bench.Git). ### UserEmail {#UserEmail} @@ -422,7 +422,7 @@ and in custom scripts e.g. from [Git](/ref/apps/#Git). * Type: User/Site This property is used to set the environment variable `USER_EMAIL` -and in custom scripts e.g. from [Git](/ref/apps/#Git). +and in custom scripts e.g. from [Git](/apps/Bench.Git). ### AppVersionIndexDir {#AppVersionIndexDir} @@ -585,7 +585,7 @@ and in custom scripts e.g. from [Git](/ref/apps/#Git). * Default: `false` * Type: User/Site -This switch only takes affect, if the [Git app](/ref/apps/#Git) is activated. +This switch only takes affect, if the [Git app](/apps/Bench.Git) is activated. ### EditorApp {#EditorApp} diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index 37d68db0..5f05bed7 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -685,4 +685,4 @@ the value from the file, loaded latest, wins. [Bench CLI]: /ref/bench-cli [Bench Dashboard]: /ref/dashboard -[Git]: /ref/apps#Git +[Git]: /apps/Bench.Git diff --git a/docs/content/start/work.md b/docs/content/start/work.md index d2a7582a..90ce47a6 100644 --- a/docs/content/start/work.md +++ b/docs/content/start/work.md @@ -8,7 +8,7 @@ weight = 4 [Working in a Project]: /tutorial/project-work/ [Launcher]: /guide/launcher [Bench Shell]: /guide/shell -[App List]: /ref/apps +[App List]: /apps The only important thing, when working on a project in the Bench environment, is to start the IDE or text editor through its [Launcher][], diff --git a/docs/content/tutorial/apps.md b/docs/content/tutorial/apps.md index 79af603e..047ea376 100644 --- a/docs/content/tutorial/apps.md +++ b/docs/content/tutorial/apps.md @@ -110,6 +110,6 @@ Tech Guides Reference Docs -* [App Library](/ref/apps) +* [App Library](/apps) * [File Structure](/ref/file-structure) * [Bench Dashboard](/ref/dashboard) diff --git a/docs/layouts/section/apps.html b/docs/layouts/section/apps.html new file mode 100644 index 00000000..4f135a5f --- /dev/null +++ b/docs/layouts/section/apps.html @@ -0,0 +1,44 @@ +{{ partial "header.html" . }} + +
+

Apps

+

Apps and app groups in the included app libraries

+
+ +
+

App Libraries

+
    + {{ range $name, $taxonomy := .Site.Taxonomies.app_libraries }} +
  • {{ $name }}
  • + {{ end }} +
+

App Categories

+
    + {{ range $name, $taxonomy := .Site.Taxonomies.app_categories }} +
  • {{ $name }}
  • + {{ end }} +
+

App Types

+
    + {{ range $name, $taxonomy := .Site.Taxonomies.app_types }} +
  • {{ $name }}
  • + {{ end }} +
+

All Apps

+ + + + + {{ range .Data.Pages.ByTitle }} + + + + + + + + {{ end }} +
LabelVersionTypLibraryCategory
{{ .Title }}{{ .Params.app_version }}{{ range .Params.app_types }}{{ . }}{{ end }}{{ range .Params.app_libraries }}{{ . }}{{ end }}{{ range .Params.app_categories }}{{ . }}{{ end }}
+
+ +{{ partial "footer.html" . }} diff --git a/docs/layouts/taxonomy/app_category.html b/docs/layouts/taxonomy/app_category.html new file mode 100644 index 00000000..6c2d357d --- /dev/null +++ b/docs/layouts/taxonomy/app_category.html @@ -0,0 +1,27 @@ +{{ partial "header.html" . }} + +
+

App Category – {{ .Title }}

+

Apps and app groups in the category {{ .Title }}

+
+ +
+

+ Back to all apps +

+ + + + + {{ range .Data.Pages }} + + + + + + + {{ end }} +
LabelVersionTypLibrary
{{ .Title }}{{ .Params.app_version }}{{ range .Params.app_types }}{{ . }}{{ end }}{{ range .Params.app_libraries }}{{ . }}{{ end }}
+
+ +{{ partial "footer.html" . }} diff --git a/docs/layouts/taxonomy/app_library.html b/docs/layouts/taxonomy/app_library.html new file mode 100644 index 00000000..a7b0b2b8 --- /dev/null +++ b/docs/layouts/taxonomy/app_library.html @@ -0,0 +1,27 @@ +{{ partial "header.html" . }} + +
+

App Library – {{ .Title }}

+

Apps and app groups from app library {{ .Title }}

+
+ +
+

+ Back to all apps +

+ + + + + {{ range .Data.Pages }} + + + + + + + {{ end }} +
LabelVersionTypCategory
{{ .Title }}{{ .Params.app_version }}{{ range .Params.app_types }}{{ . }}{{ end }}{{ range .Params.app_categories }}{{ . }}{{ end }}
+
+ +{{ partial "footer.html" . }} diff --git a/docs/layouts/taxonomy/app_typ.html b/docs/layouts/taxonomy/app_typ.html new file mode 100644 index 00000000..9e628a9a --- /dev/null +++ b/docs/layouts/taxonomy/app_typ.html @@ -0,0 +1,27 @@ +{{ partial "header.html" . }} + +
+

App Typ – {{ .Title }}

+

Apps of the typ {{ .Title }}

+
+ +
+

+ Back to all apps +

+ + + + + {{ range .Data.Pages }} + + + + + + + {{ end }} +
LabelVersionLibraryCategory
{{ .Title }}{{ .Params.app_version }}{{ range .Params.app_libraries }}{{ . }}{{ end }}{{ range .Params.app_categories }}{{ . }}{{ end }}
+
+ +{{ partial "footer.html" . }} diff --git a/docs/src-content/guide/selection.md b/docs/src-content/guide/selection.md index b11c4bd8..f11d6a6a 100644 --- a/docs/src-content/guide/selection.md +++ b/docs/src-content/guide/selection.md @@ -10,7 +10,6 @@ weight = 5 [Activated Apps]: /ref/file-structure/#config-apps-activated [Deactivated Apps]: /ref/file-structure/#config-apps-deactivated [Meta App]: /ref/app-types/#meta -[Groups]: /ref/apps/#groups [Bench Dashboard]: /ref/dashbord/ [Mastersign.Bench.ActivationFile]: http://mastersign.github.io/bench/clr-api/html/T_Mastersign_Bench_ActivationFile.htm @@ -70,7 +69,6 @@ If such an app is activated, all dependencies are activated implicitely. This pattern is useful to group a number of apps for some scenario under one descriptive name. -The [groups section of the Bench app library][Groups] contains some examples. ## Activation and Deactivation The user currently has two options to activate or deactivate an app. diff --git a/docs/src-content/guide/setup.md b/docs/src-content/guide/setup.md index e1613e68..5babad40 100644 --- a/docs/src-content/guide/setup.md +++ b/docs/src-content/guide/setup.md @@ -9,7 +9,7 @@ weight = 2 [site configuration]: /ref/file-structure/#bench-site [custom configuration]: /ref/file-structure/#config-dir [Bench CLI]: /ref/bench-cli -[required apps]: /ref/apps/#apps-required +[required apps]: /app_categories/required [Bench environment file]: /ref/file-structure/#env [initialization mode]: /ref/bench-cli/#cmd_bench-manage-initialize [setup mode]: /ref/bench-cli/#cmd_bench-manage-setup @@ -28,7 +28,7 @@ The setup of a Bench installation is performed in the following steps: * Running the [bootstrap file][] ... + Downloading the (latest) Bench archive (`Bench.zip`) from GitHub + Deleting the following folders in the Bench root: `actions`, `auto`, `res`, `tmp`, - and the folders of the required apps in `lib` + and the folders of the [required apps][] in `lib` + Extracting the Bench archive * Running the [Bench CLI][] in [initialization mode][] ... + Initializing the [site configuration][] diff --git a/docs/src-content/ref/config.md b/docs/src-content/ref/config.md index d69d7373..d58e8ae4 100644 --- a/docs/src-content/ref/config.md +++ b/docs/src-content/ref/config.md @@ -363,7 +363,7 @@ The usage in the custom scripts for apps is not completely implemented yet. * Type: User/Site This property is used to set the environment variable `USER_NAME` -and in custom scripts e.g. from [Git](/ref/apps/#Git). +and in custom scripts e.g. from [Git](/apps/Bench.Git). ### UserEmail {#UserEmail} @@ -373,7 +373,7 @@ and in custom scripts e.g. from [Git](/ref/apps/#Git). * Type: User/Site This property is used to set the environment variable `USER_EMAIL` -and in custom scripts e.g. from [Git](/ref/apps/#Git). +and in custom scripts e.g. from [Git](/apps/Bench.Git). ### AppVersionIndexDir {#AppVersionIndexDir} @@ -536,7 +536,7 @@ and in custom scripts e.g. from [Git](/ref/apps/#Git). * Default: `false` * Type: User/Site -This switch only takes affect, if the [Git app](/ref/apps/#Git) is activated. +This switch only takes affect, if the [Git app](/apps/Bench.Git) is activated. ### EditorApp {#EditorApp} diff --git a/docs/src-content/tutorial/apps.md b/docs/src-content/tutorial/apps.md index cf348453..2f36fd00 100644 --- a/docs/src-content/tutorial/apps.md +++ b/docs/src-content/tutorial/apps.md @@ -107,6 +107,6 @@ Tech Guides Reference Docs -* [App Library](/ref/apps) +* [App Library](/apps) * [File Structure](/ref/file-structure) * [Bench Dashboard](/ref/dashboard) From 83f8e14227a5637e4ef7df75de46cfb224769073 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 09:58:04 +0100 Subject: [PATCH 141/230] updated XML doc comment to reflect multiple app libraries --- BenchManager/BenchLib/BenchConfiguration.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index 4cddf9fe..ce15718a 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -27,7 +27,7 @@ namespace Mastersign.Bench /// /// /// site - /// bench-site.md files (filename can be changed via default/custom config) + /// bench-site.md files (filename can be changed via custom config) /// /// /// @@ -35,8 +35,8 @@ namespace Mastersign.Bench /// /// /// - /// default - /// res\apps.md + /// external + /// lib\_applibs\*\apps.md /// /// /// custom From 74d5e872b16283c908b95a9845064d36637cb6d4 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 09:58:32 +0100 Subject: [PATCH 142/230] fixed bench root path validation (because /res/apps.md was removed) --- BenchManager/BenchCLI/Commands/BenchCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchCLI/Commands/BenchCommand.cs b/BenchManager/BenchCLI/Commands/BenchCommand.cs index 1120b486..83ec2a05 100644 --- a/BenchManager/BenchCLI/Commands/BenchCommand.cs +++ b/BenchManager/BenchCLI/Commands/BenchCommand.cs @@ -37,7 +37,7 @@ protected static string BenchBinDirPath() protected static string DefaultRootPath() { var rootPath = Path.GetFullPath(Path.Combine(Path.Combine(BenchBinDirPath(), ".."), "..")); - return File.Exists(Path.Combine(rootPath, @"res\apps.md")) ? rootPath : null; + return File.Exists(Path.Combine(rootPath, @"auto\lib\bench.lib.ps1")) ? rootPath : null; } protected static string DashboardExecutable(string rootDir = null) From eacbcca0767b0753f3edc1a12776086c50652112 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 11:28:24 +0100 Subject: [PATCH 143/230] updated README --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 635dc94e..74f802a0 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,19 @@ [**Bench Website**][bench-website] -Take a look at the [_About Page_][About] if you want to know why Bench exists. -Browse through the [_Usage Scenarios_][Scenarios] to learn what Bench can do for you. -And if you want to dive right in, read the [_Quickstart_][Quickstart]. +Take a look at the [_About Page_][About] if you want to know why Bench exists. +Browse through the [_Usage Scenarios_][Scenarios] to learn what Bench can do for you. +Dive right in, by reading the [_Quickstart_][Quickstart]. +And take a look at the [_App Libraries_][Apps] if you wonder if your favorite tool is supported by Bench. ![Bench Dashboard](docs/static/img/teaser.png) +## Related Repositories + +* [Core App Library](https://github.com/mastersign/bench-apps-core/) +* [Default App Library](https://github.com/mastersign/bench-apps-default/) +* [Development Configuration](https://github.com/mastersign/bench-dev-config) + ## License This project is released under the MIT license. @@ -22,3 +29,4 @@ Copyright © by Tobias Kiertscher . [About]: http://mastersign.github.io/bench/about/ [Scenarios]: http://mastersign.github.io/bench/scenarios/ [Quickstart]: http://mastersign.github.io/bench/start/ +[Apps]: http://mastersign.github.io/bench/apps/ From 25c5001acbee9b93c46150a570b25661722d6a09 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 11:36:49 +0100 Subject: [PATCH 144/230] adapted bench initialization to handle multiple external app libraries --- .../BenchCLI/Commands/InitializeCommand.cs | 70 ++++++++++++++----- BenchManager/BenchLib/BenchConfiguration.cs | 23 ++++++ BenchManager/BenchLib/BenchTasks.cs | 27 ++----- CHANGELOG.md | 5 +- docs/src-content/guide/setup.md | 5 +- docs/src-content/ref/config.md | 18 +++-- res/config.md | 1 - res/config.template.md | 8 +++ 8 files changed, 114 insertions(+), 43 deletions(-) diff --git a/BenchManager/BenchCLI/Commands/InitializeCommand.cs b/BenchManager/BenchCLI/Commands/InitializeCommand.cs index b5eee020..c1c38c7a 100644 --- a/BenchManager/BenchCLI/Commands/InitializeCommand.cs +++ b/BenchManager/BenchCLI/Commands/InitializeCommand.cs @@ -21,36 +21,73 @@ protected override void InitializeArgumentParser(ArgumentParser parser) protected override bool ExecuteCommand(string[] args) { - var cfg = BenchTasks.InitializeSiteConfiguration(RootPath); - if (cfg == null) + BenchConfiguration cfgWithSite, cfgWithCoreApps, cfgWithCustom; + + // 1. Initialize the site configuration, possibly with HTTP(S) proxy + cfgWithSite = BenchTasks.InitializeSiteConfiguration(RootPath); + if (cfgWithSite == null) { WriteInfo("Initialization canceled."); return false; } - var autoSetup = cfg.GetBooleanValue(PropertyKeys.WizzardStartAutoSetup, true); - var mgr = new DefaultBenchManager(cfg); - mgr.Verbose = Verbose; - cfg = null; + // Create a manager object to get a download manager + using (var mgrWithSite = new DefaultBenchManager(cfgWithSite)) + { + mgrWithSite.Verbose = Verbose; + // 2. Download the app libraries, listed in the Bench system and site configuration + if (!mgrWithSite.LoadAppLibraries()) + { + WriteError("Loading the core app libraries failed."); + return false; + } + } // dispose the manager object + + // Reload the configuration with the core app libraries + cfgWithCoreApps = new BenchConfiguration(RootPath, true, false, true); + cfgWithSite.InjectBenchInitializationProperties(cfgWithCoreApps); + cfgWithSite = null; - var success = mgr.SetupRequiredApps(); - if (!success) + // Create a manager object to get an execution host + using (var mgrWithCoreApps = new DefaultBenchManager(cfgWithCoreApps)) { - WriteError("Initial app setup failed."); - return false; - } + cfgWithCoreApps = null; + mgrWithCoreApps.Verbose = Verbose; + // 3. Download and install required apps from the core app library + if (!mgrWithCoreApps.SetupRequiredApps()) + { + WriteError("Initial app setup failed."); + return false; + } - cfg = BenchTasks.InitializeCustomConfiguration(mgr); - if (cfg == null) + // 4. Initialize the user configuration and reload the Bench configuration + cfgWithCustom = BenchTasks.InitializeCustomConfiguration(mgrWithCoreApps); + if (cfgWithCustom == null) + { + WriteInfo("Initialization canceled."); + return false; + } + } // dispose the manager object + + // Create a manager object to get a download manager + using (var mgrWithCustom = new DefaultBenchManager(cfgWithCustom)) { - WriteInfo("Initialization canceled."); - return false; + mgrWithCustom.Verbose = Verbose; + // 5. Download the app libraries, listed in the custom configuration + if (!mgrWithCustom.LoadAppLibraries()) + { + WriteError("Loading the app libraries failed."); + return false; + } } - mgr.Dispose(); + + // Check if the auto setup should be started right now + var autoSetup = cfgWithCustom.GetBooleanValue(PropertyKeys.WizzardStartAutoSetup, true); var dashboardPath = DashboardExecutable(); if (dashboardPath != null) { + // Kick-off the auto setup with the GUI var arguments = string.Format("-root \"{0}\"", RootPath); if (autoSetup) { @@ -67,6 +104,7 @@ protected override bool ExecuteCommand(string[] args) } else if (autoSetup) { + // Kick-off the auto setup with the CLI return RunManagerTask(m => m.AutoSetup()); } else diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index ce15718a..20eca5c5 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -464,6 +464,29 @@ private string GetBaseForPathProperty(string app, string property) } } + /// + /// Transfers a couple of temporary properties, needed during the initialization + /// of a Bench environment, to a new instance of the configuration. + /// + /// The new configuration instance. + public void InjectBenchInitializationProperties(BenchConfiguration targetCfg) + { + foreach (var key in new[] + { + PropertyKeys.CustomConfigRepository, + PropertyKeys.WizzardStartAutoSetup + }) + { + targetCfg.SetValue(key, this.GetValue(key)); + } + + if (targetCfg.GetValue(PropertyKeys.CustomConfigRepository) != null) + { + targetCfg.SetGroupCategory(AppKeys.Git, BenchConfiguration.DefaultAppCategory); + targetCfg.Apps[AppKeys.Git].ActivateAsRequired(); + } + } + /// /// The merged definition of the Bench apps as a . /// diff --git a/BenchManager/BenchLib/BenchTasks.cs b/BenchManager/BenchLib/BenchTasks.cs index f758a9b5..51448935 100644 --- a/BenchManager/BenchLib/BenchTasks.cs +++ b/BenchManager/BenchLib/BenchTasks.cs @@ -63,29 +63,14 @@ public static BenchConfiguration InitializeSiteConfiguration(string benchRootDir } } - var resultCfg = new BenchConfiguration(benchRootDir, true, false, true); - - // transfer intermediate results from wizzard to following initialization steps - foreach (var key in new[] - { - PropertyKeys.CustomConfigRepository, - PropertyKeys.WizzardStartAutoSetup - }) - { - resultCfg.SetValue(key, cfg.GetValue(key)); - } - - if (resultCfg.GetValue(PropertyKeys.CustomConfigRepository) != null) - { - resultCfg.SetGroupCategory(AppKeys.Git, BenchConfiguration.DefaultAppCategory); - resultCfg.Apps[AppKeys.Git].ActivateAsRequired(); - } + var resultCfg = new BenchConfiguration(benchRootDir, false, false, true); + cfg.InjectBenchInitializationProperties(resultCfg); return resultCfg; } /// - /// This method is the second step for initializing or upgrading a Bench installation. + /// This method is the last fourth for initializing or upgrading a Bench installation. /// /// /// @@ -148,6 +133,7 @@ public static BenchConfiguration InitializeCustomConfiguration(IBenchManager man } var cfg = new BenchConfiguration(man.Config.BenchRootDir, false, true, true); + man.Config.InjectBenchInitializationProperties(cfg); var homeDir = cfg.GetStringValue(PropertyKeys.HomeDir); FileSystem.AsureDir(homeDir); @@ -187,7 +173,9 @@ public static BenchConfiguration InitializeCustomConfiguration(IBenchManager man File.Copy(conEmuConfigTemplateFile, conEmuConfigFile, false); } - return new BenchConfiguration(man.Config.BenchRootDir, true, true, true); + var resultCfg = new BenchConfiguration(man.Config.BenchRootDir, true, true, true); + cfg.InjectBenchInitializationProperties(resultCfg); + return resultCfg; } /// @@ -580,7 +568,6 @@ public static ActionResult DoAutoSetup(IBenchManager man, man.Config.Apps.ActiveApps }, notify, cancelation, - UninstallApps, DownloadAppResources, InstallApps, diff --git a/CHANGELOG.md b/CHANGELOG.md index 1307e9c9..83339c1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,7 +37,8 @@ Add a link to the GitHub diff like ([#90](https://github.com/mastersign/bench/issues/90)) - Namespaces for app IDs - Config properties: - + `AppLibs` + + `AppLibs` + (this property must be overriden in the user or site config, to load more than the core app library) + `AppLibsDownloadDir` + `AppLibsDir` + `AppLibIndexFileName` @@ -60,6 +61,8 @@ Add a link to the GitHub diff like ### Removed - Script based actions +- Embedded app library + **(the `AppLibs` property must be overriden in the user or site config now, to load more than the core app library)** - Config properties + `ActionDir` + `AppIndexFile` diff --git a/docs/src-content/guide/setup.md b/docs/src-content/guide/setup.md index 5babad40..44167135 100644 --- a/docs/src-content/guide/setup.md +++ b/docs/src-content/guide/setup.md @@ -9,6 +9,7 @@ weight = 2 [site configuration]: /ref/file-structure/#bench-site [custom configuration]: /ref/file-structure/#config-dir [Bench CLI]: /ref/bench-cli +[app libraries]: /ref/config/#AppLibs [required apps]: /app_categories/required [Bench environment file]: /ref/file-structure/#env [initialization mode]: /ref/bench-cli/#cmd_bench-manage-initialize @@ -17,7 +18,7 @@ weight = 2 Bench is installed and upgraded with a [bootstrap file][], which downloads the archive `Bench.zip` with the Bench system files, extracts its content in the Bench root directory, and starts the [Bench CLI][] with the [initialization mode][] and the [setup mode][]. -The custom configuration is left untouched if it is already exists; +The custom configuration is left untouched if it already exists; otherwise it can be initialized from a template or from a Git repository. @@ -32,9 +33,11 @@ The setup of a Bench installation is performed in the following steps: + Extracting the Bench archive * Running the [Bench CLI][] in [initialization mode][] ... + Initializing the [site configuration][] + + Downloading missing [app libraries][] + Downloading missing app resources for [required apps][] + Installing the [required apps][] + Initializing the [custom configuration][] from template or existing Git repository + + Downloading missing [app libraries][] * Running the [Bench CLI][] in [setup mode][] ... + Downloading missing app resources for activated apps + Installing activated apps diff --git a/docs/src-content/ref/config.md b/docs/src-content/ref/config.md index d58e8ae4..7073e0f9 100644 --- a/docs/src-content/ref/config.md +++ b/docs/src-content/ref/config.md @@ -148,12 +148,10 @@ The specified file must be a Markdown file and follow the [Markdown list syntax] * Description: A table with URLs of app libraries to load in the Bench environment. * Data Type: dictionary -* Default: ... - + `core`: `github:mastersign/bench-apps-core` - + `default`: `github:mastersign/bench-apps-default` +* Default: `core: github:mastersign/bench-apps-core` * Type: User -The table consists of key/value pairs. +The table consists of [key/value pairs](/ref/markup-syntax/#lists-and-dictionaries). Where the key is a unique ID for the app library inside the Bench environment, and the value is an URL to a ZIP file with the app library. The order of the table entries dictates the order in which the app libraries are loaded. @@ -165,6 +163,18 @@ If the app library is hosted as a GitHub repository, a short form for the URL can be used: `github:/`; which is automatically expanded to an URL with the `https` protocol. +The default value of the base configuration contains only apps, which +are required or directly known by Bench. This value should be overridden +in the user or site configuration, to include more app libraries. + +For starters the following list of app libraries is advised: + +```Markdown +* `AppLibs`: + + `core`: `github:mastersign/bench-apps-core` + + `default`: `github:mastersign/bench-apps-default` +``` + ### AppLibsDir {#AppLibsDir} * Description: The path of the directory, where to load the app libraries. diff --git a/res/config.md b/res/config.md index 70b62608..dbef7ff9 100644 --- a/res/config.md +++ b/res/config.md @@ -35,7 +35,6 @@ * LibDir: `lib` * AppLibs: + `core`: `github:mastersign/bench-apps-core` - + `default`: `github:mastersign/bench-apps-default` * AppLibsDir: `$LibDir$\_applibs` * AppLibsDownloadDir: `$DownloadDir$\_applibs` * AppLibIndexFileName: `apps.md` diff --git a/res/config.template.md b/res/config.template.md index ee4a5273..f10193fd 100644 --- a/res/config.template.md +++ b/res/config.template.md @@ -11,6 +11,14 @@ With the following properties you can control the composition of the environment * ~~EnvironmentPath: `$HomeDir$\bin`~~ * ~~Environment: `MY_VAR: my custom value`~~ +## App Libraries + +Here you list all app libraries you want to use in this Bench environment. + +* AppLibs: + + `core`: `github:mastersign/bench-apps-core` + + `default`: `github:mastersign/bench-apps-default` + ## Quick Access With the following properties you can control the appearance of the launchers for the three shells. From c50dc33a17dbdd8973016edba5a5a67a768cf517 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 11:37:26 +0100 Subject: [PATCH 145/230] improved user apps template --- res/apps.template.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/res/apps.template.md b/res/apps.template.md index 3b91867a..97b633ab 100644 --- a/res/apps.template.md +++ b/res/apps.template.md @@ -1,4 +1,4 @@ -# User Apps +# User App Library This document is the registry for user defined applications in _Bench_. @@ -14,6 +14,6 @@ Activate your apps by adding them to the list of activated apps in `apps-activat or activate them via the _Bench Dashboard_ setup dialog, or activate them by calling `bench app activate `. -## App Definitions +## User -Place your app definitions here. +Place your own app definitions here. From 5c3a9b79d39413961e172231948289fad777d187 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 11:37:41 +0100 Subject: [PATCH 146/230] added hint about app issues to the changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83339c1f..964df469 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ Add a link to the GitHub diff like - Moved app definitions into their own Git repositories + + +- In the future, all app related issues are attended at the app library repositories on GitHub ### Fixed - Proxy setup for Maven From 7b887fa19ddc6f6b44f2f54094497443fb3c4c09 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 11:38:03 +0100 Subject: [PATCH 147/230] adapted bench-install.bat to use the Bench CLI for initialization --- res/bench-install.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/bench-install.bat b/res/bench-install.bat index 4726fd79..f4bd9e1d 100644 --- a/res/bench-install.bat +++ b/res/bench-install.bat @@ -23,8 +23,8 @@ CALL :EXTRACT "%BENCH_ZIPFILE%" "%BENCH_SUBFLDR%" "%BENCH_DIR%" ECHO.Deleting ZIP files ... DEL "%BENCH_ZIPFILE%" -ECHO.Running initialization script ... -CALL .\actions\bench-ctl.cmd initialize +ECHO.Running initialization command ... +CALL .\auto\bin\bench.exe --verbose manage initialize POPD REM Trick to exit the script before deleting it From b601c02131f25581d75f6f4c8ef96d32d77883a1 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 11:43:28 +0100 Subject: [PATCH 148/230] improved visibility of BenchConfiguration.InjectBenchInitializationProperties() --- BenchManager/BenchLib/BenchConfiguration.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index 20eca5c5..b0b2d20b 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -469,7 +469,7 @@ private string GetBaseForPathProperty(string app, string property) /// of a Bench environment, to a new instance of the configuration. /// /// The new configuration instance. - public void InjectBenchInitializationProperties(BenchConfiguration targetCfg) + internal void InjectBenchInitializationProperties(BenchConfiguration targetCfg) { foreach (var key in new[] { From ef812f5527bb92b27d83cb0db1f22eeecd33f6d9 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 13:27:42 +0100 Subject: [PATCH 149/230] adapted UI to allow viewing multiple external loaded libraries in the Markdown viewer --- .../BenchDashboard/BenchDashboard.csproj | 4 ++- BenchManager/BenchDashboard/MainForm.cs | 31 +++++++++++++----- .../Properties/Resources.Designer.cs | 20 +++++++++++ .../BenchDashboard/Properties/Resources.resx | 6 ++++ .../BenchDashboard/Resources/book_16.png | Bin 0 -> 213 bytes .../BenchDashboard/Resources/books_16.png | Bin 0 -> 236 bytes .../BenchDashboard/SetupForm.Designer.cs | 3 +- BenchManager/BenchDashboard/SetupForm.cs | 28 +++++++++++++--- 8 files changed, 76 insertions(+), 16 deletions(-) create mode 100644 BenchManager/BenchDashboard/Resources/book_16.png create mode 100644 BenchManager/BenchDashboard/Resources/books_16.png diff --git a/BenchManager/BenchDashboard/BenchDashboard.csproj b/BenchManager/BenchDashboard/BenchDashboard.csproj index a16e286e..fd425a12 100644 --- a/BenchManager/BenchDashboard/BenchDashboard.csproj +++ b/BenchManager/BenchDashboard/BenchDashboard.csproj @@ -209,6 +209,8 @@ + + @@ -217,7 +219,6 @@ - @@ -241,6 +242,7 @@ + diff --git a/BenchManager/BenchDashboard/MainForm.cs b/BenchManager/BenchDashboard/MainForm.cs index e853aedd..a11d54c0 100644 --- a/BenchManager/BenchDashboard/MainForm.cs +++ b/BenchManager/BenchDashboard/MainForm.cs @@ -86,16 +86,24 @@ private async void InitializeDocsMenu() { var ctxm = new ContextMenuStrip(); - var benchItem = new ToolStripMenuItem("Bench"); + var benchItem = new ToolStripMenuItem("Bench Website"); benchItem.Image = new Icon(Icon, new Size(16, 16)).ToBitmap(); benchItem.Tag = core.Config.GetStringValue(PropertyKeys.Website); benchItem.Click += LinkHandler; ctxm.Items.Add(benchItem); - var appLibItem = new ToolStripMenuItem("Bench App Library"); - appLibItem.Image = Resources.library_16; - appLibItem.Click += AppIndexHandler; - ctxm.Items.Add(appLibItem); + var appLibsItem = new ToolStripMenuItem("App Libraries"); + appLibsItem.Image = Resources.library_16; + ctxm.Items.Add(appLibsItem); + foreach (var lib in core.Config.AppLibraries) + { + var appLibItem = new ToolStripMenuItem("App Library '" + lib.ID + "'"); + appLibItem.Image = Resources.books_16; + appLibItem.Tag = lib; + appLibItem.Click += AppIndexHandler; + appLibsItem.DropDownItems.Add(appLibItem); + } + var userAppLibItem = new ToolStripMenuItem("User App Library"); userAppLibItem.Image = Resources.userlibrary_16; userAppLibItem.Click += CustomAppIndexHandler; @@ -138,10 +146,15 @@ private async void InitializeDocsMenu() private void AppIndexHandler(object sender, EventArgs e) { - //var viewer = new MarkdownViewer(core); - //viewer.LoadMarkdown(core.Config.GetStringValue(PropertyKeys.AppIndexFile), "Bench App Library"); - //viewer.Show(); - throw new NotImplementedException(); + var lib = (sender as ToolStripItem)?.Tag as AppLibrary; + if (lib != null) + { + var viewer = new MarkdownViewer(core); + viewer.LoadMarkdown(Path.Combine(lib.BaseDir, + core.Config.GetStringValue(PropertyKeys.AppLibIndexFileName)), + "App Library '" + lib.ID + "'"); + viewer.Show(); + } } private void CustomAppIndexHandler(object sender, EventArgs e) diff --git a/BenchManager/BenchDashboard/Properties/Resources.Designer.cs b/BenchManager/BenchDashboard/Properties/Resources.Designer.cs index 41a7ca78..0e5026d4 100644 --- a/BenchManager/BenchDashboard/Properties/Resources.Designer.cs +++ b/BenchManager/BenchDashboard/Properties/Resources.Designer.cs @@ -99,6 +99,26 @@ internal static System.Drawing.Bitmap blocked_16 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap book_16 { + get { + object obj = ResourceManager.GetObject("book_16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap books_16 { + get { + object obj = ResourceManager.GetObject("books_16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/BenchManager/BenchDashboard/Properties/Resources.resx b/BenchManager/BenchDashboard/Properties/Resources.resx index 373bdfcd..aad34c5d 100644 --- a/BenchManager/BenchDashboard/Properties/Resources.resx +++ b/BenchManager/BenchDashboard/Properties/Resources.resx @@ -271,4 +271,10 @@ ..\Resources\update_bench_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\resources\books_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\book_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/BenchManager/BenchDashboard/Resources/book_16.png b/BenchManager/BenchDashboard/Resources/book_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c2e58625c019b724203d658e119487f122eb19 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!7NV~#}Etu%+mEbW%K!2|r;($E)QZ{- cd@U9Xw`Tjg+cNvT2Reqq)78&qol`;+0Iy0-p8x;= literal 0 HcmV?d00001 diff --git a/BenchManager/BenchDashboard/SetupForm.Designer.cs b/BenchManager/BenchDashboard/SetupForm.Designer.cs index 647726c7..2c921633 100644 --- a/BenchManager/BenchDashboard/SetupForm.Designer.cs +++ b/BenchManager/BenchDashboard/SetupForm.Designer.cs @@ -686,8 +686,7 @@ private void InitializeComponent() this.tsmiShowAppIndex.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.library_16; this.tsmiShowAppIndex.Name = "tsmiShowAppIndex"; this.tsmiShowAppIndex.Size = new System.Drawing.Size(205, 22); - this.tsmiShowAppIndex.Text = "Bench App &Library"; - this.tsmiShowAppIndex.Click += new System.EventHandler(this.ShowAppIndexHandler); + this.tsmiShowAppIndex.Text = "Bench App &Libraries"; // // tsmiShowCustomAppIndex // diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index 51539adb..1a78c993 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -44,6 +44,7 @@ private void SetupForm_Load(object sender, EventArgs e) { InitializeDownloadList(); InitializeBounds(); + InitializeAppIndexMenu(); InitializeAppList(); UpdatePendingCounts(); @@ -72,8 +73,22 @@ private void InitializeBounds() SetBounds(x, y, w, h); } + private void InitializeAppIndexMenu() + { + tsmiShowAppIndex.DropDownItems.Clear(); + foreach (var lib in core.Config.AppLibraries) + { + var appLibItem = new ToolStripMenuItem("App Library '" + lib.ID + "'"); + appLibItem.Image = Resources.books_16; + appLibItem.Tag = lib; + appLibItem.Click += ShowAppIndexHandler; + tsmiShowAppIndex.DropDownItems.Add(appLibItem); + } + } + private void CoreConfigReloadedHandler(object sender, EventArgs e) { + InitializeAppIndexMenu(); InitializeAppList(); UpdatePendingCounts(); } @@ -665,10 +680,15 @@ private void gridApps_CellDoubleClick(object sender, DataGridViewCellEventArgs e private void ShowAppIndexHandler(object sender, EventArgs e) { - //var viewer = new MarkdownViewer(core); - //viewer.LoadMarkdown(core.Config.GetStringValue(PropertyKeys.AppIndexFile), "Bench App Library"); - //viewer.Show(); - throw new NotImplementedException(); + var lib = (sender as ToolStripItem)?.Tag as AppLibrary; + if (lib != null) + { + var viewer = new MarkdownViewer(core); + viewer.LoadMarkdown(Path.Combine(lib.BaseDir, + core.Config.GetStringValue(PropertyKeys.AppLibIndexFileName)), + "App Library '" + lib.ID + "'"); + viewer.Show(); + } } private void ShowCustomAppIndexHandler(object sender, EventArgs e) From bfa0c0c8ea9901c03d261a0d145b782b1e71f061 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 14:30:56 +0100 Subject: [PATCH 150/230] added support for configurable columns in the Dashboard Setup dialog --- BenchManager/BenchDashboard/AppWrapper.cs | 8 + .../BenchDashboard/SetupForm.Designer.cs | 319 +++++++++++------- BenchManager/BenchDashboard/SetupForm.cs | 84 ++++- BenchManager/BenchDashboard/SetupForm.resx | 35 +- .../Markdown/MarkdownPropertyEditor.cs | 10 +- BenchManager/BenchLib/PropertyKeys.cs | 2 + res/config.md | 1 + res/config.template.md | 7 + 8 files changed, 321 insertions(+), 145 deletions(-) diff --git a/BenchManager/BenchDashboard/AppWrapper.cs b/BenchManager/BenchDashboard/AppWrapper.cs index a7845231..af260362 100644 --- a/BenchManager/BenchDashboard/AppWrapper.cs +++ b/BenchManager/BenchDashboard/AppWrapper.cs @@ -25,6 +25,14 @@ public AppWrapper(AppFacade app, int no) public string Label { get { return app.Label; } } + public string Name => app.Name; + + public string Namespace => app.Namespace ?? "(default)"; + + public string AppLibrary => app.AppLibrary?.ID ?? "user"; + + public string Category => app.Category; + public string Version { get diff --git a/BenchManager/BenchDashboard/SetupForm.Designer.cs b/BenchManager/BenchDashboard/SetupForm.Designer.cs index 2c921633..3c668897 100644 --- a/BenchManager/BenchDashboard/SetupForm.Designer.cs +++ b/BenchManager/BenchDashboard/SetupForm.Designer.cs @@ -29,10 +29,12 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.components = new System.ComponentModel.Container(); + System.Windows.Forms.ToolStripSeparator toolStripSeparator4; System.Windows.Forms.ToolStripSeparator toolStripSeparator2; System.Windows.Forms.ToolStripSeparator toolStripSeparator3; System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetupForm)); this.tsSeparatorDownloads = new System.Windows.Forms.ToolStripSeparator(); this.splitterBottom = new System.Windows.Forms.Splitter(); @@ -48,15 +50,6 @@ private void InitializeComponent() this.lblTask = new System.Windows.Forms.Label(); this.lblTaskLabel = new System.Windows.Forms.Label(); this.gridApps = new System.Windows.Forms.DataGridView(); - this.colIcon = new System.Windows.Forms.DataGridViewImageColumn(); - this.colIndex = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colLabel = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colTyp = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colActivated = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.colExcluded = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.colStatus = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colVersion = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colComment = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.ctxmAppActions = new System.Windows.Forms.ContextMenuStrip(this.components); this.miAppInfo = new System.Windows.Forms.ToolStripMenuItem(); this.miWebsite = new System.Windows.Forms.ToolStripMenuItem(); @@ -89,15 +82,28 @@ private void InitializeComponent() this.tsmiEditCustomApps = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiEditActivationList = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiEditDeactivationList = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiColumns = new System.Windows.Forms.ToolStripMenuItem(); this.tsmView = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiShowAppIndex = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiShowCustomAppIndex = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiAlwaysShowDownloads = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiRefreshView = new System.Windows.Forms.ToolStripMenuItem(); + this.colIcon = new System.Windows.Forms.DataGridViewImageColumn(); + this.colIndex = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colLibrary = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colID = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colCategory = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colLabel = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colVersion = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colActivated = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.colExcluded = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.colStatus = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colTyp = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colComment = new System.Windows.Forms.DataGridViewTextBoxColumn(); + toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); this.panelStatus.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.picState)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.gridApps)).BeginInit(); @@ -105,26 +111,6 @@ private void InitializeComponent() this.menuStrip.SuspendLayout(); this.SuspendLayout(); // - // toolStripSeparator2 - // - toolStripSeparator2.Name = "toolStripSeparator2"; - toolStripSeparator2.Size = new System.Drawing.Size(227, 6); - // - // toolStripSeparator3 - // - toolStripSeparator3.Name = "toolStripSeparator3"; - toolStripSeparator3.Size = new System.Drawing.Size(227, 6); - // - // toolStripSeparator1 - // - toolStripSeparator1.Name = "toolStripSeparator1"; - toolStripSeparator1.Size = new System.Drawing.Size(202, 6); - // - // toolStripSeparator4 - // - toolStripSeparator4.Name = "toolStripSeparator4"; - toolStripSeparator4.Size = new System.Drawing.Size(227, 6); - // // tsSeparatorDownloads // this.tsSeparatorDownloads.Name = "tsSeparatorDownloads"; @@ -272,12 +258,15 @@ private void InitializeComponent() this.gridApps.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.colIcon, this.colIndex, + this.colLibrary, + this.colID, + this.colCategory, this.colLabel, - this.colTyp, + this.colVersion, this.colActivated, this.colExcluded, this.colStatus, - this.colVersion, + this.colTyp, this.colComment}); this.gridApps.Dock = System.Windows.Forms.DockStyle.Fill; this.gridApps.Location = new System.Drawing.Point(0, 133); @@ -294,99 +283,6 @@ private void InitializeComponent() this.gridApps.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.gridApps_ColumnHeaderMouseClick); this.gridApps.RowContextMenuStripNeeded += new System.Windows.Forms.DataGridViewRowContextMenuStripNeededEventHandler(this.gridApps_RowContextMenuStripNeeded); // - // colIcon - // - this.colIcon.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; - this.colIcon.DataPropertyName = "StatusIcon"; - this.colIcon.Frozen = true; - this.colIcon.HeaderText = ""; - this.colIcon.Name = "colIcon"; - this.colIcon.ReadOnly = true; - this.colIcon.Width = 32; - // - // colIndex - // - this.colIndex.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colIndex.DataPropertyName = "Index"; - this.colIndex.Frozen = true; - this.colIndex.HeaderText = "Order"; - this.colIndex.Name = "colIndex"; - this.colIndex.ReadOnly = true; - this.colIndex.ToolTipText = "The index number from the app registry."; - this.colIndex.Width = 62; - // - // colLabel - // - this.colLabel.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colLabel.DataPropertyName = "Label"; - this.colLabel.HeaderText = "Name"; - this.colLabel.Name = "colLabel"; - this.colLabel.ReadOnly = true; - this.colLabel.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.colLabel.Width = 61; - // - // colTyp - // - this.colTyp.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colTyp.DataPropertyName = "Typ"; - this.colTyp.HeaderText = "Typ"; - this.colTyp.Name = "colTyp"; - this.colTyp.ReadOnly = true; - this.colTyp.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.colTyp.ToolTipText = "The typ of the app."; - this.colTyp.Width = 48; - // - // colActivated - // - this.colActivated.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; - this.colActivated.DataPropertyName = "IsActive"; - this.colActivated.FalseValue = "inactive"; - this.colActivated.HeaderText = "Active"; - this.colActivated.IndeterminateValue = "implicit"; - this.colActivated.Name = "colActivated"; - this.colActivated.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - this.colActivated.ThreeState = true; - this.colActivated.ToolTipText = "States whether the app is activated by the user or not."; - this.colActivated.TrueValue = "active"; - this.colActivated.Width = 62; - // - // colExcluded - // - this.colExcluded.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; - this.colExcluded.DataPropertyName = "IsDeactivated"; - this.colExcluded.HeaderText = "Deactivated"; - this.colExcluded.Name = "colExcluded"; - this.colExcluded.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - this.colExcluded.ToolTipText = "States whether the app is deactivated by the user."; - this.colExcluded.Width = 92; - // - // colStatus - // - this.colStatus.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colStatus.DataPropertyName = "ShortStatus"; - this.colStatus.HeaderText = "Status"; - this.colStatus.Name = "colStatus"; - this.colStatus.ReadOnly = true; - this.colStatus.Width = 64; - // - // colVersion - // - this.colVersion.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colVersion.DataPropertyName = "Version"; - this.colVersion.HeaderText = "Version"; - this.colVersion.Name = "colVersion"; - this.colVersion.ReadOnly = true; - this.colVersion.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.colVersion.Width = 70; - // - // colComment - // - this.colComment.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.colComment.DataPropertyName = "LongStatus"; - this.colComment.HeaderText = "Comment"; - this.colComment.Name = "colComment"; - this.colComment.ReadOnly = true; - // // ctxmAppActions // this.ctxmAppActions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -509,6 +405,7 @@ private void InitializeComponent() this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsmSetup, this.tsmEdit, + this.tsmiColumns, this.tsmView}); this.menuStrip.Location = new System.Drawing.Point(0, 0); this.menuStrip.Name = "menuStrip"; @@ -554,6 +451,11 @@ private void InitializeComponent() this.tsmiUpdateEnvironment.Text = "Update &Environment"; this.tsmiUpdateEnvironment.Click += new System.EventHandler(this.UpdateEnvironmentHandler); // + // toolStripSeparator4 + // + toolStripSeparator4.Name = "toolStripSeparator4"; + toolStripSeparator4.Size = new System.Drawing.Size(227, 6); + // // tsmiUpgradeBench // this.tsmiUpgradeBench.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.update_bench_16; @@ -562,6 +464,11 @@ private void InitializeComponent() this.tsmiUpgradeBench.Text = "Upgrade &Bench"; this.tsmiUpgradeBench.Click += new System.EventHandler(this.UpgradeBenchSystemHandler); // + // toolStripSeparator2 + // + toolStripSeparator2.Name = "toolStripSeparator2"; + toolStripSeparator2.Size = new System.Drawing.Size(227, 6); + // // tsmiInstallAll // this.tsmiInstallAll.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.install_16; @@ -594,6 +501,11 @@ private void InitializeComponent() this.tsmiUninstallAll.Text = "U&ninstall Apps"; this.tsmiUninstallAll.Click += new System.EventHandler(this.UninstallAllHandler); // + // toolStripSeparator3 + // + toolStripSeparator3.Name = "toolStripSeparator3"; + toolStripSeparator3.Size = new System.Drawing.Size(227, 6); + // // tsmiCleanUpObsoleteResources // this.tsmiCleanUpObsoleteResources.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.cleanup_16; @@ -669,6 +581,12 @@ private void InitializeComponent() this.tsmiEditDeactivationList.Text = "&Deactivated Apps"; this.tsmiEditDeactivationList.Click += new System.EventHandler(this.DeactivationListHandler); // + // tsmiColumns + // + this.tsmiColumns.Name = "tsmiColumns"; + this.tsmiColumns.Size = new System.Drawing.Size(67, 20); + this.tsmiColumns.Text = "&Columns"; + // // tsmView // this.tsmView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -696,6 +614,11 @@ private void InitializeComponent() this.tsmiShowCustomAppIndex.Text = "&User App Library"; this.tsmiShowCustomAppIndex.Click += new System.EventHandler(this.ShowCustomAppIndexHandler); // + // toolStripSeparator1 + // + toolStripSeparator1.Name = "toolStripSeparator1"; + toolStripSeparator1.Size = new System.Drawing.Size(202, 6); + // // tsmiAlwaysShowDownloads // this.tsmiAlwaysShowDownloads.CheckOnClick = true; @@ -712,6 +635,138 @@ private void InitializeComponent() this.tsmiRefreshView.Text = "&Refresh"; this.tsmiRefreshView.Click += new System.EventHandler(this.RefreshViewHandler); // + // colIcon + // + this.colIcon.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; + this.colIcon.DataPropertyName = "StatusIcon"; + this.colIcon.Frozen = true; + this.colIcon.HeaderText = ""; + this.colIcon.Name = "colIcon"; + this.colIcon.ReadOnly = true; + this.colIcon.Width = 32; + // + // colIndex + // + this.colIndex.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colIndex.DataPropertyName = "Index"; + this.colIndex.Frozen = true; + this.colIndex.HeaderText = "Order"; + this.colIndex.Name = "colIndex"; + this.colIndex.ReadOnly = true; + this.colIndex.ToolTipText = "The index number from the app registry."; + this.colIndex.Width = 62; + // + // colLibrary + // + this.colLibrary.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colLibrary.DataPropertyName = "AppLibrary"; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.colLibrary.DefaultCellStyle = dataGridViewCellStyle1; + this.colLibrary.HeaderText = "Library"; + this.colLibrary.Name = "colLibrary"; + this.colLibrary.ReadOnly = true; + this.colLibrary.ToolTipText = "The ID of the library, this app is defined in."; + this.colLibrary.Width = 66; + // + // colID + // + this.colID.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colID.DataPropertyName = "ID"; + dataGridViewCellStyle2.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.colID.DefaultCellStyle = dataGridViewCellStyle2; + this.colID.HeaderText = "ID"; + this.colID.Name = "colID"; + this.colID.ReadOnly = true; + this.colID.ToolTipText = "The full ID of the app including the namespace."; + this.colID.Width = 43; + // + // colCategory + // + this.colCategory.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colCategory.DataPropertyName = "Category"; + this.colCategory.HeaderText = "Category"; + this.colCategory.Name = "colCategory"; + this.colCategory.ReadOnly = true; + this.colCategory.ToolTipText = "The category of the app."; + this.colCategory.Width = 78; + // + // colLabel + // + this.colLabel.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colLabel.DataPropertyName = "Label"; + this.colLabel.HeaderText = "Label"; + this.colLabel.Name = "colLabel"; + this.colLabel.ReadOnly = true; + this.colLabel.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colLabel.ToolTipText = "The user friendly name of the app."; + this.colLabel.Width = 59; + // + // colVersion + // + this.colVersion.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colVersion.DataPropertyName = "Version"; + this.colVersion.HeaderText = "Version"; + this.colVersion.Name = "colVersion"; + this.colVersion.ReadOnly = true; + this.colVersion.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colVersion.ToolTipText = "The version number of the app."; + this.colVersion.Width = 70; + // + // colActivated + // + this.colActivated.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.colActivated.DataPropertyName = "IsActive"; + this.colActivated.FalseValue = "inactive"; + this.colActivated.HeaderText = "Active"; + this.colActivated.IndeterminateValue = "implicit"; + this.colActivated.Name = "colActivated"; + this.colActivated.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.colActivated.ThreeState = true; + this.colActivated.ToolTipText = "States whether the app is activated by the user or not."; + this.colActivated.TrueValue = "active"; + this.colActivated.Width = 62; + // + // colExcluded + // + this.colExcluded.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.colExcluded.DataPropertyName = "IsDeactivated"; + this.colExcluded.HeaderText = "Deactivated"; + this.colExcluded.Name = "colExcluded"; + this.colExcluded.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.colExcluded.ToolTipText = "States whether the app is deactivated by the user."; + this.colExcluded.Width = 92; + // + // colStatus + // + this.colStatus.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colStatus.DataPropertyName = "ShortStatus"; + this.colStatus.HeaderText = "Status"; + this.colStatus.Name = "colStatus"; + this.colStatus.ReadOnly = true; + this.colStatus.ToolTipText = "A brief description of the apps status."; + this.colStatus.Width = 64; + // + // colTyp + // + this.colTyp.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colTyp.DataPropertyName = "Typ"; + this.colTyp.HeaderText = "Typ"; + this.colTyp.Name = "colTyp"; + this.colTyp.ReadOnly = true; + this.colTyp.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colTyp.ToolTipText = "The typ of the app."; + this.colTyp.Width = 48; + // + // colComment + // + this.colComment.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.colComment.DataPropertyName = "LongStatus"; + this.colComment.HeaderText = "Comment"; + this.colComment.MinimumWidth = 100; + this.colComment.Name = "colComment"; + this.colComment.ReadOnly = true; + this.colComment.ToolTipText = "A more detailed description of the apps status."; + // // SetupForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -794,16 +849,20 @@ private void InitializeComponent() private System.Windows.Forms.ToolTip toolTip; private System.Windows.Forms.ToolStripMenuItem miWebsite; private System.Windows.Forms.ToolStripSeparator tsSeparatorWebsite; + private System.Windows.Forms.ToolStripMenuItem miAppInfo; + private System.Windows.Forms.ToolStripMenuItem tsmiUpgradeBench; + private System.Windows.Forms.ToolStripMenuItem tsmiColumns; private System.Windows.Forms.DataGridViewImageColumn colIcon; private System.Windows.Forms.DataGridViewTextBoxColumn colIndex; + private System.Windows.Forms.DataGridViewTextBoxColumn colLibrary; + private System.Windows.Forms.DataGridViewTextBoxColumn colID; + private System.Windows.Forms.DataGridViewTextBoxColumn colCategory; private System.Windows.Forms.DataGridViewTextBoxColumn colLabel; - private System.Windows.Forms.DataGridViewTextBoxColumn colTyp; + private System.Windows.Forms.DataGridViewTextBoxColumn colVersion; private System.Windows.Forms.DataGridViewCheckBoxColumn colActivated; private System.Windows.Forms.DataGridViewCheckBoxColumn colExcluded; private System.Windows.Forms.DataGridViewTextBoxColumn colStatus; - private System.Windows.Forms.DataGridViewTextBoxColumn colVersion; + private System.Windows.Forms.DataGridViewTextBoxColumn colTyp; private System.Windows.Forms.DataGridViewTextBoxColumn colComment; - private System.Windows.Forms.ToolStripMenuItem miAppInfo; - private System.Windows.Forms.ToolStripMenuItem tsmiUpgradeBench; } } \ No newline at end of file diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index 1a78c993..8f30530e 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using ConEmu.WinForms; using Mastersign.Bench.Dashboard.Properties; +using Mastersign.Bench.Markdown; namespace Mastersign.Bench.Dashboard { @@ -21,11 +22,19 @@ public partial class SetupForm : Form private ListSortDirection sortDirection; private AppFacade contextApp; - private readonly Dictionary appLookup = new Dictionary(); + private readonly Dictionary appLookup + = new Dictionary(); private ConEmuExecutionHost conHost; private ConEmuControl conControl; + private readonly List appListColumnLabels = new List(); + private readonly Dictionary appListColumns + = new Dictionary(); + private static string[] defaulAppListColumnLabels + = new[] { "Order", "ID", "Version", "Active", "Deactivated", "Status" }; + private DataGridViewColumn iconColumn; + public SetupForm(Core core) { this.core = core; @@ -38,6 +47,13 @@ public SetupForm(Core core) gridApps.DoubleBuffered(true); InitializeConsole(); gridApps.AutoGenerateColumns = false; + iconColumn = gridApps.Columns[0]; + foreach (DataGridViewColumn col in gridApps.Columns) + { + if (string.IsNullOrEmpty(col.HeaderText)) continue; + appListColumnLabels.Add(col.HeaderText); + appListColumns.Add(col.HeaderText, col); + } } private void SetupForm_Load(object sender, EventArgs e) @@ -45,6 +61,8 @@ private void SetupForm_Load(object sender, EventArgs e) InitializeDownloadList(); InitializeBounds(); InitializeAppIndexMenu(); + InitializeAppListColumnsMenu(); + InitializeAppListColumns(); InitializeAppList(); UpdatePendingCounts(); @@ -86,9 +104,73 @@ private void InitializeAppIndexMenu() } } + private void InitializeAppListColumnsMenu() + { + var colLabels = core.Config.GetStringListValue( + PropertyKeys.DashboardSetupAppListColumns, + defaulAppListColumnLabels); + foreach (var colLabel in appListColumnLabels) + { + ToolStripMenuItem item = null; + if (tsmiColumns.DropDownItems.Count > 0) + { + foreach (ToolStripMenuItem i in tsmiColumns.DropDownItems) + if (i.Text == colLabel) + item = i; + } + if (item == null) + { + item = new ToolStripMenuItem(colLabel); + item.Click += AppListColumnToggleHandler; + tsmiColumns.DropDownItems.Add(item); + } + item.Checked = colLabels.Contains(colLabel); + } + } + + private void AppListColumnToggleHandler(object sender, EventArgs e) + { + var newColLabels = new List(); + foreach (ToolStripMenuItem item in tsmiColumns.DropDownItems) + { + if (item == sender) item.Checked = !item.Checked; + if (item.Checked) + { + newColLabels.Add(string.Format("`{0}`", item.Text)); + } + } + var configFile = core.Config.GetStringValue(PropertyKeys.CustomConfigFile); + MarkdownPropertyEditor.UpdateFile(configFile, new Dictionary + { { PropertyKeys.DashboardSetupAppListColumns, string.Join(", ", newColLabels) } }); + } + + private void InitializeAppListColumns() + { + gridApps.SuspendLayout(); + gridApps.Columns.Clear(); + var colLabels = core.Config.GetStringListValue( + PropertyKeys.DashboardSetupAppListColumns, + defaulAppListColumnLabels); + iconColumn.DisplayIndex = 0; + gridApps.Columns.Add(iconColumn); + var pos = 1; + foreach (var colLabel in colLabels) + { + DataGridViewColumn col; + if (appListColumns.TryGetValue(colLabel, out col)) + { + col.DisplayIndex = pos++; + gridApps.Columns.Add(col); + } + } + gridApps.ResumeLayout(); + } + private void CoreConfigReloadedHandler(object sender, EventArgs e) { InitializeAppIndexMenu(); + InitializeAppListColumnsMenu(); + InitializeAppListColumns(); InitializeAppList(); UpdatePendingCounts(); } diff --git a/BenchManager/BenchDashboard/SetupForm.resx b/BenchManager/BenchDashboard/SetupForm.resx index 49e8dc64..2b905ade 100644 --- a/BenchManager/BenchDashboard/SetupForm.resx +++ b/BenchManager/BenchDashboard/SetupForm.resx @@ -117,28 +117,25 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - False - - - False + + True - - False + + True - - False + + True - + True - + True True - + True @@ -150,7 +147,7 @@ True - + True @@ -165,6 +162,18 @@ 17, 17 + + False + + + False + + + False + + + False + 62 diff --git a/BenchManager/BenchLib/Markdown/MarkdownPropertyEditor.cs b/BenchManager/BenchLib/Markdown/MarkdownPropertyEditor.cs index d98b1f86..edf2b3d0 100644 --- a/BenchManager/BenchLib/Markdown/MarkdownPropertyEditor.cs +++ b/BenchManager/BenchLib/Markdown/MarkdownPropertyEditor.cs @@ -6,12 +6,20 @@ namespace Mastersign.Bench.Markdown { - internal static class MarkdownPropertyEditor + /// + /// A class with the capability to update a Markdown property file. + /// + public static class MarkdownPropertyEditor { private const string PatternTemplate = @"^{0}\s+((?:~~)?)\s*{1}\s*:\s*{2}\s*\1\s*$"; private const string PropertyTemplate = @"* {0}: `{1}`"; private const string UnquotedPropertyTemplate = @"* {0}: {1}"; + /// + /// Sets a property value in a Markdown property file. + /// + /// The target file. + /// The dictionary with the properties to set. public static void UpdateFile(string file, IDictionary dict) { var lines = new List(File.ReadAllLines(file, Encoding.UTF8)); diff --git a/BenchManager/BenchLib/PropertyKeys.cs b/BenchManager/BenchLib/PropertyKeys.cs index 2697e509..6e20f6fc 100644 --- a/BenchManager/BenchLib/PropertyKeys.cs +++ b/BenchManager/BenchLib/PropertyKeys.cs @@ -47,6 +47,8 @@ public static class PropertyKeys public const string QuickAccessPowerShell = "QuickAccessPowerShell"; public const string QuickAccessBash = "QuickAccessBash"; + public const string DashboardSetupAppListColumns = "DashboardSetupAppListColumns"; + public const string ConEmuConfigFile = "ConEmuConfigFile"; public const string ConEmuConfigTemplateFile = "ConEmuConfigTemplateFile"; diff --git a/res/config.md b/res/config.md index dbef7ff9..bf943378 100644 --- a/res/config.md +++ b/res/config.md @@ -59,3 +59,4 @@ * QuickAccessPowerShell: `false` * QuickAccessBash: `false` * EditorApp: `VSCode` +* DashboardSetupAppListColumns: `Order`, `Label`, `Version`, `Active`, `Deactivated`, `Status`, `Typ`, `Comment` diff --git a/res/config.template.md b/res/config.template.md index f10193fd..d3d13f6c 100644 --- a/res/config.template.md +++ b/res/config.template.md @@ -32,6 +32,7 @@ With the following properties you can control the appearance of the launchers fo With the following properties you can control certain behavior of the Bench Dashboard. * AutoUpdateCheck: `true` +* DashboardSetupAppListColumns: `Order`, `Label`, `Version`, `Active`, `Deactivated`, `Status`, `Typ`, `Comment` ## Project Archive @@ -39,3 +40,9 @@ With the following properties you can control the project archive. * ~~ProjectArchiveFormat: `7z`~~ * ProjectArchiveDir: `archive` + +## Properties added by the Bench CLI + +If the Bench CLI sets properties, which are not already listed in this file, +it appends them to the end of the file. + From 3055c5c77d6f49c885d9db9b6589ebbbe68ca503 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 7 Jan 2017 16:26:47 +0100 Subject: [PATCH 151/230] updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 964df469..5504df20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ Add a link to the GitHub diff like - Bench CLI ([#87](https://github.com/mastersign/bench/issues/87)) - Update check in the About dialog of _BenchDashboard_ +- Configurable columns to the Setup dialog of _BenchDashboard_ - Config properties + `VersionUrl` + `UpdateUrlTemplate` From f70fbe61abe516600b7c5cf6443045f39d2d61fd Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:38:28 +0100 Subject: [PATCH 152/230] fixed possible null for app property version --- BenchManager/BenchCLI/Commands/AppInfoCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchCLI/Commands/AppInfoCommand.cs b/BenchManager/BenchCLI/Commands/AppInfoCommand.cs index 9f424277..ed08b22b 100644 --- a/BenchManager/BenchCLI/Commands/AppInfoCommand.cs +++ b/BenchManager/BenchCLI/Commands/AppInfoCommand.cs @@ -86,7 +86,7 @@ private void WriteAppInfo(AppFacade app, DocumentWriter writer) WriteProperty(writer, "Launcher", app.Launcher); } WriteProperty(writer, "App Type", app.Typ, InlineType.Keyword); - WriteProperty(writer, "Version", app.Version, InlineType.Keyword); + WriteProperty(writer, "Version", app.Version ?? "latest", InlineType.Keyword); writer.End(BlockType.List); writer.Headline2("app_" + app.ID + "_state", "State"); writer.Paragraph(app.LongStatus); From eb859e8a14f2c17e9f8937ac17224e172d79fc4b Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:38:45 +0100 Subject: [PATCH 153/230] code cleanup --- .../BenchCLI/Commands/AppExecuteCommand.cs | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/BenchManager/BenchCLI/Commands/AppExecuteCommand.cs b/BenchManager/BenchCLI/Commands/AppExecuteCommand.cs index eb613e23..420f0ef9 100644 --- a/BenchManager/BenchCLI/Commands/AppExecuteCommand.cs +++ b/BenchManager/BenchCLI/Commands/AppExecuteCommand.cs @@ -60,23 +60,24 @@ protected override bool ExecuteCommand(string[] args) var detached = Arguments.GetFlag(FLAG_DETACHED); WriteDetail("Starting app '{0}' {1} ...", app.Label, detached ? "detached" : "synchronously"); - var mgr = new DefaultBenchManager(cfg); - if (detached) + using (var mgr = new DefaultBenchManager(cfg)) { - mgr.ProcessExecutionHost.StartProcess(mgr.Env, - cfg.BenchRootDir, app.Exe, CommandLine.FormatArgumentList(args), - null, ProcessMonitoring.ExitCode); - mgr.Dispose(); - return true; - } - else - { - var r = mgr.ProcessExecutionHost.RunProcess(mgr.Env, - cfg.BenchRootDir, app.Exe, CommandLine.FormatArgumentList(args), - ProcessMonitoring.ExitCodeAndOutput); - mgr.Dispose(); - Console.Write(r.Output); - return r.ExitCode == 0; + mgr.Verbose = Verbose; + if (detached) + { + mgr.ProcessExecutionHost.StartProcess(mgr.Env, + cfg.BenchRootDir, app.Exe, CommandLine.FormatArgumentList(args), + null, ProcessMonitoring.ExitCode); + return true; + } + else + { + var r = mgr.ProcessExecutionHost.RunProcess(mgr.Env, + cfg.BenchRootDir, app.Exe, CommandLine.FormatArgumentList(args), + ProcessMonitoring.ExitCodeAndOutput); + Console.Write(r.Output); + return r.ExitCode == 0; + } } } } From e4a98039a41f6b6e9e720a77fb3fb630e1524b3e Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:39:11 +0100 Subject: [PATCH 154/230] added check for existing app ID --- BenchManager/BenchCLI/Commands/AppInstallCommand.cs | 10 ++++++++-- BenchManager/BenchCLI/Commands/AppReinstallCommand.cs | 10 ++++++++-- BenchManager/BenchCLI/Commands/AppUninstallCommand.cs | 10 ++++++++-- BenchManager/BenchCLI/Commands/AppUpgradeCommand.cs | 10 ++++++++-- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/BenchManager/BenchCLI/Commands/AppInstallCommand.cs b/BenchManager/BenchCLI/Commands/AppInstallCommand.cs index aff27b9f..f0092b8f 100644 --- a/BenchManager/BenchCLI/Commands/AppInstallCommand.cs +++ b/BenchManager/BenchCLI/Commands/AppInstallCommand.cs @@ -34,8 +34,14 @@ protected override void InitializeArgumentParser(ArgumentParser parser) protected override bool ExecuteCommand(string[] args) { - return RunManagerTask(mgr => mgr.InstallApp( - Arguments.GetPositionalValue(POSITIONAL_APP_ID))); + var appId = Arguments.GetPositionalValue(POSITIONAL_APP_ID); + var cfg = LoadConfiguration(); + if (!cfg.Apps.Exists(appId)) + { + WriteError("Unknown app ID: " + appId); + return false; + } + return RunManagerTask(mgr => mgr.InstallApp(appId)); } } } diff --git a/BenchManager/BenchCLI/Commands/AppReinstallCommand.cs b/BenchManager/BenchCLI/Commands/AppReinstallCommand.cs index c6b40765..1a15b897 100644 --- a/BenchManager/BenchCLI/Commands/AppReinstallCommand.cs +++ b/BenchManager/BenchCLI/Commands/AppReinstallCommand.cs @@ -33,8 +33,14 @@ protected override void InitializeArgumentParser(ArgumentParser parser) protected override bool ExecuteCommand(string[] args) { - return RunManagerTask(mgr => mgr.ReinstallApp( - Arguments.GetPositionalValue(POSITIONAL_APP_ID))); + var appId = Arguments.GetPositionalValue(POSITIONAL_APP_ID); + var cfg = LoadConfiguration(); + if (!cfg.Apps.Exists(appId)) + { + WriteError("Unknown app ID: " + appId); + return false; + } + return RunManagerTask(mgr => mgr.ReinstallApp(appId)); } } } diff --git a/BenchManager/BenchCLI/Commands/AppUninstallCommand.cs b/BenchManager/BenchCLI/Commands/AppUninstallCommand.cs index 7bcad473..35be2687 100644 --- a/BenchManager/BenchCLI/Commands/AppUninstallCommand.cs +++ b/BenchManager/BenchCLI/Commands/AppUninstallCommand.cs @@ -33,8 +33,14 @@ protected override void InitializeArgumentParser(ArgumentParser parser) protected override bool ExecuteCommand(string[] args) { - return RunManagerTask(mgr => mgr.UninstallApp( - Arguments.GetPositionalValue(POSITIONAL_APP_ID))); + var appId = Arguments.GetPositionalValue(POSITIONAL_APP_ID); + var cfg = LoadConfiguration(); + if (!cfg.Apps.Exists(appId)) + { + WriteError("Unknown app ID: " + appId); + return false; + } + return RunManagerTask(mgr => mgr.UninstallApp(appId)); } } } diff --git a/BenchManager/BenchCLI/Commands/AppUpgradeCommand.cs b/BenchManager/BenchCLI/Commands/AppUpgradeCommand.cs index 64727af7..50f110d7 100644 --- a/BenchManager/BenchCLI/Commands/AppUpgradeCommand.cs +++ b/BenchManager/BenchCLI/Commands/AppUpgradeCommand.cs @@ -34,8 +34,14 @@ protected override void InitializeArgumentParser(ArgumentParser parser) protected override bool ExecuteCommand(string[] args) { - return RunManagerTask(mgr => mgr.UpgradeApp( - Arguments.GetPositionalValue(POSITIONAL_APP_ID))); + var appId = Arguments.GetPositionalValue(POSITIONAL_APP_ID); + var cfg = LoadConfiguration(); + if (!cfg.Apps.Exists(appId)) + { + WriteError("Unknown app ID: " + appId); + return false; + } + return RunManagerTask(mgr => mgr.UpgradeApp(appId)); } } } From dfa3f7ced9f706a6d23c541b1bd602630ed26783 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:40:11 +0100 Subject: [PATCH 155/230] fixed incorrect visibility --- BenchManager/BenchLib/BenchConfiguration.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index b0b2d20b..20eca5c5 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -469,7 +469,7 @@ private string GetBaseForPathProperty(string app, string property) /// of a Bench environment, to a new instance of the configuration. ///
/// The new configuration instance. - internal void InjectBenchInitializationProperties(BenchConfiguration targetCfg) + public void InjectBenchInitializationProperties(BenchConfiguration targetCfg) { foreach (var key in new[] { From 3a2dae96cf3f4735efd01bd5c50a640a7b365bc6 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:40:22 +0100 Subject: [PATCH 156/230] added check for null --- BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs | 1 + BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs b/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs index 8810aaac..ee3b5a1c 100644 --- a/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs +++ b/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs @@ -298,6 +298,7 @@ public override DocumentWriter End(BlockType type) public override DocumentWriter Inline(InlineType type, string format, params object[] args) { + if (format == null) return this; var text = string.Format(format, args); switch (type) { diff --git a/BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs b/BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs index 7f8d2796..6c66bc02 100644 --- a/BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs +++ b/BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs @@ -390,6 +390,7 @@ public override DocumentWriter End(BlockType type) public override DocumentWriter Inline(InlineType type, string format, params object[] args) { + if (format == null) return this; var text = string.Format(format, args); switch (type) { From 85bf8f3ff59c8fd917b27f106f14f7b6eb7ef8c5 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:40:46 +0100 Subject: [PATCH 157/230] code clean-up, made us of lambda syntax --- BenchManager/BenchLib/AppFacade.cs | 196 +++++++++-------------------- 1 file changed, 61 insertions(+), 135 deletions(-) diff --git a/BenchManager/BenchLib/AppFacade.cs b/BenchManager/BenchLib/AppFacade.cs index 0306251e..c2a5e8db 100644 --- a/BenchManager/BenchLib/AppFacade.cs +++ b/BenchManager/BenchLib/AppFacade.cs @@ -154,20 +154,20 @@ internal static string NameFromId(string id) /// /// Gets the label of the app. /// - public string Label { get { return StringValue(PropertyKeys.AppLabel); } } + public string Label => StringValue(PropertyKeys.AppLabel); /// /// Gets the category, this app belongs to. /// E.g. there are Required and Optional apps. /// /// - public string Category { get { return AppIndex.GetGroupCategory(AppName); } } + public string Category => AppIndex.GetGroupCategory(AppName); /// /// The typ of this app. /// See for to compare and list the app typs. /// - public string Typ { get { return StringValue(PropertyKeys.AppTyp); } } + public string Typ => StringValue(PropertyKeys.AppTyp); /// /// Checks, if this app is a packaged managed by some kind of package manager. @@ -193,18 +193,13 @@ public bool IsManagedPackage /// If the app has the version "latest" it is considered to have no specified version. /// /// - public string Version { get { return StringValue(PropertyKeys.AppVersion); } } + public string Version => StringValue(PropertyKeys.AppVersion); /// /// Checks, if this app has a specified version. /// public bool IsVersioned - { - get - { - return Version != null && !Version.Equals("latest", StringComparison.InvariantCultureIgnoreCase); - } - } + => Version != null && !Version.Equals("latest", StringComparison.InvariantCultureIgnoreCase); private static Regex simpleVersionPattern = new Regex(@"^\d+(\.\d)*$"); @@ -213,27 +208,20 @@ public bool IsVersioned /// like 1.12.5.000 or 3.4. /// public bool IsSimpleVersion - { - get { return IsVersioned && simpleVersionPattern.Match(Version).Success; } - } + => IsVersioned && simpleVersionPattern.Match(Version).Success; /// /// Gets the URL of the project or vendor website of this app, or null if no website was specified. /// - public string Website { get { return StringValue(PropertyKeys.AppWebsite); } } + public string Website => StringValue(PropertyKeys.AppWebsite); /// /// Gets a dictionary with labels and URLs for help and documentation. /// If an URL is relative, it is considered to be relative to the apps . /// public IDictionary Docs - { - get - { - return (Value(PropertyKeys.AppDocs) as IDictionary) + => (Value(PropertyKeys.AppDocs) as IDictionary) ?? new Dictionary(); - } - } /// /// An array with app IDs which are necessary to be installed for this app to work. @@ -257,78 +245,68 @@ public string[] Responsibilities /// Checks, whether this app is marked as activated by the user, or not. /// /// true if the apps ID is marked as activated by the user; otherwise false. - public bool IsActivated { get { return BoolValue(PropertyKeys.AppIsActivated); } } + public bool IsActivated => BoolValue(PropertyKeys.AppIsActivated); /// /// Checks, whether this app is marked as deactivated by the user, or not. /// /// true if the apps ID is marked as deactivated by the user; otherwise false. - public bool IsDeactivated { get { return BoolValue(PropertyKeys.AppIsDeactivated); } } + public bool IsDeactivated => BoolValue(PropertyKeys.AppIsDeactivated); /// /// Checks, whether this app is required by the Bench system, or not. /// /// true if the app is required by Bench; otherwise false. - public bool IsRequired { get { return BoolValue(PropertyKeys.AppIsRequired); } } + public bool IsRequired => BoolValue(PropertyKeys.AppIsRequired); /// /// Checks, whether this app is dependency of another app. /// /// true if the app is required by another app; otherwise false. - public bool IsDependency { get { return BoolValue(PropertyKeys.AppIsDependency); } } + public bool IsDependency => BoolValue(PropertyKeys.AppIsDependency); /// /// Gets the URL of the apps resource, or null if the app has no downloadable resource. /// - public string Url { get { return StringValue(PropertyKeys.AppUrl); } } + public string Url => StringValue(PropertyKeys.AppUrl); /// /// Gets a dictionary with HTTP header fields for the download request. /// public IDictionary DownloadHeaders - { - get - { - return (Value(PropertyKeys.AppDownloadHeaders) as IDictionary) + => (Value(PropertyKeys.AppDownloadHeaders) as IDictionary) ?? new Dictionary(); - } - } /// /// Gets a dictionary with HTTP cookies for the download request. /// public IDictionary DownloadCookies - { - get - { - return (Value(PropertyKeys.AppDownloadCookies) as IDictionary) + => (Value(PropertyKeys.AppDownloadCookies) as IDictionary) ?? new Dictionary(); - } - } /// /// Gets the name of the apps file resource, or null /// in case the app has an archive resource or no downloadable resource at all. /// - public string ResourceFileName { get { return StringValue(PropertyKeys.AppResourceName); } } + public string ResourceFileName => StringValue(PropertyKeys.AppResourceName); /// /// Gets the name of the apps archive resource, or null /// in case the app has a file resource or no downloadable resource at all. /// - public string ResourceArchiveName { get { return StringValue(PropertyKeys.AppArchiveName); } } + public string ResourceArchiveName => StringValue(PropertyKeys.AppArchiveName); /// /// Gets the sub path inside of the resource archive, or null /// in case the whole archive can be extracted or the app has no archive resource. /// - public string ResourceArchivePath { get { return StringValue(PropertyKeys.AppArchivePath); } } + public string ResourceArchivePath => StringValue(PropertyKeys.AppArchivePath); /// /// Gets the typ of the resource archive, or null if the app has no archive resource. /// See to compare or list the possible typs of an archive resource. /// - public string ResourceArchiveTyp { get { return StringValue(PropertyKeys.AppArchiveTyp); } } + public string ResourceArchiveTyp => StringValue(PropertyKeys.AppArchiveTyp); /// /// Gets a value, which specifies if the app will be installed even if it is already installed. @@ -343,27 +321,27 @@ public bool Force /// The name of the package represented by this app, or null in case /// is false. /// - public string PackageName { get { return StringValue(PropertyKeys.AppPackageName); } } + public string PackageName => StringValue(PropertyKeys.AppPackageName); /// /// The name of the target directory for this app. /// The target directory is the directory where the app resources are installed. /// - public string Dir { get { return StringValue(PropertyKeys.AppDir); } } + public string Dir => StringValue(PropertyKeys.AppDir); /// /// The relative path of the main executable file of the app, or null /// in case the app has no executable (e.g. the app is just a group). /// The path is relative to the target of this app. /// - public string Exe { get { return StringValue(PropertyKeys.AppExe); } } + public string Exe => StringValue(PropertyKeys.AppExe); /// /// The relative path to a file, which existence can be used to check if the app is installed, /// or null e.g. in case the app is a package managed by a package manager. /// The path is relative to the target of this app. /// - public string SetupTestFile { get { return StringValue(PropertyKeys.AppSetupTestFile); } } + public string SetupTestFile => StringValue(PropertyKeys.AppSetupTestFile); /// /// An array with relative or absolute paths, @@ -381,19 +359,14 @@ public string[] Path /// A flag to control if the s of this app will be added /// to the environment variable PATH. /// - public bool Register { get { return BoolValue(PropertyKeys.AppRegister); } } + public bool Register => BoolValue(PropertyKeys.AppRegister); /// /// A dictionary with additional environment variables to setup, when this app is activated. /// public IDictionary Environment - { - get - { - return (Value(PropertyKeys.AppEnvironment) as IDictionary) + => (Value(PropertyKeys.AppEnvironment) as IDictionary) ?? new Dictionary(); - } - } /// /// An array with paths to executables, which must be adorned. @@ -418,14 +391,9 @@ internal void RemoveAdornedExecutable(string path) /// Gets the base path of the directory containing the adornmend proxy scripts for the executables of this app. /// public string AdornmentProxyBasePath - { - get - { - return IOPath.Combine( + => IOPath.Combine( AppIndex.GetStringValue(PropertyKeys.AppAdornmentBaseDir), ID.ToLowerInvariant()); - } - } /// /// Checks, whether an executable of this app is marked as adorned, or not. @@ -455,40 +423,33 @@ public bool IsExecutableAdorned(string exePath) /// The path to the executable. /// The path to the adornment script. public string GetExecutableProxy(string exePath) - { - return IOPath.Combine(AdornmentProxyBasePath, + => IOPath.Combine(AdornmentProxyBasePath, IOPath.GetFileNameWithoutExtension(exePath) + ".cmd"); - } /// /// Checks, whether execution adornment proxies are required for this app, or not. /// public bool IsAdornmentRequired - { - get - { - return (RegistryKeys.Length > 0 && AppIndex.GetBooleanValue(PropertyKeys.UseRegistryIsolation)) + => (RegistryKeys.Length > 0 && AppIndex.GetBooleanValue(PropertyKeys.UseRegistryIsolation)) || File.Exists(GetCustomScript("pre-run")) || File.Exists(GetCustomScript("post-run")); - } - } /// /// An array with registry paths relative to the HKCU (current user) hive, /// which must be considered for registry isolation. /// - public string[] RegistryKeys { get { return ListValue(PropertyKeys.AppRegistryKeys); } } + public string[] RegistryKeys => ListValue(PropertyKeys.AppRegistryKeys); /// /// The label for the apps launcher, or null if the app has no launcher. /// - public string Launcher { get { return StringValue(PropertyKeys.AppLauncher); } } + public string Launcher => StringValue(PropertyKeys.AppLauncher); /// /// The path to the main executable, to be started by the apps launcher, /// or null if the app has no launcher. /// - public string LauncherExecutable { get { return StringValue(PropertyKeys.AppLauncherExecutable); } } + public string LauncherExecutable => StringValue(PropertyKeys.AppLauncherExecutable); /// /// An array with command line arguments to be sent to the @@ -497,13 +458,13 @@ public bool IsAdornmentRequired /// from the launcher to the executable. This is also necessary for drag-and-drop of files /// onto the launcher to work. /// - public string[] LauncherArguments { get { return ListValue(PropertyKeys.AppLauncherArguments); } } + public string[] LauncherArguments => ListValue(PropertyKeys.AppLauncherArguments); /// /// A path to an *.ico or *.exe file with the icon for the apps launcher, /// or null if the app has no launcher. /// - public string LauncherIcon { get { return StringValue(PropertyKeys.AppLauncherIcon); } } + public string LauncherIcon => StringValue(PropertyKeys.AppLauncherIcon); #region Recursive Discovery @@ -1107,52 +1068,37 @@ public AppStatusIcon StatusIcon /// /// Checks, whether the app has a resource and the resource is not cached. /// - public bool CanDownloadResource { get { return HasResource && !IsResourceCached; } } + public bool CanDownloadResource => HasResource && !IsResourceCached; /// /// Checks, whether the app has cached resource. /// - public bool CanDeleteResource { get { return HasResource && IsResourceCached; } } + public bool CanDeleteResource => HasResource && IsResourceCached; /// /// Checks, whether this app can be installed. /// public bool CanInstall - { - get - { - return CanCheckInstallation && (!IsInstalled || Force) - || !CanCheckInstallation && GetCustomScript("setup") != null; - } - } + => CanCheckInstallation && (!IsInstalled || Force) + || !CanCheckInstallation && GetCustomScript("setup") != null; /// /// Checks, whether this app can be uninstalled. /// public bool CanUninstall - { - get - { - return CanCheckInstallation && IsInstalled - || !CanCheckInstallation && GetCustomScript("remove") != null; - } - } + => CanCheckInstallation && IsInstalled + || !CanCheckInstallation && GetCustomScript("remove") != null; /// /// Checks, whether this app can be reinstalled. /// public bool CanReinstall - { - get - { - return CanCheckInstallation && IsInstalled - && (!HasResource || IsResourceCached) - && !IsManagedPackage - || !CanCheckInstallation - && GetCustomScript("remove") != null - && GetCustomScript("setup") != null; - } - } + => CanCheckInstallation && IsInstalled + && (!HasResource || IsResourceCached) + && !IsManagedPackage + || !CanCheckInstallation + && GetCustomScript("remove") != null + && GetCustomScript("setup") != null; /// /// Checks, whether this app can be upgraded to a more recent version. @@ -1160,48 +1106,31 @@ public bool CanReinstall /// /// This method does not check if there really is a more recent version of this app. /// - public bool CanUpgrade - { - get - { - return - // Default app with no version or version difference - CanCheckInstallation && IsInstalled - && !IsManagedPackage - && (!IsVersioned || !IsVersionUpToDate) - // Default app with custom setup and remove - || !CanCheckInstallation - && !IsManagedPackage - && GetCustomScript("remove") != null - && GetCustomScript("setup") != null; - } - } + public bool CanUpgrade => + // Default app with no version or version difference + CanCheckInstallation && IsInstalled + && !IsManagedPackage + && (!IsVersioned || !IsVersionUpToDate) + // Default app with custom setup and remove + || !CanCheckInstallation + && !IsManagedPackage + && GetCustomScript("remove") != null + && GetCustomScript("setup") != null; /// /// Checks, whether this app is active (activated or required) but not installed. /// public bool ShouldBeInstalled - { - get - { - return IsActive - && (CanCheckInstallation && !IsInstalled - || !CanCheckInstallation && GetCustomScript("setup") != null); - } - } + => IsActive && (CanCheckInstallation && !IsInstalled + || !CanCheckInstallation && GetCustomScript("setup") != null); /// /// Checks, whether this app is not activated or even deactivated but installed. /// public bool ShouldBeRemoved - { - get - { - return !IsActive - && (CanCheckInstallation && IsInstalled - || !CanCheckInstallation && GetCustomScript("remove") != null); - } - } + => !IsActive + && (CanCheckInstallation && IsInstalled + || !CanCheckInstallation && GetCustomScript("remove") != null); #endregion @@ -1486,9 +1415,6 @@ public KeyValuePair[] UnknownProperties /// Returns a string, containing the apps typ and ID. /// /// A short string representation of the app. - public override string ToString() - { - return string.Format("App[{0}] {1}", Typ, ID); - } + public override string ToString() => string.Format("App[{0}] {1}", Typ, ID); } } From bc1ca9ea43a353366761b9ddcac2840dd73b1f52 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:41:14 +0100 Subject: [PATCH 158/230] refactored semantics of LoadAppLibraries (only load if not already loaded) --- BenchManager/BenchLib/BenchTasks.cs | 114 +++++++++++++++++++++++----- 1 file changed, 96 insertions(+), 18 deletions(-) diff --git a/BenchManager/BenchLib/BenchTasks.cs b/BenchManager/BenchLib/BenchTasks.cs index 51448935..6d36105a 100644 --- a/BenchManager/BenchLib/BenchTasks.cs +++ b/BenchManager/BenchLib/BenchTasks.cs @@ -1048,17 +1048,49 @@ private static string AppLibDirectory(BenchConfiguration config, string appLibId return Path.Combine(config.GetStringValue(PropertyKeys.AppLibsDir), appLibId); } + /// + /// Deletes the loaded and cached app libraries + /// in preparation for re-loading them for an update or a repair. + /// + /// The Bench configuration + public static void DeleteAppLibraries(BenchConfiguration cfg) + { + var appLibDir = cfg.GetStringValue(PropertyKeys.AppLibsDir); + FileSystem.EmptyDir(appLibDir); + var cacheDir = cfg.GetStringValue(PropertyKeys.AppLibsDownloadDir); + FileSystem.EmptyDir(cacheDir); + } + private static void LoadAppLibraries(IBenchManager man, ICollection _, Action notify, Cancelation cancelation) { - var appLibDir = man.Config.GetStringValue(PropertyKeys.AppLibsDir); - FileSystem.EmptyDir(appLibDir); + var appLibsDir = man.Config.GetStringValue(PropertyKeys.AppLibsDir); + FileSystem.AsureDir(appLibsDir); var cacheDir = man.Config.GetStringValue(PropertyKeys.AppLibsDownloadDir); - FileSystem.EmptyDir(cacheDir); + FileSystem.AsureDir(cacheDir); var appLibs = man.Config.AppLibraries; + // Clean unconfigured app library directories + foreach (var d in Directory.GetDirectories(appLibsDir)) + { + var n = Path.GetFileName(d); + var found = false; + foreach (var l in appLibs) + { + if (string.Equals(l.ID, n, StringComparison.InvariantCultureIgnoreCase)) + { + found = true; + } + } + if (!found) + { + FileSystem.PurgeDir(d); + notify(new TaskInfo(string.Format("Deleted unknown app library '{0}'.", n))); + } + } + var finished = 0; var errorCnt = 0; var taskCnt = appLibs.Length; @@ -1069,7 +1101,8 @@ private static void LoadAppLibraries(IBenchManager man, { notify(new TaskProgress( string.Format("Started download for app library '{0}' ...", e.Task.Id), - (float)finished / taskCnt, e.Task.Id, e.Task.Url.ToString())); + progress: (float)finished / taskCnt, + detailedMessage: e.Task.Url.ToString())); }; EventHandler downloadEndedHandler = (o, e) => @@ -1078,7 +1111,7 @@ private static void LoadAppLibraries(IBenchManager man, if (!e.Task.Success) { errorCnt++; - notify(new TaskError(e.Task.ErrorMessage, e.Task.Id)); + notify(new TaskError(e.Task.ErrorMessage)); } else { @@ -1087,7 +1120,7 @@ private static void LoadAppLibraries(IBenchManager man, ExtractAppLibrary(man.Config, e.Task.TargetFile, AppLibDirectory(man.Config, e.Task.Id)); notify(new TaskProgress( string.Format("Finished download for app library '{0}'.", e.Task.Id), - (float)finished / taskCnt, e.Task.Id)); + progress: (float)finished / taskCnt)); } catch (Exception exc) { @@ -1112,12 +1145,31 @@ private static void LoadAppLibraries(IBenchManager man, cancelation.Canceled += (s, e) => man.Downloader.CancelAll(); - notify(new TaskProgress("Loading app libraries...", 0f)); + notify(new TaskProgress("Loading app libraries...", + progress: 0f)); foreach (var l in appLibs) { + var appLibDir = AppLibDirectory(man.Config, l.ID); + + // Skip app library if is already loaded + if (File.Exists(Path.Combine(appLibDir, + man.Config.GetStringValue(PropertyKeys.AppLibIndexFileName)))) + { + notify(new TaskProgress( + string.Format("App library '{0}' already loaded.", l.ID), + progress: (float)finished / taskCnt)); + continue; + } + else + { + // Clean the app library directory, if the directory is not valid + notify(new TaskInfo( + string.Format("Cleaning invalid app library '{0}'.", l.ID))); + FileSystem.PurgeDir(appLibDir); + } + var appLibArchive = l.ID + ".zip"; - var appLibArchivePath = Path.Combine(cacheDir, appLibArchive); if ("file".Equals(l.Url.Scheme.ToLowerInvariant())) { @@ -1127,10 +1179,10 @@ private static void LoadAppLibraries(IBenchManager man, finished++; try { - CopyAppLibrary(man.Config, sourcePath, AppLibDirectory(man.Config, l.ID)); + CopyAppLibrary(man.Config, sourcePath, appLibDir); notify(new TaskProgress( string.Format("Successfully loaded app library '{0}'.", l.ID), - (float)finished / taskCnt)); + progress: (float)finished / taskCnt)); } catch (Exception e) { @@ -1142,9 +1194,34 @@ private static void LoadAppLibraries(IBenchManager man, } else { - var task = new DownloadTask(l.ID, l.Url, appLibArchivePath); - tasks.Add(task); - man.Downloader.Enqueue(task); + var appLibArchivePath = Path.Combine(cacheDir, appLibArchive); + // Check if app library is cached + if (File.Exists(appLibArchivePath)) + { + finished++; + // Extract if it is cached + try + { + ExtractAppLibrary(man.Config, appLibArchivePath, appLibDir); + notify(new TaskProgress( + string.Format("Extracted app library '{0}' from cache.", l.ID), + progress: (float)finished / taskCnt)); + } + catch (Exception exc) + { + errorCnt++; + notify(new TaskError( + string.Format("Extracting the archive of app library '{0}' failed.", l.ID), + exception: exc)); + } + } + else + { + // Queue download task if not + var task = new DownloadTask(l.ID, l.Url, appLibArchivePath); + tasks.Add(task); + man.Downloader.Enqueue(task); + } } } @@ -1152,19 +1229,20 @@ private static void LoadAppLibraries(IBenchManager man, { man.Downloader.DownloadEnded -= downloadEndedHandler; man.Downloader.WorkFinished -= workFinishedHandler; - notify(new TaskProgress("Nothing to download.", 1f)); + notify(new TaskProgress("Nothing to download.", + progress: 1f)); } else { - notify(new TaskProgress( - string.Format("Queued {0} downloads.", tasks.Count), - 0f)); + notify(new TaskProgress(string.Format("Queued {0} downloads.", tasks.Count), + progress: 0f)); endEvent.WaitOne(); } if (!cancelation.IsCanceled) { - notify(new TaskProgress("Finished loading app libraries.", 1f)); + notify(new TaskProgress("Finished loading app libraries.", + progress: 1f)); } } From df42cb593b229663d0d4dad87cfce330b3e5686e Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:41:30 +0100 Subject: [PATCH 159/230] clean-up app libs in case of upgrade --- res/bench-install.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/bench-install.bat b/res/bench-install.bat index f4bd9e1d..38222dcc 100644 --- a/res/bench-install.bat +++ b/res/bench-install.bat @@ -14,7 +14,7 @@ PUSHD "%ROOT%" CALL :DOWNLOAD "%BENCH_ZIPURL%" "%BENCH_ZIPFILE%" ECHO Removing old Bench files ... -FOR %%d IN (actions, auto, res, tmp, lib\conemu) DO ( +FOR %%d IN (actions, auto, res, tmp, lib\conemu, lib\_applibs, cache\_applibs) DO ( IF EXIST "%ROOT%\%%d\" RMDIR /S /Q "%ROOT%\%%d" ) From 3f2e97f93f3bec0ea1b27f3a3231b4f209d67068 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:41:46 +0100 Subject: [PATCH 160/230] added CLI command 'bench manage update' --- BenchManager/BenchCLI/BenchCLI.csproj | 1 + .../BenchCLI/Commands/ManageCommand.cs | 13 ++++- .../BenchCLI/Commands/UpdateCommand.cs | 56 +++++++++++++++++++ 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 BenchManager/BenchCLI/Commands/UpdateCommand.cs diff --git a/BenchManager/BenchCLI/BenchCLI.csproj b/BenchManager/BenchCLI/BenchCLI.csproj index 77d168fa..5535b070 100644 --- a/BenchManager/BenchCLI/BenchCLI.csproj +++ b/BenchManager/BenchCLI/BenchCLI.csproj @@ -81,6 +81,7 @@ + diff --git a/BenchManager/BenchCLI/Commands/ManageCommand.cs b/BenchManager/BenchCLI/Commands/ManageCommand.cs index 917c2fa5..df51e89d 100644 --- a/BenchManager/BenchCLI/Commands/ManageCommand.cs +++ b/BenchManager/BenchCLI/Commands/ManageCommand.cs @@ -18,6 +18,7 @@ class ManageCommand : BenchCommand private readonly BenchCommand downloadsCommand = new DownloadsCommand(); private readonly BenchCommand reinstallCommand = new ReinstallCommand(); private readonly BenchCommand renewCommand = new RenewCommand(); + private readonly BenchCommand updateCommand = new UpdateCommand(); private readonly BenchCommand upgradeCommand = new UpgradeCommand(); protected override void InitializeArgumentParser(ArgumentParser parser) @@ -63,19 +64,24 @@ protected override void InitializeArgumentParser(ArgumentParser parser) commandRenew.Description .Text("Redownload all app resources, remove all installed apps, then install all active apps."); - var commandUpgrade = new CommandArgument(upgradeCommand.Name, 'u'); + var commandUpdate = new CommandArgument(updateCommand.Name, 'u'); + commandUpdate.Description + .Text("Update the app libraries and upgrades all apps."); + + var commandUpgrade = new CommandArgument(upgradeCommand.Name, 'g'); commandUpgrade.Description .Text("Download and extract the latest Bench release, then run the auto-setup."); parser.RegisterArguments( + commandConfig, commandInitialize, commandSetup, commandLoadAppLibs, commandUpdateEnv, commandReinstall, commandRenew, - commandUpgrade, - commandConfig); + commandUpdate, + commandUpgrade); } public ManageCommand() @@ -88,6 +94,7 @@ public ManageCommand() RegisterSubCommand(downloadsCommand); RegisterSubCommand(reinstallCommand); RegisterSubCommand(renewCommand); + RegisterSubCommand(updateCommand); RegisterSubCommand(upgradeCommand); } } diff --git a/BenchManager/BenchCLI/Commands/UpdateCommand.cs b/BenchManager/BenchCLI/Commands/UpdateCommand.cs new file mode 100644 index 00000000..b23afc6f --- /dev/null +++ b/BenchManager/BenchCLI/Commands/UpdateCommand.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Mastersign.CliTools; +using Mastersign.Docs; + +namespace Mastersign.Bench.Cli.Commands +{ + class UpdateCommand : BenchCommand + { + public override string Name => "update"; + + protected override void InitializeArgumentParser(ArgumentParser parser) + { + parser.Description + .Begin(BlockType.Paragraph) + .Text("The ").Keyword(Name).Text(" command updates the app libraries and upgrades all apps.") + .End(BlockType.Paragraph); + } + + protected override bool ExecuteCommand(string[] args) + { + bool success; + var oldCfg = LoadConfiguration(false); + + // Delete app libraries + BenchTasks.DeleteAppLibraries(oldCfg); + + // Load app libraries + using (var man = new DefaultBenchManager(oldCfg)) + { + man.Verbose = Verbose; + success = man.LoadAppLibraries(); + if (!success) + { + WriteError("Failed to load the latest app libraries."); + return false; + } + } + + // Upgrade apps + var newCfg = LoadConfiguration(true); + using (var man = new DefaultBenchManager(newCfg)) + { + man.Verbose = Verbose; + success = man.UpgradeApps(); + if (!success) + { + WriteError("Failed to upgrade the apps."); + return false; + } + } + return true; + } + } +} From 20488fa4488054576ac35053d168be01cf279b86 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 18:55:46 +0100 Subject: [PATCH 161/230] added update app libraries and apps to BenchDashboard setup dialog --- .../BenchDashboard/BenchDashboard.csproj | 2 +- BenchManager/BenchDashboard/Core.cs | 38 ++ .../Properties/Resources.Designer.cs | 10 + .../BenchDashboard/Properties/Resources.resx | 3 + .../Resources/update_apps_16.png | Bin 0 -> 303 bytes .../BenchDashboard/SetupForm.Designer.cs | 360 +++++++++--------- BenchManager/BenchDashboard/SetupForm.cs | 6 + BenchManager/BenchDashboard/SetupForm.resx | 24 +- 8 files changed, 256 insertions(+), 187 deletions(-) create mode 100644 BenchManager/BenchDashboard/Resources/update_apps_16.png diff --git a/BenchManager/BenchDashboard/BenchDashboard.csproj b/BenchManager/BenchDashboard/BenchDashboard.csproj index fd425a12..8d938125 100644 --- a/BenchManager/BenchDashboard/BenchDashboard.csproj +++ b/BenchManager/BenchDashboard/BenchDashboard.csproj @@ -210,10 +210,10 @@ - + diff --git a/BenchManager/BenchDashboard/Core.cs b/BenchManager/BenchDashboard/Core.cs index 34910a62..d4da4720 100644 --- a/BenchManager/BenchDashboard/Core.cs +++ b/BenchManager/BenchDashboard/Core.cs @@ -612,6 +612,44 @@ public async Task UpdateEnvironmentAsync(Action notify) return result; } + public async Task UpdateAppsAsync(Action notify) + { + BeginAction(); + BenchTasks.DeleteAppLibraries(Config); + var result = await RunTaskAsync(BenchTasks.DoLoadAppLibraries, notify, cancelation); + if (result.Canceled) + { + UI.ShowWarning("Loading App Libraries", "Canceled"); + EndAction(result.Success); + return result; + } + else if (!result.Success) + { + UI.ShowWarning("Loading App Libraries", + "Loading the app libraries failed."); + EndAction(false); + return result; + } + + result = await RunTaskAsync(BenchTasks.DoUpgradeApps, notify, cancelation); + EndAction(result.Success); + if (result.Canceled) + { + UI.ShowWarning("Upgrading Apps", "Canceled"); + } + else if (!result.Success) + { + UI.ShowWarning("Upgrading Apps", + BuildCombinedErrorMessage( + "Upgrading the following apps failed:", + "Upgrading apps failed.", + result.Errors, 10)); + EndAction(false); + return result; + } + return result; + } + private class AsyncVersionNumberResult : IAsyncResult { public object AsyncState => null; diff --git a/BenchManager/BenchDashboard/Properties/Resources.Designer.cs b/BenchManager/BenchDashboard/Properties/Resources.Designer.cs index 0e5026d4..75181bf1 100644 --- a/BenchManager/BenchDashboard/Properties/Resources.Designer.cs +++ b/BenchManager/BenchDashboard/Properties/Resources.Designer.cs @@ -529,6 +529,16 @@ internal static System.Drawing.Bitmap uninstall_16 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap update_apps_16 { + get { + object obj = ResourceManager.GetObject("update_apps_16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/BenchManager/BenchDashboard/Properties/Resources.resx b/BenchManager/BenchDashboard/Properties/Resources.resx index aad34c5d..88878033 100644 --- a/BenchManager/BenchDashboard/Properties/Resources.resx +++ b/BenchManager/BenchDashboard/Properties/Resources.resx @@ -277,4 +277,7 @@ ..\resources\book_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\resources\update_apps_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/BenchManager/BenchDashboard/Resources/update_apps_16.png b/BenchManager/BenchDashboard/Resources/update_apps_16.png new file mode 100644 index 0000000000000000000000000000000000000000..22f1b58c5d036df64e78d901129427b676ef1e23 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!6Tk7jv*HQ$tes?`StCWDH>L6+D^Zp)-}<)<$4ksat>@i8dxyr@jAX~4&Ryd7``1^ zKYzdEjT@1LzvLxZSlOK-1sWc)PEebm-LX-U?EqVY4{K&aVi3d0#tyy*Yzx};I0Tg0 t_*?`W_+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + False + + + False + + + False + + + False + True @@ -162,18 +174,6 @@ 17, 17 - - False - - - False - - - False - - - False - 62 From fe2e67e5bc74b58e55c4a760e889084da5e51d81 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 9 Jan 2017 19:05:08 +0100 Subject: [PATCH 162/230] updated changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5504df20..e933853c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ Add a link to the GitHub diff like - Bench CLI ([#87](https://github.com/mastersign/bench/issues/87)) - Update check in the About dialog of _BenchDashboard_ +- _Upgrade Bench_ entry in the _Setup_ menu of the setup dialog of _BenchDashboard_ - Configurable columns to the Setup dialog of _BenchDashboard_ - Config properties + `VersionUrl` @@ -45,6 +46,7 @@ Add a link to the GitHub diff like + `AppLibIndexFileName` + `AppLibCustomScriptDirName` + `AppLibResourceDirName` +- _Update App Libraries and Apps_ entry in the _Setup_ menu of the setup dialog of _BenchDashboard_ - Markdown info text in the app info dialog ### Changed From 80c740c6bf2aa43006db9a065c9477e266031742 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:01:48 +0100 Subject: [PATCH 163/230] improved whitespace around headlines --- BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs | 9 +++++++-- BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs b/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs index ee3b5a1c..63ce4024 100644 --- a/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs +++ b/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs @@ -157,10 +157,14 @@ public override DocumentWriter Begin(BlockType type) break; // HEADLINE case BlockType.Headline1: + BR(); + BR(); W("## "); anchor = null; break; case BlockType.Headline2: + BR(); + BR(); W("### "); anchor = null; break; @@ -174,6 +178,7 @@ public override DocumentWriter Begin(BlockType type) // LIST case BlockType.List: BR(); + if (listDepth == 0) BR(); listDepth++; break; case BlockType.ListItem: @@ -238,7 +243,6 @@ public override DocumentWriter End(BlockType type) case BlockType.Headline2: if (anchor != null) W(" {{#" + anchor + "}}"); BR(); - BR(); break; // LINK case BlockType.LinkContent: @@ -278,9 +282,10 @@ public override DocumentWriter End(BlockType type) break; case BlockType.DefinitionTopic: text = EndBuffering(); - W("#### {0}", text); BR(); BR(); + W("#### {0}", text); + BR(); break; case BlockType.DefinitionContent: BR(); diff --git a/BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs b/BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs index 6c66bc02..9d29caac 100644 --- a/BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs +++ b/BenchManager/BenchCLI/Docs/PlainTextDocumentWriter.cs @@ -309,6 +309,8 @@ public override DocumentWriter End(BlockType type) break; case BlockType.Headline1: text = EndBuffering(); + BR(); + BR(); C(ConsoleColor.Yellow); W(text); BR(); @@ -319,6 +321,8 @@ public override DocumentWriter End(BlockType type) break; case BlockType.Headline2: text = EndBuffering(); + BR(); + BR(); C(ConsoleColor.Yellow); W(text); W(":"); From 9e28e7d8f5f279e49d8d22b4f950af8f05ed9e3b Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:03:55 +0100 Subject: [PATCH 164/230] streamlined description of CLI command 'bench help' --- BenchManager/BenchCLI/Commands/HelpCommand.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BenchManager/BenchCLI/Commands/HelpCommand.cs b/BenchManager/BenchCLI/Commands/HelpCommand.cs index 1ddbe222..af65a960 100644 --- a/BenchManager/BenchCLI/Commands/HelpCommand.cs +++ b/BenchManager/BenchCLI/Commands/HelpCommand.cs @@ -20,7 +20,9 @@ class HelpCommand : BenchCommand protected override void InitializeArgumentParser(ArgumentParser parser) { parser.Description - .Text("Displays the full help for all commands."); + .Begin(BlockType.Paragraph) + .Text("The ").Keyword(Name).Text(" command displays the full help for all commands.") + .End(BlockType.Paragraph); var flagNoTitle = new FlagArgument(FLAG_NO_TITLE, 't'); flagNoTitle.Description From a78cd9b12c5b39264a3af049bc7737c8a6982c80 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:04:25 +0100 Subject: [PATCH 165/230] fixed missing colors in full help output --- BenchManager/BenchCLI/Commands/HelpCommand.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/BenchManager/BenchCLI/Commands/HelpCommand.cs b/BenchManager/BenchCLI/Commands/HelpCommand.cs index af65a960..64b69803 100644 --- a/BenchManager/BenchCLI/Commands/HelpCommand.cs +++ b/BenchManager/BenchCLI/Commands/HelpCommand.cs @@ -67,13 +67,24 @@ protected override void InitializeArgumentParser(ArgumentParser parser) protected override bool ExecuteCommand(string[] args) { var targetFile = TargetFile; - using (var s = targetFile != null - ? File.Open(targetFile, Append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.None) - : Console.OpenStandardOutput()) + Stream s = null; + if (targetFile != null) + { + try + { + s = File.Open(targetFile, Append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.None); + } + catch (IOException exc) + { + WriteError("Failed to open the target file: " + exc.Message); + return false; + } + } using (var w = DocumentWriterFactory.Create(HelpFormat, s)) { RootCommand.PrintFullHelp(w, !NoTitle, !NoVersion, !NoIndex); } + if (s != null) s.Close(); return true; } } From 065ad6c9e923d63fff7e612fa82dfddbcea45c4c Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:06:45 +0100 Subject: [PATCH 166/230] improved help output - reduced help syntax to main help indicator - moved help syntax into usage section when sub-command is displayed in full help - added internal links to command list --- BenchManager/BenchCLI/CliTools/CommandBase.cs | 12 +-- .../BenchCLI/CliTools/HelpFormatter.cs | 81 +++++++++++++------ 2 files changed, 62 insertions(+), 31 deletions(-) diff --git a/BenchManager/BenchCLI/CliTools/CommandBase.cs b/BenchManager/BenchCLI/CliTools/CommandBase.cs index 56d4693c..5527ef4e 100644 --- a/BenchManager/BenchCLI/CliTools/CommandBase.cs +++ b/BenchManager/BenchCLI/CliTools/CommandBase.cs @@ -277,11 +277,12 @@ protected virtual void PrintHelp(DocumentWriter w) { w.Begin(BlockType.Document); w.Title("{0} v{1}", ToolName, ToolVersion); - PrintCommandHelp(w); + PrintCommandHelp(w, withHelpSection: true, withCommandLinks: false); w.End(BlockType.Document); } - public void PrintFullHelp(DocumentWriter w, bool withTitle = true, bool withVersion = true, bool withIndex = true) + public void PrintFullHelp(DocumentWriter w, + bool withTitle = true, bool withVersion = true, bool withIndex = true) { w.Begin(BlockType.Document); if (withTitle) w.Title(ToolName); @@ -309,13 +310,14 @@ public void PrintFullHelp(DocumentWriter w, bool withTitle = true, bool withVers foreach (var cmd in commands) { w.Headline1(HelpFormatter.CommandAnchor(cmd), cmd.CommandChain(" ", true)); - cmd.PrintCommandHelp(w); + cmd.PrintCommandHelp(w, withHelpSection: cmd == this, withCommandLinks: true); } w.End(BlockType.Document); } - private void PrintCommandHelp(DocumentWriter w) + private void PrintCommandHelp(DocumentWriter w, + bool withHelpSection = true, bool withCommandLinks = false) { if (Parent != null) { @@ -329,7 +331,7 @@ private void PrintCommandHelp(DocumentWriter w) } w.End(BlockType.Paragraph); } - HelpFormatter.WriteHelp(w, this); + HelpFormatter.WriteHelp(w, this, withHelpSection, withCommandLinks); } private ArgumentParsingResult CompleteInteractively(ArgumentParsingResult arguments) diff --git a/BenchManager/BenchCLI/CliTools/HelpFormatter.cs b/BenchManager/BenchCLI/CliTools/HelpFormatter.cs index 96c62baa..0b44f6da 100644 --- a/BenchManager/BenchCLI/CliTools/HelpFormatter.cs +++ b/BenchManager/BenchCLI/CliTools/HelpFormatter.cs @@ -136,51 +136,63 @@ public static string CommandAnchor(CommandBase cmd) return "cmd_" + cmd.CommandChain("-"); } - private static Document fullHelpIndicator; - private static Document FullHelpIndicator + public static string CommandAnchor(CommandBase cmd, string subCmd) + { + return CommandAnchor(cmd) + "-" + subCmd; + } + + private static Document allHelpIndicators; + private static Document AllHelpIndicators { get { - if (fullHelpIndicator == null) + if (allHelpIndicators == null) { var d = new Document(); - d.Text(" ("); var helpIndicators = ArgumentParser.HelpIndicators; for (int i = 0; i < helpIndicators.Length; i++) { - if (i > 0) d.Text(" | "); + if (i > 0) d.Text(", "); d.Keyword(helpIndicators[i]); } - d.Text(")"); - fullHelpIndicator = d; + allHelpIndicators = d; } - return fullHelpIndicator; + return allHelpIndicators; } } - public static void WriteHelp(DocumentWriter w, CommandBase cmd) + public static void WriteHelp(DocumentWriter w, CommandBase cmd, + bool withHelpSection = true, bool withCommandLinks = false) { var parser = cmd.ArgumentParser; w.Append(parser.Description); - WriteUsage(w, cmd); - WriteHelpUsage(w, cmd); + WriteUsage(w, cmd, withHelp: !withHelpSection); + if (withHelpSection) WriteHelpUsage(w, cmd); WriteFlags(w, cmd); WriteOptions(w, cmd); WritePositionals(w, cmd); - WriteCommands(w, cmd); + WriteCommands(w, cmd, withCommandLinks); } - private static void WriteUsage(DocumentWriter w, CommandBase cmd) + private static void WriteUsage(DocumentWriter w, CommandBase cmd, + bool withHelp = false) { w.Headline2(CommandAnchor(cmd) + "_usage", "Usage"); w.Begin(BlockType.List); + if (withHelp) + { + w.Begin(BlockType.ListItem) + .Append(SlimCommandChain, cmd).Text(" ") + .Keyword(ArgumentParser.MainHelpIndicator); + w.End(BlockType.ListItem); + } w.ListItem(FullCommandChain, cmd); if (HasCommands(cmd.ArgumentParser)) { - w.Begin(BlockType.ListItem); - w.Append(FullCommandChain, cmd); - w.Text(" ").Variable("command").Text(" ..."); + w.Begin(BlockType.ListItem) + .Append(FullCommandChain, cmd) + .Text(" ").Variable("command").Text(" ..."); w.End(BlockType.ListItem); } w.End(BlockType.List); @@ -189,18 +201,22 @@ private static void WriteUsage(DocumentWriter w, CommandBase cmd) private static void WriteHelpUsage(DocumentWriter w, CommandBase cmd) { w.Headline2(CommandAnchor(cmd) + "_help", "Help"); - + w.Begin(BlockType.Paragraph) + .Text("Showing the help can be triggered by one of the following flags: ") + .Append(AllHelpIndicators) + .Text("."); + w.End(BlockType.Paragraph); w.Begin(BlockType.List); - w.Begin(BlockType.ListItem); - w.Append(SlimCommandChain, cmd); - w.Append(FullHelpIndicator); + w.Begin(BlockType.ListItem) + .Append(SlimCommandChain, cmd).Text(" ") + .Keyword(ArgumentParser.MainHelpIndicator); w.End(BlockType.ListItem); if (HasCommands(cmd.ArgumentParser)) { - w.Begin(BlockType.ListItem); - w.Append(SlimCommandChain, cmd) - .Text(" ").Variable("command") - .Append(FullHelpIndicator); + w.Begin(BlockType.ListItem) + .Append(SlimCommandChain, cmd) + .Text(" ").Variable("command").Text(" ") + .Keyword(ArgumentParser.MainHelpIndicator); w.End(BlockType.ListItem); } w.End(BlockType.List); @@ -305,7 +321,7 @@ private static void WritePositionals(DocumentWriter w, CommandBase cmd) } } - private static void WriteCommands(DocumentWriter w, CommandBase cmd) + private static void WriteCommands(DocumentWriter w, CommandBase cmd, bool withLinks = false) { var commands = cmd.ArgumentParser.GetCommands(); if (commands.Length > 0) @@ -315,7 +331,20 @@ private static void WriteCommands(DocumentWriter w, CommandBase cmd) foreach (var cmdArg in commands) { w.Begin(BlockType.Definition); - w.DefinitionTopic(FormatCommand, cmdArg); + w.Begin(BlockType.DefinitionTopic); + if (withLinks) + { + w.Begin(BlockType.Link); + w.LinkTarget("#" + CommandAnchor(cmd, cmdArg.Name)); + w.Begin(BlockType.LinkContent); + } + w.Append(FormatCommand, cmdArg); + if (withLinks) + { + w.End(BlockType.LinkContent); + w.End(BlockType.Link); + } + w.End(BlockType.DefinitionTopic); w.Begin(BlockType.DefinitionContent); if (!cmdArg.Description.IsEmpty) { From 6c4c896ad2def4e719c78628e9e363bb16c78bd6 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:21:40 +0100 Subject: [PATCH 167/230] changed target file opening mode --- BenchManager/BenchCLI/Commands/HelpCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchCLI/Commands/HelpCommand.cs b/BenchManager/BenchCLI/Commands/HelpCommand.cs index 64b69803..c4762124 100644 --- a/BenchManager/BenchCLI/Commands/HelpCommand.cs +++ b/BenchManager/BenchCLI/Commands/HelpCommand.cs @@ -72,7 +72,7 @@ protected override bool ExecuteCommand(string[] args) { try { - s = File.Open(targetFile, Append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.None); + s = File.Open(targetFile, Append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read); } catch (IOException exc) { From 56130641786f41e40fa56c49c8843e2ed38d8751 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:21:59 +0100 Subject: [PATCH 168/230] fixed incorrect escaping inside of code spans --- BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs b/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs index 63ce4024..4e5f6fb6 100644 --- a/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs +++ b/BenchManager/BenchCLI/Docs/MarkdownDocumentWriter.cs @@ -320,7 +320,7 @@ public override DocumentWriter Inline(InlineType type, string format, params obj break; case InlineType.Code: case InlineType.Keyword: - W(" `{0}`", Escape(text)); + W(" `{0}`", text); break; case InlineType.Variable: W(" _<{0}>_", Escape(text)); From 938f077c2f1d842fff3ec9dc608d3d30461f127a Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:22:25 +0100 Subject: [PATCH 169/230] moved CLI command 'bench manage config get' into its own class --- BenchManager/BenchCLI/BenchCLI.csproj | 1 + .../BenchCLI/Commands/ConfigCommand.cs | 42 +++-------------- .../BenchCLI/Commands/ConfigGetCommand.cs | 46 +++++++++++++++++++ 3 files changed, 53 insertions(+), 36 deletions(-) create mode 100644 BenchManager/BenchCLI/Commands/ConfigGetCommand.cs diff --git a/BenchManager/BenchCLI/BenchCLI.csproj b/BenchManager/BenchCLI/BenchCLI.csproj index 5535b070..f4d9a00f 100644 --- a/BenchManager/BenchCLI/BenchCLI.csproj +++ b/BenchManager/BenchCLI/BenchCLI.csproj @@ -68,6 +68,7 @@ + diff --git a/BenchManager/BenchCLI/Commands/ConfigCommand.cs b/BenchManager/BenchCLI/Commands/ConfigCommand.cs index f1645453..381567b1 100644 --- a/BenchManager/BenchCLI/Commands/ConfigCommand.cs +++ b/BenchManager/BenchCLI/Commands/ConfigCommand.cs @@ -8,10 +8,10 @@ namespace Mastersign.Bench.Cli.Commands { class ConfigCommand : BenchCommand { - private const string COMMAND_GET = "get"; - public override string Name => "config"; + private readonly BenchCommand getCommand = new ConfigGetCommand(); + protected override void InitializeArgumentParser(ArgumentParser parser) { parser.Description @@ -19,49 +19,19 @@ protected override void InitializeArgumentParser(ArgumentParser parser) .Text("The ").Keyword(Name).Text(" command gives access to the Bench user configuration.") .End(BlockType.Paragraph); - var commandGet = new CommandArgument(COMMAND_GET, 'g'); + var commandGet = new CommandArgument(getCommand.Name, 'g', "read"); commandGet.Description .Text("Reads a configuration value."); commandGet.SyntaxInfo - .Variable("property name"); + .Append(HelpFormatter.CommandSyntax, getCommand); parser.RegisterArguments( commandGet); } - protected override bool ExecuteUnknownSubCommand(string command, string[] args) - { - switch (command) - { - case COMMAND_GET: - return TaskGetConfigValue(args); - - default: - WriteError("Unsupported command: " + command + "."); - return false; - } - } - - private bool TaskGetConfigValue(string[] args) + public ConfigCommand() { - if (args.Length != 1) - { - WriteError("Invalid arguments after 'get'."); - WriteError("Expected: bench config get "); - return false; - } - - var propertyName = args[0]; - - var cfg = LoadConfiguration(false); - if (!cfg.ContainsValue(propertyName)) - { - WriteError("Unknown property name: " + propertyName); - return false; - } - WriteDetail("Property: " + propertyName); - PropertyWriter.WritePropertyValue(cfg.GetValue(propertyName)); - return true; + RegisterSubCommand(getCommand); } } } diff --git a/BenchManager/BenchCLI/Commands/ConfigGetCommand.cs b/BenchManager/BenchCLI/Commands/ConfigGetCommand.cs new file mode 100644 index 00000000..873d1214 --- /dev/null +++ b/BenchManager/BenchCLI/Commands/ConfigGetCommand.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Mastersign.CliTools; +using Mastersign.Docs; + +namespace Mastersign.Bench.Cli.Commands +{ + class ConfigGetCommand : BenchCommand + { + private static string POSITIONAL_PROPERTY_NAME = "property-name"; + + public override string Name => "get"; + + protected override void InitializeArgumentParser(ArgumentParser parser) + { + parser.Description + .Begin(BlockType.Paragraph) + .Text("The ").Keyword(Name).Text(" command reads a configuration value.") + .End(BlockType.Paragraph); + + var positionalPropertyName = new PositionalArgument(POSITIONAL_PROPERTY_NAME, + null, 1); + positionalPropertyName.Description + .Text("The name of the configuration property to read."); + + parser.RegisterArguments( + positionalPropertyName); + } + + protected override bool ExecuteCommand(string[] args) + { + var propertyName = Arguments.GetPositionalValue(POSITIONAL_PROPERTY_NAME); + + var cfg = LoadConfiguration(false); + if (!cfg.ContainsValue(propertyName)) + { + WriteError("Unknown property name: " + propertyName); + return false; + } + WriteDetail("Property: " + propertyName); + PropertyWriter.WritePropertyValue(cfg.GetValue(propertyName)); + return true; + } + } +} From d6fee431af9924627f43d387d08a35c5183dc73b Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:30:03 +0100 Subject: [PATCH 170/230] added CLI flag 'bench manage load-app-libs --update' --- .../Commands/LoadAppLibrariesCommand.cs | 19 +++++++++++++++++-- .../BenchCLI/Commands/ManageCommand.cs | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/BenchManager/BenchCLI/Commands/LoadAppLibrariesCommand.cs b/BenchManager/BenchCLI/Commands/LoadAppLibrariesCommand.cs index 5c8daae6..d1c4efd7 100644 --- a/BenchManager/BenchCLI/Commands/LoadAppLibrariesCommand.cs +++ b/BenchManager/BenchCLI/Commands/LoadAppLibrariesCommand.cs @@ -9,17 +9,32 @@ namespace Mastersign.Bench.Cli.Commands { class LoadAppLibraries : BenchCommand { + private const string FLAG_UPDATE = "update"; + public override string Name => "load-app-libs"; protected override void InitializeArgumentParser(ArgumentParser parser) { parser.Description .Begin(BlockType.Paragraph) - .Text("The ").Keyword(Name).Text(" command loads the latest app libraries.") + .Text("The ").Keyword(Name).Text(" command loads missing app libraries.") .End(BlockType.Paragraph); + + var updateFlag = new FlagArgument(FLAG_UPDATE, 'u'); + updateFlag.Description + .Text("Clears the cache and loads the latest version of all app libraries."); + + parser.RegisterArguments( + updateFlag); } protected override bool ExecuteCommand(string[] args) - => RunManagerTask(mgr => mgr.LoadAppLibraries()); + { + using (var mgr = CreateManager()) + { + BenchTasks.DeleteAppLibraries(mgr.Config); + return mgr.LoadAppLibraries(); + } + } } } diff --git a/BenchManager/BenchCLI/Commands/ManageCommand.cs b/BenchManager/BenchCLI/Commands/ManageCommand.cs index df51e89d..de332bdb 100644 --- a/BenchManager/BenchCLI/Commands/ManageCommand.cs +++ b/BenchManager/BenchCLI/Commands/ManageCommand.cs @@ -41,6 +41,8 @@ protected override void InitializeArgumentParser(ArgumentParser parser) var commandLoadAppLibs = new CommandArgument(loadAppLibsCommand.Name, 'l'); commandLoadAppLibs.Description .Text("Load the latest app libraries."); + commandLoadAppLibs.SyntaxInfo + .Append(HelpFormatter.CommandSyntax, loadAppLibsCommand); var commandSetup = new CommandArgument(autoSetupCommand.Name, 's'); commandSetup.Description From fbe06a92f7a837a63808f2c58c90106ad0e7426b Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:30:20 +0100 Subject: [PATCH 171/230] reordered home page entries --- docs/content/home/apps.md | 2 +- docs/content/home/docs.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/home/apps.md b/docs/content/home/apps.md index 5cd48bdd..606de8ba 100644 --- a/docs/content/home/apps.md +++ b/docs/content/home/apps.md @@ -4,7 +4,7 @@ description = "What apps can I use with Bench?" title = "Apps" icon = "database" follow_up_url = "/apps/" -weight = 4 +weight = 5 +++ Bench comes with libraries, which contain descriptions of Windows applications. diff --git a/docs/content/home/docs.md b/docs/content/home/docs.md index c113c563..419912d6 100644 --- a/docs/content/home/docs.md +++ b/docs/content/home/docs.md @@ -4,7 +4,7 @@ description = "Where do I find more info?" title = "Documentation" icon = "question-circle" follow_up_url = "/overview/" -weight = 5 +weight = 4 +++ Checkout the documentation of Bench. From faaf36f4f46680fc0d127b5e898bb72e8cb4ff24 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:30:31 +0100 Subject: [PATCH 172/230] updated CLI docus --- docs/content/ref/bench-cli.md | 382 +++++++++++++--------------------- 1 file changed, 148 insertions(+), 234 deletions(-) diff --git a/docs/content/ref/bench-cli.md b/docs/content/ref/bench-cli.md index 75283a3e..81d8a0e9 100644 --- a/docs/content/ref/bench-cli.md +++ b/docs/content/ref/bench-cli.md @@ -1,5 +1,5 @@ +++ -date = "2016-12-22T16:35:10+01:00" +date = "2017-01-11T11:20:19+01:00" description = "The command-line interface: bench.exe" title = "Bench CLI" weight = 2 @@ -33,20 +33,24 @@ Take a look at [the project website](http://mastersign.github.io/bench) for a de * [ `bench` `dashboard`](#cmd_bench-dashboard) * [ `bench` `help`](#cmd_bench-help) * [ `bench` `list`](#cmd_bench-list) +* [ `bench` `list` `applibs`](#cmd_bench-list-applibs) * [ `bench` `list` `apps`](#cmd_bench-list-apps) +* [ `bench` `list` `files`](#cmd_bench-list-files) * [ `bench` `manage`](#cmd_bench-manage) * [ `bench` `manage` `config`](#cmd_bench-manage-config) +* [ `bench` `manage` `config` `get`](#cmd_bench-manage-config-get) * [ `bench` `manage` `downloads`](#cmd_bench-manage-downloads) * [ `bench` `manage` `initialize`](#cmd_bench-manage-initialize) +* [ `bench` `manage` `load-app-libs`](#cmd_bench-manage-load-app-libs) * [ `bench` `manage` `reinstall`](#cmd_bench-manage-reinstall) * [ `bench` `manage` `renew`](#cmd_bench-manage-renew) * [ `bench` `manage` `setup`](#cmd_bench-manage-setup) +* [ `bench` `manage` `update`](#cmd_bench-manage-update) * [ `bench` `manage` `update-env`](#cmd_bench-manage-update-env) * [ `bench` `manage` `upgrade`](#cmd_bench-manage-upgrade) * [ `bench` `project`](#cmd_bench-project) ## bench {#cmd_bench} - The `bench` command is the executable of the Bench CLI. You can call it without a sub-command to enter the _interactive mode_. @@ -56,75 +60,64 @@ You can call it without a sub-command to enter the _interactive mode_. * `bench` ( _<flag>_ | _<option>_)\* _<command>_ ... ### Help {#cmd_bench_help} +Showing the help can be triggered by one of the following flags: `/?`, `-?`, `-h`, `--help`. -* `bench` ( `/?` | `-?` | `-h` | `--help`) -* `bench` _<command>_ ( `/?` | `-?` | `-h` | `--help`) +* `bench` `-?` +* `bench` _<command>_ `-?` ### Flags {#cmd_bench_flags} #### `--verbose` | `-v` - -Activates verbose output. +Activate verbose output. #### `--yes` | `--force` | `-y` - -Suppresses all assurance questions. +Suppress all assurance questions. ### Options {#cmd_bench_options} #### `--help-format` | `-f` _<value>_ - -Specifies the output format of help texts. +Specify the output format of help texts. Expected: `Plain` | `Markdown` Default: `Plain` #### `--logfile` | `--log` | `-l` _<value>_ - -Specifies a custom location for the log file. +Specify a custom location for the log file. Expected: A path to the log file. Default: Auto generated filename in _<bench root>_\log\. #### `--root` | `--base` | `-r` _<value>_ - -Specifies the root directory of the Bench environment. +Specify the root directory of the Bench environment. Expected: A path to a valid Bench root directory. Default: The root directory of the Bench environment, this Bench CLI belongs to. ### Commands {#cmd_bench_commands} -#### `app`, `a` - +#### [ `app`, `a`](#cmd_bench-app) Manage individual apps. Syntax: `bench` `app` _<sub-command>_ -#### `dashboard`, `gui`, `b` - -Starts the _Bench Dashboard_. - -#### `help`, `h` - -Displays the full help for all commands. +#### [ `dashboard`, `gui`, `b`](#cmd_bench-dashboard) +Start the _Bench Dashboard_. -#### `list`, `l` +#### [ `help`, `h`](#cmd_bench-help) +Display the full help for all commands. -Lists different kinds of objects in the Bench environment. +#### [ `list`, `l`](#cmd_bench-list) +List different kinds of objects in the Bench environment. -#### `manage`, `m` - -Manages the Bench environment and its configuration. - -#### `project`, `prj`, `p` +#### [ `manage`, `m`](#cmd_bench-manage) +Manage the Bench environment and its configuration. +#### [ `project`, `prj`, `p`](#cmd_bench-project) Manage projects in the Bench environment. Syntax: `bench` `project` ## bench app {#cmd_bench-app} - Command: `bench` `app` The `app` command allows interacting with Bench apps. @@ -133,84 +126,68 @@ Use the sub-commands to select the kind of interaction. ### Usage {#cmd_bench-app_usage} +* `bench` `app` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` * `bench` ( _<flag>_ | _<option>_)\* `app` _<command>_ ... -### Help {#cmd_bench-app_help} - -* `bench` `app` ( `/?` | `-?` | `-h` | `--help`) -* `bench` `app` _<command>_ ( `/?` | `-?` | `-h` | `--help`) - ### Commands {#cmd_bench-app_commands} -#### `activate`, `enable`, `a` - +#### [ `activate`, `enable`, `a`](#cmd_bench-app-activate) Activates an app. Syntax: `bench` `app` `activate` _<App ID>_ -#### `deactivate`, `disable`, `d` - +#### [ `deactivate`, `disable`, `d`](#cmd_bench-app-deactivate) Deactivates an app. Syntax: `bench` `app` `deactivate` _<App ID>_ -#### `download`, `cache`, `c` - +#### [ `download`, `cache`, `c`](#cmd_bench-app-download) Downloads an apps resource. Syntax: `bench` `app` `download` _<App ID>_ -#### `execute`, `exec`, `launch`, `run`, `e` - +#### [ `execute`, `exec`, `launch`, `run`, `e`](#cmd_bench-app-execute) Starts an apps main executable. Syntax: `bench` `app` `execute` _<flag>_\* _<App ID>_ -#### `info`, `i` - +#### [ `info`, `i`](#cmd_bench-app-info) Shows a detailed, human readable info of an app. Syntax: `bench` `app` `info` _<option>_\* _<App ID>_ -#### `install`, `setup`, `s` - +#### [ `install`, `setup`, `s`](#cmd_bench-app-install) Installs an app, regardless of its activation state. Syntax: `bench` `app` `install` _<App ID>_ -#### `list-properties`, `list`, `l` - +#### [ `list-properties`, `list`, `l`](#cmd_bench-app-list-properties) Lists the properties of an app. Syntax: `bench` `app` `list-properties` ( _<flag>_ | _<option>_)\* _<App ID>_ -#### `property`, `prop`, `p` - +#### [ `property`, `prop`, `p`](#cmd_bench-app-property) Reads an app property value. Syntax: `bench` `app` `property` _<App ID>_ _<Property Name>_ -#### `reinstall`, `r` - +#### [ `reinstall`, `r`](#cmd_bench-app-reinstall) Reinstalls an app. Syntax: `bench` `app` `reinstall` _<App ID>_ -#### `uninstall`, `remove`, `x` - +#### [ `uninstall`, `remove`, `x`](#cmd_bench-app-uninstall) Uninstalls an app, regardless of its activation state. Syntax: `bench` `app` `uninstall` _<App ID>_ -#### `upgrade`, `u` - +#### [ `upgrade`, `u`](#cmd_bench-app-upgrade) Upgrades an app. Syntax: `bench` `app` `upgrade` _<App ID>_ ## bench app activate {#cmd_bench-app-activate} - Command: `bench` `app` `activate` The `activate` command marks an app as activated. @@ -223,22 +200,17 @@ If the app is marked as deactivated, this mark is removed. ### Usage {#cmd_bench-app-activate_usage} +* `bench` `app` `activate` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `activate` _<App ID>_ -### Help {#cmd_bench-app-activate_help} - -* `bench` `app` `activate` ( `/?` | `-?` | `-h` | `--help`) - ### Positional Arguments {#cmd_bench-app-activate_positionals} #### 1. App ID - Specifies the app to activate. Expected: An app ID is an alphanumeric string without whitespace. ## bench app deactivate {#cmd_bench-app-deactivate} - Command: `bench` `app` `deactivate` The `deactivate` command removes an app from the activation list or marks it as deactivated. @@ -250,88 +222,68 @@ If the app is required by Bench, or as a dependency, it is marked as deactivated ### Usage {#cmd_bench-app-deactivate_usage} +* `bench` `app` `deactivate` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `deactivate` _<App ID>_ -### Help {#cmd_bench-app-deactivate_help} - -* `bench` `app` `deactivate` ( `/?` | `-?` | `-h` | `--help`) - ### Positional Arguments {#cmd_bench-app-deactivate_positionals} #### 1. App ID - Specifies the app to deactivate. Expected: An app ID is an alphanumeric string without whitespace. ## bench app download {#cmd_bench-app-download} - Command: `bench` `app` `download` The `download` command downloads the app resources, in case it is not cached already. ### Usage {#cmd_bench-app-download_usage} +* `bench` `app` `download` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `download` _<App ID>_ -### Help {#cmd_bench-app-download_help} - -* `bench` `app` `download` ( `/?` | `-?` | `-h` | `--help`) - ### Positional Arguments {#cmd_bench-app-download_positionals} #### 1. App ID - Specifies the app to download the resource for. Expected: An app ID is an alphanumeric string without whitespace. ## bench app execute {#cmd_bench-app-execute} - Command: `bench` `app` `execute` The `execute` command starts the main executable of the specified app. ### Usage {#cmd_bench-app-execute_usage} +* `bench` `app` `execute` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `execute` _<flag>_\* _<App ID>_ -### Help {#cmd_bench-app-execute_help} - -* `bench` `app` `execute` ( `/?` | `-?` | `-h` | `--help`) - ### Flags {#cmd_bench-app-execute_flags} #### `--detached` | `--async` | `-d` - Do not wait for the end of the process. ### Positional Arguments {#cmd_bench-app-execute_positionals} #### 1. App ID - Specifies the app to execute. Expected: An app ID is an alphanumeric string without whitespace. ## bench app info {#cmd_bench-app-info} - Command: `bench` `app` `info` The `info` command displayes a detailed description for an app in human readable form. ### Usage {#cmd_bench-app-info_usage} +* `bench` `app` `info` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `info` _<option>_\* _<App ID>_ -### Help {#cmd_bench-app-info_help} - -* `bench` `app` `info` ( `/?` | `-?` | `-h` | `--help`) - ### Options {#cmd_bench-app-info_options} #### `--format` | `-f` _<value>_ - Specify the output format. Expected: `Plain` | `Markdown` @@ -340,13 +292,11 @@ Default: `Plain` ### Positional Arguments {#cmd_bench-app-info_positionals} #### 1. App ID - Specifies the app to display the description for. Expected: An app ID is an alphanumeric string without whitespace. ## bench app install {#cmd_bench-app-install} - Command: `bench` `app` `install` The `install` command installes the specified app, regardless of its activation state. @@ -355,22 +305,17 @@ Missing app resources are downloaded automatically. ### Usage {#cmd_bench-app-install_usage} +* `bench` `app` `install` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `install` _<App ID>_ -### Help {#cmd_bench-app-install_help} - -* `bench` `app` `install` ( `/?` | `-?` | `-h` | `--help`) - ### Positional Arguments {#cmd_bench-app-install_positionals} #### 1. App ID - Specifies the app to install. Expected: An app ID is an alphanumeric string without whitespace. ## bench app list-properties {#cmd_bench-app-list-properties} - Command: `bench` `app` `list-properties` The `list-properties` command displayes the properties of an app. @@ -379,22 +324,17 @@ This command supports different output formats. And you can choose between the e ### Usage {#cmd_bench-app-list-properties_usage} +* `bench` `app` `list-properties` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `list-properties` ( _<flag>_ | _<option>_)\* _<App ID>_ -### Help {#cmd_bench-app-list-properties_help} - -* `bench` `app` `list-properties` ( `/?` | `-?` | `-h` | `--help`) - ### Flags {#cmd_bench-app-list-properties_flags} #### `--raw` | `-r` - Shows the raw properties without expansion and default values. ### Options {#cmd_bench-app-list-properties_options} #### `--format` | `-f` _<value>_ - Specify the output format. Expected: `Plain` | `Markdown` @@ -403,85 +343,67 @@ Default: `Plain` ### Positional Arguments {#cmd_bench-app-list-properties_positionals} #### 1. App ID - Specifies the app of which the properties are to be listed. Expected: The apps ID, an alphanumeric string without whitespace. ## bench app property {#cmd_bench-app-property} - Command: `bench` `app` `property` The `property` command reads the value of an app property. ### Usage {#cmd_bench-app-property_usage} +* `bench` `app` `property` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `property` _<App ID>_ _<Property Name>_ -### Help {#cmd_bench-app-property_help} - -* `bench` `app` `property` ( `/?` | `-?` | `-h` | `--help`) - ### Positional Arguments {#cmd_bench-app-property_positionals} #### 1. App ID - Specifies the app to get the property from. Expected: The apps ID, an alphanumeric string without whitespace. #### 2. Property Name - Specifies the property to read. Expected: The property name, an alphanumeric string without whitespace. ## bench app reinstall {#cmd_bench-app-reinstall} - Command: `bench` `app` `reinstall` The `reinstall` command reinstalles the specified app. ### Usage {#cmd_bench-app-reinstall_usage} +* `bench` `app` `reinstall` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `reinstall` _<App ID>_ -### Help {#cmd_bench-app-reinstall_help} - -* `bench` `app` `reinstall` ( `/?` | `-?` | `-h` | `--help`) - ### Positional Arguments {#cmd_bench-app-reinstall_positionals} #### 1. App ID - Specifies the app to reinstall. Expected: An app ID is an alphanumeric string without whitespace. ## bench app uninstall {#cmd_bench-app-uninstall} - Command: `bench` `app` `uninstall` The `uninstall` command uninstalles the specified app, regardless of its activation state. ### Usage {#cmd_bench-app-uninstall_usage} +* `bench` `app` `uninstall` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `uninstall` _<App ID>_ -### Help {#cmd_bench-app-uninstall_help} - -* `bench` `app` `uninstall` ( `/?` | `-?` | `-h` | `--help`) - ### Positional Arguments {#cmd_bench-app-uninstall_positionals} #### 1. App ID - Specifies the app to install. Expected: An app ID is an alphanumeric string without whitespace. ## bench app upgrade {#cmd_bench-app-upgrade} - Command: `bench` `app` `upgrade` The `upgrade` command upgrades the specified app to the most current release. @@ -490,75 +412,59 @@ Updates app resources are downloaded automatically. ### Usage {#cmd_bench-app-upgrade_usage} +* `bench` `app` `upgrade` `-?` * `bench` ( _<flag>_ | _<option>_)\* `app` `upgrade` _<App ID>_ -### Help {#cmd_bench-app-upgrade_help} - -* `bench` `app` `upgrade` ( `/?` | `-?` | `-h` | `--help`) - ### Positional Arguments {#cmd_bench-app-upgrade_positionals} #### 1. App ID - Specifies the app to upgrade. Expected: An app ID is an alphanumeric string without whitespace. ## bench dashboard {#cmd_bench-dashboard} - Command: `bench` `dashboard` The `dashboard` command starts the graphical user interface _Bench Dashboard_. ### Usage {#cmd_bench-dashboard_usage} +* `bench` `dashboard` `-?` * `bench` ( _<flag>_ | _<option>_)\* `dashboard` -### Help {#cmd_bench-dashboard_help} - -* `bench` `dashboard` ( `/?` | `-?` | `-h` | `--help`) - ## bench help {#cmd_bench-help} - Command: `bench` `help` -Displays the full help for all commands.### Usage {#cmd_bench-help_usage} - -* `bench` ( _<flag>_ | _<option>_)\* `help` ( _<flag>_ | _<option>_)\* +The `help` command displays the full help for all commands. -### Help {#cmd_bench-help_help} +### Usage {#cmd_bench-help_usage} -* `bench` `help` ( `/?` | `-?` | `-h` | `--help`) +* `bench` `help` `-?` +* `bench` ( _<flag>_ | _<option>_)\* `help` ( _<flag>_ | _<option>_)\* ### Flags {#cmd_bench-help_flags} #### `--append` | `-a` - Append to an existing file, in case a target file is specified. #### `--no-index` | `-i` - Suppress the index of the commands. #### `--no-title` | `-t` - Suppress the output of the tool name as the document title. #### `--no-version` | `-v` - Suppress the output of the tool version number. ### Options {#cmd_bench-help_options} #### `--target-file` | `--out` | `-o` _<value>_ - Specifies a target file to write the help content to. Expected: A path to a writable file. The target file will be created or overridden. Default: None ## bench list {#cmd_bench-list} - Command: `bench` `list` The `list` command lists different kinds of objects from the Bench environment. @@ -567,24 +473,18 @@ Choose a sub-command to specify the kind of object, you want to list. ### Usage {#cmd_bench-list_usage} +* `bench` `list` `-?` * `bench` ( _<flag>_ | _<option>_)\* `list` ( _<flag>_ | _<option>_)\* * `bench` ( _<flag>_ | _<option>_)\* `list` ( _<flag>_ | _<option>_)\* _<command>_ ... -### Help {#cmd_bench-list_help} - -* `bench` `list` ( `/?` | `-?` | `-h` | `--help`) -* `bench` `list` _<command>_ ( `/?` | `-?` | `-h` | `--help`) - ### Flags {#cmd_bench-list_flags} #### `--table` | `-t` - -Prints properties of the listed objects as a table. Otherwise only the ID is printed. +Prints properties of the listed objects as a table. Otherwise only a short form is printed. ### Options {#cmd_bench-list_options} #### `--format` | `-f` _<value>_ - Specifies the output format of the listed data. Expected: `Plain` | `Markdown` @@ -592,12 +492,26 @@ Default: `Plain` ### Commands {#cmd_bench-list_commands} -#### `apps`, `a` +#### [ `applibs`, `l`](#cmd_bench-list-applibs) +List app libraries with ID and URL. +#### [ `apps`, `a`](#cmd_bench-list-apps) List apps from the app library. -## bench list apps {#cmd_bench-list-apps} +#### [ `files`, `f`](#cmd_bench-list-files) +List configuration and app library index files. +## bench list applibs {#cmd_bench-list-applibs} +Command: `bench` `list` `applibs` + +The `applibs` command lists all loaded app libraries. + +### Usage {#cmd_bench-list-applibs_usage} + +* `bench` `list` `applibs` `-?` +* `bench` ( _<flag>_ | _<option>_)\* `list` ( _<flag>_ | _<option>_)\* `applibs` + +## bench list apps {#cmd_bench-list-apps} Command: `bench` `list` `apps` The `apps` command lists apps from the app library. @@ -606,229 +520,232 @@ You can specify the base set of apps and filter the apps to list. ### Usage {#cmd_bench-list-apps_usage} +* `bench` `list` `apps` `-?` * `bench` ( _<flag>_ | _<option>_)\* `list` ( _<flag>_ | _<option>_)\* `apps` _<option>_\* -### Help {#cmd_bench-list-apps_help} - -* `bench` `list` `apps` ( `/?` | `-?` | `-h` | `--help`) - ### Options {#cmd_bench-list-apps_options} #### `--filter` | `-f` _<value>_ - Specifies a filter to reduce the number of listed apps. -Expected: A comma separated list of criteria. E.g. `ID=JDK\*,!IsInstalled,IsCached`. +Expected: A comma separated list of criteria. E.g. `ID=JDK*,!IsInstalled,IsCached`. Default: no filter #### `--properties` | `-p` _<value>_ - Specifies the properties to display in the listed output. This option only has an effect, if the flag `list` `--table` is set. Expected: A comma separated list of property names. #### `--set` | `-s` _<value>_ - Specifies the set of apps to list. Expected: `All` | `Active` | `NotActive` | `Activated` | `Deactivated` | `Installed` | `NotInstalled` | `Cached` | `NotCached` | `DefaultApps` | `MetaApps` | `ManagedPackages` Default: `All` #### `--sort-by` | `-o` _<value>_ - Specifies a property to sort the apps by. Expected: The name of an app property. Default: ID -## bench manage {#cmd_bench-manage} +## bench list files {#cmd_bench-list-files} +Command: `bench` `list` `files` + +The `files` command lists the paths of all loaded configuration files. + +### Usage {#cmd_bench-list-files_usage} + +* `bench` `list` `files` `-?` +* `bench` ( _<flag>_ | _<option>_)\* `list` ( _<flag>_ | _<option>_)\* `files` _<option>_\* +### Options {#cmd_bench-list-files_options} + +#### `--type` | `-t` _<value>_ +Specify the type of files to show. + +Expected: `BenchConfig` | `UserConfig` | `SiteConfig` | `Config` | `BenchAppLib` | `UserAppLib` | `AppLib` | `Activation` | `Deactivation` | `AppSelection` | `All` +Default: `All` + +## bench manage {#cmd_bench-manage} Command: `bench` `manage` The `manage` command manages the Bench environment via a number of sub-commands. ### Usage {#cmd_bench-manage_usage} +* `bench` `manage` `-?` * `bench` ( _<flag>_ | _<option>_)\* `manage` * `bench` ( _<flag>_ | _<option>_)\* `manage` _<command>_ ... -### Help {#cmd_bench-manage_help} - -* `bench` `manage` ( `/?` | `-?` | `-h` | `--help`) -* `bench` `manage` _<command>_ ( `/?` | `-?` | `-h` | `--help`) - ### Commands {#cmd_bench-manage_commands} -#### `config`, `cfg`, `c` - +#### [ `config`, `cfg`, `c`](#cmd_bench-manage-config) Read or write values from the user configuration. Syntax: `bench` `manage` `config` _<sub-command>_ -#### `initialize`, `init`, `i` - +#### [ `initialize`, `init`, `i`](#cmd_bench-manage-initialize) Initialize the Bench configuration and start the setup process. -#### `reinstall`, `r` +#### [ `load-app-libs`, `l`](#cmd_bench-manage-load-app-libs) +Load the latest app libraries. -Remove all installed apps, then install all active apps. +Syntax: `bench` `manage` `load-app-libs` -#### `renew`, `n` +#### [ `reinstall`, `r`](#cmd_bench-manage-reinstall) +Remove all installed apps, then install all active apps. +#### [ `renew`, `n`](#cmd_bench-manage-renew) Redownload all app resources, remove all installed apps, then install all active apps. -#### `setup`, `s` - +#### [ `setup`, `s`](#cmd_bench-manage-setup) Run the auto-setup for the active Bench apps. -#### `update-env`, `e` +#### [ `update`, `u`](#cmd_bench-manage-update) +Update the app libraries and upgrades all apps. +#### [ `update-env`, `e`](#cmd_bench-manage-update-env) Update the paths in the Bench environment. -#### `upgrade`, `u` - +#### [ `upgrade`, `g`](#cmd_bench-manage-upgrade) Download and extract the latest Bench release, then run the auto-setup. ## bench manage config {#cmd_bench-manage-config} - Command: `bench` `manage` `config` The `config` command gives access to the Bench user configuration. ### Usage {#cmd_bench-manage-config_usage} +* `bench` `manage` `config` `-?` * `bench` ( _<flag>_ | _<option>_)\* `manage` `config` * `bench` ( _<flag>_ | _<option>_)\* `manage` `config` _<command>_ ... -### Help {#cmd_bench-manage-config_help} +### Commands {#cmd_bench-manage-config_commands} -* `bench` `manage` `config` ( `/?` | `-?` | `-h` | `--help`) -* `bench` `manage` `config` _<command>_ ( `/?` | `-?` | `-h` | `--help`) +#### [ `get`, `read`, `g`](#cmd_bench-manage-config-get) +Reads a configuration value. -### Commands {#cmd_bench-manage-config_commands} +Syntax: `bench` `manage` `config` `get` _<property-name>_ -#### `get`, `g` +## bench manage config get {#cmd_bench-manage-config-get} +Command: `bench` `manage` `config` `get` -Reads a configuration value. +The `get` command reads a configuration value. -Syntax: _<property name>_ +### Usage {#cmd_bench-manage-config-get_usage} -## bench manage downloads {#cmd_bench-manage-downloads} +* `bench` `manage` `config` `get` `-?` +* `bench` ( _<flag>_ | _<option>_)\* `manage` `config` `get` _<property-name>_ +### Positional Arguments {#cmd_bench-manage-config-get_positionals} + +#### 1. property-name +The name of the configuration property to read. + +## bench manage downloads {#cmd_bench-manage-downloads} Command: `bench` `manage` `downloads` The `downloads` command manages the cached app resources. ### Usage {#cmd_bench-manage-downloads_usage} +* `bench` `manage` `downloads` `-?` * `bench` ( _<flag>_ | _<option>_)\* `manage` `downloads` * `bench` ( _<flag>_ | _<option>_)\* `manage` `downloads` _<command>_ ... -### Help {#cmd_bench-manage-downloads_help} - -* `bench` `manage` `downloads` ( `/?` | `-?` | `-h` | `--help`) -* `bench` `manage` `downloads` _<command>_ ( `/?` | `-?` | `-h` | `--help`) - ### Commands {#cmd_bench-manage-downloads_commands} -#### `clean`, `cl`, `c` - +#### [ `clean`, `cl`, `c`](#cmd_bench-manage-downloads-clean) Deletes obsolete app resources. -#### `download`, `dl`, `d` - +#### [ `download`, `dl`, `d`](#cmd_bench-manage-downloads-download) Downloads the app resources for all active apps. -#### `purge`, `x` - +#### [ `purge`, `x`](#cmd_bench-manage-downloads-purge) Deletes all cached app resources. ## bench manage initialize {#cmd_bench-manage-initialize} - Command: `bench` `manage` `initialize` The `initialize` command initializes the Bench configuration and starts the setup process. ### Usage {#cmd_bench-manage-initialize_usage} +* `bench` `manage` `initialize` `-?` * `bench` ( _<flag>_ | _<option>_)\* `manage` `initialize` -### Help {#cmd_bench-manage-initialize_help} +## bench manage load-app-libs {#cmd_bench-manage-load-app-libs} +Command: `bench` `manage` `load-app-libs` -* `bench` `manage` `initialize` ( `/?` | `-?` | `-h` | `--help`) +The `load-app-libs` command loads the latest app libraries. -## bench manage reinstall {#cmd_bench-manage-reinstall} +### Usage {#cmd_bench-manage-load-app-libs_usage} +* `bench` `manage` `load-app-libs` `-?` +* `bench` ( _<flag>_ | _<option>_)\* `manage` `load-app-libs` + +## bench manage reinstall {#cmd_bench-manage-reinstall} Command: `bench` `manage` `reinstall` The `reinstall` command removes all installed apps, then installs all active apps. ### Usage {#cmd_bench-manage-reinstall_usage} +* `bench` `manage` `reinstall` `-?` * `bench` ( _<flag>_ | _<option>_)\* `manage` `reinstall` -### Help {#cmd_bench-manage-reinstall_help} - -* `bench` `manage` `reinstall` ( `/?` | `-?` | `-h` | `--help`) - ## bench manage renew {#cmd_bench-manage-renew} - Command: `bench` `manage` `renew` The `renew` command redownloads all app resources, removes all installed apps, then installs all active apps. ### Usage {#cmd_bench-manage-renew_usage} +* `bench` `manage` `renew` `-?` * `bench` ( _<flag>_ | _<option>_)\* `manage` `renew` -### Help {#cmd_bench-manage-renew_help} - -* `bench` `manage` `renew` ( `/?` | `-?` | `-h` | `--help`) - ## bench manage setup {#cmd_bench-manage-setup} - Command: `bench` `manage` `setup` The `setup` command runs the auto-setup for the active Bench apps. ### Usage {#cmd_bench-manage-setup_usage} +* `bench` `manage` `setup` `-?` * `bench` ( _<flag>_ | _<option>_)\* `manage` `setup` -### Help {#cmd_bench-manage-setup_help} +## bench manage update {#cmd_bench-manage-update} +Command: `bench` `manage` `update` -* `bench` `manage` `setup` ( `/?` | `-?` | `-h` | `--help`) +The `update` command updates the app libraries and upgrades all apps. -## bench manage update-env {#cmd_bench-manage-update-env} +### Usage {#cmd_bench-manage-update_usage} + +* `bench` `manage` `update` `-?` +* `bench` ( _<flag>_ | _<option>_)\* `manage` `update` +## bench manage update-env {#cmd_bench-manage-update-env} Command: `bench` `manage` `update-env` The `update-env` command updates the paths in the Bench environment. ### Usage {#cmd_bench-manage-update-env_usage} +* `bench` `manage` `update-env` `-?` * `bench` ( _<flag>_ | _<option>_)\* `manage` `update-env` -### Help {#cmd_bench-manage-update-env_help} - -* `bench` `manage` `update-env` ( `/?` | `-?` | `-h` | `--help`) - ## bench manage upgrade {#cmd_bench-manage-upgrade} - Command: `bench` `manage` `upgrade` The `upgrade` command checks if a new version of Bench is available and installs it. ### Usage {#cmd_bench-manage-upgrade_usage} +* `bench` `manage` `upgrade` `-?` * `bench` ( _<flag>_ | _<option>_)\* `manage` `upgrade` -### Help {#cmd_bench-manage-upgrade_help} - -* `bench` `manage` `upgrade` ( `/?` | `-?` | `-h` | `--help`) - ## bench project {#cmd_bench-project} - Command: `bench` `project` The `project` command allows you to perform certain tasks on projects in the Bench environment. @@ -837,9 +754,6 @@ The `project` command allows you to perform certain tasks on projects in the Be ### Usage {#cmd_bench-project_usage} +* `bench` `project` `-?` * `bench` ( _<flag>_ | _<option>_)\* `project` -### Help {#cmd_bench-project_help} - -* `bench` `project` ( `/?` | `-?` | `-h` | `--help`) - From b3deaebe19047e7dabea6fa792ff28ecadff6d1f Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:31:32 +0100 Subject: [PATCH 173/230] added more detailed description to config property 'AppLibs' --- docs/content/ref/config.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index 1f160766..52843e68 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -46,7 +46,7 @@ configuration, but _can_ be overridden in the user or site configuration. | [CustomConfigTemplateFile](#CustomConfigTemplateFile) | path | `res\config.template.md` | | [SiteConfigFileName](#SiteConfigFileName) | string | `bench-site.md` | | [SiteConfigTemplateFile](#SiteConfigTemplateFile) | path | `res\bench-site.template.md` | -| [AppLibs](#AppLibs) | dictionary | ... | +| [AppLibs](#AppLibs) | dictionary | `core: github:mastersign/bench-apps-core` | | [AppLibsDir](#AppLibsDir) | path | `$LibDir$\_applibs` | | [AppLibsDownloadDir](#AppLibsDownloadDir) | path | `$DownloadDir$\_applibs` | | [AppLibIndexFileName](#AppLibIndexFileName) | string | `apps.md` | @@ -197,12 +197,10 @@ The specified file must be a Markdown file and follow the [Markdown list syntax] * Description: A table with URLs of app libraries to load in the Bench environment. * Data Type: dictionary -* Default: ... - + `core`: `github:mastersign/bench-apps-core` - + `default`: `github:mastersign/bench-apps-default` +* Default: `core: github:mastersign/bench-apps-core` * Type: User -The table consists of key/value pairs. +The table consists of [key/value pairs](/ref/markup-syntax/#lists-and-dictionaries). Where the key is a unique ID for the app library inside the Bench environment, and the value is an URL to a ZIP file with the app library. The order of the table entries dictates the order in which the app libraries are loaded. @@ -214,6 +212,18 @@ If the app library is hosted as a GitHub repository, a short form for the URL can be used: `github:/`; which is automatically expanded to an URL with the `https` protocol. +The default value of the base configuration contains only apps, which +are required or directly known by Bench. This value should be overridden +in the user or site configuration, to include more app libraries. + +For starters the following list of app libraries is advised: + +```Markdown +* `AppLibs`: + + `core`: `github:mastersign/bench-apps-core` + + `default`: `github:mastersign/bench-apps-default` +``` + ### AppLibsDir {#AppLibsDir} * Description: The path of the directory, where to load the app libraries. From 2d5b3ce17065be64e4dbd6765e25cbde71a82a28 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:32:08 +0100 Subject: [PATCH 174/230] updated description of Bench setup process --- docs/content/guide/setup.md | 10 +++++++--- docs/src-content/guide/setup.md | 5 +++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/content/guide/setup.md b/docs/content/guide/setup.md index 5babad40..1ba9b1a5 100644 --- a/docs/content/guide/setup.md +++ b/docs/content/guide/setup.md @@ -9,6 +9,7 @@ weight = 2 [site configuration]: /ref/file-structure/#bench-site [custom configuration]: /ref/file-structure/#config-dir [Bench CLI]: /ref/bench-cli +[app libraries]: /ref/config/#AppLibs [required apps]: /app_categories/required [Bench environment file]: /ref/file-structure/#env [initialization mode]: /ref/bench-cli/#cmd_bench-manage-initialize @@ -17,7 +18,7 @@ weight = 2 Bench is installed and upgraded with a [bootstrap file][], which downloads the archive `Bench.zip` with the Bench system files, extracts its content in the Bench root directory, and starts the [Bench CLI][] with the [initialization mode][] and the [setup mode][]. -The custom configuration is left untouched if it is already exists; +The custom configuration is left untouched if it already exists; otherwise it can be initialized from a template or from a Git repository. @@ -26,15 +27,18 @@ The setup of a Bench installation is performed in the following steps: * Creating a directory as Bench root * Downloading the (latest) [bootstrap file][] in the Bench root * Running the [bootstrap file][] ... - + Downloading the (latest) Bench archive (`Bench.zip`) from GitHub - + Deleting the following folders in the Bench root: `actions`, `auto`, `res`, `tmp`, + + Downloading the (latest) Bench archive (`Bench.zip`) + + Deleting the following folders in the Bench root: + `actions`, `auto`, `res`, `tmp`, `cache\_applibs`, `lib\_applibs`, and the folders of the [required apps][] in `lib` + Extracting the Bench archive * Running the [Bench CLI][] in [initialization mode][] ... + Initializing the [site configuration][] + + Downloading missing [app libraries][] + Downloading missing app resources for [required apps][] + Installing the [required apps][] + Initializing the [custom configuration][] from template or existing Git repository + + Downloading missing [app libraries][] * Running the [Bench CLI][] in [setup mode][] ... + Downloading missing app resources for activated apps + Installing activated apps diff --git a/docs/src-content/guide/setup.md b/docs/src-content/guide/setup.md index 44167135..1ba9b1a5 100644 --- a/docs/src-content/guide/setup.md +++ b/docs/src-content/guide/setup.md @@ -27,8 +27,9 @@ The setup of a Bench installation is performed in the following steps: * Creating a directory as Bench root * Downloading the (latest) [bootstrap file][] in the Bench root * Running the [bootstrap file][] ... - + Downloading the (latest) Bench archive (`Bench.zip`) from GitHub - + Deleting the following folders in the Bench root: `actions`, `auto`, `res`, `tmp`, + + Downloading the (latest) Bench archive (`Bench.zip`) + + Deleting the following folders in the Bench root: + `actions`, `auto`, `res`, `tmp`, `cache\_applibs`, `lib\_applibs`, and the folders of the [required apps][] in `lib` + Extracting the Bench archive * Running the [Bench CLI][] in [initialization mode][] ... From 769ccd2b60d268f53aa6a7a0dc83f8aebeeb1e72 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 11:58:22 +0100 Subject: [PATCH 175/230] added menu item for only updating the app libraries without upgrading the apps --- BenchManager/BenchDashboard/Core.cs | 38 ++++++++----------- .../BenchDashboard/SetupForm.Designer.cs | 15 +++++++- BenchManager/BenchDashboard/SetupForm.cs | 8 +++- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/BenchManager/BenchDashboard/Core.cs b/BenchManager/BenchDashboard/Core.cs index d4da4720..98cab285 100644 --- a/BenchManager/BenchDashboard/Core.cs +++ b/BenchManager/BenchDashboard/Core.cs @@ -612,44 +612,37 @@ public async Task UpdateEnvironmentAsync(Action notify) return result; } - public async Task UpdateAppsAsync(Action notify) + public async Task UpdateAppLibrariesAsync(Action notify) { BeginAction(); BenchTasks.DeleteAppLibraries(Config); var result = await RunTaskAsync(BenchTasks.DoLoadAppLibraries, notify, cancelation); + EndAction(result.Success); if (result.Canceled) { UI.ShowWarning("Loading App Libraries", "Canceled"); EndAction(result.Success); return result; } - else if (!result.Success) + else if (result.Success) { - UI.ShowWarning("Loading App Libraries", - "Loading the app libraries failed."); - EndAction(false); - return result; + Reload(); } - - result = await RunTaskAsync(BenchTasks.DoUpgradeApps, notify, cancelation); - EndAction(result.Success); - if (result.Canceled) - { - UI.ShowWarning("Upgrading Apps", "Canceled"); - } - else if (!result.Success) + else { - UI.ShowWarning("Upgrading Apps", - BuildCombinedErrorMessage( - "Upgrading the following apps failed:", - "Upgrading apps failed.", - result.Errors, 10)); - EndAction(false); - return result; + UI.ShowWarning("Loading App Libraries", + "Loading the app libraries failed."); } return result; } + public async Task UpdateAppsAsync(Action notify) + { + var result = await UpdateAppLibrariesAsync(notify); + if (!result.Success) return result; + return await UpgradeAppsAsync(notify); + } + private class AsyncVersionNumberResult : IAsyncResult { public object AsyncState => null; @@ -682,7 +675,8 @@ public Task GetLatestVersionNumber() { var asyncResult = new AsyncVersionNumberResult(); BenchTasks.GetLatestVersionAsync(Config, asyncResult.NotifyResult); - return Task.Factory.FromAsync(asyncResult, r => { + return Task.Factory.FromAsync(asyncResult, r => + { var result = (AsyncVersionNumberResult)r; return result.Success ? result.VersionNumber : null; }); diff --git a/BenchManager/BenchDashboard/SetupForm.Designer.cs b/BenchManager/BenchDashboard/SetupForm.Designer.cs index 0d6283bb..7fad0f20 100644 --- a/BenchManager/BenchDashboard/SetupForm.Designer.cs +++ b/BenchManager/BenchDashboard/SetupForm.Designer.cs @@ -101,6 +101,7 @@ private void InitializeComponent() this.tsmiShowCustomAppIndex = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiAlwaysShowDownloads = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiRefreshView = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiUpdateAppLibs = new System.Windows.Forms.ToolStripMenuItem(); toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); @@ -573,6 +574,7 @@ private void InitializeComponent() this.tsmiAuto, this.tsmiUpdateEnvironment, toolStripSeparator4, + this.tsmiUpdateAppLibs, this.tsmiUpdateBench, this.tsmiUpgradeBench, toolStripSeparator2, @@ -611,7 +613,7 @@ private void InitializeComponent() this.tsmiUpdateBench.Name = "tsmiUpdateBench"; this.tsmiUpdateBench.Size = new System.Drawing.Size(237, 22); this.tsmiUpdateBench.Text = "&Update App Libraries and Apps"; - this.tsmiUpdateBench.Click += new System.EventHandler(this.UpdateAppsHandler); + this.tsmiUpdateBench.Click += new System.EventHandler(this.UpdateBenchHandler); // // tsmiUpgradeBench // @@ -675,7 +677,7 @@ private void InitializeComponent() this.tsmiDownloadAllAppResources.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.downloadall_16; this.tsmiDownloadAllAppResources.Name = "tsmiDownloadAllAppResources"; this.tsmiDownloadAllAppResources.Size = new System.Drawing.Size(237, 22); - this.tsmiDownloadAllAppResources.Text = "Down&load All Resources"; + this.tsmiDownloadAllAppResources.Text = "D&ownload All Resources"; this.tsmiDownloadAllAppResources.Click += new System.EventHandler(this.DownloadAllHandler); // // tsmiDeleteAllResources @@ -778,6 +780,14 @@ private void InitializeComponent() this.tsmiRefreshView.Text = "&Refresh"; this.tsmiRefreshView.Click += new System.EventHandler(this.RefreshViewHandler); // + // tsmiUpdateAppLibs + // + this.tsmiUpdateAppLibs.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.update_apps_16; + this.tsmiUpdateAppLibs.Name = "tsmiUpdateAppLibs"; + this.tsmiUpdateAppLibs.Size = new System.Drawing.Size(237, 22); + this.tsmiUpdateAppLibs.Text = "Update App &Libraries"; + this.tsmiUpdateAppLibs.Click += new System.EventHandler(this.UpdateAppLibsHandler); + // // SetupForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -876,5 +886,6 @@ private void InitializeComponent() private System.Windows.Forms.DataGridViewTextBoxColumn colTyp; private System.Windows.Forms.DataGridViewTextBoxColumn colComment; private System.Windows.Forms.ToolStripMenuItem tsmiUpdateBench; + private System.Windows.Forms.ToolStripMenuItem tsmiUpdateAppLibs; } } \ No newline at end of file diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index fd243ddf..473349d8 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -546,7 +546,13 @@ private async void UpdateEnvironmentHandler(object sender, EventArgs e) await core.UpdateEnvironmentAsync(TaskInfoHandler); } - private async void UpdateAppsHandler(object sender, EventArgs e) + private async void UpdateAppLibsHandler(object sender, EventArgs e) + { + AnnounceTask("Update App Libraries"); + await core.UpdateAppLibrariesAsync(TaskInfoHandler); + } + + private async void UpdateBenchHandler(object sender, EventArgs e) { AnnounceTask("Update App Libraries and Apps"); await core.UpdateAppsAsync(TaskInfoHandler); From 046a429f6bb5399a9e064297d656cfa8022ec1f1 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 12:06:36 +0100 Subject: [PATCH 176/230] added tool tips and a close item to the menu of the setup dialog --- .../BenchDashboard/SetupForm.Designer.cs | 93 ++++++++++++------- BenchManager/BenchDashboard/SetupForm.cs | 5 + BenchManager/BenchDashboard/SetupForm.resx | 24 ++--- 3 files changed, 79 insertions(+), 43 deletions(-) diff --git a/BenchManager/BenchDashboard/SetupForm.Designer.cs b/BenchManager/BenchDashboard/SetupForm.Designer.cs index 7fad0f20..270de347 100644 --- a/BenchManager/BenchDashboard/SetupForm.Designer.cs +++ b/BenchManager/BenchDashboard/SetupForm.Designer.cs @@ -29,12 +29,12 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); System.Windows.Forms.ToolStripSeparator toolStripSeparator4; System.Windows.Forms.ToolStripSeparator toolStripSeparator2; System.Windows.Forms.ToolStripSeparator toolStripSeparator3; System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetupForm)); this.tsSeparatorDownloads = new System.Windows.Forms.ToolStripSeparator(); this.splitterBottom = new System.Windows.Forms.Splitter(); @@ -80,6 +80,7 @@ private void InitializeComponent() this.tsmSetup = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiAuto = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiUpdateEnvironment = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiUpdateAppLibs = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiUpdateBench = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiUpgradeBench = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiInstallAll = new System.Windows.Forms.ToolStripMenuItem(); @@ -101,7 +102,8 @@ private void InitializeComponent() this.tsmiShowCustomAppIndex = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiAlwaysShowDownloads = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiRefreshView = new System.Windows.Forms.ToolStripMenuItem(); - this.tsmiUpdateAppLibs = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.tsmiClose = new System.Windows.Forms.ToolStripMenuItem(); toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); @@ -113,26 +115,6 @@ private void InitializeComponent() this.menuStrip.SuspendLayout(); this.SuspendLayout(); // - // toolStripSeparator4 - // - toolStripSeparator4.Name = "toolStripSeparator4"; - toolStripSeparator4.Size = new System.Drawing.Size(234, 6); - // - // toolStripSeparator2 - // - toolStripSeparator2.Name = "toolStripSeparator2"; - toolStripSeparator2.Size = new System.Drawing.Size(234, 6); - // - // toolStripSeparator3 - // - toolStripSeparator3.Name = "toolStripSeparator3"; - toolStripSeparator3.Size = new System.Drawing.Size(234, 6); - // - // toolStripSeparator1 - // - toolStripSeparator1.Name = "toolStripSeparator1"; - toolStripSeparator1.Size = new System.Drawing.Size(202, 6); - // // tsSeparatorDownloads // this.tsSeparatorDownloads.Name = "tsSeparatorDownloads"; @@ -586,7 +568,9 @@ private void InitializeComponent() this.tsmiCleanUpObsoleteResources, this.tsmiDownloadAllResources, this.tsmiDownloadAllAppResources, - this.tsmiDeleteAllResources}); + this.tsmiDeleteAllResources, + this.toolStripSeparator5, + this.tsmiClose}); this.tsmSetup.Name = "tsmSetup"; this.tsmSetup.Size = new System.Drawing.Size(49, 20); this.tsmSetup.Text = "&Setup"; @@ -597,6 +581,8 @@ private void InitializeComponent() this.tsmiAuto.Name = "tsmiAuto"; this.tsmiAuto.Size = new System.Drawing.Size(237, 22); this.tsmiAuto.Text = "&Automatic Setup"; + this.tsmiAuto.ToolTipText = "Uninstalls incactive apps, downloades missing resources, installs active but not " + + "installed apps."; this.tsmiAuto.Click += new System.EventHandler(this.AutoHandler); // // tsmiUpdateEnvironment @@ -605,14 +591,30 @@ private void InitializeComponent() this.tsmiUpdateEnvironment.Name = "tsmiUpdateEnvironment"; this.tsmiUpdateEnvironment.Size = new System.Drawing.Size(237, 22); this.tsmiUpdateEnvironment.Text = "Update &Environment"; + this.tsmiUpdateEnvironment.ToolTipText = "Updates the Bench environment file(s) and launchers."; this.tsmiUpdateEnvironment.Click += new System.EventHandler(this.UpdateEnvironmentHandler); // + // toolStripSeparator4 + // + toolStripSeparator4.Name = "toolStripSeparator4"; + toolStripSeparator4.Size = new System.Drawing.Size(234, 6); + // + // tsmiUpdateAppLibs + // + this.tsmiUpdateAppLibs.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.update_apps_16; + this.tsmiUpdateAppLibs.Name = "tsmiUpdateAppLibs"; + this.tsmiUpdateAppLibs.Size = new System.Drawing.Size(237, 22); + this.tsmiUpdateAppLibs.Text = "Update App &Libraries"; + this.tsmiUpdateAppLibs.ToolTipText = "Clears the app library cache and re-loads all app libraries."; + this.tsmiUpdateAppLibs.Click += new System.EventHandler(this.UpdateAppLibsHandler); + // // tsmiUpdateBench // this.tsmiUpdateBench.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.update_apps_16; this.tsmiUpdateBench.Name = "tsmiUpdateBench"; this.tsmiUpdateBench.Size = new System.Drawing.Size(237, 22); this.tsmiUpdateBench.Text = "&Update App Libraries and Apps"; + this.tsmiUpdateBench.ToolTipText = "Updates the libraries and upgrades all upgradable apps."; this.tsmiUpdateBench.Click += new System.EventHandler(this.UpdateBenchHandler); // // tsmiUpgradeBench @@ -621,15 +623,21 @@ private void InitializeComponent() this.tsmiUpgradeBench.Name = "tsmiUpgradeBench"; this.tsmiUpgradeBench.Size = new System.Drawing.Size(237, 22); this.tsmiUpgradeBench.Text = "Upgrade &Bench"; - this.tsmiUpgradeBench.ToolTipText = "Update the Bench system."; + this.tsmiUpgradeBench.ToolTipText = "Upgrades the Bench system."; this.tsmiUpgradeBench.Click += new System.EventHandler(this.UpgradeBenchSystemHandler); // + // toolStripSeparator2 + // + toolStripSeparator2.Name = "toolStripSeparator2"; + toolStripSeparator2.Size = new System.Drawing.Size(234, 6); + // // tsmiInstallAll // this.tsmiInstallAll.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.install_16; this.tsmiInstallAll.Name = "tsmiInstallAll"; this.tsmiInstallAll.Size = new System.Drawing.Size(237, 22); this.tsmiInstallAll.Text = "&Install Apps"; + this.tsmiInstallAll.ToolTipText = "Installes all active but not installed apps."; this.tsmiInstallAll.Click += new System.EventHandler(this.InstallAllHandler); // // tsmiReinstallAll @@ -638,6 +646,7 @@ private void InitializeComponent() this.tsmiReinstallAll.Name = "tsmiReinstallAll"; this.tsmiReinstallAll.Size = new System.Drawing.Size(237, 22); this.tsmiReinstallAll.Text = "&Reinstall Apps"; + this.tsmiReinstallAll.ToolTipText = "Uninstalles all installed apps and reinstalls all active apps."; this.tsmiReinstallAll.Click += new System.EventHandler(this.ReinstallAllHandler); // // tsmiUpgradeAll @@ -646,6 +655,7 @@ private void InitializeComponent() this.tsmiUpgradeAll.Name = "tsmiUpgradeAll"; this.tsmiUpgradeAll.Size = new System.Drawing.Size(237, 22); this.tsmiUpgradeAll.Text = "Up&grade Apps"; + this.tsmiUpgradeAll.ToolTipText = "Upgrades all upgradable apps."; this.tsmiUpgradeAll.Click += new System.EventHandler(this.UpgradeAllHandler); // // tsmiUninstallAll @@ -654,14 +664,21 @@ private void InitializeComponent() this.tsmiUninstallAll.Name = "tsmiUninstallAll"; this.tsmiUninstallAll.Size = new System.Drawing.Size(237, 22); this.tsmiUninstallAll.Text = "U&ninstall Apps"; + this.tsmiUninstallAll.ToolTipText = "Uninstalls all apps."; this.tsmiUninstallAll.Click += new System.EventHandler(this.UninstallAllHandler); // + // toolStripSeparator3 + // + toolStripSeparator3.Name = "toolStripSeparator3"; + toolStripSeparator3.Size = new System.Drawing.Size(234, 6); + // // tsmiCleanUpObsoleteResources // this.tsmiCleanUpObsoleteResources.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.cleanup_16; this.tsmiCleanUpObsoleteResources.Name = "tsmiCleanUpObsoleteResources"; this.tsmiCleanUpObsoleteResources.Size = new System.Drawing.Size(237, 22); this.tsmiCleanUpObsoleteResources.Text = "&Clean-Up Obsolete Resources"; + this.tsmiCleanUpObsoleteResources.ToolTipText = "Deletes app resources, which are no longer referenced by any app."; this.tsmiCleanUpObsoleteResources.Click += new System.EventHandler(this.CleanUpResourcesHandler); // // tsmiDownloadAllResources @@ -670,6 +687,7 @@ private void InitializeComponent() this.tsmiDownloadAllResources.Name = "tsmiDownloadAllResources"; this.tsmiDownloadAllResources.Size = new System.Drawing.Size(237, 22); this.tsmiDownloadAllResources.Text = "Do&wnload Active Resources"; + this.tsmiDownloadAllResources.ToolTipText = "Download missing app resources of all active apps."; this.tsmiDownloadAllResources.Click += new System.EventHandler(this.DownloadActiveHandler); // // tsmiDownloadAllAppResources @@ -678,6 +696,7 @@ private void InitializeComponent() this.tsmiDownloadAllAppResources.Name = "tsmiDownloadAllAppResources"; this.tsmiDownloadAllAppResources.Size = new System.Drawing.Size(237, 22); this.tsmiDownloadAllAppResources.Text = "D&ownload All Resources"; + this.tsmiDownloadAllAppResources.ToolTipText = "Downloads missing app resources of all apps."; this.tsmiDownloadAllAppResources.Click += new System.EventHandler(this.DownloadAllHandler); // // tsmiDeleteAllResources @@ -686,6 +705,7 @@ private void InitializeComponent() this.tsmiDeleteAllResources.Name = "tsmiDeleteAllResources"; this.tsmiDeleteAllResources.Size = new System.Drawing.Size(237, 22); this.tsmiDeleteAllResources.Text = "&Delete All Resources"; + this.tsmiDeleteAllResources.ToolTipText = "Clears the app resource cache."; this.tsmiDeleteAllResources.Click += new System.EventHandler(this.DeleteAllResourcesHandler); // // tsmEdit @@ -764,6 +784,11 @@ private void InitializeComponent() this.tsmiShowCustomAppIndex.Text = "&User App Library"; this.tsmiShowCustomAppIndex.Click += new System.EventHandler(this.ShowCustomAppIndexHandler); // + // toolStripSeparator1 + // + toolStripSeparator1.Name = "toolStripSeparator1"; + toolStripSeparator1.Size = new System.Drawing.Size(202, 6); + // // tsmiAlwaysShowDownloads // this.tsmiAlwaysShowDownloads.CheckOnClick = true; @@ -780,13 +805,17 @@ private void InitializeComponent() this.tsmiRefreshView.Text = "&Refresh"; this.tsmiRefreshView.Click += new System.EventHandler(this.RefreshViewHandler); // - // tsmiUpdateAppLibs + // toolStripSeparator5 // - this.tsmiUpdateAppLibs.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.update_apps_16; - this.tsmiUpdateAppLibs.Name = "tsmiUpdateAppLibs"; - this.tsmiUpdateAppLibs.Size = new System.Drawing.Size(237, 22); - this.tsmiUpdateAppLibs.Text = "Update App &Libraries"; - this.tsmiUpdateAppLibs.Click += new System.EventHandler(this.UpdateAppLibsHandler); + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(234, 6); + // + // tsmiClose + // + this.tsmiClose.Name = "tsmiClose"; + this.tsmiClose.Size = new System.Drawing.Size(237, 22); + this.tsmiClose.Text = "Clo&se"; + this.tsmiClose.Click += new System.EventHandler(this.CloseHandler); // // SetupForm // @@ -887,5 +916,7 @@ private void InitializeComponent() private System.Windows.Forms.DataGridViewTextBoxColumn colComment; private System.Windows.Forms.ToolStripMenuItem tsmiUpdateBench; private System.Windows.Forms.ToolStripMenuItem tsmiUpdateAppLibs; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripMenuItem tsmiClose; } } \ No newline at end of file diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index 473349d8..e2569254 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -817,5 +817,10 @@ private void SetupForm_FormClosing(object sender, FormClosingEventArgs e) core.BusyChanged -= CoreBusyChangedHandler; core.ActionStateChanged -= CoreActionStateChangedHandler; } + + private void CloseHandler(object sender, EventArgs e) + { + Close(); + } } } diff --git a/BenchManager/BenchDashboard/SetupForm.resx b/BenchManager/BenchDashboard/SetupForm.resx index 253d73ad..2b905ade 100644 --- a/BenchManager/BenchDashboard/SetupForm.resx +++ b/BenchManager/BenchDashboard/SetupForm.resx @@ -117,18 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - False - - - False - - - False - - - False - True @@ -174,6 +162,18 @@ 17, 17 + + False + + + False + + + False + + + False + 62 From 58280294ef2eb8478aa468589792c3fc487a3170 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 12:08:18 +0100 Subject: [PATCH 177/230] fixed custom script example --- docs/content/ref/file-structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index 5f05bed7..ac406463 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -164,7 +164,7 @@ $nestedArchive = "nested.zip" $tmpDir = Empty-Dir "$(Get-ConfigValue TempDir)\custom_extract" # get path of 7-Zip -$7z = App-Exe 7z +$7z = App-Exe "Bench.7z" # call 7-Zip to extract outer archive & $7z x "-o$tmpDir" "$archivePath" From e7d9aa936c3cf53b1f3516c8136d644a15073481 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 15:55:33 +0100 Subject: [PATCH 178/230] transformed app type overview into a link list --- docs/content/ref/app-types.md | 14 +++++++------- docs/src-content/ref/app-types.md | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/content/ref/app-types.md b/docs/content/ref/app-types.md index 40419380..704d50ce 100644 --- a/docs/content/ref/app-types.md +++ b/docs/content/ref/app-types.md @@ -9,13 +9,13 @@ weight = 7 There are currently the following types of apps: -* Typ `meta`: app groups or apps with a fully customized setup process -* Typ `default`: Windows executables from a downloaded file, archive, or setup -* Typ `node-package`: Node.js packages, installable with NPM -* Typ `python2-package`: Python packages for Python 2 from PyPI, installable with PIP -* Typ `python3-package`: Python packages for Python 3 from PyPI, installable with PIP -* Typ `ruby-package`: Ruby packages, installable with Gem -* Typ `nuget-package`: NuGet packages, installable with NuGet +* Typ [`meta`](#meta): app groups or apps with a fully customized setup process +* Typ [`default`](#default): Windows executables from a downloaded file, archive, or setup +* Typ [`node-package`](#node-package): Node.js packages, installable with NPM +* Typ [`python2-package`](#python-package): Python packages for Python 2 from PyPI, installable with PIP +* Typ [`python3-package`](#python-package): Python packages for Python 3 from PyPI, installable with PIP +* Typ [`ruby-package`](#ruby-package): Ruby packages, installable with Gem +* Typ [`nuget-package`](#nuget-package): NuGet packages, installable with NuGet ## Meta App {#meta} An app is a _Meta App_ if its [`Typ`][] is set to `meta`. diff --git a/docs/src-content/ref/app-types.md b/docs/src-content/ref/app-types.md index 40419380..704d50ce 100644 --- a/docs/src-content/ref/app-types.md +++ b/docs/src-content/ref/app-types.md @@ -9,13 +9,13 @@ weight = 7 There are currently the following types of apps: -* Typ `meta`: app groups or apps with a fully customized setup process -* Typ `default`: Windows executables from a downloaded file, archive, or setup -* Typ `node-package`: Node.js packages, installable with NPM -* Typ `python2-package`: Python packages for Python 2 from PyPI, installable with PIP -* Typ `python3-package`: Python packages for Python 3 from PyPI, installable with PIP -* Typ `ruby-package`: Ruby packages, installable with Gem -* Typ `nuget-package`: NuGet packages, installable with NuGet +* Typ [`meta`](#meta): app groups or apps with a fully customized setup process +* Typ [`default`](#default): Windows executables from a downloaded file, archive, or setup +* Typ [`node-package`](#node-package): Node.js packages, installable with NPM +* Typ [`python2-package`](#python-package): Python packages for Python 2 from PyPI, installable with PIP +* Typ [`python3-package`](#python-package): Python packages for Python 3 from PyPI, installable with PIP +* Typ [`ruby-package`](#ruby-package): Ruby packages, installable with Gem +* Typ [`nuget-package`](#nuget-package): NuGet packages, installable with NuGet ## Meta App {#meta} An app is a _Meta App_ if its [`Typ`][] is set to `meta`. From f027fe708997b3469813de26a81404337fb3cf5c Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 15:57:10 +0100 Subject: [PATCH 179/230] added reference docs for app libraries --- docs/content/ref/app-library.md | 347 ++++++++++++++++++++++++++++ docs/content/ref/file-structure.md | 165 +------------ docs/src-content/ref/app-library.md | 342 +++++++++++++++++++++++++++ 3 files changed, 694 insertions(+), 160 deletions(-) create mode 100644 docs/content/ref/app-library.md create mode 100644 docs/src-content/ref/app-library.md diff --git a/docs/content/ref/app-library.md b/docs/content/ref/app-library.md new file mode 100644 index 00000000..45768ef6 --- /dev/null +++ b/docs/content/ref/app-library.md @@ -0,0 +1,347 @@ ++++ +date = "2017-01-11T12:30:00+02:00" +description = "The format of app libaries" +title = "App Library" +weight = 4 ++++ + +App libraries provide the app definitions, Bench needs, to download and install programs. +Bench comes with a number of its own app libraries, hosted on [GitHub](https://github.com) +and preconfigured in a newly initialized Bench environment. +But sometimes you want to define your own apps, which are not included +in the official Bench app libraries. +To define your own apps, you can just edit the [`apps.md`](#apps-file) +in the [`config`](/ref/file-structure/#config-dir) directory. +Because, the user configuration directory of a Bench environment is +at the same time the _user app library_. +If you want to share your app definitions with others, +you can create separate app libraries and [host](#hosting) them in different ways. + +**Overview** + +* [App Definition](#app-definition) +* [File and Directory Layout](#file-and-directory-layout) +* [App Index](#apps) +* [Custom Scripts](#scripts) +* [App Setup Resources](#res) +* [Hosting](#hosting) + +## App Definition + +An app library consists of a number of app definitions. +App definitions allows Bench to download extract and install Windows programs. +And an app definition consists of: + +1. a number of [app properties](/ref/app-properties) + specified in the [app index](#apps-file) of the library, +2. [custom scripts](#scripts-dir) to customize the setup steps of an app + via PowerShell, and +3. [setup resources](#res-dir), which can be used by the custom scripts. + +## File and Directory Layout +An app library contains at least an [app index file](#apps-file). +Additionally it can contain the [custom scripts](#scripts-dir) for its apps +and [setup resources](#res-dir) needed by the [custom scripts](#scripts-dir). +It is good practice to add a [readme](#readme-file) and a [license](#license-file) file too. + +The full layout of an app library looks like this: + +* [`apps.md`](#apps-file) App Index File +* `README.md` Readme file with a brief description of the app library +* `LICENSE.md` The license under which the app library is published +* [`scripts`](#scripts-dir) Custom Scripts Directory + ([AppLibCustomScriptDirName](/ref/config/#AppLibCustomScriptDirName)) + + _app namespace_ → + + [`.extract.ps1`](#custom-script-extract) + + [`.setup.ps1`](#custom-script-setup) + + [`.env.ps1`](#custom-script-env) + + [`.remove.ps1`](#custom-script-remove) + + [`.pre-run.ps1`](#custom-script-pre-run) + + [`.post-run.ps1`](#custom-script-post-run) +* [`res`](#res-dir) App Setup Resources Directory + ([AppLibResourceDirName](/ref/config/#AppLibResourceDirName)) + + _app namespace_ → + + ... + +Custom scripts and setup resources are organized by the namespace of their app. +E.g. if an app `MyNamespace.MyApp` has a custom script for the environment setup, +the custom script would have the path `scripts\mynamespace\myapp.env.ps1`. + +## App Index {#apps} + +The IDs and properties of all apps in a library are stored in the app index. +The app index consists of a Markdown file, with a section for every app. +Additionally to the machine readable [app properties](/ref/app-properties), +every app definition can contain Markdown text which is displayed +as a description for an app in the [BenchDashboard](/ref/dashboard). + +### App Index File {#apps-file} + +* Description: The app index file. +* Path: `\apps.md` +* Config Property: [AppLibIndexFileName](/ref/config/#AppLibIndexFileName) +* Type: file +* Required: yes + +The app index file is written in [Markdown list syntax](/ref/markup-syntax). +Every app is defined by a number of [App Properties](/ref/app-properties/). + +## Custom Scripts {#scripts} + +Custom scripts allow the maintainer of an app library to customize certain steps +in the setup and execution of apps via PowerShell scripts. + +The following types of custom scripts are supported: + +* [`extract`](#custom-script-extract) +* [`setup`](#custom-script-setup) +* [`env`](#custom-script-env) +* [`remove`](#custom-script-remove) +* [`pre-run`](#custom-script-pre-run) +* [`post-run`](#custom-script-post-run) + +If the file format of the downloadable setup program for an app is not supported +by Bench, then the file extraction can be implemented in the custom script +for the _extract_ setp. + +If the original setup program of a Windows application performs some necessary +actions to prepare the program files for execution, these actions +usually need to be reimplemented in the custom script for the _setup_ step. +And clean-up tasks to uninstall an app properly need to be implemented in the +custom script for the _remove_ step. + +If the configuration files of a program contain absolute paths the programs +installation directory, updating the configuration files need to be implemented +in the custom script for the _env_ step. + +To perform some tasks every time before or after a program is executed, +they can be implemented in the custom scripts for the _pre-run_ and _post-run_ steps. + +### App Custom Script Directory {#scripts-dir} + +* Description: The directory with the custom scripts of the apps. +* Path: `\scripts` +* Config Property: [AppLibCustomScriptDirName](/ref/config/#AppLibCustomScriptDirName) +* Type: directory +* Required: no + +Custom scripts are organized by the namespaces of their app. +E.g. if an app `MyNamespace.MyApp` has a custom script for the environment setup, +the custom script would have the path `scripts\mynamespace\myapp.env.ps1`. + +### App Custom Script `extract` {#custom-script-extract} + +* Description: Custom script for app resource extraction. +* Path: `\scripts\\.extract.ps1` +* Type: file + +Custom scripts for app resource extraction must be named with the app ID +in lower case, and the name extension `.extract.ps1`. + +The _custom script for extraction_ is executed if the +[`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) is set to `auto` or `custom`. +If the [`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) of the app is set +to `auto` and a _custom script for extraction_ for this app exists, +the custom script takes precedence over the other extraction methods. + +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. +Custom extraction scripts are called with two command line arguments: + +1. The absolute path of the downloaded app resource archive +2. The absolute path of the target directory to extract the resources + +Example for the extraction of a nested archive: + +```PowerShell +param ($archivePath, $targetDir) + +$nestedArchive = "nested.zip" + +# create temporary directory +$tmpDir = Empty-Dir "$(Get-ConfigValue TempDir)\custom_extract" + +# get path of 7-Zip +$7z = App-Exe "Bench.7z" + +# call 7-Zip to extract outer archive +& $7z x "-o$tmpDir" "$archivePath" + +# check if expected inner archive exists +if (!(Test-Path "$tmpDir\$nestedArchive")) +{ + throw "Did not find the expected content in the app resource." +} + +# call 7-Zip to extract inner archive +& $7z x "-o$targetDir" "$tmpDir\$nestedArchive" + +# Delete temporary directory +Purge-Dir $tmpDir +``` + +### App Custom Script `setup` {#custom-script-setup} + +* Description: Custom script for app setup. +* Path: `\scripts\\.setup.md` +* Type: file + +Custom scripts for app resource extraction must be named with the app ID +in lower case, and the name extension `.setup.ps1`. + +If a _custom setup script_ for an app exists, it is executed after +the installation of the (extracted) app resources in the +[apps target dir](#lib-app). +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) is available. + +### App Custom Script `env` {#custom-script-env} + +* Description: Custom script for environment setup. +* Path: `\scripts\\.env.ps1` +* Type: file + +Custom scripts for environment setup must be named with the app ID +in lower case, and the name extension `.env.ps1`. + +If a _custom environment setup script_ for an app exists, it is executed +after the setup to update configuration files depending +on the location of Bench or other [configuration properties](/ref/config). +It is also called if the _Upade Environment_ task for Bench is executed. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. + +### App Custom Script `remove` {#custom-script-remove} + +* Description: Custom script for app deinstallation. +* Path: `\scripts\\.remove.ps1` +* Type: files + +Custom scripts for deinstallation must be named with the app ID +in lower case, and the name extension `.remove.ps1`. + +If a _custom deinstallation script_ for an app exists, it is executed +instead of the default uninstall method. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. + +### App Custom Script `pre-run` {#custom-script-pre-run} + +* Description: Pre-run hook for adorned executables of an app. +* Path: `\scripts\\.pre-run.ps1` +* Type: file + +The _custom pre-run script_ is executed immediately before an app executable is run. +It is only executed if an app executable is run via its execution proxy. +This is usually the case because it is listed in +[AdornedExecutables](/ref/app-properties/#AdornedExecutables). +The [main executable](/ref/app-properties/#Exe) of an app is automatically +included in the list of adorned executables +if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. + +### App Custom Script `post-run` {#custom-script-post-run} + +* Description: Post-run hook for adorned executables of an app. +* Path: `\scripts\\.post-run.ps1` +* Type: file + +The _custom post-run script_ is executed immediately after an app executable is run. +It is only executed if an app executable is run via its execution proxy. +This is usually the case because it is listed in +[AdornedExecutables](/ref/app-properties/#AdornedExecutables). +The [main executable](/ref/app-properties/#Exe) of an app is automatically +included in the list of adorned executables +if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. + +## App Setup Resources {#res} + +App setup resources are files, which are used by custom scripts to +perform necessary tasks during the various setup and execution steps of an app. + +### User App Resources Directory {#res-dir} + +* Description: The directory with setup resources for the apps. +* Path: `\res` +* Config Property: [AppLibResourceDirName](/ref/config/#AppLibResourceDirName) +* Type: directory +* Required: no + +App setup resources are organized by the namespaces of their app. +E.g. if an app `MyNamespace.MyApp` has a setup resource named `config-template.xml`, +it would have the path `\res\mynamespace\myapp\config-template.xml`. + +To get the absolute path of an app setup resource file from a custom script, +you can use the PowerShell API function [`App-SetupResource`](/ref/ps-api/#fun-app-setupresource). + +E.g. to retrieve the path of the `config-template.xml` from above, the custom +script `\scripts\mynamespace\myapp.setup.ps1` could contain: + +```PowerShell +$myAppDir = App-Dir "MyNamespace.MyApp" +$templateFile = App-SetupResource "MyNamespace.MyApp" "config-template.xml" +copy $templateFile "$myAppDir\config.xml" -Force +``` + +## Hosting {#hosting} + +An app library must be reachable via an URL, so it can be refered to in the +[`AppLibs`](/ref/config/#AppLibs) configuration property. +Currently supported are _https(s)_ and _file_ URLs. +Additionally, there is a shorthand form for _GitHub_ hosted app libraries. + +If the library is hosted via _http(s)_, the library must be packed in a ZIP file. +If the library is reachable in the file system, it can be packed in a ZIP file, +but it can also just be an open folder. +If the library is packed in a ZIP file, its content can be put directly in +the ZIP file, or it can be wrapped in exactly one sub-folder. +But in this case, no other files or folders are allowed in the root of the ZIP file. + +### Example 1 – open folder in the filesystem {#hosting-example-1} + +This is a fitting approach if you want to use a locally maintained app library +in multiple Bench environments, or if you have an infrastructure with +SMB shares. + +* Path to the app library folder: `D:\applibs\my-applib` +* Content of the folder: + + `apps.md` + + `scripts` + - ... +* URL in `AppLibs`: `file:///D:/applibs/my-applib` + +### Example 2 – ZIP file on a web server {#hosting-example-2} + +This is a fitting approach if you want to share you app library +without publishing it on GitHub, or if you have an intranet web server +under the control of you development team. +You could even store the app library in a cloud storage like DropBox +and distribute a public link for sharing. + +* Name of the ZIP file: `my-apps.zip` +* Content of the ZIP file: + + `apps.md` + + `README.md` + + `LICENSE.md` + + `scripts` + - ... +* URL in `AppLibs`: `http://www.your-domain.net/bench-app-libs/my-apps.zip` + +### Example 3 – public GitHub repository {#hosting-example-3} + +This is a fitting approach if you app library is free to be used by anybody. + +* Username on GitHub: `the-programmer` +* Repository name: `favorite-bench-apps` +* Content of the repository: + + `apps.md` + + `README.md` + + `LICENSE.md` + + `scripts` + - ... +* URL in the `AppLibs`: `github:the-programmer/favorite-bench-apps` +* Main branch must be: `master` +* Automatically expanded URL: `https://github.com/the-programmer/favorite-bench-apps/archive/master.zip` +* GitHub generated content of the ZIP archive: + + `favorite-bench-apps-master` + - `apps.md` + - `README.md` + - `LICENSE.md` + - `scripts` diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index ac406463..5cb83628 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -31,21 +31,9 @@ during the Bench setup, and _can not_ be moved via custom or site configuration. - ... * [`config`](#config-dir) User Configuration ([CustomConfigDir](/ref/config/#CustomConfigDir)) - + [`scripts`](#config-scripts-dir) User Custom Scripts Directory - ([AppLibCustomScriptDirName](/ref/config/#AppLibCustomScriptDirName)) - - _app namespace_ → - - [`.extract.ps1`](#custom-script-extract) - - [`.setup.ps1`](#custom-script-setup) - - [`.env.ps1`](#custom-script-env) - - [`.remove.ps1`](#custom-script-remove) - - [`.pre-run.ps1`](#custom-script-pre-run) - - [`.post-run.ps1`](#custom-script-post-run) - + [`res`](#config-res-dir) User App Resources Directory - ([AppLibResourceDirName](/ref/config/#AppLibResourceDirName)) - - _app namespace_ → - - ... - + [`apps.md`](#config-apps) User App Library - ([AppLibIndexFileName](/ref/config/#AppLibIndexFileName)) + + [`scripts`](/ref/app-library/#scripts-dir) Custom Scripts Directory + + [`res`](/ref/app-library/res-dir) App Setup Resources Directory + + [`apps.md`](/ref/app-library/apps-file) App Index of the User App Library + [`apps-activated.txt`](#config-apps-activated) App Activation List ([AppActivationFile](/ref/config/#AppActivationFile)) + [`apps-deactivated.txt`](#config-apps-deactivated) App Deactivation List @@ -132,128 +120,6 @@ and _can_ be moved via custom or site configuration. * Path: `auto` * Type: directory -### App Custom Script `extract` {#custom-script-extract} - -* Description: Custom script for app resource extraction. -* Path: `\scripts\\.extract.ps1` or `config\scripts\\.extract.ps1` -* Type: file - -Custom scripts for app resource extraction must be named with the app ID -in lower case, and the name extension `.extract.ps1`. - -The _custom script for extraction_ is executed if the -[`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) is set to `auto` or `custom`. -If the [`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) of the app is set -to `auto` and a _custom script for extraction_ for this app exists, -the custom script takes precedence over the other extraction methods. - -Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. -Custom extraction scripts are called with two command line arguments: - -1. The absolute path of the downloaded app resource archive -2. The absolute path of the target directory to extract the resources - -Example for the extraction of a nested archive: - -```PowerShell -param ($archivePath, $targetDir) - -$nestedArchive = "nested.zip" - -# create temporary directory -$tmpDir = Empty-Dir "$(Get-ConfigValue TempDir)\custom_extract" - -# get path of 7-Zip -$7z = App-Exe "Bench.7z" - -# call 7-Zip to extract outer archive -& $7z x "-o$tmpDir" "$archivePath" - -# check if expected inner archive exists -if (!(Test-Path "$tmpDir\$nestedArchive")) -{ - throw "Did not find the expected content in the app resource." -} - -# call 7-Zip to extract inner archive -& $7z x "-o$targetDir" "$tmpDir\$nestedArchive" - -# Delete temporary directory -Purge-Dir $tmpDir -``` - -### App Custom Script `setup` {#custom-script-setup} - -* Description: Custom script for app setup. -* Path: `\scripts\\.setup.md` or `config\scripts\\.setup.ps1` -* Type: file - -Custom scripts for app resource extraction must be named with the app ID -in lower case, and the name extension `.setup.ps1`. - -If a _custom setup script_ for an app exists, it is executed after -the installation of the (extracted) app resources in the -[apps target dir](#lib-app). -Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) is available. - -### App Custom Script `env` {#custom-script-env} - -* Description: Custom script for environment setup. -* Path: `\scripts\\.env.ps1` or `config\scripts\\.env.ps1` -* Type: file - -Custom scripts for environment setup must be named with the app ID -in lower case, and the name extension `.env.ps1`. - -If a _custom environment setup script_ for an app exists, it is executed -after the setup to update configuration files depending -on the location of Bench or other [configuration properties](/ref/config). -It is also called if the _Upade Environment_ task for Bench is executed. -Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. - -### App Custom Script `remove` {#custom-script-remove} - -* Description: Custom script for app deinstallation. -* Path: `\scripts\\.remove.ps1` or `config\scripts\\.remove.ps1` -* Type: files - -Custom scripts for deinstallation must be named with the app ID -in lower case, and the name extension `.remove.ps1`. - -If a _custom deinstallation script_ for an app exists, it is executed -instead of the default uninstall method. -Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. - -### App Custom Script `pre-run` {#custom-script-pre-run} - -* Description: Pre-run hook for adorned executables of an app. -* Path: `\scripts\\.pre-run.ps1` or `config\scripts\\.pre-run.ps1` -* Type: file - -The _custom pre-run script_ is executed immediately before an app executable is run. -It is only executed if an app executable is run via its execution proxy. -This is usually the case because it is listed in -[AdornedExecutables](/ref/app-properties/#AdornedExecutables). -The [main executable](/ref/app-properties/#Exe) of an app is automatically -included in the list of adorned executables -if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. -Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. - -### App Custom Script `post-run` {#custom-script-post-run} - -* Description: Post-run hook for adorned executables of an app. -* Path: `\scripts\\.post-run.ps1` or `config\scripts\\.post-run.ps1` -* Type: file - -The _custom post-run script_ is executed immediately after an app executable is run. -It is only executed if an app executable is run via its execution proxy. -This is usually the case because it is listed in -[AdornedExecutables](/ref/app-properties/#AdornedExecutables). -The [main executable](/ref/app-properties/#Exe) of an app is automatically -included in the list of adorned executables -if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. -Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. - ### Bench Binary Directory {#auto-bin-dir} * Description: The directory with all binary executables and libraries of Bench. @@ -296,29 +162,8 @@ This action will fail if [Git][] is not installed This directory is designed to be put under version control, to manage and share Bench configurations. -### User Custom Scripts Directory {#config-scripts-dir} - -* Description: The directory with the custom scripts of the user apps. -* Path: `config\scripts` -* Config Property: [AppLibCustomScriptDirName](/ref/config/#AppLibCustomScriptDirName) -* Type: directory - -### User App Resources Directory {#config-res-dir} - -* Description: The directory with custom resources of the user apps. -* Path: `config\res` -* Config Property: [AppLibResourceDirName](/ref/config/#AppLibResourceDirName) -* Type: directory - -### User App Library {#config-apps} - -* Description: The user app library. -* Path: `config\apps.md` -* Config Property: [AppLibIndexFileName](/ref/config/#AppLibIndexFileName) -* Type: file - -The app library file is written in [Markdown list syntax](/ref/markup-syntax). -Every app is defined by a number of [App Properties](/ref/app-properties/). +The user configuration directory contains the user configuration +and is the user [app library](/ref/app-library) at the same time. ### App Activation List {#config-apps-activated} diff --git a/docs/src-content/ref/app-library.md b/docs/src-content/ref/app-library.md new file mode 100644 index 00000000..a08af21f --- /dev/null +++ b/docs/src-content/ref/app-library.md @@ -0,0 +1,342 @@ ++++ +date = "2017-01-11T12:30:00+02:00" +description = "The format of app libaries" +title = "App Library" +weight = 4 ++++ + +App libraries provide the app definitions, Bench needs, to download and install programs. +Bench comes with a number of its own app libraries, hosted on [GitHub](https://github.com) +and preconfigured in a newly initialized Bench environment. +But sometimes you want to define your own apps, which are not included +in the official Bench app libraries. +To define your own apps, you can just edit the [`apps.md`](#apps-file) +in the [`config`](/ref/file-structure/#config-dir) directory. +Because, the user configuration directory of a Bench environment is +at the same time the _user app library_. +If you want to share your app definitions with others, +you can create separate app libraries and [host](#hosting) them in different ways. + +**Overview** + + + +## App Definition + +An app library consists of a number of app definitions. +App definitions allows Bench to download extract and install Windows programs. +And an app definition consists of: + +1. a number of [app properties](/ref/app-properties) + specified in the [app index](#apps-file) of the library, +2. [custom scripts](#scripts-dir) to customize the setup steps of an app + via PowerShell, and +3. [setup resources](#res-dir), which can be used by the custom scripts. + +## File and Directory Layout +An app library contains at least an [app index file](#apps-file). +Additionally it can contain the [custom scripts](#scripts-dir) for its apps +and [setup resources](#res-dir) needed by the [custom scripts](#scripts-dir). +It is good practice to add a [readme](#readme-file) and a [license](#license-file) file too. + +The full layout of an app library looks like this: + +* [`apps.md`](#apps-file) App Index File +* `README.md` Readme file with a brief description of the app library +* `LICENSE.md` The license under which the app library is published +* [`scripts`](#scripts-dir) Custom Scripts Directory + ([AppLibCustomScriptDirName](/ref/config/#AppLibCustomScriptDirName)) + + _app namespace_ → + + [`.extract.ps1`](#custom-script-extract) + + [`.setup.ps1`](#custom-script-setup) + + [`.env.ps1`](#custom-script-env) + + [`.remove.ps1`](#custom-script-remove) + + [`.pre-run.ps1`](#custom-script-pre-run) + + [`.post-run.ps1`](#custom-script-post-run) +* [`res`](#res-dir) App Setup Resources Directory + ([AppLibResourceDirName](/ref/config/#AppLibResourceDirName)) + + _app namespace_ → + + ... + +Custom scripts and setup resources are organized by the namespace of their app. +E.g. if an app `MyNamespace.MyApp` has a custom script for the environment setup, +the custom script would have the path `scripts\mynamespace\myapp.env.ps1`. + +## App Index {#apps} + +The IDs and properties of all apps in a library are stored in the app index. +The app index consists of a Markdown file, with a section for every app. +Additionally to the machine readable [app properties](/ref/app-properties), +every app definition can contain Markdown text which is displayed +as a description for an app in the [BenchDashboard](/ref/dashboard). + +### App Index File {#apps-file} + +* Description: The app index file. +* Path: `\apps.md` +* Config Property: [AppLibIndexFileName](/ref/config/#AppLibIndexFileName) +* Type: file +* Required: yes + +The app index file is written in [Markdown list syntax](/ref/markup-syntax). +Every app is defined by a number of [App Properties](/ref/app-properties/). + +## Custom Scripts {#scripts} + +Custom scripts allow the maintainer of an app library to customize certain steps +in the setup and execution of apps via PowerShell scripts. + +The following types of custom scripts are supported: + +* [`extract`](#custom-script-extract) +* [`setup`](#custom-script-setup) +* [`env`](#custom-script-env) +* [`remove`](#custom-script-remove) +* [`pre-run`](#custom-script-pre-run) +* [`post-run`](#custom-script-post-run) + +If the file format of the downloadable setup program for an app is not supported +by Bench, then the file extraction can be implemented in the custom script +for the _extract_ setp. + +If the original setup program of a Windows application performs some necessary +actions to prepare the program files for execution, these actions +usually need to be reimplemented in the custom script for the _setup_ step. +And clean-up tasks to uninstall an app properly need to be implemented in the +custom script for the _remove_ step. + +If the configuration files of a program contain absolute paths the programs +installation directory, updating the configuration files need to be implemented +in the custom script for the _env_ step. + +To perform some tasks every time before or after a program is executed, +they can be implemented in the custom scripts for the _pre-run_ and _post-run_ steps. + +### App Custom Script Directory {#scripts-dir} + +* Description: The directory with the custom scripts of the apps. +* Path: `\scripts` +* Config Property: [AppLibCustomScriptDirName](/ref/config/#AppLibCustomScriptDirName) +* Type: directory +* Required: no + +Custom scripts are organized by the namespaces of their app. +E.g. if an app `MyNamespace.MyApp` has a custom script for the environment setup, +the custom script would have the path `scripts\mynamespace\myapp.env.ps1`. + +### App Custom Script `extract` {#custom-script-extract} + +* Description: Custom script for app resource extraction. +* Path: `\scripts\\.extract.ps1` +* Type: file + +Custom scripts for app resource extraction must be named with the app ID +in lower case, and the name extension `.extract.ps1`. + +The _custom script for extraction_ is executed if the +[`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) is set to `auto` or `custom`. +If the [`ArchiveTyp`](/ref/app-properties/#ArchiveTyp) of the app is set +to `auto` and a _custom script for extraction_ for this app exists, +the custom script takes precedence over the other extraction methods. + +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. +Custom extraction scripts are called with two command line arguments: + +1. The absolute path of the downloaded app resource archive +2. The absolute path of the target directory to extract the resources + +Example for the extraction of a nested archive: + +```PowerShell +param ($archivePath, $targetDir) + +$nestedArchive = "nested.zip" + +# create temporary directory +$tmpDir = Empty-Dir "$(Get-ConfigValue TempDir)\custom_extract" + +# get path of 7-Zip +$7z = App-Exe "Bench.7z" + +# call 7-Zip to extract outer archive +& $7z x "-o$tmpDir" "$archivePath" + +# check if expected inner archive exists +if (!(Test-Path "$tmpDir\$nestedArchive")) +{ + throw "Did not find the expected content in the app resource." +} + +# call 7-Zip to extract inner archive +& $7z x "-o$targetDir" "$tmpDir\$nestedArchive" + +# Delete temporary directory +Purge-Dir $tmpDir +``` + +### App Custom Script `setup` {#custom-script-setup} + +* Description: Custom script for app setup. +* Path: `\scripts\\.setup.md` +* Type: file + +Custom scripts for app resource extraction must be named with the app ID +in lower case, and the name extension `.setup.ps1`. + +If a _custom setup script_ for an app exists, it is executed after +the installation of the (extracted) app resources in the +[apps target dir](#lib-app). +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) is available. + +### App Custom Script `env` {#custom-script-env} + +* Description: Custom script for environment setup. +* Path: `\scripts\\.env.ps1` +* Type: file + +Custom scripts for environment setup must be named with the app ID +in lower case, and the name extension `.env.ps1`. + +If a _custom environment setup script_ for an app exists, it is executed +after the setup to update configuration files depending +on the location of Bench or other [configuration properties](/ref/config). +It is also called if the _Upade Environment_ task for Bench is executed. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. + +### App Custom Script `remove` {#custom-script-remove} + +* Description: Custom script for app deinstallation. +* Path: `\scripts\\.remove.ps1` +* Type: files + +Custom scripts for deinstallation must be named with the app ID +in lower case, and the name extension `.remove.ps1`. + +If a _custom deinstallation script_ for an app exists, it is executed +instead of the default uninstall method. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. + +### App Custom Script `pre-run` {#custom-script-pre-run} + +* Description: Pre-run hook for adorned executables of an app. +* Path: `\scripts\\.pre-run.ps1` +* Type: file + +The _custom pre-run script_ is executed immediately before an app executable is run. +It is only executed if an app executable is run via its execution proxy. +This is usually the case because it is listed in +[AdornedExecutables](/ref/app-properties/#AdornedExecutables). +The [main executable](/ref/app-properties/#Exe) of an app is automatically +included in the list of adorned executables +if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. + +### App Custom Script `post-run` {#custom-script-post-run} + +* Description: Post-run hook for adorned executables of an app. +* Path: `\scripts\\.post-run.ps1` +* Type: file + +The _custom post-run script_ is executed immediately after an app executable is run. +It is only executed if an app executable is run via its execution proxy. +This is usually the case because it is listed in +[AdornedExecutables](/ref/app-properties/#AdornedExecutables). +The [main executable](/ref/app-properties/#Exe) of an app is automatically +included in the list of adorned executables +if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. +Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. + +## App Setup Resources {#res} + +App setup resources are files, which are used by custom scripts to +perform necessary tasks during the various setup and execution steps of an app. + +### User App Resources Directory {#res-dir} + +* Description: The directory with setup resources for the apps. +* Path: `\res` +* Config Property: [AppLibResourceDirName](/ref/config/#AppLibResourceDirName) +* Type: directory +* Required: no + +App setup resources are organized by the namespaces of their app. +E.g. if an app `MyNamespace.MyApp` has a setup resource named `config-template.xml`, +it would have the path `\res\mynamespace\myapp\config-template.xml`. + +To get the absolute path of an app setup resource file from a custom script, +you can use the PowerShell API function [`App-SetupResource`](/ref/ps-api/#fun-app-setupresource). + +E.g. to retrieve the path of the `config-template.xml` from above, the custom +script `\scripts\mynamespace\myapp.setup.ps1` could contain: + +```PowerShell +$myAppDir = App-Dir "MyNamespace.MyApp" +$templateFile = App-SetupResource "MyNamespace.MyApp" "config-template.xml" +copy $templateFile "$myAppDir\config.xml" -Force +``` + +## Hosting {#hosting} + +An app library must be reachable via an URL, so it can be refered to in the +[`AppLibs`](/ref/config/#AppLibs) configuration property. +Currently supported are _https(s)_ and _file_ URLs. +Additionally, there is a shorthand form for _GitHub_ hosted app libraries. + +If the library is hosted via _http(s)_, the library must be packed in a ZIP file. +If the library is reachable in the file system, it can be packed in a ZIP file, +but it can also just be an open folder. +If the library is packed in a ZIP file, its content can be put directly in +the ZIP file, or it can be wrapped in exactly one sub-folder. +But in this case, no other files or folders are allowed in the root of the ZIP file. + +### Example 1 – open folder in the filesystem {#hosting-example-1} + +This is a fitting approach if you want to use a locally maintained app library +in multiple Bench environments, or if you have an infrastructure with +SMB shares. + +* Path to the app library folder: `D:\applibs\my-applib` +* Content of the folder: + + `apps.md` + + `scripts` + - ... +* URL in `AppLibs`: `file:///D:/applibs/my-applib` + +### Example 2 – ZIP file on a web server {#hosting-example-2} + +This is a fitting approach if you want to share you app library +without publishing it on GitHub, or if you have an intranet web server +under the control of you development team. +You could even store the app library in a cloud storage like DropBox +and distribute a public link for sharing. + +* Name of the ZIP file: `my-apps.zip` +* Content of the ZIP file: + + `apps.md` + + `README.md` + + `LICENSE.md` + + `scripts` + - ... +* URL in `AppLibs`: `http://www.your-domain.net/bench-app-libs/my-apps.zip` + +### Example 3 – public GitHub repository {#hosting-example-3} + +This is a fitting approach if you app library is free to be used by anybody. + +* Username on GitHub: `the-programmer` +* Repository name: `favorite-bench-apps` +* Content of the repository: + + `apps.md` + + `README.md` + + `LICENSE.md` + + `scripts` + - ... +* URL in the `AppLibs`: `github:the-programmer/favorite-bench-apps` +* Main branch must be: `master` +* Automatically expanded URL: `https://github.com/the-programmer/favorite-bench-apps/archive/master.zip` +* GitHub generated content of the ZIP archive: + + `favorite-bench-apps-master` + - `apps.md` + - `README.md` + - `LICENSE.md` + - `scripts` From d5313896c15bb8a72bc07223c5a27f428bddf023 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Wed, 11 Jan 2017 15:57:22 +0100 Subject: [PATCH 180/230] reordered the reference pages --- docs/content/ref/dashboard.md | 2 +- docs/content/ref/file-structure.md | 2 +- docs/src-content/ref/dashboard.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/content/ref/dashboard.md b/docs/content/ref/dashboard.md index abb80653..b5ab8bbb 100644 --- a/docs/content/ref/dashboard.md +++ b/docs/content/ref/dashboard.md @@ -2,7 +2,7 @@ date = "2016-06-22T13:40:45+02:00" description = "The graphical user interface for the Bench environment" title = "Bench Dashboard" -weight = 3 +weight = 1 +++ [Main]: /img/Dashboard_Main.png diff --git a/docs/content/ref/file-structure.md b/docs/content/ref/file-structure.md index 5cb83628..2e2c45b7 100644 --- a/docs/content/ref/file-structure.md +++ b/docs/content/ref/file-structure.md @@ -2,7 +2,7 @@ date = "2017-01-02T16:30:00+02:00" description = "The layout of the folders and files in the Bench environment" title = "File Structure" -weight = 4 +weight = 3 +++ The file structure of Bench is divided in two groups, the core and the extended file structure. diff --git a/docs/src-content/ref/dashboard.md b/docs/src-content/ref/dashboard.md index 9d02e050..359b92ae 100644 --- a/docs/src-content/ref/dashboard.md +++ b/docs/src-content/ref/dashboard.md @@ -2,7 +2,7 @@ date = "2016-06-22T13:40:45+02:00" description = "The graphical user interface for the Bench environment" title = "Bench Dashboard" -weight = 3 +weight = 1 +++ [Main]: /img/Dashboard_Main.png From b9f25abc46ea82f0d6983f0a0fa7fdcbf6983c61 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 12:39:30 +0100 Subject: [PATCH 181/230] attempt to fix download list visibility --- BenchManager/BenchDashboard/SetupForm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index e2569254..6b965667 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -328,7 +328,7 @@ private void InitializeDownloadList() { downloadList.Downloader = core.Downloader; core.Downloader.IsWorkingChanged += DownloaderIsWorkingChangedHandler; - IsDownloadListVisible = false; + UpdateDownloadListVisibility(); } private void InitializeAppList() From 4a1413d1077e4fc8f196d4a54fa4694cc88ef20b Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 13:14:25 +0100 Subject: [PATCH 182/230] update syntax --- BenchManager/BenchLib/Downloader.cs | 30 +++++------------------------ 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/BenchManager/BenchLib/Downloader.cs b/BenchManager/BenchLib/Downloader.cs index 31b82a86..2029be3d 100644 --- a/BenchManager/BenchLib/Downloader.cs +++ b/BenchManager/BenchLib/Downloader.cs @@ -124,50 +124,30 @@ public Downloader(int parallelDownloads) private void OnDownloadStarted(DownloadTask task) { Debug.WriteLine("Raising event DownloadStarted for " + task.Id + ", Url=" + task.Url); - var handler = DownloadStarted; - if (handler != null) - { - handler(this, new DownloadEventArgs(task)); - } + DownloadStarted?.Invoke(this, new DownloadEventArgs(task)); } private void OnDownloadProgress(DownloadTask task, long bytesDownloaded, long totalBytes, int percentage) { - var handler = DownloadProgress; - if (handler != null) - { - handler(this, new DownloadProgressEventArgs(task, bytesDownloaded, totalBytes, percentage)); - } + DownloadProgress?.Invoke(this, new DownloadProgressEventArgs(task, bytesDownloaded, totalBytes, percentage)); } private void OnDownloadEnded(DownloadTask task) { Debug.WriteLine("Raising event DownloadEnded for " + task.Id + ", Error=" + task.ErrorMessage ?? "None"); - var handler = DownloadEnded; - if (handler != null) - { - handler(this, new DownloadEventArgs(task)); - } + DownloadEnded?.Invoke(this, new DownloadEventArgs(task)); } private void OnIsWorkingChanged() { Debug.WriteLine("Raising event IsWorkingChanged"); - var handler = IsWorkingChanged; - if (handler != null) - { - handler(this, EventArgs.Empty); - } + IsWorkingChanged?.Invoke(this, EventArgs.Empty); } private void OnWorkFinished() { Debug.WriteLine("Raising event WorkFinished"); - var handler = WorkFinished; - if (handler != null) - { - handler(this, EventArgs.Empty); - } + WorkFinished?.Invoke(this, EventArgs.Empty); } /// From ea2e751e65e72938c127ef09586b82b9a2bb734b Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 13:15:16 +0100 Subject: [PATCH 183/230] asure event order (IsWorkingChanged, DownloadStarted) --- BenchManager/BenchLib/Downloader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchLib/Downloader.cs b/BenchManager/BenchLib/Downloader.cs index 2029be3d..33336e2d 100644 --- a/BenchManager/BenchLib/Downloader.cs +++ b/BenchManager/BenchLib/Downloader.cs @@ -175,11 +175,11 @@ public void Enqueue(DownloadTask task) notify = true; } } - availableTasks.Release(); if (notify) { OnIsWorkingChanged(); } + availableTasks.Release(); } private void Worker(int no) From 107e868b8d38bbc0e6383d0a3c1df78a9d49471b Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 13:16:18 +0100 Subject: [PATCH 184/230] refactoring --- BenchManager/BenchDashboard/DownloadList.cs | 81 +++++++++++++++------ 1 file changed, 59 insertions(+), 22 deletions(-) diff --git a/BenchManager/BenchDashboard/DownloadList.cs b/BenchManager/BenchDashboard/DownloadList.cs index 6e9c5eb0..67bb253c 100644 --- a/BenchManager/BenchDashboard/DownloadList.cs +++ b/BenchManager/BenchDashboard/DownloadList.cs @@ -11,13 +11,14 @@ namespace Mastersign.Bench.Dashboard { public partial class DownloadList : UserControl { + private readonly Dictionary downloadControls + = new Dictionary(); + public DownloadList() { InitializeComponent(); } - private readonly Dictionary downloadControls - = new Dictionary(); private Downloader downloader; @@ -28,22 +29,42 @@ public Downloader Downloader { if (downloader != null) { - downloader.DownloadStarted -= DownloadStartedHandler; - downloader.DownloadProgress -= DownloadProgressHandler; - downloader.DownloadEnded -= DownloadEndedHandler; - downloadControls.Clear(); - Controls.Clear(); + BindDownloader(); } downloader = value; if (downloader != null) { - downloader.DownloadStarted += DownloadStartedHandler; - downloader.DownloadProgress += DownloadProgressHandler; - downloader.DownloadEnded += DownloadEndedHandler; + UnbindDownloader(); } } } + private void BindDownloader() + { + downloader.IsWorkingChanged -= DownloaderIsWorkingChangedHandler; + downloader.DownloadStarted -= DownloadStartedHandler; + downloader.DownloadProgress -= DownloadProgressHandler; + downloader.DownloadEnded -= DownloadEndedHandler; + ClearDownloadTasks(); + // Potential inconsitency ... add already running download tasks + } + + private void UnbindDownloader() + { + downloader.IsWorkingChanged += DownloaderIsWorkingChangedHandler; + downloader.DownloadStarted += DownloadStartedHandler; + downloader.DownloadProgress += DownloadProgressHandler; + downloader.DownloadEnded += DownloadEndedHandler; + } + + private void DownloaderIsWorkingChangedHandler(object sender, EventArgs e) + { + if (downloader.IsWorking) + { + ClearDownloadTasks(); + } + } + private void DownloadStartedHandler(object sender, DownloadEventArgs e) { if (InvokeRequired) @@ -51,15 +72,7 @@ private void DownloadStartedHandler(object sender, DownloadEventArgs e) Invoke((EventHandler)DownloadStartedHandler, sender, e); return; } - var control = new DownloadControl(); - control.Visible = false; - control.Left = ClientRectangle.Left; - control.Width = ClientSize.Width; - control.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; - control.FileName = Path.GetFileName(e.Task.TargetFile); - downloadControls.Add(e.Task, control); - Controls.Add(control); - UpdateLayout(); + AddDownloadTask(e.Task); } private void DownloadProgressHandler(object sender, DownloadProgressEventArgs e) @@ -87,9 +100,7 @@ private void DownloadEndedHandler(object sender, DownloadEventArgs e) } if (e.Task.Success) { - Controls.Remove(downloadControls[e.Task]); - downloadControls.Remove(e.Task); - UpdateLayout(); + RemoveDownloadTask(e.Task); } else { @@ -97,6 +108,32 @@ private void DownloadEndedHandler(object sender, DownloadEventArgs e) } } + private void AddDownloadTask(DownloadTask t) + { + var control = new DownloadControl(); + control.Visible = false; + control.Left = ClientRectangle.Left; + control.Width = ClientSize.Width; + control.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; + control.FileName = Path.GetFileName(t.TargetFile); + downloadControls.Add(t, control); + Controls.Add(control); + UpdateLayout(); + } + + private void RemoveDownloadTask(DownloadTask t) + { + Controls.Remove(downloadControls[t]); + downloadControls.Remove(t); + UpdateLayout(); + } + + private void ClearDownloadTasks() + { + downloadControls.Clear(); + Controls.Clear(); + } + private void UpdateLayout() { SuspendLayout(); From 16b412989c6d0898ccfefbe065b983bf40e84984 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 13:16:56 +0100 Subject: [PATCH 185/230] fix invalid thread access exception: unbind downloader if control is disposed --- BenchManager/BenchDashboard/DownloadList.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BenchManager/BenchDashboard/DownloadList.cs b/BenchManager/BenchDashboard/DownloadList.cs index 67bb253c..aa44c5aa 100644 --- a/BenchManager/BenchDashboard/DownloadList.cs +++ b/BenchManager/BenchDashboard/DownloadList.cs @@ -17,8 +17,13 @@ private readonly Dictionary downloadControls public DownloadList() { InitializeComponent(); + Disposed += DisposedHandler; } + private void DisposedHandler(object sender, EventArgs e) + { + Downloader = null; + } private Downloader downloader; From 2a9fb29cfb170e4b83623505dfe93bcd5cf06813 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 14:57:57 +0100 Subject: [PATCH 186/230] added documentation for column config property --- docs/src-content/ref/config.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/src-content/ref/config.md b/docs/src-content/ref/config.md index 7073e0f9..8c095302 100644 --- a/docs/src-content/ref/config.md +++ b/docs/src-content/ref/config.md @@ -548,6 +548,13 @@ and in custom scripts e.g. from [Git](/apps/Bench.Git). This switch only takes affect, if the [Git app](/apps/Bench.Git) is activated. +### DashboardSetupAppListColumns {#DashboardSetupAppListColumns} + +* Description: A list with the columns to display in the setup dialog of the _BenchDashboard_. +* Data Type: string list +* Default: `Order`, `Label`, `Version`, `Active`, `Deactivated`, `Status`, `Typ`, `Comment` +* Type: User/Site + ### EditorApp {#EditorApp} * Description: The ID of an app which is used as the default text editor. From 82ce5e8832cea507a55d095ff39dc4607ef4f143 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 15:09:53 +0100 Subject: [PATCH 187/230] added config property KnownLicense and app properties License and LicenseUrl --- BenchManager/BenchLib/AppFacade.cs | 31 +++++++++++++++-- .../BenchLib/AppIndexDefaultValueSource.cs | 11 +++++++ .../BenchLib/DictionaryValueResolver.cs | 2 ++ BenchManager/BenchLib/PropertyKeys.cs | 3 ++ docs/content/ref/app-properties.md | 22 +++++++++++++ docs/content/ref/config.md | 19 +++++++++++ docs/src-content/ref/app-properties.md | 20 +++++++++++ docs/src-content/ref/config.md | 10 ++++++ res/config.md | 33 +++++++++++++++++++ 9 files changed, 149 insertions(+), 2 deletions(-) diff --git a/BenchManager/BenchLib/AppFacade.cs b/BenchManager/BenchLib/AppFacade.cs index c2a5e8db..aebbb8a0 100644 --- a/BenchManager/BenchLib/AppFacade.cs +++ b/BenchManager/BenchLib/AppFacade.cs @@ -223,6 +223,31 @@ public IDictionary Docs => (Value(PropertyKeys.AppDocs) as IDictionary) ?? new Dictionary(); + /// + /// Gets the short name of the apps license. + /// + public string License => StringValue(PropertyKeys.AppLicense); + + /// + /// Gets the absolute URL of the apps license document. + /// + public Uri LicenseUrl + { + get + { + Uri result; + var licenseUrl = StringValue(PropertyKeys.AppLicenseUrl); + if (!Uri.TryCreate(licenseUrl, UriKind.RelativeOrAbsolute, out result)) + { + return null; + } + if (!result.IsAbsoluteUri) + return new Uri(new Uri(Dir), result); + else + return result; + } + } + /// /// An array with app IDs which are necessary to be installed for this app to work. /// @@ -1295,6 +1320,8 @@ private static string[] RemoveFromSet(string[] list, string value) PropertyKeys.AppWebsite, PropertyKeys.AppDocs, PropertyKeys.AppVersion, + PropertyKeys.AppLicense, + PropertyKeys.AppLicenseUrl, PropertyKeys.AppIsActive, PropertyKeys.AppIsRequired, PropertyKeys.AppIsActivated, @@ -1356,6 +1383,8 @@ public KeyValuePair[] KnownProperties result.Add(new KeyValuePair(PropertyKeys.AppWebsite, this.Website)); result.Add(new KeyValuePair(PropertyKeys.AppDocs, this.Docs)); result.Add(new KeyValuePair(PropertyKeys.AppVersion, this.Version)); + result.Add(new KeyValuePair(PropertyKeys.AppLicense, this.License)); + result.Add(new KeyValuePair(PropertyKeys.AppLicenseUrl, this.LicenseUrl?.AbsoluteUri)); result.Add(new KeyValuePair(PropertyKeys.AppIsActive, this.IsActive)); result.Add(new KeyValuePair(PropertyKeys.AppIsRequired, this.IsRequired)); result.Add(new KeyValuePair(PropertyKeys.AppIsActivated, this.IsActivated)); @@ -1409,8 +1438,6 @@ public KeyValuePair[] UnknownProperties #endregion - - /// /// Returns a string, containing the apps typ and ID. /// diff --git a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs index 427c2b48..74754ca4 100644 --- a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs +++ b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs @@ -42,6 +42,15 @@ public object GetGroupValue(string appId, string key) return AppFacade.NameFromId(appId); case PropertyKeys.AppTyp: return AppTyps.Default; + case PropertyKeys.AppLicense: + return "unknown"; + case PropertyKeys.AppLicenseUrl: + var knownUrls = AppIndex.GetGroupValue(null, PropertyKeys.KnownLicenses) as IDictionary; + if (knownUrls == null) return null; + var license = AppIndex.GetGroupValue(appId, PropertyKeys.AppLicense) as string; + if (string.IsNullOrEmpty(license)) return null; + string knownUrl; + return knownUrls.TryGetValue(license, out knownUrl) ? knownUrl : null; case PropertyKeys.AppArchiveTyp: return AppArchiveTyps.Auto; case PropertyKeys.AppArchivePath: @@ -133,6 +142,8 @@ public bool CanGetGroupValue(string group, string name) { return name == PropertyKeys.AppTyp || name == PropertyKeys.AppLabel + || name == PropertyKeys.AppLicense + || name == PropertyKeys.AppLicenseUrl || name == PropertyKeys.AppArchiveTyp || name == PropertyKeys.AppArchivePath || name == PropertyKeys.AppPackageName diff --git a/BenchManager/BenchLib/DictionaryValueResolver.cs b/BenchManager/BenchLib/DictionaryValueResolver.cs index 965a43ad..7e648178 100644 --- a/BenchManager/BenchLib/DictionaryValueResolver.cs +++ b/BenchManager/BenchLib/DictionaryValueResolver.cs @@ -26,6 +26,8 @@ public object ResolveGroupValue(string group, string name, object value) { switch (name) { + case PropertyKeys.KnownLicenses: + return ParseKeyValuePairs(value); case PropertyKeys.CustomEnvironment: return ParseKeyValuePairs(value); default: diff --git a/BenchManager/BenchLib/PropertyKeys.cs b/BenchManager/BenchLib/PropertyKeys.cs index 6e20f6fc..e3de00a0 100644 --- a/BenchManager/BenchLib/PropertyKeys.cs +++ b/BenchManager/BenchLib/PropertyKeys.cs @@ -61,6 +61,7 @@ public static class PropertyKeys public const string AppLibIndexFileName = "AppLibIndexFileName"; public const string AppLibCustomScriptDirName = "AppLibCustomScriptDirName"; public const string AppLibResourceDirName = "AppLibResourceDirName"; + public const string KnownLicenses = "KnownLicenses"; public const string LogDir = "LogDir"; public const string LogFile = "LogFile"; public const string LogLevel = "LogLevel"; @@ -105,6 +106,8 @@ public static class PropertyKeys public const string AppInstalledVersion = "InstalledVersion"; public const string AppWebsite = "Website"; public const string AppDocs = "Docs"; + public const string AppLicense = "License"; + public const string AppLicenseUrl = "LicenseUrl"; public const string AppDependencies = "Dependencies"; public const string AppResponsibilities = "Responsibilities"; public const string AppForce = "Force"; diff --git a/docs/content/ref/app-properties.md b/docs/content/ref/app-properties.md index 8898752d..4b856952 100644 --- a/docs/content/ref/app-properties.md +++ b/docs/content/ref/app-properties.md @@ -12,6 +12,8 @@ weight = 8 | [Typ](#Typ) | all | `false` | | [Dependencies](#Dependencies) | all | `false` | | [Website](#Website) | all | `false` | +| [License](#License) | all | `false` | +| [LicenseUrl](#LicenseUrl) | all | `false` | | [Docs](#Docs) | all | `false` | | [Force](#Force) | all | `false` | | [Dir](#Dir) | all | `false` | @@ -89,6 +91,26 @@ The meaning of the different possible values is explained in [App Types](/ref/ap This URL is used to create an entry in the documentation menu in the main window of the Bench Dashboard. +## License {#License} + +* Description: A SPDX license identifier or `unknown` or `commercial`. +* Data Type: string +* Required: `false` +* Default: `unknown` +* App Types: all + +If this value is set to a SPDX identifier listed in the config property +[`KnownLicenses`](/ref/config/#KnownLicenses), +the [`LicenseUrl`](/ref/app-properties/#LicenseUrl) defaults to the associated URL. + +## LicenseUrl {#LicenseUrl} + +* Description: A URL or a relative path to a document with the license text. +* Data Type: URL +* Required: `false` +* Default: empty or SPDX license URL +* App Types: all + ## Docs {#Docs} * Description: A dictionary with documentation URLs for this program diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index 52843e68..f25d9292 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -77,6 +77,7 @@ configuration, but _can_ be overridden in the user or site configuration. | [ParallelDownloads](#ParallelDownloads) | Site | integer | 4 | | [UserName](#UserName) | User/Site | string | user | | [UserEmail](#UserEmail) | User/Site | string | user@localhost | +| [KnownLicenses](#KnownLicenses) | User/Site | dictionary | A selection from | | [AppVersionIndexDir](#AppVersionIndexDir) | User/Site | path | `$LibDir$\_versions` | | [DownloadDir](#DownloadDir) | User/Site | path | `cache` | | [AppAdornmentBaseDir](#AppAdornmentBaseDir) | User | path | `$LibDir$\_proxies` | @@ -99,6 +100,7 @@ configuration, but _can_ be overridden in the user or site configuration. | [QuickAccessCmd](#QuickAccessCmd) | User/Site | boolean | `true` | | [QuickAccessPowerShell](#QuickAccessPowerShell) | User/Site | boolean | `false` | | [QuickAccessBash](#QuickAccessBash) | User/Site | boolean | `false` | +| [DashboardSetupAppListColumns](#DashboardSetupAppListColumns) | User/Site | string list | `Order`, `Label`, `Version`, `Active`, `Deactivated`, `Status`, `Typ`, `Comment` | | [EditorApp](#EditorApp) | User/Site | string | `VSCode` | ## System Properties @@ -434,6 +436,16 @@ and in custom scripts e.g. from [Git](/apps/Bench.Git). This property is used to set the environment variable `USER_EMAIL` and in custom scripts e.g. from [Git](/apps/Bench.Git). +### KnownLicenses {#KnownLicenses} + +* Description: A dictionary with SPDX license identifiers associated with a URL. +* Data Type: dictionary +* Default: A selection from +* Type: User/Site + +If the app property `License` is set to an SPDX identifier listed in this +dictionary, the app property `LicenseUrl` defaults to the associated URL. + ### AppVersionIndexDir {#AppVersionIndexDir} * Description: The directory to store the currently installed version numbers of the apps. @@ -597,6 +609,13 @@ and in custom scripts e.g. from [Git](/apps/Bench.Git). This switch only takes affect, if the [Git app](/apps/Bench.Git) is activated. +### DashboardSetupAppListColumns {#DashboardSetupAppListColumns} + +* Description: A list with the columns to display in the setup dialog of the _BenchDashboard_. +* Data Type: string list +* Default: `Order`, `Label`, `Version`, `Active`, `Deactivated`, `Status`, `Typ`, `Comment` +* Type: User/Site + ### EditorApp {#EditorApp} * Description: The ID of an app which is used as the default text editor. diff --git a/docs/src-content/ref/app-properties.md b/docs/src-content/ref/app-properties.md index aa89f25f..dd706e19 100644 --- a/docs/src-content/ref/app-properties.md +++ b/docs/src-content/ref/app-properties.md @@ -66,6 +66,26 @@ The meaning of the different possible values is explained in [App Types](/ref/ap This URL is used to create an entry in the documentation menu in the main window of the Bench Dashboard. +## License {#License} + +* Description: A SPDX license identifier or `unknown` or `commercial`. +* Data Type: string +* Required: `false` +* Default: `unknown` +* App Types: all + +If this value is set to a SPDX identifier listed in the config property +[`KnownLicenses`](/ref/config/#KnownLicenses), +the [`LicenseUrl`](/ref/app-properties/#LicenseUrl) defaults to the associated URL. + +## LicenseUrl {#LicenseUrl} + +* Description: A URL or a relative path to a document with the license text. +* Data Type: URL +* Required: `false` +* Default: empty or SPDX license URL +* App Types: all + ## Docs {#Docs} * Description: A dictionary with documentation URLs for this program diff --git a/docs/src-content/ref/config.md b/docs/src-content/ref/config.md index 8c095302..b7e44d79 100644 --- a/docs/src-content/ref/config.md +++ b/docs/src-content/ref/config.md @@ -385,6 +385,16 @@ and in custom scripts e.g. from [Git](/apps/Bench.Git). This property is used to set the environment variable `USER_EMAIL` and in custom scripts e.g. from [Git](/apps/Bench.Git). +### KnownLicenses {#KnownLicenses} + +* Description: A dictionary with SPDX license identifiers associated with a URL. +* Data Type: dictionary +* Default: A selection from +* Type: User/Site + +If the app property `License` is set to an SPDX identifier listed in this +dictionary, the app property `LicenseUrl` defaults to the associated URL. + ### AppVersionIndexDir {#AppVersionIndexDir} * Description: The directory to store the currently installed version numbers of the apps. diff --git a/res/config.md b/res/config.md index bf943378..444c839b 100644 --- a/res/config.md +++ b/res/config.md @@ -40,6 +40,39 @@ * AppLibIndexFileName: `apps.md` * AppLibCustomScriptDirName: `scripts` * AppLibResourceDirName: `res` +* KnownLicenses: + + `AFL-1.1`: + + `AFL-1.2`: + + `AFL-2.0`: + + `AFL-2.1`: + + `AFL-3.0`: + + `Artistic-1.0`: + + `Artistic-2.0`: + + `Apache-1.1`: + + `Apache-2.0`: + + `BSD-2-Clause`: + + `BSD-3-Clause`: + + `CCDL-1.0`: + + `CPL-1.0`: + + `CPAL-1.0`: + + `EPL-1.0`: + + `GPL-2.0`: + + `GPL-3.0`: + + `AGPL-3.0`: + + `IPL-1.0`: + + `Intel`: + + `LGPL-2.0`: + + `LGPL-2.1`: + + `LGPL-3.0`: + + `MIT`: + + `MPL-1.0`: + + `MPL-1.1`: + + `MPL-2.0`: + + `MS-PL`: + + `MS-RL`: + + `OSL-1.0`: + + `OSL-2.1`: + + `OSL-3.0`: * LogDir: `log` * HomeDir: `home` * AppDataDir: `$HomeDir$\AppData\Roaming` From 31ae20bef71338cc92bcf7d24a5666500f3e0535 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 15:10:01 +0100 Subject: [PATCH 188/230] code reformat --- .../BenchLib/GroupedPropertyCollection.cs | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/BenchManager/BenchLib/GroupedPropertyCollection.cs b/BenchManager/BenchLib/GroupedPropertyCollection.cs index cc2429a5..69f8a9cb 100644 --- a/BenchManager/BenchLib/GroupedPropertyCollection.cs +++ b/BenchManager/BenchLib/GroupedPropertyCollection.cs @@ -703,47 +703,6 @@ public IEnumerable PropertyNames(string group) return groupKeys.TryGetValue(group, out keys) ? keys : (IEnumerable)new string[0]; } - private string FormatValue(string group, string name, object val, bool resolve = true) - { - if (resolve) - { - val = ResolveGroupValue(group, name, val); - } - if (val == null) - { - return "null"; - } - if (val is bool) - { - return (bool)val ? "`true`" : "`false`"; - } - if (val is string) - { - return string.Format("`{0}`", val); - } - if (val.GetType().IsArray) - { - var a = (Array)val; - var f = new string[a.Length]; - for (int i = 0; i < a.Length; i++) - { - f[i] = FormatValue(group, name, a.GetValue(i), false); - } - return "List( " + string.Join(", ", f) + " )"; - } - if (val is IDictionary) - { - var d = (IDictionary)val; - var l = new List(d.Count); - foreach (var k in d.Keys) - { - l.Add(string.Format("`{0}: {1}`", k, d[k])); - } - return "Dict( " + string.Join(", ", l.ToArray()) + " )"; - } - return "Object( " + val.ToString() + " )"; - } - /// /// Returns a string represenation of this property collection. /// @@ -789,5 +748,46 @@ public string ToString(bool resolve) } return sb.ToString().TrimStart(); } + + private string FormatValue(string group, string name, object val, bool resolve = true) + { + if (resolve) + { + val = ResolveGroupValue(group, name, val); + } + if (val == null) + { + return "null"; + } + if (val is bool) + { + return (bool)val ? "`true`" : "`false`"; + } + if (val is string) + { + return string.Format("`{0}`", val); + } + if (val.GetType().IsArray) + { + var a = (Array)val; + var f = new string[a.Length]; + for (int i = 0; i < a.Length; i++) + { + f[i] = FormatValue(group, name, a.GetValue(i), false); + } + return "List( " + string.Join(", ", f) + " )"; + } + if (val is IDictionary) + { + var d = (IDictionary)val; + var l = new List(d.Count); + foreach (var k in d.Keys) + { + l.Add(string.Format("`{0}: {1}`", k, d[k])); + } + return "Dict( " + string.Join(", ", l.ToArray()) + " )"; + } + return "Object( " + val.ToString() + " )"; + } } } From be58a83be30818ba8b6705bc8ccfed564dc66ec8 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 15:10:45 +0100 Subject: [PATCH 189/230] added support for the app license to the setup dialog --- BenchManager/BenchDashboard/AppWrapper.cs | 4 + .../BenchDashboard/SetupForm.Designer.cs | 381 +++++++++--------- BenchManager/BenchDashboard/SetupForm.cs | 10 + BenchManager/BenchDashboard/SetupForm.resx | 27 +- 4 files changed, 230 insertions(+), 192 deletions(-) diff --git a/BenchManager/BenchDashboard/AppWrapper.cs b/BenchManager/BenchDashboard/AppWrapper.cs index af260362..2ac6446a 100644 --- a/BenchManager/BenchDashboard/AppWrapper.cs +++ b/BenchManager/BenchDashboard/AppWrapper.cs @@ -43,6 +43,10 @@ public string Version } } + public string License => app.License; + + public Uri LicenseUrl => app.LicenseUrl; + public string Launcher { get { return app.Launcher; } } public int Index { get { return no; } } diff --git a/BenchManager/BenchDashboard/SetupForm.Designer.cs b/BenchManager/BenchDashboard/SetupForm.Designer.cs index 270de347..48f58b1d 100644 --- a/BenchManager/BenchDashboard/SetupForm.Designer.cs +++ b/BenchManager/BenchDashboard/SetupForm.Designer.cs @@ -29,12 +29,12 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); System.Windows.Forms.ToolStripSeparator toolStripSeparator4; System.Windows.Forms.ToolStripSeparator toolStripSeparator2; System.Windows.Forms.ToolStripSeparator toolStripSeparator3; System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetupForm)); this.tsSeparatorDownloads = new System.Windows.Forms.ToolStripSeparator(); this.splitterBottom = new System.Windows.Forms.Splitter(); @@ -50,18 +50,6 @@ private void InitializeComponent() this.lblTask = new System.Windows.Forms.Label(); this.lblTaskLabel = new System.Windows.Forms.Label(); this.gridApps = new System.Windows.Forms.DataGridView(); - this.colIcon = new System.Windows.Forms.DataGridViewImageColumn(); - this.colIndex = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colLibrary = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colID = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colCategory = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colLabel = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colVersion = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colActivated = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.colExcluded = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.colStatus = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colTyp = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colComment = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.ctxmAppActions = new System.Windows.Forms.ContextMenuStrip(this.components); this.miAppInfo = new System.Windows.Forms.ToolStripMenuItem(); this.miWebsite = new System.Windows.Forms.ToolStripMenuItem(); @@ -91,6 +79,8 @@ private void InitializeComponent() this.tsmiDownloadAllResources = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiDownloadAllAppResources = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiDeleteAllResources = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.tsmiClose = new System.Windows.Forms.ToolStripMenuItem(); this.tsmEdit = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiEditCustomConfig = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiEditCustomApps = new System.Windows.Forms.ToolStripMenuItem(); @@ -102,8 +92,19 @@ private void InitializeComponent() this.tsmiShowCustomAppIndex = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiAlwaysShowDownloads = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiRefreshView = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.tsmiClose = new System.Windows.Forms.ToolStripMenuItem(); + this.colIcon = new System.Windows.Forms.DataGridViewImageColumn(); + this.colIndex = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colLibrary = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colID = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colCategory = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colLabel = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colVersion = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colActivated = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.colExcluded = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.colStatus = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colTyp = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colLicense = new System.Windows.Forms.DataGridViewLinkColumn(); + this.colComment = new System.Windows.Forms.DataGridViewTextBoxColumn(); toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); @@ -115,6 +116,26 @@ private void InitializeComponent() this.menuStrip.SuspendLayout(); this.SuspendLayout(); // + // toolStripSeparator4 + // + toolStripSeparator4.Name = "toolStripSeparator4"; + toolStripSeparator4.Size = new System.Drawing.Size(234, 6); + // + // toolStripSeparator2 + // + toolStripSeparator2.Name = "toolStripSeparator2"; + toolStripSeparator2.Size = new System.Drawing.Size(234, 6); + // + // toolStripSeparator3 + // + toolStripSeparator3.Name = "toolStripSeparator3"; + toolStripSeparator3.Size = new System.Drawing.Size(234, 6); + // + // toolStripSeparator1 + // + toolStripSeparator1.Name = "toolStripSeparator1"; + toolStripSeparator1.Size = new System.Drawing.Size(202, 6); + // // tsSeparatorDownloads // this.tsSeparatorDownloads.Name = "tsSeparatorDownloads"; @@ -271,6 +292,7 @@ private void InitializeComponent() this.colExcluded, this.colStatus, this.colTyp, + this.colLicense, this.colComment}); this.gridApps.Dock = System.Windows.Forms.DockStyle.Fill; this.gridApps.Location = new System.Drawing.Point(0, 133); @@ -287,138 +309,6 @@ private void InitializeComponent() this.gridApps.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.gridApps_ColumnHeaderMouseClick); this.gridApps.RowContextMenuStripNeeded += new System.Windows.Forms.DataGridViewRowContextMenuStripNeededEventHandler(this.gridApps_RowContextMenuStripNeeded); // - // colIcon - // - this.colIcon.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; - this.colIcon.DataPropertyName = "StatusIcon"; - this.colIcon.Frozen = true; - this.colIcon.HeaderText = ""; - this.colIcon.Name = "colIcon"; - this.colIcon.ReadOnly = true; - this.colIcon.Width = 32; - // - // colIndex - // - this.colIndex.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colIndex.DataPropertyName = "Index"; - this.colIndex.Frozen = true; - this.colIndex.HeaderText = "Order"; - this.colIndex.Name = "colIndex"; - this.colIndex.ReadOnly = true; - this.colIndex.ToolTipText = "The index number from the app registry."; - this.colIndex.Width = 62; - // - // colLibrary - // - this.colLibrary.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colLibrary.DataPropertyName = "AppLibrary"; - dataGridViewCellStyle1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.colLibrary.DefaultCellStyle = dataGridViewCellStyle1; - this.colLibrary.HeaderText = "Library"; - this.colLibrary.Name = "colLibrary"; - this.colLibrary.ReadOnly = true; - this.colLibrary.ToolTipText = "The ID of the library, this app is defined in."; - this.colLibrary.Width = 66; - // - // colID - // - this.colID.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colID.DataPropertyName = "ID"; - dataGridViewCellStyle2.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.colID.DefaultCellStyle = dataGridViewCellStyle2; - this.colID.HeaderText = "ID"; - this.colID.Name = "colID"; - this.colID.ReadOnly = true; - this.colID.ToolTipText = "The full ID of the app including the namespace."; - this.colID.Width = 43; - // - // colCategory - // - this.colCategory.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colCategory.DataPropertyName = "Category"; - this.colCategory.HeaderText = "Category"; - this.colCategory.Name = "colCategory"; - this.colCategory.ReadOnly = true; - this.colCategory.ToolTipText = "The category of the app."; - this.colCategory.Width = 78; - // - // colLabel - // - this.colLabel.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colLabel.DataPropertyName = "Label"; - this.colLabel.HeaderText = "Label"; - this.colLabel.Name = "colLabel"; - this.colLabel.ReadOnly = true; - this.colLabel.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.colLabel.ToolTipText = "The user friendly name of the app."; - this.colLabel.Width = 59; - // - // colVersion - // - this.colVersion.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colVersion.DataPropertyName = "Version"; - this.colVersion.HeaderText = "Version"; - this.colVersion.Name = "colVersion"; - this.colVersion.ReadOnly = true; - this.colVersion.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.colVersion.ToolTipText = "The version number of the app."; - this.colVersion.Width = 70; - // - // colActivated - // - this.colActivated.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; - this.colActivated.DataPropertyName = "IsActive"; - this.colActivated.FalseValue = "inactive"; - this.colActivated.HeaderText = "Active"; - this.colActivated.IndeterminateValue = "implicit"; - this.colActivated.Name = "colActivated"; - this.colActivated.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - this.colActivated.ThreeState = true; - this.colActivated.ToolTipText = "States whether the app is activated by the user or not."; - this.colActivated.TrueValue = "active"; - this.colActivated.Width = 62; - // - // colExcluded - // - this.colExcluded.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; - this.colExcluded.DataPropertyName = "IsDeactivated"; - this.colExcluded.HeaderText = "Deactivated"; - this.colExcluded.Name = "colExcluded"; - this.colExcluded.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - this.colExcluded.ToolTipText = "States whether the app is deactivated by the user."; - this.colExcluded.Width = 92; - // - // colStatus - // - this.colStatus.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colStatus.DataPropertyName = "ShortStatus"; - this.colStatus.HeaderText = "Status"; - this.colStatus.Name = "colStatus"; - this.colStatus.ReadOnly = true; - this.colStatus.ToolTipText = "A brief description of the apps status."; - this.colStatus.Width = 64; - // - // colTyp - // - this.colTyp.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colTyp.DataPropertyName = "Typ"; - this.colTyp.HeaderText = "Typ"; - this.colTyp.Name = "colTyp"; - this.colTyp.ReadOnly = true; - this.colTyp.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.colTyp.ToolTipText = "The typ of the app."; - this.colTyp.Width = 48; - // - // colComment - // - this.colComment.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.colComment.DataPropertyName = "LongStatus"; - this.colComment.HeaderText = "Comment"; - this.colComment.MinimumWidth = 100; - this.colComment.Name = "colComment"; - this.colComment.ReadOnly = true; - this.colComment.ToolTipText = "A more detailed description of the apps status."; - // // ctxmAppActions // this.ctxmAppActions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -594,11 +484,6 @@ private void InitializeComponent() this.tsmiUpdateEnvironment.ToolTipText = "Updates the Bench environment file(s) and launchers."; this.tsmiUpdateEnvironment.Click += new System.EventHandler(this.UpdateEnvironmentHandler); // - // toolStripSeparator4 - // - toolStripSeparator4.Name = "toolStripSeparator4"; - toolStripSeparator4.Size = new System.Drawing.Size(234, 6); - // // tsmiUpdateAppLibs // this.tsmiUpdateAppLibs.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.update_apps_16; @@ -626,11 +511,6 @@ private void InitializeComponent() this.tsmiUpgradeBench.ToolTipText = "Upgrades the Bench system."; this.tsmiUpgradeBench.Click += new System.EventHandler(this.UpgradeBenchSystemHandler); // - // toolStripSeparator2 - // - toolStripSeparator2.Name = "toolStripSeparator2"; - toolStripSeparator2.Size = new System.Drawing.Size(234, 6); - // // tsmiInstallAll // this.tsmiInstallAll.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.install_16; @@ -667,11 +547,6 @@ private void InitializeComponent() this.tsmiUninstallAll.ToolTipText = "Uninstalls all apps."; this.tsmiUninstallAll.Click += new System.EventHandler(this.UninstallAllHandler); // - // toolStripSeparator3 - // - toolStripSeparator3.Name = "toolStripSeparator3"; - toolStripSeparator3.Size = new System.Drawing.Size(234, 6); - // // tsmiCleanUpObsoleteResources // this.tsmiCleanUpObsoleteResources.Image = global::Mastersign.Bench.Dashboard.Properties.Resources.cleanup_16; @@ -708,6 +583,18 @@ private void InitializeComponent() this.tsmiDeleteAllResources.ToolTipText = "Clears the app resource cache."; this.tsmiDeleteAllResources.Click += new System.EventHandler(this.DeleteAllResourcesHandler); // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(234, 6); + // + // tsmiClose + // + this.tsmiClose.Name = "tsmiClose"; + this.tsmiClose.Size = new System.Drawing.Size(237, 22); + this.tsmiClose.Text = "Clo&se"; + this.tsmiClose.Click += new System.EventHandler(this.CloseHandler); + // // tsmEdit // this.tsmEdit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -784,11 +671,6 @@ private void InitializeComponent() this.tsmiShowCustomAppIndex.Text = "&User App Library"; this.tsmiShowCustomAppIndex.Click += new System.EventHandler(this.ShowCustomAppIndexHandler); // - // toolStripSeparator1 - // - toolStripSeparator1.Name = "toolStripSeparator1"; - toolStripSeparator1.Size = new System.Drawing.Size(202, 6); - // // tsmiAlwaysShowDownloads // this.tsmiAlwaysShowDownloads.CheckOnClick = true; @@ -805,17 +687,155 @@ private void InitializeComponent() this.tsmiRefreshView.Text = "&Refresh"; this.tsmiRefreshView.Click += new System.EventHandler(this.RefreshViewHandler); // - // toolStripSeparator5 + // colIcon // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(234, 6); + this.colIcon.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; + this.colIcon.DataPropertyName = "StatusIcon"; + this.colIcon.Frozen = true; + this.colIcon.HeaderText = ""; + this.colIcon.Name = "colIcon"; + this.colIcon.ReadOnly = true; + this.colIcon.Width = 32; // - // tsmiClose + // colIndex // - this.tsmiClose.Name = "tsmiClose"; - this.tsmiClose.Size = new System.Drawing.Size(237, 22); - this.tsmiClose.Text = "Clo&se"; - this.tsmiClose.Click += new System.EventHandler(this.CloseHandler); + this.colIndex.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colIndex.DataPropertyName = "Index"; + this.colIndex.Frozen = true; + this.colIndex.HeaderText = "Order"; + this.colIndex.Name = "colIndex"; + this.colIndex.ReadOnly = true; + this.colIndex.ToolTipText = "The index number from the app registry."; + this.colIndex.Width = 62; + // + // colLibrary + // + this.colLibrary.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colLibrary.DataPropertyName = "AppLibrary"; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.colLibrary.DefaultCellStyle = dataGridViewCellStyle1; + this.colLibrary.Frozen = true; + this.colLibrary.HeaderText = "Library"; + this.colLibrary.Name = "colLibrary"; + this.colLibrary.ReadOnly = true; + this.colLibrary.ToolTipText = "The ID of the library, this app is defined in."; + this.colLibrary.Width = 66; + // + // colID + // + this.colID.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colID.DataPropertyName = "ID"; + dataGridViewCellStyle2.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.colID.DefaultCellStyle = dataGridViewCellStyle2; + this.colID.Frozen = true; + this.colID.HeaderText = "ID"; + this.colID.Name = "colID"; + this.colID.ReadOnly = true; + this.colID.ToolTipText = "The full ID of the app including the namespace."; + this.colID.Width = 43; + // + // colCategory + // + this.colCategory.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colCategory.DataPropertyName = "Category"; + this.colCategory.Frozen = true; + this.colCategory.HeaderText = "Category"; + this.colCategory.Name = "colCategory"; + this.colCategory.ReadOnly = true; + this.colCategory.ToolTipText = "The category of the app."; + this.colCategory.Width = 78; + // + // colLabel + // + this.colLabel.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colLabel.DataPropertyName = "Label"; + this.colLabel.Frozen = true; + this.colLabel.HeaderText = "Label"; + this.colLabel.Name = "colLabel"; + this.colLabel.ReadOnly = true; + this.colLabel.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colLabel.ToolTipText = "The user friendly name of the app."; + this.colLabel.Width = 59; + // + // colVersion + // + this.colVersion.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colVersion.DataPropertyName = "Version"; + this.colVersion.Frozen = true; + this.colVersion.HeaderText = "Version"; + this.colVersion.Name = "colVersion"; + this.colVersion.ReadOnly = true; + this.colVersion.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colVersion.ToolTipText = "The version number of the app."; + this.colVersion.Width = 70; + // + // colActivated + // + this.colActivated.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.colActivated.DataPropertyName = "IsActive"; + this.colActivated.FalseValue = "inactive"; + this.colActivated.Frozen = true; + this.colActivated.HeaderText = "Active"; + this.colActivated.IndeterminateValue = "implicit"; + this.colActivated.Name = "colActivated"; + this.colActivated.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.colActivated.ThreeState = true; + this.colActivated.ToolTipText = "States whether the app is activated by the user or not."; + this.colActivated.TrueValue = "active"; + this.colActivated.Width = 62; + // + // colExcluded + // + this.colExcluded.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.colExcluded.DataPropertyName = "IsDeactivated"; + this.colExcluded.Frozen = true; + this.colExcluded.HeaderText = "Deactivated"; + this.colExcluded.Name = "colExcluded"; + this.colExcluded.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.colExcluded.ToolTipText = "States whether the app is deactivated by the user."; + this.colExcluded.Width = 92; + // + // colStatus + // + this.colStatus.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colStatus.DataPropertyName = "ShortStatus"; + this.colStatus.Frozen = true; + this.colStatus.HeaderText = "Status"; + this.colStatus.Name = "colStatus"; + this.colStatus.ReadOnly = true; + this.colStatus.ToolTipText = "A brief description of the apps status."; + this.colStatus.Width = 64; + // + // colTyp + // + this.colTyp.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colTyp.DataPropertyName = "Typ"; + this.colTyp.Frozen = true; + this.colTyp.HeaderText = "Typ"; + this.colTyp.Name = "colTyp"; + this.colTyp.ReadOnly = true; + this.colTyp.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colTyp.ToolTipText = "The typ of the app."; + this.colTyp.Width = 48; + // + // colLicense + // + this.colLicense.DataPropertyName = "License"; + this.colLicense.Frozen = true; + this.colLicense.HeaderText = "License"; + this.colLicense.Name = "colLicense"; + this.colLicense.ReadOnly = true; + this.colLicense.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // colComment + // + this.colComment.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.colComment.DataPropertyName = "LongStatus"; + this.colComment.HeaderText = "Comment"; + this.colComment.MinimumWidth = 100; + this.colComment.Name = "colComment"; + this.colComment.ReadOnly = true; + this.colComment.ToolTipText = "A more detailed description of the apps status."; // // SetupForm // @@ -902,6 +922,10 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem miAppInfo; private System.Windows.Forms.ToolStripMenuItem tsmiUpgradeBench; private System.Windows.Forms.ToolStripMenuItem tsmiColumns; + private System.Windows.Forms.ToolStripMenuItem tsmiUpdateBench; + private System.Windows.Forms.ToolStripMenuItem tsmiUpdateAppLibs; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripMenuItem tsmiClose; private System.Windows.Forms.DataGridViewImageColumn colIcon; private System.Windows.Forms.DataGridViewTextBoxColumn colIndex; private System.Windows.Forms.DataGridViewTextBoxColumn colLibrary; @@ -913,10 +937,7 @@ private void InitializeComponent() private System.Windows.Forms.DataGridViewCheckBoxColumn colExcluded; private System.Windows.Forms.DataGridViewTextBoxColumn colStatus; private System.Windows.Forms.DataGridViewTextBoxColumn colTyp; + private System.Windows.Forms.DataGridViewLinkColumn colLicense; private System.Windows.Forms.DataGridViewTextBoxColumn colComment; - private System.Windows.Forms.ToolStripMenuItem tsmiUpdateBench; - private System.Windows.Forms.ToolStripMenuItem tsmiUpdateAppLibs; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; - private System.Windows.Forms.ToolStripMenuItem tsmiClose; } } \ No newline at end of file diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index 6b965667..28c01464 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -759,6 +759,16 @@ private void gridApps_CellContentClick(object sender, DataGridViewCellEventArgs core.SetAppDeactivated(appWrapper.ID, !appWrapper.App.IsDeactivated); } } + if (col == colLicense) + { + var row = gridApps.Rows[e.RowIndex]; + var appWrapper = row.DataBoundItem as AppWrapper; + var url = appWrapper.LicenseUrl; + if (url != null) + { + System.Diagnostics.Process.Start(url.AbsoluteUri); + } + } } private void gridApps_CellDoubleClick(object sender, DataGridViewCellEventArgs e) diff --git a/BenchManager/BenchDashboard/SetupForm.resx b/BenchManager/BenchDashboard/SetupForm.resx index 2b905ade..52d18c8d 100644 --- a/BenchManager/BenchDashboard/SetupForm.resx +++ b/BenchManager/BenchDashboard/SetupForm.resx @@ -117,6 +117,18 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + False + + + False + + + False + + + False + True @@ -150,6 +162,9 @@ True + + True + True @@ -162,18 +177,6 @@ 17, 17 - - False - - - False - - - False - - - False - 62 From 63675e33230ff86269d7cfd0f9a1330d77aa7fa7 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 15:10:56 +0100 Subject: [PATCH 190/230] added support for app license to app info dialog --- .../BenchDashboard/AppInfoDialog.Designer.cs | 73 +++++++++++++------ BenchManager/BenchDashboard/AppInfoDialog.cs | 17 +++++ 2 files changed, 68 insertions(+), 22 deletions(-) diff --git a/BenchManager/BenchDashboard/AppInfoDialog.Designer.cs b/BenchManager/BenchDashboard/AppInfoDialog.Designer.cs index 70842cbf..2a423181 100644 --- a/BenchManager/BenchDashboard/AppInfoDialog.Designer.cs +++ b/BenchManager/BenchDashboard/AppInfoDialog.Designer.cs @@ -31,6 +31,8 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AppInfoDialog)); this.lblAppId = new System.Windows.Forms.Label(); this.tabControl = new System.Windows.Forms.TabControl(); + this.tabDocumentation = new System.Windows.Forms.TabPage(); + this.mdDocumentation = new Mastersign.Bench.Dashboard.MarkdownControl(); this.tabResolved = new System.Windows.Forms.TabPage(); this.gridResolved = new System.Windows.Forms.DataGridView(); this.colName = new System.Windows.Forms.DataGridViewTextBoxColumn(); @@ -39,24 +41,26 @@ private void InitializeComponent() this.gridRaw = new System.Windows.Forms.DataGridView(); this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.tabDocumentation = new System.Windows.Forms.TabPage(); - this.mdDocumentation = new Mastersign.Bench.Dashboard.MarkdownControl(); + this.panelHead = new System.Windows.Forms.Panel(); + this.llblLicense = new System.Windows.Forms.LinkLabel(); this.tabControl.SuspendLayout(); + this.tabDocumentation.SuspendLayout(); this.tabResolved.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.gridResolved)).BeginInit(); this.tabRaw.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.gridRaw)).BeginInit(); - this.tabDocumentation.SuspendLayout(); + this.panelHead.SuspendLayout(); this.SuspendLayout(); // // lblAppId // - this.lblAppId.Dock = System.Windows.Forms.DockStyle.Top; + this.lblAppId.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.lblAppId.Font = new System.Drawing.Font("Segoe UI", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblAppId.Location = new System.Drawing.Point(0, 0); this.lblAppId.Name = "lblAppId"; this.lblAppId.Padding = new System.Windows.Forms.Padding(4); - this.lblAppId.Size = new System.Drawing.Size(433, 48); + this.lblAppId.Size = new System.Drawing.Size(366, 48); this.lblAppId.TabIndex = 1; this.lblAppId.Text = ""; // @@ -72,6 +76,25 @@ private void InitializeComponent() this.tabControl.Size = new System.Drawing.Size(433, 465); this.tabControl.TabIndex = 2; // + // tabDocumentation + // + this.tabDocumentation.Controls.Add(this.mdDocumentation); + this.tabDocumentation.Location = new System.Drawing.Point(4, 22); + this.tabDocumentation.Name = "tabDocumentation"; + this.tabDocumentation.Padding = new System.Windows.Forms.Padding(3); + this.tabDocumentation.Size = new System.Drawing.Size(425, 439); + this.tabDocumentation.TabIndex = 2; + this.tabDocumentation.Text = "Documentation"; + this.tabDocumentation.UseVisualStyleBackColor = true; + // + // mdDocumentation + // + this.mdDocumentation.Dock = System.Windows.Forms.DockStyle.Fill; + this.mdDocumentation.Location = new System.Drawing.Point(3, 3); + this.mdDocumentation.Name = "mdDocumentation"; + this.mdDocumentation.Size = new System.Drawing.Size(419, 433); + this.mdDocumentation.TabIndex = 0; + // // tabResolved // this.tabResolved.Controls.Add(this.gridResolved); @@ -168,24 +191,27 @@ private void InitializeComponent() this.dataGridViewTextBoxColumn2.Name = "dataGridViewTextBoxColumn2"; this.dataGridViewTextBoxColumn2.ReadOnly = true; // - // tabDocumentation + // panelHead // - this.tabDocumentation.Controls.Add(this.mdDocumentation); - this.tabDocumentation.Location = new System.Drawing.Point(4, 22); - this.tabDocumentation.Name = "tabDocumentation"; - this.tabDocumentation.Padding = new System.Windows.Forms.Padding(3); - this.tabDocumentation.Size = new System.Drawing.Size(425, 439); - this.tabDocumentation.TabIndex = 2; - this.tabDocumentation.Text = "Documentation"; - this.tabDocumentation.UseVisualStyleBackColor = true; + this.panelHead.Controls.Add(this.llblLicense); + this.panelHead.Controls.Add(this.lblAppId); + this.panelHead.Dock = System.Windows.Forms.DockStyle.Top; + this.panelHead.Location = new System.Drawing.Point(0, 0); + this.panelHead.Name = "panelHead"; + this.panelHead.Size = new System.Drawing.Size(433, 48); + this.panelHead.TabIndex = 3; // - // mdDocumentation + // llblLicense // - this.mdDocumentation.Dock = System.Windows.Forms.DockStyle.Fill; - this.mdDocumentation.Location = new System.Drawing.Point(3, 3); - this.mdDocumentation.Name = "mdDocumentation"; - this.mdDocumentation.Size = new System.Drawing.Size(419, 433); - this.mdDocumentation.TabIndex = 0; + this.llblLicense.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.llblLicense.Location = new System.Drawing.Point(372, 9); + this.llblLicense.Name = "llblLicense"; + this.llblLicense.Size = new System.Drawing.Size(49, 13); + this.llblLicense.TabIndex = 2; + this.llblLicense.TabStop = true; + this.llblLicense.Text = "License"; + this.llblLicense.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.llblLicense.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LicenseHandler); // // AppInfoDialog // @@ -193,18 +219,19 @@ private void InitializeComponent() this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(433, 513); this.Controls.Add(this.tabControl); - this.Controls.Add(this.lblAppId); + this.Controls.Add(this.panelHead); this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "AppInfoDialog"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "App Info"; this.tabControl.ResumeLayout(false); + this.tabDocumentation.ResumeLayout(false); this.tabResolved.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.gridResolved)).EndInit(); this.tabRaw.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.gridRaw)).EndInit(); - this.tabDocumentation.ResumeLayout(false); + this.panelHead.ResumeLayout(false); this.ResumeLayout(false); } @@ -222,5 +249,7 @@ private void InitializeComponent() private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn2; private System.Windows.Forms.TabPage tabDocumentation; private MarkdownControl mdDocumentation; + private System.Windows.Forms.Panel panelHead; + private System.Windows.Forms.LinkLabel llblLicense; } } \ No newline at end of file diff --git a/BenchManager/BenchDashboard/AppInfoDialog.cs b/BenchManager/BenchDashboard/AppInfoDialog.cs index 5800ef42..61b7976d 100644 --- a/BenchManager/BenchDashboard/AppInfoDialog.cs +++ b/BenchManager/BenchDashboard/AppInfoDialog.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Data; +using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; @@ -18,6 +19,7 @@ public AppInfoDialog(BenchConfiguration config, AppFacade app) gridResolved.DoubleBuffered(true); lblAppId.Text = app.Label; LoadProperties(config, app); + LoadLicense(app); LoadDocumentation(app); } @@ -75,6 +77,12 @@ private void AddRow(DataGridView grid, string name, string value) grid.Rows.Add(name, value); } + private void LoadLicense(AppFacade app) + { + llblLicense.Tag = app.LicenseUrl; + llblLicense.Visible = llblLicense.Tag != null; + } + private void LoadDocumentation(AppFacade app) { var docText = app.MarkdownDocumentation; @@ -87,5 +95,14 @@ private void LoadDocumentation(AppFacade app) tabControl.TabPages.Remove(tabDocumentation); } } + + private void LicenseHandler(object sender, LinkLabelLinkClickedEventArgs e) + { + var url = ((Control)sender).Tag as Uri; + if (url != null) + { + Process.Start(url.AbsoluteUri); + } + } } } From 7c4a879b11477599be4df9187852f7b18ca4e113 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 15:11:17 +0100 Subject: [PATCH 191/230] attempt to improve main form load behavior (delayed icon loading) --- .../BenchDashboard/AppLauncherControl.cs | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/BenchManager/BenchDashboard/AppLauncherControl.cs b/BenchManager/BenchDashboard/AppLauncherControl.cs index 5195c9fb..7967c227 100644 --- a/BenchManager/BenchDashboard/AppLauncherControl.cs +++ b/BenchManager/BenchDashboard/AppLauncherControl.cs @@ -16,6 +16,17 @@ public partial class AppLauncherControl : UserControl public AppLauncherControl() { InitializeComponent(); + VisibleChanged += VisibleChangedHandler; + } + + private void VisibleChangedHandler(object sender, EventArgs e) + { + if (!Visible) return; + if (listView.Items.Count > 0 && icons32.Images.Count == 0) + { + Application.DoEvents(); + LoadIconImages(); + } } public Core Core { get; set; } @@ -32,10 +43,20 @@ public AppIndexFacade AppIndex } } - private async void BindAppIndex() + private void BindAppIndex() { icons16.Images.Clear(); icons32.Images.Clear(); + listView.Items.Clear(); + var items = from app in appIndex.ActiveApps + where app.Launcher != null + select AppItem(app); + listView.Items.AddRange(items.ToArray()); + if (Visible) LoadIconImages(); + } + + private async void LoadIconImages() + { foreach (var app in appIndex.ActiveApps) { if (app.Launcher != null) @@ -45,11 +66,6 @@ private async void BindAppIndex() icons32.Images.Add(app.ID, icons.Item2); } } - listView.Items.Clear(); - var items = from app in appIndex.ActiveApps - where app.Launcher != null - select AppItem(app); - listView.Items.AddRange(items.ToArray()); } private ListViewItem AppItem(AppFacade app) From f114102c09f634bf05a34ef1a8dc70f68adea11b Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sat, 14 Jan 2017 15:13:58 +0100 Subject: [PATCH 192/230] updated changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e933853c..1d53491b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ Add a link to the GitHub diff like + `UpdateUrlTemplate` + `BootstrapUrlTemplate` + `AutoUpdateCheck` + + `KnownLicenses` - Support for multiple app libraries ([#90](https://github.com/mastersign/bench/issues/90)) - Namespaces for app IDs @@ -46,8 +47,15 @@ Add a link to the GitHub diff like + `AppLibIndexFileName` + `AppLibCustomScriptDirName` + `AppLibResourceDirName` + + `License` + + `LicenseUrl` - _Update App Libraries and Apps_ entry in the _Setup_ menu of the setup dialog of _BenchDashboard_ - Markdown info text in the app info dialog +- License link to the app info dialog +- Additional columns to the setup dialog + + Category + + Library + + License ### Changed - Upgrade process is using the _Bench CLI_ now From 8c3a4b6a34639574fc9b6523fe79d8114443a9ca Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sun, 15 Jan 2017 14:22:35 +0100 Subject: [PATCH 193/230] streamlined check for valid Bench root path --- .../BenchCLI/Commands/BenchCommand.cs | 2 +- BenchManager/BenchDashboard/Program.cs | 2 +- BenchManager/BenchLib/BenchConfiguration.cs | 34 ++++++++++++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/BenchManager/BenchCLI/Commands/BenchCommand.cs b/BenchManager/BenchCLI/Commands/BenchCommand.cs index 83ec2a05..b07b71ad 100644 --- a/BenchManager/BenchCLI/Commands/BenchCommand.cs +++ b/BenchManager/BenchCLI/Commands/BenchCommand.cs @@ -37,7 +37,7 @@ protected static string BenchBinDirPath() protected static string DefaultRootPath() { var rootPath = Path.GetFullPath(Path.Combine(Path.Combine(BenchBinDirPath(), ".."), "..")); - return File.Exists(Path.Combine(rootPath, @"auto\lib\bench.lib.ps1")) ? rootPath : null; + return BenchConfiguration.IsValidBenchRoot(rootPath) ? rootPath : null; } protected static string DashboardExecutable(string rootDir = null) diff --git a/BenchManager/BenchDashboard/Program.cs b/BenchManager/BenchDashboard/Program.cs index 60e08946..f5bfa2f3 100644 --- a/BenchManager/BenchDashboard/Program.cs +++ b/BenchManager/BenchDashboard/Program.cs @@ -80,7 +80,7 @@ private static string GetBenchRoot(string[] args) var assemblyName = Assembly.GetExecutingAssembly().GetName(); var codeBase = new Uri(assemblyName.CodeBase).LocalPath; var rootPath = Path.GetFullPath(Path.Combine(Path.Combine(Path.GetDirectoryName(codeBase), ".."), "..")); - return File.Exists(Path.Combine(rootPath, @"res\apps.md")) ? rootPath : null; + return BenchConfiguration.IsValidBenchRoot(rootPath) ? rootPath : null; } private static bool IsImmediateSetupRequested(string[] args) diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index 20eca5c5..a0e3324a 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -55,6 +55,38 @@ public class BenchConfiguration : ResolvingPropertyCollection /// public const string CONFIG_FILE = @"res\config.md"; + /// + /// The relative path of the PowerShell API library file. + /// + public const string MAIN_PS_LIB_FILE = @"auto\lib\bench.lib.ps1"; + + private static readonly string[] BENCH_CHECK_FILES = new[] + { + CONFIG_FILE, + MAIN_PS_LIB_FILE, + }; + + /// + /// Checks if the given path is a valid root path of a Bench environment. + /// + /// The absolute path to a possible Bench environment. + /// true if the given path is a path to a valid Bench environment. + public static bool IsValidBenchRoot(string possibleBenchRootPath) + { + if (possibleBenchRootPath == null) + throw new ArgumentNullException(nameof(possibleBenchRootPath)); + if (!Path.IsPathRooted(possibleBenchRootPath)) + throw new ArgumentException("The given path is not absolute."); + if (!Directory.Exists(possibleBenchRootPath)) + return false; + foreach (var path in BENCH_CHECK_FILES) + { + var absolutePath = Path.Combine(possibleBenchRootPath, path); + if (!File.Exists(absolutePath)) return false; + } + return true; + } + /// /// The property group category, which contains app definitions of required apps. /// @@ -244,7 +276,7 @@ public string[] FindSiteConfigFiles() /// otherwise optional and non existing files are listed to. /// A list with configuration file descriptors. public ConfigurationFile[] GetConfigurationFiles( - ConfigurationFileType type = ConfigurationFileType.All, + ConfigurationFileType type = ConfigurationFileType.All, bool actuallyLoaded = false, bool mustExist = true) { if (actuallyLoaded) mustExist = true; From da8ee1393cfe1616e313fde620265b6242c8bed9 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sun, 15 Jan 2017 14:22:42 +0100 Subject: [PATCH 194/230] fixed setup for config file watcher, if files are missing --- BenchManager/BenchDashboard/Core.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/BenchManager/BenchDashboard/Core.cs b/BenchManager/BenchDashboard/Core.cs index 98cab285..84712396 100644 --- a/BenchManager/BenchDashboard/Core.cs +++ b/BenchManager/BenchDashboard/Core.cs @@ -138,8 +138,11 @@ private void OnActionStateChanged() private void SetupFileWatchers() { DisposeFileWatchers(); - var paths = Config.Sources; + var paths = Config.GetConfigurationFiles( + ConfigurationFileType.UserConfig | ConfigurationFileType.SiteConfig, + true, true); fsWatchers = paths + .Select(p => p.Path) .Select(p => new FileSystemWatcher(Path.GetDirectoryName(p)) { Filter = Path.GetFileName(p), From 97519978dd00c1f3e38d733b2f56a06b7688b35f Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sun, 15 Jan 2017 15:07:03 +0100 Subject: [PATCH 195/230] improved activation file editing (included automatic cleanup of redundant entries) --- BenchManager/BenchLib/ActivationFile.cs | 30 +++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/BenchManager/BenchLib/ActivationFile.cs b/BenchManager/BenchLib/ActivationFile.cs index 08ec52f5..ac9f1d7e 100644 --- a/BenchManager/BenchLib/ActivationFile.cs +++ b/BenchManager/BenchLib/ActivationFile.cs @@ -42,6 +42,8 @@ public class ActivationFile : IEnumerable private static readonly Regex DisabledExp = new Regex(@"^#\s*(?\S+)(?\s+.+?)?\s*$"); + private static readonly Regex EnabledExp = new Regex(@"^\s*(?\S+)(?\s+.+?)?\s*$"); + private readonly string FilePath; /// @@ -91,16 +93,22 @@ private static IEnumerable Activator(IEnumerable lines, string i var found = false; foreach (var l in lines) { - var m = DisabledExp.Match(l); + var line = l.Trim(); + var m = DisabledExp.Match(line); if (m.Success && m.Groups["id"].Value == id) { + if (found) continue; yield return id + m.Groups["comment"].Value; found = true; + continue; } - else + m = EnabledExp.Match(line); + if (m.Success && m.Groups["id"].Value == id) { - yield return l; + if (found) continue; + found = true; } + yield return l; } if (!found) { @@ -110,17 +118,25 @@ private static IEnumerable Activator(IEnumerable lines, string i private static IEnumerable Deactivator(IEnumerable lines, string id) { + var found = false; foreach (var l in lines) { var line = l.Trim(); - if (IsValidLine(line) && CleanLine(line) == id) + var m = EnabledExp.Match(l); + if (m.Success && m.Groups["id"].Value == id) { - yield return "# " + l; + if (found) continue; + yield return "# " + line; + found = true; + continue; } - else + m = DisabledExp.Match(line); + if (m.Success && m.Groups["id"].Value == id) { - yield return l; + if (found) continue; + found = true; } + yield return l; } } From 666cf0ddf79392abb33613be7f33e020f1b9c1df Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Sun, 15 Jan 2017 15:09:05 +0100 Subject: [PATCH 196/230] added Mastersign.Sequence to enable a more expressive code style in CLR 2 assemblies --- BenchManager/BenchCLI/BenchCLI.csproj | 7 +++++++ BenchManager/BenchCLI/packages.config | 4 ++++ BenchManager/BenchDashboard/Core.cs | 5 ++++- BenchManager/BenchLib/BenchLib.csproj | 4 ++++ BenchManager/BenchLib/packages.config | 1 + build/build.ps1 | 1 + 6 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 BenchManager/BenchCLI/packages.config diff --git a/BenchManager/BenchCLI/BenchCLI.csproj b/BenchManager/BenchCLI/BenchCLI.csproj index f4d9a00f..951b554e 100644 --- a/BenchManager/BenchCLI/BenchCLI.csproj +++ b/BenchManager/BenchCLI/BenchCLI.csproj @@ -40,6 +40,10 @@ logo.ico + + ..\packages\Mastersign.Sequence.1.0.0\lib\net20\Mastersign.Sequence.dll + True + @@ -120,6 +124,9 @@ + + + **Overview** -* [Folder Layout](#fs) +* [File System Layout](#fs) * [Bench Core Binary](#core) * [Command Line Interface](#cli) * [Bench Dashboard](#dashboard) * [Power-Shell Scripts](#ps-scripts) +* [CMD Scripts](#cmd-scripts) +* [App Libraries](#app-libs) +* [Configuration Levels](#config) ![Architecture Overview](/img/architecture.svg) -[Dependency Diagram](/img/dependencies.svg) - -## Folder Layout {#fs} +## File System Layout {#fs} Bench uses a file system layout with three folder groups. For a detailed description of the file structure see: [File Structure Reference](/ref/file-structure). @@ -42,10 +45,10 @@ and user data. This group is not changed by any Bench operation like upgrade, app installation, or app removal. -[`archive`](/ref/file-structure/#archive-dir), [`config`](/ref/file-structure/#config-dir), [`home`](/ref/file-structure/#home-dir), [`projects`](/ref/file-structure/#projects-dir), +[`archive`](/ref/file-structure/#archive-dir), [`log`](/ref/file-structure/#log-dir), [`bench-site.md`](/ref/file-structure/#bench-site) @@ -56,8 +59,9 @@ This group can be deleted without any actual data loss, because it is rebuild by Bench during the app installation automatically. -[`launcher`](/ref/file-structure/#launcher-dir), +[`cache`](/ref/file-structure/#cache-dir), [`lib`](/ref/file-structure/#lib-dir), +[`launcher`](/ref/file-structure/#launcher-dir), [`tmp`](/ref/file-structure/#tmp-dir), [`env.cmd`](/ref/file-structure/#env), `BenchDashboard.lnk` @@ -72,15 +76,9 @@ and removing apps according to the loaded configuration. ## Command Line Interface {#cli} Bench provides a command line interface via the [`bench.exe`](/ref/bench-cli). -It allow to manage and interact with the Bench environment. +It allows to manage and interact with the Bench environment. The _Bench CLI_ depends on the _Bench Core_. -Additionally there are three CMD batch scripts for launching -a shell in the Bench environment: -`bench-cmd.cmd`, `bench-ps.cmd`, and `bench-bash.cmd`. -These scripts depend on the `env.cmd` in the Bench root directory -for loading the environment variables. - ## Bench Dashboard {#dashboard} The dashboard is a program with a [graphical user interface](/ref/dashboard) which makes the various features of the Bench system available @@ -91,11 +89,45 @@ The _Bench Dashboard_ depends on the _Bench Core_. Some features are implemented by PowerShell scripts. They load the `BenchLib.dll` and call its public methods. -One important feature, implemented by PowerShell scripts, is the +Two important features, implemented by PowerShell scripts, are the [execution adornment](/guide/isolation/#execution-adornment) and the [registry isolation](/guide/isolation/#registry-isolation). -In both cases, the an execution proxy in +In both cases, an execution proxy in [`lib\_proxies`](/ref/file-structure/#lib-proxies-dir) -calls `Run-Adorned.ps1` to execute pre- and post-execution scripts -and perform the registry isolation with `reg.lib.ps1`. +calls `Run-Adorned.ps1` to execute pre- and post-execution scripts. +The registry isolation is implemented as a couple of functions in `reg.lib.ps1`. + +## CMD Scripts {#cmd-scripts} +There are three CMD batch scripts for launching +a shell in the Bench environment: +`bench-cmd.cmd`, `bench-ps.cmd`, and `bench-bash.cmd`. +These scripts depend on the `env.cmd` in the Bench root directory +for loading the environment variables. + +## App Libraries {#app-libs} +The knowledge about app resources and thier installation strategy is +stored in [app libraries](/ref/app-library). +An app library contains an index with the [app properties](/ref/app-properties) +and optionally PowerShell scripts for customization of setup steps +and execution adornment. + +App libraries are hosted independently and are [referenced](/ref/config/#AppLibs) +in the Bench configuration. +The [user configuration](/ref/file-structure/#config-dir) is also an app library. +It is called the _user app library_, and contains app descriptions +written by the user. + +## Configuration Levels {#config} +Bench supports three levels of configuration: + +1. The [default configuration](/ref/file-structure/#res-config), + which comes with the Bench installation and should not be edited. +2. The [user configuration](/ref/file-structure/#config-config), + which can be versioned and shared via Git. +3. And the [site configuration](/ref/file-structure/#bench-site), + which can be stored outside of the Bench environment + and can take influence on multiple Bench environments. + +Configuration files are written in [Markdown list syntax](/ref/markup-syntax/) +and support a number of [configuration properties](/ref/config). diff --git a/docs/src-content/guide/architecture.md b/docs/src-content/guide/architecture.md index d3a90f08..14f04467 100644 --- a/docs/src-content/guide/architecture.md +++ b/docs/src-content/guide/architecture.md @@ -5,8 +5,10 @@ title = "System Architecture" weight = 1 +++ -The Bench system consists of a file system layout, a CLR binary, a CLI, -the Dashboard and a couple of CMD batch and PowerShell scripts. +The Bench system consists of a [file system layout](#fs), binaries for +[Core Library](#core), [Command Line Interface](#cli), and [Dashboard](#dashboard), +a couple of [PowerShell](#ps-scripts)/[CMD](#cmd-scripts) scripts, +the [app libraries](#app-libs), and the [configuration](#config). Since the architecture is constantly evolving until Bench hits the version 1.0 this article contains only a brief description of the current state. @@ -17,9 +19,7 @@ this article contains only a brief description of the current state. ![Architecture Overview](/img/architecture.svg) -[Dependency Diagram](/img/dependencies.svg) - -## Folder Layout {#fs} +## File System Layout {#fs} Bench uses a file system layout with three folder groups. For a detailed description of the file structure see: [File Structure Reference](/ref/file-structure). @@ -38,10 +38,10 @@ and user data. This group is not changed by any Bench operation like upgrade, app installation, or app removal. -[`archive`](/ref/file-structure/#archive-dir), [`config`](/ref/file-structure/#config-dir), [`home`](/ref/file-structure/#home-dir), [`projects`](/ref/file-structure/#projects-dir), +[`archive`](/ref/file-structure/#archive-dir), [`log`](/ref/file-structure/#log-dir), [`bench-site.md`](/ref/file-structure/#bench-site) @@ -52,8 +52,9 @@ This group can be deleted without any actual data loss, because it is rebuild by Bench during the app installation automatically. -[`launcher`](/ref/file-structure/#launcher-dir), +[`cache`](/ref/file-structure/#cache-dir), [`lib`](/ref/file-structure/#lib-dir), +[`launcher`](/ref/file-structure/#launcher-dir), [`tmp`](/ref/file-structure/#tmp-dir), [`env.cmd`](/ref/file-structure/#env), `BenchDashboard.lnk` @@ -68,15 +69,9 @@ and removing apps according to the loaded configuration. ## Command Line Interface {#cli} Bench provides a command line interface via the [`bench.exe`](/ref/bench-cli). -It allow to manage and interact with the Bench environment. +It allows to manage and interact with the Bench environment. The _Bench CLI_ depends on the _Bench Core_. -Additionally there are three CMD batch scripts for launching -a shell in the Bench environment: -`bench-cmd.cmd`, `bench-ps.cmd`, and `bench-bash.cmd`. -These scripts depend on the `env.cmd` in the Bench root directory -for loading the environment variables. - ## Bench Dashboard {#dashboard} The dashboard is a program with a [graphical user interface](/ref/dashboard) which makes the various features of the Bench system available @@ -87,11 +82,45 @@ The _Bench Dashboard_ depends on the _Bench Core_. Some features are implemented by PowerShell scripts. They load the `BenchLib.dll` and call its public methods. -One important feature, implemented by PowerShell scripts, is the +Two important features, implemented by PowerShell scripts, are the [execution adornment](/guide/isolation/#execution-adornment) and the [registry isolation](/guide/isolation/#registry-isolation). -In both cases, the an execution proxy in +In both cases, an execution proxy in [`lib\_proxies`](/ref/file-structure/#lib-proxies-dir) -calls `Run-Adorned.ps1` to execute pre- and post-execution scripts -and perform the registry isolation with `reg.lib.ps1`. +calls `Run-Adorned.ps1` to execute pre- and post-execution scripts. +The registry isolation is implemented as a couple of functions in `reg.lib.ps1`. + +## CMD Scripts {#cmd-scripts} +There are three CMD batch scripts for launching +a shell in the Bench environment: +`bench-cmd.cmd`, `bench-ps.cmd`, and `bench-bash.cmd`. +These scripts depend on the `env.cmd` in the Bench root directory +for loading the environment variables. + +## App Libraries {#app-libs} +The knowledge about app resources and thier installation strategy is +stored in [app libraries](/ref/app-library). +An app library contains an index with the [app properties](/ref/app-properties) +and optionally PowerShell scripts for customization of setup steps +and execution adornment. + +App libraries are hosted independently and are [referenced](/ref/config/#AppLibs) +in the Bench configuration. +The [user configuration](/ref/file-structure/#config-dir) is also an app library. +It is called the _user app library_, and contains app descriptions +written by the user. + +## Configuration Levels {#config} +Bench supports three levels of configuration: + +1. The [default configuration](/ref/file-structure/#res-config), + which comes with the Bench installation and should not be edited. +2. The [user configuration](/ref/file-structure/#config-config), + which can be versioned and shared via Git. +3. And the [site configuration](/ref/file-structure/#bench-site), + which can be stored outside of the Bench environment + and can take influence on multiple Bench environments. + +Configuration files are written in [Markdown list syntax](/ref/markup-syntax/) +and support a number of [configuration properties](/ref/config). diff --git a/docs/static/img/architecture.svg b/docs/static/img/architecture.svg index 9c2dcb95..73b44718 100644 --- a/docs/static/img/architecture.svg +++ b/docs/static/img/architecture.svg @@ -22,7 +22,7 @@ + gradientTransform="matrix(3.8295501,0,0,0.9998698,5375.4845,2869.5773)"> + - - - @@ -194,7 +193,7 @@ pointer-events="none" id="rect4712" /> Dashboard + id="path4720" + sodipodi:nodetypes="cccc" /> + id="path4736" + sodipodi:nodetypes="cccc" /> + id="path4740" + sodipodi:nodetypes="cccc" /> Apps - - Interface Scripts + id="tspan5000">CLI App Library + id="tspan5008">User App Library User App Library + id="tspan5010">App Libraries + id="path4788" + sodipodi:nodetypes="ccc" /> @@ -438,7 +427,7 @@ id="g4794"> @@ -470,7 +459,7 @@ pointer-events="none" id="rect4804" /> Launcher + + + From 83465a9292d547802e3571c82522f59c0365f513 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 20 Jan 2017 12:12:47 +0100 Subject: [PATCH 205/230] changed syntax for diff references in changelog --- CHANGELOG.md | 139 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d53491b..79a476e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,11 +18,12 @@ This document follows the guidelines in http://keepachangelog.md. Use the following change groups: Added, Changed, Deprecated, Removed, Fixed, Security Add a link to the GitHub diff like -[Full Changelog](https://github.com/mastersign/bench/compare/v...v) +[]: https://github.com/mastersign/bench/compare/v...v --> ## [Unreleased] -[Dev Changes](https://github.com/mastersign/bench/compare/master...dev), + +[Unreleased]: https://github.com/mastersign/bench/compare/master...dev ### Added - Bench CLI @@ -82,7 +83,8 @@ Add a link to the GitHub diff like + `AppResourceBaseDir` ## [0.13.3] - 2016-11-19 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.13.2...v0.13.3) + +[0.13.3]: https://github.com/mastersign/bench/compare/v0.13.2...v0.13.3 ### Added - Support for second argument `verbose` in `bench-ctl` @@ -97,7 +99,8 @@ Add a link to the GitHub diff like ([#86](https://github.com/mastersign/bench/issues/86)) ## [0.13.2] - 2016-10-22 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.13.1...v0.13.2) + +[0.13.2]: https://github.com/mastersign/bench/compare/v0.13.1...v0.13.2 ### Fixed - Switched from expanded strings to simple strings when setting @@ -105,7 +108,8 @@ Add a link to the GitHub diff like ([#82](https://github.com/mastersign/bench/issues/82)) ## [0.13.1] - 2016-10-19 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.13.0...v0.13.1) + +[0.13.1]: https://github.com/mastersign/bench/compare/v0.13.0...v0.13.1 ### Added - Added Scribus @@ -127,7 +131,8 @@ Add a link to the GitHub diff like - Update: Blender from 2.77a to 2.78 ## [0.13.0] - 2016-08-16 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.12.1...v0.13.0) + +[0.13.0]: https://github.com/mastersign/bench/compare/v0.12.1...v0.13.0 ### Added - Configuration property `UseRegistryIsolation` to provide a way @@ -181,14 +186,16 @@ Add a link to the GitHub diff like ([#67](https://github.com/mastersign/bench/issues/67)) ## [0.12.1] - 2016-07-29 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.12.0...v0.12.1) + +[0.12.1]: https://github.com/mastersign/bench/compare/v0.12.0...v0.12.1 ### Fixed - Environment setup fails if the user has no `PATH` environment variable ([#76](https://github.com/mastersign/bench/issues/76)) ## [0.12.0] - 2016-07-27 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.11.4...v0.12.0) + +[0.12.0]: https://github.com/mastersign/bench/compare/v0.11.4...v0.12.0 ### Added - Support for custom scripts in `config\apps` @@ -209,7 +216,8 @@ Add a link to the GitHub diff like ([#73](https://github.com/mastersign/bench/issues/73)) ## [0.11.4] - 2016-07-04 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.11.3...v0.11.4) + +[0.11.4]: https://github.com/mastersign/bench/compare/v0.11.3...v0.11.4 ### Changed - Update: Node.js from 4.4.6 to 6.2.2 @@ -218,13 +226,15 @@ Add a link to the GitHub diff like - UI performance when activating/deactivating apps ## [0.11.3] - 2016-07-02 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.11.2...v0.11.3) + +[0.11.3]: https://github.com/mastersign/bench/compare/v0.11.2...v0.11.3 ### Fixed - Fixed execution policy for running `PsExecHost.ps1` ## [0.11.2] - 2016-06-30 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.11.1...v0.11.2) + +[0.11.2]: https://github.com/mastersign/bench/compare/v0.11.1...v0.11.2 ### Changed - Update: ConEmu from 16.03.13 to 16.06.19 @@ -235,7 +245,8 @@ Add a link to the GitHub diff like - Focus flicker of GUI app ## [0.11.1] - 2016-06-25 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.11.0...v0.11.1) + +[0.11.1]: https://github.com/mastersign/bench/compare/v0.11.0...v0.11.1 ### Added - Bench configuration property `Website` @@ -255,7 +266,8 @@ Add a link to the GitHub diff like - Custom setup script of Leiningen ## [0.11.0] - 2016-06-18 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.10.8...v0.11.0) + +[0.11.0]: https://github.com/mastersign/bench/compare/v0.10.8...v0.11.0 ### Added - Custom config dictionary property `Environment` to add environment variables @@ -299,14 +311,16 @@ Add a link to the GitHub diff like ([#61](https://github.com/mastersign/bench/issues/61)) ## [0.10.8] - 2016-05-27 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.10.7...v0.10.8) + +[0.10.8]: https://github.com/mastersign/bench/compare/v0.10.7...v0.10.8 ### Fixed - Mark Git as required, if an existing custom config needs to be cloned ([#55](https://github.com/mastersign/bench/issues/55)) ## [0.10.7] - 2016-05-27 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.10.6...v0.10.7) + +[0.10.7]: https://github.com/mastersign/bench/compare/v0.10.6...v0.10.7 ### Added - Setup action for downloading all app resources @@ -331,7 +345,8 @@ Add a link to the GitHub diff like ([#53](https://github.com/mastersign/bench/issues/53)) ## [0.10.6] - 2016-05-24 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.10.5...v0.10.6) + +[0.10.6]: https://github.com/mastersign/bench/compare/v0.10.5...v0.10.6 ### Added - Launcher for 7-Zip file manager @@ -347,7 +362,8 @@ Add a link to the GitHub diff like - Initializing/Upgrading the Bench environment ## [0.10.5] - 2016-05-17 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.10.4...v0.10.5) + +[0.10.5]: https://github.com/mastersign/bench/compare/v0.10.4...v0.10.5 ### Added - Configuration properties to control the appearance of shell launchers @@ -362,7 +378,8 @@ Add a link to the GitHub diff like ([#44](https://github.com/mastersign/bench/issues/44)) ## [0.10.4] - 2016-05-14 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.10.3...v0.10.4) + +[0.10.4]: https://github.com/mastersign/bench/compare/v0.10.3...v0.10.4 ### Added - Content tree in Markdown viewer @@ -386,7 +403,8 @@ Add a link to the GitHub diff like - GitKraken Resource Url ## [0.10.3] - 2016-05-13 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.10.2...v0.10.3) + +[0.10.3]: https://github.com/mastersign/bench/compare/v0.10.2...v0.10.3 ### Added - Added GitKraken (latest) @@ -398,7 +416,8 @@ Add a link to the GitHub diff like ([#42](https://github.com/mastersign/bench/issues/42)) ## [0.10.2] - 2016-05-09 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.10.1...v0.10.2) + +[0.10.2]: https://github.com/mastersign/bench/compare/v0.10.1...v0.10.2 ### Added - Support for Ruby Gems (app typ `ruby-package`) @@ -406,7 +425,8 @@ Add a link to the GitHub diff like - Added SASS (latest) ## [0.10.1] - 2016-05-08 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.10.0...v0.10.1) + +[0.10.1]: https://github.com/mastersign/bench/compare/v0.10.0...v0.10.1 ### Fixed - Installing NodeJS and Python packages via _Bench Dashboard_ @@ -418,7 +438,8 @@ Add a link to the GitHub diff like + `Maven` properties ## [0.10.0] - 2016-05-07 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.9.3...v0.10.0) + +[0.10.0]: https://github.com/mastersign/bench/compare/v0.9.3...v0.10.0 For this release a clean install is required and the configuration must be migrated to the new format. @@ -457,7 +478,8 @@ must be migrated to the new format. - Spacemacs under path with whitespaces ## [0.9.3] - 2016-04-13 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.9.2...v0.9.3) + +[0.9.3]: https://github.com/mastersign/bench/compare/v0.9.2...v0.9.3 ### Added - App: Maven @@ -479,7 +501,8 @@ must be migrated to the new format. ([#34](https://github.com/mastersign/bench/issues/34)) ## [0.9.2] 2016-03-07 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.9.1...v0.9.2) + +[0.9.2]: https://github.com/mastersign/bench/compare/v0.9.1...v0.9.2 ### Added - App: JRE 7 @@ -491,7 +514,8 @@ must be migrated to the new format. - MSYS tools from MinGW are not in PATH ## [0.9.1] - 2016-03-03 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.9.0...v0.9.1) + +[0.9.1]: https://github.com/mastersign/bench/compare/v0.9.0...v0.9.1 ### Added - support for Windows 7 with PowerShell 2 @@ -516,7 +540,8 @@ must be migrated to the new format. ([#31](https://github.com/mastersign/bench/issues/31)) ## [0.9.0] - 2016-03-02 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.8.0...v0.9.0) + +[0.9.0]: https://github.com/mastersign/bench/compare/v0.8.0...v0.9.0 ### Added - support for unpacking `*.tar.*` archives with two steps @@ -554,7 +579,8 @@ must be migrated to the new format. - cancel downloads if one download failes ## [0.8.0] - 2016-02-15 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.7.2...v0.8.0) + +[0.8.0]: https://github.com/mastersign/bench/compare/v0.7.2...v0.8.0 ### Added - `auto\lib\profile.ps1` for customization of the PowerShell environment @@ -582,7 +608,8 @@ must be migrated to the new format. - expansion of config values `AppAdornmentBaseDir` and `AppRegistryBaseDir` ## [0.7.2] - 2016-02-12 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.7.1...v0.7.2) + +[0.7.2]: https://github.com/mastersign/bench/compare/v0.7.1...v0.7.2 ### Added - Passing arguments to _Command Line_ launcher with `/C`, to allow @@ -594,13 +621,15 @@ must be migrated to the new format. - Update: Visual Studio Code Archive Pattern ## [0.7.1] - 2016-02-12 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.7.0...v0.7.1) + +[0.7.1]: https://github.com/mastersign/bench/compare/v0.7.0...v0.7.1 ### Fixed - FFmpeg exe path ## [0.7.0] - 2016-02-12 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.6.1...v0.7.0) + +[0.7.0]: https://github.com/mastersign/bench/compare/v0.6.1...v0.7.0 ### Added - `CHANGELOG.md` @@ -635,7 +664,8 @@ must be migrated to the new format. + `auto\bench-upgrade.cmd` ## [0.6.1] - 2016-02-07 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.6.0...v0.6.1) + +[0.6.1]: https://github.com/mastersign/bench/compare/v0.6.0...v0.6.1 ### Added - Automatic update of PIP to most recent version after installing Python 2 and Python 3 @@ -647,7 +677,8 @@ must be migrated to the new format. ([#15](https://github.com/mastersign/bench/issues/15)) ## [0.6.0] - 2016-01-27 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.5.4...v0.6.0) + +[0.6.0]: https://github.com/mastersign/bench/compare/v0.5.4...v0.6.0 ### Added - actions scripts for _CMD_, _PowerShell_, and _Bash_ @@ -658,7 +689,8 @@ must be migrated to the new format. - updated documentation of overridden environment variables ## [0.5.4] - 2016-01-27 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.5.3...v0.5.4) + +[0.5.4]: https://github.com/mastersign/bench/compare/v0.5.3...v0.5.4 ### Change - Removed home directory from Git version control to prevent data loss @@ -667,19 +699,22 @@ must be migrated to the new format. to `res\apps\vscode` ## [0.5.3] - 2016-01-27 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.5.2...v0.5.3) + +[0.5.3]: https://github.com/mastersign/bench/compare/v0.5.2...v0.5.3 ### Fixed - Building relative paths in `env.cmd` ## [0.5.2] - 2016-01-27 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.5.2...v0.5.2) + +[0.5.2]: https://github.com/mastersign/bench/compare/v0.5.2...v0.5.2 ### Fixed - Incorrect quotes for path strings in `config.template.ps1` ## [0.5.1] - 2016-01-27 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.5.0...v0.5.1) + +[0.5.1]: https://github.com/mastersign/bench/compare/v0.5.0...v0.5.1 ### Changed - Moved Spacemacs config file from `%HOME%\.spacemacs` to `%HOME%\.spacemacs.d\init.el` @@ -695,7 +730,8 @@ must be migrated to the new format. - Update: LightTable from 0.8.0 to 0.8.1 ## [0.5.0] - 2016-01-22 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.4.0...v0.5.0) + +[0.5.0]: https://github.com/mastersign/bench/compare/v0.4.0...v0.5.0 ### Added - Support for launcher shortcuts @@ -715,7 +751,8 @@ must be migrated to the new format. - Do not empty the temp directory while loading `env.lib.ps1` ## [0.4.0] - 2016-01-20 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.3.4...v0.4.0) + +[0.4.0]: https://github.com/mastersign/bench/compare/v0.3.4...v0.4.0 ### Added - App: IPython (in app group `DevPython2` and `DevPython3`) @@ -728,7 +765,8 @@ must be migrated to the new format. - Restricted download of app resources to apps of type `default` ## [0.3.4] - 2016-01-20 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.3.3...v0.3.4) + +[0.3.4]: https://github.com/mastersign/bench/compare/v0.3.3...v0.3.4 ### Added - App: GnuTLS @@ -740,7 +778,8 @@ must be migrated to the new format. - Custom environment variables and setup scripts for meta apps ## [0.3.3] - 2016-01-18 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.3.2...v0.3.3) + +[0.3.3]: https://github.com/mastersign/bench/compare/v0.3.2...v0.3.3 ### Added - Support for NPM version ranges @@ -753,7 +792,8 @@ must be migrated to the new format. - Incorrect version patterns for NPM packages ## [0.3.2] - 2016-01-11 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.3.1...v0.3.2) + +[0.3.2]: https://github.com/mastersign/bench/compare/v0.3.1...v0.3.2 ### Added - Override `HOME` in addition to `USERPROFILE` @@ -779,13 +819,15 @@ must be migrated to the new format. - Incorrect warnings for meta apps during environment update ## [0.3.1] - 2016-01-08 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.3.3...v0.3.1) + +[0.3.1]: https://github.com/mastersign/bench/compare/v0.3.3...v0.3.1 ### Added - Documentation for groups in `apps.md` ## [0.3.0] - 2016-01-08 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.2.2...v0.3.0) + +[0.3.0]: https://github.com/mastersign/bench/compare/v0.2.2...v0.3.0 ### Added - Support for app typ `meta` for custom apps and app groups @@ -804,7 +846,8 @@ must be migrated to the new format. - Update: Eclipse from 4.4.2 to 4.5 ## [0.2.2] - 2016-01-07 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.2.1...v0.2.2) + +[0.2.2]: https://github.com/mastersign/bench/compare/v0.2.1...v0.2.2 ### Added - App: Apache Web Server @@ -822,7 +865,8 @@ must be migrated to the new format. - Switched `lib\git\bin` to `lib\git\cmd` in `PATH` ## [0.2.1] - 2016-01-06 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.2.0...v0.2.1) + +[0.2.1]: https://github.com/mastersign/bench/compare/v0.2.0...v0.2.1 ### Added - App: Sift @@ -840,7 +884,8 @@ must be migrated to the new format. - File name extraction from download URL ## [0.2.0] - 2016-01-06 -[Full Changelog](https://github.com/mastersign/bench/compare/v0.1.0...v0.2.0) + +[0.2.0]: https://github.com/mastersign/bench/compare/v0.1.0...v0.2.0 ### Added - App: Oracel JDK 7 and 8 @@ -863,6 +908,6 @@ must be migrated to the new format. - location for `AppDataDir` - incorrect proxy template in `res\config.template.ps1` -## [0.1.0] - 2016-01-04 +## 0.1.0 - 2016-01-04 First public release on GitHub. From 7e3b5a9e99fa1740ad7f7665fe20d25313fb00e5 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 20 Jan 2017 12:13:25 +0100 Subject: [PATCH 206/230] moved link definition to the top --- docs/content/ref/config.md | 3 ++- docs/src-content/ref/config.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index f25d9292..8f53a729 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -5,6 +5,8 @@ title = "Configuration Properties" weight = 6 +++ +[syntax]: /ref/markup-syntax + Configuration properties for Bench use the [list syntax in Markdown][syntax] and can be defined in the following files. @@ -623,4 +625,3 @@ This switch only takes affect, if the [Git app](/apps/Bench.Git) is activated. * Default: `VSCode` * Type: User/Site -[syntax]: /ref/markup-syntax diff --git a/docs/src-content/ref/config.md b/docs/src-content/ref/config.md index b7e44d79..41a8745b 100644 --- a/docs/src-content/ref/config.md +++ b/docs/src-content/ref/config.md @@ -5,6 +5,8 @@ title = "Configuration Properties" weight = 6 +++ +[syntax]: /ref/markup-syntax + Configuration properties for Bench use the [list syntax in Markdown][syntax] and can be defined in the following files. @@ -572,4 +574,3 @@ This switch only takes affect, if the [Git app](/apps/Bench.Git) is activated. * Default: `VSCode` * Type: User/Site -[syntax]: /ref/markup-syntax From 59c5e3d1ac92c106677cd3a204dbf437197688a0 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 20 Jan 2017 12:17:02 +0100 Subject: [PATCH 207/230] added config property TextEditorApp, MarkdownEditorApp, removed config property EditorApp --- BenchManager/BenchDashboard/SetupForm.cs | 22 ++++++++++++++++++---- BenchManager/BenchLib/PropertyKeys.cs | 3 ++- docs/content/ref/config.md | 17 ++++++++++++++--- docs/src-content/ref/config.md | 14 ++++++++++++-- res/apps-activated.template.txt | 3 ++- res/config.md | 3 ++- 6 files changed, 50 insertions(+), 12 deletions(-) diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index 0c0c9242..e1341292 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -412,7 +412,7 @@ private void AlwaysShowDownloadsCheckedChanged(object sender, EventArgs e) UpdateDownloadListVisibility(); } - private void EditTextFile(string name, string path) + private void EditFile(string name, string path, string appId) { if (!File.Exists(path)) { @@ -425,18 +425,32 @@ private void EditTextFile(string name, string path) MessageBoxIcon.Error); return; } - System.Diagnostics.Process.Start(path); + var editorApp = core.Config.Apps[appId]; + if (editorApp.IsInstalled) + { + core.LaunchApp(appId, path); + } + else + { + System.Diagnostics.Process.Start(path); + } } + private void EditTextFile(string name, string path) + => EditFile(name, path, core.Config.GetStringValue(PropertyKeys.TextEditorApp)); + + private void EditMarkdownFile(string name, string path) + => EditFile(name, path, core.Config.GetStringValue(PropertyKeys.MarkdownEditorApp)); + private void EditCustomConfigHandler(object sender, EventArgs e) { - EditTextFile("User Configuration", + EditMarkdownFile("User Configuration", core.Config.GetStringValue(PropertyKeys.CustomConfigFile)); } private void EditCustomAppsHandler(object sender, EventArgs e) { - EditTextFile("User App Library", + EditMarkdownFile("User App Library", Path.Combine( core.Config.GetStringValue(PropertyKeys.CustomConfigDir), core.Config.GetStringValue(PropertyKeys.AppLibIndexFileName))); diff --git a/BenchManager/BenchLib/PropertyKeys.cs b/BenchManager/BenchLib/PropertyKeys.cs index e3de00a0..fd84f627 100644 --- a/BenchManager/BenchLib/PropertyKeys.cs +++ b/BenchManager/BenchLib/PropertyKeys.cs @@ -91,7 +91,8 @@ public static class PropertyKeys public const string DownloadAttempts = "DownloadAttempts"; public const string ParallelDownloads = "ParallelDownloads"; - public const string EditorApp = "EditorApp"; + public const string TextEditorApp = "TextEditorApp"; + public const string MarkdownEditorApp = "MarkdownEditorApp"; // Common App Properties diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index 8f53a729..a0518512 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -103,7 +103,8 @@ configuration, but _can_ be overridden in the user or site configuration. | [QuickAccessPowerShell](#QuickAccessPowerShell) | User/Site | boolean | `false` | | [QuickAccessBash](#QuickAccessBash) | User/Site | boolean | `false` | | [DashboardSetupAppListColumns](#DashboardSetupAppListColumns) | User/Site | string list | `Order`, `Label`, `Version`, `Active`, `Deactivated`, `Status`, `Typ`, `Comment` | -| [EditorApp](#EditorApp) | User/Site | string | `VSCode` | +| [TextEditorApp](#TextEditorApp) | User/Site | string | `Bench.Notepad2` | +| [MarkdownEditorApp](#MarkdownEditorApp) | User/Site | string | `Bench.MarkdownEdit` | ## System Properties @@ -618,10 +619,20 @@ This switch only takes affect, if the [Git app](/apps/Bench.Git) is activated. * Default: `Order`, `Label`, `Version`, `Active`, `Deactivated`, `Status`, `Typ`, `Comment` * Type: User/Site -### EditorApp {#EditorApp} +### TextEditorApp {#TextEditorApp} * Description: The ID of an app which is used as the default text editor. * Data Type: string -* Default: `VSCode` +* Default: `Bench.Notepad2` * Type: User/Site +The default text editor is used to edit the app activation list. + +### MarkdownEditorApp {#MarkdownEditorApp} + +* Description: The ID of an app which is used as the default Markdown editor. +* Data Type: string +* Default: `Bench.MarkdownEdit` +* Type: User/Site + +The default Markdown editor is used to edit configuration files. diff --git a/docs/src-content/ref/config.md b/docs/src-content/ref/config.md index 41a8745b..5ec55ede 100644 --- a/docs/src-content/ref/config.md +++ b/docs/src-content/ref/config.md @@ -567,10 +567,20 @@ This switch only takes affect, if the [Git app](/apps/Bench.Git) is activated. * Default: `Order`, `Label`, `Version`, `Active`, `Deactivated`, `Status`, `Typ`, `Comment` * Type: User/Site -### EditorApp {#EditorApp} +### TextEditorApp {#TextEditorApp} * Description: The ID of an app which is used as the default text editor. * Data Type: string -* Default: `VSCode` +* Default: `Bench.Notepad2` * Type: User/Site +The default text editor is used to edit the app activation list. + +### MarkdownEditorApp {#MarkdownEditorApp} + +* Description: The ID of an app which is used as the default Markdown editor. +* Data Type: string +* Default: `Bench.MarkdownEdit` +* Type: User/Site + +The default Markdown editor is used to edit configuration files. diff --git a/res/apps-activated.template.txt b/res/apps-activated.template.txt index aa1c4af3..cf89320a 100644 --- a/res/apps-activated.template.txt +++ b/res/apps-activated.template.txt @@ -4,6 +4,7 @@ # This file contains the list with all activated apps. # The first word in a non-empty line, not commented out with #, is treated as an app ID. +Bench.Notepad2 # activated as default text editor +Bench.MarkdownEdit # activated by default as editor for configuration files Bench.Git # activated by default to support project versioning Bench.Yeoman # activated by default to support actions\new-project.cmd -Bench.VSCode # activated as default text editor diff --git a/res/config.md b/res/config.md index 444c839b..859d0646 100644 --- a/res/config.md +++ b/res/config.md @@ -91,5 +91,6 @@ * QuickAccessCmd: `true` * QuickAccessPowerShell: `false` * QuickAccessBash: `false` -* EditorApp: `VSCode` +* TextEditorApp: `Bench.Notepad2` +* MarkdownEditorApp: `Bench.MarkdownEdit` * DashboardSetupAppListColumns: `Order`, `Label`, `Version`, `Active`, `Deactivated`, `Status`, `Typ`, `Comment` From c32ef879b3315c88a4bd77e8892b4ec130edbc09 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 20 Jan 2017 12:17:27 +0100 Subject: [PATCH 208/230] fixed bug in build path of license file --- BenchManager/BenchLib/AppFacade.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BenchManager/BenchLib/AppFacade.cs b/BenchManager/BenchLib/AppFacade.cs index aebbb8a0..8518f157 100644 --- a/BenchManager/BenchLib/AppFacade.cs +++ b/BenchManager/BenchLib/AppFacade.cs @@ -242,7 +242,7 @@ public Uri LicenseUrl return null; } if (!result.IsAbsoluteUri) - return new Uri(new Uri(Dir), result); + return new Uri(new Uri(Dir + "/"), result); else return result; } From d140265776f8ba5a6fdac5b57eb577d8c4749556 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 20 Jan 2017 12:19:31 +0100 Subject: [PATCH 209/230] fixed incorrect named methods --- BenchManager/BenchDashboard/DownloadList.cs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/BenchManager/BenchDashboard/DownloadList.cs b/BenchManager/BenchDashboard/DownloadList.cs index aa44c5aa..4f42576b 100644 --- a/BenchManager/BenchDashboard/DownloadList.cs +++ b/BenchManager/BenchDashboard/DownloadList.cs @@ -6,6 +6,7 @@ using System.Text; using System.Windows.Forms; using System.IO; +using System.Diagnostics; namespace Mastersign.Bench.Dashboard { @@ -34,32 +35,32 @@ public Downloader Downloader { if (downloader != null) { - BindDownloader(); + UnbindDownloader(); } downloader = value; if (downloader != null) { - UnbindDownloader(); + BindDownloader(); } } } private void BindDownloader() { - downloader.IsWorkingChanged -= DownloaderIsWorkingChangedHandler; - downloader.DownloadStarted -= DownloadStartedHandler; - downloader.DownloadProgress -= DownloadProgressHandler; - downloader.DownloadEnded -= DownloadEndedHandler; + downloader.IsWorkingChanged += DownloaderIsWorkingChangedHandler; + downloader.DownloadStarted += DownloadStartedHandler; + downloader.DownloadProgress += DownloadProgressHandler; + downloader.DownloadEnded += DownloadEndedHandler; ClearDownloadTasks(); // Potential inconsitency ... add already running download tasks } private void UnbindDownloader() { - downloader.IsWorkingChanged += DownloaderIsWorkingChangedHandler; - downloader.DownloadStarted += DownloadStartedHandler; - downloader.DownloadProgress += DownloadProgressHandler; - downloader.DownloadEnded += DownloadEndedHandler; + downloader.IsWorkingChanged -= DownloaderIsWorkingChangedHandler; + downloader.DownloadStarted -= DownloadStartedHandler; + downloader.DownloadProgress -= DownloadProgressHandler; + downloader.DownloadEnded -= DownloadEndedHandler; } private void DownloaderIsWorkingChangedHandler(object sender, EventArgs e) From 550b324314fca67b3a35535e8f1bfcc78ca24b28 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 20 Jan 2017 13:31:08 +0100 Subject: [PATCH 210/230] handle a newly created Downloader on an existing Core (fixes #81) the Downloader is recreated, if the configuration was reloaded --- BenchManager/BenchDashboard/SetupForm.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index e1341292..30afb40a 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -168,6 +168,7 @@ private void InitializeAppListColumns() private void CoreConfigReloadedHandler(object sender, EventArgs e) { + InitializeDownloadList(); InitializeAppIndexMenu(); InitializeAppListColumnsMenu(); InitializeAppListColumns(); @@ -327,8 +328,12 @@ private void DisposeConsole() private void InitializeDownloadList() { + if (downloadList.Downloader != null) + { + downloadList.Downloader.IsWorkingChanged -= DownloaderIsWorkingChangedHandler; + } downloadList.Downloader = core.Downloader; - core.Downloader.IsWorkingChanged += DownloaderIsWorkingChangedHandler; + downloadList.Downloader.IsWorkingChanged += DownloaderIsWorkingChangedHandler; UpdateDownloadListVisibility(); } From aaef6838a4b6f04195d1cd92e62381bbeaa4e5dc Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 23 Jan 2017 17:47:15 +0100 Subject: [PATCH 211/230] improved AppFacade.IsInstalled for python packages --- BenchManager/BenchLib/AppFacade.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BenchManager/BenchLib/AppFacade.cs b/BenchManager/BenchLib/AppFacade.cs index 8518f157..d59dda5c 100644 --- a/BenchManager/BenchLib/AppFacade.cs +++ b/BenchManager/BenchLib/AppFacade.cs @@ -688,13 +688,13 @@ private bool GetIsInstalled() var pip2PackageDir = IOPath.Combine( IOPath.Combine(python2Dir, "lib"), IOPath.Combine("site-packages", PackageName)); - return Directory.Exists(pip2PackageDir); + return Directory.Exists(pip2PackageDir) || File.Exists(SetupTestFile); case AppTyps.Python3Package: var python3Dir = AppIndex.GetStringGroupValue(AppKeys.Python3, PropertyKeys.AppDir); var pip3PackageDir = IOPath.Combine( IOPath.Combine(python3Dir, "lib"), IOPath.Combine("site-packages", PackageName)); - return Directory.Exists(pip3PackageDir); + return Directory.Exists(pip3PackageDir) || File.Exists(SetupTestFile); default: return File.Exists(SetupTestFile); } From f237e39e6f80a011be57d8980a9d3d3965f91eb9 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Mon, 23 Jan 2017 17:47:34 +0100 Subject: [PATCH 212/230] fixed running adorned apps --- BenchManager/BenchLib/BenchTasks.cs | 2 +- BenchManager/scripts/runps.cmd | 25 +++++++++++++++++++++++++ build/build.ps1 | 3 ++- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 BenchManager/scripts/runps.cmd diff --git a/BenchManager/BenchLib/BenchTasks.cs b/BenchManager/BenchLib/BenchTasks.cs index 4309a9df..ef298605 100644 --- a/BenchManager/BenchLib/BenchTasks.cs +++ b/BenchManager/BenchLib/BenchTasks.cs @@ -1546,7 +1546,7 @@ private static void CreateLauncher(BenchConfiguration config, AppFacade app) code.AppendLine($"CALL \"{rootDir}\\env.cmd\""); if (app.IsExecutableAdorned(executable) && app.IsAdornmentRequired) { - code.AppendLine($"\"{autoDir}\\runps.cmd\" Run-Adorned {app.ID} \"{executable}\" {args}"); + code.AppendLine($"\"{autoDir}\\bin\\runps.cmd\" Run-Adorned {app.ID} \"{executable}\" {args}"); } else { diff --git a/BenchManager/scripts/runps.cmd b/BenchManager/scripts/runps.cmd new file mode 100644 index 00000000..8d2f724e --- /dev/null +++ b/BenchManager/scripts/runps.cmd @@ -0,0 +1,25 @@ +@ECHO OFF +Setlocal EnableDelayedExpansion +SET SCRIPT=%~dp0..\lib\%1 + +SHIFT +SET "args=" +:parse +IF "%~1" NEQ "" ( + REM check for spaces + SET arg=%~1 + IF "!arg!"=="!arg: =!" ( + SET args=%args% !arg! + ) ELSE ( + REM quote if necessary + SET args=%args% '!arg!' + ) + SHIFT + GOTO :parse +) +IF DEFINED args SET "args=%args:~1%" + +REM ECHO.%SCRIPT% +REM ECHO.%args% + +powershell -NoLogo -NoProfile -ExecutionPolicy Unrestricted "& ('%SCRIPT%')" %args% \ No newline at end of file diff --git a/build/build.ps1 b/build/build.ps1 index 742408ea..4f56a3d5 100644 --- a/build/build.ps1 +++ b/build/build.ps1 @@ -35,7 +35,8 @@ $buildArtifacts = @( "BenchDashboard\bin\$mode\ConEmu.WinForms.dll", "scripts\bench-cmd.cmd", "scripts\bench-ps.cmd", - "scripts\bench-bash.cmd" + "scripts\bench-bash.cmd", + "scripts\runps.cmd" ) # Paths of release artifacts are relative to the root dir $releaseArtifacts = @( From 0f6025eabe190e3c401118c534859018a00a376b Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 24 Jan 2017 12:04:01 +0100 Subject: [PATCH 213/230] updated Mastersign.Sequence from 1.0.0 to 1.1.0 --- BenchManager/BenchCLI/BenchCLI.csproj | 4 ++-- BenchManager/BenchCLI/packages.config | 2 +- BenchManager/BenchLib/BenchLib.csproj | 4 ++-- BenchManager/BenchLib/packages.config | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/BenchManager/BenchCLI/BenchCLI.csproj b/BenchManager/BenchCLI/BenchCLI.csproj index 951b554e..ad80307c 100644 --- a/BenchManager/BenchCLI/BenchCLI.csproj +++ b/BenchManager/BenchCLI/BenchCLI.csproj @@ -40,8 +40,8 @@ logo.ico - - ..\packages\Mastersign.Sequence.1.0.0\lib\net20\Mastersign.Sequence.dll + + ..\packages\Mastersign.Sequence.1.1.0\lib\net20\Mastersign.Sequence.dll True diff --git a/BenchManager/BenchCLI/packages.config b/BenchManager/BenchCLI/packages.config index c321c46c..09413b22 100644 --- a/BenchManager/BenchCLI/packages.config +++ b/BenchManager/BenchCLI/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/BenchManager/BenchLib/BenchLib.csproj b/BenchManager/BenchLib/BenchLib.csproj index 4dfb9310..0e983673 100644 --- a/BenchManager/BenchLib/BenchLib.csproj +++ b/BenchManager/BenchLib/BenchLib.csproj @@ -43,8 +43,8 @@ ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll True - - ..\packages\Mastersign.Sequence.1.0.0\lib\net20\Mastersign.Sequence.dll + + ..\packages\Mastersign.Sequence.1.1.0\lib\net20\Mastersign.Sequence.dll True diff --git a/BenchManager/BenchLib/packages.config b/BenchManager/BenchLib/packages.config index 53335122..40e31675 100644 --- a/BenchManager/BenchLib/packages.config +++ b/BenchManager/BenchLib/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file From 0163ae0a9eecba0c082da659b3e70565014693b8 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 24 Jan 2017 12:05:20 +0100 Subject: [PATCH 214/230] added app selection to the initialization wizzard --- BenchManager/BenchLib/BenchConfiguration.cs | 3 +- BenchManager/BenchLib/BenchLib.csproj | 9 ++ BenchManager/BenchLib/BenchTasks.cs | 7 + BenchManager/BenchLib/PropertyKeys.cs | 2 + .../UI/AppSelectionStepControl.Designer.cs | 60 +++++++++ .../BenchLib/UI/AppSelectionStepControl.cs | 42 ++++++ .../BenchLib/UI/AppSelectionStepControl.resx | 120 ++++++++++++++++++ .../BenchLib/UI/InitializeConfigTask.cs | 13 +- res/config.md | 9 ++ 9 files changed, 262 insertions(+), 3 deletions(-) create mode 100644 BenchManager/BenchLib/UI/AppSelectionStepControl.Designer.cs create mode 100644 BenchManager/BenchLib/UI/AppSelectionStepControl.cs create mode 100644 BenchManager/BenchLib/UI/AppSelectionStepControl.resx diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index a0e3324a..44a905c9 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -506,7 +506,8 @@ public void InjectBenchInitializationProperties(BenchConfiguration targetCfg) foreach (var key in new[] { PropertyKeys.CustomConfigRepository, - PropertyKeys.WizzardStartAutoSetup + PropertyKeys.WizzardStartAutoSetup, + PropertyKeys.WizzardSelectedApps, }) { targetCfg.SetValue(key, this.GetValue(key)); diff --git a/BenchManager/BenchLib/BenchLib.csproj b/BenchManager/BenchLib/BenchLib.csproj index 0e983673..08217f94 100644 --- a/BenchManager/BenchLib/BenchLib.csproj +++ b/BenchManager/BenchLib/BenchLib.csproj @@ -109,6 +109,12 @@ + + UserControl + + + AppSelectionStepControl.cs + UserControl @@ -186,6 +192,9 @@ + + AppSelectionStepControl.cs + AdvancedStepControl.cs diff --git a/BenchManager/BenchLib/BenchTasks.cs b/BenchManager/BenchLib/BenchTasks.cs index ef298605..8914fe98 100644 --- a/BenchManager/BenchLib/BenchTasks.cs +++ b/BenchManager/BenchLib/BenchTasks.cs @@ -173,6 +173,13 @@ public static BenchConfiguration InitializeCustomConfiguration(IBenchManager man File.Copy(conEmuConfigTemplateFile, conEmuConfigFile, false); } + var selectedApps = cfg.GetStringListValue(PropertyKeys.WizzardSelectedApps); + var activationFileEditor = new ActivationFile(activationFile); + foreach (var appId in selectedApps) + { + activationFileEditor.SignIn(appId); + } + var resultCfg = new BenchConfiguration(man.Config.BenchRootDir, true, true, true); cfg.InjectBenchInitializationProperties(resultCfg); return resultCfg; diff --git a/BenchManager/BenchLib/PropertyKeys.cs b/BenchManager/BenchLib/PropertyKeys.cs index fd84f627..e8fa60c8 100644 --- a/BenchManager/BenchLib/PropertyKeys.cs +++ b/BenchManager/BenchLib/PropertyKeys.cs @@ -43,6 +43,8 @@ public static class PropertyKeys public const string AppVersionIndexDir = "AppVersionIndexDir"; public const string WizzardStartAutoSetup = "WizzardStartAutoSetup"; + public const string WizzardApps = "WizzardApps"; + public const string WizzardSelectedApps = "WizzardSelectedApps"; public const string QuickAccessCmd = "QuickAccessCmd"; public const string QuickAccessPowerShell = "QuickAccessPowerShell"; public const string QuickAccessBash = "QuickAccessBash"; diff --git a/BenchManager/BenchLib/UI/AppSelectionStepControl.Designer.cs b/BenchManager/BenchLib/UI/AppSelectionStepControl.Designer.cs new file mode 100644 index 00000000..908bf978 --- /dev/null +++ b/BenchManager/BenchLib/UI/AppSelectionStepControl.Designer.cs @@ -0,0 +1,60 @@ +namespace Mastersign.Bench.UI +{ + partial class AppSelectionStepControl + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Komponenten-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.clstAppSelection = new System.Windows.Forms.CheckedListBox(); + this.SuspendLayout(); + // + // clstAppSelection + // + this.clstAppSelection.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.clstAppSelection.CheckOnClick = true; + this.clstAppSelection.FormattingEnabled = true; + this.clstAppSelection.Location = new System.Drawing.Point(15, 15); + this.clstAppSelection.Name = "clstAppSelection"; + this.clstAppSelection.Size = new System.Drawing.Size(434, 139); + this.clstAppSelection.TabIndex = 0; + // + // AppSelectionStepControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.clstAppSelection); + this.Name = "AppSelectionStepControl"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.CheckedListBox clstAppSelection; + } +} diff --git a/BenchManager/BenchLib/UI/AppSelectionStepControl.cs b/BenchManager/BenchLib/UI/AppSelectionStepControl.cs new file mode 100644 index 00000000..86e0232b --- /dev/null +++ b/BenchManager/BenchLib/UI/AppSelectionStepControl.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using static Mastersign.Sequence.Sequence; + +namespace Mastersign.Bench.UI +{ + /// + /// A wizzard control, which allows the user to pre-select apps before the setup. + /// + internal partial class AppSelectionStepControl : WizzardStepControl + { + public AppSelectionStepControl() + { + Description = "App/Group Selection..."; + InitializeComponent(); + } + + private Dictionary appLookup; + + public void InitializeStepControl(KeyValuePair[] apps) + { + appLookup = Seq(apps).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + clstAppSelection.Items.Clear(); + Seq(apps).ForEach(kvp => clstAppSelection.Items.Add(kvp.Key)); + } + + public string[] SelectedApps + { + get + { + return Seq(clstAppSelection.CheckedItems) + .Map((key, i) => appLookup[key]) + .ToArray(); + } + } + } +} diff --git a/BenchManager/BenchLib/UI/AppSelectionStepControl.resx b/BenchManager/BenchLib/UI/AppSelectionStepControl.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/BenchManager/BenchLib/UI/AppSelectionStepControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BenchManager/BenchLib/UI/InitializeConfigTask.cs b/BenchManager/BenchLib/UI/InitializeConfigTask.cs index 477806b1..7e8556d5 100644 --- a/BenchManager/BenchLib/UI/InitializeConfigTask.cs +++ b/BenchManager/BenchLib/UI/InitializeConfigTask.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Text; +using static Mastersign.Sequence.Sequence; using Mastersign.Bench.Markdown; namespace Mastersign.Bench.UI @@ -11,6 +12,7 @@ internal class InitializeConfigTask : WizzardTask private ProxyStepControl stepProxy; private UserIdentificationStepControl stepUserIdentification; private ExistingConfigStepControl stepExistingConfig; + private AppSelectionStepControl stepAppSeletion; private AdvancedStepControl stepAdvanced; private readonly BenchConfiguration config; @@ -40,6 +42,7 @@ public override WizzardStepControl[] StepControls if (InitCustomConfig) { steps.Add(stepExistingConfig); + steps.Add(stepAppSeletion); } steps.Add(stepAdvanced); return steps.ToArray(); @@ -67,6 +70,12 @@ public override void Before() { stepExistingConfig = new ExistingConfigStepControl(); stepExistingConfig.IsConfigGitRepoExisting = false; + + stepAppSeletion = new AppSelectionStepControl(); + stepAppSeletion.InitializeStepControl( + Seq(config.GetStringListValue(PropertyKeys.WizzardApps)) + .Map(DictionaryValueResolver.ParseKeyValuePair) + .ToArray()); } stepAdvanced = new AdvancedStepControl(); stepAdvanced.StartAutoSetup = config.GetBooleanValue( @@ -81,7 +90,7 @@ public override void After() foreach (var e in stepProxy.ProxyBypass) bypassList.Add("`" + e + "`"); var updates = new Dictionary { - {PropertyKeys.UserName, stepUserIdentification.UserName }, + { PropertyKeys.UserName, stepUserIdentification.UserName }, { PropertyKeys.UserEmail, stepUserIdentification.UserEmail }, { PropertyKeys.UseProxy, stepProxy.UseProxy ? "true" : "false" }, { PropertyKeys.HttpProxy, stepProxy.HttpProxy }, @@ -102,7 +111,6 @@ public override void After() File.Copy(siteConfigTemplateFile, defaultSiteConfigFile, false); MarkdownPropertyEditor.UpdateFile(defaultSiteConfigFile, updates); } - if (InitCustomConfig) { if (stepExistingConfig.IsConfigGitRepoExisting) @@ -113,6 +121,7 @@ public override void After() { config.SetValue(PropertyKeys.CustomConfigRepository, (object)null); } + config.SetValue(PropertyKeys.WizzardSelectedApps, stepAppSeletion.SelectedApps); } config.SetValue(PropertyKeys.WizzardStartAutoSetup, stepAdvanced.StartAutoSetup); diff --git a/res/config.md b/res/config.md index 859d0646..d64e1401 100644 --- a/res/config.md +++ b/res/config.md @@ -88,6 +88,15 @@ * LauncherDir: `launcher` * LauncherScriptDir: `$LibDir$\_launcher` * WizzardStartAutoSetup: `true` +* WizzardApps: + + Web: `Bench.Group.WebDevelopment` + + JavaScript: `Bench.Group.JavaScriptDevelopment` + + Java: `Bench.Group.JavaDevelopment` + + Clojure: `Bench.Group.ClojureDevelopment` + + PHP: `Bench.Group.PHPDevelopment` + + Python 2: `Bench.Group.Python2Development` + + Python 3: `Bench.Group.Python3Development` + + C/C++: `Bench.Group.CppDevelopment` * QuickAccessCmd: `true` * QuickAccessPowerShell: `false` * QuickAccessBash: `false` From 4e67905dcd76c1a185286800a408bd5ccc401c68 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Tue, 24 Jan 2017 15:48:26 +0100 Subject: [PATCH 215/230] added documentation for the config properties WizzardApps and WizzardSelectedApps --- docs/content/ref/config.md | 25 +++++++++++++++++++++++++ docs/src-content/ref/config.md | 23 +++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/docs/content/ref/config.md b/docs/content/ref/config.md index a0518512..c26bbcae 100644 --- a/docs/content/ref/config.md +++ b/docs/content/ref/config.md @@ -64,6 +64,8 @@ configuration, but _can_ be overridden in the user or site configuration. | [LibDir](#LibDir) | path | `lib` | | [Website](#Website) | URL | | | [WizzardEditCustomConfigBeforeSetup](#WizzardEditCustomConfigBeforeSetup) | boolean | `false` | +| [WizzardApps](#WizzardApps) | dictionary | groups from the default app library | +| [WizzardSelectedApps](#WizzardSelectedApps) | list | empty | | [WizzardStartAutoSetup](#WizzardStartAutoSetup) | boolean | `true` | **Customizable Properties** @@ -352,6 +354,29 @@ Only non-space characters, up to the first space or the end of a line, are consi * Default: `false` * Type: Temporary +### WizzardApps {#WizzardApps} + +* Description: A list of apps and groups to offer for activation during the user configuration initialization. +* Data Type: dictionary +* Default: groups from the default app library +* Type: System + +The items of the dictionary must have the format ` public string Exe => StringValue(PropertyKeys.AppExe); + /// + /// A flag to control whether the main executable of this app can be tested + /// by executing it with the and checking the exit code for 0. + /// + public bool ExeTest => BoolValue(PropertyKeys.AppExeTest); + + /// + /// A command line argument string to pass to the main executable, when testing it for propery installation. + /// + public string ExeTestArguments => StringValue(PropertyKeys.AppExeTestArguments) ?? string.Empty; + /// /// The relative path to a file, which existence can be used to check if the app is installed, /// or null e.g. in case the app is a package managed by a package manager. @@ -1132,16 +1143,26 @@ public bool CanReinstall /// This method does not check if there really is a more recent version of this app. /// public bool CanUpgrade => - // Default app with no version or version difference + // App with no version or version difference CanCheckInstallation && IsInstalled && !IsManagedPackage && (!IsVersioned || !IsVersionUpToDate) - // Default app with custom setup and remove + // App with custom setup and remove || !CanCheckInstallation && !IsManagedPackage && GetCustomScript("remove") != null && GetCustomScript("setup") != null; + /// + /// Checks, whether this app can be tested or not. + /// + public bool CanTest => + IsManagedPackage + || Typ == AppTyps.Default + || Exe != null + || GetCustomScript("setup") != null && GetCustomScript("remove") != null + || GetCustomScript("test") != null; + /// /// Checks, whether this app is active (activated or required) but not installed. /// @@ -1348,6 +1369,8 @@ private static string[] RemoveFromSet(string[] list, string value) PropertyKeys.AppEnvironment, PropertyKeys.AppAdornedExecutables, PropertyKeys.AppRegistryKeys, + PropertyKeys.AppExeTest, + PropertyKeys.AppExeTestArguments, PropertyKeys.AppLauncher, PropertyKeys.AppLauncherExecutable, PropertyKeys.AppLauncherArguments, @@ -1410,6 +1433,8 @@ public KeyValuePair[] KnownProperties result.Add(new KeyValuePair(PropertyKeys.AppEnvironment, this.Environment)); result.Add(new KeyValuePair(PropertyKeys.AppAdornedExecutables, this.AdornedExecutables)); result.Add(new KeyValuePair(PropertyKeys.AppRegistryKeys, this.RegistryKeys)); + result.Add(new KeyValuePair(PropertyKeys.AppExeTest, this.ExeTest)); + result.Add(new KeyValuePair(PropertyKeys.AppExeTestArguments, this.ExeTestArguments)); result.Add(new KeyValuePair(PropertyKeys.AppLauncher, this.Launcher)); result.Add(new KeyValuePair(PropertyKeys.AppLauncherExecutable, this.LauncherExecutable)); result.Add(new KeyValuePair(PropertyKeys.AppLauncherArguments, this.LauncherArguments)); diff --git a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs index 74754ca4..345fd059 100644 --- a/BenchManager/BenchLib/AppIndexDefaultValueSource.cs +++ b/BenchManager/BenchLib/AppIndexDefaultValueSource.cs @@ -112,6 +112,8 @@ public object GetGroupValue(string appId, string key) AppFacade.NameFromId(appId).ToLowerInvariant() + ".exe"); } return null; + case PropertyKeys.AppExeTest: + return true; case PropertyKeys.AppRegister: return true; case PropertyKeys.AppLauncherExecutable: @@ -150,6 +152,7 @@ public bool CanGetGroupValue(string group, string name) || name == PropertyKeys.AppDir || name == PropertyKeys.AppPath || name == PropertyKeys.AppExe + || name == PropertyKeys.AppExeTest || name == PropertyKeys.AppRegister || name == PropertyKeys.AppLauncherExecutable || name == PropertyKeys.AppLauncherArguments diff --git a/BenchManager/BenchLib/BenchTasks.cs b/BenchManager/BenchLib/BenchTasks.cs index 8914fe98..bf63a7ee 100644 --- a/BenchManager/BenchLib/BenchTasks.cs +++ b/BenchManager/BenchLib/BenchTasks.cs @@ -1667,7 +1667,7 @@ private static void UpdateEnvironment(IBenchManager man, if (envScript != null) { notify(new TaskProgress( - string.Format("Running custom environment script for {0}.", app.ID), progress, + string.Format("Running custom environment script for {0}.", app.ID), progress, appId: app.ID)); string scriptOutput = null; try @@ -2111,16 +2111,8 @@ private static void InstallNuGetPackage(BenchConfiguration config, IProcessExecu } } - private static void InstallApps(IBenchManager man, - ICollection apps, - Action notify, Cancelation cancelation) + private static bool PrepareDirectories(IBenchManager man, Action notify) { - var selectedApps = new List(); - foreach (var app in apps) - { - if (app.CanInstall) selectedApps.Add(app); - } - try { FileSystem.AsureDir( @@ -2134,157 +2126,180 @@ private static void InstallApps(IBenchManager man, } catch (Exception e) { - notify(new TaskError("Preparing directories failed.", + notify(new TaskError("Preparing directories failed.", exception: e)); - return; + return false; } + return true; + } - var cnt = 0; - foreach (var app in selectedApps) + private static bool InstallApp(IBenchManager man, AppFacade app, Action notify) + { + // 1. Extraction / Installation + try { - if (cancelation.IsCanceled) break; - cnt++; - var progress = 0.9f * cnt / selectedApps.Count; + switch (app.Typ) + { + case AppTyps.Meta: + // no resource extraction + break; + case AppTyps.Default: + if (app.ResourceFileName != null) + { + CopyAppResourceFile(man.Config, app); + } + else if (app.ResourceArchiveName != null) + { + ExtractAppArchive(man.Config, man.ProcessExecutionHost, app); + } + break; + case AppTyps.NodePackage: + InstallNodePackage(man.Config, man.ProcessExecutionHost, app); + break; + case AppTyps.RubyPackage: + InstallRubyPackage(man.Config, man.ProcessExecutionHost, app); + break; + case AppTyps.Python2Package: + InstallPythonPackage(man.Config, man.ProcessExecutionHost, PythonVersion.Python2, app); + break; + case AppTyps.Python3Package: + InstallPythonPackage(man.Config, man.ProcessExecutionHost, PythonVersion.Python3, app); + break; + case AppTyps.NuGetPackage: + InstallNuGetPackage(man.Config, man.ProcessExecutionHost, app); + break; + default: + throw new ArgumentOutOfRangeException("Invalid app typ '" + app.Typ + "' for app " + app.ID + "."); + } + } + catch (ProcessExecutionFailedException e) + { + notify(new TaskError( + string.Format("Installing app {0} failed: {1}", app.ID, e.Message), + appId: app.ID, consoleOutput: e.ProcessOutput, exception: e)); + return false; + } + catch (Exception e) + { + notify(new TaskError( + string.Format("Installing app {0} failed: {1}", app.ID, e.Message), + appId: app.ID, exception: e)); + return false; + } - // 1. Extraction / Installation - notify(new TaskProgress(string.Format("Installing app {0}.", app.ID), progress, app.ID)); + // 2. Custom Setup-Script + var customSetupScript = app.GetCustomScript("setup"); + if (customSetupScript != null) + { + notify(new TaskInfo( + string.Format("Executing custom setup script for {0}.", app.ID), + appId: app.ID)); + string scriptOutput = null; try { - switch (app.Typ) - { - case AppTyps.Meta: - // no resource extraction - break; - case AppTyps.Default: - if (app.ResourceFileName != null) - { - CopyAppResourceFile(man.Config, app); - } - else if (app.ResourceArchiveName != null) - { - ExtractAppArchive(man.Config, man.ProcessExecutionHost, app); - } - break; - case AppTyps.NodePackage: - InstallNodePackage(man.Config, man.ProcessExecutionHost, app); - break; - case AppTyps.RubyPackage: - InstallRubyPackage(man.Config, man.ProcessExecutionHost, app); - break; - case AppTyps.Python2Package: - InstallPythonPackage(man.Config, man.ProcessExecutionHost, PythonVersion.Python2, app); - break; - case AppTyps.Python3Package: - InstallPythonPackage(man.Config, man.ProcessExecutionHost, PythonVersion.Python3, app); - break; - case AppTyps.NuGetPackage: - InstallNuGetPackage(man.Config, man.ProcessExecutionHost, app); - break; - default: - throw new ArgumentOutOfRangeException("Invalid app typ '" + app.Typ + "' for app " + app.ID + "."); - } + scriptOutput = RunCustomScript(man.Config, man.ProcessExecutionHost, app.ID, customSetupScript).Trim(); } catch (ProcessExecutionFailedException e) { notify(new TaskError( - string.Format("Installing app {0} failed: {1}", app.ID, e.Message), + string.Format("Execution of custom setup script for {0} failed.", app.ID), appId: app.ID, consoleOutput: e.ProcessOutput, exception: e)); - continue; + return false; } - catch (Exception e) + if (!string.IsNullOrEmpty(scriptOutput)) { - notify(new TaskError( - string.Format("Installing app {0} failed: {1}", app.ID, e.Message), - appId: app.ID, exception: e)); - continue; + notify(new TaskInfo( + string.Format("Execution custom setup script for {0} finished.", app.ID), + appId: app.ID, consoleOutput: scriptOutput)); } + } - // 2. Custom Setup-Script - var customSetupScript = app.GetCustomScript("setup"); - if (customSetupScript != null) - { - notify(new TaskProgress( - string.Format("Executing custom setup script for {0}.", app.ID), progress, - appId: app.ID)); - string scriptOutput = null; - try - { - scriptOutput = RunCustomScript(man.Config, man.ProcessExecutionHost, app.ID, customSetupScript).Trim(); - } - catch (ProcessExecutionFailedException e) - { - notify(new TaskError( - string.Format("Execution of custom setup script for {0} failed.", app.ID), - appId: app.ID, consoleOutput: e.ProcessOutput, exception: e)); - continue; - } - if (!string.IsNullOrEmpty(scriptOutput)) - { - notify(new TaskInfo( - string.Format("Execution custom setup script for {0} finished.", app.ID), - appId: app.ID, consoleOutput: scriptOutput)); - } - } + // 3. Create Execution Proxy + try + { + CreateExecutionProxies(man.Config, app); + } + catch (Exception e) + { + notify(new TaskError( + string.Format("Creating the execution proxy for {0} failed: {1}", app.ID, e.Message), + appId: app.ID, exception: e)); + return false; + } - // 3. Create Execution Proxy - try - { - CreateExecutionProxies(man.Config, app); - } - catch (Exception e) - { - notify(new TaskError( - string.Format("Creating the execution proxy for {0} failed: {1}", app.ID, e.Message), - appId: app.ID, exception: e)); - continue; - } + // 4. Create Launcher + try + { + CreateLauncher(man.Config, app); + } + catch (Exception e) + { + notify(new TaskError( + string.Format("Creating the launcher for {0} failed: {1}", app.ID, e.Message), + appId: app.ID, exception: e)); + return false; + } - // 4. Create Launcher + // 5. Run Custom Environment Script + var envScript = app.GetCustomScript("env"); + if (envScript != null) + { + notify(new TaskInfo( + string.Format("Running custom environment script for {0}.", app.ID), + appId: app.ID)); + string scriptOutput = null; try { - CreateLauncher(man.Config, app); + scriptOutput = RunCustomScript(man.Config, man.ProcessExecutionHost, app.ID, envScript).Trim(); } - catch (Exception e) + catch (ProcessExecutionFailedException e) { notify(new TaskError( - string.Format("Creating the launcher for {0} failed: {1}", app.ID, e.Message), - appId: app.ID, exception: e)); - continue; + string.Format("Running the custom environment script for {0} failed.", app.ID), + appId: app.ID, consoleOutput: e.ProcessOutput, exception: e)); + return false; } - - // 5. Run Custom Environment Script - var envScript = app.GetCustomScript("env"); - if (envScript != null) + if (!string.IsNullOrEmpty(scriptOutput)) { - notify(new TaskProgress( - string.Format("Running custom environment script for {0}.", app.ID), - progress, app.ID)); - string scriptOutput = null; - try - { - scriptOutput = RunCustomScript(man.Config, man.ProcessExecutionHost, app.ID, envScript).Trim(); - } - catch (ProcessExecutionFailedException e) - { - notify(new TaskError( - string.Format("Running the custom environment script for {0} failed.", app.ID), - appId: app.ID, consoleOutput: e.ProcessOutput, exception: e)); - continue; - } - if (!string.IsNullOrEmpty(scriptOutput)) - { - notify(new TaskInfo( - string.Format("Running custom environment script for {0} finished.", app.ID), - appId: app.ID, consoleOutput: scriptOutput)); - } + notify(new TaskInfo( + string.Format("Running custom environment script for {0} finished.", app.ID), + appId: app.ID, consoleOutput: scriptOutput)); } + } - // 6. Store installed version - app.InstalledVersion = app.Version; + // 6. Store installed version + app.InstalledVersion = app.Version; - notify(new TaskProgress(string.Format("Finished installing app {0}.", app.ID), progress, - appId: app.ID)); - app.DiscardCachedValues(); + app.DiscardCachedValues(); + + return true; + } + + private static void InstallApps(IBenchManager man, + ICollection apps, + Action notify, Cancelation cancelation) + { + var selectedApps = new List(); + foreach (var app in apps) + { + if (app.CanInstall) selectedApps.Add(app); + } + + if (!PrepareDirectories(man, notify)) return; + + var cnt = 0; + foreach (var app in selectedApps) + { + if (cancelation.IsCanceled) break; + cnt++; + var progress = 0.9f * cnt / selectedApps.Count; + notify(new TaskProgress(string.Format("Installing app {0}.", app.ID), progress, app.ID)); + + if (InstallApp(man, app, notify)) + { + notify(new TaskProgress(string.Format("Finished installing app {0}.", app.ID), progress, + appId: app.ID)); + } } var globalCustomSetupScript = GetGlobalCustomScriptFile(man.Config, "setup"); @@ -2304,7 +2319,7 @@ private static void InstallApps(IBenchManager man, } if (!string.IsNullOrEmpty(scriptOutput)) { - notify(new TaskInfo("Executing global custom setup script finished.", + notify(new TaskInfo("Executing global custom setup script finished.", consoleOutput: scriptOutput)); } } @@ -2317,6 +2332,106 @@ private static void InstallApps(IBenchManager man, #endregion + #region Test Apps + + private static bool InstallAppsDependencies(IBenchManager man, AppFacade app, + Action notify, Cancelation cancelation) + { + var dependencyIds = app.FindAllDependencies(); + if (dependencyIds.Contains(app.ID)) dependencyIds.Remove(app.ID); + + var dependencies = man.Config.Apps.GetApps(dependencyIds); + var result = RunTasks(man, + dependencies, + notify, cancelation, + DownloadAppResources, + InstallApps); + return result.Success; + } + + private static void TestApps(IBenchManager man, + ICollection apps, + Action notify, Cancelation cancelation) + { + var selectedApps = new List(); + foreach (var app in apps) + { + if (app.CanTest) selectedApps.Add(app); + } + + if (!PrepareDirectories(man, notify)) return; + + var cnt = 0; + foreach (var app in selectedApps) + { + if (cancelation.IsCanceled) break; + cnt++; + var progress = 0.9f * cnt / selectedApps.Count; + + // TODO Property checks + + // Installing dependencies + notify(new TaskInfo( + string.Format("Installing dependencies for app {0}", app.ID), + appId: app.ID)); + if (!InstallAppsDependencies(man, app, notify, cancelation)) + { + notify(new TaskError( + string.Format("Installing dependencies for app {0} failed.", app.ID), + appId: app.ID)); + continue; + } + + // TODO Download check + + // TODO Install check + + // TODO Post install check + + // TODO ExeTest check + + // TOTO Custom test script check + + //notify(new TaskProgress(string.Format("Testing app {0}.", app.ID), progress, app.ID)); + //try + //{ + // switch (app.Typ) + // { + // case AppTyps.Meta: + // break; + // case AppTyps.Default: + // break; + // case AppTyps.NodePackage: + // break; + // case AppTyps.RubyPackage: + // break; + // case AppTyps.Python2Package: + // break; + // case AppTyps.Python3Package: + // break; + // case AppTyps.NuGetPackage: + // break; + // } + //} + //catch (ProcessExecutionFailedException e) + //{ + // notify(new TaskError( + // string.Format("Testing app {0} failed: {1}", app.ID, e.Message), + // appId: app.ID, consoleOutput: e.ProcessOutput, exception: e)); + // continue; + //} + //catch (Exception e) + //{ + // notify(new TaskError( + // string.Format("Testing app {0} failed: {1}", app.ID, e.Message), + // appId: app.ID, exception: e)); + // continue; + //} + } + } + + #endregion + #region Uninstall App private static void UninstallGeneric(BenchConfiguration config, AppFacade app) @@ -2450,7 +2565,7 @@ private static void UninstallApps(IBenchManager man, if (customScript != null) { notify(new TaskProgress( - string.Format("Running custom uninstall script for {0}.", app.ID), progress, + string.Format("Running custom uninstall script for {0}.", app.ID), progress, appId: app.ID)); var scriptOutput = RunCustomScript(man.Config, man.ProcessExecutionHost, app.ID, customScript).Trim(); if (!string.IsNullOrEmpty(scriptOutput)) diff --git a/BenchManager/BenchLib/PropertyKeys.cs b/BenchManager/BenchLib/PropertyKeys.cs index e8fa60c8..7e3b2a98 100644 --- a/BenchManager/BenchLib/PropertyKeys.cs +++ b/BenchManager/BenchLib/PropertyKeys.cs @@ -121,6 +121,8 @@ public static class PropertyKeys public const string AppExe = "Exe"; public const string AppAdornedExecutables = "AdornedExecutables"; public const string AppRegistryKeys = "RegistryKeys"; + public const string AppExeTest = "ExeTest"; + public const string AppExeTestArguments = "ExeTestArguments"; public const string AppLauncher = "Launcher"; public const string AppLauncherExecutable = "LauncherExecutable"; public const string AppLauncherArguments = "LauncherArguments"; diff --git a/docs/content/ref/app-library.md b/docs/content/ref/app-library.md index 45768ef6..64e2b96e 100644 --- a/docs/content/ref/app-library.md +++ b/docs/content/ref/app-library.md @@ -99,10 +99,11 @@ The following types of custom scripts are supported: * [`remove`](#custom-script-remove) * [`pre-run`](#custom-script-pre-run) * [`post-run`](#custom-script-post-run) +* [`test`](#custom-script-test) If the file format of the downloadable setup program for an app is not supported by Bench, then the file extraction can be implemented in the custom script -for the _extract_ setp. +for the _extract_ setup. If the original setup program of a Windows application performs some necessary actions to prepare the program files for execution, these actions @@ -117,6 +118,9 @@ in the custom script for the _env_ step. To perform some tasks every time before or after a program is executed, they can be implemented in the custom scripts for the _pre-run_ and _post-run_ steps. +When the app is tested for proper definition, the _test_ step is performed +after the installation. + ### App Custom Script Directory {#scripts-dir} * Description: The directory with the custom scripts of the apps. @@ -251,6 +255,18 @@ included in the list of adorned executables if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. +### App Custom Script `test` {#custom-script-test} + +* Description: Test hook for testing the installation of an app. +* Path: `\scripts\\.test.ps1` +* Type: file + +The _custom test script_ is executed, when an app definition is tested. +It is executed after a successful installation, after the existence of the +main executable was checked. +The test script fails when it writes an error or throws an exception; +otherwise it will count as a successful test. + ## App Setup Resources {#res} App setup resources are files, which are used by custom scripts to diff --git a/docs/content/ref/app-properties.md b/docs/content/ref/app-properties.md index 4b856952..203a9bab 100644 --- a/docs/content/ref/app-properties.md +++ b/docs/content/ref/app-properties.md @@ -21,6 +21,8 @@ weight = 8 | [Register](#Register) | `meta`, `default` | `false` | | [Environment](#Environment) | all | `false` | | [Exe](#Exe) | all | `false` | +| [ExeTestArguments](#ExeTestArguments) | all | | +| [ExeTest](#ExeTest) | all | | | [AdornedExecutables](#AdornedExecutables) | all | `false` | | [RegistryKeys](#RegistryKeys) | all | `false` | | [Launcher](#Launcher) | all | `false` | @@ -188,6 +190,27 @@ For package apps like `node-package` or `python3-package`, the path can be just the name of CLI wrapper script, given the package provides a CLI. +## ExeTestArguments {#ExeTestArguments} + +* Description: A string to pass as command line arguments when the executable is tested. +* Data Type: string +* Default: empty +* App Types: all + +To test if an app was installed successfully, +the main executable is run with these arguments. +If the process exit code is `0` the test was successful. + +## ExeTest {#ExeTest} + +* Description: A flag to prevent the test of the main executable. +* Data Type: boolean +* Default: `true` +* App Types: all + +If the main executable of an app can not be tested by executing it with the +[`ExeTestArguments`](#ExeTestArguments), this property must be set to `false`. + ## AdornedExecutables {#AdornedExecutables} * Description: A list of executables, which must be adorned with pre- and post-execution scripts @@ -279,7 +302,7 @@ The path can be absolute or relative to the target directory of the app. * Required: `true`* * App Types: `default` -*) Only one of `ResourceName` or `ArchiveName` must be set. +\*) Only one of `ResourceName` or `ArchiveName` must be set. ## ArchiveName {#ArchiveName} @@ -290,7 +313,7 @@ The path can be absolute or relative to the target directory of the app. * Required: `true`* * App Types: `default` -*) Only one of `ResourceName` or `ArchiveName` must be set. +\*) Only one of `ResourceName` or `ArchiveName` must be set. ## ArchiveTyp {#ArchiveTyp} diff --git a/docs/src-content/ref/app-library.md b/docs/src-content/ref/app-library.md index a08af21f..db4fae96 100644 --- a/docs/src-content/ref/app-library.md +++ b/docs/src-content/ref/app-library.md @@ -94,10 +94,11 @@ The following types of custom scripts are supported: * [`remove`](#custom-script-remove) * [`pre-run`](#custom-script-pre-run) * [`post-run`](#custom-script-post-run) +* [`test`](#custom-script-test) If the file format of the downloadable setup program for an app is not supported by Bench, then the file extraction can be implemented in the custom script -for the _extract_ setp. +for the _extract_ setup. If the original setup program of a Windows application performs some necessary actions to prepare the program files for execution, these actions @@ -112,6 +113,9 @@ in the custom script for the _env_ step. To perform some tasks every time before or after a program is executed, they can be implemented in the custom scripts for the _pre-run_ and _post-run_ steps. +When the app is tested for proper definition, the _test_ step is performed +after the installation. + ### App Custom Script Directory {#scripts-dir} * Description: The directory with the custom scripts of the apps. @@ -246,6 +250,18 @@ included in the list of adorned executables if the [registry isolation](/ref/app-properties/#RegistryKeys) is used. Inside of the _custom script_ is the [PowerShell API](/ref/ps-api/) available. +### App Custom Script `test` {#custom-script-test} + +* Description: Test hook for testing the installation of an app. +* Path: `\scripts\\.test.ps1` +* Type: file + +The _custom test script_ is executed, when an app definition is tested. +It is executed after a successful installation, after the existence of the +main executable was checked. +The test script fails when it writes an error or throws an exception; +otherwise it will count as a successful test. + ## App Setup Resources {#res} App setup resources are files, which are used by custom scripts to diff --git a/docs/src-content/ref/app-properties.md b/docs/src-content/ref/app-properties.md index dd706e19..ae022672 100644 --- a/docs/src-content/ref/app-properties.md +++ b/docs/src-content/ref/app-properties.md @@ -163,6 +163,27 @@ For package apps like `node-package` or `python3-package`, the path can be just the name of CLI wrapper script, given the package provides a CLI. +## ExeTestArguments {#ExeTestArguments} + +* Description: A string to pass as command line arguments when the executable is tested. +* Data Type: string +* Default: empty +* App Types: all + +To test if an app was installed successfully, +the main executable is run with these arguments. +If the process exit code is `0` the test was successful. + +## ExeTest {#ExeTest} + +* Description: A flag to prevent the test of the main executable. +* Data Type: boolean +* Default: `true` +* App Types: all + +If the main executable of an app can not be tested by executing it with the +[`ExeTestArguments`](#ExeTestArguments), this property must be set to `false`. + ## AdornedExecutables {#AdornedExecutables} * Description: A list of executables, which must be adorned with pre- and post-execution scripts @@ -254,7 +275,7 @@ The path can be absolute or relative to the target directory of the app. * Required: `true`* * App Types: `default` -*) Only one of `ResourceName` or `ArchiveName` must be set. +\*) Only one of `ResourceName` or `ArchiveName` must be set. ## ArchiveName {#ArchiveName} @@ -265,7 +286,7 @@ The path can be absolute or relative to the target directory of the app. * Required: `true`* * App Types: `default` -*) Only one of `ResourceName` or `ArchiveName` must be set. +\*) Only one of `ResourceName` or `ArchiveName` must be set. ## ArchiveTyp {#ArchiveTyp} From 2248fa138635debb93e73a8bd3efaa0c75f16086 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 26 Jan 2017 14:06:58 +0100 Subject: [PATCH 217/230] added methods for resetting configuration values --- .../GroupedPropertyCollection.cs | 17 +++++++++ .../BenchLib.Test/PropertyCollection.cs | 5 +++ .../BenchLib/GroupedPropertyCollection.cs | 35 +++++++++++++++++++ .../BenchLib/IGroupedPropertyTarget.cs | 7 ++++ BenchManager/BenchLib/IPropertyTarget.cs | 6 ++++ 5 files changed, 70 insertions(+) diff --git a/BenchManager/BenchLib.Test/GroupedPropertyCollection.cs b/BenchManager/BenchLib.Test/GroupedPropertyCollection.cs index 4a0e7e6f..a6a47ba5 100644 --- a/BenchManager/BenchLib.Test/GroupedPropertyCollection.cs +++ b/BenchManager/BenchLib.Test/GroupedPropertyCollection.cs @@ -131,5 +131,22 @@ public void SetGroupValue(string group, string name, object value) properties[name] = value; } } + + public void ResetGroupValue(string group, string name) + { + if (group == null) + { + ResetValue(name); + } + else + { + IDictionary properties; + if (!groups.TryGetValue(group, out properties)) + { + properties.Add(group, properties = new Dictionary()); + } + if (properties.ContainsKey(name)) properties.Remove(name); + } + } } } diff --git a/BenchManager/BenchLib.Test/PropertyCollection.cs b/BenchManager/BenchLib.Test/PropertyCollection.cs index 841cbab6..21a5b04e 100644 --- a/BenchManager/BenchLib.Test/PropertyCollection.cs +++ b/BenchManager/BenchLib.Test/PropertyCollection.cs @@ -43,5 +43,10 @@ public void SetValue(string name, object value) { properties[name] = value; } + + public void ResetValue(string name) + { + if (properties.ContainsKey(name)) properties.Remove(name); + } } } diff --git a/BenchManager/BenchLib/GroupedPropertyCollection.cs b/BenchManager/BenchLib/GroupedPropertyCollection.cs index 69f8a9cb..ff048cee 100644 --- a/BenchManager/BenchLib/GroupedPropertyCollection.cs +++ b/BenchManager/BenchLib/GroupedPropertyCollection.cs @@ -217,6 +217,12 @@ public bool CanGetGroupValue(string group, string name) /// The new value of the property. public void SetValue(string name, object value) { SetGroupValue(null, name, value); } + /// + /// Resets the specified property. + /// + /// The name of the property. + public void ResetValue(string name) { ResetGroupValue(null, name); } + /// /// Sets a string value for the specified group property. /// @@ -261,6 +267,35 @@ public void SetGroupValue(string group, string name, object value) InternalSetValue(group, name, value); } + /// + /// Resets the specified group property. + /// + /// The group of the property. + /// The name of the property. + public void ResetGroupValue(string group, string name) + { + group = group ?? string.Empty; + if (string.IsNullOrEmpty(name)) + { + throw new ArgumentOutOfRangeException("propertyName", "The property name must not be null or empty."); + } + List keys; + Dictionary groupDict; + if (groups.ContainsKey(group)) + { + keys = groupKeys[group]; + groupDict = groups[group]; + } + else + { + return; + } + if (groupDict.ContainsKey(name)) + { + groupDict.Remove(name); + } + } + private void InternalSetValue(string groupName, string propertyName, object value) { groupName = groupName ?? string.Empty; diff --git a/BenchManager/BenchLib/IGroupedPropertyTarget.cs b/BenchManager/BenchLib/IGroupedPropertyTarget.cs index 6aa5f894..5f1695ae 100644 --- a/BenchManager/BenchLib/IGroupedPropertyTarget.cs +++ b/BenchManager/BenchLib/IGroupedPropertyTarget.cs @@ -39,5 +39,12 @@ public interface IGroupedPropertyTarget /// The name of the property. /// The new value for the property. void SetGroupValue(string group, string name, object value); + + /// + /// Resets the specified group property. + /// + /// The group of the property. + /// The name of the property. + void ResetGroupValue(string group, string name); } } diff --git a/BenchManager/BenchLib/IPropertyTarget.cs b/BenchManager/BenchLib/IPropertyTarget.cs index 2286c6c5..965ecffe 100644 --- a/BenchManager/BenchLib/IPropertyTarget.cs +++ b/BenchManager/BenchLib/IPropertyTarget.cs @@ -17,5 +17,11 @@ public interface IPropertyTarget /// The name of the property. /// The new value of the property. void SetValue(string name, object value); + + /// + /// Resets the specified property. + /// + /// The name of the property. + void ResetValue(string name); } } From 13e7b5d3451dd82d8ff8d13c59dd3ac283e81df1 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 26 Jan 2017 14:08:19 +0100 Subject: [PATCH 218/230] added BenchConfiguration.ReloadAppActivation() --- BenchManager/BenchLib/AppFacade.cs | 25 ++++++++++++++++ BenchManager/BenchLib/BenchConfiguration.cs | 32 ++++++++++++++++----- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/BenchManager/BenchLib/AppFacade.cs b/BenchManager/BenchLib/AppFacade.cs index b3a692eb..76998dc9 100644 --- a/BenchManager/BenchLib/AppFacade.cs +++ b/BenchManager/BenchLib/AppFacade.cs @@ -1271,6 +1271,31 @@ internal void TrackResponsibilities() } } + /// + /// Resets the following properties: + /// + /// + /// IsActivated + /// + /// + /// IsDeactivated + /// + /// + /// IsRequired + /// + /// + /// IsDependency + /// + /// + /// + internal void ResetActivation() + { + AppIndex.ResetGroupValue(AppName, PropertyKeys.AppIsActivated); + AppIndex.ResetGroupValue(AppName, PropertyKeys.AppIsDeactivated); + AppIndex.ResetGroupValue(AppName, PropertyKeys.AppIsRequired); + AppIndex.ResetGroupValue(AppName, PropertyKeys.AppIsDependency); + } + private void SetupAdornmentForRegistryIsolation() { if (RegistryKeys.Length > 0 && AdornedExecutables.Length == 0) diff --git a/BenchManager/BenchLib/BenchConfiguration.cs b/BenchManager/BenchLib/BenchConfiguration.cs index 44a905c9..91415b06 100644 --- a/BenchManager/BenchLib/BenchConfiguration.cs +++ b/BenchManager/BenchLib/BenchConfiguration.cs @@ -238,8 +238,8 @@ public BenchConfiguration(string benchRootDir, bool loadAppIndex, bool loadCusto appIndexFacade = new AppIndexFacade(this); AutomaticConfiguration(); - AutomaticActivation(loadCustomConfiguration); - RecordResponsibilities(); + RecordAppResponsibilities(); + LoadAppActivation(); } private static string[] FindSiteConfigFiles(string benchRootDir, string fileName) @@ -418,7 +418,15 @@ private void AutomaticConfiguration() } } - private void AutomaticActivation(bool withCustomConfiguration) + private void RecordAppResponsibilities() + { + foreach (var app in new List(Apps)) + { + app.TrackResponsibilities(); + } + } + + private void LoadAppActivation() { // activate required apps @@ -428,7 +436,7 @@ private void AutomaticActivation(bool withCustomConfiguration) app.ActivateAsRequired(); } - if (withCustomConfiguration) + if (WithCustomConfiguration) { // activate manually activated apps @@ -456,14 +464,24 @@ private void AutomaticActivation(bool withCustomConfiguration) } } - private void RecordResponsibilities() + private void ResetAppActivation() { - foreach (var app in new List(Apps)) + foreach (var app in Apps) { - app.TrackResponsibilities(); + app.ResetActivation(); } } + /// + /// Reads the activation and deactivation files, + /// and reloads the app activation and dependency structure. + /// + public void ReloadAppActivation() + { + ResetAppActivation(); + LoadAppActivation(); + } + private bool IsPathProperty(string app, string property) { if (string.IsNullOrEmpty(app)) From b4b8cb86ebf29b9b24f668feb4401bcb97b374d0 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 26 Jan 2017 14:11:56 +0100 Subject: [PATCH 219/230] added Core.ReloadAppActivation(), improved configuration file event filtering --- BenchManager/BenchDashboard/Core.cs | 151 ++++++++++++++++-------- BenchManager/BenchDashboard/MainForm.cs | 2 +- 2 files changed, 103 insertions(+), 50 deletions(-) diff --git a/BenchManager/BenchDashboard/Core.cs b/BenchManager/BenchDashboard/Core.cs index 43ae0b35..400a4035 100644 --- a/BenchManager/BenchDashboard/Core.cs +++ b/BenchManager/BenchDashboard/Core.cs @@ -30,9 +30,17 @@ public class Core : IDisposable, IBenchManager private bool configReloadNecessary; + private bool activationReloadNecessary; + private readonly object configReloadLockHandle = new object(); - private FileSystemWatcher[] fsWatchers; + private FileSystemWatcher[] configFileWatchers; + + private FileSystemWatcher[] activationFileWatchers; + + private readonly Dictionary fileWriteTimeCache = new Dictionary(); + + private readonly TimeSpan FILE_CHANGE_TIME_FILTER_DELTA = new TimeSpan(0, 0, 0, 0, 100); private ActionState actionState; @@ -40,6 +48,8 @@ public class Core : IDisposable, IBenchManager public event EventHandler ConfigReloaded; + public event EventHandler AppActivationChanged; + public event EventHandler AllAppStateChanged; public event EventHandler AppStateChanged; @@ -97,9 +107,12 @@ public bool Busy if (value == busy) return; busy = value; OnBusyChanged(); - if (!busy && configReloadNecessary) + if (!busy) { - Reload(); + if (configReloadNecessary) + Reload(); + else if (activationReloadNecessary) + ReloadAppActivation(); } } } @@ -138,43 +151,75 @@ private void OnActionStateChanged() private void SetupFileWatchers() { DisposeFileWatchers(); - var paths = Config.GetConfigurationFiles( - ConfigurationFileType.UserConfig + + var configFileSet = ConfigurationFileType.UserConfig | ConfigurationFileType.SiteConfig - | ConfigurationFileType.UserAppLib - | ConfigurationFileType.AppSelection, - true, true); - fsWatchers = paths - .Select(p => p.Path) - .Select(p => new FileSystemWatcher(Path.GetDirectoryName(p)) - { - Filter = Path.GetFileName(p), - //NotifyFilter = NotifyFilters.LastWrite, - IncludeSubdirectories = false, - EnableRaisingEvents = true, - }) + | ConfigurationFileType.UserAppLib; + configFileWatchers = Config + .GetConfigurationFiles(configFileSet, actuallyLoaded: true, mustExist: true) + .Select(p => CreateFileWatcher(p.Path, ConfigFileChangedHandler)) .ToArray(); - foreach (var w in fsWatchers) + + var activationFileSet = ConfigurationFileType.AppSelection; + configFileWatchers = Config + .GetConfigurationFiles(activationFileSet, actuallyLoaded: true, mustExist: true) + .Select(p => CreateFileWatcher(p.Path, ActivationFileChangedHandler)) + .ToArray(); + } + + private FileSystemWatcher CreateFileWatcher(string path, FileSystemEventHandler handler) + { + var watcher = new FileSystemWatcher(Path.GetDirectoryName(path)) { - w.Changed += SourceFileChangedHandler; - } + Filter = Path.GetFileName(path), + IncludeSubdirectories = false, + EnableRaisingEvents = true, + }; + watcher.Changed += handler; + return watcher; } private void DisposeFileWatchers() { - if (fsWatchers != null) + if (configFileWatchers != null) + { + foreach (var w in configFileWatchers) + { + w.Changed -= ConfigFileChangedHandler; + w.Dispose(); + } + configFileWatchers = null; + } + if (activationFileWatchers != null) { - foreach (var w in fsWatchers) + foreach (var w in activationFileWatchers) { - w.Changed -= SourceFileChangedHandler; + w.Changed -= ActivationFileChangedHandler; w.Dispose(); } - fsWatchers = null; + activationFileWatchers = null; } } - private void SourceFileChangedHandler(object sender, FileSystemEventArgs e) + private bool CheckFileEvent(string path) { + lock (fileWriteTimeCache) + { + var t = File.GetLastWriteTime(path); + DateTime lastT; + if (fileWriteTimeCache.TryGetValue(path, out lastT) && + (lastT - t).Duration() < FILE_CHANGE_TIME_FILTER_DELTA) + { + return false; + } + fileWriteTimeCache[path] = t; + return true; + } + } + + private void ConfigFileChangedHandler(object sender, FileSystemEventArgs e) + { + if (!CheckFileEvent(e.FullPath)) return; if (busy) { configReloadNecessary = true; @@ -185,45 +230,43 @@ private void SourceFileChangedHandler(object sender, FileSystemEventArgs e) } } - private void OnConfigReloaded() + private void ActivationFileChangedHandler(object sender, FileSystemEventArgs e) { - SyncWithGui(() => + if (!CheckFileEvent(e.FullPath)) return; + if (busy) { - var handler = ConfigReloaded; - if (handler != null) - { - handler(this, EventArgs.Empty); - } - }); + activationReloadNecessary = true; + } + else + { + Task.Run(() => ReloadAppActivation()); + } + } + + private void OnConfigReloaded() + { + SyncWithGui(() => ConfigReloaded?.Invoke(this, EventArgs.Empty)); } private void OnAllAppStateChanged() { - SyncWithGui(() => - { - var handler = AllAppStateChanged; - if (handler != null) - { - handler(this, EventArgs.Empty); - } - }); + SyncWithGui(() => AllAppStateChanged?.Invoke(this, EventArgs.Empty)); + } + + private void OnAppActivationChanged() + { + SyncWithGui(() => AppActivationChanged?.Invoke(this, EventArgs.Empty)); } private void OnAppStateChanged(string appId) { - SyncWithGui(() => - { - var handler = AppStateChanged; - if (handler != null) - { - handler(this, new AppEventArgs(appId)); - } - }); + SyncWithGui(() => AppStateChanged?.Invoke(this, new AppEventArgs(appId))); } public void Reload(bool configChanged = false) { configReloadNecessary = false; + activationReloadNecessary = false; lock (configReloadLockHandle) { Config = Config.Reload(); @@ -237,6 +280,16 @@ public void Reload(bool configChanged = false) OnConfigReloaded(); } + public void ReloadAppActivation() + { + activationReloadNecessary = false; + lock (configReloadLockHandle) + { + Config.ReloadAppActivation(); + } + OnAppActivationChanged(); + } + public void SetAppActivated(string appId, bool value) { var activationFile = new ActivationFile(Config.GetStringValue(PropertyKeys.AppActivationFile)); diff --git a/BenchManager/BenchDashboard/MainForm.cs b/BenchManager/BenchDashboard/MainForm.cs index d225d8cb..60ea6331 100644 --- a/BenchManager/BenchDashboard/MainForm.cs +++ b/BenchManager/BenchDashboard/MainForm.cs @@ -24,9 +24,9 @@ public partial class MainForm : Form public MainForm(Core core) { this.core = core; + core.ConfigReloaded += ConfigReloadedHandler; core.AllAppStateChanged += AppStateChangedHandler; core.AppStateChanged += AppStateChangedHandler; - core.ConfigReloaded += ConfigReloadedHandler; core.BusyChanged += CoreBusyChangedHandler; InitializeComponent(); InitializeAppLauncherList(); From efc8540f5d4ef6a8b897c7a10c86ae8d286c97ad Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Thu, 26 Jan 2017 14:12:32 +0100 Subject: [PATCH 220/230] made use of event Core.AppActivationChanged, improved refresh performance in setup dialog --- BenchManager/BenchDashboard/MainForm.cs | 1 + BenchManager/BenchDashboard/SetupForm.cs | 17 ++++++- .../BenchDashboard/SortedBindingList.cs | 49 +++++-------------- 3 files changed, 27 insertions(+), 40 deletions(-) diff --git a/BenchManager/BenchDashboard/MainForm.cs b/BenchManager/BenchDashboard/MainForm.cs index 60ea6331..08c2e578 100644 --- a/BenchManager/BenchDashboard/MainForm.cs +++ b/BenchManager/BenchDashboard/MainForm.cs @@ -26,6 +26,7 @@ public MainForm(Core core) this.core = core; core.ConfigReloaded += ConfigReloadedHandler; core.AllAppStateChanged += AppStateChangedHandler; + core.AppActivationChanged += AppStateChangedHandler; core.AppStateChanged += AppStateChangedHandler; core.BusyChanged += CoreBusyChangedHandler; InitializeComponent(); diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index 30afb40a..ab22f9d3 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -40,6 +40,7 @@ public SetupForm(Core core) this.core = core; core.ConfigReloaded += CoreConfigReloadedHandler; core.AllAppStateChanged += CoreAllAppStateChangedHandler; + core.AppActivationChanged += CoreAppActivationChangedHandler; core.AppStateChanged += CoreAppStateChangedHandler; core.BusyChanged += CoreBusyChangedHandler; core.ActionStateChanged += CoreActionStateChangedHandler; @@ -185,6 +186,12 @@ private void CoreAllAppStateChangedHandler(object sender, EventArgs e) UpdatePendingCounts(); } + private void CoreAppActivationChangedHandler(object sender, EventArgs e) + { + var l = (SortedBindingList)gridApps.DataSource; + l.NotifyListChanged(); + } + private void CoreAppStateChangedHandler(object sender, AppEventArgs e) { NotifyAppStateChange(e.ID); @@ -192,12 +199,18 @@ private void CoreAppStateChangedHandler(object sender, AppEventArgs e) } private void NotifyAppStateChange(string appId) + { + ForAppWrapper(appId, w => w.App.DiscardCachedValues()); + var l = (SortedBindingList)gridApps.DataSource; + l.NotifyListChanged(); + } + + private void ForAppWrapper(string appId, Action action) { AppWrapper wrapper; if (appLookup.TryGetValue(appId, out wrapper)) { - wrapper.App.DiscardCachedValues(); - wrapper.NotifyChanges(); + action(wrapper); } } diff --git a/BenchManager/BenchDashboard/SortedBindingList.cs b/BenchManager/BenchDashboard/SortedBindingList.cs index beaa71e3..6802a0ca 100644 --- a/BenchManager/BenchDashboard/SortedBindingList.cs +++ b/BenchManager/BenchDashboard/SortedBindingList.cs @@ -21,45 +21,15 @@ public SortedBindingList(IEnumerable enumeration) { } - protected override bool IsSortedCore - { - get - { - return m_isSorted; - } - } + protected override bool IsSortedCore => m_isSorted; - protected override ListSortDirection SortDirectionCore - { - get - { - return m_sortDirection; - } - } + protected override ListSortDirection SortDirectionCore => m_sortDirection; - protected override PropertyDescriptor SortPropertyCore - { - get - { - return m_propertyDescriptor; - } - } + protected override PropertyDescriptor SortPropertyCore => m_propertyDescriptor; - protected override bool SupportsSearchingCore - { - get - { - return true; - } - } + protected override bool SupportsSearchingCore => true; - protected override bool SupportsSortingCore - { - get - { - return true; - } - } + protected override bool SupportsSortingCore => true; protected override void ApplySortCore(PropertyDescriptor propertyDesciptor, ListSortDirection sortDirection) { @@ -73,9 +43,7 @@ protected override void ApplySortCore(PropertyDescriptor propertyDesciptor, List } protected virtual IComparer createComparer(PropertyDescriptor property, ListSortDirection direction) - { - return new PropertyDescriptorComparer(property, direction); - } + => new PropertyDescriptorComparer(property, direction); private void sort(IComparer comparer) { @@ -108,6 +76,11 @@ protected override void RemoveSortCore() OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, NO_ITEM_INDEX)); } + + public void NotifyListChanged() + { + OnListChanged(new ListChangedEventArgs(ListChangedType.PropertyDescriptorChanged, 0)); + } } public class PropertyDescriptorComparer : IComparer From 1a346cc7bce6660c790ff0231820e0c2524ccc83 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 10:31:20 +0100 Subject: [PATCH 221/230] removed buggy event filtering --- BenchManager/BenchDashboard/Core.cs | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/BenchManager/BenchDashboard/Core.cs b/BenchManager/BenchDashboard/Core.cs index 400a4035..7051e1a1 100644 --- a/BenchManager/BenchDashboard/Core.cs +++ b/BenchManager/BenchDashboard/Core.cs @@ -38,10 +38,6 @@ public class Core : IDisposable, IBenchManager private FileSystemWatcher[] activationFileWatchers; - private readonly Dictionary fileWriteTimeCache = new Dictionary(); - - private readonly TimeSpan FILE_CHANGE_TIME_FILTER_DELTA = new TimeSpan(0, 0, 0, 0, 100); - private ActionState actionState; private Cancelation cancelation; @@ -201,25 +197,8 @@ private void DisposeFileWatchers() } } - private bool CheckFileEvent(string path) - { - lock (fileWriteTimeCache) - { - var t = File.GetLastWriteTime(path); - DateTime lastT; - if (fileWriteTimeCache.TryGetValue(path, out lastT) && - (lastT - t).Duration() < FILE_CHANGE_TIME_FILTER_DELTA) - { - return false; - } - fileWriteTimeCache[path] = t; - return true; - } - } - private void ConfigFileChangedHandler(object sender, FileSystemEventArgs e) { - if (!CheckFileEvent(e.FullPath)) return; if (busy) { configReloadNecessary = true; @@ -232,7 +211,6 @@ private void ConfigFileChangedHandler(object sender, FileSystemEventArgs e) private void ActivationFileChangedHandler(object sender, FileSystemEventArgs e) { - if (!CheckFileEvent(e.FullPath)) return; if (busy) { activationReloadNecessary = true; From 7bba5667daaa94bdc11182921629fa4701082137 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 10:31:47 +0100 Subject: [PATCH 222/230] improved app list behavior on updates --- .../BenchDashboard/SetupForm.Designer.cs | 326 +++++++++--------- BenchManager/BenchDashboard/SetupForm.cs | 26 +- 2 files changed, 179 insertions(+), 173 deletions(-) diff --git a/BenchManager/BenchDashboard/SetupForm.Designer.cs b/BenchManager/BenchDashboard/SetupForm.Designer.cs index 48f58b1d..65dea6fb 100644 --- a/BenchManager/BenchDashboard/SetupForm.Designer.cs +++ b/BenchManager/BenchDashboard/SetupForm.Designer.cs @@ -50,6 +50,19 @@ private void InitializeComponent() this.lblTask = new System.Windows.Forms.Label(); this.lblTaskLabel = new System.Windows.Forms.Label(); this.gridApps = new System.Windows.Forms.DataGridView(); + this.colIcon = new System.Windows.Forms.DataGridViewImageColumn(); + this.colIndex = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colLibrary = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colID = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colCategory = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colLabel = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colVersion = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colActivated = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.colExcluded = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.colStatus = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colTyp = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colLicense = new System.Windows.Forms.DataGridViewLinkColumn(); + this.colComment = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.ctxmAppActions = new System.Windows.Forms.ContextMenuStrip(this.components); this.miAppInfo = new System.Windows.Forms.ToolStripMenuItem(); this.miWebsite = new System.Windows.Forms.ToolStripMenuItem(); @@ -92,19 +105,6 @@ private void InitializeComponent() this.tsmiShowCustomAppIndex = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiAlwaysShowDownloads = new System.Windows.Forms.ToolStripMenuItem(); this.tsmiRefreshView = new System.Windows.Forms.ToolStripMenuItem(); - this.colIcon = new System.Windows.Forms.DataGridViewImageColumn(); - this.colIndex = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colLibrary = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colID = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colCategory = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colLabel = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colVersion = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colActivated = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.colExcluded = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.colStatus = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colTyp = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.colLicense = new System.Windows.Forms.DataGridViewLinkColumn(); - this.colComment = new System.Windows.Forms.DataGridViewTextBoxColumn(); toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); @@ -309,6 +309,156 @@ private void InitializeComponent() this.gridApps.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.gridApps_ColumnHeaderMouseClick); this.gridApps.RowContextMenuStripNeeded += new System.Windows.Forms.DataGridViewRowContextMenuStripNeededEventHandler(this.gridApps_RowContextMenuStripNeeded); // + // colIcon + // + this.colIcon.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; + this.colIcon.DataPropertyName = "StatusIcon"; + this.colIcon.Frozen = true; + this.colIcon.HeaderText = ""; + this.colIcon.Name = "colIcon"; + this.colIcon.ReadOnly = true; + this.colIcon.Width = 32; + // + // colIndex + // + this.colIndex.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colIndex.DataPropertyName = "Index"; + this.colIndex.Frozen = true; + this.colIndex.HeaderText = "Order"; + this.colIndex.Name = "colIndex"; + this.colIndex.ReadOnly = true; + this.colIndex.ToolTipText = "The index number from the app registry."; + this.colIndex.Width = 62; + // + // colLibrary + // + this.colLibrary.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colLibrary.DataPropertyName = "AppLibrary"; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.colLibrary.DefaultCellStyle = dataGridViewCellStyle1; + this.colLibrary.Frozen = true; + this.colLibrary.HeaderText = "Library"; + this.colLibrary.Name = "colLibrary"; + this.colLibrary.ReadOnly = true; + this.colLibrary.ToolTipText = "The ID of the library, this app is defined in."; + this.colLibrary.Width = 66; + // + // colID + // + this.colID.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colID.DataPropertyName = "ID"; + dataGridViewCellStyle2.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.colID.DefaultCellStyle = dataGridViewCellStyle2; + this.colID.Frozen = true; + this.colID.HeaderText = "ID"; + this.colID.Name = "colID"; + this.colID.ReadOnly = true; + this.colID.ToolTipText = "The full ID of the app including the namespace."; + this.colID.Width = 43; + // + // colCategory + // + this.colCategory.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colCategory.DataPropertyName = "Category"; + this.colCategory.Frozen = true; + this.colCategory.HeaderText = "Category"; + this.colCategory.Name = "colCategory"; + this.colCategory.ReadOnly = true; + this.colCategory.ToolTipText = "The category of the app."; + this.colCategory.Width = 78; + // + // colLabel + // + this.colLabel.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colLabel.DataPropertyName = "Label"; + this.colLabel.Frozen = true; + this.colLabel.HeaderText = "Label"; + this.colLabel.Name = "colLabel"; + this.colLabel.ReadOnly = true; + this.colLabel.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colLabel.ToolTipText = "The user friendly name of the app."; + this.colLabel.Width = 59; + // + // colVersion + // + this.colVersion.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colVersion.DataPropertyName = "Version"; + this.colVersion.Frozen = true; + this.colVersion.HeaderText = "Version"; + this.colVersion.Name = "colVersion"; + this.colVersion.ReadOnly = true; + this.colVersion.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colVersion.ToolTipText = "The version number of the app."; + this.colVersion.Width = 70; + // + // colActivated + // + this.colActivated.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.colActivated.DataPropertyName = "IsActive"; + this.colActivated.FalseValue = "inactive"; + this.colActivated.Frozen = true; + this.colActivated.HeaderText = "Active"; + this.colActivated.IndeterminateValue = "implicit"; + this.colActivated.Name = "colActivated"; + this.colActivated.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.colActivated.ThreeState = true; + this.colActivated.ToolTipText = "States whether the app is activated by the user or not."; + this.colActivated.TrueValue = "active"; + this.colActivated.Width = 62; + // + // colExcluded + // + this.colExcluded.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.colExcluded.DataPropertyName = "IsDeactivated"; + this.colExcluded.Frozen = true; + this.colExcluded.HeaderText = "Deactivated"; + this.colExcluded.Name = "colExcluded"; + this.colExcluded.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.colExcluded.ToolTipText = "States whether the app is deactivated by the user."; + this.colExcluded.Width = 92; + // + // colStatus + // + this.colStatus.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colStatus.DataPropertyName = "ShortStatus"; + this.colStatus.Frozen = true; + this.colStatus.HeaderText = "Status"; + this.colStatus.Name = "colStatus"; + this.colStatus.ReadOnly = true; + this.colStatus.ToolTipText = "A brief description of the apps status."; + this.colStatus.Width = 64; + // + // colTyp + // + this.colTyp.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colTyp.DataPropertyName = "Typ"; + this.colTyp.Frozen = true; + this.colTyp.HeaderText = "Typ"; + this.colTyp.Name = "colTyp"; + this.colTyp.ReadOnly = true; + this.colTyp.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colTyp.ToolTipText = "The typ of the app."; + this.colTyp.Width = 48; + // + // colLicense + // + this.colLicense.DataPropertyName = "License"; + this.colLicense.Frozen = true; + this.colLicense.HeaderText = "License"; + this.colLicense.Name = "colLicense"; + this.colLicense.ReadOnly = true; + this.colLicense.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // colComment + // + this.colComment.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.colComment.DataPropertyName = "LongStatus"; + this.colComment.HeaderText = "Comment"; + this.colComment.MinimumWidth = 100; + this.colComment.Name = "colComment"; + this.colComment.ReadOnly = true; + this.colComment.ToolTipText = "A more detailed description of the apps status."; + // // ctxmAppActions // this.ctxmAppActions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -687,156 +837,6 @@ private void InitializeComponent() this.tsmiRefreshView.Text = "&Refresh"; this.tsmiRefreshView.Click += new System.EventHandler(this.RefreshViewHandler); // - // colIcon - // - this.colIcon.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; - this.colIcon.DataPropertyName = "StatusIcon"; - this.colIcon.Frozen = true; - this.colIcon.HeaderText = ""; - this.colIcon.Name = "colIcon"; - this.colIcon.ReadOnly = true; - this.colIcon.Width = 32; - // - // colIndex - // - this.colIndex.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colIndex.DataPropertyName = "Index"; - this.colIndex.Frozen = true; - this.colIndex.HeaderText = "Order"; - this.colIndex.Name = "colIndex"; - this.colIndex.ReadOnly = true; - this.colIndex.ToolTipText = "The index number from the app registry."; - this.colIndex.Width = 62; - // - // colLibrary - // - this.colLibrary.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colLibrary.DataPropertyName = "AppLibrary"; - dataGridViewCellStyle1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.colLibrary.DefaultCellStyle = dataGridViewCellStyle1; - this.colLibrary.Frozen = true; - this.colLibrary.HeaderText = "Library"; - this.colLibrary.Name = "colLibrary"; - this.colLibrary.ReadOnly = true; - this.colLibrary.ToolTipText = "The ID of the library, this app is defined in."; - this.colLibrary.Width = 66; - // - // colID - // - this.colID.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colID.DataPropertyName = "ID"; - dataGridViewCellStyle2.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.colID.DefaultCellStyle = dataGridViewCellStyle2; - this.colID.Frozen = true; - this.colID.HeaderText = "ID"; - this.colID.Name = "colID"; - this.colID.ReadOnly = true; - this.colID.ToolTipText = "The full ID of the app including the namespace."; - this.colID.Width = 43; - // - // colCategory - // - this.colCategory.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colCategory.DataPropertyName = "Category"; - this.colCategory.Frozen = true; - this.colCategory.HeaderText = "Category"; - this.colCategory.Name = "colCategory"; - this.colCategory.ReadOnly = true; - this.colCategory.ToolTipText = "The category of the app."; - this.colCategory.Width = 78; - // - // colLabel - // - this.colLabel.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colLabel.DataPropertyName = "Label"; - this.colLabel.Frozen = true; - this.colLabel.HeaderText = "Label"; - this.colLabel.Name = "colLabel"; - this.colLabel.ReadOnly = true; - this.colLabel.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.colLabel.ToolTipText = "The user friendly name of the app."; - this.colLabel.Width = 59; - // - // colVersion - // - this.colVersion.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colVersion.DataPropertyName = "Version"; - this.colVersion.Frozen = true; - this.colVersion.HeaderText = "Version"; - this.colVersion.Name = "colVersion"; - this.colVersion.ReadOnly = true; - this.colVersion.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.colVersion.ToolTipText = "The version number of the app."; - this.colVersion.Width = 70; - // - // colActivated - // - this.colActivated.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; - this.colActivated.DataPropertyName = "IsActive"; - this.colActivated.FalseValue = "inactive"; - this.colActivated.Frozen = true; - this.colActivated.HeaderText = "Active"; - this.colActivated.IndeterminateValue = "implicit"; - this.colActivated.Name = "colActivated"; - this.colActivated.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - this.colActivated.ThreeState = true; - this.colActivated.ToolTipText = "States whether the app is activated by the user or not."; - this.colActivated.TrueValue = "active"; - this.colActivated.Width = 62; - // - // colExcluded - // - this.colExcluded.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; - this.colExcluded.DataPropertyName = "IsDeactivated"; - this.colExcluded.Frozen = true; - this.colExcluded.HeaderText = "Deactivated"; - this.colExcluded.Name = "colExcluded"; - this.colExcluded.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - this.colExcluded.ToolTipText = "States whether the app is deactivated by the user."; - this.colExcluded.Width = 92; - // - // colStatus - // - this.colStatus.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colStatus.DataPropertyName = "ShortStatus"; - this.colStatus.Frozen = true; - this.colStatus.HeaderText = "Status"; - this.colStatus.Name = "colStatus"; - this.colStatus.ReadOnly = true; - this.colStatus.ToolTipText = "A brief description of the apps status."; - this.colStatus.Width = 64; - // - // colTyp - // - this.colTyp.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.colTyp.DataPropertyName = "Typ"; - this.colTyp.Frozen = true; - this.colTyp.HeaderText = "Typ"; - this.colTyp.Name = "colTyp"; - this.colTyp.ReadOnly = true; - this.colTyp.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.colTyp.ToolTipText = "The typ of the app."; - this.colTyp.Width = 48; - // - // colLicense - // - this.colLicense.DataPropertyName = "License"; - this.colLicense.Frozen = true; - this.colLicense.HeaderText = "License"; - this.colLicense.Name = "colLicense"; - this.colLicense.ReadOnly = true; - this.colLicense.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - // - // colComment - // - this.colComment.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.colComment.DataPropertyName = "LongStatus"; - this.colComment.HeaderText = "Comment"; - this.colComment.MinimumWidth = 100; - this.colComment.Name = "colComment"; - this.colComment.ReadOnly = true; - this.colComment.ToolTipText = "A more detailed description of the apps status."; - // // SetupForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index ab22f9d3..ddb7058c 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -24,6 +24,7 @@ public partial class SetupForm : Form private readonly Dictionary appLookup = new Dictionary(); + private int firstVisibleRowIndex; private ConEmuExecutionHost conHost; private ConEmuControl conControl; @@ -169,6 +170,7 @@ private void InitializeAppListColumns() private void CoreConfigReloadedHandler(object sender, EventArgs e) { + firstVisibleRowIndex = gridApps.FirstDisplayedScrollingRowIndex; InitializeDownloadList(); InitializeAppIndexMenu(); InitializeAppListColumnsMenu(); @@ -181,15 +183,15 @@ private void CoreAllAppStateChangedHandler(object sender, EventArgs e) { foreach (var app in core.Config.Apps) { - NotifyAppStateChange(app.ID); + app.DiscardCachedValues(); } + gridApps.Refresh(); UpdatePendingCounts(); } private void CoreAppActivationChangedHandler(object sender, EventArgs e) { - var l = (SortedBindingList)gridApps.DataSource; - l.NotifyListChanged(); + gridApps.Refresh(); } private void CoreAppStateChangedHandler(object sender, AppEventArgs e) @@ -200,9 +202,11 @@ private void CoreAppStateChangedHandler(object sender, AppEventArgs e) private void NotifyAppStateChange(string appId) { - ForAppWrapper(appId, w => w.App.DiscardCachedValues()); - var l = (SortedBindingList)gridApps.DataSource; - l.NotifyListChanged(); + ForAppWrapper(appId, w => + { + w.App.DiscardCachedValues(); + w.NotifyChanges(); + }); } private void ForAppWrapper(string appId, Action action) @@ -371,9 +375,11 @@ private void InitializeAppList() BeginInvoke((ThreadStart)(() => { var selectedRow = gridApps.SelectedRows.Count > 0 ? gridApps.SelectedRows[0].Index : -10; - var firstVisibleRow = gridApps.FirstDisplayedScrollingRowIndex; gridApps.SuspendLayout(); - gridApps.DataSource = bindingList; + if (gridApps.DataSource == null) + { + gridApps.DataSource = bindingList; + } if (sortedColumn != null) { gridApps.Sort(sortedColumn, sortDirection); @@ -382,9 +388,9 @@ private void InitializeAppList() { gridApps.Rows[selectedRow].Selected = true; } - if (firstVisibleRow >= 0) + if (firstVisibleRowIndex >= 0) { - gridApps.FirstDisplayedScrollingRowIndex = firstVisibleRow; + gridApps.FirstDisplayedScrollingRowIndex = firstVisibleRowIndex; } gridApps.ResumeLayout(); })); From a89e66031931c6d61c69cc722af0732ab05868a2 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 10:31:56 +0100 Subject: [PATCH 223/230] code reformatting --- BenchManager/BenchDashboard/Core.cs | 74 +++++------------------------ 1 file changed, 11 insertions(+), 63 deletions(-) diff --git a/BenchManager/BenchDashboard/Core.cs b/BenchManager/BenchDashboard/Core.cs index 7051e1a1..470ef311 100644 --- a/BenchManager/BenchDashboard/Core.cs +++ b/BenchManager/BenchDashboard/Core.cs @@ -63,7 +63,7 @@ private Action CatchTaskInfos(Action notify) OnAppStateChanged(info.AppId); } if (info is TaskError) ActionState = ActionState.BusyWithErrors; - if (notify != null) notify(info); + notify?.Invoke(info); }; } @@ -86,13 +86,9 @@ public void Shutdown() public void SyncWithGui(ThreadStart task) { if (GuiContext != null && GuiContext.InvokeRequired) - { GuiContext.Invoke(task); - } else - { task(); - } } public bool Busy @@ -114,13 +110,7 @@ public bool Busy } private void OnBusyChanged() - { - SyncWithGui(() => - { - var handler = BusyChanged; - if (handler != null) handler(this, EventArgs.Empty); - }); - } + => SyncWithGui(() => BusyChanged?.Invoke(this, EventArgs.Empty)); public ActionState ActionState { @@ -134,13 +124,7 @@ public ActionState ActionState } private void OnActionStateChanged() - { - SyncWithGui(() => - { - var handler = ActionStateChanged; - if (handler != null) handler(this, EventArgs.Empty); - }); - } + => SyncWithGui(() => ActionStateChanged?.Invoke(this, EventArgs.Empty)); public Cancelation Cancelation { get { return cancelation; } } @@ -200,46 +184,30 @@ private void DisposeFileWatchers() private void ConfigFileChangedHandler(object sender, FileSystemEventArgs e) { if (busy) - { configReloadNecessary = true; - } else - { Task.Run(() => Reload(true)); - } } private void ActivationFileChangedHandler(object sender, FileSystemEventArgs e) { if (busy) - { activationReloadNecessary = true; - } else - { Task.Run(() => ReloadAppActivation()); - } } private void OnConfigReloaded() - { - SyncWithGui(() => ConfigReloaded?.Invoke(this, EventArgs.Empty)); - } + => SyncWithGui(() => ConfigReloaded?.Invoke(this, EventArgs.Empty)); private void OnAllAppStateChanged() - { - SyncWithGui(() => AllAppStateChanged?.Invoke(this, EventArgs.Empty)); - } + => SyncWithGui(() => AllAppStateChanged?.Invoke(this, EventArgs.Empty)); private void OnAppActivationChanged() - { - SyncWithGui(() => AppActivationChanged?.Invoke(this, EventArgs.Empty)); - } + => SyncWithGui(() => AppActivationChanged?.Invoke(this, EventArgs.Empty)); private void OnAppStateChanged(string appId) - { - SyncWithGui(() => AppStateChanged?.Invoke(this, new AppEventArgs(appId))); - } + => SyncWithGui(() => AppStateChanged?.Invoke(this, new AppEventArgs(appId))); public void Reload(bool configChanged = false) { @@ -272,45 +240,25 @@ public void SetAppActivated(string appId, bool value) { var activationFile = new ActivationFile(Config.GetStringValue(PropertyKeys.AppActivationFile)); if (value) - { activationFile.SignIn(appId); - } else - { activationFile.SignOut(appId); - } } public void SetAppDeactivated(string appId, bool value) { var deactivationFile = new ActivationFile(Config.GetStringValue(PropertyKeys.AppDeactivationFile)); if (value) - { deactivationFile.SignIn(appId); - } else - { deactivationFile.SignOut(appId); - } } - public Task RunTaskAsync(BenchTaskForAll action, - Action notify, Cancelation cancelation) - { - return Task.Run(() => - { - return action(this, CatchTaskInfos(notify), cancelation); - }); - } + public Task RunTaskAsync(BenchTaskForAll action, Action notify, Cancelation cancelation) + => Task.Run(() => action(this, CatchTaskInfos(notify), cancelation)); - public Task RunTaskAsync(BenchTaskForOne action, string appId, - Action notify, Cancelation cancelation) - { - return Task.Run(() => - { - return action(this, appId, CatchTaskInfos(notify), cancelation); - }); - } + public Task RunTaskAsync(BenchTaskForOne action, string appId, Action notify, Cancelation cancelation) + => Task.Run(() => action(this, appId, CatchTaskInfos(notify), cancelation)); private void BeginAction() { From d8978b8e50150a580b0f2473c880e016aaf0a011 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 16:07:19 +0100 Subject: [PATCH 224/230] fixed possible invalid thread access --- BenchManager/BenchDashboard/DownloadList.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BenchManager/BenchDashboard/DownloadList.cs b/BenchManager/BenchDashboard/DownloadList.cs index 4f42576b..ad604b19 100644 --- a/BenchManager/BenchDashboard/DownloadList.cs +++ b/BenchManager/BenchDashboard/DownloadList.cs @@ -65,6 +65,11 @@ private void UnbindDownloader() private void DownloaderIsWorkingChangedHandler(object sender, EventArgs e) { + if (InvokeRequired) + { + Invoke((EventHandler)DownloaderIsWorkingChangedHandler, sender, e); + return; + } if (downloader.IsWorking) { ClearDownloadTasks(); From 0446012ca5e887a1ce30b937c427e3e40347b259 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 16:07:52 +0100 Subject: [PATCH 225/230] fixed app list update in setup form --- BenchManager/BenchDashboard/SetupForm.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/BenchManager/BenchDashboard/SetupForm.cs b/BenchManager/BenchDashboard/SetupForm.cs index ddb7058c..21ddd18a 100644 --- a/BenchManager/BenchDashboard/SetupForm.cs +++ b/BenchManager/BenchDashboard/SetupForm.cs @@ -376,10 +376,7 @@ private void InitializeAppList() { var selectedRow = gridApps.SelectedRows.Count > 0 ? gridApps.SelectedRows[0].Index : -10; gridApps.SuspendLayout(); - if (gridApps.DataSource == null) - { - gridApps.DataSource = bindingList; - } + gridApps.DataSource = bindingList; if (sortedColumn != null) { gridApps.Sort(sortedColumn, sortDirection); From aa1f039b1a0f375bd03733ef7ef2db00addc2c5a Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 16:08:25 +0100 Subject: [PATCH 226/230] fixed PS API function App-Exe (returned path, when exe file did not exists) --- auto/lib/config.lib.ps1 | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/auto/lib/config.lib.ps1 b/auto/lib/config.lib.ps1 index df9832dc..b73374e0 100644 --- a/auto/lib/config.lib.ps1 +++ b/auto/lib/config.lib.ps1 @@ -32,7 +32,7 @@ function App-Force([string]$name) { return $global:BenchConfig.Apps[$name].Force function App-PackageName([string]$name) { return $global:BenchConfig.Apps[$name].PackageName } function App-Dir([string]$name) { return $global:BenchConfig.Apps[$name].Dir } function App-Paths([string]$name) { return $global:BenchConfig.Apps[$name].Path } -function App-Exe([string]$name, [bool]$checkExist = $true) { return $global:BenchConfig.Apps[$name].Exe } + function App-Register([string]$name) { return $global:BenchConfig.Apps[$name].Register } function App-Environment([string]$name) { return $global:BenchConfig.Apps[$name].Environment } function App-AdornedExecutables([string]$name) { return $global:BenchConfig.Apps[$name].AdornedExecutables } @@ -46,7 +46,21 @@ function Check-App([string]$name) { return $global:BenchConfig.Apps[$name].IsIns function App-CustomScript([string]$name, [string]$typ) { return $global:BenchConfig.Apps[$name].GetCustomScript($typ) } function App-SetupResource([string]$name, [string]$relPath) { return $global:BenchConfig.Apps[$name].GetSetupResource($relPath) } -function App-Path([string]$name) { +function App-Exe([string]$name, [bool]$checkExist = $true) +{ + $p = $global:BenchConfig.Apps[$name].Exe + if (!$checkExist -or [IO.File]::Exists($p)) + { + return $p + } + else + { + return $null + } +} + +function App-Path([string]$name) +{ $path = $global:BenchConfig.Apps[$name].Path if ($path.Length -gt 0) { From e6ed338b8e47fbd56a68bc6fa2c1f3334881c21e Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 16:28:25 +0100 Subject: [PATCH 227/230] updated changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79a476e7..917efabb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,8 @@ Add a link to the GitHub diff like + `KnownLicenses` - Support for multiple app libraries ([#90](https://github.com/mastersign/bench/issues/90)) + Support for license infos + ([#91](https://github.com/mastersign/bench/issues/91)) - Namespaces for app IDs - Config properties: + `AppLibs` @@ -67,10 +69,13 @@ Add a link to the GitHub diff like + + - In the future, all app related issues are attended at the app library repositories on GitHub +- Improved performance for app selection in the Setup Dialog of BenchDashboard ### Fixed - Proxy setup for Maven ([#89](https://github.com/mastersign/bench/issues/89)) +- Download view in the Setup Dialog of the BenchDashboard + ([#81](https://github.com/mastersign/bench/issues/81)) ### Removed - Script based actions From fbb6e3725cfb1aed4b9782c07fc101455966bbb4 Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 16:30:27 +0100 Subject: [PATCH 228/230] updated app pages in the docs --- build/update-app-list.ps1 | 3 +- docs/content/apps/Bench.AntRenamer.md | 4 +-- docs/content/apps/Bench.Apache.md | 8 ++--- docs/content/apps/Bench.Atom.md | 8 ++--- docs/content/apps/Bench.Blender.md | 4 +-- docs/content/apps/Bench.Bower.md | 4 +-- docs/content/apps/Bench.CMake.md | 8 ++--- docs/content/apps/Bench.Clang.md | 14 ++++---- docs/content/apps/Bench.CoffeeScript.md | 10 +++--- docs/content/apps/Bench.ConEmu.md | 4 +-- docs/content/apps/Bench.Dia.md | 4 +-- docs/content/apps/Bench.DotNetCore.md | 14 ++++---- docs/content/apps/Bench.EclipseCpp.md | 4 +-- docs/content/apps/Bench.EclipseJava.md | 4 +-- docs/content/apps/Bench.EclipsePHP.md | 4 +-- docs/content/apps/Bench.Emacs.md | 8 ++--- docs/content/apps/Bench.Erlang.md | 14 ++++---- docs/content/apps/Bench.FFmpeg.md | 4 +-- docs/content/apps/Bench.FileZilla.md | 8 ++--- docs/content/apps/Bench.FreeCAD.md | 4 +-- docs/content/apps/Bench.Gimp.md | 4 +-- docs/content/apps/Bench.GitKraken.md | 4 +-- docs/content/apps/Bench.GnuPG.md | 4 +-- docs/content/apps/Bench.GnuTLS.md | 8 ++--- docs/content/apps/Bench.Go.md | 14 ++++---- docs/content/apps/Bench.GraphicsMagick.md | 8 ++--- docs/content/apps/Bench.Graphviz.md | 5 +-- docs/content/apps/Bench.Grunt.md | 8 ++--- docs/content/apps/Bench.Gulp.md | 5 +-- docs/content/apps/Bench.HandBrake.md | 36 +++++++++++++++++++ docs/content/apps/Bench.HandBrakeCLI.md | 36 +++++++++++++++++++ docs/content/apps/Bench.Hugo.md | 8 ++--- docs/content/apps/Bench.IPython2.md | 11 ++---- docs/content/apps/Bench.IPython3.md | 11 ++---- docs/content/apps/Bench.Inkscape.md | 11 +++--- docs/content/apps/Bench.Iron.md | 4 +-- docs/content/apps/Bench.JDK7.md | 10 +++--- docs/content/apps/Bench.JDK8.md | 14 ++++---- docs/content/apps/Bench.JRE7.md | 10 +++--- docs/content/apps/Bench.JRE8.md | 14 ++++---- docs/content/apps/Bench.JSBeautify.md | 42 +++++++++++++++++++++++ docs/content/apps/Bench.JSHint.md | 8 ++--- docs/content/apps/Bench.JabRef.md | 8 ++--- docs/content/apps/Bench.Jupyter.md | 38 ++++++++++++++++++++ docs/content/apps/Bench.Leiningen.md | 10 +++--- docs/content/apps/Bench.LightTable.md | 4 +-- docs/content/apps/Bench.MarkdownEdit.md | 36 +++++++++++++++++++ docs/content/apps/Bench.Maven.md | 4 +-- docs/content/apps/Bench.MeshLab.md | 8 ++--- docs/content/apps/Bench.MiKTeX.md | 14 +++++--- docs/content/apps/Bench.MinGW.md | 10 +++--- docs/content/apps/Bench.MinGwGet.md | 10 +++--- docs/content/apps/Bench.MinGwGetGui.md | 10 +++--- docs/content/apps/Bench.MySQL.md | 8 ++--- docs/content/apps/Bench.MySQLUtils.md | 33 ++++++++++++++++++ docs/content/apps/Bench.MySQLWB.md | 8 ++--- docs/content/apps/Bench.NUnitRunners.md | 4 +-- docs/content/apps/Bench.Node.md | 4 +-- docs/content/apps/Bench.Notepad2.md | 37 ++++++++++++++++++++ docs/content/apps/Bench.Npm.md | 2 +- docs/content/apps/Bench.OpenSSL.md | 4 +-- docs/content/apps/Bench.PHP5.md | 14 ++++---- docs/content/apps/Bench.PHP7.md | 14 ++++---- docs/content/apps/Bench.Pandoc.md | 9 ++--- docs/content/apps/Bench.PostgreSQL.md | 8 ++--- docs/content/apps/Bench.Putty.md | 4 +-- docs/content/apps/Bench.PyReadline2.md | 4 +-- docs/content/apps/Bench.PyReadline3.md | 4 +-- docs/content/apps/Bench.Python2.md | 4 +-- docs/content/apps/Bench.Python3.md | 2 +- docs/content/apps/Bench.RabbitMQ.md | 14 +++++--- docs/content/apps/Bench.Ruby.md | 4 +-- docs/content/apps/Bench.Sass.md | 4 +-- docs/content/apps/Bench.Scribus.md | 4 +-- docs/content/apps/Bench.Sift.md | 8 ++--- docs/content/apps/Bench.Spacemacs.md | 4 +-- docs/content/apps/Bench.SublimeText3.md | 4 +-- docs/content/apps/Bench.SysInternals.md | 4 +-- docs/content/apps/Bench.TeXnicCenter.md | 4 +-- docs/content/apps/Bench.Tern.md | 38 ++++++++++++++++++++ docs/content/apps/Bench.VLC.md | 4 +-- docs/content/apps/Bench.VSCode.md | 4 +-- docs/content/apps/Bench.Vim.md | 8 ++--- docs/content/apps/Bench.VimConsole.md | 8 ++--- docs/content/apps/Bench.VimRT.md | 8 ++--- docs/content/apps/Bench.Wget.md | 9 +++-- docs/content/apps/Bench.WgetDeps.md | 37 -------------------- docs/content/apps/Bench.WinMerge.md | 4 +-- docs/content/apps/Bench.Yeoman.md | 5 +-- docs/content/apps/Bench.Zeal.md | 8 ++--- docs/content/apps/Bench.cURL.md | 8 ++--- 91 files changed, 590 insertions(+), 326 deletions(-) create mode 100644 docs/content/apps/Bench.HandBrake.md create mode 100644 docs/content/apps/Bench.HandBrakeCLI.md create mode 100644 docs/content/apps/Bench.JSBeautify.md create mode 100644 docs/content/apps/Bench.Jupyter.md create mode 100644 docs/content/apps/Bench.MarkdownEdit.md create mode 100644 docs/content/apps/Bench.MySQLUtils.md create mode 100644 docs/content/apps/Bench.Notepad2.md create mode 100644 docs/content/apps/Bench.Tern.md delete mode 100644 docs/content/apps/Bench.WgetDeps.md diff --git a/build/update-app-list.ps1 b/build/update-app-list.ps1 index 07af74e7..91bdd7f0 100644 --- a/build/update-app-list.ps1 +++ b/build/update-app-list.ps1 @@ -3,7 +3,7 @@ $scriptsDir = Resolve-Path "$rootDir\auto\lib" $docsDir = Resolve-Path "$rootDir\docs" . "$scriptsDir\bench.lib.ps1" -$cfg = New-Object Mastersign.Bench.BenchConfiguration ($rootDir, $true, $false, $false) +$cfg = New-Object Mastersign.Bench.BenchConfiguration ($rootDir, $true, $true, $false) $apps = $cfg.Apps $targetFile = "$docsDir\content\ref\apps.md" @@ -87,6 +87,7 @@ $no = 0 foreach ($app in $apps) { $no++ + if (!$app.AppLibrary) { continue } Write-Host "$($no.ToString("0000")) $($app.ID)" WriteAppFile $app $no } diff --git a/docs/content/apps/Bench.AntRenamer.md b/docs/content/apps/Bench.AntRenamer.md index 2118f953..58e21d74 100644 --- a/docs/content/apps/Bench.AntRenamer.md +++ b/docs/content/apps/Bench.AntRenamer.md @@ -1,6 +1,6 @@ +++ title = "Ant Renamer" -weight = 63 +weight = 67 app_library = "default" app_category = "Filesystem" app_typ = "default" @@ -26,7 +26,7 @@ by using specified settings. * Library: `default` * Category: Filesystem -* Order Index: 63 +* Order Index: 67 ## Properties diff --git a/docs/content/apps/Bench.Apache.md b/docs/content/apps/Bench.Apache.md index b052054c..bdd448c6 100644 --- a/docs/content/apps/Bench.Apache.md +++ b/docs/content/apps/Bench.Apache.md @@ -1,19 +1,19 @@ +++ title = "Apache" -weight = 70 +weight = 75 app_library = "default" app_category = "Services" app_typ = "default" app_ns = "Bench" app_id = "Bench.Apache" -app_version = "2.4.23" +app_version = "2.4.25" app_categories = ["Services"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Apache` -**Version:** 2.4.23 +**Version:** 2.4.25 [Back to all apps](/apps/) @@ -29,7 +29,7 @@ This application needs the x86 version of the [Visual C++ 14 Redistributable](ht * Library: `default` * Category: Services -* Order Index: 70 +* Order Index: 75 ## Properties diff --git a/docs/content/apps/Bench.Atom.md b/docs/content/apps/Bench.Atom.md index cabf4dc7..672ed04d 100644 --- a/docs/content/apps/Bench.Atom.md +++ b/docs/content/apps/Bench.Atom.md @@ -1,19 +1,19 @@ +++ title = "Atom" -weight = 35 +weight = 36 app_library = "default" app_category = "Editors" app_typ = "default" app_ns = "Bench" app_id = "Bench.Atom" -app_version = "1.11.2" +app_version = "1.13.0" app_categories = ["Editors"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Atom` -**Version:** 1.11.2 +**Version:** 1.13.0 [Back to all apps](/apps/) @@ -28,7 +28,7 @@ is picked up from Atom._ * Library: `default` * Category: Editors -* Order Index: 35 +* Order Index: 36 ## Properties diff --git a/docs/content/apps/Bench.Blender.md b/docs/content/apps/Bench.Blender.md index cc77bf29..b797eaa2 100644 --- a/docs/content/apps/Bench.Blender.md +++ b/docs/content/apps/Bench.Blender.md @@ -1,6 +1,6 @@ +++ title = "Blender" -weight = 87 +weight = 94 app_library = "default" app_category = "3D Modeling" app_typ = "default" @@ -25,7 +25,7 @@ Blender is the open source, cross platform suite of tools for 3D creation. * Library: `default` * Category: 3D Modeling -* Order Index: 87 +* Order Index: 94 ## Properties diff --git a/docs/content/apps/Bench.Bower.md b/docs/content/apps/Bench.Bower.md index dacbee4a..7af55eba 100644 --- a/docs/content/apps/Bench.Bower.md +++ b/docs/content/apps/Bench.Bower.md @@ -1,6 +1,6 @@ +++ title = "Bower" -weight = 49 +weight = 50 app_library = "default" app_category = "Software Development Utilities" app_typ = "node-package" @@ -30,7 +30,7 @@ the right versions of the packages you need and their dependencies. * Library: `default` * Category: Software Development Utilities -* Order Index: 49 +* Order Index: 50 ## Properties diff --git a/docs/content/apps/Bench.CMake.md b/docs/content/apps/Bench.CMake.md index 2b9e3793..39d272d0 100644 --- a/docs/content/apps/Bench.CMake.md +++ b/docs/content/apps/Bench.CMake.md @@ -1,19 +1,19 @@ +++ title = "CMake" -weight = 53 +weight = 54 app_library = "default" app_category = "Software Development Utilities" app_typ = "default" app_ns = "Bench" app_id = "Bench.CMake" -app_version = "3.6.1" +app_version = "3.7.2" app_categories = ["Software Development Utilities"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.CMake` -**Version:** 3.6.1 +**Version:** 3.7.2 [Back to all apps](/apps/) @@ -35,7 +35,7 @@ Setup your project with a `CMakeLists.txt` file and run `cmake -G "MinGW Makefil * Library: `default` * Category: Software Development Utilities -* Order Index: 53 +* Order Index: 54 ## Properties diff --git a/docs/content/apps/Bench.Clang.md b/docs/content/apps/Bench.Clang.md index 2172d33f..6f563186 100644 --- a/docs/content/apps/Bench.Clang.md +++ b/docs/content/apps/Bench.Clang.md @@ -1,19 +1,19 @@ +++ title = "LLVM Clang" -weight = 31 +weight = 32 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.Clang" -app_version = "3.8.1" -app_categories = ["Platforms and Programming Languages"] +app_version = "3.9.1" +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Clang` -**Version:** 3.8.1 +**Version:** 3.9.1 [Back to all apps](/apps/) @@ -32,8 +32,8 @@ install the LLVM-Plugin for Eclipse CDT. ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 31 +* Category: Languages and Platforms +* Order Index: 32 ## Properties diff --git a/docs/content/apps/Bench.CoffeeScript.md b/docs/content/apps/Bench.CoffeeScript.md index 2f5f85d8..6b4f8244 100644 --- a/docs/content/apps/Bench.CoffeeScript.md +++ b/docs/content/apps/Bench.CoffeeScript.md @@ -1,13 +1,13 @@ +++ title = "CoffeeScript" -weight = 34 +weight = 35 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "node-package" app_ns = "Bench" app_id = "Bench.CoffeeScript" app_version = ">=1.10.0 <2.0.0" -app_categories = ["Platforms and Programming Languages"] +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["node-package"] +++ @@ -21,8 +21,8 @@ app_types = ["node-package"] ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 34 +* Category: Languages and Platforms +* Order Index: 35 ## Properties diff --git a/docs/content/apps/Bench.ConEmu.md b/docs/content/apps/Bench.ConEmu.md index b8c31de0..88984a2d 100644 --- a/docs/content/apps/Bench.ConEmu.md +++ b/docs/content/apps/Bench.ConEmu.md @@ -6,14 +6,14 @@ app_category = "Required" app_typ = "default" app_ns = "Bench" app_id = "Bench.ConEmu" -app_version = "16.10.09a" +app_version = "17.01.18" app_categories = ["Required"] app_libraries = ["core"] app_types = ["default"] +++ **ID:** `Bench.ConEmu` -**Version:** 16.10.09a +**Version:** 17.01.18 [Back to all apps](/apps/) diff --git a/docs/content/apps/Bench.Dia.md b/docs/content/apps/Bench.Dia.md index 72b1f28c..d29bdc49 100644 --- a/docs/content/apps/Bench.Dia.md +++ b/docs/content/apps/Bench.Dia.md @@ -1,6 +1,6 @@ +++ title = "Dia" -weight = 83 +weight = 90 app_library = "default" app_category = "Multimedia" app_typ = "default" @@ -25,7 +25,7 @@ Dia is a program to draw structured diagrams. * Library: `default` * Category: Multimedia -* Order Index: 83 +* Order Index: 90 ## Properties diff --git a/docs/content/apps/Bench.DotNetCore.md b/docs/content/apps/Bench.DotNetCore.md index 786da842..7fddda3c 100644 --- a/docs/content/apps/Bench.DotNetCore.md +++ b/docs/content/apps/Bench.DotNetCore.md @@ -1,19 +1,19 @@ +++ title = ".NET Core SDK" -weight = 27 +weight = 28 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.DotNetCore" -app_version = "latest" -app_categories = ["Platforms and Programming Languages"] +app_version = "1.1" +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.DotNetCore` -**Version:** latest +**Version:** 1.1 [Back to all apps](/apps/) @@ -24,8 +24,8 @@ The build tools and compilers for platform independent .NET Core applications. ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 27 +* Category: Languages and Platforms +* Order Index: 28 ## Properties diff --git a/docs/content/apps/Bench.EclipseCpp.md b/docs/content/apps/Bench.EclipseCpp.md index bab7c6b1..e4e872b4 100644 --- a/docs/content/apps/Bench.EclipseCpp.md +++ b/docs/content/apps/Bench.EclipseCpp.md @@ -1,6 +1,6 @@ +++ title = "Eclipse for C++" -weight = 46 +weight = 47 app_library = "default" app_category = "Editors" app_typ = "default" @@ -25,7 +25,7 @@ An IDE for C/C++ developers with Mylyn integration. * Library: `default` * Category: Editors -* Order Index: 46 +* Order Index: 47 ## Properties diff --git a/docs/content/apps/Bench.EclipseJava.md b/docs/content/apps/Bench.EclipseJava.md index 89e86e04..26e74976 100644 --- a/docs/content/apps/Bench.EclipseJava.md +++ b/docs/content/apps/Bench.EclipseJava.md @@ -1,6 +1,6 @@ +++ title = "Eclipse for Java" -weight = 44 +weight = 45 app_library = "default" app_category = "Editors" app_typ = "default" @@ -26,7 +26,7 @@ XML Editor, Mylyn, Maven and Gradle integration... * Library: `default` * Category: Editors -* Order Index: 44 +* Order Index: 45 ## Properties diff --git a/docs/content/apps/Bench.EclipsePHP.md b/docs/content/apps/Bench.EclipsePHP.md index 7c6fbbac..0b710fee 100644 --- a/docs/content/apps/Bench.EclipsePHP.md +++ b/docs/content/apps/Bench.EclipsePHP.md @@ -1,6 +1,6 @@ +++ title = "Eclipse for PHP" -weight = 45 +weight = 46 app_library = "default" app_category = "Editors" app_typ = "default" @@ -26,7 +26,7 @@ Git client, Mylyn and editors for JavaScript, HTML, CSS and... * Library: `default` * Category: Editors -* Order Index: 45 +* Order Index: 46 ## Properties diff --git a/docs/content/apps/Bench.Emacs.md b/docs/content/apps/Bench.Emacs.md index e5d8345b..833e4d9b 100644 --- a/docs/content/apps/Bench.Emacs.md +++ b/docs/content/apps/Bench.Emacs.md @@ -1,19 +1,19 @@ +++ title = "Emacs" -weight = 38 +weight = 39 app_library = "default" app_category = "Editors" app_typ = "default" app_ns = "Bench" app_id = "Bench.Emacs" -app_version = "24.5" +app_version = "25.1-2" app_categories = ["Editors"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Emacs` -**Version:** 24.5 +**Version:** 25.1-2 [Back to all apps](/apps/) @@ -28,7 +28,7 @@ with extensions to support text editing. * Library: `default` * Category: Editors -* Order Index: 38 +* Order Index: 39 ## Properties diff --git a/docs/content/apps/Bench.Erlang.md b/docs/content/apps/Bench.Erlang.md index 177b2533..f76be53f 100644 --- a/docs/content/apps/Bench.Erlang.md +++ b/docs/content/apps/Bench.Erlang.md @@ -1,19 +1,19 @@ +++ title = "Erlang" -weight = 33 +weight = 34 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.Erlang" -app_version = "19.0" -app_categories = ["Platforms and Programming Languages"] +app_version = "19.2" +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Erlang` -**Version:** 19.0 +**Version:** 19.2 [Back to all apps](/apps/) @@ -24,8 +24,8 @@ Erlang is a programming language used to build massively scalable soft real-time ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 33 +* Category: Languages and Platforms +* Order Index: 34 ## Properties diff --git a/docs/content/apps/Bench.FFmpeg.md b/docs/content/apps/Bench.FFmpeg.md index 47a14fbb..88acb95d 100644 --- a/docs/content/apps/Bench.FFmpeg.md +++ b/docs/content/apps/Bench.FFmpeg.md @@ -1,6 +1,6 @@ +++ title = "FFmpeg" -weight = 80 +weight = 85 app_library = "default" app_category = "Multimedia" app_typ = "default" @@ -28,7 +28,7 @@ No matter if they were designed by some standards committee, the community or a * Library: `default` * Category: Multimedia -* Order Index: 80 +* Order Index: 85 ## Properties diff --git a/docs/content/apps/Bench.FileZilla.md b/docs/content/apps/Bench.FileZilla.md index e6bc8b6d..eb8bf59a 100644 --- a/docs/content/apps/Bench.FileZilla.md +++ b/docs/content/apps/Bench.FileZilla.md @@ -1,19 +1,19 @@ +++ title = "FileZilla" -weight = 65 +weight = 69 app_library = "default" app_category = "Network" app_typ = "default" app_ns = "Bench" app_id = "Bench.FileZilla" -app_version = "3.20.1" +app_version = "3.24.0" app_categories = ["Network"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.FileZilla` -**Version:** 3.20.1 +**Version:** 3.24.0 [Back to all apps](/apps/) @@ -25,7 +25,7 @@ FileZilla Client is a free, open source FTP client. It supports FTP, SFTP, and F * Library: `default` * Category: Network -* Order Index: 65 +* Order Index: 69 ## Properties diff --git a/docs/content/apps/Bench.FreeCAD.md b/docs/content/apps/Bench.FreeCAD.md index ca708708..fc2c0d8f 100644 --- a/docs/content/apps/Bench.FreeCAD.md +++ b/docs/content/apps/Bench.FreeCAD.md @@ -1,6 +1,6 @@ +++ title = "FreeCAD" -weight = 88 +weight = 95 app_library = "default" app_category = "3D Modeling" app_typ = "default" @@ -22,7 +22,7 @@ app_types = ["default"] * Library: `default` * Category: 3D Modeling -* Order Index: 88 +* Order Index: 95 ## Properties diff --git a/docs/content/apps/Bench.Gimp.md b/docs/content/apps/Bench.Gimp.md index 59136071..9dd28f9d 100644 --- a/docs/content/apps/Bench.Gimp.md +++ b/docs/content/apps/Bench.Gimp.md @@ -1,6 +1,6 @@ +++ title = "GIMP" -weight = 85 +weight = 92 app_library = "default" app_category = "Multimedia" app_typ = "default" @@ -29,7 +29,7 @@ GIMP provides you with sophisticated tools to get your job done. * Library: `default` * Category: Multimedia -* Order Index: 85 +* Order Index: 92 ## Properties diff --git a/docs/content/apps/Bench.GitKraken.md b/docs/content/apps/Bench.GitKraken.md index 68d3ae4d..183e1216 100644 --- a/docs/content/apps/Bench.GitKraken.md +++ b/docs/content/apps/Bench.GitKraken.md @@ -1,6 +1,6 @@ +++ title = "GitKraken" -weight = 19 +weight = 20 app_library = "default" app_category = "Version Control" app_typ = "default" @@ -27,7 +27,7 @@ No proxy support yet (Version 1.3.0). * Library: `default` * Category: Version Control -* Order Index: 19 +* Order Index: 20 ## Properties diff --git a/docs/content/apps/Bench.GnuPG.md b/docs/content/apps/Bench.GnuPG.md index 6c6ff5ac..27e54968 100644 --- a/docs/content/apps/Bench.GnuPG.md +++ b/docs/content/apps/Bench.GnuPG.md @@ -1,6 +1,6 @@ +++ title = "GnuPG" -weight = 17 +weight = 18 app_library = "default" app_category = "Security" app_typ = "default" @@ -28,7 +28,7 @@ GnuPG, also known as GPG, is a command line tool with features for easy integrat * Library: `default` * Category: Security -* Order Index: 17 +* Order Index: 18 ## Properties diff --git a/docs/content/apps/Bench.GnuTLS.md b/docs/content/apps/Bench.GnuTLS.md index 3e765408..88b8e500 100644 --- a/docs/content/apps/Bench.GnuTLS.md +++ b/docs/content/apps/Bench.GnuTLS.md @@ -1,19 +1,19 @@ +++ title = "GNU TLS" -weight = 16 +weight = 17 app_library = "default" app_category = "Security" app_typ = "default" app_ns = "Bench" app_id = "Bench.GnuTLS" -app_version = "3.3.11" +app_version = "3.4.15" app_categories = ["Security"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.GnuTLS` -**Version:** 3.3.11 +**Version:** 3.4.15 [Back to all apps](/apps/) @@ -25,7 +25,7 @@ The GnuTLS Transport Layer Security Library. * Library: `default` * Category: Security -* Order Index: 16 +* Order Index: 17 ## Properties diff --git a/docs/content/apps/Bench.Go.md b/docs/content/apps/Bench.Go.md index 65659e3f..4e76323d 100644 --- a/docs/content/apps/Bench.Go.md +++ b/docs/content/apps/Bench.Go.md @@ -1,19 +1,19 @@ +++ title = "Go" -weight = 32 +weight = 33 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.Go" -app_version = "1.6" -app_categories = ["Platforms and Programming Languages"] +app_version = "1.7.4" +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Go` -**Version:** 1.6 +**Version:** 1.7.4 [Back to all apps](/apps/) @@ -25,8 +25,8 @@ to build simple, reliable, and efficient software. ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 32 +* Category: Languages and Platforms +* Order Index: 33 ## Properties diff --git a/docs/content/apps/Bench.GraphicsMagick.md b/docs/content/apps/Bench.GraphicsMagick.md index 0ec857fa..447a307c 100644 --- a/docs/content/apps/Bench.GraphicsMagick.md +++ b/docs/content/apps/Bench.GraphicsMagick.md @@ -1,19 +1,19 @@ +++ title = "Graphics Magick" -weight = 79 +weight = 84 app_library = "default" app_category = "Multimedia" app_typ = "default" app_ns = "Bench" app_id = "Bench.GraphicsMagick" -app_version = "1.3.24" +app_version = "1.3.25" app_categories = ["Multimedia"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.GraphicsMagick` -**Version:** 1.3.24 +**Version:** 1.3.25 [Back to all apps](/apps/) @@ -28,7 +28,7 @@ like DPX, GIF, JPEG, JPEG-2000, PNG, PDF, PNM, and TIFF. * Library: `default` * Category: Multimedia -* Order Index: 79 +* Order Index: 84 ## Properties diff --git a/docs/content/apps/Bench.Graphviz.md b/docs/content/apps/Bench.Graphviz.md index 7a468ea6..fced0daa 100644 --- a/docs/content/apps/Bench.Graphviz.md +++ b/docs/content/apps/Bench.Graphviz.md @@ -1,6 +1,6 @@ +++ title = "Graphviz" -weight = 82 +weight = 89 app_library = "default" app_category = "Multimedia" app_typ = "default" @@ -29,7 +29,7 @@ and in visual interfaces for other technical domains. * Library: `default` * Category: Multimedia -* Order Index: 82 +* Order Index: 89 ## Properties @@ -37,4 +37,5 @@ and in visual interfaces for other technical domains. * Name: Graphviz * Typ: `default` * Website: +* Responsibilities: [Yeoman Generator for Markdown Projects](/app/User.MdProc) diff --git a/docs/content/apps/Bench.Grunt.md b/docs/content/apps/Bench.Grunt.md index cf8b25cf..9594e4a1 100644 --- a/docs/content/apps/Bench.Grunt.md +++ b/docs/content/apps/Bench.Grunt.md @@ -1,19 +1,19 @@ +++ title = "Grunt" -weight = 48 +weight = 49 app_library = "default" app_category = "Software Development Utilities" app_typ = "node-package" app_ns = "Bench" app_id = "Bench.Grunt" -app_version = ">=0.4.5 <0.5.0" +app_version = ">=1.0.0 <2.0.0" app_categories = ["Software Development Utilities"] app_libraries = ["default"] app_types = ["node-package"] +++ **ID:** `Bench.Grunt` -**Version:** >=0.4.5 <0.5.0 +**Version:** >=1.0.0 <2.0.0 [Back to all apps](/apps/) @@ -25,7 +25,7 @@ The JavaScript Task Runner * Library: `default` * Category: Software Development Utilities -* Order Index: 48 +* Order Index: 49 ## Properties diff --git a/docs/content/apps/Bench.Gulp.md b/docs/content/apps/Bench.Gulp.md index e52c533b..bf4c946c 100644 --- a/docs/content/apps/Bench.Gulp.md +++ b/docs/content/apps/Bench.Gulp.md @@ -1,6 +1,6 @@ +++ title = "Gulp" -weight = 47 +weight = 48 app_library = "default" app_category = "Software Development Utilities" app_typ = "node-package" @@ -25,7 +25,7 @@ The streaming build system. * Library: `default` * Category: Software Development Utilities -* Order Index: 47 +* Order Index: 48 ## Properties @@ -34,4 +34,5 @@ The streaming build system. * Typ: `node-package` * Website: * Dependencies: [NPM](/app/Bench.Npm) +* Responsibilities: [Yeoman Generator for Markdown Projects](/app/User.MdProc) diff --git a/docs/content/apps/Bench.HandBrake.md b/docs/content/apps/Bench.HandBrake.md new file mode 100644 index 00000000..25c36d90 --- /dev/null +++ b/docs/content/apps/Bench.HandBrake.md @@ -0,0 +1,36 @@ ++++ +title = "HandBrake" +weight = 87 +app_library = "default" +app_category = "Multimedia" +app_typ = "default" +app_ns = "Bench" +app_id = "Bench.HandBrake" +app_version = "1.0.2" +app_categories = ["Multimedia"] +app_libraries = ["default"] +app_types = ["default"] ++++ + +**ID:** `Bench.HandBrake` +**Version:** 1.0.2 + + +[Back to all apps](/apps/) + +## Description +The open source video transcoder. + +## Source + +* Library: `default` +* Category: Multimedia +* Order Index: 87 + +## Properties + +* Namespace: Bench +* Name: HandBrake +* Typ: `default` +* Website: + diff --git a/docs/content/apps/Bench.HandBrakeCLI.md b/docs/content/apps/Bench.HandBrakeCLI.md new file mode 100644 index 00000000..cba77bd7 --- /dev/null +++ b/docs/content/apps/Bench.HandBrakeCLI.md @@ -0,0 +1,36 @@ ++++ +title = "HandBrakeCLI" +weight = 86 +app_library = "default" +app_category = "Multimedia" +app_typ = "default" +app_ns = "Bench" +app_id = "Bench.HandBrakeCLI" +app_version = "1.0.2" +app_categories = ["Multimedia"] +app_libraries = ["default"] +app_types = ["default"] ++++ + +**ID:** `Bench.HandBrakeCLI` +**Version:** 1.0.2 + + +[Back to all apps](/apps/) + +## Description +The command line interface for the open source video transcoder. + +## Source + +* Library: `default` +* Category: Multimedia +* Order Index: 86 + +## Properties + +* Namespace: Bench +* Name: HandBrakeCLI +* Typ: `default` +* Website: + diff --git a/docs/content/apps/Bench.Hugo.md b/docs/content/apps/Bench.Hugo.md index cb1b8e54..6430f211 100644 --- a/docs/content/apps/Bench.Hugo.md +++ b/docs/content/apps/Bench.Hugo.md @@ -1,19 +1,19 @@ +++ title = "Hugo" -weight = 78 +weight = 83 app_library = "default" app_category = "Web" app_typ = "default" app_ns = "Bench" app_id = "Bench.Hugo" -app_version = "0.16" +app_version = "0.18.1" app_categories = ["Web"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Hugo` -**Version:** 0.16 +**Version:** 0.18.1 [Back to all apps](/apps/) @@ -28,7 +28,7 @@ and much more. Hugo’s speed fosters creativity and makes building a website fu * Library: `default` * Category: Web -* Order Index: 78 +* Order Index: 83 ## Properties diff --git a/docs/content/apps/Bench.IPython2.md b/docs/content/apps/Bench.IPython2.md index 33a09b20..70c2b4e5 100644 --- a/docs/content/apps/Bench.IPython2.md +++ b/docs/content/apps/Bench.IPython2.md @@ -1,6 +1,6 @@ +++ title = "IPython 2" -weight = 57 +weight = 60 app_library = "default" app_category = "Software Development Utilities" app_typ = "python2-package" @@ -21,22 +21,17 @@ app_types = ["python2-package"] ## Description IPython provides a rich architecture for computing with a powerful interactive shell. -for Python 2: - - -for Python 3: - ## Source * Library: `default` * Category: Software Development Utilities -* Order Index: 57 +* Order Index: 60 ## Properties * Namespace: Bench * Name: IPython2 * Typ: `python2-package` -* Website: +* Website: * Dependencies: [PyReadline (Python 2)](/app/Bench.PyReadline2), [Python 2](/app/Bench.Python2) diff --git a/docs/content/apps/Bench.IPython3.md b/docs/content/apps/Bench.IPython3.md index 293f1f07..8049b422 100644 --- a/docs/content/apps/Bench.IPython3.md +++ b/docs/content/apps/Bench.IPython3.md @@ -1,6 +1,6 @@ +++ title = "IPython 3" -weight = 58 +weight = 61 app_library = "default" app_category = "Software Development Utilities" app_typ = "python3-package" @@ -21,22 +21,17 @@ app_types = ["python3-package"] ## Description IPython provides a rich architecture for computing with a powerful interactive shell. -for Python 2: - - -for Python 3: - ## Source * Library: `default` * Category: Software Development Utilities -* Order Index: 58 +* Order Index: 61 ## Properties * Namespace: Bench * Name: IPython3 * Typ: `python3-package` -* Website: +* Website: * Dependencies: [PyReadline (Python 3)](/app/Bench.PyReadline3), [Python 3](/app/Bench.Python3) diff --git a/docs/content/apps/Bench.Inkscape.md b/docs/content/apps/Bench.Inkscape.md index 146b9894..e14104fb 100644 --- a/docs/content/apps/Bench.Inkscape.md +++ b/docs/content/apps/Bench.Inkscape.md @@ -1,19 +1,19 @@ +++ title = "Inkscape" -weight = 84 +weight = 91 app_library = "default" app_category = "Multimedia" app_typ = "default" app_ns = "Bench" app_id = "Bench.Inkscape" -app_version = "0.91-1" +app_version = "0.92.0" app_categories = ["Multimedia"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Inkscape` -**Version:** 0.91-1 +**Version:** 0.92.0 [Back to all apps](/apps/) @@ -26,12 +26,13 @@ It's free and open source. * Library: `default` * Category: Multimedia -* Order Index: 84 +* Order Index: 91 ## Properties * Namespace: Bench * Name: Inkscape * Typ: `default` -* Website: +* Website: +* Responsibilities: [Yeoman Generator for Markdown Projects](/app/User.MdProc) diff --git a/docs/content/apps/Bench.Iron.md b/docs/content/apps/Bench.Iron.md index 1c3e995e..d394aa36 100644 --- a/docs/content/apps/Bench.Iron.md +++ b/docs/content/apps/Bench.Iron.md @@ -1,6 +1,6 @@ +++ title = "SWare Iron" -weight = 66 +weight = 70 app_library = "default" app_category = "Network" app_typ = "default" @@ -25,7 +25,7 @@ A free portable derivative of Chromium, optimized for privacy. * Library: `default` * Category: Network -* Order Index: 66 +* Order Index: 70 ## Properties diff --git a/docs/content/apps/Bench.JDK7.md b/docs/content/apps/Bench.JDK7.md index c46db626..13ddeaf2 100644 --- a/docs/content/apps/Bench.JDK7.md +++ b/docs/content/apps/Bench.JDK7.md @@ -1,13 +1,13 @@ +++ title = "Java Development Kit 7" -weight = 24 +weight = 25 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.JDK7" app_version = "7u80" -app_categories = ["Platforms and Programming Languages"] +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ @@ -26,8 +26,8 @@ The development kit is required for Java source code to get compiled. ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 24 +* Category: Languages and Platforms +* Order Index: 25 ## Properties diff --git a/docs/content/apps/Bench.JDK8.md b/docs/content/apps/Bench.JDK8.md index 85d57a13..cd6ca1ab 100644 --- a/docs/content/apps/Bench.JDK8.md +++ b/docs/content/apps/Bench.JDK8.md @@ -1,19 +1,19 @@ +++ title = "Java Development Kit 8" -weight = 25 +weight = 26 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.JDK8" -app_version = "112" -app_categories = ["Platforms and Programming Languages"] +app_version = "121" +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.JDK8` -**Version:** 112 +**Version:** 121 [Back to all apps](/apps/) @@ -26,8 +26,8 @@ The development kit is required for Java source code to get compiled. ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 25 +* Category: Languages and Platforms +* Order Index: 26 ## Properties diff --git a/docs/content/apps/Bench.JRE7.md b/docs/content/apps/Bench.JRE7.md index 5f3d55b8..0baa1d12 100644 --- a/docs/content/apps/Bench.JRE7.md +++ b/docs/content/apps/Bench.JRE7.md @@ -1,13 +1,13 @@ +++ title = "Java Runtime Environment 7" -weight = 22 +weight = 23 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.JRE7" app_version = "7u80" -app_categories = ["Platforms and Programming Languages"] +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ @@ -26,8 +26,8 @@ The runtime environment is required for a compiled Java program to get executed. ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 22 +* Category: Languages and Platforms +* Order Index: 23 ## Properties diff --git a/docs/content/apps/Bench.JRE8.md b/docs/content/apps/Bench.JRE8.md index 3f165f11..a925f16c 100644 --- a/docs/content/apps/Bench.JRE8.md +++ b/docs/content/apps/Bench.JRE8.md @@ -1,19 +1,19 @@ +++ title = "Java Runtime Environment 8" -weight = 23 +weight = 24 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.JRE8" -app_version = "112" -app_categories = ["Platforms and Programming Languages"] +app_version = "121" +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.JRE8` -**Version:** 112 +**Version:** 121 [Back to all apps](/apps/) @@ -26,8 +26,8 @@ The runtime environment is required for a compiled Java program to get executed. ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 23 +* Category: Languages and Platforms +* Order Index: 24 ## Properties diff --git a/docs/content/apps/Bench.JSBeautify.md b/docs/content/apps/Bench.JSBeautify.md new file mode 100644 index 00000000..1189e86c --- /dev/null +++ b/docs/content/apps/Bench.JSBeautify.md @@ -0,0 +1,42 @@ ++++ +title = "JSBeautify" +weight = 56 +app_library = "default" +app_category = "Software Development Utilities" +app_typ = "node-package" +app_ns = "Bench" +app_id = "Bench.JSBeautify" +app_version = ">=1.6.8 <2.0.0" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["node-package"] ++++ + +**ID:** `Bench.JSBeautify` +**Version:** >=1.6.8 <2.0.0 + + +[Back to all apps](/apps/) + +## Description +This little beautifier will reformat and reindent bookmarklets, ugly JavaScript, +unpack scripts packed by Dean Edward’s popular packer, +as well as deobfuscate scripts processed by . + + +Supported commands: `js-beautify`, `css-beautify`, `html-beautify` + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 56 + +## Properties + +* Namespace: Bench +* Name: JSBeautify +* Typ: `node-package` +* Website: +* Dependencies: [NPM](/app/Bench.Npm) + diff --git a/docs/content/apps/Bench.JSHint.md b/docs/content/apps/Bench.JSHint.md index d76e47cf..5fc5bb37 100644 --- a/docs/content/apps/Bench.JSHint.md +++ b/docs/content/apps/Bench.JSHint.md @@ -1,19 +1,19 @@ +++ title = "JSHint" -weight = 54 +weight = 55 app_library = "default" app_category = "Software Development Utilities" app_typ = "node-package" app_ns = "Bench" app_id = "Bench.JSHint" -app_version = ">=2.8.0 <3.0.0" +app_version = ">=2.9.0 <3.0.0" app_categories = ["Software Development Utilities"] app_libraries = ["default"] app_types = ["node-package"] +++ **ID:** `Bench.JSHint` -**Version:** >=2.8.0 <3.0.0 +**Version:** >=2.9.0 <3.0.0 [Back to all apps](/apps/) @@ -25,7 +25,7 @@ JSHint is a tool that helps to detect errors and potential problems in your Java * Library: `default` * Category: Software Development Utilities -* Order Index: 54 +* Order Index: 55 ## Properties diff --git a/docs/content/apps/Bench.JabRef.md b/docs/content/apps/Bench.JabRef.md index af99eac6..c231c2de 100644 --- a/docs/content/apps/Bench.JabRef.md +++ b/docs/content/apps/Bench.JabRef.md @@ -1,19 +1,19 @@ +++ title = "JabRef" -weight = 74 +weight = 79 app_library = "default" app_category = "Writing" app_typ = "default" app_ns = "Bench" app_id = "Bench.JabRef" -app_version = "3.5" +app_version = "3.8.1" app_categories = ["Writing"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.JabRef` -**Version:** 3.5 +**Version:** 3.8.1 [Back to all apps](/apps/) @@ -26,7 +26,7 @@ The native file format used by JabRef is BibTeX, the standard LaTeX bibliography * Library: `default` * Category: Writing -* Order Index: 74 +* Order Index: 79 ## Properties diff --git a/docs/content/apps/Bench.Jupyter.md b/docs/content/apps/Bench.Jupyter.md new file mode 100644 index 00000000..fe1f1f33 --- /dev/null +++ b/docs/content/apps/Bench.Jupyter.md @@ -0,0 +1,38 @@ ++++ +title = "Jupyter" +weight = 62 +app_library = "default" +app_category = "Software Development Utilities" +app_typ = "python3-package" +app_ns = "Bench" +app_id = "Bench.Jupyter" +app_version = "latest" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["python3-package"] ++++ + +**ID:** `Bench.Jupyter` +**Version:** latest + + +[Back to all apps](/apps/) + +## Description +Open source, interactive data science and scientific computing +across over 40 programming languages. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 62 + +## Properties + +* Namespace: Bench +* Name: Jupyter +* Typ: `python3-package` +* Website: +* Dependencies: [Python 3](/app/Bench.Python3) + diff --git a/docs/content/apps/Bench.Leiningen.md b/docs/content/apps/Bench.Leiningen.md index 596a4ed2..6abe05e2 100644 --- a/docs/content/apps/Bench.Leiningen.md +++ b/docs/content/apps/Bench.Leiningen.md @@ -1,13 +1,13 @@ +++ title = "Leiningen" -weight = 26 +weight = 27 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.Leiningen" app_version = "latest" -app_categories = ["Platforms and Programming Languages"] +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ @@ -26,8 +26,8 @@ it gets out of your way and lets you focus on your code. ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 26 +* Category: Languages and Platforms +* Order Index: 27 ## Properties diff --git a/docs/content/apps/Bench.LightTable.md b/docs/content/apps/Bench.LightTable.md index ff27299a..c741cac7 100644 --- a/docs/content/apps/Bench.LightTable.md +++ b/docs/content/apps/Bench.LightTable.md @@ -1,6 +1,6 @@ +++ title = "LightTable" -weight = 43 +weight = 44 app_library = "default" app_category = "Editors" app_typ = "default" @@ -25,7 +25,7 @@ The next generation code editor. * Library: `default` * Category: Editors -* Order Index: 43 +* Order Index: 44 ## Properties diff --git a/docs/content/apps/Bench.MarkdownEdit.md b/docs/content/apps/Bench.MarkdownEdit.md new file mode 100644 index 00000000..d45ac1b5 --- /dev/null +++ b/docs/content/apps/Bench.MarkdownEdit.md @@ -0,0 +1,36 @@ ++++ +title = "Markdown Edit" +weight = 14 +app_library = "core" +app_category = "Basics" +app_typ = "default" +app_ns = "Bench" +app_id = "Bench.MarkdownEdit" +app_version = "1.32" +app_categories = ["Basics"] +app_libraries = ["core"] +app_types = ["default"] ++++ + +**ID:** `Bench.MarkdownEdit` +**Version:** 1.32 + + +[Back to all apps](/apps/) + +## Description +Markdown Edit (MDE) is low distraction editor for Windows. MDE focuses on producing text documents that can be transformed into Web pages and documents. It places an emphasis on content and keyboard shortcuts. Don't let this dissuade you. Markdown Edit is a power-house of an editor. It does its job quietly and without fanfare. + +## Source + +* Library: `core` +* Category: Basics +* Order Index: 14 + +## Properties + +* Namespace: Bench +* Name: MarkdownEdit +* Typ: `default` +* Website: + diff --git a/docs/content/apps/Bench.Maven.md b/docs/content/apps/Bench.Maven.md index c9808d4f..5dc1af87 100644 --- a/docs/content/apps/Bench.Maven.md +++ b/docs/content/apps/Bench.Maven.md @@ -1,6 +1,6 @@ +++ title = "Maven" -weight = 51 +weight = 52 app_library = "default" app_category = "Software Development Utilities" app_typ = "default" @@ -27,7 +27,7 @@ reporting and documentation from a central piece of information. * Library: `default` * Category: Software Development Utilities -* Order Index: 51 +* Order Index: 52 ## Properties diff --git a/docs/content/apps/Bench.MeshLab.md b/docs/content/apps/Bench.MeshLab.md index 953c8a45..2e5bcc44 100644 --- a/docs/content/apps/Bench.MeshLab.md +++ b/docs/content/apps/Bench.MeshLab.md @@ -1,19 +1,19 @@ +++ title = "MeshLab" -weight = 86 +weight = 93 app_library = "default" app_category = "3D Modeling" app_typ = "default" app_ns = "Bench" app_id = "Bench.MeshLab" -app_version = "1.3.3" +app_version = "2016.12" app_categories = ["3D Modeling"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.MeshLab` -**Version:** 1.3.3 +**Version:** 2016.12 [Back to all apps](/apps/) @@ -29,7 +29,7 @@ cleaning, healing, inspecting, rendering and converting this kind of meshes. * Library: `default` * Category: 3D Modeling -* Order Index: 86 +* Order Index: 93 ## Properties diff --git a/docs/content/apps/Bench.MiKTeX.md b/docs/content/apps/Bench.MiKTeX.md index e6405999..532dc0be 100644 --- a/docs/content/apps/Bench.MiKTeX.md +++ b/docs/content/apps/Bench.MiKTeX.md @@ -1,19 +1,19 @@ +++ title = "MiKTeX" -weight = 72 +weight = 77 app_library = "default" app_category = "Writing" app_typ = "default" app_ns = "Bench" app_id = "Bench.MiKTeX" -app_version = "2.9.5987" +app_version = "2.9.6221" app_categories = ["Writing"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.MiKTeX` -**Version:** 2.9.5987 +**Version:** 2.9.6221 [Back to all apps](/apps/) @@ -22,11 +22,15 @@ app_types = ["default"] MiKTeX (pronounced mick-tech) is an up-to-date implementation of TeX/LaTeX and related programs for Windows (all current variants). + +**Note:** The packages installed by default (property `DefaultPackages`) +are selected to suit the needs of the default LaTeX template of _Pandoc_. + ## Source * Library: `default` * Category: Writing -* Order Index: 72 +* Order Index: 77 ## Properties @@ -34,5 +38,5 @@ and related programs for Windows (all current variants). * Name: MiKTeX * Typ: `default` * Website: -* Responsibilities: [TeXnicCenter](/app/Bench.TeXnicCenter) +* Responsibilities: [TeXnicCenter](/app/Bench.TeXnicCenter), [Yeoman Generator for Markdown Projects](/app/User.MdProc) diff --git a/docs/content/apps/Bench.MinGW.md b/docs/content/apps/Bench.MinGW.md index 6de97e12..7dc21351 100644 --- a/docs/content/apps/Bench.MinGW.md +++ b/docs/content/apps/Bench.MinGW.md @@ -1,13 +1,13 @@ +++ title = "MinGW" -weight = 30 +weight = 31 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "meta" app_ns = "Bench" app_id = "Bench.MinGW" app_version = "0.6.2" -app_categories = ["Platforms and Programming Languages"] +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["meta"] +++ @@ -42,8 +42,8 @@ and install more MinGW packages. ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 30 +* Category: Languages and Platforms +* Order Index: 31 ## Properties diff --git a/docs/content/apps/Bench.MinGwGet.md b/docs/content/apps/Bench.MinGwGet.md index e8f705b2..5fc6c931 100644 --- a/docs/content/apps/Bench.MinGwGet.md +++ b/docs/content/apps/Bench.MinGwGet.md @@ -1,13 +1,13 @@ +++ title = "MinGwGet" -weight = 28 +weight = 29 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.MinGwGet" app_version = "0.6.2" -app_categories = ["Platforms and Programming Languages"] +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ @@ -24,8 +24,8 @@ The package manager for [MinGW](http://www.mingw.org/). ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 28 +* Category: Languages and Platforms +* Order Index: 29 ## Properties diff --git a/docs/content/apps/Bench.MinGwGetGui.md b/docs/content/apps/Bench.MinGwGetGui.md index 3df2e449..c2593f08 100644 --- a/docs/content/apps/Bench.MinGwGetGui.md +++ b/docs/content/apps/Bench.MinGwGetGui.md @@ -1,13 +1,13 @@ +++ title = "MinGwGetGui" -weight = 29 +weight = 30 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.MinGwGetGui" app_version = "0.6.2" -app_categories = ["Platforms and Programming Languages"] +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ @@ -24,8 +24,8 @@ A graphical user interface for the package manager of [MinGW](http://www.mingw.o ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 29 +* Category: Languages and Platforms +* Order Index: 30 ## Properties diff --git a/docs/content/apps/Bench.MySQL.md b/docs/content/apps/Bench.MySQL.md index b86e055c..0967e4a5 100644 --- a/docs/content/apps/Bench.MySQL.md +++ b/docs/content/apps/Bench.MySQL.md @@ -1,19 +1,19 @@ +++ title = "MySQL" -weight = 67 +weight = 71 app_library = "default" app_category = "Services" app_typ = "default" app_ns = "Bench" app_id = "Bench.MySQL" -app_version = "5.7.14" +app_version = "5.7.17" app_categories = ["Services"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.MySQL` -**Version:** 5.7.14 +**Version:** 5.7.17 [Back to all apps](/apps/) @@ -32,7 +32,7 @@ The initial password for _root_ is `bench`. * Library: `default` * Category: Services -* Order Index: 67 +* Order Index: 71 ## Properties diff --git a/docs/content/apps/Bench.MySQLUtils.md b/docs/content/apps/Bench.MySQLUtils.md new file mode 100644 index 00000000..7f0df683 --- /dev/null +++ b/docs/content/apps/Bench.MySQLUtils.md @@ -0,0 +1,33 @@ ++++ +title = "MySQL Utilities" +weight = 72 +app_library = "default" +app_category = "Services" +app_typ = "default" +app_ns = "Bench" +app_id = "Bench.MySQLUtils" +app_version = "1.6.5" +app_categories = ["Services"] +app_libraries = ["default"] +app_types = ["default"] ++++ + +**ID:** `Bench.MySQLUtils` +**Version:** 1.6.5 + + +[Back to all apps](/apps/) + +## Source + +* Library: `default` +* Category: Services +* Order Index: 72 + +## Properties + +* Namespace: Bench +* Name: MySQLUtils +* Typ: `default` +* Website: + diff --git a/docs/content/apps/Bench.MySQLWB.md b/docs/content/apps/Bench.MySQLWB.md index 8e2411e5..0cd30d0b 100644 --- a/docs/content/apps/Bench.MySQLWB.md +++ b/docs/content/apps/Bench.MySQLWB.md @@ -1,19 +1,19 @@ +++ title = "MySQL Workbench" -weight = 68 +weight = 73 app_library = "default" app_category = "Services" app_typ = "default" app_ns = "Bench" app_id = "Bench.MySQLWB" -app_version = "6.3.7" +app_version = "6.3.8" app_categories = ["Services"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.MySQLWB` -**Version:** 6.3.7 +**Version:** 6.3.8 [Back to all apps](/apps/) @@ -30,7 +30,7 @@ and the [Microsoft.NET Framework 4.0 Client Profile](http://www.microsoft.com/do * Library: `default` * Category: Services -* Order Index: 68 +* Order Index: 73 ## Properties diff --git a/docs/content/apps/Bench.NUnitRunners.md b/docs/content/apps/Bench.NUnitRunners.md index 5090f2f6..e800330c 100644 --- a/docs/content/apps/Bench.NUnitRunners.md +++ b/docs/content/apps/Bench.NUnitRunners.md @@ -1,6 +1,6 @@ +++ title = "NUnit 3 Runners" -weight = 52 +weight = 53 app_library = "default" app_category = "Software Development Utilities" app_typ = "nuget-package" @@ -26,7 +26,7 @@ The console runner `nunit3-console.exe` executes tests on the console. * Library: `default` * Category: Software Development Utilities -* Order Index: 52 +* Order Index: 53 ## Properties diff --git a/docs/content/apps/Bench.Node.md b/docs/content/apps/Bench.Node.md index 2c00343d..96e31324 100644 --- a/docs/content/apps/Bench.Node.md +++ b/docs/content/apps/Bench.Node.md @@ -6,14 +6,14 @@ app_category = "Core" app_typ = "default" app_ns = "Bench" app_id = "Bench.Node" -app_version = "6.9.2" +app_version = "6.9.4" app_categories = ["Core"] app_libraries = ["core"] app_types = ["default"] +++ **ID:** `Bench.Node` -**Version:** 6.9.2 +**Version:** 6.9.4 [Back to all apps](/apps/) diff --git a/docs/content/apps/Bench.Notepad2.md b/docs/content/apps/Bench.Notepad2.md new file mode 100644 index 00000000..24c39069 --- /dev/null +++ b/docs/content/apps/Bench.Notepad2.md @@ -0,0 +1,37 @@ ++++ +title = "Notepad2" +weight = 13 +app_library = "core" +app_category = "Basics" +app_typ = "default" +app_ns = "Bench" +app_id = "Bench.Notepad2" +app_version = "4.2.25" +app_categories = ["Basics"] +app_libraries = ["core"] +app_types = ["default"] ++++ + +**ID:** `Bench.Notepad2` +**Version:** 4.2.25 + + +[Back to all apps](/apps/) + +## Description +Notepad2 is a fast and light-weight Notepad-like text editor with syntax highlighting. +This program can be run out of the box without installation, and does not touch your system's registry. + +## Source + +* Library: `core` +* Category: Basics +* Order Index: 13 + +## Properties + +* Namespace: Bench +* Name: Notepad2 +* Typ: `default` +* Website: + diff --git a/docs/content/apps/Bench.Npm.md b/docs/content/apps/Bench.Npm.md index 5e76dc71..65dd37d2 100644 --- a/docs/content/apps/Bench.Npm.md +++ b/docs/content/apps/Bench.Npm.md @@ -41,5 +41,5 @@ Therefore, the latest version of _NPM_ is installed afterwards via the setup scr * Typ: `default` * Website: * Dependencies: [Node.js](/app/Bench.Node) -* Responsibilities: [CoffeeScript](/app/Bench.CoffeeScript), [Gulp](/app/Bench.Gulp), [Grunt](/app/Bench.Grunt), [Bower](/app/Bench.Bower), [Yeoman](/app/Bench.Yeoman), [JSHint](/app/Bench.JSHint) +* Responsibilities: [CoffeeScript](/app/Bench.CoffeeScript), [Gulp](/app/Bench.Gulp), [Grunt](/app/Bench.Grunt), [Bower](/app/Bench.Bower), [Yeoman](/app/Bench.Yeoman), [JSHint](/app/Bench.JSHint), [JSBeautify](/app/Bench.JSBeautify), [Tern](/app/Bench.Tern), [Yeoman Generator for Markdown Projects](/app/User.MdProc) diff --git a/docs/content/apps/Bench.OpenSSL.md b/docs/content/apps/Bench.OpenSSL.md index 5101dc62..a3a32508 100644 --- a/docs/content/apps/Bench.OpenSSL.md +++ b/docs/content/apps/Bench.OpenSSL.md @@ -1,6 +1,6 @@ +++ title = "OpenSSL" -weight = 15 +weight = 16 app_library = "default" app_category = "Security" app_typ = "default" @@ -26,7 +26,7 @@ It is also a general-purpose cryptography library. * Library: `default` * Category: Security -* Order Index: 15 +* Order Index: 16 ## Properties diff --git a/docs/content/apps/Bench.PHP5.md b/docs/content/apps/Bench.PHP5.md index 186c7213..d859cac7 100644 --- a/docs/content/apps/Bench.PHP5.md +++ b/docs/content/apps/Bench.PHP5.md @@ -1,19 +1,19 @@ +++ title = "PHP 5" -weight = 20 +weight = 21 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.PHP5" -app_version = "5.6.23" -app_categories = ["Platforms and Programming Languages"] +app_version = "5.6.29" +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.PHP5` -**Version:** 5.6.23 +**Version:** 5.6.29 [Back to all apps](/apps/) @@ -27,8 +27,8 @@ This application needs the x86 version of the [Visual C++ 11 Redistributable](ht ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 20 +* Category: Languages and Platforms +* Order Index: 21 ## Properties diff --git a/docs/content/apps/Bench.PHP7.md b/docs/content/apps/Bench.PHP7.md index 79ac8eef..9f40707f 100644 --- a/docs/content/apps/Bench.PHP7.md +++ b/docs/content/apps/Bench.PHP7.md @@ -1,19 +1,19 @@ +++ title = "PHP 7" -weight = 21 +weight = 22 app_library = "default" -app_category = "Platforms and Programming Languages" +app_category = "Languages and Platforms" app_typ = "default" app_ns = "Bench" app_id = "Bench.PHP7" -app_version = "7.0.8" -app_categories = ["Platforms and Programming Languages"] +app_version = "7.0.14" +app_categories = ["Languages and Platforms"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.PHP7` -**Version:** 7.0.8 +**Version:** 7.0.14 [Back to all apps](/apps/) @@ -27,8 +27,8 @@ This application needs the x86 version of the [Visual C++ 14 Redistributable](ht ## Source * Library: `default` -* Category: Platforms and Programming Languages -* Order Index: 21 +* Category: Languages and Platforms +* Order Index: 22 ## Properties diff --git a/docs/content/apps/Bench.Pandoc.md b/docs/content/apps/Bench.Pandoc.md index 70ac1b27..b4a57912 100644 --- a/docs/content/apps/Bench.Pandoc.md +++ b/docs/content/apps/Bench.Pandoc.md @@ -1,19 +1,19 @@ +++ title = "Pandoc" -weight = 73 +weight = 78 app_library = "default" app_category = "Writing" app_typ = "default" app_ns = "Bench" app_id = "Bench.Pandoc" -app_version = "1.17.2" +app_version = "1.19.1" app_categories = ["Writing"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Pandoc` -**Version:** 1.17.2 +**Version:** 1.19.1 [Back to all apps](/apps/) @@ -25,7 +25,7 @@ Pandoc is a library and command-line tool for converting from one markup format * Library: `default` * Category: Writing -* Order Index: 73 +* Order Index: 78 ## Properties @@ -33,4 +33,5 @@ Pandoc is a library and command-line tool for converting from one markup format * Name: Pandoc * Typ: `default` * Website: +* Responsibilities: [Yeoman Generator for Markdown Projects](/app/User.MdProc) diff --git a/docs/content/apps/Bench.PostgreSQL.md b/docs/content/apps/Bench.PostgreSQL.md index 519e8c90..4895937a 100644 --- a/docs/content/apps/Bench.PostgreSQL.md +++ b/docs/content/apps/Bench.PostgreSQL.md @@ -1,19 +1,19 @@ +++ title = "PostgreSQL" -weight = 69 +weight = 74 app_library = "default" app_category = "Services" app_typ = "default" app_ns = "Bench" app_id = "Bench.PostgreSQL" -app_version = "9.5.3-1" +app_version = "9.6.1-1" app_categories = ["Services"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.PostgreSQL` -**Version:** 9.5.3-1 +**Version:** 9.6.1-1 [Back to all apps](/apps/) @@ -35,7 +35,7 @@ The initial password for _postgres_ is `bench`. * Library: `default` * Category: Services -* Order Index: 69 +* Order Index: 74 ## Properties diff --git a/docs/content/apps/Bench.Putty.md b/docs/content/apps/Bench.Putty.md index e7454f0d..9a94b1ce 100644 --- a/docs/content/apps/Bench.Putty.md +++ b/docs/content/apps/Bench.Putty.md @@ -1,6 +1,6 @@ +++ title = "Putty" -weight = 18 +weight = 19 app_library = "default" app_category = "Security" app_typ = "default" @@ -25,7 +25,7 @@ PuTTY is a free (MIT-licensed) Win32 Telnet and SSH client. * Library: `default` * Category: Security -* Order Index: 18 +* Order Index: 19 ## Properties diff --git a/docs/content/apps/Bench.PyReadline2.md b/docs/content/apps/Bench.PyReadline2.md index 1f4b885a..c9581ff7 100644 --- a/docs/content/apps/Bench.PyReadline2.md +++ b/docs/content/apps/Bench.PyReadline2.md @@ -1,6 +1,6 @@ +++ title = "PyReadline (Python 2)" -weight = 55 +weight = 58 app_library = "default" app_category = "Software Development Utilities" app_typ = "python2-package" @@ -30,7 +30,7 @@ for Python 3: * Library: `default` * Category: Software Development Utilities -* Order Index: 55 +* Order Index: 58 ## Properties diff --git a/docs/content/apps/Bench.PyReadline3.md b/docs/content/apps/Bench.PyReadline3.md index 4d34bbcc..0513d474 100644 --- a/docs/content/apps/Bench.PyReadline3.md +++ b/docs/content/apps/Bench.PyReadline3.md @@ -1,6 +1,6 @@ +++ title = "PyReadline (Python 3)" -weight = 56 +weight = 59 app_library = "default" app_category = "Software Development Utilities" app_typ = "python3-package" @@ -30,7 +30,7 @@ for Python 3: * Library: `default` * Category: Software Development Utilities -* Order Index: 56 +* Order Index: 59 ## Properties diff --git a/docs/content/apps/Bench.Python2.md b/docs/content/apps/Bench.Python2.md index a944c1b1..e0f4694c 100644 --- a/docs/content/apps/Bench.Python2.md +++ b/docs/content/apps/Bench.Python2.md @@ -6,14 +6,14 @@ app_category = "Core" app_typ = "default" app_ns = "Bench" app_id = "Bench.Python2" -app_version = "2.7.12" +app_version = "2.7.13" app_categories = ["Core"] app_libraries = ["core"] app_types = ["default"] +++ **ID:** `Bench.Python2` -**Version:** 2.7.12 +**Version:** 2.7.13 [Back to all apps](/apps/) diff --git a/docs/content/apps/Bench.Python3.md b/docs/content/apps/Bench.Python3.md index a3e96b0b..8ad7c7fe 100644 --- a/docs/content/apps/Bench.Python3.md +++ b/docs/content/apps/Bench.Python3.md @@ -33,5 +33,5 @@ Python is a programming language that lets you work quickly and integrate system * Name: Python3 * Typ: `default` * Website: -* Responsibilities: [PyReadline (Python 3)](/app/Bench.PyReadline3), [IPython 3](/app/Bench.IPython3) +* Responsibilities: [PyReadline (Python 3)](/app/Bench.PyReadline3), [IPython 3](/app/Bench.IPython3), [Jupyter](/app/Bench.Jupyter) diff --git a/docs/content/apps/Bench.RabbitMQ.md b/docs/content/apps/Bench.RabbitMQ.md index ae851207..fb7eb70f 100644 --- a/docs/content/apps/Bench.RabbitMQ.md +++ b/docs/content/apps/Bench.RabbitMQ.md @@ -1,19 +1,19 @@ +++ title = "RabbitMQ" -weight = 71 +weight = 76 app_library = "default" app_category = "Services" app_typ = "default" app_ns = "Bench" app_id = "Bench.RabbitMQ" -app_version = "3.6.5" +app_version = "3.6.6" app_categories = ["Services"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.RabbitMQ` -**Version:** 3.6.5 +**Version:** 3.6.6 [Back to all apps](/apps/) @@ -26,11 +26,17 @@ Runs on all major operating systems, Supports a huge number of developer platforms, Open source and commercially supported + +The setup automatically activates the web management plugin. +So after starting the server on the command line with `rabbitmq-server`, +the web UI is available under . +At first start you can login with user `guest` and passwort `guest`. + ## Source * Library: `default` * Category: Services -* Order Index: 71 +* Order Index: 76 ## Properties diff --git a/docs/content/apps/Bench.Ruby.md b/docs/content/apps/Bench.Ruby.md index 28235893..45abbcd2 100644 --- a/docs/content/apps/Bench.Ruby.md +++ b/docs/content/apps/Bench.Ruby.md @@ -6,14 +6,14 @@ app_category = "Core" app_typ = "default" app_ns = "Bench" app_id = "Bench.Ruby" -app_version = "2.3.1" +app_version = "2.3.3" app_categories = ["Core"] app_libraries = ["core"] app_types = ["default"] +++ **ID:** `Bench.Ruby` -**Version:** 2.3.1 +**Version:** 2.3.3 [Back to all apps](/apps/) diff --git a/docs/content/apps/Bench.Sass.md b/docs/content/apps/Bench.Sass.md index 137d93f2..b375c22b 100644 --- a/docs/content/apps/Bench.Sass.md +++ b/docs/content/apps/Bench.Sass.md @@ -1,6 +1,6 @@ +++ title = "SASS" -weight = 77 +weight = 82 app_library = "default" app_category = "Web" app_typ = "ruby-package" @@ -25,7 +25,7 @@ Sass is the most mature, stable, and powerful professional grade CSS extension l * Library: `default` * Category: Web -* Order Index: 77 +* Order Index: 82 ## Properties diff --git a/docs/content/apps/Bench.Scribus.md b/docs/content/apps/Bench.Scribus.md index 6c3dcb93..5aec8536 100644 --- a/docs/content/apps/Bench.Scribus.md +++ b/docs/content/apps/Bench.Scribus.md @@ -1,6 +1,6 @@ +++ title = "Scribus" -weight = 76 +weight = 81 app_library = "default" app_category = "Writing" app_typ = "default" @@ -27,7 +27,7 @@ one of the premier Open Source desktop applications. * Library: `default` * Category: Writing -* Order Index: 76 +* Order Index: 81 ## Properties diff --git a/docs/content/apps/Bench.Sift.md b/docs/content/apps/Bench.Sift.md index 7ff72cd1..5428bf95 100644 --- a/docs/content/apps/Bench.Sift.md +++ b/docs/content/apps/Bench.Sift.md @@ -1,19 +1,19 @@ +++ title = "Sift" -weight = 61 +weight = 65 app_library = "default" app_category = "Filesystem" app_typ = "default" app_ns = "Bench" app_id = "Bench.Sift" -app_version = "0.8.0" +app_version = "0.9.0" app_categories = ["Filesystem"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Sift` -**Version:** 0.8.0 +**Version:** 0.9.0 [Back to all apps](/apps/) @@ -25,7 +25,7 @@ Sift - grep on steroids. A fast and powerful alternative to grep. * Library: `default` * Category: Filesystem -* Order Index: 61 +* Order Index: 65 ## Properties diff --git a/docs/content/apps/Bench.Spacemacs.md b/docs/content/apps/Bench.Spacemacs.md index c49de34f..5b5be487 100644 --- a/docs/content/apps/Bench.Spacemacs.md +++ b/docs/content/apps/Bench.Spacemacs.md @@ -1,6 +1,6 @@ +++ title = "Spacemacs" -weight = 39 +weight = 40 app_library = "default" app_category = "Editors" app_typ = "meta" @@ -25,7 +25,7 @@ The best editor is neither Emacs nor Vim, it's Emacs and Vim! * Library: `default` * Category: Editors -* Order Index: 39 +* Order Index: 40 ## Properties diff --git a/docs/content/apps/Bench.SublimeText3.md b/docs/content/apps/Bench.SublimeText3.md index 40fa1742..b05f0fdb 100644 --- a/docs/content/apps/Bench.SublimeText3.md +++ b/docs/content/apps/Bench.SublimeText3.md @@ -1,6 +1,6 @@ +++ title = "Sublime Text 3" -weight = 37 +weight = 38 app_library = "default" app_category = "Editors" app_typ = "default" @@ -26,7 +26,7 @@ You'll love the slick user interface, extraordinary features and amazing perform * Library: `default` * Category: Editors -* Order Index: 37 +* Order Index: 38 ## Properties diff --git a/docs/content/apps/Bench.SysInternals.md b/docs/content/apps/Bench.SysInternals.md index af095333..bf2f968d 100644 --- a/docs/content/apps/Bench.SysInternals.md +++ b/docs/content/apps/Bench.SysInternals.md @@ -1,6 +1,6 @@ +++ title = "SysInternals" -weight = 60 +weight = 64 app_library = "default" app_category = "Software Development Utilities" app_typ = "default" @@ -26,7 +26,7 @@ the Microsoft Windows operating systems and its processes. * Library: `default` * Category: Software Development Utilities -* Order Index: 60 +* Order Index: 64 ## Properties diff --git a/docs/content/apps/Bench.TeXnicCenter.md b/docs/content/apps/Bench.TeXnicCenter.md index cbf0e6c8..48c968ac 100644 --- a/docs/content/apps/Bench.TeXnicCenter.md +++ b/docs/content/apps/Bench.TeXnicCenter.md @@ -1,6 +1,6 @@ +++ title = "TeXnicCenter" -weight = 75 +weight = 80 app_library = "default" app_category = "Writing" app_typ = "default" @@ -25,7 +25,7 @@ Premium LaTeX Editing for Windows. * Library: `default` * Category: Writing -* Order Index: 75 +* Order Index: 80 ## Properties diff --git a/docs/content/apps/Bench.Tern.md b/docs/content/apps/Bench.Tern.md new file mode 100644 index 00000000..1fe20795 --- /dev/null +++ b/docs/content/apps/Bench.Tern.md @@ -0,0 +1,38 @@ ++++ +title = "Tern" +weight = 57 +app_library = "default" +app_category = "Software Development Utilities" +app_typ = "node-package" +app_ns = "Bench" +app_id = "Bench.Tern" +app_version = ">=0.20.0 <=1.0.0" +app_categories = ["Software Development Utilities"] +app_libraries = ["default"] +app_types = ["node-package"] ++++ + +**ID:** `Bench.Tern` +**Version:** >=0.20.0 <=1.0.0 + + +[Back to all apps](/apps/) + +## Description +Tern is a stand-alone, editor-independent JavaScript analyzer +that can be used to improve the JavaScript integration of existing editors. + +## Source + +* Library: `default` +* Category: Software Development Utilities +* Order Index: 57 + +## Properties + +* Namespace: Bench +* Name: Tern +* Typ: `node-package` +* Website: +* Dependencies: [NPM](/app/Bench.Npm) + diff --git a/docs/content/apps/Bench.VLC.md b/docs/content/apps/Bench.VLC.md index 6fddb060..967e943d 100644 --- a/docs/content/apps/Bench.VLC.md +++ b/docs/content/apps/Bench.VLC.md @@ -1,6 +1,6 @@ +++ title = "VLC Player" -weight = 81 +weight = 88 app_library = "default" app_category = "Multimedia" app_typ = "default" @@ -26,7 +26,7 @@ that plays most multimedia files, and various streaming protocols. * Library: `default` * Category: Multimedia -* Order Index: 81 +* Order Index: 88 ## Properties diff --git a/docs/content/apps/Bench.VSCode.md b/docs/content/apps/Bench.VSCode.md index 6d3ed843..d3a749e7 100644 --- a/docs/content/apps/Bench.VSCode.md +++ b/docs/content/apps/Bench.VSCode.md @@ -1,6 +1,6 @@ +++ title = "Visual Studio Code" -weight = 36 +weight = 37 app_library = "default" app_category = "Editors" app_typ = "default" @@ -25,7 +25,7 @@ A cross platform code editor from Microsoft. * Library: `default` * Category: Editors -* Order Index: 36 +* Order Index: 37 ## Properties diff --git a/docs/content/apps/Bench.Vim.md b/docs/content/apps/Bench.Vim.md index 85033604..63cc71b6 100644 --- a/docs/content/apps/Bench.Vim.md +++ b/docs/content/apps/Bench.Vim.md @@ -1,19 +1,19 @@ +++ title = "Vim" -weight = 42 +weight = 43 app_library = "default" app_category = "Editors" app_typ = "default" app_ns = "Bench" app_id = "Bench.Vim" -app_version = "7.4" +app_version = "8.0" app_categories = ["Editors"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Vim` -**Version:** 7.4 +**Version:** 8.0 [Back to all apps](/apps/) @@ -26,7 +26,7 @@ It is an improved version of the vi editor distributed with most UNIX systems. * Library: `default` * Category: Editors -* Order Index: 42 +* Order Index: 43 ## Properties diff --git a/docs/content/apps/Bench.VimConsole.md b/docs/content/apps/Bench.VimConsole.md index 76edf1b4..a0fc01bf 100644 --- a/docs/content/apps/Bench.VimConsole.md +++ b/docs/content/apps/Bench.VimConsole.md @@ -1,19 +1,19 @@ +++ title = "VimConsole" -weight = 41 +weight = 42 app_library = "default" app_category = "Editors" app_typ = "default" app_ns = "Bench" app_id = "Bench.VimConsole" -app_version = "7.4" +app_version = "8.0" app_categories = ["Editors"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.VimConsole` -**Version:** 7.4 +**Version:** 8.0 [Back to all apps](/apps/) @@ -26,7 +26,7 @@ It is an improved version of the vi editor distributed with most UNIX systems. * Library: `default` * Category: Editors -* Order Index: 41 +* Order Index: 42 ## Properties diff --git a/docs/content/apps/Bench.VimRT.md b/docs/content/apps/Bench.VimRT.md index 5c0fbd4c..25e06ae1 100644 --- a/docs/content/apps/Bench.VimRT.md +++ b/docs/content/apps/Bench.VimRT.md @@ -1,19 +1,19 @@ +++ title = "VimRT" -weight = 40 +weight = 41 app_library = "default" app_category = "Editors" app_typ = "default" app_ns = "Bench" app_id = "Bench.VimRT" -app_version = "7.4" +app_version = "8.0" app_categories = ["Editors"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.VimRT` -**Version:** 7.4 +**Version:** 8.0 [Back to all apps](/apps/) @@ -26,7 +26,7 @@ It is an improved version of the vi editor distributed with most UNIX systems. * Library: `default` * Category: Editors -* Order Index: 40 +* Order Index: 41 ## Properties diff --git a/docs/content/apps/Bench.Wget.md b/docs/content/apps/Bench.Wget.md index d699021f..50eb8c14 100644 --- a/docs/content/apps/Bench.Wget.md +++ b/docs/content/apps/Bench.Wget.md @@ -1,19 +1,19 @@ +++ title = "Wget" -weight = 13 +weight = 15 app_library = "core" app_category = "Basics" app_typ = "default" app_ns = "Bench" app_id = "Bench.Wget" -app_version = "1.11.4-1" +app_version = "latest" app_categories = ["Basics"] app_libraries = ["core"] app_types = ["default"] +++ **ID:** `Bench.Wget` -**Version:** 1.11.4-1 +**Version:** latest [Back to all apps](/apps/) @@ -26,7 +26,7 @@ It supports HTTP, HTTPS, and FTP protocols, as well as retrieval through HTTP pr * Library: `core` * Category: Basics -* Order Index: 13 +* Order Index: 15 ## Properties @@ -34,6 +34,5 @@ It supports HTTP, HTTPS, and FTP protocols, as well as retrieval through HTTP pr * Name: Wget * Typ: `default` * Website: -* Dependencies: [WgetDeps](/app/Bench.WgetDeps) * Responsibilities: [Leiningen](/app/Bench.Leiningen), [MinGwGet](/app/Bench.MinGwGet) diff --git a/docs/content/apps/Bench.WgetDeps.md b/docs/content/apps/Bench.WgetDeps.md deleted file mode 100644 index 9f4ab629..00000000 --- a/docs/content/apps/Bench.WgetDeps.md +++ /dev/null @@ -1,37 +0,0 @@ -+++ -title = "WgetDeps" -weight = 14 -app_library = "core" -app_category = "Basics" -app_typ = "default" -app_ns = "Bench" -app_id = "Bench.WgetDeps" -app_version = "1.11.4-1" -app_categories = ["Basics"] -app_libraries = ["core"] -app_types = ["default"] -+++ - -**ID:** `Bench.WgetDeps` -**Version:** 1.11.4-1 - - -[Back to all apps](/apps/) - -## Description -GNU Wget is a free utility for non-interactive download of files from the Web. -It supports HTTP, HTTPS, and FTP protocols, as well as retrieval through HTTP proxies. - -## Source - -* Library: `core` -* Category: Basics -* Order Index: 14 - -## Properties - -* Namespace: Bench -* Name: WgetDeps -* Typ: `default` -* Responsibilities: [Wget](/app/Bench.Wget) - diff --git a/docs/content/apps/Bench.WinMerge.md b/docs/content/apps/Bench.WinMerge.md index 4ca5893b..267dbc3d 100644 --- a/docs/content/apps/Bench.WinMerge.md +++ b/docs/content/apps/Bench.WinMerge.md @@ -1,6 +1,6 @@ +++ title = "WinMerge" -weight = 62 +weight = 66 app_library = "default" app_category = "Filesystem" app_typ = "default" @@ -27,7 +27,7 @@ that is easy to understand and handle. * Library: `default` * Category: Filesystem -* Order Index: 62 +* Order Index: 66 ## Properties diff --git a/docs/content/apps/Bench.Yeoman.md b/docs/content/apps/Bench.Yeoman.md index c16b0b15..fb3bff31 100644 --- a/docs/content/apps/Bench.Yeoman.md +++ b/docs/content/apps/Bench.Yeoman.md @@ -1,6 +1,6 @@ +++ title = "Yeoman" -weight = 50 +weight = 51 app_library = "default" app_category = "Software Development Utilities" app_typ = "node-package" @@ -28,7 +28,7 @@ to help you stay productive. * Library: `default` * Category: Software Development Utilities -* Order Index: 50 +* Order Index: 51 ## Properties @@ -37,4 +37,5 @@ to help you stay productive. * Typ: `node-package` * Website: * Dependencies: [NPM](/app/Bench.Npm) +* Responsibilities: [Yeoman Generator for Markdown Projects](/app/User.MdProc) diff --git a/docs/content/apps/Bench.Zeal.md b/docs/content/apps/Bench.Zeal.md index 1f409042..3a343055 100644 --- a/docs/content/apps/Bench.Zeal.md +++ b/docs/content/apps/Bench.Zeal.md @@ -1,19 +1,19 @@ +++ title = "Zeal Docs" -weight = 59 +weight = 63 app_library = "default" app_category = "Software Development Utilities" app_typ = "default" app_ns = "Bench" app_id = "Bench.Zeal" -app_version = "0.2.1" +app_version = "0.3.1" app_categories = ["Software Development Utilities"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.Zeal` -**Version:** 0.2.1 +**Version:** 0.3.1 [Back to all apps](/apps/) @@ -25,7 +25,7 @@ An offline documentation browser inspired by [Dash](https://kapeli.com/dash/). * Library: `default` * Category: Software Development Utilities -* Order Index: 59 +* Order Index: 63 ## Properties diff --git a/docs/content/apps/Bench.cURL.md b/docs/content/apps/Bench.cURL.md index 8814e15a..fdfd38ed 100644 --- a/docs/content/apps/Bench.cURL.md +++ b/docs/content/apps/Bench.cURL.md @@ -1,19 +1,19 @@ +++ title = "cURL" -weight = 64 +weight = 68 app_library = "default" app_category = "Network" app_typ = "default" app_ns = "Bench" app_id = "Bench.cURL" -app_version = "7.50.1" +app_version = "7.52.1" app_categories = ["Network"] app_libraries = ["default"] app_types = ["default"] +++ **ID:** `Bench.cURL` -**Version:** 7.50.1 +**Version:** 7.52.1 [Back to all apps](/apps/) @@ -30,7 +30,7 @@ file transfer resume, proxy tunneling and more. * Library: `default` * Category: Network -* Order Index: 64 +* Order Index: 68 ## Properties From 99eb523562392280f96d2dcc89f4d47c95f6da2f Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 16:30:40 +0100 Subject: [PATCH 229/230] updated Bench CLI docs --- docs/content/ref/bench-cli.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/content/ref/bench-cli.md b/docs/content/ref/bench-cli.md index 81d8a0e9..4a8174f7 100644 --- a/docs/content/ref/bench-cli.md +++ b/docs/content/ref/bench-cli.md @@ -1,5 +1,5 @@ +++ -date = "2017-01-11T11:20:19+01:00" +date = "2017-01-27T16:09:03+01:00" description = "The command-line interface: bench.exe" title = "Bench CLI" weight = 2 @@ -590,7 +590,7 @@ Initialize the Bench configuration and start the setup process. #### [ `load-app-libs`, `l`](#cmd_bench-manage-load-app-libs) Load the latest app libraries. -Syntax: `bench` `manage` `load-app-libs` +Syntax: `bench` `manage` `load-app-libs` _<flag>_\* #### [ `reinstall`, `r`](#cmd_bench-manage-reinstall) Remove all installed apps, then install all active apps. @@ -678,12 +678,17 @@ The `initialize` command initializes the Bench configuration and starts the set ## bench manage load-app-libs {#cmd_bench-manage-load-app-libs} Command: `bench` `manage` `load-app-libs` -The `load-app-libs` command loads the latest app libraries. +The `load-app-libs` command loads missing app libraries. ### Usage {#cmd_bench-manage-load-app-libs_usage} * `bench` `manage` `load-app-libs` `-?` -* `bench` ( _<flag>_ | _<option>_)\* `manage` `load-app-libs` +* `bench` ( _<flag>_ | _<option>_)\* `manage` `load-app-libs` _<flag>_\* + +### Flags {#cmd_bench-manage-load-app-libs_flags} + +#### `--update` | `-u` +Clears the cache and loads the latest version of all app libraries. ## bench manage reinstall {#cmd_bench-manage-reinstall} Command: `bench` `manage` `reinstall` From 253f2cc32e1f2542730388f1bbfeb37b6f35e04c Mon Sep 17 00:00:00 2001 From: Tobias Kiertscher Date: Fri, 27 Jan 2017 16:30:55 +0100 Subject: [PATCH 230/230] pushed version to 0.14.0 --- BenchManager/BenchDashboard/Properties/AssemblyInfo.cs | 4 ++-- BenchManager/BenchLib/Properties/AssemblyInfo.cs | 4 ++-- CHANGELOG.md | 4 ++++ res/bench-install.bat | 2 +- res/version.txt | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/BenchManager/BenchDashboard/Properties/AssemblyInfo.cs b/BenchManager/BenchDashboard/Properties/AssemblyInfo.cs index 98c74b13..682e2aed 100644 --- a/BenchManager/BenchDashboard/Properties/AssemblyInfo.cs +++ b/BenchManager/BenchDashboard/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.13.3.0")] -[assembly: AssemblyFileVersion("0.13.3.0")] +[assembly: AssemblyVersion("0.14.0.0")] +[assembly: AssemblyFileVersion("0.14.0.0")] diff --git a/BenchManager/BenchLib/Properties/AssemblyInfo.cs b/BenchManager/BenchLib/Properties/AssemblyInfo.cs index 893b136a..b67b06b2 100644 --- a/BenchManager/BenchLib/Properties/AssemblyInfo.cs +++ b/BenchManager/BenchLib/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.13.3.0")] -[assembly: AssemblyFileVersion("0.13.3.0")] +[assembly: AssemblyVersion("0.14.0.0")] +[assembly: AssemblyFileVersion("0.14.0.0")] diff --git a/CHANGELOG.md b/CHANGELOG.md index 917efabb..72f90365 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,10 @@ Add a link to the GitHub diff like [Unreleased]: https://github.com/mastersign/bench/compare/master...dev +## [0.14.0] - 2017-01-27 + +[0.14.0]: https://github.com/mastersign/bench/compare/v0.13.3...v0.14.0 + ### Added - Bench CLI ([#87](https://github.com/mastersign/bench/issues/87)) diff --git a/res/bench-install.bat b/res/bench-install.bat index 38222dcc..c2b1678a 100644 --- a/res/bench-install.bat +++ b/res/bench-install.bat @@ -1,7 +1,7 @@ @ECHO OFF SET ROOT=%~dp0 -SET VERSION=0.13.3 +SET VERSION=0.14.0 SET TAG=v%VERSION% SET BENCH_ZIPURL=https://github.com/mastersign/bench/releases/download/%TAG%/Bench.zip SET BENCH_ZIPFILE=%ROOT%Bench.zip diff --git a/res/version.txt b/res/version.txt index 288adf53..a803cc22 100644 --- a/res/version.txt +++ b/res/version.txt @@ -1 +1 @@ -0.13.3 +0.14.0