Sat Oct 12 17:38:16 2019 UTC ()
pkgtools/url2pkg: rename type Url2Pkg to Globals


(rillig)
diff -r1.20 -r1.21 pkgsrc/pkgtools/url2pkg/files/url2pkg.py
diff -r1.19 -r1.20 pkgsrc/pkgtools/url2pkg/files/url2pkg_test.py

cvs diff -r1.20 -r1.21 pkgsrc/pkgtools/url2pkg/files/url2pkg.py (expand / switch to unified diff)

--- pkgsrc/pkgtools/url2pkg/files/url2pkg.py 2019/10/12 17:28:44 1.20
+++ pkgsrc/pkgtools/url2pkg/files/url2pkg.py 2019/10/12 17:38:16 1.21
@@ -1,15 +1,15 @@ @@ -1,15 +1,15 @@
1#! @PYTHONBIN@ 1#! @PYTHONBIN@
2# $NetBSD: url2pkg.py,v 1.20 2019/10/12 17:28:44 rillig Exp $ 2# $NetBSD: url2pkg.py,v 1.21 2019/10/12 17:38:16 rillig Exp $
3 3
4# Copyright (c) 2019 The NetBSD Foundation, Inc. 4# Copyright (c) 2019 The NetBSD Foundation, Inc.
5# All rights reserved. 5# All rights reserved.
6# 6#
7# This code is derived from software contributed to The NetBSD Foundation 7# This code is derived from software contributed to The NetBSD Foundation
8# by Roland Illig. 8# by Roland Illig.
9# 9#
10# Redistribution and use in source and binary forms, with or without 10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions 11# modification, are permitted provided that the following conditions
12# are met: 12# are met:
13# 1. Redistributions of source code must retain the above copyright 13# 1. Redistributions of source code must retain the above copyright
14# notice, this list of conditions and the following disclaimer. 14# notice, this list of conditions and the following disclaimer.
15# 2. Redistributions in binary form must reproduce the above copyright 15# 2. Redistributions in binary form must reproduce the above copyright
@@ -58,27 +58,27 @@ class Var(NamedTuple): @@ -58,27 +58,27 @@ class Var(NamedTuple):
58 58
59 59
60class Varassign(NamedTuple): 60class Varassign(NamedTuple):
61 """ A variable assignment including layout information. """ 61 """ A variable assignment including layout information. """
62 index: int 62 index: int
63 varname: str 63 varname: str
64 op: str 64 op: str
65 indent: str 65 indent: str
66 value: str 66 value: str
67 space_after_value: str 67 space_after_value: str
68 comment: str 68 comment: str
69 69
70 70
71class Url2Pkg: 71class Globals:
72 make: str 72 make: str
73 libdir: str 73 libdir: str
74 perl5: str 74 perl5: str
75 pkgsrcdir: Union[Path, Any] 75 pkgsrcdir: Union[Path, Any]
76 pythonbin: str 76 pythonbin: str
77 editor: str 77 editor: str
78 pkgdir: Union[Path, Any] 78 pkgdir: Union[Path, Any]
79 out: Any 79 out: Any
80 err: Any 80 err: Any
81 verbose: bool 81 verbose: bool
82 82
83 def __init__(self): 83 def __init__(self):
84 self.make = os.getenv('MAKE') or '@MAKE@' 84 self.make = os.getenv('MAKE') or '@MAKE@'
@@ -449,56 +449,56 @@ class Generator: @@ -449,56 +449,56 @@ class Generator:
449 lines.add('.include "../../mk/bsd.pkg.mk"') 449 lines.add('.include "../../mk/bsd.pkg.mk"')
450 450
451 return lines 451 return lines
452 452
453 def generate_Makefile(self) -> Lines: 453 def generate_Makefile(self) -> Lines:
454 self.adjust_site_SourceForge() 454 self.adjust_site_SourceForge()
455 self.adjust_site_GitHub_archive() 455 self.adjust_site_GitHub_archive()
456 self.adjust_site_GitHub_release() 456 self.adjust_site_GitHub_release()
457 self.foreach_site_from_sites_mk(self.adjust_site_from_sites_mk) 457 self.foreach_site_from_sites_mk(self.adjust_site_from_sites_mk)
458 self.adjust_site_other() 458 self.adjust_site_other()
459 self.adjust_everything_else() 459 self.adjust_everything_else()
460 return self.generate_lines() 460 return self.generate_lines()
461 461
462 def generate_package(self, up: Url2Pkg) -> Lines: 462 def generate_package(self, g: Globals) -> Lines:
463 pkgdir = up.pkgdir 463 pkgdir = g.pkgdir
464 makefile = pkgdir / 'Makefile' 464 makefile = pkgdir / 'Makefile'
465 descr = pkgdir / 'DESCR' 465 descr = pkgdir / 'DESCR'
466 plist = pkgdir / 'PLIST' 466 plist = pkgdir / 'PLIST'
467 467
468 initial_lines = self.generate_Makefile() 468 initial_lines = self.generate_Makefile()
469 469
470 try: 470 try:
471 makefile.replace(f'{makefile}.url2pkg~') 471 makefile.replace(f'{makefile}.url2pkg~')
472 except OSError: 472 except OSError:
473 pass 473 pass
474 initial_lines.write_to(makefile) 474 initial_lines.write_to(makefile)
475 plist.is_file() or Lines('@comment $''NetBSD$').write_to(plist) 475 plist.is_file() or Lines('@comment $''NetBSD$').write_to(plist)
476 descr.is_file() or Lines().write_to(descr) 476 descr.is_file() or Lines().write_to(descr)
477 477
478 subprocess.check_call([up.editor, makefile]) 478 subprocess.check_call([g.editor, makefile])
479 479
480 up.bmake('clean', 'distinfo', 'extract') 480 g.bmake('clean', 'distinfo', 'extract')
481 481
482 return initial_lines 482 return initial_lines
483 483
484 484
485class Adjuster: 485class Adjuster:
486 """ 486 """
487 After the distfile has been downloaded and extracted, the 487 After the distfile has been downloaded and extracted, the
488 adjust_* methods of this class inspect the extracted files 488 adjust_* methods of this class inspect the extracted files
489 and adjust the variable definitions in the package Makefile. 489 and adjust the variable definitions in the package Makefile.
490 """ 490 """
491 up: Url2Pkg 491 g: Globals
492 url: str 492 url: str
493 initial_lines: Lines 493 initial_lines: Lines
494 494
495 # the absolute pathname to the working directory, containing 495 # the absolute pathname to the working directory, containing
496 # the extracted distfiles. 496 # the extracted distfiles.
497 abs_wrkdir: Union[Path, Any] 497 abs_wrkdir: Union[Path, Any]
498 498
499 # the absolute pathname to a subdirectory of abs_wrkdir, typically 499 # the absolute pathname to a subdirectory of abs_wrkdir, typically
500 # containing package-provided Makefiles or configure scripts. 500 # containing package-provided Makefiles or configure scripts.
501 abs_wrksrc: Union[Path, Any] 501 abs_wrksrc: Union[Path, Any]
502 502
503 # the regular files and directories relative to abs_wrksrc. 503 # the regular files and directories relative to abs_wrksrc.
504 wrksrc_files: List[str] 504 wrksrc_files: List[str]
@@ -542,53 +542,53 @@ class Adjuster: @@ -542,53 +542,53 @@ class Adjuster:
542 # these are inserted below the second paragraph in the Makefile. 542 # these are inserted below the second paragraph in the Makefile.
543 todos: List[str] 543 todos: List[str]
544 544
545 # the package name is based on DISTNAME and modified by 545 # the package name is based on DISTNAME and modified by
546 # pkgname_prefix and pkgname_transform. 546 # pkgname_prefix and pkgname_transform.
547 pkgname_prefix: str # example: ${PYPKGPREFIX}- 547 pkgname_prefix: str # example: ${PYPKGPREFIX}-
548 pkgname_transform: str # example: :S,-v,-, 548 pkgname_transform: str # example: :S,-v,-,
549 549
550 # all lines of the package Makefile, for direct modification. 550 # all lines of the package Makefile, for direct modification.
551 makefile_lines: Lines 551 makefile_lines: Lines
552 552
553 regenerate_distinfo: bool 553 regenerate_distinfo: bool
554 554
555 def __init__(self, up: Url2Pkg, url: str, initial_lines: Lines): 555 def __init__(self, g: Globals, url: str, initial_lines: Lines):
556 self.up = up 556 self.g = g
557 self.url = url 557 self.url = url
558 self.initial_lines = initial_lines 558 self.initial_lines = initial_lines
559 self.abs_wrkdir = Path('') 559 self.abs_wrkdir = Path('')
560 self.abs_wrksrc = Path('') 560 self.abs_wrksrc = Path('')
561 self.wrksrc_files = [] 561 self.wrksrc_files = []
562 self.wrksrc_dirs = [] 562 self.wrksrc_dirs = []
563 self.categories = [] 563 self.categories = []
564 self.depends = [] 564 self.depends = []
565 self.build_depends = [] 565 self.build_depends = []
566 self.test_depends = [] 566 self.test_depends = []
567 self.bl3_lines = [] 567 self.bl3_lines = []
568 self.includes = [] 568 self.includes = []
569 self.build_vars = [] 569 self.build_vars = []
570 self.extra_vars = [] 570 self.extra_vars = []
571 self.update_vars = {} 571 self.update_vars = {}
572 self.todos = [] 572 self.todos = []
573 self.pkgname_prefix = '' 573 self.pkgname_prefix = ''
574 self.pkgname_transform = '' 574 self.pkgname_transform = ''
575 self.makefile_lines = Lines() 575 self.makefile_lines = Lines()
576 self.regenerate_distinfo = False 576 self.regenerate_distinfo = False
577 577
578 def add_dependency(self, kind: str, pkgbase: str, constraint: str, dep_dir: str) -> None: 578 def add_dependency(self, kind: str, pkgbase: str, constraint: str, dep_dir: str) -> None:
579 """ add_dependency('DEPENDS', 'package', '>=1', '../../category/package') """ 579 """ add_dependency('DEPENDS', 'package', '>=1', '../../category/package') """
580 580
581 self.up.debug('add_dependency: {0} {1} {2} {3}', kind, pkgbase, constraint, dep_dir) 581 self.g.debug('add_dependency: {0} {1} {2} {3}', kind, pkgbase, constraint, dep_dir)
582 582
583 def bl3_identifier(): 583 def bl3_identifier():
584 try: 584 try:
585 with open(dep_dir + '/buildlink3.mk') as f: 585 with open(dep_dir + '/buildlink3.mk') as f:
586 for line in f: 586 for line in f:
587 m = re.search(r'^BUILDLINK_TREE\+=\s*(\S+)$', line) 587 m = re.search(r'^BUILDLINK_TREE\+=\s*(\S+)$', line)
588 if m: 588 if m:
589 return m[1] 589 return m[1]
590 except OSError: 590 except OSError:
591 pass 591 pass
592 return '' 592 return ''
593 593
594 if dep_dir != '': 594 if dep_dir != '':
@@ -607,55 +607,55 @@ class Adjuster: @@ -607,55 +607,55 @@ class Adjuster:
607 if kind == 'DEPENDS': 607 if kind == 'DEPENDS':
608 self.depends.append(value) 608 self.depends.append(value)
609 elif kind == 'BUILD_DEPENDS': 609 elif kind == 'BUILD_DEPENDS':
610 self.build_depends.append(value) 610 self.build_depends.append(value)
611 elif kind == 'TEST_DEPENDS': 611 elif kind == 'TEST_DEPENDS':
612 self.test_depends.append(value) 612 self.test_depends.append(value)
613 else: 613 else:
614 self.todos.append(f'dependency {kind} {value}') 614 self.todos.append(f'dependency {kind} {value}')
615 615
616 def read_dependencies(self, cmd: str, env: Dict[str, str], cwd: Union[Path, Any], pkgname_prefix: str) -> None: 616 def read_dependencies(self, cmd: str, env: Dict[str, str], cwd: Union[Path, Any], pkgname_prefix: str) -> None:
617 effective_env = dict(os.environ) 617 effective_env = dict(os.environ)
618 effective_env.update(env) 618 effective_env.update(env)
619 619
620 self.up.debug('reading dependencies: cd {0} && env {1} {2}', str(cwd), env, cmd) 620 self.g.debug('reading dependencies: cd {0} && env {1} {2}', str(cwd), env, cmd)
621 output: bytes = subprocess.check_output(args=cmd, shell=True, env=effective_env, cwd=cwd) 621 output: bytes = subprocess.check_output(args=cmd, shell=True, env=effective_env, cwd=cwd)
622 622
623 dep_lines: List[Tuple[str, str, str, str]] = [] 623 dep_lines: List[Tuple[str, str, str, str]] = []
624 for line in output.decode('utf-8').splitlines(): 624 for line in output.decode('utf-8').splitlines():
625 # example: DEPENDS pkgbase>=1.2.3:../../category/pkgbase 625 # example: DEPENDS pkgbase>=1.2.3:../../category/pkgbase
626 m = re.search(r'^(\w+)\t([^\s:>]+)(>[^\s:]+|)(?::(\.\./\.\./\S+))?$', line) 626 m = re.search(r'^(\w+)\t([^\s:>]+)(>[^\s:]+|)(?::(\.\./\.\./\S+))?$', line)
627 if m: 627 if m:
628 dep_lines.append((m[1], m[2], m[3] or '>=0', m[4] or '')) 628 dep_lines.append((m[1], m[2], m[3] or '>=0', m[4] or ''))
629 continue 629 continue
630 630
631 # example: var VARNAME value # possibly with comment 631 # example: var VARNAME value # possibly with comment
632 m = re.search(r'^var\t(\S+)\t(.+)$', line) 632 m = re.search(r'^var\t(\S+)\t(.+)$', line)
633 if m: 633 if m:
634 self.update_vars[m[1]] = m[2] 634 self.update_vars[m[1]] = m[2]
635 continue 635 continue
636 636
637 if line != '': 637 if line != '':
638 self.up.debug('unknown dependency line: {0}', line) 638 self.g.debug('unknown dependency line: {0}', line)
639 639
640 for dep_line in dep_lines: 640 for dep_line in dep_lines:
641 kind, pkgbase, constraint, dep_dir = dep_line 641 kind, pkgbase, constraint, dep_dir = dep_line
642 642
643 if dep_dir == '' and pkgname_prefix != '': 643 if dep_dir == '' and pkgname_prefix != '':
644 dep_dir = self.up.find_package(pkgname_prefix + pkgbase) 644 dep_dir = self.g.find_package(pkgname_prefix + pkgbase)
645 if dep_dir != '': 645 if dep_dir != '':
646 pkgbase = pkgname_prefix + pkgbase 646 pkgbase = pkgname_prefix + pkgbase
647 if dep_dir == '': 647 if dep_dir == '':
648 dep_dir = self.up.find_package(pkgbase) 648 dep_dir = self.g.find_package(pkgbase)
649 649
650 self.add_dependency(kind, pkgbase, constraint, dep_dir) 650 self.add_dependency(kind, pkgbase, constraint, dep_dir)
651 651
652 def wrksrc_open(self, relative_pathname: str): 652 def wrksrc_open(self, relative_pathname: str):
653 return (self.abs_wrksrc / relative_pathname).open() 653 return (self.abs_wrksrc / relative_pathname).open()
654 654
655 def wrksrc_find(self, what: Union[str, Callable[[str], bool]]) -> List[str]: 655 def wrksrc_find(self, what: Union[str, Callable[[str], bool]]) -> List[str]:
656 def search(f): 656 def search(f):
657 return re.search(what, f) if type(what) == str else what(f) 657 return re.search(what, f) if type(what) == str else what(f)
658 658
659 return list(sorted(filter(search, self.wrksrc_files))) 659 return list(sorted(filter(search, self.wrksrc_files)))
660 660
661 def wrksrc_grep(self, filename: str, pattern: str) -> List[Union[str, List[str]]]: 661 def wrksrc_grep(self, filename: str, pattern: str) -> List[Union[str, List[str]]]:
@@ -703,41 +703,41 @@ class Adjuster: @@ -703,41 +703,41 @@ class Adjuster:
703 self.extra_vars.append(Var('GCONF_SCHEMAS', '+=', re.sub(r'(\.in)+$', '', f))) 703 self.extra_vars.append(Var('GCONF_SCHEMAS', '+=', re.sub(r'(\.in)+$', '', f)))
704 704
705 def adjust_libtool(self): 705 def adjust_libtool(self):
706 if self.wrksrc_isfile('ltconfig') or self.wrksrc_isfile('ltmain.sh'): 706 if self.wrksrc_isfile('ltconfig') or self.wrksrc_isfile('ltmain.sh'):
707 self.build_vars.append(Var('USE_LIBTOOL', '=', 'yes')) 707 self.build_vars.append(Var('USE_LIBTOOL', '=', 'yes'))
708 708
709 if self.wrksrc_isdir('libltdl'): 709 if self.wrksrc_isdir('libltdl'):
710 self.includes.append('../../devel/libltdl/convenience.mk') 710 self.includes.append('../../devel/libltdl/convenience.mk')
711 711
712 def adjust_perl_module_Build_PL(self): 712 def adjust_perl_module_Build_PL(self):
713 # Example packages: 713 # Example packages:
714 # devel/p5-Algorithm-CheckDigits 714 # devel/p5-Algorithm-CheckDigits
715 715
716 cmd = f'{self.up.perl5} -I{self.up.libdir} -I. Build.PL' 716 cmd = f'{self.g.perl5} -I{self.g.libdir} -I. Build.PL'
717 self.read_dependencies(cmd, {}, self.abs_wrksrc, '') 717 self.read_dependencies(cmd, {}, self.abs_wrksrc, '')
718 self.build_vars.append(Var('PERL5_MODULE_TYPE', '=', 'Module::Build')) 718 self.build_vars.append(Var('PERL5_MODULE_TYPE', '=', 'Module::Build'))
719 719
720 def adjust_perl_module_Makefile_PL(self): 720 def adjust_perl_module_Makefile_PL(self):
721 # Example packages: 721 # Example packages:
722 # devel/p5-Algorithm-Diff (no dependencies) 722 # devel/p5-Algorithm-Diff (no dependencies)
723 # devel/p5-Carp-Assert-More (dependencies without version numbers) 723 # devel/p5-Carp-Assert-More (dependencies without version numbers)
724 # www/p5-HTML-Quoted (dependency with version number) 724 # www/p5-HTML-Quoted (dependency with version number)
725 725
726 # To avoid fix_up_makefile error for p5-HTML-Quoted, generate Makefile first. 726 # To avoid fix_up_makefile error for p5-HTML-Quoted, generate Makefile first.
727 cmd1 = f'{self.up.perl5} -I. Makefile.PL </dev/null 1>&0 2>&0' 727 cmd1 = f'{self.g.perl5} -I. Makefile.PL </dev/null 1>&0 2>&0'
728 subprocess.call(cmd1, shell=True, cwd=self.abs_wrksrc) 728 subprocess.call(cmd1, shell=True, cwd=self.abs_wrksrc)
729 729
730 cmd2 = f'{self.up.perl5} -I{self.up.libdir} -I. Makefile.PL' 730 cmd2 = f'{self.g.perl5} -I{self.g.libdir} -I. Makefile.PL'
731 self.read_dependencies(cmd2, {}, self.abs_wrksrc, '') 731 self.read_dependencies(cmd2, {}, self.abs_wrksrc, '')
732 732
733 def adjust_perl_module_homepage(self): 733 def adjust_perl_module_homepage(self):
734 if '${MASTER_SITE_PERL_CPAN:' not in self.makefile_lines.get('MASTER_SITES'): 734 if '${MASTER_SITE_PERL_CPAN:' not in self.makefile_lines.get('MASTER_SITES'):
735 return 735 return
736 736
737 homepage = self.makefile_lines.get('HOMEPAGE') 737 homepage = self.makefile_lines.get('HOMEPAGE')
738 if homepage == '' or not self.url.startswith(homepage): 738 if homepage == '' or not self.url.startswith(homepage):
739 return 739 return
740 740
741 distname = self.makefile_lines.get('DISTNAME') 741 distname = self.makefile_lines.get('DISTNAME')
742 module_name = re.sub(r'-v?[0-9].*', '', distname).replace('-', '::') 742 module_name = re.sub(r'-v?[0-9].*', '', distname).replace('-', '::')
743 self.makefile_lines.set('HOMEPAGE', f'https://metacpan.org/pod/{module_name}') 743 self.makefile_lines.set('HOMEPAGE', f'https://metacpan.org/pod/{module_name}')
@@ -749,43 +749,43 @@ class Adjuster: @@ -749,43 +749,43 @@ class Adjuster:
749 self.adjust_perl_module_Makefile_PL() 749 self.adjust_perl_module_Makefile_PL()
750 else: 750 else:
751 return 751 return
752 752
753 distname = self.makefile_lines.get('DISTNAME') 753 distname = self.makefile_lines.get('DISTNAME')
754 packlist = re.sub(r'-v?[0-9].*', '', distname).replace('-', '/') 754 packlist = re.sub(r'-v?[0-9].*', '', distname).replace('-', '/')
755 self.build_vars.append(Var('PERL5_PACKLIST', '=', f'auto/{packlist}/.packlist')) 755 self.build_vars.append(Var('PERL5_PACKLIST', '=', f'auto/{packlist}/.packlist'))
756 self.includes.append('../../lang/perl5/module.mk') 756 self.includes.append('../../lang/perl5/module.mk')
757 self.pkgname_prefix = 'p5-' 757 self.pkgname_prefix = 'p5-'
758 self.categories.append('perl5') 758 self.categories.append('perl5')
759 self.adjust_perl_module_homepage() 759 self.adjust_perl_module_homepage()
760 760
761 try: 761 try:
762 (self.up.pkgdir / 'PLIST').unlink() 762 (self.g.pkgdir / 'PLIST').unlink()
763 except OSError: 763 except OSError:
764 pass 764 pass
765 765
766 def adjust_python_module(self): 766 def adjust_python_module(self):
767 # Example packages: 767 # Example packages:
768 # devel/py-ZopeComponent (dependencies, test dependencies) 768 # devel/py-ZopeComponent (dependencies, test dependencies)
769 # devel/py-gflags (uses distutils.core instead of setuptools; BSD license) 769 # devel/py-gflags (uses distutils.core instead of setuptools; BSD license)
770 # devel/py-gcovr (uses setuptools; BSD license) 770 # devel/py-gcovr (uses setuptools; BSD license)
771 771
772 if not self.wrksrc_isfile('setup.py'): 772 if not self.wrksrc_isfile('setup.py'):
773 return 773 return
774 774
775 cmd = f'{self.up.pythonbin} setup.py build' 775 cmd = f'{self.g.pythonbin} setup.py build'
776 env = { 776 env = {
777 'PYTHONDONTWRITEBYTECODE': 'x', 777 'PYTHONDONTWRITEBYTECODE': 'x',
778 'PYTHONPATH': self.up.libdir 778 'PYTHONPATH': self.g.libdir
779 } 779 }
780 self.read_dependencies(cmd, env, self.abs_wrksrc, 'py-') 780 self.read_dependencies(cmd, env, self.abs_wrksrc, 'py-')
781 781
782 self.pkgname_prefix = '${PYPKGPREFIX}-' 782 self.pkgname_prefix = '${PYPKGPREFIX}-'
783 self.categories.append('python') 783 self.categories.append('python')
784 self.includes.append('../../lang/python/egg.mk') 784 self.includes.append('../../lang/python/egg.mk')
785 785
786 def adjust_cargo(self): 786 def adjust_cargo(self):
787 if not self.wrksrc_isfile('Cargo.lock'): 787 if not self.wrksrc_isfile('Cargo.lock'):
788 return 788 return
789 789
790 # "checksum cargo-package-name cargo-package-version 790 # "checksum cargo-package-name cargo-package-version
791 for (name, version) in self.wrksrc_grep('Cargo.lock', r'^"checksum\s(\S+)\s(\S+)'): 791 for (name, version) in self.wrksrc_grep('Cargo.lock', r'^"checksum\s(\S+)\s(\S+)'):
@@ -867,32 +867,32 @@ class Adjuster: @@ -867,32 +867,32 @@ class Adjuster:
867 pkgversion_norev = re.sub(r'^v', '', initial_lines.get('DISTNAME')) 867 pkgversion_norev = re.sub(r'^v', '', initial_lines.get('DISTNAME'))
868 868
869 tx_lines = Lines(*self.makefile_lines.lines) 869 tx_lines = Lines(*self.makefile_lines.lines)
870 if not (tx_lines.remove('GITHUB_PROJECT') 870 if not (tx_lines.remove('GITHUB_PROJECT')
871 and tx_lines.set('DISTNAME', f'{pkgbase}-{pkgversion_norev}') 871 and tx_lines.set('DISTNAME', f'{pkgbase}-{pkgversion_norev}')
872 and tx_lines.set('PKGNAME', '${PYPKGPREFIX}-${DISTNAME}') 872 and tx_lines.set('PKGNAME', '${PYPKGPREFIX}-${DISTNAME}')
873 and tx_lines.set('MASTER_SITES', f'${{MASTER_SITE_PYPI:={pkgbase1}/{pkgbase}/}}') 873 and tx_lines.set('MASTER_SITES', f'${{MASTER_SITE_PYPI:={pkgbase1}/{pkgbase}/}}')
874 and tx_lines.remove('DIST_SUBDIR')): 874 and tx_lines.remove('DIST_SUBDIR')):
875 return 875 return
876 876
877 tx_lines.remove_if('GITHUB_TAG', initial_lines.get('DISTNAME')) 877 tx_lines.remove_if('GITHUB_TAG', initial_lines.get('DISTNAME'))
878 tx_lines.remove_if('EXTRACT_SUFX', '.zip') 878 tx_lines.remove_if('EXTRACT_SUFX', '.zip')
879 879
880 up = self.up 880 g = self.g
881 try_mk = up.pkgdir / 'try-pypi.mk' 881 try_mk = g.pkgdir / 'try-pypi.mk'
882 tx_lines.write_to(try_mk) 882 tx_lines.write_to(try_mk)
883 args = [up.make, '-f', str(try_mk), 'distinfo'] 883 args = [g.make, '-f', str(try_mk), 'distinfo']
884 up.debug('running {0} to try PyPI', args) 884 g.debug('running {0} to try PyPI', args)
885 fetch_ok = subprocess.call(args, cwd=up.pkgdir) == 0 885 fetch_ok = subprocess.call(args, cwd=g.pkgdir) == 0
886 try_mk.unlink() 886 try_mk.unlink()
887 if not fetch_ok: 887 if not fetch_ok:
888 return 888 return
889 889
890 lines.lines = tx_lines.lines 890 lines.lines = tx_lines.lines
891 self.regenerate_distinfo = True 891 self.regenerate_distinfo = True
892 892
893 def generate_lines(self) -> Lines: 893 def generate_lines(self) -> Lines:
894 marker_index = self.makefile_lines.index(r'^# url2pkg-marker') 894 marker_index = self.makefile_lines.index(r'^# url2pkg-marker')
895 if marker_index == -1: 895 if marker_index == -1:
896 sys.exit('error: didn\'t find the url2pkg marker in the Makefile.') 896 sys.exit('error: didn\'t find the url2pkg marker in the Makefile.')
897 897
898 lines = Lines(*self.makefile_lines.lines[: marker_index]) 898 lines = Lines(*self.makefile_lines.lines[: marker_index])
@@ -918,78 +918,78 @@ class Adjuster: @@ -918,78 +918,78 @@ class Adjuster:
918 lines.add_vars(*self.build_vars) 918 lines.add_vars(*self.build_vars)
919 lines.add_vars(*self.extra_vars) 919 lines.add_vars(*self.extra_vars)
920 920
921 lines.add(*self.bl3_lines) 921 lines.add(*self.bl3_lines)
922 lines.add(*(f'.include "{include}"' for include in self.includes)) 922 lines.add(*(f'.include "{include}"' for include in self.includes))
923 923
924 lines.add(*self.makefile_lines.lines[marker_index + 1:]) 924 lines.add(*self.makefile_lines.lines[marker_index + 1:])
925 925
926 lines.append('CATEGORIES', ' '.join(self.categories)) 926 lines.append('CATEGORIES', ' '.join(self.categories))
927 927
928 self.adjust_lines_python_module(lines) 928 self.adjust_lines_python_module(lines)
929 929
930 for varname in self.update_vars: 930 for varname in self.update_vars:
931 self.up.debug('update_var {0} {1}', varname, self.update_vars[varname]) 931 self.g.debug('update_var {0} {1}', varname, self.update_vars[varname])
932 lines.set(varname, self.update_vars[varname]) 932 lines.set(varname, self.update_vars[varname])
933 933
934 return lines 934 return lines
935 935
936 def adjust(self): 936 def adjust(self):
937 937
938 def scan(basedir: Union[Path, Any], only: Callable[[Path], bool]) -> List[str]: 938 def scan(basedir: Union[Path, Any], only: Callable[[Path], bool]) -> List[str]:
939 relevant = (f for f in basedir.rglob('*') if only(f)) 939 relevant = (f for f in basedir.rglob('*') if only(f))
940 relative = (str(f.relative_to(basedir)) for f in relevant) 940 relative = (str(f.relative_to(basedir)) for f in relevant)
941 return list(sorted((f for f in relative if not f.startswith('.')))) 941 return list(sorted((f for f in relative if not f.startswith('.'))))
942 942
943 self.up.debug('Adjusting the Makefile') 943 self.g.debug('Adjusting the Makefile')
944 self.makefile_lines = Lines.read_from(self.up.pkgdir / 'Makefile') 944 self.makefile_lines = Lines.read_from(self.g.pkgdir / 'Makefile')
945 945
946 self.abs_wrkdir = Path(self.up.show_var('WRKDIR')) 946 self.abs_wrkdir = Path(self.g.show_var('WRKDIR'))
947 self.determine_wrksrc() 947 self.determine_wrksrc()
948 self.wrksrc_dirs = scan(self.abs_wrksrc, Path.is_dir) 948 self.wrksrc_dirs = scan(self.abs_wrksrc, Path.is_dir)
949 self.wrksrc_files = scan(self.abs_wrksrc, Path.is_file) 949 self.wrksrc_files = scan(self.abs_wrksrc, Path.is_file)
950 950
951 self.adjust_configure() 951 self.adjust_configure()
952 self.adjust_cmake() 952 self.adjust_cmake()
953 self.adjust_meson() 953 self.adjust_meson()
954 self.adjust_gconf2_schemas() 954 self.adjust_gconf2_schemas()
955 self.adjust_libtool() 955 self.adjust_libtool()
956 self.adjust_perl_module() 956 self.adjust_perl_module()
957 self.adjust_python_module() 957 self.adjust_python_module()
958 self.adjust_cargo() 958 self.adjust_cargo()
959 self.adjust_pkg_config() 959 self.adjust_pkg_config()
960 self.adjust_po() 960 self.adjust_po()
961 self.adjust_use_languages() 961 self.adjust_use_languages()
962 962
963 self.generate_lines().write_to(self.up.pkgdir / 'Makefile') 963 self.generate_lines().write_to(self.g.pkgdir / 'Makefile')
964 964
965 if self.regenerate_distinfo: 965 if self.regenerate_distinfo:
966 self.up.bmake('distinfo') 966 self.g.bmake('distinfo')
967 967
968 968
969def main(argv: List[str], up: Url2Pkg): 969def main(argv: List[str], g: Globals):
970 if not os.path.isfile('../../mk/bsd.pkg.mk'): 970 if not os.path.isfile('../../mk/bsd.pkg.mk'):
971 sys.exit(f'{argv[0]}: must be run from a package directory (.../pkgsrc/category/package)') 971 sys.exit(f'{argv[0]}: must be run from a package directory (.../pkgsrc/category/package)')
972 972
973 try: 973 try:
974 opts, args = getopt.getopt(argv[1:], 'v', ['verbose']) 974 opts, args = getopt.getopt(argv[1:], 'v', ['verbose'])
975 for (opt, _) in opts: 975 for (opt, _) in opts:
976 if opt in ('-v', '--verbose'): 976 if opt in ('-v', '--verbose'):
977 up.verbose = True 977 g.verbose = True
978 except getopt.GetoptError: 978 except getopt.GetoptError:
979 sys.exit(f'usage: {argv[0]} [-v|--verbose] [URL]') 979 sys.exit(f'usage: {argv[0]} [-v|--verbose] [URL]')
980 980
981 url = args[0] if args else input('URL: ') 981 url = args[0] if args else input('URL: ')
982 if not re.fullmatch(r'\w+://[!-~]+?/[!-~]+', url): 982 if not re.fullmatch(r'\w+://[!-~]+?/[!-~]+', url):
983 sys.exit(f'url2pkg: invalid URL: {url}') 983 sys.exit(f'url2pkg: invalid URL: {url}')
984 984
985 initial_lines = Generator(url).generate_package(up) 985 initial_lines = Generator(url).generate_package(g)
986 Adjuster(up, url, initial_lines).adjust() 986 Adjuster(g, url, initial_lines).adjust()
987 987
988 up.out.write('\n') 988 g.out.write('\n')
989 up.out.write('Remember to run pkglint when you\'re done.\n') 989 g.out.write('Remember to run pkglint when you\'re done.\n')
990 up.out.write('See ../../doc/pkgsrc.txt to get some help.\n') 990 g.out.write('See ../../doc/pkgsrc.txt to get some help.\n')
991 up.out.write('\n') 991 g.out.write('\n')
992 992
993 993
994if __name__ == '__main__': 994if __name__ == '__main__':
995 main(sys.argv, Url2Pkg()) 995 main(sys.argv, Globals())

