Package org.eclipse.jgit.transport

Examples of org.eclipse.jgit.transport.ReceiveCommand


      return;
    }

    ReceiveCommandEvent branchUpdate = (ReceiveCommandEvent) event;
    RepositoryModel repository = branchUpdate.model;
    ReceiveCommand cmd = branchUpdate.cmd;
    try {
      switch (cmd.getType()) {
      case CREATE:
      case UPDATE_NONFASTFORWARD:
        // reindex everything
        reindex(repository);
        break;
      case UPDATE:
        // incrementally index ticket updates
        resetCaches(repository);
        long start = System.nanoTime();
        log.info("incrementally indexing {} ticket branch due to received ref update", repository.name);
        Repository db = repositoryManager.getRepository(repository.name);
        try {
          Set<Long> ids = new HashSet<Long>();
          List<PathChangeModel> paths = JGitUtils.getFilesInRange(db,
              cmd.getOldId().getName(), cmd.getNewId().getName());
          for (PathChangeModel path : paths) {
            String name = path.name.substring(path.name.lastIndexOf('/') + 1);
            if (!JOURNAL.equals(name)) {
              continue;
            }
            String tid = path.path.split("/")[2];
            long ticketId = Long.parseLong(tid);
            if (!ids.contains(ticketId)) {
              ids.add(ticketId);
              TicketModel ticket = getTicket(repository, ticketId);
              log.info(MessageFormat.format("indexing ticket #{0,number,0}: {1}",
                  ticketId, ticket.title));
              indexer.index(ticket);
            }
          }
          long end = System.nanoTime();
          log.info("incremental indexing of {0} ticket(s) completed in {1} msecs",
              ids.size(), TimeUnit.NANOSECONDS.toMillis(end - start));
        } finally {
          db.close();
        }
        break;
      default:
        log.warn("Unexpected receive type {} in BranchTicketService.onRefsChanged" + cmd.getType());
        break;
      }
    } catch (Exception e) {
      log.error("failed to reindex " + repository.name, e);
    }
