]> source.dussan.org Git - gitblit.git/commitdiff
Codepro analyze dependencies. Documentation.
authorJames Moger <james.moger@gitblit.com>
Sat, 28 May 2011 03:37:24 +0000 (23:37 -0400)
committerJames Moger <james.moger@gitblit.com>
Sat, 28 May 2011 03:37:24 +0000 (23:37 -0400)
91 files changed:
README.MKD
build.xml
distrib/gitblit.properties
docs/00_index.mkd
docs/00_setup.mkd
docs/01_eclipse.mkd [deleted file]
docs/01_faq.mkd
docs/02_properties.mkd [new file with mode: 0644]
docs/page_header.html
docs/sslverify.png [deleted file]
docs/sslverify2.png [deleted file]
src/com/gitblit/Build.java
src/com/gitblit/BuildSite.java
src/com/gitblit/Constants.java
src/com/gitblit/DownloadZipServlet.java
src/com/gitblit/GitBlit.java
src/com/gitblit/GitBlitServer.java
src/com/gitblit/GitBlitServlet.java
src/com/gitblit/ILoginService.java
src/com/gitblit/JettyLoginService.java
src/com/gitblit/MakeCertificate.java
src/com/gitblit/models/Metric.java [new file with mode: 0644]
src/com/gitblit/models/PathModel.java [new file with mode: 0644]
src/com/gitblit/models/RefModel.java [new file with mode: 0644]
src/com/gitblit/models/RepositoryModel.java [new file with mode: 0644]
src/com/gitblit/models/TicketModel.java [new file with mode: 0644]
src/com/gitblit/models/UserModel.java [new file with mode: 0644]
src/com/gitblit/utils/DiffUtils.java [new file with mode: 0644]
src/com/gitblit/utils/JGitUtils.java
src/com/gitblit/wicket/AdminPage.java [deleted file]
src/com/gitblit/wicket/AuthorizationStrategy.java
src/com/gitblit/wicket/BasePage.html [deleted file]
src/com/gitblit/wicket/BasePage.java [deleted file]
src/com/gitblit/wicket/GitBlitWebApp.java
src/com/gitblit/wicket/GitBlitWebSession.java
src/com/gitblit/wicket/LinkPanel.html [deleted file]
src/com/gitblit/wicket/LinkPanel.java [deleted file]
src/com/gitblit/wicket/LoginPage.html [deleted file]
src/com/gitblit/wicket/LoginPage.java [deleted file]
src/com/gitblit/wicket/LogoutPage.java [deleted file]
src/com/gitblit/wicket/RepositoryPage.html [deleted file]
src/com/gitblit/wicket/RepositoryPage.java [deleted file]
src/com/gitblit/wicket/RequiresAdminRole.java [new file with mode: 0644]
src/com/gitblit/wicket/models/Metric.java [deleted file]
src/com/gitblit/wicket/models/PathModel.java [deleted file]
src/com/gitblit/wicket/models/RefModel.java [deleted file]
src/com/gitblit/wicket/models/RepositoryModel.java [deleted file]
src/com/gitblit/wicket/models/TicketModel.java [deleted file]
src/com/gitblit/wicket/models/UserModel.java [deleted file]
src/com/gitblit/wicket/pages/BasePage.html [new file with mode: 0644]
src/com/gitblit/wicket/pages/BasePage.java [new file with mode: 0644]
src/com/gitblit/wicket/pages/BlobDiffPage.java
src/com/gitblit/wicket/pages/BlobPage.java
src/com/gitblit/wicket/pages/BranchesPage.java
src/com/gitblit/wicket/pages/CommitDiffPage.java
src/com/gitblit/wicket/pages/CommitPage.java
src/com/gitblit/wicket/pages/DocsPage.java
src/com/gitblit/wicket/pages/EditRepositoryPage.java
src/com/gitblit/wicket/pages/EditUserPage.java
src/com/gitblit/wicket/pages/HistoryPage.java
src/com/gitblit/wicket/pages/LogPage.java
src/com/gitblit/wicket/pages/LoginPage.html [new file with mode: 0644]
src/com/gitblit/wicket/pages/LoginPage.java [new file with mode: 0644]
src/com/gitblit/wicket/pages/LogoutPage.java [new file with mode: 0644]
src/com/gitblit/wicket/pages/MarkdownPage.java
src/com/gitblit/wicket/pages/PatchPage.java
src/com/gitblit/wicket/pages/RepositoriesPage.java
src/com/gitblit/wicket/pages/RepositoryPage.html [new file with mode: 0644]
src/com/gitblit/wicket/pages/RepositoryPage.java [new file with mode: 0644]
src/com/gitblit/wicket/pages/SearchPage.java
src/com/gitblit/wicket/pages/SummaryPage.java
src/com/gitblit/wicket/pages/TagPage.java
src/com/gitblit/wicket/pages/TagsPage.java
src/com/gitblit/wicket/pages/TicketPage.java
src/com/gitblit/wicket/pages/TicketsPage.java
src/com/gitblit/wicket/pages/TreePage.java
src/com/gitblit/wicket/panels/BranchesPanel.java
src/com/gitblit/wicket/panels/CommitHeaderPanel.java
src/com/gitblit/wicket/panels/CommitLegendPanel.java
src/com/gitblit/wicket/panels/HistoryPanel.java
src/com/gitblit/wicket/panels/LinkPanel.html [new file with mode: 0644]
src/com/gitblit/wicket/panels/LinkPanel.java [new file with mode: 0644]
src/com/gitblit/wicket/panels/LogPanel.java
src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java
src/com/gitblit/wicket/panels/RefsPanel.java
src/com/gitblit/wicket/panels/RepositoriesPanel.java
src/com/gitblit/wicket/panels/SearchPanel.java
src/com/gitblit/wicket/panels/TagsPanel.java
src/com/gitblit/wicket/panels/UsersPanel.java
tests/com/gitblit/tests/GitBlitSuite.java
tests/com/gitblit/tests/JGitUtilsTest.java

