diff options
| -rwxr-xr-x | scripts/oe-go-mod-autogen.py | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/scripts/oe-go-mod-autogen.py b/scripts/oe-go-mod-autogen.py index 09d6133b..f4cdcf06 100755 --- a/scripts/oe-go-mod-autogen.py +++ b/scripts/oe-go-mod-autogen.py | |||
| @@ -1,5 +1,25 @@ | |||
| 1 | #!/usr/bin/env python3 | 1 | #!/usr/bin/env python3 |
| 2 | 2 | ||
| 3 | # SPDX-License-Identifier: GPL-2.0-only | ||
| 4 | # | ||
| 5 | # go-dep processor | ||
| 6 | # | ||
| 7 | # Copyright (C) 2022 Bruce Ashfield | ||
| 8 | # Copyright (C) 2023 Chen Qi | ||
| 9 | # | ||
| 10 | # This program is free software; you can redistribute it and/or modify | ||
| 11 | # it under the terms of the GNU General Public License version 2 as | ||
| 12 | # published by the Free Software Foundation. | ||
| 13 | # | ||
| 14 | # This program is distributed in the hope that it will be useful, | ||
| 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | # GNU General Public License for more details. | ||
| 18 | # | ||
| 19 | # You should have received a copy of the GNU General Public License along | ||
| 20 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
| 21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
| 22 | |||
| 3 | import os | 23 | import os |
| 4 | import sys | 24 | import sys |
| 5 | import logging | 25 | import logging |
| @@ -51,14 +71,14 @@ class GoModTool(object): | |||
| 51 | # store subpaths used to form srcpath | 71 | # store subpaths used to form srcpath |
| 52 | # {actual_module_name: subpath} | 72 | # {actual_module_name: subpath} |
| 53 | self.modules_subpaths = OrderedDict() | 73 | self.modules_subpaths = OrderedDict() |
| 54 | 74 | ||
| 55 | # modules's actual source paths, record those that are not the same with the module itself | 75 | # modules's actual source paths, record those that are not the same with the module itself |
| 56 | self.modules_srcpaths = OrderedDict() | 76 | self.modules_srcpaths = OrderedDict() |
| 57 | 77 | ||
| 58 | # store lines, comment removed | 78 | # store lines, comment removed |
| 59 | self.require_lines = [] | 79 | self.require_lines = [] |
| 60 | self.replace_lines = [] | 80 | self.replace_lines = [] |
| 61 | 81 | ||
| 62 | # fetch repo | 82 | # fetch repo |
| 63 | self.fetch_and_checkout_repo(self.repo.split('://')[1], self.repo, self.rev, checkout=True, get_subpath=False) | 83 | self.fetch_and_checkout_repo(self.repo.split('://')[1], self.repo, self.rev, checkout=True, get_subpath=False) |
| 64 | 84 | ||
| @@ -91,7 +111,7 @@ class GoModTool(object): | |||
| 91 | return | 111 | return |
| 92 | self.parse_go_mod(go_mod_file) | 112 | self.parse_go_mod(go_mod_file) |
| 93 | self.show_go_mod_info() | 113 | self.show_go_mod_info() |
| 94 | 114 | ||
| 95 | def fetch_and_checkout_repo(self, module_name, repo_url, rev, default_protocol='https://', checkout=False, get_subpath=True): | 115 | def fetch_and_checkout_repo(self, module_name, repo_url, rev, default_protocol='https://', checkout=False, get_subpath=True): |
| 96 | """ | 116 | """ |
| 97 | Fetch repo_url to <workdir>/repos/repo_base_name | 117 | Fetch repo_url to <workdir>/repos/repo_base_name |
| @@ -143,12 +163,12 @@ class GoModTool(object): | |||
| 143 | git_action = "clone" | 163 | git_action = "clone" |
| 144 | else: | 164 | else: |
| 145 | # No local repo, clone it. | 165 | # No local repo, clone it. |
| 146 | git_action = "clone" | 166 | git_action = "clone" |
| 147 | 167 | ||
| 148 | if git_action == "clone": | 168 | if git_action == "clone": |
| 149 | logger.info("Removing %s" % repo_dest_dir) | 169 | logger.info("Removing %s" % repo_dest_dir) |
| 150 | subprocess.check_call('rm -rf %s' % repo_dest_dir, shell=True) | 170 | subprocess.check_call('rm -rf %s' % repo_dest_dir, shell=True) |
| 151 | 171 | ||
| 152 | # clone/fetch repo | 172 | # clone/fetch repo |
| 153 | try: | 173 | try: |
| 154 | git_cwd = repos_dir if git_action == "clone" else repo_dest_dir | 174 | git_cwd = repos_dir if git_action == "clone" else repo_dest_dir |
| @@ -235,7 +255,7 @@ class GoModTool(object): | |||
| 235 | self.modules_repoinfo[module_name] = (repo_url, repo_dest_dir, requiredrev) | 255 | self.modules_repoinfo[module_name] = (repo_url, repo_dest_dir, requiredrev) |
| 236 | else: | 256 | else: |
| 237 | logger.warning("Failed to get requiredrev, repo_url = %s, rev = %s, module_name = %s" % (repo_url, rev, module_name)) | 257 | logger.warning("Failed to get requiredrev, repo_url = %s, rev = %s, module_name = %s" % (repo_url, rev, module_name)) |
| 238 | 258 | ||
| 239 | def parse_go_mod(self, go_mod_path): | 259 | def parse_go_mod(self, go_mod_path): |
| 240 | """ | 260 | """ |
| 241 | Parse go.mod file to get the modules info | 261 | Parse go.mod file to get the modules info |
| @@ -402,8 +422,8 @@ class GoModTool(object): | |||
| 402 | except: | 422 | except: |
| 403 | logger.info("wget -O %s https://pkg.go.dev/%s failed" % (wget_content_file, module_name)) | 423 | logger.info("wget -O %s https://pkg.go.dev/%s failed" % (wget_content_file, module_name)) |
| 404 | return None | 424 | return None |
| 405 | 425 | ||
| 406 | 426 | ||
| 407 | def get_repo_url_rev(self, module_name, version): | 427 | def get_repo_url_rev(self, module_name, version): |
| 408 | """ | 428 | """ |
| 409 | Return (repo_url, rev) | 429 | Return (repo_url, rev) |
| @@ -421,11 +441,11 @@ class GoModTool(object): | |||
| 421 | rev = v | 441 | rev = v |
| 422 | else: | 442 | else: |
| 423 | rev = v | 443 | rev = v |
| 424 | 444 | ||
| 425 | # | 445 | # |
| 426 | # Get repo_url | 446 | # Get repo_url |
| 427 | # We put a cache mechanism here, <wget_content_file>.repo_url.cache is used to store the repo url fetch before | 447 | # We put a cache mechanism here, <wget_content_file>.repo_url.cache is used to store the repo url fetch before |
| 428 | # | 448 | # |
| 429 | wget_dir = os.path.join(self.workdir, 'wget-contents') | 449 | wget_dir = os.path.join(self.workdir, 'wget-contents') |
| 430 | if not os.path.exists(wget_dir): | 450 | if not os.path.exists(wget_dir): |
| 431 | os.makedirs(wget_dir) | 451 | os.makedirs(wget_dir) |
| @@ -451,7 +471,7 @@ class GoModTool(object): | |||
| 451 | unhandled_reason = 'cannot determine the repo for %s' % module_name | 471 | unhandled_reason = 'cannot determine the repo for %s' % module_name |
| 452 | self.modules_unhandled[module_name] = unhandled_reason | 472 | self.modules_unhandled[module_name] = unhandled_reason |
| 453 | return (None, rev) | 473 | return (None, rev) |
| 454 | 474 | ||
| 455 | def get_url_srcrev(self, module_name, version): | 475 | def get_url_srcrev(self, module_name, version): |
| 456 | """ | 476 | """ |
| 457 | Return url and fullsrcrev according to module_name and version | 477 | Return url and fullsrcrev according to module_name and version |
| @@ -470,10 +490,10 @@ class GoModTool(object): | |||
| 470 | unhandled_reason = 'fetch_and_checkout_repo(%s, %s, %s) failed' % (module_name, repo_url, rev) | 490 | unhandled_reason = 'fetch_and_checkout_repo(%s, %s, %s) failed' % (module_name, repo_url, rev) |
| 471 | self.modules_unhandled[module_name] = unhandled_reason | 491 | self.modules_unhandled[module_name] = unhandled_reason |
| 472 | return (None, None) | 492 | return (None, None) |
| 473 | 493 | ||
| 474 | def gen_src_uri_inc(self): | 494 | def gen_src_uri_inc(self): |
| 475 | """ | 495 | """ |
| 476 | Generate src_uri.inc file containing SRC_URIs | 496 | Generate src_uri.inc file containing SRC_URIs |
| 477 | """ | 497 | """ |
| 478 | src_uri_inc_file = os.path.join(self.workdir, 'src_uri.inc') | 498 | src_uri_inc_file = os.path.join(self.workdir, 'src_uri.inc') |
| 479 | # record the <name> after writting SRCREV_<name>, this is to avoid modules having the same basename resulting in same SRCREV_xxx | 499 | # record the <name> after writting SRCREV_<name>, this is to avoid modules having the same basename resulting in same SRCREV_xxx |
| @@ -530,9 +550,9 @@ do_compile:prepend() { | |||
| 530 | force_flag=$(echo $s | cut -d: -f3) | 550 | force_flag=$(echo $s | cut -d: -f3) |
| 531 | mkdir -p vendor.copy/$site_dest | 551 | mkdir -p vendor.copy/$site_dest |
| 532 | if [ -n "$force_flag" ]; then | 552 | if [ -n "$force_flag" ]; then |
| 533 | echo "[INFO] $site_dest: force copying .go files" | 553 | echo "[INFO] $site_dest: force copying .go files" |
| 534 | rm -rf vendor.copy/$site_dest | 554 | rm -rf vendor.copy/$site_dest |
| 535 | rsync -a --exclude='vendor/' --exclude='.git/' vendor.fetch/$site_source/ vendor.copy/$site_dest | 555 | rsync -a --exclude='vendor/' --exclude='.git/' vendor.fetch/$site_source/ vendor.copy/$site_dest |
| 536 | else | 556 | else |
| 537 | [ -n "$(ls -A vendor.copy/$site_dest/*.go 2> /dev/null)" ] && { echo "[INFO] vendor.fetch/$site_source -> $site_dest: go copy skipped (files present)" ; true ; } || { echo "[INFO] $site_dest: copying .go files" ; rsync -a --exclude='vendor/' --exclude='.git/' vendor.fetch/$site_source/ vendor.copy/$site_dest ; } | 557 | [ -n "$(ls -A vendor.copy/$site_dest/*.go 2> /dev/null)" ] && { echo "[INFO] vendor.fetch/$site_source -> $site_dest: go copy skipped (files present)" ; true ; } || { echo "[INFO] $site_dest: copying .go files" ; rsync -a --exclude='vendor/' --exclude='.git/' vendor.fetch/$site_source/ vendor.copy/$site_dest ; } |
| 538 | fi | 558 | fi |
| @@ -651,7 +671,7 @@ def main(): | |||
| 651 | gomodtool.gen_src_uri_inc() | 671 | gomodtool.gen_src_uri_inc() |
| 652 | gomodtool.gen_relocation_inc() | 672 | gomodtool.gen_relocation_inc() |
| 653 | gomodtool.gen_modules_txt() | 673 | gomodtool.gen_modules_txt() |
| 654 | 674 | ||
| 655 | 675 | ||
| 656 | if __name__ == "__main__": | 676 | if __name__ == "__main__": |
| 657 | try: | 677 | try: |
