MCPcopy Create free account
hub / github.com/aboutcode-org/scancode-toolkit / collect_rpms

Function collect_rpms

src/packagedcode/rpm_installed.py:65–120  ·  view source on GitHub ↗

Yield lists of RPM raw tags, one list for each RPM from an XML'ish ``text``. The XML'ish format is in fact multiple XML documents, one for each package wrapped in an root element. Therefore, we add a global root element to make this a valid XML document before parsing i

(text)

Source from the content-addressed store, hash-verified

63
64
65def collect_rpms(text):
66 """
67 Yield lists of RPM raw tags, one list for each RPM from an XML'ish ``text``.
68
69 The XML'ish format is in fact multiple XML documents, one for each package
70 wrapped in an <rpmHeader> root element. Therefore, we add a global root
71 element to make this a valid XML document before parsing it.
72
73 Each XML document represents one RPM package and has this overall shape:
74 <rpmHeader>
75 ....
76 <rpmTag name="Name"><string>perl-Errno</string></rpmTag>
77 <rpmTag name="Version"><string>1.30</string></rpmTag>
78 ......
79 <rpmTag name="License"><string>GPL+ or Artistic</string></rpmTag>
80 ....
81 <rpmTag name="Filesizes">
82 <integer>6863</integer>
83 <integer>2629</integer>
84 </rpmTag>
85 <rpmTag name="Filemodes">
86 <integer>33188</integer>
87 <integer>33188</integer>
88 </rpmTag>
89 ...
90 </rpmHeader>
91
92 After wrapping in a top level element we get this shape:
93 <rpms>
94 <rpmHeader/>
95 <rpmHeader/>
96 </rpms>
97
98 When parsed with xmltodict we end up with this structure:
99 {'rpms': {'rpmHeader': [
100 {'rpmTag': [
101 {'@name': 'Name', 'string': 'boost-license1_71_0'},
102 {'@name': 'Version', 'string': '1.71.0'},
103 {'@name': 'Filesizes', 'integer': ['0', '1338']},
104 {'@name': 'Filestates', 'integer': ['0', '0']},
105 ]},
106 {'rpmTag': [
107 {'@name': 'Name', 'string': 'foobar'},
108 {'@name': 'Version', 'string': '1.0'},
109 ...
110 ]},
111 }}
112
113 Some of these structures are peculiar as there are parallel lists (for
114 instance for files) and each name comes with a type.
115 """
116 text = f'<rpms>{text}</rpms>'
117 parsed = xmltodict.parse(text, dict_constructor=dict)
118 rpms = parsed['rpms']['rpmHeader']
119 for rpm in rpms:
120 yield rpm['rpmTag']
121
122

Callers 1

parse_rpm_xmlishFunction · 0.85

Calls 1

parseMethod · 0.45

Tested by

no test coverage detected