Allow log views to have no revision, implying HEAD Resolving HEAD happens in LogServlet rather than ViewFilter because "log view with no revision" is still the most accurate description of the URL. Change-Id: Ibc8b370f0c8e46dd8304fd6cdb3f8a9417e979fa
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java index df6e1ef..f48ec3b 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/GitilesView.java
@@ -28,6 +28,7 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; +import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.revwalk.RevObject; import java.io.UnsupportedEncodingException; @@ -309,7 +310,7 @@ } private void checkLog() { - checkRevision(); + checkRepositoryIndex(); } private void checkPath() { @@ -474,13 +475,16 @@ url.append('/').append(path); break; case LOG: - url.append(repositoryName).append("/+log/"); - if (oldRevision != Revision.NULL) { - url.append(oldRevision.getName()).append(".."); - } - url.append(revision.getName()); - if (path != null) { - url.append('/').append(path); + url.append(repositoryName).append("/+log"); + if (revision != Revision.NULL) { + url.append('/'); + if (oldRevision != Revision.NULL) { + url.append(oldRevision.getName()).append(".."); + } + url.append(revision.getName()); + if (path != null) { + url.append('/').append(path); + } } break; default: @@ -530,12 +534,16 @@ // separate links in "old..new". breadcrumbs.add(breadcrumb(getRevisionRange(), diff().copyFrom(this).setTreePath(""))); } else if (type == Type.LOG) { - // TODO(dborowitz): Add something in the navigation area (probably not - // a breadcrumb) to allow switching between /+log/ and /+/. - if (oldRevision == Revision.NULL) { - breadcrumbs.add(breadcrumb(revision.getName(), log().copyFrom(this).setTreePath(null))); + if (revision != Revision.NULL) { + // TODO(dborowitz): Add something in the navigation area (probably not + // a breadcrumb) to allow switching between /+log/ and /+/. + if (oldRevision == Revision.NULL) { + breadcrumbs.add(breadcrumb(revision.getName(), log().copyFrom(this).setTreePath(null))); + } else { + breadcrumbs.add(breadcrumb(getRevisionRange(), log().copyFrom(this).setTreePath(null))); + } } else { - breadcrumbs.add(breadcrumb(getRevisionRange(), log().copyFrom(this).setTreePath(null))); + breadcrumbs.add(breadcrumb(Constants.HEAD, log().copyFrom(this))); } path = Strings.emptyToNull(path); } else if (revision != Revision.NULL) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java index 46b6c44..b75965c 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -19,14 +19,12 @@ import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR; import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import com.google.common.base.Optional; +import com.google.common.base.Strings; +import com.google.common.collect.Iterables; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Lists; +import com.google.gitiles.CommitSoyData.KeySet; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; @@ -34,6 +32,7 @@ import org.eclipse.jgit.http.server.ServletUtils; import org.eclipse.jgit.lib.AbbreviatedObjectId; import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.Ref; @@ -46,12 +45,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Optional; -import com.google.common.base.Strings; -import com.google.common.collect.Iterables; -import com.google.common.collect.ListMultimap; -import com.google.common.collect.Lists; -import com.google.gitiles.CommitSoyData.KeySet; +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** Serves an HTML page with a shortlog for commits and paths. */ public class LogServlet extends BaseServlet { @@ -69,9 +70,14 @@ } @Override - protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException { - GitilesView view = ViewFilter.getView(req); + protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException { Repository repo = ServletUtils.getRepository(req); + GitilesView view = getView(req, repo); + if (view == null) { + res.setStatus(SC_NOT_FOUND); + return; + } + RevWalk walk = null; try { try { @@ -131,6 +137,26 @@ } } + private static GitilesView getView(HttpServletRequest req, Repository repo) throws IOException { + GitilesView view = ViewFilter.getView(req); + if (view.getRevision() != Revision.NULL) { + return view; + } + Ref headRef = repo.getRef(Constants.HEAD); + if (headRef == null) { + return null; + } + RevWalk walk = new RevWalk(repo); + try { + return GitilesView.log() + .copyFrom(view) + .setRevision(Revision.peel(Constants.HEAD, headRef.getObjectId(), walk)) + .build(); + } finally { + walk.release(); + } + } + private static Optional<ObjectId> getStart(ListMultimap<String, String> params, ObjectReader reader) throws IOException { List<String> values = params.get(START_PARAM);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java index 90cd94a..4f629be 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/ViewFilter.java
@@ -104,6 +104,8 @@ return GitilesView.hostIndex(); } else if (command.equals(CMD_REFS) && path.isEmpty()) { return GitilesView.refs().setRepositoryName(repoName); + } else if (command.equals(CMD_LOG) && (path.isEmpty() || path.equals("/"))) { + return GitilesView.log().setRepositoryName(repoName); } else if (command.isEmpty()) { return GitilesView.repositoryIndex().setRepositoryName(repoName); } else if (path.isEmpty()) {