Return a PackageData object from a ``package_fields`` iterable of (name, value) tuples. The ``package_fields`` names are either: - the short form one-letter field names used in an APKINDEX and an installed database file - the long form field names seen in an APKBUILD bu
(package_fields, datasource_id, package_type, package_only=False)
| 812 | |
| 813 | |
| 814 | def build_package_data(package_fields, datasource_id, package_type, package_only=False): |
| 815 | """ |
| 816 | Return a PackageData object from a ``package_fields`` iterable of (name, |
| 817 | value) tuples. |
| 818 | |
| 819 | The ``package_fields`` names are either: |
| 820 | |
| 821 | - the short form one-letter field names used in an APKINDEX and an installed |
| 822 | database file |
| 823 | |
| 824 | - the long form field names seen in an APKBUILD build manifest/script and an |
| 825 | APKINFO data file. |
| 826 | |
| 827 | Note: we do NOT use a dict for ``package_fields`` because some fields names |
| 828 | may occur more than once. |
| 829 | |
| 830 | See for details: |
| 831 | https://wiki.alpinelinux.org/wiki/Apk_spec#Install_DB |
| 832 | https://wiki.alpinelinux.org/wiki/APKBUILD_Reference |
| 833 | https://wiki.alpinelinux.org/wiki/Alpine_package_format |
| 834 | https://git.alpinelinux.org/apk-tools/tree/src/package.c?id=82de29cf7bad3d9cbb0aeb4dbe756ad2bde73eb3#n774 |
| 835 | """ |
| 836 | package_fields = list(package_fields) |
| 837 | all_fields = dict(package_fields) |
| 838 | |
| 839 | # mapping of actual Package field name -> value that have been converted to |
| 840 | # the expected normalized format |
| 841 | converted_fields = { |
| 842 | 'datasource_id': datasource_id, |
| 843 | 'type': package_type, |
| 844 | } |
| 845 | for name, value in package_fields: |
| 846 | handler = package_handlers_by_field_name.get(name) |
| 847 | if handler: |
| 848 | try: |
| 849 | converted = handler(value, all_fields=all_fields, **converted_fields) |
| 850 | except: |
| 851 | raise Exception(*list(package_fields)) |
| 852 | |
| 853 | # for extra data we update the existing |
| 854 | extra_data = converted.pop('extra_data', {}) or {} |
| 855 | if extra_data: |
| 856 | existing_extra_data = converted_fields.get('extra_data') |
| 857 | if existing_extra_data: |
| 858 | existing_extra_data.update(extra_data) |
| 859 | else: |
| 860 | converted_fields['extra_data'] = dict(extra_data) |
| 861 | |
| 862 | converted_fields.update(converted) |
| 863 | |
| 864 | fields_not_required = ["current_file", "current_dir"] |
| 865 | for field in fields_not_required: |
| 866 | value = converted_fields.get(field) |
| 867 | if value: |
| 868 | converted_fields.pop(field) |
| 869 | |
| 870 | return models.PackageData.from_data( |
| 871 | package_data=converted_fields, |