private boolean cherryPick(
      HttpServletRequest request,
      HttpServletResponse response,
      Repository db,
      String commitToCherryPick)
      throws ServletException, JSONException {
    RevWalk revWalk = new RevWalk(db);
    try {

      Ref headRef = db.getRef(Constants.HEAD);
      if (headRef == null)
        return statusHandler.handleRequest(
            request,
            response,
            new ServerStatus(
                IStatus.ERROR,
                HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                "An error occured when cherry-picking.",
                null));
      RevCommit head = revWalk.parseCommit(headRef.getObjectId());

      ObjectId objectId = db.resolve(commitToCherryPick);
      Git git = new Git(db);
      CherryPickResult cherryPickResult = git.cherryPick().include(objectId).call();
      RevCommit newHead = cherryPickResult.getNewHead();

      JSONObject result = new JSONObject();
      result.put(GitConstants.KEY_RESULT, cherryPickResult.getStatus().name());
      result.put(GitConstants.KEY_HEAD_UPDATED, !head.equals(newHead));
      OrionServlet.writeJSONResponse(
          request, response, result, JsonURIUnqualificationStrategy.ALL_NO_GIT);
      return true;
    } catch (IOException e) {
      return statusHandler.handleRequest(
          request,
          response,
          new ServerStatus(
              IStatus.ERROR,
              HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
              "An error occured when cherry-picking.",
              e));
    } catch (GitAPIException e) {
      return statusHandler.handleRequest(
          request,
          response,
          new ServerStatus(
              IStatus.ERROR,
              HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
              "An error occured when cherry-picking.",
              e));
    } finally {
      revWalk.release();
    }
  }
  private boolean revert(
      HttpServletRequest request,
      HttpServletResponse response,
      Repository db,
      String commitToRevert)
      throws ServletException, JSONException {
    RevWalk revWalk = new RevWalk(db);
    try {

      Ref headRef = db.getRef(Constants.HEAD);
      if (headRef == null)
        return statusHandler.handleRequest(
            request,
            response,
            new ServerStatus(
                IStatus.ERROR,
                HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                "An error occured when reverting.",
                null));

      ObjectId objectId = db.resolve(commitToRevert);
      Git git = new Git(db);

      RevertCommand revertCommand = git.revert().include(objectId);
      RevCommit revertedCommit = revertCommand.call();

      if (revertedCommit == null) {
        JSONObject result = new JSONObject();
        result.put(GitConstants.KEY_RESULT, "FAILURE"); // $NON-NLS-1$
        OrionServlet.writeJSONResponse(
            request, response, result, JsonURIUnqualificationStrategy.ALL_NO_GIT);
        return true;
      }

      JSONObject result = new JSONObject();
      result.put(GitConstants.KEY_RESULT, "OK"); // $NON-NLS-1$
      OrionServlet.writeJSONResponse(
          request, response, result, JsonURIUnqualificationStrategy.ALL_NO_GIT);
      return true;
    } catch (IOException e) {
      return statusHandler.handleRequest(
          request,
          response,
          new ServerStatus(
              IStatus.ERROR,
              HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
              "An error occured when reverting.",
              e));
    } catch (GitAPIException e) {
      return statusHandler.handleRequest(
          request,
          response,
          new ServerStatus(
              IStatus.ERROR,
              HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
              "An error occured when reverting.",
              e));
    } finally {
      revWalk.release();
    }
  }
  private boolean handleGetCommitLog(
      HttpServletRequest request,
      HttpServletResponse response,
      IPath filePath,
      Repository db,
      String refIdsRange,
      String pattern)
      throws AmbiguousObjectException, IOException, ServletException, JSONException,
          URISyntaxException, CoreException {
    int page =
        request.getParameter("page") != null
            ? new Integer(request.getParameter("page")).intValue()
            : 0; //$NON-NLS-1$ //$NON-NLS-2$
    int pageSize =
        request.getParameter("pageSize") != null
            ? new Integer(request.getParameter("pageSize")).intValue()
            : PAGE_SIZE; //$NON-NLS-1$ //$NON-NLS-2$

    ObjectId toObjectId = null;
    ObjectId fromObjectId = null;

    Ref toRefId = null;
    Ref fromRefId = null;

    if (refIdsRange != null) {
      // git log <since>..<until>
      if (refIdsRange.contains("..")) { // $NON-NLS-1$
        String[] commits = refIdsRange.split("\\.\\."); // $NON-NLS-1$
        if (commits.length != 2) {
          String msg = NLS.bind("Failed to generate commit log for ref {0}", refIdsRange);
          return statusHandler.handleRequest(
              request,
              response,
              new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, msg, null));
        }

        fromObjectId = db.resolve(commits[0]);
        fromRefId = db.getRef(commits[0]);
        if (fromObjectId == null) {
          String msg = NLS.bind("Failed to generate commit log for ref {0}", commits[0]);
          return statusHandler.handleRequest(
              request,
              response,
              new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, msg, null));
        }

        toObjectId = db.resolve(commits[1]);
        toRefId = db.getRef(commits[1]);
        if (toObjectId == null) {
          String msg = NLS.bind("No ref or commit found: {0}", commits[1]);
          return statusHandler.handleRequest(
              request,
              response,
              new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_NOT_FOUND, msg, null));
        }
      } else {
        toObjectId = db.resolve(refIdsRange);
        toRefId = db.getRef(refIdsRange);
        if (toObjectId == null) {
          String msg = NLS.bind("No ref or commit found: {0}", refIdsRange);
          return statusHandler.handleRequest(
              request,
              response,
              new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_NOT_FOUND, msg, null));
        }
      }
      toObjectId = getCommitObjectId(db, toObjectId);
    }

    URI baseLocation = getURI(request);
    URI cloneLocation =
        BaseToCloneConverter.getCloneLocation(
            baseLocation,
            refIdsRange == null
                ? BaseToCloneConverter.COMMIT
                : BaseToCloneConverter.COMMIT_REFRANGE);

    LogJob job =
        new LogJob(
            TaskJobHandler.getUserId(request),
            filePath,
            cloneLocation,
            page,
            pageSize,
            toObjectId,
            fromObjectId,
            toRefId,
            fromRefId,
            refIdsRange,
            pattern);
    return TaskJobHandler.handleTaskJob(
        request, response, job, statusHandler, JsonURIUnqualificationStrategy.ALL_NO_GIT);
  }