Gitblit\r
=================\r
\r
-Gitblit is an open source, pure Java Git solution.\r
-\r
-Gitblit can be found at: http://gitblit.com and is licensed under\r
-the Apache Software Foundation license, version 2.0.\r
-\r
-Contents\r
---------\r
- - License\r
- - Java/Application server requirements\r
- - Getting help\r
- - Building Gitblit\r
- \r
+Gitblit is an open source, pure Java Git solution for creating, viewing, and serving [Git](http://git-scm.com) repositories.<br/>\r
+More information about Gitblit can be found [here](http://gitblit.com).\r
+\r
License\r
-------\r
\r
Getting help\r
------------\r
\r
- - Read the online documentation available on the Gitblit website\r
- (http://gitblit.com)\r
+Read the online documentation available at the [Gitblit website](http://gitblit.com)\r
\r
Building Gitblit\r
----------------\r
2. Using Ant, execute the `build.xml` script in the project root.<br/>\r
*This will download all necessary build dependencies and will also generate the Keys class for accessing settings.*\r
3. Select your gitblit project root and **Refresh** the project, this should correct all build problems.\r
-4. Review the settings in `gitblit.properties` in your project root.<br/>\r
-Make sure you set an appropriate value for *git.repositoriesFolder*. \r
-5. Execute the *com.gitblit.Launcher* class to start Gitblit. \r
-
\ No newline at end of file
+4. Using JUnit, execute the `com.gitblit.tests.GitBlitSuite` test suite.<br/>\r
+*This will clone some repositories from the web and run through the unit tests.*\r
+5. Execute the *com.gitblit.Launcher* class to start Gitblit.
\ No newline at end of file
<replacestring from="";" to="" />\r
<trim />\r
</tokenfilter>\r
- </filterchain> \r
+ </filterchain>\r
</loadfile>\r
\r
<!-- extract JGit version number from source code -->\r
</fileset>\r
</copy>\r
\r
+ <!-- Copy google-code-prettify -->\r
+ <mkdir dir="${basedir}/src/com/gitblit/wicket/pages/prettify" />\r
+ <copy todir="${basedir}/site/prettify">\r
+ <fileset dir="${basedir}/src/com/gitblit/wicket/pages/prettify">\r
+ <exclude name="thumbs.db" />\r
+ </fileset>\r
+ </copy>\r
+\r
<!-- Copy screenshot thumbnails -->\r
<mkdir dir="${basedir}/site/thumbs" />\r
<copy todir="${basedir}/site/thumbs">\r
\r
<arg value="--alias" />\r
<arg value="index=overview" />\r
+ \r
+ <arg value="--alias" />\r
+ <arg value="properties=gitblit.properties" />\r
\r
<arg value="--substitute" />\r
<arg value="%VERSION%=${gb.version}" />\r
\r
<arg value="--substitute" />\r
<arg value="%JGIT%=${jgit.version}" />\r
+\r
+ <arg value="--load" />\r
+ <arg value="%PROPERTIES%=${basedir}/distrib/gitblit.properties" />\r
+\r
</java>\r
\r
- <!-- Cleanup --> \r
+ <!-- Cleanup -->\r
<delete dir="${project.build.dir}" />\r
</target>\r
</project>\r
#\r
\r
# Allow push/pull over http/https with JGit servlet\r
+# Changing this value requires a server restart.\r
git.enableGitServlet = true\r
\r
# Base folder for repositories\r
+# Changing this value requires a server restart.\r
# Use forward slashes even on Windows!!\r
+# e.g. c:/gitrepos\r
git.repositoriesFolder = git\r
\r
# Export all repositories\r
+# Changing this value requires a server restart.\r
# if false, each exported repository must have a .git/git-daemon-export-ok file\r
git.exportAll = true\r
\r
# Search repositories folder for nested repositories\r
-# e.g. /libraries/mylibrary.git\r
+# e.g. c:/gitrepos/libraries/mylibrary.git\r
git.nestedRepositories = true\r
\r
#\r
#\r
\r
# Require authentication to see everything but the admin pages\r
+# Changing this value requires a server restart.\r
web.authenticateViewPages = false\r
\r
# Require admin authentication for the admin functions and pages\r
+# Changing this value requires a server restart.\r
web.authenticateAdminPages = true\r
\r
# Simple user realm file to authenticate users\r
+# Changing this value requires a server restart.\r
realm.realmFile = users.properties\r
\r
# How to store passwords.\r
# If blank Gitblit is displayed.\r
web.siteName =\r
\r
-# If web.authenticate=true, users with "admin" role can create repositories,\r
-# create users, and edit repository metadata (owner, description, etc)\r
+# If web.authenticateAdminPages=true, users with "admin" role can create\r
+# repositories, create users, and edit repository metadata.\r
#\r
-# If web.authenticate=false, any user can execute the aforementioned functions. \r
+# If web.authenticateAdminPages=false, any user can execute the aforementioned\r
+# functions. \r
web.allowAdministration = true\r
\r
# Allow dyanamic zip downloads. \r
\r
# Use the client timezone when formatting dates.\r
# This uses AJAX to determine the browser's timezone.\r
+# Changing this value requires a server restart.\r
web.useClientTimezone = false\r
\r
# Date and Time formats\r
+# http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html\r
web.datestampShortFormat = yyyy-MM-dd\r
web.datetimestampLongFormat = EEEE, MMMM d, yyyy h:mm a z\r
\r
# Show other URLs on the summary page for accessing your git repositories\r
# Use spaces to separate urls. {0} is the token for the repository name.\r
+# e.g.\r
# web.otherUrls = ssh://localhost/git/{0} git://localhost/git/{0}\r
web.otherUrls = \r
\r
# Choose how to present the repositories list.\r
-# grouped = group nested/subfolder repositories together (no sorting)\r
-# flat = flat list of repositories (sorting allowed)\r
+# grouped = group nested/subfolder repositories together (no sorting)\r
+# flat = flat list of repositories (sorting allowed)\r
web.repositoryListType = grouped\r
\r
# If using a grouped repository list and there are repositories at the\r
web.showSearchTypeSelection = false\r
\r
# Generates a line graph of repository activity over time on the Summary page.\r
-# This is a real-time graph so generation may be expensive. \r
+# This uses the Google Charts API. \r
web.generateActivityGraph = true\r
\r
# The number of commits to display on the summary page\r
web.itemsPerPage = 50\r
\r
# Registered extensions for google-code-prettify\r
+# (case-insensitive)\r
web.prettyPrintExtensions = c cpp cs css htm html java js php pl prefs properties py rb sh sql xml vb\r
\r
# Registered extensions for markdown transformation\r
-web.markdownExtensions = md mkd markdown\r
+# (CASE-SENSITIVE)\r
+web.markdownExtensions = md mkd markdown MD MKD\r
\r
# Image extensions\r
+# (case-insensitive)\r
web.imageExtensions = bmp jpg gif png \r
\r
# Registered extensions for binary blobs\r
+# (case-insensitive)\r
web.binaryExtensions = jar pdf tar.gz zip\r
\r
# Aggressive heap management will run the garbage collector on every generated\r
-# page. This slows down page generation but improves heap consumption. \r
+# page. This slows down page generation a little but improves heap consumption. \r
web.aggressiveHeapManagement = true\r
\r
# Run the webapp in debug mode\r
+# Changing this value requires a server restart.\r
web.debugMode = false\r
\r
# Enable/disable global regex substitutions (i.e. shared across repositories)\r
#\r
# Server Settings\r
#\r
+# Changing any of these values requires a server restart.\r
+\r
+# The temporary folder to decompress the gitblit webapp. \r
server.tempFolder = temp\r
+\r
+# The common log4j logging pattern\r
+# http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html\r
server.log4jPattern = %-5p %d{MM-dd HH:mm:ss.SSS} %-20.20c{1} %m%n\r
+\r
+# Alternatively, you may specify a logging pattern for your OS.\r
+# If the os pattern is blank, the common pattern is used.\r
+\r
+# This windows pattern fits (mostly) within the fixed bounds of a command prompt.\r
server.log4jPattern.windows = %-5p %m%n\r
+\r
server.log4jPattern.linux =\r
\r
\r
\r
# Specify the interface for Jetty to bind the standard connector.\r
# You may specify an ip or an empty value to bind to all interfaces.\r
-# Specifying localhost will result in Git:Blit ONLY listening to requests to\r
+# Specifying localhost will result in Gitblit ONLY listening to requests to\r
# localhost.\r
server.httpBindInterface = localhost\r
\r
# Specify the interface for Jetty to bind the secure connector.\r
# You may specify an ip or an empty value to bind to all interfaces.\r
-# Specifying localhost will result in Git:Blit ONLY listening to requests to\r
+# Specifying localhost will result in Gitblit ONLY listening to requests to\r
# localhost.\r
server.httpsBindInterface = localhost\r
\r
# Keystore password and certificate password must match.\r
# This is provided for convenience, its probably more secure to set this value\r
# using the --storePassword command line parameter.\r
-server.storePassword = dosomegit\r
+server.storePassword = gitblit\r
\r
# Port for shutdown monitor to listen on.\r
server.shutdownPort = 8081\r
- [JSch - Java Secure Channel](http://www.jcraft.com/jsch) (BSD)\r
- [JUnit](http://junit.org) (Common Public License)\r
\r
-## Building\r
+## Building from Source\r
[Eclipse](http://eclipse.org) is recommended for development as the project settings are preconfigured.\r
\r
-Additionally, [Google CodePro AnalytiX](http://code.google.com/javadevtools), [eclipse-cs](http://eclipse-cs.sourceforge.net), and [FindBugs](http://findbugs.sourceforge.net) are recommended development tools.\r
+Additionally, [Google CodePro AnalytiX](http://code.google.com/javadevtools), [eclipse-cs](http://eclipse-cs.sourceforge.net), [FindBugs](http://findbugs.sourceforge.net), and [EclEmma](http://www.eclemma.org) are recommended development tools.\r
\r
1. Clone the git repository from [Github][gitbltsrc].\r
2. Import the gitblit project into your Eclipse workspace.<br/>\r
3. Using Ant, execute the `build.xml` script in the project root.<br/>\r
*This will download all necessary build dependencies and will also generate the Keys class for accessing settings.*\r
4. Select your gitblit project root and **Refresh** the project, this should correct all build problems.\r
-5. Review the settings in `gitblit.properties` in your project root.<br/>\r
-Make sure you set an appropriate value for *git.repositoriesFolder*. \r
+5. Using JUnit, execute the `com.gitblit.tests.GitBlitSuite` test suite.<br/>\r
+*This will clone some repositories from the web and run through the unit tests.*\r
+5. Review the settings in `gitblit.properties` in your project root.\r
+ - By default, the *git.repositoriesFolder* points to the repositories cloned by the test suite.<br/>\r
+ - If running on Linux you may have to change the served port(s) to > 1024 unless you are developing as the root user. \r
6. Execute the *com.gitblit.Launcher* class to start Gitblit.\r
\r
[jgit]: http://eclipse.org/jgit "Eclipse JGit Site"\r
-## Setup and Configuration\r
+## Server Setup and Configuration\r
\r
1. Download and unzip [Gitblit %VERSION%](http://gitblit.com/%DISTRIBUTION%).<br/>\r
*Its best to eliminate spaces in the path name as that can cause troubleshooting headaches.* \r
\r
**Example**\r
\r
- java -jar gitblit.jar --realmFile c:\myrealm.txt --storePassword something
\ No newline at end of file
+ java -jar gitblit.jar --realmFile c:\myrealm.txt --storePassword something\r
+ \r
+## Client Setup and Configuration\r
+### Https with Self-Signed Certificates\r
+You must tell Git not to verify the self-signed certificate in order to perform any remote Git operations.\r
+\r
+- Eclipse/EGit\r
+ 1. Window->Preferences->Team->Git->Configuration\r
+ 2. Click the *New Entry* button\r
+ 3. <pre>Key = *http.sslVerify* \r
+ Value = *false*</pre>\r
+- Command-line Git ([Git-Config Manual Page](http://www.kernel.org/pub/software/scm/git/docs/git-config.html))\r
+ <pre>git-config --global --bool --add http.sslVerify false</pre>\r
+\r
+### Cloning an Access Restricted Repository \r
+- Eclipse/Egit<br/>Nothing special to configure, EGit figures out everything.\r
+ <pre>https://yourserver/git/your/repository</pre>\r
+- Command-line Git<br/>*My testing indicates that your username must be embedded in the url. YMMV.*\r
+ <pre>https://username@yourserver/git/your/repository</pre>\r
+
\ No newline at end of file
+++ /dev/null
-## Eclipse Tips\r
-\r
-### Do Not Verify Self-Signed Certificates\r
-If you are using a self-signed certificate, like the one that is automatically generated by Gitblit, you have to tell Eclipse/EGit to ignore certificate verification errors.\r
-\r
-![sslverify](sslverify.png "http.sslVerify setting")\r
-\r
-![sslverify2](sslverify2.png "Adding http.sslVerify setting") \r
-\r
-### Pushing a New Project to a New Gitblit Repository\r
-1. Project Root->Team->Share->Git\r
-Create a Git repository inside the project\r
-\r
-### Pushing a Git-Controlled Project to another Gitblit Repository\r
-1. Project Root->Team->Remote->Push\r
-2. Enter the URL information of the repository\r
-3. In the Refspec dialog click the buttons named "All all branches spec" and "All all tags spec"\r
-\r
-## Frequently Asked Questions\r
+## Troubleshooting\r
+\r
+### Eclipse/Egit/Git complains that it "can't open upload pack"?\r
+There are a few ways this can occur:\r
+\r
+1. You are using https with a self-signed certificate and you **did not** configure *http.sslVerify=false*\r
+ 1. Window->Preferences->Team->Git->Configuration\r
+ 2. Click the *New Entry* button\r
+ 3. <pre>Key = *http.sslVerify* \r
+ Value = *false*</pre>\r
+2. The repository is clone-restricted and you don't have access.\r
+3. The repository is clone-restricted and your password changed.\r
+4. A regression in Gitblit. :(\r
+\r
+### Why can't I access Gitblit from another machine?\r
+Please check *server.httpBindInterface* and *server.httpsBindInterface* in `gitblit.properties`.\r
+\r
+### How do I run Gitblit on port 80 or 443 in Linux?\r
+Linux requires root permissions to serve on ports < 1024.<br/>\r
+Run the server as *root* (security concern) or change the ports you are serving to 8080 (http) and/or 8443 (https). \r
+\r
+## General Interest Questions\r
\r
### Gitblit? What kind of name is that?\r
-Its a phonetic play on [bitblt][bitblt] which is an image processing operation meaning *bit-block transfer*.\r
+It's a phonetic play on [bitblt][bitblt] which is an image processing operation meaning *bit-block transfer*.\r
\r
### Why use Gitblit?\r
-Its small. Its portable. Its easy to manage.\r
+It's a small tool that allows you to easily manage shared repositories and doesn't require alot of setup or git kung-foo.\r
\r
### Do I need real Git?\r
No. Gitblit is based on [JGit][jgit] which is a pure Java implementation of the [Git version control system][git].<br/>\r
### Do I need a JDK or can I use a JRE?\r
Gitblit will run just fine with a JRE. Gitblit can optionally use `keytool` from the JDK to generate self-signed certificates, but normally Gitblit uses [BouncyCastle][bouncycastle] for that need.\r
\r
+### I want to deploy Gitblit into my own servlet container. Where is the WAR?\r
+At this time there is no WAR build available.\r
+\r
### Does Gitblit use a database to store its data?\r
No. Gitblit stores its repository configuration information within the `.git/config` file and its user information in `users.properties` or whatever filename is configured in `gitblit.properties`.\r
\r
-### I want to deploy Gitblit into my own servlet container. Where is the WAR?\r
-At this time there is no WAR build available.\r
+### Can I manually edit users.properties, gitblit.properties, or .git/config?\r
+Yes. You can manually manipulate all of them and (most) changes will be immediately available to Gitblit.<br/>Exceptions to this are noted in `gitblit.properties`.\r
+\r
+*NOTE:* Care must be taken to preserve the relationship between user roles and repository names.<br/>Please see the [setup](/setup.html) page for details.\r
\r
### Can I restrict access to paths within a repository?\r
No. Access restrictions apply to the repository as a whole.\r
\r
### Why doesn't Gitblit support SSH?\r
Gitblit could integrate [Apache Mina][mina] to provide SSH access. However, doing so violates Gitblit's first design principle: [KISS](http://en.wikipedia.org/wiki/KISS_principle).<br/>\r
-SSH support requires creating, exchanging, and managing SSH keys. While this is possible, JGit's SmartHTTP implementation is a simpler and cleaner transport mechanism.\r
+SSH support requires creating, exchanging, and managing SSH keys. While this is possible, JGit's SmartHTTP implementation is a simpler and universal transport mechanism.\r
\r
You might consider running [Gerrit](http://gerrit.googlecode.org) which does integrate [Apache Mina][mina] and supports SSH or you might consider serving [Git][git] on Linux which would offer real SSH support and also allow use of [many other compelling Git solutions](https://git.wiki.kernel.org/index.php/InterfacesFrontendsAndTools).\r
\r
\r
Alternatively, you could enable the search type dropdown list in your `gitblit.properties` file.\r
\r
-### How do I run Gitblit on port 80 or 443 in Linux?\r
-Linux requires root permissions to serve on ports < 1024.<br/>\r
-Run the server as *root* (security concern) or change the ports you are serving to 8080 (http) and/or 8443 (https). \r
+### I see a disabled "blame" link. How do I enable it? \r
+Currently blame is not implemented. Those links are placeholders to remind me where Gitweb offers blame.\r
\r
[bitblt]: http://en.wikipedia.org/wiki/Bit_blit "Wikipedia Bitblt"\r
[jgit]: http://eclipse.org/jgit "Eclipse JGit Site"\r
--- /dev/null
+## gitblit.properties\r
+<pre class='prettyprint'>\r
+%PROPERTIES%\r
+</pre>
\ No newline at end of file
<meta name="ROBOTS" content="INDEX, NOFOLLOW">\r
<meta http-equiv="imagetoolbar" content="no" />\r
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+ <meta name="keywords" content="java git server" />\r
\r
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>\r
<script>\r
list-style: none;\r
'}'\r
</style>\r
+ \r
+ <script type="text/javascript" src="prettify/prettify.js"></script>\r
+ <link href="prettify/prettify.css" type="text/css" rel="stylesheet" /> \r
</head>\r
- <body>\r
+ <body onload="prettyPrint()">\r
<div class="page_header">\r
<a title="gitblit homepage" href="http://gitblit.com/">\r
<img src="./gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>\r
downloadFromApache(MavenObject.MARKDOWNPAPERS, BuildType.COMPILETIME);\r
downloadFromApache(MavenObject.BOUNCYCASTLE, BuildType.COMPILETIME);\r
downloadFromApache(MavenObject.BOUNCYCASTLE_MAIL, BuildType.COMPILETIME);\r
- \r
+\r
downloadFromApache(MavenObject.JSCH, BuildType.RUNTIME);\r
downloadFromApache(MavenObject.JSCH, BuildType.COMPILETIME);\r
\r
"384058ca906dffb8b8708c2db8849c9754359b28",\r
"7b026658ed8de2eccc2d11d647d43d7c84a56911",\r
"6c19e37b3caafd70c1b7b024ae1858c725181688");\r
- \r
- public static final MavenObject JSCH = new MavenObject("JSch", "com/jcraft",\r
- "jsch", "0.1.44-1", 214000, 211000, 413000,\r
- "2e9ae08de5a71bd0e0d3ba2558598181bfa71d4e",\r
+\r
+ public static final MavenObject JSCH = new MavenObject("JSch", "com/jcraft", "jsch",\r
+ "0.1.44-1", 214000, 211000, 413000, "2e9ae08de5a71bd0e0d3ba2558598181bfa71d4e",\r
"e528f593b19b04d500992606f58b87fcfded8883",\r
"d0ffadd0a4ab909d94a577b5aad43c13b617ddcb");\r
\r
import com.beust.jcommander.ParameterException;\r
import com.beust.jcommander.Parameters;\r
import com.gitblit.utils.MarkdownUtils;\r
+import com.gitblit.utils.StringUtils;\r
\r
public class BuildSite {\r
\r
sb.setLength(sb.length() - 3);\r
sb.trimToSize();\r
\r
- String htmlHeader = readContent(new File(params.pageHeader));\r
- String htmlFooter = readContent(new File(params.pageFooter));\r
+ String htmlHeader = readContent(new File(params.pageHeader), "\n");\r
+ String htmlFooter = readContent(new File(params.pageFooter), "\n");\r
final String links = sb.toString();\r
final String header = MessageFormat.format(htmlHeader, Constants.FULL_NAME, links);\r
final String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());\r
String[] kv = token.split("=");\r
content = content.replace(kv[0], kv[1]);\r
}\r
+ for (String alias : params.loads) {\r
+ String[] kv = alias.split("=");\r
+ String loadedContent = readContent(new File(kv[1]), "\n");\r
+ loadedContent = StringUtils.escapeForHtml(loadedContent, false);\r
+ loadedContent = StringUtils.breakLinesForHtml(loadedContent);\r
+ content = content.replace(kv[0], loadedContent);\r
+ }\r
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(\r
destinationFolder, fileName)), Charset.forName("UTF-8"));\r
writer.write(header);\r
}\r
}\r
\r
- private static String readContent(File file) {\r
+ private static String readContent(File file, String lineEnding) {\r
StringBuilder sb = new StringBuilder();\r
try {\r
InputStreamReader is = new InputStreamReader(new FileInputStream(file),\r
String line = null;\r
while ((line = reader.readLine()) != null) {\r
sb.append(line);\r
+ if (lineEnding != null) {\r
+ sb.append(lineEnding);\r
+ }\r
}\r
reader.close();\r
} catch (Throwable t) {\r
@Parameter(names = { "--alias" }, description = "Filename=Linkname aliases", required = false)\r
public List<String> aliases = new ArrayList<String>();\r
\r
- @Parameter(names = { "--substitute" }, description = "@TOKEN@=value", required = false)\r
+ @Parameter(names = { "--substitute" }, description = "%TOKEN%=value", required = false)\r
public List<String> substitutions = new ArrayList<String>();\r
\r
+ @Parameter(names = { "--load" }, description = "%TOKEN%=filename", required = false)\r
+ public List<String> loads = new ArrayList<String>();\r
+\r
}\r
}\r
\r
public static final String ZIP_SERVLET_PATH = "/zip/";\r
\r
+ public static final String BORDER = "***********************************************************";\r
+ \r
public static enum AccessRestrictionType {\r
NONE, PUSH, CLONE, VIEW;\r
\r
import org.slf4j.LoggerFactory;\r
\r
import com.gitblit.Constants.AccessRestrictionType;\r
+import com.gitblit.models.RepositoryModel;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.models.RepositoryModel;\r
\r
public class DownloadZipServlet extends HttpServlet {\r
\r
import org.slf4j.LoggerFactory;\r
\r
import com.gitblit.Constants.AccessRestrictionType;\r
+import com.gitblit.models.RepositoryModel;\r
+import com.gitblit.models.UserModel;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.models.RepositoryModel;\r
-import com.gitblit.wicket.models.UserModel;\r
\r
public class GitBlit implements ServletContextListener {\r
\r
r = repositoryResolver.open(null, repositoryName);\r
} catch (RepositoryNotFoundException e) {\r
r = null;\r
- logger.error("GitBlit.getRepository(String) failed to find repository "\r
- + repositoryName);\r
+ logger.error("GitBlit.getRepository(String) failed to find "\r
+ + new File(repositoriesFolder, repositoryName).getAbsolutePath());\r
} catch (ServiceNotEnabledException e) {\r
r = null;\r
e.printStackTrace();\r
\r
public RepositoryModel getRepositoryModel(String repositoryName) {\r
Repository r = getRepository(repositoryName);\r
+ if (r == null) {\r
+ return null;\r
+ }\r
RepositoryModel model = new RepositoryModel();\r
model.name = repositoryName;\r
model.hasCommits = JGitUtils.hasCommits(r);\r
}\r
\r
public void configureContext(IStoredSettings settings) {\r
- logger.info("Using configuration from " + settings.toString());\r
+ logger.info("Reading configuration from " + settings.toString());\r
this.storedSettings = settings;\r
repositoriesFolder = new File(settings.getString(Keys.git.repositoriesFolder, "repos"));\r
exportAll = settings.getBoolean(Keys.git.exportAll, true);\r
\r
public class GitBlitServer {\r
\r
- private static final String BORDER = "***********************************************************";\r
-\r
private static Logger logger;\r
\r
- private static final FileSettings FILESETTINGS = new FileSettings();\r
-\r
public static void main(String[] args) {\r
Params params = new Params();\r
JCommander jc = new JCommander(params);\r
}\r
\r
private static void usage(JCommander jc, ParameterException t) {\r
- System.out.println(BORDER);\r
+ System.out.println(Constants.BORDER);\r
System.out.println(Constants.getGitBlitVersion());\r
- System.out.println(BORDER);\r
+ System.out.println(Constants.BORDER);\r
System.out.println();\r
if (t != null) {\r
System.out.println(t.getMessage());\r
* Start Server.\r
*/\r
private static void start(Params params) {\r
- String pattern = FILESETTINGS.getString(Keys.server.log4jPattern,\r
+ FileSettings settings = params.FILESETTINGS;\r
+ String pattern = settings.getString(Keys.server.log4jPattern,\r
"%-5p %d{MM-dd HH:mm:ss.SSS} %-20.20c{1} %m%n");\r
\r
// allow os override of logging pattern\r
String os = System.getProperty("os.name").toLowerCase();\r
if (os.indexOf("windows") > -1) {\r
- String winPattern = FILESETTINGS.getString(Keys.server.log4jPattern_windows, pattern);\r
+ String winPattern = settings.getString(Keys.server.log4jPattern_windows, pattern);\r
if (!StringUtils.isEmpty(winPattern)) {\r
pattern = winPattern;\r
}\r
} else if (os.indexOf("linux") > -1) {\r
- String linuxPattern = FILESETTINGS.getString(Keys.server.log4jPattern_linux, pattern);\r
+ String linuxPattern = settings.getString(Keys.server.log4jPattern_linux, pattern);\r
if (!StringUtils.isEmpty(linuxPattern)) {\r
pattern = linuxPattern;\r
}\r
rootLogger.addAppender(new ConsoleAppender(layout));\r
\r
logger = LoggerFactory.getLogger(GitBlitServer.class);\r
- logger.info(BORDER);\r
+ logger.info(Constants.BORDER);\r
logger.info(Constants.getGitBlitVersion());\r
- logger.info(BORDER);\r
+ logger.info(Constants.BORDER);\r
\r
String osname = System.getProperty("os.name");\r
String osversion = System.getProperty("os.version");\r
List<Connector> connectors = new ArrayList<Connector>();\r
if (params.port > 0) {\r
Connector httpConnector = createConnector(params.useNIO, params.port);\r
- String bindInterface = FILESETTINGS.getString(Keys.server.httpBindInterface, null);\r
+ String bindInterface = settings.getString(Keys.server.httpBindInterface, null);\r
if (!StringUtils.isEmpty(bindInterface)) {\r
logger.warn(MessageFormat.format("Binding connector on port {0} to {1}",\r
params.port, bindInterface));\r
if (keystore.exists()) {\r
Connector secureConnector = createSSLConnector(keystore, params.storePassword,\r
params.useNIO, params.securePort);\r
- String bindInterface = FILESETTINGS.getString(Keys.server.httpsBindInterface, null);\r
+ String bindInterface = settings.getString(Keys.server.httpsBindInterface, null);\r
if (!StringUtils.isEmpty(bindInterface)) {\r
logger.warn(MessageFormat.format("Binding ssl connector on port {0} to {1}",\r
params.securePort, bindInterface));\r
// Git Servlet\r
ServletHolder gitServlet = null;\r
String gitServletPathSpec = Constants.GIT_SERVLET_PATH + "*";\r
- if (FILESETTINGS.getBoolean(Keys.git.enableGitServlet, true)) {\r
+ if (settings.getBoolean(Keys.git.enableGitServlet, true)) {\r
gitServlet = rootContext.addServlet(GitBlitServlet.class, gitServletPathSpec);\r
gitServlet.setInitParameter("base-path", params.repositoriesFolder);\r
gitServlet.setInitParameter("export-all",\r
- FILESETTINGS.getBoolean(Keys.git.exportAll, true) ? "1" : "0");\r
+ settings.getBoolean(Keys.git.exportAll, true) ? "1" : "0");\r
}\r
\r
// Login Service\r
handler = rootContext;\r
}\r
\r
+ logger.info("Git repositories folder " + new File(params.repositoriesFolder).getAbsolutePath());\r
+ \r
// Set the server's contexts\r
server.setHandler(handler);\r
\r
// Setup the GitBlit context\r
GitBlit gitblit = GitBlit.self();\r
- gitblit.configureContext(FILESETTINGS);\r
+ gitblit.configureContext(settings);\r
rootContext.addEventListener(gitblit);\r
\r
// Start the Server\r
private final ServerSocket socket;\r
\r
private final Server server;\r
+ \r
+ private final Logger logger = LoggerFactory.getLogger(ShutdownMonitorThread.class);\r
\r
public ShutdownMonitorThread(Server server, Params params) {\r
this.server = server;\r
BufferedReader reader = new BufferedReader(new InputStreamReader(\r
accept.getInputStream()));\r
reader.readLine();\r
- logger.info(BORDER);\r
+ logger.info(Constants.BORDER);\r
logger.info("Stopping " + Constants.NAME);\r
- logger.info(BORDER);\r
+ logger.info(Constants.BORDER);\r
server.stop();\r
server.setStopAtShutdown(false);\r
accept.close();\r
\r
@Parameters(separators = " ")\r
private static class Params {\r
+ \r
+ private static final FileSettings FILESETTINGS = new FileSettings();\r
\r
/*\r
* Server parameters\r
import org.slf4j.LoggerFactory;\r
\r
import com.gitblit.Constants.AccessRestrictionType;\r
-import com.gitblit.wicket.models.RepositoryModel;\r
+import com.gitblit.models.RepositoryModel;\r
\r
public class GitBlitServlet extends GitServlet {\r
\r
\r
import java.util.List;\r
\r
-import com.gitblit.wicket.models.UserModel;\r
+import com.gitblit.models.UserModel;\r
\r
public interface ILoginService {\r
\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
\r
-import com.gitblit.wicket.models.UserModel;\r
+import com.gitblit.models.UserModel;\r
\r
public class JettyLoginService extends MappedLoginService implements ILoginService {\r
\r
import com.gitblit.utils.TimeUtils;\r
\r
public class MakeCertificate {\r
-\r
- private static final FileSettings FILESETTINGS = new FileSettings();\r
-\r
+ \r
private static final String BC = org.bouncycastle.jce.provider.BouncyCastleProvider.PROVIDER_NAME;\r
\r
public static void main(String... args) {\r
@Parameters(separators = " ")\r
private static class Params {\r
\r
+ private static final FileSettings FILESETTINGS = new FileSettings();\r
+ \r
@Parameter(names = { "--alias" }, description = "Server alias", required = true)\r
public String alias;\r
\r
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.models;\r
+\r
+import java.io.Serializable;\r
+\r
+public class Metric implements Serializable {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public String name;\r
+ public double count;\r
+ public double tag;\r
+ public int duration;\r
+\r
+ public Metric(String name) {\r
+ this.name = name;\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.models;\r
+\r
+import java.io.Serializable;\r
+\r
+import org.eclipse.jgit.diff.DiffEntry.ChangeType;\r
+import org.eclipse.jgit.lib.FileMode;\r
+\r
+public class PathModel implements Serializable, Comparable<PathModel> {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public final String name;\r
+ public final String path;\r
+ public final long size;\r
+ public final int mode;\r
+ public final String commitId;\r
+ public boolean isParentPath;\r
+\r
+ public PathModel(String name, String path, long size, int mode, String commitId) {\r
+ this.name = name;\r
+ this.path = path;\r
+ this.size = size;\r
+ this.mode = mode;\r
+ this.commitId = commitId;\r
+ }\r
+\r
+ public boolean isTree() {\r
+ return FileMode.TREE.equals(mode);\r
+ }\r
+\r
+ public static PathModel getParentPath(String basePath, String commitId) {\r
+ String parentPath = null;\r
+ if (basePath.lastIndexOf('/') > -1) {\r
+ parentPath = basePath.substring(0, basePath.lastIndexOf('/'));\r
+ }\r
+ PathModel model = new PathModel("..", parentPath, 0, 40000, commitId);\r
+ model.isParentPath = true;\r
+ return model;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return commitId.hashCode() + path.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object o) {\r
+ if (o instanceof PathModel) {\r
+ PathModel other = (PathModel) o;\r
+ return this.path.equals(other.path);\r
+ }\r
+ return super.equals(o);\r
+ }\r
+\r
+ @Override\r
+ public int compareTo(PathModel o) {\r
+ boolean isTree = isTree();\r
+ boolean otherTree = o.isTree();\r
+ if (isTree && otherTree) {\r
+ return path.compareTo(o.path);\r
+ } else if (!isTree && !otherTree) {\r
+ return path.compareTo(o.path);\r
+ } else if (isTree && !otherTree) {\r
+ return -1;\r
+ }\r
+ return 1;\r
+ }\r
+\r
+ public static class PathChangeModel extends PathModel {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public final ChangeType changeType;\r
+\r
+ public PathChangeModel(String name, String path, long size, int mode, String commitId,\r
+ ChangeType type) {\r
+ super(name, path, size, mode, commitId);\r
+ this.changeType = type;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return super.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object o) {\r
+ return super.equals(o);\r
+ }\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.models;\r
+\r
+import java.io.Serializable;\r
+import java.util.Date;\r
+\r
+import org.eclipse.jgit.lib.ObjectId;\r
+import org.eclipse.jgit.lib.Ref;\r
+import org.eclipse.jgit.revwalk.RevCommit;\r
+\r
+public class RefModel implements Serializable, Comparable<RefModel> {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+ public final String displayName;\r
+ public final RevCommit commit;\r
+ public transient Ref ref;\r
+\r
+ public RefModel(String displayName, Ref ref, RevCommit commit) {\r
+ this.displayName = displayName;\r
+ this.ref = ref;\r
+ this.commit = commit;\r
+ }\r
+\r
+ public Date getDate() {\r
+ return new Date(commit.getCommitTime() * 1000L);\r
+ }\r
+\r
+ public String getName() {\r
+ return ref.getName();\r
+ }\r
+\r
+ public ObjectId getCommitId() {\r
+ return commit.getId();\r
+ }\r
+\r
+ public String getShortLog() {\r
+ return commit.getShortMessage();\r
+ }\r
+\r
+ public ObjectId getObjectId() {\r
+ return ref.getObjectId();\r
+ }\r
+\r
+ public boolean isAnnotatedTag() {\r
+ // ref.isPeeled() ??\r
+ return !getCommitId().equals(getObjectId());\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return getCommitId().hashCode() + getName().hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object o) {\r
+ if (o instanceof RefModel) {\r
+ RefModel other = (RefModel) o;\r
+ return getName().equals(other.getName());\r
+ }\r
+ return super.equals(o);\r
+ }\r
+\r
+ @Override\r
+ public int compareTo(RefModel o) {\r
+ return getDate().compareTo(o.getDate());\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.models;\r
+\r
+import java.io.Serializable;\r
+import java.util.Date;\r
+\r
+import com.gitblit.Constants.AccessRestrictionType;\r
+\r
+public class RepositoryModel implements Serializable {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ // field names are reflectively mapped in EditRepository page\r
+ public String name;\r
+ public String description;\r
+ public String owner;\r
+ public Date lastChange;\r
+ public boolean hasCommits;\r
+ public boolean showRemoteBranches;\r
+ public boolean useTickets;\r
+ public boolean useDocs;\r
+ public AccessRestrictionType accessRestriction;\r
+ public boolean isFrozen;\r
+\r
+ public RepositoryModel() {\r
+ this.name = "";\r
+ this.description = "";\r
+ this.owner = "";\r
+ this.lastChange = new Date(0);\r
+ this.accessRestriction = AccessRestrictionType.NONE;\r
+ }\r
+\r
+ public RepositoryModel(String name, String description, String owner, Date lastchange) {\r
+ this.name = name;\r
+ this.description = description;\r
+ this.owner = owner;\r
+ this.lastChange = lastchange;\r
+ this.accessRestriction = AccessRestrictionType.NONE;\r
+ }\r
+\r
+ @Override\r
+ public String toString() {\r
+ return name;\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.models;\r
+\r
+import java.io.Serializable;\r
+import java.text.ParseException;\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+public class TicketModel implements Serializable, Comparable<TicketModel> {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public String id;\r
+ public String name;\r
+ public String title;\r
+ public String state;\r
+ public Date date;\r
+ public String handler;\r
+ public String milestone;\r
+ public String email;\r
+ public String author;\r
+ public List<Comment> comments;\r
+ public List<String> tags;\r
+\r
+ public TicketModel(String ticketName) throws ParseException {\r
+ state = "";\r
+ name = ticketName;\r
+ comments = new ArrayList<Comment>();\r
+ tags = new ArrayList<String>();\r
+\r
+ String[] chunks = name.split("_");\r
+ if (chunks.length == 3) {\r
+ date = new Date(Long.parseLong(chunks[0]) * 1000L);\r
+ title = chunks[1].replace('-', ' ');\r
+ }\r
+ }\r
+\r
+ public static class Comment implements Serializable, Comparable<Comment> {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public String text;\r
+ public String author;\r
+ public Date date;\r
+\r
+ public Comment(String text, Date date) {\r
+ this.text = text;\r
+ this.date = date;\r
+ }\r
+\r
+ public Comment(String filename, String content) throws ParseException {\r
+ String[] chunks = filename.split("_", -1);\r
+ this.date = new Date(Long.parseLong(chunks[1]) * 1000L);\r
+ this.author = chunks[2];\r
+ this.text = content;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return text.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object o) {\r
+ if (o instanceof Comment) {\r
+ Comment other = (Comment) o;\r
+ return text.equals(other.text);\r
+ }\r
+ return super.equals(o);\r
+ }\r
+\r
+ @Override\r
+ public int compareTo(Comment o) {\r
+ return date.compareTo(o.date);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return id.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object o) {\r
+ if (o instanceof TicketModel) {\r
+ TicketModel other = (TicketModel) o;\r
+ return id.equals(other.id);\r
+ }\r
+ return super.equals(o);\r
+ }\r
+\r
+ @Override\r
+ public int compareTo(TicketModel o) {\r
+ return date.compareTo(o.date);\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.models;\r
+\r
+import java.io.Serializable;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+public class UserModel implements Serializable {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ // field names are reflectively mapped in EditUser page\r
+ public String username;\r
+ public String password;\r
+ public boolean canAdmin;\r
+ public final List<String> repositories = new ArrayList<String>();\r
+\r
+ public UserModel(String username) {\r
+ this.username = username;\r
+ }\r
+\r
+ public boolean canAccessRepository(String repositoryName) {\r
+ return canAdmin || repositories.contains(repositoryName);\r
+ }\r
+\r
+ public void setRepositories(List<String> repositories) {\r
+ this.repositories.clear();\r
+ this.repositories.addAll(repositories);\r
+ }\r
+\r
+ public void addRepository(String name) {\r
+ repositories.add(name.toLowerCase());\r
+ }\r
+\r
+ @Override\r
+ public String toString() {\r
+ return username;\r
+ }\r
+}\r
--- /dev/null
+package com.gitblit.utils;\r
+\r
+import java.io.ByteArrayOutputStream;\r
+import java.util.List;\r
+\r
+import org.eclipse.jgit.diff.DiffEntry;\r
+import org.eclipse.jgit.diff.DiffFormatter;\r
+import org.eclipse.jgit.diff.RawTextComparator;\r
+import org.eclipse.jgit.lib.Repository;\r
+import org.eclipse.jgit.revwalk.RevCommit;\r
+import org.eclipse.jgit.revwalk.RevTree;\r
+import org.eclipse.jgit.revwalk.RevWalk;\r
+import org.eclipse.jgit.treewalk.TreeWalk;\r
+import org.eclipse.jgit.treewalk.filter.TreeFilter;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import com.gitblit.utils.JGitUtils.DiffOutputType;\r
+\r
+public class DiffUtils {\r
+\r
+ private static final Logger LOGGER = LoggerFactory.getLogger(DiffUtils.class);\r
+ \r
+ public static String getCommitDiff(Repository r, RevCommit commit, DiffOutputType outputType) {\r
+ return getCommitDiff(r, null, commit, null, outputType);\r
+ }\r
+\r
+ public static String getCommitDiff(Repository r, RevCommit commit, String path,\r
+ DiffOutputType outputType) {\r
+ return getCommitDiff(r, null, commit, path, outputType);\r
+ }\r
+\r
+ public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,\r
+ DiffOutputType outputType) {\r
+ return getCommitDiff(r, baseCommit, commit, null, outputType);\r
+ }\r
+\r
+ public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,\r
+ String path, DiffOutputType outputType) {\r
+ try {\r
+ RevTree baseTree;\r
+ if (baseCommit == null) {\r
+ final RevWalk rw = new RevWalk(r);\r
+ RevCommit parent = rw.parseCommit(commit.getParent(0).getId());\r
+ rw.dispose();\r
+ baseTree = parent.getTree();\r
+ } else {\r
+ baseTree = baseCommit.getTree();\r
+ }\r
+\r
+ RevTree commitTree = commit.getTree();\r
+\r
+ final TreeWalk walk = new TreeWalk(r);\r
+ walk.reset();\r
+ walk.setRecursive(true);\r
+ walk.addTree(baseTree);\r
+ walk.addTree(commitTree);\r
+ walk.setFilter(TreeFilter.ANY_DIFF);\r
+\r
+ final ByteArrayOutputStream os = new ByteArrayOutputStream();\r
+ RawTextComparator cmp = RawTextComparator.DEFAULT;\r
+ DiffFormatter df;\r
+ switch (outputType) {\r
+ case GITWEB:\r
+ df = new GitWebDiffFormatter(os);\r
+ break;\r
+ case GITBLIT:\r
+ df = new GitBlitDiffFormatter(os);\r
+ break;\r
+ case PLAIN:\r
+ default:\r
+ df = new DiffFormatter(os);\r
+ break;\r
+ }\r
+ df.setRepository(r);\r
+ df.setDiffComparator(cmp);\r
+ df.setDetectRenames(true);\r
+ List<DiffEntry> diffs = df.scan(baseTree, commitTree);\r
+ if (path != null && path.length() > 0) {\r
+ for (DiffEntry diff : diffs) {\r
+ if (diff.getNewPath().equalsIgnoreCase(path)) {\r
+ df.format(diff);\r
+ break;\r
+ }\r
+ }\r
+ } else {\r
+ df.format(diffs);\r
+ }\r
+ String diff;\r
+ if (df instanceof GitWebDiffFormatter) {\r
+ // workaround for complex private methods in DiffFormatter\r
+ diff = ((GitWebDiffFormatter) df).getHtml();\r
+ } else {\r
+ diff = os.toString();\r
+ }\r
+ df.flush();\r
+ return diff;\r
+ } catch (Throwable t) {\r
+ LOGGER.error("failed to generate commit diff!", t);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public static String getCommitPatch(Repository r, RevCommit baseCommit, RevCommit commit,\r
+ String path) {\r
+ try {\r
+ RevTree baseTree;\r
+ if (baseCommit == null) {\r
+ final RevWalk rw = new RevWalk(r);\r
+ RevCommit parent = rw.parseCommit(commit.getParent(0).getId());\r
+ baseTree = parent.getTree();\r
+ } else {\r
+ baseTree = baseCommit.getTree();\r
+ }\r
+ RevTree commitTree = commit.getTree();\r
+\r
+ final TreeWalk walk = new TreeWalk(r);\r
+ walk.reset();\r
+ walk.setRecursive(true);\r
+ walk.addTree(baseTree);\r
+ walk.addTree(commitTree);\r
+ walk.setFilter(TreeFilter.ANY_DIFF);\r
+\r
+ final ByteArrayOutputStream os = new ByteArrayOutputStream();\r
+ RawTextComparator cmp = RawTextComparator.DEFAULT;\r
+ PatchFormatter df = new PatchFormatter(os);\r
+ df.setRepository(r);\r
+ df.setDiffComparator(cmp);\r
+ df.setDetectRenames(true);\r
+ List<DiffEntry> diffs = df.scan(baseTree, commitTree);\r
+ if (path != null && path.length() > 0) {\r
+ for (DiffEntry diff : diffs) {\r
+ if (diff.getNewPath().equalsIgnoreCase(path)) {\r
+ df.format(diff);\r
+ break;\r
+ }\r
+ }\r
+ } else {\r
+ df.format(diffs);\r
+ }\r
+ String diff = df.getPatch(commit);\r
+ df.flush();\r
+ return diff;\r
+ } catch (Throwable t) {\r
+ LOGGER.error("failed to generate commit diff!", t);\r
+ }\r
+ return null;\r
+ }\r
+}\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
\r
-import com.gitblit.wicket.models.Metric;\r
-import com.gitblit.wicket.models.PathModel;\r
-import com.gitblit.wicket.models.PathModel.PathChangeModel;\r
-import com.gitblit.wicket.models.RefModel;\r
-import com.gitblit.wicket.models.TicketModel;\r
-import com.gitblit.wicket.models.TicketModel.Comment;\r
+import com.gitblit.models.Metric;\r
+import com.gitblit.models.PathModel;\r
+import com.gitblit.models.RefModel;\r
+import com.gitblit.models.TicketModel;\r
+import com.gitblit.models.PathModel.PathChangeModel;\r
+import com.gitblit.models.TicketModel.Comment;\r
\r
public class JGitUtils {\r
\r
}\r
\r
public static boolean hasCommits(Repository r) {\r
- return new File(r.getDirectory(), Constants.R_HEADS).list().length > 0;\r
+ if (r != null && r.getDirectory().exists()) {\r
+ return new File(r.getDirectory(), Constants.R_HEADS).list().length > 0;\r
+ }\r
+ return false; \r
}\r
\r
public static Date getLastChange(Repository r) {\r
if (!hasCommits(r)) {\r
+ // null repository\r
+ if (r == null) {\r
+ return new Date(0);\r
+ }\r
// fresh repository\r
return new Date(r.getDirectory().lastModified());\r
}\r
}\r
}\r
\r
- public static String getCommitDiff(Repository r, RevCommit commit, DiffOutputType outputType) {\r
- return getCommitDiff(r, null, commit, null, outputType);\r
- }\r
-\r
- public static String getCommitDiff(Repository r, RevCommit commit, String path,\r
- DiffOutputType outputType) {\r
- return getCommitDiff(r, null, commit, path, outputType);\r
- }\r
-\r
- public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,\r
- DiffOutputType outputType) {\r
- return getCommitDiff(r, baseCommit, commit, null, outputType);\r
- }\r
-\r
- public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,\r
- String path, DiffOutputType outputType) {\r
- try {\r
- RevTree baseTree;\r
- if (baseCommit == null) {\r
- final RevWalk rw = new RevWalk(r);\r
- RevCommit parent = rw.parseCommit(commit.getParent(0).getId());\r
- rw.dispose();\r
- baseTree = parent.getTree();\r
- } else {\r
- baseTree = baseCommit.getTree();\r
- }\r
-\r
- RevTree commitTree = commit.getTree();\r
-\r
- final TreeWalk walk = new TreeWalk(r);\r
- walk.reset();\r
- walk.setRecursive(true);\r
- walk.addTree(baseTree);\r
- walk.addTree(commitTree);\r
- walk.setFilter(TreeFilter.ANY_DIFF);\r
-\r
- final ByteArrayOutputStream os = new ByteArrayOutputStream();\r
- RawTextComparator cmp = RawTextComparator.DEFAULT;\r
- DiffFormatter df;\r
- switch (outputType) {\r
- case GITWEB:\r
- df = new GitWebDiffFormatter(os);\r
- break;\r
- case GITBLIT:\r
- df = new GitBlitDiffFormatter(os);\r
- break;\r
- case PLAIN:\r
- default:\r
- df = new DiffFormatter(os);\r
- break;\r
- }\r
- df.setRepository(r);\r
- df.setDiffComparator(cmp);\r
- df.setDetectRenames(true);\r
- List<DiffEntry> diffs = df.scan(baseTree, commitTree);\r
- if (path != null && path.length() > 0) {\r
- for (DiffEntry diff : diffs) {\r
- if (diff.getNewPath().equalsIgnoreCase(path)) {\r
- df.format(diff);\r
- break;\r
- }\r
- }\r
- } else {\r
- df.format(diffs);\r
- }\r
- String diff;\r
- if (df instanceof GitWebDiffFormatter) {\r
- // workaround for complex private methods in DiffFormatter\r
- diff = ((GitWebDiffFormatter) df).getHtml();\r
- } else {\r
- diff = os.toString();\r
- }\r
- df.flush();\r
- return diff;\r
- } catch (Throwable t) {\r
- LOGGER.error("failed to generate commit diff!", t);\r
- }\r
- return null;\r
- }\r
-\r
- public static String getCommitPatch(Repository r, RevCommit baseCommit, RevCommit commit,\r
- String path) {\r
- try {\r
- RevTree baseTree;\r
- if (baseCommit == null) {\r
- final RevWalk rw = new RevWalk(r);\r
- RevCommit parent = rw.parseCommit(commit.getParent(0).getId());\r
- baseTree = parent.getTree();\r
- } else {\r
- baseTree = baseCommit.getTree();\r
- }\r
- RevTree commitTree = commit.getTree();\r
-\r
- final TreeWalk walk = new TreeWalk(r);\r
- walk.reset();\r
- walk.setRecursive(true);\r
- walk.addTree(baseTree);\r
- walk.addTree(commitTree);\r
- walk.setFilter(TreeFilter.ANY_DIFF);\r
-\r
- final ByteArrayOutputStream os = new ByteArrayOutputStream();\r
- RawTextComparator cmp = RawTextComparator.DEFAULT;\r
- PatchFormatter df = new PatchFormatter(os);\r
- df.setRepository(r);\r
- df.setDiffComparator(cmp);\r
- df.setDetectRenames(true);\r
- List<DiffEntry> diffs = df.scan(baseTree, commitTree);\r
- if (path != null && path.length() > 0) {\r
- for (DiffEntry diff : diffs) {\r
- if (diff.getNewPath().equalsIgnoreCase(path)) {\r
- df.format(diff);\r
- break;\r
- }\r
- }\r
- } else {\r
- df.format(diffs);\r
- }\r
- String diff = df.getPatch(commit);\r
- df.flush();\r
- return diff;\r
- } catch (Throwable t) {\r
- LOGGER.error("failed to generate commit diff!", t);\r
- }\r
- return null;\r
- }\r
-\r
private static PathModel getPathModel(TreeWalk walk, String basePath, RevCommit commit) {\r
String name;\r
long size = 0;\r
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket;\r
-\r
-import java.lang.annotation.ElementType;\r
-import java.lang.annotation.Retention;\r
-import java.lang.annotation.RetentionPolicy;\r
-import java.lang.annotation.Target;\r
-\r
-@Retention(RetentionPolicy.RUNTIME)\r
-@Target(ElementType.TYPE)\r
-public @interface AdminPage {\r
-}\r
\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
-import com.gitblit.wicket.models.UserModel;\r
+import com.gitblit.models.UserModel;\r
+import com.gitblit.wicket.pages.BasePage;\r
+import com.gitblit.wicket.pages.LoginPage;\r
import com.gitblit.wicket.pages.RepositoriesPage;\r
\r
public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy implements\r
}\r
\r
UserModel user = session.getUser();\r
- if (pageClass.isAnnotationPresent(AdminPage.class)) {\r
+ if (pageClass.isAnnotationPresent(RequiresAdminRole.class)) {\r
// admin page\r
if (allowAdmin) {\r
if (authenticateAdmin) {\r
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" \r
- xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" \r
- xml:lang="en" \r
- lang="en"> \r
-\r
- <!-- Head with Wicket-controlled resources in this package -->\r
- <wicket:head>\r
- <title wicket:id="title">[page title]</title>\r
- <wicket:link>\r
- <link rel="stylesheet" type="text/css" href="resources/gitblit.css"/>\r
- <link rel="shortcut icon" href="resources/gitblt-favicon.png" type="image/png" />\r
- </wicket:link>\r
- </wicket:head>\r
-\r
- <body>\r
- <!-- page header -->\r
- <div class="page_header">\r
- <a title="gitblit homepage" href="http://gitblit.com/">\r
- <wicket:link>\r
- <img src="resources/gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>\r
- </wicket:link>\r
- </a>\r
- <span>\r
- <a href="/"><span wicket:id="siteName">[site name]</span></a> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span>\r
- </span> \r
- </div>\r
-\r
- <!-- page content -->\r
- <wicket:child />\r
- \r
- <!-- page footer -->\r
- <div class="page_footer">\r
- <div style="float:right">\r
- <span wicket:id="gbVersion"></span> \r
- </div>\r
- <div wicket:id="userPanel">[user panel]</div>\r
- </div>\r
- </body>\r
-</html>
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket;\r
-\r
-import java.util.LinkedHashMap;\r
-import java.util.Map;\r
-import java.util.TimeZone;\r
-\r
-import javax.servlet.http.HttpServletRequest;\r
-\r
-import org.apache.wicket.PageParameters;\r
-import org.apache.wicket.RestartResponseAtInterceptPageException;\r
-import org.apache.wicket.markup.html.WebPage;\r
-import org.apache.wicket.markup.html.basic.Label;\r
-import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
-import org.apache.wicket.protocol.http.servlet.ServletWebRequest;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.gitblit.Constants;\r
-import com.gitblit.Constants.AccessRestrictionType;\r
-import com.gitblit.GitBlit;\r
-import com.gitblit.Keys;\r
-import com.gitblit.wicket.pages.SummaryPage;\r
-\r
-public abstract class BasePage extends WebPage {\r
-\r
- private final Logger logger;\r
-\r
- public BasePage() {\r
- super();\r
- logger = LoggerFactory.getLogger(getClass());\r
- }\r
-\r
- public BasePage(PageParameters params) {\r
- super(params);\r
- logger = LoggerFactory.getLogger(getClass());\r
- }\r
-\r
- protected void setupPage(String repositoryName, String pageName) {\r
- if (repositoryName != null && repositoryName.trim().length() > 0) {\r
- add(new Label("title", getServerName() + " - " + repositoryName));\r
- } else {\r
- add(new Label("title", getServerName()));\r
- }\r
- // header\r
- String siteName = GitBlit.getString(Keys.web.siteName, Constants.NAME);\r
- if (siteName == null || siteName.trim().length() == 0) {\r
- siteName = Constants.NAME;\r
- }\r
- add(new Label("siteName", siteName));\r
- add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class,\r
- WicketUtils.newRepositoryParameter(repositoryName)));\r
- add(new Label("pageName", pageName));\r
-\r
- // Feedback panel for info, warning, and non-fatal error messages\r
- add(new FeedbackPanel("feedback"));\r
-\r
- // footer\r
- if (GitBlit.getBoolean(Keys.web.authenticateViewPages, true)\r
- || GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {\r
- if (GitBlitWebSession.get().isLoggedIn()) {\r
- // logout\r
- add(new LinkPanel("userPanel", null, getString("gb.logout") + " "\r
- + GitBlitWebSession.get().getUser().toString(), LogoutPage.class));\r
- } else {\r
- // login\r
- add(new LinkPanel("userPanel", null, getString("gb.login"), LoginPage.class));\r
- }\r
- } else {\r
- add(new Label("userPanel", ""));\r
- }\r
- add(new Label("gbVersion", "v" + Constants.VERSION));\r
- if (GitBlit.getBoolean(Keys.web.aggressiveHeapManagement, false)) {\r
- System.gc();\r
- }\r
- }\r
-\r
- protected Map<AccessRestrictionType, String> getAccessRestrictions() {\r
- Map<AccessRestrictionType, String> map = new LinkedHashMap<AccessRestrictionType, String>();\r
- for (AccessRestrictionType type : AccessRestrictionType.values()) {\r
- switch (type) {\r
- case NONE:\r
- map.put(type, getString("gb.notRestricted"));\r
- break;\r
- case PUSH:\r
- map.put(type, getString("gb.pushRestricted"));\r
- break;\r
- case CLONE:\r
- map.put(type, getString("gb.cloneRestricted"));\r
- break;\r
- case VIEW:\r
- map.put(type, getString("gb.viewRestricted"));\r
- break;\r
- }\r
- }\r
- return map;\r
- }\r
-\r
- protected TimeZone getTimeZone() {\r
- return GitBlit.getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get()\r
- .getTimezone() : TimeZone.getDefault();\r
- }\r
-\r
- protected String getServerName() {\r
- ServletWebRequest servletWebRequest = (ServletWebRequest) getRequest();\r
- HttpServletRequest req = servletWebRequest.getHttpServletRequest();\r
- return req.getServerName();\r
- }\r
-\r
- public void error(String message, boolean redirect) {\r
- logger.error(message);\r
- if (redirect) {\r
- GitBlitWebSession.get().cacheErrorMessage(message);\r
- throw new RestartResponseAtInterceptPageException(getApplication().getHomePage());\r
- } else {\r
- super.error(message);\r
- }\r
- }\r
-\r
- public void error(String message, Throwable t, boolean redirect) {\r
- logger.error(message, t);\r
- if (redirect) {\r
- GitBlitWebSession.get().cacheErrorMessage(message);\r
- throw new RestartResponseAtInterceptPageException(getApplication().getHomePage());\r
- } else {\r
- super.error(message);\r
- }\r
- }\r
-}\r
import com.gitblit.wicket.pages.DocsPage;\r
import com.gitblit.wicket.pages.HistoryPage;\r
import com.gitblit.wicket.pages.LogPage;\r
+import com.gitblit.wicket.pages.LoginPage;\r
+import com.gitblit.wicket.pages.LogoutPage;\r
import com.gitblit.wicket.pages.MarkdownPage;\r
import com.gitblit.wicket.pages.PatchPage;\r
import com.gitblit.wicket.pages.RawPage;\r
import org.apache.wicket.protocol.http.WebSession;\r
import org.apache.wicket.protocol.http.request.WebClientInfo;\r
\r
-import com.gitblit.wicket.models.UserModel;\r
+import com.gitblit.models.UserModel;\r
\r
public final class GitBlitWebSession extends WebSession {\r
\r
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" \r
- xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" \r
- xml:lang="en" \r
- lang="en">\r
-<wicket:panel>\r
-<a href="#" wicket:id="link"><span wicket:id="label">[link]</span></a>\r
-</wicket:panel>\r
-</html>
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket;\r
-\r
-import org.apache.wicket.PageParameters;\r
-import org.apache.wicket.behavior.SimpleAttributeModifier;\r
-import org.apache.wicket.markup.html.WebPage;\r
-import org.apache.wicket.markup.html.basic.Label;\r
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
-import org.apache.wicket.markup.html.link.Link;\r
-import org.apache.wicket.markup.html.panel.Panel;\r
-import org.apache.wicket.model.IModel;\r
-import org.apache.wicket.model.Model;\r
-\r
-public class LinkPanel extends Panel {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- private final IModel<String> labelModel;\r
-\r
- public LinkPanel(String wicketId, String linkCssClass, String label,\r
- Class<? extends WebPage> clazz) {\r
- this(wicketId, linkCssClass, new Model<String>(label), clazz, null);\r
- }\r
-\r
- public LinkPanel(String wicketId, String linkCssClass, String label,\r
- Class<? extends WebPage> clazz, PageParameters parameters) {\r
- this(wicketId, linkCssClass, new Model<String>(label), clazz, parameters);\r
- }\r
-\r
- public LinkPanel(String wicketId, String linkCssClass, IModel<String> model,\r
- Class<? extends WebPage> clazz, PageParameters parameters) {\r
- super(wicketId);\r
- this.labelModel = model;\r
- Link<Void> link = null;\r
- if (parameters == null) {\r
- link = new BookmarkablePageLink<Void>("link", clazz);\r
- } else {\r
- link = new BookmarkablePageLink<Void>("link", clazz, parameters);\r
- }\r
- if (linkCssClass != null) {\r
- link.add(new SimpleAttributeModifier("class", linkCssClass));\r
- }\r
- link.add(new Label("label", labelModel));\r
- add(link);\r
- }\r
-\r
-}\r
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" \r
- xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" \r
- xml:lang="en" \r
- lang="en"> \r
- \r
- <!-- Head with Wicket-controlled resources in this package -->\r
- <wicket:head>\r
- <title wicket:id="title">[page title]</title>\r
- <wicket:link>\r
- <link rel="stylesheet" type="text/css" href="resources/gitblit.css"/>\r
- <link rel="shortcut icon" href="resources/gitblt-favicon.png" type="image/png" />\r
- </wicket:link>\r
- </wicket:head>\r
- \r
- <body onload="document.getElementById('username').focus();">\r
- <div>\r
- <div style="padding-top: 10px;text-align:center;">\r
- <wicket:link>\r
- <img src="resources/gitblt_25.png" alt="Git:Blit"/><br/>\r
- </wicket:link>\r
- <div style="padding-top:30px;font-weight:bold;" wicket:id="name">[name]</div>\r
- </div>\r
-\r
- <form style="text-align:center;" wicket:id="loginForm">\r
- <div>\r
- <p/>\r
- <wicket:message key="gb.username"></wicket:message> \r
- <input type="text" id="username" wicket:id="username" value=""/>\r
- <p/>\r
- <wicket:message key="gb.password"></wicket:message> \r
- <input type="password" wicket:id="password" value=""/>\r
- <p/>\r
- <input type="submit" value="Login" wicket:message="value:gb.login" />\r
- <div style="padding-top:10px;" wicket:id="feedback"></div>\r
- </div>\r
- </form> \r
- </div>\r
- </body>\r
-</html>
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket;\r
-\r
-import org.apache.wicket.PageParameters;\r
-import org.apache.wicket.markup.html.WebPage;\r
-import org.apache.wicket.markup.html.basic.Label;\r
-import org.apache.wicket.markup.html.form.Form;\r
-import org.apache.wicket.markup.html.form.PasswordTextField;\r
-import org.apache.wicket.markup.html.form.StatelessForm;\r
-import org.apache.wicket.markup.html.form.TextField;\r
-import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
-import org.apache.wicket.model.IModel;\r
-import org.apache.wicket.model.Model;\r
-\r
-import com.gitblit.Constants;\r
-import com.gitblit.GitBlit;\r
-import com.gitblit.Keys;\r
-import com.gitblit.wicket.models.UserModel;\r
-\r
-public class LoginPage extends WebPage {\r
-\r
- IModel<String> username = new Model<String>("");\r
- IModel<String> password = new Model<String>("");\r
-\r
- public LoginPage(PageParameters params) {\r
- super(params);\r
-\r
- add(new Label("title", GitBlit.getString(Keys.web.siteName, Constants.NAME)));\r
- add(new Label("name", Constants.NAME));\r
-\r
- Form<Void> loginForm = new LoginForm("loginForm");\r
- loginForm.add(new TextField<String>("username", username));\r
- loginForm.add(new PasswordTextField("password", password));\r
- loginForm.add(new FeedbackPanel("feedback"));\r
- add(loginForm);\r
- }\r
-\r
- class LoginForm extends StatelessForm<Void> {\r
- private static final long serialVersionUID = 1L;\r
-\r
- public LoginForm(String id) {\r
- super(id);\r
-\r
- // If we are already logged in because user directly accessed\r
- // the login url, redirect to the home page\r
- if (GitBlitWebSession.get().isLoggedIn()) {\r
- setRedirect(true);\r
- setResponsePage(getApplication().getHomePage());\r
- }\r
- }\r
-\r
- @Override\r
- public void onSubmit() {\r
- String username = LoginPage.this.username.getObject();\r
- char[] password = LoginPage.this.password.getObject().toCharArray();\r
-\r
- UserModel user = GitBlit.self().authenticate(username, password);\r
- if (user == null) {\r
- error("Invalid username or password!");\r
- } else {\r
- loginUser(user);\r
- }\r
- }\r
- }\r
-\r
- private void loginUser(UserModel user) {\r
- if (user != null) {\r
- // Set the user into the session\r
- GitBlitWebSession.get().setUser(user);\r
-\r
- if (!continueToOriginalDestination()) {\r
- // Redirect to home page\r
- setResponsePage(getApplication().getHomePage());\r
- }\r
- }\r
- }\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket;\r
-\r
-import org.apache.wicket.markup.html.WebPage;\r
-\r
-public class LogoutPage extends WebPage {\r
-\r
- public LogoutPage() {\r
- getSession().invalidate();\r
- setRedirect(true);\r
- setResponsePage(getApplication().getHomePage());\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" \r
- xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" \r
- xml:lang="en" \r
- lang="en"> \r
-\r
-<body>\r
- <wicket:extend>\r
- <!-- page header bar --> \r
- <div>\r
- <!-- floating search form on right -->\r
- <form wicket:id="searchForm">\r
- <div class="search">\r
- <select wicket:id="searchType"/> \r
- <input type="text" id="searchBox" wicket:id="searchBox" size="25" value=""/>\r
- </div>\r
- </form>\r
- \r
- <!-- page nav links -->\r
- <div class="page_nav"> \r
- <a wicket:id="summary"><wicket:message key="gb.summary"></wicket:message></a> | <a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a> | <a wicket:id="branches"><wicket:message key="gb.branches"></wicket:message></a> | <a wicket:id="tags"><wicket:message key="gb.tags"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a> <span wicket:id="extra"><span wicket:id="extraSeparator"></span><span wicket:id="extraLink"></span></span>\r
- </div>\r
- </div>\r
- \r
- <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>\r
- \r
- <!-- page content -->\r
- <wicket:child />\r
- \r
- </wicket:extend>\r
-</body>\r
-</html>
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket;\r
-\r
-import java.text.MessageFormat;\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Map.Entry;\r
-\r
-import org.apache.wicket.Component;\r
-import org.apache.wicket.PageParameters;\r
-import org.apache.wicket.markup.html.basic.Label;\r
-import org.apache.wicket.markup.html.form.DropDownChoice;\r
-import org.apache.wicket.markup.html.form.StatelessForm;\r
-import org.apache.wicket.markup.html.form.TextField;\r
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
-import org.apache.wicket.markup.html.panel.Fragment;\r
-import org.apache.wicket.markup.repeater.Item;\r
-import org.apache.wicket.markup.repeater.data.DataView;\r
-import org.apache.wicket.markup.repeater.data.ListDataProvider;\r
-import org.apache.wicket.model.IModel;\r
-import org.apache.wicket.model.Model;\r
-import org.eclipse.jgit.diff.DiffEntry.ChangeType;\r
-import org.eclipse.jgit.lib.PersonIdent;\r
-import org.eclipse.jgit.lib.Repository;\r
-import org.eclipse.jgit.revwalk.RevCommit;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.gitblit.GitBlit;\r
-import com.gitblit.Keys;\r
-import com.gitblit.utils.JGitUtils;\r
-import com.gitblit.utils.JGitUtils.SearchType;\r
-import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.models.RepositoryModel;\r
-import com.gitblit.wicket.pages.BranchesPage;\r
-import com.gitblit.wicket.pages.DocsPage;\r
-import com.gitblit.wicket.pages.EditRepositoryPage;\r
-import com.gitblit.wicket.pages.LogPage;\r
-import com.gitblit.wicket.pages.SearchPage;\r
-import com.gitblit.wicket.pages.SummaryPage;\r
-import com.gitblit.wicket.pages.TagsPage;\r
-import com.gitblit.wicket.pages.TicketsPage;\r
-import com.gitblit.wicket.pages.TreePage;\r
-import com.gitblit.wicket.panels.RefsPanel;\r
-\r
-public abstract class RepositoryPage extends BasePage {\r
-\r
- protected final String repositoryName;\r
- protected final String objectId;\r
-\r
- private transient Repository r;\r
-\r
- private RepositoryModel m;\r
-\r
- private final Logger logger = LoggerFactory.getLogger(RepositoryPage.class);\r
-\r
- private final Map<String, String> knownPages = new HashMap<String, String>() {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- {\r
- put("summary", "gb.summary");\r
- put("log", "gb.log");\r
- put("branches", "gb.branches");\r
- put("tags", "gb.tags");\r
- put("tree", "gb.tree");\r
- put("tickets", "gb.tickets");\r
- put("edit", "gb.edit");\r
- }\r
- };\r
-\r
- public RepositoryPage(PageParameters params) {\r
- super(params);\r
- repositoryName = WicketUtils.getRepositoryName(params);\r
- objectId = WicketUtils.getObject(params);\r
-\r
- if (StringUtils.isEmpty(repositoryName)) {\r
- error(MessageFormat.format("Repository not specified for {0}!", getPageName()), true);\r
- }\r
-\r
- Repository r = getRepository();\r
- RepositoryModel model = getRepositoryModel();\r
-\r
- // standard page links\r
- add(new BookmarkablePageLink<Void>("summary", SummaryPage.class,\r
- WicketUtils.newRepositoryParameter(repositoryName)));\r
- add(new BookmarkablePageLink<Void>("log", LogPage.class,\r
- WicketUtils.newRepositoryParameter(repositoryName)));\r
- add(new BookmarkablePageLink<Void>("branches", BranchesPage.class,\r
- WicketUtils.newRepositoryParameter(repositoryName)));\r
- add(new BookmarkablePageLink<Void>("tags", TagsPage.class,\r
- WicketUtils.newRepositoryParameter(repositoryName)));\r
- add(new BookmarkablePageLink<Void>("tree", TreePage.class,\r
- WicketUtils.newRepositoryParameter(repositoryName)));\r
-\r
- // per-repository extra page links\r
- List<String> extraPageLinks = new ArrayList<String>();\r
-\r
- // Conditionally add tickets link\r
- if (model.useTickets && JGitUtils.getTicketsBranch(r) != null) {\r
- extraPageLinks.add("tickets");\r
- }\r
-\r
- // Conditionally add docs link\r
- if (model.useDocs) {\r
- extraPageLinks.add("docs");\r
- }\r
-\r
- final boolean showAdmin;\r
- if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {\r
- boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);\r
- showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();\r
- } else {\r
- showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);\r
- }\r
-\r
- // Conditionally add edit link\r
- if (showAdmin\r
- || GitBlitWebSession.get().isLoggedIn()\r
- && (model.owner != null && model.owner.equalsIgnoreCase(GitBlitWebSession.get()\r
- .getUser().username))) {\r
- extraPageLinks.add("edit");\r
- }\r
-\r
- ListDataProvider<String> extrasDp = new ListDataProvider<String>(extraPageLinks);\r
- DataView<String> extrasView = new DataView<String>("extra", extrasDp) {\r
- private static final long serialVersionUID = 1L;\r
-\r
- public void populateItem(final Item<String> item) {\r
- String extra = item.getModelObject();\r
- if (extra.equals("tickets")) {\r
- item.add(new Label("extraSeparator", " | "));\r
- item.add(new LinkPanel("extraLink", null, getString("gb.tickets"),\r
- TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));\r
- } else if (extra.equals("docs")) {\r
- item.add(new Label("extraSeparator", " | "));\r
- item.add(new LinkPanel("extraLink", null, getString("gb.docs"), DocsPage.class,\r
- WicketUtils.newRepositoryParameter(repositoryName)));\r
- } else if (extra.equals("edit")) {\r
- item.add(new Label("extraSeparator", " | "));\r
- item.add(new LinkPanel("extraLink", null, getString("gb.edit"),\r
- EditRepositoryPage.class, WicketUtils\r
- .newRepositoryParameter(repositoryName)));\r
- }\r
- }\r
- };\r
- add(extrasView);\r
-\r
- // disable current page\r
- disablePageLink(getPageName());\r
-\r
- // add floating search form\r
- SearchForm searchForm = new SearchForm("searchForm", repositoryName);\r
- add(searchForm);\r
- searchForm.setTranslatedAttributes();\r
-\r
- // set stateless page preference\r
- setStatelessHint(true);\r
- }\r
-\r
- public void disablePageLink(String pageName) {\r
- for (String wicketId : knownPages.keySet()) {\r
- String key = knownPages.get(wicketId);\r
- String linkName = getString(key);\r
- if (linkName.equals(pageName)) {\r
- Component c = get(wicketId);\r
- if (c != null) {\r
- c.setEnabled(false);\r
- }\r
- break;\r
- }\r
- }\r
- }\r
-\r
- protected Repository getRepository() {\r
- if (r == null) {\r
- Repository r = GitBlit.self().getRepository(repositoryName);\r
- if (r == null) {\r
- error("Can not load repository " + repositoryName, true);\r
- return null;\r
- }\r
- this.r = r;\r
- }\r
- return r;\r
- }\r
-\r
- protected RepositoryModel getRepositoryModel() {\r
- if (m == null) {\r
- RepositoryModel model = GitBlit.self().getRepositoryModel(\r
- GitBlitWebSession.get().getUser(), repositoryName);\r
- if (model == null) {\r
- error("Unauthorized access for repository " + repositoryName, true);\r
- return null;\r
- }\r
- m = model;\r
- }\r
- return m;\r
- }\r
-\r
- protected RevCommit getCommit() {\r
- RevCommit commit = JGitUtils.getCommit(r, objectId);\r
- if (commit == null) {\r
- error(MessageFormat.format("Failed to find commit \"{0}\" in {1} for {2} page!",\r
- objectId, repositoryName, getPageName()), true);\r
- }\r
- return commit;\r
- }\r
-\r
- protected void addRefs(Repository r, RevCommit c) {\r
- add(new RefsPanel("refsPanel", repositoryName, c, JGitUtils.getAllRefs(r)));\r
- }\r
-\r
- protected void addFullText(String wicketId, String text, boolean substituteRegex) {\r
- String html = StringUtils.breakLinesForHtml(text);\r
- if (substituteRegex) {\r
- Map<String, String> map = new HashMap<String, String>();\r
- // global regex keys\r
- if (GitBlit.getBoolean(Keys.regex.global, false)) {\r
- for (String key : GitBlit.getAllKeys(Keys.regex.global)) {\r
- if (!key.equals(Keys.regex.global)) {\r
- String subKey = key.substring(key.lastIndexOf('.') + 1);\r
- map.put(subKey, GitBlit.getString(key, ""));\r
- }\r
- }\r
- }\r
-\r
- // repository-specific regex keys\r
- List<String> keys = GitBlit.getAllKeys(Keys.regex._ROOT + "."\r
- + repositoryName.toLowerCase());\r
- for (String key : keys) {\r
- String subKey = key.substring(key.lastIndexOf('.') + 1);\r
- map.put(subKey, GitBlit.getString(key, ""));\r
- }\r
-\r
- for (Entry<String, String> entry : map.entrySet()) {\r
- String definition = entry.getValue().trim();\r
- String[] chunks = definition.split("!!!");\r
- if (chunks.length == 2) {\r
- html = html.replaceAll(chunks[0], chunks[1]);\r
- } else {\r
- logger.warn(entry.getKey()\r
- + " improperly formatted. Use !!! to separate match from replacement: "\r
- + definition);\r
- }\r
- }\r
- }\r
- add(new Label(wicketId, html).setEscapeModelStrings(false));\r
- }\r
-\r
- protected abstract String getPageName();\r
-\r
- protected Component createPersonPanel(String wicketId, PersonIdent identity,\r
- SearchType searchType) {\r
- boolean showEmail = GitBlit.getBoolean(Keys.web.showEmailAddresses, false);\r
- if (!showEmail || StringUtils.isEmpty(identity.getName())\r
- || StringUtils.isEmpty(identity.getEmailAddress())) {\r
- String value = identity.getName();\r
- if (StringUtils.isEmpty(value)) {\r
- if (showEmail) {\r
- value = identity.getEmailAddress();\r
- } else {\r
- value = getString("gb.missingUsername");\r
- }\r
- }\r
- Fragment partial = new Fragment(wicketId, "partialPersonIdent", this);\r
- LinkPanel link = new LinkPanel("personName", "list", value, SearchPage.class,\r
- WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType));\r
- setPersonSearchTooltip(link, value, searchType);\r
- partial.add(link);\r
- return partial;\r
- } else {\r
- Fragment fullPerson = new Fragment(wicketId, "fullPersonIdent", this);\r
- LinkPanel nameLink = new LinkPanel("personName", "list", identity.getName(),\r
- SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId,\r
- identity.getName(), searchType));\r
- setPersonSearchTooltip(nameLink, identity.getName(), searchType);\r
- fullPerson.add(nameLink);\r
-\r
- LinkPanel addressLink = new LinkPanel("personAddress", "list", "<"\r
- + identity.getEmailAddress() + ">", SearchPage.class,\r
- WicketUtils.newSearchParameter(repositoryName, objectId,\r
- identity.getEmailAddress(), searchType));\r
- setPersonSearchTooltip(addressLink, identity.getEmailAddress(), searchType);\r
- fullPerson.add(addressLink);\r
- return fullPerson;\r
- }\r
- }\r
-\r
- protected void setPersonSearchTooltip(Component component, String value, SearchType searchType) {\r
- if (searchType.equals(SearchType.AUTHOR)) {\r
- WicketUtils.setHtmlTooltip(component, getString("gb.searchForAuthor") + " " + value);\r
- } else if (searchType.equals(SearchType.COMMITTER)) {\r
- WicketUtils.setHtmlTooltip(component, getString("gb.searchForCommitter") + " " + value);\r
- }\r
- }\r
-\r
- protected void setChangeTypeTooltip(Component container, ChangeType type) {\r
- switch (type) {\r
- case ADD:\r
- WicketUtils.setHtmlTooltip(container, getString("gb.addition"));\r
- break;\r
- case COPY:\r
- case RENAME:\r
- WicketUtils.setHtmlTooltip(container, getString("gb.rename"));\r
- break;\r
- case DELETE:\r
- WicketUtils.setHtmlTooltip(container, getString("gb.deletion"));\r
- break;\r
- case MODIFY:\r
- WicketUtils.setHtmlTooltip(container, getString("gb.modification"));\r
- break;\r
- }\r
- }\r
-\r
- @Override\r
- protected void onBeforeRender() {\r
- // dispose of repository object\r
- if (r != null) {\r
- r.close();\r
- r = null;\r
- }\r
- // setup page header and footer\r
- setupPage(repositoryName, "/ " + getPageName());\r
- super.onBeforeRender();\r
- }\r
-\r
- protected PageParameters newRepositoryParameter() {\r
- return WicketUtils.newRepositoryParameter(repositoryName);\r
- }\r
-\r
- protected PageParameters newCommitParameter() {\r
- return WicketUtils.newObjectParameter(repositoryName, objectId);\r
- }\r
-\r
- protected PageParameters newCommitParameter(String commitId) {\r
- return WicketUtils.newObjectParameter(repositoryName, commitId);\r
- }\r
-\r
- protected PageParameters newPathParameter(String path) {\r
- return WicketUtils.newPathParameter(repositoryName, objectId, path);\r
- }\r
-\r
- private static class SearchForm extends StatelessForm<Void> {\r
- private static final long serialVersionUID = 1L;\r
-\r
- private final String repositoryName;\r
-\r
- private final IModel<String> searchBoxModel = new Model<String>("");\r
-\r
- private final IModel<SearchType> searchTypeModel = new Model<SearchType>(SearchType.COMMIT);\r
-\r
- public SearchForm(String id, String repositoryName) {\r
- super(id);\r
- this.repositoryName = repositoryName;\r
- DropDownChoice<SearchType> searchType = new DropDownChoice<SearchType>("searchType",\r
- Arrays.asList(SearchType.values()));\r
- searchType.setModel(searchTypeModel);\r
- add(searchType.setVisible(GitBlit.getBoolean(Keys.web.showSearchTypeSelection, false)));\r
- TextField<String> searchBox = new TextField<String>("searchBox", searchBoxModel);\r
- add(searchBox);\r
- }\r
-\r
- void setTranslatedAttributes() {\r
- WicketUtils.setHtmlTooltip(get("searchType"), getString("gb.searchTypeTooltip"));\r
- WicketUtils.setHtmlTooltip(get("searchBox"), getString("gb.searchTooltip"));\r
- WicketUtils.setInputPlaceholder(get("searchBox"), getString("gb.search"));\r
- }\r
-\r
- @Override\r
- public void onSubmit() {\r
- SearchType searchType = searchTypeModel.getObject();\r
- String searchString = searchBoxModel.getObject();\r
- for (SearchType type : SearchType.values()) {\r
- if (searchString.toLowerCase().startsWith(type.name().toLowerCase() + ":")) {\r
- searchType = type;\r
- searchString = searchString.substring(type.name().toLowerCase().length() + 1)\r
- .trim();\r
- break;\r
- }\r
- }\r
- setResponsePage(SearchPage.class,\r
- WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType));\r
- }\r
- }\r
-}\r
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket;\r
+\r
+import java.lang.annotation.ElementType;\r
+import java.lang.annotation.Retention;\r
+import java.lang.annotation.RetentionPolicy;\r
+import java.lang.annotation.Target;\r
+\r
+@Retention(RetentionPolicy.RUNTIME)\r
+@Target(ElementType.TYPE)\r
+public @interface RequiresAdminRole {\r
+}\r
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket.models;\r
-\r
-import java.io.Serializable;\r
-\r
-public class Metric implements Serializable {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- public String name;\r
- public double count;\r
- public double tag;\r
- public int duration;\r
-\r
- public Metric(String name) {\r
- this.name = name;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket.models;\r
-\r
-import java.io.Serializable;\r
-\r
-import org.eclipse.jgit.diff.DiffEntry.ChangeType;\r
-\r
-import com.gitblit.utils.JGitUtils;\r
-\r
-public class PathModel implements Serializable, Comparable<PathModel> {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- public final String name;\r
- public final String path;\r
- public final long size;\r
- public final int mode;\r
- public final String commitId;\r
- public boolean isParentPath;\r
-\r
- public PathModel(String name, String path, long size, int mode, String commitId) {\r
- this.name = name;\r
- this.path = path;\r
- this.size = size;\r
- this.mode = mode;\r
- this.commitId = commitId;\r
- }\r
-\r
- public boolean isTree() {\r
- return JGitUtils.isTreeFromMode(mode);\r
- }\r
-\r
- public static PathModel getParentPath(String basePath, String commitId) {\r
- String parentPath = null;\r
- if (basePath.lastIndexOf('/') > -1) {\r
- parentPath = basePath.substring(0, basePath.lastIndexOf('/'));\r
- }\r
- PathModel model = new PathModel("..", parentPath, 0, 40000, commitId);\r
- model.isParentPath = true;\r
- return model;\r
- }\r
-\r
- @Override\r
- public int hashCode() {\r
- return commitId.hashCode() + path.hashCode();\r
- }\r
-\r
- @Override\r
- public boolean equals(Object o) {\r
- if (o instanceof PathModel) {\r
- PathModel other = (PathModel) o;\r
- return this.path.equals(other.path);\r
- }\r
- return super.equals(o);\r
- }\r
-\r
- @Override\r
- public int compareTo(PathModel o) {\r
- boolean isTree = isTree();\r
- boolean otherTree = o.isTree();\r
- if (isTree && otherTree) {\r
- return path.compareTo(o.path);\r
- } else if (!isTree && !otherTree) {\r
- return path.compareTo(o.path);\r
- } else if (isTree && !otherTree) {\r
- return -1;\r
- }\r
- return 1;\r
- }\r
-\r
- public static class PathChangeModel extends PathModel {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- public final ChangeType changeType;\r
-\r
- public PathChangeModel(String name, String path, long size, int mode, String commitId,\r
- ChangeType type) {\r
- super(name, path, size, mode, commitId);\r
- this.changeType = type;\r
- }\r
-\r
- @Override\r
- public int hashCode() {\r
- return super.hashCode();\r
- }\r
-\r
- @Override\r
- public boolean equals(Object o) {\r
- return super.equals(o);\r
- }\r
- }\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket.models;\r
-\r
-import java.io.Serializable;\r
-import java.util.Date;\r
-\r
-import org.eclipse.jgit.lib.ObjectId;\r
-import org.eclipse.jgit.lib.Ref;\r
-import org.eclipse.jgit.revwalk.RevCommit;\r
-\r
-import com.gitblit.utils.JGitUtils;\r
-\r
-public class RefModel implements Serializable, Comparable<RefModel> {\r
-\r
- private static final long serialVersionUID = 1L;\r
- public final String displayName;\r
- public final RevCommit commit;\r
- public transient Ref ref;\r
-\r
- public RefModel(String displayName, Ref ref, RevCommit commit) {\r
- this.displayName = displayName;\r
- this.ref = ref;\r
- this.commit = commit;\r
- }\r
-\r
- public Date getDate() {\r
- return JGitUtils.getCommitDate(commit);\r
- }\r
-\r
- public String getName() {\r
- return ref.getName();\r
- }\r
-\r
- public ObjectId getCommitId() {\r
- return commit.getId();\r
- }\r
-\r
- public String getShortLog() {\r
- return commit.getShortMessage();\r
- }\r
-\r
- public ObjectId getObjectId() {\r
- return ref.getObjectId();\r
- }\r
-\r
- public boolean isAnnotatedTag() {\r
- // ref.isPeeled() ??\r
- return !getCommitId().equals(getObjectId());\r
- }\r
-\r
- @Override\r
- public int hashCode() {\r
- return getCommitId().hashCode() + getName().hashCode();\r
- }\r
-\r
- @Override\r
- public boolean equals(Object o) {\r
- if (o instanceof RefModel) {\r
- RefModel other = (RefModel) o;\r
- return getName().equals(other.getName());\r
- }\r
- return super.equals(o);\r
- }\r
-\r
- @Override\r
- public int compareTo(RefModel o) {\r
- return getDate().compareTo(o.getDate());\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket.models;\r
-\r
-import java.io.Serializable;\r
-import java.util.Date;\r
-\r
-import com.gitblit.Constants.AccessRestrictionType;\r
-\r
-public class RepositoryModel implements Serializable {\r
-\r
- private static final long serialVersionUID = 1L;\r
- \r
- // field names are reflectively mapped in EditRepository page\r
- public String name;\r
- public String description;\r
- public String owner;\r
- public Date lastChange;\r
- public boolean hasCommits;\r
- public boolean showRemoteBranches;\r
- public boolean useTickets;\r
- public boolean useDocs;\r
- public AccessRestrictionType accessRestriction;\r
- public boolean isFrozen;\r
-\r
- public RepositoryModel() {\r
- this.name = "";\r
- this.description = "";\r
- this.owner = "";\r
- this.lastChange = new Date(0);\r
- this.accessRestriction = AccessRestrictionType.NONE;\r
- }\r
-\r
- public RepositoryModel(String name, String description, String owner, Date lastchange) {\r
- this.name = name;\r
- this.description = description;\r
- this.owner = owner;\r
- this.lastChange = lastchange;\r
- this.accessRestriction = AccessRestrictionType.NONE;\r
- }\r
-\r
- @Override\r
- public String toString() {\r
- return name;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket.models;\r
-\r
-import java.io.Serializable;\r
-import java.text.ParseException;\r
-import java.util.ArrayList;\r
-import java.util.Date;\r
-import java.util.List;\r
-\r
-public class TicketModel implements Serializable, Comparable<TicketModel> {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- public String id;\r
- public String name;\r
- public String title;\r
- public String state;\r
- public Date date;\r
- public String handler;\r
- public String milestone;\r
- public String email;\r
- public String author;\r
- public List<Comment> comments;\r
- public List<String> tags;\r
-\r
- public TicketModel() {\r
- state = "open";\r
- comments = new ArrayList<Comment>();\r
- tags = new ArrayList<String>();\r
- }\r
-\r
- public TicketModel(String ticketName) throws ParseException {\r
- state = "";\r
- name = ticketName;\r
- comments = new ArrayList<Comment>();\r
- tags = new ArrayList<String>();\r
-\r
- String[] chunks = name.split("_");\r
- if (chunks.length == 3) {\r
- date = new Date(Long.parseLong(chunks[0]) * 1000L);\r
- title = chunks[1].replace('-', ' ');\r
- }\r
- }\r
-\r
- public static class Comment implements Serializable, Comparable<Comment> {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- public String text;\r
- public String author;\r
- public Date date;\r
-\r
- public Comment(String text, Date date) {\r
- this.text = text;\r
- this.date = date;\r
- }\r
-\r
- public Comment(String filename, String content) throws ParseException {\r
- String[] chunks = filename.split("_", -1);\r
- this.date = new Date(Long.parseLong(chunks[1]) * 1000L);\r
- this.author = chunks[2];\r
- this.text = content;\r
- }\r
-\r
- @Override\r
- public int hashCode() {\r
- return text.hashCode();\r
- }\r
-\r
- @Override\r
- public boolean equals(Object o) {\r
- if (o instanceof Comment) {\r
- Comment other = (Comment) o;\r
- return text.equals(other.text);\r
- }\r
- return super.equals(o);\r
- }\r
-\r
- @Override\r
- public int compareTo(Comment o) {\r
- return date.compareTo(o.date);\r
- }\r
- }\r
-\r
- @Override\r
- public int hashCode() {\r
- return id.hashCode();\r
- }\r
-\r
- @Override\r
- public boolean equals(Object o) {\r
- if (o instanceof TicketModel) {\r
- TicketModel other = (TicketModel) o;\r
- return id.equals(other.id);\r
- }\r
- return super.equals(o);\r
- }\r
-\r
- @Override\r
- public int compareTo(TicketModel o) {\r
- return date.compareTo(o.date);\r
- }\r
-}\r
+++ /dev/null
-/*\r
- * Copyright 2011 gitblit.com.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package com.gitblit.wicket.models;\r
-\r
-import java.io.Serializable;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-public class UserModel implements Serializable {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- // field names are reflectively mapped in EditUser page\r
- public String username;\r
- public String password;\r
- public boolean canAdmin;\r
- public final List<String> repositories = new ArrayList<String>();\r
-\r
- public UserModel(String username) {\r
- this.username = username;\r
- }\r
-\r
- public boolean canAccessRepository(String repositoryName) {\r
- return canAdmin || repositories.contains(repositoryName);\r
- }\r
-\r
- public void setRepositories(List<String> repositories) {\r
- this.repositories.clear();\r
- this.repositories.addAll(repositories);\r
- }\r
-\r
- public void addRepository(String name) {\r
- repositories.add(name.toLowerCase());\r
- }\r
-\r
- @Override\r
- public String toString() {\r
- return username;\r
- }\r
-}\r
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" \r
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" \r
+ xml:lang="en" \r
+ lang="en"> \r
+\r
+ <!-- Head with Wicket-controlled resources in this package -->\r
+ <wicket:head>\r
+ <title wicket:id="title">[page title]</title>\r
+ <wicket:link>\r
+ <link rel="stylesheet" type="text/css" href="/com/gitblit/wicket/resources/gitblit.css"/>\r
+ <link rel="shortcut icon" href="/com/gitblit/wicket/resources/gitblt-favicon.png" type="image/png" />\r
+ </wicket:link>\r
+ </wicket:head>\r
+\r
+ <body>\r
+ <!-- page header -->\r
+ <div class="page_header">\r
+ <a title="gitblit homepage" href="http://gitblit.com/">\r
+ <wicket:link>\r
+ <img src="/com/gitblit/wicket/resources/gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>\r
+ </wicket:link>\r
+ </a>\r
+ <span>\r
+ <a href="/"><span wicket:id="siteName">[site name]</span></a> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span>\r
+ </span> \r
+ </div>\r
+\r
+ <!-- page content -->\r
+ <wicket:child />\r
+ \r
+ <!-- page footer -->\r
+ <div class="page_footer">\r
+ <div style="float:right">\r
+ <span wicket:id="gbVersion"></span> \r
+ </div>\r
+ <div wicket:id="userPanel">[user panel]</div>\r
+ </div>\r
+ </body>\r
+</html>
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket.pages;\r
+\r
+import java.util.LinkedHashMap;\r
+import java.util.Map;\r
+import java.util.TimeZone;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+\r
+import org.apache.wicket.PageParameters;\r
+import org.apache.wicket.RestartResponseAtInterceptPageException;\r
+import org.apache.wicket.markup.html.WebPage;\r
+import org.apache.wicket.markup.html.basic.Label;\r
+import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
+import org.apache.wicket.protocol.http.servlet.ServletWebRequest;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import com.gitblit.Constants;\r
+import com.gitblit.Constants.AccessRestrictionType;\r
+import com.gitblit.GitBlit;\r
+import com.gitblit.Keys;\r
+import com.gitblit.wicket.GitBlitWebSession;\r
+import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.panels.LinkPanel;\r
+\r
+public abstract class BasePage extends WebPage {\r
+\r
+ private final Logger logger;\r
+\r
+ public BasePage() {\r
+ super();\r
+ logger = LoggerFactory.getLogger(getClass());\r
+ }\r
+\r
+ public BasePage(PageParameters params) {\r
+ super(params);\r
+ logger = LoggerFactory.getLogger(getClass());\r
+ }\r
+\r
+ protected void setupPage(String repositoryName, String pageName) {\r
+ if (repositoryName != null && repositoryName.trim().length() > 0) {\r
+ add(new Label("title", getServerName() + " - " + repositoryName));\r
+ } else {\r
+ add(new Label("title", getServerName()));\r
+ }\r
+ // header\r
+ String siteName = GitBlit.getString(Keys.web.siteName, Constants.NAME);\r
+ if (siteName == null || siteName.trim().length() == 0) {\r
+ siteName = Constants.NAME;\r
+ }\r
+ add(new Label("siteName", siteName));\r
+ add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class,\r
+ WicketUtils.newRepositoryParameter(repositoryName)));\r
+ add(new Label("pageName", pageName));\r
+\r
+ // Feedback panel for info, warning, and non-fatal error messages\r
+ add(new FeedbackPanel("feedback"));\r
+\r
+ // footer\r
+ if (GitBlit.getBoolean(Keys.web.authenticateViewPages, true)\r
+ || GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {\r
+ if (GitBlitWebSession.get().isLoggedIn()) {\r
+ // logout\r
+ add(new LinkPanel("userPanel", null, getString("gb.logout") + " "\r
+ + GitBlitWebSession.get().getUser().toString(), LogoutPage.class));\r
+ } else {\r
+ // login\r
+ add(new LinkPanel("userPanel", null, getString("gb.login"), LoginPage.class));\r
+ }\r
+ } else {\r
+ add(new Label("userPanel", ""));\r
+ }\r
+ add(new Label("gbVersion", "v" + Constants.VERSION));\r
+ if (GitBlit.getBoolean(Keys.web.aggressiveHeapManagement, false)) {\r
+ System.gc();\r
+ }\r
+ }\r
+\r
+ protected Map<AccessRestrictionType, String> getAccessRestrictions() {\r
+ Map<AccessRestrictionType, String> map = new LinkedHashMap<AccessRestrictionType, String>();\r
+ for (AccessRestrictionType type : AccessRestrictionType.values()) {\r
+ switch (type) {\r
+ case NONE:\r
+ map.put(type, getString("gb.notRestricted"));\r
+ break;\r
+ case PUSH:\r
+ map.put(type, getString("gb.pushRestricted"));\r
+ break;\r
+ case CLONE:\r
+ map.put(type, getString("gb.cloneRestricted"));\r
+ break;\r
+ case VIEW:\r
+ map.put(type, getString("gb.viewRestricted"));\r
+ break;\r
+ }\r
+ }\r
+ return map;\r
+ }\r
+\r
+ protected TimeZone getTimeZone() {\r
+ return GitBlit.getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get()\r
+ .getTimezone() : TimeZone.getDefault();\r
+ }\r
+\r
+ protected String getServerName() {\r
+ ServletWebRequest servletWebRequest = (ServletWebRequest) getRequest();\r
+ HttpServletRequest req = servletWebRequest.getHttpServletRequest();\r
+ return req.getServerName();\r
+ }\r
+\r
+ public void error(String message, boolean redirect) {\r
+ logger.error(message);\r
+ if (redirect) {\r
+ GitBlitWebSession.get().cacheErrorMessage(message);\r
+ throw new RestartResponseAtInterceptPageException(getApplication().getHomePage());\r
+ } else {\r
+ super.error(message);\r
+ }\r
+ }\r
+\r
+ public void error(String message, Throwable t, boolean redirect) {\r
+ logger.error(message, t);\r
+ if (redirect) {\r
+ GitBlitWebSession.get().cacheErrorMessage(message);\r
+ throw new RestartResponseAtInterceptPageException(getApplication().getHomePage());\r
+ } else {\r
+ super.error(message);\r
+ }\r
+ }\r
+}\r
\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
+import com.gitblit.utils.DiffUtils;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.JGitUtils.DiffOutputType;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.panels.CommitHeaderPanel;\r
import com.gitblit.wicket.panels.PathBreadcrumbsPanel;\r
String diff;\r
if (StringUtils.isEmpty(baseObjectId)) {\r
// use first parent\r
- diff = JGitUtils.getCommitDiff(r, commit, blobPath, diffType);\r
+ diff = DiffUtils.getCommitDiff(r, commit, blobPath, diffType);\r
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,\r
WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));\r
} else {\r
// base commit specified\r
RevCommit baseCommit = JGitUtils.getCommit(r, baseObjectId);\r
- diff = JGitUtils.getCommitDiff(r, baseCommit, commit, blobPath, diffType);\r
+ diff = DiffUtils.getCommitDiff(r, baseCommit, commit, blobPath, diffType);\r
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,\r
WicketUtils.newBlobDiffParameter(repositoryName, baseObjectId, objectId,\r
blobPath)));\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
import com.gitblit.utils.JGitUtils;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.panels.CommitHeaderPanel;\r
import com.gitblit.wicket.panels.PathBreadcrumbsPanel;\r
\r
import org.apache.wicket.PageParameters;\r
\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.panels.BranchesPanel;\r
\r
public class BranchesPage extends RepositoryPage {\r
\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
+import com.gitblit.models.PathModel.PathChangeModel;\r
+import com.gitblit.utils.DiffUtils;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.JGitUtils.DiffOutputType;\r
-import com.gitblit.wicket.LinkPanel;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.PathModel.PathChangeModel;\r
import com.gitblit.wicket.panels.CommitHeaderPanel;\r
import com.gitblit.wicket.panels.CommitLegendPanel;\r
+import com.gitblit.wicket.panels.LinkPanel;\r
\r
public class CommitDiffPage extends RepositoryPage {\r
\r
RevCommit commit = getCommit();\r
DiffOutputType diffType = DiffOutputType.forName(GitBlit.getString(Keys.web.diffStyle,\r
DiffOutputType.GITBLIT.name()));\r
- String diff = JGitUtils.getCommitDiff(r, commit, diffType);\r
+ String diff = DiffUtils.getCommitDiff(r, commit, diffType);\r
\r
List<String> parents = new ArrayList<String>();\r
if (commit.getParentCount() > 0) {\r
import com.gitblit.DownloadZipServlet;\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
+import com.gitblit.models.PathModel.PathChangeModel;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.JGitUtils.SearchType;\r
-import com.gitblit.wicket.LinkPanel;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.PathModel.PathChangeModel;\r
import com.gitblit.wicket.panels.CommitHeaderPanel;\r
import com.gitblit.wicket.panels.CommitLegendPanel;\r
+import com.gitblit.wicket.panels.LinkPanel;\r
\r
public class CommitPage extends RepositoryPage {\r
\r
\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
+import com.gitblit.models.PathModel;\r
import com.gitblit.utils.ByteFormat;\r
import com.gitblit.utils.JGitUtils;\r
-import com.gitblit.wicket.LinkPanel;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.PathModel;\r
+import com.gitblit.wicket.panels.LinkPanel;\r
\r
public class DocsPage extends RepositoryPage {\r
\r
import com.gitblit.GitBlit;\r
import com.gitblit.GitBlitException;\r
import com.gitblit.Keys;\r
+import com.gitblit.models.RepositoryModel;\r
+import com.gitblit.models.UserModel;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.BasePage;\r
import com.gitblit.wicket.GitBlitWebSession;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.RepositoryModel;\r
-import com.gitblit.wicket.models.UserModel;\r
\r
public class EditRepositoryPage extends BasePage {\r
\r
// create constructor\r
super();\r
isCreate = true;\r
- setupPage(new RepositoryModel("", "", "", new Date()));\r
+ setupPage(new RepositoryModel());\r
}\r
\r
public EditRepositoryPage(PageParameters params) {\r
import com.gitblit.GitBlit;\r
import com.gitblit.GitBlitException;\r
import com.gitblit.Keys;\r
+import com.gitblit.models.RepositoryModel;\r
+import com.gitblit.models.UserModel;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.AdminPage;\r
-import com.gitblit.wicket.BasePage;\r
+import com.gitblit.wicket.RequiresAdminRole;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.RepositoryModel;\r
-import com.gitblit.wicket.models.UserModel;\r
\r
-@AdminPage\r
+@RequiresAdminRole\r
public class EditUserPage extends BasePage {\r
\r
private final boolean isCreate;\r
import org.apache.wicket.PageParameters;\r
import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.panels.HistoryPanel;\r
\r
import org.apache.wicket.PageParameters;\r
import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.panels.LogPanel;\r
\r
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" \r
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" \r
+ xml:lang="en" \r
+ lang="en"> \r
+ \r
+ <!-- Head with Wicket-controlled resources in this package -->\r
+ <wicket:head>\r
+ <title wicket:id="title">[page title]</title>\r
+ <wicket:link>\r
+ <link rel="stylesheet" type="text/css" href="/com/gitblit/wicket/resources/gitblit.css"/>\r
+ <link rel="shortcut icon" href="/com/gitblit/wicket/resources/gitblt-favicon.png" type="image/png" />\r
+ </wicket:link>\r
+ </wicket:head>\r
+ \r
+ <body onload="document.getElementById('username').focus();">\r
+ <div>\r
+ <div style="padding-top: 10px;text-align:center;">\r
+ <wicket:link>\r
+ <img src="/com/gitblit/wicket/resources/gitblt_25.png" alt="Git:Blit"/><br/>\r
+ </wicket:link>\r
+ <div style="padding-top:30px;font-weight:bold;" wicket:id="name">[name]</div>\r
+ </div>\r
+\r
+ <form style="text-align:center;" wicket:id="loginForm">\r
+ <div>\r
+ <p/>\r
+ <wicket:message key="gb.username"></wicket:message> \r
+ <input type="text" id="username" wicket:id="username" value=""/>\r
+ <p/>\r
+ <wicket:message key="gb.password"></wicket:message> \r
+ <input type="password" wicket:id="password" value=""/>\r
+ <p/>\r
+ <input type="submit" value="Login" wicket:message="value:gb.login" />\r
+ <div style="padding-top:10px;" wicket:id="feedback"></div>\r
+ </div>\r
+ </form> \r
+ </div>\r
+ </body>\r
+</html>
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket.pages;\r
+\r
+import org.apache.wicket.PageParameters;\r
+import org.apache.wicket.markup.html.WebPage;\r
+import org.apache.wicket.markup.html.basic.Label;\r
+import org.apache.wicket.markup.html.form.PasswordTextField;\r
+import org.apache.wicket.markup.html.form.StatelessForm;\r
+import org.apache.wicket.markup.html.form.TextField;\r
+import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
+import org.apache.wicket.model.IModel;\r
+import org.apache.wicket.model.Model;\r
+\r
+import com.gitblit.Constants;\r
+import com.gitblit.GitBlit;\r
+import com.gitblit.Keys;\r
+import com.gitblit.models.UserModel;\r
+import com.gitblit.wicket.GitBlitWebSession;\r
+\r
+public class LoginPage extends WebPage {\r
+\r
+ IModel<String> username = new Model<String>("");\r
+ IModel<String> password = new Model<String>("");\r
+\r
+ public LoginPage(PageParameters params) {\r
+ super(params);\r
+\r
+ // If we are already logged in because user directly accessed\r
+ // the login url, redirect to the home page\r
+ if (GitBlitWebSession.get().isLoggedIn()) {\r
+ setRedirect(true);\r
+ setResponsePage(getApplication().getHomePage());\r
+ }\r
+ \r
+ add(new Label("title", GitBlit.getString(Keys.web.siteName, Constants.NAME)));\r
+ add(new Label("name", Constants.NAME));\r
+\r
+ StatelessForm<Void> loginForm = new StatelessForm<Void>("loginForm") {\r
+ \r
+ private static final long serialVersionUID = 1L;\r
+\r
+ @Override\r
+ public void onSubmit() {\r
+ String username = LoginPage.this.username.getObject();\r
+ char[] password = LoginPage.this.password.getObject().toCharArray();\r
+\r
+ UserModel user = GitBlit.self().authenticate(username, password);\r
+ if (user == null) {\r
+ error("Invalid username or password!");\r
+ } else {\r
+ loginUser(user);\r
+ }\r
+ }\r
+ };\r
+ loginForm.add(new TextField<String>("username", username));\r
+ loginForm.add(new PasswordTextField("password", password));\r
+ loginForm.add(new FeedbackPanel("feedback"));\r
+ add(loginForm);\r
+ }\r
+\r
+ private void loginUser(UserModel user) {\r
+ if (user != null) {\r
+ // Set the user into the session\r
+ GitBlitWebSession.get().setUser(user);\r
+\r
+ if (!continueToOriginalDestination()) {\r
+ // Redirect to home page\r
+ setResponsePage(getApplication().getHomePage());\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket.pages;\r
+\r
+import org.apache.wicket.markup.html.WebPage;\r
+\r
+public class LogoutPage extends WebPage {\r
+\r
+ public LogoutPage() {\r
+ getSession().invalidate();\r
+ setRedirect(true);\r
+ setResponsePage(getApplication().getHomePage());\r
+ }\r
+}
\ No newline at end of file
\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.MarkdownUtils;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
\r
public class MarkdownPage extends RepositoryPage {\r
import org.eclipse.jgit.revwalk.RevCommit;\r
\r
import com.gitblit.GitBlit;\r
+import com.gitblit.utils.DiffUtils;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.StringUtils;\r
import com.gitblit.wicket.GitBlitWebSession;\r
if (!StringUtils.isEmpty(baseObjectId)) {\r
baseCommit = JGitUtils.getCommit(r, baseObjectId);\r
}\r
- String patch = JGitUtils.getCommitPatch(r, baseCommit, commit, blobPath);\r
+ String patch = DiffUtils.getCommitPatch(r, baseCommit, commit, blobPath);\r
add(new Label("patchText", patch));\r
r.close();\r
}\r
import com.gitblit.Keys;\r
import com.gitblit.utils.MarkdownUtils;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.BasePage;\r
import com.gitblit.wicket.GitBlitWebSession;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.panels.RepositoriesPanel;\r
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" \r
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" \r
+ xml:lang="en" \r
+ lang="en"> \r
+\r
+<body>\r
+ <wicket:extend>\r
+ <!-- page header bar --> \r
+ <div>\r
+ <!-- floating search form on right -->\r
+ <form wicket:id="searchForm">\r
+ <div class="search">\r
+ <select wicket:id="searchType"/> \r
+ <input type="text" id="searchBox" wicket:id="searchBox" size="25" value=""/>\r
+ </div>\r
+ </form>\r
+ \r
+ <!-- page nav links -->\r
+ <div class="page_nav"> \r
+ <a wicket:id="summary"><wicket:message key="gb.summary"></wicket:message></a> | <a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a> | <a wicket:id="branches"><wicket:message key="gb.branches"></wicket:message></a> | <a wicket:id="tags"><wicket:message key="gb.tags"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a> <span wicket:id="extra"><span wicket:id="extraSeparator"></span><span wicket:id="extraLink"></span></span>\r
+ </div>\r
+ </div>\r
+ \r
+ <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>\r
+ \r
+ <!-- page content -->\r
+ <wicket:child />\r
+ \r
+ </wicket:extend>\r
+</body>\r
+</html>
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket.pages;\r
+\r
+import java.text.MessageFormat;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+\r
+import org.apache.wicket.Component;\r
+import org.apache.wicket.PageParameters;\r
+import org.apache.wicket.markup.html.basic.Label;\r
+import org.apache.wicket.markup.html.form.DropDownChoice;\r
+import org.apache.wicket.markup.html.form.StatelessForm;\r
+import org.apache.wicket.markup.html.form.TextField;\r
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
+import org.apache.wicket.markup.html.panel.Fragment;\r
+import org.apache.wicket.markup.repeater.Item;\r
+import org.apache.wicket.markup.repeater.data.DataView;\r
+import org.apache.wicket.markup.repeater.data.ListDataProvider;\r
+import org.apache.wicket.model.IModel;\r
+import org.apache.wicket.model.Model;\r
+import org.eclipse.jgit.diff.DiffEntry.ChangeType;\r
+import org.eclipse.jgit.lib.PersonIdent;\r
+import org.eclipse.jgit.lib.Repository;\r
+import org.eclipse.jgit.revwalk.RevCommit;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import com.gitblit.GitBlit;\r
+import com.gitblit.Keys;\r
+import com.gitblit.models.RepositoryModel;\r
+import com.gitblit.utils.JGitUtils;\r
+import com.gitblit.utils.JGitUtils.SearchType;\r
+import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.GitBlitWebSession;\r
+import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.panels.LinkPanel;\r
+import com.gitblit.wicket.panels.RefsPanel;\r
+\r
+public abstract class RepositoryPage extends BasePage {\r
+\r
+ protected final String repositoryName;\r
+ protected final String objectId;\r
+\r
+ private transient Repository r;\r
+\r
+ private RepositoryModel m;\r
+\r
+ private final Logger logger = LoggerFactory.getLogger(RepositoryPage.class);\r
+\r
+ private final Map<String, String> knownPages = new HashMap<String, String>() {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ {\r
+ put("summary", "gb.summary");\r
+ put("log", "gb.log");\r
+ put("branches", "gb.branches");\r
+ put("tags", "gb.tags");\r
+ put("tree", "gb.tree");\r
+ put("tickets", "gb.tickets");\r
+ put("edit", "gb.edit");\r
+ }\r
+ };\r
+\r
+ public RepositoryPage(PageParameters params) {\r
+ super(params);\r
+ repositoryName = WicketUtils.getRepositoryName(params);\r
+ objectId = WicketUtils.getObject(params);\r
+\r
+ if (StringUtils.isEmpty(repositoryName)) {\r
+ error(MessageFormat.format("Repository not specified for {0}!", getPageName()), true);\r
+ }\r
+\r
+ Repository r = getRepository();\r
+ RepositoryModel model = getRepositoryModel();\r
+\r
+ // standard page links\r
+ add(new BookmarkablePageLink<Void>("summary", SummaryPage.class,\r
+ WicketUtils.newRepositoryParameter(repositoryName)));\r
+ add(new BookmarkablePageLink<Void>("log", LogPage.class,\r
+ WicketUtils.newRepositoryParameter(repositoryName)));\r
+ add(new BookmarkablePageLink<Void>("branches", BranchesPage.class,\r
+ WicketUtils.newRepositoryParameter(repositoryName)));\r
+ add(new BookmarkablePageLink<Void>("tags", TagsPage.class,\r
+ WicketUtils.newRepositoryParameter(repositoryName)));\r
+ add(new BookmarkablePageLink<Void>("tree", TreePage.class,\r
+ WicketUtils.newRepositoryParameter(repositoryName)));\r
+\r
+ // per-repository extra page links\r
+ List<String> extraPageLinks = new ArrayList<String>();\r
+\r
+ // Conditionally add tickets link\r
+ if (model.useTickets && JGitUtils.getTicketsBranch(r) != null) {\r
+ extraPageLinks.add("tickets");\r
+ }\r
+\r
+ // Conditionally add docs link\r
+ if (model.useDocs) {\r
+ extraPageLinks.add("docs");\r
+ }\r
+\r
+ final boolean showAdmin;\r
+ if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {\r
+ boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);\r
+ showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();\r
+ } else {\r
+ showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);\r
+ }\r
+\r
+ // Conditionally add edit link\r
+ if (showAdmin\r
+ || GitBlitWebSession.get().isLoggedIn()\r
+ && (model.owner != null && model.owner.equalsIgnoreCase(GitBlitWebSession.get()\r
+ .getUser().username))) {\r
+ extraPageLinks.add("edit");\r
+ }\r
+\r
+ ListDataProvider<String> extrasDp = new ListDataProvider<String>(extraPageLinks);\r
+ DataView<String> extrasView = new DataView<String>("extra", extrasDp) {\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public void populateItem(final Item<String> item) {\r
+ String extra = item.getModelObject();\r
+ if (extra.equals("tickets")) {\r
+ item.add(new Label("extraSeparator", " | "));\r
+ item.add(new LinkPanel("extraLink", null, getString("gb.tickets"),\r
+ TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));\r
+ } else if (extra.equals("docs")) {\r
+ item.add(new Label("extraSeparator", " | "));\r
+ item.add(new LinkPanel("extraLink", null, getString("gb.docs"), DocsPage.class,\r
+ WicketUtils.newRepositoryParameter(repositoryName)));\r
+ } else if (extra.equals("edit")) {\r
+ item.add(new Label("extraSeparator", " | "));\r
+ item.add(new LinkPanel("extraLink", null, getString("gb.edit"),\r
+ EditRepositoryPage.class, WicketUtils\r
+ .newRepositoryParameter(repositoryName)));\r
+ }\r
+ }\r
+ };\r
+ add(extrasView);\r
+\r
+ // disable current page\r
+ disablePageLink(getPageName());\r
+\r
+ // add floating search form\r
+ SearchForm searchForm = new SearchForm("searchForm", repositoryName);\r
+ add(searchForm);\r
+ searchForm.setTranslatedAttributes();\r
+\r
+ // set stateless page preference\r
+ setStatelessHint(true);\r
+ }\r
+\r
+ public void disablePageLink(String pageName) {\r
+ for (String wicketId : knownPages.keySet()) {\r
+ String key = knownPages.get(wicketId);\r
+ String linkName = getString(key);\r
+ if (linkName.equals(pageName)) {\r
+ Component c = get(wicketId);\r
+ if (c != null) {\r
+ c.setEnabled(false);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ protected Repository getRepository() {\r
+ if (r == null) {\r
+ Repository r = GitBlit.self().getRepository(repositoryName);\r
+ if (r == null) {\r
+ error("Can not load repository " + repositoryName, true);\r
+ return null;\r
+ }\r
+ this.r = r;\r
+ }\r
+ return r;\r
+ }\r
+\r
+ protected RepositoryModel getRepositoryModel() {\r
+ if (m == null) {\r
+ RepositoryModel model = GitBlit.self().getRepositoryModel(\r
+ GitBlitWebSession.get().getUser(), repositoryName);\r
+ if (model == null) {\r
+ error("Unauthorized access for repository " + repositoryName, true);\r
+ return null;\r
+ }\r
+ m = model;\r
+ }\r
+ return m;\r
+ }\r
+\r
+ protected RevCommit getCommit() {\r
+ RevCommit commit = JGitUtils.getCommit(r, objectId);\r
+ if (commit == null) {\r
+ error(MessageFormat.format("Failed to find commit \"{0}\" in {1} for {2} page!",\r
+ objectId, repositoryName, getPageName()), true);\r
+ }\r
+ return commit;\r
+ }\r
+\r
+ protected void addRefs(Repository r, RevCommit c) {\r
+ add(new RefsPanel("refsPanel", repositoryName, c, JGitUtils.getAllRefs(r)));\r
+ }\r
+\r
+ protected void addFullText(String wicketId, String text, boolean substituteRegex) {\r
+ String html = StringUtils.breakLinesForHtml(text);\r
+ if (substituteRegex) {\r
+ Map<String, String> map = new HashMap<String, String>();\r
+ // global regex keys\r
+ if (GitBlit.getBoolean(Keys.regex.global, false)) {\r
+ for (String key : GitBlit.getAllKeys(Keys.regex.global)) {\r
+ if (!key.equals(Keys.regex.global)) {\r
+ String subKey = key.substring(key.lastIndexOf('.') + 1);\r
+ map.put(subKey, GitBlit.getString(key, ""));\r
+ }\r
+ }\r
+ }\r
+\r
+ // repository-specific regex keys\r
+ List<String> keys = GitBlit.getAllKeys(Keys.regex._ROOT + "."\r
+ + repositoryName.toLowerCase());\r
+ for (String key : keys) {\r
+ String subKey = key.substring(key.lastIndexOf('.') + 1);\r
+ map.put(subKey, GitBlit.getString(key, ""));\r
+ }\r
+\r
+ for (Entry<String, String> entry : map.entrySet()) {\r
+ String definition = entry.getValue().trim();\r
+ String[] chunks = definition.split("!!!");\r
+ if (chunks.length == 2) {\r
+ html = html.replaceAll(chunks[0], chunks[1]);\r
+ } else {\r
+ logger.warn(entry.getKey()\r
+ + " improperly formatted. Use !!! to separate match from replacement: "\r
+ + definition);\r
+ }\r
+ }\r
+ }\r
+ add(new Label(wicketId, html).setEscapeModelStrings(false));\r
+ }\r
+\r
+ protected abstract String getPageName();\r
+\r
+ protected Component createPersonPanel(String wicketId, PersonIdent identity,\r
+ SearchType searchType) {\r
+ boolean showEmail = GitBlit.getBoolean(Keys.web.showEmailAddresses, false);\r
+ if (!showEmail || StringUtils.isEmpty(identity.getName())\r
+ || StringUtils.isEmpty(identity.getEmailAddress())) {\r
+ String value = identity.getName();\r
+ if (StringUtils.isEmpty(value)) {\r
+ if (showEmail) {\r
+ value = identity.getEmailAddress();\r
+ } else {\r
+ value = getString("gb.missingUsername");\r
+ }\r
+ }\r
+ Fragment partial = new Fragment(wicketId, "partialPersonIdent", this);\r
+ LinkPanel link = new LinkPanel("personName", "list", value, SearchPage.class,\r
+ WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType));\r
+ setPersonSearchTooltip(link, value, searchType);\r
+ partial.add(link);\r
+ return partial;\r
+ } else {\r
+ Fragment fullPerson = new Fragment(wicketId, "fullPersonIdent", this);\r
+ LinkPanel nameLink = new LinkPanel("personName", "list", identity.getName(),\r
+ SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId,\r
+ identity.getName(), searchType));\r
+ setPersonSearchTooltip(nameLink, identity.getName(), searchType);\r
+ fullPerson.add(nameLink);\r
+\r
+ LinkPanel addressLink = new LinkPanel("personAddress", "list", "<"\r
+ + identity.getEmailAddress() + ">", SearchPage.class,\r
+ WicketUtils.newSearchParameter(repositoryName, objectId,\r
+ identity.getEmailAddress(), searchType));\r
+ setPersonSearchTooltip(addressLink, identity.getEmailAddress(), searchType);\r
+ fullPerson.add(addressLink);\r
+ return fullPerson;\r
+ }\r
+ }\r
+\r
+ protected void setPersonSearchTooltip(Component component, String value, SearchType searchType) {\r
+ if (searchType.equals(SearchType.AUTHOR)) {\r
+ WicketUtils.setHtmlTooltip(component, getString("gb.searchForAuthor") + " " + value);\r
+ } else if (searchType.equals(SearchType.COMMITTER)) {\r
+ WicketUtils.setHtmlTooltip(component, getString("gb.searchForCommitter") + " " + value);\r
+ }\r
+ }\r
+\r
+ protected void setChangeTypeTooltip(Component container, ChangeType type) {\r
+ switch (type) {\r
+ case ADD:\r
+ WicketUtils.setHtmlTooltip(container, getString("gb.addition"));\r
+ break;\r
+ case COPY:\r
+ case RENAME:\r
+ WicketUtils.setHtmlTooltip(container, getString("gb.rename"));\r
+ break;\r
+ case DELETE:\r
+ WicketUtils.setHtmlTooltip(container, getString("gb.deletion"));\r
+ break;\r
+ case MODIFY:\r
+ WicketUtils.setHtmlTooltip(container, getString("gb.modification"));\r
+ break;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected void onBeforeRender() {\r
+ // dispose of repository object\r
+ if (r != null) {\r
+ r.close();\r
+ r = null;\r
+ }\r
+ // setup page header and footer\r
+ setupPage(repositoryName, "/ " + getPageName());\r
+ super.onBeforeRender();\r
+ }\r
+\r
+ protected PageParameters newRepositoryParameter() {\r
+ return WicketUtils.newRepositoryParameter(repositoryName);\r
+ }\r
+\r
+ protected PageParameters newCommitParameter() {\r
+ return WicketUtils.newObjectParameter(repositoryName, objectId);\r
+ }\r
+\r
+ protected PageParameters newCommitParameter(String commitId) {\r
+ return WicketUtils.newObjectParameter(repositoryName, commitId);\r
+ }\r
+\r
+ protected PageParameters newPathParameter(String path) {\r
+ return WicketUtils.newPathParameter(repositoryName, objectId, path);\r
+ }\r
+\r
+ private static class SearchForm extends StatelessForm<Void> {\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ private final String repositoryName;\r
+\r
+ private final IModel<String> searchBoxModel = new Model<String>("");\r
+\r
+ private final IModel<SearchType> searchTypeModel = new Model<SearchType>(SearchType.COMMIT);\r
+\r
+ public SearchForm(String id, String repositoryName) {\r
+ super(id);\r
+ this.repositoryName = repositoryName;\r
+ DropDownChoice<SearchType> searchType = new DropDownChoice<SearchType>("searchType",\r
+ Arrays.asList(SearchType.values()));\r
+ searchType.setModel(searchTypeModel);\r
+ add(searchType.setVisible(GitBlit.getBoolean(Keys.web.showSearchTypeSelection, false)));\r
+ TextField<String> searchBox = new TextField<String>("searchBox", searchBoxModel);\r
+ add(searchBox);\r
+ }\r
+\r
+ void setTranslatedAttributes() {\r
+ WicketUtils.setHtmlTooltip(get("searchType"), getString("gb.searchTypeTooltip"));\r
+ WicketUtils.setHtmlTooltip(get("searchBox"), getString("gb.searchTooltip"));\r
+ WicketUtils.setInputPlaceholder(get("searchBox"), getString("gb.search"));\r
+ }\r
+\r
+ @Override\r
+ public void onSubmit() {\r
+ SearchType searchType = searchTypeModel.getObject();\r
+ String searchString = searchBoxModel.getObject();\r
+ for (SearchType type : SearchType.values()) {\r
+ if (searchString.toLowerCase().startsWith(type.name().toLowerCase() + ":")) {\r
+ searchType = type;\r
+ searchString = searchString.substring(type.name().toLowerCase().length() + 1)\r
+ .trim();\r
+ break;\r
+ }\r
+ }\r
+ setResponsePage(SearchPage.class,\r
+ WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType));\r
+ }\r
+ }\r
+}\r
import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
\r
import com.gitblit.utils.JGitUtils.SearchType;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.panels.SearchPanel;\r
\r
import com.gitblit.Constants.AccessRestrictionType;\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
+import com.gitblit.models.Metric;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.StringUtils;\r
import com.gitblit.utils.TimeUtils;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.Metric;\r
import com.gitblit.wicket.panels.BranchesPanel;\r
import com.gitblit.wicket.panels.LogPanel;\r
import com.gitblit.wicket.panels.TagsPanel;\r
import org.eclipse.jgit.lib.Repository;\r
import org.eclipse.jgit.revwalk.RevCommit;\r
\r
+import com.gitblit.models.RefModel;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.JGitUtils.SearchType;\r
-import com.gitblit.wicket.LinkPanel;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.RefModel;\r
+import com.gitblit.wicket.panels.LinkPanel;\r
\r
public class TagPage extends RepositoryPage {\r
\r
\r
import org.apache.wicket.PageParameters;\r
\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.panels.TagsPanel;\r
\r
public class TagsPage extends RepositoryPage {\r
import org.apache.wicket.markup.repeater.data.ListDataProvider;\r
import org.eclipse.jgit.lib.Repository;\r
\r
+import com.gitblit.models.TicketModel;\r
+import com.gitblit.models.TicketModel.Comment;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.StringUtils;\r
import com.gitblit.wicket.GitBlitWebSession;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.TicketModel;\r
-import com.gitblit.wicket.models.TicketModel.Comment;\r
\r
public class TicketPage extends RepositoryPage {\r
\r
import org.apache.wicket.markup.repeater.data.DataView;\r
import org.apache.wicket.markup.repeater.data.ListDataProvider;\r
\r
+import com.gitblit.models.TicketModel;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.StringUtils;\r
import com.gitblit.wicket.GitBlitWebSession;\r
-import com.gitblit.wicket.LinkPanel;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.TicketModel;\r
+import com.gitblit.wicket.panels.LinkPanel;\r
\r
public class TicketsPage extends RepositoryPage {\r
\r
import com.gitblit.DownloadZipServlet;\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
+import com.gitblit.models.PathModel;\r
import com.gitblit.utils.ByteFormat;\r
import com.gitblit.utils.JGitUtils;\r
-import com.gitblit.wicket.LinkPanel;\r
-import com.gitblit.wicket.RepositoryPage;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.PathModel;\r
import com.gitblit.wicket.panels.CommitHeaderPanel;\r
+import com.gitblit.wicket.panels.LinkPanel;\r
import com.gitblit.wicket.panels.PathBreadcrumbsPanel;\r
\r
public class TreePage extends RepositoryPage {\r
import org.eclipse.jgit.lib.Constants;\r
import org.eclipse.jgit.lib.Repository;\r
\r
+import com.gitblit.models.RefModel;\r
+import com.gitblit.models.RepositoryModel;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.RefModel;\r
-import com.gitblit.wicket.models.RepositoryModel;\r
import com.gitblit.wicket.pages.BranchesPage;\r
import com.gitblit.wicket.pages.LogPage;\r
import com.gitblit.wicket.pages.SummaryPage;\r
import org.apache.wicket.markup.html.basic.Label;\r
import org.eclipse.jgit.revwalk.RevCommit;\r
\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.pages.CommitPage;\r
\r
import org.apache.wicket.markup.repeater.data.ListDataProvider;\r
import org.eclipse.jgit.diff.DiffEntry.ChangeType;\r
\r
+import com.gitblit.models.PathModel.PathChangeModel;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.PathModel.PathChangeModel;\r
\r
public class CommitLegendPanel extends Panel {\r
\r
\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
+import com.gitblit.models.PathModel;\r
+import com.gitblit.models.PathModel.PathChangeModel;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.JGitUtils.SearchType;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.PathModel;\r
-import com.gitblit.wicket.models.PathModel.PathChangeModel;\r
import com.gitblit.wicket.pages.BlobDiffPage;\r
import com.gitblit.wicket.pages.BlobPage;\r
import com.gitblit.wicket.pages.CommitDiffPage;\r
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" \r
+ xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd" \r
+ xml:lang="en" \r
+ lang="en">\r
+<wicket:panel>\r
+<a href="#" wicket:id="link"><span wicket:id="label">[link]</span></a>\r
+</wicket:panel>\r
+</html>
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket.panels;\r
+\r
+import org.apache.wicket.PageParameters;\r
+import org.apache.wicket.behavior.SimpleAttributeModifier;\r
+import org.apache.wicket.markup.html.WebPage;\r
+import org.apache.wicket.markup.html.basic.Label;\r
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;\r
+import org.apache.wicket.markup.html.link.Link;\r
+import org.apache.wicket.markup.html.panel.Panel;\r
+import org.apache.wicket.model.IModel;\r
+import org.apache.wicket.model.Model;\r
+\r
+public class LinkPanel extends Panel {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ private final IModel<String> labelModel;\r
+\r
+ public LinkPanel(String wicketId, String linkCssClass, String label,\r
+ Class<? extends WebPage> clazz) {\r
+ this(wicketId, linkCssClass, new Model<String>(label), clazz, null);\r
+ }\r
+\r
+ public LinkPanel(String wicketId, String linkCssClass, String label,\r
+ Class<? extends WebPage> clazz, PageParameters parameters) {\r
+ this(wicketId, linkCssClass, new Model<String>(label), clazz, parameters);\r
+ }\r
+\r
+ public LinkPanel(String wicketId, String linkCssClass, IModel<String> model,\r
+ Class<? extends WebPage> clazz, PageParameters parameters) {\r
+ super(wicketId);\r
+ this.labelModel = model;\r
+ Link<Void> link = null;\r
+ if (parameters == null) {\r
+ link = new BookmarkablePageLink<Void>("link", clazz);\r
+ } else {\r
+ link = new BookmarkablePageLink<Void>("link", clazz, parameters);\r
+ }\r
+ if (linkCssClass != null) {\r
+ link.add(new SimpleAttributeModifier("class", linkCssClass));\r
+ }\r
+ link.add(new Label("label", labelModel));\r
+ add(link);\r
+ }\r
+\r
+}\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.JGitUtils.SearchType;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.pages.CommitDiffPage;\r
import com.gitblit.wicket.pages.CommitPage;\r
import org.apache.wicket.markup.repeater.data.DataView;\r
import org.apache.wicket.markup.repeater.data.ListDataProvider;\r
\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.pages.TreePage;\r
\r
\r
public void populateItem(final Item<BreadCrumb> item) {\r
final BreadCrumb entry = item.getModelObject();\r
- String path = entry.getPath();\r
+ String path = entry.path;\r
+ if (path.equals(ROOT)) {\r
+ path = null;\r
+ }\r
if (entry.isLeaf) {\r
item.add(new Label("pathLink", entry.name));\r
item.add(new Label("pathSeparator", "").setVisible(false));\r
this.name = name;\r
this.path = path;\r
this.isLeaf = isLeaf;\r
- }\r
-\r
- String getPath() {\r
- if (path.equals(ROOT)) {\r
- return null;\r
- }\r
- return path;\r
- }\r
+ } \r
}\r
}
\ No newline at end of file
import org.eclipse.jgit.lib.ObjectId;\r
import org.eclipse.jgit.revwalk.RevCommit;\r
\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.pages.CommitPage;\r
import com.gitblit.wicket.pages.LogPage;\r
import com.gitblit.Constants.AccessRestrictionType;\r
import com.gitblit.GitBlit;\r
import com.gitblit.Keys;\r
+import com.gitblit.models.RepositoryModel;\r
+import com.gitblit.models.UserModel;\r
import com.gitblit.utils.StringUtils;\r
import com.gitblit.utils.TimeUtils;\r
import com.gitblit.wicket.GitBlitWebSession;\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.RepositoryModel;\r
-import com.gitblit.wicket.models.UserModel;\r
import com.gitblit.wicket.pages.EditRepositoryPage;\r
import com.gitblit.wicket.pages.SummaryPage;\r
\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.JGitUtils.SearchType;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.pages.CommitDiffPage;\r
import com.gitblit.wicket.pages.CommitPage;\r
import org.apache.wicket.model.StringResourceModel;\r
import org.eclipse.jgit.lib.Repository;\r
\r
+import com.gitblit.models.RefModel;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.StringUtils;\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.models.RefModel;\r
import com.gitblit.wicket.pages.CommitPage;\r
import com.gitblit.wicket.pages.LogPage;\r
import com.gitblit.wicket.pages.SummaryPage;\r
import org.apache.wicket.markup.repeater.data.ListDataProvider;\r
\r
import com.gitblit.GitBlit;\r
-import com.gitblit.wicket.LinkPanel;\r
import com.gitblit.wicket.WicketUtils;\r
import com.gitblit.wicket.pages.EditUserPage;\r
\r
suite.addTestSuite(JGitUtilsTest.class);\r
return new GitBlitSuite(suite);\r
}\r
- \r
+\r
public static Repository getHelloworldRepository() throws Exception {\r
return new FileRepository(new File(REPOSITORIES, "helloworld.git"));\r
}\r
import org.eclipse.jgit.revwalk.RevObject;\r
import org.eclipse.jgit.revwalk.RevTree;\r
\r
+import com.gitblit.models.PathModel.PathChangeModel;\r
+import com.gitblit.models.RefModel;\r
+import com.gitblit.models.TicketModel;\r
+import com.gitblit.utils.DiffUtils;\r
import com.gitblit.utils.JGitUtils;\r
import com.gitblit.utils.JGitUtils.DiffOutputType;\r
-import com.gitblit.wicket.models.PathModel.PathChangeModel;\r
-import com.gitblit.wicket.models.RefModel;\r
-import com.gitblit.wicket.models.TicketModel;\r
\r
public class JGitUtilsTest extends TestCase {\r
\r
Repository repository = GitBlitSuite.getHelloworldRepository();\r
RevCommit commit = JGitUtils.getCommit(repository,\r
"1d0c2933a4ae69c362f76797d42d6bd182d05176");\r
- String diff = JGitUtils.getCommitDiff(repository, commit, DiffOutputType.PLAIN);\r
+ String diff = DiffUtils.getCommitDiff(repository, commit, DiffOutputType.PLAIN);\r
repository.close();\r
assertTrue("Failed to generate diff!", diff != null && diff.length() > 0);\r
String expected = "- system.out.println(\"Hello World\");\n+ System.out.println(\"Hello World\"";\r