Skip to content

Commit 350d4ab

Browse files
Fix multiple podspec handling
Signed-off-by: Ayan Sinha Mahapatra <ayansmahapatra@gmail.com>
1 parent ed8e51c commit 350d4ab

5 files changed

Lines changed: 159 additions & 676 deletions

File tree

src/packagedcode/cocoapods.py

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
import hashlib
1111
import json
12+
import os
13+
import logging
14+
from struct import pack
1215

1316
import saneyaml
1417
from packageurl import PackageURL
@@ -26,6 +29,24 @@
2629
See https://cocoapods.org
2730
"""
2831

32+
TRACE = os.environ.get('SCANCODE_DEBUG_PACKAGE', False)
33+
34+
def logger_debug(*args):
35+
pass
36+
37+
38+
logger = logging.getLogger(__name__)
39+
40+
if TRACE:
41+
import sys
42+
logging.basicConfig(stream=sys.stdout)
43+
logger.setLevel(logging.DEBUG)
44+
45+
def logger_debug(*args):
46+
return logger.debug(
47+
' '.join(isinstance(a, str) and a or repr(a) for a in args)
48+
)
49+
2950
# TODO: consider merging Gemfile.lock and Podfile.lock in one module: this is the same format
3051

3152
# TODO: override the license detection to detect declared_license correctly.
@@ -96,7 +117,7 @@ class BasePodHandler(models.DatafileHandler):
96117
@classmethod
97118
def assemble(cls, package_data, resource, codebase):
98119
"""
99-
Assemble pod packages and dependencies and handle the specifc cases where
120+
Assemble pod packages and dependencies and handle the specific cases where
100121
there are more than one podspec in the same directory.
101122
This is designed to process .podspec, Podfile and Podfile.lock
102123
"""
@@ -114,13 +135,15 @@ def assemble(cls, package_data, resource, codebase):
114135
has_single_podspec = siblings_counts == 1
115136
has_multiple_podspec = siblings_counts > 1
116137

138+
datafile_name_patterns = (
139+
'Podfile.lock',
140+
'Podfile',
141+
)
142+
117143
if has_single_podspec:
118144
# we can treat all podfile/spec as being for one package
119-
datafile_name_patterns = (
120-
sibling_podspecs[0].name,
121-
'Podfile.lock',
122-
'Podfile',
123-
)
145+
datafile_name_patterns = (sibling_podspecs[0].name,) + datafile_name_patterns
146+
124147
yield from models.DatafileHandler.assemble_from_many_datafiles(
125148
datafile_name_patterns=datafile_name_patterns,
126149
directory=parent,
@@ -131,24 +154,29 @@ def assemble(cls, package_data, resource, codebase):
131154
# treat each of podspec and podfile alone without meraging
132155
# as we cannot determine easily which podfile is for which
133156
# podspec
134-
yield from models.DatafileHandler.assemble(package_data, resource, codebase)
157+
podspec = sibling_podspecs.pop()
158+
datafile_name_patterns = (podspec.name,) + datafile_name_patterns
135159

136-
datafile_name_patterns = (
137-
'Podfile.lock',
138-
'Podfile',
139-
)
140160
yield from models.DatafileHandler.assemble_from_many_datafiles(
141161
datafile_name_patterns=datafile_name_patterns,
142162
directory=parent,
143163
codebase=codebase,
144164
)
145165

166+
for resource in sibling_podspecs:
167+
datafile_path = resource.path
168+
yield resource
169+
for package_data in resource.package_data:
170+
package_data = models.PackageData.from_dict(package_data)
171+
package = models.Package.from_package_data(
172+
package_data=package_data,
173+
datafile_path=datafile_path,
174+
)
175+
cls.assign_package_to_resources(package, resource, codebase)
176+
yield package
177+
146178
else:
147179
# has_no_podspec:
148-
datafile_name_patterns = (
149-
'Podfile.lock',
150-
'Podfile',
151-
)
152180
yield from models.DatafileHandler.assemble_from_many_datafiles(
153181
datafile_name_patterns=datafile_name_patterns,
154182
directory=parent,

src/packagedcode/models.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import os
1111
import uuid
1212
from fnmatch import fnmatchcase
13+
import logging
1314

1415
import attr
1516
from packageurl import normalize_qualifiers
@@ -107,21 +108,20 @@
107108
TRACE = SCANCODE_DEBUG_PACKAGE_API
108109
TRACE_UPDATE = SCANCODE_DEBUG_PACKAGE_API
109110

111+
def logger_debug(*args):
112+
pass
113+
114+
logger = logging.getLogger(__name__)
115+
110116
if TRACE or TRACE_UPDATE:
111-
use_print = True
112-
if use_print:
113-
prn = print
114-
else:
115-
import logging
116-
import sys
117-
logger = logging.getLogger(__name__)
118-
# logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)
119-
logging.basicConfig(stream=sys.stdout)
120-
logger.setLevel(logging.DEBUG)
121-
prn = logger.debug
117+
import sys
118+
logging.basicConfig(stream=sys.stdout)
119+
logger.setLevel(logging.DEBUG)
122120

123121
def logger_debug(*args):
124-
return prn(' '.join(isinstance(a, str) and a or repr(a) for a in args))
122+
return logger.debug(
123+
' '.join(isinstance(a, str) and a or repr(a) for a in args)
124+
)
125125

126126

127127
class ModelMixin:
@@ -1090,6 +1090,9 @@ def assemble_from_many_datafiles(cls, datafile_name_patterns, directory, codebas
10901090
pkgdata_resources.append((package_data, sibling,))
10911091

10921092
if pkgdata_resources:
1093+
if TRACE:
1094+
logger_debug(f' assemble_from_many_datafiles: pkgdata_resources: {pkgdata_resources!r}')
1095+
10931096
yield from cls.assemble_from_many(
10941097
pkgdata_resources=pkgdata_resources,
10951098
codebase=codebase,

src/packagedcode/plugin_package.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import attr
1111
import click
1212
import os
13+
import logging
1314
import sys
1415

1516
from commoncode.cliutils import PluggableCommandLineOption
@@ -24,25 +25,25 @@
2425
from packagedcode.models import Package
2526
from packagedcode.models import PackageData
2627

28+
2729
TRACE = os.environ.get('SCANCODE_DEBUG_PACKAGE', False)
2830

29-
if TRACE:
3031

31-
use_print = True
32+
def logger_debug(*args):
33+
pass
3234

33-
if use_print:
34-
printer = print
35-
else:
36-
import logging
3735

38-
logger = logging.getLogger(__name__)
39-
# logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)
40-
logging.basicConfig(stream=sys.stdout)
41-
logger.setLevel(logging.DEBUG)
42-
printer = logger.debug
36+
logger = logging.getLogger(__name__)
37+
38+
if TRACE:
39+
import sys
40+
logging.basicConfig(stream=sys.stdout)
41+
logger.setLevel(logging.DEBUG)
4342

4443
def logger_debug(*args):
45-
return printer(' '.join(isinstance(a, str) and a or repr(a) for a in args))
44+
return logger.debug(
45+
' '.join(isinstance(a, str) and a or repr(a) for a in args)
46+
)
4647

4748

4849
def print_packages(ctx, param, value):
@@ -171,7 +172,7 @@ def create_package_and_deps(codebase, **kwargs):
171172

172173
for item in items:
173174
if TRACE:
174-
logger_debug(' create_package_and_deps: item:', item,)
175+
logger_debug(' create_package_and_deps: item:', item)
175176

176177
if isinstance(item, Package):
177178
packages_top_level.append(item)
@@ -181,6 +182,8 @@ def create_package_and_deps(codebase, **kwargs):
181182

182183
elif isinstance(item, Resource):
183184
seen_resource_ids.add(item.rid)
185+
if TRACE:
186+
logger_debug(' create_package_and_deps: seen_resource_ids:', seen_resource_ids,)
184187

185188
else:
186189
raise Exception(f'Unknown package assembly item type: {item!r}')

0 commit comments

Comments
 (0)