mock icon indicating copy to clipboard operation
mock copied to clipboard

Bash completion wrt install completes source RPMs instead of "binary" RPMs after the first "binary" RPM

Open hroncok opened this issue 3 years ago • 13 comments

Short description of the problem

When I try bash completion with mock -r fedora-rawhide-x86_64 install the first argument is completed for the "binary" RPM, but the second (third, ...) argument is completed to SRPMs only.

For example, consider I have the following RPMs available:

python-gast/results_python-gast/0.4.0/3.fc35/python-gast-0.4.0-3.fc35.src.rpm
python-gast/results_python-gast/0.4.0/3.fc35/python3-gast-0.4.0-3.fc35.noarch.rpm
python-beniget/results_python-beniget/0.3.0/3.fc35/python-beniget-0.3.0-3.fc35.src.rpm
python-beniget/results_python-beniget/0.3.0/3.fc35/python3-beniget-0.3.0-3.fc35.noarch.rpm

And I type (I've changed some repetitive parts to ... for brevity):

$ mock -r fedora-rawhide-x86_64 install python-gast/r[Tab]
$ mock ... install python-gast/results_python-gast/[Tab]
$ mock ... install python-gast/results_python-gast/0.4.0/[Tab]
$ mock ... install python-gast/results_python-gast/0.4.0/3.fc35/[Tab]
$ mock ... install python-gast/results_python-gast/0.4.0/3.fc35/python3-gast-0.4.0-3.fc35.noarch.rpm 
$ mock ... install .../python3-gast-0.4.0-3.fc35.noarch.rpm python-beniget/r[Tab]
$ mock ... install .../python3-gast-0.4.0-3.fc35.noarch.rpm python-beniget/results_python-beniget/[Tab]
$ mock ... install .../python3-gast-0.4.0-3.fc35.noarch.rpm python-beniget/results_python-beniget/0.3.0/[Tab]
$ mock ... install .../python3-gast-0.4.0-3.fc35.noarch.rpm python-beniget/results_python-beniget/0.3.0/3.fc35/[Tab]
$ mock ... install .../python3-gast-0.4.0-3.fc35.noarch.rpm python-beniget/results_python-beniget/0.3.0/3.fc35/python-beniget-0.3.0-3.fc35.src.rpm

In the last completion, I expect python3-beniget-0.3.0-3.fc35.noarch.rpm, not python-beniget-0.3.0-3.fc35.src.rpm.

Output of rpm -q mock

mock-2.10-1.fc33.noarch

Steps to reproduce issue

  1. Prepare some "binary" RPMs and some source RPMs
  2. Type mock -r fedora-rawhide-x86_64 install to your Bash shell
  3. Try to Tab complete multiple "binary" RPMs as arguments

The first "binary" RPM is completed. Any other argument prefers to complete a source RPM instead.

Any additional notes

Output of mock --debug-config

config_opts['bootstrap_image'] = 'registry.fedoraproject.org/fedora:rawhide'
config_opts['build_log_fmt_str'] = '%(message)s'
config_opts['cache_alterations'] = False
config_opts['chroot_name'] = 'fedora-rawhide-x86_64'
config_opts['chroot_setup_cmd'] = 'install @{% if mirrored %}buildsys-{% endif %}build'
config_opts['cleanup_on_failure'] = False
config_opts['cleanup_on_success'] = False
config_opts['config_file'] = '/etc/mock/fedora-rawhide-x86_64.cfg'
config_opts['config_path'] = '/etc/mock'
config_opts['config_paths'] = ['/etc/mock/site-defaults.cfg',
 '/etc/mock/fedora-rawhide-x86_64.cfg',
 '/etc/mock/templates/fedora-rawhide.tpl',
 '/home/churchyard/.config/mock.cfg']
config_opts['dist'] = 'rawhide'
config_opts['dnf.conf'] = ('\n'
 '[main]\n'
 'keepcache=1\n'
 'debuglevel=2\n'
 'reposdir=/dev/null\n'
 'logfile=/var/log/yum.log\n'
 'retries=20\n'
 'obsoletes=1\n'
 'gpgcheck=0\n'
 'assumeyes=1\n'
 'syslog_ident=mock\n'
 'syslog_device=\n'
 'install_weak_deps=0\n'
 'metadata_expire=0\n'
 'best=1\n'
 'module_platform_id=platform:f{{ releasever }}\n'
 'protected_packages=\n'
 'user_agent={{ user_agent }}\n'
 '\n'
 '{%- macro rawhide_gpg_keys() -%}\n'
 'file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-$releasever-primary\n'
 '{%- for version in [releasever|int, releasever|int - 1]\n'
 '%} file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-{{ '
 'version }}-primary\n'
 '{%- endfor %}\n'
 '{%- endmacro %}\n'
 '\n'
 '# repos\n'
 '\n'
 '[local]\n'
 'name=local\n'
 'baseurl=https://kojipkgs.fedoraproject.org/repos/rawhide/latest/$basearch/\n'
 'cost=2000\n'
 'enabled={{ not mirrored }}\n'
 'skip_if_unavailable=False\n'
 '\n'
 '[local-source]\n'
 'name=local-source\n'
 'baseurl=https://kojipkgs.fedoraproject.org/repos/rawhide/latest/src/\n'
 'cost=2000\n'
 'enabled=0\n'
 'skip_if_unavailable=False\n'
 '\n'
 '{% if mirrored %}\n'
 '[fedora]\n'
 'name=fedora\n'
 'metalink=https://mirrors.fedoraproject.org/metalink?repo=rawhide&arch=$basearch\n'
 'gpgkey={{ rawhide_gpg_keys() }}\n'
 'gpgcheck=1\n'
 'skip_if_unavailable=False\n'
 '\n'
 '[fedora-debuginfo]\n'
 'name=Fedora Rawhide - Debug\n'
 'metalink=https://mirrors.fedoraproject.org/metalink?repo=rawhide-debug&arch=$basearch\n'
 'enabled=0\n'
 'gpgkey={{ rawhide_gpg_keys() }}\n'
 'gpgcheck=1\n'
 'skip_if_unavailable=False\n'
 '\n'
 '[fedora-source]\n'
 'name=fedora-source\n'
 'metalink=https://mirrors.fedoraproject.org/metalink?repo=rawhide-source&arch=$basearch\n'
 'gpgkey={{ rawhide_gpg_keys() }}\n'
 'gpgcheck=1\n'
 'enabled=0\n'
 'skip_if_unavailable=False\n'
 '\n'
 '# modular\n'
 '\n'
 '[rawhide-modular]\n'
 'name=Fedora - Modular Rawhide - Developmental packages for the next Fedora '
 'release\n'
 'metalink=https://mirrors.fedoraproject.org/metalink?repo=rawhide-modular&arch=$basearch\n'
 '# if you want to enable it, you should set best=0\n'
 '# see https://bugzilla.redhat.com/show_bug.cgi?id=1673851\n'
 'enabled=0\n'
 'gpgcheck=1\n'
 'gpgkey={{ rawhide_gpg_keys() }}\n'
 'skip_if_unavailable=False\n'
 '\n'
 '[rawhide-modular-debuginfo]\n'
 'name=Fedora - Modular Rawhide - Debug\n'
 'metalink=https://mirrors.fedoraproject.org/metalink?repo=rawhide-modular-debug&arch=$basearch\n'
 'enabled=0\n'
 'gpgcheck=1\n'
 'gpgkey={{ rawhide_gpg_keys() }}\n'
 'skip_if_unavailable=False\n'
 '\n'
 '[rawhide-modular-source]\n'
 'name=Fedora - Modular Rawhide - Source\n'
 'metalink=https://mirrors.fedoraproject.org/metalink?repo=rawhide-modular-source&arch=$basearch\n'
 'enabled=0\n'
 'gpgcheck=1\n'
 'gpgkey={{ rawhide_gpg_keys() }}\n'
 'skip_if_unavailable=False\n'
 '{% endif %}\n')
config_opts['enable_disable_repos'] = []
config_opts['extra_chroot_dirs'] = ['/run/lock']
config_opts['files'] = {'etc/hosts': '127.0.0.1 localhost localhost.localdomain\n'
              '::1       localhost localhost.localdomain localhost6 '
              'localhost6.localdomain6\n'}
config_opts['legal_host_arches'] = ('x86_64',)
config_opts['macros'] = {'%_buildhost': 'carbon.local',
 '%_rpmfilename': '%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm',
 '%_topdir': '/builddir/build'}
config_opts['mirrored'] = True
config_opts['nosync'] = True
config_opts['nosync_force'] = True
config_opts['nspawn_args'] = ['--capability=cap_ipc_lock',
 '--bind=/tmp/mock-resolv.idr5_g41:/etc/resolv.conf',
 '--bind=/dev/btrfs-control',
 '--bind=/dev/loop-control',
 '--bind=/dev/loop0',
 '--bind=/dev/loop1',
 '--bind=/dev/loop2',
 '--bind=/dev/loop3',
 '--bind=/dev/loop4',
 '--bind=/dev/loop5',
 '--bind=/dev/loop6',
 '--bind=/dev/loop7',
 '--bind=/dev/loop8',
 '--bind=/dev/loop9',
 '--bind=/dev/loop10',
 '--bind=/dev/loop11']
config_opts['plugin_conf'] = {'bind_mount_enable': True,
 'bind_mount_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                     'cache_topdir': '/var/cache/mock',
                     'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                     'create_dirs': False,
                     'dirs': [],
                     'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                     'root': 'fedora-rawhide-x86_64'},
 'ccache_enable': False,
 'ccache_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                 'cache_topdir': '/var/cache/mock',
                 'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                 'compress': True,
                 'dir': '/var/cache/mock/fedora-rawhide-x86_64/ccache/u1000/',
                 'max_cache_size': '4G',
                 'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                 'root': 'fedora-rawhide-x86_64'},
 'chroot_scan_enable': False,
 'chroot_scan_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                      'cache_topdir': '/var/cache/mock',
                      'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                      'only_failed': True,
                      'regexes': ['^[^k]?core(\\.\\d+)?$', '\\.log$'],
                      'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                      'root': 'fedora-rawhide-x86_64'},
 'compress_logs_enable': False,
 'compress_logs_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                        'cache_topdir': '/var/cache/mock',
                        'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                        'command': 'gzip',
                        'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                        'root': 'fedora-rawhide-x86_64'},
 'hw_info_enable': True,
 'hw_info_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                  'cache_topdir': '/var/cache/mock',
                  'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                  'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                  'root': 'fedora-rawhide-x86_64'},
 'lvm_root_enable': False,
 'lvm_root_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                   'cache_topdir': '/var/cache/mock',
                   'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                   'pool_name': 'mockbuild',
                   'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                   'root': 'fedora-rawhide-x86_64'},
 'mount_enable': True,
 'mount_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                'cache_topdir': '/var/cache/mock',
                'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                'dirs': [],
                'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                'root': 'fedora-rawhide-x86_64'},
 'overlayfs_enable': False,
 'overlayfs_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                    'cache_topdir': '/var/cache/mock',
                    'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                    'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                    'root': 'fedora-rawhide-x86_64'},
 'package_state_enable': True,
 'package_state_opts': {'available_pkgs': False,
                        'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                        'cache_topdir': '/var/cache/mock',
                        'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                        'installed_pkgs': True,
                        'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                        'root': 'fedora-rawhide-x86_64'},
 'pm_request_enable': False,
 'pm_request_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                     'cache_topdir': '/var/cache/mock',
                     'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                     'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                     'root': 'fedora-rawhide-x86_64'},
 'procenv_enable': False,
 'procenv_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                  'cache_topdir': '/var/cache/mock',
                  'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                  'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                  'root': 'fedora-rawhide-x86_64'},
 'root_cache_enable': True,
 'root_cache_opts': {'age_check': True,
                     'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                     'cache_topdir': '/var/cache/mock',
                     'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                     'compress_program': 'lzop',
                     'decompress_program': None,
                     'dir': '/var/cache/mock/fedora-rawhide-x86_64/root_cache/',
                     'exclude_dirs': ['./proc',
                                      './sys',
                                      './dev',
                                      './tmp/ccache',
                                      './var/cache/yum',
                                      './var/cache/dnf',
                                      './var/log'],
                     'extension': '.lzo',
                     'max_age_days': 15,
                     'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                     'root': 'fedora-rawhide-x86_64',
                     'tar': 'gnutar'},
 'rpkg_preprocessor_enable': False,
 'rpkg_preprocessor_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                            'cache_topdir': '/var/cache/mock',
                            'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                            'cmd': '/usr/bin/preproc-rpmspec %(source_spec)s '
                                   '--output %(target_spec)s',
                            'requires': ['preproc-rpmspec'],
                            'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                            'root': 'fedora-rawhide-x86_64'},
 'selinux_enable': True,
 'selinux_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                  'cache_topdir': '/var/cache/mock',
                  'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                  'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                  'root': 'fedora-rawhide-x86_64'},
 'showrc_enable': False,
 'showrc_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                 'cache_topdir': '/var/cache/mock',
                 'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                 'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                 'root': 'fedora-rawhide-x86_64'},
 'sign_enable': False,
 'sign_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
               'cache_topdir': '/var/cache/mock',
               'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
               'cmd': 'rpmsign',
               'opts': '--addsign %(rpms)s',
               'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
               'root': 'fedora-rawhide-x86_64'},
 'tmpfs_enable': False,
 'tmpfs_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                'cache_topdir': '/var/cache/mock',
                'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                'keep_mounted': False,
                'max_fs_size': None,
                'mode': '0755',
                'required_ram_mb': 900,
                'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                'root': 'fedora-rawhide-x86_64'},
 'yum_cache_enable': True,
 'yum_cache_opts': {'basedir': '/var/lib/mock/fedora-rawhide-x86_64',
                    'cache_topdir': '/var/cache/mock',
                    'cachedir': '/var/cache/mock/fedora-rawhide-x86_64',
                    'max_age_days': 30,
                    'max_metadata_age_days': 30,
                    'online': True,
                    'resultdir': '/var/lib/mock/fedora-rawhide-x86_64/result',
                    'root': 'fedora-rawhide-x86_64'}}
