tlocke/scramp

with github tag version tar.gz package it is not possible to create scramp versionned rpm (missing PKG-INFO)

bruno-at-bareos opened this issue · 11 comments

I've found in issue 10 the following comment, but I didn't success to update the build of scramp on openSUSE obs build.
https://build.opensuse.org/package/show/home:bruno_friedmann:branches:devel:languages:python/python-scramp

Scramp finish with 0.0.0 which is not good. Beware the build being done on an isolated vm with no remote access we can't download whatever from internet.

So is there a way to setup correctly the version with the rpm ${version} variable ?

          Hi @robert-schmidtke, I think the problem may lie with the way Scramp is packaged for conda. Scramp now finds its version by doing:
try:
    from importlib.metadata import version
except ImportError:
    from importlib_metadata import version

__version__ = version("scramp")

so it uses Scramp's metadata to find the version. The version metadata is created using versioningit. So I think my first thought is that the problem lies with the Conda packaging, but let me know if you find that we need to change something in Scramp.

Originally posted by @tlocke in #10 (comment)

build changelog extract

[   13s] -----------------------------------------------------------------
[   13s] + exec rpmbuild -ba --define '_srcdefattr (-,root,root)' --nosignature --define '_build_create_debug 1' /home/abuild/rpmbuild/SOURCES/python-scramp.spec
[   13s] setting SOURCE_DATE_EPOCH=1670976000
[   13s] Executing(%prep): /usr/bin/bash -e /var/tmp/rpm-tmp.UNUDSW
[   13s] + umask 022
[   13s] + cd /home/abuild/rpmbuild/BUILD
[   13s] + cd /home/abuild/rpmbuild/BUILD
[   13s] + rm -rf scramp-1.4.4
[   13s] + /usr/lib/rpm/rpmuncompress -x /home/abuild/rpmbuild/SOURCES/python-scramp-1.4.4.tar.gz
[   13s] + STATUS=0
[   13s] + '[' 0 -ne 0 ']'
[   13s] + cd scramp-1.4.4
[   13s] + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
[   13s] + RPM_EC=0
[   13s] ++ jobs -p
[   13s] + exit 0
[   13s] Executing(%build): /usr/bin/bash -e /var/tmp/rpm-tmp.jo7abu
[   13s] + umask 022
[   13s] + cd /home/abuild/rpmbuild/BUILD
[   13s] + /usr/bin/rm -rf /home/abuild/rpmbuild/BUILDROOT/python-scramp-1.4.4-0.x86_64
[   13s] ++ dirname /home/abuild/rpmbuild/BUILDROOT/python-scramp-1.4.4-0.x86_64
[   13s] + /usr/bin/mkdir -p /home/abuild/rpmbuild/BUILDROOT
[   13s] + /usr/bin/mkdir /home/abuild/rpmbuild/BUILDROOT/python-scramp-1.4.4-0.x86_64
[   13s] + cd scramp-1.4.4
[   13s] ++ '[' -f _current_flavor ']'
[   13s] ++ true
[   13s] + last_flavor=
[   13s] + '[' -z '' ']'
[   13s] + last_flavor=tmp
[   13s] + '[' tmp '!=' python38 ']'
[   13s] + '[' -d build ']'
[   13s] + '[' -d _build.python38 ']'
[   13s] + echo python38
[   13s] + python_flavor=python38
[   13s] + myargs=
[   13s] + '[' -f './dist/*-none-any.whl' ']'
[   13s] + /usr/bin/python3.8 -mpip wheel --verbose --progress-bar off --disable-pip-version-check --use-pep517 --no-build-isolation --no-deps --wheel-dir ./build .
[   14s] Processing /home/abuild/rpmbuild/BUILD/scramp-1.4.4
[   14s]   Preparing metadata (pyproject.toml): started
[   14s]   Running command Preparing metadata (pyproject.toml)
[   14s]   Traceback (most recent call last):
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/git.py", line 146, in ensure_is_repo
[   14s]       self.read(
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/git.py", line 178, in read
[   14s]       return readcmd("git", *args, cwd=str(self.path), **kwargs)
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/util.py", line 71, in readcmd
[   14s]       s = runcmd(*args, stdout=subprocess.PIPE, text=True, **kwargs).stdout
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/util.py", line 66, in runcmd
[   14s]       return subprocess.run(arglist, **kwargs)
[   14s]     File "/usr/lib64/python3.8/subprocess.py", line 493, in run
[   14s]       with Popen(*popenargs, **kwargs) as process:
[   14s]     File "/usr/lib64/python3.8/subprocess.py", line 858, in __init__
[   14s]       self._execute_child(args, executable, preexec_fn, close_fds,
[   14s]     File "/usr/lib64/python3.8/subprocess.py", line 1704, in _execute_child
[   14s]       raise child_exception_type(errno_num, err_msg, err_filename)
[   14s]   FileNotFoundError: [Errno 2] No such file or directory: 'git'
[   14s]
[   14s]   During handling of the above exception, another exception occurred:
[   14s]
[   14s]   Traceback (most recent call last):
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/core.py", line 257, in run
[   14s]       description = self.do_vcs()
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/core.py", line 321, in do_vcs
[   14s]       description = self.vcs(project_dir=self.project_dir)
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/methods.py", line 162, in __call__
[   14s]       return self.method(params=self.params, **kwargs)
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/git.py", line 225, in describe_git
[   14s]       repo.ensure_is_repo()
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/git.py", line 154, in ensure_is_repo
[   14s]       raise NotVCSError("Git not installed; assuming this isn't a Git repository")
[   14s]   versioningit.errors.NotVCSError: Git not installed; assuming this isn't a Git repository
[   14s]
[   14s]   During handling of the above exception, another exception occurred:
[   14s]
[   14s]   Traceback (most recent call last):
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/core.py", line 539, in get_version_from_pkg_info
[   14s]       Path(project_dir, "PKG-INFO").read_text(encoding="utf-8")
[   14s]     File "/usr/lib64/python3.8/pathlib.py", line 1236, in read_text
[   14s]       with self.open(mode='r', encoding=encoding, errors=errors) as f:
[   14s]     File "/usr/lib64/python3.8/pathlib.py", line 1222, in open
[   14s]       return io.open(self, mode, buffering, encoding, errors, newline,
[   14s]     File "/usr/lib64/python3.8/pathlib.py", line 1078, in _opener
[   14s]       return self._accessor.open(self, flags, mode)
[   14s]   FileNotFoundError: [Errno 2] No such file or directory: '/home/abuild/rpmbuild/BUILD/scramp-1.4.4/PKG-INFO'
[   14s]
[   14s]   During handling of the above exception, another exception occurred:
[   14s]
[   14s]   Traceback (most recent call last):
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/hook.py", line 23, in setuptools_finalizer
[   14s]       report = vgit.run(write=True, fallback=True)
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/core.py", line 280, in run
[   14s]       version=get_version_from_pkg_info(self.project_dir)
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/core.py", line 542, in get_version_from_pkg_info
[   14s]       raise NotSdistError(f"{project_dir} does not contain a PKG-INFO file")
[   14s]   versioningit.errors.NotSdistError: /home/abuild/rpmbuild/BUILD/scramp-1.4.4 does not contain a PKG-INFO file
[   14s]
[   14s]   During handling of the above exception, another exception occurred:
[   14s]
[   14s]   Traceback (most recent call last):
[   14s]     File "/usr/lib/python3.8/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 351, in <module>
[   14s]       main()
[   14s]     File "/usr/lib/python3.8/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 333, in main
[   14s]       json_out['return_val'] = hook(**hook_input['kwargs'])
[   14s]     File "/usr/lib/python3.8/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 152, in prepare_metadata_for_build_wheel
[   14s]       return hook(metadata_directory, config_settings)
[   14s]     File "/usr/lib/python3.8/site-packages/setuptools/build_meta.py", line 377, in prepare_metadata_for_build_wheel
[   14s]       self.run_setup()
[   14s]     File "/usr/lib/python3.8/site-packages/setuptools/build_meta.py", line 335, in run_setup
[   14s]       exec(code, locals())
[   14s]     File "<string>", line 1, in <module>
[   14s]     File "/usr/lib/python3.8/site-packages/setuptools/__init__.py", line 87, in setup
[   14s]       return distutils.core.setup(**attrs)
[   14s]     File "/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py", line 147, in setup
[   14s]       _setup_distribution = dist = klass(attrs)
[   14s]     File "/usr/lib/python3.8/site-packages/setuptools/dist.py", line 475, in __init__
[   14s]       _Distribution.__init__(
[   14s]     File "/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py", line 283, in __init__
[   14s]       self.finalize_options()
[   14s]     File "/usr/lib/python3.8/site-packages/setuptools/dist.py", line 899, in finalize_options
[   14s]       ep(self)
[   14s]     File "/usr/lib/python3.8/site-packages/versioningit/hook.py", line 28, in setuptools_finalizer
[   14s]       raise RuntimeError(
[   14s]   RuntimeError:
[   14s]   versioningit could not find a version for the project in /home/abuild/rpmbuild/BUILD/scramp-1.4.4!
[   14s]
[   14s]   You may be installing from a shallow clone, in which case you need to unshallow it first.
[   14s]
[   14s]   Alternatively, you may be installing from a Git archive, which is not supported by default.  Install from a git+https://... URL instead.
[   14s]
[   14s]
[   14s]   error: subprocess-exited-with-error
[   14s]
[   14s]   × Preparing metadata (pyproject.toml) did not run successfully.
[   14s]   │ exit code: 1
[   14s]   ╰─> See above for output.
[   14s]
[   14s]   note: This error originates from a subprocess, and is likely not a problem with pip.
[   14s]   full command: /usr/bin/python3.8 /usr/lib/python3.8/site-packages/pip/_vendor/pep517/in_process/_in_process.py prepare_metadata_for_build_wheel /tmp/tmpntpjz1nq
[   14s]   cwd: /home/abuild/rpmbuild/BUILD/scramp-1.4.4
[   14s]   Preparing metadata (pyproject.toml): finished with status 'error'
[   14s] error: metadata-generation-failed

Hi @bruno-at-bareos, I'm not sure what to do about this. The modern method of Python packaging has the version held in the metadata of the wheel. But that means that the version isn't necessarily present in the tar.gz. Do you have any ideas? Also, I wonder what other Python packages do?

I've looked into this a bit more, and actually versioningit should be able to read the version from the PKG-INFO file which is in the sdist. So I'm puzzled by the error you found:

FileNotFoundError: [Errno 2] No such file or directory: '/home/abuild/rpmbuild/BUILD/scramp-1.4.4/PKG-INFO

How is it that this file is missing, and yet it's in the .tar.gz?

In fact I've just done a test where I downloaded scramp-1.4.4.tar.gz, unpacked it, and then was able to build it with python -m build.

I have to review what the dedicated macros does, and I hope none of them are removing the PKG-INFO.
Thanks a lot for your support, I'll post the result here.

I'm a bit puzzled by your report, as here the content of the tar.gz doesn't contain the PKG-INFO

tar -tvf 1.4.4.tar.gz
drwxrwxr-x root/root         0 2022-11-01 18:15 scramp-1.4.4/
drwxrwxr-x root/root         0 2022-11-01 18:15 scramp-1.4.4/.github/
drwxrwxr-x root/root         0 2022-11-01 18:15 scramp-1.4.4/.github/workflows/
-rw-rw-r-- root/root      1025 2022-11-01 18:15 scramp-1.4.4/.github/workflows/test.yml
-rw-rw-r-- root/root      1222 2022-11-01 18:15 scramp-1.4.4/.gitignore
-rw-rw-r-- root/root       906 2022-11-01 18:15 scramp-1.4.4/LICENSE
-rw-rw-r-- root/root     18790 2022-11-01 18:15 scramp-1.4.4/README.rst
-rw-rw-r-- root/root      1533 2022-11-01 18:15 scramp-1.4.4/pyproject.toml
drwxrwxr-x root/root         0 2022-11-01 18:15 scramp-1.4.4/scramp/
-rw-rw-r-- root/root       335 2022-11-01 18:15 scramp-1.4.4/scramp/__init__.py
-rw-rw-r-- root/root     22503 2022-11-01 18:15 scramp-1.4.4/scramp/core.py
-rw-rw-r-- root/root       655 2022-11-01 18:15 scramp-1.4.4/scramp/utils.py
-rw-rw-r-- root/root       158 2022-11-01 18:15 scramp-1.4.4/setup.cfg
drwxrwxr-x root/root         0 2022-11-01 18:15 scramp-1.4.4/test/
-rw-rw-r-- root/root       222 2022-11-01 18:15 scramp-1.4.4/test/test_readme.py
-rw-rw-r-- root/root     18116 2022-11-01 18:15 scramp-1.4.4/test/test_scramp.py

And when I extract this locally and try to build it I got this error message

Traceback (most recent call last):
  File "/usr/lib/python3.10/site-packages/versioningit/git.py", line 146, in ensure_is_repo
    self.read(
  File "/usr/lib/python3.10/site-packages/versioningit/git.py", line 178, in read
    return readcmd("git", *args, cwd=str(self.path), **kwargs)
  File "/usr/lib/python3.10/site-packages/versioningit/util.py", line 71, in readcmd
    s = runcmd(*args, stdout=subprocess.PIPE, text=True, **kwargs).stdout
  File "/usr/lib/python3.10/site-packages/versioningit/util.py", line 66, in runcmd
    return subprocess.run(arglist, **kwargs)
  File "/usr/lib64/python3.10/subprocess.py", line 526, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['git', 'rev-parse', '--is-inside-work-tree']' returned non-zero exit status 128.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.10/site-packages/versioningit/core.py", line 257, in run
    description = self.do_vcs()
  File "/usr/lib/python3.10/site-packages/versioningit/core.py", line 321, in do_vcs
    description = self.vcs(project_dir=self.project_dir)
  File "/usr/lib/python3.10/site-packages/versioningit/methods.py", line 162, in __call__
    return self.method(params=self.params, **kwargs)
  File "/usr/lib/python3.10/site-packages/versioningit/git.py", line 225, in describe_git
    repo.ensure_is_repo()
  File "/usr/lib/python3.10/site-packages/versioningit/git.py", line 156, in ensure_is_repo
    raise NotVCSError(f"{self.path} is not in a Git repository")
versioningit.errors.NotVCSError: /ioda/home/bruno/openSUSE/obs/home:bruno_friedmann:branches:devel:languages:python/python-scramp/scramp-1.4.4 is not in a Git repository

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.10/site-packages/versioningit/core.py", line 539, in get_version_from_pkg_info
    Path(project_dir, "PKG-INFO").read_text(encoding="utf-8")
  File "/usr/lib64/python3.10/pathlib.py", line 1134, in read_text
    with self.open(mode='r', encoding=encoding, errors=errors) as f:
  File "/usr/lib64/python3.10/pathlib.py", line 1119, in open
    return self._accessor.open(self, mode, buffering, encoding, errors,
FileNotFoundError: [Errno 2] No such file or directory: '/ioda/home/bruno/openSUSE/obs/home:bruno_friedmann:branches:devel:languages:python/python-scramp/scramp-1.4.4/PKG-INFO'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.10/site-packages/versioningit/hook.py", line 23, in setuptools_finalizer
    report = vgit.run(write=True, fallback=True)
  File "/usr/lib/python3.10/site-packages/versioningit/core.py", line 280, in run
    version=get_version_from_pkg_info(self.project_dir)
  File "/usr/lib/python3.10/site-packages/versioningit/core.py", line 542, in get_version_from_pkg_info
    raise NotSdistError(f"{project_dir} does not contain a PKG-INFO file")
versioningit.errors.NotSdistError: /ioda/home/bruno/openSUSE/obs/home:bruno_friedmann:branches:devel:languages:python/python-scramp/scramp-1.4.4 does not contain a PKG-INFO file

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib64/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib64/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3.10/site-packages/build/__main__.py", line 22, in <module>
    from build.env import IsolatedEnvBuilder
  File "/usr/lib/python3.10/site-packages/build/env.py", line 23, in <module>
    import virtualenv
  File "/usr/lib/python3.10/site-packages/virtualenv/__init__.py", line 1, in <module>
    from .run import cli_run, session_via_cli
  File "/usr/lib/python3.10/site-packages/virtualenv/run/__init__.py", line 12, in <module>
    from .plugin.creators import CreatorSelector
  File "/usr/lib/python3.10/site-packages/virtualenv/run/plugin/creators.py", line 4, in <module>
    from virtualenv.create.via_global_ref.builtin.builtin_way import VirtualenvBuiltin
  File "/usr/lib/python3.10/site-packages/virtualenv/create/via_global_ref/builtin/builtin_way.py", line 3, in <module>
    from virtualenv.create.creator import Creator
  File "/usr/lib/python3.10/site-packages/virtualenv/create/creator.py", line 11, in <module>
    from virtualenv.discovery.cached_py_info import LogCmd
  File "/usr/lib/python3.10/site-packages/virtualenv/discovery/cached_py_info.py", line 23, in <module>
    _CACHE[Path(sys.executable)] = PythonInfo()
  File "/usr/lib/python3.10/site-packages/virtualenv/discovery/py_info.py", line 103, in __init__
    self.distutils_install = {u(k): u(v) for k, v in self._distutils_install().items()}
  File "/usr/lib/python3.10/site-packages/virtualenv/discovery/py_info.py", line 186, in _distutils_install
    d = dist.Distribution({"script_args": "--no-user-cfg"})  # conf files not parsed so they do not hijack paths
  File "/usr/lib/python3.10/site-packages/setuptools/dist.py", line 475, in __init__
    _Distribution.__init__(
  File "/usr/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 283, in __init__
    self.finalize_options()
  File "/usr/lib/python3.10/site-packages/setuptools/dist.py", line 899, in finalize_options
    ep(self)
  File "/usr/lib/python3.10/site-packages/versioningit/hook.py", line 28, in setuptools_finalizer
    raise RuntimeError(
RuntimeError:
versioningit could not find a version for the project in /ioda/home/bruno/openSUSE/obs/home:bruno_friedmann:branches:devel:languages:python/python-scramp/scramp-1.4.4!

You may be installing from a shallow clone, in which case you need to unshallow it first.

Alternatively, you may be installing from a Git archive, which is not supported by default.  Install from a git+https://... URL instead.

So I wonder why there's a such difference compared to your experience.

A mystery! So I copied the download link from https://pypi.org/project/scramp/#files and then did:

curl --remote-name https://files.pythonhosted.org/packages/de/26/64cb6f2564c79b8e4e8809e844c9fe464a948221c0b2d173cb9586d06e38/scramp-1.4.4.tar.gz

tar -ztvf scramp-1.4.4.tar.gz

drwxrwxr-x tlocke/tlocke     0 2022-11-01 17:17 scramp-1.4.4/
-rw-rw-r-- tlocke/tlocke   906 2022-10-22 14:23 scramp-1.4.4/LICENSE
-rw-rw-r-- tlocke/tlocke 19808 2022-11-01 17:17 scramp-1.4.4/PKG-INFO
-rw-rw-r-- tlocke/tlocke 18790 2022-11-01 17:14 scramp-1.4.4/README.rst
-rw-rw-r-- tlocke/tlocke  1533 2022-10-22 14:44 scramp-1.4.4/pyproject.toml
drwxrwxr-x tlocke/tlocke     0 2022-11-01 17:17 scramp-1.4.4/scramp/
-rw-rw-r-- tlocke/tlocke   335 2022-05-20 11:43 scramp-1.4.4/scramp/__init__.py
-rw-rw-r-- tlocke/tlocke 22503 2022-11-01 17:11 scramp-1.4.4/scramp/core.py
-rw-rw-r-- tlocke/tlocke   655 2021-07-26 10:16 scramp-1.4.4/scramp/utils.py
drwxrwxr-x tlocke/tlocke     0 2022-11-01 17:17 scramp-1.4.4/scramp.egg-info/
-rw-rw-r-- tlocke/tlocke 19808 2022-11-01 17:17 scramp-1.4.4/scramp.egg-info/PKG-INFO
-rw-rw-r-- tlocke/tlocke   282 2022-11-01 17:17 scramp-1.4.4/scramp.egg-info/SOURCES.txt
-rw-rw-r-- tlocke/tlocke     1 2022-11-01 17:17 scramp-1.4.4/scramp.egg-info/dependency_links.txt
-rw-rw-r-- tlocke/tlocke    69 2022-11-01 17:17 scramp-1.4.4/scramp.egg-info/requires.txt
-rw-rw-r-- tlocke/tlocke     7 2022-11-01 17:17 scramp-1.4.4/scramp.egg-info/top_level.txt
-rw-rw-r-- tlocke/tlocke   197 2022-11-01 17:17 scramp-1.4.4/setup.cfg
drwxrwxr-x tlocke/tlocke     0 2022-11-01 17:17 scramp-1.4.4/test/
-rw-rw-r-- tlocke/tlocke   222 2022-05-20 11:43 scramp-1.4.4/test/test_readme.py
-rw-rw-r-- tlocke/tlocke 18116 2022-11-01 17:11 scramp-1.4.4/test/test_scramp.py

so the PKG-INFO file is there in my listing. Does that help solve it?

My bad the title is misleading, the tar.gz I use was from github because several release in the past the pypi was missing the tests part. (I don't know why there's difference between both tar.gz) So I will give pypi a new try.

So for the releases on PyPI (both the source distribution and the wheel) the version is in the package's metadata. For the Github snapshot of the code there is no metadata, and so build tools can't determine the version. When a release is created, Scramp uses a tool called versioningit to find the version from a git tag, and so versioningit requires a git repository rather than just a snapshot. Hope that explains the results that you're seeing.

Yes Finally make sense, we packager are often caught between a rock and a hard place, I'm sorry for the noise, after you add fixed the missing tests in pypi package I should have changed the source.
Maybe you can envisage to create a release tarball also for github in the future too.
Thanks a lot for you help.

Great, glad it's sorted out!