mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-08 22:45:51 +01:00
Merge branch 'master' into scala-plugin
Conflicts: project/build.scala
This commit is contained in:
13
contrib/README.md
Normal file
13
contrib/README.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Contrib Notes #
|
||||||
|
|
||||||
|
The configuration script adapts according to the OS.
|
||||||
|
The `linux` directory contains scripts for Ubuntu and RedHat.
|
||||||
|
The Mac scripts have been folded in as well.
|
||||||
|
Common scripts are in this directory.
|
||||||
|
|
||||||
|
This version of scripts has so far only been tested on Ubuntu and Mac. Someone else will have to test on RedHat.
|
||||||
|
|
||||||
|
To run:
|
||||||
|
1. Edit `gitbucket.conf` to suit.
|
||||||
|
2. Type: `install`
|
||||||
|
|
||||||
62
contrib/gitbucket.conf
Normal file
62
contrib/gitbucket.conf
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# Configuration section is below. Ignore this part
|
||||||
|
|
||||||
|
function isUbuntu {
|
||||||
|
if [ -f /etc/lsb-release ]; then
|
||||||
|
grep -i ubuntu /etc/lsb-release | head -n 1 | cut -d \ -f 1 | cut -d = -f 2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function isRedHat {
|
||||||
|
if [ -d "/etc/rc.d/init.d" ]; then echo yes; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function isMac {
|
||||||
|
if [[ "$(uname -a | cut -d \ -f 1 )" == "Darwin" ]]; then echo yes; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Configuration section start
|
||||||
|
#
|
||||||
|
|
||||||
|
# Bind host
|
||||||
|
GITBUCKET_HOST=0.0.0.0
|
||||||
|
|
||||||
|
# Other Java option
|
||||||
|
GITBUCKET_JVM_OPTS=-Dmail.smtp.starttls.enable=true
|
||||||
|
|
||||||
|
# Data directory, holds repositories
|
||||||
|
GITBUCKET_HOME=/var/lib/gitbucket
|
||||||
|
|
||||||
|
GITBUCKET_LOG_DIR=/var/log/gitbucket
|
||||||
|
|
||||||
|
# Server port
|
||||||
|
GITBUCKET_PORT=8080
|
||||||
|
|
||||||
|
# URL prefix for the GitBucket page (http://<host>:<port>/<prefix>/)
|
||||||
|
GITBUCKET_PREFIX=
|
||||||
|
|
||||||
|
# Directory where GitBucket is installed
|
||||||
|
# Configuration is stored here:
|
||||||
|
GITBUCKET_DIR=/usr/share/gitbucket
|
||||||
|
GITBUCKET_WAR_DIR=$GITBUCKET_DIR/lib
|
||||||
|
|
||||||
|
# Path to the WAR file
|
||||||
|
GITBUCKET_WAR_FILE=$GITBUCKET_WAR_DIR/gitbucket.war
|
||||||
|
|
||||||
|
# GitBucket version to fetch when installing
|
||||||
|
GITBUCKET_VERSION=2.1
|
||||||
|
|
||||||
|
#
|
||||||
|
# End of configuration section. Ignore this part
|
||||||
|
#
|
||||||
|
if [ `isUbuntu` ]; then
|
||||||
|
GITBUCKET_SERVICE=/etc/init.d/gitbucket
|
||||||
|
elif [ `isRedHat` ]; then
|
||||||
|
GITBUCKET_SERVICE=/etc/rc.d/init.d
|
||||||
|
elif [ `isMac` ]; then
|
||||||
|
GITBUCKET_SERVICE=/Library/StartupItems/GitBucket/GitBucket
|
||||||
|
else
|
||||||
|
echo "Don't know how to install onto this OS"
|
||||||
|
exit -2
|
||||||
|
fi
|
||||||
|
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# /etc/rc.d/init.d/gitbucket
|
# RedHat: /etc/rc.d/init.d/gitbucket
|
||||||
|
# Ubuntu: /etc/init.d/gitbucket
|
||||||
|
# Mac OS/X: /Library/StartupItems/GitBucket
|
||||||
#
|
#
|
||||||
# Starts the GitBucket server
|
# Starts the GitBucket server
|
||||||
#
|
#
|
||||||
@@ -8,28 +10,44 @@
|
|||||||
# description: Run GitBucket server
|
# description: Run GitBucket server
|
||||||
# processname: java
|
# processname: java
|
||||||
|
|
||||||
# Source function library
|
set -e
|
||||||
. /etc/rc.d/init.d/functions
|
|
||||||
|
[ -f /etc/rc.d/init.d/functions ] && source /etc/rc.d/init.d/functions # RedHat
|
||||||
|
[ -f /etc/rc.common ] && source /etc/rc.common # Mac OS/X
|
||||||
|
|
||||||
# Default values
|
# Default values
|
||||||
GITBUCKET_HOME=/var/lib/gitbucket
|
GITBUCKET_HOME=/var/lib/gitbucket
|
||||||
GITBUCKET_WAR_FILE=/usr/share/gitbucket/lib/gitbucket.war
|
GITBUCKET_WAR_FILE=/usr/share/gitbucket/lib/gitbucket.war
|
||||||
|
|
||||||
# Pull in cq settings
|
# Pull in cq settings
|
||||||
[ -f /etc/sysconfig/gitbucket ] && . /etc/sysconfig/gitbucket
|
[ -f /etc/sysconfig/gitbucket ] && source /etc/sysconfig/gitbucket # RedHat
|
||||||
|
[ -f gitbucket.conf ] && source gitbucket.conf # For all systems
|
||||||
|
|
||||||
# Location of the log and PID file
|
# Location of the log and PID file
|
||||||
LOG_FILE=/var/log/gitbucket/run.log
|
LOG_FILE=$GITBUCKET_LOG_DIR/run.log
|
||||||
PID_FILE=/var/run/gitbucket.pid
|
PID_FILE=/var/run/gitbucket.pid
|
||||||
|
|
||||||
# Default return value
|
RED='\033[1m\E[37;41m'
|
||||||
RETVAL=0
|
GREEN='\033[1m\E[37;42m'
|
||||||
|
OFF='\E[0m'
|
||||||
|
|
||||||
|
if [ -z "$(which success)" ]; then
|
||||||
|
function success {
|
||||||
|
printf "%b\n" "$GREEN $* $OFF"
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
if [ -z "$(which failure)" ]; then
|
||||||
|
function failure {
|
||||||
|
printf "%b\n" "$RED $* $OFF"
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
|
RETVAL=0
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
echo -n $"Starting GitBucket server: "
|
echo -n $"Starting GitBucket server: "
|
||||||
|
|
||||||
# Compile statup parameters
|
START_OPTS=
|
||||||
if [ $GITBUCKET_PORT ]; then
|
if [ $GITBUCKET_PORT ]; then
|
||||||
START_OPTS="${START_OPTS} --port=${GITBUCKET_PORT}"
|
START_OPTS="${START_OPTS} --port=${GITBUCKET_PORT}"
|
||||||
fi
|
fi
|
||||||
@@ -40,17 +58,15 @@ start() {
|
|||||||
START_OPTS="${START_OPTS} --host=${GITBUCKET_HOST}"
|
START_OPTS="${START_OPTS} --host=${GITBUCKET_HOST}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Run the Java process
|
|
||||||
GITBUCKET_HOME="${GITBUCKET_HOME}" java $GITBUCKET_JVM_OPTS -jar $GITBUCKET_WAR_FILE $START_OPTS >>$LOG_FILE 2>&1 &
|
GITBUCKET_HOME="${GITBUCKET_HOME}" java $GITBUCKET_JVM_OPTS -jar $GITBUCKET_WAR_FILE $START_OPTS >>$LOG_FILE 2>&1 &
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
|
|
||||||
# Store PID of the Java process into a file
|
|
||||||
echo $! > $PID_FILE
|
echo $! > $PID_FILE
|
||||||
|
|
||||||
if [ $RETVAL -eq 0 ] ; then
|
if [ $RETVAL -eq 0 ] ; then
|
||||||
success "GitBucket startup"
|
success "Success"
|
||||||
else
|
else
|
||||||
failure "GitBucket startup"
|
failure "Exit code $RETVAL"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -82,7 +98,23 @@ restart() {
|
|||||||
start
|
start
|
||||||
}
|
}
|
||||||
|
|
||||||
|
## MacOS proxies for System V service hooks:
|
||||||
|
StartService() {
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
|
StopService() {
|
||||||
|
stop
|
||||||
|
}
|
||||||
|
|
||||||
|
RestartService() {
|
||||||
|
restart
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [ `isMac` ]; then
|
||||||
|
RunService "$1"
|
||||||
|
else
|
||||||
case "$1" in
|
case "$1" in
|
||||||
start)
|
start)
|
||||||
start
|
start
|
||||||
@@ -101,6 +133,6 @@ status)
|
|||||||
echo $"Usage: $0 [start|stop|restart|status]"
|
echo $"Usage: $0 [start|stop|restart|status]"
|
||||||
RETVAL=2
|
RETVAL=2
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
||||||
exit $RETVAL
|
exit $RETVAL
|
||||||
|
fi
|
||||||
|
|
||||||
69
contrib/install
Executable file
69
contrib/install
Executable file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Only tested on Ubuntu 14.04
|
||||||
|
|
||||||
|
# Uses information stored in GitBucket git repo on GitHub as defaults.
|
||||||
|
# Edit gitbucket.conf before running this
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
GITBUCKET_VERSION=2.1
|
||||||
|
|
||||||
|
if [ ! -f gitbucket.conf ]; then
|
||||||
|
echo "gitbucket.conf not found, aborting"
|
||||||
|
exit -3
|
||||||
|
fi
|
||||||
|
source gitbucket.conf
|
||||||
|
|
||||||
|
function createDir {
|
||||||
|
if [ ! -d "$1" ]; then
|
||||||
|
echo "Making $1 directory."
|
||||||
|
sudo mkdir -p "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$(which iptables)" ]; then
|
||||||
|
echo "Opening port $GITBUCKET_PORT in firewall."
|
||||||
|
sudo iptables -A INPUT -p tcp --dport $GITBUCKET_PORT -j ACCEPT
|
||||||
|
echo "Please use iptables-persistent:"
|
||||||
|
echo " sudo apt-get install iptables-persistent"
|
||||||
|
echo "After installed, you can save/reload iptables rules anytime:"
|
||||||
|
echo " sudo /etc/init.d/iptables-persistent save"
|
||||||
|
echo " sudo /etc/init.d/iptables-persistent reload"
|
||||||
|
fi
|
||||||
|
|
||||||
|
createDir "$GITBUCKET_HOME"
|
||||||
|
createDir "$GITBUCKET_WAR_DIR"
|
||||||
|
createDir "$GITBUCKET_DIR"
|
||||||
|
createDir "$GITBUCKET_LOG_DIR"
|
||||||
|
|
||||||
|
echo "Fetching GitBucket v$GITBUCKET_VERSION and saving as $GITBUCKET_WAR_FILE"
|
||||||
|
sudo wget -qO "$GITBUCKET_WAR_FILE" https://github.com/takezoe/gitbucket/releases/download/$GITBUCKET_VERSION/gitbucket.war
|
||||||
|
|
||||||
|
sudo rm -f "$GITBUCKET_LOG_DIR/run.log"
|
||||||
|
|
||||||
|
echo "Copying gitbucket.conf to $GITBUCKET_DIR"
|
||||||
|
sudo cp gitbucket.conf $GITBUCKET_DIR
|
||||||
|
if [ `isUbuntu` ] || [ `isRedHat` ]; then
|
||||||
|
sudo cp gitbucket.init "$GITBUCKET_SERVICE"
|
||||||
|
# Install gitbucket as a service that starts when system boots
|
||||||
|
sudo chown root:root $GITBUCKET_SERVICE
|
||||||
|
sudo chmod 755 $GITBUCKET_SERVICE
|
||||||
|
sudo update-rc.d "$(basename $GITBUCKET_SERVICE)" defaults 98 02
|
||||||
|
echo "Starting GitBucket service"
|
||||||
|
sudo $GITBUCKET_SERVICE start
|
||||||
|
elif [ `isMac` ]; then
|
||||||
|
sudo macosx/makePlist
|
||||||
|
echo "Starting GitBucket service"
|
||||||
|
sudo cp gitbucket.conf "$GITBUCKET_SERVICE"
|
||||||
|
sudo cp gitbucket.init "$GITBUCKET_SERVICE"
|
||||||
|
sudo chmod a+x "$GITBUCKET_SERVICE"
|
||||||
|
sudo "$GITBUCKET_SERVICE" start
|
||||||
|
else
|
||||||
|
echo "Don't know how to install this OS"
|
||||||
|
exit -2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
less "$GITBUCKET_LOG_DIR/run.log"
|
||||||
|
fi
|
||||||
14
contrib/macosx/gitbucket.plist → contrib/macosx/makePlist
Normal file → Executable file
14
contrib/macosx/gitbucket.plist → contrib/macosx/makePlist
Normal file → Executable file
@@ -1,3 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# From http://docstore.mik.ua/orelly/unix3/mac/ch02_02.htm
|
||||||
|
source gitbucket.conf
|
||||||
|
GITBUCKET_SERVICE_DIR=`dirname "$GITBUCKET_SERVICE"`
|
||||||
|
mkdir -p "$GITBUCKET_SERVICE_DIR"
|
||||||
|
cat << EOF > "$GITBUCKET_SERVICE_DIR/gitbucket.plist"
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
@@ -7,14 +14,15 @@
|
|||||||
<key>ProgramArguments</key>
|
<key>ProgramArguments</key>
|
||||||
<array>
|
<array>
|
||||||
<string>/usr/bin/java</string>
|
<string>/usr/bin/java</string>
|
||||||
<string>-Dmail.smtp.starttls.enable=true</string>
|
<string>$GITBUCKET_JVM_OPTS</string>
|
||||||
<string>-jar</string>
|
<string>-jar</string>
|
||||||
<string>gitbucket.war</string>
|
<string>gitbucket.war</string>
|
||||||
<string>--host=127.0.0.1</string>
|
<string>--host=$GITBUCKET_HOST</string>
|
||||||
<string>--port=8080</string>
|
<string>--port=$GITBUCKET_PORT</string>
|
||||||
<string>--https=true</string>
|
<string>--https=true</string>
|
||||||
</array>
|
</array>
|
||||||
<key>RunAtLoad</key>
|
<key>RunAtLoad</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
EOF
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# Bind host
|
|
||||||
#GITBUCKET_HOST=0.0.0.0
|
|
||||||
|
|
||||||
# Server port
|
|
||||||
#GITBUCKET_PORT=8080
|
|
||||||
|
|
||||||
# Data directory (GITBUCKET_HOME/gitbucket)
|
|
||||||
#GITBUCKET_HOME=/var/lib/gitbucket
|
|
||||||
|
|
||||||
# Path to the WAR file
|
|
||||||
#GITBUCKET_WAR_FILE=/usr/share/gitbucket/lib/gitbucket.war
|
|
||||||
|
|
||||||
# URL prefix for the GitBucket page (http://<host>:<port>/<prefix>/)
|
|
||||||
#GITBUCKET_PREFIX=
|
|
||||||
|
|
||||||
# Other Java option
|
|
||||||
#GITBUCKET_JVM_OPTS=
|
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
import org.eclipse.jetty.io.EndPoint;
|
|
||||||
import org.eclipse.jetty.server.Request;
|
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.server.nio.SelectChannelConnector;
|
import org.eclipse.jetty.server.nio.SelectChannelConnector;
|
||||||
import org.eclipse.jetty.webapp.WebAppContext;
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.File;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.ProtectionDomain;
|
import java.security.ProtectionDomain;
|
||||||
|
|
||||||
@@ -44,6 +42,14 @@ public class JettyLauncher {
|
|||||||
server.addConnector(connector);
|
server.addConnector(connector);
|
||||||
|
|
||||||
WebAppContext context = new WebAppContext();
|
WebAppContext context = new WebAppContext();
|
||||||
|
|
||||||
|
File tmpDir = new File(getGitBucketHome(), "tmp");
|
||||||
|
if(tmpDir.exists()){
|
||||||
|
deleteDirectory(tmpDir);
|
||||||
|
}
|
||||||
|
tmpDir.mkdirs();
|
||||||
|
context.setTempDirectory(tmpDir);
|
||||||
|
|
||||||
ProtectionDomain domain = JettyLauncher.class.getProtectionDomain();
|
ProtectionDomain domain = JettyLauncher.class.getProtectionDomain();
|
||||||
URL location = domain.getCodeSource().getLocation();
|
URL location = domain.getCodeSource().getLocation();
|
||||||
|
|
||||||
@@ -59,4 +65,27 @@ public class JettyLauncher {
|
|||||||
server.start();
|
server.start();
|
||||||
server.join();
|
server.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static File getGitBucketHome(){
|
||||||
|
String home = System.getProperty("gitbucket.home");
|
||||||
|
if(home != null && home.length() > 0){
|
||||||
|
return new File(home);
|
||||||
|
}
|
||||||
|
home = System.getenv("GITBUCKET_HOME");
|
||||||
|
if(home != null && home.length() > 0){
|
||||||
|
return new File(home);
|
||||||
|
}
|
||||||
|
return new File(System.getProperty("user.home"), ".gitbucket");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void deleteDirectory(File dir){
|
||||||
|
for(File file: dir.listFiles()){
|
||||||
|
if(file.isFile()){
|
||||||
|
file.delete();
|
||||||
|
} else if(file.isDirectory()){
|
||||||
|
deleteDirectory(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dir.delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -335,7 +335,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
|
|||||||
builder.finish()
|
builder.finish()
|
||||||
|
|
||||||
JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter),
|
JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter),
|
||||||
loginAccount.fullName, loginAccount.mailAddress, "Initial commit")
|
Constants.HEAD, loginAccount.fullName, loginAccount.mailAddress, "Initial commit")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -191,6 +191,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
|
val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))
|
||||||
|
val lastModifiedCommit = JGitUtil.getLastModifiedCommit(git, revCommit, path)
|
||||||
getPathObjectId(git, path, revCommit).map { objectId =>
|
getPathObjectId(git, path, revCommit).map { objectId =>
|
||||||
if(raw){
|
if(raw){
|
||||||
// Download
|
// Download
|
||||||
@@ -200,7 +201,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
repo.html.blob(id, repository, path.split("/").toList, JGitUtil.getContentInfo(git, path, objectId),
|
repo.html.blob(id, repository, path.split("/").toList, JGitUtil.getContentInfo(git, path, objectId),
|
||||||
new JGitUtil.CommitInfo(revCommit), hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
new JGitUtil.CommitInfo(lastModifiedCommit), hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
||||||
}
|
}
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
}
|
}
|
||||||
@@ -311,10 +312,10 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
repo.html.guide(repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
repo.html.guide(repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
||||||
} else {
|
} else {
|
||||||
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git =>
|
||||||
//val revisions = Seq(if(revstr.isEmpty) repository.repository.defaultBranch else revstr, repository.branchList.head)
|
|
||||||
// get specified commit
|
// get specified commit
|
||||||
JGitUtil.getDefaultBranch(git, repository, revstr).map { case (objectId, revision) =>
|
JGitUtil.getDefaultBranch(git, repository, revstr).map { case (objectId, revision) =>
|
||||||
defining(JGitUtil.getRevCommitFromId(git, objectId)) { revCommit =>
|
defining(JGitUtil.getRevCommitFromId(git, objectId)) { revCommit =>
|
||||||
|
val lastModifiedCommit = if(path == ".") revCommit else JGitUtil.getLastModifiedCommit(git, revCommit, path)
|
||||||
// get files
|
// get files
|
||||||
val files = JGitUtil.getFileList(git, revision, path)
|
val files = JGitUtil.getFileList(git, revision, path)
|
||||||
val parentPath = if (path == ".") Nil else path.split("/").toList
|
val parentPath = if (path == ".") Nil else path.split("/").toList
|
||||||
@@ -329,7 +330,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
repo.html.files(revision, repository,
|
repo.html.files(revision, repository,
|
||||||
if(path == ".") Nil else path.split("/").toList, // current path
|
if(path == ".") Nil else path.split("/").toList, // current path
|
||||||
new JGitUtil.CommitInfo(revCommit), // latest commit
|
new JGitUtil.CommitInfo(lastModifiedCommit), // last modified commit
|
||||||
files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
||||||
}
|
}
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
@@ -350,7 +351,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
val builder = DirCache.newInCore.builder()
|
val builder = DirCache.newInCore.builder()
|
||||||
val inserter = git.getRepository.newObjectInserter()
|
val inserter = git.getRepository.newObjectInserter()
|
||||||
val headName = s"refs/heads/${branch}"
|
val headName = s"refs/heads/${branch}"
|
||||||
val headTip = git.getRepository.resolve(s"refs/heads/${branch}")
|
val headTip = git.getRepository.resolve(headName)
|
||||||
|
|
||||||
JGitUtil.processTree(git, headTip){ (path, tree) =>
|
JGitUtil.processTree(git, headTip){ (path, tree) =>
|
||||||
if(!newPath.exists(_ == path) && !oldPath.exists(_ == path)){
|
if(!newPath.exists(_ == path) && !oldPath.exists(_ == path)){
|
||||||
@@ -365,7 +366,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
builder.finish()
|
builder.finish()
|
||||||
|
|
||||||
val commitId = JGitUtil.createNewCommit(git, inserter, headTip, builder.getDirCache.writeTree(inserter),
|
val commitId = JGitUtil.createNewCommit(git, inserter, headTip, builder.getDirCache.writeTree(inserter),
|
||||||
loginAccount.fullName, loginAccount.mailAddress, message)
|
headName, loginAccount.fullName, loginAccount.mailAddress, message)
|
||||||
|
|
||||||
inserter.flush()
|
inserter.flush()
|
||||||
inserter.release()
|
inserter.release()
|
||||||
|
|||||||
@@ -182,7 +182,8 @@ trait WikiService {
|
|||||||
}
|
}
|
||||||
builder.finish()
|
builder.finish()
|
||||||
|
|
||||||
JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer.fullName, committer.mailAddress,
|
JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter),
|
||||||
|
Constants.HEAD, committer.fullName, committer.mailAddress,
|
||||||
pageName match {
|
pageName match {
|
||||||
case Some(x) => s"Revert ${from} ... ${to} on ${x}"
|
case Some(x) => s"Revert ${from} ... ${to} on ${x}"
|
||||||
case None => s"Revert ${from} ... ${to}"
|
case None => s"Revert ${from} ... ${to}"
|
||||||
@@ -229,7 +230,8 @@ trait WikiService {
|
|||||||
if(created || updated || removed){
|
if(created || updated || removed){
|
||||||
builder.add(JGitUtil.createDirCacheEntry(newPageName + ".md", FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, content.getBytes("UTF-8"))))
|
builder.add(JGitUtil.createDirCacheEntry(newPageName + ".md", FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, content.getBytes("UTF-8"))))
|
||||||
builder.finish()
|
builder.finish()
|
||||||
val newHeadId = JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer.fullName, committer.mailAddress,
|
val newHeadId = JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter),
|
||||||
|
Constants.HEAD, committer.fullName, committer.mailAddress,
|
||||||
if(message.trim.length == 0) {
|
if(message.trim.length == 0) {
|
||||||
if(removed){
|
if(removed){
|
||||||
s"Rename ${currentPageName} to ${newPageName}"
|
s"Rename ${currentPageName} to ${newPageName}"
|
||||||
@@ -269,7 +271,8 @@ trait WikiService {
|
|||||||
}
|
}
|
||||||
if(removed){
|
if(removed){
|
||||||
builder.finish()
|
builder.finish()
|
||||||
JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter), committer, mailAddress, message)
|
JGitUtil.createNewCommit(git, inserter, headId, builder.getDirCache.writeTree(inserter),
|
||||||
|
Constants.HEAD, committer, mailAddress, message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -504,7 +504,7 @@ object JGitUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def createNewCommit(git: Git, inserter: ObjectInserter, headId: AnyObjectId, treeId: AnyObjectId,
|
def createNewCommit(git: Git, inserter: ObjectInserter, headId: AnyObjectId, treeId: AnyObjectId,
|
||||||
fullName: String, mailAddress: String, message: String): ObjectId = {
|
ref: String, fullName: String, mailAddress: String, message: String): ObjectId = {
|
||||||
val newCommit = new CommitBuilder()
|
val newCommit = new CommitBuilder()
|
||||||
newCommit.setCommitter(new PersonIdent(fullName, mailAddress))
|
newCommit.setCommitter(new PersonIdent(fullName, mailAddress))
|
||||||
newCommit.setAuthor(new PersonIdent(fullName, mailAddress))
|
newCommit.setAuthor(new PersonIdent(fullName, mailAddress))
|
||||||
@@ -518,7 +518,7 @@ object JGitUtil {
|
|||||||
inserter.flush()
|
inserter.flush()
|
||||||
inserter.release()
|
inserter.release()
|
||||||
|
|
||||||
val refUpdate = git.getRepository.updateRef(Constants.HEAD)
|
val refUpdate = git.getRepository.updateRef(ref)
|
||||||
refUpdate.setNewObjectId(newHeadId)
|
refUpdate.setNewObjectId(newHeadId)
|
||||||
refUpdate.update()
|
refUpdate.update()
|
||||||
|
|
||||||
@@ -652,4 +652,15 @@ object JGitUtil {
|
|||||||
}.head.id
|
}.head.id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the last modified commit of specified path
|
||||||
|
* @param git the Git object
|
||||||
|
* @param startCommit the search base commit id
|
||||||
|
* @param path the path of target file or directory
|
||||||
|
* @return the last modified commit of specified path
|
||||||
|
*/
|
||||||
|
def getLastModifiedCommit(git: Git, startCommit: RevCommit, path: String): RevCommit = {
|
||||||
|
return git.log.add(startCommit).addPath(path).setMaxCount(1).call.iterator.next
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
package view
|
package view
|
||||||
import java.util.Date
|
import java.util.{Date, TimeZone}
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import play.twirl.api.Html
|
import play.twirl.api.Html
|
||||||
import util.StringUtil
|
import util.StringUtil
|
||||||
@@ -18,7 +18,11 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
|
|||||||
/**
|
/**
|
||||||
* Format java.util.Date to "yyyy-MM-dd'T'hh:mm:ss'Z'".
|
* Format java.util.Date to "yyyy-MM-dd'T'hh:mm:ss'Z'".
|
||||||
*/
|
*/
|
||||||
def datetimeRFC3339(date: Date): String = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'").format(date).replaceAll("(\\d\\d)(\\d\\d)$","$1:$2")
|
def datetimeRFC3339(date: Date): String = {
|
||||||
|
val sf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
|
||||||
|
sf.setTimeZone(TimeZone.getTimeZone("UTC"))
|
||||||
|
sf.format(date)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format java.util.Date to "yyyy-MM-dd".
|
* Format java.util.Date to "yyyy-MM-dd".
|
||||||
|
|||||||
@@ -6,6 +6,24 @@
|
|||||||
<script>
|
<script>
|
||||||
// copy to clipboard
|
// copy to clipboard
|
||||||
(function() {
|
(function() {
|
||||||
|
// Check flash availablibity
|
||||||
|
var flashAvailable = false;
|
||||||
|
try {
|
||||||
|
var flashObject = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
|
||||||
|
if(flashObject) flashAvailable = true;
|
||||||
|
} catch (e) {
|
||||||
|
if (navigator.mimeTypes
|
||||||
|
&& navigator.mimeTypes['application/x-shockwave-flash'] != undefined
|
||||||
|
&& navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {
|
||||||
|
flashAvailable = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if flash is not available, remove the copy button.
|
||||||
|
if(!flashAvailable) {
|
||||||
|
$('#@id').remove();
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Find ZeroClipboard.swf file URI from ZeroClipboard JavaScript file path.
|
// Find ZeroClipboard.swf file URI from ZeroClipboard JavaScript file path.
|
||||||
// NOTE(tanacasino) I think this way is wrong... but i don't know correct way.
|
// NOTE(tanacasino) I think this way is wrong... but i don't know correct way.
|
||||||
var moviePath = (function() {
|
var moviePath = (function() {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<th width="20%">Commit</th>
|
<th width="20%">Commit</th>
|
||||||
<th width="20%">Download</th>
|
<th width="20%">Download</th>
|
||||||
</tr>
|
</tr>
|
||||||
@repository.tags.map { tag =>
|
@repository.tags.reverse.map { tag =>
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="@url(repository)/tree/@encodeRefName(tag.name)">@tag.name</a></td>
|
<td><a href="@url(repository)/tree/@encodeRefName(tag.name)">@tag.name</a></td>
|
||||||
<td>@datetime(tag.time)</td>
|
<td>@datetime(tag.time)</td>
|
||||||
|
|||||||
@@ -36,9 +36,6 @@ h6 {
|
|||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h7 {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ======================================================================== */
|
/* ======================================================================== */
|
||||||
/* Global Header */
|
/* Global Header */
|
||||||
@@ -596,6 +593,7 @@ pre.blob {
|
|||||||
border: none;
|
border: none;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#readme {
|
#readme {
|
||||||
@@ -841,6 +839,8 @@ div.author-info div.committer {
|
|||||||
/* Diff */
|
/* Diff */
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
table.inlinediff {
|
table.inlinediff {
|
||||||
|
font-size: 12px;
|
||||||
|
font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user