From 9453f69494973f529214b07f2719acf6a87228d7 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 25 Jul 2011 09:12:14 +0200 Subject: [PATCH 1/2] fix NullPointerException with empty git repositories, see issue #36 --- .../scm/repository/GitChangesetViewer.java | 9 +- .../scm/repository/GitRepositoryBrowser.java | 157 +++++++++++++----- .../java/sonia/scm/repository/GitUtil.java | 41 +++-- .../src/main/webapp/resources/js/i18n/de.js | 13 +- .../sonia.repository.changesetviewergrid.js | 7 +- .../sonia.repository.repositorybrowser.js | 6 + 6 files changed, 165 insertions(+), 68 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetViewer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetViewer.java index 9e03615fd6..33dabdc195 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetViewer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitChangesetViewer.java @@ -110,11 +110,12 @@ public class GitChangesetViewer implements ChangesetViewer { gr = GitUtil.open(directory); + int counter = 0; + List changesetList = new ArrayList(); + if (!gr.getAllRefs().isEmpty()) { Git git = new Git(gr); - List changesetList = new ArrayList(); - int counter = 0; treeWalk = new TreeWalk(gr); @@ -129,9 +130,9 @@ public class GitChangesetViewer implements ChangesetViewer counter++; } - - changesets = new ChangesetPagingResult(counter, changesetList); } + + changesets = new ChangesetPagingResult(counter, changesetList); } catch (NoHeadException ex) { diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryBrowser.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryBrowser.java index 6969d9b136..686220cfab 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryBrowser.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryBrowser.java @@ -117,12 +117,25 @@ public class GitRepositoryBrowser implements RepositoryBrowser ObjectId revId = GitUtil.getRevisionId(repo, revision); + if (logger.isDebugEnabled()) + { + logger.debug("load content for {} at {}", path, revId.name()); + } + revWalk = new RevWalk(repo); RevCommit entry = revWalk.parseCommit(revId); RevTree revTree = entry.getTree(); - treeWalk.addTree(revTree); + if (revTree != null) + { + treeWalk.addTree(revTree); + } + else + { + logger.error("could not find tree for {}", revId.name()); + } + treeWalk.setFilter(PathFilter.create(path)); if (treeWalk.next()) @@ -175,62 +188,33 @@ public class GitRepositoryBrowser implements RepositoryBrowser BrowserResult result = null; File directory = handler.getDirectory(repository); org.eclipse.jgit.lib.Repository repo = GitUtil.open(directory); - RevWalk revWalk = null; - TreeWalk treeWalk = null; try { ObjectId revId = GitUtil.getRevisionId(repo, revision); - treeWalk = new TreeWalk(repo); - revWalk = new RevWalk(repo); - treeWalk.addTree(revWalk.parseTree(revId)); - result = new BrowserResult(); - - List files = new ArrayList(); - - if (Util.isEmpty(path)) + if (revId != null) { - while (treeWalk.next()) - { - files.add(createFileObject(repo, revId, treeWalk)); - } + result = getResult(repo, revId, path); } else { - String[] parts = path.split("/"); - int current = 0; - int limit = parts.length; - - while (treeWalk.next()) + if (Util.isNotEmpty(revision)) { - String name = treeWalk.getNameString(); - - if (current >= limit) - { - String p = treeWalk.getPathString(); - - if (p.split("/").length > limit) - { - files.add(createFileObject(repo, revId, treeWalk)); - } - } - else if (name.equalsIgnoreCase(parts[current])) - { - current++; - treeWalk.enterSubtree(); - } + logger.error("could not find revision {}", revision); + } + else if (logger.isWarnEnabled()) + { + logger.warn("coul not find head of repository, empty?"); } - } - result.setFiles(files); - result.setRevision(revId.getName()); + result = new BrowserResult(Constants.HEAD, null, null, + new ArrayList()); + } } finally { GitUtil.close(repo); - GitUtil.release(revWalk); - GitUtil.release(treeWalk); } return result; @@ -328,6 +312,97 @@ public class GitRepositoryBrowser implements RepositoryBrowser return result; } + /** + * Method description + * + * + * @param repo + * @param revId + * @param path + * + * @return + * + * @throws IOException + */ + private BrowserResult getResult(org.eclipse.jgit.lib.Repository repo, + ObjectId revId, String path) + throws IOException + { + BrowserResult result = null; + RevWalk revWalk = null; + TreeWalk treeWalk = null; + + try + { + if (logger.isDebugEnabled()) + { + logger.debug("load repository browser for revision {}", revId.name()); + } + + treeWalk = new TreeWalk(repo); + revWalk = new RevWalk(repo); + + RevTree tree = revWalk.parseTree(revId); + + if (tree != null) + { + treeWalk.addTree(tree); + } + else + { + logger.error("could not find tree for {}", revId.name()); + } + + result = new BrowserResult(); + + List files = new ArrayList(); + + if (Util.isEmpty(path)) + { + while (treeWalk.next()) + { + files.add(createFileObject(repo, revId, treeWalk)); + } + } + else + { + String[] parts = path.split("/"); + int current = 0; + int limit = parts.length; + + while (treeWalk.next()) + { + String name = treeWalk.getNameString(); + + if (current >= limit) + { + String p = treeWalk.getPathString(); + + if (p.split("/").length > limit) + { + files.add(createFileObject(repo, revId, treeWalk)); + } + } + else if (name.equalsIgnoreCase(parts[current])) + { + current++; + treeWalk.enterSubtree(); + } + } + } + + result.setFiles(files); + result.setRevision(revId.getName()); + } + finally + { + GitUtil.release(revWalk); + GitUtil.release(treeWalk); + } + + return result; + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java index 231dc9e840..93e1991044 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java @@ -35,20 +35,20 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- -import java.io.File; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.RepositoryCache; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.TreeWalk; +import org.eclipse.jgit.util.FS; import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ +import java.io.File; import java.io.IOException; -import org.eclipse.jgit.lib.RepositoryCache; -import org.eclipse.jgit.util.FS; /** * @@ -71,6 +71,23 @@ public class GitUtil } } + /** + * Method description + * + * + * @param directory + * + * @return + * + * @throws IOException + */ + public static org.eclipse.jgit.lib.Repository open(File directory) + throws IOException + { + return RepositoryCache.open(RepositoryCache.FileKey.lenient(directory, + FS.DETECTED), true); + } + /** * Method description * @@ -118,24 +135,6 @@ public class GitUtil return date; } - - /** - * Method description - * - * - * @param directory - * - * @return - * - * @throws IOException - */ - public static org.eclipse.jgit.lib.Repository open(File directory) - throws IOException - { - return RepositoryCache.open(RepositoryCache.FileKey.lenient(directory, - FS.DETECTED), true); - } - /** * Method description * diff --git a/scm-webapp/src/main/webapp/resources/js/i18n/de.js b/scm-webapp/src/main/webapp/resources/js/i18n/de.js index 08ab9047c2..6895fe5259 100644 --- a/scm-webapp/src/main/webapp/resources/js/i18n/de.js +++ b/scm-webapp/src/main/webapp/resources/js/i18n/de.js @@ -224,10 +224,21 @@ if (Sonia.repository.ExtendedInfoPanel){ } if (Sonia.repository.RepositoryBrowser){ + Ext.override(Sonia.repository.RepositoryBrowser, { // german ?? - repositoryBrowserTitleText: 'Source: {0}' + repositoryBrowserTitleText: 'Source: {0}', + emptyText: 'In diesem Verzeichnis befinden sich keine Dateien' }); + +} + +if (Sonia.repository.ChangesetViewerGrid){ + + Ext.override(Sonia.repository.ChangesetViewerGrid, { + emptyText: 'Es konnten keine Commits gefunden werden' + }); + } // sonia.config.js diff --git a/scm-webapp/src/main/webapp/resources/js/repository/sonia.repository.changesetviewergrid.js b/scm-webapp/src/main/webapp/resources/js/repository/sonia.repository.changesetviewergrid.js index 71ccc5d4d5..a45d2da6d6 100644 --- a/scm-webapp/src/main/webapp/resources/js/repository/sonia.repository.changesetviewergrid.js +++ b/scm-webapp/src/main/webapp/resources/js/repository/sonia.repository.changesetviewergrid.js @@ -48,7 +48,8 @@ Sonia.repository.ChangesetViewerGrid = Ext.extend(Ext.grid.GridPanel, {
Tree: {0}
', tagsAndBranchesTemplate: '
{0}
\
{1}
', - + + emptyText: 'No commits available', initComponent: function(){ @@ -88,6 +89,10 @@ Sonia.repository.ChangesetViewerGrid = Ext.extend(Ext.grid.GridPanel, { hideHeaders: true, colModel: changesetColModel, loadMask: true, + viewConfig: { + deferEmptyText: false, + emptyText: this.emptyText + }, listeners: { click: { fn: this.onClick, diff --git a/scm-webapp/src/main/webapp/resources/js/repository/sonia.repository.repositorybrowser.js b/scm-webapp/src/main/webapp/resources/js/repository/sonia.repository.repositorybrowser.js index 7bb5137808..17f3eb7c0c 100644 --- a/scm-webapp/src/main/webapp/resources/js/repository/sonia.repository.repositorybrowser.js +++ b/scm-webapp/src/main/webapp/resources/js/repository/sonia.repository.repositorybrowser.js @@ -40,6 +40,8 @@ Sonia.repository.RepositoryBrowser = Ext.extend(Ext.grid.GridPanel, { iconDocument: 'resources/images/document.gif', templateIcon: '{1}', templateLink: '{0}', + + emptyText: 'This directory is empty', initComponent: function(){ @@ -113,6 +115,10 @@ Sonia.repository.RepositoryBrowser = Ext.extend(Ext.grid.GridPanel, { store: browserStore, colModel: browserColModel, loadMask: true, + viewConfig: { + deferEmptyText: false, + emptyText: this.emptyText + }, listeners: { click: { fn: this.onClick, From 9b26ede08d7fb3b0367adf25543953d244a4635a Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 25 Jul 2011 15:13:42 +0200 Subject: [PATCH 2/2] close branch issue-36