packaging/os/portage: Handle noreplace in check mode

The `--noreplace` argument to `emerge` is generally coupled with
`--newuse` or `--changed-use`, and can be used instruct Portage to
rebuild a package only if necessary. Simply checking to see if the
package is already installed using `equery` is not sufficient to
determine if any changes would be made, so that step is skipped when
the `noreplace` module argument is specified. The module then falls back
to parsing the output from `emerge` to determine if anything changed. In
check mode, `emerge` is called with `--pretend`, so it produces
different output, and the parsing fails to correctly infer that a change
would be made.

This commit adds another regular expression to check when running in
check mode that matches the pretend output from `emerge`.

Signed-off-by: Dustin C. Hatch <dustin@hatch.name>
This commit is contained in:
Dustin C. Hatch 2015-06-18 13:55:03 -05:00 committed by Matt Clay
parent c514a9a940
commit 90df50b045

View file

@ -298,13 +298,18 @@ def emerge_packages(module, packages):
changed = True
for line in out.splitlines():
if re.match(r'(?:>+) Emerging (?:binary )?\(1 of', line):
msg = 'Packages installed.'
break
elif module.check_mode and re.match(r'\[(binary|ebuild)', line):
msg = 'Packages would be installed.'
break
else:
changed = False
msg = 'No packages installed.'
module.exit_json(
changed=changed, cmd=cmd, rc=rc, stdout=out, stderr=err,
msg='Packages installed.',
msg=msg,
)