diff options
author | Tom <tw201207@gmail.com> | 2016-10-26 22:49:56 +0200 |
---|---|---|
committer | Florian Zschocke <2362065+flaix@users.noreply.github.com> | 2021-11-03 20:37:06 +0100 |
commit | 560f2e3ab0f78429fe22dc23ae25de6a7500cf02 (patch) | |
tree | 9890982332b540c86009c04a13c9729ba1f56cdb /src/main/java | |
parent | edd1e6759ce72e36776ebb2dcd5c6529a5bf079a (diff) | |
download | gitblit-560f2e3ab0f78429fe22dc23ae25de6a7500cf02.tar.gz gitblit-560f2e3ab0f78429fe22dc23ae25de6a7500cf02.zip |
Issue #1011: do not serialize JGit commit objects
JGit commit objects are a recursive data structure; they have links to
their parent commits. Serializing a JGit commit will try to recursively
serialize all reachable ancestors as faras they have been loaded. If
that ancestor chain is too long, a StackOverflowError is thrown during
Wicket's page serialization if a page has a reference to sucha JGit
commit.
Fixed by making sure that pages o not contain references to JGit
commits. Use the (existing) wrapper object RepositoryCommit instead.
* RepositoryCommit has a transient reference to the JGit commit and
reads the commit from the repository upon de-serialization.
* RefModel is a similar case (JGit tags/branches may also have links
to the commits they point to). Solved a bit differently by making it
a pure data object by transferring the interesting data from the JGit
object in the constructor.
* Change DataViews instantiated with RevCommit to use RepositoryCommit
instead.
* Change inner anonymous DataViews to ensure they do not have a
synthesized field referencing the "allRefs" map. Such a synthesized
field would also get serialized, and then serialize JGit commits
again.
Finally, remove non-transient logger instances in Wicket classes. Those
might lead to NotSerializableException.
These StackOverflowErrors have been reported in several places since
2014:
* https://groups.google.com/forum/#!topic/gitblit/GH1d8WSlR6Q
* https://bugs.chromium.org/p/gerrit/issues/detail?id=3316
* https://groups.google.com/d/msg/repo-discuss/Kcl0JIGNiGk/0DjH4mO8hA8J
* https://groups.google.com/d/msg/repo-discuss/0_P6A3fjTec/2kcpVPIUAQAJ
* https://github.com/gitblit/gitblit/issues/1011
* https://github.com/tomaswolf/gerrit-gitblit-plugin/issues/21
Diffstat (limited to 'src/main/java')
13 files changed, 230 insertions, 97 deletions
diff --git a/src/main/java/com/gitblit/models/RefModel.java b/src/main/java/com/gitblit/models/RefModel.java index d20c2dc6..86d98474 100644 --- a/src/main/java/com/gitblit/models/RefModel.java +++ b/src/main/java/com/gitblit/models/RefModel.java @@ -36,18 +36,42 @@ import com.gitblit.utils.JGitUtils; */
public class RefModel implements Serializable, Comparable<RefModel> {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 876822269940583606L;
+
public final String displayName;
- public final RevObject referencedObject;
- public transient Ref reference;
+
+ private final Date date;
+ private final String name;
+ private final int type;
+ private final String id;
+ private final String referencedId;
+ private final boolean annotated;
+ private final PersonIdent person;
+ private final String shortMessage;
+ private final String fullMessage;
+
+ private transient ObjectId objectId;
+ private transient ObjectId referencedObjectId;
+
+ public transient Ref reference; // Used in too many places.
public RefModel(String displayName, Ref ref, RevObject refObject) {
- this.displayName = displayName;
this.reference = ref;
- this.referencedObject = refObject;
+ this.displayName = displayName;
+ this.date = internalGetDate(refObject);
+ this.name = (ref != null) ? ref.getName() : displayName;
+ this.type = internalGetReferencedObjectType(refObject);
+ this.objectId = internalGetObjectId(reference);
+ this.id = this.objectId.getName();
+ this.referencedObjectId = internalGetReferencedObjectId(refObject);
+ this.referencedId = this.referencedObjectId.getName();
+ this.annotated = internalIsAnnotatedTag(ref, refObject);
+ this.person = internalGetAuthorIdent(refObject);
+ this.shortMessage = internalGetShortMessage(refObject);
+ this.fullMessage = internalGetFullMessage(refObject);
}
- public Date getDate() {
+ private Date internalGetDate(RevObject referencedObject) {
Date date = new Date(0);
if (referencedObject != null) {
if (referencedObject instanceof RevTag) {
@@ -64,14 +88,15 @@ public class RefModel implements Serializable, Comparable<RefModel> { return date;
}
+ public Date getDate() {
+ return date;
+ }
+
public String getName() {
- if (reference == null) {
- return displayName;
- }
- return reference.getName();
+ return name;
}
- public int getReferencedObjectType() {
+ private int internalGetReferencedObjectType(RevObject referencedObject) {
int type = referencedObject.getType();
if (referencedObject instanceof RevTag) {
type = ((RevTag) referencedObject).getObject().getType();
@@ -79,14 +104,25 @@ public class RefModel implements Serializable, Comparable<RefModel> { return type;
}
- public ObjectId getReferencedObjectId() {
+ public int getReferencedObjectType() {
+ return type;
+ }
+
+ private ObjectId internalGetReferencedObjectId(RevObject referencedObject) {
if (referencedObject instanceof RevTag) {
return ((RevTag) referencedObject).getObject().getId();
}
return referencedObject.getId();
}
- public String getShortMessage() {
+ public ObjectId getReferencedObjectId() {
+ if (referencedObjectId == null) {
+ referencedObjectId = ObjectId.fromString(referencedId);
+ }
+ return referencedObjectId;
+ }
+
+ private String internalGetShortMessage(RevObject referencedObject) {
String message = "";
if (referencedObject instanceof RevTag) {
message = ((RevTag) referencedObject).getShortMessage();
@@ -96,7 +132,11 @@ public class RefModel implements Serializable, Comparable<RefModel> { return message;
}
- public String getFullMessage() {
+ public String getShortMessage() {
+ return shortMessage;
+ }
+
+ private String internalGetFullMessage(RevObject referencedObject) {
String message = "";
if (referencedObject instanceof RevTag) {
message = ((RevTag) referencedObject).getFullMessage();
@@ -106,7 +146,11 @@ public class RefModel implements Serializable, Comparable<RefModel> { return message;
}
- public PersonIdent getAuthorIdent() {
+ public String getFullMessage() {
+ return fullMessage;
+ }
+
+ private PersonIdent internalGetAuthorIdent(RevObject referencedObject) {
if (referencedObject instanceof RevTag) {
return ((RevTag) referencedObject).getTaggerIdent();
} else if (referencedObject instanceof RevCommit) {
@@ -115,17 +159,32 @@ public class RefModel implements Serializable, Comparable<RefModel> { return null;
}
- public ObjectId getObjectId() {
+ public PersonIdent getAuthorIdent() {
+ return person;
+ }
+
+ private ObjectId internalGetObjectId(Ref reference) {
return reference.getObjectId();
}
- public boolean isAnnotatedTag() {
+ public ObjectId getObjectId() {
+ if (objectId == null) {
+ objectId = ObjectId.fromString(id);
+ }
+ return objectId;
+ }
+
+ private boolean internalIsAnnotatedTag(Ref reference, RevObject referencedObject) {
if (referencedObject instanceof RevTag) {
return !getReferencedObjectId().equals(getObjectId());
}
return reference.getPeeledObjectId() != null;
}
+ public boolean isAnnotatedTag() {
+ return annotated;
+ }
+
@Override
public int hashCode() {
return getReferencedObjectId().hashCode() + getName().hashCode();
diff --git a/src/main/java/com/gitblit/models/RepositoryCommit.java b/src/main/java/com/gitblit/models/RepositoryCommit.java index 765b4898..43f314a3 100644 --- a/src/main/java/com/gitblit/models/RepositoryCommit.java +++ b/src/main/java/com/gitblit/models/RepositoryCommit.java @@ -15,6 +15,8 @@ */ package com.gitblit.models; +import java.io.IOException; +import java.io.ObjectInputStream; import java.io.Serializable; import java.text.MessageFormat; import java.util.Date; @@ -22,30 +24,36 @@ import java.util.List; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; + +import com.gitblit.wicket.GitBlitWebApp; /** - * Model class to represent a RevCommit, it's source repository, and the branch. - * This class is used by the activity page. + * Model class to represent a RevCommit, it's source repository, and the branch. This class is used by the activity page. * * @author James Moger */ public class RepositoryCommit implements Serializable, Comparable<RepositoryCommit> { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -2214911650485772022L; - public final String repository; + public String repository; - public final String branch; + public String branch; - private final RevCommit commit; + private final String commitId; private List<RefModel> refs; + private transient RevCommit commit; + public RepositoryCommit(String repository, String branch, RevCommit commit) { this.repository = repository; this.branch = branch; this.commit = commit; + this.commitId = commit.getName(); } public void setRefs(List<RefModel> refs) { @@ -80,7 +88,7 @@ public class RepositoryCommit implements Serializable, Comparable<RepositoryComm return commit.getParentCount(); } - public RevCommit [] getParents() { + public RevCommit[] getParents() { return commit.getParents(); } @@ -92,10 +100,14 @@ public class RepositoryCommit implements Serializable, Comparable<RepositoryComm return commit.getCommitterIdent(); } + public RevCommit getCommit() { + return commit; + } + @Override public boolean equals(Object o) { if (o instanceof RepositoryCommit) { - RepositoryCommit commit = (RepositoryCommit) o; + final RepositoryCommit commit = (RepositoryCommit) o; return repository.equals(commit.repository) && getName().equals(commit.getName()); } return false; @@ -123,8 +135,23 @@ public class RepositoryCommit implements Serializable, Comparable<RepositoryComm @Override public String toString() { - return MessageFormat.format("{0} {1} {2,date,yyyy-MM-dd HH:mm} {3} {4}", - getShortName(), branch, getCommitterIdent().getWhen(), getAuthorIdent().getName(), - getShortMessage()); + return MessageFormat.format("{0} {1} {2,date,yyyy-MM-dd HH:mm} {3} {4}", getShortName(), branch, getCommitterIdent().getWhen(), + getAuthorIdent().getName(), getShortMessage()); + } + + // Serialization: restore the JGit RevCommit on reading + + private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException { + // Read in fields and any hidden stuff + input.defaultReadObject(); + // Go find the commit again. + final Repository repo = GitBlitWebApp.get().repositories().getRepository(repository); + if (repo == null) { + throw new IOException("Cannot find repositoy " + repository); + } + try (RevWalk walk = new RevWalk(repo)) { + commit = walk.parseCommit(repo.resolve(commitId)); + } } + }
\ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/SessionlessForm.java b/src/main/java/com/gitblit/wicket/SessionlessForm.java index 6f790717..c53f095e 100644 --- a/src/main/java/com/gitblit/wicket/SessionlessForm.java +++ b/src/main/java/com/gitblit/wicket/SessionlessForm.java @@ -58,7 +58,7 @@ public class SessionlessForm<T> extends StatelessForm<T> { protected final PageParameters pageParameters; - private final Logger log = LoggerFactory.getLogger(SessionlessForm.class); + private transient Logger logger; /** * Sessionless forms must have a bookmarkable page class. A bookmarkable @@ -118,7 +118,10 @@ public class SessionlessForm<T> extends StatelessForm<T> { if (c != null) { // this form has a field id which matches the // parameter name, skip embedding a hidden value - log.warn(MessageFormat.format("Skipping page parameter \"{0}\" from sessionless form hidden fields because it collides with a form child wicket:id", key)); + logger().warn( + MessageFormat + .format("Skipping page parameter \"{0}\" from sessionless form hidden fields because it collides with a form child wicket:id", + key)); continue; } String value = pageParameters.getString(key); @@ -156,4 +159,11 @@ public class SessionlessForm<T> extends StatelessForm<T> { String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); return absoluteUrl; } + + private Logger logger() { + if (logger == null) { + logger = LoggerFactory.getLogger(SessionlessForm.class); + } + return logger; + } } diff --git a/src/main/java/com/gitblit/wicket/pages/BlamePage.java b/src/main/java/com/gitblit/wicket/pages/BlamePage.java index 2fcca0ae..8465058f 100644 --- a/src/main/java/com/gitblit/wicket/pages/BlamePage.java +++ b/src/main/java/com/gitblit/wicket/pages/BlamePage.java @@ -108,7 +108,7 @@ public class BlamePage extends RepositoryPage { if (pathModel == null) {
final String notFound = MessageFormat.format("Blame page failed to find {0} in {1} @ {2}",
blobPath, repositoryName, objectId);
- logger.error(notFound);
+ logger().error(notFound);
add(new Label("annotation").setVisible(false));
add(new Label("missingBlob", missingBlob(blobPath, commit)).setEscapeModelStrings(false));
return;
diff --git a/src/main/java/com/gitblit/wicket/pages/EditFilePage.java b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java index dbf8a79e..5ec9b6ee 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditFilePage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java @@ -123,7 +123,7 @@ public class EditFilePage extends RepositoryPage { try { ObjectId docAtLoad = getRepository().resolve(commitIdAtLoad.getObject()); - logger.trace("Commiting Edit File page: " + commitIdAtLoad.getObject()); + logger().trace("Commiting Edit File page: " + commitIdAtLoad.getObject()); DirCache index = DirCache.newInCore(); DirCacheBuilder builder = index.builder(); diff --git a/src/main/java/com/gitblit/wicket/pages/MetricsPage.java b/src/main/java/com/gitblit/wicket/pages/MetricsPage.java index 96113b0f..77811687 100644 --- a/src/main/java/com/gitblit/wicket/pages/MetricsPage.java +++ b/src/main/java/com/gitblit/wicket/pages/MetricsPage.java @@ -94,7 +94,7 @@ public class MetricsPage extends RepositoryPage { try {
date = df.parse(metric.name);
} catch (ParseException e) {
- logger.error("Unable to parse date: " + metric.name);
+ logger().error("Unable to parse date: " + metric.name);
return;
}
chart.addValue(date, (int)metric.count);
diff --git a/src/main/java/com/gitblit/wicket/pages/RawPage.java b/src/main/java/com/gitblit/wicket/pages/RawPage.java index c4357478..bd901f24 100644 --- a/src/main/java/com/gitblit/wicket/pages/RawPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RawPage.java @@ -45,7 +45,7 @@ import com.gitblit.wicket.WicketUtils; public class RawPage extends SessionPage {
- private final Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
+ private transient Logger logger;
String contentType;
@@ -95,7 +95,7 @@ public class RawPage extends SessionPage { if (binary == null) {
final String objectNotFound = MessageFormat.format("Raw page failed to find object {0} in {1}",
objectId, repositoryName);
- logger.error(objectNotFound);
+ logger().error(objectNotFound);
throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, objectNotFound);
}
contentType = "application/octet-stream";
@@ -104,7 +104,7 @@ public class RawPage extends SessionPage { try {
response.getOutputStream().write(binary);
} catch (Exception e) {
- logger.error("Failed to write binary response", e);
+ logger().error("Failed to write binary response", e);
}
} else {
// standard raw blob view
@@ -112,7 +112,7 @@ public class RawPage extends SessionPage { if (commit == null) {
final String commitNotFound = MessageFormat.format("Raw page failed to find commit {0} in {1}",
objectId, repositoryName);
- logger.error(commitNotFound);
+ logger().error(commitNotFound);
throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, commitNotFound);
}
@@ -148,7 +148,7 @@ public class RawPage extends SessionPage { // image blobs
byte[] image = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true);
if (image == null) {
- logger.error(blobNotFound);
+ logger().error(blobNotFound);
throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
}
contentType = "image/" + extension.toLowerCase();
@@ -157,14 +157,14 @@ public class RawPage extends SessionPage { try {
response.getOutputStream().write(image);
} catch (IOException e) {
- logger.error("Failed to write image response", e);
+ logger().error("Failed to write image response", e);
}
break;
case 3:
// binary blobs (download)
byte[] binary = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true);
if (binary == null) {
- logger.error(blobNotFound);
+ logger().error(blobNotFound);
throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
}
contentType = "application/octet-stream";
@@ -193,7 +193,7 @@ public class RawPage extends SessionPage { try {
response.getOutputStream().write(binary);
} catch (IOException e) {
- logger.error("Failed to write binary response", e);
+ logger().error("Failed to write binary response", e);
}
break;
default:
@@ -201,7 +201,7 @@ public class RawPage extends SessionPage { String content = JGitUtils.getStringContent(r, commit.getTree(),
blobPath, encodings);
if (content == null) {
- logger.error(blobNotFound);
+ logger().error(blobNotFound);
throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
}
contentType = "text/plain; charset=UTF-8";
@@ -209,7 +209,7 @@ public class RawPage extends SessionPage { try {
response.getOutputStream().write(content.getBytes("UTF-8"));
} catch (Exception e) {
- logger.error("Failed to write text response", e);
+ logger().error("Failed to write text response", e);
}
}
@@ -218,7 +218,7 @@ public class RawPage extends SessionPage { String content = JGitUtils.getStringContent(r, commit.getTree(), blobPath,
encodings);
if (content == null) {
- logger.error(blobNotFound);
+ logger().error(blobNotFound);
throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
}
contentType = "text/plain; charset=UTF-8";
@@ -226,7 +226,7 @@ public class RawPage extends SessionPage { try {
response.getOutputStream().write(content.getBytes("UTF-8"));
} catch (Exception e) {
- logger.error("Failed to write text response", e);
+ logger().error("Failed to write text response", e);
}
}
}
@@ -235,6 +235,13 @@ public class RawPage extends SessionPage { });
}
+ protected Logger logger() {
+ if (logger == null) {
+ logger = LoggerFactory.getLogger(getClass());
+ }
+ return logger;
+ }
+
@Override
protected void setHeaders(WebResponse response) {
super.setHeaders(response);
diff --git a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java index 36c5ae16..4d30e049 100644 --- a/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/RepositoryPage.java @@ -42,8 +42,6 @@ import org.eclipse.jgit.diff.DiffEntry.ChangeType; import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import com.gitblit.Constants;
import com.gitblit.GitBlitException;
@@ -78,8 +76,6 @@ import com.google.common.base.Optional; public abstract class RepositoryPage extends RootPage {
- protected final Logger logger = LoggerFactory.getLogger(getClass());
-
private final String PARAM_STAR = "star";
protected final String projectName;
@@ -93,7 +89,7 @@ public abstract class RepositoryPage extends RootPage { private Map<String, SubmoduleModel> submodules;
private boolean showAdmin;
- private boolean isOwner;
+ private final boolean isOwner;
public RepositoryPage(PageParameters params) {
super(params);
@@ -144,7 +140,7 @@ public abstract class RepositoryPage extends RootPage { try {
app().gitblit().reviseUser(user.username, user);
} catch (GitBlitException e) {
- logger.error("Failed to update user " + user.username, e);
+ logger().error("Failed to update user " + user.username, e);
error(getString("gb.failedToUpdateUser"), false);
}
}
@@ -579,7 +575,7 @@ public abstract class RepositoryPage extends RootPage { }
protected void addRefs(Repository r, RevCommit c) {
- add(new RefsPanel("refsPanel", repositoryName, c, JGitUtils.getAllRefs(r, getRepositoryModel().showRemoteBranches)));
+ add(new RefsPanel("refsPanel", repositoryName, JGitUtils.getAllRefs(r, getRepositoryModel().showRemoteBranches).get(c.getId())));
}
protected void addFullText(String wicketId, String text) {
diff --git a/src/main/java/com/gitblit/wicket/pages/SummaryPage.java b/src/main/java/com/gitblit/wicket/pages/SummaryPage.java index 3cfa152e..1a5f0518 100644 --- a/src/main/java/com/gitblit/wicket/pages/SummaryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/SummaryPage.java @@ -190,7 +190,7 @@ public class SummaryPage extends RepositoryPage { try {
date = df.parse(metric.name);
} catch (ParseException e) {
- logger.error("Unable to parse date: " + metric.name);
+ logger().error("Unable to parse date: " + metric.name);
return charts;
}
chart.addValue(date, (int)metric.count);
diff --git a/src/main/java/com/gitblit/wicket/pages/TicketPage.java b/src/main/java/com/gitblit/wicket/pages/TicketPage.java index e2133966..1750b859 100644 --- a/src/main/java/com/gitblit/wicket/pages/TicketPage.java +++ b/src/main/java/com/gitblit/wicket/pages/TicketPage.java @@ -66,6 +66,7 @@ import com.gitblit.git.PatchsetCommand; import com.gitblit.git.PatchsetReceivePack;
import com.gitblit.models.PathModel.PathChangeModel;
import com.gitblit.models.RegistrantAccessPermission;
+import com.gitblit.models.RepositoryCommit;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.RepositoryUrl;
import com.gitblit.models.SubmoduleModel;
@@ -815,13 +816,17 @@ public class TicketPage extends RepositoryPage { // commits
List<RevCommit> commits = JGitUtils.getRevLog(getRepository(), currentPatchset.base, currentPatchset.tip);
- ListDataProvider<RevCommit> commitsDp = new ListDataProvider<RevCommit>(commits);
- DataView<RevCommit> commitsView = new DataView<RevCommit>("commit", commitsDp) {
+ List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
+ for (RevCommit c : commits) {
+ repoCommits.add(new RepositoryCommit(repositoryName, "", c));
+ }
+ ListDataProvider<RepositoryCommit> commitsDp = new ListDataProvider<RepositoryCommit>(repoCommits);
+ DataView<RepositoryCommit> commitsView = new DataView<RepositoryCommit>("commit", commitsDp) {
private static final long serialVersionUID = 1L;
@Override
- public void populateItem(final Item<RevCommit> item) {
- RevCommit commit = item.getModelObject();
+ public void populateItem(final Item<RepositoryCommit> item) {
+ RepositoryCommit commit = item.getModelObject();
PersonIdent author = commit.getAuthorIdent();
item.add(new AvatarImage("authorAvatar", author.getName(), author.getEmailAddress(), null, 16, false));
item.add(new Label("author", commit.getAuthorIdent().getName()));
@@ -830,7 +835,7 @@ public class TicketPage extends RepositoryPage { item.add(new LinkPanel("diff", "link", getString("gb.diff"), CommitDiffPage.class,
WicketUtils.newObjectParameter(repositoryName, commit.getName()), true));
item.add(new Label("title", StringUtils.trimString(commit.getShortMessage(), Constants.LEN_SHORTLOG_REFS)));
- item.add(WicketUtils.createDateLabel("commitDate", JGitUtils.getAuthorDate(commit), GitBlitWebSession
+ item.add(WicketUtils.createDateLabel("commitDate", author.getWhen(), GitBlitWebSession
.get().getTimezone(), getTimeUtils(), false));
item.add(new DiffStatPanel("commitDiffStat", 0, 0, true));
}
@@ -1451,7 +1456,7 @@ public class TicketPage extends RepositoryPage { } else {
// merge failure
String msg = MessageFormat.format("Failed to merge ticket {0,number,0}: {1}", ticket.number, result.name());
- logger.error(msg);
+ logger().error(msg);
GitBlitWebSession.get().cacheErrorMessage(msg);
}
}
@@ -1461,13 +1466,13 @@ public class TicketPage extends RepositoryPage { String msg = MessageFormat.format("Can not merge ticket {0,number,0}, patchset {1,number,0} has been vetoed!",
ticket.number, patchset.number);
GitBlitWebSession.get().cacheErrorMessage(msg);
- logger.error(msg);
+ logger().error(msg);
}
} else {
// not current patchset
String msg = MessageFormat.format("Can not merge ticket {0,number,0}, the patchset has been updated!", ticket.number);
GitBlitWebSession.get().cacheErrorMessage(msg);
- logger.error(msg);
+ logger().error(msg);
}
redirectTo(TicketsPage.class, getPageParameters());
diff --git a/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java b/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java index 75fd70e7..737fe5aa 100644 --- a/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java @@ -44,7 +44,9 @@ import com.gitblit.Keys; import com.gitblit.models.PathModel;
import com.gitblit.models.PathModel.PathChangeModel;
import com.gitblit.models.RefModel;
+import com.gitblit.models.RepositoryCommit;
import com.gitblit.models.SubmoduleModel;
+import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.MarkdownUtils;
import com.gitblit.utils.StringUtils;
@@ -61,7 +63,7 @@ public class HistoryPanel extends BasePanel { private static final long serialVersionUID = 1L;
- private boolean hasMore;
+ private final boolean hasMore;
public HistoryPanel(String wicketId, final String repositoryName, final String objectId,
final String path, Repository r, int limit, int pageOffset, boolean showRemoteRefs) {
@@ -101,10 +103,9 @@ public class HistoryPanel extends BasePanel { if (matchingPath == null) {
// path not in commit
// manually locate path in tree
- TreeWalk tw = new TreeWalk(r);
- tw.reset();
- tw.setRecursive(true);
- try {
+ try (TreeWalk tw = new TreeWalk(r)) {
+ tw.reset();
+ tw.setRecursive(true);
tw.addTree(commit.getTree());
tw.setFilter(PathFilterGroup.createFromStrings(Collections.singleton(path)));
while (tw.next()) {
@@ -115,8 +116,6 @@ public class HistoryPanel extends BasePanel { }
}
} catch (Exception e) {
- } finally {
- tw.close();
}
}
}
@@ -136,7 +135,7 @@ public class HistoryPanel extends BasePanel { hasSubmodule = false;
}
- final Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
+ Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
List<RevCommit> commits;
if (pageResults) {
// Paging result set
@@ -152,15 +151,23 @@ public class HistoryPanel extends BasePanel { hasMore = commits.size() >= itemsPerPage;
final int hashLen = app().settings().getInteger(Keys.web.shortCommitIdLength, 6);
- ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
- DataView<RevCommit> logView = new DataView<RevCommit>("commit", dp) {
+ List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
+ for (RevCommit c : commits) {
+ RepositoryCommit repoCommit = new RepositoryCommit(repositoryName, "", c);
+ if (allRefs.containsKey(c)) {
+ repoCommit.setRefs(allRefs.get(c));
+ }
+ repoCommits.add(repoCommit);
+ }
+ ListDataProvider<RepositoryCommit> dp = new ListDataProvider<RepositoryCommit>(repoCommits);
+ DataView<RepositoryCommit> logView = new DataView<RepositoryCommit>("commit", dp) {
private static final long serialVersionUID = 1L;
int counter;
@Override
- public void populateItem(final Item<RevCommit> item) {
- final RevCommit entry = item.getModelObject();
- final Date date = JGitUtils.getAuthorDate(entry);
+ public void populateItem(final Item<RepositoryCommit> item) {
+ final RepositoryCommit entry = item.getModelObject();
+ Date date = entry.getAuthorIdent().getWhen();
item.add(WicketUtils.createDateLabel("commitDate", date, getTimeZone(), getTimeUtils()));
@@ -182,7 +189,7 @@ public class HistoryPanel extends BasePanel { String shortMessage = entry.getShortMessage();
String trimmedMessage = shortMessage;
- if (allRefs.containsKey(entry.getId())) {
+ if (!ArrayUtils.isEmpty(entry.getRefs())) {
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG_REFS);
} else {
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG);
@@ -195,7 +202,7 @@ public class HistoryPanel extends BasePanel { }
item.add(shortlog);
- item.add(new RefsPanel("commitRefs", repositoryName, entry, allRefs));
+ item.add(new RefsPanel("commitRefs", repositoryName, entry.getRefs()));
if (isTree) {
// tree
@@ -214,7 +221,7 @@ public class HistoryPanel extends BasePanel { } else if (isSubmodule) {
// submodule
Repository repository = app().repositories().getRepository(repositoryName);
- String submoduleId = JGitUtils.getSubmoduleCommitId(repository, path, entry);
+ String submoduleId = JGitUtils.getSubmoduleCommitId(repository, path, entry.getCommit());
repository.close();
if (StringUtils.isEmpty(submoduleId)) {
// not a submodule at this commit, just a matching path
diff --git a/src/main/java/com/gitblit/wicket/panels/LogPanel.java b/src/main/java/com/gitblit/wicket/panels/LogPanel.java index e9d240d0..4521d430 100644 --- a/src/main/java/com/gitblit/wicket/panels/LogPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/LogPanel.java @@ -15,6 +15,7 @@ */
package com.gitblit.wicket.panels;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -35,7 +36,9 @@ import org.eclipse.jgit.revwalk.RevCommit; import com.gitblit.Constants;
import com.gitblit.Keys;
import com.gitblit.models.RefModel;
+import com.gitblit.models.RepositoryCommit;
import com.gitblit.servlet.BranchGraphServlet;
+import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.ExternalImage;
@@ -50,7 +53,7 @@ public class LogPanel extends BasePanel { private static final long serialVersionUID = 1L;
- private boolean hasMore;
+ private final boolean hasMore;
public LogPanel(String wicketId, final String repositoryName, final String objectId,
Repository r, int limit, int pageOffset, boolean showRemoteRefs) {
@@ -61,7 +64,7 @@ public class LogPanel extends BasePanel { itemsPerPage = 50;
}
- final Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
+ Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
List<RevCommit> commits;
if (pageResults) {
// Paging result set
@@ -75,8 +78,8 @@ public class LogPanel extends BasePanel { // works unless commits.size() represents the exact end.
hasMore = commits.size() >= itemsPerPage;
- final String baseUrl = WicketUtils.getGitblitURL(getRequest());
- final boolean showGraph = app().settings().getBoolean(Keys.web.showBranchGraph, true);
+ String baseUrl = WicketUtils.getGitblitURL(getRequest());
+ boolean showGraph = app().settings().getBoolean(Keys.web.showBranchGraph, true);
MarkupContainer graph = new WebMarkupContainer("graph");
add(graph);
@@ -101,15 +104,23 @@ public class LogPanel extends BasePanel { }
final int hashLen = app().settings().getInteger(Keys.web.shortCommitIdLength, 6);
- ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
- DataView<RevCommit> logView = new DataView<RevCommit>("commit", dp) {
+ List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
+ for (RevCommit c : commits) {
+ RepositoryCommit repoCommit = new RepositoryCommit(repositoryName, "", c);
+ if (allRefs.containsKey(c)) {
+ repoCommit.setRefs(allRefs.get(c));
+ }
+ repoCommits.add(repoCommit);
+ }
+ ListDataProvider<RepositoryCommit> dp = new ListDataProvider<RepositoryCommit>(repoCommits);
+ DataView<RepositoryCommit> logView = new DataView<RepositoryCommit>("commit", dp) {
private static final long serialVersionUID = 1L;
int counter;
@Override
- public void populateItem(final Item<RevCommit> item) {
- final RevCommit entry = item.getModelObject();
- final Date date = JGitUtils.getAuthorDate(entry);
+ public void populateItem(final Item<RepositoryCommit> item) {
+ final RepositoryCommit entry = item.getModelObject();
+ final Date date = entry.getAuthorIdent().getWhen();
final boolean isMerge = entry.getParentCount() > 1;
item.add(WicketUtils.createDateLabel("commitDate", date, getTimeZone(), getTimeUtils()));
@@ -132,7 +143,7 @@ public class LogPanel extends BasePanel { // short message
String shortMessage = entry.getShortMessage();
String trimmedMessage = shortMessage;
- if (allRefs.containsKey(entry.getId())) {
+ if (!ArrayUtils.isEmpty(entry.getRefs())) {
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG_REFS);
} else {
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG);
@@ -145,7 +156,7 @@ public class LogPanel extends BasePanel { }
item.add(shortlog);
- item.add(new RefsPanel("commitRefs", repositoryName, entry, allRefs));
+ item.add(new RefsPanel("commitRefs", repositoryName, entry.getRefs()));
// commit hash link
LinkPanel commitHash = new LinkPanel("hashLink", null, entry.getName().substring(0, hashLen),
diff --git a/src/main/java/com/gitblit/wicket/panels/SearchPanel.java b/src/main/java/com/gitblit/wicket/panels/SearchPanel.java index 09322bc7..b29adcb5 100644 --- a/src/main/java/com/gitblit/wicket/panels/SearchPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/SearchPanel.java @@ -15,6 +15,7 @@ */
package com.gitblit.wicket.panels;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -31,6 +32,8 @@ import org.eclipse.jgit.revwalk.RevCommit; import com.gitblit.Constants;
import com.gitblit.Keys;
import com.gitblit.models.RefModel;
+import com.gitblit.models.RepositoryCommit;
+import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.WicketUtils;
@@ -43,7 +46,7 @@ public class SearchPanel extends BasePanel { private static final long serialVersionUID = 1L;
- private boolean hasMore;
+ private final boolean hasMore;
public SearchPanel(String wicketId, final String repositoryName, final String objectId,
final String value, Constants.SearchType searchType, Repository r, int limit, int pageOffset,
@@ -57,7 +60,7 @@ public class SearchPanel extends BasePanel { RevCommit commit = JGitUtils.getCommit(r, objectId);
- final Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
+ Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
List<RevCommit> commits;
if (pageResults) {
// Paging result set
@@ -78,15 +81,23 @@ public class SearchPanel extends BasePanel { add(new Label("searchString", value));
add(new Label("searchType", searchType.toString()));
- ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
- DataView<RevCommit> searchView = new DataView<RevCommit>("commit", dp) {
+ List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
+ for (RevCommit c : commits) {
+ RepositoryCommit repoCommit = new RepositoryCommit(repositoryName, "", c);
+ if (allRefs.containsKey(c)) {
+ repoCommit.setRefs(allRefs.get(c));
+ }
+ repoCommits.add(repoCommit);
+ }
+ ListDataProvider<RepositoryCommit> dp = new ListDataProvider<RepositoryCommit>(repoCommits);
+ DataView<RepositoryCommit> searchView = new DataView<RepositoryCommit>("commit", dp) {
private static final long serialVersionUID = 1L;
int counter;
@Override
- public void populateItem(final Item<RevCommit> item) {
- final RevCommit entry = item.getModelObject();
- final Date date = JGitUtils.getAuthorDate(entry);
+ public void populateItem(final Item<RepositoryCommit> item) {
+ final RepositoryCommit entry = item.getModelObject();
+ final Date date = entry.getAuthorIdent().getWhen();
item.add(WicketUtils.createDateLabel("commitDate", date, getTimeZone(), getTimeUtils()));
@@ -107,7 +118,7 @@ public class SearchPanel extends BasePanel { String shortMessage = entry.getShortMessage();
String trimmedMessage = shortMessage;
- if (allRefs.containsKey(entry.getId())) {
+ if (!ArrayUtils.isEmpty(entry.getRefs())) {
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG_REFS);
} else {
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG);
@@ -120,7 +131,7 @@ public class SearchPanel extends BasePanel { }
item.add(shortlog);
- item.add(new RefsPanel("commitRefs", repositoryName, entry, allRefs));
+ item.add(new RefsPanel("commitRefs", repositoryName, entry.getRefs()));
item.add(new BookmarkablePageLink<Void>("commit", CommitPage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getName())));
|