protected static void AssertRequestIsCopiedToModel(RepositoryNavigationRequest request, RepositoryNavigationRequest model)
 {
     Assert.AreEqual(request.RepositoryName, model.RepositoryName);
     Assert.AreEqual(request.RepositoryLocation, model.RepositoryLocation);
     Assert.AreEqual(request.Path, model.Path);
     Assert.AreEqual(request.Treeish, model.Treeish);
 }
예제 #2
0
        public PathViewModel(RepositoryNavigationRequest request, AbstractTreeNode node)
        {
            Elements = new List<Element>();

            CurrentItem = new Element(
                new RepositoryNavigationRequest(request) { Path = node.Path },
                request.Treeish,
                node);

            var currentNode = node;

            while (currentNode.Parent != null)
            {
                currentNode = currentNode.Parent;
                if (currentNode.Parent != null)
                {
                    Elements.Add(
                        new Element(new RepositoryNavigationRequest(request) { Path = currentNode.Path },
                        request.Treeish,
                        currentNode));
                }
            }

            Elements = new List<Element>(Elements.Reverse());
            Root = new Element(request, request.Treeish, currentNode);
            IsRootEqualToCurrentItem = (currentNode == node);
        }
예제 #3
0
 public static string RepositoryRootUrl(this UrlHelper helper, RepositoryNavigationRequest request)
 {
     var url = helper.Action("Details", "Repository", new
     {
         repositoryName = request.RepositoryName,
         location = request.RepositoryLocation
     });
     return url;
 }
 public RepositoryNavigationViewModelBase(Repository repository, RepositoryNavigationRequest request)
     : this()
 {
     RepositoryName = request.RepositoryName;
     Treeish = request.Treeish;
     Path = request.Path;
     RepositoryLocation = request.RepositoryLocation;
     FillFromRepository(repository, request);
 }
 public CommitViewModel(Repository repository, RepositoryNavigationRequest request, Commit commit, bool fillParents)
     : base(new RepositoryNavigationRequest(request) { Treeish = commit.Hash })
 {
     if (fillParents)
     {
         Parents = new List<CommitViewModel>(commit.Parents.Select(x =>
             new CommitViewModel(repository, request, x, false)));
     }
     Tree = new TreeNodeViewModel(repository, request, commit.Tree);
     Commit = commit;
 }
