fedora-python / pyp2rpm

Tool to convert a package from PyPI to RPM SPECFILE or to generate SRPM.
MIT License
125 stars 39 forks source link

sre_constants.error: multiple repeat #49

Closed xsuchy closed 8 years ago

xsuchy commented 8 years ago
$ pyp2rpm collective.generic.skel --srpm -d /tmp/tmp7f_M30 -b 2
INFO  Pyp2rpm initialized.
INFO  Using /tmp/tmp7f_M30 as directory to save source.
INFO  Downloaded package from PyPI: /tmp/tmp7f_M30/collective.generic.skel-0.1.0.zip.
INFO  Getting metadata from setup.py using DistMetadataExtractor.
Traceback (most recent call last):
  File "/usr/bin/pyp2rpm", line 9, in <module>
    load_entry_point('pyp2rpm==3.0.2', 'console_scripts', 'pyp2rpm')()
  File "/usr/lib/python3.4/site-packages/click/core.py", line 716, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3.4/site-packages/click/core.py", line 696, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3.4/site-packages/click/core.py", line 889, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3.4/site-packages/click/core.py", line 534, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python3.4/site-packages/pyp2rpm/bin.py", line 98, in main
    converted = convertor.convert()
  File "/usr/lib/python3.4/site-packages/pyp2rpm/convertor.py", line 77, in convert
    data = self.metadata_extractor.extract_data(self.client)
  File "/usr/lib/python3.4/site-packages/pyp2rpm/metadata_extractors.py", line 36, in inner
    data = extraction_fce(self)
  File "/usr/lib/python3.4/site-packages/pyp2rpm/metadata_extractors.py", line 158, in extract_data
    data.set_from(self.data_from_archive)
  File "/usr/lib/python3.4/site-packages/pyp2rpm/metadata_extractors.py", line 448, in data_from_archive
    archive_data = super(DistMetadataExtractor, self).data_from_archive
  File "/usr/lib/python3.4/site-packages/pyp2rpm/metadata_extractors.py", line 375, in data_from_archive
    sphinx_dir = self.sphinx_dir
  File "/usr/lib/python3.4/site-packages/pyp2rpm/metadata_extractors.py", line 272, in sphinx_dir
    r'{0}/conf.py'.format(d), full_path=True)) > 0
  File "/usr/lib/python3.4/site-packages/pyp2rpm/archive.py", line 212, in get_files_re
    compiled_re = re.compile(file_re)
  File "/usr/lib64/python3.4/re.py", line 223, in compile
    return _compile(pattern, flags)
  File "/usr/lib64/python3.4/re.py", line 294, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/usr/lib64/python3.4/sre_compile.py", line 568, in compile
    p = sre_parse.parse(p, flags)
  File "/usr/lib64/python3.4/sre_parse.py", line 760, in parse
    p = _parse_sub(source, pattern, 0)
  File "/usr/lib64/python3.4/sre_parse.py", line 370, in _parse_sub
    itemsappend(_parse(source, state))
  File "/usr/lib64/python3.4/sre_parse.py", line 581, in _parse
    raise error("multiple repeat")
sre_constants.error: multiple repeat
xsuchy commented 8 years ago

Beg me pardon. I think you just masked the issue. The real problem is in metadata_extractors.py:

contains_conf_py = len(self.archive.get_files_re(
                r'{0}/conf.py'.format(d), full_path=True))

So you are interpreting directory name as regular expression.

I'm not sure what means 'multiple repeat', but you can demonstrate the problem with:

import re
d="("
re.compile(r'{0}/conf.py'.format(d))

which yields similar error.

xsuchy commented 8 years ago

and multiple repeat can be reproduced with

d="p++"

See http://stackoverflow.com/questions/19942314/python-multiple-repeat-error

mcyprian commented 8 years ago

I've noticed what is the origin of the problem, there is already a lot of heuristic in sphinx_dir method so I thought it was alright to skip some of the directories if it can't be used as an regex. 49014c298b8a120019f689eaaf is probably better way how to fix the issue.