config_opts['print_main_output'] = True
config_opts['releasever'] = '35'
config_opts['root'] = 'fedora-rawhide-{{ target_arch }}'
config_opts['root_log_fmt_str'] = '%(levelname)s %(filename)s:%(lineno)d:  %(message)s'
config_opts['rpmbuild_arch'] = 'x86_64'
config_opts['state_log_fmt_str'] = '%(asctime)s - %(message)s'
config_opts['target_arch'] = 'x86_64'
config_opts['verbose'] = 1

hroncok avatar Jun 23 '21 16:06 hroncok

Why would you want to install the SRPMs? Is it just out of a failure to exclude them, or are you trying to test builds in the mock chroot cage?

nkadel avatar Dec 19 '21 12:12 nkadel

Why would you want to install the SRPMs?

I don't.

hroncok avatar Dec 19 '21 12:12 hroncok

Oh: I see. My scripting around mock builds tends to segregate the SRPMs from the installable RPM's, and put them in a local working yum repo. I've a personal mock bootstrapping setup over at https://github.com/nkadel/mockrepo/tree/nkadel-2.16 , which I've tested it with and it's behaving well on CentOs 7.

nkadel avatar Dec 19 '21 13:12 nkadel

Testing this in my working 'mockrepo' environment on EL7 and EL8 and fedora 35, I'm not seeing this issue at all. Can you double check yout command lines, without the trimming, and verify that the executable RPM actually existss?

