Merge ~fourdollars/pc-enablement/+git/oem-scripts:master into ~oem-solutions-engineers/pc-enablement/+git/oem-scripts:master
- Git
- lp:~fourdollars/pc-enablement/+git/oem-scripts
- master
- Merge into master
Proposed by
Shih-Yuan Lee
Status: | Merged |
---|---|
Approved by: | Bin Li |
Approved revision: | fe9395e87373c5d266cf873fb26eefedabd8242c |
Merged at revision: | 59b79f6d5626be954044a2460b338e0a9c77ab14 |
Proposed branch: | ~fourdollars/pc-enablement/+git/oem-scripts:master |
Merge into: | ~oem-solutions-engineers/pc-enablement/+git/oem-scripts:master |
Diff against target: |
323 lines (+76/-94) 4 files modified
bootstrap-meta (+2/-3) debian/tests/mir-bug (+2/-2) mir-bug (+72/-87) oem_scripts/__init__.py (+0/-2) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Bin Li | Approve | ||
Review via email: mp+446617@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
OEM Taipei Bot (oem-taipei-bot) wrote : | # |
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/bootstrap-meta b/bootstrap-meta | |||
2 | index c523795..77a15c3 100755 | |||
3 | --- a/bootstrap-meta | |||
4 | +++ b/bootstrap-meta | |||
5 | @@ -31,7 +31,6 @@ from copy import copy | |||
6 | 31 | from logging import info, warning, error, critical | 31 | from logging import info, warning, error, critical |
7 | 32 | from oem_scripts import ( | 32 | from oem_scripts import ( |
8 | 33 | ALLOWED_KERNEL_META_LIST, | 33 | ALLOWED_KERNEL_META_LIST, |
9 | 34 | SUBSCRIBER_LIST, | ||
10 | 35 | TAG_LIST, | 34 | TAG_LIST, |
11 | 36 | _get_items_from_git, | 35 | _get_items_from_git, |
12 | 37 | _run_command, | 36 | _run_command, |
13 | @@ -295,8 +294,8 @@ class BootstrapMetaSRU(BootstrapMeta): | |||
14 | 295 | 294 | ||
15 | 296 | subscriptions = list(map(lambda x: x.person.name, bug.subscriptions)) | 295 | subscriptions = list(map(lambda x: x.person.name, bug.subscriptions)) |
16 | 297 | tags = copy(bug.tags) | 296 | tags = copy(bug.tags) |
19 | 298 | if ready or release: | 297 | if ready and release: |
20 | 299 | for subscriber in SUBSCRIBER_LIST: | 298 | for subscriber in ("oem-solutions-engineers", "ubuntu-sponsors"): |
21 | 300 | if subscriber not in subscriptions: | 299 | if subscriber not in subscriptions: |
22 | 301 | bug.subscribe(person=lp.people[subscriber]) | 300 | bug.subscribe(person=lp.people[subscriber]) |
23 | 302 | if "oem-solutions-engineers" not in subscriptions: | 301 | if "oem-solutions-engineers" not in subscriptions: |
24 | diff --git a/debian/tests/mir-bug b/debian/tests/mir-bug | |||
25 | index 94610c8..9f880d8 100644 | |||
26 | --- a/debian/tests/mir-bug | |||
27 | +++ b/debian/tests/mir-bug | |||
28 | @@ -67,7 +67,7 @@ mir-bug update --yes --skip "$AUTOPKGTEST_ARTIFACTS"/jellyfish-tentacool.json | |||
29 | 67 | payload=$(lp-api get bugs/"$BUG_ID") | 67 | payload=$(lp-api get bugs/"$BUG_ID") |
30 | 68 | for link in $(lp-api .subscriptions_collection_link <<< "$payload" | jq -r '.entries|.[]|.self_link'); do | 68 | for link in $(lp-api .subscriptions_collection_link <<< "$payload" | jq -r '.entries|.[]|.self_link'); do |
31 | 69 | case "$(basename "$link")" in | 69 | case "$(basename "$link")" in |
33 | 70 | (ubuntu-sponsors|ubuntu-desktop) | 70 | (ubuntu-sponsors|ubuntu-desktop|ubuntu-archive) |
34 | 71 | echo "FAIL: '$link' shall not be subscribed by 'mir-bug update --yes --skip'." | 71 | echo "FAIL: '$link' shall not be subscribed by 'mir-bug update --yes --skip'." |
35 | 72 | ERR=1 | 72 | ERR=1 |
36 | 73 | ;; | 73 | ;; |
37 | @@ -77,7 +77,7 @@ mir-bug update --yes --skip --ready "$AUTOPKGTEST_ARTIFACTS"/jellyfish-tentacool | |||
38 | 77 | payload=$(lp-api get bugs/"$BUG_ID") | 77 | payload=$(lp-api get bugs/"$BUG_ID") |
39 | 78 | for link in $(lp-api .subscriptions_collection_link <<< "$payload" | jq -r '.entries|.[]|.self_link'); do | 78 | for link in $(lp-api .subscriptions_collection_link <<< "$payload" | jq -r '.entries|.[]|.self_link'); do |
40 | 79 | case "$(basename "$link")" in | 79 | case "$(basename "$link")" in |
42 | 80 | (ubuntu-sponsors|ubuntu-desktop) | 80 | (ubuntu-sponsors|ubuntu-desktop|ubuntu-archive) |
43 | 81 | echo "FAIL: '$link' shall not be subscribed by 'mir-bug update --yes --skip --ready'." | 81 | echo "FAIL: '$link' shall not be subscribed by 'mir-bug update --yes --skip --ready'." |
44 | 82 | ERR=1 | 82 | ERR=1 |
45 | 83 | ;; | 83 | ;; |
46 | diff --git a/mir-bug b/mir-bug | |||
47 | index 6049d74..6f85169 100755 | |||
48 | --- a/mir-bug | |||
49 | +++ b/mir-bug | |||
50 | @@ -37,7 +37,6 @@ from distro_info import UbuntuDistroInfo | |||
51 | 37 | from glob import glob | 37 | from glob import glob |
52 | 38 | from logging import debug, info, warning, error, critical | 38 | from logging import debug, info, warning, error, critical |
53 | 39 | from oem_scripts import ( | 39 | from oem_scripts import ( |
54 | 40 | SUBSCRIBER_LIST, | ||
55 | 41 | TAG_LIST, | 40 | TAG_LIST, |
56 | 42 | _get_items_from_git, | 41 | _get_items_from_git, |
57 | 43 | _run_command, | 42 | _run_command, |
58 | @@ -115,7 +114,7 @@ update.add_argument( | |||
59 | 115 | update.add_argument( | 114 | update.add_argument( |
60 | 116 | "--release", | 115 | "--release", |
61 | 117 | action="store_true", | 116 | action="store_true", |
63 | 118 | help="Also affects 'Ubuntu', and subscribe 'ubuntu-sponsors'.", | 117 | help="Also affects 'Ubuntu', and subscribe 'ubuntu-archive'.", |
64 | 119 | ) | 118 | ) |
65 | 120 | 119 | ||
66 | 121 | check = subparsers.add_parser( | 120 | check = subparsers.add_parser( |
67 | @@ -141,10 +140,12 @@ check.add_argument( | |||
68 | 141 | check.add_argument( | 140 | check.add_argument( |
69 | 142 | "--ready", | 141 | "--ready", |
70 | 143 | action="store_true", | 142 | action="store_true", |
72 | 144 | help="Check if the bug is Fix Committed, also affects 'Ubuntu', and subscribe 'ubuntu-sponsors' and 'ubuntu-desktop'.", | 143 | help="Check if the oem-priority bug is Fix Committed, and doesn't also affect 'Ubuntu', and doesn't subscribe 'ubuntu-archive', 'ubuntu-sponsors' and 'ubuntu-desktop'.", |
73 | 145 | ) | 144 | ) |
74 | 146 | check.add_argument( | 145 | check.add_argument( |
76 | 147 | "--release", action="store_true", help="Check if the bug is ready to release." | 146 | "--release", |
77 | 147 | action="store_true", | ||
78 | 148 | help="Check if the bug is ready to release and subscribed 'ubuntu-archive'.", | ||
79 | 148 | ) | 149 | ) |
80 | 149 | 150 | ||
81 | 150 | collect = subparsers.add_parser("collect", help="[-h] [--ubuntu-certified] jsonFile") | 151 | collect = subparsers.add_parser("collect", help="[-h] [--ubuntu-certified] jsonFile") |
82 | @@ -411,7 +412,7 @@ def update_bug( | |||
83 | 411 | task.importance = "Critical" | 412 | task.importance = "Critical" |
84 | 412 | task.lp_save() | 413 | task.lp_save() |
85 | 413 | 414 | ||
87 | 414 | update_bug_status(bug, pkg_name, yes, series) | 415 | check_and_update_bug_status(bug, pkg_name, series, yes=yes, update=True) |
88 | 415 | 416 | ||
89 | 416 | check_and_update_bug_subscriptions(lp, bug, update=True, yes=yes) | 417 | check_and_update_bug_subscriptions(lp, bug, update=True, yes=yes) |
90 | 417 | 418 | ||
91 | @@ -475,7 +476,7 @@ def check_bug( | |||
92 | 475 | need_fixing = True | 476 | need_fixing = True |
93 | 476 | if check_bug_importance(bug) is False: | 477 | if check_bug_importance(bug) is False: |
94 | 477 | need_fixing = True | 478 | need_fixing = True |
96 | 478 | if check_bug_status(bug, pkg_name, series) is False: | 479 | if check_and_update_bug_status(bug, pkg_name, series, update=False) is False: |
97 | 479 | need_fixing = True | 480 | need_fixing = True |
98 | 480 | if check_and_update_bug_subscriptions(lp, bug) is False: | 481 | if check_and_update_bug_subscriptions(lp, bug) is False: |
99 | 481 | need_fixing = True | 482 | need_fixing = True |
100 | @@ -598,97 +599,61 @@ def check_bug_importance(bug) -> bool: | |||
101 | 598 | return result | 599 | return result |
102 | 599 | 600 | ||
103 | 600 | 601 | ||
106 | 601 | def _expected_status(target_name: str, status: str, expected: str) -> bool: | 602 | def _expected_task_status(bug_task, expected_status: str) -> bool: |
107 | 602 | if status != expected: | 603 | if bug_task.status != expected_status: |
108 | 603 | error( | 604 | error( |
110 | 604 | f"The '{target_name}' status is expected to be '{expected}' instead of '{status}'." | 605 | f"The '{bug_task.bug_target_name}' status is expected to be '{expected_status}' instead of '{bug_task.status}'." |
111 | 605 | ) | 606 | ) |
112 | 606 | return False | 607 | return False |
113 | 607 | return True | 608 | return True |
114 | 608 | 609 | ||
115 | 609 | 610 | ||
170 | 610 | def check_bug_status(bug, pkg_name: str, series: str) -> bool: | 611 | def _ok_to_change_task_status(bug_task, new_status: str, yes: bool) -> bool: |
171 | 611 | info("Checking bug status...") | 612 | if bug_task.status == new_status: |
118 | 612 | result = True | ||
119 | 613 | saw_ubuntu_task = False | ||
120 | 614 | for task in bug.bug_tasks: | ||
121 | 615 | if task.bug_target_name == "oem-priority": | ||
122 | 616 | if args.ready: | ||
123 | 617 | if ( | ||
124 | 618 | _expected_status(task.bug_target_name, task.status, "Fix Committed") | ||
125 | 619 | is False | ||
126 | 620 | ): | ||
127 | 621 | result = False | ||
128 | 622 | else: | ||
129 | 623 | if ( | ||
130 | 624 | _expected_status(task.bug_target_name, task.status, "In Progress") | ||
131 | 625 | is False | ||
132 | 626 | ): | ||
133 | 627 | result = False | ||
134 | 628 | elif ( | ||
135 | 629 | task.bug_target_name == "ubuntu" | ||
136 | 630 | or f"{pkg_name} (Ubuntu)" in task.bug_target_name | ||
137 | 631 | or f"{pkg_name} (Ubuntu {series.capitalize()})" in task.bug_target_name | ||
138 | 632 | ): | ||
139 | 633 | saw_ubuntu_task = True | ||
140 | 634 | if args.release: | ||
141 | 635 | if ( | ||
142 | 636 | _expected_status(task.bug_target_name, task.status, "In Progress") | ||
143 | 637 | is False | ||
144 | 638 | ): | ||
145 | 639 | result = False | ||
146 | 640 | elif args.ready: | ||
147 | 641 | if ( | ||
148 | 642 | _expected_status(task.bug_target_name, task.status, "Confirmed") | ||
149 | 643 | is False | ||
150 | 644 | ): | ||
151 | 645 | result = False | ||
152 | 646 | else: | ||
153 | 647 | if ( | ||
154 | 648 | _expected_status(task.bug_target_name, task.status, "Incomplete") | ||
155 | 649 | is False | ||
156 | 650 | ): | ||
157 | 651 | result = False | ||
158 | 652 | else: | ||
159 | 653 | critical(f"It is unexpected to have '{task.bug_target_name}' task") | ||
160 | 654 | if args.ready and saw_ubuntu_task is False: | ||
161 | 655 | result = False | ||
162 | 656 | error("There is no 'ubuntu' status.") | ||
163 | 657 | return result | ||
164 | 658 | |||
165 | 659 | |||
166 | 660 | def _ok_to_change_status( | ||
167 | 661 | target_name: str, orig_status: str, new_status: str, yes: bool | ||
168 | 662 | ) -> bool: | ||
169 | 663 | if orig_status == new_status: | ||
172 | 664 | return False | 613 | return False |
173 | 665 | if yes_or_ask( | 614 | if yes_or_ask( |
174 | 666 | yes, | 615 | yes, |
176 | 667 | f"Would you like to change the '{target_name}' status from '{orig_status}' to '{new_status}'?", | 616 | f"Would you like to change the '{bug_task.bug_target_name}' status from '{bug_task.status}' to '{new_status}'?", |
177 | 668 | ): | 617 | ): |
178 | 669 | return True | 618 | return True |
179 | 670 | return False | 619 | return False |
180 | 671 | 620 | ||
181 | 672 | 621 | ||
190 | 673 | def _change_task_status(task, new_status: str, yes: bool) -> bool: | 622 | def _check_and_change_task_status( |
191 | 674 | if _expected_status( | 623 | task, new_status: str, yes=False, update=False |
192 | 675 | task.bug_target_name, task.status, new_status | 624 | ) -> bool: |
193 | 676 | ) is False and _ok_to_change_status( | 625 | if update: |
194 | 677 | task.bug_target_name, task.status, new_status, yes | 626 | if not _expected_task_status(task, new_status) and _ok_to_change_task_status( |
195 | 678 | ): | 627 | task, new_status, yes |
196 | 679 | task.status = new_status | 628 | ): |
197 | 680 | task.lp_save() | 629 | task.status = new_status |
198 | 630 | task.lp_save() | ||
199 | 631 | return True | ||
200 | 632 | else: | ||
201 | 633 | return _expected_task_status(task, new_status) | ||
202 | 681 | 634 | ||
203 | 682 | 635 | ||
206 | 683 | def update_bug_status(bug, pkg_name: str, yes: bool, series: str) -> None: | 636 | def check_and_update_bug_status( |
207 | 684 | info("Updating bug status...") | 637 | bug, pkg_name: str, series: str, yes=False, update=False |
208 | 638 | ) -> None: | ||
209 | 639 | if update: | ||
210 | 640 | info("Updating bug status...") | ||
211 | 641 | else: | ||
212 | 642 | info("Checking bug status...") | ||
213 | 643 | result = True | ||
214 | 685 | saw_ubuntu_task = False | 644 | saw_ubuntu_task = False |
215 | 686 | for bug_task in bug.bug_tasks: | 645 | for bug_task in bug.bug_tasks: |
216 | 687 | if bug_task.bug_target_name == "oem-priority": | 646 | if bug_task.bug_target_name == "oem-priority": |
217 | 688 | if args.ready: | 647 | if args.ready: |
219 | 689 | _change_task_status(bug_task, "Fix Committed", yes) | 648 | if not _check_and_change_task_status( |
220 | 649 | bug_task, "Fix Committed", yes=yes, update=update | ||
221 | 650 | ): | ||
222 | 651 | result = False | ||
223 | 690 | else: | 652 | else: |
225 | 691 | _change_task_status(bug_task, "In Progress", yes) | 653 | if not _check_and_change_task_status( |
226 | 654 | bug_task, "In Progress", yes=yes, update=update | ||
227 | 655 | ): | ||
228 | 656 | result = False | ||
229 | 692 | elif ( | 657 | elif ( |
230 | 693 | bug_task.bug_target_name == "ubuntu" | 658 | bug_task.bug_target_name == "ubuntu" |
231 | 694 | or f"{pkg_name} (Ubuntu)" in bug_task.bug_target_name | 659 | or f"{pkg_name} (Ubuntu)" in bug_task.bug_target_name |
232 | @@ -696,10 +661,16 @@ def update_bug_status(bug, pkg_name: str, yes: bool, series: str) -> None: | |||
233 | 696 | ): | 661 | ): |
234 | 697 | saw_ubuntu_task = True | 662 | saw_ubuntu_task = True |
235 | 698 | if args.release: | 663 | if args.release: |
237 | 699 | _change_task_status(bug_task, "In Progress", yes) | 664 | if not _check_and_change_task_status( |
238 | 665 | bug_task, "In Progress", yes=yes, update=update | ||
239 | 666 | ): | ||
240 | 667 | result = False | ||
241 | 700 | elif args.ready: | 668 | elif args.ready: |
244 | 701 | _change_task_status(bug_task, "Confirmed", yes) | 669 | if not _check_and_change_task_status( |
245 | 702 | elif yes_or_ask( | 670 | bug_task, "Confirmed", yes=yes, update=update |
246 | 671 | ): | ||
247 | 672 | result = False | ||
248 | 673 | elif update and yes_or_ask( | ||
249 | 703 | yes, | 674 | yes, |
250 | 704 | f"Would you like to delete the '{bug_task.bug_target_name}' bug_task? (Don't affect '{bug_task.bug_target_display_name}')", | 675 | f"Would you like to delete the '{bug_task.bug_target_name}' bug_task? (Don't affect '{bug_task.bug_target_display_name}')", |
251 | 705 | ): | 676 | ): |
252 | @@ -710,22 +681,36 @@ def update_bug_status(bug, pkg_name: str, yes: bool, series: str) -> None: | |||
253 | 710 | f"{bug_task.bug_target_name} can not be deleted, so changing the status to Incomplete instead." | 681 | f"{bug_task.bug_target_name} can not be deleted, so changing the status to Incomplete instead." |
254 | 711 | ) | 682 | ) |
255 | 712 | debug(e) | 683 | debug(e) |
257 | 713 | _change_task_status(bug_task, "Incomplete", yes) | 684 | _check_and_change_task_status( |
258 | 685 | bug_task, "Incomplete", yes=yes, update=update | ||
259 | 686 | ) | ||
260 | 714 | except lazr.restfulclient.errors.Unauthorized as e: | 687 | except lazr.restfulclient.errors.Unauthorized as e: |
261 | 715 | warning( | 688 | warning( |
262 | 716 | f"{bug_task.bug_target_name} can not be deleted, so changing the status to Incomplete instead." | 689 | f"{bug_task.bug_target_name} can not be deleted, so changing the status to Incomplete instead." |
263 | 717 | ) | 690 | ) |
264 | 718 | debug(e) | 691 | debug(e) |
266 | 719 | _change_task_status(bug_task, "Incomplete", yes) | 692 | _check_and_change_task_status( |
267 | 693 | bug_task, "Incomplete", yes=yes, update=update | ||
268 | 694 | ) | ||
269 | 720 | else: | 695 | else: |
271 | 721 | _change_task_status(bug_task, "Incomplete", yes) | 696 | if not _check_and_change_task_status( |
272 | 697 | bug_task, "Incomplete", yes=yes, update=update | ||
273 | 698 | ): | ||
274 | 699 | result = False | ||
275 | 722 | else: | 700 | else: |
278 | 723 | warning(f"{bug_task.bug_target_name} {bug_task.status}") | 701 | warning( |
279 | 724 | if args.release and args.ready and saw_ubuntu_task is False: | 702 | f"It is unexpected to see the '{bug_task.bug_target_name}' task and the '{bug_task.status}' status." |
280 | 703 | ) | ||
281 | 704 | if update and args.release and args.ready and saw_ubuntu_task is False: | ||
282 | 725 | bug.addTask(target=lp.projects["Ubuntu"]) | 705 | bug.addTask(target=lp.projects["Ubuntu"]) |
283 | 726 | for bug_task in bug.bug_tasks: | 706 | for bug_task in bug.bug_tasks: |
284 | 727 | if bug_task.bug_target_name == "ubuntu": | 707 | if bug_task.bug_target_name == "ubuntu": |
286 | 728 | _change_task_status(bug_task, "In Progress", yes) | 708 | _check_and_change_task_status( |
287 | 709 | bug_task, "In Progress", yes=True, update=True | ||
288 | 710 | ) | ||
289 | 711 | if not update and not args.release and not args.ready and saw_ubuntu_task: | ||
290 | 712 | result = False | ||
291 | 713 | return result | ||
292 | 729 | 714 | ||
293 | 730 | 715 | ||
294 | 731 | def check_and_update_bug_subscriptions(lp, bug, update=False, yes=False) -> bool: | 716 | def check_and_update_bug_subscriptions(lp, bug, update=False, yes=False) -> bool: |
295 | @@ -738,7 +723,7 @@ def check_and_update_bug_subscriptions(lp, bug, update=False, yes=False) -> bool | |||
296 | 738 | for subscription in bug.subscriptions: | 723 | for subscription in bug.subscriptions: |
297 | 739 | subscriptions.append(subscription.person.name) | 724 | subscriptions.append(subscription.person.name) |
298 | 740 | if not args.ready or not args.release: | 725 | if not args.ready or not args.release: |
300 | 741 | for subscriber in ("ubuntu-sponsors", "ubuntu-desktop"): | 726 | for subscriber in ("ubuntu-archive", "ubuntu-sponsors", "ubuntu-desktop"): |
301 | 742 | if subscriber == subscription.person.name: | 727 | if subscriber == subscription.person.name: |
302 | 743 | if subscription.canBeUnsubscribedByUser(): | 728 | if subscription.canBeUnsubscribedByUser(): |
303 | 744 | error(f"'{subscriber}' should not be in the subscriptions.") | 729 | error(f"'{subscriber}' should not be in the subscriptions.") |
304 | @@ -753,7 +738,7 @@ def check_and_update_bug_subscriptions(lp, bug, update=False, yes=False) -> bool | |||
305 | 753 | f"'{subscriber}' should not be in the subscriptions, and {lp.me.name} doesn't have the permission to unsubscribe it." | 738 | f"'{subscriber}' should not be in the subscriptions, and {lp.me.name} doesn't have the permission to unsubscribe it." |
306 | 754 | ) | 739 | ) |
307 | 755 | if args.ready and args.release: | 740 | if args.ready and args.release: |
309 | 756 | for subscriber in SUBSCRIBER_LIST: | 741 | for subscriber in ("oem-solutions-engineers", "ubuntu-archive"): |
310 | 757 | if subscriber not in subscriptions: | 742 | if subscriber not in subscriptions: |
311 | 758 | error(f"'{subscriber}' is not in the subscriptions.") | 743 | error(f"'{subscriber}' is not in the subscriptions.") |
312 | 759 | if update and yes_or_ask( | 744 | if update and yes_or_ask( |
313 | diff --git a/oem_scripts/__init__.py b/oem_scripts/__init__.py | |||
314 | index a3aaceb..c8a6ffe 100644 | |||
315 | --- a/oem_scripts/__init__.py | |||
316 | +++ b/oem_scripts/__init__.py | |||
317 | @@ -41,8 +41,6 @@ ALLOWED_KERNEL_META_LIST = ( | |||
318 | 41 | "linux-generic", | 41 | "linux-generic", |
319 | 42 | ) | 42 | ) |
320 | 43 | 43 | ||
321 | 44 | SUBSCRIBER_LIST = ("oem-solutions-engineers", "ubuntu-sponsors", "ubuntu-desktop") | ||
322 | 45 | |||
323 | 46 | TAG_LIST = ["oem-meta-packages", "oem-priority", f"oem-scripts-{__version__}"] | 44 | TAG_LIST = ["oem-meta-packages", "oem-priority", f"oem-scripts-{__version__}"] |
324 | 47 | 45 | ||
325 | 48 | 46 |
[autopkgtest] merge-proposal PASS insteadof- setting PASS from-iso. sh PASS
pkg-iot-meta PASS
pkg-somerville-meta PASS
pkg-stella-meta PASS
pkg-sutton-meta PASS
bug-bind PASS
get-private-ppa PASS
lp-api PASS
lp-bug PASS
pkg-list PASS
review-
run-autopkgtest PASS
setup-apt-dir PASS
bootstrap-meta PASS
mir-bug PASS
oem-meta-packages PASS
git-url-
lp-dl-attm PASS
recovery-
https:/ /oem-share. canonical. com/partners/ lyoncore/ share/artifacts /oem-scripts/ oem-scripts- 1.83-fe9395e- in-linux- container- jammy