diff options
author | Anatol Pomazau <anatol@google.com> | 2011-05-24 06:50:38 -0700 |
---|---|---|
committer | Anatol Pomazau <anatol@google.com> | 2011-05-24 11:14:03 -0700 |
commit | 3739569aad5153cc33ae59f3a1ad98b848fe5fad (patch) | |
tree | ee951ca9a5daebf6bc3fa2e4625e75d3f7b2ebca | |
parent | 7f84ef2379f5882316f57df4eca60eaf9e7683bd (diff) |
Implement multiple branches in ls-project
Allow users request SHA1 of multiple branches per command:
$ ssh -p 29418 review.example.com gerrit ls-projects -b eclair -b gingerbread
In case if a branch is not visible or does not exists then stub is shown. Here is
a sample of the command output:
---------------------------------------- d8a9e45c7ec6ff97b44fdbd0b21cabdb69f5f15b foo
---------------------------------------- 87e4297f8f508e9b73863b27c25a551a4d4b5ed5 bar
a7e9587229246f6eb876795bc45a09c17b3bed51 862b2ce84f38e93a50d29510e713475f11228b28 baz
405cd3f5d7df7bae701b313dad9ce2ef797eb754 6a7eb2f0c885d03320b58afb662ee4fc14659063 hello
---------------------------------------- 782effdaeba782a656f799c9584dcc82fbfb7fa7 world
b8240b951de6c03f72278dd3d7790c2355878197 e8099cc12a3b64aa4e58b319e61f0190e27bd3ac kext
Change-Id: Ib05a6fc770ed0b70a3c180b2a41bec5e95a7117b
-rw-r--r-- | Documentation/cmd-ls-projects.txt | 10 | ||||
-rw-r--r-- | gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjects.java | 48 |
2 files changed, 45 insertions, 13 deletions
diff --git a/Documentation/cmd-ls-projects.txt b/Documentation/cmd-ls-projects.txt index 1e7b4cc7ce..2134df8319 100644 --- a/Documentation/cmd-ls-projects.txt +++ b/Documentation/cmd-ls-projects.txt @@ -8,7 +8,7 @@ gerrit ls-projects - List projects visible to caller SYNOPSIS -------- [verse] -'ssh' -p <port> <host> 'gerrit ls-projects' [\--show-branch <BRANCH>] +'ssh' -p <port> <host> 'gerrit ls-projects' [\--show-branch <BRANCH1> ...] DESCRIPTION ----------- @@ -30,7 +30,13 @@ OPTIONS ------- \--show-branch:: \-b:: - Name of the branch for which the command will display the sha of each project. + Branch for which the command will display the sha of each project. + The command may have multiple \--show-branch parameters, in this case + sha will be shown for each of the branches. + If the user does not have READ access to some branch or the branch does not + exist then stub (forty '\-' symbols) is shown. + If the user does not have access to any branch in the project then the + whole project is not shown. \--tree:: \-t:: diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjects.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjects.java index b70b743844..d38794913d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjects.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjects.java @@ -49,8 +49,9 @@ final class ListProjects extends BaseCommand { @Inject private GitRepositoryManager repoManager; - @Option(name = "--show-branch", aliases = {"-b"}, usage = "displays the sha of each project in the specified branch") - private String showBranch; + @Option(name = "--show-branch", aliases = {"-b"}, multiValued = true, + usage = "displays the sha of each project in the specified branch") + private List<String> showBranch; @Option(name = "--tree", aliases = {"-t"}, usage = "displays project inheritance in a tree-like format\n" + "this option does not work together with the show-branch option") @@ -102,16 +103,37 @@ final class ListProjects extends BaseCommand { } if (showBranch != null) { - final Ref ref = getBranchRef(projectName); - if (ref == null || ref.getObjectId() == null - || !pctl.controlForRef(ref.getLeaf().getName()).isVisible()) { - // No branch, or the user can't see this branch, so skip it. - // + final List<Ref> refs = getBranchRefs(projectName); + if (refs == null) { continue; } - stdout.print(ref.getObjectId().name()); - stdout.print(' '); + boolean hasVisibleRefs = false; + for (int i = 0; i < refs.size(); i++) { + Ref ref = refs.get(i); + if (ref == null + || ref.getObjectId() == null + || !pctl.controlForRef(ref.getLeaf().getName()).isVisible()) { + // No branch, or the user can't see this branch, so remove it. + refs.set(i, null); + } else { + hasVisibleRefs = true; + } + } + + if (!hasVisibleRefs) { + continue; + } + + for (Ref ref : refs) { + if (ref == null) { + // Print stub (forty '-' symbols) + stdout.print("----------------------------------------"); + } else { + stdout.print(ref.getObjectId().name()); + } + stdout.print(' '); + } } stdout.print(projectName.get() + "\n"); @@ -151,11 +173,15 @@ final class ListProjects extends BaseCommand { } } - private Ref getBranchRef(Project.NameKey projectName) { + private List<Ref> getBranchRefs(Project.NameKey projectName) { try { final Repository r = repoManager.openRepository(projectName); try { - return r.getRef(showBranch); + final List<Ref> result = new ArrayList<Ref>(showBranch.size()); + for (String branch : showBranch) { + result.add(r.getRef(branch)); + } + return result; } finally { r.close(); } |