Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions revup/completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,26 +41,26 @@ def default_rc_file(self) -> str:
}


def topic_completer(
prefix: str, parsed_args: Optional[argparse.Namespace] = None, **_kwargs: object
) -> List[str]:
def topic_completer(prefix: str, parsed_args: argparse.Namespace, **_kwargs: object) -> List[str]:
try:
from revup import git, shell, toolkit
from revup import git, toolkit

async def _get_names() -> List[str]:
sh = shell.Shell(quiet=True)
git_ctx = await git.make_git(sh, "", "", "origin", "main", "", False, "")
topics = await toolkit.get_topics(git_ctx)
# Build git and topics exactly as `revup toolkit list-topics` does, so
# completion resolves the same base branch and returns the same topics.
git_ctx = await git.make_git(parsed_args)
base_branch = getattr(parsed_args, "base_branch", None) or ""
relative_branch = getattr(parsed_args, "relative_branch", None) or ""
Comment on lines +52 to +53

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these should be set regardless, but None if not passed? i.e. this can be

Suggested change
base_branch = getattr(parsed_args, "base_branch", None) or ""
relative_branch = getattr(parsed_args, "relative_branch", None) or ""
base_branch = parsed_args.base_branch or ""
relative_branch = parsed_args.relative_branch or ""

topics = await toolkit.get_topics(git_ctx, base_branch, relative_branch)
return [t.name for t in topics.topics.values()]

already = set()
if parsed_args is not None:
for attr in ("topics", "ref_or_topic"):
val = getattr(parsed_args, attr, None)
if isinstance(val, list):
already.update(val)
elif isinstance(val, str):
already.add(val)
for attr in ("topics", "ref_or_topic"):
val = getattr(parsed_args, attr, None)
if isinstance(val, list):
already.update(val)
elif isinstance(val, str):
already.add(val)

return [n for n in asyncio.run(_get_names()) if n.startswith(prefix) and n not in already]
except (OSError, RuntimeError):
Expand Down
21 changes: 11 additions & 10 deletions revup/git.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

import argparse
import asyncio
import copy
import logging
Expand Down Expand Up @@ -116,16 +117,16 @@ def get_default_git() -> str:
return ret


async def make_git(
sh: shell.Shell,
git_path: str = "",
git_version: str = "",
remote_name: str = "",
main_branch: str = "",
base_branch_globs: str = "",
keep_temp: bool = False,
editor: str = "",
) -> "Git":
async def make_git(args: argparse.Namespace) -> "Git":
sh = shell.Shell(not args.verbose)
git_path = args.git_path
git_version = args.git_version
remote_name = args.fork_name if args.fork_name else args.remote_name
main_branch = args.main_branch
base_branch_globs = args.base_branch_globs
keep_temp = args.keep_temp
editor = args.editor

if not git_path:
git_path = get_default_git()

Expand Down
27 changes: 10 additions & 17 deletions revup/revup.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import annotations

import argparse
import asyncio
import logging
import os
import stat
Expand Down Expand Up @@ -108,22 +109,6 @@ async def get_config() -> config.Config:
return conf


async def get_git(args: argparse.Namespace) -> git.Git:
sh = shell.Shell(not args.verbose)
git_ctx = await git.make_git(
sh,
args.git_path,
args.git_version,
args.fork_name if args.fork_name else args.remote_name,
args.main_branch,
args.base_branch_globs,
args.keep_temp,
args.editor,
)

return git_ctx


def dump_args(args: argparse.Namespace) -> None:
if args.verbose:
import json
Expand Down Expand Up @@ -315,6 +300,14 @@ def build_parser() -> Tuple[RevupArgParser, List[RevupArgParser]]:
if "_ARGCOMPLETE" in os.environ:
import argcomplete

# Apply config before completing so completers resolve the same settings
# (main branch, remote, base branch globs) that normal commands use.
try:
conf = asyncio.run(get_config())
conf.apply_to_parsers(all_parsers)
except (OSError, RuntimeError, ValueError, RevupUsageException):
pass

argcomplete.autocomplete(
revup_parser,
always_complete_options=False,
Expand Down Expand Up @@ -353,7 +346,7 @@ async def main(revup_parser: RevupArgParser, all_parsers: List[RevupArgParser])

dump_args(args)

git_ctx = await get_git(args)
git_ctx = await git.make_git(args)

if args.cmd == "toolkit":
from revup import toolkit
Expand Down
Loading