summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnatol Pomazau <anatol@google.com>2011-05-24 06:50:38 -0700
committerAnatol Pomazau <anatol@google.com>2011-05-24 11:14:03 -0700
commit3739569aad5153cc33ae59f3a1ad98b848fe5fad (patch)
treeee951ca9a5daebf6bc3fa2e4625e75d3f7b2ebca
parent7f84ef2379f5882316f57df4eca60eaf9e7683bd (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.txt10
-rw-r--r--gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjects.java48
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();
}