csharp/aabiryukov/TfsVisualHistory/TfsVisualHistory/ChangesetConverter.cs

ChangesetConverter.cs
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
using Microsoft.TeamFoundation.VersionControl.Client;
using Sitronics.TfsVisualHistory.Utility;

namespace Sitronics.TfsVisualHistory
{
    /// 
    /// Convert TFS changesets to gource format.
    /// 
    internal clast ChangesetConverter
    {
		private static DateTime st_unixTimeZero = new DateTime(1970, 1, 1);
		
		private readonly Wildcard m_includeUsersWildcard;
        private readonly Wildcard m_excludeUsersWildcard;
        private readonly Wildcard m_includeFilesWildcard;
        private readonly Wildcard m_excludeFilesWildcard;

        public ChangesetConverter(StringFilter usersFilter, StringFilter filesFilter)
        {
            m_includeUsersWildcard = new Wildcard(usersFilter.IncludeMask, RegexOptions.IgnoreCase);
            m_excludeUsersWildcard = new Wildcard(usersFilter.ExcludeMask, RegexOptions.IgnoreCase);

            m_includeFilesWildcard = new Wildcard(filesFilter.IncludeMask, RegexOptions.IgnoreCase);
            m_excludeFilesWildcard = new Wildcard(filesFilter.ExcludeMask, RegexOptions.IgnoreCase);
        }

        private static bool FilterByString(string text, Wildcard include, Wildcard exclude)
        {
            if (include.IsEmpty || !include.IsMatch(text))
                return false;

            if (!exclude.IsEmpty && exclude.IsMatch(text))
                return false;

            return true;
        }

        private static string GetChangeType(ChangeType changeType)
        {
            if ((changeType & ChangeType.Edit) == ChangeType.Edit)
                return "M";

            if ((changeType & ChangeType.Rename) == ChangeType.Rename)
                return "M";

            if ((changeType & ChangeType.Add) == ChangeType.Add)
                return "A";

            if ((changeType & ChangeType.Merge) == ChangeType.Merge)
                return "A";

            if ((changeType & ChangeType.Delete) == ChangeType.Delete)
                return "D";

            return null;
        }

        private static string FormatFileName(string fileName)
        {
            // Converting file extensions to lower case to unify file extensions visualization
            return ConvertFileExtensionToLowerCase(fileName);
        }


        private static string ConvertFileExtensionToLowerCase(string fileName)
        {
            var slashIndex = Math.Max(fileName.LastIndexOf('/'), fileName.LastIndexOf('\\'));
            var pointIndex = fileName.LastIndexOf('.');
            if (pointIndex < slashIndex || pointIndex < 1 || pointIndex >= fileName.Length - 1)
                return fileName;

#pragma warning disable CA1308 // Normalize strings to uppercase
            return fileName.Substring(0, pointIndex + 1) + fileName.Substring(pointIndex + 1, fileName.Length - (pointIndex + 1)).ToLowerInvariant();
#pragma warning restore CA1308 // Normalize strings to uppercase
        }

        public IEnumerable GetLogLines(Changeset changeset)
        {
            // Filter changeset Owner
            if (!FilterByString(changeset.OwnerDisplayName ?? "", m_includeUsersWildcard, m_excludeUsersWildcard))
                yield break;

            foreach (var change in changeset.Changes)
            {
                {
                    // Filter files
                    if (!FilterByString(change.Item.ServerItem, m_includeFilesWildcard, m_excludeFilesWildcard))
                        continue;
                }

                var changeTypeCode = GetChangeType(change.ChangeType);
                if (changeTypeCode == null)
                    continue;

				double unixTime = (int)(changeset.CreationDate - st_unixTimeZero.ToLocalTime()).TotalSeconds;

                var userName = changeset.OwnerDisplayName;
                var fileName = FormatFileName(change.Item.ServerItem);

                yield return 
                    string.Format(CultureInfo.InvariantCulture, "{0}|{1}|{2}|{3}",
                        unixTime,
                        userName,
                        changeTypeCode,
                        fileName);
            }
        }
    }
}