コード例 #1
0
 public CommitChangesViewModel(EntityCommitChange commitChanges, IQueryService <TaskState> taskStateQueryService)
 {
     _taskStateQueryService = taskStateQueryService;
     Author       = commitChanges.Author;
     CreationDate = commitChanges.Date.ToString("g");
     ResolvePropertyChanges(commitChanges);
 }
コード例 #2
0
        private void ResolvePropertyChanges(EntityCommitChange commitChanges)
        {
            AssignedMembersChangeViewModel = null;
            CommentsChangeViewModel        = null;
            ContentChangeViewModel         = null;
            TaskPriorityChangeViewModel    = null;
            TaskStateChangeViewModel       = null;

            foreach (var propertyChange in commitChanges.PropertyChanges)
            {
                switch (propertyChange.PropertyName)
                {
                case "Content":
                    ContentChangeViewModel =
                        new ContentChangeViewModel((string)propertyChange.OldValue,
                                                   (string)propertyChange.NewValue);
                    break;

                case "AssignedMembers":
                    AssignedMembersChangeViewModel =
                        new ProjectMembersChangeViewModel((IEnumerable <ProjectMember>)propertyChange.OldValue,
                                                          (IEnumerable <ProjectMember>)propertyChange.NewValue);
                    break;

                case "Priority":
                    TaskPriorityChangeViewModel =
                        new TaskPriorityChangeViewModel((TaskPriority)propertyChange.OldValue,
                                                        (TaskPriority)propertyChange.NewValue);
                    break;

                case "State":
                    TaskStateChangeViewModel =
                        new TaskStateChangeViewModel((string)propertyChange.OldValue,
                                                     (string)propertyChange.NewValue,
                                                     _taskStateQueryService);
                    break;

                case "Comments":
                    CommentsChangeViewModel =
                        new CommentsChangeViewModel((IEnumerable <string>)propertyChange.OldValue,
                                                    (IEnumerable <string>)propertyChange.NewValue);
                    break;

                default:
                    continue;
                }
            }
        }
コード例 #3
0
        public async Task <EntityHistory> GetEntityHistory <TModel>(TModel modelObject)
        {
            return(await Task.Run(() =>
            {
                if (_repository == null)
                {
                    return null;
                }

                var entityHistory = new EntityHistory {
                    Changes = new List <EntityCommitChange>()
                };
                var objectPath = GetObjectPath(modelObject);
                var entityInRepo = false;

                foreach (var commit in _repository.Commits.QueryBy(new CommitFilter {
                    FirstParentOnly = true
                }))
                {
                    try
                    {
                        if (!commit.Parents.Any() || !CommitContainsGitTaskFolder(commit))
                        {
                            return entityInRepo ? entityHistory : null;
                        }

                        var parentCommit = commit.Parents.First();
                        var treeChanges = _repository.Diff.Compare <TreeChanges>(parentCommit.Tree, commit.Tree, new CompareOptions());
                        var entityTreeChanges = treeChanges.Where(treeEntry => treeEntry.Path == objectPath).ToList();
                        if (!entityTreeChanges.Any())
                        {
                            continue;
                        }

                        var treeEntryChanges = entityTreeChanges.First();

                        if (treeEntryChanges.Exists && !treeEntryChanges.OldExists)
                        {
                            entityHistory.CreationDate = commit.Committer.When.DateTime;
                            entityHistory.Author = new ProjectMember(commit.Committer.Name, commit.Committer.Email);
                            return entityHistory;
                        }
                        var parentTreeEntry = parentCommit[objectPath];
                        var childTreeEntry = commit[objectPath];

                        if (parentTreeEntry.TargetType != TreeEntryTargetType.Blob ||
                            childTreeEntry.TargetType != TreeEntryTargetType.Blob)
                        {
                            continue;
                        }

                        var parentBlob = (Blob)parentTreeEntry.Target;
                        var childBlob = (Blob)childTreeEntry.Target;

                        var propertyChanges = _historyResolvingService.ResolveChangesInBlob <TModel>(parentBlob, childBlob).ToList();
                        if (!propertyChanges.Any())
                        {
                            continue;
                        }

                        var entityCommitChange = new EntityCommitChange
                        {
                            PropertyChanges = propertyChanges,
                            Date = commit.Committer.When.DateTime,
                            Author = new ProjectMember(commit.Committer.Name, commit.Committer.Email)
                        };
                        entityHistory.Changes.Add(entityCommitChange);
                        entityInRepo = true;
                        entityHistory.CreationDate = commit.Committer.When.DateTime;
                    }
                    catch (Exception)
                    {
                        // exception while traversing repo or parsing files. Skip commit
                    }
                }
                entityHistory.CreationDate = DateTime.MinValue;
                return entityHistory;
            }));
        }