예제 #6
0
 public static string GitUrl(this UrlHelper helper, string action, RepositoryNavigationRequest request)
 {
     var url = helper.Action(action, "Repository", new
     {
         repositoryName = request.RepositoryName,
         id = request.Treeish,
         path = request.Path,
         location = request.RepositoryLocation
     });
     return url;
 }
            public void CopiesRequestDataToViewModel()
            {
                var request = new RepositoryNavigationRequest
                {
                    Treeish = "master",
                    RepositoryName = "Test",
                    Path = "src",
                    RepositoryLocation = _testRepositoryLocation
                };

                var model = ExectueTreeAction(request);

                AssertRequestIsCopiedToModel(request, model);
            }
            public void WhenNested_ProducesValidRepositoryTree()
            {
                var request = new RepositoryNavigationRequest
                {
                    Treeish = "master",
                    RepositoryName = "Test",
                    Path = "src",
                };

                var model = ExectueTreeAction(request);
                Assert.AreEqual(2, model.Items.Count);
                Assert.AreEqual(1, model.Items.Count(x => x.Path == "src/file001.txt" && x.Type == ListItemViewModel.ItemType.Blob));
                Assert.AreEqual(1, model.Items.Count(x => x.Path == "src/file002.txt" && x.Type == ListItemViewModel.ItemType.Blob));
            }
            public void WhenOnRoot_ProducesValidRepositoryTree()
            {
                var request = new RepositoryNavigationRequest
                {
                    Treeish = "master",
                    RepositoryName = "Test",
                };

                var model = ExectueTreeAction(request);
                Assert.AreEqual(4, model.Items.Count);
                Assert.AreEqual(1, model.Items.Count(x => x.Path == "src" && x.Type == ListItemViewModel.ItemType.Tree));
                Assert.AreEqual(1, model.Items.Count(x => x.Path == "doc" && x.Type == ListItemViewModel.ItemType.Tree));
                Assert.AreEqual(1, model.Items.Count(x => x.Path == "LICENSE.txt" && x.Type == ListItemViewModel.ItemType.Blob));
                Assert.AreEqual(1, model.Items.Count(x => x.Path == "README.txt" && x.Type == ListItemViewModel.ItemType.Blob));
            }
            public void CopiesRequestDataToViewModel()
            {
                var request = new RepositoryNavigationRequest
                {
                    Treeish = "master",
                    RepositoryName = "Test",
                    Path = "src/file001.txt",
                    RepositoryLocation = _testRepositoryLocation
                };

                var model = ExectueTreeAction(request);

                Assert.AreEqual(request.RepositoryName, model.RepositoryName);
                Assert.AreEqual(request.RepositoryLocation, model.RepositoryLocation);
                Assert.AreEqual(request.Path, model.Path);
            }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            RepositoryController controller = GetController(filterContext);

            if (filterContext.ActionParameters.Count != 1 ||
                !filterContext.ActionParameters.ContainsKey("request") ||
                filterContext.ActionParameters["request"].GetType() != typeof(RepositoryNavigationRequest))
            {
                return;
            }

            // Building request to pass to controller action.
            var request = new RepositoryNavigationRequest
            {
                RepositoryName = filterContext.RouteData.GetRequiredString("repositoryName")
            };

            var repoLocation = (string)filterContext.HttpContext.Request.QueryString["location"];
            if (!String.IsNullOrEmpty(repoLocation))
            {
                repoLocation = HttpUtility.UrlDecode(repoLocation);
                request.RepositoryLocation = repoLocation;
            }
            else
            {
                repoLocation = request.RepositoryName;
            }

            var repository = RepositoryResolver.GetRepository(repoLocation);
            if (repository == null)
            {
                throw new RepositoryNotFoundException(request.RepositoryName)
                {
                    RepositoryLocation = repoLocation
                };
            }
            controller.Repository = repository;

            request.Treeish = (string)filterContext.RouteData.Values["id"];
            request.Treeish = request.Treeish ?? "master";
            request.Path = (string)filterContext.RouteData.Values["path"];

            // Each action should expect a request.
            filterContext.ActionParameters["request"] = request;
        }
        public void CompyConstructor_Works()
        {
            var request = new RepositoryNavigationRequest()
            {
                RepositoryName = "a",
                Treeish = "b",
                Path = "c",
                RepositoryLocation = "d",
            };

            var newRequest = new RepositoryNavigationRequest(request);
            string requestString = AssertEx.XmlSerialize(request);
            string newRequestString = AssertEx.XmlSerialize(newRequest);
            Assert.AreEqual(requestString, newRequestString,
                "Copied request should equal the template but it doesn't. '{0}' != '{1}'",
                requestString,
                newRequestString);
        }
        public CommitDetailsViewModel(Repository repository, RepositoryNavigationRequest request, Commit commit)
            : this(repository, new RepositoryNavigationRequest(request) { Treeish = commit.Hash })
        {
            CurrentCommit = new CommitViewModel(repository, request, commit, true);

            foreach (var change in commit.Changes)
            {
                // PASTE-START : borrowed from GitSharp.Demo
                var a = (change.ReferenceObject != null ? (change.ReferenceObject as Blob).RawData : new byte[0]);
                var b = (change.ComparedObject != null ? (change.ComparedObject as Blob).RawData : new byte[0]);

                a = (Diff.IsBinary(a) == true ? Encoding.ASCII.GetBytes("Binary content\nFile size: " + a.Length) : a);
                b = (Diff.IsBinary(b) == true ? Encoding.ASCII.GetBytes("Binary content\nFile size: " + b.Length) : b);
                // PASTE-END : borrowed from GitSharp.Demo

                var diff = new Diff(a, b);
                Changes.Add(new ChangeViewModel(request, change, diff));
            }
        }
