diff --git a/TfsBuild.Versioning.Activities/BuildProcessTemplates/VersioningBuildTemplate20.xaml b/TfsBuild.Versioning.Activities/BuildProcessTemplates/VersioningBuildTemplate20.xaml index 4a8d401..b59818a 100644 --- a/TfsBuild.Versioning.Activities/BuildProcessTemplates/VersioningBuildTemplate20.xaml +++ b/TfsBuild.Versioning.Activities/BuildProcessTemplates/VersioningBuildTemplate20.xaml @@ -1,854 +1,864 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TfsBuild.Process_1 - - - System.Activities - System.Activities.XamlIntegration - System.Activities.Statements - System.Activities.Expressions - System.Activities.Validation - Microsoft.TeamFoundation - Microsoft.TeamFoundation.Build.Client - Microsoft.TeamFoundation.Build.Workflow - Microsoft.TeamFoundation.Build.Workflow.Activities - Microsoft.TeamFoundation.Build.Workflow.Tracking - Microsoft.TeamFoundation.TestImpact.BuildIntegration.BuildActivities - Microsoft.TeamFoundation.VersionControl.Client - Microsoft.TeamFoundation.VersionControl.Common - Microsoft.VisualBasic.Activities - System - System.Activities.Debugger - System.Collections.Generic - System.Linq - System.Windows.Markup - TfsBuild - TfsBuild.Versioning.Activities - - - - - System.Activities - Microsoft.TeamFoundation.Common - Microsoft.TeamFoundation.Build.Client - Microsoft.TeamFoundation.Build.Workflow - Microsoft.TeamFoundation.TestImpact.BuildIntegration - Microsoft.TeamFoundation.VersionControl.Client - Microsoft.TeamFoundation.VersionControl.Common - mscorlib - System.Core - PresentationFramework - WindowsBase - PresentationCore - System.Xaml - TfsBuild.Versioning.Activities - System - System.ServiceModel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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ArYDsgIDAf4BtgPsAbYDmwIDAfwBtgOVAbYDnAEDAfsB3ANJ3ANtAwGkAd4DP+QDSgMBtQHnAz/nA60EAwGlAbEDuAGxA8wBAwGjArED4wGxA5YCAwGhArEDoQKxA64CAwGfArID6ASyA/EEAwGdArIDygOyA94DAwGaArID7QKyA48DAwGZArIDpwSyA8YEAwGXArID7gOyA5oEAwGUArIDmAOyA70DAwGSArIDvAKyA+MCAwGRArIDrwKyA7QCAwGQArID7gGyA50CAwGOArIDlwGyA54BAwGNAuIDQeIDoAIDAcgB4wNB4wPSBAMBtgHnA8cC5wPnAgMBtAHnA4sB5wOxAQMBswHnA/UD5wOIBAMBsQHnA6ED5wPDAwMBsAHnA5oC5wO6AgMBrwHnA1bnA3UDAa4B5wPNA+cD5QMDAa0B5wP/AucDlwMDAasB5wOYBOcDqgQDAakB5wPmAecDjQIDAagB4gPDAeID6AEDAc0B4gPwAeIDhQIDAcsB4gOQAuIDnQIDAckB4wPJAuMD6QIDAccB4wO6BOMDzwQDAcUB4wONAeMDswEDAcQB4wP3A+MDigQDAcIB4wOjA+MDxQMDAcEB4wOcAuMDvAIDAcAB4wNY4wN3AwG/AeMDzwPjA+cDAwG+AeMDgQPjA5kDAwG8AeMDmgTjA6wEAwG6AeMD6AHjA48CAwG5AQ== - - - - - - - - - - - - True - - - - - - - - True - - - - - - - - False - False - - - - - - - - - - - - - - - - - True - - - - - - - - False - False - - - - - - - - - False - False - - - - - - - - - True - - - - - - - False - False - - - - - - - - False - False - - - - - - - - - False - True - - - - - - - True - - - - - - - False - False - - - - - - - - - - True - - - - - - - - - - - True - - - - - - - - - - - True - - - - - - - False - - - - - - - - - - - - - True - - - - - - - False - False - - - - - - - - - - True - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TfsBuild.Process_1 + + + System.Activities + System.Activities.XamlIntegration + System.Activities.Statements + System.Activities.Expressions + System.Activities.Validation + Microsoft.TeamFoundation + Microsoft.TeamFoundation.Build.Client + Microsoft.TeamFoundation.Build.Workflow + Microsoft.TeamFoundation.Build.Workflow.Activities + Microsoft.TeamFoundation.Build.Workflow.Tracking + Microsoft.TeamFoundation.TestImpact.BuildIntegration.BuildActivities + Microsoft.TeamFoundation.VersionControl.Client + Microsoft.TeamFoundation.VersionControl.Common + Microsoft.VisualBasic.Activities + System + System.Activities.Debugger + System.Collections.Generic + System.Linq + System.Windows.Markup + TfsBuild + TfsBuild.Versioning.Activities + + + + + System.Activities + Microsoft.TeamFoundation.Common + Microsoft.TeamFoundation.Build.Client + Microsoft.TeamFoundation.Build.Workflow + Microsoft.TeamFoundation.TestImpact.BuildIntegration + Microsoft.TeamFoundation.VersionControl.Client + Microsoft.TeamFoundation.VersionControl.Common + mscorlib + System.Core + PresentationFramework + WindowsBase + PresentationCore + System.Xaml + TfsBuild.Versioning.Activities + System + System.ServiceModel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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ArYDsgIDAf4BtgPsAbYDmwIDAfwBtgOVAbYDnAEDAfsB3ANJ3ANtAwGkAd4DP+QDSgMBtQHnAz/nA60EAwGlAbEDuAGxA8wBAwGjArED4wGxA5YCAwGhArEDoQKxA64CAwGfArID6ASyA/EEAwGdArIDygOyA94DAwGaArID7QKyA48DAwGZArIDpwSyA8YEAwGXArID7gOyA5oEAwGUArIDmAOyA70DAwGSArIDvAKyA+MCAwGRArIDrwKyA7QCAwGQArID7gGyA50CAwGOArIDlwGyA54BAwGNAuIDQeIDoAIDAcgB4wNB4wPSBAMBtgHnA8cC5wPnAgMBtAHnA4sB5wOxAQMBswHnA/UD5wOIBAMBsQHnA6ED5wPDAwMBsAHnA5oC5wO6AgMBrwHnA1bnA3UDAa4B5wPNA+cD5QMDAa0B5wP/AucDlwMDAasB5wOYBOcDqgQDAakB5wPmAecDjQIDAagB4gPDAeID6AEDAc0B4gPwAeIDhQIDAcsB4gOQAuIDnQIDAckB4wPJAuMD6QIDAccB4wO6BOMDzwQDAcUB4wONAeMDswEDAcQB4wP3A+MDigQDAcIB4wOjA+MDxQMDAcEB4wOcAuMDvAIDAcAB4wNY4wN3AwG/AeMDzwPjA+cDAwG+AeMDgQPjA5kDAwG8AeMDmgTjA6wEAwG6AeMD6AHjA48CAwG5AQ== + + + + + + + + + + + + True + + + + + + + + True + + + + + + + + False + False + + + + + + + + + + + + + + + + + True + + + + + + + + False + False + + + + + + + + + False + False + + + + + + + + + True + + + + + + + False + False + + + + + + + + False + False + + + + + + + + + False + True + + + + + + + True + + + + + + + False + False + + + + + + + + + + True + + + + + + + + + + + True + + + + + + + + + + + True + + + + + + + False + + + + + + + + + + + + + True + + + + + + + False + False + + + + + + + + + + True + + + + + + \ No newline at end of file diff --git a/TfsBuild.Versioning.Activities/ConvertAssemblyPropertyPattern.cs b/TfsBuild.Versioning.Activities/ConvertAssemblyPropertyPattern.cs deleted file mode 100644 index 34ff67b..0000000 --- a/TfsBuild.Versioning.Activities/ConvertAssemblyPropertyPattern.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Drawing; -using System.Activities; -using Microsoft.TeamFoundation.Build.Client; - -// ============================================================================================== -// http://tfsversioning.codeplex.com/ -// -// Author: Mark S. Nichols -// -// Copyright (c) 2011 Microsoft Corporation -// -// This source is subject to the Microsoft Permissive License. -// ============================================================================================== - -namespace TfsBuild.Versioning.Activities -{ - /// - /// Takes in a version pattern and turns it into a version number. - /// - [ToolboxBitmap(typeof(ConvertAssemblyPropertyPattern), "Resources.version.ico")] - [BuildActivity(HostEnvironmentOption.All)] - [BuildExtension(HostEnvironmentOption.All)] - public sealed class ConvertAssemblyPropertyPattern : CodeActivity - { - #region Workflow Arguments - - /// - /// The pattern to convert - /// - [RequiredArgument] - public InArgument PropertyPattern { get; set; } - - /// - /// Build number prefix for differentiating the build versions - /// - [RequiredArgument] - public InArgument BuildNumberPrefix { get; set; } - - /// - /// The date of the build - /// - [RequiredArgument] - public InArgument BuildDate { get; set; } - - [RequiredArgument] - public InArgument BuildDetail { get; set; } - - /// - /// The converted version number - /// - public OutArgument ConvertedVersionNumber { get; set; } - - #endregion - - /// - /// Processes the conversion of the version number - /// - /// - protected override void Execute(CodeActivityContext context) - { - // Get the values passed in - string propertyPattern = context.GetValue(PropertyPattern); - IBuildDetail buildDetail = context.GetValue(BuildDetail); - DateTime buildDate = context.GetValue(BuildDate); - int buildNumberPrefix = context.GetValue(BuildNumberPrefix); - - // Validate the version pattern - if (string.IsNullOrEmpty(propertyPattern)) - { - throw new ArgumentException("PropertyPattern must contain a valid property replacement pattern."); - } - - // Validate the version pattern - if (buildDetail == null) - { - throw new ArgumentNullException("BuildDetail", "BuildDetail must contain a valid IBuildDetail value."); - } - - string convertedValue = VersioningHelper.ReplacePatternWithValue(propertyPattern, buildDetail, buildDetail.BuildNumber, buildNumberPrefix, buildDate); - - // Return the value back to the workflow - context.SetValue(ConvertedVersionNumber, convertedValue); - } - } -} diff --git a/TfsBuild.Versioning.Activities/ConvertVersionPattern.cs b/TfsBuild.Versioning.Activities/ConvertVersionPattern.cs index b54f56b..3d7accb 100644 --- a/TfsBuild.Versioning.Activities/ConvertVersionPattern.cs +++ b/TfsBuild.Versioning.Activities/ConvertVersionPattern.cs @@ -1,90 +1,108 @@ -using System; -using System.Drawing; -using System.Text; -using System.Activities; -using Microsoft.TeamFoundation.Build.Client; - -// ============================================================================================== -// http://tfsversioning.codeplex.com/ -// -// Author: Mark S. Nichols -// -// Copyright (c) 2011 Microsoft Corporation -// -// This source is subject to the Microsoft Permissive License. -// ============================================================================================== - -namespace TfsBuild.Versioning.Activities -{ - /// - /// Takes in a version pattern and turns it into a version number. - /// - [ToolboxBitmap(typeof(ConvertVersionPattern), "Resources.version.ico")] - [BuildActivity(HostEnvironmentOption.All)] - [BuildExtension(HostEnvironmentOption.All)] - public sealed class ConvertVersionPattern : CodeActivity - { - #region Workflow Arguments - - /// - /// The pattern to convert - /// - [RequiredArgument] - public InArgument VersionPattern { get; set; } - - /// - /// TFS build number in case the "B" pattern is used - /// - [RequiredArgument] - public InArgument BuildNumber { get; set; } - - /// - /// The prefix value to add to the build number to make it unique compared to other builds - /// - [RequiredArgument] - public InArgument BuildNumberPrefix { get; set; } - - /// - /// The converted version number - /// - public OutArgument ConvertedVersionNumber { get; set; } - - #endregion - - /// - /// Processes the conversion of the version number - /// - /// - protected override void Execute(CodeActivityContext context) - { - // Get the values passed in - var versionPattern = context.GetValue(VersionPattern); - var buildNumber = context.GetValue(BuildNumber); - var buildNumberPrefix = context.GetValue(BuildNumberPrefix); - - var version = new StringBuilder(); - var addDot = false; - - // Validate the version pattern - if (string.IsNullOrEmpty(versionPattern)) - { - throw new ArgumentException("VersionPattern must contain the versioning pattern."); - } - - var versionPatternArray = versionPattern.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries); - - // Go through each pattern and convert it - foreach (var conversionItem in versionPatternArray) - { - if (addDot) { version.Append("."); } - - version.Append(VersioningHelper.ReplacePatternWithValue(conversionItem, buildNumber, buildNumberPrefix, DateTime.Now)); - - addDot = true; - } - - // Return the value back to the workflow - context.SetValue(ConvertedVersionNumber, version.ToString()); - } - } -} +using System; +using System.Drawing; +using System.Text; +using System.Activities; +using Microsoft.TeamFoundation.Build.Client; +using Microsoft.TeamFoundation.VersionControl.Client; + +// ============================================================================================== +// http://tfsversioning.codeplex.com/ +// +// Author: Mark S. Nichols +// +// Copyright (c) 2011 Microsoft Corporation +// +// This source is subject to the Microsoft Permissive License. +// ============================================================================================== + +namespace TfsBuild.Versioning.Activities +{ + /// + /// Takes in a version pattern and turns it into a version number. + /// + [ToolboxBitmap(typeof(ConvertVersionPattern), "Resources.version.ico")] + [BuildActivity(HostEnvironmentOption.All)] + [BuildExtension(HostEnvironmentOption.All)] + public sealed class ConvertVersionPattern : CodeActivity + { + #region Workflow Arguments + + /// + /// The pattern to convert + /// + [RequiredArgument] + public InArgument VersionPattern { get; set; } + + /// + /// TFS build number in case the "B" pattern is used + /// + [RequiredArgument] + public InArgument BuildNumber { get; set; } + + /// + /// The prefix value to add to the build number to make it unique compared to other builds + /// + [RequiredArgument] + public InArgument BuildNumberPrefix { get; set; } + + [RequiredArgument] + public InArgument BuildIncrementValue { get; set; } + + [RequiredArgument] + public InArgument BuildNumberSeed { get; set; } + + [RequiredArgument] + public InArgument BuildDetail { get; set; } + + [RequiredArgument] + public InArgument Workspace { get; set; } + + /// + /// The converted version number + /// + public OutArgument ConvertedVersionNumber { get; set; } + + #endregion + + /// + /// Processes the conversion of the version number + /// + /// + protected override void Execute(CodeActivityContext context) + { + // Get the values passed in + var versionPattern = context.GetValue(VersionPattern); + var buildNumber = context.GetValue(BuildNumber); + var buildNumberPrefix = context.GetValue(BuildNumberPrefix); + var buildIncrementValue = context.GetValue(BuildIncrementValue); + var buildNumberSeed = context.GetValue(BuildNumberSeed); + var buildDetail = context.GetValue(BuildDetail); + var workspace = context.GetValue(Workspace); + var buildAgent = context.GetExtension(); + + var version = new StringBuilder(); + var addDot = false; + + // Validate the version pattern + if (string.IsNullOrEmpty(versionPattern)) + { + throw new ArgumentException("VersionPattern must contain the versioning pattern."); + } + + var versionPatternArray = versionPattern.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries); + + // Go through each pattern and convert it + foreach (var conversionItem in versionPatternArray) + { + if (addDot) { version.Append("."); } + + version.Append(VersioningHelper.ReplacePatternWithValue(conversionItem, buildDetail, buildNumber, buildNumberPrefix, buildIncrementValue, buildNumberSeed, DateTime.Now, workspace, buildAgent)); + + addDot = true; + } + + // Return the value back to the workflow + context.SetValue(ConvertedVersionNumber, version.ToString()); + } + } +} diff --git a/TfsBuild.Versioning.Activities/ReplaceAssemblyInfoProperties.cs b/TfsBuild.Versioning.Activities/ReplaceAssemblyInfoProperties.cs index bce3c04..8be1132 100644 --- a/TfsBuild.Versioning.Activities/ReplaceAssemblyInfoProperties.cs +++ b/TfsBuild.Versioning.Activities/ReplaceAssemblyInfoProperties.cs @@ -1,218 +1,260 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Runtime.CompilerServices; -using System.Text; -using System.Activities; -using System.Text.RegularExpressions; -using Microsoft.TeamFoundation.Build.Client; - -// ============================================================================================== -// http://tfsversioning.codeplex.com/ -// -// Author: Mark S. Nichols -// -// Copyright (c) 2011 Microsoft Corporation -// -// This source is subject to the Microsoft Permissive License. -// ============================================================================================== - -namespace TfsBuild.Versioning.Activities -{ - [ToolboxBitmap(typeof(ReplaceAssemblyInfoProperties), "Resources.version.ico")] - [BuildActivity(HostEnvironmentOption.All)] - [BuildExtension(HostEnvironmentOption.All)] - public sealed class ReplaceAssemblyInfoProperties : CodeActivity - { - #region Workflow Arguments - - [RequiredArgument] - public InArgument FilePath { get; set; } - - [RequiredArgument] - public InArgument ForceCreate { get; set; } - - /// - /// The date of the build - /// - [RequiredArgument] - public InArgument BuildDate { get; set; } - - [RequiredArgument] - public InArgument BuildDetail { get; set; } - - // Assembly properties - public InArgument AssemblyTitle { get; set; } - public InArgument AssemblyDescription { get; set; } - public InArgument AssemblyConfiguration { get; set; } - public InArgument AssemblyCompany { get; set; } - public InArgument AssemblyProduct { get; set; } - public InArgument AssemblyCopyright { get; set; } - public InArgument AssemblyTrademark { get; set; } - public InArgument AssemblyCulture { get; set; } - public InArgument AssemblyInformationalVersion { get; set; } - - #endregion - - /// - /// Searches a file for a the version number and replaces with the updated value - /// - /// - protected override void Execute(CodeActivityContext context) - { - // Obtain the runtime value of the Text input argument - var filePath = context.GetValue(FilePath); - var forceCreate = context.GetValue(ForceCreate); - IBuildDetail buildDetail = context.GetValue(BuildDetail); - DateTime buildDate = context.GetValue(BuildDate); - - #region Validate Arguments - - if (String.IsNullOrEmpty(filePath)) - { - throw new ArgumentException( - "You must provide a file path", "FilePath"); - } - - if (!File.Exists(filePath)) - { - throw new FileNotFoundException("File not found:", filePath); - } - - #endregion - - IList> inputValues = new ReadOnlyCollectionBuilder>(); - - inputValues.Add(new KeyValuePair( "AssemblyTitle", context.GetValue(AssemblyTitle))); - inputValues.Add(new KeyValuePair( "AssemblyDescription", context.GetValue(AssemblyDescription))); - inputValues.Add(new KeyValuePair( "AssemblyConfiguration", context.GetValue(AssemblyConfiguration))); - inputValues.Add(new KeyValuePair( "AssemblyCompany", context.GetValue(AssemblyCompany))); - inputValues.Add(new KeyValuePair( "AssemblyProduct", context.GetValue(AssemblyProduct))); - inputValues.Add(new KeyValuePair( "AssemblyCopyright", context.GetValue(AssemblyCopyright))); - inputValues.Add(new KeyValuePair( "AssemblyTrademark", context.GetValue(AssemblyTrademark))); - inputValues.Add(new KeyValuePair( "AssemblyCulture", context.GetValue(AssemblyCulture))); - inputValues.Add(new KeyValuePair( "AssemblyInformationalVersion", context.GetValue(AssemblyInformationalVersion))); - - // Get the arguments and values from the current context - IList> assemblyInfoProperties = VersioningHelper.GetArgumentValues(inputValues); - - // What type of project are we working on? - var projectType = VersioningHelper.GetProjectTypeFromFileName(filePath); - - // Perform the update of the assembly info values based on the list created above - UpdateAssemblyValues(filePath, assemblyInfoProperties, buildDetail, buildDate, projectType, forceCreate); - } - - /// - /// Walks through the list of provided AssemblyInfo properties and updates those values - /// - /// AssemblyInfo file being modified - /// List of properties and values to change - /// - /// - /// Type of project (cs, vb, cpp or fs) - /// If the value isn't in the AssemblyInfo file do we insert it anyway - public void UpdateAssemblyValues(string filePath, IList> assemblyInfoProperties, - IBuildDetail buildDetail, DateTime buildDate, ProjectTypes projectType, bool forceCreate) - { - var newFileData = new StringBuilder(); - - // make sure you can write to the file - var currentFileAttributes = File.GetAttributes(filePath); - File.SetAttributes(filePath, currentFileAttributes & ~FileAttributes.ReadOnly); - - // Get the file data - var fileData = File.ReadAllText(filePath); - - // if working with F# files, remove the "do binding" so we can make sure that the "do" is at the end of the file - if (projectType == ProjectTypes.Fs) - { - var regex = new Regex(@".*(\(\s*\)|do\s*\(\s*\))"); - fileData = regex.Replace(fileData, ""); - } - - foreach (KeyValuePair property in assemblyInfoProperties) - { - string convertedValue = VersioningHelper.ReplacePatternsInPropertyValue(property.Value, buildDetail, 0, - buildDate); - - fileData = UpdateAssemblyValue(fileData, property.Key, convertedValue, projectType, forceCreate); - } - - // do we need to put a NewLine char in the data from the file - if (DoesLastLineContainCr(fileData)) - { - newFileData.Append(fileData); - } - else - { - newFileData.AppendLine(fileData); - } - - // for F#, put the do() binding back in - if (projectType == ProjectTypes.Fs) - { - newFileData.AppendLine("do ()"); - } - - // Write the data out to a file - File.WriteAllText(filePath, newFileData.ToString()); - - // restore the file's original attributes - File.SetAttributes(filePath, currentFileAttributes); - } - - /// - /// - /// - /// AssemblyInfo file contents as a string - /// Name of the property to modify or insert - /// New value of the property - /// Type of project (cs, vb, cpp or fs) - /// If the value isn't in the AssemblyInfo file do we insert it anyway - /// The updated file data - public static string UpdateAssemblyValue(string fileData, string propertyName, string propertyValue, ProjectTypes projectType, bool forceCreate) - { - string newFileData; - - // Set up RegEx - var regExExpression = string.Format(VersioningHelper.RegExPropertyMatch, propertyName); - var regex = new Regex(regExExpression); - - // perform the actual replacement - var groups = regex.Match(fileData).Groups; - - // AssemblyInfo Property not found so insert it if forceCreate is true - // 5 is the number of groups that will be discovered in the regex expression match - if ((groups.Count < 5) && (forceCreate)) - { - newFileData = VersioningHelper.InsertAssemblyInfoProperty(fileData, propertyName, propertyValue, projectType); - } - else - { - // Property was found...replace the value - var replacementString = string.Format("{0}{1}{2}", groups["PropertyPrefix"], propertyValue, groups["PropertyPostfix"]); - - newFileData = regex.Replace(fileData, replacementString); - } - - return newFileData; - } - - public static bool DoesLastLineContainCr(string fileData) - { - var regEx = new Regex(@".+\n$"); - - var match = regEx.Match(fileData); - - if (match.Success) - { - return true; - } - - return false; - } - } -} - +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Activities; +using System.Text.RegularExpressions; +using Microsoft.TeamFoundation.Build.Client; +using Microsoft.TeamFoundation.VersionControl.Client; + +// ============================================================================================== +// http://tfsversioning.codeplex.com/ +// +// Author: Mark S. Nichols +// +// Copyright (c) 2011 Microsoft Corporation +// +// This source is subject to the Microsoft Permissive License. +// ============================================================================================== + +namespace TfsBuild.Versioning.Activities +{ + [ToolboxBitmap(typeof(ReplaceAssemblyInfoProperties), "Resources.version.ico")] + [BuildActivity(HostEnvironmentOption.All)] + [BuildExtension(HostEnvironmentOption.All)] + public sealed class ReplaceAssemblyInfoProperties : CodeActivity + { + #region Workflow Arguments + + [RequiredArgument] + public InArgument FilePath { get; set; } + + [RequiredArgument] + public InArgument ForceCreate { get; set; } + + /// + /// The date of the build + /// + [RequiredArgument] + public InArgument BuildDate { get; set; } + + [RequiredArgument] + public InArgument BuildDetail { get; set; } + + [RequiredArgument] + public InArgument Workspace { get; set; } + + /// + /// The prefix value to add to the build number to make it unique compared to other builds + /// + [RequiredArgument] + public InArgument BuildNumberPrefix { get; set; } + + [RequiredArgument] + public InArgument BuildIncrementValue { get; set; } + + [RequiredArgument] + public InArgument BuildNumberSeed { get; set; } + + // Assembly properties + public InArgument AssemblyTitle { get; set; } + public InArgument AssemblyDescription { get; set; } + public InArgument AssemblyConfiguration { get; set; } + public InArgument AssemblyCompany { get; set; } + public InArgument AssemblyProduct { get; set; } + public InArgument AssemblyCopyright { get; set; } + public InArgument AssemblyTrademark { get; set; } + public InArgument AssemblyCulture { get; set; } + public InArgument AssemblyInformationalVersion { get; set; } + + public OutArgument OutAssemblyDescription { get; set; } + public OutArgument OutAssemblyCopyright { get; set; } + public OutArgument OutAssemblyProduct { get; set; } + public OutArgument OutAssemblyInformationalVersion { get; set; } + + #endregion + + /// + /// Searches a file for a the version number and replaces with the updated value + /// + /// + protected override void Execute(CodeActivityContext context) + { + // Obtain the runtime value of the Text input argument + var filePath = context.GetValue(FilePath); + var forceCreate = context.GetValue(ForceCreate); + var buildDetail = context.GetValue(BuildDetail); + var buildDate = context.GetValue(BuildDate); + var workspace = context.GetValue(Workspace); + var buildNumberPrefix = context.GetValue(BuildNumberPrefix); + var buildIncrementValue = context.GetValue(BuildIncrementValue); + var buildNumberSeed = context.GetValue(BuildNumberSeed); + var buildAgent = context.GetExtension(); + + #region Validate Arguments + + if (String.IsNullOrEmpty(filePath)) + { + throw new ArgumentException( + "You must provide a file path", "FilePath"); + } + + if (!File.Exists(filePath)) + { + throw new FileNotFoundException("File not found:", filePath); + } + + #endregion + + IList> inputValues = new ReadOnlyCollectionBuilder>(); + + inputValues.Add(new KeyValuePair( "AssemblyTitle", context.GetValue(AssemblyTitle))); + inputValues.Add(new KeyValuePair( "AssemblyDescription", context.GetValue(AssemblyDescription))); + inputValues.Add(new KeyValuePair( "AssemblyConfiguration", context.GetValue(AssemblyConfiguration))); + inputValues.Add(new KeyValuePair( "AssemblyCompany", context.GetValue(AssemblyCompany))); + inputValues.Add(new KeyValuePair( "AssemblyProduct", context.GetValue(AssemblyProduct))); + inputValues.Add(new KeyValuePair( "AssemblyCopyright", context.GetValue(AssemblyCopyright))); + inputValues.Add(new KeyValuePair( "AssemblyTrademark", context.GetValue(AssemblyTrademark))); + inputValues.Add(new KeyValuePair( "AssemblyCulture", context.GetValue(AssemblyCulture))); + inputValues.Add(new KeyValuePair( "AssemblyInformationalVersion", context.GetValue(AssemblyInformationalVersion))); + + // Get the arguments and values from the current context + IList> assemblyInfoProperties = VersioningHelper.GetArgumentValues(inputValues); + + // What type of project are we working on? + var projectType = VersioningHelper.GetProjectTypeFromFileName(filePath); + + // Perform the update of the assembly info values based on the list created above + var convertedValues = UpdateAssemblyValues(filePath, assemblyInfoProperties, buildDetail, buildDate, projectType, forceCreate, workspace, buildAgent, buildNumberPrefix, buildIncrementValue, buildNumberSeed); + + context.SetValue(OutAssemblyCopyright, convertedValues.Any(x => x.Key == "AssemblyCopyright") ? convertedValues.First(x => x.Key == "AssemblyCopyright").Value : string.Empty); + context.SetValue(OutAssemblyProduct, convertedValues.Any(x => x.Key == "AssemblyProduct") ? convertedValues.First(x => x.Key == "AssemblyProduct").Value : string.Empty); + context.SetValue(OutAssemblyDescription, convertedValues.Any(x => x.Key == "AssemblyDescription") ? convertedValues.First(x => x.Key == "AssemblyDescription").Value : string.Empty); + context.SetValue(OutAssemblyInformationalVersion, convertedValues.Any(x => x.Key == "AssemblyInformationalVersion") ? convertedValues.First(x => x.Key == "AssemblyInformationalVersion").Value : string.Empty); + } + + /// + /// Walks through the list of provided AssemblyInfo properties and updates those values + /// + /// AssemblyInfo file being modified + /// List of properties and values to change + /// + /// + /// Type of project (cs, vb, cpp or fs) + /// If the value isn't in the AssemblyInfo file do we insert it anyway + /// + /// + /// + /// + /// + public ICollection> UpdateAssemblyValues(string filePath, IList> assemblyInfoProperties, + IBuildDetail buildDetail, DateTime buildDate, ProjectTypes projectType, bool forceCreate, Workspace workspace, IBuildAgent buildAgent, int buildNumberPrefix, int incrementBy, int buildNumberSeed) + { + var convertedValues = new List>(); + var newFileData = new StringBuilder(); + + // make sure you can write to the file + var currentFileAttributes = File.GetAttributes(filePath); + File.SetAttributes(filePath, currentFileAttributes & ~FileAttributes.ReadOnly); + + // Get the file data + var fileData = File.ReadAllText(filePath); + + // if working with F# files, remove the "do binding" so we can make sure that the "do" is at the end of the file + if (projectType == ProjectTypes.Fs) + { + var regex = new Regex(@".*(\(\s*\)|do\s*\(\s*\))"); + fileData = regex.Replace(fileData, ""); + } + + foreach (KeyValuePair property in assemblyInfoProperties) + { + string convertedValue = VersioningHelper.ReplacePatternsInPropertyValue(property.Value, buildDetail, buildNumberPrefix, incrementBy, buildNumberSeed, + buildDate, workspace, buildAgent); + + convertedValues.Add(new KeyValuePair(property.Key, convertedValue)); + + fileData = UpdateAssemblyValue(fileData, property.Key, convertedValue, projectType, forceCreate); + } + + // do we need to put a NewLine char in the data from the file + if (DoesLastLineContainCr(fileData)) + { + newFileData.Append(fileData); + } + else + { + newFileData.AppendLine(fileData); + } + + // for F#, put the do() binding back in + if (projectType == ProjectTypes.Fs) + { + newFileData.AppendLine("do ()"); + } + + // Write the data out to a file + File.WriteAllText(filePath, newFileData.ToString()); + + // restore the file's original attributes + File.SetAttributes(filePath, currentFileAttributes); + + return convertedValues; + } + + /// + /// + /// + /// AssemblyInfo file contents as a string + /// Name of the property to modify or insert + /// New value of the property + /// Type of project (cs, vb, cpp or fs) + /// If the value isn't in the AssemblyInfo file do we insert it anyway + /// The updated file data + public static string UpdateAssemblyValue(string fileData, string propertyName, string propertyValue, ProjectTypes projectType, bool forceCreate) + { + string newFileData; + + // Set up RegEx + var regExExpression = string.Format(VersioningHelper.RegExPropertyMatch, propertyName); + var regex = new Regex(regExExpression); + + // perform the actual replacement + var groups = regex.Match(fileData).Groups; + + // AssemblyInfo Property not found so insert it if forceCreate is true + // 5 is the number of groups that will be discovered in the regex expression match + if ((groups.Count < 5) && (forceCreate)) + { + newFileData = VersioningHelper.InsertAssemblyInfoProperty(fileData, propertyName, propertyValue, projectType); + } + else + { + // Property was found...replace the value + var replacementString = string.Format("{0}{1}{2}", groups["PropertyPrefix"], propertyValue, groups["PropertyPostfix"]); + + newFileData = regex.Replace(fileData, replacementString); + } + + return newFileData; + } + + public static bool DoesLastLineContainCr(string fileData) + { + var regEx = new Regex(@".+\n$"); + + var match = regEx.Match(fileData); + + if (match.Success) + { + return true; + } + + return false; + } + } +} + diff --git a/TfsBuild.Versioning.Activities/TfsBuild.Versioning.Activities.csproj b/TfsBuild.Versioning.Activities/TfsBuild.Versioning.Activities.csproj index 6c8d5bc..72dad66 100644 --- a/TfsBuild.Versioning.Activities/TfsBuild.Versioning.Activities.csproj +++ b/TfsBuild.Versioning.Activities/TfsBuild.Versioning.Activities.csproj @@ -1,123 +1,121 @@ - - - - Debug - AnyCPU - 10.0 - 2.0 - {F44C079C-A474-47B9-8874-4FB835A425DA} - {32f31d43-81cc-4c15-9de6-3fc5453562b6};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - TfsBuild.Versioning.Activities - TfsBuild.Versioning.Activities - v4.5 - - - 512 - SAK - SAK - SAK - SAK - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - true - - - TfsBuild.Versioning.Activities.Key.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - Designer - - - - - - - - - MSBuild:Compile - Designer - - - Designer - - - - - Designer - - - - - Designer - - - + + + + Debug + AnyCPU + 10.0 + 2.0 + {F44C079C-A474-47B9-8874-4FB835A425DA} + {32f31d43-81cc-4c15-9de6-3fc5453562b6};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + TfsBuild.Versioning.Activities + TfsBuild.Versioning.Activities + v4.5 + + + 512 + SAK + SAK + SAK + SAK + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + true + + + TfsBuild.Versioning.Activities.Key.snk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MSBuild:Compile + Designer + + + + + + + + + MSBuild:Compile + Designer + + + Designer + + + + + Designer + + + + + Designer + + + + --> \ No newline at end of file diff --git a/TfsBuild.Versioning.Activities/UpdateAssemblyInfoFileVersion.xaml b/TfsBuild.Versioning.Activities/UpdateAssemblyInfoFileVersion.xaml index ff92db7..d917d52 100644 --- a/TfsBuild.Versioning.Activities/UpdateAssemblyInfoFileVersion.xaml +++ b/TfsBuild.Versioning.Activities/UpdateAssemblyInfoFileVersion.xaml @@ -1,231 +1,231 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TfsBuild.Versioning.Activities.UpdateAssemblyInfoFileVersion_1 - - - System.Activities - System.Activities.XamlIntegration - System.Activities.Statements - System.Activities.Expressions - System.Activities.Validation - Microsoft.TeamFoundation - Microsoft.TeamFoundation.Build.Client - Microsoft.TeamFoundation.Build.Workflow - Microsoft.TeamFoundation.Build.Workflow.Activities - Microsoft.TeamFoundation.Build.Workflow.Tracking - Microsoft.TeamFoundation.VersionControl.Client - Microsoft.VisualBasic - Microsoft.VisualBasic.Activities - System - System.Activities.Debugger - System.ComponentModel - System.Collections.Generic - System.Data - System.Drawing - System.IO - System.Linq - System.Reflection - System.Text - System.Text.RegularExpressions - System.Xml - System.Windows.Markup - TfsBuild.Versioning.Activities - System.Drawing.Drawing2D - - - - - System.Activities - Microsoft.TeamFoundation.Common - Microsoft.TeamFoundation.Build.Client - Microsoft.TeamFoundation.Build.Workflow - Microsoft.TeamFoundation.VersionControl.Client - System - mscorlib - System.Xml - System.Core - System.ServiceModel - WindowsBase - System.Data - System.Data.DataSetExtensions - System.Drawing - System.Runtime.Serialization - PresentationFramework - PresentationCore - System.Xaml - TfsBuild.Versioning.Activities - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - d5MBQzpcX1Rmc1Byb2plY3RzVlMyMDEyXEJ1aWxkQWN0aXZpdGllc1xTb2x1dGlvbkJ1aWxkVmVyc2lvbmluZ1xEZXZcVmVyc2lvbiAyLjAuMC4wXFRmc0J1aWxkLlZlcnNpb25pbmcuQWN0aXZpdGllc1xVcGRhdGVBc3NlbWJseUluZm9GaWxlVmVyc2lvbi54YW1sNnMDowEOAgEBdAWhAQoCAQJ0E3QxAgEDdgmcARQCAQefAQmfAeUCAgEEdwubARUCAQifAbQBnwH+AQIBBne7AXfTAQIBU3wPmQEaAgEJgAERgAGLAwIBT4EBEYsBFgIBO4wBEZYBFgIBJ5cBEZcBcwIBJJgBEZgBhQYCAQqAAdwBgAGkAgIBUYABhAGAAaMBAgFQgQEfgQGrAQIBPIMBFYkBIAIBPYwBH4wBswECASiOARWUASACASmXAWGXAXACASWYAYIBmAGtAQIBIpgB2ASYAe8EAgEhmAH8BJgBiwUCAR+YAaYEmAHNBAIBHZgB+AGYAZ0CAgEbmAGyApgB2wICARmYAfADmAGTBAIBF5gBwAGYAecBAgEVmAG8A5gB4QMCAROYAUaYAWsCARGYAfkCmAGrAwIBD5gBqgWYAcAFAgENmAGVBZgBnQUCAQuHAReHAcQCAgFGiAEXiAHyAgIBPpIBF5IBzAICATKTAReTAf4CAgEqhwGPAYcBogECAU2HAWKHAXcCAUuHAZwChwHBAgIBSYcBQIcBTwIBR4gBigKIAZ0CAgFEiAGqAogB7wICAUOIAXeIAY0BAgFBiAFiiAFqAgE/kgGPAZIBpgECATmSAWKSAXcCATeSAaACkgHJAgIBNZIBQJIBTwIBM5MBjgKTAaUCAgEwkwGyApMB+wICAS+TAXuTAZEBAgEtkwFmkwFuAgEr - - - - - - - - - - True - - - - - - - - - - True - - - - - - - - - - True - - - - - - - - True - - - - - - - - True - False - - - - - - - False - False - - - - - - - False - True - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TfsBuild.Versioning.Activities.UpdateAssemblyInfoFileVersion_1 + + + System.Activities + System.Activities.XamlIntegration + System.Activities.Statements + System.Activities.Expressions + System.Activities.Validation + Microsoft.TeamFoundation + Microsoft.TeamFoundation.Build.Client + Microsoft.TeamFoundation.Build.Workflow + Microsoft.TeamFoundation.Build.Workflow.Activities + Microsoft.TeamFoundation.Build.Workflow.Tracking + Microsoft.TeamFoundation.VersionControl.Client + Microsoft.VisualBasic + Microsoft.VisualBasic.Activities + System + System.Activities.Debugger + System.ComponentModel + System.Collections.Generic + System.Data + System.Drawing + System.IO + System.Linq + System.Reflection + System.Text + System.Text.RegularExpressions + System.Xml + System.Windows.Markup + TfsBuild.Versioning.Activities + System.Drawing.Drawing2D + + + + + System.Activities + Microsoft.TeamFoundation.Common + Microsoft.TeamFoundation.Build.Client + Microsoft.TeamFoundation.Build.Workflow + Microsoft.TeamFoundation.VersionControl.Client + System + mscorlib + System.Xml + System.Core + System.ServiceModel + WindowsBase + System.Data + System.Data.DataSetExtensions + System.Drawing + System.Runtime.Serialization + PresentationFramework + PresentationCore + System.Xaml + TfsBuild.Versioning.Activities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + d1xDOlxkZXZcVGZzVmVyc2lvbmluZ1x0cnVua1xUZnNCdWlsZC5WZXJzaW9uaW5nLkFjdGl2aXRpZXNcVXBkYXRlQXNzZW1ibHlJbmZvRmlsZVZlcnNpb24ueGFtbEYB4gEB5AEBAwGqAQGsAQECfgOkAQ4CAQF/BaIBCgIBAn8TfzECAQOBAQmdARQCAQagAQmgAeUCAgEEggELnAEVAgEHoAG0AaAB/gECAQWCAbsBggHTAQIBaYcBD5oBGgIBCIgBEYgBiwMCAWWJARGQARYCAUuRARGYARYCATGZARGZAdcIAgEJiAHcAYgBpAICAWeIAYQBiAGjAQIBZokBH4kBqwECAUyLARWOASACAU2RAR+RAbMBAgEykwEVlgEgAgEzmQHwBZkBgwYCAS+ZAYIBmQGtAQIBLZkB2ASZAe8EAgEsmQH8BJkBiwUCASuZAaYEmQHNBAIBKZkB+AGZAZ0CAgEnmQHKBZkB3wUCASWZAb0HmQHUBwIBI5kBsgKZAdsCAgEhmQHwA5kBkwQCAR+ZAcABmQHnAQIBHZkBkAeZAaUHAgEbmQG8A5kB4QMCARmZAccImQHUCAIBGJkBRpkBawIBFpkB+QKZAasDAgEUmQH1B5kBlQgCARKZAaAFmQG3BQIBEJkBogaZAbgGAgEOmQGpCJkBvAgCAQyZAY0GmQGVBgIBCowBF4wByAMCAVaNAReNAfICAgFOlAEXlAHQAwIBPJUBF5UB/gICATSMAdABjAHjAQIBY4wB+wGMAY4CAgFhjAFAjAFPAgFgjAGqAYwBvwECAV6MAYgDjAGtAwIBXIwBiAGMAZcBAgFajAG4A4wBxQMCAVmMAWSMAXsCAVeNAYoCjQGdAgIBVI0BqgKNAe8CAgFTjQF3jQGNAQIBUY0BYo0BagIBT5QB0AGUAeMBAgFJlAH7AZQBkgICAUeUAUCUAU8CAUaUAaoBlAG/AQIBRJQBjAOUAbUDAgFClAGIAZQBlwECAUCUAcADlAHNAwIBP5QBZJQBewIBPZUBjgKVAaUCAgE6lQGyApUB+wICATmVAXuVAZEBAgE3lQFmlQFuAgE1 + + + + + + + + + + True + + + + + + + + + + True + + + + + + + + + True + + + + + + + + True + + + + + + + + True + False + + + + + + + False + False + + + + + + + False + True + + + + + \ No newline at end of file diff --git a/TfsBuild.Versioning.Activities/VersionAssemblyInfoFiles.xaml b/TfsBuild.Versioning.Activities/VersionAssemblyInfoFiles.xaml index 013478f..11785d2 100644 --- a/TfsBuild.Versioning.Activities/VersionAssemblyInfoFiles.xaml +++ b/TfsBuild.Versioning.Activities/VersionAssemblyInfoFiles.xaml @@ -1,863 +1,877 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TfsBuild.Versioning.Activities.VersionAssemblyInfoFiles_1 - - - System.Activities - System.Activities.XamlIntegration - System.Activities.Statements - System.Activities.Expressions - System.Activities.Validation - Microsoft.TeamFoundation - Microsoft.TeamFoundation.Build.Client - Microsoft.TeamFoundation.Build.Workflow - Microsoft.TeamFoundation.Build.Workflow.Activities - Microsoft.TeamFoundation.Build.Workflow.Tracking - Microsoft.TeamFoundation.VersionControl.Client - Microsoft.VisualBasic - Microsoft.VisualBasic.Activities - System - System.Activities.Debugger - System.ComponentModel - System.Collections.Generic - System.Data - System.Drawing - System.IO - System.Linq - System.Reflection - System.Text - System.Text.RegularExpressions - System.Xml - System.Windows.Markup - TfsBuild.Versioning.Activities - System.Activities.DurableInstancing - - - - - System.Activities - Microsoft.TeamFoundation.Common - Microsoft.TeamFoundation.Build.Client - Microsoft.TeamFoundation.Build.Workflow - Microsoft.TeamFoundation.VersionControl.Client - System - mscorlib - System.Xml - System.Core - System.ServiceModel - WindowsBase - System.Data - System.Data.DataSetExtensions - System.Drawing - System.Runtime.Serialization - PresentationFramework - PresentationCore - System.Xaml - TfsBuild.Versioning.Activities - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [PathToSolution] - - - [Path.GetDirectoryName(SolutionPath)] - - - - - - - - - - - - - - - - - - - - - - - - - - [FullPathToSeedFile] - - - [Path.Combine(PathToSolution, VersionSeedFilePath)] - - - - - - - - - - - - [SolutionName] - - - [Path.GetFileNameWithoutExtension(solution)] - - - - - - - - - - [AssemblyVersionXpathExpression] - - - ["/VersionSeed/Solution[@name='" + SolutionName + "']/AssemblyVersionPattern"] - - - - - - - - - - - [AssemblyVersionXpathExpression] - - - ["/VersionSeed/Solution[@name='" + SolutionName + "']/AssemblyFileVersionPattern"] - - - - - - - - - - - [AssemblyPropertyXPathExpression] - - - [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyTitlePattern", SolutionName)] - - - - - - [AssemblyPropertyXPathExpression] - - - [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyDescriptionPattern", SolutionName)] - - - - - - [AssemblyPropertyXPathExpression] - - - [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyConfigurationPattern", SolutionName)] - - - - - - [AssemblyPropertyXPathExpression] - - - [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyCompanyPattern", SolutionName)] - - - - - - [AssemblyPropertyXPathExpression] - - - [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyProductPattern", SolutionName)] - - - - - - [AssemblyPropertyXPathExpression] - - - [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyCopyrightPattern", SolutionName)] - - - - - - [AssemblyPropertyXPathExpression] - - - [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyTrademarkPattern", SolutionName)] - - - - - - [AssemblyPropertyXPathExpression] - - - [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyCulturePattern", SolutionName)] - - - - - - [AssemblyPropertyXPathExpression] - - - [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyInformationalVersionPattern", SolutionName)] - - - - - - - - - - - - - - [AssemblyVersionXpathExpression] - - - ["/VersionSeed/Solution[@name='Default']/AssemblyVersionPattern"] - - - - - - [AssemblyVersionXpathExpression] - - - ["/VersionSeed/Solution[@name='Default']/AssemblyFileVersionPattern"] - - - - - - - - - - - - - - - - - - - - - - [AssemblyVersionReplacementPattern] - - - [AssemblyVersionPattern] - - - - - [AssemblyFileVersionReplacementPattern] - - - [AssemblyFileVersionPattern] - - - - - - - [AssemblyTitleReplacementPattern] - - - [AssemblyTitlePattern] - - - - - [AssemblyDescriptionReplacementPattern] - - - [AssemblyDescriptionPattern] - - - - - [AssemblyConfigurationReplacementPattern] - - - [AssemblyConfigurationPattern] - - - - - [AssemblyCompanyReplacementPattern] - - - [AssemblyCompanyPattern] - - - - - [AssemblyProductReplacementPattern] - - - [AssemblyProductPattern] - - - - - [AssemblyCopyrightReplacementPattern] - - - [AssemblyCopyrightPattern] - - - - - [AssemblyTrademarkReplacementPattern] - - - [AssemblyTrademarkPattern] - - - - - [AssemblyCultureReplacementPattern] - - - [AssemblyCulturePattern] - - - - - [AssemblyInformationalVersionReplacementPattern] - - - [AssemblyInformationalVersionPattern] - - - - - - - - - - - - [AssemblyInfoFileSearchPattern] - - - [Path.Combine(Path.GetDirectoryName(SolutionPath), "**", AssemblyInfoFilePattern)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - - - - False - False - - - - - - - - False - False - - - - - - - - False - False - - - - - - - True - False - - - - - - - - - - - - - - True - - - - - - - - - - - - - - True - - - - - - - - - True - - - - - - - - - - - - - - - - - - - - - - - - - True - False - - - - - - - True - False - - - - - - - - - - - True - - - - - - - True - False - - - - - - - True - False - - - - - - - True - False - - - - - - - - - - - True - - - - - - - - - - - - - - - - True - - - - - - - True - - - - - - - False - False - - - - - - - True - False - - - - - - - - - - - - - True - - - - - - - - - - - True - - - - - - - - - - True - - - - - - - - - - True - - - - - - - - True - - - - - - - - True - False - - - - - - - False - False - - - - - - - False - True - - - - - - - True - - - - - - - - - True - False - - - - - - - - True - False - - - - - - - True - False - - - - - - - True - - - - - - - False - True - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TfsBuild.Versioning.Activities.VersionAssemblyInfoFiles_1 + + + System.Activities + System.Activities.XamlIntegration + System.Activities.Statements + System.Activities.Expressions + System.Activities.Validation + Microsoft.TeamFoundation + Microsoft.TeamFoundation.Build.Client + Microsoft.TeamFoundation.Build.Workflow + Microsoft.TeamFoundation.Build.Workflow.Activities + Microsoft.TeamFoundation.Build.Workflow.Tracking + Microsoft.TeamFoundation.VersionControl.Client + Microsoft.VisualBasic + Microsoft.VisualBasic.Activities + System + System.Activities.Debugger + System.ComponentModel + System.Collections.Generic + System.Data + System.Drawing + System.IO + System.Linq + System.Reflection + System.Text + System.Text.RegularExpressions + System.Xml + System.Windows.Markup + TfsBuild.Versioning.Activities + System.Activities.DurableInstancing + + + + + System.Activities + Microsoft.TeamFoundation.Common + Microsoft.TeamFoundation.Build.Client + Microsoft.TeamFoundation.Build.Workflow + Microsoft.TeamFoundation.VersionControl.Client + System + mscorlib + System.Xml + System.Core + System.ServiceModel + WindowsBase + System.Data + System.Data.DataSetExtensions + System.Drawing + System.Runtime.Serialization + PresentationFramework + PresentationCore + System.Xaml + TfsBuild.Versioning.Activities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [PathToSolution] + + + [Path.GetDirectoryName(SolutionPath)] + + + + + + + + + + + + + + + + + + + + + + + + + + [FullPathToSeedFile] + + + [Path.Combine(PathToSolution, VersionSeedFilePath)] + + + + + + + + + + + + [SolutionName] + + + [Path.GetFileNameWithoutExtension(solution)] + + + + + + + + + + [AssemblyVersionXpathExpression] + + + ["/VersionSeed/Solution[@name='" + SolutionName + "']/AssemblyVersionPattern"] + + + + + + + + + + + [AssemblyVersionXpathExpression] + + + ["/VersionSeed/Solution[@name='" + SolutionName + "']/AssemblyFileVersionPattern"] + + + + + + + + + + + [AssemblyPropertyXPathExpression] + + + [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyTitlePattern", SolutionName)] + + + + + + [AssemblyPropertyXPathExpression] + + + [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyDescriptionPattern", SolutionName)] + + + + + + [AssemblyPropertyXPathExpression] + + + [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyConfigurationPattern", SolutionName)] + + + + + + [AssemblyPropertyXPathExpression] + + + [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyCompanyPattern", SolutionName)] + + + + + + [AssemblyPropertyXPathExpression] + + + [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyProductPattern", SolutionName)] + + + + + + [AssemblyPropertyXPathExpression] + + + [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyCopyrightPattern", SolutionName)] + + + + + + [AssemblyPropertyXPathExpression] + + + [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyTrademarkPattern", SolutionName)] + + + + + + [AssemblyPropertyXPathExpression] + + + [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyCulturePattern", SolutionName)] + + + + + + [AssemblyPropertyXPathExpression] + + + [String.Format("/VersionSeed/Solution[@name='{0}']/AssemblyInformationalVersionPattern", SolutionName)] + + + + + + + + + + + + + + [AssemblyVersionXpathExpression] + + + ["/VersionSeed/Solution[@name='Default']/AssemblyVersionPattern"] + + + + + + [AssemblyVersionXpathExpression] + + + ["/VersionSeed/Solution[@name='Default']/AssemblyFileVersionPattern"] + + + + + + + + + + + + + + + + + + + + + + [AssemblyVersionReplacementPattern] + + + [AssemblyVersionPattern] + + + + + [AssemblyFileVersionReplacementPattern] + + + [AssemblyFileVersionPattern] + + + + + + + [AssemblyTitleReplacementPattern] + + + [AssemblyTitlePattern] + + + + + [AssemblyDescriptionReplacementPattern] + + + [AssemblyDescriptionPattern] + + + + + [AssemblyConfigurationReplacementPattern] + + + [AssemblyConfigurationPattern] + + + + + [AssemblyCompanyReplacementPattern] + + + [AssemblyCompanyPattern] + + + + + [AssemblyProductReplacementPattern] + + + [AssemblyProductPattern] + + + + + [AssemblyCopyrightReplacementPattern] + + + [AssemblyCopyrightPattern] + + + + + [AssemblyTrademarkReplacementPattern] + + + [AssemblyTrademarkPattern] + + + + + [AssemblyCultureReplacementPattern] + + + [AssemblyCulturePattern] + + + + + [AssemblyInformationalVersionReplacementPattern] + + + [AssemblyInformationalVersionPattern] + + + + + + + + + + + + + [AssemblyInfoFileSearchPattern] + + + [Path.Combine(SourceRootFileDirectory, "**", AssemblyInfoFilePattern)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + False + False + + + + + + + + False + False + + + + + + + + False + False + + + + + + + True + False + + + + + + + + + + + + + + True + + + + + + + + + + + + + + True + + + + + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + True + False + + + + + + + True + False + + + + + + + + + + + True + + + + + + + True + False + + + + + + + True + False + + + + + + + True + False + + + + + + + + + + + True + + + + + + + + + + + + + + + + True + + + + + + + True + + + + + + + False + False + + + + + + + True + False + + + + + + + + + + + + + + True + + + + + + + + + + + True + + + + + + + + + + True + + + + + + + + + True + + + + + + + + True + + + + + + + + True + False + + + + + + + False + False + + + + + + + False + True + + + + + + + True + + + + + + + + + True + False + + + + + + + + True + False + + + + + + + True + False + + + + + + + True + + + + + + + False + True + + + + + \ No newline at end of file diff --git a/TfsBuild.Versioning.Activities/VersioningHelper.cs b/TfsBuild.Versioning.Activities/VersioningHelper.cs index fb992b7..8137b69 100644 --- a/TfsBuild.Versioning.Activities/VersioningHelper.cs +++ b/TfsBuild.Versioning.Activities/VersioningHelper.cs @@ -1,371 +1,443 @@ -using System; -using System.Activities; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Runtime.CompilerServices; -using System.Text; -using System.Text.RegularExpressions; -using Microsoft.TeamFoundation.Build.Client; - -// ============================================================================================== -// http://tfsversioning.codeplex.com/ -// -// Author: Mark S. Nichols -// -// Copyright (c) 2011 Microsoft Corporation -// -// This source is subject to the Microsoft Permissive License. -// ============================================================================================== - -namespace TfsBuild.Versioning.Activities -{ - public static class VersioningHelper - { - public const string CsAssembly = "[assembly: {0}(\"{1}\")]"; - public const string CppAssembly = "[assembly: {0}Attribute(\"{1}\")];"; - public const string VbAssembly = ""; - public const string FsAssembly = "[]"; - public const string FsDoRegex = @".*(\(\s*\)|do\s*\(\s*\))"; - public const string FsDoStatement = "do ()"; - public const string PropertyNotFound = "Property Not Found"; - public const string AssemblyVersionPropertyName = "AssemblyVersion"; - public const string AssemblyFileVersionPropertyName = "AssemblyFileVersion"; - - public static readonly string[] AlternateAssemblyProperties; - - public const string RegExPropertyMatch = - @"(?(?[\[<].*{0}.*\(\x22)(?.*)(?\x22\)[\]>]+))"; - - static VersioningHelper() - { - AlternateAssemblyProperties = new[] { "AssemblyTitle", "AssemblyDescription", "AssemblyConfiguration", - "AssemblyCompany", "AssemblyProduct", "AssemblyCopyright", "AssemblyTrademark", - "AssemblyCulture", "AssemblyInformationalVersion" }; - } - - public static ProjectTypes GetProjectTypeFromFileName(string filename) - { - if (String.IsNullOrWhiteSpace(filename)) - { - throw new ArgumentNullException("filename"); - } - - var fileExtension = Path.GetExtension(filename); - - if (String.IsNullOrWhiteSpace(fileExtension)) - { - // nothing there? just pass in something that definitely won't match - fileExtension = ".xxx"; - } - - var normalizedFileExtension = fileExtension.ToLower(); - - switch (normalizedFileExtension) - { - case ".cs": - return ProjectTypes.Cs; - - case ".vb": - return ProjectTypes.Vb; - - case ".cpp": - return ProjectTypes.Cpp; - - case ".fs": - return ProjectTypes.Fs; - - default: - throw new ArgumentException(String.Format("{0} is not one of the accepted file types (.cs, .vb, .cpp, .fs)", filename)); - } - } - - public static string GetVersionShellByType(ProjectTypes projectType) - { - switch (projectType) - { - case ProjectTypes.Cs: - return CsAssembly; - - case ProjectTypes.Vb: - return VbAssembly; - - case ProjectTypes.Cpp: - return CppAssembly; - - case ProjectTypes.Fs: - return FsAssembly; - } - - throw new ArgumentException("projectType"); - } - - public static string InsertAssemblyInfoProperty(string fileData, string assemblyInfoPropertyName, string assemblyInfoPropertyValue, ProjectTypes projectType) - { - var fileDataOut = new StringBuilder(); - - var versionShell = GetVersionShellByType(projectType); - - // if working with F# files, remove the "do binding" so we can make sure that the "do" is at the end of the file) - //if (projectType == ProjectTypes.Fs) - //{ - // var regex = new Regex(FsDoRegex); - // fileData = regex.Replace(fileData, ""); - //} - - fileDataOut.Append(fileData); - - var versionLine = String.Format(versionShell, assemblyInfoPropertyName, assemblyInfoPropertyValue); - - fileDataOut.AppendLine(); - fileDataOut.Append(versionLine); - fileDataOut.AppendLine(); - - //// for F#, put the do() binding back in - //if (projectType == ProjectTypes.Fs) - //{ - // fileDataOut.Append(FsDoStatement); - // fileDataOut.AppendLine(); - //} - - return fileDataOut.ToString(); - } - - public static IList> GetArgumentValues(CodeActivityContext context, string argumentStartsWith) - { - PropertyDescriptorCollection properties = context.DataContext.GetProperties(); - IList> arguments = new ReadOnlyCollectionBuilder>(); - - foreach (PropertyDescriptor property in properties) - { - // Get the name of the property/argument - var name = property.DisplayName; - - // must be a string - if ((property.PropertyType != typeof (string))) continue; - - // if an argumentStartsWith has a value and name starts with it - if ((!string.IsNullOrWhiteSpace(argumentStartsWith)) && (!name.StartsWith(argumentStartsWith))) - continue; - - var value = (string) property.GetValue(context.DataContext); - - // the property/argument must have a value - if (string.IsNullOrWhiteSpace(value)) continue; - - arguments.Add(new KeyValuePair(name, value)); - } - - return arguments; - } - - public static IList> GetArgumentValues(IList> inputValues) - { - IList> arguments = new ReadOnlyCollectionBuilder>(); - - foreach (KeyValuePair argumentValuePair in inputValues) - { - if ((!string.IsNullOrWhiteSpace(argumentValuePair.Value)) && (argumentValuePair.Value != PropertyNotFound)) - { - arguments.Add(new KeyValuePair(argumentValuePair.Key, argumentValuePair.Value)); - } - } - - return arguments; - } - - /// - /// This method will walk through all the patterns in the property value and replace them with actual values - /// - /// - /// - /// - /// - /// - public static string ReplacePatternsInPropertyValue(string propertyValue, IBuildDetail buildDetail, int buildNumberPrefix, DateTime date) - { - const string regExFindTokenPattern = @"\$(?\w+)"; - const string regExReplaceTokenPattern = @"\${0}"; - var modifiedPropertyValue = propertyValue; - - var regex = new Regex(regExFindTokenPattern); - var matches = regex.Matches(propertyValue); - - foreach (Match match in matches) - { - string token = match.Value.Remove(0, 1); - - string convertedValue = ReplacePatternWithValue(token, buildDetail, buildDetail.BuildNumber, buildNumberPrefix, date); - - var regExReplace = new Regex(string.Format(regExReplaceTokenPattern, token)); - - modifiedPropertyValue = regExReplace.Replace(modifiedPropertyValue, convertedValue); - } - - modifiedPropertyValue = modifiedPropertyValue.Replace('\\', ':'); - - return modifiedPropertyValue; - } - - public static string ReplacePatternWithValue(string pattern, string buildNumber, int buildNumberPrefix, DateTime date) - { - return ReplacePatternWithValue(pattern, null, buildNumber, buildNumberPrefix, date); - } - - /// - /// - /// - /// - /// - /// The full build number - left in for versioning (backward compatibility) reasons - /// - /// - /// - public static string ReplacePatternWithValue(string pattern, IBuildDetail buildDetail, string buildNumber, int buildNumberPrefix, DateTime date) - { - var patternUpper = pattern.ToUpper(); - string convertedValue; - - string internalBuildNumber = buildDetail == null ? buildNumber : buildDetail.BuildNumber; - - switch (patternUpper) - { - case "TPROJ": - if (buildDetail == null) throw new ArgumentNullException("buildDetail"); - convertedValue = buildDetail.TeamProject; - break; - - case "REQBY": - if (buildDetail == null) throw new ArgumentNullException("buildDetail"); - convertedValue = StripDomain(buildDetail.RequestedBy); - break; - - case "BNAME": - if (buildDetail == null) throw new ArgumentNullException("buildDetail"); - convertedValue = buildDetail.BuildDefinition.Name; - break; - - case "UTIME": - convertedValue = date.ToUniversalTime().ToString(); - break; - - case "LDATE": - convertedValue = date.ToLongDateString(); - break; - - case "LTIME": - convertedValue = date.ToLongTimeString(); - break; - - case "SDATE": - convertedValue = date.ToShortDateString(); - break; - - case "STIME": - convertedValue = date.ToShortTimeString(); - break; - - case "BNUM": - if (buildDetail == null) throw new ArgumentNullException("buildDetail"); - convertedValue = buildDetail.BuildNumber; - break; - - case "YYYY": - convertedValue = date.ToString("yyyy"); - break; - - case "YY": - convertedValue = date.ToString("yy"); - break; - - case "M": - case "MM": - convertedValue = date.Month.ToString(); - break; - - case "D": - case "DD": - convertedValue = date.Day.ToString(); - break; - - case "J": - convertedValue = string.Format("{0}{1}", date.ToString("yy"), string.Format("{0:000}", date.DayOfYear)); - break; - - case "B": - if (string.IsNullOrEmpty(buildNumber)) - { - throw new ArgumentException("BuildNumber must contain the build value: use $(Rev:.r) at the end of the Build Number Format"); - } - - int buildNumberValue; - - // Attempt to parse - this should probably fail since it will only work if the only thing passed - // in through the BuildNumber is a number. This is typically something like: "Buildname.year.month.buildNumber" - var isNumber = int.TryParse(internalBuildNumber, out buildNumberValue); - - if (!isNumber) - { - var buildNumberArray = internalBuildNumber.Split('.'); - - const string exceptionString = "'Build Number Format' in the build definition must end with $(Rev:.r) to use the build number in the version pattern. Suggested pattern: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)"; - - if (buildNumberArray.Length < 2) - { - throw new ArgumentException(exceptionString); - } - - isNumber = int.TryParse(buildNumberArray[buildNumberArray.Length - 1], out buildNumberValue); - - if (isNumber == false) - { - throw new ArgumentException(exceptionString); - } - } - - buildNumberValue = AddBuildNumberPrefixIfNecessary(buildNumberPrefix, buildNumberValue); - convertedValue = buildNumberValue.ToString(); - break; - - default: - convertedValue = pattern; - break; - } - - return convertedValue; - } - - public static string StripDomain(string userId) - { - var convertedValue = userId; - - if (userId.Contains("\\")) - { - var splitVals = userId.Split('\\'); - - convertedValue = splitVals[1]; - } - - return convertedValue; - } - - public static int AddBuildNumberPrefixIfNecessary(int buildNumberPrefix, int buildNumberValue) - { - // If a BuildNumberPrefix is in place and the BuildNumber pattern is used then - // attempt to prefix the build number with the BuildNumberPrefix - // The value of 10 is used since the prefix would have to be at least 10 to be at all useable - if (buildNumberPrefix > 0) - { - if ((buildNumberValue >= buildNumberPrefix) || (buildNumberPrefix < 10)) - { - throw new ArgumentException("When the BuildNumberPrefix is used it must be at least 10 and also larger than the Build Number."); - } - - // Prefix the build number to set it apart from any other build definition - buildNumberValue += buildNumberPrefix; - } - - return buildNumberValue; - } - } -} +using System; +using System.Activities; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.RegularExpressions; +using Microsoft.TeamFoundation.Build.Client; +using Microsoft.TeamFoundation.VersionControl.Client; + +// ============================================================================================== +// http://tfsversioning.codeplex.com/ +// +// Author: Mark S. Nichols +// +// Copyright (c) 2011 Microsoft Corporation +// +// This source is subject to the Microsoft Permissive License. +// ============================================================================================== + +namespace TfsBuild.Versioning.Activities +{ + public static class VersioningHelper + { + public const string CsAssembly = "[assembly: {0}(\"{1}\")]"; + public const string CppAssembly = "[assembly: {0}Attribute(\"{1}\")];"; + public const string VbAssembly = ""; + public const string FsAssembly = "[]"; + public const string FsDoRegex = @".*(\(\s*\)|do\s*\(\s*\))"; + public const string FsDoStatement = "do ()"; + public const string PropertyNotFound = "Property Not Found"; + public const string AssemblyVersionPropertyName = "AssemblyVersion"; + public const string AssemblyFileVersionPropertyName = "AssemblyFileVersion"; + + public static readonly string[] AlternateAssemblyProperties; + + public const string RegExPropertyMatch = + @"(?(?[\[<].*{0}.*\(\x22)(?.*)(?\x22\)[\]>]+))"; + + static VersioningHelper() + { + AlternateAssemblyProperties = new[] { "AssemblyTitle", "AssemblyDescription", "AssemblyConfiguration", + "AssemblyCompany", "AssemblyProduct", "AssemblyCopyright", "AssemblyTrademark", + "AssemblyCulture", "AssemblyInformationalVersion" }; + } + + public static ProjectTypes GetProjectTypeFromFileName(string filename) + { + if (String.IsNullOrWhiteSpace(filename)) + { + throw new ArgumentNullException("filename"); + } + + var fileExtension = Path.GetExtension(filename); + + if (String.IsNullOrWhiteSpace(fileExtension)) + { + // nothing there? just pass in something that definitely won't match + fileExtension = ".xxx"; + } + + var normalizedFileExtension = fileExtension.ToLower(); + + switch (normalizedFileExtension) + { + case ".cs": + return ProjectTypes.Cs; + + case ".vb": + return ProjectTypes.Vb; + + case ".cpp": + return ProjectTypes.Cpp; + + case ".fs": + return ProjectTypes.Fs; + + default: + throw new ArgumentException(String.Format("{0} is not one of the accepted file types (.cs, .vb, .cpp, .fs)", filename)); + } + } + + public static string GetVersionShellByType(ProjectTypes projectType) + { + switch (projectType) + { + case ProjectTypes.Cs: + return CsAssembly; + + case ProjectTypes.Vb: + return VbAssembly; + + case ProjectTypes.Cpp: + return CppAssembly; + + case ProjectTypes.Fs: + return FsAssembly; + } + + throw new ArgumentException("projectType"); + } + + public static string InsertAssemblyInfoProperty(string fileData, string assemblyInfoPropertyName, string assemblyInfoPropertyValue, ProjectTypes projectType) + { + var fileDataOut = new StringBuilder(); + + var versionShell = GetVersionShellByType(projectType); + + // if working with F# files, remove the "do binding" so we can make sure that the "do" is at the end of the file) + //if (projectType == ProjectTypes.Fs) + //{ + // var regex = new Regex(FsDoRegex); + // fileData = regex.Replace(fileData, ""); + //} + + fileDataOut.Append(fileData); + + var versionLine = String.Format(versionShell, assemblyInfoPropertyName, assemblyInfoPropertyValue); + + fileDataOut.AppendLine(); + fileDataOut.Append(versionLine); + fileDataOut.AppendLine(); + + //// for F#, put the do() binding back in + //if (projectType == ProjectTypes.Fs) + //{ + // fileDataOut.Append(FsDoStatement); + // fileDataOut.AppendLine(); + //} + + return fileDataOut.ToString(); + } + + public static IList> GetArgumentValues(CodeActivityContext context, string argumentStartsWith) + { + PropertyDescriptorCollection properties = context.DataContext.GetProperties(); + IList> arguments = new ReadOnlyCollectionBuilder>(); + + foreach (PropertyDescriptor property in properties) + { + // Get the name of the property/argument + var name = property.DisplayName; + + // must be a string + if ((property.PropertyType != typeof (string))) continue; + + // if an argumentStartsWith has a value and name starts with it + if ((!string.IsNullOrWhiteSpace(argumentStartsWith)) && (!name.StartsWith(argumentStartsWith))) + continue; + + var value = (string) property.GetValue(context.DataContext); + + // the property/argument must have a value + if (string.IsNullOrWhiteSpace(value)) continue; + + arguments.Add(new KeyValuePair(name, value)); + } + + return arguments; + } + + public static IList> GetArgumentValues(IList> inputValues) + { + IList> arguments = new ReadOnlyCollectionBuilder>(); + + foreach (KeyValuePair argumentValuePair in inputValues) + { + if ((!string.IsNullOrWhiteSpace(argumentValuePair.Value)) && (argumentValuePair.Value != PropertyNotFound)) + { + arguments.Add(new KeyValuePair(argumentValuePair.Key, argumentValuePair.Value)); + } + } + + return arguments; + } + + /// + /// This method will walk through all the patterns in the property value and replace them with actual values + /// + /// + /// + /// + /// + /// + /// + /// + public static string ReplacePatternsInPropertyValue(string propertyValue, IBuildDetail buildDetail, int buildNumberPrefix, int incrementBy, int buildNumberSeed, DateTime date, Workspace workspace, IBuildAgent buildAgent) + { + const string regExFindTokenPattern = @"\$(?\w+)"; + const string regExReplaceTokenPattern = @"\${0}"; + var modifiedPropertyValue = propertyValue; + + var regex = new Regex(regExFindTokenPattern); + var matches = regex.Matches(propertyValue); + + foreach (Match match in matches) + { + string token = match.Value.Remove(0, 1); + + string convertedValue = ReplacePatternWithValue(token, buildDetail, buildDetail.BuildNumber, buildNumberPrefix, incrementBy, buildNumberSeed, date, workspace, buildAgent); + + var regExReplace = new Regex(string.Format(regExReplaceTokenPattern, token)); + + modifiedPropertyValue = regExReplace.Replace(modifiedPropertyValue, convertedValue); + } + + modifiedPropertyValue = modifiedPropertyValue.Replace('\\', ':'); + + return modifiedPropertyValue; + } + + /// + /// + /// + /// + /// + /// The full build number - left in for versioning (backward compatibility) reasons + /// + /// + /// + /// + /// + public static string ReplacePatternWithValue(string pattern, IBuildDetail buildDetail, string buildNumber, int buildNumberPrefix, int incrementBy, int buildNumberSeed, DateTime date, Workspace workspace, IBuildAgent buildAgent, int changesetMax) + { + var patternUpper = pattern.ToUpper(); + string convertedValue; + + string internalBuildNumber = buildDetail == null ? buildNumber : buildDetail.BuildNumber; + + switch (patternUpper) + { + case "TPROJ": + if (buildDetail == null) throw new ArgumentNullException("buildDetail"); + convertedValue = buildDetail.TeamProject; + break; + + case "REQBY": + if (buildDetail == null) throw new ArgumentNullException("buildDetail"); + convertedValue = StripDomain(buildDetail.RequestedBy); + break; + + case "BNAME": + if (buildDetail == null) throw new ArgumentNullException("buildDetail"); + convertedValue = buildDetail.BuildDefinition.Name; + break; + + case "UTIME": + convertedValue = date.ToUniversalTime().ToString(); + break; + + case "LDATE": + convertedValue = date.ToLongDateString(); + break; + + case "LTIME": + convertedValue = date.ToLongTimeString(); + break; + + case "SDATE": + convertedValue = date.ToShortDateString(); + break; + + case "STIME": + convertedValue = date.ToShortTimeString(); + break; + + case "BNUM": + if (buildDetail == null) throw new ArgumentNullException("buildDetail"); + convertedValue = internalBuildNumber; + break; + + case "YYYY": + convertedValue = date.ToString("yyyy"); + break; + + case "YY": + convertedValue = date.ToString("yy"); + break; + + case "M": + case "MM": + convertedValue = date.Month.ToString(); + break; + + case "D": + case "DD": + convertedValue = date.Day.ToString(); + break; + + case "J": + convertedValue = string.Format("{0}{1}", date.ToString("yy"), string.Format("{0:000}", date.DayOfYear)); + break; + + case "C": + if (buildDetail == null) throw new ArgumentNullException("buildDetail"); + if (workspace == null) throw new ArgumentNullException("workspace"); + if (buildAgent == null) throw new ArgumentNullException("buildAgent"); + + var changeset = GetChangeset(buildDetail, workspace, buildAgent); + + if (changeset != null) + { + convertedValue = (changeset.ChangesetId % changesetMax).ToString(); + } + else + { + convertedValue = "0"; + } + break; + + case "CO": + if (buildDetail == null) throw new ArgumentNullException("buildDetail"); + if (workspace == null) throw new ArgumentNullException("workspace"); + if (buildAgent == null) throw new ArgumentNullException("buildAgent"); + + var overflowChangeset = GetChangeset(buildDetail, workspace, buildAgent); + + if (overflowChangeset != null) + { + convertedValue = (overflowChangeset.ChangesetId / changesetMax).ToString(); + } + else + { + convertedValue = "0"; + } + break; + + + case "B": + if (incrementBy <= 0) throw new ArgumentException("incrementBy cannot be <= 0.", "incrementBy"); + + var buildNum = GetBuildNumberValue(internalBuildNumber, buildNumberSeed, buildNumberPrefix); + + convertedValue = Math.Abs(buildNum * incrementBy).ToString(); + + break; + + case "S": + if (buildDetail == null) throw new ArgumentNullException("buildDetail"); + + convertedValue = buildDetail.Reason == BuildReason.ValidateShelveset ? "65535" : "0"; + + break; + + case "SN": + if (buildDetail == null) throw new ArgumentNullException("buildDetail"); + + convertedValue = buildDetail.ShelvesetName; + + break; + + default: + convertedValue = pattern; + break; + } + + return convertedValue; + } + + private static Changeset GetChangeset(IBuildDetail buildDetail, Workspace workspace, IBuildAgent buildAgent) + { + var workspaceSourcePath = Path.Combine(buildAgent.GetExpandedBuildDirectory(buildDetail.BuildDefinition), "Sources"); + + var versionSpec = new WorkspaceVersionSpec(workspace); + + var historyParams = new QueryHistoryParameters(workspaceSourcePath, RecursionType.Full) + { + ItemVersion = versionSpec, + VersionEnd = versionSpec, + MaxResults = 1 + }; + + var changeset = workspace.VersionControlServer.QueryHistory(historyParams).FirstOrDefault(); + return changeset; + } + + private static int GetBuildNumberValue(string internalBuildNumber, int buildNumberSeed, int buildNumberPrefix) + { + int buildNumberValue; + + // Attempt to parse - this should probably fail since it will only work if the only thing passed + // in through the BuildNumber is a number. This is typically something like: "Buildname.year.month.buildNumber" + var isNumber = int.TryParse(internalBuildNumber, out buildNumberValue); + + if (!isNumber) + { + var buildNumberArray = internalBuildNumber.Split('.'); + + const string exceptionString = + "'Build Number Format' in the build definition must end with $(Rev:.r) to use the build number in the version pattern. Suggested pattern: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)"; + + if (buildNumberArray.Length < 2) + { + throw new ArgumentException(exceptionString); + } + + isNumber = int.TryParse(buildNumberArray[buildNumberArray.Length - 1], out buildNumberValue); + + if (isNumber == false) + { + throw new ArgumentException(exceptionString); + } + } + + return AddBuildNumberPrefixIfNecessary(buildNumberPrefix, buildNumberValue + buildNumberSeed); + } + + public static string StripDomain(string userId) + { + var convertedValue = userId; + + if (userId.Contains("\\")) + { + var splitVals = userId.Split('\\'); + + convertedValue = splitVals[1]; + } + + return convertedValue; + } + + public static int AddBuildNumberPrefixIfNecessary(int buildNumberPrefix, int buildNumberValue) + { + // If a BuildNumberPrefix is in place and the BuildNumber pattern is used then + // attempt to prefix the build number with the BuildNumberPrefix + // The value of 10 is used since the prefix would have to be at least 10 to be at all useable + if (buildNumberPrefix > 0) + { + if ((buildNumberValue >= buildNumberPrefix) || (buildNumberPrefix < 10)) + { + throw new ArgumentException("When the BuildNumberPrefix is used it must be at least 10 and also larger than the Build Number."); + } + + // Prefix the build number to set it apart from any other build definition + buildNumberValue += buildNumberPrefix; + } + + return buildNumberValue; + } + } +}