You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GitBlit.java 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package com.gitblit;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.text.MessageFormat;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import javax.servlet.ServletContextEvent;
  8. import javax.servlet.ServletContextListener;
  9. import javax.servlet.http.Cookie;
  10. import org.apache.wicket.protocol.http.WebResponse;
  11. import org.eclipse.jgit.errors.RepositoryNotFoundException;
  12. import org.eclipse.jgit.lib.Repository;
  13. import org.eclipse.jgit.lib.StoredConfig;
  14. import org.eclipse.jgit.transport.resolver.FileResolver;
  15. import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import com.gitblit.utils.JGitUtils;
  19. import com.gitblit.wicket.User;
  20. import com.gitblit.wicket.models.RepositoryModel;
  21. public class GitBlit implements ServletContextListener {
  22. private final static GitBlit gitblit;
  23. private final Logger logger = LoggerFactory.getLogger(GitBlit.class);
  24. private FileResolver<Void> repositoryResolver;
  25. private File repositoriesFolder;
  26. private boolean exportAll;
  27. private ILoginService loginService;
  28. private IStoredSettings storedSettings;
  29. static {
  30. gitblit = new GitBlit();
  31. }
  32. public static GitBlit self() {
  33. return gitblit;
  34. }
  35. private GitBlit() {
  36. }
  37. public IStoredSettings settings() {
  38. return storedSettings;
  39. }
  40. public boolean isDebugMode() {
  41. return storedSettings.getBoolean(Keys.web.debugMode, false);
  42. }
  43. public String getCloneUrl(String repositoryName) {
  44. return storedSettings.getString(Keys.git.cloneUrl, "https://localhost/git/") + repositoryName;
  45. }
  46. public void setLoginService(ILoginService loginService) {
  47. this.loginService = loginService;
  48. }
  49. public User authenticate(String username, char[] password) {
  50. if (loginService == null) {
  51. return null;
  52. }
  53. return loginService.authenticate(username, password);
  54. }
  55. public User authenticate(Cookie[] cookies) {
  56. if (loginService == null) {
  57. return null;
  58. }
  59. if (cookies != null && cookies.length > 0) {
  60. for (Cookie cookie : cookies) {
  61. if (cookie.getName().equals(Constants.NAME)) {
  62. String value = cookie.getValue();
  63. return loginService.authenticate(value.toCharArray());
  64. }
  65. }
  66. }
  67. return null;
  68. }
  69. public void setCookie(WebResponse response, User user) {
  70. Cookie userCookie = new Cookie(Constants.NAME, user.getCookie());
  71. userCookie.setMaxAge(Integer.MAX_VALUE);
  72. userCookie.setPath("/");
  73. response.addCookie(userCookie);
  74. }
  75. public List<String> getRepositoryList() {
  76. return JGitUtils.getRepositoryList(repositoriesFolder, exportAll, storedSettings.getBoolean(Keys.git.nestedRepositories, true));
  77. }
  78. public Repository getRepository(String repositoryName) {
  79. Repository r = null;
  80. try {
  81. r = repositoryResolver.open(null, repositoryName);
  82. } catch (RepositoryNotFoundException e) {
  83. r = null;
  84. logger.error("GitBlit.getRepository(String) failed to find repository " + repositoryName);
  85. } catch (ServiceNotEnabledException e) {
  86. r = null;
  87. e.printStackTrace();
  88. }
  89. return r;
  90. }
  91. public List<RepositoryModel> getRepositoryModels() {
  92. List<String> list = getRepositoryList();
  93. List<RepositoryModel> repositories = new ArrayList<RepositoryModel>();
  94. for (String repo : list) {
  95. RepositoryModel model = getRepositoryModel(repo);
  96. repositories.add(model);
  97. }
  98. return repositories;
  99. }
  100. public RepositoryModel getRepositoryModel(String repositoryName) {
  101. Repository r = getRepository(repositoryName);
  102. RepositoryModel model = new RepositoryModel();
  103. model.name = repositoryName;
  104. model.hasCommits = JGitUtils.hasCommits(r);
  105. model.lastChange = JGitUtils.getLastChange(r);
  106. StoredConfig config = JGitUtils.readConfig(r);
  107. if (config != null) {
  108. model.description = config.getString("gitblit", null, "description");
  109. model.owner = config.getString("gitblit", null, "owner");
  110. model.group = config.getString("gitblit", null, "group");
  111. model.useTickets = config.getBoolean("gitblit", "useTickets", false);
  112. model.useDocs = config.getBoolean("gitblit", "useDocs", false);
  113. model.useRestrictedAccess = config.getBoolean("gitblit", "restrictedAccess", false);
  114. model.showRemoteBranches = config.getBoolean("gitblit", "showRemoteBranches", false);
  115. }
  116. r.close();
  117. return model;
  118. }
  119. public void editRepositoryModel(RepositoryModel repository, boolean isCreate) throws GitBlitException {
  120. Repository r = null;
  121. if (isCreate) {
  122. if (new File(repositoriesFolder, repository.name).exists()) {
  123. throw new GitBlitException(MessageFormat.format("Can not create repository {0} because it already exists.", repository.name));
  124. }
  125. // create repository
  126. logger.info("create repository " + repository.name);
  127. r = JGitUtils.createRepository(repositoriesFolder, repository.name, true);
  128. } else {
  129. // load repository
  130. logger.info("edit repository " + repository.name);
  131. try {
  132. r = repositoryResolver.open(null, repository.name);
  133. } catch (RepositoryNotFoundException e) {
  134. logger.error("Repository not found", e);
  135. } catch (ServiceNotEnabledException e) {
  136. logger.error("Service not enabled", e);
  137. }
  138. }
  139. // update settings
  140. StoredConfig config = JGitUtils.readConfig(r);
  141. config.setString("gitblit", null, "description", repository.description);
  142. config.setString("gitblit", null, "owner", repository.owner);
  143. config.setBoolean("gitblit", null, "useTickets", repository.useTickets);
  144. config.setBoolean("gitblit", null, "useDocs", repository.useDocs);
  145. config.setBoolean("gitblit", null, "restrictedAccess", repository.useRestrictedAccess);
  146. config.setBoolean("gitblit", null, "showRemoteBranches", repository.showRemoteBranches);
  147. try {
  148. config.save();
  149. } catch (IOException e) {
  150. logger.error("Failed to save repository config!", e);
  151. }
  152. r.close();
  153. }
  154. public void configureContext(IStoredSettings settings) {
  155. logger.info("Configure GitBlit from " + settings.toString());
  156. this.storedSettings = settings;
  157. repositoriesFolder = new File(settings.getString(Keys.git.repositoriesFolder, "repos"));
  158. exportAll = settings.getBoolean(Keys.git.exportAll, true);
  159. repositoryResolver = new FileResolver<Void>(repositoriesFolder, exportAll);
  160. }
  161. @Override
  162. public void contextInitialized(ServletContextEvent contextEvent) {
  163. if (storedSettings == null) {
  164. WebXmlSettings webxmlSettings = new WebXmlSettings(contextEvent.getServletContext());
  165. configureContext(webxmlSettings);
  166. }
  167. }
  168. @Override
  169. public void contextDestroyed(ServletContextEvent contextEvent) {
  170. logger.info("GitBlit context destroyed by servlet container.");
  171. }
  172. }