From e3d608297d95a7c04d54303ee0abd6fda64dcde1 Mon Sep 17 00:00:00 2001
From: "Dustin C. Hatch" <dustin@hatch.name>
Date: Thu, 18 Jun 2015 13:55:03 -0500
Subject: [PATCH] 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>
---
 packaging/os/portage.py | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/packaging/os/portage.py b/packaging/os/portage.py
index 712881a91ea..79db8d74740 100644
--- a/packaging/os/portage.py
+++ b/packaging/os/portage.py
@@ -300,13 +300,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,
     )