nkadel avatar Dec 20 '21 07:12 nkadel

Yes, this is still an issue and it still behaves exactly as when reported.

$ tree results_pytest/7.0.0~rc1/1.fc36/
results_pytest/7.0.0~rc1/1.fc36/
├── build.log
├── hw_info.log
├── installed_pkgs.log
├── pytest-7.0.0~rc1-1.fc36.src.rpm
├── python3-pytest-7.0.0~rc1-1.fc36.noarch.rpm
├── root.log
└── state.log

$ mock -r fedora-rawhide-x86_64 install re
$ mock -r fedora-rawhide-x86_64 install results_pytest/
$ mock -r fedora-rawhide-x86_64 install results_pytest/7.0.0~rc1/
$ mock -r fedora-rawhide-x86_64 install results_pytest/7.0.0~rc1/1.fc36/
$ mock -r fedora-rawhide-x86_64 install results_pytest/7.0.0~rc1/1.fc36/python3-pytest-7.0.0~rc1-1.fc36.noarch.rpm
$ mock -r fedora-rawhide-x86_64 install results_pytest/7.0.0~rc1/1.fc36/python3-pytest-7.0.0~rc1-1.fc36.noarch.rpm re
$ mock -r fedora-rawhide-x86_64 install results_pytest/7.0.0~rc1/1.fc36/python3-pytest-7.0.0~rc1-1.fc36.noarch.rpm results_pytest/
$ mock -r fedora-rawhide-x86_64 install results_pytest/7.0.0~rc1/1.fc36/python3-pytest-7.0.0~rc1-1.fc36.noarch.rpm results_pytest/7.0.0~rc1/
$ mock -r fedora-rawhide-x86_64 install results_pytest/7.0.0~rc1/1.fc36/python3-pytest-7.0.0~rc1-1.fc36.noarch.rpm results_pytest/7.0.0~rc1/1.fc36/
$ mock -r fedora-rawhide-x86_64 install results_pytest/7.0.0~rc1/1.fc36/python3-pytest-7.0.0~rc1-1.fc36.noarch.rpm results_pytest/7.0.0~rc1/1.fc36/pytest-7.0.0~rc1-1.fc36.src.rpm

