| | |
| | | private final ObjectCache<String> projectRepositoriesMarkdownCache = new ObjectCache<String>();
|
| | |
|
| | | private ServletContext servletContext;
|
| | | |
| | | private File baseFolder;
|
| | |
|
| | | private File repositoriesFolder;
|
| | |
|
| | |
| | | * @return the file
|
| | | */
|
| | | public static File getFileOrFolder(String fileOrFolder) {
|
| | | String openShift = System.getenv("OPENSHIFT_DATA_DIR");
|
| | | if (!StringUtils.isEmpty(openShift)) {
|
| | | // running on RedHat OpenShift
|
| | | return new File(openShift, fileOrFolder);
|
| | | }
|
| | | return new File(fileOrFolder);
|
| | | return com.gitblit.utils.FileUtils.resolveParameter(Constants.baseFolder$,
|
| | | self().baseFolder, fileOrFolder);
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | * @return the repositories folder path
|
| | | */
|
| | | public static File getRepositoriesFolder() {
|
| | | return getFileOrFolder(Keys.git.repositoriesFolder, "git");
|
| | | return getFileOrFolder(Keys.git.repositoriesFolder, "${baseFolder}/git");
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | * @return the proposals folder path
|
| | | */
|
| | | public static File getProposalsFolder() {
|
| | | return getFileOrFolder(Keys.federation.proposalsFolder, "proposals");
|
| | | return getFileOrFolder(Keys.federation.proposalsFolder, "${baseFolder}/proposals");
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | * @return the Groovy scripts folder path
|
| | | */
|
| | | public static File getGroovyScriptsFolder() {
|
| | | return getFileOrFolder(Keys.groovy.scriptsFolder, "groovy");
|
| | | return getFileOrFolder(Keys.groovy.scriptsFolder, "${baseFolder}/groovy");
|
| | | }
|
| | |
|
| | | |
| | | /**
|
| | | * Updates the list of server settings.
|
| | | *
|
| | |
| | | for (RepositoryModel model : getRepositoryModels(user)) {
|
| | | if (model.isUsersPersonalRepository(username)) {
|
| | | // personal repository
|
| | | model.owner = user.username;
|
| | | model.addOwner(user.username);
|
| | | String oldRepositoryName = model.name;
|
| | | model.name = "~" + user.username + model.name.substring(model.projectPath.length());
|
| | | model.projectPath = "~" + user.username;
|
| | | updateRepositoryModel(oldRepositoryName, model, false);
|
| | | } else if (model.isOwner(username)) {
|
| | | // common/shared repo
|
| | | model.owner = user.username;
|
| | | model.addOwner(user.username);
|
| | | updateRepositoryModel(model.name, model, false);
|
| | | }
|
| | | }
|
| | |
| | | }
|
| | | RepositoryModel model = new RepositoryModel();
|
| | | model.isBare = r.isBare();
|
| | | File basePath = getFileOrFolder(Keys.git.repositoriesFolder, "git");
|
| | | File basePath = getFileOrFolder(Keys.git.repositoriesFolder, "${baseFolder}/git");
|
| | | if (model.isBare) {
|
| | | model.name = com.gitblit.utils.FileUtils.getRelativePath(basePath, r.getDirectory());
|
| | | } else {
|
| | |
| | |
|
| | | if (config != null) {
|
| | | model.description = getConfig(config, "description", "");
|
| | | model.owner = getConfig(config, "owner", "");
|
| | | model.addOwners(ArrayUtils.fromString(getConfig(config, "owner", "")));
|
| | | model.useTickets = getConfig(config, "useTickets", false);
|
| | | model.useDocs = getConfig(config, "useDocs", false);
|
| | | model.allowForks = getConfig(config, "allowForks", true);
|
| | |
| | | }
|
| | | model.HEAD = JGitUtils.getHEADRef(r);
|
| | | model.availableRefs = JGitUtils.getAvailableHeadTargets(r);
|
| | | model.sparkleshareId = JGitUtils.getSparkleshareId(r);
|
| | | r.close();
|
| | |
|
| | | if (model.origin != null && model.origin.startsWith("file://")) {
|
| | |
| | |
|
| | | private ForkModel getForkModelFromCache(String repository) {
|
| | | RepositoryModel model = repositoryListCache.get(repository.toLowerCase());
|
| | | if (model == null) {
|
| | | return null;
|
| | | }
|
| | | ForkModel fork = new ForkModel(model);
|
| | | if (!ArrayUtils.isEmpty(model.forks)) {
|
| | | for (String aFork : model.forks) {
|
| | | ForkModel fm = getForkModelFromCache(aFork);
|
| | | fork.forks.add(fm);
|
| | | if (fm != null) {
|
| | | fork.forks.add(fm);
|
| | | }
|
| | | }
|
| | | }
|
| | | return fork;
|
| | |
| | |
|
| | | private ForkModel getForkModel(String repository) {
|
| | | RepositoryModel model = getRepositoryModel(repository.toLowerCase());
|
| | | if (model == null) {
|
| | | return null;
|
| | | }
|
| | | ForkModel fork = new ForkModel(model);
|
| | | if (!ArrayUtils.isEmpty(model.forks)) {
|
| | | for (String aFork : model.forks) {
|
| | | ForkModel fm = getForkModel(aFork);
|
| | | fork.forks.add(fm);
|
| | | if (fm != null) {
|
| | | fork.forks.add(fm);
|
| | | }
|
| | | }
|
| | | }
|
| | | return fork;
|
| | |
| | | public void updateConfiguration(Repository r, RepositoryModel repository) {
|
| | | StoredConfig config = r.getConfig();
|
| | | config.setString(Constants.CONFIG_GITBLIT, null, "description", repository.description);
|
| | | config.setString(Constants.CONFIG_GITBLIT, null, "owner", repository.owner);
|
| | | 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, "allowForks", repository.allowForks);
|
| | |
| | | *
|
| | | * @param settings
|
| | | */
|
| | | public void configureContext(IStoredSettings settings, boolean startFederation) {
|
| | | logger.info("Reading configuration from " + settings.toString());
|
| | | public void configureContext(IStoredSettings settings, File folder, boolean startFederation) {
|
| | | this.settings = settings;
|
| | | this.baseFolder = folder;
|
| | |
|
| | | repositoriesFolder = getRepositoriesFolder();
|
| | | logger.info("Git repositories folder " + repositoriesFolder.getAbsolutePath());
|
| | |
|
| | | logger.info("Gitblit base folder = " + folder.getAbsolutePath());
|
| | | logger.info("Git repositories folder = " + repositoriesFolder.getAbsolutePath());
|
| | | logger.info("Gitblit settings = " + settings.toString());
|
| | |
|
| | | // prepare service executors
|
| | | mailExecutor = new MailExecutor(settings);
|
| | |
| | | serverStatus = new ServerStatus(isGO());
|
| | |
|
| | | if (this.userService == null) {
|
| | | String realm = settings.getString(Keys.realm.userService, "users.properties");
|
| | | String realm = settings.getString(Keys.realm.userService, "${baseFolder}/users.properties");
|
| | | IUserService loginService = null;
|
| | | try {
|
| | | // check to see if this "file" is a login service class
|
| | |
| | | }
|
| | |
|
| | | // load and cache the project metadata
|
| | | projectConfigs = new FileBasedConfig(getFileOrFolder(Keys.web.projectsFile, "projects.conf"), FS.detect());
|
| | | projectConfigs = new FileBasedConfig(getFileOrFolder(Keys.web.projectsFile, "${baseFolder}/projects.conf"), FS.detect());
|
| | | getProjectConfigs();
|
| | |
|
| | | // schedule mail engine
|
| | |
| | | }
|
| | |
|
| | | // schedule lucene engine
|
| | | logger.info("Lucene executor is scheduled to process indexed branches every 2 minutes.");
|
| | | scheduledExecutor.scheduleAtFixedRate(luceneExecutor, 1, 2, TimeUnit.MINUTES);
|
| | | enableLuceneIndexing();
|
| | |
|
| | |
|
| | | // schedule gc engine
|
| | | if (gcExecutor.isReady()) {
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | protected void enableLuceneIndexing() {
|
| | | scheduledExecutor.scheduleAtFixedRate(luceneExecutor, 1, 2, TimeUnit.MINUTES);
|
| | | logger.info("Lucene executor is scheduled to process indexed branches every 2 minutes.");
|
| | | }
|
| | | |
| | | protected final Logger getLogger() {
|
| | | return logger;
|
| | | }
|
| | | |
| | | protected final ScheduledExecutorService getScheduledExecutor() {
|
| | | return scheduledExecutor;
|
| | | }
|
| | |
|
| | | protected final LuceneExecutor getLuceneExecutor() {
|
| | | return luceneExecutor;
|
| | | }
|
| | | |
| | | private void logTimezone(String type, TimeZone zone) {
|
| | | SimpleDateFormat df = new SimpleDateFormat("z Z");
|
| | | df.setTimeZone(zone);
|
| | |
| | | public void contextInitialized(ServletContextEvent contextEvent, InputStream referencePropertiesInputStream) {
|
| | | servletContext = contextEvent.getServletContext();
|
| | | if (settings == null) {
|
| | | // Gitblit WAR is running in a servlet container
|
| | | // Gitblit is running in a servlet container
|
| | | ServletContext context = contextEvent.getServletContext();
|
| | | WebXmlSettings webxmlSettings = new WebXmlSettings(context);
|
| | |
|
| | | // gitblit.properties file located within the webapp
|
| | | String webProps = context.getRealPath("/WEB-INF/gitblit.properties");
|
| | | if (!StringUtils.isEmpty(webProps)) {
|
| | | File overrideFile = new File(webProps);
|
| | | webxmlSettings.applyOverrides(overrideFile);
|
| | | }
|
| | | File contextFolder = new File(context.getRealPath("/"));
|
| | | String openShift = System.getenv("OPENSHIFT_DATA_DIR");
|
| | |
|
| | | // gitblit.properties file located outside the deployed war
|
| | | // folder lie, for example, on RedHat OpenShift.
|
| | | File overrideFile = getFileOrFolder("gitblit.properties");
|
| | | if (!overrideFile.getPath().equals("gitblit.properties")) {
|
| | | webxmlSettings.applyOverrides(overrideFile);
|
| | | }
|
| | | |
| | | configureContext(webxmlSettings, true);
|
| | | if (!StringUtils.isEmpty(openShift)) {
|
| | | // Gitblit is running in OpenShift/JBoss
|
| | | File base = new File(openShift);
|
| | |
|
| | | // Copy the included scripts to the configured groovy folder
|
| | | File localScripts = getFileOrFolder(Keys.groovy.scriptsFolder, "groovy");
|
| | | if (!localScripts.exists()) {
|
| | | File includedScripts = new File(context.getRealPath("/WEB-INF/groovy"));
|
| | | if (!includedScripts.equals(localScripts)) {
|
| | | try {
|
| | | com.gitblit.utils.FileUtils.copy(localScripts, includedScripts.listFiles());
|
| | | } catch (IOException e) {
|
| | | logger.error(MessageFormat.format(
|
| | | "Failed to copy included Groovy scripts from {0} to {1}",
|
| | | includedScripts, localScripts));
|
| | | // gitblit.properties setting overrides
|
| | | File overrideFile = new File(base, "gitblit.properties");
|
| | | webxmlSettings.applyOverrides(overrideFile);
|
| | | |
| | | // Copy the included scripts to the configured groovy folder
|
| | | File localScripts = new File(base, webxmlSettings.getString(Keys.groovy.scriptsFolder, "groovy"));
|
| | | if (!localScripts.exists()) {
|
| | | File warScripts = new File(contextFolder, "/WEB-INF/data/groovy");
|
| | | if (!warScripts.equals(localScripts)) {
|
| | | try {
|
| | | com.gitblit.utils.FileUtils.copy(localScripts, warScripts.listFiles());
|
| | | } catch (IOException e) {
|
| | | logger.error(MessageFormat.format(
|
| | | "Failed to copy included Groovy scripts from {0} to {1}",
|
| | | warScripts, localScripts));
|
| | | }
|
| | | }
|
| | | }
|
| | | |
| | | // configure context using the web.xml
|
| | | configureContext(webxmlSettings, base, true);
|
| | | } else {
|
| | | // Gitblit is running in a standard servlet container
|
| | | logger.info("WAR contextFolder is " + contextFolder.getAbsolutePath());
|
| | | |
| | | String path = webxmlSettings.getString(Constants.baseFolder, Constants.contextFolder$ + "/WEB-INF/data");
|
| | | File base = com.gitblit.utils.FileUtils.resolveParameter(Constants.contextFolder$, contextFolder, path);
|
| | | base.mkdirs();
|
| | | |
| | | // try to copy the data folder contents to the baseFolder
|
| | | File localSettings = new File(base, "gitblit.properties");
|
| | | if (!localSettings.exists()) {
|
| | | File contextData = new File(contextFolder, "/WEB-INF/data");
|
| | | if (!base.equals(contextData)) {
|
| | | try {
|
| | | com.gitblit.utils.FileUtils.copy(base, contextData.listFiles());
|
| | | } catch (IOException e) {
|
| | | logger.error(MessageFormat.format(
|
| | | "Failed to copy included data from {0} to {1}",
|
| | | contextData, base));
|
| | | }
|
| | | }
|
| | | }
|
| | | |
| | | // delegate all config to baseFolder/gitblit.properties file
|
| | | FileSettings settings = new FileSettings(localSettings.getAbsolutePath()); |
| | | configureContext(settings, base, true);
|
| | | }
|
| | | }
|
| | |
|
| | |
| | | // create a Gitblit repository model for the clone
|
| | | RepositoryModel cloneModel = repository.cloneAs(cloneName);
|
| | | // owner has REWIND/RW+ permissions
|
| | | cloneModel.owner = user.username;
|
| | | cloneModel.addOwner(user.username);
|
| | | updateRepositoryModel(cloneName, cloneModel, false);
|
| | |
|
| | | // add the owner of the source repository to the clone's access list
|
| | | if (!StringUtils.isEmpty(repository.owner)) {
|
| | | UserModel originOwner = getUserModel(repository.owner);
|
| | | if (originOwner != null) {
|
| | | originOwner.setRepositoryPermission(cloneName, AccessPermission.CLONE);
|
| | | updateUserModel(originOwner.username, originOwner, false);
|
| | | if (!ArrayUtils.isEmpty(repository.owners)) {
|
| | | for (String owner : repository.owners) {
|
| | | UserModel originOwner = getUserModel(owner);
|
| | | if (originOwner != null) {
|
| | | originOwner.setRepositoryPermission(cloneName, AccessPermission.CLONE);
|
| | | updateUserModel(originOwner.username, originOwner, false);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|