예제 #14
0
        public ChangeViewModel(RepositoryNavigationRequest request, Change change, Diff diff)
            : base(request)
        {
            Change = change;
            Treeish = change.ComparedCommit.Hash;
            Name = System.IO.Path.GetFileName(change.Path);
            Path = change.Path;
            Diff = new UnifiedDiffViewModel(diff);
            Summary = new SummaryViewModel();
            Summary.Inserts = Diff.Lines.Count(x =>
                x.LineType == GitSharp.Diff.EditType.Inserted ||
                (x.LineType == GitSharp.Diff.EditType.Replaced && x.LineB.HasValue) // new ones
            );

            Summary.Deletes = Diff.Lines.Count(x =>
                x.LineType == GitSharp.Diff.EditType.Deleted ||
                (x.LineType == GitSharp.Diff.EditType.Replaced && x.LineA.HasValue) // replaced with new one(s)
            );
        }
예제 #15
0
        public TreeViewModel(Repository repository, RepositoryNavigationRequest request, Tree tree)
            : base(repository, request)
        {
            PathModel = new PathViewModel(request, tree);
            Tree = tree;
            Path = tree.Path;
            IsRoot = Tree.IsRoot;

            Items = new List<ListItemViewModel>();
            foreach (var child in Tree.Children)
            {
                ListItemViewModel.ItemType type;
                AbstractTreeNode node = child as AbstractTreeNode;
                if (child is Leaf)
                {
                    type = ListItemViewModel.ItemType.Blob;
                }
                else if (child is Tree)
                {
                    type = ListItemViewModel.ItemType.Tree;
                }
                else
                {
                    throw new InvalidOperationException("Unexpected child in tree.");
                }

                Commit lastCommit = null;// node.GetLastCommitBefore(commit);
                Items.Add(new ListItemViewModel(request)
                {
                    Name = node.Name,
                    Author = lastCommit != null ? lastCommit.Author.Name : String.Empty,
                    AuthorDate = lastCommit != null ? lastCommit.AuthorDate : (DateTimeOffset?)null,
                    CommitDate = lastCommit != null ? lastCommit.CommitDate : (DateTimeOffset?)null,
                    Message = lastCommit != null ? lastCommit.Message : String.Empty,
                    Type = type,
                    Path = node.Path,
                });
            }
        }
        public ActionResult Blob(RepositoryNavigationRequest request)
        {
            var tree = GetTreeFromRequest(request);
            var node = tree.Node(request.Path);

            if (node == null)
            {
                throw new InvalidOperationException("Invalid path");
            }

            var blob = node as Leaf;
            if (blob == null)
            {
                throw new InvalidOperationException("Path is not pointing to a tree.");
            }

            var viewModel = new BlobViewModel(Repository, request, blob)
            {
                FormattedData = _hightlightingService.GenerateHtml(blob.Data, blob.Path, null)
            };
            return View(viewModel);
        }
