15
15
from pyinfra .operations import files
16
16
17
17
18
+ def default_inst_vers_format_fn (name : str , operator : str , version : str ):
19
+ return "{name}{operator}{version}" .format (name = name , operator = operator , version = version )
20
+
21
+
18
22
class PkgInfo (NamedTuple ):
19
23
name : str
20
24
version : str
21
25
operator : str
22
26
url : str
27
+ inst_vers_format_fn : Callable = default_inst_vers_format_fn
23
28
"""
24
29
The key packaging information needed: version, operator and url are optional.
25
30
"""
@@ -34,13 +39,22 @@ def has_version(self) -> bool:
34
39
35
40
@property
36
41
def inst_vers (self ) -> str :
37
- return (
38
- self .url
39
- if self .url != ""
40
- else (
41
- self .operator .join ([self .name , self .version ]) if self .version != "" else self .name
42
- )
43
- )
42
+ """String that represents how a program can be installed.
43
+
44
+ - If self.url exists, then url is always returned.
45
+ - If self.version exists, then inst_vers_format_fn is used
46
+ to create the string. The default template is '{name}{operator}{version}'.
47
+ - Otherwise, self.name is returned.
48
+
49
+ Note, the result string will be quoted, so input is shell safe.
50
+ """
51
+
52
+ if self .url :
53
+ return shlex .quote (self .url )
54
+
55
+ if self .version :
56
+ return shlex .quote (self .inst_vers_format_fn (self .name , self .operator , self .version ))
57
+ return shlex .quote (self .name )
44
58
45
59
@classmethod
46
60
def from_possible_pair (cls , s : str , join : str | None ) -> PkgInfo :
@@ -194,7 +208,6 @@ def ensure_packages(
194
208
host .noop (f"package { pkg } is installed ({ ',' .join (current_packages [pkg ])} )" )
195
209
else :
196
210
host .noop (f"package { package .name } is installed" )
197
-
198
211
if present is False :
199
212
for package in packages :
200
213
has_package , expanded_packages = _has_package (
@@ -209,10 +222,10 @@ def ensure_packages(
209
222
210
223
if diff_packages :
211
224
command = install_command if present else uninstall_command
212
- yield f"{ command } { ' ' .join ([shlex . quote ( pkg ) for pkg in diff_packages ])} "
225
+ yield f"{ command } { ' ' .join ([pkg for pkg in diff_packages ])} "
213
226
214
227
if latest and upgrade_command and upgrade_packages :
215
- yield f"{ upgrade_command } { ' ' .join ([shlex . quote ( pkg ) for pkg in upgrade_packages ])} "
228
+ yield f"{ upgrade_command } { ' ' .join ([pkg for pkg in upgrade_packages ])} "
216
229
217
230
218
231
def ensure_rpm (state : State , host : Host , source : str , present : bool , package_manager_command : str ):
0 commit comments