hroncok avatar Dec 20 '21 09:12 hroncok

This is a confirmed issue, we just need some time to fix this... help is welcome!

praiskup avatar Dec 20 '21 09:12 praiskup

Wait: you have an RPM file with '~' in the %{version} part of its name? That seems like a very bad idea. Can you discard that character in your 'Version:' entry of your .spec file? Handling new and unnecessary forms of syntactic sugar in RPM names seems troubleprone.

nkadel avatar Dec 20 '21 09:12 nkadel

That seems like a very bad idea.

That is a quite common way to declare it is a pre-release version. Try rpmdev-vercmp 0.13.1 0.13.1~dev.

praiskup avatar Dec 20 '21 10:12 praiskup

It's not that common. Among 2446 RPMs for Fedora 35 x86_64, there are 55 RPMs with 'rc' in the %version value, only 2 of which use '~'. The others use "rc" or ".rc". Not saying it's invalid to use '~', but it's the sort of peculiar syntax that puts other programmers through extra work to deal with it.

nkadel avatar Dec 20 '21 10:12 nkadel

It's accepted and supported since RPM 4.10 (and backported to RPM in RHEL 6 too), and approved in the Fedora Packaging Guidelines.

Conan-Kudo avatar Dec 20 '21 12:12 Conan-Kudo

@nkadel Would you please stop posting issue comments here that aren't relevant to the issue? Thanks.

hroncok avatar Dec 20 '21 12:12 hroncok

Since the binary RPM's rather than SRPM's are correctly bash-completed without a "~" in the name, I'd think that it's a relevant and contributing factor.

nkadel avatar Dec 20 '21 15:12 nkadel

They are not, the ~ here is completely orthogonal topic (see the original report, where ~ isn't mentioned).

praiskup avatar Dec 20 '21 15:12 praiskup

~~Otherwise LGTM~~ Wrong place to give LGTMs.

praiskup avatar Dec 04 '23 07:12 praiskup

Thanks.

hroncok avatar Dec 05 '23 14:12 hroncok