summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/forum/Error_building_on_remote_host.mdwn31
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_1_f0f6f241e971d048486ae159585a4ab2._comment21
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment13
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_3_3090e63b93e00d6eca95ca8fe523f5b8._comment8
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_4_8a3eac770c1bee9295272c46f022a03c._comment8
-rw-r--r--doc/forum/Error_building_on_remote_host/comment_4_c2e07d9bfba84fbdcf408a09965d6cb6._comment10
-rw-r--r--doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_5_61d7ef8a61ac7b922c810825d794da5f._comment8
-rw-r--r--doc/forum/Why_downloading_package_list_from_hackage.haskell.org__63__/comment_6_ceddc6d118b7ea71ec8f498960a5fe97._comment8
-rw-r--r--doc/forum/host_to_deal_with_dpkg::options.mdwn41
-rw-r--r--doc/forum/host_to_deal_with_dpkg::options/comment_1_641dcb7be62151bdc97fd5e574f334d0._comment12
-rw-r--r--doc/forum/host_to_deal_with_dpkg::options/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment9
-rw-r--r--doc/forum/host_to_deal_with_dpkg::options/comment_3_62d671fb3c787aafcd4d058975208f75._comment10
-rw-r--r--doc/news/Linux.Conf.Au.presentation.mdwn5
-rw-r--r--doc/news/version_3.3.1.mdwn8
-rw-r--r--doc/news/version_3.4.0.mdwn14
-rw-r--r--doc/news/version_3.4.1.mdwn3
-rw-r--r--doc/news/version_4.3.1.mdwn4
-rw-r--r--doc/news/version_4.3.2.mdwn3
-rw-r--r--doc/news/version_4.5.1.mdwn7
-rw-r--r--doc/news/version_4.5.2.mdwn5
-rw-r--r--doc/news/version_4.6.0.mdwn8
-rw-r--r--doc/news/version_4.6.1.mdwn7
-rw-r--r--doc/news/version_4.6.2.mdwn8
-rw-r--r--doc/todo/Propellor.Property.Versioned_support_asymmetric_RevertableProperty_types.mdwn7
-rw-r--r--doc/todo/differential_update_via_RevertableProperty.mdwn146
-rw-r--r--doc/todo/merge_request:_Timezone.hs.mdwn9
-rw-r--r--doc/todo/merge_request:_Timezone.hs/comment_1_9cfb5e48940e58f2064cbb5edf462c06._comment15
-rw-r--r--doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn23
28 files changed, 407 insertions, 44 deletions
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 00000000..240db464
--- /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?
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 00000000..eca6c8c6
--- /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/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment b/doc/forum/Error_building_on_remote_host/comment_2_9029575e378c3ed67ea7b7d9fd0a11b5._comment
new file mode 100644
index 00000000..34750553
--- /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.
+"""]]
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 00000000..1790ac78
--- /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>
+"""]]
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 00000000..5129fb5d
--- /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.
+"""]]
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 00000000..7d8f26fe
--- /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/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 00000000..35c894b0
--- /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!
+"""]]
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 00000000..32ed86f8
--- /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)
+"""]]
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 00000000..5faaefe2
--- /dev/null
+++ b/doc/forum/host_to_deal_with_dpkg::options.mdwn
@@ -0,0 +1,41 @@
+[[!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
+
+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
+
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 00000000..65756b12
--- /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/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment b/doc/forum/host_to_deal_with_dpkg::options/comment_2_bac8129b570ce216ef9f6aa6c0e12c1e._comment
new file mode 100644
index 00000000..39e0ebc3
--- /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.
+"""]]
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 00000000..4031bd16
--- /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
+"""]]
diff --git a/doc/news/Linux.Conf.Au.presentation.mdwn b/doc/news/Linux.Conf.Au.presentation.mdwn
deleted file mode 100644
index 54180979..00000000
--- 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/)
diff --git a/doc/news/version_3.3.1.mdwn b/doc/news/version_3.3.1.mdwn
deleted file mode 100644
index 84ab72f1..00000000
--- 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_3.4.0.mdwn b/doc/news/version_3.4.0.mdwn
deleted file mode 100644
index d38716e1..00000000
--- 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_3.4.1.mdwn b/doc/news/version_3.4.1.mdwn
deleted file mode 100644
index 51d9c2ac..00000000
--- 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.3.1.mdwn b/doc/news/version_4.3.1.mdwn
deleted file mode 100644
index 5c07307d..00000000
--- 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.2.mdwn b/doc/news/version_4.3.2.mdwn
deleted file mode 100644
index 1a85d2d4..00000000
--- 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.5.1.mdwn b/doc/news/version_4.5.1.mdwn
new file mode 100644
index 00000000..212b4f27
--- /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
diff --git a/doc/news/version_4.5.2.mdwn b/doc/news/version_4.5.2.mdwn
new file mode 100644
index 00000000..f7268048
--- /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
diff --git a/doc/news/version_4.6.0.mdwn b/doc/news/version_4.6.0.mdwn
new file mode 100644
index 00000000..673051ea
--- /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
diff --git a/doc/news/version_4.6.1.mdwn b/doc/news/version_4.6.1.mdwn
new file mode 100644
index 00000000..eb7bd940
--- /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
diff --git a/doc/news/version_4.6.2.mdwn b/doc/news/version_4.6.2.mdwn
new file mode 100644
index 00000000..50930135
--- /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
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 00000000..c60cd4d6
--- /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]]
diff --git a/doc/todo/differential_update_via_RevertableProperty.mdwn b/doc/todo/differential_update_via_RevertableProperty.mdwn
new file mode 100644
index 00000000..3eb9bc7a
--- /dev/null
+++ b/doc/todo/differential_update_via_RevertableProperty.mdwn
@@ -0,0 +1,146 @@
+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>
+
+-----
+
+## the best we can do without Eq
+
+Is, perhaps:
+
+ data Version = A | B | C
+ deriving (Enum, Ord)
+
+ foo :: Versioned Hoso
+ foo = versionedHost "foo" $ do
+ ver A someprop
+ <|> othervers otherprop
+ ver A somerevertableprop
+ 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 `newprop` to not be revertable?
+Once `foo` gets that property, it is never removed if we're moving only
+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`.
+
+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
+
+> [[done]] in Propellor.Property.Versioned. --[[Joey]]
diff --git a/doc/todo/merge_request:_Timezone.hs.mdwn b/doc/todo/merge_request:_Timezone.hs.mdwn
new file mode 100644
index 00000000..a8ba3eae
--- /dev/null
+++ b/doc/todo/merge_request:_Timezone.hs.mdwn
@@ -0,0 +1,9 @@
+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
+
+> [[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 00000000..026b13de
--- /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/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn b/doc/todo/sbuild_setup_should_use_apt-cacher-ng.mdwn
index 450416f2..62f619db 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]]