On Tue, 2019-02-05 at 17:53 +0000, Daniel P. Berrangé wrote:
[...]
- flattened = []
+ pkgs = []
for item in temp:
- if temp[item] is not None and temp[item] not in flattened:
- flattened += [temp[item]]
+ pkgname = temp[item]
+ if pkgname is None:
+ continue
+ if pkgname not in pkgs:
+ pkgs.append(pkgname)
Nothing against refactoring the code this way, but such a change
belongs in its own patch.
[...]
- sys.stdout.write("ENV PACKAGES ")
- sys.stdout.write(" \\\n ".join(sorted(flattened)))
-
+ varmap = {}
+ varmap["pkgs"] = "".join([" \\\n " +
pkgname
+ for pkgname in sorted(pkgs)])
Unlike the original, this pointlessly loops through sorted(pkgs)
one additional time and adds a phantom element to the beginning of
the list. So, once you put everything together...
if package_format == "deb":
sys.stdout.write(textwrap.dedent("""
RUN DEBIAN_FRONTEND=noninteractive && \\
( \\
apt-get update && \\
apt-get dist-upgrade -y && \\
- apt-get install --no-install-recommends -y ${PACKAGES}
&& \\
+ apt-get install --no-install-recommends -y %(pkgs)s &&
\\
apt-get autoremove -y && \\
apt-get autoclean -y \\
)
... the result looks like
apt-get install --no-install-recommends -y \
augeas-tools \
autoconf \
automake \
...
Notice the double space between '-y' and '\' as well as the weird
indentation. A better solution would be to do
varmap["pkgs"] = " \\\n ".join(sorted(pkgs))
followed by
sys.stdout.write(textwrap.dedent("""
...
apt-get install --no-install-recommends -y \\
%(pkgs)s && \\
apt-get autoremove -y && \\
...
which is clearer and results in the more pleasant
apt-get install --no-install-recommends -y \
augeas-tools \
autoconf \
automake \
...
- """))
+ """) % varmap )
Again, I don't have a problem with using this syntax for string
formatting (and here it's actually much clearer than the one we
are currently using), but I don't want the script to become
inconsistent so we have to stick to a single style.
--
Andrea Bolognani / Red Hat / Virtualization