From 5c284113a1a458db0d3440de351034503b3d52b3 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 11 Jul 2011 16:29:20 -0400
Subject: [PATCH] Optionally display repository on-disk size on repositories page.
---
src/com/gitblit/GitBlit.java | 13 ++++++
docs/04_releases.mkd | 13 +++++-
src/com/gitblit/wicket/panels/RepositoriesPanel.html | 4 +
distrib/gitblit.properties | 7 +++
docs/00_index.mkd | 7 +--
src/com/gitblit/utils/FileUtils.java | 24 ++++++++++++
src/com/gitblit/wicket/panels/RepositoriesPanel.java | 35 +++++++++++++----
src/com/gitblit/Constants.java | 4 +-
8 files changed, 89 insertions(+), 18 deletions(-)
diff --git a/distrib/gitblit.properties b/distrib/gitblit.properties
index 953baa1..2ae3d01 100644
--- a/distrib/gitblit.properties
+++ b/distrib/gitblit.properties
@@ -97,6 +97,13 @@
# SINCE 0.5.0
web.syndicationEntries = 25
+# Show the size of each repository on the repositories page.
+# This requires recursive traversal of each repository folder. This may be
+# non-performant on some operating systems and/or filesystems.
+#
+# SINCE 0.5.2
+web.showRepositorySizes = true
+
# This is the message display above the repositories table.
# This can point to a file with Markdown content.
# Specifying "gitblit" uses the internal welcome message.
diff --git a/docs/00_index.mkd b/docs/00_index.mkd
index d645793..edb058d 100644
--- a/docs/00_index.mkd
+++ b/docs/00_index.mkd
@@ -21,11 +21,10 @@
### Current Release
-%VERSION% ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)) based on [%JGIT%][jgit] *released %BUILDDATE%*
+**%VERSION%** ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)) based on [%JGIT%][jgit] *released %BUILDDATE%*
-- clarified SSL certificate generation and configuration for both server-side and client-side
-- added some more troubleshooting information to documentation
-- replaced JavaService with Apache Commons Daemon
+- optionally display repository on-disk size on repositories page<br/>**New:** *web.showRepositorySizes = true*
+- tone-down repository group header color
issues & binaries @ [Google Code][googlecode]<br/>
sources @ [Github][gitbltsrc]
diff --git a/docs/04_releases.mkd b/docs/04_releases.mkd
index debab78..94aaa1a 100644
--- a/docs/04_releases.mkd
+++ b/docs/04_releases.mkd
@@ -1,13 +1,20 @@
## Release History
### Current Release
-%VERSION% ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)) based on [%JGIT%][jgit] *released %BUILDDATE%*
+**%VERSION%** ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)) based on [%JGIT%][jgit] *released %BUILDDATE%*
+
+- optionally display repository on-disk size on repositories page<br/>**New:** *web.showRepositorySizes = true*
+- tone-down repository group header color
+
+### Older Releases
+**0.5.1** ([go](http://code.google.com/p/gitblit/downloads/detail?name=gitblit-0.5.1.zip)|[war](http://code.google.com/p/gitblit/downloads/detail?name=gitblit-0.5.1.war)) based on [JGit 1.0.0 (201106090707-r)][jgit] *released 2006-06-28*
- clarified SSL certificate generation and configuration for both server-side and client-side
- added some more troubleshooting information to documentation
- replaced JavaService with Apache Commons Daemon
-### Older Releases
-0.5.0 ([go](http://code.google.com/p/gitblit/downloads/detail?name=gitblit-0.5.0.zip)|[war](http://code.google.com/p/gitblit/downloads/detail?name=gitblit-0.5.0.war)) based on [JGit 1.0.0 (201106090707-r)][jgit] *released 2006-06-26*
+**0.5.0** ([go](http://code.google.com/p/gitblit/downloads/detail?name=gitblit-0.5.0.zip)|[war](http://code.google.com/p/gitblit/downloads/detail?name=gitblit-0.5.0.war)) based on [JGit 1.0.0 (201106090707-r)][jgit] *released 2006-06-26*
+
+- initial release
[jgit]: http://eclipse.org/jgit "Eclipse JGit Site"
\ No newline at end of file
diff --git a/src/com/gitblit/Constants.java b/src/com/gitblit/Constants.java
index 08ffb9b..766f7c2 100644
--- a/src/com/gitblit/Constants.java
+++ b/src/com/gitblit/Constants.java
@@ -29,11 +29,11 @@
// The build script extracts this exact line so be careful editing it
// and only use A-Z a-z 0-9 .-_ in the string.
- public static final String VERSION = "0.5.1";
+ public static final String VERSION = "0.5.2-SNAPSHOT";
// The build script extracts this exact line so be careful editing it
// and only use A-Z a-z 0-9 .-_ in the string.
- public static final String VERSION_DATE = "2011-06-28";
+ public static final String VERSION_DATE = "PENDING";
// The build script extracts this exact line so be careful editing it
// and only use A-Z a-z 0-9 .-_ in the string.
diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java
index 9fe6d20..968034d 100644
--- a/src/com/gitblit/GitBlit.java
+++ b/src/com/gitblit/GitBlit.java
@@ -32,11 +32,13 @@
import org.apache.wicket.protocol.http.WebResponse;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryCache.FileKey;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.transport.resolver.FileResolver;
import org.eclipse.jgit.transport.resolver.RepositoryResolver;
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
+import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -451,6 +453,17 @@
}
/**
+ * Returns the size in bytes of the repository.
+ *
+ * @param model
+ * @return size in bytes
+ */
+ public long calculateSize(RepositoryModel model) {
+ File gitDir = FileKey.resolve(new File(repositoriesFolder, model.name), FS.DETECTED);
+ return com.gitblit.utils.FileUtils.folderSize(gitDir);
+ }
+
+ /**
* Returns the gitblit string vlaue for the specified key. If key is not
* set, returns defaultValue.
*
diff --git a/src/com/gitblit/utils/FileUtils.java b/src/com/gitblit/utils/FileUtils.java
index 468b2a8..ce8cdf9 100644
--- a/src/com/gitblit/utils/FileUtils.java
+++ b/src/com/gitblit/utils/FileUtils.java
@@ -56,4 +56,28 @@
}
return sb.toString();
}
+
+ /**
+ * Recursively traverses a folder and its subfolders to calculate the total
+ * size in bytes.
+ *
+ * @param directory
+ * @return folder size in bytes
+ */
+ public static long folderSize(File directory) {
+ if (directory == null || !directory.exists()) {
+ return -1;
+ }
+ if (directory.isFile()) {
+ return directory.length();
+ }
+ long length = 0;
+ for (File file : directory.listFiles()) {
+ if (file.isFile())
+ length += file.length();
+ else
+ length += folderSize(file);
+ }
+ return length;
+ }
}
diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.html b/src/com/gitblit/wicket/panels/RepositoriesPanel.html
index 7e090e8..a4f5d12 100644
--- a/src/com/gitblit/wicket/panels/RepositoriesPanel.html
+++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.html
@@ -57,6 +57,7 @@
<wicket:message key="gb.repository">Repository</wicket:message>
</th>
<th><wicket:message key="gb.description">Description</wicket:message></th>
+ <th></th>
<th><wicket:message key="gb.owner">Owner</wicket:message></th>
<th></th>
<th><wicket:message key="gb.lastChange">Last Change</wicket:message></th>
@@ -65,12 +66,13 @@
</wicket:fragment>
<wicket:fragment wicket:id="groupRepositoryRow">
- <td colspan="6"><span wicket:id="groupName">[group name]</span></td>
+ <td colspan="7"><span wicket:id="groupName">[group name]</span></td>
</wicket:fragment>
<wicket:fragment wicket:id="repositoryRow">
<td class="left"><div class="list" wicket:id="repositoryName">[repository name]</div></td>
<td><div class="list" wicket:id="repositoryDescription">[repository description]</div></td>
+ <td style="text-align: right;padding-right:15px;"><span style="font-size:0.8em;" wicket:id="repositorySize">[repository size]</span></td>
<td class="author"><span wicket:id="repositoryOwner">[repository owner]</span></td>
<td style="text-align: right;padding-right:10px;"><img class="inlineIcon" wicket:id="ticketsIcon" /><img class="inlineIcon" wicket:id="docsIcon" /><img class="inlineIcon" wicket:id="frozenIcon" /><img class="inlineIcon" wicket:id="accessRestrictionIcon" /></td>
<td><span wicket:id="repositoryLastChange">[last change]</span></td>
diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
index c744148..fa6c661 100644
--- a/src/com/gitblit/wicket/panels/RepositoriesPanel.java
+++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -47,6 +47,7 @@
import com.gitblit.SyndicationServlet;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
+import com.gitblit.utils.ByteFormat;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.TimeUtils;
import com.gitblit.wicket.GitBlitWebSession;
@@ -71,19 +72,30 @@
add(adminLinks.setVisible(showAdmin));
if (GitBlit.getString(Keys.web.repositoryListType, "flat").equalsIgnoreCase("grouped")) {
+ List<RepositoryModel> rootRepositories = new ArrayList<RepositoryModel>();
Map<String, List<RepositoryModel>> groups = new HashMap<String, List<RepositoryModel>>();
for (RepositoryModel model : models) {
String rootPath = StringUtils.getRootPath(model.name);
- if (StringUtils.isEmpty(rootPath)) {
- rootPath = GitBlit.getString(Keys.web.repositoryRootGroupName, " ");
+ if (StringUtils.isEmpty(rootPath)) {
+ // root repository
+ rootRepositories.add(model);
+ } else {
+ // non-root, grouped repository
+ if (!groups.containsKey(rootPath)) {
+ groups.put(rootPath, new ArrayList<RepositoryModel>());
+ }
+ groups.get(rootPath).add(model);
}
- if (!groups.containsKey(rootPath)) {
- groups.put(rootPath, new ArrayList<RepositoryModel>());
- }
- groups.get(rootPath).add(model);
}
List<String> roots = new ArrayList<String>(groups.keySet());
Collections.sort(roots);
+
+ if (rootRepositories.size() > 0) {
+ // inject the root repositories at the top of the page
+ String rootPath = GitBlit.getString(Keys.web.repositoryRootGroupName, " ");
+ roots.add(0, rootPath);
+ groups.put(rootPath, rootRepositories);
+ }
List<RepositoryModel> groupedModels = new ArrayList<RepositoryModel>();
for (String root : roots) {
List<RepositoryModel> subModels = groups.get(root);
@@ -95,6 +107,8 @@
dp = new SortableRepositoriesProvider(models);
}
+ final boolean showSize = GitBlit.getBoolean(Keys.web.showRepositorySizes, true);
+ final ByteFormat byteFormat = new ByteFormat();
DataView<RepositoryModel> dataView = new DataView<RepositoryModel>("row", dp) {
private static final long serialVersionUID = 1L;
int counter;
@@ -123,11 +137,16 @@
pp));
row.add(new LinkPanel("repositoryDescription", "list", entry.description,
SummaryPage.class, pp));
+ if (showSize) {
+ row.add(new Label("repositorySize", byteFormat.format(GitBlit.self().calculateSize(entry))));
+ } else {
+ row.add(new Label("repositorySize").setVisible(false));
+ }
} else {
// New repository
- row.add(new Label("repositoryName", entry.name
- + "<span class='empty'>(empty)</span>").setEscapeModelStrings(false));
+ row.add(new Label("repositoryName", entry.name));
row.add(new Label("repositoryDescription", entry.description));
+ row.add(new Label("repositorySize", "<span class='empty'>(empty)</span>").setEscapeModelStrings(false));
}
if (entry.useTickets) {
--
Gitblit v1.9.1