Export custom TFS check-in notes to commit message (#1004)

This commit is contained in:
Edwin Engelen
2016-10-12 00:48:19 +02:00
parent e1719a463d
commit 7452301ced
11 changed files with 108 additions and 40 deletions
+4 -14
View File
@@ -568,21 +568,11 @@ namespace Sep.Git.Tfs.VsCommon
Url = Linking.GetArtifactUrl(wi.Uri.AbsoluteUri)
});
}
foreach (var checkinNote in changeset.CheckinNote.Values)
{
switch (checkinNote.Name)
tfsChangeset.Summary.CheckinNotes = changeset.CheckinNote.Values.Select(note => new TfsCheckinNote
{
case GitTfsConstants.CodeReviewer:
tfsChangeset.Summary.CodeReviewer = checkinNote.Value;
break;
case GitTfsConstants.SecurityReviewer:
tfsChangeset.Summary.SecurityReviewer = checkinNote.Value;
break;
case GitTfsConstants.PerformanceReviewer:
tfsChangeset.Summary.PerformanceReviewer = checkinNote.Value;
break;
}
}
Name = note.Name,
Value = note.Value
});
tfsChangeset.Summary.PolicyOverrideComment = changeset.PolicyOverride.Comment;
return tfsChangeset;
+10 -16
View File
@@ -472,14 +472,11 @@ namespace Sep.Git.Tfs.Core
if (!string.IsNullOrWhiteSpace(changeset.Summary.PolicyOverrideComment))
log.Log += "\n" + GitTfsConstants.GitTfsPolicyOverrideCommentPrefix + changeset.Summary.PolicyOverrideComment;
if (!string.IsNullOrWhiteSpace(changeset.Summary.CodeReviewer))
log.Log += "\n" + GitTfsConstants.GitTfsCodeReviewerPrefix + changeset.Summary.CodeReviewer;
if (!string.IsNullOrWhiteSpace(changeset.Summary.SecurityReviewer))
log.Log += "\n" + GitTfsConstants.GitTfsSecurityReviewerPrefix + changeset.Summary.SecurityReviewer;
if (!string.IsNullOrWhiteSpace(changeset.Summary.PerformanceReviewer))
log.Log += "\n" + GitTfsConstants.GitTfsPerformanceReviewerPrefix + changeset.Summary.PerformanceReviewer;
foreach (var checkinNote in changeset.Summary.CheckinNotes)
{
if (!string.IsNullOrWhiteSpace(checkinNote.Name) && !string.IsNullOrWhiteSpace(checkinNote.Value))
log.Log += "\n" + GitTfsConstants.GitTfsPrefix + "-" + CamelCaseToDelimitedStringConverter.Convert(checkinNote.Name, "-") + ":" + checkinNote.Value;
}
}
var commitSha = Commit(log);
@@ -509,14 +506,11 @@ namespace Sep.Git.Tfs.Core
if (!string.IsNullOrWhiteSpace(changeset.Summary.PolicyOverrideComment))
metadatas.Append("\nPolicy Override Comment:" + changeset.Summary.PolicyOverrideComment);
if (!string.IsNullOrWhiteSpace(changeset.Summary.CodeReviewer))
metadatas.Append("\nCode Reviewer:" + changeset.Summary.CodeReviewer);
if (!string.IsNullOrWhiteSpace(changeset.Summary.SecurityReviewer))
metadatas.Append("\nSecurity Reviewer:" + changeset.Summary.SecurityReviewer);
if (!string.IsNullOrWhiteSpace(changeset.Summary.PerformanceReviewer))
metadatas.Append("\nPerformance Reviewer:" + changeset.Summary.PerformanceReviewer);
foreach (var checkinNote in changeset.Summary.CheckinNotes)
{
if (!string.IsNullOrWhiteSpace(checkinNote.Name) && !string.IsNullOrWhiteSpace(checkinNote.Value))
metadatas.Append("\n" + checkinNote.Name + ":" + checkinNote.Value);
}
if (!string.IsNullOrWhiteSpace(changeset.OmittedParentBranch))
metadatas.Append("\nOmitted parent branch: " + changeset.OmittedParentBranch);
+8
View File
@@ -0,0 +1,8 @@
namespace Sep.Git.Tfs.Core
{
public interface ITfsCheckinNote
{
string Name { get; set; }
string Value { get; set; }
}
}
+2 -3
View File
@@ -10,15 +10,14 @@ namespace Sep.Git.Tfs.Core
public string GitCommit { get; set; }
public IEnumerable<ITfsWorkitem> Workitems { get; set; }
public string CodeReviewer { get; set; }
public string SecurityReviewer { get; set; }
public string PerformanceReviewer { get; set; }
public IEnumerable<ITfsCheckinNote> CheckinNotes { get; set; }
public string PolicyOverrideComment { get; set; }
public TfsChangesetInfo()
{
Workitems = Enumerable.Empty<ITfsWorkitem>();
CheckinNotes = Enumerable.Empty<ITfsCheckinNote>();
}
}
}
+8
View File
@@ -0,0 +1,8 @@
namespace Sep.Git.Tfs.Core
{
public class TfsCheckinNote : ITfsCheckinNote
{
public string Name { get; set; }
public string Value { get; set; }
}
}
+3
View File
@@ -109,6 +109,7 @@
<Compile Include="Core\GitTfsGatedCheckinException.cs" />
<Compile Include="Core\GitTreeBuilder.cs" />
<Compile Include="Core\IGitTreeBuilder.cs" />
<Compile Include="Core\ITfsCheckinNote.cs" />
<Compile Include="Core\ITfsWorkitem.cs" />
<Compile Include="Commands\Branch.cs" />
<Compile Include="Core\BranchVisitors\BranchTreeContainsPathVisitor.cs" />
@@ -188,6 +189,7 @@
<Compile Include="Core\TfsInterop\NullIdentity.cs" />
<Compile Include="Core\TfsInterop\IChangeset.cs" />
<Compile Include="Core\TfsTreeEntry.cs" />
<Compile Include="Core\TfsCheckinNote.cs" />
<Compile Include="Core\TfsWorkitem.cs" />
<Compile Include="Core\TfsWorkspace.cs" />
<Compile Include="Core\TfsWriter.cs" />
@@ -197,6 +199,7 @@
<Compile Include="Util\Bouncer.cs" />
<Compile Include="Util\ChangeSieve.cs" />
<Compile Include="Util\CheckinOptionsExtensions.cs" />
<Compile Include="Util\CamelCaseToDelimitedStringConverter.cs" />
<Compile Include="Util\ConfigPropertyLoader.cs" />
<Compile Include="Util\ExportMetadatasInitializer.cs" />
<Compile Include="Util\PathResolver.cs" />
-7
View File
@@ -14,9 +14,6 @@ namespace Sep.Git.Tfs
public const string TfsRoot = "$/";
public const string GitTfsPrefix = "git-tfs";
public const string GitTfsWorkItemPrefix = GitTfsPrefix + "-work-item:";
public const string GitTfsCodeReviewerPrefix = GitTfsPrefix + "-code-reviewer:";
public const string GitTfsSecurityReviewerPrefix = GitTfsPrefix + "-security-reviewer:";
public const string GitTfsPerformanceReviewerPrefix = GitTfsPrefix + "-performance-reviewer:";
public const string GitTfsPolicyOverrideCommentPrefix = GitTfsPrefix + "-force:";
// e.g. git-tfs-id: [http://team:8080/]$/sandbox;C123
public const string TfsCommitInfoFormat = "git-tfs-id: [{0}]{1};C{2}";
@@ -55,10 +52,6 @@ namespace Sep.Git.Tfs
/// </summary>
public const string RemoteSubtreeFormat = "{0}_subtree/{1}";
public const string CodeReviewer = "Code Reviewer";
public const string SecurityReviewer = "Security Reviewer";
public const string PerformanceReviewer = "Performance Reviewer";
public const string ExportMetadatasConfigKey = GitTfsPrefix + ".export-metadatas";
public const string WorkspaceConfigKey = GitTfsPrefix + ".workspace-dir";
@@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sep.Git.Tfs.Util
{
public static class CamelCaseToDelimitedStringConverter
{
public static string Convert(string stringWithCamelCase, string delimiter)
{
var words = stringWithCamelCase
.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
.SelectMany(GetCaseDelimitedParts).Select(p => p.ToLowerInvariant());
return string.Join(delimiter, words);
}
private static IEnumerable<string> GetCaseDelimitedParts(string s)
{
var wordStartIndex = 0;
for (var index = 0; index < s.Length; index++)
{
if (IsFirstCharacterOfNewWord(s, index, wordStartIndex))
{
yield return s.Substring(wordStartIndex, index - wordStartIndex).ToLowerInvariant();
wordStartIndex = index;
}
}
yield return s.Substring(wordStartIndex).ToLowerInvariant();
}
private static bool IsFirstCharacterOfNewWord(string s, int index, int wordStartIndex)
{
if (index == 0)
return false;
return char.IsUpper(s[index]) && !char.IsUpper(s[index - 1]) ||
char.IsUpper(s[index]) && char.IsUpper(s[index - 1]) && wordStartIndex == index - 2 ||
char.IsUpper(s[index]) && char.IsUpper(s[index - 1]) && s.Length >= index + 2 && !char.IsUpper(s[index + 1]);
}
}
}
+1
View File
@@ -119,6 +119,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TestHelpers\ExtensionMethods.cs" />
<Compile Include="Util\AuthorsFileUnitTest.cs" />
<Compile Include="Util\CamelCaseToDelimitedStringConverterTests.cs" />
<Compile Include="Util\CommitSpecificCheckinOptionsFactoryTests.cs" />
<Compile Include="Util\GitTfsCommandRunnerTests.cs" />
<Compile Include="Util\BouncerTest.cs" />
@@ -0,0 +1,28 @@
namespace Sep.Git.Tfs.Test.Util
{
using Sep.Git.Tfs.Util;
using Xunit;
using Xunit.Extensions;
public class CamelCaseToDelimitedStringConverterTests
{
[Theory]
[InlineData("Code Reviewer", "-", "code-reviewer")]
[InlineData(" Code Reviewer", "-", "code-reviewer")]
[InlineData("Code Reviewer ", "-", "code-reviewer")]
[InlineData(" Code Reviewer ", "-", "code-reviewer")]
[InlineData("Code Reviewer", "-", "code-reviewer")]
[InlineData("CodeReviewer", "-", "code-reviewer")]
[InlineData("Jira Issue ID", "-", "jira-issue-id")]
[InlineData("Jira Issue Id", "-", "jira-issue-id")]
[InlineData("Some IPAddress", "-", "some-ip-address")]
[InlineData("SomeIPAddress", "-", "some-ip-address")]
[InlineData("JustAName", "-", "just-a-name")]
[InlineData("AnOtherDelimiter", "#", "an#other#delimiter")]
public void ReturnsExpectedValue(string stringWithCamelCase, string delimiter, string expected)
{
var actual = CamelCaseToDelimitedStringConverter.Convert(stringWithCamelCase, delimiter);
Assert.Equal(expected, actual);
}
}
}
+1
View File
@@ -0,0 +1 @@
* Custom TFS check-in notes are not exported to commit message (#1004, @EdwinEngelen)