]> source.dussan.org Git - gitblit.git/commitdiff
Diff page can now show a diff between two branches 37/head
authorajermakovics <andrejs.jermakovics@gmail.com>
Tue, 18 Sep 2012 16:45:32 +0000 (17:45 +0100)
committerajermakovics <andrejs.jermakovics@gmail.com>
Tue, 18 Sep 2012 16:45:32 +0000 (17:45 +0100)
To see a diff between two branches use the syntax:
<host>/commitdiff/myRepo/branch1..branch2

src/com/gitblit/wicket/pages/CommitDiffPage.java

index dbf981b4e194b5c5372092232a22415630f42380..585ce8e34cc43da1b2ff981d74abc6364348658b 100644 (file)
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket.pages;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.apache.wicket.PageParameters;\r
-import org.apache.wicket.markup.html.basic.Label;\r
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
-import org.apache.wicket.markup.repeater.Item;\r
-import org.apache.wicket.markup.repeater.data.DataView;\r
-import org.apache.wicket.markup.repeater.data.ListDataProvider;\r
-import org.eclipse.jgit.diff.DiffEntry.ChangeType;\r
-import org.eclipse.jgit.lib.Repository;\r
-import org.eclipse.jgit.revwalk.RevCommit;\r
-\r
-import com.gitblit.GitBlit;\r
-import com.gitblit.Keys;\r
-import com.gitblit.models.PathModel.PathChangeModel;\r
-import com.gitblit.models.SubmoduleModel;\r
-import com.gitblit.utils.DiffUtils;\r
-import com.gitblit.utils.DiffUtils.DiffOutputType;\r
-import com.gitblit.utils.JGitUtils;\r
-import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.panels.CommitHeaderPanel;\r
-import com.gitblit.wicket.panels.CommitLegendPanel;\r
-import com.gitblit.wicket.panels.LinkPanel;\r
-\r
-public class CommitDiffPage extends RepositoryPage {\r
-\r
-       public CommitDiffPage(PageParameters params) {\r
-               super(params);\r
-\r
-               Repository r = getRepository();\r
-               RevCommit commit = getCommit();\r
-               DiffOutputType diffType = DiffOutputType.forName(GitBlit.getString(Keys.web.diffStyle,\r
-                               DiffOutputType.GITBLIT.name()));\r
-               String diff = DiffUtils.getCommitDiff(r, commit, diffType);\r
-\r
-               List<String> parents = new ArrayList<String>();\r
-               if (commit.getParentCount() > 0) {\r
-                       for (RevCommit parent : commit.getParents()) {\r
-                               parents.add(parent.name());\r
-                       }\r
-               }\r
-\r
-               // commit page links\r
-               if (parents.size() == 0) {\r
-                       add(new Label("parentLink", getString("gb.none")));\r
-               } else {\r
-                       add(new LinkPanel("parentLink", null, parents.get(0).substring(0, 8),\r
-                                       CommitDiffPage.class, newCommitParameter(parents.get(0))));\r
-               }\r
-               add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,\r
-                               WicketUtils.newObjectParameter(repositoryName, objectId)));\r
-               add(new BookmarkablePageLink<Void>("commitLink", CommitPage.class,\r
-                               WicketUtils.newObjectParameter(repositoryName, objectId)));\r
-\r
-               add(new CommitHeaderPanel("commitHeader", repositoryName, commit));\r
-\r
-               // changed paths list\r
-               List<PathChangeModel> paths = JGitUtils.getFilesInCommit(r, commit);\r
-               add(new CommitLegendPanel("commitLegend", paths));\r
-               ListDataProvider<PathChangeModel> pathsDp = new ListDataProvider<PathChangeModel>(paths);\r
-               DataView<PathChangeModel> pathsView = new DataView<PathChangeModel>("changedPath", pathsDp) {\r
-                       private static final long serialVersionUID = 1L;\r
-                       int counter;\r
-\r
-                       public void populateItem(final Item<PathChangeModel> item) {\r
-                               final PathChangeModel entry = item.getModelObject();\r
-                               Label changeType = new Label("changeType", "");\r
-                               WicketUtils.setChangeTypeCssClass(changeType, entry.changeType);\r
-                               setChangeTypeTooltip(changeType, entry.changeType);\r
-                               item.add(changeType);\r
-\r
-                               boolean hasSubmodule = false;\r
-                               String submodulePath = null;\r
-                               if (entry.isTree()) {\r
-                                       // tree\r
-                                       item.add(new LinkPanel("pathName", null, entry.path, TreePage.class,\r
-                                                       WicketUtils\r
-                                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));\r
-                               } else if (entry.isSubmodule()) {\r
-                                       // submodule\r
-                                       String submoduleId = entry.objectId;                                            \r
-                                       SubmoduleModel submodule = getSubmodule(entry.path);\r
-                                       submodulePath = submodule.gitblitPath;\r
-                                       hasSubmodule = submodule.hasSubmodule;\r
-                                       \r
-                                       item.add(new LinkPanel("pathName", "list", entry.path + " @ " +\r
-                                                       getShortObjectId(submoduleId), TreePage.class,\r
-                                                       WicketUtils\r
-                                                                       .newPathParameter(submodulePath, submoduleId, "")).setEnabled(hasSubmodule));\r
-                               } else {\r
-                                       // blob\r
-                                       item.add(new LinkPanel("pathName", "list", entry.path, BlobPage.class,\r
-                                                       WicketUtils\r
-                                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));\r
-                               }\r
-\r
-                               // quick links\r
-                               if (entry.isSubmodule()) {\r
-                                       // submodule                                    \r
-                                       item.add(new BookmarkablePageLink<Void>("patch", PatchPage.class, WicketUtils\r
-                                                       .newPathParameter(submodulePath, entry.objectId, entry.path)).setEnabled(false));\r
-                                       item.add(new BookmarkablePageLink<Void>("view", CommitPage.class, WicketUtils\r
-                                                       .newObjectParameter(submodulePath, entry.objectId)).setEnabled(hasSubmodule));\r
-                                       item.add(new BookmarkablePageLink<Void>("blame", BlamePage.class, WicketUtils\r
-                                                       .newPathParameter(submodulePath, entry.objectId, entry.path)).setEnabled(false));\r
-                                       item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils\r
-                                                       .newPathParameter(submodulePath, entry.objectId, entry.path))\r
-                                                       .setEnabled(hasSubmodule));\r
-                               } else {\r
-                                       // tree or blob\r
-                                       item.add(new BookmarkablePageLink<Void>("patch", PatchPage.class, WicketUtils\r
-                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));\r
-                                       item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils\r
-                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));\r
-                                       item.add(new BookmarkablePageLink<Void>("blame", BlamePage.class, WicketUtils\r
-                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));\r
-                                       item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils\r
-                                                       .newPathParameter(repositoryName, entry.commitId, entry.path))\r
-                                                       .setEnabled(!entry.changeType.equals(ChangeType.ADD)));\r
-                               }\r
-                               WicketUtils.setAlternatingBackground(item, counter);\r
-                               counter++;\r
-                       }\r
-               };\r
-               add(pathsView);\r
-               add(new Label("diffText", diff).setEscapeModelStrings(false));\r
-       }\r
-\r
-       @Override\r
-       protected String getPageName() {\r
-               return getString("gb.commitdiff");\r
-       }\r
-}\r
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.wicket.pages;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import java.text.MessageFormat;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.ListDataProvider;
+import org.eclipse.jgit.diff.DiffEntry.ChangeType;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+import com.gitblit.GitBlit;
+import com.gitblit.Keys;
+import com.gitblit.models.PathModel.PathChangeModel;
+import com.gitblit.models.SubmoduleModel;
+import com.gitblit.utils.DiffUtils;
+import com.gitblit.utils.DiffUtils.DiffOutputType;
+import com.gitblit.utils.JGitUtils;
+import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.panels.CommitHeaderPanel;
+import com.gitblit.wicket.panels.CommitLegendPanel;
+import com.gitblit.wicket.panels.LinkPanel;
+
+public class CommitDiffPage extends RepositoryPage {
+
+       public CommitDiffPage(PageParameters params) {
+               super(params);
+
+               Repository r = getRepository();
+
+               DiffOutputType diffType = DiffOutputType.forName(GitBlit.getString(Keys.web.diffStyle,
+                               DiffOutputType.GITBLIT.name()));
+
+               RevCommit commit = null, otherCommit = null;
+
+               if( objectId.contains("..") )
+               {
+                       String[] parts = objectId.split("\\.\\.");
+                       commit = getCommit(r, parts[0]);
+                       otherCommit = getCommit(r, parts[1]);
+               }
+               else
+               {
+                       commit = getCommit();
+               }
+
+               String diff;
+
+               if(otherCommit == null)
+               {
+                       diff = DiffUtils.getCommitDiff(r, commit, diffType);
+               }
+               else
+               {
+                       diff = DiffUtils.getDiff(r, commit, otherCommit, diffType);
+               }
+
+               List<String> parents = new ArrayList<String>();
+               if (commit.getParentCount() > 0) {
+                       for (RevCommit parent : commit.getParents()) {
+                               parents.add(parent.name());
+                       }
+               }
+
+               // commit page links
+               if (parents.size() == 0) {
+                       add(new Label("parentLink", getString("gb.none")));
+               } else {
+                       add(new LinkPanel("parentLink", null, parents.get(0).substring(0, 8),
+                                       CommitDiffPage.class, newCommitParameter(parents.get(0))));
+               }
+               add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,
+                               WicketUtils.newObjectParameter(repositoryName, objectId)));
+               add(new BookmarkablePageLink<Void>("commitLink", CommitPage.class,
+                               WicketUtils.newObjectParameter(repositoryName, objectId)));
+
+               add(new CommitHeaderPanel("commitHeader", repositoryName, commit));
+
+               // changed paths list
+               List<PathChangeModel> paths;
+
+               if( otherCommit == null )
+               {
+                       paths = JGitUtils.getFilesInCommit(r, commit);
+               }
+               else
+               {
+                       paths = JGitUtils.getFilesInCommit(r, otherCommit);
+               }
+
+               add(new CommitLegendPanel("commitLegend", paths));
+               ListDataProvider<PathChangeModel> pathsDp = new ListDataProvider<PathChangeModel>(paths);
+               DataView<PathChangeModel> pathsView = new DataView<PathChangeModel>("changedPath", pathsDp) {
+                       private static final long serialVersionUID = 1L;
+                       int counter;
+
+                       public void populateItem(final Item<PathChangeModel> item) {
+                               final PathChangeModel entry = item.getModelObject();
+                               Label changeType = new Label("changeType", "");
+                               WicketUtils.setChangeTypeCssClass(changeType, entry.changeType);
+                               setChangeTypeTooltip(changeType, entry.changeType);
+                               item.add(changeType);
+
+                               boolean hasSubmodule = false;
+                               String submodulePath = null;
+                               if (entry.isTree()) {
+                                       // tree
+                                       item.add(new LinkPanel("pathName", null, entry.path, TreePage.class,
+                                                       WicketUtils
+                                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));
+                               } else if (entry.isSubmodule()) {
+                                       // submodule
+                                       String submoduleId = entry.objectId;
+                                       SubmoduleModel submodule = getSubmodule(entry.path);
+                                       submodulePath = submodule.gitblitPath;
+                                       hasSubmodule = submodule.hasSubmodule;
+
+                                       item.add(new LinkPanel("pathName", "list", entry.path + " @ " +
+                                                       getShortObjectId(submoduleId), TreePage.class,
+                                                       WicketUtils
+                                                                       .newPathParameter(submodulePath, submoduleId, "")).setEnabled(hasSubmodule));
+                               } else {
+                                       // blob
+                                       item.add(new LinkPanel("pathName", "list", entry.path, BlobPage.class,
+                                                       WicketUtils
+                                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));
+                               }
+
+                               // quick links
+                               if (entry.isSubmodule()) {
+                                       // submodule
+                                       item.add(new BookmarkablePageLink<Void>("patch", PatchPage.class, WicketUtils
+                                                       .newPathParameter(submodulePath, entry.objectId, entry.path)).setEnabled(false));
+                                       item.add(new BookmarkablePageLink<Void>("view", CommitPage.class, WicketUtils
+                                                       .newObjectParameter(submodulePath, entry.objectId)).setEnabled(hasSubmodule));
+                                       item.add(new BookmarkablePageLink<Void>("blame", BlamePage.class, WicketUtils
+                                                       .newPathParameter(submodulePath, entry.objectId, entry.path)).setEnabled(false));
+                                       item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils
+                                                       .newPathParameter(submodulePath, entry.objectId, entry.path))
+                                                       .setEnabled(hasSubmodule));
+                               } else {
+                                       // tree or blob
+                                       item.add(new BookmarkablePageLink<Void>("patch", PatchPage.class, WicketUtils
+                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));
+                                       item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils
+                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));
+                                       item.add(new BookmarkablePageLink<Void>("blame", BlamePage.class, WicketUtils
+                                                       .newPathParameter(repositoryName, entry.commitId, entry.path)));
+                                       item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils
+                                                       .newPathParameter(repositoryName, entry.commitId, entry.path))
+                                                       .setEnabled(!entry.changeType.equals(ChangeType.ADD)));
+                               }
+                               WicketUtils.setAlternatingBackground(item, counter);
+                               counter++;
+                       }
+               };
+               add(pathsView);
+               add(new Label("diffText", diff).setEscapeModelStrings(false));
+       }
+
+       @Override
+       protected String getPageName() {
+               return getString("gb.commitdiff");
+       }
+
+       private RevCommit getCommit(Repository r, String rev)
+       {
+               RevCommit otherCommit = JGitUtils.getCommit(r, rev);
+               if (otherCommit == null) {
+                       error(MessageFormat.format(getString("gb.failedToFindCommit"), rev, repositoryName, getPageName()), true);
+               }
+               return otherCommit;
+       }
+}