예제 #17
0
 public Element(RepositoryNavigationRequest request, string treeish, AbstractTreeNode node)
 {
     Text = !String.IsNullOrEmpty(node.Name) ? node.Name : request.RepositoryName;
     RepositoryName = request.RepositoryName;
     Path = node.Path;
     Treeish = treeish;
     RepositoryLocation = request.RepositoryLocation;
 }
        public ActionResult Commits(RepositoryNavigationRequest request)
        {
            var commit = GetCommitFromRequest(request);

            var harvester = new CommitHarvester(commit, DateTime.UtcNow.AddDays(-30), 20);
            var viewModel = new CommitsViewModel(Repository, request);
            viewModel.AddCommits(harvester.Collect());
            viewModel.ApplyGrouping();

            return View(viewModel);
        }
 public ActionResult Details(RepositoryNavigationRequest request)
 {
     return Tree(request);
 }
 private TreeViewModel ExectueTreeAction(RepositoryNavigationRequest request)
 {
     var result = _controller.Tree(request);
     return result.AssertViewRendered().WithViewData<TreeViewModel>();
 }
        public ActionResult Tree(RepositoryNavigationRequest request)
        {
            var treeRoot = GetTreeFromRequest(request);

            var tree = treeRoot.Node(request.Path) as Tree;
            if (tree == null)
            {
                throw new InvalidOperationException("Supplied path '{0}' is not pointing to a tree."
                    .Fill(request.Path));
            }

            var viewModel = new TreeViewModel(Repository, request, tree);
            return View("Tree", viewModel);
        }
        private Commit GetCommitFromRequest(RepositoryNavigationRequest request)
        {
            var obj = Repository.Get<AbstractObject>(request.Treeish);
            Commit commit = null;
            if (obj.IsCommit)
            {
                commit = obj as Commit;
            }
            else if (obj.IsTree)
            {
                commit = (obj as Tree).GetLastCommit();
            }

            if (commit == null)
            {
                throw new InvalidOperationException("Unable to resolve a commit for supplied treeish '{0}'."
                    .Fill(request.Treeish));
            }
            return commit;
        }
        private Tree GetTreeFromRequest(RepositoryNavigationRequest request)
        {
            var obj = Repository.Get<AbstractObject>(request.Treeish);

            Tree tree = null;
            if (obj is Commit)
            {
                tree = (obj as Commit).Tree;
            }
            else if (obj is Tree)
            {
                tree = obj as Tree;
            }

            if (tree == null)
            {
                throw new InvalidOperationException("Unable to resolve a tree for supplied treeish '{0}'."
                    .Fill(request.Treeish));
            }

            return tree;
        }
예제 #24
0
 public static string BlobUrl(this UrlHelper helper, RepositoryNavigationRequest request)
 {
     return GitUrl(helper, "blob", request);
 }
예제 #25
0
 public CommitsViewModel(Repository repository, RepositoryNavigationRequest request)
     : base(repository, request)
 {
     List = new List<Commit>();
 }
        public void FillFromRepository(Repository repository, RepositoryNavigationRequest request)
        {
            Branches.AddRange(repository.Branches.Keys.Select(x =>
                new BranchViewModel(x, new RepositoryNavigationRequest()
                {
                    RepositoryName = request.RepositoryName,
                    Treeish = x,
                    RepositoryLocation = request.RepositoryLocation
                })));

            Tags.AddRange(repository.Tags.Keys.Select(x =>
                new BranchViewModel(x, new RepositoryNavigationRequest()
                {
                    RepositoryName = request.RepositoryName,
                    Treeish = x,
                    RepositoryLocation = request.RepositoryLocation
                })));

            var obj = repository.Get<AbstractObject>(Treeish);

            if (obj.IsTag)
            {
                obj = (obj as Tag).Target;
            }

            if (obj.IsCommit)
            {
                CurrentCommit = new CommitViewModel(repository, request, obj as Commit, true);
            }
        }
 public ActionResult Commit(RepositoryNavigationRequest request)
 {
     var commit = Repository.Get<Commit>(request.Treeish);
     var viewModel = new CommitDetailsViewModel(Repository, request, commit);
     return View(viewModel);
 }
예제 #28
0
 public static string TreeUrl(this UrlHelper helper, RepositoryNavigationRequest request)
 {
     return GitUrl(helper, "tree", request);
 }
예제 #29
0
 public TreeNodeViewModel(Repository repository, RepositoryNavigationRequest request, AbstractTreeNode node)
     : base(request)
 {
     Node = node;
 }
예제 #30
0
 public static string CommitUrl(this UrlHelper helper, RepositoryNavigationRequest request)
 {
     return GitUrl(helper, "commit", request);
 }