From d6ff07715681fa8600d386daf1128518791102bc Mon Sep 17 00:00:00 2001
From: Darko Poljak <darko.poljak@gmail.com>
Date: Wed, 31 Jan 2018 09:48:16 +0100
Subject: [PATCH 1/2] __package_apt ignores --version parameter #615

---
 cdist/conf/type/__package_apt/explorer/state |  3 ++-
 cdist/conf/type/__package_apt/gencode-remote | 20 +++++++++++++++++++-
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/cdist/conf/type/__package_apt/explorer/state b/cdist/conf/type/__package_apt/explorer/state
index 04926b60..658429ac 100755
--- a/cdist/conf/type/__package_apt/explorer/state
+++ b/cdist/conf/type/__package_apt/explorer/state
@@ -31,7 +31,8 @@ fi
 packages="$(apt-cache showpkg "$name" | sed -e "1,/Reverse Provides:/d" | cut -d ' ' -f 1) $name"
 for p in $packages; do
     if [ -n "$(dpkg -s "$p" 2>/dev/null | grep "^Status: install ok installed$")" ]; then
-       echo "present $p"
+       version=$(dpkg -s "$p" 2>/dev/null | grep "^Version:" | cut -d ' ' -f 2)
+       echo "present $p $version"
        exit 0
     fi
 done
diff --git a/cdist/conf/type/__package_apt/gencode-remote b/cdist/conf/type/__package_apt/gencode-remote
index 1a86e72c..d9cc52b7 100755
--- a/cdist/conf/type/__package_apt/gencode-remote
+++ b/cdist/conf/type/__package_apt/gencode-remote
@@ -29,6 +29,13 @@ fi
 
 state_should="$(cat "$__object/parameter/state")"
 
+version_param="$__object/parameter/version"
+
+version=""
+if [ -f "$version_param" ]; then
+    version="$(cat "$version_param")"
+fi
+
 if [ -f "$__object/parameter/target-release" ]; then
    target_release="--target-release $(cat "$__object/parameter/target-release")"
 else
@@ -47,18 +54,29 @@ state_is="$(cat "$__object/explorer/state")"
 case "$state_is" in
     present*)
        name="$(echo "$state_is" | cut -d ' ' -f 2)"
+       version_is="$(echo "$state_is" | cut -d ' ' -f 3)"
        state_is="present"
     ;;
+    *)
+       version_is=""
+    ;;
 esac
 
 # Hint if we need to avoid questions at some point:
 # DEBIAN_PRIORITY=critical can reduce the number of questions
 aptget="DEBIAN_FRONTEND=noninteractive apt-get --quiet --yes --no-install-recommends -o Dpkg::Options::=\"--force-confdef\" -o Dpkg::Options::=\"--force-confold\""
 
-[ "$state_is" = "$state_should" ] && exit 0
+if [ "$state_is" = "$state_should" ]; then
+    if [ -z "$version" ] || [ "$version" = "$version_is" ]; then
+        exit 0;
+    fi
+fi
 
 case "$state_should" in
     present)
+        if [ -n "$version" ]; then
+            name="${name}=${version}"
+        fi
         echo $aptget install $target_release \"$name\"
     ;;
     absent)

From fe7da4d8b34a3326e0e9ed980288c7252b2b83a4 Mon Sep 17 00:00:00 2001
From: Darko Poljak <darko.poljak@gmail.com>
Date: Wed, 31 Jan 2018 20:21:48 +0100
Subject: [PATCH 2/2] Update man page.

---
 cdist/conf/type/__package_apt/man.rst | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/cdist/conf/type/__package_apt/man.rst b/cdist/conf/type/__package_apt/man.rst
index 991962e5..a3a70d91 100644
--- a/cdist/conf/type/__package_apt/man.rst
+++ b/cdist/conf/type/__package_apt/man.rst
@@ -28,10 +28,19 @@ state
 target-release
     Passed on to apt-get install, see apt-get(8).
     Essentially allows you to retrieve packages from a different release
+
+version
+    The version of the package to install. Default is to install the version
+    chosen by the local package manager.
+
+
+BOOLEAN PARAMETERS
+------------------
 purge-if-absent
     If this parameter is given when state is `absent`, the package is
     purged from the system (using `--purge`).
 
+
 EXAMPLES
 --------