summaryrefslogtreecommitdiffstats
path: root/hacking/create-bulk-issues.py
diff options
context:
space:
mode:
Diffstat (limited to 'hacking/create-bulk-issues.py')
-rwxr-xr-xhacking/create-bulk-issues.py38
1 files changed, 35 insertions, 3 deletions
diff --git a/hacking/create-bulk-issues.py b/hacking/create-bulk-issues.py
index d2651415df..09c79590e2 100755
--- a/hacking/create-bulk-issues.py
+++ b/hacking/create-bulk-issues.py
@@ -35,6 +35,7 @@ class Issue:
body: str
project: str
labels: list[str] | None = None
+ assignee: str | None = None
def create(self) -> str:
cmd = ['gh', 'issue', 'create', '--title', self.title, '--body', self.body, '--project', self.project]
@@ -43,8 +44,18 @@ class Issue:
for label in self.labels:
cmd.extend(('--label', label))
- process = subprocess.run(cmd, capture_output=True, check=True)
- url = process.stdout.decode().strip()
+ if self.assignee:
+ cmd.extend(('--assignee', self.assignee))
+
+ try:
+ process = subprocess.run(cmd, capture_output=True, check=True, text=True)
+ except subprocess.CalledProcessError as ex:
+ print('>>> Note')
+ print(f"You may need to run 'gh auth refresh -s project' if 'gh' reports it cannot find the project {self.project!r} when it exists.")
+ print(f'>>> Standard Output\n{ex.stdout.strip()}\n>>> Standard Error\n{ex.stderr.strip()}\n>>> Exception')
+ raise
+
+ url = process.stdout.strip()
return url
@@ -54,6 +65,7 @@ class Feature:
summary: str
component: str
labels: list[str] | None = None
+ assignee: str | None = None
@staticmethod
def from_dict(data: dict[str, t.Any]) -> Feature:
@@ -61,6 +73,7 @@ class Feature:
summary = data.get('summary')
component = data.get('component')
labels = data.get('labels')
+ assignee = data.get('assignee')
if not isinstance(title, str):
raise RuntimeError(f'`title` is not `str`: {title}')
@@ -71,6 +84,9 @@ class Feature:
if not isinstance(component, str):
raise RuntimeError(f'`component` is not `str`: {component}')
+ if not isinstance(assignee, (str, type(None))):
+ raise RuntimeError(f'`assignee` is not `str`: {assignee}')
+
if not isinstance(labels, list) or not all(isinstance(item, str) for item in labels):
raise RuntimeError(f'`labels` is not `list[str]`: {labels}')
@@ -79,6 +95,7 @@ class Feature:
summary=summary,
component=component,
labels=labels,
+ assignee=assignee,
)
def create_issue(self, project: str) -> Issue:
@@ -102,6 +119,7 @@ Feature Idea
body=body.strip(),
project=project,
labels=self.labels,
+ assignee=self.assignee,
)
@@ -297,7 +315,21 @@ def create_deprecation_parser(subparser) -> None:
def create_feature_parser(subparser) -> None:
- parser: argparse.ArgumentParser = subparser.add_parser('feature')
+ epilog = """
+Example source YAML:
+
+default:
+ component: ansible-test
+ labels:
+ - ansible-test
+ - feature
+ assignee: "@me"
+features:
+ - title: Some title goes here
+ summary: A summary goes here.
+"""
+
+ parser: argparse.ArgumentParser = subparser.add_parser('feature', epilog=epilog, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.set_defaults(type=FeatureArgs)
parser.set_defaults(command=feature_command)