From 1c3a646496f48702fb61ec8fc701b6b88fcd1908 Mon Sep 17 00:00:00 2001 From: soochoi Date: Thu, 13 Apr 2006 16:12:23 +0000 Subject: [PATCH] initial checkin for VersionVDProj tools in tools dir --- tools/w32/VersionVDProj/App.cs | 83 ++++++++++++++++++ tools/w32/VersionVDProj/App.ico | Bin 0 -> 1078 bytes tools/w32/VersionVDProj/ArgumentParser.cs | 60 +++++++++++++ tools/w32/VersionVDProj/AssemblyInfo.cs | 64 ++++++++++++++ .../w32/VersionVDProj/MSIProjectVersioner.cs | 71 +++++++++++++++ .../w32/VersionVDProj/MSMProjectVersioner.cs | 54 ++++++++++++ tools/w32/VersionVDProj/README | 7 ++ tools/w32/VersionVDProj/bin/VersionVDProj.exe | Bin 0 -> 24576 bytes tools/w32/VersionVDProj/bin/VersionVDProj.pdb | Bin 0 -> 28160 bytes 9 files changed, 339 insertions(+) create mode 100644 tools/w32/VersionVDProj/App.cs create mode 100644 tools/w32/VersionVDProj/App.ico create mode 100644 tools/w32/VersionVDProj/ArgumentParser.cs create mode 100644 tools/w32/VersionVDProj/AssemblyInfo.cs create mode 100644 tools/w32/VersionVDProj/MSIProjectVersioner.cs create mode 100644 tools/w32/VersionVDProj/MSMProjectVersioner.cs create mode 100644 tools/w32/VersionVDProj/README create mode 100644 tools/w32/VersionVDProj/bin/VersionVDProj.exe create mode 100644 tools/w32/VersionVDProj/bin/VersionVDProj.pdb diff --git a/tools/w32/VersionVDProj/App.cs b/tools/w32/VersionVDProj/App.cs new file mode 100644 index 00000000..33fdc982 --- /dev/null +++ b/tools/w32/VersionVDProj/App.cs @@ -0,0 +1,83 @@ +// +// copyright 2003 Don Kackman - mailto:dkackman_2000@yahoo.com +// +// no warranty expressed or implied +// use however you'd like +// +using System; + +namespace VersionVDProj +{ + /// + /// This is the class that has the Main method. This class is responsible for parsing command line + /// arguments and dispatching them to the correct classes + /// + class App + { + /// + /// The main entry point for the application. + /// + [STAThread] + static int Main(string[] args) + { + if ( args.Length != 0 ) + { + try + { + ArgumentParser arguments = new ArgumentParser( args ); + VDProjectVersioner versioner = null; + + switch ( arguments.Command ) + { + case "msi": + versioner = new MSIProjectVersioner( arguments.ProjectFile ); + break; + case "msm": + versioner = new MSMProjectVersioner( arguments.ProjectFile ); + break; + default: + throw new Exception( string.Format( "Unrecognized command {0}", arguments.Command ) ); + } + + versioner.UpdateFile( arguments.Options ); + return 0; + } + catch ( Exception e ) + { + Console.WriteLine( "ERROR" ); + Console.WriteLine( e.Message ); + return 1; + } + } + + // with no arguments show the usage + ShowUsage(); + return 0; + } + + private static void ShowUsage() + { + Console.WriteLine( "VersionVDProj -msi version= [package=]" ); + Console.WriteLine( "\t[product=] [upgrade=]" ); + Console.WriteLine( "The -msi switch is used for updating MSI installer projects" ); + Console.WriteLine( "" ); + Console.WriteLine( " is the path to the vdproj file (without braces)" ); + Console.WriteLine( " is the version to use in format #.#.# (without braces)" ); + Console.WriteLine( " Optional package guid (if not specified will be auto-generated)" ); + Console.WriteLine( " Optional product guid (if not specified will be set to the" ); + Console.WriteLine( "\tsame value used to set the package guid)" ); + Console.WriteLine( " Optional upgrade guid (if not specified the upgrade code will" ); + Console.WriteLine( "\tnot be modified)" ); + Console.WriteLine( "" ); + Console.WriteLine( "VersionVDProj -msm version= [signature=]" ); + Console.WriteLine( "The -msm switch is used for updating merge module projects" ); + Console.WriteLine( "" ); + Console.WriteLine( " is the path to the vdproj file (without braces)" ); + Console.WriteLine( " is the version to use in format #.#.# (without braces)" ); + Console.WriteLine( " Optional unique id for the merge module (if not specified a guid" ); + Console.WriteLine( "\tbased signature will be auto-generated)" ); + Console.WriteLine( "" ); + Console.WriteLine( "Named arguments can be specified in any order" ); + } + } +} diff --git a/tools/w32/VersionVDProj/App.ico b/tools/w32/VersionVDProj/App.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a5525fd794f7a7c5c8e6187f470ea3af38cd2b6 GIT binary patch literal 1078 zcmeHHJr05}7=1t!Hp3A*8IHkVf+j?-!eHY14Gtcw1Eb*_9>Bq^zETJ@GKj{_2j4$w zo9}xCh!8{T3=X##Skq>ikMjsvB|y%crWBM2iW(4pI}c%z6%lW!=~4v77#3{z!dmB1 z__&l)-{KUYR+|8|;wB^R|9ET$J@(@=#rd^=)qs85?vAy(PSF5CyNkus435LVkZ$rj zNw|JG-P7^hF<(;#o*Vk}5R#e|^13tBbQkeF?djULtvqyxd3<{9 literal 0 HcmV?d00001 diff --git a/tools/w32/VersionVDProj/ArgumentParser.cs b/tools/w32/VersionVDProj/ArgumentParser.cs new file mode 100644 index 00000000..0c553fae --- /dev/null +++ b/tools/w32/VersionVDProj/ArgumentParser.cs @@ -0,0 +1,60 @@ +using System; +using System.IO; +using System.Collections; + +namespace VersionVDProj +{ + /// + /// Summary description for ArgumentParser. + /// + public class ArgumentParser + { + public readonly Hashtable Options; + public readonly string Command; + public readonly FileInfo ProjectFile; + + public ArgumentParser( string[] args ) + { + Options = new Hashtable(); + + if ( args.Length < 2 ) + throw new Exception( "Wrong number of arguments" ); + + Command = ParseCommand( args[0] ); + ProjectFile = ParseFileName( args[1] ); + + for ( int i = 2; i < args.Length; i++ ) + ParseArgument( args[i] ); + } + + private string ParseCommand( string command ) + { + if ( command.Substring( 0, 1 ) != "-" ) + throw new Exception( string.Format( "Unrecognized command {0}", command ) ); + + return command.Substring( 1 ).ToLower(); + } + + private FileInfo ParseFileName( string path ) + { + FileInfo file = new FileInfo( path ); + if ( !file.Exists ) + throw new Exception( string.Format( "The file {0} could not be found", path ) ); + + return file; + } + + private void ParseArgument( string arg ) + { + int eqPos = arg.IndexOf( '=', 0 ); + + if ( eqPos == -1 ) + throw new Exception( string.Format( "The argument {0} is not in the format NAME=VALUE", arg ) ); + + string name = arg.Substring( 0, eqPos ); + string val = arg.Substring( eqPos + 1 ); + + Options.Add( name.ToLower(), val ); + } + } +} diff --git a/tools/w32/VersionVDProj/AssemblyInfo.cs b/tools/w32/VersionVDProj/AssemblyInfo.cs new file mode 100644 index 00000000..5ee20efd --- /dev/null +++ b/tools/w32/VersionVDProj/AssemblyInfo.cs @@ -0,0 +1,64 @@ +// +// copyright 2003 Don Kackman - mailto:dkackman_2000@yahoo.com +// +// no warranty expressed or implied +// use however you'd like +// +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("Deployment Project Versioning Tool")] +[assembly: AssemblyDescription("Updates the version and guid of Visual Studio.Net deployment projects")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("2003 Don Kackman")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/tools/w32/VersionVDProj/MSIProjectVersioner.cs b/tools/w32/VersionVDProj/MSIProjectVersioner.cs new file mode 100644 index 00000000..a91f4a3b --- /dev/null +++ b/tools/w32/VersionVDProj/MSIProjectVersioner.cs @@ -0,0 +1,71 @@ +// +// copyright 2003 Don Kackman - mailto:dkackman_2000@yahoo.com +// +// no warranty expressed or implied +// use however you'd like +// +using System; +using System.IO; +using System.Collections; + +namespace VersionVDProj +{ + /// + /// Class that updates the version info of MSI projects + /// + public class MSIProjectVersioner : VDProjectVersioner + { + private readonly static Guid MSI_PROJECT_TYPE = new Guid( "{2C2AF0D9-9B47-4FE5-BEF2-169778172667}" ); + + private Guid productCode = Guid.Empty; + private Guid packageCode = Guid.Empty; + private Guid upgradeCode = Guid.Empty; + /// + /// createas a new instance of the class + /// + /// the project file + public MSIProjectVersioner( FileInfo file ) : base( file, MSI_PROJECT_TYPE ) + { + + } + + protected override void SetOptions( Hashtable options ) + { + // get the package code - generate if not specified + if ( options.Contains("packagecode") ) + packageCode = new Guid( options["packagecode"].ToString() ); + else + packageCode = Guid.NewGuid(); + + // get the product code - set to package code if not specified + if ( options.Contains("productcode") ) + productCode = new Guid( options["productcode"].ToString() ); + else + productCode = packageCode; + + // get the upgrade code - leave empty if not specified + if ( options.Contains("upgradecode") ) + upgradeCode = new Guid( options["upgradecode"].ToString() ); + } + + protected override string TranslateLine( string line ) + { + // look for the properties we are interested in changing + // if we find them, replace the old value with the new and return the new line string + // otherwise just return the line string + if ( line.IndexOf( "\"ProductVersion\"" ) != -1 ) + line = ReplaceValue( line, "ProductVersion", version.ThreePartVersion ); + + else if ( productCode != Guid.Empty && line.IndexOf( "\"ProductCode\"" ) != -1 ) + line = ReplaceValue( line, "ProductCode", "{" + productCode.ToString().ToUpper() + "}" ); + + else if ( packageCode != Guid.Empty && line.IndexOf( "\"PackageCode\"" ) != -1 ) + line = ReplaceValue( line, "PackageCode", "{" + packageCode.ToString().ToUpper() + "}" ); + + else if ( upgradeCode != Guid.Empty && line.IndexOf( "\"UpgradeCode\"" ) != -1 ) + line = ReplaceValue( line, "UpgradeCode", "{" + upgradeCode.ToString().ToUpper() + "}" ); + + return line; + } + } +} diff --git a/tools/w32/VersionVDProj/MSMProjectVersioner.cs b/tools/w32/VersionVDProj/MSMProjectVersioner.cs new file mode 100644 index 00000000..5c19d305 --- /dev/null +++ b/tools/w32/VersionVDProj/MSMProjectVersioner.cs @@ -0,0 +1,54 @@ +// +// copyright 2003 Don Kackman - mailto:dkackman_2000@yahoo.com +// +// no warranty expressed or implied +// use however you'd like +// +using System; +using System.IO; +using System.Collections; + +namespace VersionVDProj +{ + /// + /// Class that updates the version info of merge module projects + /// + public class MSMProjectVersioner : VDProjectVersioner + { + private readonly static Guid MSM_PROJECT_TYPE = new Guid( "{DD7A5B58-C2F9-40FF-B2EF-0773356FB978}" ); + + private string signature; + + /// + /// createas a new instance of the class + /// + /// the project file + public MSMProjectVersioner( FileInfo file ) : base( file, MSM_PROJECT_TYPE ) + { + } + + protected override void SetOptions( Hashtable options ) + { + // get the signature - generate if not specified + if ( options.Contains( "signature" ) ) + signature = options[signature].ToString(); + else + signature = "MergeModule." + Guid.NewGuid().ToString().ToUpper().Replace( "-", "" ); + } + + protected override string TranslateLine( string line ) + { + // look for the properties we are interested in changing + // if we find them, replace the old value with the new and return the new line string + // otherwise just return the line string + if ( line.IndexOf( "\"Version\"" ) != -1 ) + line = ReplaceValue( line, "Version", version.FourPartVersion ); + + // module signature cannot have dashes + else if ( line.IndexOf( "\"ModuleSignature\"" ) != -1 ) + line = ReplaceValue( line, "ModuleSignature", signature ); + + return line; + } + } +} diff --git a/tools/w32/VersionVDProj/README b/tools/w32/VersionVDProj/README new file mode 100644 index 00000000..cf1b5d1a --- /dev/null +++ b/tools/w32/VersionVDProj/README @@ -0,0 +1,7 @@ +This is a command line utility that update the version and GUID of VS.NET project files. There is no licese on this tool. + +The source is from +http://www.codeproject.com/dotnet/VersionVDProj.asp#xx1436860xx + + + diff --git a/tools/w32/VersionVDProj/bin/VersionVDProj.exe b/tools/w32/VersionVDProj/bin/VersionVDProj.exe new file mode 100644 index 0000000000000000000000000000000000000000..b0ca6153c4e085d314f92f840c175d72787e48b6 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/tools/w32/VersionVDProj/bin/VersionVDProj.pdb b/tools/w32/VersionVDProj/bin/VersionVDProj.pdb new file mode 100644 index 0000000000000000000000000000000000000000..105161d177749035123941bd57f105a9ddaaa41a GIT binary patch literal 28160 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 K92wZ468JyqN61eA literal 0 HcmV?d00001