Recent changes to this wiki:

Added a comment: Blocked
diff --git a/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_4_f6c386dddf408d522841fd3bde699d15._comment b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_4_f6c386dddf408d522841fd3bde699d15._comment
new file mode 100644
index 00000000..17c99e16
--- /dev/null
+++ b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_4_f6c386dddf408d522841fd3bde699d15._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="spwhitton"
+ avatar="http://cdn.libravatar.org/avatar/9c3f08f80e67733fd506c353239569eb"
+ subject="Blocked"
+ date="2017-09-20T17:29:50Z"
+ content="""
+Note that this is currently blocked by: https://propellor.branchable.com/todo/unpropelling_a_host/
+"""]]

Added a comment
diff --git a/doc/forum/how_to_boostrap_the_initial_git_repo/comment_1_dca4a0a803da4cc55b9eba560496f641._comment b/doc/forum/how_to_boostrap_the_initial_git_repo/comment_1_dca4a0a803da4cc55b9eba560496f641._comment
new file mode 100644
index 00000000..13156967
--- /dev/null
+++ b/doc/forum/how_to_boostrap_the_initial_git_repo/comment_1_dca4a0a803da4cc55b9eba560496f641._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 1"
+ date="2017-09-14T12:25:18Z"
+ content="""
+just for Info I have propellor 4.7.6
+"""]]

