Skip to content

Commit

Permalink
Detect Alpine package name with alias (#848)
Browse files Browse the repository at this point in the history
Co-authored-by: Ivan Santiago Paunovic <[email protected]>
  • Loading branch information
at-wat and ivanpauno authored Apr 1, 2022
1 parent 16e4b3a commit 6b05600
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 11 deletions.
34 changes: 29 additions & 5 deletions src/rosdep2/platforms/alpine.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,35 @@ def apk_detect(pkgs, exec_fn=read_stdout):
if not pkgs:
return []

cmd = ['apk', 'info', '--installed']
cmd.extend(pkgs)
std_out = exec_fn(cmd)

return std_out.splitlines()
# Get installed package names:
cmd_installed = ['apk', 'info', '--installed']
cmd_installed.extend(pkgs)
origin_packages = exec_fn(cmd_installed).splitlines()

# Resolve alias names of replaced packages.
cmd_replaces = ['apk', 'info', '--installed', '--replaces']
cmd_replaces.extend(pkgs)
# This command will respond like:
#
# $ apk info --installed --replaces boost-atomic boost-filesystem
# boost1.76-atomic-1.76.0-r0 replaces:
# boost-atomic
#
# boost1.76-filesystem-1.76.0-r0 replaces:
# boost-filesystem
#
# $
replaced_packages = []
reading = False
for line in exec_fn(cmd_replaces).splitlines():
if line.endswith(' replaces:'):
reading = True
elif line == '':
reading = False
elif reading:
replaced_packages.append(line.strip())

return origin_packages + replaced_packages


class ApkInstaller(PackageManagerInstaller):
Expand Down
41 changes: 35 additions & 6 deletions test/test_rosdep_alpine.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@
import os
import traceback
try:
from unittest.mock import Mock, patch
from unittest.mock import Mock, call, patch
except ImportError:
from mock import Mock, patch
from mock import Mock, call, patch

import rospkg.os_detect

Expand All @@ -55,13 +55,42 @@ def test_apk_detect():
expected = []
val = apk_detect(['a'], exec_fn=m)
assert val == expected, 'Result was: %s' % val
m.assert_called_with(['apk', 'info', '--installed', 'a'])

m = Mock(return_value='\n'.join(['a', 'b']))
m.assert_has_calls([
call(['apk', 'info', '--installed', 'a']),
call(['apk', 'info', '--installed', '--replaces', 'a']),
])

m = Mock(side_effect=[
'\n'.join(['a', 'b']),
'',
])
expected = ['a', 'b']
val = apk_detect(['a', 'b'], exec_fn=m)
assert val == expected, 'Result was: %s' % val
m.assert_called_with(['apk', 'info', '--installed', 'a', 'b'])
m.assert_has_calls([
call(['apk', 'info', '--installed', 'a', 'b']),
call(['apk', 'info', '--installed', '--replaces', 'a', 'b']),
])

# Packages installed by alias names should be resolved.
m = Mock(side_effect=[
'\n'.join(['origin-pkg1', 'origin-pkg2']),
'\n'.join([
'origin-pkg1=0.0.0-r0 replaces:',
'alias-pkg1',
'',
'origin-pkg2=1.1.1-r1 replaces:',
'alias-pkg2',
'',
]),
])
expected = ['origin-pkg1', 'origin-pkg2', 'alias-pkg1', 'alias-pkg2']
val = apk_detect(['alias-pkg1', 'alias-pkg2'], exec_fn=m)
assert val == expected, 'Result was: %s' % val
m.assert_has_calls([
call(['apk', 'info', '--installed', 'alias-pkg1', 'alias-pkg2']),
call(['apk', 'info', '--installed', '--replaces', 'alias-pkg1', 'alias-pkg2']),
])


def test_ApkInstaller():
Expand Down

0 comments on commit 6b05600

Please sign in to comment.