using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using JiraTimeBotForm.Configuration; using Mercurial; namespace JiraTimeBotForm.TaskTime { public class TaskTimeDiscoverer: ITaskTimeDiscoverer { private readonly ILog _log; public TaskTimeDiscoverer(ILog log = null) { _log = log; } public List GetTaskTimes(Settings settings, DateTime? date = null, CancellationToken cancellationToken = default(CancellationToken)) { var workTimeItems = new List(); date = date.GetValueOrDefault(DateTime.Now.Date); var workTasks = new List(); foreach (var repoDirectory in Directory.GetDirectories(settings.RepositoryPath)) { cancellationToken.ThrowIfCancellationRequested(); //var project = new DirectoryInfo(repoDirectory).Name; if (!Directory.Exists(Path.Combine(repoDirectory, ".hg"))) { continue; } var repo = new Repository(repoDirectory); var logCommand = new LogCommand { Date = date, Users = { settings.MercurialAuthorEmail } }; var log = repo.Log(logCommand); foreach (var changeset in log) { cancellationToken.ThrowIfCancellationRequested(); if (!changeset.Branch.Contains("-")) { continue; } //Пропускаем Close коммиты if (changeset.CommitMessage.StartsWith($"Close {changeset.Branch} ", StringComparison.InvariantCultureIgnoreCase)) { continue; } workTasks.Add(changeset.Branch); _log?.Trace($" - Найден changeset: {changeset.Timestamp} - {changeset.Branch} - {changeset.AuthorEmailAddress}"); } } //Нам нужно раскидать 480 минут в день. foreach (var taskGroup in workTasks.GroupBy(f => f)) { var minutesPerTime = settings.MinuterPerWorkDay / workTasks.Count; var minutesForCurrentTaskGroup = minutesPerTime * taskGroup.Count(); var taskTimeItem = new TaskTimeItem { Branch = taskGroup.Key, Time = TimeSpan.FromMinutes(minutesForCurrentTaskGroup), Commits = taskGroup.Count(), }; workTimeItems.Add(taskTimeItem); } return workTimeItems; } } }