2424
2525
2626def callback (args : argparse .Namespace , api : plug .API ) -> None :
27- repo_names = plug .generate_repo_names (args .students , args .master_repo_names )
27+ repo_names = plug .generate_repo_names (
28+ args .students , args .master_repo_names
29+ )
2830 if "multi_issues_file" in args and args .multi_issues_file is not None :
2931 issues_file = pathlib .Path (args .multi_issues_file ).resolve ()
3032 all_issues = _parse_multi_issues_file (issues_file )
3133 else :
3234 issues_dir = pathlib .Path (args .issues_dir ).resolve ()
3335 all_issues = _collect_issues (repo_names , issues_dir )
34- issues = _extract_expected_issues (all_issues , repo_names )
36+ issues = _extract_expected_issues (
37+ all_issues , repo_names , args .allow_missing
38+ )
3539 for repo_name , issue in issues :
3640 open_issue = args .batch_mode or _ask_for_open (
3741 issue , repo_name , args .truncation_length
@@ -92,6 +96,12 @@ def create_extension_command(self):
9296 "be an #ISSUE# line."
9397 ),
9498 )
99+ parser .add_argument (
100+ "--allow-missing" ,
101+ help = "Emit a warning (instead of crashing) on missing issues." ,
102+ action = "store_true" ,
103+ default = False ,
104+ )
95105 return plug .ExtensionCommand (
96106 parser = parser ,
97107 name = "issue-feedback" ,
@@ -121,13 +131,15 @@ def _ask_for_open(issue: plug.Issue, repo_name: str, trunc_len: int) -> bool:
121131 )
122132 )
123133 return (
124- input ('Open issue "{}" in repo {}? (y/n) ' .format (issue .title , repo_name ))
134+ input (
135+ 'Open issue "{}" in repo {}? (y/n) ' .format (issue .title , repo_name )
136+ )
125137 == "y"
126138 )
127139
128140
129141def _extract_expected_issues (
130- repos_and_issues , repo_names
142+ repos_and_issues , repo_names , allow_missing
131143) -> List [Tuple [str , plug .Issue ]]:
132144 expected_repo_names = set (repo_names )
133145 expected_repos_and_issues = [
@@ -139,7 +151,11 @@ def _extract_expected_issues(
139151 (repo_name for repo_name , _ in expected_repos_and_issues )
140152 )
141153 if missing_repos :
142- raise plug .PlugError ("Missing issues for: " + ", " .join (missing_repos ))
154+ msg = "Missing issues for: " + ", " .join (missing_repos )
155+ if allow_missing :
156+ LOGGER .warning (msg )
157+ else :
158+ raise plug .PlugError (msg )
143159
144160 return expected_repos_and_issues
145161
@@ -164,11 +180,15 @@ def _read_issue(issue_path: pathlib.Path) -> plug.Issue:
164180def _parse_multi_issues_file (
165181 issues_file : pathlib .Path
166182) -> Iterable [Tuple [str , plug .Issue ]]:
167- with open (str (issues_file ), mode = "r" , encoding = sys .getdefaultencoding ()) as file :
183+ with open (
184+ str (issues_file ), mode = "r" , encoding = sys .getdefaultencoding ()
185+ ) as file :
168186 lines = list (file .readlines ())
169187
170188 if not lines or not re .match (BEGIN_ISSUE_PATTERN , lines [0 ], re .IGNORECASE ):
171- raise plug .PlugError ("first line of multi issues file not #ISSUE# line" )
189+ raise plug .PlugError (
190+ "first line of multi issues file not #ISSUE# line"
191+ )
172192
173193 issue_blocks = _extract_issue_blocks (lines )
174194 return list (_extract_issues (issue_blocks , lines ))
0 commit comments