Exemple #1
0
        public ActionResult Revisions(Guid id)
        {
            using (var db = ApplicationDbContext.Create())
            {
                var file = GetFile(id, db);

                EnsureUserIsAllowed(file.CatalogRecord, db);

                var model = new ManagedFileHistoryModel();
                model.File = file;

                model.IsUserCurator  = file.CatalogRecord.Curators.Any(x => x.UserName == User.Identity.Name);
                model.IsUserApprover = file.CatalogRecord.Approvers.Any(x => x.UserName == User.Identity.Name) ||
                                       OrganizationHelper.DoesUserHaveRight(db, User, file.CatalogRecord.Organization.Id, Right.CanApprove);

                string processingDirectory = SettingsHelper.GetProcessingDirectory(file.CatalogRecord.Organization, db);
                string path = Path.Combine(processingDirectory, file.CatalogRecord.Id.ToString());
                using (var repo = new LibGit2Sharp.Repository(path))
                {
                    List <Tuple <Commit, TreeEntry> > modificationCommits = new List <Tuple <Commit, TreeEntry> >();

                    string currentSha  = null;            // startingItemSha;
                    string currentPath = model.File.Name; //startingItemPath;
                    Tuple <Commit, TreeEntry> current = null;

                    foreach (Commit c in repo.Commits)
                    {
                        if (c.Tree.Any <TreeEntry>(entry => entry.Name == currentPath))
                        {
                            // If file with given name was found, check its SHA
                            TreeEntry te = c.Tree.First <TreeEntry>(entry => entry.Name == currentPath);

                            if (te.Target.Sha == currentSha)
                            {
                                // In case if file's SHA matches
                                // file was not changed in this commit
                                // and temporary commit need to be updated to current one
                                current = new Tuple <Commit, TreeEntry>(c, te);
                            }
                            else
                            {
                                // file's SHA doesn't match
                                // file was changed during commit (or is first one)
                                // current commit needs to be added to the commits collection
                                // The file's SHA updated to current one
                                modificationCommits.Add(new Tuple <Commit, TreeEntry>(c, te));
                                currentSha = te.Target.Sha;
                                current    = null;
                            }
                        }
                        else
                        {
                            // File with given name not found. this means it was renamed.
                            // SHA should still be the same
                            if (c.Tree.Any <TreeEntry>(entry => entry.Target.Sha == currentSha))
                            {
                                TreeEntry te = c.Tree.First <TreeEntry>(entry => entry.Target.Sha == currentSha);
                                currentPath = te.Name;
                                modificationCommits.Add(new Tuple <Commit, TreeEntry>(c, te));
                                current = null;
                            }
                        }
                    }

                    if (current != null)
                    {
                        modificationCommits.Add(current);
                    }

                    foreach (var m in modificationCommits)
                    {
                        RevisionModel h = RevisionModel.FromCommit(m.Item1, m.Item2, file);

                        // replace uuid with real user name
                        ApplicationUser user = db.Users
                                               .Where(x => x.Id == h.CommitterName)
                                               .FirstOrDefault();
                        if (user != null)
                        {
                            h.CommitterName  = user.FullName;
                            h.CommitterEmail = user.Email;
                            h.CommitterId    = user.Id;
                        }

                        model.Revisions.Add(h);
                    }
                }

                return(View(model));
            }
        }