use of org.eclipse.jgit.revplot.PlotWalk in project gitblit by gitblit.
the class BranchGraphServlet method doGet.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
InputStream is = null;
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;
}
}
}
use of org.eclipse.jgit.revplot.PlotWalk in project gitblit by gitblit.
the class JGitUtilsTest method testPlots.
@Test
public void testPlots() throws Exception {
Repository repository = GitBlitSuite.getTicgitRepository();
PlotWalk pw = new PlotWalk(repository);
PlotCommitList<PlotLane> commits = new PlotCommitList<PlotLane>();
commits.source(pw);
commits.fillTo(25);
for (PlotCommit<PlotLane> commit : commits) {
System.out.println(commit);
}
repository.close();
}
use of org.eclipse.jgit.revplot.PlotWalk in project indy by Commonjava.
the class GitManager method getHeadCommit.
public ChangeSummary getHeadCommit(final File f) throws GitSubsystemException {
return lockAnd(me -> {
try {
final ObjectId oid = repo.resolve("HEAD");
final PlotWalk pw = new PlotWalk(repo);
final RevCommit rc = pw.parseCommit(oid);
pw.markStart(rc);
final String filepath = relativize(f);
pw.setTreeFilter(AndTreeFilter.create(PathFilter.create(filepath), TreeFilter.ANY_DIFF));
final PlotCommitList<PlotLane> cl = new PlotCommitList<>();
cl.source(pw);
cl.fillTo(1);
final PlotCommit<PlotLane> commit = cl.get(0);
return toChangeSummary(commit);
} catch (RevisionSyntaxException | IOException e) {
throw new GitSubsystemException("Failed to resolve HEAD commit for: %s. Reason: %s", e, f, e.getMessage());
}
});
}
use of org.eclipse.jgit.revplot.PlotWalk in project indy by Commonjava.
the class GitManager method getChangelog.
public List<ChangeSummary> getChangelog(final File f, final int start, final int length) throws GitSubsystemException {
return lockAnd(me -> {
if (length == 0) {
return Collections.emptyList();
}
try {
final ObjectId oid = repo.resolve(Constants.HEAD);
final PlotWalk pw = new PlotWalk(repo);
final RevCommit rc = pw.parseCommit(oid);
toChangeSummary(rc);
pw.markStart(rc);
final String filepath = relativize(f);
logger.info("Getting changelog for: {} (start: {}, length: {})", filepath, start, length);
if (!isEmpty(filepath) && !filepath.equals("/")) {
pw.setTreeFilter(AndTreeFilter.create(PathFilter.create(filepath), TreeFilter.ANY_DIFF));
} else {
pw.setTreeFilter(TreeFilter.ANY_DIFF);
}
final List<ChangeSummary> changelogs = new ArrayList<ChangeSummary>();
int count = 0;
final int stop = length > 0 ? length + 1 : 0;
RevCommit commit = null;
while ((commit = pw.next()) != null && (stop < 1 || count < stop)) {
if (count < start) {
count++;
continue;
}
changelogs.add(toChangeSummary(commit));
count++;
}
if (length < -1) {
final int remove = (-1 * length) - 1;
for (int i = 0; i < remove; i++) {
changelogs.remove(changelogs.size() - 1);
}
}
return changelogs;
} catch (RevisionSyntaxException | IOException e) {
throw new GitSubsystemException("Failed to resolve HEAD commit for: %s. Reason: %s", e, f, e.getMessage());
}
});
}
Aggregations