Mostly stable war build.
Reorganization of resources. Dropped most hard-coded webapp
configuration in favor of common web.xml file. Still contemplating
configuring git servlet from web.xml too.
49 files renamed
1 files deleted
3 files added
39 files modified
| | |
| | | /git |
| | | /target |
| | | /build.properties |
| | | /war |
| | | /*.war |
| | |
| | | <property name="project.jar" value="gitblit.jar" />
|
| | | <property name="project.mainclass" value="com.gitblit.Launcher" />
|
| | | <property name="project.build.dir" value="${basedir}/build" />
|
| | | <property name="project.resources.dir" value="${basedir}/resources" />
|
| | |
|
| | | <loadproperties srcfile="${basedir}/build.properties" />
|
| | |
|
| | | <!-- Build Gitblit -->
|
| | | <target name="main" description="Compiles Gitblit from source to website">
|
| | |
|
| | | |
| | | <target name="buildinfo">
|
| | | <!-- build date -->
|
| | | <tstamp>
|
| | | <format property="gb.buildDate" pattern="yyyy-MM-dd" />
|
| | | </tstamp>
|
| | |
|
| | | |
| | | <!-- extract Gitblit version number from source code -->
|
| | | <loadfile property="gb.version" srcfile="${basedir}/src/com/gitblit/Constants.java">
|
| | | <filterchain>
|
| | |
| | | </tokenfilter>
|
| | | </filterchain>
|
| | | </loadfile>
|
| | |
|
| | | |
| | | <!-- extract JGit version number from source code -->
|
| | | <loadfile property="jgit.version" srcfile="${basedir}/src/com/gitblit/Constants.java">
|
| | | <filterchain>
|
| | |
| | | </filterchain>
|
| | | </loadfile>
|
| | | <echo>Building Gitblit ${gb.version}</echo>
|
| | | |
| | | <property name="distribution.zipfile" value="gitblit-${gb.version}.zip" />
|
| | | <property name="distribution.warfile" value="gitblit-${gb.version}.war" />
|
| | | </target>
|
| | | |
| | | <!-- Build Gitblit GO -->
|
| | | <target name="main" description="Compiles Gitblit from source to website" depends="buildinfo">
|
| | |
|
| | | <!-- copy required distribution files to project folder -->
|
| | | <copy todir="${basedir}" overwrite="false">
|
| | |
| | | <mkdir dir="${project.build.dir}" />
|
| | | <javac srcdir="${basedir}/src" destdir="${project.build.dir}">
|
| | | <include name="com/gitblit/Build.java" />
|
| | | <include name="com/gitblit/BuildWebXml.java" />
|
| | | <include name="com/gitblit/Constants.java" />
|
| | | <include name="com/gitblit/utils/StringUtils.java" />
|
| | | <include name="com/gitblit/utils/StringUtils.java" /> |
| | | </javac>
|
| | | <java classpath="${project.build.dir}" classname="com.gitblit.Build" />
|
| | |
|
| | |
| | | <fileset dir="${project.build.dir}">
|
| | | <include name="**/*" />
|
| | | </fileset>
|
| | | <fileset dir="${project.resources.dir}">
|
| | | <exclude name="thumbs.db" />
|
| | | </fileset>
|
| | | <manifest>
|
| | | <attribute name="Main-Class" value="${project.mainclass}" />
|
| | | </manifest>
|
| | |
| | | <mkdir dir="${basedir}/site" />
|
| | | <copy todir="${basedir}/site">
|
| | | <!-- Copy selected Gitblit resources -->
|
| | | <fileset dir="${basedir}/src/com/gitblit/wicket/resources">
|
| | | <fileset dir="${project.resources.dir}">
|
| | | <include name="background.png" />
|
| | | <include name="gitblit.css" />
|
| | | <include name="markdown.css" />
|
| | |
| | | <mkdir dir="${basedir}/deploy/docs" />
|
| | | <copy todir="${basedir}/deploy/docs">
|
| | | <!-- Copy selected Gitblit resources -->
|
| | | <fileset dir="${basedir}/src/com/gitblit/wicket/resources">
|
| | | <fileset dir="${project.resources.dir}">
|
| | | <include name="background.png" />
|
| | | <include name="gitblit.css" />
|
| | | <include name="markdown.css" />
|
| | |
| | |
|
| | | </java>
|
| | |
|
| | | <!-- Create Zip deployment -->
|
| | | <property name="distribution.zipfile" value="gitblit-${gb.version}.zip" />
|
| | | <!-- Create Zip deployment --> |
| | | <zip destfile="${distribution.zipfile}">
|
| | | <fileset dir="${basedir}/deploy">
|
| | | <include name="**/*" />
|
| | |
| | | </target>
|
| | |
|
| | |
|
| | | <!-- Build Gitblit WAR -->
|
| | | <target name="buildWAR" description="Build the Gitblit WAR" depends="buildinfo">
|
| | | <path id="master-classpath">
|
| | | <fileset dir="${basedir}/ext">
|
| | | <include name="*.jar" />
|
| | | </fileset>
|
| | | </path>
|
| | | |
| | | <delete dir="${basedir}/war" />
|
| | | <mkdir dir="${basedir}/war/WEB-INF/lib"/>
|
| | | |
| | | <!-- Gitblit web.xml --> |
| | | <java classpath="${project.build.dir}" classname="com.gitblit.BuildWebXml">
|
| | | <classpath refid="master-classpath" />
|
| | | </java>
|
| | |
|
| | | <!-- Gitblit resources -->
|
| | | <copy todir="${basedir}/war">
|
| | | <fileset dir="${project.resources.dir}">
|
| | | <exclude name="thumbs.db" />
|
| | | </fileset>
|
| | | </copy>
|
| | | |
| | | <!-- Gitblit library dependencies -->
|
| | | <copy todir="${basedir}/war/WEB-INF/lib">
|
| | | <fileset dir="${basedir}/ext">
|
| | | <exclude name="*-sources.jar" />
|
| | | <exclude name="*-javadoc.jar" />
|
| | | <exclude name="jcommander*.jar" />
|
| | | <exclude name="jetty*.jar" />
|
| | | <exclude name="junit*.jar" />
|
| | | <exclude name="servlet*.jar" />
|
| | | </fileset>
|
| | | </copy>
|
| | |
|
| | | <!-- Gitblit classes -->
|
| | | <mkdir dir="${basedir}/war/WEB-INF/classes"/>
|
| | | <copy todir="${basedir}/war/WEB-INF/classes">
|
| | | <fileset dir="${basedir}/bin">
|
| | | <exclude name="WEB-INF/web.xml" />
|
| | | <exclude name="com/gitblit/tests/" />
|
| | | <exclude name="com/gitblit/Build*.class" />
|
| | | <exclude name="com/gitblit/GitBlitServer*.class" />
|
| | | <exclude name="com/gitblit/Launcher*.class" />
|
| | | <exclude name="com/gitblit/MakeCertificate*.class" />
|
| | | <exclude name="com/gitblit/Thumbnailer*.class" />
|
| | | </fileset>
|
| | | </copy>
|
| | |
|
| | | <!-- Build the WAR file -->
|
| | | <jar basedir="${basedir}/war" destfile="${distribution.warfile}" compress="true" />
|
| | | </target>
|
| | |
|
| | | |
| | | <!-- Publish binaries to github -->
|
| | | <target name="publishBinaries" description="Publish the Gitblit distribution to Github">
|
| | | <!-- TODO -->
|
| | | <!-- https://github.com/oyvindkinsey/GitHubUploadTask -->
|
| | | </target>
|
| | |
|
| | | |
| | | <!-- Publish site to hosting service -->
|
| | | <!-- You must add ext/commons-net-1.4.0.jar to your ANT classpath. -->
|
| | | <target name="publishSite" description="Publish the Gitblit site to a webserver (requires ext/commons-net-1.4.0.jar)">
|
| | |
| | | <fileset dir="${basedir}/site" />
|
| | | </ftp>
|
| | | </target>
|
| | | |
| | |
|
| | | <!-- Publish distribution to github -->
|
| | | <target name="publishDistribution" description="Publish the Gitblit distribution to Github">
|
| | | <!-- TODO -->
|
| | | <!-- https://github.com/oyvindkinsey/GitHubUploadTask -->
|
| | | </target>
|
| | | </project>
|
| | | </project> |
| | |
| | | # Git Servlet Settings
|
| | | #
|
| | |
|
| | | # Allow push/pull over http/https with JGit servlet
|
| | | # Changing this value requires a server restart.
|
| | | # Allow push/pull over http/https with JGit servlet.
|
| | | git.enableGitServlet = true
|
| | |
|
| | | # Base folder for repositories
|
| | |
| | | # Use forward slashes even on Windows!!
|
| | | # e.g. c:/gitrepos
|
| | | git.repositoriesFolder = git
|
| | |
|
| | | # Export all repositories
|
| | | # Changing this value requires a server restart.
|
| | | # if false, each exported repository must have a .git/git-daemon-export-ok file
|
| | | git.exportAll = true
|
| | |
|
| | | # Search the repositories folder subfolders for other repositories.
|
| | | # Repositories MAY NOT be nested (i.e. one repository within another)
|
| | |
| | | # Changing this value requires a server restart.
|
| | | web.authenticateAdminPages = true
|
| | |
|
| | | # Simple user realm file to authenticate users
|
| | | # Either a simple user realm file to authenticate users
|
| | | # OR a fully qualified class name that implements the ILoginService interface.
|
| | | # Any custom implementation must have a public default constructor.
|
| | | # Changing this value requires a server restart.
|
| | | realm.realmFile = users.properties
|
| | |
|
| | |
| | | # Example global regex substitutions
|
| | | # Use !!! to separate the search pattern and the replace pattern
|
| | | # searchpattern!!!replacepattern
|
| | | #regex.global.bug = \\b(Bug:)(\\s*[#]?|-){0,1}(\\d+)\\b!!!<a href="http://somehost/bug/$3">Bug-Id: $3</a>
|
| | | #regex.global.changeid = \\b(Change-Id:\\s*)([A-Za-z0-9]*)\\b!!!<a href="http://somehost/changeid/$2">Change-Id: $2</a>
|
| | | regex.global.bug = \\b(Bug:)(\\s*[#]?|-){0,1}(\\d+)\\b!!!<a href="http://somehost/bug/$3">Bug-Id: $3</a>
|
| | | regex.global.changeid = \\b(Change-Id:\\s*)([A-Za-z0-9]*)\\b!!!<a href="http://somehost/changeid/$2">Change-Id: $2</a>
|
| | |
|
| | | # Example per-repository regex substitutions overrides global
|
| | | #regex.myrepository.bug = \\b(Bug:)(\\s*[#]?|-){0,1}(\\d+)\\b!!!<a href="http://elsewhere/bug/$3">Bug-Id: $3</a>
|
| | | regex.myrepository.bug = \\b(Bug:)(\\s*[#]?|-){0,1}(\\d+)\\b!!!<a href="http://elsewhere/bug/$3">Bug-Id: $3</a>
|
| | |
|
| | | #
|
| | | # Server Settings
|
| | |
| | |
|
| | | # The temporary folder to decompress the gitblit webapp.
|
| | | server.tempFolder = temp
|
| | |
|
| | | # The common log4j logging pattern
|
| | | # http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
|
| | | server.log4jPattern = %-5p %d{MM-dd HH:mm:ss.SSS} %-20.20c{1} %m%n
|
| | |
|
| | | # Alternatively, you may specify a logging pattern for your OS.
|
| | | # If the os pattern is blank, the common pattern is used.
|
| | |
|
| | | # This windows pattern fits (mostly) within the fixed bounds of a command prompt.
|
| | | server.log4jPattern.windows = %-5p %m%n
|
| | |
|
| | | server.log4jPattern.linux =
|
| | |
|
| | |
|
| | | #
|
| | | # Jetty Settings
|
| | |
| | |
|
| | | ### Current Release
|
| | |
|
| | | [%VERSION%](http://gitblit.com/%DISTRIBUTION%) based on [%JGIT%][jgit] (*%BUILDDATE%*)
|
| | | %VERSION% ([go](http://gitblit.com/%GO%)|[war](http://gitblit.com/%WAR%)) based on [%JGIT%][jgit] (*%BUILDDATE%*)
|
| | |
|
| | | sources @ [Github][gitbltsrc]
|
| | |
|
| | |
| | | 2. Offer useful features for serving Git repositories. If feature is complex, refer to #1.
|
| | | 3. All dependencies must be retrievable from a publicly accessible [Maven](http://maven.apache.org) repository.<br/>This is to ensure authenticity of dependencies and to keep the Gitblit distribution svelte.
|
| | |
|
| | | ### Features
|
| | | - Out-of-the-box integrated stack requiring minimal configuration
|
| | | ### Gitblit Features
|
| | | - JGit SmartHTTP servlet
|
| | | - Browser and git client authentication
|
| | | - Four repository access control configurations and a Read-Only flag
|
| | |
| | | - Administrators may create, edit, rename, or delete repositories through the web UI
|
| | | - Administrators may create, edit, rename, or delete users through the web UI
|
| | | - Repository Owners may edit repositories through the web UI
|
| | | - Automatically generates a self-signed certificate for https communications
|
| | | - Git-notes support
|
| | | - Branch metrics (uses Google Charts)
|
| | | - HEAD and branch RSS feeds
|
| | |
| | | - Markdown file view support
|
| | | - Syntax highlighting for popular source code types
|
| | | - Customizable regular expression substitution for commit messages (i.e. bug or code review link integration)
|
| | | - Single text file for server configuration
|
| | | - Single text file for users configuration
|
| | | - Optional utility pages
|
| | | <ul class='noBullets'>
|
| | |
| | | <li> Ticgit ticket pages *(based on last MIT release bf57b032 2009-01-27)*</li>
|
| | | </ul>
|
| | |
|
| | | ### Gitblit-Go Features
|
| | | - Out-of-the-box integrated stack requiring minimal configuration
|
| | | - Automatically generates a self-signed certificate for https communications
|
| | | - Single text file for server configuration
|
| | |
|
| | | ### Limitations
|
| | | - [%JGIT%][jgit] does not currently [garbage collect or repack](http://www.kernel.org/pub/software/scm/git/docs/git-gc.html)
|
| | | - HTTP/HTTPS are the only supported protocols
|
| | | - Access controls are not path-based, they are repository-based
|
| | | - Only Administrators can create, rename or delete repositories
|
| | | - Gitblit is an integrated, full-stack solution. There is no WAR build at this time.
|
| | |
|
| | | ### Caveats
|
| | | - Gitblit may eat your data. Use at your own risk.
|
| | |
| | | - Code documentation
|
| | | - Unit testing
|
| | | - Update Build.java to JGit 1.0.0, when its released
|
| | | - WAR solution
|
| | |
|
| | | ### Idea List
|
| | | - Consider clone remote repository feature
|
| | |
| | | 
|
| | |
|
| | | ### Bundled Dependencies
|
| | | The following dependencies are bundled with the Gitblit zip distribution file.
|
| | | The following dependencies are bundled with Gitblit.
|
| | |
|
| | | - [google-code-prettify](http://code.google.com/p/google-code-prettify) (Apache 2.0)
|
| | | - [JavaService](http://forge.ow2.org/projects/javaservice) (BSD and LGPL)
|
| | |
| | | - other icons courtesy of [FatCow Hosting](http://www.fatcow.com/free-icons) (Creative Commons CC-BY)
|
| | |
|
| | | ### Downloaded Dependencies
|
| | | The following dependencies are automatically downloaded from the Apache Maven repository and from the Eclipse Maven repository when Gitblit is launched for the first time.
|
| | | The following dependencies are automatically downloaded by Gitblit-Go (or already bundled with the WAR) from the Apache Maven repository and from the Eclipse Maven repository when Gitblit is launched for the first time.
|
| | |
|
| | | - [JGit][jgit] (EDL 1.0)
|
| | | - [Wicket](http://wicket.apache.org) (Apache 2.0)
|
| | |
| | | ## Server Setup and Configuration
|
| | | ## Gitblit-Go Setup and Configuration
|
| | |
|
| | | 1. Download and unzip [Gitblit %VERSION%](http://gitblit.com/%DISTRIBUTION%).<br/>
|
| | | 1. Download and unzip [Gitblit-Go %VERSION%](http://gitblit.com/%GO%).<br/>
|
| | | *Its best to eliminate spaces in the path name as that can cause troubleshooting headaches.*
|
| | | 2. The server itself is configured through a simple text file.<br/>
|
| | | Open `gitblit.properties` in your favorite text editor and make sure to review and set:
|
| | |
| | | 3. The repository is clone-restricted and your password changed.
|
| | | 4. A regression in Gitblit. :(
|
| | |
|
| | | ### Why can't I access Gitblit from another machine?
|
| | | ### Why can't I access Gitblit-Go from another machine?
|
| | | Please check *server.httpBindInterface* and *server.httpsBindInterface* in `gitblit.properties`.
|
| | |
|
| | | ### How do I run Gitblit on port 80 or 443 in Linux?
|
| | | ### How do I run Gitblit-Go on port 80 or 443 in Linux?
|
| | | Linux requires root permissions to serve on ports < 1024.<br/>
|
| | | Run the server as *root* (security concern) or change the ports you are serving to 8080 (http) and/or 8443 (https).
|
| | |
|
| | |
| | | No. Gitblit is based on [JGit][jgit] which is a pure Java implementation of the [Git version control system][git].<br/>
|
| | | Everything you need for Gitblit is either in the zip distribution file or automatically downloaded on execution.
|
| | |
|
| | | ### What about periodic Git garbage collection (git-gc)?
|
| | | Good question. I'm not sure.
|
| | |
|
| | | Git repositories grow and grow and periodically need to be repacked every once in a while. Git calls this process [garbage collection](http://www.kernel.org/pub/software/scm/git/docs/git-gc.html) (which is not to be confused with [garbage collection](http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)).)
|
| | |
|
| | | [JGit's][jgit] documentation is sparse and its unclear whether or not JGit performs this function.
|
| | |
|
| | | ### Can I run Gitblit in conjunction with my existing Git tooling?
|
| | | Yes. You can configure Gitblit to only be a repository viewer.
|
| | | Yes.
|
| | |
|
| | | ### Do I need a JDK or can I use a JRE?
|
| | | 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.
|
| | |
|
| | | ### I want to deploy Gitblit into my own servlet container. Where is the WAR?
|
| | | At this time there is no WAR build available.
|
| | |
|
| | | ### Does Gitblit use a database to store its data?
|
| | | 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`.
|
| | |
| | |
|
| | | Gitblit's simple authentication and authorization mechanism can be used to facilitate one or more of the [workflows outlined here](http://progit.org/book/ch5-1.html). Should you require more fine-grained access controls you might consider using [gitolite](https://github.com/sitaramc/gitolite).
|
| | |
|
| | | ### Can I authenticate users against XYZ?
|
| | | Yes. The login service is pluggable. You may write your own authentication module by implementing the *ILoginService* interface. Set the fully qualified classname as the *realm.realmFile* property.
|
| | |
|
| | | ### Why doesn't Gitblit support SSH?
|
| | | 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/>
|
| | | SSH support requires creating, exchanging, and managing SSH keys (arguably not more complicated than managing users). While this is possible, JGit's SmartHTTP implementation is a simpler and universal transport mechanism.
|
File was renamed from src/com/gitblit/wicket/resources/gitblit.css |
| | |
| | |
|
| | | div.search input {
|
| | | vertical-align: top;
|
| | | background: url(/com/gitblit/wicket/resources/search-icon.png) no-repeat 4px center;
|
| | | background: url(search-icon.png) no-repeat 4px center;
|
| | | color: #ddd;
|
| | | background-color: #000070;
|
| | | border: 1px solid transparent;
|
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?>
|
| | | <web-app version="2.4"
|
| | | xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
| | | xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
|
| | |
|
| | | <!-- PARAMS --> |
| | | |
| | | <!-- Gitblit Context Listener --><!-- STRIP |
| | | <listener>
|
| | | <listener-class>com.gitblit.GitBlit</listener-class>
|
| | | </listener>STRIP --> |
| | | |
| | | |
| | | <!-- Git Servlet
|
| | | <url-pattern> MUST match: |
| | | * GitFilter
|
| | | * com.gitblit.Constants.GIT_PATH
|
| | | * Wicket Filter ignorePaths parameter --><!-- STRIP
|
| | | <servlet>
|
| | | <servlet-name>GitServlet</servlet-name>
|
| | | <servlet-class>org.jgit.http.transport.GitServlet</servlet-class>
|
| | | <init-param>
|
| | | <param-name>base-path</param-name>
|
| | | <param-value>c:/git</param-value>
|
| | | </init-param>
|
| | | <init-param>
|
| | | <param-name>export-all</param-name>
|
| | | <param-value>1</param-value>
|
| | | </init-param>
|
| | | </servlet>
|
| | | <servlet-mapping>
|
| | | <servlet-name>GitServlet</servlet-name> |
| | | <url-pattern>/git/*</url-pattern>
|
| | | </servlet-mapping>STRIP -->
|
| | | |
| | | |
| | | <!-- Syndication Servlet
|
| | | <url-pattern> MUST match: |
| | | * SyndicationFilter
|
| | | * com.gitblit.Constants.SYNDICATION_PATH
|
| | | * Wicket Filter ignorePaths parameter -->
|
| | | <servlet>
|
| | | <servlet-name>SyndicationServlet</servlet-name>
|
| | | <servlet-class>com.gitblit.SyndicationServlet</servlet-class> |
| | | </servlet>
|
| | | <servlet-mapping>
|
| | | <servlet-name>SyndicationServlet</servlet-name>
|
| | | <url-pattern>/feed/*</url-pattern>
|
| | | </servlet-mapping>
|
| | | |
| | | |
| | | <!-- Zip Servlet
|
| | | <url-pattern> MUST match: |
| | | * ZipServlet
|
| | | * com.gitblit.Constants.ZIP_PATH
|
| | | * Wicket Filter ignorePaths parameter -->
|
| | | <servlet>
|
| | | <servlet-name>ZipServlet</servlet-name>
|
| | | <servlet-class>com.gitblit.DownloadZipServlet</servlet-class> |
| | | </servlet>
|
| | | <servlet-mapping>
|
| | | <servlet-name>ZipServlet</servlet-name>
|
| | | <url-pattern>/zip/*</url-pattern>
|
| | | </servlet-mapping>
|
| | | |
| | |
|
| | | <!-- Git Access Restriction Filter
|
| | | <url-pattern> MUST match: |
| | | * GitServlet
|
| | | * com.gitblit.Constants.GIT_PATH
|
| | | * Wicket Filter ignorePaths parameter -->
|
| | | <filter>
|
| | | <filter-name>GitFilter</filter-name>
|
| | | <filter-class>com.gitblit.GitFilter</filter-class>
|
| | | </filter>
|
| | | <filter-mapping>
|
| | | <filter-name>GitFilter</filter-name>
|
| | | <url-pattern>/git/*</url-pattern>
|
| | | </filter-mapping>
|
| | | |
| | | |
| | | <!-- Syndication Restriction Filter
|
| | | <url-pattern> MUST match: |
| | | * SyndicationServlet
|
| | | * com.gitblit.Constants.SYNDICATION_PATH
|
| | | * Wicket Filter ignorePaths parameter -->
|
| | | <filter>
|
| | | <filter-name>SyndicationFilter</filter-name>
|
| | | <filter-class>com.gitblit.SyndicationFilter</filter-class>
|
| | | </filter>
|
| | | <filter-mapping>
|
| | | <filter-name>SyndicationFilter</filter-name>
|
| | | <url-pattern>/feed/*</url-pattern>
|
| | | </filter-mapping>
|
| | |
|
| | | |
| | | <!-- Wicket Filter -->
|
| | | <filter>
|
| | | <filter-name>wicketFilter</filter-name>
|
| | | <filter-class>
|
| | | org.apache.wicket.protocol.http.WicketFilter
|
| | | </filter-class>
|
| | | <init-param>
|
| | | <param-name>applicationClassName</param-name>
|
| | | <param-value>com.gitblit.wicket.GitBlitWebApp</param-value>
|
| | | </init-param>
|
| | | <init-param>
|
| | | <param-name>ignorePaths</param-name>
|
| | | <!-- Paths should match |
| | | * SyndicationFilter <url-pattern>
|
| | | * SyndicationServlet <url-pattern>
|
| | | * com.gitblit.Constants.SYNDICATION_PATH
|
| | | * GitFilter <url-pattern>
|
| | | * GitServlet <url-pattern>
|
| | | * com.gitblit.Constants.GIT_PATH
|
| | | * ZipServlet <url-pattern>
|
| | | * com.gitblit.Constants.ZIP_PATH -->
|
| | | <param-value>git/,feed/,zip/</param-value>
|
| | | </init-param>
|
| | | </filter>
|
| | | <filter-mapping>
|
| | | <filter-name>wicketFilter</filter-name>
|
| | | <url-pattern>/*</url-pattern>
|
| | | </filter-mapping>
|
| | | </web-app> |
| | |
| | | package com.gitblit;
|
| | |
|
| | | import java.io.IOException;
|
| | | import java.nio.charset.Charset;
|
| | | import java.security.Principal;
|
| | | import java.text.MessageFormat;
|
| | | import java.util.Enumeration;
|
| | |
| | | import javax.servlet.http.HttpServletResponse;
|
| | | import javax.servlet.http.HttpSession;
|
| | |
|
| | | import org.eclipse.jgit.util.Base64;
|
| | | import org.slf4j.Logger;
|
| | | import org.slf4j.LoggerFactory;
|
| | |
|
| | |
| | | if (authorization != null && authorization.startsWith(BASIC)) {
|
| | | // Authorization: Basic base64credentials
|
| | | String base64Credentials = authorization.substring(BASIC.length()).trim();
|
| | | String credentials = StringUtils.decodeBase64(base64Credentials);
|
| | | String credentials = new String(Base64.decode(base64Credentials),
|
| | | Charset.forName("UTF-8"));
|
| | | if (GitBlit.isDebugMode()) {
|
| | | logger.info(MessageFormat.format("AUTH: {0} ({1})", authorization, credentials));
|
| | | }
|
| | |
| | | // authenticated request permitted.
|
| | | // pass processing to the restricted servlet.
|
| | | newSession(accessRequest, httpResponse);
|
| | | logger.info("ARF: " + fullUrl + " (" + HttpServletResponse.SC_CONTINUE + ") authenticated");
|
| | | logger.info("ARF: " + fullUrl + " (" + HttpServletResponse.SC_CONTINUE
|
| | | + ") authenticated");
|
| | | chain.doFilter(accessRequest, httpResponse);
|
| | | return;
|
| | | }
|
| | |
| | | }
|
| | |
|
| | | if (GitBlit.isDebugMode()) {
|
| | | logger.info("ARF: " + fullUrl + " (" + HttpServletResponse.SC_CONTINUE + ") unauthenticated");
|
| | | logger.info("ARF: " + fullUrl + " (" + HttpServletResponse.SC_CONTINUE
|
| | | + ") unauthenticated");
|
| | | }
|
| | | // unauthenticated request permitted.
|
| | | // pass processing to the restricted servlet.
|
| | |
| | | @Override
|
| | | public void destroy() {
|
| | | }
|
| | | |
| | |
|
| | | /**
|
| | | * Wraps a standard HttpServletRequest and overrides user principal methods.
|
| | | */
|
| | | public static class AccessRestrictionRequest extends ServletRequestWrapper {
|
| | |
|
| | | private UserModel user;
|
| | | |
| | |
|
| | | public AccessRestrictionRequest(HttpServletRequest req) {
|
| | | super(req);
|
| | | user = new UserModel("anonymous");
|
| | | }
|
| | | |
| | |
|
| | | void setUser(UserModel user) {
|
| | | this.user = user;
|
| | | }
|
| | |
| | | "c7adc475ca40c288c93054e0f4fe58f3a98c0cb5");
|
| | |
|
| | | public static final MavenObject JETTY = new MavenObject("Jetty",
|
| | | "org/eclipse/jetty/aggregate", "jetty-all", "7.4.1.v20110513", 1500000, 1000000,
|
| | | 4100000, "1e2de9ed25a7c6ae38717d5ffdc7cfcd6be4bd46",
|
| | | "7b6279d16ce8f663537d9faf55ea353e748dbbaa",
|
| | | "fa06212e751296f1a7abc15c843b135bf49a112b");
|
| | | "org/eclipse/jetty/aggregate", "jetty-webapp", "7.4.2.v20110526", 1000000, 680000,
|
| | | 2720000, "56331143afa22d24d9faba96e86e6371b0686c7c",
|
| | | "9f38230fd589e29c8be0fc3c80fb51c5093c2e1e",
|
| | | "0d48212889c25252c5c14bef62703e28215d80cc");
|
| | |
|
| | | public static final MavenObject SERVLET = new MavenObject("Servlet 2.5", "javax/servlet",
|
| | | "servlet-api", "2.5", 105000, 158000, 0,
|
| | |
| | | "3d32d958b2f7aa58388af5701ea3aafc433e573f",
|
| | | "c37518b67ea85af485dd61fe854137eeacc50318");
|
| | |
|
| | | public static final MavenObject JUNIT = new MavenObject("JUnit", "junit", "junit", "3.8.2",
|
| | | 120000, 0, 0, "07e4cde26b53a9a0e3fe5b00d1dbbc7cc1d46060", "", "");
|
| | | public static final MavenObject JUNIT = new MavenObject("JUnit", "junit", "junit", "4.8.2",
|
| | | 237000, 0, 0, "c94f54227b08100974c36170dcb53329435fe5ad", "", "");
|
| | |
|
| | | public static final MavenObject MARKDOWNPAPERS = new MavenObject("MarkdownPapers",
|
| | | "org/tautua/markdownpapers", "markdownpapers-core", "1.0.0", 87000, 58000, 278000,
|
New file |
| | |
| | | /*
|
| | | * Copyright 2011 gitblit.com.
|
| | | *
|
| | | * Licensed under the Apache License, Version 2.0 (the "License");
|
| | | * you may not use this file except in compliance with the License.
|
| | | * You may obtain a copy of the License at
|
| | | *
|
| | | * http://www.apache.org/licenses/LICENSE-2.0
|
| | | *
|
| | | * Unless required by applicable law or agreed to in writing, software
|
| | | * distributed under the License is distributed on an "AS IS" BASIS,
|
| | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| | | * See the License for the specific language governing permissions and
|
| | | * limitations under the License.
|
| | | */
|
| | | package com.gitblit;
|
| | |
|
| | | import java.io.File;
|
| | | import java.io.FileInputStream;
|
| | | import java.io.FileOutputStream;
|
| | | import java.io.FileReader;
|
| | | import java.text.MessageFormat;
|
| | | import java.util.ArrayList;
|
| | | import java.util.Collections;
|
| | | import java.util.List;
|
| | | import java.util.Properties;
|
| | |
|
| | | public class BuildWebXml {
|
| | | private static final String PARAMS = "<!-- PARAMS -->";
|
| | | |
| | | private static final String [] STRIP_TOKENS = { "<!-- STRIP", "STRIP -->" };
|
| | |
|
| | | private static final String PARAM_PATTERN = "\n\t<context-param>\n\t\t<param-name>{0}</param-name>\n\t\t<param-value>{1}</param-value>\n\t</context-param>\n";
|
| | |
|
| | | public static void main(String[] args) throws Exception {
|
| | | // Read the current Gitblit properties
|
| | | // TODO extract the comments and inject them into web.xml too
|
| | | FileInputStream fis = new FileInputStream(new File("distrib/gitblit.properties"));
|
| | | Properties fileSettings = new Properties(); |
| | | fileSettings.load(fis);
|
| | | fis.close();
|
| | | List<String> keys = new ArrayList<String>(fileSettings.stringPropertyNames());
|
| | | Collections.sort(keys);
|
| | | |
| | | StringBuilder parameters = new StringBuilder();
|
| | | for (String key : keys) {
|
| | | if (!skipKey(key)) {
|
| | | String value = fileSettings.getProperty(key);
|
| | | parameters.append(MessageFormat.format(PARAM_PATTERN, key, value));
|
| | | }
|
| | | }
|
| | |
|
| | | // Read the prototype web.xml file
|
| | | File webxml = new File("src/WEB-INF/web.xml");
|
| | | char [] buffer = new char[(int) webxml.length()];
|
| | | FileReader reader = new FileReader(webxml);
|
| | | reader.read(buffer);
|
| | | reader.close();
|
| | | String webXmlContent = new String(buffer);
|
| | |
|
| | | // Insert the Gitblit properties into the prototype web.xml
|
| | | for (String stripToken:STRIP_TOKENS) {
|
| | | webXmlContent = webXmlContent.replace(stripToken, "");
|
| | | }
|
| | | int idx = webXmlContent.indexOf(PARAMS);
|
| | | StringBuilder sb = new StringBuilder();
|
| | | sb.append(webXmlContent.substring(0, idx));
|
| | | sb.append(parameters.toString());
|
| | | sb.append(webXmlContent.substring(idx + PARAMS.length()));
|
| | |
|
| | | // Save the merged web.xml to the war build folder
|
| | | FileOutputStream os = new FileOutputStream(new File("war/WEB-INF/web.xml"), false);
|
| | | os.write(sb.toString().getBytes());
|
| | | os.close();
|
| | | }
|
| | |
|
| | | private static boolean skipKey(String key) {
|
| | | return key.startsWith(Keys.server._ROOT);
|
| | | }
|
| | | }
|
| | |
| | |
|
| | | public static final String PROPERTIES_FILE = "gitblit.properties";
|
| | |
|
| | | public static final String GIT_SERVLET_PATH = "/git/";
|
| | | public static final String GIT_PATH = "/git/";
|
| | |
|
| | | public static final String ZIP_SERVLET_PATH = "/zip/";
|
| | | public static final String ZIP_PATH = "/zip/";
|
| | |
|
| | | public static final String SYNDICATION_SERVLET_PATH = "/feed/";
|
| | | public static final String SYNDICATION_PATH = "/feed/";
|
| | |
|
| | | public static final String RESOURCE_PATH = "/com/gitblit/wicket/resources/";
|
| | |
|
| | | public static final String BORDER = "***********************************************************";
|
| | |
|
| | | public static enum AccessRestrictionType {
|
| | |
| | | if (baseURL.length() > 0 && baseURL.charAt(baseURL.length() - 1) == '/') {
|
| | | baseURL = baseURL.substring(0, baseURL.length() - 1);
|
| | | }
|
| | | return baseURL + Constants.ZIP_SERVLET_PATH + "?r=" + repository
|
| | | return baseURL + Constants.ZIP_PATH + "?r=" + repository
|
| | | + (path == null ? "" : ("&p=" + path))
|
| | | + (objectId == null ? "" : ("&h=" + objectId));
|
| | | }
|
| | |
| | | if (user.password.equalsIgnoreCase(md5)) {
|
| | | returnedUser = user;
|
| | | }
|
| | | }
|
| | | if (user.password.equals(new String(password))) {
|
| | | } else if (user.password.equals(new String(password))) {
|
| | | returnedUser = user;
|
| | | }
|
| | | return returnedUser;
|
| | |
| | |
|
| | | public class GitBlit implements ServletContextListener {
|
| | |
|
| | | private static final GitBlit GITBLIT;
|
| | | private static GitBlit gitblit;
|
| | |
|
| | | private final Logger logger = LoggerFactory.getLogger(GitBlit.class);
|
| | |
|
| | |
| | |
|
| | | private File repositoriesFolder;
|
| | |
|
| | | private boolean exportAll;
|
| | | private boolean exportAll = true;
|
| | |
|
| | | private ILoginService loginService;
|
| | |
|
| | | private IStoredSettings storedSettings;
|
| | |
|
| | | static {
|
| | | GITBLIT = new GitBlit();
|
| | | }
|
| | |
|
| | | private GitBlit() {
|
| | | public GitBlit() {
|
| | | if (gitblit == null) {
|
| | | // Singleton reference when running in standard servlet container
|
| | | gitblit = this;
|
| | | }
|
| | | }
|
| | |
|
| | | public static GitBlit self() {
|
| | | return GITBLIT;
|
| | | if (gitblit == null) {
|
| | | gitblit = new GitBlit();
|
| | | }
|
| | | return gitblit;
|
| | | }
|
| | |
|
| | | public static boolean getBoolean(String key, boolean defaultValue) {
|
| | | return GITBLIT.storedSettings.getBoolean(key, defaultValue);
|
| | | return self().storedSettings.getBoolean(key, defaultValue);
|
| | | }
|
| | |
|
| | | public static int getInteger(String key, int defaultValue) {
|
| | | return GITBLIT.storedSettings.getInteger(key, defaultValue);
|
| | | return self().storedSettings.getInteger(key, defaultValue);
|
| | | }
|
| | |
|
| | | public static String getString(String key, String defaultValue) {
|
| | | return GITBLIT.storedSettings.getString(key, defaultValue);
|
| | | return self().storedSettings.getString(key, defaultValue);
|
| | | }
|
| | |
|
| | | public static List<String> getStrings(String key) {
|
| | | return GITBLIT.storedSettings.getStrings(key);
|
| | | return self().storedSettings.getStrings(key);
|
| | | }
|
| | |
|
| | | public static List<String> getAllKeys(String startingWith) {
|
| | | return GITBLIT.storedSettings.getAllKeys(startingWith);
|
| | | return self().storedSettings.getAllKeys(startingWith);
|
| | | }
|
| | |
|
| | | public static boolean isDebugMode() {
|
| | | return GITBLIT.storedSettings.getBoolean(Keys.web.debugMode, false);
|
| | | return self().storedSettings.getBoolean(Keys.web.debugMode, false);
|
| | | }
|
| | |
|
| | | public List<String> getOtherCloneUrls(String repositoryName) {
|
| | |
| | | }
|
| | |
|
| | | public void setLoginService(ILoginService loginService) {
|
| | | logger.info("Setting up login service " + loginService.toString());
|
| | | this.loginService = loginService;
|
| | | }
|
| | |
|
| | |
| | | public void configureContext(IStoredSettings settings) {
|
| | | logger.info("Reading configuration from " + settings.toString());
|
| | | this.storedSettings = settings;
|
| | | repositoriesFolder = new File(settings.getString(Keys.git.repositoriesFolder, "repos"));
|
| | | exportAll = settings.getBoolean(Keys.git.exportAll, true);
|
| | | repositoriesFolder = new File(settings.getString(Keys.git.repositoriesFolder, "git"));
|
| | | logger.info("Git repositories folder " + repositoriesFolder.getAbsolutePath());
|
| | | repositoryResolver = new FileResolver<Void>(repositoriesFolder, exportAll);
|
| | | String realm = settings.getString(Keys.realm.realmFile, "users.properties");
|
| | | ILoginService loginService = null;
|
| | | try {
|
| | | // Check to see if this "file" is a login service class
|
| | | Class<?> realmClass = Class.forName(realm);
|
| | | if (ILoginService.class.isAssignableFrom(realmClass)) {
|
| | | loginService = (ILoginService) realmClass.newInstance();
|
| | | }
|
| | | } catch (Throwable t) {
|
| | | // Not a login service class OR other issue
|
| | | // Use default file login service
|
| | | File realmFile = new File(realm);
|
| | | if (!realmFile.exists()) {
|
| | | try {
|
| | | realmFile.createNewFile();
|
| | | } catch (IOException x) {
|
| | | logger.error(
|
| | | MessageFormat.format("COULD NOT CREATE REALM FILE {0}!", realmFile), x);
|
| | | }
|
| | | }
|
| | | loginService = new FileLoginService(realmFile);
|
| | | }
|
| | | setLoginService(loginService);
|
| | | }
|
| | |
|
| | | @Override
|
| | |
| | | import java.util.ArrayList;
|
| | | import java.util.List;
|
| | |
|
| | | import org.apache.log4j.ConsoleAppender;
|
| | | import org.apache.log4j.PatternLayout;
|
| | | import org.apache.wicket.protocol.http.ContextParamWebApplicationFactory;
|
| | | import org.apache.wicket.protocol.http.WicketFilter;
|
| | | import org.eclipse.jetty.server.Connector;
|
| | | import org.eclipse.jetty.server.Server;
|
| | | import org.eclipse.jetty.server.bio.SocketConnector;
|
| | |
| | | import org.eclipse.jetty.server.ssl.SslConnector;
|
| | | import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
|
| | | import org.eclipse.jetty.server.ssl.SslSocketConnector;
|
| | | import org.eclipse.jetty.servlet.FilterHolder;
|
| | | import org.eclipse.jetty.servlet.FilterMapping;
|
| | | import org.eclipse.jetty.servlet.ServletHolder;
|
| | | import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
| | |
| | | import com.beust.jcommander.ParameterException;
|
| | | import com.beust.jcommander.Parameters;
|
| | | import com.gitblit.utils.StringUtils;
|
| | | import com.gitblit.wicket.GitBlitWebApp;
|
| | |
|
| | | public class GitBlitServer {
|
| | |
|
| | |
| | | */
|
| | | private static void start(Params params) {
|
| | | FileSettings settings = params.FILESETTINGS;
|
| | | String pattern = settings.getString(Keys.server.log4jPattern,
|
| | | "%-5p %d{MM-dd HH:mm:ss.SSS} %-20.20c{1} %m%n");
|
| | |
|
| | | // allow os override of logging pattern
|
| | | String os = System.getProperty("os.name").toLowerCase();
|
| | | if (os.indexOf("windows") > -1) {
|
| | | String winPattern = settings.getString(Keys.server.log4jPattern_windows, pattern);
|
| | | if (!StringUtils.isEmpty(winPattern)) {
|
| | | pattern = winPattern;
|
| | | }
|
| | | } else if (os.indexOf("linux") > -1) {
|
| | | String linuxPattern = settings.getString(Keys.server.log4jPattern_linux, pattern);
|
| | | if (!StringUtils.isEmpty(linuxPattern)) {
|
| | | pattern = linuxPattern;
|
| | | }
|
| | | }
|
| | |
|
| | | PatternLayout layout = new PatternLayout(pattern);
|
| | | org.apache.log4j.Logger rootLogger = org.apache.log4j.Logger.getRootLogger();
|
| | | rootLogger.addAppender(new ConsoleAppender(layout));
|
| | |
|
| | | logger = LoggerFactory.getLogger(GitBlitServer.class);
|
| | | logger.info(Constants.BORDER);
|
| | |
| | | sessionManager.setSecureCookies(params.port <= 0 && params.securePort > 0);
|
| | | rootContext.getSessionHandler().setSessionManager(sessionManager);
|
| | |
|
| | | // Wicket Filter
|
| | | String wicketPathSpec = "/*";
|
| | | FilterHolder wicketFilter = new FilterHolder(WicketFilter.class);
|
| | | wicketFilter.setInitParameter(ContextParamWebApplicationFactory.APP_CLASS_PARAM,
|
| | | GitBlitWebApp.class.getName());
|
| | | wicketFilter.setInitParameter(WicketFilter.FILTER_MAPPING_PARAM, wicketPathSpec);
|
| | | wicketFilter.setInitParameter(WicketFilter.IGNORE_PATHS_PARAM, "git/,feed/,zip/");
|
| | | rootContext.addFilter(wicketFilter, wicketPathSpec, FilterMapping.DEFAULT);
|
| | |
|
| | | // JGit Filter and Servlet
|
| | | if (settings.getBoolean(Keys.git.enableGitServlet, true)) {
|
| | | String jgitPathSpec = Constants.GIT_SERVLET_PATH + "*";
|
| | | rootContext.addFilter(GitFilter.class, jgitPathSpec, FilterMapping.DEFAULT);
|
| | | ServletHolder jGitServlet = rootContext.addServlet(GitServlet.class, jgitPathSpec);
|
| | | jGitServlet.setInitParameter("base-path", params.repositoriesFolder);
|
| | | jGitServlet.setInitParameter("export-all",
|
| | | settings.getBoolean(Keys.git.exportAll, true) ? "1" : "0");
|
| | | }
|
| | | String jgitPathSpec = Constants.GIT_PATH + "*";
|
| | | rootContext.addFilter(GitFilter.class, jgitPathSpec, FilterMapping.DEFAULT);
|
| | | ServletHolder jGitServlet = rootContext.addServlet(GitServlet.class, jgitPathSpec);
|
| | | jGitServlet.setInitParameter("base-path", params.repositoriesFolder);
|
| | | jGitServlet.setInitParameter("export-all", "1");
|
| | |
|
| | | // Syndication Filter and Servlet
|
| | | String feedPathSpec = Constants.SYNDICATION_SERVLET_PATH + "*";
|
| | | rootContext.addFilter(SyndicationFilter.class, feedPathSpec, FilterMapping.DEFAULT);
|
| | | rootContext.addServlet(SyndicationServlet.class, feedPathSpec);
|
| | |
|
| | | // Zip Servlet
|
| | | rootContext.addServlet(DownloadZipServlet.class, Constants.ZIP_SERVLET_PATH + "*");
|
| | |
|
| | | // Login Service
|
| | | // Ensure there is a defined Login Service
|
| | | String realmUsers = params.realmFile;
|
| | | if (StringUtils.isEmpty(realmUsers)) {
|
| | | logger.error(MessageFormat.format("PLEASE SPECIFY {0}!!", Keys.realm.realmFile));
|
| | | return;
|
| | | }
|
| | | File realmFile = new File(realmUsers);
|
| | | if (!realmFile.exists()) {
|
| | | try {
|
| | | realmFile.createNewFile();
|
| | | } catch (IOException x) {
|
| | | logger.error(MessageFormat.format("COULD NOT CREATE REALM FILE {0}!", realmUsers),
|
| | | x);
|
| | | return;
|
| | | }
|
| | | }
|
| | | logger.info("Setting up login service from " + realmUsers);
|
| | | FileLoginService loginService = new FileLoginService(realmFile);
|
| | | GitBlit.self().setLoginService(loginService);
|
| | |
|
| | | logger.info("Git repositories folder "
|
| | | + new File(params.repositoriesFolder).getAbsolutePath());
|
| | | |
| | | // Update settings
|
| | | // settings.put(Keys.realm.realmFile, params.realmFile);
|
| | | // settings.put(Keys.git.repositoriesFolder, params.repositoriesFolder);
|
| | |
|
| | | // Set the server's contexts
|
| | | server.setHandler(rootContext);
|
| | |
| | |
|
| | | @Override
|
| | | protected boolean canAccess(RepositoryModel repository, UserModel user, String urlRequestType) {
|
| | | if (!GitBlit.getBoolean(Keys.git.enableGitServlet, true)) {
|
| | | // Git Servlet disabled
|
| | | return false;
|
| | | }
|
| | | if (repository.isFrozen || repository.accessRestriction.atLeast(AccessRestrictionType.PUSH)) {
|
| | | boolean authorizedUser = user.canAccessRepository(repository.name);
|
| | | if (urlRequestType.equals(gitReceivePack)) {
|
| | |
| | | boolean renameRole(String oldRole, String newRole);
|
| | |
|
| | | boolean deleteRole(String role);
|
| | | |
| | | String toString();
|
| | | }
|
| | |
| | | public abstract class IStoredSettings {
|
| | |
|
| | | protected final Logger logger;
|
| | | |
| | |
|
| | | public IStoredSettings(Class<? extends IStoredSettings> clazz) {
|
| | | logger = LoggerFactory.getLogger(clazz);
|
| | | }
|
| | | |
| | |
|
| | | protected abstract Properties read();
|
| | |
|
| | | public List<String> getAllKeys(String startingWith) {
|
| | | startingWith = startingWith.toLowerCase();
|
| | | List<String> keys = new ArrayList<String>();
|
| | | Properties props = read();
|
| | | for (Object o : props.keySet()) {
|
| | | String key = o.toString();
|
| | | if (key.toLowerCase().startsWith(startingWith)) {
|
| | | keys.add(key);
|
| | | if (StringUtils.isEmpty(startingWith)) {
|
| | | keys.addAll(props.stringPropertyNames());
|
| | | } else {
|
| | | startingWith = startingWith.toLowerCase();
|
| | | for (Object o : props.keySet()) {
|
| | | String key = o.toString();
|
| | | if (key.toLowerCase().startsWith(startingWith)) {
|
| | | keys.add(key);
|
| | | }
|
| | | }
|
| | | }
|
| | | return keys;
|
| | |
| | | }
|
| | | StringBuilder url = new StringBuilder();
|
| | | url.append(baseURL);
|
| | | url.append(Constants.SYNDICATION_SERVLET_PATH);
|
| | | url.append(Constants.SYNDICATION_PATH);
|
| | | url.append(repository);
|
| | | if (!StringUtils.isEmpty(objectId) || length > 0) {
|
| | | StringBuilder parameters = new StringBuilder("?");
|
| | |
| | |
|
| | | public static List<PathChangeModel> getFilesInCommit(Repository r, RevCommit commit) {
|
| | | List<PathChangeModel> list = new ArrayList<PathChangeModel>();
|
| | | RevWalk rw = new RevWalk(r);
|
| | | TreeWalk tw = new TreeWalk(r);
|
| | | RevWalk rw = new RevWalk(r); |
| | | try {
|
| | | if (commit == null) {
|
| | | ObjectId object = r.resolve(Constants.HEAD);
|
| | | commit = rw.parseCommit(object);
|
| | | }
|
| | | RevTree commitTree = commit.getTree();
|
| | | } |
| | |
|
| | | tw.reset();
|
| | | tw.setRecursive(true);
|
| | | if (commit.getParentCount() == 0) {
|
| | | tw.addTree(commitTree);
|
| | | TreeWalk tw = new TreeWalk(r);
|
| | | tw.reset();
|
| | | tw.setRecursive(true);
|
| | | tw.addTree(commit.getTree());
|
| | | while (tw.next()) {
|
| | | list.add(new PathChangeModel(tw.getPathString(), tw.getPathString(), 0, tw
|
| | | .getRawMode(0), commit.getId().getName(), ChangeType.ADD));
|
| | | }
|
| | | tw.release();
|
| | | } else {
|
| | | RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
|
| | | RevTree parentTree = parent.getTree();
|
| | | tw.addTree(parentTree);
|
| | | tw.addTree(commitTree);
|
| | | tw.setFilter(TreeFilter.ANY_DIFF);
|
| | |
|
| | | RawTextComparator cmp = RawTextComparator.DEFAULT;
|
| | | DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE);
|
| | | df.setRepository(r);
|
| | | df.setDiffComparator(cmp);
|
| | | df.setDiffComparator(RawTextComparator.DEFAULT);
|
| | | df.setDetectRenames(true);
|
| | | List<DiffEntry> diffs = df.scan(parentTree, commitTree);
|
| | | List<DiffEntry> diffs = df.scan(parent.getTree(), commit.getTree());
|
| | | for (DiffEntry diff : diffs) {
|
| | | if (diff.getChangeType().equals(ChangeType.DELETE)) {
|
| | | list.add(new PathChangeModel(diff.getOldPath(), diff.getOldPath(), 0, diff
|
| | |
| | | } catch (Throwable t) {
|
| | | LOGGER.error("failed to determine files in commit!", t);
|
| | | } finally {
|
| | | rw.dispose();
|
| | | tw.release();
|
| | | rw.dispose(); |
| | | }
|
| | | return list;
|
| | | }
|
| | |
| | | package com.gitblit.utils;
|
| | |
|
| | | import java.io.UnsupportedEncodingException;
|
| | | import java.nio.charset.Charset;
|
| | | import java.security.MessageDigest;
|
| | | import java.security.NoSuchAlgorithmException;
|
| | | import java.util.ArrayList;
|
| | | import java.util.List;
|
| | | import java.util.regex.PatternSyntaxException;
|
| | |
|
| | | import org.eclipse.jetty.util.log.Log;
|
| | | import org.eclipse.jgit.util.Base64;
|
| | |
|
| | | public class StringUtils {
|
| | |
|
| | |
| | | md.update(string.getBytes("iso-8859-1"));
|
| | | byte[] digest = md.digest();
|
| | | return toHex(digest);
|
| | | } catch (Exception e) {
|
| | | Log.warn(e);
|
| | | return null;
|
| | | } catch (UnsupportedEncodingException u) {
|
| | | throw new RuntimeException(u);
|
| | | } catch (NoSuchAlgorithmException t) {
|
| | | throw new RuntimeException(t);
|
| | | }
|
| | | }
|
| | |
|
| | |
| | | }
|
| | | return sb.toString();
|
| | | }
|
| | |
|
| | | public static String decodeBase64(String base64) {
|
| | | return new String(Base64.decode(base64), Charset.forName("UTF-8"));
|
| | | }
|
| | |
|
| | | |
| | | public static String getRootPath(String path) {
|
| | | if (path.indexOf('/') > -1) {
|
| | | return path.substring(0, path.lastIndexOf('/'));
|
| | |
| | | feed.setDescription(description);
|
| | | SyndImageImpl image = new SyndImageImpl();
|
| | | image.setTitle(Constants.NAME);
|
| | | image.setUrl(hostUrl + Constants.RESOURCE_PATH + "gitblt_25.png");
|
| | | image.setUrl(hostUrl + "/gitblt_25.png");
|
| | | image.setLink(hostUrl);
|
| | | feed.setImage(image);
|
| | |
|
| | |
| | | gb.missingUsername = Missing Username
|
| | | gb.edit = edit
|
| | | gb.searchTypeTooltip = Select Search Type
|
| | | gb.searchTooltip = Search Git:Blit
|
| | | gb.searchTooltip = Search Gitblit
|
| | | gb.delete = delete
|
| | | gb.docs = docs
|
| | | gb.accessRestriction = access restriction
|
| | |
| | | gb.useTicketsDescription = distributed Ticgit issues
|
| | | gb.useDocsDescription = enumerates Markdown documentation in repository
|
| | | gb.showRemoteBranchesDescription = show remote branches
|
| | | gb.canAdminDescription = can administer Git:Blit server
|
| | | gb.canAdminDescription = can administer Gitblit server
|
| | | gb.permittedUsers = permitted users
|
| | | gb.isFrozen = is frozen
|
| | | gb.isFrozenDescription = deny push operations
|
| | |
| | | }
|
| | |
|
| | | public static ContextImage newImage(String wicketId, String file, String tooltip) {
|
| | | ContextImage img = new ContextImage(wicketId, com.gitblit.Constants.RESOURCE_PATH + file);
|
| | | ContextImage img = new ContextImage(wicketId, file);
|
| | | if (!StringUtils.isEmpty(tooltip)) {
|
| | | setHtmlTooltip(img, tooltip);
|
| | | }
|
| | |
| | | }
|
| | |
|
| | | public static ContextRelativeResource getResource(String file) {
|
| | | return new ContextRelativeResource(com.gitblit.Constants.RESOURCE_PATH + file);
|
| | | return new ContextRelativeResource(file);
|
| | | }
|
| | |
|
| | | public static String getHostURL(Request request) {
|
| | |
| | | xml:lang="en"
|
| | | lang="en">
|
| | |
|
| | | <!-- Head with Wicket-controlled resources in this package -->
|
| | | <!-- Head -->
|
| | | <wicket:head>
|
| | | <title wicket:id="title">[page title]</title>
|
| | | <wicket:link>
|
| | | <link rel="stylesheet" type="text/css" href="/com/gitblit/wicket/resources/gitblit.css"/>
|
| | | <link rel="shortcut icon" href="/com/gitblit/wicket/resources/gitblt-favicon.png" type="image/png" />
|
| | | </wicket:link>
|
| | | <link rel="stylesheet" type="text/css" href="gitblit.css"/>
|
| | | <link rel="icon" href="gitblt-favicon.png" type="image/png" />
|
| | | </wicket:head>
|
| | |
|
| | | <body>
|
| | | <!-- page header -->
|
| | | <div class="page_header">
|
| | | <a title="gitblit homepage" href="http://gitblit.com/">
|
| | | <wicket:link>
|
| | | <img src="/com/gitblit/wicket/resources/gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
|
| | | </wicket:link>
|
| | | <img src="gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
|
| | | </a>
|
| | | <span>
|
| | | <a href="/"><span wicket:id="siteName">[site name]</span></a> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span>
|
| | | <span wicket:id="siteName">[site name]</span> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span>
|
| | | </span>
|
| | | </div>
|
| | |
|
| | |
| | | if (siteName == null || siteName.trim().length() == 0) {
|
| | | siteName = Constants.NAME;
|
| | | }
|
| | | add(new Label("siteName", siteName));
|
| | | add(new LinkPanel("siteName", null, siteName, RepositoriesPage.class, null));
|
| | | add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class,
|
| | | WicketUtils.newRepositoryParameter(repositoryName)));
|
| | | add(new Label("pageName", pageName));
|
| | |
| | | HttpServletRequest req = servletWebRequest.getHttpServletRequest();
|
| | | return req.getServerName();
|
| | | }
|
| | | |
| | | public void warn(String message, Throwable t) {
|
| | | logger.warn(message, t);
|
| | | }
|
| | |
|
| | | public void error(String message, boolean redirect) {
|
| | | logger.error(message);
|
| | |
| | | .newPathParameter(repositoryName, entry.commitId, entry.path)));
|
| | | item.add(new BookmarkablePageLink<Void>("raw", RawPage.class, WicketUtils
|
| | | .newPathParameter(repositoryName, entry.commitId, entry.path)));
|
| | | item.add(new BookmarkablePageLink<Void>("blame", BlobPage.class).setEnabled(false));
|
| | | item.add(new BookmarkablePageLink<Void>("blame", BlamePage.class,
|
| | | WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
|
| | | item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils
|
| | | .newPathParameter(repositoryName, entry.commitId, entry.path)));
|
| | | WicketUtils.setAlternatingBackground(item, counter);
|
| | |
| | | <!-- Head with Wicket-controlled resources in this package -->
|
| | | <wicket:head>
|
| | | <title wicket:id="title">[page title]</title>
|
| | | <wicket:link>
|
| | | <link rel="stylesheet" type="text/css" href="/com/gitblit/wicket/resources/gitblit.css"/>
|
| | | <link rel="shortcut icon" href="/com/gitblit/wicket/resources/gitblt-favicon.png" type="image/png" />
|
| | | </wicket:link>
|
| | | <link rel="stylesheet" type="text/css" href="gitblit.css"/>
|
| | | <link rel="shortcut icon" href="gitblt-favicon.png" type="image/png" />
|
| | | </wicket:head>
|
| | |
|
| | | <body onload="document.getElementById('username').focus();">
|
| | | <div>
|
| | | <div style="padding-top: 10px;text-align:center;">
|
| | | <wicket:link>
|
| | | <img src="/com/gitblit/wicket/resources/gitblt_25.png" alt="Git:Blit"/><br/>
|
| | | </wicket:link>
|
| | | <img src="gitblt_25.png" alt="Gitblit"/><br/>
|
| | | <div style="padding-top:30px;font-weight:bold;" wicket:id="name">[name]</div>
|
| | | </div>
|
| | |
|
| | |
| | |
|
| | | <!-- contribute markdown css to the page header -->
|
| | | <wicket:head>
|
| | | <wicket:link>
|
| | | <link href="/com/gitblit/wicket/resources/markdown.css" type="text/css" rel="stylesheet" />
|
| | | </wicket:link>
|
| | | <link href="markdown.css" type="text/css" rel="stylesheet" />
|
| | | </wicket:head>
|
| | |
|
| | | <body>
|
| | | <wicket:extend>
|
| | | <!-- markdown nav links -->
|
| | | <div class="page_nav2">
|
| | | <span wicket:id="blameLink">[blame link]</span> | <a wicket:id="historyLink"><wicket:message key="gb.history"></wicket:message></a> | <a wicket:id="rawLink"><wicket:message key="gb.raw"></wicket:message></a> | <a wicket:id="headLink"><wicket:message key="gb.head"></wicket:message></a>
|
| | | <a wicket:id="blameLink"><wicket:message key="gb.blame"></wicket:message></a> | <a wicket:id="historyLink"><wicket:message key="gb.history"></wicket:message></a> | <a wicket:id="rawLink"><wicket:message key="gb.raw"></wicket:message></a> | <a wicket:id="headLink"><wicket:message key="gb.head"></wicket:message></a>
|
| | | </div>
|
| | |
|
| | | <!-- markdown content -->
|
| | |
| | | RevCommit commit = JGitUtils.getCommit(r, objectId);
|
| | |
|
| | | // markdown page links
|
| | | add(new Label("blameLink", getString("gb.blame")));
|
| | | add(new BookmarkablePageLink<Void>("blameLink", BlamePage.class,
|
| | | WicketUtils.newPathParameter(repositoryName, objectId, markdownPath)));
|
| | | add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class,
|
| | | WicketUtils.newPathParameter(repositoryName, objectId, markdownPath)));
|
| | | add(new BookmarkablePageLink<Void>("rawLink", RawPage.class, WicketUtils.newPathParameter(
|
| | |
| | | xml:lang="en"
|
| | | lang="en">
|
| | | <wicket:head>
|
| | | <wicket:link>
|
| | | <link href="/com/gitblit/wicket/resources/markdown.css" type="text/css" rel="stylesheet" />
|
| | | </wicket:link>
|
| | | <link href="markdown.css" type="text/css" rel="stylesheet" />
|
| | | </wicket:head>
|
| | |
|
| | | <body>
|
| | |
| | | message = MarkdownUtils.transformMarkdown(reader);
|
| | | } catch (Throwable t) {
|
| | | message = "Failed to read " + file;
|
| | | error(message, t, false);
|
| | | warn(message, t);
|
| | | }
|
| | | } else {
|
| | | message = messageSource + " is not a valid file.";
|
| | |
| | | <!-- page nav links -->
|
| | | <div class="page_nav">
|
| | | <a style="text-decoration: none;" wicket:id="syndication">
|
| | | <img style="border:0px;vertical-align:middle;" src="/com/gitblit/wicket/resources/feed_16x16.png"></img>
|
| | | <img style="border:0px;vertical-align:middle;" src="feed_16x16.png"></img>
|
| | | </a>
|
| | | <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>
|
| | | </div>
|
| | |
| | | import org.eclipse.jgit.lib.PersonIdent;
|
| | | import org.eclipse.jgit.lib.Repository;
|
| | | import org.eclipse.jgit.revwalk.RevCommit;
|
| | | import org.slf4j.Logger;
|
| | | import org.slf4j.LoggerFactory;
|
| | |
|
| | | import com.gitblit.GitBlit;
|
| | | import com.gitblit.Keys;
|
| | |
| | |
|
| | | private RepositoryModel m;
|
| | |
|
| | | private final Logger logger = LoggerFactory.getLogger(RepositoryPage.class);
|
| | |
|
| | | private final Map<String, String> knownPages = new HashMap<String, String>() {
|
| | | private final Map<String, PageRegistration> registeredPages = new HashMap<String, PageRegistration>() {
|
| | |
|
| | | private static final long serialVersionUID = 1L;
|
| | |
|
| | | {
|
| | | put("summary", "gb.summary");
|
| | | put("log", "gb.log");
|
| | | put("branches", "gb.branches");
|
| | | put("tags", "gb.tags");
|
| | | put("tree", "gb.tree");
|
| | | put("tickets", "gb.tickets");
|
| | | put("edit", "gb.edit");
|
| | | put("summary", new PageRegistration("gb.summary", SummaryPage.class));
|
| | | put("log", new PageRegistration("gb.log", LogPage.class));
|
| | | put("branches", new PageRegistration("gb.branches", BranchesPage.class));
|
| | | put("tags", new PageRegistration("gb.tags", TagsPage.class));
|
| | | put("tree", new PageRegistration("gb.tree", TreePage.class));
|
| | | put("tickets", new PageRegistration("gb.tickets", TicketsPage.class));
|
| | | put("edit", new PageRegistration("gb.edit", EditRepositoryPage.class));
|
| | | put("docs", new PageRegistration("gb.docs", DocsPage.class));
|
| | | }
|
| | | };
|
| | |
|
| | |
| | | RepositoryModel model = getRepositoryModel();
|
| | |
|
| | | // standard page links
|
| | | add(new BookmarkablePageLink<Void>("summary", SummaryPage.class,
|
| | | WicketUtils.newRepositoryParameter(repositoryName)));
|
| | | add(new BookmarkablePageLink<Void>("log", LogPage.class,
|
| | | WicketUtils.newRepositoryParameter(repositoryName)));
|
| | | add(new BookmarkablePageLink<Void>("branches", BranchesPage.class,
|
| | | WicketUtils.newRepositoryParameter(repositoryName)));
|
| | | add(new BookmarkablePageLink<Void>("tags", TagsPage.class,
|
| | | WicketUtils.newRepositoryParameter(repositoryName)));
|
| | | add(new BookmarkablePageLink<Void>("tree", TreePage.class,
|
| | | WicketUtils.newRepositoryParameter(repositoryName)));
|
| | | addRegisteredPageLink("summary");
|
| | | addRegisteredPageLink("log");
|
| | | addRegisteredPageLink("branches");
|
| | | addRegisteredPageLink("tags");
|
| | | addRegisteredPageLink("tree");
|
| | |
|
| | | // per-repository extra page links
|
| | | List<String> extraPageLinks = new ArrayList<String>();
|
| | |
|
| | | // Conditionally add tickets link
|
| | | if (model.useTickets && TicgitUtils.getTicketsBranch(r) != null) {
|
| | | extraPageLinks.add("tickets");
|
| | | }
|
| | |
|
| | | // Conditionally add docs link
|
| | | if (model.useDocs) {
|
| | | extraPageLinks.add("docs");
|
| | | }
|
| | |
| | | extraPageLinks.add("edit");
|
| | | }
|
| | |
|
| | | final String pageName = getPageName();
|
| | | final String pageWicketId = getLinkWicketId(pageName);
|
| | | ListDataProvider<String> extrasDp = new ListDataProvider<String>(extraPageLinks);
|
| | | DataView<String> extrasView = new DataView<String>("extra", extrasDp) {
|
| | | private static final long serialVersionUID = 1L;
|
| | |
|
| | | public void populateItem(final Item<String> item) {
|
| | | String extra = item.getModelObject();
|
| | | if (extra.equals("tickets")) {
|
| | | item.add(new Label("extraSeparator", " | "));
|
| | | item.add(new LinkPanel("extraLink", null, getString("gb.tickets"),
|
| | | TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
|
| | | } else if (extra.equals("docs")) {
|
| | | item.add(new Label("extraSeparator", " | "));
|
| | | item.add(new LinkPanel("extraLink", null, getString("gb.docs"), DocsPage.class,
|
| | | WicketUtils.newRepositoryParameter(repositoryName)));
|
| | | } else if (extra.equals("edit")) {
|
| | | item.add(new Label("extraSeparator", " | "));
|
| | | item.add(new LinkPanel("extraLink", null, getString("gb.edit"),
|
| | | EditRepositoryPage.class, WicketUtils
|
| | | .newRepositoryParameter(repositoryName)));
|
| | | }
|
| | | PageRegistration pageReg = registeredPages.get(extra);
|
| | | item.add(new Label("extraSeparator", " | "));
|
| | | item.add(new LinkPanel("extraLink", null, getString(pageReg.translationKey),
|
| | | pageReg.pageClass, WicketUtils.newRepositoryParameter(repositoryName))
|
| | | .setEnabled(!extra.equals(pageWicketId)));
|
| | | }
|
| | | };
|
| | | add(extrasView);
|
| | |
| | | .getRelativePathPrefixToContextRoot(), repositoryName, null, 0)));
|
| | |
|
| | | // disable current page
|
| | | disablePageLink(getPageName());
|
| | | disableRegisteredPageLink(pageName);
|
| | |
|
| | | // add floating search form
|
| | | SearchForm searchForm = new SearchForm("searchForm", repositoryName);
|
| | |
| | | setStatelessHint(true);
|
| | | }
|
| | |
|
| | | public void disablePageLink(String pageName) {
|
| | | for (String wicketId : knownPages.keySet()) {
|
| | | String key = knownPages.get(wicketId);
|
| | | public String getLinkWicketId(String pageName) {
|
| | | for (String wicketId : registeredPages.keySet()) {
|
| | | String key = registeredPages.get(wicketId).translationKey;
|
| | | String linkName = getString(key);
|
| | | if (linkName.equals(pageName)) {
|
| | | Component c = get(wicketId);
|
| | | if (c != null) {
|
| | | c.setEnabled(false);
|
| | | }
|
| | | break;
|
| | | return wicketId;
|
| | | }
|
| | | }
|
| | | return null;
|
| | | }
|
| | |
|
| | | public void disableRegisteredPageLink(String pageName) {
|
| | | String wicketId = getLinkWicketId(pageName);
|
| | | if (!StringUtils.isEmpty(wicketId)) {
|
| | | Component c = get(wicketId);
|
| | | if (c != null) {
|
| | | c.setEnabled(false);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | private void addRegisteredPageLink(String key) {
|
| | | PageRegistration pageReg = registeredPages.get(key);
|
| | | add(new BookmarkablePageLink<Void>(key, pageReg.pageClass,
|
| | | WicketUtils.newRepositoryParameter(repositoryName)));
|
| | | }
|
| | |
|
| | | protected void addSyndicationDiscoveryLink() {
|
| | |
| | | return WicketUtils.newPathParameter(repositoryName, objectId, path);
|
| | | }
|
| | |
|
| | | private static class PageRegistration {
|
| | | final String translationKey;
|
| | | final Class<? extends BasePage> pageClass;
|
| | |
|
| | | PageRegistration(String translationKey, Class<? extends BasePage> pageClass) {
|
| | | this.translationKey = translationKey;
|
| | | this.pageClass = pageClass;
|
| | | }
|
| | | }
|
| | |
|
| | | private static class SearchForm extends StatelessForm<Void> {
|
| | | private static final long serialVersionUID = 1L;
|
| | |
|
| | |
| | | lang="en">
|
| | |
|
| | | <wicket:head>
|
| | | <wicket:link>
|
| | | <link href="/com/gitblit/wicket/resources/markdown.css" type="text/css" rel="stylesheet" />
|
| | | </wicket:link>
|
| | | <link href="markdown.css" type="text/css" rel="stylesheet" />
|
| | | </wicket:head>
|
| | |
|
| | | <body>
|
| | |
| | | }
|
| | | StringBuilder sb = new StringBuilder();
|
| | | sb.append(WicketUtils.getHostURL(getRequestCycle().getRequest()));
|
| | | sb.append(Constants.GIT_SERVLET_PATH);
|
| | | sb.append(Constants.GIT_PATH);
|
| | | sb.append(repositoryName);
|
| | | repositoryUrls.add(sb.toString());
|
| | | } else {
|
| | |
| | | <wicket:fragment wicket:id="adminLinks">
|
| | | <!-- page nav links -->
|
| | | <div class="admin_nav">
|
| | | <wicket:link>
|
| | | <img style="vertical-align: top;" src="/com/gitblit/wicket/resources/add_16x16.png"/>
|
| | | </wicket:link> |
| | | <img style="vertical-align: top;" src="add_16x16.png"/>
|
| | | <a wicket:id="newRepository">
|
| | | <wicket:message key="gb.newRepository"></wicket:message>
|
| | | </a>
|
| | |
| | | <wicket:fragment wicket:id="flatRepositoryHeader">
|
| | | <tr>
|
| | | <th class="left" wicket:id="orderByRepository">
|
| | | <wicket:link>
|
| | | <img style="vertical-align: top; border: 1px solid #888;" src="/com/gitblit/wicket/resources/gitweb-favicon.png"/>
|
| | | </wicket:link>
|
| | | <img style="vertical-align: top; border: 1px solid #888;" src="gitweb-favicon.png"/>
|
| | | <wicket:message key="gb.repository">Repository</wicket:message>
|
| | | </th>
|
| | | <th wicket:id="orderByDescription"><wicket:message key="gb.description">Description</wicket:message></th>
|
| | |
| | | <wicket:fragment wicket:id="groupRepositoryHeader">
|
| | | <tr>
|
| | | <th class="left">
|
| | | <wicket:link>
|
| | | <img style="vertical-align: top; border: 1px solid #888;" src="/com/gitblit/wicket/resources/gitweb-favicon.png"/>
|
| | | </wicket:link>
|
| | | <img style="vertical-align: top; border: 1px solid #888;" src="gitweb-favicon.png"/>
|
| | | <wicket:message key="gb.repository">Repository</wicket:message>
|
| | | </th>
|
| | | <th><wicket:message key="gb.description">Description</wicket:message></th>
|
| | |
| | | <td class="rightAlign">
|
| | | <span wicket:id="repositoryLinks"></span>
|
| | | <a style="text-decoration: none;" wicket:id="syndication">
|
| | | <img style="border:0px;vertical-align:middle;" src="/com/gitblit/wicket/resources/feed_16x16.png"></img>
|
| | | <img style="border:0px;vertical-align:middle;" src="feed_16x16.png"></img>
|
| | | </a>
|
| | | </td>
|
| | | </wicket:fragment>
|
| | |
| | | <wicket:panel>
|
| | |
|
| | | <!-- header -->
|
| | | <div class="header" wicket:id="header">[search header]</div>
|
| | | <div wicket:id="commitHeader">[search header]</div>
|
| | |
|
| | | <!-- header --> |
| | | <div style="margin-top:10px;font-weight:bold;" class="header"><wicket:message key="gb.search"></wicket:message>: <span wicket:id="searchString">[search string]</span> (<span wicket:id="searchType">[search type]</span>)</div>
|
| | | <table class="pretty">
|
| | | <tbody>
|
| | | <tr wicket:id="commit">
|
| | |
| | | import java.util.List;
|
| | | import java.util.Map;
|
| | |
|
| | | import org.apache.wicket.markup.html.basic.Label;
|
| | | import org.apache.wicket.markup.html.link.BookmarkablePageLink;
|
| | | import org.apache.wicket.markup.repeater.Item;
|
| | | import org.apache.wicket.markup.repeater.data.DataView;
|
| | |
| | | hasMore = commits.size() >= itemsPerPage;
|
| | |
|
| | | // header
|
| | | add(new LinkPanel("header", "title", commit == null ? "" : commit.getShortMessage(),
|
| | | CommitPage.class, WicketUtils.newObjectParameter(repositoryName,
|
| | | commit == null ? "" : commit.getName())));
|
| | | add(new CommitHeaderPanel("commitHeader", repositoryName, commit));
|
| | | |
| | | add(new Label("searchString", value));
|
| | | add(new Label("searchType", searchType.toString()));
|
| | |
|
| | | ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
|
| | | DataView<RevCommit> searchView = new DataView<RevCommit>("commit", dp) {
|
| | |
| | | <table class="repositories">
|
| | | <tr>
|
| | | <th class="left">
|
| | | <wicket:link>
|
| | | <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="/com/gitblit/wicket/resources/user_16x16.png"/>
|
| | | </wicket:link>
|
| | | <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="user_16x16.png"/>
|
| | | <wicket:message key="gb.username">[username]</wicket:message>
|
| | | </th>
|
| | | <th class="right"></th>
|
| | |
| | | <wicket:fragment wicket:id="adminLinks">
|
| | | <!-- page nav links -->
|
| | | <div class="admin_nav">
|
| | | <wicket:link>
|
| | | <img style="vertical-align: top;" src="/com/gitblit/wicket/resources/add_16x16.png"/>
|
| | | </wicket:link> |
| | | <img style="vertical-align: top;" src="add_16x16.png"/>
|
| | | <a wicket:id="newUser">
|
| | | <wicket:message key="gb.newUser"></wicket:message>
|
| | | </a>
|
| | |
| | | log4j.debug=false |
| | | #------------------------------------------------------------------------------ |
| | | # |
| | | # The following properties set the logging levels and log appender. The |
| | | # log4j.rootCategory variable defines the default log level and one or more |
| | | # appenders. For the console, use 'S'. For the daily rolling file, use 'R'. |
| | | # For an HTML formatted log, use 'H'. |
| | | # |
| | | # To override the default (rootCategory) log level, define a property of the |
| | | # form (see below for available values): |
| | | # |
| | | # log4j.logger. = |
| | | # |
| | | # Available logger names: |
| | | # TODO |
| | | # |
| | | # Possible Log Levels: |
| | | # FATAL, ERROR, WARN, INFO, DEBUG |
| | | # |
| | | #------------------------------------------------------------------------------ |
| | | log4j.rootCategory=INFO, S |
| | | |
| | | log4j.rootLogger=INFO |
| | | log4j.logger.org=INFO |
| | | log4j.logger.com=INFO |
| | | log4j.logger.net=INFO |
| | | #log4j.rootLogger=INFO |
| | | #log4j.logger.org=INFO |
| | | #log4j.logger.com=INFO |
| | | #log4j.logger.net=INFO |
| | | |
| | | log4j.logger.com.gitblit=DEBUG |
| | | #log4j.logger.com.gitblit=DEBUG |
| | | |
| | | log4j.logger.org.apache.wicket=INFO |
| | | log4j.logger.org.apache.wicket.RequestListenerInterface=WARN |
| | | log4j.logger.org.apache.wicket.protocol.http.HttpSessionStore=WARN |
| | | |
| | | #------------------------------------------------------------------------------ |
| | | # |
| | | # The following properties configure the console (stdout) appender. |
| | | # See http://logging.apache.org/log4j/docs/api/index.html for details. |
| | | # |
| | | #------------------------------------------------------------------------------ |
| | | log4j.appender.S = org.apache.log4j.ConsoleAppender |
| | | log4j.appender.S.layout = org.apache.log4j.PatternLayout |
| | | log4j.appender.S.layout.ConversionPattern = %-5p %m%n |
| | | |
| | | #------------------------------------------------------------------------------ |
| | | # |
| | | # The following properties configure the Daily Rolling File appender. |
| | | # See http://logging.apache.org/log4j/docs/api/index.html for details. |
| | | # |
| | | #------------------------------------------------------------------------------ |
| | | log4j.appender.R = org.apache.log4j.DailyRollingFileAppender |
| | | log4j.appender.R.File = logs/gitblit.log |
| | | log4j.appender.R.Append = true |
| | | log4j.appender.R.DatePattern = '.'yyy-MM-dd |
| | | log4j.appender.R.layout = org.apache.log4j.PatternLayout |
| | | log4j.appender.R.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n |
| | | |
| | | #------------------------------------------------------------------------------ |
| | | # |
| | | # The following properties configure the Rolling File appender in HTML. |
| | | # See http://logging.apache.org/log4j/docs/api/index.html for details. |
| | | # |
| | | #------------------------------------------------------------------------------ |
| | | log4j.appender.H = org.apache.log4j.RollingFileAppender |
| | | log4j.appender.H.File = logs/gitblit.html |
| | | log4j.appender.H.MaxFileSize = 100KB |
| | | log4j.appender.H.Append = false |
| | | log4j.appender.H.layout = org.apache.log4j.HTMLLayout |