View Full Code Here


    BatchRefUpdate batch = getRepository().getRefDatabase().newBatchUpdate();
    batch.setAllowNonFastForwards(isAllowNonFastForwards());
    batch.setRefLogIdent(getRefLogIdent());
    batch.setRefLogMessage("push", true);

    ReceiveCommand patchsetRefCmd = null;
    PatchsetCommand patchsetCmd = null;
    for (ReceiveCommand cmd : toApply) {
      if (Result.NOT_ATTEMPTED != cmd.getResult()) {
        // Already rejected by the core receive process.
        continue;
      }

      if (isPatchsetRef(cmd.getRefName()) && processPatchsets) {

        if (ticketService == null) {
          sendRejection(cmd, "Sorry, the ticket service is unavailable and can not accept patchsets at this time.");
          continue;
        }

        if (!ticketService.isReady()) {
          sendRejection(cmd, "Sorry, the ticket service can not accept patchsets at this time.");
          continue;
        }

        if (UserModel.ANONYMOUS.equals(user)) {
          // server allows anonymous pushes, but anonymous patchset
          // contributions are prohibited by design
          sendRejection(cmd, "Sorry, anonymous patchset contributions are prohibited.");
          continue;
        }

        final Matcher m = NEW_PATCHSET.matcher(cmd.getRefName());
        if (m.matches()) {
          // prohibit pushing directly to a patchset ref
          long id = getTicketId(cmd.getRefName());
          sendError("You may not directly push directly to a patchset ref!");
          sendError("Instead, please push to one the following:");
          sendError(" - {0}{1,number,0}", Constants.R_FOR, id);
          sendError(" - {0}{1,number,0}", Constants.R_TICKET, id);
          sendRejection(cmd, "protected ref");
          continue;
        }

        if (hasRefNamespace(Constants.R_FOR)) {
          // the refs/for/ namespace exists and it must not
          LOGGER.error("{} already has refs in the {} namespace",
              repository.name, Constants.R_FOR);
          sendRejection(cmd, "Sorry, a repository administrator will have to remove the {} namespace", Constants.R_FOR);
          continue;
        }

        if (cmd.getNewId().equals(ObjectId.zeroId())) {
          // ref deletion request
          if (cmd.getRefName().startsWith(Constants.R_TICKET)) {
            if (user.canDeleteRef(repository)) {
              batch.addCommand(cmd);
            } else {
              sendRejection(cmd, "Sorry, you do not have permission to delete {}", cmd.getRefName());
            }
          } else {
            sendRejection(cmd, "Sorry, you can not delete {}", cmd.getRefName());
          }
          continue;
        }

        if (patchsetRefCmd != null) {
          sendRejection(cmd, "You may only push one patchset at a time.");
          continue;
        }

        LOGGER.info(MessageFormat.format("Verifying {0} push ref \"{1}\" received from {2}",
            repository.name, cmd.getRefName(), user.username));

        // responsible verification
        String responsible = PatchsetCommand.getSingleOption(cmd, PatchsetCommand.RESPONSIBLE);
        if (!StringUtils.isEmpty(responsible)) {
          UserModel assignee = gitblit.getUserModel(responsible);
          if (assignee == null) {
            // no account by this name
            sendRejection(cmd, "{0} can not be assigned any tickets because there is no user account by that name", responsible);
            continue;
          } else if (!assignee.canPush(repository)) {
            // account does not have RW permissions
            sendRejection(cmd, "{0} ({1}) can not be assigned any tickets because the user does not have RW permissions for {2}",
                assignee.getDisplayName(), assignee.username, repository.name);
            continue;
          }
        }

        // milestone verification
        String milestone = PatchsetCommand.getSingleOption(cmd, PatchsetCommand.MILESTONE);
        if (!StringUtils.isEmpty(milestone)) {
          TicketMilestone milestoneModel = ticketService.getMilestone(repository, milestone);
          if (milestoneModel == null) {
            // milestone does not exist
            sendRejection(cmd, "Sorry, \"{0}\" is not a valid milestone!", milestone);
            continue;
          }
        }

        // watcher verification
        List<String> watchers = PatchsetCommand.getOptions(cmd, PatchsetCommand.WATCH);
        if (!ArrayUtils.isEmpty(watchers)) {
          boolean verified = true;
          for (String watcher : watchers) {
            UserModel user = gitblit.getUserModel(watcher);
            if (user == null) {
              // watcher does not exist
              sendRejection(cmd, "Sorry, \"{0}\" is not a valid username for the watch list!", watcher);
              verified = false;
              break;
            }
          }
          if (!verified) {
            continue;
          }
        }

        patchsetRefCmd = cmd;
        patchsetCmd = preparePatchset(cmd);
        if (patchsetCmd != null) {
          batch.addCommand(patchsetCmd);
        }
        continue;
      }

      batch.addCommand(cmd);
    }

    if (!batch.getCommands().isEmpty()) {
      try {
        batch.execute(getRevWalk(), updating);
      } catch (IOException err) {
        for (ReceiveCommand cmd : toApply) {
          if (cmd.getResult() == Result.NOT_ATTEMPTED) {
            sendRejection(cmd, "lock error: {0}", err.getMessage());
            LOGGER.error(MessageFormat.format("failed to lock {0}:{1}",
                repository.name, cmd.getRefName()), err);
          }
        }
      }
    }

    //
    // set the results into the patchset ref receive command
    //
    if (patchsetRefCmd != null && patchsetCmd != null) {
      if (!patchsetCmd.getResult().equals(Result.OK)) {
        // patchset command failed!
        LOGGER.error(patchsetCmd.getType() + " " + patchsetCmd.getRefName()
            + " " + patchsetCmd.getResult());
        patchsetRefCmd.setResult(patchsetCmd.getResult(), patchsetCmd.getMessage());
      } else {
        // all patchset commands were applied
        patchsetRefCmd.setResult(Result.OK);

        // update the ticket branch ref
        RefUpdate ru = updateRef(
            patchsetCmd.getTicketBranch(),
            patchsetCmd.getNewId(),
View Full Code Here

        sendInfo(ticketService.getTicketUrl(ticket));
        sendInfo("");

        // log the new patch ref
        RefLogUtils.updateRefLog(user, getRepository(),
            Arrays.asList(new ReceiveCommand(cmd.getOldId(), cmd.getNewId(), cmd.getRefName())));

        // call any patchset hooks
        for (PatchsetHook hook : gitblit.getExtensions(PatchsetHook.class)) {
          try {
            hook.onNewPatchset(ticket);
          } catch (Exception e) {
            LOGGER.error("Failed to execute extension", e);
          }
        }

        return ticket;
      } else {
        sendError("FAILED to create ticket");
      }
    } else {
      // update an existing ticket
      TicketModel ticket = ticketService.updateTicket(repository, cmd.getTicketId(), change);
      if (ticket != null) {
        sendInfo("");
        sendHeader("#{0,number,0}: {1}", ticket.number, StringUtils.trimString(ticket.title, Constants.LEN_SHORTLOG));
        if (change.patchset.rev == 1) {
          // new patchset
          sendInfo("uploaded patchset {0} ({1})", change.patchset.number, change.patchset.type.toString());
        } else {
          // updated patchset
          sendInfo("added {0} {1} to patchset {2}",
              change.patchset.added,
              change.patchset.added == 1 ? "commit" : "commits",
              change.patchset.number);
        }
        sendInfo(ticketService.getTicketUrl(ticket));
        sendInfo("");

        // log the new patchset ref
        RefLogUtils.updateRefLog(user, getRepository(),
          Arrays.asList(new ReceiveCommand(cmd.getOldId(), cmd.getNewId(), cmd.getRefName())));

        // call any patchset hooks
        final boolean isNewPatchset = change.patchset.rev == 1;
        for (PatchsetHook hook : gitblit.getExtensions(PatchsetHook.class)) {
          try {
View Full Code Here

    default:
      LOGGER.error(MessageFormat.format("unexpected ref update type {0} for {1}",
          ru.getResult(), ru.getName()));
      return;
    }
    ReceiveCommand cmd = new ReceiveCommand(ru.getOldObjectId(), ru.getNewObjectId(), ru.getName(), type);
    RefLogUtils.updateRefLog(user, getRepository(), Arrays.asList(cmd));
  }
View Full Code Here

    if (ticket != null) {
      ticketNotifier.queueMailing(ticket);

      // update the reflog with the merge
      if (oldRef != null) {
        ReceiveCommand cmd = new ReceiveCommand(oldRef.getObjectId(),
            ObjectId.fromString(mergeResult.sha), oldRef.getName());
        RefLogUtils.updateRefLog(user, getRepository(), Arrays.asList(cmd));
      }

      // call patchset hooks
View Full Code Here

      List<RevCommit> log = JGitUtils.getRevLog(repository, reflogBranch.getName(), ref.getName(), 0, 1);
      if (log.isEmpty()) {
        // this ref is not in the reflog branch
        return false;
      }
      ReceiveCommand cmd = new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), ref.getName());
      return updateRefLog(user, repository, Arrays.asList(cmd));
    } catch (Throwable t) {
      error(t, repository, "Failed to commit reflog entry to {0}");
    }
    return false;
View Full Code Here

    BatchRefUpdate batch = getRepository().getRefDatabase().newBatchUpdate();
    batch.setAllowNonFastForwards(isAllowNonFastForwards());
    batch.setRefLogIdent(getRefLogIdent());
    batch.setRefLogMessage("push", true);

    ReceiveCommand patchsetRefCmd = null;
    PatchsetCommand patchsetCmd = null;
    for (ReceiveCommand cmd : toApply) {
      if (Result.NOT_ATTEMPTED != cmd.getResult()) {
        // Already rejected by the core receive process.
        continue;
      }

      if (isPatchsetRef(cmd.getRefName()) && processPatchsets) {

        if (ticketService == null) {
          sendRejection(cmd, "Sorry, the ticket service is unavailable and can not accept patchsets at this time.");
          continue;
        }

        if (!ticketService.isReady()) {
          sendRejection(cmd, "Sorry, the ticket service can not accept patchsets at this time.");
          continue;
        }

        if (UserModel.ANONYMOUS.equals(user)) {
          // server allows anonymous pushes, but anonymous patchset
          // contributions are prohibited by design
          sendRejection(cmd, "Sorry, anonymous patchset contributions are prohibited.");
          continue;
        }

        final Matcher m = NEW_PATCHSET.matcher(cmd.getRefName());
        if (m.matches()) {
          // prohibit pushing directly to a patchset ref
          long id = getTicketId(cmd.getRefName());
          sendError("You may not directly push directly to a patchset ref!");
          sendError("Instead, please push to one the following:");
          sendError(" - {0}{1,number,0}", Constants.R_FOR, id);
          sendError(" - {0}{1,number,0}", Constants.R_TICKET, id);
          sendRejection(cmd, "protected ref");
          continue;
        }

        if (hasRefNamespace(Constants.R_FOR)) {
          // the refs/for/ namespace exists and it must not
          LOGGER.error("{} already has refs in the {} namespace",
              repository.name, Constants.R_FOR);
          sendRejection(cmd, "Sorry, a repository administrator will have to remove the {} namespace", Constants.R_FOR);
          continue;
        }

        if (cmd.getNewId().equals(ObjectId.zeroId())) {
          // ref deletion request
          if (cmd.getRefName().startsWith(Constants.R_TICKET)) {
            if (user.canDeleteRef(repository)) {
              batch.addCommand(cmd);
            } else {
              sendRejection(cmd, "Sorry, you do not have permission to delete {}", cmd.getRefName());
            }
          } else {
            sendRejection(cmd, "Sorry, you can not delete {}", cmd.getRefName());
          }
          continue;
        }

        if (patchsetRefCmd != null) {
          sendRejection(cmd, "You may only push one patchset at a time.");
          continue;
        }

        LOGGER.info(MessageFormat.format("Verifying {0} push ref \"{1}\" received from {2}",
            repository.name, cmd.getRefName(), user.username));

        // responsible verification
        String responsible = PatchsetCommand.getSingleOption(cmd, PatchsetCommand.RESPONSIBLE);
        if (!StringUtils.isEmpty(responsible)) {
          UserModel assignee = gitblit.getUserModel(responsible);
          if (assignee == null) {
            // no account by this name
            sendRejection(cmd, "{0} can not be assigned any tickets because there is no user account by that name", responsible);
            continue;
          } else if (!assignee.canPush(repository)) {
            // account does not have RW permissions
            sendRejection(cmd, "{0} ({1}) can not be assigned any tickets because the user does not have RW permissions for {2}",
                assignee.getDisplayName(), assignee.username, repository.name);
            continue;
          }
        }

        // milestone verification
        String milestone = PatchsetCommand.getSingleOption(cmd, PatchsetCommand.MILESTONE);
        if (!StringUtils.isEmpty(milestone)) {
          TicketMilestone milestoneModel = ticketService.getMilestone(repository, milestone);
          if (milestoneModel == null) {
            // milestone does not exist
            sendRejection(cmd, "Sorry, \"{0}\" is not a valid milestone!", milestone);
            continue;
          }
        }

        // watcher verification
        List<String> watchers = PatchsetCommand.getOptions(cmd, PatchsetCommand.WATCH);
        if (!ArrayUtils.isEmpty(watchers)) {
          boolean verified = true;
          for (String watcher : watchers) {
            UserModel user = gitblit.getUserModel(watcher);
            if (user == null) {
              // watcher does not exist
              sendRejection(cmd, "Sorry, \"{0}\" is not a valid username for the watch list!", watcher);
              verified = false;
              break;
            }
          }
          if (!verified) {
            continue;
          }
        }

        patchsetRefCmd = cmd;
        patchsetCmd = preparePatchset(cmd);
        if (patchsetCmd != null) {
          batch.addCommand(patchsetCmd);
        }
        continue;
      }

      batch.addCommand(cmd);
    }

    if (!batch.getCommands().isEmpty()) {
      try {
        batch.execute(getRevWalk(), updating);
      } catch (IOException err) {
        for (ReceiveCommand cmd : toApply) {
          if (cmd.getResult() == Result.NOT_ATTEMPTED) {
            sendRejection(cmd, "lock error: {0}", err.getMessage());
            LOGGER.error(MessageFormat.format("failed to lock {0}:{1}",
                repository.name, cmd.getRefName()), err);
          }
        }
      }
    }

    //
    // set the results into the patchset ref receive command
    //
    if (patchsetRefCmd != null && patchsetCmd != null) {
      if (!patchsetCmd.getResult().equals(Result.OK)) {
        // patchset command failed!
        LOGGER.error(patchsetCmd.getType() + " " + patchsetCmd.getRefName()
            + " " + patchsetCmd.getResult());
        patchsetRefCmd.setResult(patchsetCmd.getResult(), patchsetCmd.getMessage());
      } else {
        // all patchset commands were applied
        patchsetRefCmd.setResult(Result.OK);

        // update the ticket branch ref
        RefUpdate ru = updateRef(
            patchsetCmd.getTicketBranch(),
            patchsetCmd.getNewId(),
View Full Code Here

        sendInfo(ticketService.getTicketUrl(ticket));
        sendInfo("");

        // log the new patch ref
        RefLogUtils.updateRefLog(user, getRepository(),
            Arrays.asList(new ReceiveCommand(cmd.getOldId(), cmd.getNewId(), cmd.getRefName())));

        // call any patchset hooks
        for (PatchsetHook hook : gitblit.getExtensions(PatchsetHook.class)) {
          try {
            hook.onNewPatchset(ticket);
          } catch (Exception e) {
            LOGGER.error("Failed to execute extension", e);
          }
        }

        return ticket;
      } else {
        sendError("FAILED to create ticket");
      }
    } else {
      // update an existing ticket
      TicketModel ticket = ticketService.updateTicket(repository, cmd.getTicketId(), change);
      if (ticket != null) {
        sendInfo("");
        sendHeader("#{0,number,0}: {1}", ticket.number, StringUtils.trimString(ticket.title, Constants.LEN_SHORTLOG));
        if (change.patchset.rev == 1) {
          // new patchset
          sendInfo("uploaded patchset {0} ({1})", change.patchset.number, change.patchset.type.toString());
        } else {
          // updated patchset
          sendInfo("added {0} {1} to patchset {2}",
              change.patchset.added,
              change.patchset.added == 1 ? "commit" : "commits",
              change.patchset.number);
        }
        sendInfo(ticketService.getTicketUrl(ticket));
        sendInfo("");

        // log the new patchset ref
        RefLogUtils.updateRefLog(user, getRepository(),
          Arrays.asList(new ReceiveCommand(cmd.getOldId(), cmd.getNewId(), cmd.getRefName())));

        // call any patchset hooks
        final boolean isNewPatchset = change.patchset.rev == 1;
        for (PatchsetHook hook : gitblit.getExtensions(PatchsetHook.class)) {
          try {
View Full Code Here

    default:
      LOGGER.error(MessageFormat.format("unexpected ref update type {0} for {1}",
          ru.getResult(), ru.getName()));
      return;
    }
    ReceiveCommand cmd = new ReceiveCommand(ru.getOldObjectId(), ru.getNewObjectId(), ru.getName(), type);
    RefLogUtils.updateRefLog(user, getRepository(), Arrays.asList(cmd));
  }
View Full Code Here

    ticket = ticketService.updateTicket(repository, ticket.number, change);
    if (ticket != null) {
      ticketNotifier.queueMailing(ticket);

      if (oldRef != null) {
        ReceiveCommand cmd = new ReceiveCommand(oldRef.getObjectId(),
            ObjectId.fromString(mergeResult.sha), oldRef.getName());
        cmd.setResult(Result.OK);
        List<ReceiveCommand> commands = Arrays.asList(cmd);

        logRefChange(commands);
        updateIncrementalPushTags(commands);
        updateGitblitRefLog(commands);
View Full Code Here

TOP

Related Classes of org.eclipse.jgit.transport.ReceiveCommand

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.