From 41542b4b1b48fa93caabc53617b407dc53431612 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sun, 14 Apr 2013 05:34:50 -0400
Subject: [PATCH] Fix build error when retrieving Moxie jar
---
src/main/java/com/gitblit/GitBlit.java | 169 ++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 109 insertions(+), 60 deletions(-)
diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index 7c6a535..4e34db4 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/src/main/java/com/gitblit/GitBlit.java
@@ -54,6 +54,8 @@
import javax.mail.Message;
import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMultipart;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
@@ -88,6 +90,7 @@
import com.gitblit.fanout.FanoutNioService;
import com.gitblit.fanout.FanoutService;
import com.gitblit.fanout.FanoutSocketService;
+import com.gitblit.git.GitDaemon;
import com.gitblit.models.FederationModel;
import com.gitblit.models.FederationProposal;
import com.gitblit.models.FederationSet;
@@ -188,6 +191,8 @@
private FanoutService fanoutService;
+ private GitDaemon gitDaemon;
+
public GitBlit() {
if (gitblit == null) {
// set the static singleton reference
@@ -452,12 +457,13 @@
* advertise alternative urls for Git client repository access.
*
* @param repositoryName
+ * @param userName
* @return list of non-gitblit clone urls
*/
- public List<String> getOtherCloneUrls(String repositoryName) {
+ public List<String> getOtherCloneUrls(String repositoryName, String username) {
List<String> cloneUrls = new ArrayList<String>();
for (String url : settings.getStrings(Keys.web.otherUrls)) {
- cloneUrls.add(MessageFormat.format(url, repositoryName));
+ cloneUrls.add(MessageFormat.format(url, repositoryName, username));
}
return cloneUrls;
}
@@ -630,15 +636,18 @@
// try to authenticate by servlet container principal
Principal principal = httpRequest.getUserPrincipal();
if (principal != null) {
- UserModel user = getUserModel(principal.getName());
- if (user != null) {
- flagWicketSession(AuthenticationType.CONTAINER);
- logger.debug(MessageFormat.format("{0} authenticated by servlet container principal from {1}",
- user.username, httpRequest.getRemoteAddr()));
- return user;
- } else {
- logger.warn(MessageFormat.format("Failed to find UserModel for {0}, attempted servlet container authentication from {1}",
- principal.getName(), httpRequest.getRemoteAddr()));
+ String username = principal.getName();
+ if (StringUtils.isEmpty(username)) {
+ UserModel user = getUserModel(username);
+ if (user != null) {
+ flagWicketSession(AuthenticationType.CONTAINER);
+ logger.debug(MessageFormat.format("{0} authenticated by servlet container principal from {1}",
+ user.username, httpRequest.getRemoteAddr()));
+ return user;
+ } else {
+ logger.warn(MessageFormat.format("Failed to find UserModel for {0}, attempted servlet container authentication from {1}",
+ principal.getName(), httpRequest.getRemoteAddr()));
+ }
}
}
@@ -1373,7 +1382,7 @@
FileBasedConfig config = (FileBasedConfig) getRepositoryConfig(r);
if (config.isOutdated()) {
// reload model
- logger.info(MessageFormat.format("Config for \"{0}\" has changed. Reloading model and updating cache.", repositoryName));
+ logger.debug(MessageFormat.format("Config for \"{0}\" has changed. Reloading model and updating cache.", repositoryName));
model = loadRepositoryModel(model.name);
removeFromCachedRepositoryList(model.name);
addToCachedRepositoryList(model);
@@ -1656,6 +1665,11 @@
} else {
model.name = com.gitblit.utils.FileUtils.getRelativePath(basePath, r.getDirectory().getParentFile());
}
+ if (StringUtils.isEmpty(model.name)) {
+ // Repository is NOT located relative to the base folder because it
+ // is symlinked. Use the provided repository name.
+ model.name = repositoryName;
+ }
model.hasCommits = JGitUtils.hasCommits(r);
model.lastChange = JGitUtils.getLastChange(r);
model.projectPath = StringUtils.getFirstPathElement(repositoryName);
@@ -1668,6 +1682,8 @@
model.addOwners(ArrayUtils.fromString(getConfig(config, "owner", "")));
model.useTickets = getConfig(config, "useTickets", false);
model.useDocs = getConfig(config, "useDocs", false);
+ model.useIncrementalPushTags = getConfig(config, "useIncrementalPushTags", false);
+ model.incrementalPushTagPrefix = getConfig(config, "incrementalPushTagPrefix", null);
model.allowForks = getConfig(config, "allowForks", true);
model.accessRestriction = AccessRestrictionType.fromName(getConfig(config,
"accessRestriction", settings.getString(Keys.git.defaultAccessRestriction, null)));
@@ -2189,6 +2205,13 @@
config.setString(Constants.CONFIG_GITBLIT, null, "owner", ArrayUtils.toString(repository.owners));
config.setBoolean(Constants.CONFIG_GITBLIT, null, "useTickets", repository.useTickets);
config.setBoolean(Constants.CONFIG_GITBLIT, null, "useDocs", repository.useDocs);
+ config.setBoolean(Constants.CONFIG_GITBLIT, null, "useIncrementalPushTags", repository.useIncrementalPushTags);
+ if (StringUtils.isEmpty(repository.incrementalPushTagPrefix) ||
+ repository.incrementalPushTagPrefix.equals(settings.getString(Keys.git.defaultIncrementalPushTagPrefix, "r"))) {
+ config.unset(Constants.CONFIG_GITBLIT, null, "incrementalPushTagPrefix");
+ } else {
+ config.setString(Constants.CONFIG_GITBLIT, null, "incrementalPushTagPrefix", repository.incrementalPushTagPrefix);
+ }
config.setBoolean(Constants.CONFIG_GITBLIT, null, "allowForks", repository.allowForks);
config.setString(Constants.CONFIG_GITBLIT, null, "accessRestriction", repository.accessRestriction.name());
config.setString(Constants.CONFIG_GITBLIT, null, "authorizationControl", repository.authorizationControl.name());
@@ -2575,17 +2598,8 @@
}
// send an email, if possible
- try {
- Message message = mailExecutor.createMessageForAdministrators();
- if (message != null) {
- message.setSubject("Federation proposal from " + proposal.url);
- message.setText("Please review the proposal @ " + gitblitUrl + "/proposal/"
- + proposal.token);
- mailExecutor.queue(message);
- }
- } catch (Throwable t) {
- logger.error("Failed to notify administrators of proposal", t);
- }
+ sendMailToAdministrators("Federation proposal from " + proposal.url,
+ "Please review the proposal @ " + gitblitUrl + "/proposal/" + proposal.token);
return true;
}
@@ -2872,16 +2886,8 @@
* @param message
*/
public void sendMailToAdministrators(String subject, String message) {
- try {
- Message mail = mailExecutor.createMessageForAdministrators();
- if (mail != null) {
- mail.setSubject(subject);
- mail.setText(message);
- mailExecutor.queue(mail);
- }
- } catch (MessagingException e) {
- logger.error("Messaging error", e);
- }
+ List<String> toAddresses = settings.getStrings(Keys.mail.adminAddresses);
+ sendMail(subject, message, toAddresses);
}
/**
@@ -2911,7 +2917,16 @@
Message mail = mailExecutor.createMessage(toAddresses);
if (mail != null) {
mail.setSubject(subject);
- mail.setText(message);
+
+ MimeBodyPart messagePart = new MimeBodyPart();
+ messagePart.setText(message, "utf-8");
+ messagePart.setHeader("Content-Type", "text/plain; charset=\"utf-8\"");
+ messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
+
+ MimeMultipart multiPart = new MimeMultipart();
+ multiPart.addBodyPart(messagePart);
+ mail.setContent(multiPart);
+
mailExecutor.queue(mail);
}
} catch (MessagingException e) {
@@ -2946,7 +2961,16 @@
Message mail = mailExecutor.createMessage(toAddresses);
if (mail != null) {
mail.setSubject(subject);
- mail.setContent(message, "text/html");
+
+ MimeBodyPart messagePart = new MimeBodyPart();
+ messagePart.setText(message, "utf-8");
+ messagePart.setHeader("Content-Type", "text/html; charset=\"utf-8\"");
+ messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
+
+ MimeMultipart multiPart = new MimeMultipart();
+ multiPart.addBodyPart(messagePart);
+ mail.setContent(multiPart);
+
mailExecutor.queue(mail);
}
} catch (MessagingException e) {
@@ -2979,7 +3003,6 @@
* Parse the properties file and aggregate all the comments by the setting
* key. A setting model tracks the current value, the default value, the
* description of the setting and and directives about the setting.
- * @param referencePropertiesInputStream
*
* @return Map<String, SettingModel>
*/
@@ -2993,7 +3016,7 @@
// Read bundled Gitblit properties to extract setting descriptions.
// This copy is pristine and only used for populating the setting
// models map.
- InputStream is = referencePropertiesInputStream;
+ InputStream is = referencePropertiesInputStream;
BufferedReader propertiesReader = new BufferedReader(new InputStreamReader(is));
StringBuilder description = new StringBuilder();
SettingModel setting = new SettingModel();
@@ -3098,18 +3121,34 @@
projectConfigs = new FileBasedConfig(getFileOrFolder(Keys.web.projectsFile, "${baseFolder}/projects.conf"), FS.detect());
getProjectConfigs();
- // schedule mail engine
+ configureMailExecutor();
+ configureLuceneIndexing();
+ configureGarbageCollector();
+ if (startFederation) {
+ configureFederation();
+ }
+ configureJGit();
+ configureFanout();
+ configureGitDaemon();
+
+ ContainerUtils.CVE_2007_0450.test();
+ }
+
+ protected void configureMailExecutor() {
if (mailExecutor.isReady()) {
logger.info("Mail executor is scheduled to process the message queue every 2 minutes.");
scheduledExecutor.scheduleAtFixedRate(mailExecutor, 1, 2, TimeUnit.MINUTES);
} else {
logger.warn("Mail server is not properly configured. Mail services disabled.");
}
-
- // schedule lucene engine
- enableLuceneIndexing();
-
-
+ }
+
+ protected void configureLuceneIndexing() {
+ scheduledExecutor.scheduleAtFixedRate(luceneExecutor, 1, 2, TimeUnit.MINUTES);
+ logger.info("Lucene executor is scheduled to process indexed branches every 2 minutes.");
+ }
+
+ protected void configureGarbageCollector() {
// schedule gc engine
if (gcExecutor.isReady()) {
logger.info("GC executor is scheduled to scan repositories every 24 hours.");
@@ -3133,21 +3172,19 @@
logger.info(MessageFormat.format("Next scheculed GC scan is in {0}", when));
scheduledExecutor.scheduleAtFixedRate(gcExecutor, delay, 60*24, TimeUnit.MINUTES);
}
-
- if (startFederation) {
- configureFederation();
- }
-
+ }
+
+ protected void configureJGit() {
// Configure JGit
WindowCacheConfig cfg = new WindowCacheConfig();
-
+
cfg.setPackedGitWindowSize(settings.getFilesize(Keys.git.packedGitWindowSize, cfg.getPackedGitWindowSize()));
cfg.setPackedGitLimit(settings.getFilesize(Keys.git.packedGitLimit, cfg.getPackedGitLimit()));
cfg.setDeltaBaseCacheLimit(settings.getFilesize(Keys.git.deltaBaseCacheLimit, cfg.getDeltaBaseCacheLimit()));
cfg.setPackedGitOpenFiles(settings.getFilesize(Keys.git.packedGitOpenFiles, cfg.getPackedGitOpenFiles()));
cfg.setStreamFileThreshold(settings.getFilesize(Keys.git.streamFileThreshold, cfg.getStreamFileThreshold()));
cfg.setPackedGitMMAP(settings.getBoolean(Keys.git.packedGitMmap, cfg.isPackedGitMMAP()));
-
+
try {
WindowCache.reconfigure(cfg);
logger.debug(MessageFormat.format("{0} = {1,number,0}", Keys.git.packedGitWindowSize, cfg.getPackedGitWindowSize()));
@@ -3159,16 +3196,16 @@
} catch (IllegalArgumentException e) {
logger.error("Failed to configure JGit parameters!", e);
}
-
- ContainerUtils.CVE_2007_0450.test();
-
+ }
+
+ protected void configureFanout() {
// startup Fanout PubSub service
if (settings.getInteger(Keys.fanout.port, 0) > 0) {
String bindInterface = settings.getString(Keys.fanout.bindInterface, null);
int port = settings.getInteger(Keys.fanout.port, FanoutService.DEFAULT_PORT);
boolean useNio = settings.getBoolean(Keys.fanout.useNio, true);
int limit = settings.getInteger(Keys.fanout.connectionLimit, 0);
-
+
if (useNio) {
if (StringUtils.isEmpty(bindInterface)) {
fanoutService = new FanoutNioService(port);
@@ -3182,16 +3219,25 @@
fanoutService = new FanoutSocketService(bindInterface, port);
}
}
-
+
fanoutService.setConcurrentConnectionLimit(limit);
fanoutService.setAllowAllChannelAnnouncements(false);
fanoutService.start();
}
}
- protected void enableLuceneIndexing() {
- scheduledExecutor.scheduleAtFixedRate(luceneExecutor, 1, 2, TimeUnit.MINUTES);
- logger.info("Lucene executor is scheduled to process indexed branches every 2 minutes.");
+ protected void configureGitDaemon() {
+ String bindInterface = settings.getString(Keys.git.daemonBindInterface, "localhost");
+ int port = settings.getInteger(Keys.git.daemonPort, GitDaemon.DEFAULT_PORT);
+ if (port > 0) {
+ try {
+ gitDaemon = new GitDaemon(bindInterface, port, getRepositoriesFolder());
+ gitDaemon.start();
+ logger.info(MessageFormat.format("Git daemon is listening on {0}:{1,number,0}", bindInterface, port));
+ } catch (IOException e) {
+ logger.error(MessageFormat.format("Failed to start Git daemon on {0}:{1,number.0}", bindInterface, port), e);
+ }
+ }
}
protected final Logger getLogger() {
@@ -3220,8 +3266,8 @@
* @see ServletContextListener.contextInitialize(ServletContextEvent)
*/
@Override
- public void contextInitialized(ServletContextEvent contextEvent) {
- contextInitialized(contextEvent, contextEvent.getServletContext().getResourceAsStream("/WEB-INF/reference.properties"));
+ public void contextInitialized(ServletContextEvent contextEvent) {
+ contextInitialized(contextEvent, getClass().getResourceAsStream("/reference.properties"));
}
public void contextInitialized(ServletContextEvent contextEvent, InputStream referencePropertiesInputStream) {
@@ -3306,6 +3352,9 @@
if (fanoutService != null) {
fanoutService.stop();
}
+ if (gitDaemon != null) {
+ gitDaemon.stop();
+ }
}
/**
--
Gitblit v1.9.1