List of usage examples for org.eclipse.jgit.lib Repository close
@Override public void close()
Decrement the use count, and maybe close resources.
From source file:com.gitblit.plugin.smartticketbranches.SmartTicketBranchesHook.java
License:Apache License
@Override public void onUpdateTicket(TicketModel ticket, Change change) { if (!ticket.hasPatchsets()) { // ticket has no patchsets, nothing to do return;//from ww w . ja v a 2s. c om } if (!change.isStatusChange()) { // not a status change, nothing to do return; } final Patchset ps = ticket.getCurrentPatchset(); final String branch = PatchsetCommand.getTicketBranch(ticket.number); final IRepositoryManager repositoryManager = GitblitContext.getManager(IRepositoryManager.class); final Repository repo = repositoryManager.getRepository(ticket.repository); try { switch (change.getStatus()) { case New: // NOOP, new proposal log.debug("new proposal, skipping"); break; case Open: /* * Open or Re-open: create branch, if not exists */ if (null == repo.getRef(branch)) { log.debug("ticket re-opened, trying to create '{}'", branch); RefUpdate ru = repo.updateRef(branch); ru.setExpectedOldObjectId(ObjectId.zeroId()); ru.setNewObjectId(ObjectId.fromString(ps.tip)); RevWalk rw = null; try { rw = new RevWalk(repo); RefUpdate.Result result = ru.update(rw); switch (result) { case NEW: log.info(String.format("%s ticket RE-OPENED, created %s:%s", name, ticket.repository, branch)); break; default: log.error(String.format("%s failed to re-create %s:%s (%s)", name, ticket.repository, branch, result)); break; } } finally { if (rw != null) { rw.release(); } } } break; default: /* * Ticket closed: delete branch, if exists */ log.debug("ticket closed, trying to remove '{}'", branch); RefUpdate ru = repo.updateRef(branch); ru.setExpectedOldObjectId(ObjectId.fromString(ps.tip)); ru.setNewObjectId(ObjectId.zeroId()); ru.setForceUpdate(true); RefUpdate.Result result = ru.delete(); switch (result) { case FORCED: log.info(String.format("%s ticket %s, removed %s:%s", name, change.getStatus(), ticket.repository, branch)); break; default: log.error(String.format("%s failed to remove %s:%s (%s)", name, ticket.repository, branch, result)); break; } } } catch (IOException e) { log.error(null, e); } finally { if (repo != null) { repo.close(); } } }
From source file:com.gitblit.RpcServlet.java
License:Apache License
/** * Processes an rpc request./*from w ww.ja v a 2 s . c o m*/ * * @param request * @param response * @throws javax.servlet.ServletException * @throws java.io.IOException */ @Override protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RpcRequest reqType = RpcRequest.fromName(request.getParameter("req")); String objectName = request.getParameter("name"); logger.info(MessageFormat.format("Rpc {0} request from {1}", reqType, request.getRemoteAddr())); UserModel user = (UserModel) request.getUserPrincipal(); boolean allowManagement = user != null && user.canAdmin && GitBlit.getBoolean(Keys.web.enableRpcManagement, false); boolean allowAdmin = user != null && user.canAdmin && GitBlit.getBoolean(Keys.web.enableRpcAdministration, false); Object result = null; if (RpcRequest.GET_PROTOCOL.equals(reqType)) { // Return the protocol version result = PROTOCOL_VERSION; } else if (RpcRequest.LIST_REPOSITORIES.equals(reqType)) { // Determine the Gitblit clone url String gitblitUrl = HttpUtils.getGitblitURL(request); StringBuilder sb = new StringBuilder(); sb.append(gitblitUrl); sb.append(Constants.GIT_PATH); sb.append("{0}"); String cloneUrl = sb.toString(); // list repositories List<RepositoryModel> list = GitBlit.self().getRepositoryModels(user); Map<String, RepositoryModel> repositories = new HashMap<String, RepositoryModel>(); for (RepositoryModel model : list) { String url = MessageFormat.format(cloneUrl, model.name); repositories.put(url, model); } result = repositories; } else if (RpcRequest.LIST_BRANCHES.equals(reqType)) { // list all local branches in all repositories accessible to user Map<String, List<String>> localBranches = new HashMap<String, List<String>>(); List<RepositoryModel> models = GitBlit.self().getRepositoryModels(user); for (RepositoryModel model : models) { if (!model.hasCommits) { // skip empty repository continue; } // get local branches Repository repository = GitBlit.self().getRepository(model.name); List<RefModel> refs = JGitUtils.getLocalBranches(repository, false, -1); if (model.showRemoteBranches) { // add remote branches if repository displays them refs.addAll(JGitUtils.getRemoteBranches(repository, false, -1)); } if (refs.size() > 0) { List<String> branches = new ArrayList<String>(); for (RefModel ref : refs) { branches.add(ref.getName()); } localBranches.put(model.name, branches); } repository.close(); } result = localBranches; } else if (RpcRequest.LIST_USERS.equals(reqType)) { // list users List<String> names = GitBlit.self().getAllUsernames(); List<UserModel> users = new ArrayList<UserModel>(); for (String name : names) { users.add(GitBlit.self().getUserModel(name)); } result = users; } else if (RpcRequest.LIST_TEAMS.equals(reqType)) { // list teams List<String> names = GitBlit.self().getAllTeamnames(); List<TeamModel> teams = new ArrayList<TeamModel>(); for (String name : names) { teams.add(GitBlit.self().getTeamModel(name)); } result = teams; } else if (RpcRequest.CREATE_REPOSITORY.equals(reqType)) { // create repository RepositoryModel model = deserialize(request, response, RepositoryModel.class); try { GitBlit.self().updateRepositoryModel(model.name, model, true); } catch (GitBlitException e) { response.setStatus(failureCode); } } else if (RpcRequest.EDIT_REPOSITORY.equals(reqType)) { // edit repository RepositoryModel model = deserialize(request, response, RepositoryModel.class); // name specifies original repository name in event of rename String repoName = objectName; if (repoName == null) { repoName = model.name; } try { GitBlit.self().updateRepositoryModel(repoName, model, false); } catch (GitBlitException e) { response.setStatus(failureCode); } } else if (RpcRequest.DELETE_REPOSITORY.equals(reqType)) { // delete repository RepositoryModel model = deserialize(request, response, RepositoryModel.class); GitBlit.self().deleteRepositoryModel(model); } else if (RpcRequest.CREATE_USER.equals(reqType)) { // create user UserModel model = deserialize(request, response, UserModel.class); try { GitBlit.self().updateUserModel(model.username, model, true); } catch (GitBlitException e) { response.setStatus(failureCode); } } else if (RpcRequest.EDIT_USER.equals(reqType)) { // edit user UserModel model = deserialize(request, response, UserModel.class); // name parameter specifies original user name in event of rename String username = objectName; if (username == null) { username = model.username; } try { GitBlit.self().updateUserModel(username, model, false); } catch (GitBlitException e) { response.setStatus(failureCode); } } else if (RpcRequest.DELETE_USER.equals(reqType)) { // delete user UserModel model = deserialize(request, response, UserModel.class); if (!GitBlit.self().deleteUser(model.username)) { response.setStatus(failureCode); } } else if (RpcRequest.CREATE_TEAM.equals(reqType)) { // create team TeamModel model = deserialize(request, response, TeamModel.class); try { GitBlit.self().updateTeamModel(model.name, model, true); } catch (GitBlitException e) { response.setStatus(failureCode); } } else if (RpcRequest.EDIT_TEAM.equals(reqType)) { // edit team TeamModel model = deserialize(request, response, TeamModel.class); // name parameter specifies original team name in event of rename String teamname = objectName; if (teamname == null) { teamname = model.name; } try { GitBlit.self().updateTeamModel(teamname, model, false); } catch (GitBlitException e) { response.setStatus(failureCode); } } else if (RpcRequest.DELETE_TEAM.equals(reqType)) { // delete team TeamModel model = deserialize(request, response, TeamModel.class); if (!GitBlit.self().deleteTeam(model.name)) { response.setStatus(failureCode); } } else if (RpcRequest.LIST_REPOSITORY_MEMBERS.equals(reqType)) { // get repository members RepositoryModel model = GitBlit.self().getRepositoryModel(objectName); result = GitBlit.self().getRepositoryUsers(model); } else if (RpcRequest.SET_REPOSITORY_MEMBERS.equals(reqType)) { // update repository access list RepositoryModel model = GitBlit.self().getRepositoryModel(objectName); Collection<String> names = deserialize(request, response, RpcUtils.NAMES_TYPE); List<String> users = new ArrayList<String>(names); if (!GitBlit.self().setRepositoryUsers(model, users)) { response.setStatus(failureCode); } } else if (RpcRequest.LIST_REPOSITORY_TEAMS.equals(reqType)) { // get repository teams RepositoryModel model = GitBlit.self().getRepositoryModel(objectName); result = GitBlit.self().getRepositoryTeams(model); } else if (RpcRequest.SET_REPOSITORY_TEAMS.equals(reqType)) { // update repository team access list RepositoryModel model = GitBlit.self().getRepositoryModel(objectName); Collection<String> names = deserialize(request, response, RpcUtils.NAMES_TYPE); List<String> teams = new ArrayList<String>(names); if (!GitBlit.self().setRepositoryTeams(model, teams)) { response.setStatus(failureCode); } } else if (RpcRequest.LIST_FEDERATION_REGISTRATIONS.equals(reqType)) { // return the list of federation registrations if (allowAdmin) { result = GitBlit.self().getFederationRegistrations(); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_FEDERATION_RESULTS.equals(reqType)) { // return the list of federation result registrations if (allowAdmin && GitBlit.canFederate()) { result = GitBlit.self().getFederationResultRegistrations(); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_FEDERATION_PROPOSALS.equals(reqType)) { // return the list of federation proposals if (allowAdmin && GitBlit.canFederate()) { result = GitBlit.self().getPendingFederationProposals(); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_FEDERATION_SETS.equals(reqType)) { // return the list of federation sets if (allowAdmin && GitBlit.canFederate()) { String gitblitUrl = HttpUtils.getGitblitURL(request); result = GitBlit.self().getFederationSets(gitblitUrl); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_SETTINGS.equals(reqType)) { // return the server's settings ServerSettings settings = GitBlit.self().getSettingsModel(); if (allowAdmin) { // return all settings result = settings; } else { // anonymous users get a few settings to allow browser launching List<String> keys = new ArrayList<String>(); keys.add(Keys.web.siteName); keys.add(Keys.web.mountParameters); keys.add(Keys.web.syndicationEntries); if (allowManagement) { // keys necessary for repository and/or user management keys.add(Keys.realm.minPasswordLength); keys.add(Keys.realm.passwordStorage); keys.add(Keys.federation.sets); } // build the settings ServerSettings managementSettings = new ServerSettings(); for (String key : keys) { managementSettings.add(settings.get(key)); } if (allowManagement) { managementSettings.pushScripts = settings.pushScripts; } result = managementSettings; } } else if (RpcRequest.EDIT_SETTINGS.equals(reqType)) { // update settings on the server if (allowAdmin) { Map<String, String> settings = deserialize(request, response, RpcUtils.SETTINGS_TYPE); GitBlit.self().updateSettings(settings); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_STATUS.equals(reqType)) { // return the server's status information if (allowAdmin) { result = GitBlit.self().getStatus(); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.CLEAR_REPOSITORY_CACHE.equals(reqType)) { // clear the repository list cache if (allowManagement) { GitBlit.self().resetRepositoryListCache(); } else { response.sendError(notAllowedCode); } } // send the result of the request serialize(response, result); }
From source file:com.gitblit.service.GarbageCollectorService.java
License:Apache License
@Override public void run() { if (!isReady()) { return;// w w w. j a va 2 s. c om } running.set(true); Date now = new Date(); for (String repositoryName : repositoryManager.getRepositoryList()) { if (forceClose.get()) { break; } if (isCollectingGarbage(repositoryName)) { logger.warn(MessageFormat.format("Already collecting garbage from {0}?!?", repositoryName)); continue; } boolean garbageCollected = false; RepositoryModel model = null; Repository repository = null; try { model = repositoryManager.getRepositoryModel(repositoryName); repository = repositoryManager.getRepository(repositoryName); if (repository == null) { logger.warn(MessageFormat.format("GCExecutor is missing repository {0}?!?", repositoryName)); continue; } if (!repositoryManager.isIdle(repository)) { logger.debug(MessageFormat.format("GCExecutor is skipping {0} because it is not idle", repositoryName)); continue; } // By setting the GCStatus to COLLECTING we are // disabling *all* access to this repository from Gitblit. // Think of this as a clutch in a manual transmission vehicle. if (!setGCStatus(repositoryName, GCStatus.COLLECTING)) { logger.warn(MessageFormat.format("Can not acquire GC lock for {0}, skipping", repositoryName)); continue; } logger.debug(MessageFormat.format("GCExecutor locked idle repository {0}", repositoryName)); Git git = new Git(repository); GarbageCollectCommand gc = git.gc(); Properties stats = gc.getStatistics(); // determine if this is a scheduled GC Calendar cal = Calendar.getInstance(); cal.setTime(model.lastGC); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); cal.add(Calendar.DATE, model.gcPeriod); Date gcDate = cal.getTime(); boolean shouldCollectGarbage = now.after(gcDate); // determine if filesize triggered GC long gcThreshold = FileUtils.convertSizeToLong(model.gcThreshold, 500 * 1024L); long sizeOfLooseObjects = (Long) stats.get("sizeOfLooseObjects"); boolean hasEnoughGarbage = sizeOfLooseObjects >= gcThreshold; // if we satisfy one of the requirements, GC boolean hasGarbage = sizeOfLooseObjects > 0; if (hasGarbage && (hasEnoughGarbage || shouldCollectGarbage)) { long looseKB = sizeOfLooseObjects / 1024L; logger.info(MessageFormat.format("Collecting {1} KB of loose objects from {0}", repositoryName, looseKB)); // do the deed gc.call(); garbageCollected = true; } } catch (Exception e) { logger.error("Error collecting garbage in " + repositoryName, e); } finally { // cleanup if (repository != null) { if (garbageCollected) { // update the last GC date model.lastGC = new Date(); repositoryManager.updateConfiguration(repository, model); } repository.close(); } // reset the GC lock releaseLock(repositoryName); logger.debug(MessageFormat.format("GCExecutor released GC lock for {0}", repositoryName)); } } running.set(false); }
From source file:com.gitblit.service.LuceneService.java
License:Apache License
/** * Run is executed by the Gitblit executor service. Because this is called * by an executor service, calls will queue - i.e. there can never be * concurrent execution of repository index updates. *///from w w w . j av a2 s . com @Override public void run() { if (!storedSettings.getBoolean(Keys.web.allowLuceneIndexing, true)) { // Lucene indexing is disabled return; } // reload the excluded extensions String exts = storedSettings.getString(Keys.web.luceneIgnoreExtensions, luceneIgnoreExtensions); excludedExtensions = new TreeSet<String>(StringUtils.getStringsFromValue(exts)); if (repositoryManager.isCollectingGarbage()) { // busy collecting garbage, try again later return; } for (String repositoryName : repositoryManager.getRepositoryList()) { RepositoryModel model = repositoryManager.getRepositoryModel(repositoryName); if (model.hasCommits && !ArrayUtils.isEmpty(model.indexedBranches)) { Repository repository = repositoryManager.getRepository(model.name); if (repository == null) { if (repositoryManager.isCollectingGarbage(model.name)) { logger.info(MessageFormat.format("Skipping Lucene index of {0}, busy garbage collecting", repositoryName)); } continue; } index(model, repository); repository.close(); System.gc(); } } }
From source file:com.gitblit.service.MirrorService.java
License:Apache License
@Override public void run() { if (!isReady()) { return;/*from w ww .j av a 2s . c o m*/ } running.set(true); for (String repositoryName : repositoryManager.getRepositoryList()) { if (forceClose.get()) { break; } if (repositoryManager.isCollectingGarbage(repositoryName)) { logger.debug("mirror is skipping {} garbagecollection", repositoryName); continue; } RepositoryModel model = null; Repository repository = null; try { model = repositoryManager.getRepositoryModel(repositoryName); if (!model.isMirror && !model.isBare) { // repository must be a valid bare git mirror logger.debug("mirror is skipping {} !mirror !bare", repositoryName); continue; } repository = repositoryManager.getRepository(repositoryName); if (repository == null) { logger.warn( MessageFormat.format("MirrorExecutor is missing repository {0}?!?", repositoryName)); continue; } // automatically repair (some) invalid fetch ref specs if (!repairAttempted.contains(repositoryName)) { repairAttempted.add(repositoryName); JGitUtils.repairFetchSpecs(repository); } // find the first mirror remote - there should only be one StoredConfig rc = repository.getConfig(); RemoteConfig mirror = null; List<RemoteConfig> configs = RemoteConfig.getAllRemoteConfigs(rc); for (RemoteConfig config : configs) { if (config.isMirror()) { mirror = config; break; } } if (mirror == null) { // repository does not have a mirror remote logger.debug("mirror is skipping {} no mirror remote found", repositoryName); continue; } logger.debug("checking {} remote {} for ref updates", repositoryName, mirror.getName()); final boolean testing = false; Git git = new Git(repository); FetchResult result = git.fetch().setRemote(mirror.getName()).setDryRun(testing).call(); Collection<TrackingRefUpdate> refUpdates = result.getTrackingRefUpdates(); if (refUpdates.size() > 0) { ReceiveCommand ticketBranchCmd = null; for (TrackingRefUpdate ru : refUpdates) { StringBuilder sb = new StringBuilder(); sb.append("updated mirror "); sb.append(repositoryName); sb.append(" "); sb.append(ru.getRemoteName()); sb.append(" -> "); sb.append(ru.getLocalName()); if (ru.getResult() == Result.FORCED) { sb.append(" (forced)"); } sb.append(" "); sb.append(ru.getOldObjectId() == null ? "" : ru.getOldObjectId().abbreviate(7).name()); sb.append(".."); sb.append(ru.getNewObjectId() == null ? "" : ru.getNewObjectId().abbreviate(7).name()); logger.info(sb.toString()); if (BranchTicketService.BRANCH.equals(ru.getLocalName())) { ReceiveCommand.Type type = null; switch (ru.getResult()) { case NEW: type = Type.CREATE; break; case FAST_FORWARD: type = Type.UPDATE; break; case FORCED: type = Type.UPDATE_NONFASTFORWARD; break; default: type = null; break; } if (type != null) { ticketBranchCmd = new ReceiveCommand(ru.getOldObjectId(), ru.getNewObjectId(), ru.getLocalName(), type); } } } if (ticketBranchCmd != null) { repository.fireEvent(new ReceiveCommandEvent(model, ticketBranchCmd)); } } } catch (Exception e) { logger.error("Error updating mirror " + repositoryName, e); } finally { // cleanup if (repository != null) { repository.close(); } } } running.set(false); }
From source file:com.gitblit.servlet.BranchGraphServlet.java
License:Eclipse Distribution License
@Override protected long getLastModified(HttpServletRequest req) { String repository = req.getParameter("r"); if (StringUtils.isEmpty(repository)) { return 0; }// w ww .j av a 2s . c om String objectId = req.getParameter("h"); Repository r = null; try { r = repositoryManager.getRepository(repository); if (StringUtils.isEmpty(objectId)) { objectId = JGitUtils.getHEADRef(r); } ObjectId id = r.resolve(objectId); if (id == null) { return 0; } RevCommit commit = JGitUtils.getCommit(r, objectId); return JGitUtils.getCommitDate(commit).getTime(); } catch (Exception e) { log.error("Failed to determine last modified", e); return 0; } finally { if (r != null) { r.close(); } } }
From source file:com.gitblit.servlet.BranchGraphServlet.java
License:Eclipse Distribution License
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { InputStream is = null;//from w ww . ja va2s . c o m Repository r = null; PlotWalk rw = null; try { String repository = request.getParameter("r"); if (StringUtils.isEmpty(repository)) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().append("Bad request"); return; } String objectId = request.getParameter("h"); String length = request.getParameter("l"); r = repositoryManager.getRepository(repository); if (r == null) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().append("Bad request"); return; } rw = new PlotWalk(r); if (StringUtils.isEmpty(objectId)) { objectId = JGitUtils.getHEADRef(r); } ObjectId id = r.resolve(objectId); if (id == null) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().append("Bad request"); return; } rw.markStart(rw.lookupCommit(id)); // default to the items-per-page setting, unless specified int maxCommits = settings.getInteger(Keys.web.itemsPerPage, 50); int requestedCommits = maxCommits; if (!StringUtils.isEmpty(length)) { int l = Integer.parseInt(length); if (l > 0) { requestedCommits = l; } } // fetch the requested commits plus some extra so that the last // commit displayed *likely* has correct lane assignments CommitList commitList = new CommitList(); commitList.source(rw); commitList.fillTo(2 * Math.max(requestedCommits, maxCommits)); // determine the appropriate width for the image int numLanes = 1; int numCommits = Math.min(requestedCommits, commitList.size()); if (numCommits > 1) { // determine graph width Set<String> parents = new TreeSet<String>(); for (int i = 0; i < commitList.size(); i++) { PlotCommit<Lane> commit = commitList.get(i); boolean checkLane = false; if (i < numCommits) { // commit in visible list checkLane = true; // remember parents for (RevCommit p : commit.getParents()) { parents.add(p.getName()); } } else if (parents.contains(commit.getName())) { // commit outside visible list, but it is a parent of a // commit in the visible list so we need to know it's lane // assignment checkLane = true; } if (checkLane) { int pos = commit.getLane().getPosition(); numLanes = Math.max(numLanes, pos + 1); } } } int graphWidth = numLanes * LANE_WIDTH + RIGHT_PAD; int rowHeight = ROW_HEIGHT; // create an image buffer and render the lanes BufferedImage image = new BufferedImage(graphWidth, rowHeight * numCommits, BufferedImage.TYPE_INT_ARGB); Graphics2D g = null; try { g = image.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); LanesRenderer renderer = new LanesRenderer(); for (int i = 0; i < commitList.size(); i++) { PlotCommit<Lane> commit = commitList.get(i); Graphics row = g.create(0, i * rowHeight, graphWidth, rowHeight); try { renderer.paint(row, commit, rowHeight, graphWidth); } finally { row.dispose(); row = null; } } } finally { if (g != null) { g.dispose(); g = null; } } // write the image buffer to the client response.setContentType("image/png"); if (numCommits > 1) { response.setHeader("Cache-Control", "public, max-age=60, must-revalidate"); response.setDateHeader("Last-Modified", JGitUtils.getCommitDate(commitList.get(0)).getTime()); } OutputStream os = response.getOutputStream(); ImageIO.write(image, "png", os); os.flush(); image.flush(); image = null; } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) { is.close(); is = null; } if (rw != null) { rw.dispose(); rw = null; } if (r != null) { r.close(); r = null; } } }
From source file:com.gitblit.servlet.DownloadZipServlet.java
License:Apache License
/** * Creates a zip stream from the repository of the requested data. * * @param request// www .j a va2 s .com * @param response * @throws javax.servlet.ServletException * @throws java.io.IOException */ private void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { if (!settings.getBoolean(Keys.web.allowZipDownloads, true)) { logger.warn("Zip downloads are disabled"); response.sendError(HttpServletResponse.SC_FORBIDDEN); return; } Format format = Format.zip; String repository = request.getParameter("r"); String basePath = request.getParameter("p"); String objectId = request.getParameter("h"); String f = request.getParameter("format"); if (!StringUtils.isEmpty(f)) { format = Format.fromName(f); } try { String name = repository; if (name.indexOf('/') > -1) { name = name.substring(name.lastIndexOf('/') + 1); } name = StringUtils.stripDotGit(name); if (!StringUtils.isEmpty(basePath)) { name += "-" + basePath.replace('/', '_'); } if (!StringUtils.isEmpty(objectId)) { name += "-" + objectId; } Repository r = repositoryManager.getRepository(repository); if (r == null) { if (repositoryManager.isCollectingGarbage(repository)) { error(response, MessageFormat.format("# Error\nGitblit is busy collecting garbage in {0}", repository)); return; } else { error(response, MessageFormat.format("# Error\nFailed to find repository {0}", repository)); return; } } RevCommit commit = JGitUtils.getCommit(r, objectId); if (commit == null) { error(response, MessageFormat.format("# Error\nFailed to find commit {0}", objectId)); r.close(); return; } Date date = JGitUtils.getCommitDate(commit); String contentType = "application/octet-stream"; response.setContentType(contentType + "; charset=" + response.getCharacterEncoding()); response.setHeader("Content-Disposition", "attachment; filename=\"" + name + format.extension + "\""); response.setDateHeader("Last-Modified", date.getTime()); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); try { switch (format) { case zip: CompressionUtils.zip(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; case tar: CompressionUtils.tar(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; case gz: CompressionUtils.gz(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; case xz: CompressionUtils.xz(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; case bzip2: CompressionUtils.bzip2(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; } response.flushBuffer(); } catch (IOException t) { String message = t.getMessage() == null ? "" : t.getMessage().toLowerCase(); if (message.contains("reset") || message.contains("broken pipe")) { logger.error("Client aborted zip download: " + message); } else { logger.error("Failed to write attachment to client", t); } } catch (Throwable t) { logger.error("Failed to write attachment to client", t); } // close the repository r.close(); } catch (Throwable t) { logger.error("Failed to write attachment to client", t); } }
From source file:com.gitblit.servlet.PagesFilter.java
License:Apache License
/** * Extract the repository name from the url. * * @param url// ww w . j a v a 2s. c o m * @return repository name */ @Override protected String extractRepositoryName(String url) { // get the repository name from the url by finding a known url suffix String repository = ""; Repository r = null; int offset = 0; while (r == null) { int slash = url.indexOf('/', offset); if (slash == -1) { repository = url; } else { repository = url.substring(0, slash); } r = repositoryManager.getRepository(repository, false); if (r == null) { // try again offset = slash + 1; } else { // close the repo r.close(); } if (repository.equals(url)) { // either only repository in url or no repository found break; } } return repository; }
From source file:com.gitblit.servlet.RawServlet.java
License:Apache License
/** * Retrieves the specified resource from the specified branch of the * repository./*ww w . j a va2s . c om*/ * * @param request * @param response * @throws javax.servlet.ServletException * @throws java.io.IOException */ private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = request.getPathInfo(); if (path.toLowerCase().endsWith(".git")) { // forward to url with trailing / // this is important for relative pages links response.sendRedirect(request.getServletPath() + path + "/"); return; } if (path.charAt(0) == '/') { // strip leading / path = path.substring(1); } // determine repository and resource from url String repository = path; Repository r = null; int terminator = repository.length(); do { repository = repository.substring(0, terminator); r = repositoryManager.getRepository(repository, false); terminator = repository.lastIndexOf('/'); } while (r == null && terminator > -1); ServletContext context = request.getSession().getServletContext(); try { if (r == null) { // repository not found! String mkd = MessageFormat .format("# Error\nSorry, no valid **repository** specified in this url: {0}!", path); error(response, mkd); return; } // identify the branch String branch = getBranch(repository, request); if (StringUtils.isEmpty(branch)) { branch = r.getBranch(); if (branch == null) { // no branches found! empty? String mkd = MessageFormat .format("# Error\nSorry, no valid **branch** specified in this url: {0}!", path); error(response, mkd); } else { // redirect to default branch String base = request.getRequestURI(); String url = base + branch + "/"; response.sendRedirect(url); } return; } // identify the requested path String requestedPath = getPath(repository, branch, request); // identify the commit RevCommit commit = JGitUtils.getCommit(r, branch); if (commit == null) { // branch not found! String mkd = MessageFormat.format( "# Error\nSorry, the repository {0} does not have a **{1}** branch!", repository, branch); error(response, mkd); return; } Map<String, String> quickContentTypes = new HashMap<>(); quickContentTypes.put("html", "text/html"); quickContentTypes.put("htm", "text/html"); quickContentTypes.put("xml", "application/xml"); quickContentTypes.put("json", "application/json"); List<PathModel> pathEntries = JGitUtils.getFilesInPath(r, requestedPath, commit); if (pathEntries.isEmpty()) { // requested a specific resource String file = StringUtils.getLastPathElement(requestedPath); try { String ext = StringUtils.getFileExtension(file).toLowerCase(); // We can't parse out an extension for classic "dotfiles", so make a general assumption that // they're text files to allow presenting them in browser instead of only for download. // // However, that only holds for files with no other extension included, for files that happen // to start with a dot but also include an extension, process the extension normally. // This logic covers .gitattributes, .gitignore, .zshrc, etc., but does not cover .mongorc.js, .zshrc.bak boolean isExtensionlessDotfile = file.charAt(0) == '.' && (file.length() == 1 || file.indexOf('.', 1) < 0); String contentType = isExtensionlessDotfile ? "text/plain" : quickContentTypes.get(ext); if (contentType == null) { List<String> exts = runtimeManager.getSettings().getStrings(Keys.web.prettyPrintExtensions); if (exts.contains(ext)) { // extension is a registered text type for pretty printing contentType = "text/plain"; } else { // query Tika for the content type Tika tika = new Tika(); contentType = tika.detect(file); } } if (contentType == null) { // ask the container for the content type contentType = context.getMimeType(requestedPath); if (contentType == null) { // still unknown content type, assume binary contentType = "application/octet-stream"; } } if (isTextType(contentType) || isTextDataType(contentType)) { // load, interpret, and serve text content as UTF-8 String[] encodings = runtimeManager.getSettings().getStrings(Keys.web.blobEncodings) .toArray(new String[0]); String content = JGitUtils.getStringContent(r, commit.getTree(), requestedPath, encodings); if (content == null) { logger.error("RawServlet Failed to load {} {} {}", repository, commit.getName(), path); notFound(response, requestedPath, branch); return; } byte[] bytes = content.getBytes(Constants.ENCODING); setContentType(response, contentType); response.setContentLength(bytes.length); ByteArrayInputStream is = new ByteArrayInputStream(bytes); sendContent(response, JGitUtils.getCommitDate(commit), is); } else { // stream binary content directly from the repository if (!streamFromRepo(request, response, r, commit, requestedPath)) { logger.error("RawServlet Failed to load {} {} {}", repository, commit.getName(), path); notFound(response, requestedPath, branch); } } return; } catch (Exception e) { logger.error(null, e); } } else { // path request if (!request.getPathInfo().endsWith("/")) { // redirect to trailing '/' url response.sendRedirect(request.getServletPath() + request.getPathInfo() + "/"); return; } if (renderIndex()) { // locate and render an index file Map<String, String> names = new TreeMap<String, String>(); for (PathModel entry : pathEntries) { names.put(entry.name.toLowerCase(), entry.name); } List<String> extensions = new ArrayList<String>(); extensions.add("html"); extensions.add("htm"); String content = null; for (String ext : extensions) { String key = "index." + ext; if (names.containsKey(key)) { String fileName = names.get(key); String fullPath = fileName; if (!requestedPath.isEmpty()) { fullPath = requestedPath + "/" + fileName; } String[] encodings = runtimeManager.getSettings().getStrings(Keys.web.blobEncodings) .toArray(new String[0]); String stringContent = JGitUtils.getStringContent(r, commit.getTree(), fullPath, encodings); if (stringContent == null) { continue; } content = stringContent; requestedPath = fullPath; break; } } response.setContentType("text/html; charset=" + Constants.ENCODING); byte[] bytes = content.getBytes(Constants.ENCODING); response.setContentLength(bytes.length); ByteArrayInputStream is = new ByteArrayInputStream(bytes); sendContent(response, JGitUtils.getCommitDate(commit), is); return; } } // no content, document list or 404 page if (pathEntries.isEmpty()) { // default 404 page notFound(response, requestedPath, branch); return; } else { // // directory list // response.setContentType("text/html"); response.getWriter() .append("<style>table th, table td { min-width: 150px; text-align: left; }</style>"); response.getWriter().append("<table>"); response.getWriter().append("<thead><tr><th>path</th><th>mode</th><th>size</th></tr>"); response.getWriter().append("</thead>"); response.getWriter().append("<tbody>"); String pattern = "<tr><td><a href=\"{0}/{1}\">{1}</a></td><td>{2}</td><td>{3}</td></tr>"; final ByteFormat byteFormat = new ByteFormat(); if (!pathEntries.isEmpty()) { if (pathEntries.get(0).path.indexOf('/') > -1) { // we are in a subdirectory, add parent directory link String pp = URLEncoder.encode(requestedPath, Constants.ENCODING); pathEntries.add(0, new PathModel("..", pp + "/..", null, 0, FileMode.TREE.getBits(), null, null)); } } String basePath = request.getServletPath() + request.getPathInfo(); if (basePath.charAt(basePath.length() - 1) == '/') { // strip trailing slash basePath = basePath.substring(0, basePath.length() - 1); } for (PathModel entry : pathEntries) { String pp = URLEncoder.encode(entry.name, Constants.ENCODING); response.getWriter() .append(MessageFormat.format(pattern, basePath, pp, JGitUtils.getPermissionsFromMode(entry.mode), entry.isFile() ? byteFormat.format(entry.size) : "")); } response.getWriter().append("</tbody>"); response.getWriter().append("</table>"); } } catch (Throwable t) { logger.error("Failed to write page to client", t); } finally { r.close(); } }