index 719f40dfec7ba865f784471a802ce95e74bfb2ed..2a94730f60fc22ff3912b62ac3672082133e1b81 100644 (file)
@@ -1,18 +1,9 @@
 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
@@ -28,8 +19,7 @@ Gitblit requires at least Java 1.6.
 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
@@ -40,7 +30,6 @@ Building Gitblit
 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
index 2c8a24aeb3abeebd9ea6a051d31399aad5859467..4b2791013cca4f7f4c9a17c70bef9e1f4a4fc596 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -25,7 +25,7 @@
                                        <replacestring from="&quot;;" 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
index 4e2965fddfa0cf31dd5b6878d6faabd6badc7da7..c17674abb60eba275617acbe8eab86d96f946f2c 100644 (file)
@@ -3,18 +3,22 @@
 #\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
@@ -22,12 +26,15 @@ git.nestedRepositories = true
 #\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
@@ -44,10 +51,11 @@ realm.minPasswordLength = 5
 # 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
@@ -60,20 +68,23 @@ web.repositoriesMessage = gitblit
 \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
@@ -92,7 +103,7 @@ web.showEmailAddresses = true
 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
@@ -108,22 +119,27 @@ web.summaryRefsCount = 5
 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
@@ -141,9 +157,21 @@ regex.global = true
 #\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
@@ -162,13 +190,13 @@ server.httpsPort = 443
 \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
@@ -176,7 +204,7 @@ server.httpsBindInterface = localhost
 # 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
