summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/gitblit/wicket
diff options
context:
space:
mode:
authorPaul Martin <paul@paulsputer.com>2015-10-10 12:46:51 +0100
committerPaul Martin <paul@paulsputer.com>2015-10-10 12:50:00 +0100
commitbd0e83e350fc703bcae72a28c41b09d9a9cec594 (patch)
treef9c3d5112600f89f64ded2d56472664db185750a /src/main/java/com/gitblit/wicket
parentf2a9b239d2605b36401dd723ac22c195b938f8e0 (diff)
downloadgitblit-bd0e83e350fc703bcae72a28c41b09d9a9cec594.tar.gz
gitblit-bd0e83e350fc703bcae72a28c41b09d9a9cec594.zip
Git-LFS support
+ Metadata maintained in append-only JSON file providing complete audit history. + Filestore menu item + Lists filestore items + Current size and availability + Link to GitBlit Filestore help page (top right) + Hooks into existing repository permissions + Uses default repository path for out-of-box operation with Git-LFS client + accessRestrictionFilter now has access to http method and auth header + Testing for servlet and manager
Diffstat (limited to 'src/main/java/com/gitblit/wicket')
-rw-r--r--src/main/java/com/gitblit/wicket/FilestoreUI.java62
-rw-r--r--src/main/java/com/gitblit/wicket/GitBlitWebApp.java16
-rw-r--r--src/main/java/com/gitblit/wicket/GitBlitWebApp.properties8
-rw-r--r--src/main/java/com/gitblit/wicket/GitblitWicketApp.java3
-rw-r--r--src/main/java/com/gitblit/wicket/pages/FilestorePage.html37
-rw-r--r--src/main/java/com/gitblit/wicket/pages/FilestorePage.java114
-rw-r--r--src/main/java/com/gitblit/wicket/pages/FilestoreUsage.html69
-rw-r--r--src/main/java/com/gitblit/wicket/pages/FilestoreUsage.java25
-rw-r--r--src/main/java/com/gitblit/wicket/pages/RootPage.java1
9 files changed, 333 insertions, 2 deletions
diff --git a/src/main/java/com/gitblit/wicket/FilestoreUI.java b/src/main/java/com/gitblit/wicket/FilestoreUI.java
new file mode 100644
index 00000000..8837ba18
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/FilestoreUI.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2015 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;
+
+import org.apache.wicket.markup.html.basic.Label;
+
+import com.gitblit.models.FilestoreModel;
+import com.gitblit.models.FilestoreModel.Status;
+
+/**
+ * Common filestore ui methods and classes.
+ *
+ * @author Paul Martin
+ *
+ */
+public class FilestoreUI {
+
+ public static Label getStatusIcon(String wicketId, FilestoreModel item) {
+ return getStatusIcon(wicketId, item.getStatus());
+ }
+
+ public static Label getStatusIcon(String wicketId, Status status) {
+ Label label = new Label(wicketId);
+
+ switch (status) {
+ case Upload_Pending:
+ WicketUtils.setCssClass(label, "fa fa-spinner fa-fw file-negative");
+ break;
+ case Upload_In_Progress:
+ WicketUtils.setCssClass(label, "fa fa-spinner fa-spin fa-fw file-positive");
+ break;
+ case Available:
+ WicketUtils.setCssClass(label, "fa fa-check fa-fw file-positive");
+ break;
+ case Deleted:
+ WicketUtils.setCssClass(label, "fa fa-ban fa-fw file-negative");
+ break;
+ case Unavailable:
+ WicketUtils.setCssClass(label, "fa fa-times fa-fw file-negative");
+ break;
+ default:
+ WicketUtils.setCssClass(label, "fa fa-exclamation-triangle fa-fw file-negative");
+ }
+ WicketUtils.setHtmlTooltip(label, status.toString());
+
+ return label;
+ }
+
+}
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java
index 359040b5..296c2544 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java
@@ -37,6 +37,7 @@ import com.gitblit.Keys;
import com.gitblit.extensions.GitblitWicketPlugin;
import com.gitblit.manager.IAuthenticationManager;
import com.gitblit.manager.IFederationManager;
+import com.gitblit.manager.IFilestoreManager;
import com.gitblit.manager.IGitblit;
import com.gitblit.manager.INotificationManager;
import com.gitblit.manager.IPluginManager;
@@ -63,6 +64,7 @@ import com.gitblit.wicket.pages.EditRepositoryPage;
import com.gitblit.wicket.pages.EditTicketPage;
import com.gitblit.wicket.pages.ExportTicketPage;
import com.gitblit.wicket.pages.FederationRegistrationPage;
+import com.gitblit.wicket.pages.FilestorePage;
import com.gitblit.wicket.pages.ForkPage;
import com.gitblit.wicket.pages.ForksPage;
import com.gitblit.wicket.pages.GitSearchPage;
@@ -131,6 +133,8 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
private final IGitblit gitblit;
private final IServicesManager services;
+
+ private final IFilestoreManager filestoreManager;
@Inject
public GitBlitWebApp(
@@ -145,7 +149,8 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
IProjectManager projectManager,
IFederationManager federationManager,
IGitblit gitblit,
- IServicesManager services) {
+ IServicesManager services,
+ IFilestoreManager filestoreManager) {
super();
this.publicKeyManagerProvider = publicKeyManagerProvider;
@@ -162,6 +167,7 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
this.federationManager = federationManager;
this.gitblit = gitblit;
this.services = services;
+ this.filestoreManager = filestoreManager;
}
@Override
@@ -238,6 +244,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
mount("/user", UserPage.class, "user");
mount("/forks", ForksPage.class, "r");
mount("/fork", ForkPage.class, "r");
+
+ // filestore URL
+ mount("/filestore", FilestorePage.class);
// allow started Wicket plugins to initialize
for (PluginWrapper pluginWrapper : pluginManager.getPlugins()) {
@@ -476,4 +485,9 @@ public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {
public static GitBlitWebApp get() {
return (GitBlitWebApp) WebApplication.get();
}
+
+ @Override
+ public IFilestoreManager filestore() {
+ return filestoreManager;
+ }
}
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
index d8027548..36c416e7 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
@@ -764,4 +764,10 @@ gb.deleteRepositoryHeader = Delete Repository
gb.deleteRepositoryDescription = Deleted repositories will be unrecoverable.
gb.show_whitespace = show whitespace
gb.ignore_whitespace = ignore whitespace
-gb.allRepositories = All Repositories \ No newline at end of file
+gb.allRepositories = All Repositories
+gb.oid = object id
+gb.filestore = filestore
+gb.filestoreStats = Filestore contains {0} files with a total size of {1}. ({2} remaining)
+gb.statusChangedOn = status changed on
+gb.statusChangedBy = status changed by
+gb.filestoreHelp = How to use the Filestore? \ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/GitblitWicketApp.java b/src/main/java/com/gitblit/wicket/GitblitWicketApp.java
index 3041c5da..fefa0f4a 100644
--- a/src/main/java/com/gitblit/wicket/GitblitWicketApp.java
+++ b/src/main/java/com/gitblit/wicket/GitblitWicketApp.java
@@ -8,6 +8,7 @@ import org.apache.wicket.markup.html.WebPage;
import com.gitblit.IStoredSettings;
import com.gitblit.manager.IAuthenticationManager;
import com.gitblit.manager.IFederationManager;
+import com.gitblit.manager.IFilestoreManager;
import com.gitblit.manager.IGitblit;
import com.gitblit.manager.INotificationManager;
import com.gitblit.manager.IPluginManager;
@@ -74,5 +75,7 @@ public interface GitblitWicketApp {
public abstract ITicketService tickets();
public abstract TimeZone getTimezone();
+
+ public abstract IFilestoreManager filestore();
} \ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/pages/FilestorePage.html b/src/main/java/com/gitblit/wicket/pages/FilestorePage.html
new file mode 100644
index 00000000..e373e704
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/pages/FilestorePage.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
+ xml:lang="en"
+ lang="en">
+
+<body>
+<wicket:extend>
+<div class="container">
+
+ <div class="markdown" style="padding: 10px 0px 5px 0px;">
+ <span wicket:id="repositoriesMessage">[repositories message]</span>
+ <span style="float:right"><a href="#" wicket:id="filestoreHelp"><span wicket:id="helpMessage">[help message]</span></a></span>
+ </div>
+
+ <table class="repositories">
+ <tr>
+ <th><wicket:message key="gb.status">[Object status]</wicket:message></th>
+ <th><wicket:message key="gb.statusChangedOn">[changedOn]</wicket:message></th>
+ <th><wicket:message key="gb.statusChangedBy">[changedBy]</wicket:message></th>
+ <th><wicket:message key="gb.oid">[Object ID]</wicket:message></th>
+ <th><wicket:message key="gb.size">[file size]</wicket:message></th>
+ </tr>
+ <tbody>
+ <tr wicket:id="fileRow">
+ <td><center><span class="list" wicket:id="status">[Object state]</span></center></td>
+ <td><span class="list" wicket:id="on">[changedOn]</span></td>
+ <td><span class="list" wicket:id="by">[changedBy]</span></td>
+ <td class="sha256"><span class="list" wicket:id="oid">[Object ID]</span></td>
+ <td><span class="list" wicket:id="size">[file size]</span></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+</wicket:extend>
+</body>
+</html> \ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/pages/FilestorePage.java b/src/main/java/com/gitblit/wicket/pages/FilestorePage.java
new file mode 100644
index 00000000..5f103edd
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/pages/FilestorePage.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2015 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.text.DateFormat;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.wicket.Component;
+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 com.gitblit.Constants;
+import com.gitblit.Keys;
+import com.gitblit.models.FilestoreModel;
+import com.gitblit.models.UserModel;
+import com.gitblit.wicket.FilestoreUI;
+import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.WicketUtils;
+
+/**
+ * Page to display the current status of the filestore.
+ * Certain errors also displayed to aid in fault finding
+ *
+ * @author Paul Martin
+ *
+ *
+ */
+public class FilestorePage extends RootPage {
+
+ public FilestorePage() {
+ super();
+ setupPage("", "");
+ // check to see if we should display a login message
+ boolean authenticateView = app().settings().getBoolean(Keys.web.authenticateViewPages, true);
+ if (authenticateView && !GitBlitWebSession.get().isLoggedIn()) {
+ String messageSource = app().settings().getString(Keys.web.loginMessage, "gitblit");
+ return;
+ }
+
+ final List<FilestoreModel> files = app().filestore().getAllObjects();
+ final long nBytesUsed = app().filestore().getFilestoreUsedByteCount();
+ final long nBytesAvailable = app().filestore().getFilestoreAvailableByteCount();
+
+ // Load the markdown welcome message
+ String messageSource = app().settings().getString(Keys.web.repositoriesMessage, "gitblit");
+ String message = MessageFormat.format(getString("gb.filestoreStats"), files.size(),
+ FileUtils.byteCountToDisplaySize(nBytesUsed), FileUtils.byteCountToDisplaySize(nBytesAvailable) );
+
+ Component repositoriesMessage = new Label("repositoriesMessage", message)
+ .setEscapeModelStrings(false).setVisible(message.length() > 0);
+
+ add(repositoriesMessage);
+
+ BookmarkablePageLink<Void> helpLink = new BookmarkablePageLink<Void>("filestoreHelp", FilestoreUsage.class);
+ helpLink.add(new Label("helpMessage", getString("gb.filestoreHelp")));
+ add(helpLink);
+
+
+ DataView<FilestoreModel> filesView = new DataView<FilestoreModel>("fileRow",
+ new ListDataProvider<FilestoreModel>(files)) {
+ private static final long serialVersionUID = 1L;
+ private int counter;
+
+ @Override
+ protected void onBeforeRender() {
+ super.onBeforeRender();
+ counter = 0;
+ }
+
+ @Override
+ public void populateItem(final Item<FilestoreModel> item) {
+ final FilestoreModel entry = item.getModelObject();
+
+ DateFormat dateFormater = new SimpleDateFormat(Constants.ISO8601);
+
+ UserModel user = app().users().getUserModel(entry.getChangedBy());
+ user = user == null ? UserModel.ANONYMOUS : user;
+
+ Label icon = FilestoreUI.getStatusIcon("status", entry);
+ item.add(icon);
+ item.add(new Label("on", dateFormater.format(entry.getChangedOn())));
+ item.add(new Label("by", user.getDisplayName()));
+
+ item.add(new Label("oid", entry.oid));
+ item.add(new Label("size", FileUtils.byteCountToDisplaySize(entry.getSize())));
+
+ WicketUtils.setAlternatingBackground(item, counter);
+ counter++;
+ }
+
+ };
+
+ add(filesView);
+ }
+}
diff --git a/src/main/java/com/gitblit/wicket/pages/FilestoreUsage.html b/src/main/java/com/gitblit/wicket/pages/FilestoreUsage.html
new file mode 100644
index 00000000..e9bff47c
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/pages/FilestoreUsage.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
+ xml:lang="en"
+ lang="en">
+
+<body>
+<wicket:extend>
+<div class="container">
+<div class="markdown">
+<div class="row">
+<div class="span10 offset1">
+
+ <div class="alert alert-danger">
+ <h3><center>Using the Filestore</center></h3>
+ <p>
+ <strong>All clients intending to use the filestore must first install the <a href="https://git-lfs.github.com/">Git-LFS Client</a> and then run <code>git lfs init</code> to register the hooks globally.</strong><br/>
+ <i>This version of GitBlit has been verified with Git-LFS client version 0.6.0 which requires Git v1.8.2 or higher.</i>
+ </p>
+ </div>
+
+ <h3>Clone</h3>
+ <p>
+ Just <code>git clone</code> as usual, no further action is required as GitBlit is configured to use the default Git-LFS end point <code>{repository}/info/lfs/objects/</code>.<br/>
+ <i>If the repository uses a 3rd party Git-LFS server you will need to <a href="https://github.com/github/git-lfs/blob/master/docs/spec.md#the-server">manually configure the correct endpoints</a></i>.
+ </p>
+
+ <h3>Add</h3>
+ <p>After configuring the file types or paths to be tracked using <code>git lfs track "*.bin"</code> just add files as usual with <code>git add</code> command.<br/>
+ <i>Tracked files can also be configured manually using the <code>.gitattributes</code> file</i>.</p>
+
+ <h3>Remove</h3>
+ <p>When you remove a Git-LFS tracked file only the pointer file will be removed from your repository.<br/>
+ <i>All files remain on the server to allow previous versions to be checked out.</i>
+ </p>
+
+ <h3>Learn more...</h3>
+ <p><a href="https://github.com/github/git-lfs/blob/master/docs/spec.md">See the current Git-LFS specification for further details</a>.</p>
+ <br />
+
+ <div class="alert alert-warn">
+ <h3><center>Limitations & Warnings</center></h3>
+ <p>GitBlit currently provides a server-only implementation of the opensource Git-LFS API, <a href="https://github.com/github/git-lfs/wiki/Implementations">other implementations</a> are available.<br/>
+ However, until <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=470333">JGit provides Git-LFS client capabilities</a> some GitBlit features may not be fully supported when using the filestore.
+ Notably:
+ <ul>
+ <li>Mirroring a repository that uses Git-LFS - Only the pointer files, not the large files, are mirrored.</li>
+ <li>Federation - Only the pointer files, not the large files, are transfered.</li>
+ </ul>
+ </p>
+ </div>
+
+ <div class="alert alert-info">
+ <h3><center>GitBlit Configuration</center></h3>
+ <p>GitBlit provides the following configuration items when using the filestore:
+ <h4>filestore.storageFolder</h4>
+ <p>Defines the path on the server where filestore objects are to be saved. This defaults to <code>${baseFolder}/lfs</code></p>
+ <h4>filestore.maxUploadSize</h4>
+ <p>Defines the maximum allowable size that can be uploaded to the filestore. Once a file is uploaded it will be unaffected by later changes in this property. This defaults to <code>-1</code> indicating no limits.</p>
+ </p>
+ </div>
+
+</div>
+</div>
+</div>
+</div>
+</wicket:extend>
+</body>
+</html>
diff --git a/src/main/java/com/gitblit/wicket/pages/FilestoreUsage.java b/src/main/java/com/gitblit/wicket/pages/FilestoreUsage.java
new file mode 100644
index 00000000..9bd8e55d
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/pages/FilestoreUsage.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015 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;
+
+public class FilestoreUsage extends RootSubPage {
+
+ public FilestoreUsage() {
+ super();
+ setupPage("", "");
+ }
+
+}
diff --git a/src/main/java/com/gitblit/wicket/pages/RootPage.java b/src/main/java/com/gitblit/wicket/pages/RootPage.java
index 79a4fc67..93d44fc7 100644
--- a/src/main/java/com/gitblit/wicket/pages/RootPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/RootPage.java
@@ -191,6 +191,7 @@ public abstract class RootPage extends BasePage {
}
navLinks.add(new PageNavLink("gb.repositories", RepositoriesPage.class,
getRootPageParameters()));
+ navLinks.add(new PageNavLink("gb.filestore", FilestorePage.class, getRootPageParameters()));
navLinks.add(new PageNavLink("gb.activity", ActivityPage.class, getRootPageParameters()));
if (allowLucene) {
navLinks.add(new PageNavLink("gb.search", LuceneSearchPage.class));