diff --git a/doc/forum/how_to_boostrap_the_initial_git_repo.mdwn b/doc/forum/how_to_boostrap_the_initial_git_repo.mdwn
new file mode 100644
index 00000000..4493ccfe
--- /dev/null
+++ b/doc/forum/how_to_boostrap_the_initial_git_repo.mdwn
@@ -0,0 +1,43 @@
+Hello Joey,
+
+here the onfiguration of my propellor repro.
+
+    [remote "origin"]
+        url = git+ssh://git.debian.org/git/users/picca/propellor
+        fetch = +refs/heads/*:refs/remotes/origin/*
+
+I use this central repository to manage a bunch of computers.
+The problem I is that all these computer do have acces only from this url
+
+    [remote "origin"]
+        url = https://anonscm.debian.org/git/users/picca/propellor.git
+        fetch = +refs/heads/*:refs/remotes/origin/*
+
+So I can use the deploy branch trick.
+
+BUT
+
+since I have clone of the first repository (in order to push via ssh) on all of these computer (let call them locals), I need to add
+the deploy branch on all of them.
+
+So I tryed to add this directly in the propellor configuration.
+
+      & PropellorRepo.hasOriginUrl "https://anonscm.debian.org/git/users/picca/propellor.git"
+
+But when I do the spin for the first time from the locals, the url put in the /usr/local/propellor/.git/config files
+is the one from the locals cloned repository which is the ssh adress and not the https one.
+
+So the propellor spin stop with a timeout because it tryes to  git fetch  with the wrong url.
+
+
+My question is  is it normal ?
+
+
+PS: I also tryed to add
+
+  & bootstrappedFrom (GitRepoUrl "https://anonscm.debian.org/git/users/picca/propellor.git")
+
+but the result was the same.
+
+
+Cheers

Added a comment
diff --git a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_6_12adb8dc952db0f1235f38c428a52fb1._comment b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_6_12adb8dc952db0f1235f38c428a52fb1._comment
new file mode 100644
index 00000000..c933c90c
--- /dev/null
+++ b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_6_12adb8dc952db0f1235f38c428a52fb1._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="Nicolas.Schodet"
+ avatar="http://cdn.libravatar.org/avatar/0d7ec808ec329d04ee9a93c0da3c0089"
+ subject="comment 6"
+ date="2017-09-08T21:29:55Z"
+ content="""
+Just tested it, it still works.
+
+Thanks!
+"""]]

update
diff --git a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_5_aee8b3d2768fb7307a6cc2e3295fd1f6._comment b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_5_aee8b3d2768fb7307a6cc2e3295fd1f6._comment
index 8d007461..6850f3b9 100644
--- a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_5_aee8b3d2768fb7307a6cc2e3295fd1f6._comment
+++ b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_5_aee8b3d2768fb7307a6cc2e3295fd1f6._comment
@@ -4,4 +4,9 @@
  date="2017-09-05T20:23:44Z"
  content="""
 Looks good to me, merged. Thanks for your contribution!
+
+(I did make a simplification to it
+in [[!commit 0a6ad2b17419fd877789053c87b95866cfc39c46]],
+which seems ok by inspection to me, but I've not tested. Please
+let me know if I somehow got that wrong.)
 """]]

move parseFs to Property.Partition
diff --git a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal.mdwn b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal.mdwn
index 0910ef5d..4b3198ee 100644
--- a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal.mdwn
+++ b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal.mdwn
@@ -5,3 +5,5 @@ I am not confident my haskell code is good looking as this is my first real life
 You can pull the lvm branch at http://git.ni.fr.eu.org/nicolas/propellor.git
 
 Thanks!
+
+> merge [[done]] --[[Joey]]
diff --git a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_5_aee8b3d2768fb7307a6cc2e3295fd1f6._comment b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_5_aee8b3d2768fb7307a6cc2e3295fd1f6._comment
new file mode 100644
index 00000000..8d007461
--- /dev/null
+++ b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_5_aee8b3d2768fb7307a6cc2e3295fd1f6._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2017-09-05T20:23:44Z"
+ content="""
+Looks good to me, merged. Thanks for your contribution!
+"""]]
diff --git a/src/Propellor/Property/Lvm.hs b/src/Propellor/Property/Lvm.hs
index e1f3b934..c5d215bc 100644
--- a/src/Propellor/Property/Lvm.hs
+++ b/src/Propellor/Property/Lvm.hs
@@ -142,27 +142,15 @@ lvState lv = do
 		then return Nothing
 		else do
 			s <- readLvSize
-			fs <- readFs
+			fs <- maybe Nothing (Partition.parseFs . takeWhile (/= '\n')) <$> readFs
 			return $ do
 				size <- s
-				return $ LvState size $ parseFs $
-					takeWhile (/= '\n') <$> fs
+				return $ LvState size fs
   where
 	readLvSize = catchDefaultIO Nothing $ readish
 		<$> readProcess "lvs" [ "-o", "size", "--noheadings",
 			"--nosuffix", "--units", "b", vglv lv ]
 	readFs = Mount.blkidTag "TYPE" (path lv)
-	parseFs (Just "ext2") = Just Partition.EXT2
-	parseFs (Just "ext3") = Just Partition.EXT3
-	parseFs (Just "ext4") = Just Partition.EXT4
-	parseFs (Just "btrfs") = Just Partition.BTRFS
-	parseFs (Just "reiserfs") = Just Partition.REISERFS
-	parseFs (Just "xfs") = Just Partition.XFS
-	parseFs (Just "fat") = Just Partition.FAT
-	parseFs (Just "vfat") = Just Partition.VFAT
-	parseFs (Just "ntfs") = Just Partition.NTFS
-	parseFs (Just "swap") = Just Partition.LinuxSwap
-	parseFs _ = Nothing
 
 -- Read extent size (or Nothing on error).
 vgExtentSize :: VolumeGroup -> IO (Maybe Integer)
diff --git a/src/Propellor/Property/Partition.hs b/src/Propellor/Property/Partition.hs
index 679675b7..27ae89ff 100644
--- a/src/Propellor/Property/Partition.hs
+++ b/src/Propellor/Property/Partition.hs
@@ -15,6 +15,20 @@ import Data.Char
 data Fs = EXT2 | EXT3 | EXT4 | BTRFS | REISERFS | XFS | FAT | VFAT | NTFS | LinuxSwap
 	deriving (Show, Eq)
 
+-- | Parse commonly used names of filesystems.
+parseFs :: String -> Maybe Fs
+parseFs "ext2" = Just EXT2
+parseFs "ext3" = Just EXT3
+parseFs "ext4" = Just EXT4
+parseFs "btrfs" = Just BTRFS
+parseFs "reiserfs" = Just REISERFS
+parseFs "xfs" = Just XFS
+parseFs "fat" = Just FAT
+parseFs "vfat" = Just VFAT
+parseFs "ntfs" = Just NTFS
+parseFs "swap" = Just LinuxSwap
+parseFs _ = Nothing
+
 data Eep = YesReallyFormatPartition
 
 -- | Formats a partition.

Added a comment
diff --git a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_4_20c6734d67fefeb1a8c07730d537e06b._comment b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_4_20c6734d67fefeb1a8c07730d537e06b._comment
new file mode 100644
index 00000000..74a8bbe1
--- /dev/null
+++ b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_4_20c6734d67fefeb1a8c07730d537e06b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="Nicolas.Schodet"
+ avatar="http://cdn.libravatar.org/avatar/0d7ec808ec329d04ee9a93c0da3c0089"
+ subject="comment 4"
+ date="2017-09-03T21:00:36Z"
+ content="""
+I can rebase/squash, do you see something else to improve?
+"""]]

add link
diff --git a/doc/todo/unpropelling_a_host.mdwn b/doc/todo/unpropelling_a_host.mdwn
index 0e1ee2b5..5c31bd90 100644
--- a/doc/todo/unpropelling_a_host.mdwn
+++ b/doc/todo/unpropelling_a_host.mdwn
@@ -2,7 +2,7 @@ We discussed at DebConf the need for a property that removes propellor from a ho
 
 1. There is no standard way to remove cabal and stack packages from `/root` without potentially nuking stuff the user wants to keep.  So maybe the property should remove only OS packages?  I.e. best used on `OSOnly` hosts/chroots.
 
-2. What if another property on the host installs some or all of those build dependencies?  This property would be cancelled out by the unpropellor property.  Maybe properties that install packages need to set info about the packages that are meant to remain installed?
+2. What if another property on the host installs some or all of those build dependencies?  This property would be cancelled out by the unpropellor property.  Maybe properties that install packages need to [[set info about the packages that are meant to remain installed|todo/metapackage]]?
 
 The unpropellor property could just nuke `/usr/local/propellor` and leave it at that.  But then the sbuild module would need to maintain a list of propellor's build deps to remove from the newly created chroot, which is a third copy of the list..
 

unpropellor a host: raise issues
diff --git a/doc/todo/unpropelling_a_host.mdwn b/doc/todo/unpropelling_a_host.mdwn
new file mode 100644
index 00000000..0e1ee2b5
--- /dev/null
+++ b/doc/todo/unpropelling_a_host.mdwn
@@ -0,0 +1,9 @@
+We discussed at DebConf the need for a property that removes propellor from a host.  It would run itself at the end of the spin.  It needs to nuke `/usr/local/propellor`.  To what extent can it remove propellor's build dependencies?  I can see two problems to be resolved before writing any code.
+
+1. There is no standard way to remove cabal and stack packages from `/root` without potentially nuking stuff the user wants to keep.  So maybe the property should remove only OS packages?  I.e. best used on `OSOnly` hosts/chroots.
+
+2. What if another property on the host installs some or all of those build dependencies?  This property would be cancelled out by the unpropellor property.  Maybe properties that install packages need to set info about the packages that are meant to remain installed?
+
+The unpropellor property could just nuke `/usr/local/propellor` and leave it at that.  But then the sbuild module would need to maintain a list of propellor's build deps to remove from the newly created chroot, which is a third copy of the list..
+
+--spwhitton

Added a comment
diff --git a/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_3_6aeee8ba74b363d26a49d6773c5d5014._comment b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_3_6aeee8ba74b363d26a49d6773c5d5014._comment
new file mode 100644
index 00000000..12d59028
--- /dev/null
+++ b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_3_6aeee8ba74b363d26a49d6773c5d5014._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="spwhitton"
+ avatar="http://cdn.libravatar.org/avatar/9c3f08f80e67733fd506c353239569eb"
+ subject="comment 3"
+ date="2017-09-02T02:47:01Z"
+ content="""
+Thank you for the detailed report.
+
+I think the problem is the proxy propagation happens after the sbuild-createchroot command has run, but if the sbuild-createchroot command needs the proxy, it will fail in the way you describe.
+
+After speaking to Joey at DebConf I think I can rework the sbuild module to bypass sbuild-createchroot and run debootstrap itself, without thereby polluting the chroot that is created.  That should make it much easier to fix this bug, so I'll do that first.
+"""]]

response
diff --git a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_3_1405e20c8f5dc6e9cca3732e3e368d03._comment b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_3_1405e20c8f5dc6e9cca3732e3e368d03._comment
new file mode 100644
index 00000000..76c89ca6
--- /dev/null
+++ b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_3_1405e20c8f5dc6e9cca3732e3e368d03._comment
@@ -0,0 +1,25 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2017-09-01T22:32:43Z"
+ content="""
+One way would be to use System.Process's `close_fds` when executing
+vgs/lvs. BTW, I've seen such complaints from lvm before, in some
+situations not involving propellor.
+
+I've made a commit that makes the propellor lock FD be close-on-exec,
+which is generally a good idea for lock FDs anyway. (To prevent some 
+long-running daemon process that does not close such FDs keeping the lock
+held.)
+
+My guess is that the other 4 FDs, which are apparently pairs of FDs
+at both sides of a pipe, come from
+System.Console.Concurrent.Internal.bgProcess, which sets up just such a
+pipe. Quite possibly when vgs/lvs are run, it's via that function.
+
+Generally leaking non-lock-related FDs to child processes is not a big
+problem, as long as the child process doesn't write to random FDs (which
+would be pretty bad, but what would ever do that?) ... So I don't know if I
+want to try to chase down every FD used all through propellor to set them
+close-on-exec.
+"""]]

Added a comment
diff --git a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_2_d63d84b56ece233f795d1075aaba887a._comment b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_2_d63d84b56ece233f795d1075aaba887a._comment
new file mode 100644
index 00000000..546fe436
--- /dev/null
+++ b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_2_d63d84b56ece233f795d1075aaba887a._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="Nicolas.Schodet"
+ avatar="http://cdn.libravatar.org/avatar/0d7ec808ec329d04ee9a93c0da3c0089"
+ subject="comment 2"
+ date="2017-09-01T21:38:16Z"
+ content="""
+Thanks for your comments.
+
+I also have a problem when running vgs/lvs, they complain about leaked file descriptors. Is it something I can fix?
+
+    File descriptor 10 (/usr/local/propellor/.lock) leaked on vgs invocation. Parent PID 31216: ./dist/build/propellor-config/p
+    File descriptor 11 (pipe:[282601]) leaked on vgs invocation. Parent PID 31216: ./dist/build/propellor-config/p
+    File descriptor 12 (pipe:[282601]) leaked on vgs invocation. Parent PID 31216: ./dist/build/propellor-config/p
+    File descriptor 13 (pipe:[282602]) leaked on vgs invocation. Parent PID 31216: ./dist/build/propellor-config/p
+    File descriptor 14 (pipe:[282602]) leaked on vgs invocation. Parent PID 31216: ./dist/build/propellor-config/p
+
+I have pushed a new version with the suggested fixes.
+"""]]

review
diff --git a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_1_74c6576b25f74c6e620eb015af8b0f6a._comment b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_1_74c6576b25f74c6e620eb015af8b0f6a._comment
new file mode 100644
index 00000000..5982361f
--- /dev/null
+++ b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal/comment_1_74c6576b25f74c6e620eb015af8b0f6a._comment
@@ -0,0 +1,26 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2017-08-31T22:40:34Z"
+ content="""
+That's a pretty nice job for your first haskell code! And an impressive
+module.
+
+Most of my review comments have to do with improving types.. Which is
+always a nice way to improve already good code. :)
+
+* VolumeGroup and LogicalVolume seem like easy things to mix up.
+  Also, there's never a LogicalVolume without an associated VolumeGroup.
+  So, suggest `newtype VolumeGroup = VolumeGroup String` and
+  `data LogicalVolume = LogicalVolume String VolumeGroup` -- then
+  the user would write something like 
+  `LogicalVolume "test" (VolumeGroup "vg0")`
+* Why not make `LvState` contain a `Maybe Partition.Fs` rather than
+  the string value. (This also would move the parsing of filesystem names
+  from `fsMatch` to `lvState` or perhaps to another function it uses.)
+* It seems a bit wrong for `parseSize` to include the rounding
+  to the next extent, which is not really related to parsing.
+  Would be better to split those two things into separate functions.
+
+I feel that this module is fairly close to mergeable.
+"""]]

response
diff --git a/doc/forum/Compatibility_between_different_software_versions/comment_1_1bc12b78e09c7060f4b5c434004b4b7f._comment b/doc/forum/Compatibility_between_different_software_versions/comment_1_1bc12b78e09c7060f4b5c434004b4b7f._comment
new file mode 100644
index 00000000..97ab02e8
--- /dev/null
+++ b/doc/forum/Compatibility_between_different_software_versions/comment_1_1bc12b78e09c7060f4b5c434004b4b7f._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2017-08-31T22:26:42Z"
+ content="""
+`withOS` or `getOS` is often used to deal with such differences,
+varying behavior depending on the Host's defined OS. For example, 
+Propellor.Property.Borg.installed does one thing on Debian jessie
+and another thing on other versions of Debian. And
+Propellor.Property.Apt.getMirror generates different urls for Debian and
+Ubuntu.
+"""]]

Compatibility between different software versions
diff --git a/doc/forum/Compatibility_between_different_software_versions.mdwn b/doc/forum/Compatibility_between_different_software_versions.mdwn
new file mode 100644
index 00000000..b2de3439
--- /dev/null
+++ b/doc/forum/Compatibility_between_different_software_versions.mdwn
@@ -0,0 +1 @@
+I'm just asking myself how (or if) we can guarantee compatibility between different versions of an application. Let's take "prosody" as an example. Even if we use the "DebianLike" property, there might be different versions of "prosody" in Debian Stable and Debian Unstable and therefore different configurations options available. Is there a way to catch those cases? Another example would be a "generic" property (which works for DebianLike and ArchLinux) for a specific software, but inside these distributions are different versions of the application. Even a "Prosody.installed" might be problematic, if the package has been renamed in a newer Debian release.

diff --git a/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal.mdwn b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal.mdwn
new file mode 100644
index 00000000..0910ef5d
--- /dev/null
+++ b/doc/todo/LVM_logical_volume_creation__44___resize__44___format___38___removal.mdwn
@@ -0,0 +1,7 @@
+I have made a new property to handle logical volume with propellor.
+
+I am not confident my haskell code is good looking as this is my first real life haskell code, can you please have a look?
+
+You can pull the lvm branch at http://git.ni.fr.eu.org/nicolas/propellor.git
+
+Thanks!

response
diff --git a/doc/forum/How_to_create_a_property_with_info/comment_3_6cf0360b4922a131bca33d33acf078be._comment b/doc/forum/How_to_create_a_property_with_info/comment_3_6cf0360b4922a131bca33d33acf078be._comment
new file mode 100644
index 00000000..ac4ca94b
--- /dev/null
+++ b/doc/forum/How_to_create_a_property_with_info/comment_3_6cf0360b4922a131bca33d33acf078be._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2017-08-28T22:38:55Z"
+ content="""
+Finding a way to type check that, I don't know. It would certianly be nice
+to be able to statically check such things. The way that Info is
+implemented as a monoid that contains many different types seems to
+preclude exposing enough information for the type checker to catch such a
+problem. So it would have to be changed somehow, I don't know how.
+"""]]

Added a comment
diff --git a/doc/forum/creating_Bind9_configuration/comment_3_6b4d73b17d87d00845fda26431ded422._comment b/doc/forum/creating_Bind9_configuration/comment_3_6b4d73b17d87d00845fda26431ded422._comment
new file mode 100644
index 00000000..c61feaab
--- /dev/null
+++ b/doc/forum/creating_Bind9_configuration/comment_3_6b4d73b17d87d00845fda26431ded422._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="Nicolas.Schodet"
+ avatar="http://cdn.libravatar.org/avatar/0d7ec808ec329d04ee9a93c0da3c0089"
+ subject="comment 3"
+ date="2017-08-28T14:03:35Z"
+ content="""
+It might be a configuration from my server provider, maybe I should do a clean install :)
+
+If not using a full clone, I also have problem because I cannot use things like Utility.Units.
+"""]]

Added a comment
diff --git a/doc/forum/How_to_create_a_property_with_info/comment_2_1c2b3cb54f27fb6b6bb5de9d159dd34f._comment b/doc/forum/How_to_create_a_property_with_info/comment_2_1c2b3cb54f27fb6b6bb5de9d159dd34f._comment
new file mode 100644
index 00000000..6034e6e5
--- /dev/null
+++ b/doc/forum/How_to_create_a_property_with_info/comment_2_1c2b3cb54f27fb6b6bb5de9d159dd34f._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 2"
+ date="2017-08-26T06:29:44Z"
+ content="""
+I could have multiple host with debomatic install on it.
+I need to create a property which take a list of hosts (all with the Debomatic info) in order to generate the sources.list files.
+This way it is possible for me to select per host the sources of packages.
+
+what should be done in order to type check this ?
+I would like the compiler to says. Hey you ask for a source list from this host but it dos not contain a Debian mirror.
+
+Cheers
+"""]]

comment
diff --git a/doc/forum/How_to_create_a_property_with_info/comment_1_819902ee6b8e571f735dd2c9c93c49a9._comment b/doc/forum/How_to_create_a_property_with_info/comment_1_819902ee6b8e571f735dd2c9c93c49a9._comment
new file mode 100644
index 00000000..853e6e86
--- /dev/null
+++ b/doc/forum/How_to_create_a_property_with_info/comment_1_819902ee6b8e571f735dd2c9c93c49a9._comment
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2017-08-25T23:07:12Z"
+ content="""
+It's not allowed for the content of Info to come from an IO action.
+Info has to be static. This allows one Host to introspect the Info of
+another Host. The Dns properties rely on that.
+
+So, the type checker is right in preventing this. It's also not allowed
+to use ensureProperty with a property that HasInfo, as the info would
+not propigate to the outer property. The type checker is also preventing
+you making that mistake.
+
+(You also forgot to pass the `w` parameter to `ensureProperty`, 
+which made the type checker unhappy as well and probably confused the error
+messages.)
+
+To accomplish your goal, you could use:
+
+	data DebOMaticHostMirror = DebOMaticHostMirror
+
+If a Host has this in its Info, you know that Host is the one with
+debomatic installed. You can then get its hostname using the `hostName`
+field accessor on the Host. 
+
+The property that does that will need to be passed a `[Host]` which will
+typically be the `hosts` list defined in config.hs.
+"""]]

diff --git a/doc/forum/How_to_create_a_property_with_info.mdwn b/doc/forum/How_to_create_a_property_with_info.mdwn
new file mode 100644
index 00000000..ea8babe5
--- /dev/null
+++ b/doc/forum/How_to_create_a_property_with_info.mdwn
@@ -0,0 +1,65 @@
+Hello Joey,
+
+I try to setup a debomatic service on one of my computer.
+So I created a data which will store on which host it was installed
+
+    data DebOMaticHostMirror = DebOMaticHostMirror Url
+	deriving (Eq, Show, Typeable)
+
+So now I try to create a property which get the hostname and set the info, 
+BUT I did not find the right way to do this. Here an attempt
+
+    debomaticHostMirror :: Property (HasInfo + UnixLike)
+    debomaticHostMirror = property' desc $ \w -> do
+      hostname <- asks hostName
+      ensureProperty $ pureInfoProperty desc (InfoVal (DebOMaticHostMirror hostname))
+        where
+          desc = "setup the Deb-O-Matic host name for other properties"
+
+but I get this error message
+
+    src/propellor-config.hs:935:3: error:
+    • Couldn't match expected type ‘Propellor Result’
+                  with actual type ‘Property
+                                      (Propellor.Types.MetaTypes.MetaTypes inner0)
+                                    -> Propellor Result’
+    • In a stmt of a 'do' block:
+        ensureProperty
+        $ pureInfoProperty desc (InfoVal (DebOMaticHostMirror hostname))
+      In the expression:
+        do { hostname <- asks hostName;
+             ensureProperty
+             $ pureInfoProperty desc (InfoVal (DebOMaticHostMirror hostname)) }
+      In the second argument of ‘($)’, namely
+        ‘\ w
+           -> do { hostname <- asks hostName;
+                   ensureProperty
+                   $ pureInfoProperty desc (InfoVal (DebOMaticHostMirror hostname)) }’
+
+    src/propellor-config.hs:935:20: error:
+    • Couldn't match expected type ‘OuterMetaTypesWitness outer0’
+                  with actual type ‘Property (HasInfo + UnixLike)’
+    • In the second argument of ‘($)’, namely
+        ‘pureInfoProperty desc (InfoVal (DebOMaticHostMirror hostname))’
+      In a stmt of a 'do' block:
+        ensureProperty
+        $ pureInfoProperty desc (InfoVal (DebOMaticHostMirror hostname))
+      In the expression:
+        do { hostname <- asks hostName;
+             ensureProperty
+             $ pureInfoProperty desc (InfoVal (DebOMaticHostMirror hostname)) }
+
+the Idea after is to create a property which will take the DeboMatic Info and generate the
+/etc/apt/sourses.list.d/debomatic.list on a bunch of hosts.
+
+Maybe we could have a
+
+    typeclass Mirror a where
+       toSourceListDLines :: a -> [Line]
+
+    instance Mirror DebOMaticHostMirror where
+       toSourceListDLines (DebOMaticHostMirror hostname) = ...
+
+then the stdSourceListD property should be change to use toSourceListDLines
+
+but this is another story :)

comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_13_2f8c7bb7f8ffb734a99ac3d7b28e2d62._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_13_2f8c7bb7f8ffb734a99ac3d7b28e2d62._comment
new file mode 100644
index 00000000..74dc528e
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_13_2f8c7bb7f8ffb734a99ac3d7b28e2d62._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 13"""
+ date="2017-08-24T21:11:07Z"
+ content="""
+Yes, there are two levels of caches. This does make updating the images a
+whole lot faster!
+
+Some systems don't have a very large /var partition and so I think it's
+better to let the user pick where they go. The documentation could
+certainly (always) be improved.
+
+Note that reverting any of the properties in DiskImage will clean up
+all the cache files as well as the final disk image.
+"""]]

Added a comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_12_4baf7efcc6f9c50e3aebd663b7792279._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_12_4baf7efcc6f9c50e3aebd663b7792279._comment
new file mode 100644
index 00000000..b6de7d0a
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_12_4baf7efcc6f9c50e3aebd663b7792279._comment
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 12"
+ date="2017-08-24T19:11:24Z"
+ content="""
+If I understand correctly, the new typeclass need to provide a method which return the
+(RawDiskImage filename). In the process we have at least 2 cache level
+One for the chroot, and one for the RawImage.
+
+I was wondering if these cache (side effect) could not be regrouped
+under /var/cache/propellor instead of putting this randomly everywhere on the disk.
+
+This way It should be possible to \"reset\" propellor by removing the cache in order to force
+a cache rebuild.
+
+I think about this because I am not aware as a user of all these \"side effects\".
+
+propellor --purge-cache ;)
+
+cheers and thanks again
+
+"""]]

Added a comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_11_b1ad266b5c34b600d2d724bf5ffc40de._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_11_b1ad266b5c34b600d2d724bf5ffc40de._comment
new file mode 100644
index 00000000..79debc75
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_11_b1ad266b5c34b600d2d724bf5ffc40de._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 11"
+ date="2017-08-24T18:36:12Z"
+ content="""
+Thanks a lot joey.
+"""]]

DiskImage type class
* DiskImage: Made a DiskImage type class, so that different disk image
formats can be implemented. The properties in this module can generate
any type that is a member of DiskImage. (API change)
(To convert existing configs, convert the filename of the disk image
to RawDiskImage filename.)
* Removed DiskImage.vmdkBuiltFor property. (API change)
Instead, use VirtualBoxPointer in the property that creates the disk
image.
This commit was sponsored by Jack Hill on Patreon.
diff --git a/debian/changelog b/debian/changelog
index f8b59743..9b01183f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,16 @@
+propellor (4.8.0) UNRELEASED; urgency=medium
+
+  * DiskImage: Made a DiskImage type class, so that different disk image
+    formats can be implemented. The properties in this module can generate
+    any type that is a member of DiskImage. (API change)
+    (To convert existing configs, convert the filename of the disk image
+    to RawDiskImage filename.)
+  * Removed DiskImage.vmdkBuiltFor property. (API change)
+    Instead, use VirtualBoxPointer in the property that creates the disk
+    image.
+
+ -- Joey Hess <id@joeyh.name>  Thu, 24 Aug 2017 11:00:19 -0400
+
 propellor (4.7.7) unstable; urgency=medium
 
   * Locale: Display an error message when /etc/locale.gen does not contain
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_10_7982113b64a7884ce95ff38a6d876e2e._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_10_7982113b64a7884ce95ff38a6d876e2e._comment
new file mode 100644
index 00000000..3ccfc4db
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_10_7982113b64a7884ce95ff38a6d876e2e._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 10"""
+ date="2017-08-24T15:35:22Z"
+ content="""
+I've implemented the DiskImage type class.
+"""]]
diff --git a/joeyconfig.hs b/joeyconfig.hs
index 1ce15682..e98e5b51 100644
--- a/joeyconfig.hs
+++ b/joeyconfig.hs
@@ -94,12 +94,11 @@ darkstar = host "darkstar.kitenet.net" $ props
 	& Ssh.userKeys (User "joey") hostContext
 		[ (SshRsa, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1YoyHxZwG5Eg0yiMTJLSWJ/+dMM6zZkZiR4JJ0iUfP+tT2bm/lxYompbSqBeiCq+PYcSC67mALxp1vfmdOV//LWlbXfotpxtyxbdTcQbHhdz4num9rJQz1tjsOsxTEheX5jKirFNC5OiKhqwIuNydKWDS9qHGqsKcZQ8p+n1g9Lr3nJVGY7eRRXzw/HopTpwmGmAmb9IXY6DC2k91KReRZAlOrk0287LaK3eCe1z0bu7LYzqqS+w99iXZ/Qs0m9OqAPnHZjWQQ0fN4xn5JQpZSJ7sqO38TBAimM+IHPmy2FTNVVn9zGM+vN1O2xr3l796QmaUG1+XLL0shfR/OZbb joey@darkstar")
 		]
-	& imageBuilt "/srv/test.img" mychroot MSDOS
+	& imageBuilt (VirtualBoxPointer "/srv/test.vmdk") mychroot MSDOS
 		[ partition EXT2 `mountedAt` "/boot"
 		, partition EXT4 `mountedAt` "/"
 		, swapPartition (MegaBytes 256)
 		]
-		`before` vmdkBuiltFor "/srv/test.img"
   where
 	mychroot d = debootstrapped mempty d $ props
 		& osDebian Unstable X86_64
diff --git a/src/Propellor/Property/DiskImage.hs b/src/Propellor/Property/DiskImage.hs
index f64f685a..6c1a572c 100644
--- a/src/Propellor/Property/DiskImage.hs
+++ b/src/Propellor/Property/DiskImage.hs
@@ -8,12 +8,13 @@ module Propellor.Property.DiskImage (
 	-- * Partition specification
 	module Propellor.Property.DiskImage.PartSpec,
 	-- * Properties
-	DiskImage,
+	DiskImage(..),
+	RawDiskImage(..),
+	VirtualBoxPointer(..),
 	imageBuilt,
 	imageRebuilt,
 	imageBuiltFrom,
 	imageExists,
-	vmdkBuiltFor,
 	Grub.BIOS(..),
 ) where
 
@@ -42,7 +43,48 @@ import qualified Data.Map.Strict as M
 import qualified Data.ByteString.Lazy as L
 import System.Posix.Files
 
-type DiskImage = FilePath
+-- | Type class of disk image formats.
+class DiskImage d where
+	-- | Get the location where the raw disk image should be stored.
+	rawDiskImage :: d -> RawDiskImage
+	-- | Describe the disk image (for display to the user)
+	describeDiskImage :: d -> String
+	-- | Convert the raw disk image file in the
+	-- `rawDiskImage` location into the desired disk image format.
+	-- For best efficiency, the raw disk imasge file should be left
+	-- unchanged on disk.
+	buildDiskImage :: d -> RevertableProperty DebianLike Linux
+
+-- | A raw disk image, that can be written directly out to a disk.
+newtype RawDiskImage = RawDiskImage FilePath
+
+instance DiskImage RawDiskImage where
+	rawDiskImage = id
+	describeDiskImage (RawDiskImage f) = f
+	buildDiskImage (RawDiskImage _) = doNothing <!> doNothing
+
+-- | A virtualbox .vmdk file, which contains a pointer to the raw disk
+-- image. This can be built very quickly.
+newtype VirtualBoxPointer = VirtualBoxPointer FilePath
+
+instance DiskImage VirtualBoxPointer where
+	rawDiskImage (VirtualBoxPointer f) = RawDiskImage $
+		dropExtension f ++ ".img"
+	describeDiskImage (VirtualBoxPointer f) = f
+	buildDiskImage (VirtualBoxPointer vmdkfile) = (setup <!> cleanup)
+		`describe` (vmdkfile ++ " built")
+	  where
+		setup = cmdProperty "VBoxManage"
+			[ "internalcommands", "createrawvmdk"
+			, "-filename", vmdkfile
+			, "-rawdisk", diskimage
+			]
+			`changesFile` vmdkfile
+			`onChange` File.mode vmdkfile (combineModes (ownerWriteMode : readModes))
+			`requires` Apt.installed ["virtualbox"]
+			`requires` File.notPresent vmdkfile
+		cleanup = tightenTargets $ File.notPresent vmdkfile
+		RawDiskImage diskimage = rawDiskImage (VirtualBoxPointer vmdkfile)
 
 -- | Creates a bootable disk image.
 --
@@ -70,7 +112,7 @@ type DiskImage = FilePath
 -- > import Propellor.Property.Chroot
 -- > 
 -- > foo = host "foo.example.com" $ props
--- > 	& imageBuilt "/srv/diskimages/disk.img" mychroot
+-- > 	& imageBuilt (RawDiskImage "/srv/diskimages/disk.img") mychroot
 -- >		MSDOS
 -- >		[ partition EXT2 `mountedAt` "/boot"
 -- >			`setFlag` BootFlag
@@ -95,7 +137,7 @@ type DiskImage = FilePath
 --
 -- > foo :: Host
 -- > foo = host "foo.example.com" $ props
--- >	& imageBuilt "/srv/diskimages/bar-disk.img"
+-- >	& imageBuilt (RawDiskImage "/srv/diskimages/bar-disk.img")
 -- >		(hostChroot bar (Debootstrapped mempty))
 -- >		MSDOS
 -- >		[ partition EXT2 `mountedAt` "/boot"
@@ -111,30 +153,31 @@ type DiskImage = FilePath
 -- >	& Apt.installed ["linux-image-amd64"]
 -- >	& Grub.installed PC
 -- >	& hasPassword (User "root")
-imageBuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
+imageBuilt :: DiskImage d => d -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
 imageBuilt = imageBuilt' False
 
 -- | Like 'built', but the chroot is deleted and rebuilt from scratch each
 -- time. This is more expensive, but useful to ensure reproducible results
 -- when the properties of the chroot have been changed.
-imageRebuilt :: DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
+imageRebuilt :: DiskImage d => d -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
 imageRebuilt = imageBuilt' True
 
-imageBuilt' :: Bool -> DiskImage -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
+imageBuilt' :: DiskImage d => Bool -> d -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
 imageBuilt' rebuild img mkchroot tabletype partspec =
 	imageBuiltFrom img chrootdir tabletype final partspec
 		`requires` Chroot.provisioned chroot
 		`requires` (cleanrebuild <!> (doNothing :: Property UnixLike))
 		`describe` desc
   where
-	desc = "built disk image " ++ img
+	desc = "built disk image " ++ describeDiskImage img
+	RawDiskImage imgfile = rawDiskImage img
 	cleanrebuild :: Property Linux
 	cleanrebuild
 		| rebuild = property desc $ do
 			liftIO $ removeChroot chrootdir
 			return MadeChange
 		| otherwise = doNothing
-	chrootdir = img ++ ".chroot"
+	chrootdir = imgfile ++ ".chroot"
 	chroot =
 		let c = propprivdataonly $ mkchroot chrootdir
 		in setContainerProps c $ containerProps c
@@ -161,10 +204,11 @@ cachesCleaned = "cache cleaned" ==> (Apt.cacheCleaned `pickOS` skipit)
 	skipit = doNothing :: Property UnixLike
 
 -- | Builds a disk image from the contents of a chroot.
-imageBuiltFrom :: DiskImage -> FilePath -> TableType -> Finalization -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) UnixLike
+imageBuiltFrom :: DiskImage d => d -> FilePath -> TableType -> Finalization -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
 imageBuiltFrom img chrootdir tabletype final partspec = mkimg <!> rmimg
   where
-	desc = img ++ " built from " ++ chrootdir
+	desc = describeDiskImage img ++ " built from " ++ chrootdir
+	dest@(RawDiskImage imgfile) = rawDiskImage img
 	mkimg = property' desc $ \w -> do
 		-- Unmount helper filesystems such as proc from the chroot
 		-- first; don't want to include the contents of those.
@@ -176,14 +220,17 @@ imageBuiltFrom img chrootdir tabletype final partspec = mkimg <!> rmimg
 		let (mnts, mntopts, parttable) = fitChrootSize tabletype partspec $
 			map (calcsz mnts) mnts
 		ensureProperty w $
-			imageExists' img parttable
+			imageExists' dest parttable
 				`before`
-			kpartx img (mkimg' mnts mntopts parttable)
+			kpartx imgfile (mkimg' mnts mntopts parttable)

(Diff truncated)
comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_9_eebdf852c9d73c7b11b184b7654aa78c._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_9_eebdf852c9d73c7b11b184b7654aa78c._comment
new file mode 100644
index 00000000..1b1f1e64
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_9_eebdf852c9d73c7b11b184b7654aa78c._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 9"""
+ date="2017-08-24T14:39:05Z"
+ content="""
+The `DiskImage` data type could be expanded to support different output
+formats.
+
+Or, a type class could be used, so eg:
+
+	imageBuilt :: DiskImage d => d -> (FilePath -> Chroot) -> TableType -> [PartSpec ()] -> RevertableProperty (HasInfo + DebianLike) Linux
+
+The type class would just need a function to convert from the raw disk
+image to the desired file format. Then anyone could add whatever disk image
+formats they want (which can probably shade into containers in some cases).
+"""]]

Added a comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_8_ca5d1f161c037c09fe853c56281f88bc._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_8_ca5d1f161c037c09fe853c56281f88bc._comment
new file mode 100644
index 00000000..9891845e
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_8_ca5d1f161c037c09fe853c56281f88bc._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 8"
+ date="2017-08-24T07:04:07Z"
+ content="""
+It is true that my uszer prefer the embeded virtual image :).
+
+Maybe we could have a DiskImage export property which could take an output format type
+I do not know how many format are out there for these kind of virtual machines.
+Maybe this could be also a way to prepare images for the cloud. (I do not use this mayself but why not).
+What is the difference between Diskimage and containers ?
+
+Cheers
+
+Frederic
+
+"""]]

comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_7_a3de897d9d056fcb6821f3b03485ede5._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_7_a3de897d9d056fcb6821f3b03485ede5._comment
new file mode 100644
index 00000000..7c0995ff
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_7_a3de897d9d056fcb6821f3b03485ede5._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 7"""
+ date="2017-08-23T21:07:41Z"
+ content="""
+The vmdk text file is so small that I did think about just having propellor
+generate it by itself. I don't know how stable/documented it is however.
+
+I suppose that if you're distributing a vmdk image to others, you would not
+want to use the text file format, since that hard-codes the path to the
+.img file. So, perhaps there should be separate properties for vmdk text
+files that point at disk images and self-contained vmdk images.
+"""]]

Added a comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_6_1410b386c0f3e1ff41adb068dd611f10._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_6_1410b386c0f3e1ff41adb068dd611f10._comment
new file mode 100644
index 00000000..5bd1ab6d
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_6_1410b386c0f3e1ff41adb068dd611f10._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 6"
+ date="2017-08-23T19:42:31Z"
+ content="""
+this is good for me because I prepare a virtualbox image not for me but for our windows / MacOSX users.
+
+This is why I need to build these images.
+
+thanks for your help
+"""]]

add news item for propellor 4.7.7
diff --git a/doc/news/version_4.7.2.mdwn b/doc/news/version_4.7.2.mdwn
deleted file mode 100644
index a81220b..0000000
--- a/doc/news/version_4.7.2.mdwn
+++ /dev/null
@@ -1,7 +0,0 @@
-propellor 4.7.2 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Added PROPELLOR\_TRACE environment variable, which can be set to 1 to
-     make propellor output serialized Propellor.Message.Trace values,
-     for consumption by another program.
-   * Rsync: Make rsync display its progress, in a minimal format to avoid
-     scrolling each file down the screen."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.7.7.mdwn b/doc/news/version_4.7.7.mdwn
new file mode 100644
index 0000000..258f0f2
--- /dev/null
+++ b/doc/news/version_4.7.7.mdwn
@@ -0,0 +1,11 @@
+propellor 4.7.7 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Locale: Display an error message when /etc/locale.gen does not contain
+     the requested locale.
+   * Attic module is deprecated and will warn when used.
+     Attic is no longer available in Debian and appears to have been
+     mostly supersceded by Borg.
+   * Obnam module is deprecated and will warn when used.
+     Obnam has been retired by its author.
+   * Add Typeable instance to Bootstrapper, fixing build with old versions
+     of ghc. (Previous attempt was incomplete.)"""]]
\ No newline at end of file

comment
diff --git a/doc/forum/creating_Bind9_configuration/comment_2_f1bffbdd7c2ebab2dd9518ee024e7a92._comment b/doc/forum/creating_Bind9_configuration/comment_2_f1bffbdd7c2ebab2dd9518ee024e7a92._comment
new file mode 100644
index 0000000..71c8b5a
--- /dev/null
+++ b/doc/forum/creating_Bind9_configuration/comment_2_f1bffbdd7c2ebab2dd9518ee024e7a92._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2017-08-23T16:00:12Z"
+ content="""
+At least on Debian, bind seems to come configured to listen on all
+interfaces by default, so I have not messed with listen-on settings at all.
+
+confLines seems to have been included in NamedConf to allow for specifying
+additional lines, but there does not seem to be an interface to set it.
+Versions of the 3 dns properties with an additional (NamedConf -> NamedConf)
+parameter woulld be one way; I'd take such a patch.
+
+As to a minimal config vs a full clone, it's up to you. With a full clone
+you can easily modify all of propellor's properties to quicklly deal with
+issues like this.. but then you might have to maintain your patches if you
+don't get them accepted into propellor.
+"""]]

comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_5_df27f39bfb7104b4440c972b71f586e4._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_5_df27f39bfb7104b4440c972b71f586e4._comment
new file mode 100644
index 0000000..374de32
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_5_df27f39bfb7104b4440c972b71f586e4._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2017-08-23T15:49:27Z"
+ content="""
+The `vmdkBuiltFor` property is provided to make a disk image
+usable with virtualbox. If your distribution chooses not to include
+virtualbox and so you don't have virtualbox installed, what good would
+such an image be to you?
+
+To use `vmdkBuiltFor` you must already have a disk image file, which qemu
+etc can already use.
+
+"qemu-img convert" writes a whole disk image file. This is a much more
+expensive operation than what `vmdkBuiltFor` currently does, which creates
+a tiny text file that makes virtualbox use the existing disk image.
+"""]]

Add Typeable instance to Bootstrapper, fixing build with old versions of ghc. (Previous attempt was incomplete.)
diff --git a/debian/changelog b/debian/changelog
index 9de2922..f6ed0d5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -7,6 +7,8 @@ propellor (4.7.7) UNRELEASED; urgency=medium
     mostly supersceded by Borg.
   * Obnam module is deprecated and will warn when used.
     Obnam has been retired by its author.
+  * Add Typeable instance to Bootstrapper, fixing build with old versions
+    of ghc. (Previous attempt was incomplete.)
 
  -- Joey Hess <id@joeyh.name>  Wed, 23 Aug 2017 11:41:01 -0400
 
diff --git a/doc/forum/propellor_4.7.6_does_not_compile_on_jessie/comment_1_c35f458b4c958f6397fe726f5676b700._comment b/doc/forum/propellor_4.7.6_does_not_compile_on_jessie/comment_1_c35f458b4c958f6397fe726f5676b700._comment
new file mode 100644
index 0000000..98b2d00
--- /dev/null
+++ b/doc/forum/propellor_4.7.6_does_not_compile_on_jessie/comment_1_c35f458b4c958f6397fe726f5676b700._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2017-08-23T15:41:55Z"
+ content="""
+I've added a typeable instance for Bootstrapper which should fix that.
+"""]]
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs
index 21d29bc..08af687 100644
--- a/src/Propellor/Bootstrap.hs
+++ b/src/Propellor/Bootstrap.hs
@@ -33,7 +33,7 @@ type ShellCommand = String
 -- `OSOnly` uses the OS's native packages of Cabal and all of propellor's
 -- build dependencies. It may not work on all systems.
 data Bootstrapper = Robustly Builder | OSOnly
-	deriving (Show)
+	deriving (Show, Typeable)
 
 data Builder = Cabal | Stack
 	deriving (Show, Typeable)

Added a comment
diff --git a/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_2_579894632e567a08d83e306be5e355b2._comment b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_2_579894632e567a08d83e306be5e355b2._comment
new file mode 100644
index 0000000..53595ad
--- /dev/null
+++ b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_2_579894632e567a08d83e306be5e355b2._comment
@@ -0,0 +1,84 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 2"
+ date="2017-08-23T13:26:31Z"
+ content="""
+Hello, so I try to restart from scratch and ask for a stretch Sbuild
+
+everything went fine until the update
+
+
+    I: schroot chroot configuration written to /etc/schroot/chroot.d/stretch-amd64-propellor-VYWULd.
+    +------------------------------------------------------------------------
+    |[stretch-amd64-propellor]
+    |description=Debian stretch/amd64 autobuilder
+    |groups=root,sbuild
+    |root-groups=root,sbuild
+    |profile=sbuild
+    |type=directory
+    |directory=/srv/chroot/stretch-amd64
+    |union-type=overlay
+    +------------------------------------------------------------------------
+    I: Please rename and modify this file as required.
+    W: Not creating symlink /srv/chroot/stretch-amd64 to /etc/sbuild/chroot/stretch-amd64-propellor: file already exists
+    perl: warning: Setting locale failed.
+    perl: warning: Please check that your locale settings:
+            LANGUAGE = (unset),
+            LC_ALL = (unset),
+            LANG = \"en_GB.UTF-8\"
+        are supported and installed on your system.
+    perl: warning: Falling back to the standard locale (\"C\").
+    I: Setting reference package list.
+    I: Updating chroot.
+
+
+On my network, I need a proxy so I setup the host with 
+
+    ...
+    & Apt.proxy myproxy
+    & Sbuild.builtFor stretch Sbuild.UseCcache
+
+If I understand correctly the Apt.proxy should propagate the Apt.proxy into the Sbuild
+but when I look inside the chroot, I can not find the 
+
+    /etc/apt/apt.conf.d/20proxy
+
+file which is on the host
+
+And Indeed after a certain amount of time, the network gives a timeout
+
+    Err:1 http://deb.debian.org/debian stretch InRelease
+      Cannot initiate the connection to deb.debian.org:80 (2001:41c8:1000:21::21:4). - connect (101: Network is unreachable) [IP: 2001:41c8:1000:21::21:4 80]
+    Reading package lists...
+    W: Failed to fetch http://deb.debian.org/debian/dists/stretch/InRelease  Cannot initiate the connection to deb.debian.org:80 (2001:41c8:1000:21::21:4). - connect (101: Network is unreachable) [IP: 2001:41c8:1000:21::21:4 80]
+    W: Some index files failed to download. They have been ignored, or old ones used instead.
+    Reading package lists...
+    Building dependency tree...
+    Calculating upgrade...
+    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+    I: Successfully set up stretch chroot.
+    I: Run \"sbuild-adduser\" to add new sbuild users.
+    sixs7.exp.synchrotron-soleil.fr sbuild schroot for System (Debian Linux (Stable \"stretch\")) X86_64 ... done
+
+the good news is that now the schroot file contain the right informations
+
+    [stretch-amd64-sbuild]
+    description=Debian stretch/amd64 autobuilder
+    groups=root,sbuild
+    root-groups=root,sbuild
+    profile=sbuild
+    type=directory
+    directory=/srv/chroot/stretch-amd64
+    union-type=overlay
+    command-prefix=/var/cache/ccache-sbuild/sbuild-setup,eatmydata
+
+
+So to summarize, I think that the Apt.proxy propagation does not work.
+
+This propagation should be optional because sometime we prepare images which are not meant to be used behind a proxy (where they were prepare)
+
+thanks for your attention :)
+
+
+"""]]

Added a comment
diff --git a/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_1_59ac4661a896a514ce953a0069341869._comment b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_1_59ac4661a896a514ce953a0069341869._comment
new file mode 100644
index 0000000..b4e411b
--- /dev/null
+++ b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot/comment_1_59ac4661a896a514ce953a0069341869._comment
@@ -0,0 +1,24 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 1"
+ date="2017-08-23T13:00:13Z"
+ content="""
+this is strange because the stretch-amd64-sbuild file is wrong.
+
+here the content
+
+    [stretch-amd64-sbuild]
+    command-prefix=/var/cache/ccache-sbuild/sbuild-setup,eatmydata
+
+to compare with my previous jessie-amd64-sbuild
+
+    [jessie-amd64-sbuild]
+    type=directory
+    description=Debian jessie/amd64 autobuilder
+    directory=/srv/chroot/jessie-amd64
+    groups=root,sbuild
+    root-groups=root,sbuild
+    profile=sbuild
+    command-prefix=/var/cache/ccache-sbuild/sbuild-setup,eatmydata
+"""]]

diff --git a/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot.mdwn b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot.mdwn
new file mode 100644
index 0000000..8887f43
--- /dev/null
+++ b/doc/forum/Sbuild_chroot_are_not_compatible_with_schroot.mdwn
@@ -0,0 +1,29 @@
+Hello, I am preparing a property in order to setup a debomatic machine
+but  when I try to upload a package I get this error from debomatic
+
+    DEBUG: Command '['schroot', '-l']' returned non-zero exit status 1
+    Traceback (most recent call last):
+    File "/usr/share/debomatic/Debomatic/process.py", line 197, in _finish
+      raise e
+    File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run
+      result = self.fn(*self.args, **self.kwargs)
+    File "/usr/share/debomatic/Debomatic/build.py", line 525, in run
+      self._build()
+    File "/usr/share/debomatic/Debomatic/build.py", line 133, in _build
+      self._setup_chroot()
+    File "/usr/share/debomatic/Debomatic/build.py", line 395, in _setup_chroot
+      chroots = check_output(['schroot', '-l'], stderr=fd)
+    File "/usr/lib/python3.5/subprocess.py", line 316, in check_output
+      **kwargs).stdout
+    File "/usr/lib/python3.5/subprocess.py", line 398, in run
+      output=stdout, stderr=stderr)
+    subprocess.CalledProcessError: Command '['schroot', '-l']' returned non-zero exit status 1
+
+so tried on my own
+
+    :/etc/debomatic# schroot -l
+    E: /etc/schroot/chroot.d/stretch-amd64-sbuild-propellor: [stretch-amd64-sbuild]: Required key ‘directory’ is missing
+
+to my opinion the schroot config file generated by Sbuild property does something wrong.
+
+Cheers

diff --git a/doc/forum/propellor_4.7.6_does_not_compile_on_jessie.mdwn b/doc/forum/propellor_4.7.6_does_not_compile_on_jessie.mdwn
new file mode 100644
index 0000000..b3e6f7c
--- /dev/null
+++ b/doc/forum/propellor_4.7.6_does_not_compile_on_jessie.mdwn
@@ -0,0 +1,32 @@
+Hello here the error message I got while trying to compile on jessie
+
+    [ 91 of 113] Compiling Propellor.Bootstrap ( src/Propellor/Bootstrap.hs, dist/build/propellor-config/propellor-config-tmp/Propellor/Bootstrap.o ) src/Propellor/Bootstrap.hs:239:22:
+    No instance for (Typeable Bootstrapper)
+      arising from a use of `fromInfo'
+    Possible fix:
+      add an instance declaration for (Typeable Bootstrapper)
+    In the expression: fromInfo (maybe mempty hostInfo mh)
+    In a stmt of a 'do' block:
+      case fromInfo (maybe mempty hostInfo mh) of {
+        NoInfoVal
+          -> do { bs <- getGitConfigValue "propellor.buildsystem";
+                  case bs of {
+                    Just "stack" -> ...
+                    _ -> ... } }
+        InfoVal bs
+          -> case getBuilder bs of {
+               Cabal -> cabalBuild msys
+               Stack -> stackBuild msys } }
+    In the second argument of `($)', namely
+      `do { case fromInfo (maybe mempty hostInfo mh) of {
+              NoInfoVal -> do { ... }
+              InfoVal bs
+                -> case getBuilder bs of {
+                     Cabal -> ...
+                     Stack -> ... } } }'
+    Warning: The package list for 'hackage.haskell.org' does not exist. Run 'cabal
+    update' to download it.
+    Resolving dependencies...
+    Configuring propellor-4.7.6...
+
+Cheers

Added a comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_4_fc50b46606eacf59e5db227760ce38ab._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_4_fc50b46606eacf59e5db227760ce38ab._comment
new file mode 100644
index 0000000..27b70a5
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_4_fc50b46606eacf59e5db227760ce38ab._comment
@@ -0,0 +1,24 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 4"
+ date="2017-08-22T08:42:35Z"
+ content="""
+    vmdkBuiltFor :: FilePath -> RevertableProperty DebianLike UnixLike
+    vmdkBuiltFor diskimage = (setup <!> cleanup)
+	`describe` (vmdkfile ++ \" built\")
+      where
+	vmdkfile = diskimage ++ \".vmdk\"
+	setup = cmdProperty \"qemu-img\"
+		[ \"convert\"
+		, \"-O\", \"vmdk\"
+		, diskimage, vmdkfile
+		]
+		`changesFile` vmdkfile
+		`onChange` File.mode vmdkfile (combineModes (ownerWriteMode : readModes))
+		`requires` Apt.installed [\"qemu-utils\"]
+		`requires` File.notPresent vmdkfile
+	cleanup = File.notPresent vmdkfile
+
+seems to work :))
+"""]]

Added a comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_3_047bca6e0676f0d93338d4eff20825bf._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_3_047bca6e0676f0d93338d4eff20825bf._comment
new file mode 100644
index 0000000..aeeaf72
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_3_047bca6e0676f0d93338d4eff20825bf._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 3"
+ date="2017-08-22T07:36:06Z"
+ content="""
+It seems that we do not need virtualbox in order to generate a vmdk image
+
+I installed *qemu-utils* and then
+
+    # qemu-img convert -O vmdk soleil.img soleil.vmdk
+    # file soleil.vmdk
+    soleil.vmdk: VMware4 disk image
+
+what about using this solution instead of the virtualbox one ?
+
+Cheers
+"""]]

Added a comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_2_98fb34d4e76bab6ef7a981c87533f395._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_2_98fb34d4e76bab6ef7a981c87533f395._comment
new file mode 100644
index 0000000..e8898a9
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_2_98fb34d4e76bab6ef7a981c87533f395._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 2"
+ date="2017-08-22T07:12:13Z"
+ content="""
+OK, I tryed to install the wrong kernel so the initramfs was not installed.
+
+So now the only real problem is the virtualbox one ;)
+
+Cheers
+
+Frederic
+"""]]

Added a comment
diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_1_2daa4574bce2179bfd7e9e505de3f7b0._comment b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_1_2daa4574bce2179bfd7e9e505de3f7b0._comment
new file mode 100644
index 0000000..9028303
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system/comment_1_2daa4574bce2179bfd7e9e505de3f7b0._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 1"
+ date="2017-08-22T07:02:51Z"
+ content="""
+Haaaaaaa the format of the post is ugly. Is it possible to change this ?
+"""]]

diff --git a/doc/forum/DiskImage_creation_does_not_work_on_my_system.mdwn b/doc/forum/DiskImage_creation_does_not_work_on_my_system.mdwn
new file mode 100644
index 0000000..f7f5688
--- /dev/null
+++ b/doc/forum/DiskImage_creation_does_not_work_on_my_system.mdwn
@@ -0,0 +1,36 @@
+Hello, I am trying to create a virtualbox image from my stretch system.
+
+But I hve two problems :)
+
+I took your example from the DiskImage property, but in the end, I got this
+
+/srv/diskimages/soleil.img.chroot no services started ... ok
+/srv/diskimages/soleil.img.chroot has Operating System (Debian Linux Unstable) X86_32 ... ok
+/srv/diskimages/soleil.img.chroot apt installed linux-image-i686 ... ok
+/srv/diskimages/soleil.img.chroot grub package installed ... ok
+/srv/diskimages/soleil.img.chroot root has insecure password ... done
+/srv/diskimages/soleil.img.chroot account for soleil ... ok
+/srv/diskimages/soleil.img.chroot soleil has insecure password ... done
+/srv/diskimages/soleil.img.chroot user soleil in group audio ... ok
+/srv/diskimages/soleil.img.chroot user soleil in group cdrom ... ok
+/srv/diskimages/soleil.img.chroot user soleil in group dip ... ok
+/srv/diskimages/soleil.img.chroot user soleil in group floppy ... ok
+/srv/diskimages/soleil.img.chroot user soleil in group video ... ok
+/srv/diskimages/soleil.img.chroot user soleil in group plugdev ... ok
+/srv/diskimages/soleil.img.chroot user soleil in group netdev ... ok
+/srv/diskimages/soleil.img.chroot user soleil is in standard desktop groups ... ok
+/srv/diskimages/soleil.img.chroot cache cleaned ... ok
+              0   0%    0.00kB/s    0:00:00 (xfr#0, to-chk=0/3)
+            930   0%    1.77kB/s    0:00:00 (xfr#3, to-chk=0/11069)   
+chroot: impossible d'exécuter la commande « update-initramfs »: No such file or directory
+loop deleted : /dev/loop0
+
+I will try to add the pacakge which contain update-initramfs and report back
+
+
+the second problem is thaht virtualbox is no more part of stretch.
+So it is not possible to create a virtualbox image.
+
+Cheers
+
+Frederic

Added a comment
diff --git a/doc/forum/creating_Bind9_configuration/comment_1_0798f44e1f5a91fbc91c0b472ad92bfa._comment b/doc/forum/creating_Bind9_configuration/comment_1_0798f44e1f5a91fbc91c0b472ad92bfa._comment
new file mode 100644
index 0000000..d1387a2
--- /dev/null
+++ b/doc/forum/creating_Bind9_configuration/comment_1_0798f44e1f5a91fbc91c0b472ad92bfa._comment
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="Nicolas.Schodet"
+ avatar="http://cdn.libravatar.org/avatar/0d7ec808ec329d04ee9a93c0da3c0089"
+ subject="comment 1"
+ date="2017-08-03T20:52:22Z"
+ content="""
+For the moment I use:
+
+```
+namedOptions :: Property DebianLike
+namedOptions =
+        File.hasContent \"/etc/bind/named.conf.options\" namedOptionsStanza
+                `onChange` Service.reloaded \"bind9\"
+  where 
+        namedOptionsStanza =
+                [ \"// automatically generated by propellor\"
+                , \"options {\"
+                , \"\tdirectory \\"/var/cache/bind\\";\"
+                , \"\tdnssec-validation auto;\"
+                , \"\tlisten-on-v6 { any; };\"
+                , \"\tlisten-on { any; };\"
+                , \"\tallow-query { any; };\"
+                , \"\tallow-recursion { localhost; };\"
+                , \"\tallow-transfer { none; };\"
+                , \"\tallow-notify { none; };\"
+                , \"};\"
+                ]
+```
+"""]]

Question about bind9 configuration
diff --git a/doc/forum/creating_Bind9_configuration.mdwn b/doc/forum/creating_Bind9_configuration.mdwn
new file mode 100644
index 0000000..5e28139
--- /dev/null
+++ b/doc/forum/creating_Bind9_configuration.mdwn
@@ -0,0 +1,9 @@
+I try to use propellor to deploy a secondary DNS server.
+
+In your configuration, I see nothing to change the `listen-on { 127.0.0.1; };` option, did I miss something?
+
+Also, in `Dns.secondaryFor`, I do not know how to set `confLines` to something else, should I use this function and peel the result until I can change this or shoud I add a `Dns.secondaryFor'` version with an extra argument?
+
+By the way, is it really advisable to use a "minimal config" instead of a full clone?
+
+Thanks!

add news item for propellor 4.7.6
diff --git a/doc/news/version_4.7.1.mdwn b/doc/news/version_4.7.1.mdwn
deleted file mode 100644
index 7b8b2ab..0000000
--- a/doc/news/version_4.7.1.mdwn
+++ /dev/null
@@ -1,4 +0,0 @@
-propellor 4.7.1 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Added Mount.isMounted.
-   * Grub.bootsMounted: Bugfix."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.7.6.mdwn b/doc/news/version_4.7.6.mdwn
new file mode 100644
index 0000000..4c8abd9
--- /dev/null
+++ b/doc/news/version_4.7.6.mdwn
@@ -0,0 +1,6 @@
+propellor 4.7.6 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Sbuild: Add Sbuild.userConfig property.
+     Thanks, Sean Whitton
+   * Locale: Make sure that the locales package is installed when enabling
+     locales."""]]
\ No newline at end of file

add news item for propellor 4.7.5
diff --git a/doc/news/version_4.7.0.mdwn b/doc/news/version_4.7.0.mdwn
deleted file mode 100644
index 137d576..0000000
--- a/doc/news/version_4.7.0.mdwn
+++ /dev/null
@@ -1,24 +0,0 @@
-propellor 4.7.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Add Apt.proxy property to set a host's apt proxy.
-     Thanks, Sean Whitton.
-   * Add Apt.useLocalCacher property to set up apt-cacher-ng.
-     Thanks, Sean Whitton.
-   * Rework Sbuild properties to use apt proxies/cachers instead of
-     bind-mounting the host's apt cache. This makes it possible to run more
-     than one build at a time, and lets sbuild run even if apt's cache is
-     locked by the host's apt.
-     Thanks, Sean Whitton.
-   * Sbuild: When Apt.proxy is set, it is assumed that the proxy does some
-     sort of caching, and sbuild chroots are set up to use the same proxy.
-   * Sbuild: When Apt.proxy is not set, install apt-cacher-ng, and point
-     sbuild chroots at the local apt cacher.
-   * Sbuild: Droped Sbuild.piupartsConfFor, Sbuild.piupartsConf,
-     Sbuild.shareAptCache
-     (API change)
-     No longer needed now that we are using apt proxies/cachers.
-   * Sbuild: Updated sample config in haddock for Propellor.Property.Sbuild.
-     If you use this module, please compare both your config.hs and
-     your ~/.sbuildrc with the haddock documentation.
-   * Grub.bootsMounted: Avoid failing when proc sys etc are already mounted
-     within the chroot."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.7.5.mdwn b/doc/news/version_4.7.5.mdwn
new file mode 100644
index 0000000..f2fbaf8
--- /dev/null
+++ b/doc/news/version_4.7.5.mdwn
@@ -0,0 +1,3 @@
+propellor 4.7.5 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Avoid crashing when getTerminalName fails due to eg, being in a chroot."""]]
\ No newline at end of file

add news item for propellor 4.7.4
diff --git a/doc/news/version_4.6.2.mdwn b/doc/news/version_4.6.2.mdwn
deleted file mode 100644
index 5093013..0000000
--- a/doc/news/version_4.6.2.mdwn
+++ /dev/null
@@ -1,8 +0,0 @@
-propellor 4.6.2 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Systemd.nspawned: Recent systemd versions such as 234 ignore
-     non-symlinks in /etc/systemd/system/multi-user.target.wants,
-     which was used to configure systemd-nspawn parameters. Instead,
-     use a service.d/local.conf file to configure that.
-   * Grub: Added bootsMounted property, a generalization of
-     DiskImage.grubBooted"""]]
\ No newline at end of file
diff --git a/doc/news/version_4.7.4.mdwn b/doc/news/version_4.7.4.mdwn
new file mode 100644
index 0000000..982f34b
--- /dev/null
+++ b/doc/news/version_4.7.4.mdwn
@@ -0,0 +1,7 @@
+propellor 4.7.4 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Set GPG\_TTY when run at a terminal, so that gpg can do password
+     prompting despite being connected by pipes to propellor (or git).
+   * Rsync: Make rsync display less verbose.
+   * Improve PROPELLOR\_TRACE output so serialized trace values always
+     come on their own line, not mixed with title setting."""]]
\ No newline at end of file

comment
diff --git a/doc/forum/propellor_failed_to_sign_the_commit/comment_3_f0e087ed1a80f42d11d34fb215183205._comment b/doc/forum/propellor_failed_to_sign_the_commit/comment_3_f0e087ed1a80f42d11d34fb215183205._comment
new file mode 100644
index 0000000..ae75087
--- /dev/null
+++ b/doc/forum/propellor_failed_to_sign_the_commit/comment_3_f0e087ed1a80f42d11d34fb215183205._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2017-07-30T15:33:02Z"
+ content="""
+I've made propellor set `GPG_TTY` and verified that this lets gpg prompt
+for the password at the linux console.
+
+Since I was not able to reproduce git commit signing not working, I don't
+know for sure that this fixed that, but imagine it probably would.
+"""]]

comment
diff --git a/doc/forum/propellor_failed_to_sign_the_commit/comment_2_21ff16e0871e7069749cd6c47a6fc8fe._comment b/doc/forum/propellor_failed_to_sign_the_commit/comment_2_21ff16e0871e7069749cd6c47a6fc8fe._comment
new file mode 100644
index 0000000..4112070
--- /dev/null
+++ b/doc/forum/propellor_failed_to_sign_the_commit/comment_2_21ff16e0871e7069749cd6c47a6fc8fe._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2017-07-30T15:15:45Z"
+ content="""
+It seems that setting `GPG_TTY` does not force gpg to prompt at a tty
+when in a GUI. At least in X with gpg 2.1, I still get a GUI prompt from
+gpg. Good.
+"""]]

comment
diff --git a/doc/forum/propellor_failed_to_sign_the_commit/comment_1_c1dab7554841bd88d2109e9d46b31102._comment b/doc/forum/propellor_failed_to_sign_the_commit/comment_1_c1dab7554841bd88d2109e9d46b31102._comment
new file mode 100644
index 0000000..2d2315c
--- /dev/null
+++ b/doc/forum/propellor_failed_to_sign_the_commit/comment_1_c1dab7554841bd88d2109e9d46b31102._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2017-07-30T14:51:13Z"
+ content="""
+I guess the problem involves running propellor at a unix tty, not in a
+GUI's virtual terminal?
+
+My limited understanding of `GPG_TTY`, refreshed by re-reading this ooold
+thread <https://bugs.debian.org/316388> is that gpg is normally able to
+detect if it's in a GUI or at a tty, and will prompt in the tty if
+necessary. Where that may fall down is when gpg is run with its stdio
+connected to pipes, since then probably isatty fails. Although in at least
+some cases, gpg apparently then 
+[falls back to /dev/tty](https://dev.gnupg.org/T1434).
+
+Propellor runs gpg with stdin and stdout piped to it when eg, decrypting
+the privdata file. I tried `propellor --list-fields` at the linux console
+and it fails there.
+
+But, when I tried `propellor --spin host` at the linux console, that worked
+ok, including making the gpg signed git commit. Of course git is running
+gpg in this case, and perhaps my version of git has its own way to avoid
+this problem.
+
+This does seems like something propellor could work around fairly
+inexpensively.
+
+(See also [[propellor_and_gpg2]].)
+"""]]

add news item for propellor 4.7.3
diff --git a/doc/news/version_4.6.1.mdwn b/doc/news/version_4.6.1.mdwn
deleted file mode 100644
index eb7bd94..0000000
--- a/doc/news/version_4.6.1.mdwn
+++ /dev/null
@@ -1,7 +0,0 @@
-propellor 4.6.1 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Added Network.dhcp' and Network.static', which allow specifying
-     additional options for interfaces files.
-   * Fix build failure on ghc-8.2.1
-     Thanks, Sergei Trofimovich.
-   * DiskImage: Fix strictness bug in .parttable read/write sequence."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.7.3.mdwn b/doc/news/version_4.7.3.mdwn
new file mode 100644
index 0000000..87c58e8
--- /dev/null
+++ b/doc/news/version_4.7.3.mdwn
@@ -0,0 +1,3 @@
+propellor 4.7.3 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Expand the Trace data type."""]]
\ No newline at end of file

add news item for propellor 4.7.2
diff --git a/doc/news/version_4.6.0.mdwn b/doc/news/version_4.6.0.mdwn
deleted file mode 100644
index 673051e..0000000
--- a/doc/news/version_4.6.0.mdwn
+++ /dev/null
@@ -1,8 +0,0 @@
-propellor 4.6.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Add Typeable instance to Bootstrapper, fixing build with old versions
-     of ghc.
-   * Network.static changed to take address and gateway parameters.
-     If you used the old Network.static property, it has been renamed to
-     Network.preserveStatic.
-     (Minor API change)"""]]
\ No newline at end of file
diff --git a/doc/news/version_4.7.2.mdwn b/doc/news/version_4.7.2.mdwn
new file mode 100644
index 0000000..a81220b
--- /dev/null
+++ b/doc/news/version_4.7.2.mdwn
@@ -0,0 +1,7 @@
+propellor 4.7.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Added PROPELLOR\_TRACE environment variable, which can be set to 1 to
+     make propellor output serialized Propellor.Message.Trace values,
+     for consumption by another program.
+   * Rsync: Make rsync display its progress, in a minimal format to avoid
+     scrolling each file down the screen."""]]
\ No newline at end of file

todo
diff --git a/doc/todo/PROPELLOR_TRACE_propigation.mdwn b/doc/todo/PROPELLOR_TRACE_propigation.mdwn
new file mode 100644
index 0000000..8f7d689
--- /dev/null
+++ b/doc/todo/PROPELLOR_TRACE_propigation.mdwn
@@ -0,0 +1,6 @@
+`PROPELLOR_TRACE` is not propigated when spinning a remote host, 
+conducting a host, and probably not when provisioning a docker or machined
+container.
+
+It is propgiated when provisioning a chroot. That's all I needed, so I
+didh't bother implementing propigation. --[[Joey]]

diff --git a/doc/forum/propellor_failed_to_sign_the_commit.mdwn b/doc/forum/propellor_failed_to_sign_the_commit.mdwn
new file mode 100644
index 0000000..83a4fd4
--- /dev/null
+++ b/doc/forum/propellor_failed_to_sign_the_commit.mdwn
@@ -0,0 +1,30 @@
+Hello since sometime on my computer gpgv1 -> gpgv2 transition on Debian 
+
+I get this error message. (I need to say that I am using a NitroKey Pro for my gpg keys)
+ 
+    Propellor build ... done
+    error: gpg n'a pas pu signer les données
+    fatal: échec de l'écriture de l'objet commit
+    Git commit ... failed
+
+reading this bug report
+
+    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=568375
+
+Ifound that I need to define
+
+
+    https://www.gnupg.org/documentation/manuals/gnupg/Common-Problems.html
+
+    The gpg-agent man page nowadays includes the following hint:
+
+      It is important to set the GPG_TTY environment variable in your login
+      shell, for example in the ‘~/.bashrc’ init script:
+
+      export GPG_TTY=$(tty)
+
+don't you think that propellor should define GPG_TTY in order to avoid this problem ?
+
+thanks
+
+Frederic

add news item for propellor 4.7.1
diff --git a/doc/news/version_4.5.2.mdwn b/doc/news/version_4.5.2.mdwn
deleted file mode 100644
index f726804..0000000
--- a/doc/news/version_4.5.2.mdwn
+++ /dev/null
@@ -1,5 +0,0 @@
-propellor 4.5.2 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Added Rsync.installed property.
-   * Added DiskImage.vmdkBuiltFor property which is useful for booting
-     a disk image in VirtualBox."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.7.1.mdwn b/doc/news/version_4.7.1.mdwn
new file mode 100644
index 0000000..7b8b2ab
--- /dev/null
+++ b/doc/news/version_4.7.1.mdwn
@@ -0,0 +1,4 @@
+propellor 4.7.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Added Mount.isMounted.
+   * Grub.bootsMounted: Bugfix."""]]
\ No newline at end of file

add news item for propellor 4.7.0
diff --git a/doc/news/version_4.5.1.mdwn b/doc/news/version_4.5.1.mdwn
deleted file mode 100644
index 212b4f2..0000000
--- a/doc/news/version_4.5.1.mdwn
+++ /dev/null
@@ -1,7 +0,0 @@
-propellor 4.5.1 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Reboot.toKernelNewerThan: If running kernel is new enough, avoid
-     looking at what kernels are installed.
-     Thanks, Sean Whitton.
-   * DiskImage: Avoid re-partitioning disk image unncessarily, for a large
-     speedup."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.7.0.mdwn b/doc/news/version_4.7.0.mdwn
new file mode 100644
index 0000000..137d576
--- /dev/null
+++ b/doc/news/version_4.7.0.mdwn
@@ -0,0 +1,24 @@
+propellor 4.7.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Add Apt.proxy property to set a host's apt proxy.
+     Thanks, Sean Whitton.
+   * Add Apt.useLocalCacher property to set up apt-cacher-ng.
+     Thanks, Sean Whitton.
+   * Rework Sbuild properties to use apt proxies/cachers instead of
+     bind-mounting the host's apt cache. This makes it possible to run more
+     than one build at a time, and lets sbuild run even if apt's cache is
+     locked by the host's apt.
+     Thanks, Sean Whitton.
+   * Sbuild: When Apt.proxy is set, it is assumed that the proxy does some
+     sort of caching, and sbuild chroots are set up to use the same proxy.
+   * Sbuild: When Apt.proxy is not set, install apt-cacher-ng, and point
+     sbuild chroots at the local apt cacher.
+   * Sbuild: Droped Sbuild.piupartsConfFor, Sbuild.piupartsConf,
+     Sbuild.shareAptCache
+     (API change)
+     No longer needed now that we are using apt proxies/cachers.
+   * Sbuild: Updated sample config in haddock for Propellor.Property.Sbuild.
+     If you use this module, please compare both your config.hs and
+     your ~/.sbuildrc with the haddock documentation.
+   * Grub.bootsMounted: Avoid failing when proc sys etc are already mounted
+     within the chroot."""]]
\ No newline at end of file

merge
diff --git a/debian/changelog b/debian/changelog
index c014eeb..c66038d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,28 @@
+propellor (4.7.0) UNRELEASED; urgency=medium
+
+  * Add Apt.proxy property to set a host's apt proxy.
+    Thanks, Sean Whitton.
+  * Add Apt.useLocalCacher property to set up apt-cacher-ng.
+    Thanks, Sean Whitton.
+  * Rework Sbuild properties to use apt proxies/cachers instead of
+    bind-mounting the host's apt cache. This makes it possible to run more
+    than one build at a time, and lets sbuild run even if apt's cache is
+    locked by the host's apt.
+    Thanks, Sean Whitton.
+  * Sbuild: When Apt.proxy is set, it is assumed that the proxy does some
+    sort of caching, and sbuild chroots are set up to use the same proxy.
+  * Sbuild: When Apt.proxy is not set, install apt-cacher-ng, and point
+    sbuild chroots at the local apt cacher.
+  * Sbuild: Droped Sbuild.piupartsConfFor, Sbuild.piupartsConf,
+    Sbuild.shareAptCache
+    (API change)
+    No longer needed now that we are using apt proxies/cachers.
+  * Sbuild: Updated sample config in haddock for Propellor.Property.Sbuild.
+    If you use this module, please compare both your config.hs and
+    your ~/.sbuildrc with the haddock documentation.
+
+ -- Joey Hess <id@joeyh.name>  Fri, 28 Jul 2017 20:13:58 -0400
+
 propellor (4.6.2) unstable; urgency=medium
 
   * Systemd.nspawned: Recent systemd versions such as 234 ignore
diff --git a/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn b/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
index 62f619d..d37d680 100644
--- a/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
+++ b/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
@@ -18,3 +18,5 @@ Sample text for changelog/description of changes:
         Please compare both your config.hs and your ~/.sbuildrc against the haddock.
 
 --spwhitton
+
+> merge [[done]] --[[Joey]]

add news item for propellor 4.6.2
diff --git a/doc/news/version_4.5.0.mdwn b/doc/news/version_4.5.0.mdwn
deleted file mode 100644
index d78a261..0000000
--- a/doc/news/version_4.5.0.mdwn
+++ /dev/null
@@ -1,9 +0,0 @@
-propellor 4.5.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Generalized the PartSpec DSL, so it can be used for both
-     disk image partitioning, and disk device partitioning, with
-     different partition sizing methods as appropriate for the different
-     uses. (minor API change)
-   * Propellor.Property.Parted: Added calcPartTable function which uses
-     PartSpec DiskPart, and a useDiskSpace combinator.
-   * Generate a better description for versioned properties."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.6.2.mdwn b/doc/news/version_4.6.2.mdwn
new file mode 100644
index 0000000..5093013
--- /dev/null
+++ b/doc/news/version_4.6.2.mdwn
@@ -0,0 +1,8 @@
+propellor 4.6.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Systemd.nspawned: Recent systemd versions such as 234 ignore
+     non-symlinks in /etc/systemd/system/multi-user.target.wants,
+     which was used to configure systemd-nspawn parameters. Instead,
+     use a service.d/local.conf file to configure that.
+   * Grub: Added bootsMounted property, a generalization of
+     DiskImage.grubBooted"""]]
\ No newline at end of file

Added a comment
diff --git a/doc/forum/host_to_deal_with_dpkg::options/comment_3_62d671fb3c787aafcd4d058975208f75._comment b/doc/forum/host_to_deal_with_dpkg::options/comment_3_62d671fb3c787aafcd4d058975208f75._comment
new file mode 100644
index 0000000..4031bd1
--- /dev/null
+++ b/doc/forum/host_to_deal_with_dpkg::options/comment_3_62d671fb3c787aafcd4d058975208f75._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 3"
+ date="2017-07-28T15:53:03Z"
+ content="""
+Great it works
+
+thanks a lot
+"""]]

comment
diff --git a/doc/forum/host_to_deal_with_dpkg::options.mdwn b/doc/forum/host_to_deal_with_dpkg::options.mdwn
index a6d7498..5faaefe 100644
--- a/doc/forum/host_to_deal_with_dpkg::options.mdwn
+++ b/doc/forum/host_to_deal_with_dpkg::options.mdwn
@@ -1,3 +1,5 @@
+[[!meta title "how to deal with dpkg::options"]]
+
 Hello
 
 I try to create a distUpgrade property in order to migrate one of my computer from jessie -> stretch
diff --git a/doc/forum/host_to_deal_with_dpkg::options/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment b/doc/forum/host_to_deal_with_dpkg::options/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment
new file mode 100644
index 0000000..39e0ebc
--- /dev/null
+++ b/doc/forum/host_to_deal_with_dpkg::options/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2017-07-28T15:45:43Z"
+ content="""
+I doubt that apt's option parser deals with quotes; those are normally
+handled by the shell. runApt does not pass the command through the shell,
+so probably simply removing the quotes from inside the parameter will work.
+"""]]

Added a comment
diff --git a/doc/forum/host_to_deal_with_dpkg::options/comment_1_641dcb7be62151bdc97fd5e574f334d0._comment b/doc/forum/host_to_deal_with_dpkg::options/comment_1_641dcb7be62151bdc97fd5e574f334d0._comment
new file mode 100644
index 0000000..65756b1
--- /dev/null
+++ b/doc/forum/host_to_deal_with_dpkg::options/comment_1_641dcb7be62151bdc97fd5e574f334d0._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="picca"
+ avatar="http://cdn.libravatar.org/avatar/7e61c80d28018b10d31f6db7dddb864c"
+ subject="comment 1"
+ date="2017-07-28T15:09:12Z"
+ content="""
+please change the title, I made a mistake
+
+how to deal with ...
+
+sorry
+"""]]

diff --git a/doc/forum/host_to_deal_with_dpkg::options.mdwn b/doc/forum/host_to_deal_with_dpkg::options.mdwn
new file mode 100644
index 0000000..a6d7498
--- /dev/null
+++ b/doc/forum/host_to_deal_with_dpkg::options.mdwn
@@ -0,0 +1,39 @@
+Hello
+
+I try to create a distUpgrade property in order to migrate one of my computer from jessie -> stretch
+
+I started wit this
+
+    distUpgrade :: String -> Property DebianLike
+    distUpgrade p = combineProperties ("apt " ++ p) $ props
+	& Apt.pendingConfigured
+	& Apt.runApt ["-y", "--force-yes", "-o", "Dpkg::Options::=\"--force-confnew\"", p]
+		`assume` MadeChange
+
+But when I try to use this
+
+    ...
+    & distUpgrade dist-upgrade
+
+ I get this error message
+
+    Préconfiguration des paquets...
+    setting xserver-xorg-legacy/xwrapper/allowed_users from configuration file
+    dpkg: erreur: requiert une option d'action
+
+    Utilisez « dpkg --help » pour obtenir de l'aide à propos de l'installation et la désinstallation des paquets [*] ;
+    Utilisez « apt » ou « aptitude » pour gérer les paquets de m1578 mis à jour, 376 nouvellement installés, 72 à enlever et 0 non mis à jour.
+    Il est nécessaire de prendre 0 o/1 458 Mo dans les archives.
+
+I checked that if I run this command on the command line it works
+
+    apt-get -y --force-yes -o Dpkg::Options::="--force-confnew" dist-upgrade
+
+even If I write this it works
+
+    apt-get -y --force-yes -o Dpkg::Options::=\"--force-confnew\" dist-upgrade
+
+So it seems to me that there is a problem with the runApt method or I missed something
+
+thanks
+

add news item for propellor 4.6.1
diff --git a/doc/news/version_3.4.1.mdwn b/doc/news/version_3.4.1.mdwn
deleted file mode 100644
index 51d9c2a..0000000
--- a/doc/news/version_3.4.1.mdwn
+++ /dev/null
@@ -1,3 +0,0 @@
-propellor 3.4.1 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Fixed https url to propellor git repository."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.6.1.mdwn b/doc/news/version_4.6.1.mdwn
new file mode 100644
index 0000000..eb7bd94
--- /dev/null
+++ b/doc/news/version_4.6.1.mdwn
@@ -0,0 +1,7 @@
+propellor 4.6.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Added Network.dhcp' and Network.static', which allow specifying
+     additional options for interfaces files.
+   * Fix build failure on ghc-8.2.1
+     Thanks, Sergei Trofimovich.
+   * DiskImage: Fix strictness bug in .parttable read/write sequence."""]]
\ No newline at end of file

add news item for propellor 4.6.0
diff --git a/doc/news/version_4.4.0.mdwn b/doc/news/version_4.4.0.mdwn
deleted file mode 100644
index db86c53..0000000
--- a/doc/news/version_4.4.0.mdwn
+++ /dev/null
@@ -1,8 +0,0 @@
-propellor 4.4.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Propellor.Property.Timezone: New module, contributed by Sean Whitton.
-   * Propellor.Property.Sudo.enabledFor: Made revertable.
-     (minor API change)
-   * Propellor.Property.LightDM.autoLogin: Made revertable.
-     (minor API change)
-   * Propellor.Property.Conffile: Added lacksIniSetting."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.6.0.mdwn b/doc/news/version_4.6.0.mdwn
new file mode 100644
index 0000000..673051e
--- /dev/null
+++ b/doc/news/version_4.6.0.mdwn
@@ -0,0 +1,8 @@
+propellor 4.6.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Add Typeable instance to Bootstrapper, fixing build with old versions
+     of ghc.
+   * Network.static changed to take address and gateway parameters.
+     If you used the old Network.static property, it has been renamed to
+     Network.preserveStatic.
+     (Minor API change)"""]]
\ No newline at end of file

Add Typeable instance to Bootstrapper, fixing build with old versions of ghc.
diff --git a/debian/changelog b/debian/changelog
index 948a44b..9e1c15c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+propellor (4.5.3) UNRELEASED; urgency=medium
+
+  * Add Typeable instance to Bootstrapper, fixing build with old versions
+    of ghc.
+
+ -- Joey Hess <id@joeyh.name>  Tue, 25 Jul 2017 21:01:23 -0400
+
 propellor (4.5.2) unstable; urgency=medium
 
   * Added Rsync.installed property.
diff --git a/doc/forum/Error_building_on_remote_host/comment_4_c2e07d9bfba84fbdcf408a09965d6cb6._comment b/doc/forum/Error_building_on_remote_host/comment_4_c2e07d9bfba84fbdcf408a09965d6cb6._comment
new file mode 100644
index 0000000..7d8f26f
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_4_c2e07d9bfba84fbdcf408a09965d6cb6._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2017-07-26T00:52:20Z"
+ content="""
+Interesting that it works on newer ghc without an explict
+`Typeable Bootstrapper` instance. 
+
+I've added the missing instance.
+"""]]
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs
index 21f051c..21d29bc 100644
--- a/src/Propellor/Bootstrap.hs
+++ b/src/Propellor/Bootstrap.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+
 module Propellor.Bootstrap (
 	Bootstrapper(..),
 	Builder(..),
@@ -34,7 +36,7 @@ data Bootstrapper = Robustly Builder | OSOnly
 	deriving (Show)
 
 data Builder = Cabal | Stack
-	deriving (Show)
+	deriving (Show, Typeable)
 
 defaultBootstrapper :: Bootstrapper
 defaultBootstrapper = Robustly Cabal

Added a comment
diff --git a/doc/forum/Error_building_on_remote_host/comment_4_8a3eac770c1bee9295272c46f022a03c._comment b/doc/forum/Error_building_on_remote_host/comment_4_8a3eac770c1bee9295272c46f022a03c._comment
new file mode 100644
index 0000000..5129fb5
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_4_8a3eac770c1bee9295272c46f022a03c._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="mithrandi"
+ avatar="http://cdn.libravatar.org/avatar/869963bdf99b541c9f0bbfb04b0320f1"
+ subject="comment 4"
+ date="2017-07-26T01:03:02Z"
+ content="""
+Oh, so it is! Must have misread something earlier.
+"""]]

comment
diff --git a/doc/forum/Error_building_on_remote_host/comment_3_3090e63b93e00d6eca95ca8fe523f5b8._comment b/doc/forum/Error_building_on_remote_host/comment_3_3090e63b93e00d6eca95ca8fe523f5b8._comment
new file mode 100644
index 0000000..1790ac7
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_3_3090e63b93e00d6eca95ca8fe523f5b8._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2017-07-26T00:49:51Z"
+ content="""
+The haskell-stack package is available in Debian stretch
+<https://packages.debian.org/search?keywords=haskell-stack>
+"""]]

add news item for propellor 4.5.2
diff --git a/doc/news/version_3.4.0.mdwn b/doc/news/version_3.4.0.mdwn
deleted file mode 100644
index d38716e..0000000
--- a/doc/news/version_3.4.0.mdwn
+++ /dev/null
@@ -1,14 +0,0 @@
-propellor 3.4.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Added ConfigurableValue type class, for values that can be used in a
-     config file, or to otherwise configure a program.
-   * The val function converts such values to String.
-   * Removed fromPort and fromIPAddr (use val instead). (API change)
-   * Removed several Show instances that were only used for generating
-     configuration, replacing with ConfigurableValue instances. (API change)
-   * The github mirror of propellor's git repository has been removed,
-     since github's terms of service has started imposing unwanted licensing
-     requirements.
-   * propellor --init: The option to clone propellor's git repository
-     used to use the github mirror, and has been changed to use a different
-     mirror."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.5.2.mdwn b/doc/news/version_4.5.2.mdwn
new file mode 100644
index 0000000..f726804
--- /dev/null
+++ b/doc/news/version_4.5.2.mdwn
@@ -0,0 +1,5 @@
+propellor 4.5.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Added Rsync.installed property.
+   * Added DiskImage.vmdkBuiltFor property which is useful for booting
+     a disk image in VirtualBox."""]]
\ No newline at end of file

Added a comment
diff --git a/doc/forum/Error_building_on_remote_host/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment b/doc/forum/Error_building_on_remote_host/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment
new file mode 100644
index 0000000..3475055
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="mithrandi"
+ avatar="http://cdn.libravatar.org/avatar/869963bdf99b541c9f0bbfb04b0320f1"
+ subject="comment 2"
+ date="2017-07-25T22:50:42Z"
+ content="""
+Okay, got it to work:
+
+1. Installed haskell-stack by hand from unstable (the package works fine even on jessie).
+2. Removed the \"dist\" directory in the remote /usr/local/propellor.
+
+After that the build was successful; I think that points to the original failure being due to the ancient GHC in jessie, but I'm not 100% sure.
+"""]]

Added a comment
diff --git a/doc/forum/Error_building_on_remote_host/comment_1_f0f6f241e971d048486ae159585a4ab2._comment b/doc/forum/Error_building_on_remote_host/comment_1_f0f6f241e971d048486ae159585a4ab2._comment
new file mode 100644
index 0000000..eca6c8c
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host/comment_1_f0f6f241e971d048486ae159585a4ab2._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="mithrandi"
+ avatar="http://cdn.libravatar.org/avatar/869963bdf99b541c9f0bbfb04b0320f1"
+ subject="comment 1"
+ date="2017-07-25T22:22:49Z"
+ content="""
+I tried adding:
+
+      & bootstrapWith (Robustly Stack)
+
+But that fails trying to install stack:
+
+    Fetched 413 kB in 7s (54.3 kB/s)                           
+    Reading package lists...                                   
+    E: Unable to locate package haskell-stack                  
+    sh: 1: stack: not found                                    
+    sh: 1: stack: not found                                    
+
+That's not really too surprising, of course, since this package isn't in jessie (or stretch, for that matter).
+
+"""]]

diff --git a/doc/forum/Error_building_on_remote_host.mdwn b/doc/forum/Error_building_on_remote_host.mdwn
new file mode 100644
index 0000000..240db46
--- /dev/null
+++ b/doc/forum/Error_building_on_remote_host.mdwn
@@ -0,0 +1,31 @@
+I recently updated to the latest Propellor and now I'm getting an error building on a remote host:
+
+    [86 of 94] Compiling Propellor.Bootstrap ( src/Propellor/Bootstrap.hs, dist/build/propellor-config/propellor-config-tmp/Propellor/Bootstrap.o )
+    
+        src/Propellor/Bootstrap.hs:237:22:
+        No instance for (Typeable Bootstrapper)
+          arising from a use of `fromInfo'
+        Possible fix:
+          add an instance declaration for (Typeable Bootstrapper)
+        In the expression: fromInfo (maybe mempty hostInfo mh)
+        In a stmt of a 'do' block:
+          case fromInfo (maybe mempty hostInfo mh) of {
+            NoInfoVal
+              -> do { bs <- getGitConfigValue "propellor.buildsystem";
+                      case bs of {
+                        Just "stack" -> ...
+                        _ -> ... } }
+            InfoVal bs
+              -> case getBuilder bs of {
+                   Cabal -> cabalBuild msys
+                   Stack -> stackBuild msys } }
+        In the second argument of `($)', namely
+          `do { case fromInfo (maybe mempty hostInfo mh) of {
+                  NoInfoVal -> do { ... }
+                  InfoVal bs
+                    -> case getBuilder bs of {
+                         Cabal -> ...
+                         Stack -> ... } } }'
+    propellor: cabal build failed
+
+I guess I'm missing something, but not sure what?

add news item for propellor 4.5.1
diff --git a/doc/news/version_4.3.4.mdwn b/doc/news/version_4.3.4.mdwn
deleted file mode 100644
index 5d30840..0000000
--- a/doc/news/version_4.3.4.mdwn
+++ /dev/null
@@ -1,7 +0,0 @@
-propellor 4.3.4 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Propellor.Property.Versioned: New module which allows different
-     versions of a property or host to be written down in a propellor config
-     file. Has many applications, including staged upgrades and rollbacks.
-   * LightDM.autoLogin: Use [Seat:*] rather than the old [SeatDefaults].
-     The new name has been supported since lightdm 1.15."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.5.1.mdwn b/doc/news/version_4.5.1.mdwn
new file mode 100644
index 0000000..212b4f2
--- /dev/null
+++ b/doc/news/version_4.5.1.mdwn
@@ -0,0 +1,7 @@
+propellor 4.5.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Reboot.toKernelNewerThan: If running kernel is new enough, avoid
+     looking at what kernels are installed.
+     Thanks, Sean Whitton.
+   * DiskImage: Avoid re-partitioning disk image unncessarily, for a large
+     speedup."""]]
\ No newline at end of file

add news item for propellor 4.5.0
diff --git a/doc/news/version_4.3.3.mdwn b/doc/news/version_4.3.3.mdwn
deleted file mode 100644
index b51ab5d..0000000
--- a/doc/news/version_4.3.3.mdwn
+++ /dev/null
@@ -1,17 +0,0 @@
-propellor 4.3.3 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Hosts can be configured to build propellor using stack, by adding
-     a property:
-         &amp; bootstrapWith (Robustly Stack)
-   * Hosts can be configured to build propellor using cabal, but using
-     only packages installed from the operating system. This
-     will work on eg Debian:
-         &amp; bootstrapWith OSOnly
-   * Iproved fix for bug that sometimes made --spin fail with
-     "fatal: Couldn't find remote ref HEAD". The previous fix didn't work
-     reliably.
-   * User: add systemGroup and use it for systemAccountFor'
-     Thanks, Félix Sipma.
-   * Export a Restic.backup' property.
-     Thanks, Félix Sipma.
-   * Updated stack config to lts-8.22."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.5.0.mdwn b/doc/news/version_4.5.0.mdwn
new file mode 100644
index 0000000..d78a261
--- /dev/null
+++ b/doc/news/version_4.5.0.mdwn
@@ -0,0 +1,9 @@
+propellor 4.5.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Generalized the PartSpec DSL, so it can be used for both
+     disk image partitioning, and disk device partitioning, with
+     different partition sizing methods as appropriate for the different
+     uses. (minor API change)
+   * Propellor.Property.Parted: Added calcPartTable function which uses
+     PartSpec DiskPart, and a useDiskSpace combinator.
+   * Generate a better description for versioned properties."""]]
\ No newline at end of file

todo
diff --git a/doc/todo/Propellor.Property.Versioned_support_asymmetric_RevertableProperty_types.mdwn b/doc/todo/Propellor.Property.Versioned_support_asymmetric_RevertableProperty_types.mdwn
new file mode 100644
index 0000000..c60cd4d
--- /dev/null
+++ b/doc/todo/Propellor.Property.Versioned_support_asymmetric_RevertableProperty_types.mdwn
@@ -0,0 +1,7 @@
+Currently, this module requires `RevertableProperty t t`.
+That can be annoying, it would be good to support at least
+`RevertablePropery (HasInfo + t) t` and ideally all 
+`RevertableProperty t1 t2`
+
+There should be no reason that can't be done; I was just having
+problems getting the type checker happy on the day I wrote it. --[[Joey]]

add news item for propellor 4.4.0
diff --git a/doc/news/version_4.3.2.mdwn b/doc/news/version_4.3.2.mdwn
deleted file mode 100644
index 1a85d2d..0000000
--- a/doc/news/version_4.3.2.mdwn
+++ /dev/null
@@ -1,3 +0,0 @@
-propellor 4.3.2 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Really include Propellor.Property.FreeDesktop."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.4.0.mdwn b/doc/news/version_4.4.0.mdwn
new file mode 100644
index 0000000..db86c53
--- /dev/null
+++ b/doc/news/version_4.4.0.mdwn
@@ -0,0 +1,8 @@
+propellor 4.4.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Propellor.Property.Timezone: New module, contributed by Sean Whitton.
+   * Propellor.Property.Sudo.enabledFor: Made revertable.
+     (minor API change)
+   * Propellor.Property.LightDM.autoLogin: Made revertable.
+     (minor API change)
+   * Propellor.Property.Conffile: Added lacksIniSetting."""]]
\ No newline at end of file

Propellor.Property.Timezone: New module, contributed by Sean Whitton.
diff --git a/debian/changelog b/debian/changelog
index a60c5f1..517151d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+propellor (4.3.5) UNRELEASED; urgency=medium
+
+  * Propellor.Property.Timezone: New module, contributed by Sean Whitton.
+
+ -- Joey Hess <id@joeyh.name>  Sun, 16 Jul 2017 12:07:15 -0400
+
 propellor (4.3.4) unstable; urgency=medium
 
   * Propellor.Property.Versioned: New module which allows different
diff --git a/doc/todo/merge_request:_Timezone.hs.mdwn b/doc/todo/merge_request:_Timezone.hs.mdwn
index 3f67da2..a8ba3ea 100644
--- a/doc/todo/merge_request:_Timezone.hs.mdwn
+++ b/doc/todo/merge_request:_Timezone.hs.mdwn
@@ -5,3 +5,5 @@ Adds `Timezone.configured`.
 I think that this works fine on stretch, but on Jessie there is some oddness.  For example, if you set the timezone of a host to `US/Arizona`, the apt reconfiguration will put `America/Phoenix` in /etc/timezone, resulting in the property reporting a change every time that it is run.  I think this is harmless.
 
 --spwhitton
+
+> [[merged|done]] --[[Joey]]
diff --git a/doc/todo/merge_request:_Timezone.hs/comment_1_9cfb5e48940e58f2064cbb5edf462c06._comment b/doc/todo/merge_request:_Timezone.hs/comment_1_9cfb5e48940e58f2064cbb5edf462c06._comment
new file mode 100644
index 0000000..026b13d
--- /dev/null
+++ b/doc/todo/merge_request:_Timezone.hs/comment_1_9cfb5e48940e58f2064cbb5edf462c06._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2017-07-16T15:57:20Z"
+ content="""
+I generally consider properties that do work every time to be a minor bug.
+
+I wonder if it would be better to preseed tzdata rather than writing the
+config file. I observe the same substitution from eg, US/Eastern to
+America/New_York in the file when reconfiguring noninteractively,
+but reconfiguring interactively I can select US/Eastern and that gets
+into the file.
+
+Anyway, merged as this is certianly a good starting point.
+"""]]
diff --git a/propellor.cabal b/propellor.cabal
index 733dda3..43a3ab5 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -150,6 +150,7 @@ Library
     Propellor.Property.Sudo
     Propellor.Property.Systemd
     Propellor.Property.Systemd.Core
+    Propellor.Property.Timezone
     Propellor.Property.Tor
     Propellor.Property.Unbound
     Propellor.Property.User

add merge request
diff --git a/doc/todo/merge_request:_Timezone.hs.mdwn b/doc/todo/merge_request:_Timezone.hs.mdwn
new file mode 100644
index 0000000..3f67da2
--- /dev/null
+++ b/doc/todo/merge_request:_Timezone.hs.mdwn
@@ -0,0 +1,7 @@
+Please consider merging branch `timezone` of repo `https://git.spwhitton.name/propellor`.
+
+Adds `Timezone.configured`.
+
+I think that this works fine on stretch, but on Jessie there is some oddness.  For example, if you set the timezone of a host to `US/Arizona`, the apt reconfiguration will put `America/Phoenix` in /etc/timezone, resulting in the property reporting a change every time that it is run.  I think this is harmless.
+
+--spwhitton

remove old announcment
diff --git a/doc/news/Linux.Conf.Au.presentation.mdwn b/doc/news/Linux.Conf.Au.presentation.mdwn
deleted file mode 100644
index 5418097..0000000
--- a/doc/news/Linux.Conf.Au.presentation.mdwn
+++ /dev/null
@@ -1,5 +0,0 @@
-<video controls src="http://mirror.linux.org.au/pub/linux.conf.au/2017/Type_driven_configuration_management_with_Propellor.webm"></video>
-
-[video](http://mirror.linux.org.au/pub/linux.conf.au/2017/Type_driven_configuration_management_with_Propellor.webm)
-
-Also see this writeup in [Linux Weekly News](https://lwn.net/Articles/713653/)

add news item for propellor 4.3.4
diff --git a/doc/news/version_4.3.1.mdwn b/doc/news/version_4.3.1.mdwn
deleted file mode 100644
index 5c07307..0000000
--- a/doc/news/version_4.3.1.mdwn
+++ /dev/null
@@ -1,4 +0,0 @@
-propellor 4.3.1 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Added Propellor.Property.FreeDesktop module.
-   * Added reservedSpacePercentage to the PartSpec EDSL."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.3.4.mdwn b/doc/news/version_4.3.4.mdwn
new file mode 100644
index 0000000..5d30840
--- /dev/null
+++ b/doc/news/version_4.3.4.mdwn
@@ -0,0 +1,7 @@
+propellor 4.3.4 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Propellor.Property.Versioned: New module which allows different
+     versions of a property or host to be written down in a propellor config
+     file. Has many applications, including staged upgrades and rollbacks.
+   * LightDM.autoLogin: Use [Seat:*] rather than the old [SeatDefaults].
+     The new name has been supported since lightdm 1.15."""]]
\ No newline at end of file

convert todo item into a merge request
diff --git a/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn b/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
index 450416f..62f619d 100644
--- a/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
+++ b/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
@@ -1,11 +1,20 @@
-The properties in `Sbuild.hs` should use apt-cacher-ng instead of a bind mount of `/var/cache/apt/archives`.  This has at least three advantages:
+Please consider merging branch `apt-cacher-ng` of repo `https://git.spwhitton.name/propellor`.
 
-1. more than one instance of sbuild can run at once
+Sample text for changelog/description of changes:
 
-2. sbuild can run even if apt is doing something else with its cache
-
-3. the `piupartsConf` properties are no longer needed.
+    * Add Apt.proxy property to set a host's apt proxy.
+    * Add Apt.useLocalCacher property to set up apt-cacher-ng.
+    * Rework Sbuild properties to use apt proxies/cachers instead of bind-mounting
+      the host's apt cache.  This makes it possible to run more than one build at
+      a time, and lets sbuild run even if apt's cache is locked by the host's apt.
+      - If Apt.proxy is set, it is assumed that the proxy does some sort of
+        caching, and sbuild chroots are set up to use the same proxy.
+      - If Apt.proxy is not set, we install apt-cacher-ng, and point sbuild
+        chroots at the local apt cacher.
+      - Drop Sbuild.piupartsConfFor, Sbuild.piupartsConf, Sbuild.shareAptCache
+        (API change)
+        No longer needed now that we are using apt proxies/cachers.
+      - Update sample config in haddock for Propellor.Property.Sbuild.
+        Please compare both your config.hs and your ~/.sbuildrc against the haddock.
 
 --spwhitton
-
-[[!tag user/spwhitton]]

add Propellor.Property.Versioned
New module which allows different versions of a property or host to be
written down in a propellor config file. Has many applications,
including staged upgrades and rollbacks.
Note that it currently only supports RevertableProperty that has the same
metatypes for its setup and cleanup sides. And, each RevertableProperty in
a version definition needs to have the same metatypes as the others too.
I tried a couple of times to add support for differing metatypes, but
it got beyond my avilities to do.
This commit was sponsored by Jeff Goeke-Smith on Patreon.
diff --git a/debian/changelog b/debian/changelog
index cce3338..e7ec04b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,8 @@
 propellor (4.3.4) UNRELEASED; urgency=medium
 
+  * Propellor.Property.Versioned: New module which allows different
+    versions of a property or host to be written down in a propellor config
+    file. Has many applications, including staged upgrades and rollbacks.
   * LightDM.autoLogin: Use [Seat:*] rather than the old [SeatDefaults].
     The new name has been supported since lightdm 1.15.
 
diff --git a/doc/todo/differential_update_via_RevertableProperty.mdwn b/doc/todo/differential_update_via_RevertableProperty.mdwn
index 6d65c91..3eb9bc7 100644
--- a/doc/todo/differential_update_via_RevertableProperty.mdwn
+++ b/doc/todo/differential_update_via_RevertableProperty.mdwn
@@ -101,33 +101,23 @@ Is, perhaps:
 	data Version = A | B | C
 		deriving (Enum, Ord)
 
-	foo :: Versioned Host
+	foo :: Versioned Hoso
 	foo = versionedHost "foo" $ do
 		ver A someprop
-			<|> inVersion [B, C] otherprop
+			<|> othervers otherprop
 		ver A somerevertableprop
-		ver [B, C] somethingelse
+		ver [B, C] newprop
 
 That's ... pretty ok, would hit as least some of the use cases described
 above. Seems to need a Reader+Writer monad to implement it,
 without passing the Version around explicitly. 
 
-Is it allowable for `somethingelse` to not be revertable?
+Is it allowable for `newprop` to not be revertable?
 Once `foo` gets that property, it is never removed if we're moving only
-forwars. On the other hand, perhaps the user will want to roll back to
+forwards. On the other hand, perhaps the user will want to roll back to
 version A. Allowing rollbacks seems good, so `inVersion` should only
 accept `RevertableProperty`.
 
-Here's another situation where reversion is not needed:
-
-	foo = versionedHost "foo" $ do
-		ver A (someprop :: Property)
-			<|> ver [B, C] (someprop :: Property)
-
-That feels like an edge case.. And the only way that propellor could tell
-reversion is not needed there is if it could compare the two sides of the
-`<|>`, and there's no Eq.
-
 Another interesting case is this:
 
 	foo = versionedHost "foo" $ do
@@ -151,5 +141,6 @@ examples above. And that allows composition of properties with versioning:
 
 	someprop :: Versioned (Property DebianLike)
 	someprop = versionedProperty $ do
-		ver A foo
-		ver [B, C] bar
+		ver A foo <|> ver [B, C] bar
+
+> [[done]] in Propellor.Property.Versioned. --[[Joey]]
diff --git a/propellor.cabal b/propellor.cabal
index 3c2477b..1bcc161 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -154,6 +154,7 @@ Library
     Propellor.Property.Unbound
     Propellor.Property.User
     Propellor.Property.Uwsgi
+    Propellor.Property.Versioned
     Propellor.Property.XFCE
     Propellor.Property.ZFS
     Propellor.Property.ZFS.Process
diff --git a/src/Propellor/Property/Versioned.hs b/src/Propellor/Property/Versioned.hs
new file mode 100644
index 0000000..d6517ab
--- /dev/null
+++ b/src/Propellor/Property/Versioned.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE RankNTypes, FlexibleContexts, TypeFamilies #-}
+
+-- | Versioned properties and hosts.
+--
+-- When importing and using this module, you will need to enable some
+-- language extensions:
+--
+-- > {-# LANGUAGE RankNTypes, FlexibleContexts, TypeFamilies #-}
+--
+-- This module takes advantage of `RevertableProperty` to let propellor
+-- switch cleanly between versions. The way it works is all revertable
+-- properties for other versions than the current version are first
+-- reverted, and  then propellor ensures the property for the current
+-- version. This method should work for any combination of revertable
+-- properties.
+--
+-- For example:
+-- 
+-- > demo :: Versioned Int (RevertableProperty DebianLike DebianLike)
+-- > demo ver =
+-- >    ver (   (== 1) --> Apache.modEnabled "foo"
+-- >		`requires` Apache.modEnabled "foosupport"
+-- >	    <|> (== 2) --> Apache.modEnabled "bar"
+-- > 	    <|> (> 2)  --> Apache.modEnabled "baz"
+-- >        )
+-- >
+-- > foo :: Host
+-- > foo = host "foo.example.com" $ props
+-- > 	& demo `version` (2 :: Int)
+--
+-- Similarly, a whole Host can be versioned. For example:
+--
+-- > bar :: Versioned Int Host
+-- > bar ver = host "bar.example.com" $ props
+-- >	& osDebian Unstable X86_64
+-- > 	& ver (   (== 1) --> Apache.modEnabled "foo"
+-- > 	      <|> (== 2) --> Apache.modEnabled "bar"
+-- > 	      )
+-- > 	& ver ( (>= 2) --> Apt.unattendedUpgrades )
+--
+-- Note that some versioning of revertable properties may cause
+-- propellor to do a lot of unnecessary work each time it's run.
+-- Here's an example of such a problem:
+--
+-- > slow :: Versioned Int -> RevertableProperty DebianLike DebianLike
+-- > slow ver =
+-- > 	ver (   (== 1) --> (Apt.installed "foo" <!> Apt.removed "foo")
+-- >	    <|> (== 2) --> (Apt.installed "bar" <!> Apt.removed "bar")
+-- >        )
+--
+-- Suppose that package bar depends on package foo. Then at version 2,
+-- propellor will remove package foo in order to revert version 1, only
+-- to re-install it since version 2 also needs it installed.
+
+module Propellor.Property.Versioned (Versioned, version, (-->), (<|>)) where
+
+import Propellor
+
+-- | Something that has multiple versions of type `v`.
+type Versioned v t = VersionedBy v -> t
+
+type VersionedBy v
+	= forall metatypes. Combines (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes)
+	=> (CombinedType (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes) ~ RevertableProperty metatypes metatypes)
+	=> (VerSpec v metatypes -> RevertableProperty metatypes metatypes)
+
+-- | Access a particular version of a Versioned value.
+version :: (Versioned v t) -> v -> t
+version f v = f (processVerSpec v)
+
+-- A specification of versions.
+--
+-- Why is this not a simple list like
+-- [(v -> Bool, RevertableProperty metatypes metatypes)] ?
+-- Using a list would mean the empty list would need to be dealt with,
+-- and processVerSpec does not have a Monoid instance for
+-- RevertableProperty metatypes metatypes in scope, and due to the way the
+-- Versioned type works, the compiler cannot find such an instance.
+--
+-- Also, using this data type allows a nice syntax for creating
+-- VerSpecs, via the `<&>` and `alt` functions.
+data VerSpec v metatypes
+	= Base (v -> Bool, RevertableProperty metatypes metatypes)
+	| More (v -> Bool, RevertableProperty metatypes metatypes) (VerSpec v metatypes)
+
+processVerSpec 
+	:: Combines (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes)
+	=> (CombinedType (RevertableProperty metatypes metatypes) (RevertableProperty metatypes metatypes) ~ RevertableProperty metatypes metatypes)
+	=> v
+	-> VerSpec v metatypes
+	-> RevertableProperty metatypes metatypes
+processVerSpec v (Base (c, p))
+	| c v = p
+	| otherwise = revert p
+processVerSpec v (More (c, p) vs)
+	| c v = processVerSpec v vs `before` p
+	| otherwise = revert p `before` processVerSpec v vs
+
+-- | Specify a function that checks the version, and what
+-- `RevertableProperty` to use if the version matches.
+(-->) :: (v -> Bool) -> RevertableProperty metatypes metatypes -> VerSpec v metatypes
+c --> p = Base (c, p)
+
+-- | Add an alternate version.
+(<|>) :: VerSpec v metatypes -> VerSpec v metatypes -> VerSpec v metatypes 
+Base a <|> Base b = More a (Base b)
+Base a <|> More b c = More a (More b c)
+More b c <|> Base a  = More a (More b c)
+More a b <|> More c d = More a (More c (b <|> d))
+
+infixl 8 -->
+infixl 2 <|>

Added a comment
diff --git a/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_6_ceddc6d118b7ea71ec8f498960a5fe97._comment b/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_6_ceddc6d118b7ea71ec8f498960a5fe97._comment
new file mode 100644
index 0000000..32ed86f
--- /dev/null
+++ b/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_6_ceddc6d118b7ea71ec8f498960a5fe97._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="gueux"
+ avatar="http://cdn.libravatar.org/avatar/2982bac2c2cd94ab3860efb189deafc8"
+ subject="comment 6"
+ date="2017-07-14T11:16:10Z"
+ content="""
+(I did not try to build propellor again on this 128Mo host yet, though)
+"""]]

Added a comment
diff --git a/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_5_61d7ef8a61ac7b922c810825d794da5f._comment b/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_5_61d7ef8a61ac7b922c810825d794da5f._comment
new file mode 100644
index 0000000..35c894b
--- /dev/null
+++ b/doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_5_61d7ef8a61ac7b922c810825d794da5f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="gueux"
+ avatar="http://cdn.libravatar.org/avatar/2982bac2c2cd94ab3860efb189deafc8"
+ subject="comment 5"
+ date="2017-07-14T10:58:33Z"
+ content="""
+The new \"bootstrapWith (Robustly Stack)\" and \"bootstrapWith OSOnly\" properties completely address my concerns. Thanks!
+"""]]

rollbacks
diff --git a/doc/todo/differential_update_via_RevertableProperty.mdwn b/doc/todo/differential_update_via_RevertableProperty.mdwn
index 6c21794..6d65c91 100644
--- a/doc/todo/differential_update_via_RevertableProperty.mdwn
+++ b/doc/todo/differential_update_via_RevertableProperty.mdwn
@@ -99,7 +99,7 @@ fooisfoo = foo ==# foo
 Is, perhaps:
 
 	data Version = A | B | C
-		deriving (Ord)
+		deriving (Enum, Ord)
 
 	foo :: Versioned Host
 	foo = versionedHost "foo" $ do
@@ -112,9 +112,11 @@ That's ... pretty ok, would hit as least some of the use cases described
 above. Seems to need a Reader+Writer monad to implement it,
 without passing the Version around explicitly. 
 
-Note that it's allowable for `somethingelse` to not be revertable,
-since once `foo` gets that property, it is never removed.
-So, `inVersion` has to accept both `RevertableProperty` and `Property`.
+Is it allowable for `somethingelse` to not be revertable?
+Once `foo` gets that property, it is never removed if we're moving only
+forwars. On the other hand, perhaps the user will want to roll back to
+version A. Allowing rollbacks seems good, so `inVersion` should only
+accept `RevertableProperty`.
 
 Here's another situation where reversion is not needed:
 

wow wow wow
diff --git a/doc/todo/differential_update_via_RevertableProperty.mdwn b/doc/todo/differential_update_via_RevertableProperty.mdwn
index 79afebe..6c21794 100644
--- a/doc/todo/differential_update_via_RevertableProperty.mdwn
+++ b/doc/todo/differential_update_via_RevertableProperty.mdwn
@@ -91,3 +91,63 @@ foo = do
 fooisfoo :: Bool
 fooisfoo = foo ==# foo
 </pre>
+
+-----
+
+## the best we can do without Eq
+
+Is, perhaps:
+
+	data Version = A | B | C
+		deriving (Ord)
+
+	foo :: Versioned Host
+	foo = versionedHost "foo" $ do
+		ver A someprop
+			<|> inVersion [B, C] otherprop
+		ver A somerevertableprop
+		ver [B, C] somethingelse
+
+That's ... pretty ok, would hit as least some of the use cases described
+above. Seems to need a Reader+Writer monad to implement it,
+without passing the Version around explicitly. 
+
+Note that it's allowable for `somethingelse` to not be revertable,
+since once `foo` gets that property, it is never removed.
+So, `inVersion` has to accept both `RevertableProperty` and `Property`.
+
+Here's another situation where reversion is not needed:
+
+	foo = versionedHost "foo" $ do
+		ver A (someprop :: Property)
+			<|> ver [B, C] (someprop :: Property)
+
+That feels like an edge case.. And the only way that propellor could tell
+reversion is not needed there is if it could compare the two sides of the
+`<|>`, and there's no Eq.
+
+Another interesting case is this:
+
+	foo = versionedHost "foo" $ do
+		ver A bar
+		always otherprop
+		ver [B, C] bar
+	
+Is version A of foo identical to verion B? If so, this should be allowed to
+compile even when `bar` cannot be reverted. On the other hand, perhaps
+ordering of the properties matters, in which case the systems are subtly
+different, and there's no way to get from A to B.
+
+It's certianly possible for ordering to matter in propellor properties, 
+although it's generally a bug when it does. So, it seems ok for this
+case to be rejected.
+
+As well as `Versioned Host`, it would be possible to have 
+`Versioned (Property metatypes)`.
+Indeed, that would make sense to he used internally in the 
+examples above. And that allows composition of properties with versioning:
+
+	someprop :: Versioned (Property DebianLike)
+	someprop = versionedProperty $ do
+		ver A foo
+		ver [B, C] bar

idea
diff --git a/doc/todo/differential_update_via_RevertableProperty.mdwn b/doc/todo/differential_update_via_RevertableProperty.mdwn
new file mode 100644
index 0000000..79afebe
--- /dev/null
+++ b/doc/todo/differential_update_via_RevertableProperty.mdwn
@@ -0,0 +1,93 @@
+Long ago, nomeata pointed out that RevertableProperty required the user to
+keep track of different versions of a Host, in a way that should be able to
+be automated. When the user decides to revert a RevertableProperty, they
+have to keep the reverted property on the Host until propellor runs there,
+and only then can remove it.
+
+What if instead, there was a way to store the old version of a Host
+somewhere. Let's not worry about where or how, but assume we have 
+`(old, new) :: (Host, Host)`
+
+Propellor could compare `old` and `new`, and if it finds a
+RevertableProperty in `old` that is not in `new`, add it in reverted form
+to `new'`.
+
+Also, if propellor finds a Property in `old` that is not in `new`, it can
+tell the user that this Property needs to be reverted, but cannot be, so
+`new` won't fully describe the state of the host. --[[Joey]]
+
+----
+
+There are a lot of ways such a capability could be used, especially if
+there were a way to pull the old version of a Host out of a previous
+version of config.hs or something like that. But leaving aside such magic,
+here are some nice use cases:
+
+* Suppose we want to generate several disk images, which are somewhat
+  similar, but differ in some properties. Rather than building a separate
+  chroot for each, we can build a chroot for the first, update the first
+  disk image, compare that with the second and update the chroot
+  accordingly, and so on.
+* When propellor is used to build a OS installer disk image, that installer
+  could know the properties used to create it, and the properties of the
+  system that is desired to be installed. To install, it can rsync the
+  installer disk contents to `/target` and then run propellor in `/target`,
+  differentially updating it as needed.
+
+----
+
+Here's the catch: It can't be implemented currently! The comparison of
+properties needs an `Eq` instance for Property (and RevertableProperty).
+But, a property contains an action in the IO monad, which can't have an
+`Eq` instance, and so there's no good way to compare properties.
+
+Making propellor use an ESDL could get us `Eq`. But it would make it rather
+clumsy to write properties, something like this. 
+
+<pre>
+appendfoo f = WriteFile f (ListAppend "foo" (ReadFile f))
+</pre>
+
+(Perhaps a deeply embedded DSL would be better.)
+
+Could a Free monad get us `Eq`? Well, there can apparently be free monads that
+have an `Eq` instance, but I tried building one for a simple teletype, and
+failed, which does not bode well. Here's the code; this fails to compile
+because of a missing instance `(Eq1 ((->) String))`, and of course comparing
+functions for equality is not generally feasible.
+
+<pre>
+{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}
+
+import Control.Monad.Free
+import Prelude.Extras
+
+data TeletypeF x
+        = PutStrLn String x
+        | GetLine (String -> x)
+
+instance Functor TeletypeF where
+        fmap f (PutStrLn str x) = PutStrLn str (f x)
+        fmap f (GetLine k) = GetLine (f . k)
+
+instance (Eq1 ((->) String)) => Eq1 TeletypeF  where
+        PutStrLn a x ==# PutStrLn b y = a == b && x == y
+        GetLine a ==# GetLine b = a ==# b
+
+type Teletype = Free TeletypeF
+
+putStrLn' :: String -> Teletype ()
+putStrLn' str = liftF $ PutStrLn str ()
+
+getLine' :: Teletype String
+getLine' = liftF $ GetLine id
+
+foo :: Teletype ()
+foo = do
+        putStrLn' "name?"
+        name <- getLine'
+        putStrLn' ("hello, " ++ name)
+
+fooisfoo :: Bool
+fooisfoo = foo ==# foo
+</pre>

add news item for propellor 4.3.3
diff --git a/doc/news/version_3.3.1.mdwn b/doc/news/version_3.3.1.mdwn
deleted file mode 100644
index 84ab72f..0000000
--- a/doc/news/version_3.3.1.mdwn
+++ /dev/null
@@ -1,8 +0,0 @@
-propellor 3.3.1 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Apt: Removed the mirrors.kernel.org line from stdSourcesList etc.
-     The mirror CDN has a new implementation that should avoid the problems
-     with httpredir that made an extra mirror sometimes be needed.
-   * Switch Debian CDN address to deb.debian.org.
-   * Tor.hiddenService: Fix bug in torrc's HiddenServicePort configuration.
-     Thanks, Félix Sipma"""]]
\ No newline at end of file
diff --git a/doc/news/version_4.3.3.mdwn b/doc/news/version_4.3.3.mdwn
new file mode 100644
index 0000000..b51ab5d
--- /dev/null
+++ b/doc/news/version_4.3.3.mdwn
@@ -0,0 +1,17 @@
+propellor 4.3.3 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Hosts can be configured to build propellor using stack, by adding
+     a property:
+         &amp; bootstrapWith (Robustly Stack)
+   * Hosts can be configured to build propellor using cabal, but using
+     only packages installed from the operating system. This
+     will work on eg Debian:
+         &amp; bootstrapWith OSOnly
+   * Iproved fix for bug that sometimes made --spin fail with
+     "fatal: Couldn't find remote ref HEAD". The previous fix didn't work
+     reliably.
+   * User: add systemGroup and use it for systemAccountFor'
+     Thanks, Félix Sipma.
+   * Export a Restic.backup' property.
+     Thanks, Félix Sipma.
+   * Updated stack config to lts-8.22."""]]
\ No newline at end of file

close
diff --git a/doc/todo/spin_failure_HEAD.mdwn b/doc/todo/spin_failure_HEAD.mdwn
index ceea152..1a591b3 100644
--- a/doc/todo/spin_failure_HEAD.mdwn
+++ b/doc/todo/spin_failure_HEAD.mdwn
@@ -126,3 +126,5 @@ Sending privdata (73139 bytes) to kite.kitenet.net ... done
 
 > > > I thought I'd fixed this by disabling buffering of stdin, but 
 > > > it seems not.
+
+> > > > Seems really [[done]] at last! --[[Joey]]

reopen bug
diff --git a/doc/todo/spin_failure_HEAD.mdwn b/doc/todo/spin_failure_HEAD.mdwn
index f838e46..ceea152 100644
--- a/doc/todo/spin_failure_HEAD.mdwn
+++ b/doc/todo/spin_failure_HEAD.mdwn
@@ -124,4 +124,5 @@ Sending privdata (73139 bytes) to kite.kitenet.net ... done
 	        l2 <- hGetLine bob
 	        print l2
 
-> > [[fixed|done]] --[[Joey]]
+> > > I thought I'd fixed this by disabling buffering of stdin, but 
+> > > it seems not.

add bootstrapWith property to support stack and more
* Hosts can be configured to build propellor using stack, by adding
a property:
& bootstrapWith (Robustly Stack)
* Hosts can be configured to build propellor using cabal, but using
only packages installed from the operating system. This
will work on eg Debian:
& bootstrapWith OSOnly
propellor build its config using stack. (This does not affect
how propellor is bootstrapped on a host by "propellor --spin host".)
This has not yet been tested at all! But should probably work fine.
This is based on earlier work by Arnaud Bailly, who made
Propellor.Bootstrap use stack without parameterization.
In Arnaud's patch, stack was installed using wget, but that
only worked on linux-x86_64 and was insecure. I instead chose
to use the distribution packages of stack, like is done for cabal.
Debian stack has haskell-stack now, and it's getting into many
distributions.
This commit was sponsored by Francois Marier on Patreon.
diff --git a/debian/changelog b/debian/changelog
index 24552b2..be0285f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,13 @@ propellor (4.3.1) UNRELEASED; urgency=medium
 
   * Added Propellor.Property.FreeDesktop module.
   * Added reservedSpacePercentage to the PartSpec EDSL.
+  * Hosts can be configured to build propellor using stack, by adding
+    a property:
+	& bootstrapWith (Robustly Stack)
+  * Hosts can be configured to build propellor using cabal, but using
+    only packages installed from the operating system. This
+    will work on eg Debian:
+	& bootstrapWith OSOnly
 
  -- Joey Hess <id@joeyh.name>  Wed, 05 Jul 2017 22:57:42 -0400
 
@@ -473,7 +480,8 @@ propellor (3.0.0) unstable; urgency=medium
     a clone of propellor's git repository, or a minimal config, and will
     configure propellor to use a gpg key.
   * Stack support. "git config propellor.buildsystem stack" will make
-    propellor build its config using stack.
+    propellor build its config using stack. (This does not affect
+    how propellor is bootstrapped on a host by "propellor --spin host".)
   * When propellor is installed using stack, propellor --init will
     automatically set propellor.buildsystem=stack.
 
diff --git a/doc/README.mdwn b/doc/README.mdwn
index ea622b3..a4a38c5 100644
--- a/doc/README.mdwn
+++ b/doc/README.mdwn
@@ -41,6 +41,8 @@ see [configuration for the Haskell newbie](https://propellor.branchable.com/hask
 1. Get propellor installed on your development machine (ie, laptop).
      `cabal install propellor`
           or
+     `stack install propellor`
+          or
      `apt-get install propellor`
 2. Run `propellor --init` ; this will set up a `~/.propellor/` git
    repository for you.
diff --git a/doc/todo/use_stack_for_remote_building_propellor.mdwn b/doc/todo/use_stack_for_remote_building_propellor.mdwn
index 265596d..8c8751e 100644
--- a/doc/todo/use_stack_for_remote_building_propellor.mdwn
+++ b/doc/todo/use_stack_for_remote_building_propellor.mdwn
@@ -1,3 +1,16 @@
 Among other features [stack](https://github.com/commercialhaskell/stack/) provides a clean and deep dependency management system that even takes care of installing toolchain (ghc, alex, happy, cabal...) in a segregated environment. Building remote propellor with stack would remove the limitation that code should be compilable with stock ghc from package manager. I have done some preliminary work on this feature in my [github clone](https://github.com/abailly/propellor) for propellor, currently from 2.17.2 branch (I wanted to reuse existing properties). The code is mostly in [Bootstrap](https://github.com/abailly/propellor/blob/master/src/Propellor/Bootstrap.hs) and is currently limited to linux systems. Adapting to FreeBsd should be straightforward as this is supported by slack and there are native builds available. 
 
 If there is interest in such a feature I would be happy to move it to HEAD and provide a patch.
+
+> I've implemented a bootstrapWith property, which can be added to a Host
+> to make it use stack:
+> 
+> 	& bootstrapWith (Robustly Stack)
+> 
+> So, for a propellor install that uses stack entirely, use
+> `stack install propellor` to install it to your laptop,
+> use `propellor --init` to set up `~/.propellor/config,hs`,
+> and in the config file, add the above property to all your 
+> Hosts (perhaps using `map` ..).
+> 
+> I feel that's enough to call this [[done]]. --[[Joey]]
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs
index 4b3f2da..baf36e4 100644
--- a/src/Propellor/Bootstrap.hs
+++ b/src/Propellor/Bootstrap.hs
@@ -1,4 +1,8 @@
 module Propellor.Bootstrap (
+	Bootstrapper(..),
+	Builder(..),
+	defaultBootstrapper,
+	getBootstrapper,
 	bootstrapPropellorCommand,
 	checkBinaryCommand,
 	installGitCommand,
@@ -16,71 +20,120 @@ import Data.List
 
 type ShellCommand = String
 
+-- | Different ways that Propellor's dependencies can be installed,
+-- and propellor can be built. The default is `Robustly Cabal`
+--
+-- `Robustly Cabal` and `Robustly Stack` use the OS's native packages
+-- as much as possible to install Cabal, Stack, and propellor's build
+-- dependencies. When necessary, dependencies are built from source
+-- using Cabal or Stack rather than using the OS's native packages.
+--
+-- `OSOnly` uses the OS's native packages of Cabal and all of propellor's
+-- build dependencies. It may not work on all systems.
+data Bootstrapper = Robustly Builder | OSOnly
+	deriving (Show)
+
+data Builder = Cabal | Stack
+	deriving (Show)
+
+defaultBootstrapper :: Bootstrapper
+defaultBootstrapper = Robustly Cabal
+
+-- | Gets the Bootstrapper for the Host propellor is running on.
+getBootstrapper :: Propellor Bootstrapper
+getBootstrapper = go <$> askInfo
+  where
+	go NoInfoVal = defaultBootstrapper
+	go (InfoVal bs) = bs
+
+getBuilder :: Bootstrapper -> Builder
+getBuilder (Robustly b) = b
+getBuilder OSOnly = Cabal
+
 -- Shell command line to ensure propellor is bootstrapped and ready to run.
 -- Should be run inside the propellor config dir, and will install
 -- all necessary build dependencies and build propellor.
-bootstrapPropellorCommand :: Maybe System -> ShellCommand
-bootstrapPropellorCommand msys = checkDepsCommand msys ++
+bootstrapPropellorCommand :: Bootstrapper -> Maybe System -> ShellCommand
+bootstrapPropellorCommand bs msys = checkDepsCommand bs msys ++
 	"&& if ! test -x ./propellor; then "
-		++ buildCommand ++
-	"; fi;" ++ checkBinaryCommand
+		++ buildCommand bs ++
+	"; fi;" ++ checkBinaryCommand bs
 
 -- Use propellor --check to detect if the local propellor binary has
 -- stopped working (eg due to library changes), and must be rebuilt.
-checkBinaryCommand :: ShellCommand
-checkBinaryCommand = "if test -x ./propellor && ! ./propellor --check; then " ++ go ++ "; fi"
+checkBinaryCommand :: Bootstrapper -> ShellCommand
+checkBinaryCommand bs = "if test -x ./propellor && ! ./propellor --check; then " ++ go (getBuilder bs) ++ "; fi"
   where
-	go = intercalate " && "
+	go Cabal = intercalate " && "
 		[ "cabal clean"
-		, buildCommand
+		, buildCommand bs
+		]
+	go Stack = intercalate " && "
+		[ "stack clean"
+		, buildCommand bs
 		]
 
-buildCommand :: ShellCommand
-buildCommand = intercalate " && "
-	[ "cabal configure"
-	, "cabal build propellor-config"
-	, "ln -sf dist/build/propellor-config/propellor-config propellor"
-	]
+buildCommand :: Bootstrapper -> ShellCommand
+buildCommand bs = intercalate " && " (go (getBuilder bs))
+  where
+	go Cabal =
+		[ "cabal configure"
+		, "cabal build propellor-config"
+		, "ln -sf dist/build/propellor-config/propellor-config propellor"
+		]
+	go Stack =
+		[ "stack build :propellor-config"
+		, "ln -sf $(stack path --dist-dir)/build/propellor-config propellor"
+		]
 
 -- Run cabal configure to check if all dependencies are installed;
 -- if not, run the depsCommand.
-checkDepsCommand :: Maybe System -> ShellCommand
-checkDepsCommand sys = "if ! cabal configure >/dev/null 2>&1; then " ++ depsCommand sys ++ "; fi"
+checkDepsCommand :: Bootstrapper -> Maybe System -> ShellCommand
+checkDepsCommand bs sys = go (getBuilder bs)
+  where
+	go Cabal = "if ! cabal configure >/dev/null 2>&1; then " ++ depsCommand bs sys ++ "; fi"
+	go Stack = "if ! stack --version >/dev/null 2>&1; then " ++ depsCommand bs sys ++ "; fi"
 
--- Install build dependencies of propellor.
---
--- First, try to install ghc, cabal, gnupg, and all haskell libraries that
--- propellor uses from OS packages.
+-- Install build dependencies of propellor, using the specified
+-- Bootstrapper.
 --
+-- When bootstrapping Robustly, first try to install the builder, 
+-- and all haskell libraries that propellor uses from OS packages.
 -- Some packages may not be available in some versions of Debian
 -- (eg, Debian wheezy lacks async), or propellor may need a newer version.
--- So, as a second step, cabal is used to install all dependencies.
+-- So, as a second step, any other dependencies are installed from source
+-- using the builder.
 --
 -- Note: May succeed and leave some deps not installed.
-depsCommand :: Maybe System -> ShellCommand
-depsCommand msys = "( " ++ intercalate " ; " (concat [osinstall, cabalinstall]) ++ " ) || true"
+depsCommand :: Bootstrapper -> Maybe System -> ShellCommand
+depsCommand bs msys = "( " ++ intercalate " ; " (go bs) ++ ") || true"
   where
-	osinstall = case msys of
-		Just (System (FreeBSD _) _) -> map pkginstall fbsddeps
-		Just (System (ArchLinux) _) -> map pacmaninstall archlinuxdeps
-		Just (System (Debian _ _) _) -> useapt
-		Just (System (Buntish _) _) -> useapt
-		-- assume a debian derived system when not specified
-		Nothing -> useapt
-
-	useapt = "apt-get update" : map aptinstall debdeps
-

(Diff truncated)
add news item for propellor 4.3.2
diff --git a/doc/news/version_4.3.0.mdwn b/doc/news/version_4.3.0.mdwn
deleted file mode 100644
index f300b98..0000000
--- a/doc/news/version_4.3.0.mdwn
+++ /dev/null
@@ -1,6 +0,0 @@
-propellor 4.3.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * DiskImage: Removed grubBooted; properties that used to need it as a
-     parameter now look at Info about the bootloader that is installed in
-     the chroot that the disk image is created from.
-     (API change)"""]]
\ No newline at end of file
diff --git a/doc/news/version_4.3.2.mdwn b/doc/news/version_4.3.2.mdwn
new file mode 100644
index 0000000..1a85d2d
--- /dev/null
+++ b/doc/news/version_4.3.2.mdwn
@@ -0,0 +1,3 @@
+propellor 4.3.2 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Really include Propellor.Property.FreeDesktop."""]]
\ No newline at end of file

add news item for propellor 4.3.1
diff --git a/doc/news/version_3.3.0.mdwn b/doc/news/version_3.3.0.mdwn
deleted file mode 100644
index 19bd566..0000000
--- a/doc/news/version_3.3.0.mdwn
+++ /dev/null
@@ -1,26 +0,0 @@
-propellor 3.3.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Arch Linux is now supported by Propellor!
-     Thanks to Zihao Wang for this port.
-   * Added Propellor.Property.Pacman for Arch's package manager.
-     Maintained by Zihao Wang.
-   * The types of some properties changed; eg from Property DebianLike
-     to Property (DebianLike + ArchLinux). Also, DebianLike and Linux
-     are no longer type synonyms; propellor now knows that Linux includes
-     ArchLinux. This could require updates to code, so is a minor API change.
-   * GHC's fileSystemEncoding is used for all String IO, to avoid
-     encoding-related crashes in eg, Propellor.Property.File.
-   * Add --build option to simply build config.hs.
-   * More informative usage message. Thanks, Daniel Brooks
-   * Tor.hiddenService' added to support multiple ports.
-     Thanks, Félix Sipma.
-   * Apt.noPDiffs added.
-     Thanks, Sean Whitton.
-   * stack.yaml: Compile with GHC 8.0.1 against lts-7.16.
-     Thanks, Andrew Cowie.
-   * Added Propellor.Property.File.configFileName and related functions
-     to generate good filenames for config directories.
-   * Added Apt.suiteAvailablePinned, Apt.pinnedTo.
-     Thanks, Sean Whitton.
-   * Added File.containsBlock
-     Thanks, Sean Whitton."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.3.1.mdwn b/doc/news/version_4.3.1.mdwn
new file mode 100644
index 0000000..5c07307
--- /dev/null
+++ b/doc/news/version_4.3.1.mdwn
@@ -0,0 +1,4 @@
+propellor 4.3.1 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Added Propellor.Property.FreeDesktop module.
+   * Added reservedSpacePercentage to the PartSpec EDSL."""]]
\ No newline at end of file

add news item for propellor 4.3.0
diff --git a/doc/news/version_3.2.3.mdwn b/doc/news/version_3.2.3.mdwn
deleted file mode 100644
index 3689a90..0000000
--- a/doc/news/version_3.2.3.mdwn
+++ /dev/null
@@ -1,9 +0,0 @@
-propellor 3.2.3 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Improve extraction of gpg secret key id list, to work with gpg 2.1.
-   * The propellor wrapper checks if ./config.hs exists; if so it runs
-     using the configuration in the current directory, rather than
-     ~/.propellor/config.hs
-   * Debootstap: Fix too tight permissions lock down of debootstrapped
-     chroots, which prevented non-root users from doing anything in the
-     chroot."""]]
\ No newline at end of file
diff --git a/doc/news/version_4.2.0.mdwn b/doc/news/version_4.2.0.mdwn
deleted file mode 100644
index 6ccb23f..0000000
--- a/doc/news/version_4.2.0.mdwn
+++ /dev/null
@@ -1,13 +0,0 @@
-propellor 4.2.0 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * DiskImage.grubBooted no longer takes a BIOS parameter,
-     and no longer implicitly adds Grub.installed to the properties of
-     the disk image. If you used DiskImage.grubBooted, you'll need to update
-     your propellor configuration, removing the BIOS parameter from
-     grubBooted and adding a Grub.installed property to the disk image, eg:
-         &amp; Grub.installed PC
-     (API change)
-   * Grub.installed: Avoid running update-grub when used in a chroot, since
-     it will get confused.
-   * DiskImage.Finalization: Simplified this type since it does not need to
-     be used to install packages anymore. (API change)"""]]
\ No newline at end of file
diff --git a/doc/news/version_4.3.0.mdwn b/doc/news/version_4.3.0.mdwn
new file mode 100644
index 0000000..f300b98
--- /dev/null
+++ b/doc/news/version_4.3.0.mdwn
@@ -0,0 +1,6 @@
+propellor 4.3.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * DiskImage: Removed grubBooted; properties that used to need it as a
+     parameter now look at Info about the bootloader that is installed in
+     the chroot that the disk image is created from.
+     (API change)"""]]
\ No newline at end of file