index e21a158bca098920bfa19c6ea4ebdf355e2c94aa..9ad1c4e8b4864192a892a4bc928877266a0e8da1 100644 (file)
@@ -107,10 +107,10 @@ The following dependencies are automatically downloaded from the Apache Maven re
 - [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
@@ -118,8 +118,11 @@ Additionally, [Google CodePro AnalytiX](http://code.google.com/javadevtools), [e
 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
index 447f15150f37eaf8d0a02242da62e7e3d80b633e..99fd05fcb6d626db6f0cac19dd555f918b800ecc 100644 (file)
@@ -1,4 +1,4 @@
-## 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
@@ -74,4 +74,23 @@ Set the *JVM* variable in the script to the location of your Java Virtual Machin
     \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
diff --git a/docs/01_eclipse.mkd b/docs/01_eclipse.mkd
deleted file mode 100644 (file)
index e768b73..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-## 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
index 86aa9ad28c2c3dc2c1a8e345fbf008dbab4354a9..5068e79a6cdfdd53b1265fc00bcc03a0aa5a323d 100644 (file)
@@ -1,10 +1,31 @@
-## 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
@@ -13,11 +34,16 @@ Everything you need for Gitblit is either in the zip distribution file or automa
 ### 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
@@ -26,7 +52,7 @@ Gitblit's simple authentication and authorization mechanism can be used to facil
 \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
@@ -40,9 +66,8 @@ To search by *author* or *committer* use the following syntax in the search box:
     \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
diff --git a/docs/02_properties.mkd b/docs/02_properties.mkd
new file mode 100644 (file)
index 0000000..3a1dec1
--- /dev/null
@@ -0,0 +1,4 @@
+## gitblit.properties\r
+<pre class='prettyprint'>\r
+%PROPERTIES%\r
+</pre>
\ No newline at end of file
index fd40c5a2cad94dbd8c9cab0fb8bcd62debf347bb..4a2128e09d0721e1a91e41bf40e3adda646144ae 100644 (file)
@@ -8,6 +8,7 @@
                <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
diff --git a/docs/sslverify.png b/docs/sslverify.png
deleted file mode 100644 (file)
index e987b9f..0000000
Binary files a/docs/sslverify.png and /dev/null differ
diff --git a/docs/sslverify2.png b/docs/sslverify2.png
deleted file mode 100644 (file)
index 94db977..0000000
Binary files a/docs/sslverify2.png and /dev/null differ
index da0c3e03385790a312d26c1d341a505fe11d8676..a6d5bb0258485be30baafb807138e09ed4525a95 100644 (file)
@@ -80,7 +80,7 @@ public class Build {
                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
@@ -389,10 +389,9 @@ public class Build {
                                "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
index f3a1a9f11170dce23740a3ad99eb03b8cfd5d325..890cec1edc9a20a871773d05f828fcbc0150fdec 100644 (file)
@@ -37,6 +37,7 @@ import com.beust.jcommander.Parameter;
 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
@@ -83,8 +84,8 @@ public class BuildSite {
                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
@@ -101,6 +102,13 @@ public class BuildSite {
                                        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
@@ -115,7 +123,7 @@ public class BuildSite {
                }\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
@@ -124,6 +132,9 @@ public class BuildSite {
                        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
@@ -171,8 +182,11 @@ public class BuildSite {
                @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
index b67418209afe3ff5f650390413b60c177aac27e1..3589f491da42dca3765309d40f7955ec6700d21c 100644 (file)
@@ -37,6 +37,8 @@ public class Constants {
 \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
index 3bbf225354b7eb2879915d1f07e7683c176a9726..86ca4e779d3298894d719f072aed7ddfa0080411 100644 (file)
@@ -26,9 +26,9 @@ import org.slf4j.Logger;
 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
index 9dd3a9e510f65df335c447452cda1ec37396c987..52dd9dbb2521b66d003c127467e51bfe6b2c8d14 100644 (file)
@@ -35,10 +35,10 @@ import org.slf4j.Logger;
 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
@@ -151,8 +151,8 @@ public class GitBlit implements ServletContextListener {
                        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
@@ -186,6 +186,9 @@ public class GitBlit implements ServletContextListener {
 \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
@@ -315,7 +318,7 @@ public class GitBlit implements ServletContextListener {
        }\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
index c8731572b652512fb2af489a3f1410db8e6179c3..416c47ade361b167caee055204038891772c7bc7 100644 (file)
@@ -65,12 +65,8 @@ import com.gitblit.wicket.GitBlitWebApp;
 \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
@@ -91,9 +87,9 @@ public class GitBlitServer {
        }\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
@@ -129,18 +125,19 @@ public class GitBlitServer {
         * 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
@@ -151,9 +148,9 @@ public class GitBlitServer {
                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
@@ -163,7 +160,7 @@ public class GitBlitServer {
                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
@@ -182,7 +179,7 @@ public class GitBlitServer {
                        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
@@ -246,11 +243,11 @@ public class GitBlitServer {
                // 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
@@ -300,12 +297,14 @@ public class GitBlitServer {
                        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
@@ -385,6 +384,8 @@ public class GitBlitServer {
                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
@@ -408,9 +409,9 @@ public class GitBlitServer {
                                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
@@ -423,6 +424,8 @@ public class GitBlitServer {
 \r
        @Parameters(separators = " ")\r
        private static class Params {\r
+               \r
+               private static final FileSettings FILESETTINGS = new FileSettings();\r
 \r
                /*\r
                 * Server parameters\r
index 91bd7b26ff417a9d277296101e4270badeb2e18f..468688469b530a349b8f1e12fc79aa57bb7082bc 100644 (file)
@@ -27,7 +27,7 @@ import org.slf4j.Logger;
 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
index 155595bb98b51f64c4816bde32d6fc70f5d160db..d7bfd017903d109a87d219750519c3caa8c9d8e1 100644 (file)
@@ -17,7 +17,7 @@ package com.gitblit;
 \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
index ac7dd799bce709759f56e190a91a728059c4f9ac..63a986186768c1fd9f9d3be8541b4a43e96cf32f 100644 (file)
@@ -38,7 +38,7 @@ import org.eclipse.jetty.util.log.Log;
 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
index eafb98a4e3204ef451c19a53dcac80c375c488c9..67b2fd908c5c3ba55c34d6616c5eff120b511514 100644 (file)
@@ -44,9 +44,7 @@ import com.beust.jcommander.Parameters;
 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
@@ -158,6 +156,8 @@ public class MakeCertificate {
        @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
diff --git a/src/com/gitblit/models/Metric.java b/src/com/gitblit/models/Metric.java
new file mode 100644 (file)
index 0000000..9ff270a
--- /dev/null
@@ -0,0 +1,32 @@
+/*\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
diff --git a/src/com/gitblit/models/PathModel.java b/src/com/gitblit/models/PathModel.java
new file mode 100644 (file)
index 0000000..17a7971
--- /dev/null
@@ -0,0 +1,106 @@
+/*\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
diff --git a/src/com/gitblit/models/RefModel.java b/src/com/gitblit/models/RefModel.java
new file mode 100644 (file)
index 0000000..b33c8ba
--- /dev/null
@@ -0,0 +1,81 @@
+/*\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
diff --git a/src/com/gitblit/models/RepositoryModel.java b/src/com/gitblit/models/RepositoryModel.java
new file mode 100644 (file)
index 0000000..7241d76
--- /dev/null
@@ -0,0 +1,59 @@
+/*\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
diff --git a/src/com/gitblit/models/TicketModel.java b/src/com/gitblit/models/TicketModel.java
new file mode 100644 (file)
index 0000000..b284340
--- /dev/null
@@ -0,0 +1,111 @@
+/*\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
diff --git a/src/com/gitblit/models/UserModel.java b/src/com/gitblit/models/UserModel.java
new file mode 100644 (file)
index 0000000..797c14e
--- /dev/null
@@ -0,0 +1,53 @@
+/*\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
diff --git a/src/com/gitblit/utils/DiffUtils.java b/src/com/gitblit/utils/DiffUtils.java
new file mode 100644 (file)
index 0000000..d7a4a63
--- /dev/null
@@ -0,0 +1,149 @@
+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
index 088cd00e3e7c116d141955dcb72bec22ee09a666..f99fbfdde073401d6973d5d9558b9d9c00ca0fbe 100644 (file)
@@ -73,12 +73,12 @@ import org.eclipse.jgit.util.io.DisabledOutputStream;
 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
@@ -183,11 +183,18 @@ public class JGitUtils {
        }\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
@@ -460,132 +467,6 @@ public class JGitUtils {
                }\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
diff --git a/src/com/gitblit/wicket/AdminPage.java b/src/com/gitblit/wicket/AdminPage.java
deleted file mode 100644 (file)
index 1c9e0ef..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*\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
index 42d252259165c41b466b466e01359db24eebb512..b6b745bde294a178d4a45ceb2f914a05d323e6bb 100644 (file)
@@ -22,7 +22,9 @@ import org.apache.wicket.authorization.strategies.page.AbstractPageAuthorization
 \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
@@ -46,7 +48,7 @@ public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy imp
                        }\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
diff --git a/src/com/gitblit/wicket/BasePage.html b/src/com/gitblit/wicket/BasePage.html
deleted file mode 100644 (file)
index 0e8705c..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<!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
diff --git a/src/com/gitblit/wicket/BasePage.java b/src/com/gitblit/wicket/BasePage.java
deleted file mode 100644 (file)
index 2e4adfe..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-/*\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
index f78bb0da9727755c16be012f66af904eff7c62b4..1d251d9c5f0ce44c68955dae1789c21c6e6ca3b3 100644 (file)
@@ -34,6 +34,8 @@ import com.gitblit.wicket.pages.CommitPage;
 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
index 6488695d5af968a61f482929b9921be24a3413c0..2238660f22953ee63f5ea154c591d9d83aea6499 100644 (file)
@@ -22,7 +22,7 @@ import org.apache.wicket.Session;
 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
diff --git a/src/com/gitblit/wicket/LinkPanel.html b/src/com/gitblit/wicket/LinkPanel.html
deleted file mode 100644 (file)
index e7e9ff5..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<!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
diff --git a/src/com/gitblit/wicket/LinkPanel.java b/src/com/gitblit/wicket/LinkPanel.java
deleted file mode 100644 (file)
index 2700cf8..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/LoginPage.html b/src/com/gitblit/wicket/LoginPage.html
deleted file mode 100644 (file)
index 037063c..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<!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> &nbsp;\r
-                                       <input type="text" id="username" wicket:id="username" value=""/>\r
-                                       <p/>\r
-                                       <wicket:message key="gb.password"></wicket:message> &nbsp;\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
diff --git a/src/com/gitblit/wicket/LoginPage.java b/src/com/gitblit/wicket/LoginPage.java
deleted file mode 100644 (file)
index 8710878..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/LogoutPage.java b/src/com/gitblit/wicket/LogoutPage.java
deleted file mode 100644 (file)
index 47f80f0..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/RepositoryPage.html b/src/com/gitblit/wicket/RepositoryPage.html
deleted file mode 100644 (file)
index 0e0ce47..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<!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
diff --git a/src/com/gitblit/wicket/RepositoryPage.java b/src/com/gitblit/wicket/RepositoryPage.java
deleted file mode 100644 (file)
index 9d5253f..0000000
+++ /dev/null
@@ -1,402 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/RequiresAdminRole.java b/src/com/gitblit/wicket/RequiresAdminRole.java
new file mode 100644 (file)
index 0000000..ce2dcfc
--- /dev/null
@@ -0,0 +1,26 @@
+/*\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
diff --git a/src/com/gitblit/wicket/models/Metric.java b/src/com/gitblit/wicket/models/Metric.java
deleted file mode 100644 (file)
index 3014cd0..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/models/PathModel.java b/src/com/gitblit/wicket/models/PathModel.java
deleted file mode 100644 (file)
index 2edc96c..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/models/RefModel.java b/src/com/gitblit/wicket/models/RefModel.java
deleted file mode 100644 (file)
index e0831f5..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/models/RepositoryModel.java b/src/com/gitblit/wicket/models/RepositoryModel.java
deleted file mode 100644 (file)
index 575e64a..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/models/TicketModel.java b/src/com/gitblit/wicket/models/TicketModel.java
deleted file mode 100644 (file)
index b661c19..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/models/UserModel.java b/src/com/gitblit/wicket/models/UserModel.java
deleted file mode 100644 (file)
index 1181ee1..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*\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
diff --git a/src/com/gitblit/wicket/pages/BasePage.html b/src/com/gitblit/wicket/pages/BasePage.html
new file mode 100644 (file)
index 0000000..0da37d4
--- /dev/null
@@ -0,0 +1,40 @@
+<!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
diff --git a/src/com/gitblit/wicket/pages/BasePage.java b/src/com/gitblit/wicket/pages/BasePage.java
new file mode 100644 (file)
index 0000000..9031bef
--- /dev/null
@@ -0,0 +1,145 @@
+/*\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
index aae41ba44044967279536c369889aa0081a748b8..4bd61d5cebe9792bca6bcb67edf83ee8c54de53d 100644 (file)
@@ -23,10 +23,10 @@ import org.eclipse.jgit.revwalk.RevCommit;
 \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
@@ -48,13 +48,13 @@ public class BlobDiffPage extends RepositoryPage {
                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
index 23244c0a2b573e0b48ba2deb169a03a71ba7018b..4601ac7b85a1415e256a8cad847a6e2f84471825 100644 (file)
@@ -29,7 +29,6 @@ import org.eclipse.jgit.revwalk.RevCommit;
 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
index f348fd4ae1e6c9f49ac27c6f4ffda0e4d2fb3ae6..2b7d51879f390dead65064ef5ee25b6d18af507b 100644 (file)
@@ -17,7 +17,6 @@ package com.gitblit.wicket.pages;
 \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
index 81ee520a0122ce7e816a1a66215075d0ce51919c..1f492aca2d85b071bf88aab4a5818d791399eceb 100644 (file)
@@ -29,14 +29,14 @@ import org.eclipse.jgit.revwalk.RevCommit;
 \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
@@ -47,7 +47,7 @@ public class CommitDiffPage extends RepositoryPage {
                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
index 1a8f7c3c2ee02a69f55c3e53ea2f0eada462cfcd..dc674a2e57935d927e80bc79ccc9c88c04db2cca 100644 (file)
@@ -32,14 +32,13 @@ import org.eclipse.jgit.revwalk.RevCommit;
 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
index 32b208a8b6a9d81576d0a094f886b6216689ff41..7f41b71b47ccab3e0949afd7795cdcdf54570d04 100644 (file)
@@ -27,12 +27,11 @@ import org.eclipse.jgit.lib.Repository;
 \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
index 2b5cb9990c87619dd336f6fc0ce6e0ff936c0c2c..a1a42d00d8a061206fc75b58d6dcb72814638876 100644 (file)
@@ -40,12 +40,11 @@ import com.gitblit.Constants.AccessRestrictionType;
 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
@@ -57,7 +56,7 @@ public class EditRepositoryPage extends BasePage {
                // 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
index 1127ffb75b2b136f95ad9236d54d1e730363c542..fb647f78716c2ca6dae891a76c0a48d6efd8b478 100644 (file)
@@ -38,14 +38,13 @@ import com.gitblit.Constants.AccessRestrictionType;
 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
index e4f8f8d0568f33dd9134e2f9afbeeb467793d25b..122eeb8afebebf0e8d18058a7f0ebc0c2b8692e2 100644 (file)
@@ -18,7 +18,6 @@ package com.gitblit.wicket.pages;
 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
index 2554f7d671a27d88c9145d02bcc92dbbf88793cf..35f8a73fa448f0c5f440278aa518ba904bcf1d5a 100644 (file)
@@ -18,7 +18,6 @@ package com.gitblit.wicket.pages;
 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
diff --git a/src/com/gitblit/wicket/pages/LoginPage.html b/src/com/gitblit/wicket/pages/LoginPage.html
new file mode 100644 (file)
index 0000000..280453d
--- /dev/null
@@ -0,0 +1,40 @@
+<!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> &nbsp;\r
+                                       <input type="text" id="username" wicket:id="username" value=""/>\r
+                                       <p/>\r
+                                       <wicket:message key="gb.password"></wicket:message> &nbsp;\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
diff --git a/src/com/gitblit/wicket/pages/LoginPage.java b/src/com/gitblit/wicket/pages/LoginPage.java
new file mode 100644 (file)
index 0000000..56e979c
--- /dev/null
@@ -0,0 +1,86 @@
+/*\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
diff --git a/src/com/gitblit/wicket/pages/LogoutPage.java b/src/com/gitblit/wicket/pages/LogoutPage.java
new file mode 100644 (file)
index 0000000..05beab3
--- /dev/null
@@ -0,0 +1,27 @@
+/*\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
index d62c43307f12c53e2298d174b7945eadf45c1dfc..fc8b7cbc17aa1b76c2b026cefe18adb9f2a5a189 100644 (file)
@@ -26,7 +26,6 @@ import org.eclipse.jgit.revwalk.RevCommit;
 \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
index 02e4d386badbaad8b6840e3c2bcb6303a65facab..04934735f4961c67f9a742290c4504ed21028de6 100644 (file)
@@ -22,6 +22,7 @@ import org.eclipse.jgit.lib.Repository;
 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
@@ -61,7 +62,7 @@ public class PatchPage extends WebPage {
                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
index 2bb818daec622813810367f940572794634295e4..b0e5e57901f903f95db038142dad99a0d596c318 100644 (file)
@@ -28,7 +28,6 @@ import com.gitblit.GitBlit;
 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
diff --git a/src/com/gitblit/wicket/pages/RepositoryPage.html b/src/com/gitblit/wicket/pages/RepositoryPage.html
new file mode 100644 (file)
index 0000000..0e0ce47
--- /dev/null
@@ -0,0 +1,32 @@
+<!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
diff --git a/src/com/gitblit/wicket/pages/RepositoryPage.java b/src/com/gitblit/wicket/pages/RepositoryPage.java
new file mode 100644 (file)
index 0000000..109c51a
--- /dev/null
@@ -0,0 +1,396 @@
+/*\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
index b12beee322efd733c5fe7108bb79f5f84cd6b1ec..335c40d78f516e1f657dba09c6c84381e17949ef 100644 (file)
@@ -19,7 +19,6 @@ import org.apache.wicket.PageParameters;
 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
index 835b344a1039760b0885e2ee78473111424d01ae..181de0da3fe830a8f94027352dba48fa265773ff 100644 (file)
@@ -42,12 +42,11 @@ import com.gitblit.Constants;
 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
index ff02b7bcb6d18d52d1b6d198a3da8f6fbc563751..7945231d373142b33e52628c45ad7526ca49cb4d 100644 (file)
@@ -21,12 +21,11 @@ import org.apache.wicket.PageParameters;
 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
index 0f429425b30a88e14b36c6774d63a1e25f6748a7..3ddbde9bcc21d7de656618099bd39c5774d7a92d 100644 (file)
@@ -17,7 +17,6 @@ package com.gitblit.wicket.pages;
 \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
index 9c8c3926369db2889ac2a0598629b19795048c68..353c543e82ddb11ab6968c84474c512b2f47e704 100644 (file)
@@ -22,13 +22,12 @@ import org.apache.wicket.markup.repeater.data.DataView;
 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
index 2832385c45136999e38a381b4fdd69a41ed94622..8da4e942b983e554c99f14415c4bdfb420527e4c 100644 (file)
@@ -23,13 +23,12 @@ import org.apache.wicket.markup.repeater.Item;
 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
index 761b82e0978956bba7a06400b71b9cca1b3fd190..4fc7119ae807d79964b2c3e9f5e10e03b95851a7 100644 (file)
@@ -32,13 +32,12 @@ import org.eclipse.jgit.revwalk.RevCommit;
 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
index 357c7c2c9785d4acad5c5e03be85e7341c599c90..d50db88348433b561c0f231788db923b93b95d56 100644 (file)
@@ -28,12 +28,11 @@ import org.apache.wicket.model.StringResourceModel;
 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
index cb80321ae0b41a52a867b602e12593f0952da6d9..1a6580d6a5849b14a8833d2087ecd0ff866ca528 100644 (file)
@@ -18,7 +18,6 @@ package com.gitblit.wicket.panels;
 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
index ee81c695ba0e6fef63cd7c06328f7838e4aea2ad..bbfa18554c1f41d1cde053bbd3df07a3dd44af7a 100644 (file)
@@ -28,9 +28,9 @@ import org.apache.wicket.markup.repeater.data.DataView;
 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
index d65b02c7c62fce4412a921c87d99725c55bb05da..180a248a2315a4df37f8b206c374103008277e2c 100644 (file)
@@ -32,13 +32,12 @@ import org.eclipse.jgit.revwalk.RevCommit;
 \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
diff --git a/src/com/gitblit/wicket/panels/LinkPanel.html b/src/com/gitblit/wicket/panels/LinkPanel.html
new file mode 100644 (file)
index 0000000..e7e9ff5
--- /dev/null
@@ -0,0 +1,9 @@
+<!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
diff --git a/src/com/gitblit/wicket/panels/LinkPanel.java b/src/com/gitblit/wicket/panels/LinkPanel.java
new file mode 100644 (file)
index 0000000..475a71e
--- /dev/null
@@ -0,0 +1,61 @@
+/*\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
index b321917ccc4098bef19e8d513b3beac06aa0ce4b..c5ccac4375c8639cc409de0abe62aa4ff038491d 100644 (file)
@@ -34,7 +34,6 @@ import com.gitblit.Keys;
 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
index 2693cc2b3ea2282cce6fd30bdc50f3ca2d7594bc..bc98e25c1fc68ffb2f9ef34a66f8c22ef0cb2049 100644 (file)
@@ -25,7 +25,6 @@ import org.apache.wicket.markup.repeater.Item;
 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
@@ -59,7 +58,10 @@ public class PathBreadcrumbsPanel extends Panel {
 \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
@@ -85,13 +87,6 @@ public class PathBreadcrumbsPanel extends Panel {
                        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
index b6e4b0bb2dba60be7545f2c43ee9713e02c75b84..33b1884f923343d2b0b1240c02a06da0cd0ae475 100644 (file)
@@ -29,7 +29,6 @@ import org.eclipse.jgit.lib.Constants;
 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
index a566b595373742d3c713a1cd292cd88535bd6dd1..a0c9e13222524b1c141096170618ef37c6a8a5b9 100644 (file)
@@ -43,13 +43,12 @@ import org.apache.wicket.model.Model;
 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
index 8c63c423458a39290cec15e6ed70b243ebff7806..f91e0e8ae7b679e07613157f983212187fb1b933 100644 (file)
@@ -32,7 +32,6 @@ import com.gitblit.Keys;
 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
index 1d8eec7dcccfdd25886e9467615dcb00c2b8d03a..de8112a468855c256ac04ee0e7832a135e925a69 100644 (file)
@@ -26,11 +26,10 @@ import org.apache.wicket.markup.repeater.data.ListDataProvider;
 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
index 27bc334b2bff18b3ed016addf85c1185afbdbc2e..4cf92a46bf981e76c63a25ffa7715debed3167d1 100644 (file)
@@ -26,7 +26,6 @@ import org.apache.wicket.markup.repeater.data.DataView;
 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
index eaa028d7cb678fbce2a4c3579c317a342aaf3b97..a31b0131d2fe4082b6119641ed7ffb4873d2d900 100644 (file)
@@ -23,7 +23,7 @@ public class GitBlitSuite extends TestSetup {
                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
index 0432d39dd49b28025e92da5b8f48d79d2a102ad4..7fcf48d758332d9e31e0bf2f08be8f4448cb2270 100644 (file)
@@ -29,11 +29,12 @@ import org.eclipse.jgit.revwalk.RevCommit;
 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
@@ -100,7 +101,7 @@ public class JGitUtilsTest extends TestCase {
                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