From 5467185db0fe31558dbb57f08135c316861a86b1 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 26 Jul 2021 15:28:01 -0400 Subject: [PATCH] list: add a --relative-to option The current list output only shows project paths relative to the root of the repo client checkout. It can be helpful to also get a listing of paths based on other paths (e.g. the current working directory), so add an option to repo list to support that. We'll leverage this in bash completion to support completing projects by their local paths and not just remote names. Bug: https://crbug.com/gerrit/14797 Change-Id: Ia2b35d18c890217768448118b003874a1016efd4 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/312904 Reviewed-by: Xin Li Tested-by: Mike Frysinger --- completion.bash | 1 + man/repo-list.1 | 12 ++++++++---- subcmds/list.py | 16 +++++++++++++--- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/completion.bash b/completion.bash index 04347ce3..6a5bfe1c 100644 --- a/completion.bash +++ b/completion.bash @@ -37,6 +37,7 @@ __complete_repo_list_branches() { __complete_repo_list_projects() { local repo=${COMP_WORDS[0]} "${repo}" list -n 2>/dev/null + "${repo}" list -p --relative-to=. 2>/dev/null } # Complete the repo argument. diff --git a/man/repo-list.1 b/man/repo-list.1 index a86315ae..7f85e612 100644 --- a/man/repo-list.1 +++ b/man/repo-list.1 @@ -27,15 +27,19 @@ project is in \fB\-a\fR, \fB\-\-all\fR show projects regardless of checkout state .TP -\fB\-f\fR, \fB\-\-fullpath\fR -display the full work tree path instead of the -relative path -.TP \fB\-n\fR, \fB\-\-name\-only\fR display only the name of the repository .TP \fB\-p\fR, \fB\-\-path\-only\fR display only the path of the repository +.TP +\fB\-f\fR, \fB\-\-fullpath\fR +display the full work tree path instead of the +relative path +.TP +\fB\-\-relative\-to\fR=\fI\,PATH\/\fR +display paths relative to this one (default: top of +repo client checkout) .SS Logging options: .TP \fB\-v\fR, \fB\-\-verbose\fR diff --git a/subcmds/list.py b/subcmds/list.py index 8d0c5640..6adf85b7 100644 --- a/subcmds/list.py +++ b/subcmds/list.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os + from command import Command, MirrorSafeCommand @@ -43,20 +45,26 @@ This is similar to running: repo forall -c 'echo "$REPO_PATH : $REPO_PROJECT"'. p.add_option('-a', '--all', action='store_true', help='show projects regardless of checkout state') - p.add_option('-f', '--fullpath', - dest='fullpath', action='store_true', - help='display the full work tree path instead of the relative path') p.add_option('-n', '--name-only', dest='name_only', action='store_true', help='display only the name of the repository') p.add_option('-p', '--path-only', dest='path_only', action='store_true', help='display only the path of the repository') + p.add_option('-f', '--fullpath', + dest='fullpath', action='store_true', + help='display the full work tree path instead of the relative path') + p.add_option('--relative-to', metavar='PATH', + help='display paths relative to this one (default: top of repo client checkout)') def ValidateOptions(self, opt, args): if opt.fullpath and opt.name_only: self.OptionParser.error('cannot combine -f and -n') + # Resolve any symlinks so the output is stable. + if opt.relative_to: + opt.relative_to = os.path.realpath(opt.relative_to) + def Execute(self, opt, args): """List all projects and the associated directories. @@ -76,6 +84,8 @@ This is similar to running: repo forall -c 'echo "$REPO_PATH : $REPO_PROJECT"'. def _getpath(x): if opt.fullpath: return x.worktree + if opt.relative_to: + return os.path.relpath(x.worktree, opt.relative_to) return x.relpath lines = []