From 964ffdea32e02a93e258793888335af793c992f5 Mon Sep 17 00:00:00 2001 From: soochoi Date: Fri, 29 Jun 2007 23:18:44 +0000 Subject: [PATCH] CASA-auth-token-java Windows - change in Makefile to bump msi version number --- .../windows/server-java_msi/Makefile.am | 2 + .../tools/w32/VersionVDProj/App.cs | 105 ++++++++++++++ .../tools/w32/VersionVDProj/App.ico | Bin 0 -> 1078 bytes .../tools/w32/VersionVDProj/ArgumentParser.cs | 82 +++++++++++ .../tools/w32/VersionVDProj/AssemblyInfo.cs | 86 +++++++++++ .../w32/VersionVDProj/MSIProjectVersioner.cs | 93 ++++++++++++ .../w32/VersionVDProj/MSMProjectVersioner.cs | 76 ++++++++++ .../tools/w32/VersionVDProj/README | 21 +++ .../w32/VersionVDProj/VersionVDProj.csproj | 133 ++++++++++++++++++ .../w32/VersionVDProj/bin/VersionVDProj.exe | Bin 0 -> 24576 bytes .../w32/VersionVDProj/bin/VersionVDProj.pdb | Bin 0 -> 28160 bytes 11 files changed, 598 insertions(+) create mode 100644 CASA-auth-token/server-java/tools/w32/VersionVDProj/App.cs create mode 100644 CASA-auth-token/server-java/tools/w32/VersionVDProj/App.ico create mode 100644 CASA-auth-token/server-java/tools/w32/VersionVDProj/ArgumentParser.cs create mode 100644 CASA-auth-token/server-java/tools/w32/VersionVDProj/AssemblyInfo.cs create mode 100644 CASA-auth-token/server-java/tools/w32/VersionVDProj/MSIProjectVersioner.cs create mode 100644 CASA-auth-token/server-java/tools/w32/VersionVDProj/MSMProjectVersioner.cs create mode 100644 CASA-auth-token/server-java/tools/w32/VersionVDProj/README create mode 100644 CASA-auth-token/server-java/tools/w32/VersionVDProj/VersionVDProj.csproj create mode 100755 CASA-auth-token/server-java/tools/w32/VersionVDProj/bin/VersionVDProj.exe create mode 100644 CASA-auth-token/server-java/tools/w32/VersionVDProj/bin/VersionVDProj.pdb diff --git a/CASA-auth-token/server-java/package/windows/server-java_msi/Makefile.am b/CASA-auth-token/server-java/package/windows/server-java_msi/Makefile.am index a21344f8..11fc461f 100644 --- a/CASA-auth-token/server-java/package/windows/server-java_msi/Makefile.am +++ b/CASA-auth-token/server-java/package/windows/server-java_msi/Makefile.am @@ -45,6 +45,8 @@ devenv: $(TARGET_FILE): devenv @rm -f $(LOG_FILE) $@ + echo [======== Updating msi numbers========] + "../../../tools/w32/VersionVDProj/bin/VersionVDProj.exe" -msi server-java_msi.vdproj version=$(VERSION) @CMD='"$(VSINSTALLDIR)/Common7/IDE/devenv.exe" server-java_msi.sln /build $(TARGET_CFG) /project $(PACKAGE) /out $(LOG_FILE)'; \ echo $$CMD; \ if eval $$CMD; then \ diff --git a/CASA-auth-token/server-java/tools/w32/VersionVDProj/App.cs b/CASA-auth-token/server-java/tools/w32/VersionVDProj/App.cs new file mode 100644 index 00000000..40577c7d --- /dev/null +++ b/CASA-auth-token/server-java/tools/w32/VersionVDProj/App.cs @@ -0,0 +1,105 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +// +// 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/CASA-auth-token/server-java/tools/w32/VersionVDProj/App.ico b/CASA-auth-token/server-java/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/CASA-auth-token/server-java/tools/w32/VersionVDProj/ArgumentParser.cs b/CASA-auth-token/server-java/tools/w32/VersionVDProj/ArgumentParser.cs new file mode 100644 index 00000000..3ad2e449 --- /dev/null +++ b/CASA-auth-token/server-java/tools/w32/VersionVDProj/ArgumentParser.cs @@ -0,0 +1,82 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +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/CASA-auth-token/server-java/tools/w32/VersionVDProj/AssemblyInfo.cs b/CASA-auth-token/server-java/tools/w32/VersionVDProj/AssemblyInfo.cs new file mode 100644 index 00000000..c5fedddf --- /dev/null +++ b/CASA-auth-token/server-java/tools/w32/VersionVDProj/AssemblyInfo.cs @@ -0,0 +1,86 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +// +// 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/CASA-auth-token/server-java/tools/w32/VersionVDProj/MSIProjectVersioner.cs b/CASA-auth-token/server-java/tools/w32/VersionVDProj/MSIProjectVersioner.cs new file mode 100644 index 00000000..86df039c --- /dev/null +++ b/CASA-auth-token/server-java/tools/w32/VersionVDProj/MSIProjectVersioner.cs @@ -0,0 +1,93 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ + +// +// 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( "{978C614F-708E-4E1A-B201-565925725DBA}" ); + + 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/CASA-auth-token/server-java/tools/w32/VersionVDProj/MSMProjectVersioner.cs b/CASA-auth-token/server-java/tools/w32/VersionVDProj/MSMProjectVersioner.cs new file mode 100644 index 00000000..01adff84 --- /dev/null +++ b/CASA-auth-token/server-java/tools/w32/VersionVDProj/MSMProjectVersioner.cs @@ -0,0 +1,76 @@ +/*********************************************************************** + * + * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, Novell, Inc. + * + * To contact Novell about this file by physical or electronic mail, + * you may find current contact information at www.novell.com. + * + ***********************************************************************/ +// +// 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/CASA-auth-token/server-java/tools/w32/VersionVDProj/README b/CASA-auth-token/server-java/tools/w32/VersionVDProj/README new file mode 100644 index 00000000..b4c63c7b --- /dev/null +++ b/CASA-auth-token/server-java/tools/w32/VersionVDProj/README @@ -0,0 +1,21 @@ +This is a command line utility that updates the version and GUID of VS.NET project files. + +The source for this tool has been downloaded from the following site. + +http://www.codeproject.com/dotnet/VersionVDProj.asp#xx1436860xx + +The copy right associated with this tool is as followings: + +//////////////////////////////////////////////////////////////// +// copyright 2003 Don Kackman - mailto:dkackman_2000@yahoo.com +// +// no warranty expressed or implied +// use however you'd like +//////////////////////////////////////////////////////////////// + + +4/14/2006 + +10/18/2006 change MSI_PROJECT_TYPE to work with VS 2006 + + diff --git a/CASA-auth-token/server-java/tools/w32/VersionVDProj/VersionVDProj.csproj b/CASA-auth-token/server-java/tools/w32/VersionVDProj/VersionVDProj.csproj new file mode 100644 index 00000000..4f848ea1 --- /dev/null +++ b/CASA-auth-token/server-java/tools/w32/VersionVDProj/VersionVDProj.csproj @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CASA-auth-token/server-java/tools/w32/VersionVDProj/bin/VersionVDProj.exe b/CASA-auth-token/server-java/tools/w32/VersionVDProj/bin/VersionVDProj.exe new file mode 100755 index 0000000000000000000000000000000000000000..a5233e575a4ef012c1c36d4105ab6efdf8ce7dc7 GIT binary patch literal 24576 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 K92wZ468JyqN61eA literal 0 HcmV?d00001