gerrit源码分析之ls-user-refs命令的实现

本文深入剖析了Gerrit 2.15.1版本中ls-user-refs SSH命令的实现,主要讨论了LsUserRefs类,包括其上的@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)、@CommandMetaData注解,以及继承自SshCommand的结构,同时还涉及到了@Inject依赖注入和@Option注解的应用,最后详细阐述了run()方法的功能。
摘要由CSDN通过智能技术生成

今天我们讲讲gerrit 的 ssh 命令的 ls-user-refs命令的实现的实现,采用的代码是gerrit的 stable2.15 分支的,因为我们使用的版本是 2.15.1的。

LsUserRefs 类详解

这个命令在 com.google.gerrit.sshd.commands.LsUserRefs 类中,
@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
@CommandMetaData(
    name = "ls-user-refs",
    description = "List refs visible to a specific user",
    runsAt = MASTER_OR_SLAVE)
public class LsUserRefs extends SshCommand {
  @Inject private AccountResolver accountResolver;
  @Inject private OneOffRequestContext requestContext;
  @Inject private VisibleRefFilter.Factory refFilterFactory;
  @Inject private GitRepositoryManager repoManager;

  @Option(
      name = "--project",
      aliases = {"-p"},
      metaVar = "PROJECT",
      required = true,
      usage = "project for which the refs should be listed")
  private ProjectControl projectControl;

  @Option(
      name = "--user",
      aliases = {"-u"},
      metaVar = "USER",
      required = true,
      usage = "user for which the groups should be listed")
  private String userName;

  @Option(name = "--only-refs-heads", usage = "list only refs under refs/heads")
  private boolean onlyRefsHeads;

  @Override
  protected void run() throws Failure {
    Account userAccount;
    try {
      userAccount = accountResolver.find(userName);
    } catch (OrmException | IOException | ConfigInvalidException e) {
      throw die(e);
    }
    if (userAccount == null) {
      stdout.print("No single user could be found when searching for: " + userName + '\n');
      stdout.flush();
      return;
    }

    Project.NameKey projectName = projectControl.getProject().getNameKey();
    try (Repository repo = repoManager.openRepository(projectName);
        ManualRequestContext ctx = requestContext.openAs(userAccount.getId())) {
      try {
        Map<String, Ref> refsMap =
            refFilterFactory
                .create(projectControl.getProjectState(), repo)
                .filter(repo.getRefDatabase().getRefs(ALL), false);

        for (String ref : refsMap.keySet()) {
          if (!onlyRefsHeads || ref.startsWith(RefNames.REFS_HEADS)) {
            stdout.println(ref);
          }
        }
      } catch (IOException e) {
        throw new Failure(1, "fatal: Error reading refs: '" + pro
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值