cvs diff -r1.19 -r1.20 pkgsrc/pkgtools/url2pkg/files/url2pkg_test.py (expand / switch to unified diff)

--- pkgsrc/pkgtools/url2pkg/files/url2pkg_test.py 2019/10/12 17:28:44 1.19
+++ pkgsrc/pkgtools/url2pkg/files/url2pkg_test.py 2019/10/12 17:38:16 1.20
@@ -1,49 +1,49 @@ @@ -1,49 +1,49 @@
1# $NetBSD: url2pkg_test.py,v 1.19 2019/10/12 17:28:44 rillig Exp $ 1# $NetBSD: url2pkg_test.py,v 1.20 2019/10/12 17:38:16 rillig Exp $
2 2
3import pytest 3import pytest
4from url2pkg import * 4from url2pkg import *
5 5
6mkcvsid = '# $''NetBSD$' 6mkcvsid = '# $''NetBSD$'
7up: Url2Pkg 7g: Globals
8prev_dir = Path.cwd() 8prev_dir = Path.cwd()
9 9
10 10
11def setup_function(_): 11def setup_function(_):
12 global up 12 global g
13 13
14 up = Url2Pkg() 14 g = Globals()
15 os.chdir(up.pkgsrcdir / 'pkgtools' / 'url2pkg') 15 os.chdir(g.pkgsrcdir / 'pkgtools' / 'url2pkg')
16 16
17 class Wr: 17 class Wr:
18 def __init__(self) -> None: 18 def __init__(self) -> None:
19 self.buf = '' 19 self.buf = ''
20 20
21 def write(self, s: str): 21 def write(self, s: str):
22 self.buf += s 22 self.buf += s
23 23
24 def written(self) -> List[str]: 24 def written(self) -> List[str]:
25 result = self.buf 25 result = self.buf
26 self.buf = '' 26 self.buf = ''
27 return result.splitlines() 27 return result.splitlines()
28 28
29 up.out = Wr() 29 g.out = Wr()
30 up.err = Wr() 30 g.err = Wr()
31 31
32 32
33def teardown_function(_): 33def teardown_function(_):
34 os.chdir(prev_dir) 34 os.chdir(prev_dir)
35 assert up.out.written() == [] 35 assert g.out.written() == []
36 assert up.err.written() == [] 36 assert g.err.written() == []
37 37
38 38
39def str_vars(vars: List[Var]) -> List[str]: 39def str_vars(vars: List[Var]) -> List[str]:
40 def to_string(var): 40 def to_string(var):
41 return var.name + var.op + var.value 41 return var.name + var.op + var.value
42 42
43 return list(map(to_string, vars)) 43 return list(map(to_string, vars))
44 44
45 45
46def str_varassigns(varassigns: List[Varassign]) -> List[str]: 46def str_varassigns(varassigns: List[Varassign]) -> List[str]:
47 def to_string(v: Varassign) -> str: 47 def to_string(v: Varassign) -> str:
48 return f'{v.varname}{v.op}{v.indent}' \ 48 return f'{v.varname}{v.op}{v.indent}' \
49 f'{v.value}{v.space_after_value}{v.comment}' 49 f'{v.value}{v.space_after_value}{v.comment}'
@@ -56,49 +56,49 @@ def detab(lines: Lines) -> List[str]: @@ -56,49 +56,49 @@ def detab(lines: Lines) -> List[str]:
56 56
57 def detab_line(line: str) -> str: 57 def detab_line(line: str) -> str:
58 detabbed = [] 58 detabbed = []
59 for ch in line: 59 for ch in line:
60 if ch == '\t': 60 if ch == '\t':
61 detabbed.append(' '[:8 - len(detabbed) % 8]) 61 detabbed.append(' '[:8 - len(detabbed) % 8])
62 else: 62 else:
63 detabbed.append(ch) 63 detabbed.append(ch)
64 return ''.join(detabbed) 64 return ''.join(detabbed)
65 65
66 return list(map(detab_line, lines.lines)) 66 return list(map(detab_line, lines.lines))
67 67
68 68
69def test_Url2Pkg_debug(): 69def test_Global_debug():
70 up.verbose = True 70 g.verbose = True
71 71
72 up.debug('plain message') 72 g.debug('plain message')
73 up.debug('list {0}', [1, 2, 3]) 73 g.debug('list {0}', [1, 2, 3])
74 up.debug('tuple {0}', (1, 2, 3)) 74 g.debug('tuple {0}', (1, 2, 3))
75 up.debug('cwd {0} env {1} cmd {2}', 'directory', {'VAR': 'value'}, 'command') 75 g.debug('cwd {0} env {1} cmd {2}', 'directory', {'VAR': 'value'}, 'command')
76 76
77 assert up.err.written() == [ 77 assert g.err.written() == [
78 'url2pkg: plain message', 78 'url2pkg: plain message',
79 'url2pkg: list [1, 2, 3]', 79 'url2pkg: list [1, 2, 3]',
80 'url2pkg: tuple (1, 2, 3)', 80 'url2pkg: tuple (1, 2, 3)',
81 'url2pkg: cwd \'directory\' env {\'VAR\': \'value\'} cmd \'command\'', 81 'url2pkg: cwd \'directory\' env {\'VAR\': \'value\'} cmd \'command\'',
82 ] 82 ]
83 83
84 84
85def test_Url2Pkg_bmake(): 85def test_Global_bmake():
86 up.verbose = True 86 g.verbose = True
87 up.make = 'echo' 87 g.make = 'echo'
88 88
89 up.bmake('hello', 'world') 89 g.bmake('hello', 'world')
90 90
91 assert up.err.written() == [ 91 assert g.err.written() == [
92 'url2pkg: running bmake (\'hello\', \'world\') in \'.\'', 92 'url2pkg: running bmake (\'hello\', \'world\') in \'.\'',
93 ] 93 ]
94 94
95 95
96def test_Lines__write_and_read(tmp_path: Path): 96def test_Lines__write_and_read(tmp_path: Path):
97 example = tmp_path / 'example' 97 example = tmp_path / 'example'
98 98
99 lines = Lines('1', '2', '3') 99 lines = Lines('1', '2', '3')
100 100
101 lines.write_to(example) 101 lines.write_to(example)
102 102
103 assert example.read_text() == '1\n2\n3\n' 103 assert example.read_text() == '1\n2\n3\n'
104 104
@@ -524,27 +524,27 @@ def test_Generator_adjust_site_from_site @@ -524,27 +524,27 @@ def test_Generator_adjust_site_from_site
524 'MASTER_SITES= ${MASTER_SITE_GNU:=cflow/}', 524 'MASTER_SITES= ${MASTER_SITE_GNU:=cflow/}',
525 '', 525 '',
526 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org', 526 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org',
527 'HOMEPAGE= https://www.gnu.org/software/cflow/', 527 'HOMEPAGE= https://www.gnu.org/software/cflow/',
528 'COMMENT= TODO: Short description of the package', 528 'COMMENT= TODO: Short description of the package',
529 '#LICENSE= # TODO: (see mk/license.mk)', 529 '#LICENSE= # TODO: (see mk/license.mk)',
530 '', 530 '',
531 '# url2pkg-marker (please do not remove this line.)', 531 '# url2pkg-marker (please do not remove this line.)',
532 '.include "../../mk/bsd.pkg.mk"', 532 '.include "../../mk/bsd.pkg.mk"',
533 ] 533 ]
534 534
535 535
536def test_Generator_adjust_site_from_sites_mk__R(tmp_path: Path): 536def test_Generator_adjust_site_from_sites_mk__R(tmp_path: Path):
537 up.pkgdir = tmp_path 537 g.pkgdir = tmp_path
538 url = 'http://cran.r-project.org/src/contrib/forecast_8.7.tar.gz' 538 url = 'http://cran.r-project.org/src/contrib/forecast_8.7.tar.gz'
539 generator = Generator(url) 539 generator = Generator(url)
540 540
541 with pytest.raises(SystemExit, match='^url2pkg: to create R packages, use pkgtools/R2pkg instead$'): 541 with pytest.raises(SystemExit, match='^url2pkg: to create R packages, use pkgtools/R2pkg instead$'):
542 generator.generate_Makefile() 542 generator.generate_Makefile()
543 543
544 assert list(tmp_path.glob('*')) == [] 544 assert list(tmp_path.glob('*')) == []
545 545
546 546
547def test_Generator_adjust_site_other__malformed_URL(): 547def test_Generator_adjust_site_other__malformed_URL():
548 # This error is supposed to be handled by the URL check in main. 548 # This error is supposed to be handled by the URL check in main.
549 549
550 error = "'NoneType' object has no attribute 'groups'" 550 error = "'NoneType' object has no attribute 'groups'"
@@ -615,58 +615,58 @@ def test_Generator_adjust_everything_els @@ -615,58 +615,58 @@ def test_Generator_adjust_everything_els
615 '', 615 '',
616 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org', 616 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org',
617 'HOMEPAGE= https://example.org/', 617 'HOMEPAGE= https://example.org/',
618 'COMMENT= TODO: Short description of the package', 618 'COMMENT= TODO: Short description of the package',
619 '#LICENSE= # TODO: (see mk/license.mk)', 619 '#LICENSE= # TODO: (see mk/license.mk)',
620 '', 620 '',
621 '# url2pkg-marker (please do not remove this line.)', 621 '# url2pkg-marker (please do not remove this line.)',
622 '.include "../../mk/bsd.pkg.mk"', 622 '.include "../../mk/bsd.pkg.mk"',
623 ] 623 ]
624 624
625 625
626def test_Generator_generate_package(tmp_path: Path): 626def test_Generator_generate_package(tmp_path: Path):
627 url = 'https://ftp.gnu.org/pub/gnu/cflow/cflow-1.6.tar.gz' 627 url = 'https://ftp.gnu.org/pub/gnu/cflow/cflow-1.6.tar.gz'
628 up.editor = 'true' # the shell command 628 g.editor = 'true' # the shell command
629 up.make = 'true' # the shell command 629 g.make = 'true' # the shell command
630 up.pkgdir = tmp_path 630 g.pkgdir = tmp_path
631 631
632 Generator(url).generate_package(up) 632 Generator(url).generate_package(g)
633 633
634 assert (tmp_path / 'DESCR').read_text() == '' 634 assert (tmp_path / 'DESCR').read_text() == ''
635 assert len((tmp_path / 'Makefile').read_text().splitlines()) == 13 635 assert len((tmp_path / 'Makefile').read_text().splitlines()) == 13
636 assert (tmp_path / 'PLIST').read_text() == '@comment $''NetBSD$\n' 636 assert (tmp_path / 'PLIST').read_text() == '@comment $''NetBSD$\n'
637 637
638 # Since bmake is only fake in this test, the distinfo file is not created. 638 # Since bmake is only fake in this test, the distinfo file is not created.
639 expected_files = ['DESCR', 'Makefile', 'PLIST'] 639 expected_files = ['DESCR', 'Makefile', 'PLIST']
640 assert sorted([f.name for f in tmp_path.glob("*")]) == expected_files 640 assert sorted([f.name for f in tmp_path.glob("*")]) == expected_files
641 641
642 642
643def test_Adjuster_read_dependencies(): 643def test_Adjuster_read_dependencies():
644 child_process_output = [ 644 child_process_output = [
645 'DEPENDS\tpackage>=112.0:../../pkgtools/pkglint', 645 'DEPENDS\tpackage>=112.0:../../pkgtools/pkglint',
646 'DEPENDS\tpackage>=120.0:../../pkgtools/x11-links', 646 'DEPENDS\tpackage>=120.0:../../pkgtools/x11-links',
647 'BUILD_DEPENDS\turl2pkg>=1.0', 647 'BUILD_DEPENDS\turl2pkg>=1.0',
648 'BUILD_DEPENDS\tdoes-not-exist>=1.0', 648 'BUILD_DEPENDS\tdoes-not-exist>=1.0',
649 'TEST_DEPENDS\tpkglint', 649 'TEST_DEPENDS\tpkglint',
650 'A line that is not a dependency at all', 650 'A line that is not a dependency at all',
651 '', 651 '',
652 'var\tHOMEPAGE\thttps://homepage.example.org/', 652 'var\tHOMEPAGE\thttps://homepage.example.org/',
653 'var\t#LICENSE\tBSD # TODO: too unspecific', 653 'var\t#LICENSE\tBSD # TODO: too unspecific',
654 '' 654 ''
655 ] 655 ]
656 env = {'URL2PKG_DEPENDENCIES': '\n'.join(child_process_output)} 656 env = {'URL2PKG_DEPENDENCIES': '\n'.join(child_process_output)}
657 cmd = "printf '%s\n' \"$URL2PKG_DEPENDENCIES\"" 657 cmd = "printf '%s\n' \"$URL2PKG_DEPENDENCIES\""
658 658
659 adjuster = Adjuster(up, '', Lines()) 659 adjuster = Adjuster(g, '', Lines())
660 adjuster.read_dependencies(cmd, env, '.', '') 660 adjuster.read_dependencies(cmd, env, '.', '')
661 661
662 assert os.getenv('URL2PKG_DEPENDENCIES') is None 662 assert os.getenv('URL2PKG_DEPENDENCIES') is None
663 assert adjuster.depends == ['package>=112.0:../../pkgtools/pkglint'] 663 assert adjuster.depends == ['package>=112.0:../../pkgtools/pkglint']
664 assert adjuster.bl3_lines == [ 664 assert adjuster.bl3_lines == [
665 'BUILDLINK_API_DEPENDS.x11-links+=\tx11-links>=120.0', 665 'BUILDLINK_API_DEPENDS.x11-links+=\tx11-links>=120.0',
666 ".include \"../../pkgtools/x11-links/buildlink3.mk\"", 666 ".include \"../../pkgtools/x11-links/buildlink3.mk\"",
667 ] 667 ]
668 assert adjuster.build_depends == [ 668 assert adjuster.build_depends == [
669 'url2pkg>=1.0:../../pkgtools/url2pkg', 669 'url2pkg>=1.0:../../pkgtools/url2pkg',
670 '# TODO: does-not-exist>=1.0', 670 '# TODO: does-not-exist>=1.0',
671 ] 671 ]
672 assert adjuster.test_depends == ['pkglint>=0:../../pkgtools/pkglint'] 672 assert adjuster.test_depends == ['pkglint>=0:../../pkgtools/pkglint']
@@ -674,71 +674,71 @@ def test_Adjuster_read_dependencies(): @@ -674,71 +674,71 @@ def test_Adjuster_read_dependencies():
674 'HOMEPAGE': 'https://homepage.example.org/', 674 'HOMEPAGE': 'https://homepage.example.org/',
675 '#LICENSE': 'BSD # TODO: too unspecific', 675 '#LICENSE': 'BSD # TODO: too unspecific',
676 } 676 }
677 677
678 678
679def test_Adjuster_read_dependencies__lookup_with_prefix(): 679def test_Adjuster_read_dependencies__lookup_with_prefix():
680 child_process_output = [ 680 child_process_output = [
681 'DEPENDS\tpyobjc-framework-Quartz>=0', 681 'DEPENDS\tpyobjc-framework-Quartz>=0',
682 '' 682 ''
683 ] 683 ]
684 env = {'URL2PKG_DEPENDENCIES': '\n'.join(child_process_output)} 684 env = {'URL2PKG_DEPENDENCIES': '\n'.join(child_process_output)}
685 cmd = "printf '%s\n' \"$URL2PKG_DEPENDENCIES\"" 685 cmd = "printf '%s\n' \"$URL2PKG_DEPENDENCIES\""
686 686
687 adjuster = Adjuster(up, '', Lines()) 687 adjuster = Adjuster(g, '', Lines())
688 adjuster.read_dependencies(cmd, env, '.', 'py-') 688 adjuster.read_dependencies(cmd, env, '.', 'py-')
689 689
690 assert adjuster.depends == [ 690 assert adjuster.depends == [
691 'py-pyobjc-framework-Quartz>=0:../../devel/py-pyobjc-framework-Quartz', 691 'py-pyobjc-framework-Quartz>=0:../../devel/py-pyobjc-framework-Quartz',
692 ] 692 ]
693 693
694 694
695def test_Adjuster_wrksrc_grep(tmp_path: Path): 695def test_Adjuster_wrksrc_grep(tmp_path: Path):
696 adjuster = Adjuster(up, '', Lines()) 696 adjuster = Adjuster(g, '', Lines())
697 adjuster.abs_wrksrc = tmp_path 697 adjuster.abs_wrksrc = tmp_path
698 (tmp_path / 'file').write_text('\n'.join( 698 (tmp_path / 'file').write_text('\n'.join(
699 ('a', 'b', 'c', 'd', 'e', 'abc', 'def', 'ghi') 699 ('a', 'b', 'c', 'd', 'e', 'abc', 'def', 'ghi')
700 )) 700 ))
701 701
702 assert adjuster.wrksrc_grep('file', r'e') == ['e', 'def'] 702 assert adjuster.wrksrc_grep('file', r'e') == ['e', 'def']
703 assert adjuster.wrksrc_grep('file', r'(.)(.)(.)') == [ 703 assert adjuster.wrksrc_grep('file', r'(.)(.)(.)') == [
704 ['a', 'b', 'c'], 704 ['a', 'b', 'c'],
705 ['d', 'e', 'f'], 705 ['d', 'e', 'f'],
706 ['g', 'h', 'i'], 706 ['g', 'h', 'i'],
707 ] 707 ]
708 708
709 709
710def test_Adjuster_generate_adjusted_Makefile_lines(): 710def test_Adjuster_generate_adjusted_Makefile_lines():
711 adjuster = Adjuster(up, 'https://example.org/pkgname-1.0.tar.gz', Lines()) 711 adjuster = Adjuster(g, 'https://example.org/pkgname-1.0.tar.gz', Lines())
712 adjuster.makefile_lines = Lines( 712 adjuster.makefile_lines = Lines(
713 '# before 1', 713 '# before 1',
714 '# before 2', 714 '# before 2',
715 '# url2pkg-marker', 715 '# url2pkg-marker',
716 '# after 1', 716 '# after 1',
717 '# after 2' 717 '# after 2'
718 ) 718 )
719 719
720 lines = adjuster.generate_lines() 720 lines = adjuster.generate_lines()
721 721
722 assert lines.lines == [ 722 assert lines.lines == [
723 '# before 1', 723 '# before 1',
724 '# before 2', 724 '# before 2',
725 '# after 1', 725 '# after 1',
726 '# after 2', 726 '# after 2',
727 ] 727 ]
728 728
729 729
730def test_Adjuster_generate_adjusted_Makefile_lines__dependencies(): 730def test_Adjuster_generate_adjusted_Makefile_lines__dependencies():
731 adjuster = Adjuster(up, 'https://example.org/pkgname-1.0.tar.gz', Lines()) 731 adjuster = Adjuster(g, 'https://example.org/pkgname-1.0.tar.gz', Lines())
732 adjuster.makefile_lines.add( 732 adjuster.makefile_lines.add(
733 mkcvsid, 733 mkcvsid,
734 '', 734 '',
735 '# url2pkg-marker', 735 '# url2pkg-marker',
736 ".include \"../../mk/bsd.pkg.mk\"" 736 ".include \"../../mk/bsd.pkg.mk\""
737 ) 737 )
738 # some dependencies whose directory will not be found 738 # some dependencies whose directory will not be found
739 adjuster.add_dependency('DEPENDS', 'depends', '>=5.0', '../../devel/depends') 739 adjuster.add_dependency('DEPENDS', 'depends', '>=5.0', '../../devel/depends')
740 adjuster.add_dependency('TOOL_DEPENDS', 'tool-depends', '>=6.0', '../../devel/tool-depends') 740 adjuster.add_dependency('TOOL_DEPENDS', 'tool-depends', '>=6.0', '../../devel/tool-depends')
741 adjuster.add_dependency('BUILD_DEPENDS', 'build-depends', '>=7.0', '../../devel/build-depends') 741 adjuster.add_dependency('BUILD_DEPENDS', 'build-depends', '>=7.0', '../../devel/build-depends')
742 adjuster.add_dependency('TEST_DEPENDS', 'test-depends', '>=8.0', '../../devel/test-depends') 742 adjuster.add_dependency('TEST_DEPENDS', 'test-depends', '>=8.0', '../../devel/test-depends')
743 # some dependencies whose directory is explicitly given 743 # some dependencies whose directory is explicitly given
744 adjuster.depends.append('depends>=11.0:../../devel/depends') 744 adjuster.depends.append('depends>=11.0:../../devel/depends')
@@ -754,273 +754,273 @@ def test_Adjuster_generate_adjusted_Make @@ -754,273 +754,273 @@ def test_Adjuster_generate_adjusted_Make
754 '', 754 '',
755 'BUILD_DEPENDS+= # TODO: build-depends>=7.0', 755 'BUILD_DEPENDS+= # TODO: build-depends>=7.0',
756 'BUILD_DEPENDS+= build-depends>=12.0:../../devel/build-depends', 756 'BUILD_DEPENDS+= build-depends>=12.0:../../devel/build-depends',
757 'DEPENDS+= # TODO: depends>=5.0', 757 'DEPENDS+= # TODO: depends>=5.0',
758 'DEPENDS+= depends>=11.0:../../devel/depends', 758 'DEPENDS+= depends>=11.0:../../devel/depends',
759 'TEST_DEPENDS+= # TODO: test-depends>=8.0', 759 'TEST_DEPENDS+= # TODO: test-depends>=8.0',
760 'TEST_DEPENDS+= test-depends>=13.0:../../devel/test-depends', 760 'TEST_DEPENDS+= test-depends>=13.0:../../devel/test-depends',
761 '', 761 '',
762 ".include \"../../mk/bsd.pkg.mk\"" 762 ".include \"../../mk/bsd.pkg.mk\""
763 ] 763 ]
764 764
765 765
766def test_Adjuster_generate_adjusted_Makefile_lines__dont_overwrite_PKGNAME(): 766def test_Adjuster_generate_adjusted_Makefile_lines__dont_overwrite_PKGNAME():
767 adjuster = Adjuster(up, 'https://example.org/pkgname-1.0.tar.gz', Lines()) 767 adjuster = Adjuster(g, 'https://example.org/pkgname-1.0.tar.gz', Lines())
768 adjuster.makefile_lines.add( 768 adjuster.makefile_lines.add(
769 mkcvsid, 769 mkcvsid,
770 'DISTNAME=\tdistname-1.0', 770 'DISTNAME=\tdistname-1.0',
771 'PKGNAME=\tmanually-edited-pkgname-1.0' 771 'PKGNAME=\tmanually-edited-pkgname-1.0'
772 '', 772 '',
773 '# url2pkg-marker', 773 '# url2pkg-marker',
774 ".include \"../../mk/bsd.pkg.mk\"" 774 ".include \"../../mk/bsd.pkg.mk\""
775 ) 775 )
776 776
777 lines = adjuster.generate_lines() 777 lines = adjuster.generate_lines()
778 778
779 assert detab(lines) == [ 779 assert detab(lines) == [
780 mkcvsid, 780 mkcvsid,
781 'DISTNAME= distname-1.0', 781 'DISTNAME= distname-1.0',
782 'PKGNAME= manually-edited-pkgname-1.0', 782 'PKGNAME= manually-edited-pkgname-1.0',
783 ".include \"../../mk/bsd.pkg.mk\"" 783 ".include \"../../mk/bsd.pkg.mk\""
784 ] 784 ]
785 785
786 786
787def test_Adjuster_generate_adjusted_Makefile_lines__add_PKGNAME(): 787def test_Adjuster_generate_adjusted_Makefile_lines__add_PKGNAME():
788 adjuster = Adjuster(up, 'https://example.org/pkgname-1.0.tar.gz', Lines()) 788 adjuster = Adjuster(g, 'https://example.org/pkgname-1.0.tar.gz', Lines())
789 adjuster.makefile_lines.add( 789 adjuster.makefile_lines.add(
790 mkcvsid, 790 mkcvsid,
791 'DISTNAME=\tdistname-1.0', 791 'DISTNAME=\tdistname-1.0',
792 '', 792 '',
793 '# url2pkg-marker', 793 '# url2pkg-marker',
794 ".include \"../../mk/bsd.pkg.mk\"" 794 ".include \"../../mk/bsd.pkg.mk\""
795 ) 795 )
796 796
797 lines = adjuster.generate_lines() 797 lines = adjuster.generate_lines()
798 798
799 assert lines.lines == [ 799 assert lines.lines == [
800 mkcvsid, 800 mkcvsid,
801 'DISTNAME=\tdistname-1.0', 801 'DISTNAME=\tdistname-1.0',
802 '', 802 '',
803 ".include \"../../mk/bsd.pkg.mk\"" 803 ".include \"../../mk/bsd.pkg.mk\""
804 ] 804 ]
805 805
806 806
807def test_Adjuster_generate_adjusted_Makefile_lines__add_PKGNAME_with_prefix(): 807def test_Adjuster_generate_adjusted_Makefile_lines__add_PKGNAME_with_prefix():
808 adjuster = Adjuster(up, 'https://example.org/pkgname-1.0.tar.gz', Lines()) 808 adjuster = Adjuster(g, 'https://example.org/pkgname-1.0.tar.gz', Lines())
809 adjuster.makefile_lines.add( 809 adjuster.makefile_lines.add(
810 mkcvsid, 810 mkcvsid,
811 'DISTNAME=\tdistname-1.0', 811 'DISTNAME=\tdistname-1.0',
812 '', 812 '',
813 '# url2pkg-marker', 813 '# url2pkg-marker',
814 ".include \"../../mk/bsd.pkg.mk\"" 814 ".include \"../../mk/bsd.pkg.mk\""
815 ) 815 )
816 adjuster.pkgname_prefix = '${PYPKGPREFIX}-' 816 adjuster.pkgname_prefix = '${PYPKGPREFIX}-'
817 817
818 lines = adjuster.generate_lines() 818 lines = adjuster.generate_lines()
819 819
820 assert lines.lines == [ 820 assert lines.lines == [
821 mkcvsid, 821 mkcvsid,
822 'DISTNAME=\tdistname-1.0', 822 'DISTNAME=\tdistname-1.0',
823 'PKGNAME=\t${PYPKGPREFIX}-${DISTNAME}', 823 'PKGNAME=\t${PYPKGPREFIX}-${DISTNAME}',
824 '', 824 '',
825 ".include \"../../mk/bsd.pkg.mk\"" 825 ".include \"../../mk/bsd.pkg.mk\""
826 ] 826 ]
827 827
828 828
829def test_Adjuster_add_dependency__buildlink(): 829def test_Adjuster_add_dependency__buildlink():
830 # Note: this test only works because it runs in pkgtools/url2pkg, 830 # Note: this test only works because it runs in pkgtools/url2pkg,
831 # and from there the file ../../devel/libusb/buildlink3.mk is visible. 831 # and from there the file ../../devel/libusb/buildlink3.mk is visible.
832 832
833 adjuster = Adjuster(up, 'https://example.org/distfile-1.0.zip', Lines()) 833 adjuster = Adjuster(g, 'https://example.org/distfile-1.0.zip', Lines())
834 adjuster.makefile_lines.add('# url2pkg-marker') 834 adjuster.makefile_lines.add('# url2pkg-marker')
835 835
836 adjuster.add_dependency('BUILD_DEPENDS', 'libusb', '>=2019', '../../devel/libusb') 836 adjuster.add_dependency('BUILD_DEPENDS', 'libusb', '>=2019', '../../devel/libusb')
837 837
838 lines = adjuster.generate_lines() 838 lines = adjuster.generate_lines()
839 839
840 assert lines.lines == [ 840 assert lines.lines == [
841 'BUILDLINK_DEPENDS.libusb+=\tbuild', 841 'BUILDLINK_DEPENDS.libusb+=\tbuild',
842 'BUILDLINK_API_DEPENDS.libusb+=\tlibusb>=2019', 842 'BUILDLINK_API_DEPENDS.libusb+=\tlibusb>=2019',
843 '.include "../../devel/libusb/buildlink3.mk"', 843 '.include "../../devel/libusb/buildlink3.mk"',
844 ] 844 ]
845 845
846 846
847def test_Adjuster_adjust_cmake(tmp_path: Path): 847def test_Adjuster_adjust_cmake(tmp_path: Path):
848 adjuster = Adjuster(up, '', Lines()) 848 adjuster = Adjuster(g, '', Lines())
849 adjuster.abs_wrksrc = tmp_path 849 adjuster.abs_wrksrc = tmp_path
850 (tmp_path / 'CMakeLists.txt').touch() 850 (tmp_path / 'CMakeLists.txt').touch()
851 851
852 adjuster.adjust_cmake() 852 adjuster.adjust_cmake()
853 853
854 assert str_vars(adjuster.build_vars) == ['USE_CMAKE=yes'] 854 assert str_vars(adjuster.build_vars) == ['USE_CMAKE=yes']
855 855
856 856
857def test_Adjuster_adjust_configure__none(tmp_path: Path): 857def test_Adjuster_adjust_configure__none(tmp_path: Path):
858 adjuster = Adjuster(up, '', Lines()) 858 adjuster = Adjuster(g, '', Lines())
859 adjuster.abs_wrksrc = tmp_path 859 adjuster.abs_wrksrc = tmp_path
860 860
861 adjuster.adjust_configure() 861 adjuster.adjust_configure()
862 862
863 assert adjuster.build_vars == [] 863 assert adjuster.build_vars == []
864 864
865 865
866def test_Adjuster_adjust_configure__GNU(tmp_path: Path): 866def test_Adjuster_adjust_configure__GNU(tmp_path: Path):
867 adjuster = Adjuster(up, '', Lines()) 867 adjuster = Adjuster(g, '', Lines())
868 adjuster.abs_wrksrc = tmp_path 868 adjuster.abs_wrksrc = tmp_path
869 adjuster.wrksrc_files.append('configure') 869 adjuster.wrksrc_files.append('configure')
870 (tmp_path / 'configure').write_text('# Free Software Foundation\n') 870 (tmp_path / 'configure').write_text('# Free Software Foundation\n')
871 871
872 adjuster.adjust_configure() 872 adjuster.adjust_configure()
873 873
874 assert str_vars(adjuster.build_vars) == [ 874 assert str_vars(adjuster.build_vars) == [
875 'GNU_CONFIGURE=yes', 875 'GNU_CONFIGURE=yes',
876 ] 876 ]
877 877
878 878
879def test_Adjuster_adjust_configure__other(tmp_path: Path): 879def test_Adjuster_adjust_configure__other(tmp_path: Path):
880 adjuster = Adjuster(up, '', Lines()) 880 adjuster = Adjuster(g, '', Lines())
881 adjuster.abs_wrksrc = tmp_path 881 adjuster.abs_wrksrc = tmp_path
882 adjuster.wrksrc_files.append('configure') 882 adjuster.wrksrc_files.append('configure')
883 (tmp_path / 'configure').write_text('# A generic configure script\n') 883 (tmp_path / 'configure').write_text('# A generic configure script\n')
884 884
885 adjuster.adjust_configure() 885 adjuster.adjust_configure()
886 886
887 assert str_vars(adjuster.build_vars) == [ 887 assert str_vars(adjuster.build_vars) == [
888 'HAS_CONFIGURE=yes', 888 'HAS_CONFIGURE=yes',
889 ] 889 ]
890 890
891 891
892def test_Adjuster_adjust_cargo__not_found(tmp_path: Path): 892def test_Adjuster_adjust_cargo__not_found(tmp_path: Path):
893 adjuster = Adjuster(up, '', Lines()) 893 adjuster = Adjuster(g, '', Lines())
894 adjuster.abs_wrksrc = tmp_path 894 adjuster.abs_wrksrc = tmp_path
895 895
896 adjuster.adjust_cargo() 896 adjuster.adjust_cargo()
897 897
898 assert str_vars(adjuster.build_vars) == [] 898 assert str_vars(adjuster.build_vars) == []
899 899
900 900
901def test_Adjuster_adjust_cargo__found(tmp_path: Path): 901def test_Adjuster_adjust_cargo__found(tmp_path: Path):
902 adjuster = Adjuster(up, '', Lines()) 902 adjuster = Adjuster(g, '', Lines())
903 adjuster.abs_wrksrc = tmp_path 903 adjuster.abs_wrksrc = tmp_path
904 (tmp_path / 'Cargo.lock').write_text('"checksum cargo-pkg 1.2.3 1234"') 904 (tmp_path / 'Cargo.lock').write_text('"checksum cargo-pkg 1.2.3 1234"')
905 905
906 adjuster.adjust_cargo() 906 adjuster.adjust_cargo()
907 907
908 assert str_vars(adjuster.build_vars) == [ 908 assert str_vars(adjuster.build_vars) == [
909 'CARGO_CRATE_DEPENDS+=cargo-pkg-1.2.3', 909 'CARGO_CRATE_DEPENDS+=cargo-pkg-1.2.3',
910 ] 910 ]
911 911
912 912
913def test_Adjuster_adjust_gconf2(): 913def test_Adjuster_adjust_gconf2():
914 adjuster = Adjuster(up, '', Lines()) 914 adjuster = Adjuster(g, '', Lines())
915 adjuster.wrksrc_files = [ 915 adjuster.wrksrc_files = [
916 'file1.schemas', 916 'file1.schemas',
917 'file2.schemas.in', 917 'file2.schemas.in',
918 'file6.schemas.in.in.in.in.in.in', # realistic maximum is 2 times 918 'file6.schemas.in.in.in.in.in.in', # realistic maximum is 2 times
919 ] 919 ]
920 920
921 adjuster.adjust_gconf2_schemas() 921 adjuster.adjust_gconf2_schemas()
922 922
923 assert adjuster.includes == [ 923 assert adjuster.includes == [
924 '../../devel/GConf/schemas.mk', 924 '../../devel/GConf/schemas.mk',
925 ] 925 ]
926 assert str_vars(adjuster.extra_vars) == [ 926 assert str_vars(adjuster.extra_vars) == [
927 'GCONF_SCHEMAS+=file1.schemas', 927 'GCONF_SCHEMAS+=file1.schemas',
928 'GCONF_SCHEMAS+=file2.schemas', 928 'GCONF_SCHEMAS+=file2.schemas',
929 'GCONF_SCHEMAS+=file6.schemas', 929 'GCONF_SCHEMAS+=file6.schemas',
930 ] 930 ]
931 931
932 932
933def test_Adjuster_adjust_libtool__ltconfig(tmp_path: Path): 933def test_Adjuster_adjust_libtool__ltconfig(tmp_path: Path):
934 adjuster = Adjuster(up, '', Lines()) 934 adjuster = Adjuster(g, '', Lines())
935 adjuster.abs_wrksrc = tmp_path 935 adjuster.abs_wrksrc = tmp_path
936 (tmp_path / 'ltconfig').write_text('') 936 (tmp_path / 'ltconfig').write_text('')
937 937
938 adjuster.adjust_libtool() 938 adjuster.adjust_libtool()
939 939
940 assert str_vars(adjuster.build_vars) == ['USE_LIBTOOL=yes'] 940 assert str_vars(adjuster.build_vars) == ['USE_LIBTOOL=yes']
941 941
942 942
943def test_Adjuster_adjust_libtool__libltdl(tmp_path: Path): 943def test_Adjuster_adjust_libtool__libltdl(tmp_path: Path):
944 adjuster = Adjuster(up, '', Lines()) 944 adjuster = Adjuster(g, '', Lines())
945 adjuster.abs_wrksrc = tmp_path 945 adjuster.abs_wrksrc = tmp_path
946 (tmp_path / 'libltdl').mkdir() 946 (tmp_path / 'libltdl').mkdir()
947 947
948 adjuster.adjust_libtool() 948 adjuster.adjust_libtool()
949 949
950 assert adjuster.includes == [ 950 assert adjuster.includes == [
951 '../../devel/libltdl/convenience.mk', 951 '../../devel/libltdl/convenience.mk',
952 ] 952 ]
953 953
954 954
955def test_Adjuster_adjust_meson(tmp_path: Path): 955def test_Adjuster_adjust_meson(tmp_path: Path):
956 adjuster = Adjuster(up, '', Lines()) 956 adjuster = Adjuster(g, '', Lines())
957 adjuster.abs_wrksrc = tmp_path 957 adjuster.abs_wrksrc = tmp_path
958 (tmp_path / 'meson.build').touch() 958 (tmp_path / 'meson.build').touch()
959 959
960 adjuster.adjust_meson() 960 adjuster.adjust_meson()
961 961
962 assert adjuster.includes == ['../../devel/meson/build.mk'] 962 assert adjuster.includes == ['../../devel/meson/build.mk']
963 963
964 964
965def test_Adjuster_adjust_perl_module_Build_PL(tmp_path: Path): 965def test_Adjuster_adjust_perl_module_Build_PL(tmp_path: Path):
966 up.perl5 = 'echo perl5' 966 g.perl5 = 'echo perl5'
967 up.libdir = '/libdir' 967 g.libdir = '/libdir'
968 up.verbose = True 968 g.verbose = True
969 adjuster = Adjuster(up, '', Lines()) 969 adjuster = Adjuster(g, '', Lines())
970 adjuster.abs_wrksrc = tmp_path 970 adjuster.abs_wrksrc = tmp_path
971 971
972 adjuster.adjust_perl_module_Build_PL() 972 adjuster.adjust_perl_module_Build_PL()
973 973
974 assert str_vars(adjuster.build_vars) == ['PERL5_MODULE_TYPE=Module::Build'] 974 assert str_vars(adjuster.build_vars) == ['PERL5_MODULE_TYPE=Module::Build']
975 assert up.err.written() == [ 975 assert g.err.written() == [
976 f'url2pkg: reading dependencies: cd \'{tmp_path}\' && env {{}} \'echo perl5 -I/libdir -I. Build.PL\'', 976 f'url2pkg: reading dependencies: cd \'{tmp_path}\' && env {{}} \'echo perl5 -I/libdir -I. Build.PL\'',
977 'url2pkg: unknown dependency line: \'perl5 -I/libdir -I. Build.PL\'' 977 'url2pkg: unknown dependency line: \'perl5 -I/libdir -I. Build.PL\''
978 ] 978 ]
979 979
980 980
981def test_Adjuster_adjust_perl_module_Makefile_PL(tmp_path: Path): 981def test_Adjuster_adjust_perl_module_Makefile_PL(tmp_path: Path):
982 up.perl5 = 'echo perl5' 982 g.perl5 = 'echo perl5'
983 up.libdir = '/libdir' 983 g.libdir = '/libdir'
984 up.verbose = True 984 g.verbose = True
985 adjuster = Adjuster(up, '', Lines()) 985 adjuster = Adjuster(g, '', Lines())
986 adjuster.abs_wrksrc = tmp_path 986 adjuster.abs_wrksrc = tmp_path
987 987
988 adjuster.adjust_perl_module_Makefile_PL() 988 adjuster.adjust_perl_module_Makefile_PL()
989 989
990 assert str_vars(adjuster.build_vars) == [] 990 assert str_vars(adjuster.build_vars) == []
991 assert up.err.written() == [ 991 assert g.err.written() == [
992 f'url2pkg: reading dependencies: cd \'{tmp_path}\' && env {{}} \'echo perl5 -I/libdir -I. Makefile.PL\'', 992 f'url2pkg: reading dependencies: cd \'{tmp_path}\' && env {{}} \'echo perl5 -I/libdir -I. Makefile.PL\'',
993 'url2pkg: unknown dependency line: \'perl5 -I/libdir -I. Makefile.PL\'' 993 'url2pkg: unknown dependency line: \'perl5 -I/libdir -I. Makefile.PL\''
994 ] 994 ]
995 995
996 996
997def test_Adjuster_adjust_perl_module_homepage(): 997def test_Adjuster_adjust_perl_module_homepage():
998 adjuster = Adjuster(up, 'https://example.org/Perl-Module-1.0.tar.gz', Lines()) 998 adjuster = Adjuster(g, 'https://example.org/Perl-Module-1.0.tar.gz', Lines())
999 adjuster.makefile_lines.add_vars( 999 adjuster.makefile_lines.add_vars(
1000 Var('DISTNAME', '=', 'Perl-Module-1.0.tar.gz'), 1000 Var('DISTNAME', '=', 'Perl-Module-1.0.tar.gz'),
1001 Var('MASTER_SITES', '=', '${MASTER_SITE_PERL_CPAN:=subdir/}'), 1001 Var('MASTER_SITES', '=', '${MASTER_SITE_PERL_CPAN:=subdir/}'),
1002 Var('HOMEPAGE', '=', 'https://example.org/'), 1002 Var('HOMEPAGE', '=', 'https://example.org/'),
1003 ) 1003 )
1004 1004
1005 adjuster.adjust_perl_module_homepage() 1005 adjuster.adjust_perl_module_homepage()
1006 1006
1007 assert adjuster.makefile_lines.get('HOMEPAGE') == 'https://metacpan.org/pod/Perl::Module' 1007 assert adjuster.makefile_lines.get('HOMEPAGE') == 'https://metacpan.org/pod/Perl::Module'
1008 1008
1009 1009
1010def test_Adjuster_adjust_perl_module__Build_PL(tmp_path: Path): 1010def test_Adjuster_adjust_perl_module__Build_PL(tmp_path: Path):
1011 up.perl5 = 'echo perl5' 1011 g.perl5 = 'echo perl5'
1012 up.pkgdir = tmp_path # for removing the PLIST 1012 g.pkgdir = tmp_path # for removing the PLIST
1013 adjuster = Adjuster(up, 'https://example.org/Perl-Module-1.0.tar.gz', Lines()) 1013 adjuster = Adjuster(g, 'https://example.org/Perl-Module-1.0.tar.gz', Lines())
1014 adjuster.abs_wrksrc = tmp_path 1014 adjuster.abs_wrksrc = tmp_path
1015 adjuster.makefile_lines.add_vars( 1015 adjuster.makefile_lines.add_vars(
1016 Var('DISTNAME', '=', 'Perl-Module-1.0.tar.gz'), 1016 Var('DISTNAME', '=', 'Perl-Module-1.0.tar.gz'),
1017 Var('MASTER_SITES', '=', '${MASTER_SITE_PERL_CPAN:=subdir/}'), 1017 Var('MASTER_SITES', '=', '${MASTER_SITE_PERL_CPAN:=subdir/}'),
1018 Var('HOMEPAGE', '=', 'https://example.org/'), 1018 Var('HOMEPAGE', '=', 'https://example.org/'),
1019 ) 1019 )
1020 adjuster.makefile_lines.add('# url2pkg-marker') 1020 adjuster.makefile_lines.add('# url2pkg-marker')
1021 (tmp_path / 'Build.PL').touch() 1021 (tmp_path / 'Build.PL').touch()
1022 (tmp_path / 'PLIST').touch() 1022 (tmp_path / 'PLIST').touch()
1023 1023
1024 adjuster.adjust_perl_module() 1024 adjuster.adjust_perl_module()
1025 1025
1026 assert detab(adjuster.generate_lines()) == [ 1026 assert detab(adjuster.generate_lines()) == [
@@ -1030,187 +1030,187 @@ def test_Adjuster_adjust_perl_module__Bu @@ -1030,187 +1030,187 @@ def test_Adjuster_adjust_perl_module__Bu
1030 'HOMEPAGE= https://metacpan.org/pod/Perl::Module', 1030 'HOMEPAGE= https://metacpan.org/pod/Perl::Module',
1031 '', 1031 '',
1032 'PERL5_MODULE_TYPE= Module::Build', 1032 'PERL5_MODULE_TYPE= Module::Build',
1033 'PERL5_PACKLIST= auto/Perl/Module/.packlist', 1033 'PERL5_PACKLIST= auto/Perl/Module/.packlist',
1034 '', 1034 '',
1035 '.include "../../lang/perl5/module.mk"', 1035 '.include "../../lang/perl5/module.mk"',
1036 ] 1036 ]
1037 assert not (tmp_path / 'PLIST').exists() 1037 assert not (tmp_path / 'PLIST').exists()
1038 1038
1039 1039
1040def test_Adjuster_adjust_perl_module__Makefile_PL_without_PLIST(tmp_path: Path): 1040def test_Adjuster_adjust_perl_module__Makefile_PL_without_PLIST(tmp_path: Path):
1041 # For code coverage, when PLIST cannot be unlinked. 1041 # For code coverage, when PLIST cannot be unlinked.
1042 1042
1043 up.perl5 = 'echo perl5' 1043 g.perl5 = 'echo perl5'
1044 up.pkgdir = tmp_path 1044 g.pkgdir = tmp_path
1045 adjuster = Adjuster(up, 'https://example.org/Mod-1.0.tar.gz', Lines()) 1045 adjuster = Adjuster(g, 'https://example.org/Mod-1.0.tar.gz', Lines())
1046 adjuster.abs_wrksrc = tmp_path 1046 adjuster.abs_wrksrc = tmp_path
1047 adjuster.makefile_lines.add_vars( 1047 adjuster.makefile_lines.add_vars(
1048 Var('DISTNAME', '=', 'Mod-1.0.tar.gz'), 1048 Var('DISTNAME', '=', 'Mod-1.0.tar.gz'),
1049 Var('MASTER_SITES', '=', '${MASTER_SITE_PERL_CPAN:=subdir/}'), 1049 Var('MASTER_SITES', '=', '${MASTER_SITE_PERL_CPAN:=subdir/}'),
1050 Var('HOMEPAGE', '=', 'https://example.org/'), 1050 Var('HOMEPAGE', '=', 'https://example.org/'),
1051 ) 1051 )
1052 adjuster.makefile_lines.add('# url2pkg-marker') 1052 adjuster.makefile_lines.add('# url2pkg-marker')
1053 (tmp_path / 'Makefile.PL').touch() 1053 (tmp_path / 'Makefile.PL').touch()
1054 1054
1055 adjuster.adjust_perl_module() 1055 adjuster.adjust_perl_module()
1056 1056
1057 assert not (tmp_path / 'PLIST').exists() 1057 assert not (tmp_path / 'PLIST').exists()
1058 1058
1059 1059
1060def test_Adjuster_adjust_python_module(tmp_path: Path): 1060def test_Adjuster_adjust_python_module(tmp_path: Path):
1061 url = 'https://example.org/Mod-1.0.tar.gz' 1061 url = 'https://example.org/Mod-1.0.tar.gz'
1062 up.pythonbin = 'echo python' 1062 g.pythonbin = 'echo python'
1063 up.pkgdir = tmp_path 1063 g.pkgdir = tmp_path
1064 adjuster = Adjuster(up, url, Lines()) 1064 adjuster = Adjuster(g, url, Lines())
1065 adjuster.abs_wrksrc = tmp_path 1065 adjuster.abs_wrksrc = tmp_path
1066 adjuster.makefile_lines = Generator(url).generate_Makefile() 1066 adjuster.makefile_lines = Generator(url).generate_Makefile()
1067 (tmp_path / 'setup.py').touch() 1067 (tmp_path / 'setup.py').touch()
1068 1068
1069 adjuster.adjust_python_module() 1069 adjuster.adjust_python_module()
1070 1070
1071 assert detab(adjuster.generate_lines()) == [ 1071 assert detab(adjuster.generate_lines()) == [
1072 mkcvsid, 1072 mkcvsid,
1073 '', 1073 '',
1074 'DISTNAME= Mod-1.0', 1074 'DISTNAME= Mod-1.0',
1075 'PKGNAME= ${PYPKGPREFIX}-${DISTNAME}', 1075 'PKGNAME= ${PYPKGPREFIX}-${DISTNAME}',
1076 'CATEGORIES= pkgtools python', 1076 'CATEGORIES= pkgtools python',
1077 'MASTER_SITES= https://example.org/', 1077 'MASTER_SITES= https://example.org/',
1078 '', 1078 '',
1079 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org', 1079 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org',
1080 'HOMEPAGE= https://example.org/', 1080 'HOMEPAGE= https://example.org/',
1081 'COMMENT= TODO: Short description of the package', 1081 'COMMENT= TODO: Short description of the package',
1082 '#LICENSE= # TODO: (see mk/license.mk)', 1082 '#LICENSE= # TODO: (see mk/license.mk)',
1083 '', 1083 '',
1084 '.include "../../lang/python/egg.mk"', 1084 '.include "../../lang/python/egg.mk"',
1085 '.include "../../mk/bsd.pkg.mk"', 1085 '.include "../../mk/bsd.pkg.mk"',
1086 ] 1086 ]
1087 1087
1088 1088
1089def test_Adjuster_adjust_po__not_found(): 1089def test_Adjuster_adjust_po__not_found():
1090 adjuster = Adjuster(up, '', Lines()) 1090 adjuster = Adjuster(g, '', Lines())
1091 1091
1092 adjuster.adjust_po() 1092 adjuster.adjust_po()
1093 1093
1094 assert adjuster.build_vars == [] 1094 assert adjuster.build_vars == []
1095 1095
1096 1096
1097def test_Adjuster_adjust_po__mo_found(): 1097def test_Adjuster_adjust_po__mo_found():
1098 adjuster = Adjuster(up, '', Lines()) 1098 adjuster = Adjuster(g, '', Lines())
1099 adjuster.wrksrc_files = ['share/locale/de.mo'] 1099 adjuster.wrksrc_files = ['share/locale/de.mo']
1100 1100
1101 adjuster.adjust_po() 1101 adjuster.adjust_po()
1102 1102
1103 assert str_vars(adjuster.build_vars) == ['USE_PKGLOCALEDIR=yes'] 1103 assert str_vars(adjuster.build_vars) == ['USE_PKGLOCALEDIR=yes']
1104 1104
1105 1105
1106def test_Adjuster_adjust_po__po_found(): 1106def test_Adjuster_adjust_po__po_found():
1107 adjuster = Adjuster(up, '', Lines()) 1107 adjuster = Adjuster(g, '', Lines())
1108 adjuster.wrksrc_files = ['po/de.po'] 1108 adjuster.wrksrc_files = ['po/de.po']
1109 1109
1110 adjuster.adjust_po() 1110 adjuster.adjust_po()
1111 1111
1112 assert str_vars(adjuster.build_vars) == ['USE_PKGLOCALEDIR=yes'] 1112 assert str_vars(adjuster.build_vars) == ['USE_PKGLOCALEDIR=yes']
1113 1113
1114 1114
1115def test_Adjuster_adjust_use_languages__none(): 1115def test_Adjuster_adjust_use_languages__none():
1116 adjuster = Adjuster(up, '', Lines()) 1116 adjuster = Adjuster(g, '', Lines())
1117 1117
1118 adjuster.adjust_use_languages() 1118 adjuster.adjust_use_languages()
1119 1119
1120 assert str_vars(adjuster.build_vars) == ['USE_LANGUAGES=# none'] 1120 assert str_vars(adjuster.build_vars) == ['USE_LANGUAGES=# none']
1121 1121
1122 1122
1123def test_Adjuster_adjust_use_languages__c(): 1123def test_Adjuster_adjust_use_languages__c():
1124 adjuster = Adjuster(up, '', Lines()) 1124 adjuster = Adjuster(g, '', Lines())
1125 adjuster.wrksrc_files = ['main.c'] 1125 adjuster.wrksrc_files = ['main.c']
1126 1126
1127 adjuster.adjust_use_languages() 1127 adjuster.adjust_use_languages()
1128 1128
1129 assert str_vars(adjuster.build_vars) == [] 1129 assert str_vars(adjuster.build_vars) == []
1130 1130
1131 1131
1132def test_Adjuster_adjust_use_languages__c_in_subdir(): 1132def test_Adjuster_adjust_use_languages__c_in_subdir():
1133 adjuster = Adjuster(up, '', Lines()) 1133 adjuster = Adjuster(g, '', Lines())
1134 adjuster.wrksrc_files = ['subdir/main.c'] 1134 adjuster.wrksrc_files = ['subdir/main.c']
1135 1135
1136 adjuster.adjust_use_languages() 1136 adjuster.adjust_use_languages()
1137 1137
1138 assert str_vars(adjuster.build_vars) == [] 1138 assert str_vars(adjuster.build_vars) == []
1139 1139
1140 1140
1141def test_Adjuster_adjust_use_languages__cplusplus_in_subdir(): 1141def test_Adjuster_adjust_use_languages__cplusplus_in_subdir():
1142 adjuster = Adjuster(up, '', Lines()) 1142 adjuster = Adjuster(g, '', Lines())
1143 adjuster.wrksrc_files = ['subdir/main.cpp'] 1143 adjuster.wrksrc_files = ['subdir/main.cpp']
1144 1144
1145 adjuster.adjust_use_languages() 1145 adjuster.adjust_use_languages()
1146 1146
1147 assert str_vars(adjuster.build_vars) == ['USE_LANGUAGES=c++'] 1147 assert str_vars(adjuster.build_vars) == ['USE_LANGUAGES=c++']
1148 1148
1149 1149
1150def test_Adjuster_adjust_use_languages__cplusplus_and_fortran(): 1150def test_Adjuster_adjust_use_languages__cplusplus_and_fortran():
1151 adjuster = Adjuster(up, '', Lines()) 1151 adjuster = Adjuster(g, '', Lines())
1152 adjuster.wrksrc_files = ['subdir/main.cpp', 'main.f'] 1152 adjuster.wrksrc_files = ['subdir/main.cpp', 'main.f']
1153 1153
1154 adjuster.adjust_use_languages() 1154 adjuster.adjust_use_languages()
1155 1155
1156 assert str_vars(adjuster.build_vars) == ['USE_LANGUAGES=c++ fortran'] 1156 assert str_vars(adjuster.build_vars) == ['USE_LANGUAGES=c++ fortran']
1157 1157
1158 1158
1159def test_Adjuster_adjust_pkg_config__none(): 1159def test_Adjuster_adjust_pkg_config__none():
1160 adjuster = Adjuster(up, '', Lines()) 1160 adjuster = Adjuster(g, '', Lines())
1161 1161
1162 adjuster.adjust_pkg_config() 1162 adjuster.adjust_pkg_config()
1163 1163
1164 assert str_vars(adjuster.build_vars) == [] 1164 assert str_vars(adjuster.build_vars) == []
1165 assert str_vars(adjuster.extra_vars) == [] 1165 assert str_vars(adjuster.extra_vars) == []
1166 1166
1167 1167
1168def test_Adjuster_adjust_pkg_config__pc_in(): 1168def test_Adjuster_adjust_pkg_config__pc_in():
1169 adjuster = Adjuster(up, '', Lines()) 1169 adjuster = Adjuster(g, '', Lines())
1170 adjuster.wrksrc_files = ['library.pc.in'] 1170 adjuster.wrksrc_files = ['library.pc.in']
1171 1171
1172 adjuster.adjust_pkg_config() 1172 adjuster.adjust_pkg_config()
1173 1173
1174 assert str_vars(adjuster.build_vars) == ['USE_TOOLS+=pkg-config'] 1174 assert str_vars(adjuster.build_vars) == ['USE_TOOLS+=pkg-config']
1175 assert str_vars(adjuster.extra_vars) == ['PKGCONFIG_OVERRIDE+=library.pc.in'] 1175 assert str_vars(adjuster.extra_vars) == ['PKGCONFIG_OVERRIDE+=library.pc.in']
1176 1176
1177 1177
1178def test_Adjuster_adjust_pkg_config__uninstalled_pc_in(): 1178def test_Adjuster_adjust_pkg_config__uninstalled_pc_in():
1179 adjuster = Adjuster(up, '', Lines()) 1179 adjuster = Adjuster(g, '', Lines())
1180 adjuster.wrksrc_files = ['library-uninstalled.pc.in'] 1180 adjuster.wrksrc_files = ['library-uninstalled.pc.in']
1181 1181
1182 adjuster.adjust_pkg_config() 1182 adjuster.adjust_pkg_config()
1183 1183
1184 assert str_vars(adjuster.build_vars) == [] 1184 assert str_vars(adjuster.build_vars) == []
1185 assert str_vars(adjuster.extra_vars) == [] 1185 assert str_vars(adjuster.extra_vars) == []
1186 1186
1187 1187
1188def test_Adjuster_adjust_pkg_config__both(): 1188def test_Adjuster_adjust_pkg_config__both():
1189 adjuster = Adjuster(up, '', Lines()) 1189 adjuster = Adjuster(g, '', Lines())
1190 adjuster.wrksrc_files = [ 1190 adjuster.wrksrc_files = [
1191 'library.pc.in', 1191 'library.pc.in',
1192 'library-uninstalled.pc.in', 1192 'library-uninstalled.pc.in',
1193 ] 1193 ]
1194 1194
1195 adjuster.adjust_pkg_config() 1195 adjuster.adjust_pkg_config()
1196 1196
1197 assert str_vars(adjuster.build_vars) == ['USE_TOOLS+=pkg-config'] 1197 assert str_vars(adjuster.build_vars) == ['USE_TOOLS+=pkg-config']
1198 assert str_vars(adjuster.extra_vars) == ['PKGCONFIG_OVERRIDE+=library.pc.in'] 1198 assert str_vars(adjuster.extra_vars) == ['PKGCONFIG_OVERRIDE+=library.pc.in']
1199 1199
1200 1200
1201def test_Adjuster_generate_lines(): 1201def test_Adjuster_generate_lines():
1202 url = 'https://dummy.example.org/package-1.0.tar.gz' 1202 url = 'https://dummy.example.org/package-1.0.tar.gz'
1203 adjuster = Adjuster(up, url, Lines()) 1203 adjuster = Adjuster(g, url, Lines())
1204 adjuster.makefile_lines = Generator(url).generate_Makefile() 1204 adjuster.makefile_lines = Generator(url).generate_Makefile()
1205 adjuster.update_vars['HOMEPAGE'] = 'https://example.org/' 1205 adjuster.update_vars['HOMEPAGE'] = 'https://example.org/'
1206 adjuster.update_vars['#LICENSE'] = 'BSD # TODO: too unspecific' 1206 adjuster.update_vars['#LICENSE'] = 'BSD # TODO: too unspecific'
1207 adjuster.depends.append('dependency>=0:../../category/dependency') 1207 adjuster.depends.append('dependency>=0:../../category/dependency')
1208 adjuster.todos.append('Run pkglint') 1208 adjuster.todos.append('Run pkglint')
1209 1209
1210 lines = adjuster.generate_lines() 1210 lines = adjuster.generate_lines()
1211 1211
1212 assert detab(lines) == [ 1212 assert detab(lines) == [
1213 mkcvsid, 1213 mkcvsid,
1214 '', 1214 '',
1215 'DISTNAME= package-1.0', 1215 'DISTNAME= package-1.0',
1216 'CATEGORIES= pkgtools', 1216 'CATEGORIES= pkgtools',
@@ -1220,126 +1220,126 @@ def test_Adjuster_generate_lines(): @@ -1220,126 +1220,126 @@ def test_Adjuster_generate_lines():
1220 'HOMEPAGE= https://example.org/', 1220 'HOMEPAGE= https://example.org/',
1221 'COMMENT= TODO: Short description of the package', 1221 'COMMENT= TODO: Short description of the package',
1222 '#LICENSE= BSD # TODO: too unspecific', 1222 '#LICENSE= BSD # TODO: too unspecific',
1223 '', 1223 '',
1224 '# TODO: Run pkglint', 1224 '# TODO: Run pkglint',
1225 '', 1225 '',
1226 'DEPENDS+= dependency>=0:../../category/dependency', 1226 'DEPENDS+= dependency>=0:../../category/dependency',
1227 '', 1227 '',
1228 '.include "../../mk/bsd.pkg.mk"', 1228 '.include "../../mk/bsd.pkg.mk"',
1229 ] 1229 ]
1230 1230
1231 1231
1232def test_Adjuster_determine_wrksrc__no_files(tmp_path: Path): 1232def test_Adjuster_determine_wrksrc__no_files(tmp_path: Path):
1233 adjuster = Adjuster(up, '', Lines()) 1233 adjuster = Adjuster(g, '', Lines())
1234 adjuster.abs_wrkdir = tmp_path 1234 adjuster.abs_wrkdir = tmp_path
1235 1235
1236 adjuster.determine_wrksrc() 1236 adjuster.determine_wrksrc()
1237 1237
1238 assert adjuster.abs_wrksrc == adjuster.abs_wrkdir 1238 assert adjuster.abs_wrksrc == adjuster.abs_wrkdir
1239 1239
1240 1240
1241def test_Adjuster_determine_wrksrc__single_dir(tmp_path: Path): 1241def test_Adjuster_determine_wrksrc__single_dir(tmp_path: Path):
1242 adjuster = Adjuster(up, '', Lines()) 1242 adjuster = Adjuster(g, '', Lines())
1243 adjuster.abs_wrkdir = tmp_path 1243 adjuster.abs_wrkdir = tmp_path
1244 (tmp_path / 'subdir').mkdir() 1244 (tmp_path / 'subdir').mkdir()
1245 1245
1246 adjuster.determine_wrksrc() 1246 adjuster.determine_wrksrc()
1247 1247
1248 assert adjuster.abs_wrksrc == adjuster.abs_wrkdir / 'subdir' 1248 assert adjuster.abs_wrksrc == adjuster.abs_wrkdir / 'subdir'
1249 1249
1250 1250
1251def test_Adjuster_determine_wrksrc__distname_dir(tmp_path: Path): 1251def test_Adjuster_determine_wrksrc__distname_dir(tmp_path: Path):
1252 adjuster = Adjuster(up, '', Lines()) 1252 adjuster = Adjuster(g, '', Lines())
1253 adjuster.abs_wrkdir = tmp_path 1253 adjuster.abs_wrkdir = tmp_path
1254 adjuster.makefile_lines.add_vars(Var('DISTNAME', '=', 'distname-1.0')) 1254 adjuster.makefile_lines.add_vars(Var('DISTNAME', '=', 'distname-1.0'))
1255 (tmp_path / 'distname-1.0').mkdir() 1255 (tmp_path / 'distname-1.0').mkdir()
1256 1256
1257 adjuster.determine_wrksrc() 1257 adjuster.determine_wrksrc()
1258 1258
1259 assert adjuster.abs_wrksrc == adjuster.abs_wrkdir / 'distname-1.0' 1259 assert adjuster.abs_wrksrc == adjuster.abs_wrkdir / 'distname-1.0'
1260 assert str_vars(adjuster.build_vars) == [] 1260 assert str_vars(adjuster.build_vars) == []
1261 1261
1262 1262
1263def test_Adjuster_determine_wrksrc__several_dirs(tmp_path: Path): 1263def test_Adjuster_determine_wrksrc__several_dirs(tmp_path: Path):
1264 adjuster = Adjuster(up, '', Lines()) 1264 adjuster = Adjuster(g, '', Lines())
1265 adjuster.abs_wrkdir = tmp_path 1265 adjuster.abs_wrkdir = tmp_path
1266 (tmp_path / 'subdir1').mkdir() 1266 (tmp_path / 'subdir1').mkdir()
1267 (tmp_path / 'subdir2').mkdir() 1267 (tmp_path / 'subdir2').mkdir()
1268 1268
1269 adjuster.determine_wrksrc() 1269 adjuster.determine_wrksrc()
1270 1270
1271 assert adjuster.abs_wrksrc == adjuster.abs_wrkdir 1271 assert adjuster.abs_wrksrc == adjuster.abs_wrkdir
1272 assert str_vars(adjuster.build_vars) == [ 1272 assert str_vars(adjuster.build_vars) == [
1273 'WRKSRC=${WRKDIR} # TODO: one of subdir1 subdir2, or leave it as-is', 1273 'WRKSRC=${WRKDIR} # TODO: one of subdir1 subdir2, or leave it as-is',
1274 ] 1274 ]
1275 1275
1276 1276
1277def test_Adjuster_adjust__empty_wrkdir(tmp_path: Path): 1277def test_Adjuster_adjust__empty_wrkdir(tmp_path: Path):
1278 up.pkgdir = tmp_path 1278 g.pkgdir = tmp_path
1279 up.show_var = lambda varname: {'WRKDIR': str(tmp_path)}[varname] 1279 g.show_var = lambda varname: {'WRKDIR': str(tmp_path)}[varname]
1280 adjuster = Adjuster(up, 'https://example.org/distfile-1.0.zip', Lines()) 1280 adjuster = Adjuster(g, 'https://example.org/distfile-1.0.zip', Lines())
1281 (tmp_path / 'Makefile').write_text('# url2pkg-marker\n') 1281 (tmp_path / 'Makefile').write_text('# url2pkg-marker\n')
1282 1282
1283 adjuster.adjust() 1283 adjuster.adjust()
1284 1284
1285 assert detab(adjuster.generate_lines()) == [ 1285 assert detab(adjuster.generate_lines()) == [
1286 'WRKSRC= ${WRKDIR}', 1286 'WRKSRC= ${WRKDIR}',
1287 'USE_LANGUAGES= # none', 1287 'USE_LANGUAGES= # none',
1288 '', 1288 '',
1289 ] 1289 ]
1290 1290
1291 1291
1292def test_Adjuster_adjust__files_in_wrksrc(tmp_path: Path): 1292def test_Adjuster_adjust__files_in_wrksrc(tmp_path: Path):
1293 wrkdir = tmp_path / 'work' 1293 wrkdir = tmp_path / 'work'
1294 wrkdir.mkdir() 1294 wrkdir.mkdir()
1295 (wrkdir / '.hidden').touch() 1295 (wrkdir / '.hidden').touch()
1296 (wrkdir / 'file').touch() 1296 (wrkdir / 'file').touch()
1297 (wrkdir / 'dir').mkdir() 1297 (wrkdir / 'dir').mkdir()
1298 (wrkdir / 'dir' / '.hidden-dir').mkdir() 1298 (wrkdir / 'dir' / '.hidden-dir').mkdir()
1299 (wrkdir / 'dir' / 'subdir').mkdir() 1299 (wrkdir / 'dir' / 'subdir').mkdir()
1300 (wrkdir / 'dir' / 'subdir' / '.hidden').touch() 1300 (wrkdir / 'dir' / 'subdir' / '.hidden').touch()
1301 (wrkdir / 'dir' / 'subdir' / 'file').touch() 1301 (wrkdir / 'dir' / 'subdir' / 'file').touch()
1302 (wrkdir / 'dir2').mkdir() # to make WRKSRC = WRKDIR 1302 (wrkdir / 'dir2').mkdir() # to make WRKSRC = WRKDIR
1303 up.show_var = lambda varname: {'WRKDIR': str(wrkdir)}[varname] 1303 g.show_var = lambda varname: {'WRKDIR': str(wrkdir)}[varname]
1304 up.pkgdir = tmp_path 1304 g.pkgdir = tmp_path
1305 (tmp_path / 'Makefile').write_text('# url2pkg-marker\n') 1305 (tmp_path / 'Makefile').write_text('# url2pkg-marker\n')
1306 adjuster = Adjuster(up, 'https://example.org/distfile-1.0.zip', Lines()) 1306 adjuster = Adjuster(g, 'https://example.org/distfile-1.0.zip', Lines())
1307 1307
1308 adjuster.adjust() 1308 adjuster.adjust()
1309 1309
1310 assert adjuster.wrksrc_dirs == [ 1310 assert adjuster.wrksrc_dirs == [
1311 'dir', 1311 'dir',
1312 'dir/.hidden-dir', 1312 'dir/.hidden-dir',
1313 'dir/subdir', 1313 'dir/subdir',
1314 'dir2', 1314 'dir2',
1315 ] 1315 ]
1316 assert adjuster.wrksrc_files == [ 1316 assert adjuster.wrksrc_files == [
1317 'dir/subdir/.hidden', 1317 'dir/subdir/.hidden',
1318 'dir/subdir/file', 1318 'dir/subdir/file',
1319 'file', 1319 'file',
1320 ] 1320 ]
1321 1321
1322 1322
1323def test_Adjuster_adjust_lines_python_module(tmp_path: Path): 1323def test_Adjuster_adjust_lines_python_module(tmp_path: Path):
1324 url = 'https://github.com/espressif/esptool/archive/v2.7.tar.gz' 1324 url = 'https://github.com/espressif/esptool/archive/v2.7.tar.gz'
1325 up.pkgdir = tmp_path 1325 g.pkgdir = tmp_path
1326 up.make = 'true' # the shell command 1326 g.make = 'true' # the shell command
1327 up.verbose = True 1327 g.verbose = True
1328 initial_lines = Generator(url).generate_Makefile() 1328 initial_lines = Generator(url).generate_Makefile()
1329 initial_lines.append('CATEGORIES', 'python') 1329 initial_lines.append('CATEGORIES', 'python')
1330 adjuster = Adjuster(up, url, initial_lines) 1330 adjuster = Adjuster(g, url, initial_lines)
1331 adjuster.makefile_lines = Lines(*initial_lines.lines) 1331 adjuster.makefile_lines = Lines(*initial_lines.lines)
1332 (up.pkgdir / 'Makefile').touch() 1332 (g.pkgdir / 'Makefile').touch()
1333 1333
1334 assert detab(adjuster.makefile_lines) == [ 1334 assert detab(adjuster.makefile_lines) == [
1335 mkcvsid, 1335 mkcvsid,
1336 '', 1336 '',
1337 'GITHUB_PROJECT= esptool', 1337 'GITHUB_PROJECT= esptool',
1338 'GITHUB_TAG= v2.7', 1338 'GITHUB_TAG= v2.7',
1339 'DISTNAME= v2.7', 1339 'DISTNAME= v2.7',
1340 'PKGNAME= ${GITHUB_PROJECT}-${DISTNAME:S,^v,,}', 1340 'PKGNAME= ${GITHUB_PROJECT}-${DISTNAME:S,^v,,}',
1341 'CATEGORIES= pkgtools python', 1341 'CATEGORIES= pkgtools python',
1342 'MASTER_SITES= ${MASTER_SITE_GITHUB:=espressif/}', 1342 'MASTER_SITES= ${MASTER_SITE_GITHUB:=espressif/}',
1343 'DIST_SUBDIR= ${GITHUB_PROJECT}', 1343 'DIST_SUBDIR= ${GITHUB_PROJECT}',
1344 '', 1344 '',
1345 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org', 1345 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org',
@@ -1361,91 +1361,91 @@ def test_Adjuster_adjust_lines_python_mo @@ -1361,91 +1361,91 @@ def test_Adjuster_adjust_lines_python_mo
1361 'CATEGORIES= pkgtools python', 1361 'CATEGORIES= pkgtools python',
1362 'MASTER_SITES= ${MASTER_SITE_PYPI:=e/esptool/}', 1362 'MASTER_SITES= ${MASTER_SITE_PYPI:=e/esptool/}',
1363 '', 1363 '',
1364 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org', 1364 'MAINTAINER= INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org',
1365 'HOMEPAGE= https://github.com/espressif/esptool/', 1365 'HOMEPAGE= https://github.com/espressif/esptool/',
1366 'COMMENT= TODO: Short description of the package', 1366 'COMMENT= TODO: Short description of the package',
1367 '#LICENSE= # TODO: (see mk/license.mk)', 1367 '#LICENSE= # TODO: (see mk/license.mk)',
1368 '', 1368 '',
1369 '# url2pkg-marker (please do not remove this line.)', 1369 '# url2pkg-marker (please do not remove this line.)',
1370 '.include "../../mk/bsd.pkg.mk"', 1370 '.include "../../mk/bsd.pkg.mk"',
1371 ] 1371 ]
1372 1372
1373 try_mk = tmp_path / 'try-pypi.mk' 1373 try_mk = tmp_path / 'try-pypi.mk'
1374 assert up.err.written() == [ 1374 assert g.err.written() == [
1375 f"url2pkg: running ['true', '-f', '{try_mk}', 'distinfo'] to try PyPI", 1375 f"url2pkg: running ['true', '-f', '{try_mk}', 'distinfo'] to try PyPI",
1376 ] 1376 ]
1377 1377
1378 1378
1379def test_Adjuster_adjust_lines_python_module__edited(): 1379def test_Adjuster_adjust_lines_python_module__edited():
1380 # When the package developer has edited the Makefile, it's unclear 1380 # When the package developer has edited the Makefile, it's unclear
1381 # what has changed. To not damage anything, let the package 1381 # what has changed. To not damage anything, let the package
1382 # developer migrate manually. 1382 # developer migrate manually.
1383 1383
1384 url = 'https://github.com/espressif/esptool/archive/v2.7.tar.gz' 1384 url = 'https://github.com/espressif/esptool/archive/v2.7.tar.gz'
1385 initial_lines = Generator(url).generate_Makefile() 1385 initial_lines = Generator(url).generate_Makefile()
1386 initial_lines.append('CATEGORIES', 'python') 1386 initial_lines.append('CATEGORIES', 'python')
1387 adjuster = Adjuster(up, url, initial_lines) 1387 adjuster = Adjuster(g, url, initial_lines)
1388 adjuster.makefile_lines = Lines(*initial_lines.lines) 1388 adjuster.makefile_lines = Lines(*initial_lines.lines)
1389 initial_lines.add('') # to make the lines different 1389 initial_lines.add('') # to make the lines different
1390 1390
1391 lines = adjuster.generate_lines() 1391 lines = adjuster.generate_lines()
1392 1392
1393 assert lines.get('GITHUB_PROJECT') == 'esptool' 1393 assert lines.get('GITHUB_PROJECT') == 'esptool'
1394 1394
1395 adjuster.adjust_lines_python_module(lines) 1395 adjuster.adjust_lines_python_module(lines)
1396 1396
1397 assert lines.get('GITHUB_PROJECT') == 'esptool' 1397 assert lines.get('GITHUB_PROJECT') == 'esptool'
1398 assert lines.index('TODO: Migrate MASTER_SITES to MASTER_SITE_PYPI') == 14 1398 assert lines.index('TODO: Migrate MASTER_SITES to MASTER_SITE_PYPI') == 14
1399 1399
1400 1400
1401def test_main__wrong_dir(tmp_path): 1401def test_main__wrong_dir(tmp_path):
1402 os.chdir(tmp_path) 1402 os.chdir(tmp_path)
1403 error = r'url2pkg: must be run from a package directory' 1403 error = r'url2pkg: must be run from a package directory'
1404 1404
1405 with pytest.raises(SystemExit, match=error): 1405 with pytest.raises(SystemExit, match=error):
1406 main(['url2pkg'], up) 1406 main(['url2pkg'], g)
1407 1407
1408 1408
1409def test_main__unknown_option(): 1409def test_main__unknown_option():
1410 with pytest.raises(SystemExit, match=r'usage:'): 1410 with pytest.raises(SystemExit, match=r'usage:'):
1411 main(['url2pkg', '--unknown'], up) 1411 main(['url2pkg', '--unknown'], g)
1412 1412
1413 1413
1414def test_main__verbose(): 1414def test_main__verbose():
1415 with pytest.raises(SystemExit, match=r'url2pkg: invalid URL: broken URL'): 1415 with pytest.raises(SystemExit, match=r'url2pkg: invalid URL: broken URL'):
1416 main(['url2pkg', '--verbose', 'broken URL'], up) 1416 main(['url2pkg', '--verbose', 'broken URL'], g)
1417 1417
1418 1418
1419def test_main__valid_URL(): 1419def test_main__valid_URL():
1420 import shutil 1420 import shutil
1421 1421
1422 up.editor = 'true' 1422 g.editor = 'true'
1423 up.make = os.getenv('MAKE') or sys.exit('MAKE must be set') 1423 g.make = os.getenv('MAKE') or sys.exit('MAKE must be set')
1424 up.pkgdir = up.pkgsrcdir / 'pkgtools' / 'url2pkg-test-main' 1424 g.pkgdir = g.pkgsrcdir / 'pkgtools' / 'url2pkg-test-main'
1425 up.pkgdir.is_dir() and shutil.rmtree(up.pkgdir) 1425 g.pkgdir.is_dir() and shutil.rmtree(g.pkgdir)
1426 try: 1426 try:
1427 up.pkgdir.mkdir() 1427 g.pkgdir.mkdir()
1428 except OSError: 1428 except OSError:
1429 return # skip if the directory is not writable 1429 return # skip if the directory is not writable
1430 os.chdir(up.pkgdir) 1430 os.chdir(g.pkgdir)
1431 1431
1432 main(['url2pkg', '-v', 'https://github.com/rillig/checkperms/archive/v1.12.tar.gz'], up) 1432 main(['url2pkg', '-v', 'https://github.com/rillig/checkperms/archive/v1.12.tar.gz'], g)
1433 1433
1434 assert up.out.written() == [ 1434 assert g.out.written() == [
1435 '', 1435 '',
1436 'Remember to run pkglint when you\'re done.', 1436 'Remember to run pkglint when you\'re done.',
1437 'See ../../doc/pkgsrc.txt to get some help.', 1437 'See ../../doc/pkgsrc.txt to get some help.',
1438 '', 1438 '',
1439 ] 1439 ]
1440 assert up.err.written() == [ 1440 assert g.err.written() == [
1441 f'url2pkg: running bmake (\'clean\', \'distinfo\', \'extract\') in \'{up.pkgdir}\'', 1441 f'url2pkg: running bmake (\'clean\', \'distinfo\', \'extract\') in \'{g.pkgdir}\'',
1442 'url2pkg: Adjusting the Makefile', 1442 'url2pkg: Adjusting the Makefile',
1443 ] 1443 ]
1444 1444
1445 up.verbose = False 1445 g.verbose = False
1446 up.bmake('clean') # remove the work directory 1446 g.bmake('clean') # remove the work directory
1447 1447
1448 expected_files = ['DESCR', 'Makefile', 'PLIST', 'distinfo'] 1448 expected_files = ['DESCR', 'Makefile', 'PLIST', 'distinfo']
1449 assert sorted([f.name for f in up.pkgdir.glob("*")]) == expected_files 1449 assert sorted([f.name for f in g.pkgdir.glob("*")]) == expected_files
1450 1450
1451 shutil.rmtree(up.pkgdir) 1451 shutil.rmtree(g.pkgdir)