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
This commit is contained in:
Anatol Pomazau 2011-05-24 06:50:38 -07:00
parent 7f84ef2379
commit 3739569aad
2 changed files with 45 additions and 13 deletions

View File

@ -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::

View File

@ -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();
}