summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoeyHess <>2015-08-12 15:25:00 (GMT)
committerhdiff <hdiff@hdiff.luite.com>2015-08-12 15:25:00 (GMT)
commitdfb92bd2b0de1b2ea78ff8e7014e1be61dff66aa (patch)
tree1380e57aa3de5226c2caee931a4dc9e2d096ff24
parent1a2add1f24c8f0aa5b806d81df06bb7e16b053b7 (diff)
version 5.201508125.20150812
-rw-r--r--Annex/Action.hs35
-rw-r--r--Annex/Content.hs5
-rw-r--r--Annex/Direct.hs10
-rw-r--r--Annex/Ssh.hs20
-rw-r--r--Annex/TaggedPush.hs1
-rw-r--r--Assistant/Gpg.hs2
-rw-r--r--Backend/Hash.hs65
-rw-r--r--CHANGELOG43
-rw-r--r--CmdLine.hs25
-rw-r--r--CmdLine/GitAnnexShell.hs66
-rw-r--r--CmdLine/GitAnnexShell/Checks.hs67
-rw-r--r--CmdLine/GitAnnexShell/Fields.hs3
-rw-r--r--CmdLine/Seek.hs9
-rw-r--r--Command/ConfigList.hs10
-rw-r--r--Command/Fsck.hs52
-rw-r--r--Command/MetaData.hs29
-rw-r--r--Command/Proxy.hs36
-rw-r--r--Command/RecvKey.hs2
-rw-r--r--Command/Sync.hs17
-rw-r--r--Database/Fsck.hs10
-rw-r--r--Database/Handle.hs46
-rw-r--r--Git/UnionMerge.hs2
-rw-r--r--Limit.hs2
-rw-r--r--Makefile2
-rw-r--r--Remote.hs1
-rw-r--r--Remote/BitTorrent.hs4
-rw-r--r--Remote/Bup.hs4
-rw-r--r--Remote/Ddar.hs2
-rw-r--r--Remote/Directory.hs2
-rw-r--r--Remote/External.hs2
-rw-r--r--Remote/GCrypt.hs2
-rw-r--r--Remote/Git.hs25
-rw-r--r--Remote/Glacier.hs2
-rw-r--r--Remote/Hook.hs2
-rw-r--r--Remote/List.hs19
-rw-r--r--Remote/Rsync.hs4
-rw-r--r--Remote/S3.hs2
-rw-r--r--Remote/Tahoe.hs2
-rw-r--r--Remote/Web.hs4
-rw-r--r--Remote/WebDAV.hs2
-rw-r--r--Setup.hs14
-rw-r--r--Types/MetaData.hs10
-rw-r--r--Types/Remote.hs3
-rw-r--r--Utility/Base64.hs18
-rw-r--r--Utility/Directory.hs6
-rw-r--r--Utility/FileSystemEncoding.hs19
-rw-r--r--Utility/Hash.hs76
-rw-r--r--Utility/LockPool/Windows.hs9
-rw-r--r--Utility/Path.hs7
-rw-r--r--Utility/WebApp.hs4
-rw-r--r--Utility/Yesod.hs2
-rw-r--r--debian/.changelog.swpbin0 -> 4096 bytes
-rwxr-xr-xdebian/cabal-wrapper16
-rw-r--r--debian/changelog43
-rw-r--r--debian/control5
-rwxr-xr-xdebian/rules3
-rw-r--r--doc/backends.mdwn29
-rw-r--r--doc/bugs.mdwn2
-rw-r--r--doc/bugs/Error_writing_log_message_when_filename_contains_Unicode_chars.mdwn25
-rw-r--r--doc/bugs/__39__copy_destdir__61____60__path__62____39___fails.mdwn56
-rw-r--r--doc/bugs/cannot_change_locale___40__en__95__US.UTF-8__41__.mdwn4
-rw-r--r--doc/bugs/git-annex_get_with_umlaut_characters_in_filenames.mdwn59
-rw-r--r--doc/bugs/git_annex_assistant_failing_with_ARM_NAS.mdwn29
-rw-r--r--doc/bugs/gitlab_repos_cannot_use_gcrypt.mdwn11
-rw-r--r--doc/bugs/sync_content_has_really_suboptimal_behavior.mdwn50
-rw-r--r--doc/bugs/view_fails_with___34__invalid_character__34__.mdwn26
-rw-r--r--doc/design/external_special_remote_protocol.mdwn4
-rw-r--r--doc/devblog/day_307__two_release_week.mdwn11
-rw-r--r--doc/devblog/day_308__other_peoples_bugs.mdwn11
-rw-r--r--doc/devblog/day_309__proxy.mdwn5
-rw-r--r--doc/devblog/day_310__half_day.mdwn7
-rw-r--r--doc/devblog/day_311__SHA-3.mdwn6
-rw-r--r--doc/devblog/day_312__release_prep.mdwn12
-rw-r--r--doc/forum/Remote__39__s_git-annex-shell_not_detected.mdwn20
-rw-r--r--doc/forum/can__39__t_sync_content.mdwn35
-rw-r--r--doc/forum/checkout_view_to_directory_outside_of_annex.mdwn23
-rw-r--r--doc/git-annex-fsck.mdwn7
-rw-r--r--doc/git-annex-proxy.mdwn8
-rw-r--r--doc/git-annex-shell.mdwn9
-rw-r--r--doc/news/version_5.20150617.mdwn50
-rw-r--r--doc/news/version_5.20150812.mdwn40
-rw-r--r--doc/special_remotes/comment_23_aba4abb897c6ecc0c6ba72cbd21b9f4b._comment12
-rw-r--r--doc/tips/centralized_git_repository_tutorial/on_your_own_server.mdwn8
-rw-r--r--doc/tips/get_git-annex-shell_into_PATH.mdwn55
-rw-r--r--doc/tips/using_the_SHA1_backend.mdwn11
-rw-r--r--doc/todo.mdwn2
-rw-r--r--doc/todo/Amazon_Cloud_Drive.mdwn14
-rw-r--r--doc/todo/amazon_prime_photos.mdwn3
-rw-r--r--doc/todo/better_git-annex-shell_init_workflow.mdwn12
-rw-r--r--doc/todo/ditch_yesod.mdwn32
-rw-r--r--doc/todo/git_annex_push.mdwn1
-rw-r--r--doc/todo/git_annex_push/comment_1_54c5494ec21621298b3111cd7c2325b1._comment19
-rw-r--r--doc/todo/git_annex_push/comment_2_67938223c42c2a81dbfd32cd8a6a39c2._comment7
-rw-r--r--doc/todo/git_annex_push/comment_3_ccb822eeb9b0d60f811568e4f27f970a._comment19
-rw-r--r--doc/todo/subsecond_timestamping_of_the_--debug_output.mdwn1
-rw-r--r--doc/walkthrough/using_ssh_remotes.mdwn3
-rw-r--r--git-annex.cabal14
-rw-r--r--man/git-annex-fsck.17
-rw-r--r--man/git-annex-proxy.18
-rw-r--r--man/git-annex-shell.19
-rw-r--r--standalone/android/cabal.config1177
-rw-r--r--standalone/android/haskell-patches/crypto-numbers_build-fix.patch227
-rw-r--r--standalone/android/haskell-patches/entropy_cross-build.patch27
-rw-r--r--standalone/android/haskell-patches/gnuidn_fix-build-with-new-base.patch50
-rw-r--r--standalone/android/haskell-patches/network_2.4.1.0_0006-build-fixes.patch24
-rw-r--r--standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch24
-rw-r--r--standalone/android/haskell-patches/vector_cross-build.patch24
-rw-r--r--standalone/android/haskell-patches/warp_avoid-ipv6-for-android.patch39
-rwxr-xr-xstandalone/android/install-haskell-packages15
-rw-r--r--standalone/android/tmp/network-2.4.1.2/cabal.config1177
-rwxr-xr-xstandalone/linux/skel/runshell25
-rw-r--r--standalone/no-th/evilsplicer-headers.hs1
-rw-r--r--standalone/no-th/haskell-patches/DAV_build-without-TH.patch12
-rw-r--r--standalone/no-th/haskell-patches/aeson_remove-TH.patch40
-rw-r--r--standalone/no-th/haskell-patches/file-embed_remove-TH.patch132
-rw-r--r--standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch394
-rw-r--r--standalone/no-th/haskell-patches/lens_no-TH.patch92
-rw-r--r--standalone/no-th/haskell-patches/monad-logger_remove-TH.patch27
-rw-r--r--standalone/no-th/haskell-patches/optparse-applicative_remove-ANN.patch (renamed from standalone/android/haskell-patches/optparse-applicative_remove-ANN.patch)0
-rw-r--r--standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch41
-rw-r--r--standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch26
-rw-r--r--standalone/no-th/haskell-patches/reflection_remove-TH.patch59
-rw-r--r--standalone/no-th/haskell-patches/skein_hardcode_little-endian.patch (renamed from standalone/android/haskell-patches/skein_hardcode_little-endian.patch)0
-rw-r--r--standalone/no-th/haskell-patches/vector_hack-to-build-with-new-ghc.patch49
-rw-r--r--standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch24
-rw-r--r--standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch108
-rw-r--r--standalone/no-th/haskell-patches/yesod-core_expand_TH.patch93
-rw-r--r--standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch676
-rw-r--r--standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch16
-rw-r--r--standalone/no-th/haskell-patches/yesod-routes_remove-TH.patch170
-rw-r--r--standalone/no-th/haskell-patches/yesod-static_hack.patch34
-rw-r--r--standalone/no-th/haskell-patches/yesod_hack-TH.patch47
132 files changed, 3463 insertions, 3036 deletions
diff --git a/Annex/Action.hs b/Annex/Action.hs
new file mode 100644
index 0000000..f59c9c2
--- /dev/null
+++ b/Annex/Action.hs
@@ -0,0 +1,35 @@
+{- git-annex actions
+ -
+ - Copyright 2010-2015 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+{-# LANGUAGE CPP #-}
+
+module Annex.Action where
+
+import qualified Data.Map as M
+#ifndef mingw32_HOST_OS
+import System.Posix.Signals
+#endif
+
+import Common.Annex
+import qualified Annex
+import Annex.Content
+
+{- Actions to perform each time ran. -}
+startup :: Annex ()
+startup =
+#ifndef mingw32_HOST_OS
+ liftIO $ void $ installHandler sigINT Default Nothing
+#else
+ return ()
+#endif
+
+{- Cleanup actions. -}
+shutdown :: Bool -> Annex ()
+shutdown nocommit = do
+ saveState nocommit
+ sequence_ =<< M.elems <$> Annex.getState Annex.cleanup
+ liftIO reapZombies -- zombies from long-running git processes
diff --git a/Annex/Content.hs b/Annex/Content.hs
index 1a2ed06..0774070 100644
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -176,8 +176,6 @@ lockContent key a = do
(const $ a $ ContentLock key )
where
alreadylocked = error "content is locked"
- failedtolock e = error $ "failed to lock content: " ++ show e
- trylock locker = locker `catchIO` failedtolock
cleanuplockfile lockfile = modifyContent lockfile $
void $ liftIO $ tryIO $
nukeFile lockfile
@@ -197,6 +195,9 @@ lockContent key a = do
unlock mlockfile lck = do
maybe noop cleanuplockfile mlockfile
liftIO $ dropLock lck
+
+ failedtolock e = error $ "failed to lock content: " ++ show e
+ trylock locker = locker `catchIO` failedtolock
#else
lock _ (Just lockfile) = do
modifyContent lockfile $
diff --git a/Annex/Direct.hs b/Annex/Direct.hs
index bb470e0..d88dc43 100644
--- a/Annex/Direct.hs
+++ b/Annex/Direct.hs
@@ -230,7 +230,7 @@ mergeDirectCommit allowff old branch commitmode = do
mergeDirectCleanup :: FilePath -> Git.Ref -> Annex ()
mergeDirectCleanup d oldref = do
- updateWorkTree d oldref
+ updateWorkTree d oldref False
liftIO $ removeDirectoryRecursive d
{- Updates the direct mode work tree to reflect the changes staged in the
@@ -247,8 +247,8 @@ mergeDirectCleanup d oldref = do
- order, but we cannot add the directory until the file with the
- same name is removed.)
-}
-updateWorkTree :: FilePath -> Git.Ref -> Annex ()
-updateWorkTree d oldref = do
+updateWorkTree :: FilePath -> Git.Ref -> Bool -> Annex ()
+updateWorkTree d oldref force = do
(items, cleanup) <- inRepo $ DiffTree.diffIndex oldref
makeabs <- flip fromTopFilePath <$> gitRepo
let fsitems = zip (map (makeabs . DiffTree.file) items) items
@@ -281,7 +281,7 @@ updateWorkTree d oldref = do
- Otherwise, create the symlink and then if possible, replace it
- with the content. -}
movein item makeabs k f = unlessM (goodContent k f) $ do
- preserveUnannexed item makeabs f oldref
+ unless force $ preserveUnannexed item makeabs f oldref
l <- calcRepo $ gitAnnexLink f k
replaceFile f $ makeAnnexLink l
toDirect k f
@@ -289,7 +289,7 @@ updateWorkTree d oldref = do
{- Any new, modified, or renamed files were written to the temp
- directory by the merge, and are moved to the real work tree. -}
movein_raw item makeabs f = do
- preserveUnannexed item makeabs f oldref
+ unless force $ preserveUnannexed item makeabs f oldref
liftIO $ do
createDirectoryIfMissing True $ parentDir f
void $ tryIO $ rename (d </> getTopFilePath (DiffTree.file item)) f
diff --git a/Annex/Ssh.hs b/Annex/Ssh.hs
index 4d54d72..e92232b 100644
--- a/Annex/Ssh.hs
+++ b/Annex/Ssh.hs
@@ -266,9 +266,9 @@ inRepoWithSshOptionsTo remote gc a =
- to set GIT_SSH=git-annex, and sets sshOptionsEnv. -}
sshOptionsTo :: Git.Repo -> RemoteGitConfig -> Git.Repo -> Annex Git.Repo
sshOptionsTo remote gc g
- | not (Git.repoIsUrl remote) || Git.repoIsHttp remote = uncached
+ | not (Git.repoIsUrl remote) || Git.repoIsHttp remote = unchanged
| otherwise = case Git.Url.hostuser remote of
- Nothing -> uncached
+ Nothing -> unchanged
Just host -> do
(msockfile, _) <- sshCachingInfo (host, Git.Url.port remote)
case msockfile of
@@ -277,17 +277,21 @@ sshOptionsTo remote gc g
prepSocket sockfile
use (sshConnectionCachingParams sockfile)
where
- uncached = return g
+ unchanged = return g
use opts = do
- let val = toSshOptionsEnv $ concat
+ let sshopts = concat
[ opts
, map Param (remoteAnnexSshOptions gc)
]
- command <- liftIO programPath
- liftIO $ do
- g' <- addGitEnv g sshOptionsEnv val
- addGitEnv g' "GIT_SSH" command
+ if null sshopts
+ then unchanged
+ else do
+ command <- liftIO programPath
+ liftIO $ do
+ g' <- addGitEnv g sshOptionsEnv
+ (toSshOptionsEnv sshopts)
+ addGitEnv g' "GIT_SSH" command
runSshOptions :: [String] -> String -> IO ()
runSshOptions args s = do
diff --git a/Annex/TaggedPush.hs b/Annex/TaggedPush.hs
index 642d4db..eff8d6e 100644
--- a/Annex/TaggedPush.hs
+++ b/Annex/TaggedPush.hs
@@ -45,7 +45,6 @@ fromTaggedBranch b = case split "/" $ Git.fromRef b of
("refs":"synced":u:_base) ->
Just (toUUID u, Nothing)
_ -> Nothing
- where
taggedPush :: UUID -> Maybe String -> Git.Ref -> Remote -> Git.Repo -> IO Bool
taggedPush u info branch remote = Git.Command.runBool
diff --git a/Assistant/Gpg.hs b/Assistant/Gpg.hs
index 39e5459..4fee005 100644
--- a/Assistant/Gpg.hs
+++ b/Assistant/Gpg.hs
@@ -5,8 +5,6 @@
- Licensed under the GNU AGPL version 3 or higher.
-}
-{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings #-}
-
module Assistant.Gpg where
import Utility.Gpg
diff --git a/Backend/Hash.hs b/Backend/Hash.hs
index ed9553b..f14af7b 100644
--- a/Backend/Hash.hs
+++ b/Backend/Hash.hs
@@ -1,10 +1,12 @@
-{- git-tnnex hashing backends
+{- git-annex hashing backends
-
- - Copyright 2011-2013 Joey Hess <id@joeyh.name>
+ - Copyright 2011-2015 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
+{-# LANGUAGE CPP #-}
+
module Backend.Hash (
backends,
testKeyBackend,
@@ -22,21 +24,30 @@ import qualified Build.SysConfig as SysConfig
import qualified Data.ByteString.Lazy as L
import Data.Char
-data Hash = SHAHash HashSize | SkeinHash HashSize | MD5Hash
+data Hash
+ = MD5Hash
+ | SHA1Hash
+ | SHA2Hash HashSize
+ | SHA3Hash HashSize
+ | SkeinHash HashSize
type HashSize = Int
{- Order is slightly significant; want SHA256 first, and more general
- sizes earlier. -}
hashes :: [Hash]
hashes = concat
- [ map SHAHash [256, 1, 512, 224, 384]
+ [ map SHA2Hash [256, 512, 224, 384]
+#ifdef WITH_CRYPTONITE
+ , map SHA3Hash [256, 512, 224, 384]
+#endif
, map SkeinHash [256, 512]
+ , [SHA1Hash]
, [MD5Hash]
]
{- The SHA256E backend is the default, so genBackendE comes first. -}
backends :: [Backend]
-backends = map genBackendE hashes ++ map genBackend hashes
+backends = concatMap (\h -> [genBackendE h, genBackend h]) hashes
genBackend :: Hash -> Backend
genBackend hash = Backend
@@ -55,9 +66,11 @@ genBackendE hash = (genBackend hash)
}
hashName :: Hash -> String
-hashName (SHAHash size) = "SHA" ++ show size
-hashName (SkeinHash size) = "SKEIN" ++ show size
hashName MD5Hash = "MD5"
+hashName SHA1Hash = "SHA1"
+hashName (SHA2Hash size) = "SHA" ++ show size
+hashName (SHA3Hash size) = "SHA3_" ++ show size
+hashName (SkeinHash size) = "SKEIN" ++ show size
hashNameE :: Hash -> String
hashNameE hash = hashName hash ++ "E"
@@ -153,7 +166,15 @@ trivialMigrate oldkey newbackend afile
hashFile :: Hash -> FilePath -> Integer -> Annex String
hashFile hash file filesize = go hash
where
- go (SHAHash hashsize) = case shaHasher hashsize filesize of
+ go MD5Hash = use md5Hasher
+ go SHA1Hash = usehasher 1
+ go (SHA2Hash hashsize) = usehasher hashsize
+ go (SHA3Hash hashsize) = use (sha3Hasher hashsize)
+ go (SkeinHash hashsize) = use (skeinHasher hashsize)
+
+ use hasher = liftIO $ hasher <$> L.readFile file
+
+ usehasher hashsize = case shaHasher hashsize filesize of
Left sha -> use sha
Right (external, internal) -> do
v <- liftIO $ externalSHA external hashsize file
@@ -164,19 +185,15 @@ hashFile hash file filesize = go hash
-- fall back to internal since
-- external command failed
use internal
- go (SkeinHash hashsize) = use (skeinHasher hashsize)
- go MD5Hash = use md5Hasher
-
- use hasher = liftIO $ hasher <$> L.readFile file
shaHasher :: HashSize -> Integer -> Either (L.ByteString -> String) (String, L.ByteString -> String)
shaHasher hashsize filesize
| hashsize == 1 = use SysConfig.sha1 sha1
- | hashsize == 256 = use SysConfig.sha256 sha256
- | hashsize == 224 = use SysConfig.sha224 sha224
- | hashsize == 384 = use SysConfig.sha384 sha384
- | hashsize == 512 = use SysConfig.sha512 sha512
- | otherwise = error $ "unsupported sha size " ++ show hashsize
+ | hashsize == 256 = use SysConfig.sha256 sha2_256
+ | hashsize == 224 = use SysConfig.sha224 sha2_224
+ | hashsize == 384 = use SysConfig.sha384 sha2_384
+ | hashsize == 512 = use SysConfig.sha512 sha2_512
+ | otherwise = error $ "unsupported SHA size " ++ show hashsize
where
use Nothing hasher = Left $ usehasher hasher
use (Just c) hasher
@@ -189,11 +206,21 @@ shaHasher hashsize filesize
| otherwise = Right (c, usehasher hasher)
usehasher hasher = show . hasher
+sha3Hasher :: HashSize -> (L.ByteString -> String)
+sha3Hasher hashsize
+#ifdef WITH_CRYPTONITE
+ | hashsize == 256 = show . sha3_256
+ | hashsize == 224 = show . sha3_224
+ | hashsize == 384 = show . sha3_384
+ | hashsize == 512 = show . sha3_512
+#endif
+ | otherwise = error $ "unsupported SHA3 size " ++ show hashsize
+
skeinHasher :: HashSize -> (L.ByteString -> String)
skeinHasher hashsize
| hashsize == 256 = show . skein256
| hashsize == 512 = show . skein512
- | otherwise = error $ "unsupported skein size " ++ show hashsize
+ | otherwise = error $ "unsupported SKEIN size " ++ show hashsize
md5Hasher :: L.ByteString -> String
md5Hasher = show . md5
@@ -207,7 +234,7 @@ md5Hasher = show . md5
-}
testKeyBackend :: Backend
testKeyBackend =
- let b = genBackendE (SHAHash 256)
+ let b = genBackendE (SHA2Hash 256)
in b { getKey = (fmap addE) <$$> getKey b }
where
addE k = k { keyName = keyName k ++ longext }
diff --git a/CHANGELOG b/CHANGELOG
index 740e7e0..c43a3e8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,46 @@
+git-annex (5.20150812) unstable; urgency=medium
+
+ * Added support for SHA3 hashed keys (in 8 varieties), when git-annex is
+ built using the cryptonite library.
+ * metadata: Fix reversion introduced in 5.20150727 that caused recursive
+ display of metadata to not work.
+ * Windows: Fix bug that caused git-annex sync to fail due to missing
+ environment variable.
+ * Fix setting/setting/viewing metadata that contains unicode or other
+ special characters, when in a non-unicode locale.
+ * Simplify setup process for a ssh remote. Now it suffices to run git
+ remote add, followed by git-annex sync. Now the remote is automatically
+ initialized for use by git-annex, where before the git-annex branch had
+ to manually be pushed before using git-annex sync. Note that this
+ involved changes to git-annex-shell, so if the remote is using an old
+ version, the manual push is still needed.
+ * git-annex-shell: Don't let configlist auto-init repository when in
+ readonly mode.
+ * Perform a clean shutdown when --time-limit is reached.
+ This includes running queued git commands, and cleanup actions normally
+ run when a command is finished.
+ * fsck: Commit incremental fsck database when --time-limit is reached.
+ Previously, some of the last files fscked did not make it into the
+ database when using --time-limit.
+ * fsck: Commit incremental fsck database after every 1000 files
+ fscked, or every 5 minutes, whichever comes first. Previously,
+ commits were made every 1000 files fscked.
+ * Linux standalone: Work around problem that prevented it from working
+ properly if unpacked into a directory that contains ":" or ";" in its
+ name.
+ * proxy: Fix proxy git commit of non-annexed files in direct mode.
+ * proxy: If a non-proxied git command, such as git revert
+ would normally fail because of unstaged files in the work tree,
+ make the proxied command fail the same way.
+ * proxy: Fix removal of files deleted by the proxied command.
+ * proxy: Fix behavior when run in subdirectory of git repo.
+ * Improve Setup.hs file so that cabal copy --destdir works.
+ Thanks, Magnus Therning.
+ * Tighten dependency on optparse-applicative to 0.11.0.
+ * Added back debian/cabal-wrapper, since it still seems needed after all.
+
+ -- Joey Hess <id@joeyh.name> Wed, 12 Aug 2015 11:14:58 -0400
+
git-annex (5.20150731) unstable; urgency=medium
* webapp: Support enabling known gitlab.com remotes.
diff --git a/CmdLine.hs b/CmdLine.hs
index 492a3b7..a512d86 100644
--- a/CmdLine.hs
+++ b/CmdLine.hs
@@ -5,29 +5,22 @@
- Licensed under the GNU GPL version 3 or higher.
-}
-{-# LANGUAGE CPP #-}
-
module CmdLine (
dispatch,
usage,
- shutdown
) where
import qualified Options.Applicative as O
import qualified Options.Applicative.Help as H
import qualified Control.Exception as E
-import qualified Data.Map as M
import Control.Exception (throw)
-#ifndef mingw32_HOST_OS
-import System.Posix.Signals
-#endif
import Common.Annex
import qualified Annex
import qualified Git
import qualified Git.AutoCorrect
import qualified Git.Config
-import Annex.Content
+import Annex.Action
import Annex.Environment
import Command
import Types.Messages
@@ -117,19 +110,3 @@ findCmd fuzzyok argv cmds
inexactcmds = case name of
Nothing -> []
Just n -> Git.AutoCorrect.fuzzymatches n cmdname cmds
-
-{- Actions to perform each time ran. -}
-startup :: Annex ()
-startup =
-#ifndef mingw32_HOST_OS
- liftIO $ void $ installHandler sigINT Default Nothing
-#else
- return ()
-#endif
-
-{- Cleanup actions. -}
-shutdown :: Bool -> Annex ()
-shutdown nocommit = do
- saveState nocommit
- sequence_ =<< M.elems <$> Annex.getState Annex.cleanup
- liftIO reapZombies -- zombies from long-running git processes
diff --git a/CmdLine/GitAnnexShell.hs b/CmdLine/GitAnnexShell.hs
index 074257a..59c8615 100644
--- a/CmdLine/GitAnnexShell.hs
+++ b/CmdLine/GitAnnexShell.hs
@@ -7,8 +7,6 @@
module CmdLine.GitAnnexShell where
-import System.Environment
-
import Common.Annex
import qualified Git.Construct
import qualified Git.Config
@@ -16,11 +14,9 @@ import CmdLine
import CmdLine.GlobalSetter
import Command
import Annex.UUID
+import CmdLine.GitAnnexShell.Checks
import CmdLine.GitAnnexShell.Fields
-import Utility.UserInfo
import Remote.GCrypt (getGCryptUUID)
-import qualified Annex
-import Annex.Init
import qualified Command.ConfigList
import qualified Command.InAnnex
@@ -34,7 +30,7 @@ import qualified Command.GCryptSetup
cmds_readonly :: [Command]
cmds_readonly =
- [ gitAnnexShellCheck Command.ConfigList.cmd
+ [ Command.ConfigList.cmd
, gitAnnexShellCheck Command.InAnnex.cmd
, gitAnnexShellCheck Command.SendKey.cmd
, gitAnnexShellCheck Command.TransferInfo.cmd
@@ -96,7 +92,8 @@ builtins = map cmdname cmds
builtin :: String -> String -> [String] -> IO ()
builtin cmd dir params = do
- checkNotReadOnly cmd
+ unless (cmd `elem` map cmdname cmds_readonly)
+ checkNotReadOnly
checkDirectory $ Just dir
let (params', fieldparams, opts) = partitionParams params
rsyncopts = ("RsyncOptions", unwords opts)
@@ -146,63 +143,10 @@ checkField (field, val)
| field == fieldName remoteUUID = fieldCheck remoteUUID val
| field == fieldName associatedFile = fieldCheck associatedFile val
| field == fieldName direct = fieldCheck direct val
+ | field == fieldName autoInit = fieldCheck autoInit val
| otherwise = False
failure :: IO ()
failure = error $ "bad parameters\n\n" ++ usage h cmds
where
h = "git-annex-shell [-c] command [parameters ...] [option ...]"
-
-checkNotLimited :: IO ()
-checkNotLimited = checkEnv "GIT_ANNEX_SHELL_LIMITED"
-
-checkNotReadOnly :: String -> IO ()
-checkNotReadOnly cmd
- | cmd `elem` map cmdname cmds_readonly = noop
- | otherwise = checkEnv "GIT_ANNEX_SHELL_READONLY"
-
-checkDirectory :: Maybe FilePath -> IO ()
-checkDirectory mdir = do
- v <- catchMaybeIO $ getEnv "GIT_ANNEX_SHELL_DIRECTORY"
- case (v, mdir) of
- (Nothing, _) -> noop
- (Just d, Nothing) -> req d Nothing
- (Just d, Just dir)
- | d `equalFilePath` dir -> noop
- | otherwise -> do
- home <- myHomeDir
- d' <- canondir home d
- dir' <- canondir home dir
- if d' `equalFilePath` dir'
- then noop
- else req d' (Just dir')
- where
- req d mdir' = error $ unwords
- [ "Only allowed to access"
- , d
- , maybe "and could not determine directory from command line" ("not " ++) mdir'
- ]
-
- {- A directory may start with ~/ or in some cases, even /~/,
- - or could just be relative to home, or of course could
- - be absolute. -}
- canondir home d
- | "~/" `isPrefixOf` d = return d
- | "/~/" `isPrefixOf` d = return $ drop 1 d
- | otherwise = relHome $ absPathFrom home d
-
-checkEnv :: String -> IO ()
-checkEnv var = do
- v <- catchMaybeIO $ getEnv var
- case v of
- Nothing -> noop
- Just "" -> noop
- Just _ -> error $ "Action blocked by " ++ var
-
-{- Modifies a Command to check that it is run in either a git-annex
- - repository, or a repository with a gcrypt-id set. -}
-gitAnnexShellCheck :: Command -> Command
-gitAnnexShellCheck = addCheck okforshell . dontCheck repoExists
- where
- okforshell = unlessM (isInitialized <||> isJust . gcryptId <$> Annex.getGitConfig) $
- error "Not a git-annex or gcrypt repository."
diff --git a/CmdLine/GitAnnexShell/Checks.hs b/CmdLine/GitAnnexShell/Checks.hs
new file mode 100644
index 0000000..5513d69
--- /dev/null
+++ b/CmdLine/GitAnnexShell/Checks.hs
@@ -0,0 +1,67 @@
+{- git-annex-shell checks
+ -
+ - Copyright 2012 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module CmdLine.GitAnnexShell.Checks where
+
+import Common.Annex
+import Command
+import qualified Annex
+import Annex.Init
+import Utility.UserInfo
+import Utility.Env
+
+checkNotLimited :: IO ()
+checkNotLimited = checkEnv "GIT_ANNEX_SHELL_LIMITED"
+
+checkNotReadOnly :: IO ()
+checkNotReadOnly = checkEnv "GIT_ANNEX_SHELL_READONLY"
+
+checkEnv :: String -> IO ()
+checkEnv var = do
+ v <- getEnv var
+ case v of
+ Nothing -> noop
+ Just "" -> noop
+ Just _ -> error $ "Action blocked by " ++ var
+
+checkDirectory :: Maybe FilePath -> IO ()
+checkDirectory mdir = do
+ v <- getEnv "GIT_ANNEX_SHELL_DIRECTORY"
+ case (v, mdir) of
+ (Nothing, _) -> noop
+ (Just d, Nothing) -> req d Nothing
+ (Just d, Just dir)
+ | d `equalFilePath` dir -> noop
+ | otherwise -> do
+ home <- myHomeDir
+ d' <- canondir home d
+ dir' <- canondir home dir
+ if d' `equalFilePath` dir'
+ then noop
+ else req d' (Just dir')
+ where
+ req d mdir' = error $ unwords
+ [ "Only allowed to access"
+ , d
+ , maybe "and could not determine directory from command line" ("not " ++) mdir'
+ ]
+
+ {- A directory may start with ~/ or in some cases, even /~/,
+ - or could just be relative to home, or of course could
+ - be absolute. -}
+ canondir home d
+ | "~/" `isPrefixOf` d = return d
+ | "/~/" `isPrefixOf` d = return $ drop 1 d
+ | otherwise = relHome $ absPathFrom home d
+
+{- Modifies a Command to check that it is run in either a git-annex
+ - repository, or a repository with a gcrypt-id set. -}
+gitAnnexShellCheck :: Command -> Command
+gitAnnexShellCheck = addCheck okforshell . dontCheck repoExists
+ where
+ okforshell = unlessM (isInitialized <||> isJust . gcryptId <$> Annex.getGitConfig) $
+ error "Not a git-annex or gcrypt repository."
diff --git a/CmdLine/GitAnnexShell/Fields.hs b/CmdLine/GitAnnexShell/Fields.hs
index 93b0480..bc26df7 100644
--- a/CmdLine/GitAnnexShell/Fields.hs
+++ b/CmdLine/GitAnnexShell/Fields.hs
@@ -34,3 +34,6 @@ associatedFile = Field "associatedfile" $ \f ->
direct :: Field
direct = Field "direct" $ \f -> f == "1"
+
+autoInit :: Field
+autoInit = Field "autoinit" $ \f -> f == "1"
diff --git a/CmdLine/Seek.hs b/CmdLine/Seek.hs
index e67c3b9..8d253e4 100644
--- a/CmdLine/Seek.hs
+++ b/CmdLine/Seek.hs
@@ -33,11 +33,11 @@ withFilesInGit :: (FilePath -> CommandStart) -> CmdParams -> CommandSeek
withFilesInGit a params = seekActions $ prepFiltered a $
seekHelper LsFiles.inRepo params
-withFilesInGitNonRecursive :: (FilePath -> CommandStart) -> CmdParams -> CommandSeek
-withFilesInGitNonRecursive a params = ifM (Annex.getState Annex.force)
+withFilesInGitNonRecursive :: String -> (FilePath -> CommandStart) -> CmdParams -> CommandSeek
+withFilesInGitNonRecursive needforce a params = ifM (Annex.getState Annex.force)
( withFilesInGit a params
, if null params
- then needforce
+ then error needforce
else seekActions $ prepFiltered a (getfiles [] params)
)
where
@@ -51,8 +51,7 @@ withFilesInGitNonRecursive a params = ifM (Annex.getState Annex.force)
[] -> do
void $ liftIO $ cleanup
getfiles c ps
- _ -> needforce
- needforce = error "Not recursively setting metadata. Use --force to do that."
+ _ -> error needforce
withFilesNotInGit :: Bool -> (FilePath -> CommandStart) -> CmdParams -> CommandSeek
withFilesNotInGit skipdotfiles a params
diff --git a/Command/ConfigList.hs b/Command/ConfigList.hs
index 95498ba..46c9091 100644
--- a/Command/ConfigList.hs
+++ b/Command/ConfigList.hs
@@ -14,9 +14,11 @@ import Annex.Init
import qualified Annex.Branch
import qualified Git.Config
import Remote.GCrypt (coreGCryptId)
+import qualified CmdLine.GitAnnexShell.Fields as Fields
+import CmdLine.GitAnnexShell.Checks
cmd :: Command
-cmd = noCommit $
+cmd = noCommit $ dontCheck repoExists $
command "configlist" SectionPlumbing
"outputs relevant git configuration"
paramNothing (withParams seek)
@@ -34,14 +36,16 @@ start = do
showConfig k v = liftIO $ putStrLn $ k ++ "=" ++ v
{- The repository may not yet have a UUID; automatically initialize it
- - when there's a git-annex branch available. -}
+ - when there's a git-annex branch available or if the autoinit field was
+ - set. -}
findOrGenUUID :: Annex UUID
findOrGenUUID = do
u <- getUUID
if u /= NoUUID
then return u
- else ifM Annex.Branch.hasSibling
+ else ifM (Annex.Branch.hasSibling <||> (isJust <$> Fields.getField Fields.autoInit))
( do
+ liftIO checkNotReadOnly
initialize Nothing
getUUID
, return NoUUID
diff --git a/Command/Fsck.hs b/Command/Fsck.hs
index a201c45..c3b73ed 100644
--- a/Command/Fsck.hs
+++ b/Command/Fsck.hs
@@ -457,18 +457,12 @@ runFsck inc file key a = ifM (needFsck inc key)
{- Check if a key needs to be fscked, with support for incremental fscks. -}
needFsck :: Incremental -> Key -> Annex Bool
+needFsck (ScheduleIncremental _ _ i) k = needFsck i k
#ifdef WITH_DATABASE
needFsck (ContIncremental h) key = liftIO $ not <$> FsckDb.inDb h key
#endif
needFsck _ _ = return True
-#ifdef WITH_DATABASE
-withFsckDb :: Incremental -> (FsckDb.FsckHandle -> Annex ()) -> Annex ()
-withFsckDb (ContIncremental h) a = a h
-withFsckDb (StartIncremental h) a = a h
-withFsckDb NonIncremental _ = noop
-#endif
-
recordFsckTime :: Incremental -> Key -> Annex ()
#ifdef WITH_DATABASE
recordFsckTime inc key = withFsckDb inc $ \h -> liftIO $ FsckDb.addDb h key
@@ -527,7 +521,8 @@ data Incremental
= NonIncremental
#ifdef WITH_DATABASE
| StartIncremental FsckDb.FsckHandle
- | ContIncremental FsckDb.FsckHandle
+ | ContIncremental FsckDb.FsckHandle
+ | ScheduleIncremental Duration UUID Incremental
#endif
prepIncremental :: UUID -> Maybe IncrementalOpt -> Annex Incremental
@@ -536,31 +531,44 @@ prepIncremental _ Nothing = pure NonIncremental
prepIncremental u (Just StartIncrementalO) = do
recordStartTime u
ifM (FsckDb.newPass u)
- ( StartIncremental <$> FsckDb.openDb u
+ ( StartIncremental <$> openFsckDb u
, error "Cannot start a new --incremental fsck pass; another fsck process is already running."
)
prepIncremental u (Just MoreIncrementalO) =
- ContIncremental <$> FsckDb.openDb u
+ ContIncremental <$> openFsckDb u
prepIncremental u (Just (ScheduleIncrementalO delta)) = do
- Annex.addCleanup FsckCleanup $ do
- v <- getStartTime u
- case v of
- Nothing -> noop
- Just started -> do
- now <- liftIO getPOSIXTime
- when (now - realToFrac started >= durationToPOSIXTime delta) $
- resetStartTime u
started <- getStartTime u
- prepIncremental u $ Just $ case started of
+ i <- prepIncremental u $ Just $ case started of
Nothing -> StartIncrementalO
Just _ -> MoreIncrementalO
+ return (ScheduleIncremental delta u i)
#else
prepIncremental _ _ = error "This git-annex was not built with database support; incremental fsck not supported"
#endif
cleanupIncremental :: Incremental -> Annex ()
-#ifdef WITH_DATABASE
-cleanupIncremental i = withFsckDb i FsckDb.closeDb
-#else
+cleanupIncremental (ScheduleIncremental delta u i) = do
+ v <- getStartTime u
+ case v of
+ Nothing -> noop
+ Just started -> do
+ now <- liftIO getPOSIXTime
+ when (now - realToFrac started >= durationToPOSIXTime delta) $
+ resetStartTime u
+ cleanupIncremental i
cleanupIncremental _ = return ()
+
+#ifdef WITH_DATABASE
+openFsckDb :: UUID -> Annex FsckDb.FsckHandle
+openFsckDb u = do
+ h <- FsckDb.openDb u
+ Annex.addCleanup FsckCleanup $
+ FsckDb.closeDb h
+ return h
+
+withFsckDb :: Incremental -> (FsckDb.FsckHandle -> Annex ()) -> Annex ()
+withFsckDb (ContIncremental h) a = a h
+withFsckDb (StartIncremental h) a = a h
+withFsckDb NonIncremental _ = noop
+withFsckDb (ScheduleIncremental _ _ i) a = withFsckDb i a
#endif
diff --git a/Command/MetaData.hs b/Command/MetaData.hs
index b0076b4..788c0f2 100644
--- a/Command/MetaData.hs
+++ b/Command/MetaData.hs
@@ -27,12 +27,12 @@ data MetaDataOptions = MetaDataOptions
, keyOptions :: Maybe KeyOptions
}
-data GetSet = Get MetaField | Set [ModMeta]
+data GetSet = Get MetaField | GetAll | Set [ModMeta]
optParser :: CmdParamsDesc -> Parser MetaDataOptions
optParser desc = MetaDataOptions
<$> cmdParams desc
- <*> ((Get <$> getopt) <|> (Set <$> many modopts))
+ <*> ((Get <$> getopt) <|> (Set <$> some modopts) <|> pure GetAll)
<*> optional (parseKeyOptions False)
where
getopt = option (eitherReader mkMetaField)
@@ -57,7 +57,9 @@ seek o = do
now <- liftIO getPOSIXTime
let seeker = case getSet o of
Get _ -> withFilesInGit
+ GetAll -> withFilesInGit
Set _ -> withFilesInGitNonRecursive
+ "Not recursively setting metadata. Use --force to do that."
withKeyOptions (keyOptions o) False
(startKeys now o)
(seeker $ whenAnnexed $ start now o)
@@ -71,23 +73,24 @@ startKeys = start' Nothing
start' :: AssociatedFile -> POSIXTime -> MetaDataOptions -> Key -> CommandStart
start' afile now o k = case getSet o of
- Set ms -> do
- showStart' "metadata" k afile
- next $ perform now ms k
Get f -> do
l <- S.toList . currentMetaDataValues f <$> getCurrentMetaData k
liftIO $ forM_ l $
putStrLn . fromMetaValue
stop
+ _ -> do
+ showStart' "metadata" k afile
+ next $ perform now o k
+
+perform :: POSIXTime -> MetaDataOptions -> Key -> CommandPerform
+perform now o k = case getSet o of
+ Set ms -> do
+ oldm <- getCurrentMetaData k
+ let m = combineMetaData $ map (modMeta oldm) ms
+ addMetaData' k m now
+ next $ cleanup k
+ _ -> next $ cleanup k
-perform :: POSIXTime -> [ModMeta] -> Key -> CommandPerform
-perform _ [] k = next $ cleanup k
-perform now ms k = do
- oldm <- getCurrentMetaData k
- let m = combineMetaData $ map (modMeta oldm) ms
- addMetaData' k m now
- next $ cleanup k
-
cleanup :: Key -> CommandCleanup
cleanup k = do
l <- map unwrapmeta . fromMetaData <$> getCurrentMetaData k
diff --git a/Command/Proxy.hs b/Command/Proxy.hs
index 3c487b9..a99e1f4 100644
--- a/Command/Proxy.hs
+++ b/Command/Proxy.hs
@@ -13,9 +13,13 @@ import Config
import Utility.Tmp
import Utility.Env
import Annex.Direct
+import qualified Git
import qualified Git.Sha
import qualified Git.Ref
import qualified Git.Branch
+import qualified Git.LsFiles
+import Git.FilePath
+import Utility.CopyFile
cmd :: Command
cmd = notBareRepo $
@@ -37,13 +41,41 @@ start (c:ps) = liftIO . exitWith =<< ifM isDirect
where
go tmp = do
oldref <- fromMaybe Git.Sha.emptyTree
- <$> inRepo Git.Ref.headSha
+ <$> (inRepo . maybe Git.Ref.headSha Git.Ref.sha
+ =<< inRepo Git.Branch.currentUnsafe)
+
exitcode <- proxy tmp
- mergeDirectCleanup tmp oldref
+
+ cleanupproxy tmp oldref
+
return exitcode
+
proxy tmp = do
usetmp <- liftIO $ Just . addEntry "GIT_WORK_TREE" tmp <$> getEnvironment
+
+ -- Set up the tmp work tree, to contain both a checkout of all
+ -- staged files as well as hard links (or copies) of any
+ -- unstaged files.
unlessM (isNothing <$> inRepo Git.Branch.current) $
unlessM (liftIO $ boolSystemEnv "git" [Param "checkout", Param "--", Param "."] usetmp) $
error "Failed to set up proxy work tree."
+ top <- fromRepo Git.repoPath
+ (fs, cleanup) <- inRepo $ Git.LsFiles.notInRepo True [top]
+ forM_ fs $ \f -> do
+ tf <- inRepo $ toTopFilePath f
+ let tmpf = tmp </> getTopFilePath tf
+ liftIO $ do
+ createDirectoryIfMissing True (takeDirectory tmpf)
+ createLinkOrCopy f tmpf
+ liftIO $ void cleanup
+
liftIO $ safeSystemEnv c (map Param ps) usetmp
+
+ -- To merge the changes made by the proxied command into
+ -- the work tree is similar to cleaning up after a
+ -- direct mode merge. But, here we force updates of any
+ -- non-annxed files that were changed by the proxied
+ -- command.
+ cleanupproxy tmp oldref = do
+ updateWorkTree tmp oldref True
+ liftIO $ removeDirectoryRecursive tmp
diff --git a/Command/RecvKey.hs b/Command/RecvKey.hs
index a49efce..cb24dbb 100644
--- a/Command/RecvKey.hs
+++ b/Command/RecvKey.hs
@@ -9,8 +9,8 @@ module Command.RecvKey where
import Common.Annex
import Command
-import CmdLine
import Annex.Content
+import Annex.Action
import Annex
import Utility.Rsync
import Logs.Transfer
diff --git a/Command/Sync.hs b/Command/Sync.hs
index 3411c94..9a24175 100644
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -137,19 +137,24 @@ remoteBranch :: Remote -> Git.Ref -> Git.Ref
remoteBranch remote = Git.Ref.underBase $ "refs/remotes/" ++ Remote.name remote
syncRemotes :: [String] -> Annex [Remote]
-syncRemotes rs = ifM (Annex.getState Annex.fast) ( nub <$> pickfast , wanted )
+syncRemotes ps = do
+ -- Get remote list first, doing automatic initialization
+ -- of remotes when possible.
+ syncRemotes' ps =<< Remote.remoteList' True
+
+syncRemotes' :: [String] -> [Remote] -> Annex [Remote]
+syncRemotes' ps remotelist = ifM (Annex.getState Annex.fast) ( nub <$> pickfast , wanted )
where
- pickfast = (++) <$> listed <*> (filterM good =<< fastest <$> available)
+ pickfast = (++) <$> listed <*> (filterM good (fastest available))
wanted
- | null rs = filterM good =<< concat . Remote.byCost <$> available
+ | null ps = filterM good (concat $ Remote.byCost available)
| otherwise = listed
- listed = concat <$> mapM Remote.byNameOrGroup rs
+ listed = concat <$> mapM Remote.byNameOrGroup ps
available = filter (remoteAnnexSync . Remote.gitconfig)
- . filter (not . Remote.isXMPPRemote)
- <$> Remote.remoteList
+ $ filter (not . Remote.isXMPPRemote) remotelist
good r
| Remote.gitSyncableRemote r = Remote.Git.repoAvail $ Remote.repo r
diff --git a/Database/Fsck.hs b/Database/Fsck.hs
index d941692..20b4878 100644
--- a/Database/Fsck.hs
+++ b/Database/Fsck.hs
@@ -34,6 +34,7 @@ import Annex.LockFile
import Database.Persist.TH
import Database.Esqueleto hiding (Key)
+import Data.Time.Clock
data FsckHandle = FsckHandle H.DbHandle UUID
@@ -84,11 +85,18 @@ closeDb (FsckHandle h u) = do
unlockFile =<< fromRepo (gitAnnexFsckDbLock u)
addDb :: FsckHandle -> Key -> IO ()
-addDb (FsckHandle h _) k = H.queueDb h 1000 $
+addDb (FsckHandle h _) k = H.queueDb h checkcommit $
void $ insertUnique $ Fscked sk
where
sk = toSKey k
+ -- commit queue after 1000 files or 5 minutes, whichever comes first
+ checkcommit sz lastcommittime
+ | sz > 1000 = return True
+ | otherwise = do
+ now <- getCurrentTime
+ return $ diffUTCTime lastcommittime now > 300
+
inDb :: FsckHandle -> Key -> IO Bool
inDb (FsckHandle h _) = H.queryDb h . inDb' . toSKey
diff --git a/Database/Handle.hs b/Database/Handle.hs
index dc3363e..1fd9f78 100644
--- a/Database/Handle.hs
+++ b/Database/Handle.hs
@@ -20,6 +20,7 @@ module Database.Handle (
) where
import Utility.Exception
+import Utility.Monad
import Messages
import Database.Persist.Sqlite
@@ -33,6 +34,7 @@ import qualified Data.Text as T
import Control.Monad.Trans.Resource (runResourceT)
import Control.Monad.Logger (runNoLoggingT)
import Data.List
+import Data.Time.Clock
{- A DbHandle is a reference to a worker thread that communicates with
- the database. It has a MVar which Jobs are submitted to. -}
@@ -64,7 +66,7 @@ openDb :: FilePath -> TableName -> IO DbHandle
openDb db tablename = do
jobs <- newEmptyMVar
worker <- async (workerThread (T.pack db) tablename jobs)
- q <- newMVar emptyDbQueue
+ q <- newMVar =<< emptyDbQueue
return $ DbHandle worker jobs q
data Job
@@ -145,16 +147,19 @@ closeDb h@(DbHandle worker jobs _) = do
type Size = Int
+type LastCommitTime = UTCTime
+
{- A queue of actions to perform, with a count of the number of actions
- - queued. -}
-data DbQueue = DbQueue Size (SqlPersistM ())
+ - queued, and a last commit time. -}
+data DbQueue = DbQueue Size LastCommitTime (SqlPersistM ())
-emptyDbQueue :: DbQueue
-emptyDbQueue = DbQueue 0 (return ())
+emptyDbQueue :: IO DbQueue
+emptyDbQueue = do
+ now <- getCurrentTime
+ return $ DbQueue 0 now (return ())
{- Queues a change to be made to the database. It will be buffered
- - to be committed later, unless the queue gets larger than the specified
- - size.
+ - to be committed later, unless the commitchecker action returns true.
-
- (Be sure to call closeDb or flushQueueDb to ensure the change
- gets committed.)
@@ -164,25 +169,32 @@ emptyDbQueue = DbQueue 0 (return ())
- process, the transaction is put back in the queue. This solves
- the sqlite multiple writer problem.
-}
-queueDb :: DbHandle -> Size -> SqlPersistM () -> IO ()
-queueDb h@(DbHandle _ _ qvar) maxsz a = do
- DbQueue sz qa <- takeMVar qvar
+queueDb
+ :: DbHandle
+ -> (Size -> LastCommitTime -> IO Bool)
+ -> SqlPersistM ()
+ -> IO ()
+queueDb h@(DbHandle _ _ qvar) commitchecker a = do
+ DbQueue sz lastcommittime qa <- takeMVar qvar
let !sz' = sz + 1
let qa' = qa >> a
- let enqueue newsz = putMVar qvar (DbQueue newsz qa')
- if sz' > maxsz
- then do
+ let enqueue = putMVar qvar
+ ifM (commitchecker sz' lastcommittime)
+ ( do
r <- commitDb h qa'
case r of
- Left _ -> enqueue 0
- Right _ -> putMVar qvar emptyDbQueue
- else enqueue sz'
+ Left _ -> enqueue $ DbQueue sz' lastcommittime qa'
+ Right _ -> do
+ now <- getCurrentTime
+ enqueue $ DbQueue 0 now (return ())
+ , enqueue $ DbQueue sz' lastcommittime qa'
+ )
{- If flushing the queue fails, this could be because there is another
- writer to the database. Retry repeatedly for up to 10 seconds. -}
flushQueueDb :: DbHandle -> IO ()
flushQueueDb h@(DbHandle _ _ qvar) = do
- DbQueue sz qa <- takeMVar qvar
+ DbQueue sz _ qa <- takeMVar qvar
when (sz > 0) $
robustly Nothing 100 (commitDb h qa)
where
diff --git a/Git/UnionMerge.hs b/Git/UnionMerge.hs
index 26bb3d3..bb42e7c 100644
--- a/Git/UnionMerge.hs
+++ b/Git/UnionMerge.hs
@@ -93,7 +93,7 @@ mergeFile info file h repo = case filter (/= nullSha) [Ref asha, Ref bsha] of
-- FileSystemEncoding for this is a hack, but ensures there
-- are no decoding errors. Note that this works because
-- hashObject sets fileEncoding on its write handle.
- getcontents s = lines . encodeW8 . L.unpack <$> catObject h s
+ getcontents s = lines . encodeW8NUL . L.unpack <$> catObject h s
{- Calculates a union merge between a list of refs, with contents.
-
diff --git a/Limit.hs b/Limit.hs
index da9b6a1..6930ab0 100644
--- a/Limit.hs
+++ b/Limit.hs
@@ -13,6 +13,7 @@ import qualified Utility.Matcher
import qualified Remote
import qualified Backend
import Annex.Content
+import Annex.Action
import Annex.UUID
import Logs.Trust
import Annex.NumCopies
@@ -271,6 +272,7 @@ addTimeLimit s = do
if now > cutoff
then do
warning $ "Time limit (" ++ s ++ ") reached!"
+ shutdown True
liftIO $ exitWith $ ExitFailure 101
else return True
diff --git a/Makefile b/Makefile
index aac9a3a..bc027fc 100644
--- a/Makefile
+++ b/Makefile
@@ -212,7 +212,7 @@ android: Build/EvilSplicer
# and not overwritten.)
cp -uR tmp/splices/* tmp/androidtree || true
# Some additional dependencies needed by the expanded splices.
- sed -i 's/^ Build-Depends: */ Build-Depends: yesod-core, shakespeare, blaze-markup, file-embed, wai-app-static, wai, unordered-containers, /' tmp/androidtree/git-annex.cabal
+ sed -i 's/^ Build-Depends: */ Build-Depends: yesod-core, yesod-routes, shakespeare, blaze-markup, file-embed, wai-app-static, wai, unordered-containers, /' tmp/androidtree/git-annex.cabal
# Avoid warnings due to sometimes unused imports added for the splices.
sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/androidtree/git-annex.cabal
sed -i 's/Extensions: /Extensions: MagicHash /i' tmp/androidtree/git-annex.cabal
diff --git a/Remote.hs b/Remote.hs
index d425fc9..57a22f3 100644
--- a/Remote.hs
+++ b/Remote.hs
@@ -20,6 +20,7 @@ module Remote (
remoteTypes,
remoteList,
+ remoteList',
gitSyncableRemote,
remoteMap,
remoteMap',
diff --git a/Remote/BitTorrent.hs b/Remote/BitTorrent.hs
index a4ec11b..d3963a9 100644
--- a/Remote/BitTorrent.hs
+++ b/Remote/BitTorrent.hs
@@ -43,8 +43,8 @@ remote = RemoteType {
}
-- There is only one bittorrent remote, and it always exists.
-list :: Annex [Git.Repo]
-list = do
+list :: Bool -> Annex [Git.Repo]
+list _autoinit = do
r <- liftIO $ Git.Construct.remoteNamed "bittorrent" (pure Git.Construct.fromUnknown)
return [r]
diff --git a/Remote/Bup.hs b/Remote/Bup.hs
index 0c15634..a253b08 100644
--- a/Remote/Bup.hs
+++ b/Remote/Bup.hs
@@ -36,7 +36,7 @@ type BupRepo = String
remote :: RemoteType
remote = RemoteType {
typename = "bup",
- enumerate = findSpecialRemotes "buprepo",
+ enumerate = const (findSpecialRemotes "buprepo"),
generate = gen,
setup = bupSetup
}
@@ -270,7 +270,7 @@ bup2GitRemote r
bupRef :: Key -> String
bupRef k
| Git.Ref.legal True shown = shown
- | otherwise = "git-annex-" ++ show (sha256 (fromString shown))
+ | otherwise = "git-annex-" ++ show (sha2_256 (fromString shown))
where
shown = key2file k
diff --git a/Remote/Ddar.hs b/Remote/Ddar.hs
index a249609..b616093 100644
--- a/Remote/Ddar.hs
+++ b/Remote/Ddar.hs
@@ -31,7 +31,7 @@ data DdarRepo = DdarRepo
remote :: RemoteType
remote = RemoteType {
typename = "ddar",
- enumerate = findSpecialRemotes "ddarrepo",
+ enumerate = const (findSpecialRemotes "ddarrepo"),
generate = gen,
setup = ddarSetup
}
diff --git a/Remote/Directory.hs b/Remote/Directory.hs
index c0bbcf5..ab4137d 100644
--- a/Remote/Directory.hs
+++ b/Remote/Directory.hs
@@ -33,7 +33,7 @@ import Utility.Metered
remote :: RemoteType
remote = RemoteType {
typename = "directory",
- enumerate = findSpecialRemotes "directory",
+ enumerate = const (findSpecialRemotes "directory"),
generate = gen,
setup = directorySetup
}
diff --git a/Remote/External.hs b/Remote/External.hs
index d09e1f9..6c36d87 100644
--- a/Remote/External.hs
+++ b/Remote/External.hs
@@ -34,7 +34,7 @@ import qualified Data.Map as M
remote :: RemoteType
remote = RemoteType {
typename = "external",
- enumerate = findSpecialRemotes "externaltype",
+ enumerate = const (findSpecialRemotes "externaltype"),
generate = gen,
setup = externalSetup
}
diff --git a/Remote/GCrypt.hs b/Remote/GCrypt.hs
index 8a1dcc4..51dfed4 100644
--- a/Remote/GCrypt.hs
+++ b/Remote/GCrypt.hs
@@ -54,7 +54,7 @@ remote = RemoteType {
typename = "gcrypt",
-- Remote.Git takes care of enumerating gcrypt remotes too,
-- and will call our gen on them.
- enumerate = return [],
+ enumerate = const (return []),
generate = gen,
setup = gCryptSetup
}
diff --git a/Remote/Git.hs b/Remote/Git.hs
index 5ac79df..4505c14 100644
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -67,11 +67,11 @@ remote = RemoteType {
setup = gitSetup
}
-list :: Annex [Git.Repo]
-list = do
+list :: Bool -> Annex [Git.Repo]
+list autoinit = do
c <- fromRepo Git.config
rs <- mapM (tweakurl c) =<< fromRepo Git.remotes
- mapM configRead rs
+ mapM (configRead autoinit) rs
where
annexurl n = "remote." ++ n ++ ".annexurl"
tweakurl c r = do
@@ -116,14 +116,14 @@ gitSetup (Just u) _ c = do
-
- Conversely, the config of an URL remote is only read when there is no
- cached UUID value. -}
-configRead :: Git.Repo -> Annex Git.Repo
-configRead r = do
+configRead :: Bool -> Git.Repo -> Annex Git.Repo
+configRead autoinit r = do
gc <- Annex.getRemoteGitConfig r
u <- getRepoUUID r
case (repoCheap r, remoteAnnexIgnore gc, u) of
(_, True, _) -> return r
- (True, _, _) -> tryGitConfigRead r
- (False, _, NoUUID) -> tryGitConfigRead r
+ (True, _, _) -> tryGitConfigRead autoinit r
+ (False, _, NoUUID) -> tryGitConfigRead autoinit r
_ -> return r
gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote)
@@ -196,11 +196,12 @@ repoAvail r
{- Tries to read the config for a specified remote, updates state, and
- returns the updated repo. -}
-tryGitConfigRead :: Git.Repo -> Annex Git.Repo
-tryGitConfigRead r
+tryGitConfigRead :: Bool -> Git.Repo -> Annex Git.Repo
+tryGitConfigRead autoinit r
| haveconfig r = return r -- already read
| Git.repoIsSsh r = store $ do
- v <- Ssh.onRemote r (pipedconfig, return (Left $ error "configlist failed")) "configlist" [] []
+ liftIO $ print autoinit
+ v <- Ssh.onRemote r (pipedconfig, return (Left $ error "configlist failed")) "configlist" [] configlistfields
case v of
Right r'
| haveconfig r' -> return r'
@@ -302,6 +303,10 @@ tryGitConfigRead r
Annex.BranchState.disableUpdate
void $ tryNonAsync $ ensureInitialized
Annex.getState Annex.repo
+
+ configlistfields = if autoinit
+ then [(Fields.autoInit, "1")]
+ else []
{- Checks if a given remote has the content for a key in its annex. -}
inAnnex :: Remote -> Key -> Annex Bool
diff --git a/Remote/Glacier.hs b/Remote/Glacier.hs
index 75b264b..98b7d6f 100644
--- a/Remote/Glacier.hs
+++ b/Remote/Glacier.hs
@@ -31,7 +31,7 @@ type Archive = FilePath
remote :: RemoteType
remote = RemoteType {
typename = "glacier",
- enumerate = findSpecialRemotes "glacier",
+ enumerate = const (findSpecialRemotes "glacier"),
generate = gen,
setup = glacierSetup
}
diff --git a/Remote/Hook.hs b/Remote/Hook.hs
index 9abc4e3..259a44b 100644
--- a/Remote/Hook.hs
+++ b/Remote/Hook.hs
@@ -27,7 +27,7 @@ type HookName = String
remote :: RemoteType
remote = RemoteType {
typename = "hook",
- enumerate = findSpecialRemotes "hooktype",
+ enumerate = const (findSpecialRemotes "hooktype"),
generate = gen,
setup = hookSetup
}
diff --git a/Remote/List.hs b/Remote/List.hs
index 49b0a35..5472059 100644
--- a/Remote/List.hs
+++ b/Remote/List.hs
@@ -72,14 +72,19 @@ remoteList :: Annex [Remote]
remoteList = do
rs <- Annex.getState Annex.remotes
if null rs
- then do
- m <- readRemoteLog
- rs' <- concat <$> mapM (process m) remoteTypes
- Annex.changeState $ \s -> s { Annex.remotes = rs' }
- return rs'
+ then remoteList' False
else return rs
+
+remoteList' :: Bool -> Annex [Remote]
+remoteList' autoinit = do
+ m <- readRemoteLog
+ rs <- concat <$> mapM (process m) remoteTypes
+ Annex.changeState $ \s -> s { Annex.remotes = rs }
+ return rs
where
- process m t = enumerate t >>= mapM (remoteGen m t) >>= return . catMaybes
+ process m t = enumerate t autoinit
+ >>= mapM (remoteGen m t)
+ >>= return . catMaybes
{- Forces the remoteList to be re-generated, re-reading the git config. -}
remoteListRefresh :: Annex [Remote]
@@ -109,7 +114,7 @@ updateRemote remote = do
where
updaterepo r
| Git.repoIsLocal r || Git.repoIsLocalUnknown r =
- Remote.Git.configRead r
+ Remote.Git.configRead False r
| otherwise = return r
{- Checks if a remote is syncable using git. -}
diff --git a/Remote/Rsync.hs b/Remote/Rsync.hs
index b9cdc45..be9629b 100644
--- a/Remote/Rsync.hs
+++ b/Remote/Rsync.hs
@@ -33,8 +33,6 @@ import Utility.Rsync
import Utility.CopyFile
import Messages.Progress
import Utility.Metered
-import Utility.PID
-import Annex.Perms
import Logs.Transfer
import Types.Creds
import Types.Key (isChunkKey)
@@ -46,7 +44,7 @@ import qualified Data.Map as M
remote :: RemoteType
remote = RemoteType {
typename = "rsync",
- enumerate = findSpecialRemotes "rsyncurl",
+ enumerate = const (findSpecialRemotes "rsyncurl"),
generate = gen,
setup = rsyncSetup
}
diff --git a/Remote/S3.hs b/Remote/S3.hs
index 0e76061..1290e78 100644
--- a/Remote/S3.hs
+++ b/Remote/S3.hs
@@ -54,7 +54,7 @@ type BucketName = String
remote :: RemoteType
remote = RemoteType {
typename = "S3",
- enumerate = findSpecialRemotes "s3",
+ enumerate = const (findSpecialRemotes "s3"),
generate = gen,
setup = s3Setup
}
diff --git a/Remote/Tahoe.hs b/Remote/Tahoe.hs
index f2649fa..1357a01 100644
--- a/Remote/Tahoe.hs
+++ b/Remote/Tahoe.hs
@@ -53,7 +53,7 @@ type Capability = String
remote :: RemoteType
remote = RemoteType {
typename = "tahoe",
- enumerate = findSpecialRemotes "tahoe",
+ enumerate = const (findSpecialRemotes "tahoe"),
generate = gen,
setup = tahoeSetup
}
diff --git a/Remote/Web.hs b/Remote/Web.hs
index 102972b..9892f4c 100644
--- a/Remote/Web.hs
+++ b/Remote/Web.hs
@@ -36,8 +36,8 @@ remote = RemoteType {
-- There is only one web remote, and it always exists.
-- (If the web should cease to exist, remove this module and redistribute
-- a new release to the survivors by carrier pigeon.)
-list :: Annex [Git.Repo]
-list = do
+list :: Bool -> Annex [Git.Repo]
+list _autoinit = do
r <- liftIO $ Git.Construct.remoteNamed "web" (pure Git.Construct.fromUnknown)
return [r]
diff --git a/Remote/WebDAV.hs b/Remote/WebDAV.hs
index 3c414f0..6cc5396 100644
--- a/Remote/WebDAV.hs
+++ b/Remote/WebDAV.hs
@@ -36,7 +36,7 @@ import Remote.WebDAV.DavLocation
remote :: RemoteType
remote = RemoteType {
typename = "webdav",
- enumerate = findSpecialRemotes "webdav",
+ enumerate = const (findSpecialRemotes "webdav"),
generate = gen,
setup = webdavSetup
}
diff --git a/Setup.hs b/Setup.hs
index f90a9b2..f0c9fb4 100644
--- a/Setup.hs
+++ b/Setup.hs
@@ -27,13 +27,13 @@ main = defaultMainWithHooks simpleUserHooks
}
myPostCopy :: Args -> CopyFlags -> PackageDescription -> LocalBuildInfo -> IO ()
-myPostCopy _ (CopyFlags { copyVerbosity }) pkg lbi = do
+myPostCopy _ flags pkg lbi = do
installGitAnnexShell dest verbosity pkg lbi
installManpages dest verbosity pkg lbi
installDesktopFile dest verbosity pkg lbi
where
- dest = NoCopyDest
- verbosity = fromFlag copyVerbosity
+ dest = fromFlag $ copyDest flags
+ verbosity = fromFlag $ copyVerbosity flags
installGitAnnexShell :: CopyDest -> Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
installGitAnnexShell copyDest verbosity pkg lbi =
@@ -62,7 +62,9 @@ installManpages copyDest verbosity pkg lbi =
srcManDir = "man"
installDesktopFile :: CopyDest -> Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
-installDesktopFile copyDest _verbosity pkg lbi =
- DesktopFile.install $ dstBinDir </> "git-annex"
+installDesktopFile copyDest _verbosity pkg lbi
+ | progfile copyDest == progfile NoCopyDest =
+ DesktopFile.install (progfile copyDest)
+ | otherwise = return ()
where
- dstBinDir = bindir $ absoluteInstallDirs pkg lbi copyDest
+ progfile cd = bindir (absoluteInstallDirs pkg lbi cd) </> "git-annex"
diff --git a/Types/MetaData.hs b/Types/MetaData.hs
index 1e8fb4a..cf2811b 100644
--- a/Types/MetaData.hs
+++ b/Types/MetaData.hs
@@ -270,10 +270,16 @@ instance Arbitrary MetaData where
legal k _v = legalField $ fromMetaField k
instance Arbitrary MetaValue where
- arbitrary = MetaValue <$> arbitrary <*> arbitrary
+ arbitrary = MetaValue
+ <$> arbitrary
+ -- Avoid non-ascii metavalues because fully arbitrary
+ -- strings may not be encoded using the filesystem
+ -- encoding, which is norally applied to all input.
+ <*> arbitrary `suchThat` all isAscii
instance Arbitrary MetaField where
- arbitrary = MetaField . CI.mk <$> arbitrary `suchThat` legalField
+ arbitrary = MetaField . CI.mk
+ <$> arbitrary `suchThat` legalField
prop_metadata_sane :: MetaData -> MetaField -> MetaValue -> Bool
prop_metadata_sane m f v = and
diff --git a/Types/Remote.hs b/Types/Remote.hs
index 4237f5e..4b4732a 100644
--- a/Types/Remote.hs
+++ b/Types/Remote.hs
@@ -40,7 +40,8 @@ data RemoteTypeA a = RemoteType {
-- human visible type name
typename :: String,
-- enumerates remotes of this type
- enumerate :: a [Git.Repo],
+ -- The Bool is True if automatic initialization of remotes is desired
+ enumerate :: Bool -> a [Git.Repo],
-- generates a remote of this type
generate :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> a (Maybe (RemoteA a)),
-- initializes or changes a remote
diff --git a/Utility/Base64.hs b/Utility/Base64.hs
index 6ab3c98..10ec9e0 100644
--- a/Utility/Base64.hs
+++ b/Utility/Base64.hs
@@ -1,5 +1,8 @@
{- Simple Base64 encoding of Strings
-
+ - Note that this uses the FileSystemEncoding, so it can be used on Strings
+ - that repesent filepaths containing arbitrarily encoded characters.
+ -
- Copyright 2011, 2015 Joey Hess <id@joeyh.name>
-
- License: BSD-2-clause
@@ -7,15 +10,19 @@
module Utility.Base64 (toB64, fromB64Maybe, fromB64, prop_b64_roundtrips) where
+import Utility.FileSystemEncoding
+
import qualified "sandi" Codec.Binary.Base64 as B64
import Data.Maybe
+import qualified Data.ByteString.Lazy as L
import Data.ByteString.UTF8 (fromString, toString)
+import Data.Char
toB64 :: String -> String
-toB64 = toString . B64.encode . fromString
+toB64 = toString . B64.encode . L.toStrict . encodeBS
fromB64Maybe :: String -> Maybe String
-fromB64Maybe s = either (const Nothing) (Just . toString)
+fromB64Maybe s = either (const Nothing) (Just . decodeBS . L.fromStrict)
(B64.decode $ fromString s)
fromB64 :: String -> String
@@ -23,5 +30,10 @@ fromB64 = fromMaybe bad . fromB64Maybe
where
bad = error "bad base64 encoded data"
+-- Only ascii strings are tested, because an arbitrary string may contain
+-- characters not encoded using the FileSystemEncoding, which would thus
+-- not roundtrip, as fromB64 always generates an output encoded that way.
prop_b64_roundtrips :: String -> Bool
-prop_b64_roundtrips s = s == fromB64 (toB64 s)
+prop_b64_roundtrips s
+ | all (isAscii) s = s == fromB64 (toB64 s)
+ | otherwise = True
diff --git a/Utility/Directory.hs b/Utility/Directory.hs
index 2d9e9c4..fae33b5 100644
--- a/Utility/Directory.hs
+++ b/Utility/Directory.hs
@@ -13,7 +13,6 @@ module Utility.Directory where
import System.IO.Error
import System.Directory
import Control.Monad
-import Control.Monad.IfElse
import System.FilePath
import Control.Applicative
import Control.Concurrent
@@ -25,10 +24,11 @@ import Prelude
import qualified System.Win32 as Win32
#else
import qualified System.Posix as Posix
+import Utility.SafeCommand
+import Control.Monad.IfElse
#endif
import Utility.PosixFiles
-import Utility.SafeCommand
import Utility.Tmp
import Utility.Exception
import Utility.Monad
@@ -126,7 +126,7 @@ moveFile src dest = tryIO (rename src dest) >>= onrename
#else
r <- tryIO $ copyFile src tmp
let (ok, e') = case r of
- Left e' -> (False, e')
+ Left err -> (False, err)
Right _ -> (True, e)
#endif
unless ok $ do
diff --git a/Utility/FileSystemEncoding.hs b/Utility/FileSystemEncoding.hs
index 41c5972..2d9691d 100644
--- a/Utility/FileSystemEncoding.hs
+++ b/Utility/FileSystemEncoding.hs
@@ -13,6 +13,7 @@ module Utility.FileSystemEncoding (
withFilePath,
md5FilePath,
decodeBS,
+ encodeBS,
decodeW8,
encodeW8,
encodeW8NUL,
@@ -34,6 +35,8 @@ import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.UTF8 as L8
#endif
+import Utility.Exception
+
{- Sets a Handle to use the filesystem encoding. This causes data
- written or read from it to be encoded/decoded the same
- as ghc 7.4 does to filenames etc. This special encoding
@@ -67,12 +70,16 @@ withFilePath fp f = Encoding.getFileSystemEncoding
- only allows doing this conversion with CStrings, and the CString buffer
- is allocated, used, and deallocated within the call, with no side
- effects.
+ -
+ - If the FilePath contains a value that is not legal in the filesystem
+ - encoding, rather than thowing an exception, it will be returned as-is.
-}
{-# NOINLINE _encodeFilePath #-}
_encodeFilePath :: FilePath -> String
_encodeFilePath fp = unsafePerformIO $ do
enc <- Encoding.getFileSystemEncoding
- GHC.withCString enc fp $ GHC.peekCString Encoding.char8
+ GHC.withCString enc fp (GHC.peekCString Encoding.char8)
+ `catchNonAsync` (\_ -> return fp)
{- Encodes a FilePath into a Md5.Str, applying the filesystem encoding. -}
md5FilePath :: FilePath -> MD5.Str
@@ -81,13 +88,21 @@ md5FilePath = MD5.Str . _encodeFilePath
{- Decodes a ByteString into a FilePath, applying the filesystem encoding. -}
decodeBS :: L.ByteString -> FilePath
#ifndef mingw32_HOST_OS
-decodeBS = encodeW8 . L.unpack
+decodeBS = encodeW8NUL . L.unpack
#else
{- On Windows, we assume that the ByteString is utf-8, since Windows
- only uses unicode for filenames. -}
decodeBS = L8.toString
#endif
+{- Encodes a FilePath into a ByteString, applying the filesystem encoding. -}
+encodeBS :: FilePath -> L.ByteString
+#ifndef mingw32_HOST_OS
+encodeBS = L.pack . decodeW8NUL
+#else
+encodeBS = L8.fromString
+#endif
+
{- Converts a [Word8] to a FilePath, encoding using the filesystem encoding.
-
- w82c produces a String, which may contain Chars that are invalid
diff --git a/Utility/Hash.hs b/Utility/Hash.hs
index f960a13..12f9202 100644
--- a/Utility/Hash.hs
+++ b/Utility/Hash.hs
@@ -1,11 +1,23 @@
-{- Convenience wrapper around cryptohash. -}
+{- Convenience wrapper around cryptohash/cryptonite.
+ -
+ - SHA3 hashes are currently only enabled when using cryptonite,
+ - because of https://github.com/vincenthz/hs-cryptohash/issues/36
+ -}
+
+{-# LANGUAGE CPP #-}
module Utility.Hash (
sha1,
- sha224,
- sha256,
- sha384,
- sha512,
+ sha2_224,
+ sha2_256,
+ sha2_384,
+ sha2_512,
+#ifdef WITH_CRYPTONITE
+ sha3_224,
+ sha3_256,
+ sha3_384,
+ sha3_512,
+#endif
skein256,
skein512,
md5,
@@ -20,25 +32,38 @@ import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.ByteString as S
import Crypto.Hash
+#ifdef WITH_CRYPTONITE
+import Crypto.MAC.HMAC
+#endif
sha1 :: L.ByteString -> Digest SHA1
sha1 = hashlazy
-sha224 :: L.ByteString -> Digest SHA224
-sha224 = hashlazy
+sha2_224 :: L.ByteString -> Digest SHA224
+sha2_224 = hashlazy
+
+sha2_256 :: L.ByteString -> Digest SHA256
+sha2_256 = hashlazy
-sha256 :: L.ByteString -> Digest SHA256
-sha256 = hashlazy
+sha2_384 :: L.ByteString -> Digest SHA384
+sha2_384 = hashlazy
-sha384 :: L.ByteString -> Digest SHA384
-sha384 = hashlazy
+sha2_512 :: L.ByteString -> Digest SHA512
+sha2_512 = hashlazy
-sha512 :: L.ByteString -> Digest SHA512
-sha512 = hashlazy
+#ifdef WITH_CRYPTONITE
+sha3_224 :: L.ByteString -> Digest SHA3_224
+sha3_224 = hashlazy
--- sha3 is not yet fully standardized
---sha3 :: L.ByteString -> Digest SHA3
---sha3 = hashlazy
+sha3_256 :: L.ByteString -> Digest SHA3_256
+sha3_256 = hashlazy
+
+sha3_384 :: L.ByteString -> Digest SHA3_384
+sha3_384 = hashlazy
+
+sha3_512 :: L.ByteString -> Digest SHA3_512
+sha3_512 = hashlazy
+#endif
skein256 :: L.ByteString -> Digest Skein256_256
skein256 = hashlazy
@@ -53,12 +78,18 @@ md5 = hashlazy
prop_hashes_stable :: Bool
prop_hashes_stable = all (\(hasher, result) -> hasher foo == result)
[ (show . sha1, "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33")
- , (show . sha224, "0808f64e60d58979fcb676c96ec938270dea42445aeefcd3a4e6f8db")
- , (show . sha256, "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae")
- , (show . sha384, "98c11ffdfdd540676b1a137cb1a22b2a70350c9a44171d6b1180c6be5cbb2ee3f79d532c8a1dd9ef2e8e08e752a3babb")
- , (show . sha512, "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7")
+ , (show . sha2_224, "0808f64e60d58979fcb676c96ec938270dea42445aeefcd3a4e6f8db")
+ , (show . sha2_256, "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae")
+ , (show . sha2_384, "98c11ffdfdd540676b1a137cb1a22b2a70350c9a44171d6b1180c6be5cbb2ee3f79d532c8a1dd9ef2e8e08e752a3babb")
+ , (show . sha2_512, "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7")
, (show . skein256, "a04efd9a0aeed6ede40fe5ce0d9361ae7b7d88b524aa19917b9315f1ecf00d33")
, (show . skein512, "fd8956898113510180aa4658e6c0ac85bd74fb47f4a4ba264a6b705d7a8e8526756e75aecda12cff4f1aca1a4c2830fbf57f458012a66b2b15a3dd7d251690a7")
+#ifdef WITH_CRYPTONITE
+ , (show . sha3_224, "f4f6779e153c391bbd29c95e72b0708e39d9166c7cea51d1f10ef58a")
+ , (show . sha3_256, "76d3bc41c9f588f7fcd0d5bf4718f8f84b1c41b20882703100b9eb9413807c01")
+ , (show . sha3_384, "665551928d13b7d84ee02734502b018d896a0fb87eed5adb4c87ba91bbd6489410e11b0fbcc06ed7d0ebad559e5d3bb5")
+ , (show . sha3_512, "4bca2b137edc580fe50a88983ef860ebaca36c857b1f492839d6d7392452a63c82cbebc68e3b70a2a1480b4bb5d437a7cba6ecf9d89f9ff3ccd14cd6146ea7e7")
+#endif
, (show . md5, "acbd18db4cc2f85cedef654fccc4a4d8")
]
where
@@ -83,7 +114,10 @@ calcMac mac = case mac of
HmacSha384 -> use SHA384
HmacSha512 -> use SHA512
where
- use alg k m = show (hmacGetDigest (hmacAlg alg k m))
+ use alg k m = show (hmacGetDigest (hmacWitnessAlg alg k m))
+
+ hmacWitnessAlg :: HashAlgorithm a => a -> S.ByteString -> S.ByteString -> HMAC a
+ hmacWitnessAlg _ = hmac
-- Check that all the MACs continue to produce the same.
prop_mac_stable :: Bool
diff --git a/Utility/LockPool/Windows.hs b/Utility/LockPool/Windows.hs
index 25877d5..754650c 100644
--- a/Utility/LockPool/Windows.hs
+++ b/Utility/LockPool/Windows.hs
@@ -16,14 +16,7 @@ module Utility.LockPool.Windows (
import qualified Utility.LockFile.Windows as F
import qualified Utility.LockPool.STM as P
import Utility.LockPool.LockHandle
-import Utility.LockPool.STM (LockPool, LockFile, LockMode(..))
-import Utility.Monad
-
-import Control.Concurrent.STM
-import System.IO
-import Data.Maybe
-import Control.Applicative
-import Prelude
+import Utility.LockPool.STM (LockFile, LockMode(..))
{- Tries to lock a file with a shared lock, which allows other processes to
- also lock it shared. Fails if the file is exclusively locked. -}
diff --git a/Utility/Path.hs b/Utility/Path.hs
index 8e3c2bd..4c2dd5c 100644
--- a/Utility/Path.hs
+++ b/Utility/Path.hs
@@ -30,8 +30,8 @@ import qualified "MissingH" System.Path as MissingH
import Utility.Monad
import Utility.UserInfo
-{- Simplifies a path, removing any ".." or ".", and removing the trailing
- - path separator.
+{- Simplifies a path, removing any "." component, collapsing "dir/..",
+ - and removing the trailing path separator.
-
- On Windows, preserves whichever style of path separator might be used in
- the input FilePaths. This is done because some programs in Windows
@@ -50,7 +50,8 @@ simplifyPath path = dropTrailingPathSeparator $
norm c [] = reverse c
norm c (p:ps)
- | p' == ".." = norm (drop 1 c) ps
+ | p' == ".." && not (null c) && dropTrailingPathSeparator (c !! 0) /= ".." =
+ norm (drop 1 c) ps
| p' == "." = norm c ps
| otherwise = norm (p:c) ps
where
diff --git a/Utility/WebApp.hs b/Utility/WebApp.hs
index ce6a61c..1a068a9 100644
--- a/Utility/WebApp.hs
+++ b/Utility/WebApp.hs
@@ -185,7 +185,7 @@ fromAuthToken = TE.decodeLatin1 . toBytes
fromAuthToken = id
#endif
-{- Generates a random sha512 string, encapsulated in a SecureMem,
+{- Generates a random sha2_512 string, encapsulated in a SecureMem,
- suitable to be used for an authentication secret. -}
genAuthToken :: IO AuthToken
genAuthToken = do
@@ -193,7 +193,7 @@ genAuthToken = do
return $
case genBytes 512 g of
Left e -> error $ "failed to generate auth token: " ++ show e
- Right (s, _) -> toAuthToken $ T.pack $ show $ sha512 $ L.fromChunks [s]
+ Right (s, _) -> toAuthToken $ T.pack $ show $ sha2_512 $ L.fromChunks [s]
{- A Yesod isAuthorized method, which checks the auth cgi parameter
- against a token extracted from the Yesod application.
diff --git a/Utility/Yesod.hs b/Utility/Yesod.hs
index a8055d3..0223f9f 100644
--- a/Utility/Yesod.hs
+++ b/Utility/Yesod.hs
@@ -17,7 +17,7 @@ module Utility.Yesod
, widgetFile
, hamletTemplate
#endif
-#if ! MIN_VERSION_yesod(1,4,0)
+#if ! MIN_VERSION_yesod_core(1,2,20)
, withUrlRenderer
#endif
) where
diff --git a/debian/.changelog.swp b/debian/.changelog.swp
new file mode 100644
index 0000000..c74b992
--- /dev/null
+++ b/debian/.changelog.swp
Binary files differ
diff --git a/debian/cabal-wrapper b/debian/cabal-wrapper
new file mode 100755
index 0000000..e0623f7
--- /dev/null
+++ b/debian/cabal-wrapper
@@ -0,0 +1,16 @@
+#!/bin/sh
+# It would be more usual to use:
+# export CABAL=./Setup
+# But Setup currently has a very bad dependency resolver, and very bad
+# debugging output, and tends to eat all memory and die on small buildds.
+#
+# This should be revisited once Debian has a newer ghc than 7.6.3,
+# and hopefully gets the improved dependency resolver from cabal.
+set -e
+
+# Avoid cabal writing to HOME, and avoid local cabal settings
+# influencing the build.
+HOME=$(mktemp -d)
+export HOME
+
+cabal "$@"
diff --git a/debian/changelog b/debian/changelog
index 740e7e0..c43a3e8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,46 @@
+git-annex (5.20150812) unstable; urgency=medium
+
+ * Added support for SHA3 hashed keys (in 8 varieties), when git-annex is
+ built using the cryptonite library.
+ * metadata: Fix reversion introduced in 5.20150727 that caused recursive
+ display of metadata to not work.
+ * Windows: Fix bug that caused git-annex sync to fail due to missing
+ environment variable.
+ * Fix setting/setting/viewing metadata that contains unicode or other
+ special characters, when in a non-unicode locale.
+ * Simplify setup process for a ssh remote. Now it suffices to run git
+ remote add, followed by git-annex sync. Now the remote is automatically
+ initialized for use by git-annex, where before the git-annex branch had
+ to manually be pushed before using git-annex sync. Note that this
+ involved changes to git-annex-shell, so if the remote is using an old
+ version, the manual push is still needed.
+ * git-annex-shell: Don't let configlist auto-init repository when in
+ readonly mode.
+ * Perform a clean shutdown when --time-limit is reached.
+ This includes running queued git commands, and cleanup actions normally
+ run when a command is finished.
+ * fsck: Commit incremental fsck database when --time-limit is reached.
+ Previously, some of the last files fscked did not make it into the
+ database when using --time-limit.
+ * fsck: Commit incremental fsck database after every 1000 files
+ fscked, or every 5 minutes, whichever comes first. Previously,
+ commits were made every 1000 files fscked.
+ * Linux standalone: Work around problem that prevented it from working
+ properly if unpacked into a directory that contains ":" or ";" in its
+ name.
+ * proxy: Fix proxy git commit of non-annexed files in direct mode.
+ * proxy: If a non-proxied git command, such as git revert
+ would normally fail because of unstaged files in the work tree,
+ make the proxied command fail the same way.
+ * proxy: Fix removal of files deleted by the proxied command.
+ * proxy: Fix behavior when run in subdirectory of git repo.
+ * Improve Setup.hs file so that cabal copy --destdir works.
+ Thanks, Magnus Therning.
+ * Tighten dependency on optparse-applicative to 0.11.0.
+ * Added back debian/cabal-wrapper, since it still seems needed after all.
+
+ -- Joey Hess <id@joeyh.name> Wed, 12 Aug 2015 11:14:58 -0400
+
git-annex (5.20150731) unstable; urgency=medium
* webapp: Support enabling known gitlab.com remotes.
diff --git a/debian/control b/debian/control
index 8607246..9539586 100644
--- a/debian/control
+++ b/debian/control
@@ -4,12 +4,13 @@ Priority: optional
Build-Depends:
debhelper (>= 9),
ghc (>= 7.4),
+ cabal-install,
libghc-mtl-dev (>= 2.1.1),
libghc-missingh-dev,
libghc-data-default-dev,
libghc-hslogger-dev,
libghc-pcre-light-dev,
- libghc-cryptohash-dev (>= 0.11.0),
+ libghc-cryptonite-dev | libghc-cryptohash-dev (>= 0.11.0),
libghc-sandi-dev,
libghc-utf8-string-dev,
libghc-aws-dev (>= 0.9.2-2~),
@@ -69,7 +70,7 @@ Build-Depends:
libghc-tasty-hunit-dev,
libghc-tasty-quickcheck-dev,
libghc-tasty-rerun-dev,
- libghc-optparse-applicative-dev (>= 0.10),
+ libghc-optparse-applicative-dev (>= 0.11.0),
lsof [linux-any],
ikiwiki,
perlmagick,
diff --git a/debian/rules b/debian/rules
index d1393d5..927c1c9 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,7 +1,6 @@
#!/usr/bin/make -f
-# Avoid using cabal, as it writes to $HOME
-export CABAL=./Setup
+export CABAL=debian/cabal-wrapper
STANDALONE_BUILD=$(shell grep -qe '^Package: git-annex-standalone' debian/control \
&& echo 1 || echo 0)
diff --git a/doc/backends.mdwn b/doc/backends.mdwn
index 5da053d..14b1384 100644
--- a/doc/backends.mdwn
+++ b/doc/backends.mdwn
@@ -10,24 +10,29 @@ can use different ones for different files.
verifying that the file content is right, and can avoid duplicates of
files with the same content. Its need to generate checksums
can make it slower for large files.
-* `SHA256` -- Does not include the file extension in the key, which can
- lead to better deduplication but can confuse some programs.
-* `WORM` ("Write Once, Read Many") This assumes that any file with
- the same filename, size, and modification time has the same content.
- This is the least expensive backend, recommended for really large
- files or slow systems.
+* `SHA256` -- SHA-2 hash that does not include the file extension in the
+ key, which can lead to better deduplication but can confuse some programs.
* `SHA512`, `SHA512E` -- Best SHA-2 hash, for the very paranoid.
-* `SHA1`, `SHA1E`, `MD5`, `MD5E` -- Smaller hashes than `SHA256`
- for those who want a checksum but are not concerned about security.
-* `SHA384`, `SHA384E`, `SHA224`, `SHA224E` -- Hashes for people who like
- unusual sizes.
+* `SHA384`, `SHA384E`, `SHA224`, `SHA224E` -- SHA-2 hashes for
+ people who like unusual sizes.
+* `SHA3_512`, `SHA_512E`, `SHA3_384`, `SHA3_384E`, `SHA3_256`, `SHA3_256E`, `SHA3_224`, `SHA3_224E`
+ -- SHA-3 hashes, for bleeding edge fun.
* `SKEIN512`, `SKEIN512E`, `SKEIN256`, `SKEIN256E`
-- [Skein hash](http://en.wikipedia.org/wiki/Skein_hash),
a well-regarded SHA3 hash competition finalist.
+* `SHA1`, `SHA1E`, `MD5`, `MD5E` -- Smaller hashes than `SHA256`
+ for those who want a checksum but are not concerned about security.
+* `WORM` ("Write Once, Read Many") -- This assumes that any file with
+ the same filename, size, and modification time has the same content.
+ This is the least expensive backend, recommended for really large
+ files or slow systems.
+* `URL` -- This is a key that is generated from the url to a file.
+ It's generated when using eg, `git annex addurl --fast`, when the file
+ content is not available for hashing.
-Note that the SHA512, SKEIN512 and SHA384 generate long paths,
+Note that the various 512 and 384 length hashes result in long paths,
which are known to not work on Windows. If interoperability on Windows is a
-concern, avoid those backends.
+concern, avoid those.
The `annex.backends` git-config setting can be used to list the backends
git-annex should use. The first one listed will be used by default when
diff --git a/doc/bugs.mdwn b/doc/bugs.mdwn
index d1a0b07..6cb91bc 100644
--- a/doc/bugs.mdwn
+++ b/doc/bugs.mdwn
@@ -2,6 +2,6 @@ This is git-annex's bug list. Closed bugs are moved to [[done]].
[[!inline pages="./bugs/* and !./bugs/*/* and !./bugs/done and !link(done)
and !./bugs/moreinfo and !./bugs/confirmed and !./bugs/forwarded and !*/Discussion"
-actions=yes postform=yes show=0 archive=yes template=buglist]]
+actions=yes postform=yes postformtext="Report a new bug titled:" show=0 archive=yes template=buglist]]
[[!edittemplate template=templates/bugtemplate match="bugs/*" silent=yes]]
diff --git a/doc/bugs/Error_writing_log_message_when_filename_contains_Unicode_chars.mdwn b/doc/bugs/Error_writing_log_message_when_filename_contains_Unicode_chars.mdwn
new file mode 100644
index 0000000..3c00472
--- /dev/null
+++ b/doc/bugs/Error_writing_log_message_when_filename_contains_Unicode_chars.mdwn
@@ -0,0 +1,25 @@
+### Please describe the problem.
+I’ve noticed that daemon.log will sometimes contain error messages arising from logging a file name during transfer. Additionally, I’ve occasionally noticed that certain files get «stuck» after being added to the objects store, i. e., they will never be committed by the assistant and have to be staged manually; it appears there is a correlation between files where the logger errors out and files getting stuck.
+
+I can reproduce this using the en-dash (U+2013).
+
+### What steps will reproduce the problem?
+1. Create a file named «Behold – the majestic en-dash» in a repository where the assistant is running.
+2. Observe file has not been added by the assistant and daemon.log contains no message pertaining to new file.
+3. Restart assistant.
+4. Observe in daemon.log that the logger has errored out with «hPutChar: invalid argument» and gives the Unicode replacement character thrice for each en-dash.
+5. Observe that file is added to object store, but the symlink is not staged or committed by the assistant.
+
+### What version of git-annex are you using? On what operating system?
+git-annex 5.20150731
+Linux 4.0.9
+
+### Please provide any additional information below.
+[[!format sh """
+# After restarting the assistant.
+[2015-07-28 14:24:58 CEST] Committer: Adding 978Error writing log message: <stderr>: hPutChar: invalid argument (invalid character) (original message: [2015-07-28 14:24:58 CEST] Committer: Adding 978\65533\65533\655330\65533\65533..1\65533\65533\655330.pdf)
+[2015-07-28 14:24:59 CEST] Transferrer: Uploaded 978Error writing log message: <stderr>: hPutChar: invalid argument (invalid character) (original message: [2015-07-28 14:24:59 CEST] Transferrer: Uploaded 978\65533\65533\655330\65533\65533..1\65533\65533\655330.pdf)
+"""]]
+
+> Closing this because the main bug is fixed in hinotify git and will
+> percolate to the git-annex builds eventually. [[done]] --[[Joey]]
diff --git a/doc/bugs/__39__copy_destdir__61____60__path__62____39___fails.mdwn b/doc/bugs/__39__copy_destdir__61____60__path__62____39___fails.mdwn
new file mode 100644
index 0000000..93f1017
--- /dev/null
+++ b/doc/bugs/__39__copy_destdir__61____60__path__62____39___fails.mdwn
@@ -0,0 +1,56 @@
+### Please describe the problem.
+
+Using `copy --destdir=<path>` fails.
+
+### What steps will reproduce the problem?
+
+~~~
+% ./Setup.hs configure --prefix=/usr
+% ./Setup.hs build
+% ./Setup.hs copy --destdir=my/pkg/dir
+~~~
+
+### What version of git-annex are you using? On what operating system?
+
+5.20150731 on Linux (Arch Linux)
+
+### Please provide any additional information below.
+
+The steps in `myPostCopy` doesn't consider the destination directory, the following change is enough for my uses:
+
+~~~
+Index: habs/git-annex/src/git-annex-5.20150731/Setup.hs
+===================================================================
+--- habs.orig/git-annex/src/git-annex-5.20150731/Setup.hs
++++ habs/git-annex/src/git-annex-5.20150731/Setup.hs
+@@ -27,13 +27,13 @@ main = defaultMainWithHooks simpleUserHo
+ }
+
+ myPostCopy :: Args -> CopyFlags -> PackageDescription -> LocalBuildInfo -> IO ()
+-myPostCopy _ (CopyFlags { copyVerbosity }) pkg lbi = do
++myPostCopy _ flags pkg lbi = do
+ installGitAnnexShell dest verbosity pkg lbi
+ installManpages dest verbosity pkg lbi
+- installDesktopFile dest verbosity pkg lbi
++ -- installDesktopFile dest verbosity pkg lbi
+ where
+- dest = NoCopyDest
+- verbosity = fromFlag copyVerbosity
++ dest = fromFlag $ copyDest flags
++ verbosity = fromFlag $ copyVerbosity flags
+
+ installGitAnnexShell :: CopyDest -> Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
+ installGitAnnexShell copyDest verbosity pkg lbi =
+~~~
+
+As you see I commented out installation of desktop files completely for the moment. I don't really need them, and they require larger changes to be correct.
+
+> So, by "fails", you mean it installs to ~/.cabal instead of the speficied
+> location.
+>
+> And, the issue with the desktop file installation is that it's not inside
+> ~/.cabal at all.
+>
+> I've applied your patch, thanks. And dealt with the desktop file by
+> making it not install it anywhere, unless it's installing to the regular
+> ~/.cabal location. [[done]] --[[Joey]]
diff --git a/doc/bugs/cannot_change_locale___40__en__95__US.UTF-8__41__.mdwn b/doc/bugs/cannot_change_locale___40__en__95__US.UTF-8__41__.mdwn
index dd0a2b7..bdf288a 100644
--- a/doc/bugs/cannot_change_locale___40__en__95__US.UTF-8__41__.mdwn
+++ b/doc/bugs/cannot_change_locale___40__en__95__US.UTF-8__41__.mdwn
@@ -27,4 +27,6 @@ he_IL.iso88598
he_IL.utf8
POSIX
-
+> Closing since I've seen nothing to indicate this is anything other than a
+> misconfigured OS that doesn't have the requested locale available.
+> [[done]] --[[Joey]]
diff --git a/doc/bugs/git-annex_get_with_umlaut_characters_in_filenames.mdwn b/doc/bugs/git-annex_get_with_umlaut_characters_in_filenames.mdwn
new file mode 100644
index 0000000..c05130a
--- /dev/null
+++ b/doc/bugs/git-annex_get_with_umlaut_characters_in_filenames.mdwn
@@ -0,0 +1,59 @@
+### Please describe the problem.
+
+Files with umlauts were not copied from local system, all other files were copied successfully.
+
+### What steps will reproduce the problem?
+
+Trying to sync content from a repository on the same machine.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20150727 / Darwin tba.lan 14.4.0 Darwin Kernel Version 14.4.0: Thu May 28 11:35:04 PDT 2015; root:xnu-2782.30.5~1/RELEASE_X86_64 x86_64
+
+### Please provide any additional information below.
+
+[[!format sh """
+$ git annex get .
+get Die Sterne/Flucht in die Flucht (Bonus Track Version)/03 Ihr wollt mich töten.m4a
+ Unable to access these remotes: tba
+
+ Try making some of these repositories available:
+ 2cabf5e0-00ae-4cc6-b9b7-5d303a7f3f06 -- Music [tba]
+ 8e315ed0-f318-45f7-98ca-1a791f9c92df -- jan@hostname:/srv/annex-Music
+failed
+get Die Sterne/Flucht in die Flucht (Bonus Track Version)/03 Ihr wollt mich töten.m4a
+ Unable to access these remotes: tba
+
+ Try making some of these repositories available:
+ 2cabf5e0-00ae-4cc6-b9b7-5d303a7f3f06 -- Music [tba]
+ 8e315ed0-f318-45f7-98ca-1a791f9c92df -- jan@hostname:/srv/annex-Music
+failed
+get Die Sterne/Flucht in die Flucht (Bonus Track Version)/10 Der Bär.m4a
+ Unable to access these remotes: tba
+
+ Try making some of these repositories available:
+ 2cabf5e0-00ae-4cc6-b9b7-5d303a7f3f06 -- Music [tba]
+ 8e315ed0-f318-45f7-98ca-1a791f9c92df -- jan@hostname:/srv/annex-Music
+failed
+get Die Sterne/Flucht in die Flucht (Bonus Track Version)/10 Der Bär.m4a
+ Unable to access these remotes: tba
+
+ Try making some of these repositories available:
+ 2cabf5e0-00ae-4cc6-b9b7-5d303a7f3f06 -- Music [tba]
+ 8e315ed0-f318-45f7-98ca-1a791f9c92df -- jan@hostname:/srv/annex-Music
+failed
+"""]]
+
+the *tba* repository is accessible since all the other files were synced correctly.
+
+Git status reports untracked files which look like they were renamed.
+
+[[!format sh """
+$ git status
+Untracked files:
+ (use "git add <file>..." to include in what will be committed)
+
+ "Ant\303\263nio Varia\303\247\303\265es/"
+ "B Fachada/B Fachada/01 sozinho no r\303\263que.mp3"
+ "B Fachada/B Fachada/03 D\303\241 mais m\303\272sica \303\240 b\303\263fia.mp3"
+"""]]
diff --git a/doc/bugs/git_annex_assistant_failing_with_ARM_NAS.mdwn b/doc/bugs/git_annex_assistant_failing_with_ARM_NAS.mdwn
new file mode 100644
index 0000000..83b9633
--- /dev/null
+++ b/doc/bugs/git_annex_assistant_failing_with_ARM_NAS.mdwn
@@ -0,0 +1,29 @@
+I'm trying to use a Synology NAS (ARM architecture, DiskStation 214+) as a remote repository for my laptop, but I'm failing to get a convenient configuration to work.
+
+I already set-up git-annex on the NAS following the explanations found [here](http://git-annex.branchable.com/tips/Synology_NAS_and_git_annex/). I installed version **5.20150714-g8695533**.
+
+On my laptop I have the version provided with Ubuntu 14.04: **5.20140412ubuntu1**.
+
+If calling git annex from my laptop's command line and doing everything manually (git remote add, copy file to the dir, git annex add, git commit, git push, git annex copy), then it works properly.
+
+But when trying with the assistant I get this error:
+
+```
+fatal: unrecognized command 'sh -c 'mkdir -p '"'"'annex'"'"'&&cd '"'"'annex'"'"'&&if [ ! -d .git ]; then git init --bare --shared && git config receive.denyNonFastforwards false; fi&&git annex init''
+git-annex-shell: git-shell failed
+```
+
+This is the content of daemon.log:
+[[!format sh """
+[2015-08-04 00:51:41 CEST] main: starting assistant version 5.20140412ubuntu1
+[2015-08-04 00:51:41 CEST] Cronner: You should enable consistency checking to protect your data.
+(Recording state in git...)
+(scanning...) [2015-08-04 00:51:41 CEST] Watcher: Performing startup scan
+(started...) [2015-08-04 00:52:41 CEST] Cronner: Consistency check in progress
+[2015-08-04 00:59:12 CEST] read: ssh-keygen ["-F","git-annex-trusted"]
+[2015-08-04 00:59:12 CEST] read: ssh ["-oNumberOfPasswordPrompts=0","-oStrictHostKeyChecking=no","-n","-p","22","git-annex@git-annex-trusted","sh -c 'echo git-annex-probe loggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;if which git; then echo git-annex-probe git; fi;if which rsync; then echo git-annex-probe rsync; fi;if which ~/.ssh/git-annex-shell; then echo git-annex-probe ~/.ssh/git-annex-shell; fi;cd '\"'\"'annex'\"'\"' && git config --list'"]
+[2015-08-04 00:59:13 CEST] read: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"]
+[2015-08-04 00:59:15 CEST] read: ssh ["-p","22","git-annex@git-annex-trusted","sh -c 'mkdir -p '\"'\"'annex'\"'\"'&&cd '\"'\"'annex'\"'\"'&&if [ ! -d .git ]; then git init --bare --shared && git config receive.denyNonFastforwards false; fi&&git annex init'"]
+"""]]
+
+Is there any problem with the version provided by Ubuntu that is producing this strange behavior?
diff --git a/doc/bugs/gitlab_repos_cannot_use_gcrypt.mdwn b/doc/bugs/gitlab_repos_cannot_use_gcrypt.mdwn
index 732d1e3..65cde40 100644
--- a/doc/bugs/gitlab_repos_cannot_use_gcrypt.mdwn
+++ b/doc/bugs/gitlab_repos_cannot_use_gcrypt.mdwn
@@ -20,3 +20,14 @@ Unsure what is causing git-annex-shell to behave this way on gitlab.
> and has not had any opportunity to get a git-annex uuid set..
>
> I wonder what version of git-annex gitlab.com is running? --[[Joey]]
+
+>> gitlab tells me their version is 5.20140412ubuntu1.
+>> I tried installing git-annex-shell from 5.20140412, but
+>> was not able to reproduce the problem using it. This makes me think the
+>> problem is somehow in gitlab's git-annex-shell integration code.
+>>
+>> Update: Root-caused and filed a bug:
+>> <https://gitlab.com/gitlab-org/gitlab-shell/issues/24
+>>
+>> This will need to be fixed on the gitlab side, so closing it here.
+>> [[done]] --[[Joey]]
diff --git a/doc/bugs/sync_content_has_really_suboptimal_behavior.mdwn b/doc/bugs/sync_content_has_really_suboptimal_behavior.mdwn
new file mode 100644
index 0000000..b12d37b
--- /dev/null
+++ b/doc/bugs/sync_content_has_really_suboptimal_behavior.mdwn
@@ -0,0 +1,50 @@
+### Please describe the problem.
+
+In a client, backup, smallarchive setup, new non-archive files will be copied to backup, copied to smallarchive, then dropped from smallarchive.
+
+### What steps will reproduce the problem?
+
+Create three repos, assign them groups client, backup, smallarchive.
+
+Add files to the client, not in the archive folder.
+
+Run sync --content
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20150710
+
+### Please provide any additional information below.
+
+[[!format sh """
+copy SOMEFILE copy SOMEFILE (checking BACKUP...) (to BACKUP...)
+SHA256E-s309049--00bb4f52d3d9af507eaf8c837ce29ad133cf1964c0f8fbf586906b1e5676f0af.pdf
+ 309,049 100% 87.83MB/s 0:00:00 (xfr#1, to-chk=0/1)
+ok
+copy SOMEFILE copy SOMEFILE (checking SMALLARCHIVE...) (to SMALLARCHIVE...)
+ok
+drop SMALLARCHIVE SOMEFILE (checking BACKUP...) ok
+""" ]]
+
+> Indeed, but this was fixed in version 5.20150727.
+> From the changelog:
+>>
+>> * sync --content: Fix bug that caused files to be uploaded to eg,
+>> more archive remotes than wanted copies, only to later be dropped
+>> to satisfy the preferred content settings.
+>
+> [[done]] --[[Joey]]
+
+>> Oh, sorry about the noise then. I assumed the version I was running was the latest since it was pretty recent.
+>> Thanks. -- [[filippo]]
+
+Note: it's extremely and unnecessarily hard to report a bug. There are no
+links leading to instructions or anything on the home page. The "bugs" link
+leads to a list of pages with no instructions. Please at least add
+explanation to the bugs page. I had to edit an existing bug and change the
+edit URL.
+
+> Eh? The first thing on the bugs page is a form to add a new post to the
+> list of bugs. --[[Joey]]
+
+>> I'm an idiot. I mistook that for a search box. -- [[filippo]]
diff --git a/doc/bugs/view_fails_with___34__invalid_character__34__.mdwn b/doc/bugs/view_fails_with___34__invalid_character__34__.mdwn
index 4b6e977..f77f501 100644
--- a/doc/bugs/view_fails_with___34__invalid_character__34__.mdwn
+++ b/doc/bugs/view_fails_with___34__invalid_character__34__.mdwn
@@ -28,3 +28,29 @@ local repository version: 5
supported repository version: 5
upgrade supported from repository versions: 0 1 2 4
"""]]
+
+> I'm assuming the setlocale part of this is a misconfigured system locale;
+> as also seen by an arch linux user in
+> <http://git-annex.branchable.com/bugs/cannot_change_locale___40__en__95__US.UTF-8__41__/>
+>
+> So, disregarding that part of the bug report, we still have the actual
+> failure.
+>
+> With LANG=C, setting and getting metadata like "Rondò Veneziano" fails,
+> as does generating views of that metadata.
+>
+> In all cases, it's an IO encoding failure, "commitBuffer: invalid argument (invalid character)"
+>
+> This only occurs when there's a space in the metadata; in this case the
+
+> value is base64ed. While the 'ò' comes back out as "\242", which is the right
+> character, it's not encoded using the filesystem encoding. This means that
+> the IO layer can't handle it, when not in a unicode locale. Instead, it
+> needs to come back out as "\56515\56498".
+>
+> Apparently this is a reversion; it worked in an earlier version of
+> git-annex. Commits such as 9b93278e8abe1163d53fbf56909d0fe6d7de69e9
+> or the conversion to Sandi may have caused the reversion, unsure.
+>
+> Fix is to apply the filesystem encoding when decoding base64ed values.
+> [[done]] --[[Joey]]
diff --git a/doc/design/external_special_remote_protocol.mdwn b/doc/design/external_special_remote_protocol.mdwn
index 0746a7b..d6aa990 100644
--- a/doc/design/external_special_remote_protocol.mdwn
+++ b/doc/design/external_special_remote_protocol.mdwn
@@ -274,7 +274,9 @@ in control.
Gets any state that has been stored for the key.
(git-annex replies with VALUE followed by the state.)
* `SETURLPRESENT Key Url`
- Records an URL where the Key can be downloaded from.
+ Records an URL where the Key can be downloaded from.
+ Note that this does not make git-annex think that the url is present on
+ the web special remote.
* `SETURLMISSING Key Url`
Records that the key can no longer be downloaded from the specified
URL.
diff --git a/doc/devblog/day_307__two_release_week.mdwn b/doc/devblog/day_307__two_release_week.mdwn
new file mode 100644
index 0000000..3220290
--- /dev/null
+++ b/doc/devblog/day_307__two_release_week.mdwn
@@ -0,0 +1,11 @@
+Made a release this morning, mostly because the release earlier this week
+turns out to have accidentially removed several options from `git annex copy`.
+
+Spent some time this afternoon improving how git-annex shuts down when
+--time-limit is used. This used to be a quick and dirty shutdown, similar
+to if git-annex were ctrl-c'd, but I reworked things so it does a clean
+shutdown, including running any buffered git commands.
+This made incremental fsck with --time-limit resume much better, since
+it saves the incremental fsck database on shutdown. Also tuned when the
+database gets checkpointed during an incremental fsck, to resume better after
+it's interrupted.
diff --git a/doc/devblog/day_308__other_peoples_bugs.mdwn b/doc/devblog/day_308__other_peoples_bugs.mdwn
new file mode 100644
index 0000000..1b0d818
--- /dev/null
+++ b/doc/devblog/day_308__other_peoples_bugs.mdwn
@@ -0,0 +1,11 @@
+Work today has started in the git-annex bug tracker, but the real bugs were
+elsewhere. Got a patch into hinotify to fix its handling of filenames
+received from inotify events when used in a non-unicode locale. Tracked
+down why gitlab's git-annex-shell fails to initialize gcrypt repositories,
+and filed a bug on gitlab-shell.
+
+Yesterday, I got the Android autobuilder fixed. I had started upgrading it
+to new versions of yesod etc, 2 months ago, and something in those new
+versions led to character encoding problems that broke the template haskell
+splicing. Had to throw away the work done for that upgrade, but at least
+it's building again, at last.
diff --git a/doc/devblog/day_309__proxy.mdwn b/doc/devblog/day_309__proxy.mdwn
new file mode 100644
index 0000000..4afc4c2
--- /dev/null
+++ b/doc/devblog/day_309__proxy.mdwn
@@ -0,0 +1,5 @@
+Ended up sending most of today working on `git annex proxy`. It had a lot
+of buggy edge cases, which are all cleaned up now.
+
+Spent another couple hours catching up on recent traffic and fixing a
+couple other misc bugs.
diff --git a/doc/devblog/day_310__half_day.mdwn b/doc/devblog/day_310__half_day.mdwn
new file mode 100644
index 0000000..01b76d7
--- /dev/null
+++ b/doc/devblog/day_310__half_day.mdwn
@@ -0,0 +1,7 @@
+Took a half day and worked on making it simpler to set up ssh remotes.
+The complexity I've gotten rid of is there's no need to take any action to
+get a ssh remote initialized as a git-annex repository. Where before,
+either git-annex init needed to be ran on the remote, or a git-annex branch
+manually pushed to it, now the remote can simply be added and `git annex sync`
+will do the rest. This needed git-annex-shell changes, so will only work
+once servers are upgraded to use a newer version of git-annex.
diff --git a/doc/devblog/day_311__SHA-3.mdwn b/doc/devblog/day_311__SHA-3.mdwn
new file mode 100644
index 0000000..d4936cf
--- /dev/null
+++ b/doc/devblog/day_311__SHA-3.mdwn
@@ -0,0 +1,6 @@
+The SHA-3 specification was released yesterday; git-annex got support for
+using SHA-3 hashes today. I had to add support for building with the new
+cryptonite library, as cryptohash doesn't (correctly) implement SHA-3 yet.
+Of course, nobody is likely to find a use for this for years, since SHA-2
+is still prefectly fine, but it's nice to get support for new hashes
+in early. :)
diff --git a/doc/devblog/day_312__release_prep.mdwn b/doc/devblog/day_312__release_prep.mdwn
new file mode 100644
index 0000000..4e0db7d
--- /dev/null
+++ b/doc/devblog/day_312__release_prep.mdwn
@@ -0,0 +1,12 @@
+Catching up on weekend's traffic, and preparing for a release tomorrow.
+
+Found another place where the optparse-applicative conversion broke some
+command-line parsing; using git-annex metadata to dump metadata recursively
+got broken. This is the second known bug caused by that transition, which
+is not too surpising given how large it was.
+
+Tracked down and fixed a [very tricky encoding problem with metadata values](http://git-annex.branchable.com/bugs/view_fails_with___34__invalid_character__34__/).
+
+The arm autobuilder broke so it won't boot; got a serial console hooked up
+to it and looks like a botched upgrade resulting in a udev/systemd/linux
+version mismatch.
diff --git a/doc/forum/Remote__39__s_git-annex-shell_not_detected.mdwn b/doc/forum/Remote__39__s_git-annex-shell_not_detected.mdwn
new file mode 100644
index 0000000..5d9223f
--- /dev/null
+++ b/doc/forum/Remote__39__s_git-annex-shell_not_detected.mdwn
@@ -0,0 +1,20 @@
+When doing `git annex get fname` in a repo A with 2 remotes on LAN (B and C), it says they don't have git annex installed so it sets the `annex-ignore` flag. However, they do have it, and I can `annex-get` files from C to B. Versions of git and git-annex vary between the machines. Any idea what could be causing it? Perhaps A's git needs an update?
+
+
+A:
+
+* Ubuntu.
+* git 1.9.1
+* git-annex 5.20140412ubuntu1
+
+B:
+
+* Fedora 22
+* git 2.3.2 (installed through Nix package manager, so its in a nonstandard path)
+* git-annex 5.20140717 (installed normally, in /usr/bin)
+
+C:
+
+* Fedora 22
+* git 2.3.2 (installed through Nix package manager, so its in a nonstandard path)
+* git-annex 5.20150219 (installed through Nix
diff --git a/doc/forum/can__39__t_sync_content.mdwn b/doc/forum/can__39__t_sync_content.mdwn
new file mode 100644
index 0000000..9e7a4cc
--- /dev/null
+++ b/doc/forum/can__39__t_sync_content.mdwn
@@ -0,0 +1,35 @@
+Hi,
+
+I'm completely new to git-annex, I'm trying to follow this guide:
+
+https://git-annex.branchable.com/tips/centralized_git_repository_tutorial/on_GitLab/
+
+All steps succeeded except the `git annex sync --content` which results in the following message:
+
+'Remote origin not usable by git-annex; setting annex-ignore'
+
+Here is an example of the output I receive:
+
+ $ git status
+ On branch master
+ Your branch is up-to-date with 'origin/master'.
+ nothing to commit, working directory clean
+ $
+ $ git push origin master git-annex
+ Everything up-to-date
+ $
+ $ git annex sync --content
+
+ Remote origin not usable by git-annex; setting annex-ignore
+ commit ok
+ pull origin
+ ok
+ pull origin
+ ok
+ $
+ $ git config remote.origin.url
+ https://user:pass@gitlab.com/user/repname.git
+
+Is it required to use the ssh protocol in order to get annex working?
+
+I'm using https since I'm behind a firewall, and the ssh protocol always time out. Is there anything I can do?
diff --git a/doc/forum/checkout_view_to_directory_outside_of_annex.mdwn b/doc/forum/checkout_view_to_directory_outside_of_annex.mdwn
new file mode 100644
index 0000000..5a198b6
--- /dev/null
+++ b/doc/forum/checkout_view_to_directory_outside_of_annex.mdwn
@@ -0,0 +1,23 @@
+i am working on a project where i need to copy many subsets of files stored in a single annex repo to separate folders outside of the annex repo (each subset to a separate folder).
+
+to select each subset, i'm using `git annex metadata --set <tag>=<value> <path>`.
+
+what i would like to do, ideally, is to leverage each `git annex view <tag>=<value>` invocation to directly check out the view's files to a specific directory outside of the annex repo.
+
+the use case is basically the "Copying objects" strategy of the [syncthing special remote discussion](http://git-annex.branchable.com/todo/syncthing_special_remote/), although rather than having the 'directory' special remote contain files in that remote's specific layout, i would like them to be checked out simply with their original file names.
+
+say i have these files in my main annex repo:
+
+ a.pdf (metadata: topic=haskell)
+ b.pdf (metadata: topic=haskell)
+ c.pdf (metadata: topic=iojs)
+ d.pdf (metadata: topic=python)
+ e.pdf (metadata: topic=haskell)
+
+if i issue `git annex view topic=haskell`, i have the files i want in my annex' root:
+
+ a.pdf
+ b.pdf
+ e.pdf
+
+obviously i could then simply run `rsync --exclude .git -aL --delete . ../other/dir`, which is totally fine, but maybe i'm just blindly missing something obvious and i could simply use something like `git annex --work-tree=../other/dir view topic=haskell` and see `a.pdf`, `b.pdf` and `e.pdf` appear in the target directory (i don't need any metadata in that directory, so only the plain files and no .git folder for a remote is fine).
diff --git a/doc/git-annex-fsck.mdwn b/doc/git-annex-fsck.mdwn
index 73c401e..68c824c 100644
--- a/doc/git-annex-fsck.mdwn
+++ b/doc/git-annex-fsck.mdwn
@@ -37,7 +37,12 @@ With parameters, only the specified files are checked.
* `--more`
- Continue the last incremental fsck pass, where it left off.
+ Resume the last incremental fsck pass, where it left off.
+
+ Resuming may redundantly check some files that were checked
+ before. Any files that fsck found problems with before will be re-checked
+ on resume. Also, checkpoints are made every 1000 files or every 5 minutes
+ during a fsck, and it resumes from the last checkpoint.
* `--incremental-schedule=time`
diff --git a/doc/git-annex-proxy.mdwn b/doc/git-annex-proxy.mdwn
index 570789c..2744b11 100644
--- a/doc/git-annex-proxy.mdwn
+++ b/doc/git-annex-proxy.mdwn
@@ -31,6 +31,14 @@ stage the changes in the index, and then proxy a commit:
git annex add myfile
git annex proxy -- git commit myfile -m foo
+The temporary work tree that the git command is run in is set up by
+checking out all files that are in the index, and copying (or hard linking)
+any unstaged files from the real work tree. Since the git command is run
+using this temporary work tree, it won't see eg, local modifications to
+files. So, it probably is not useful to proxy a command like "git add".
+However, you can use the proxy with any git command you like, as long as
+you think about how it will interact with the temporary work tree.
+
# SEE ALSO
[[git-annex]](1)
diff --git a/doc/git-annex-shell.mdwn b/doc/git-annex-shell.mdwn
index 7919f72..d0e0930 100644
--- a/doc/git-annex-shell.mdwn
+++ b/doc/git-annex-shell.mdwn
@@ -31,7 +31,8 @@ first "/~/" or "/~user/" is expanded to the specified home directory.
When run in a repository that does not yet have an annex.uuid, one
will be created, as long as a git-annex branch has already been pushed to
- the repository.
+ the repository, or if the autoinit= flag is used to indicate
+ initialization is desired.
* inannex directory [key ...]
@@ -69,12 +70,12 @@ first "/~/" or "/~user/" is expanded to the specified home directory.
This commits any staged changes to the git-annex branch.
It also runs the annex-content hook.
-* notifychanges
+* notifychanges directory
This is used by `git-annex remotedaemon` to be notified when
refs in the remote repository are changed.
-* gcryptsetup gcryptid
+* gcryptsetup directory gcryptid
Sets up a repository as a gcrypt repository.
@@ -95,7 +96,7 @@ to git-annex-shell are:
on new dashed options).
Currently used fields include remoteuuid=, associatedfile=,
- and direct=
+ direct=, and autoinit=
# HOOK
diff --git a/doc/news/version_5.20150617.mdwn b/doc/news/version_5.20150617.mdwn
deleted file mode 100644
index 690649c..0000000
--- a/doc/news/version_5.20150617.mdwn
+++ /dev/null
@@ -1,50 +0,0 @@
-git-annex 5.20150617 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Now supports git annex sync --all --content to sync all versions of all
- files with all repos that want them.
- * Added new "anything" preferred content expression, which matches all
- versions of all files.
- * Standard preferred content for client, backup, incremental backup,
- and unwanted groups have been adjusted to work better when used
- with git annex sync --all --content.
- * fromkey, registerurl: Improve handling of urls that happen to also
- be parsable as strange keys.
- * sync, remotedaemon: Pass configured ssh-options even when
- annex.sshcaching is disabled.
- * assistant: Consume systemd-networkd dbus events to learn about
- changes to network connections, as was already done with
- network-manager and wicd.
- Thanks to Sebastian Reuße for the patches.
- * get --incomplete: New option to resume any interrupted downloads.
- * dead --key: Can be used to mark a key as dead.
- * fsck: Ignore keys that are known to be dead when running in
- --all/--unused/--key mode or a in a bare repo. Closes: #[753888](http://bugs.debian.org/753888)
- Otherwise, still reports files with lost contents, even if the content
- is dead.
- * S3: Special remotes can be configured with public=yes to allow
- the public to access the bucket's content.
- * S3: Publically accessible buckets can be used without creds.
- * import --clean-duplicates: Fix bug that didn't count local or trusted
- repo's copy of a file as one of the necessary copies to allow removing
- it from the import location.
- * tahoe: Use ~/.tahoe-git-annex/ rather than ~/.tahoe/git-annex/
- when setting up a tahoe special remote to avoid old versions of
- tahoe create-client choking.
- * Fix bug that prevented enumerating locally present objects in repos
- tuned with annex.tune.objecthash1=true.
- Fixes: unused, object count in info, unannex.
- * Improve url parsing to handle some urls containing illegal []
- characters in their paths.
- * info: Added json output for "backend usage", "numcopies stats",
- "repositories containing these files", and "transfers in progress".
- * Fix incremental backup standard preferred content expression to match
- its documentation, which says it does not want files that have reached
- a backup repository.
- * Increased the default annex.bloomaccuracy from 1000 to 10000000.
- This makes git annex unused use up to 16 mb more memory than it did
- before, but the massive increase in accuracy makes this worthwhile
- for all but the smallest systems.
- * Build documentation with deterministic=1 for reproducible builds.
- (A new ikiwiki feature.) Closes: #[785736](http://bugs.debian.org/785736)
- * Re-remove dependency on obsolete hamlet package. Closes: #[786659](http://bugs.debian.org/786659)
- * debian/cabal-wrapper: Removed this hack which should not be needed anymore."""]] \ No newline at end of file
diff --git a/doc/news/version_5.20150812.mdwn b/doc/news/version_5.20150812.mdwn
new file mode 100644
index 0000000..4848de8
--- /dev/null
+++ b/doc/news/version_5.20150812.mdwn
@@ -0,0 +1,40 @@
+git-annex 5.20150812 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Added support for SHA3 hashed keys (in 8 varieties), when git-annex is
+ built using the cryptonite library.
+ * metadata: Fix reversion introduced in 5.20150727 that caused recursive
+ display of metadata to not work.
+ * Windows: Fix bug that caused git-annex sync to fail due to missing
+ environment variable.
+ * Fix setting/setting/viewing metadata that contains unicode or other
+ special characters, when in a non-unicode locale.
+ * Simplify setup process for a ssh remote. Now it suffices to run git
+ remote add, followed by git-annex sync. Now the remote is automatically
+ initialized for use by git-annex, where before the git-annex branch had
+ to manually be pushed before using git-annex sync. Note that this
+ involved changes to git-annex-shell, so if the remote is using an old
+ version, the manual push is still needed.
+ * git-annex-shell: Don't let configlist auto-init repository when in
+ readonly mode.
+ * Perform a clean shutdown when --time-limit is reached.
+ This includes running queued git commands, and cleanup actions normally
+ run when a command is finished.
+ * fsck: Commit incremental fsck database when --time-limit is reached.
+ Previously, some of the last files fscked did not make it into the
+ database when using --time-limit.
+ * fsck: Commit incremental fsck database after every 1000 files
+ fscked, or every 5 minutes, whichever comes first. Previously,
+ commits were made every 1000 files fscked.
+ * Linux standalone: Work around problem that prevented it from working
+ properly if unpacked into a directory that contains ":" or ";" in its
+ name.
+ * proxy: Fix proxy git commit of non-annexed files in direct mode.
+ * proxy: If a non-proxied git command, such as git revert
+ would normally fail because of unstaged files in the work tree,
+ make the proxied command fail the same way.
+ * proxy: Fix removal of files deleted by the proxied command.
+ * proxy: Fix behavior when run in subdirectory of git repo.
+ * Improve Setup.hs file so that cabal copy --destdir works.
+ Thanks, Magnus Therning.
+ * Tighten dependency on optparse-applicative to 0.11.0.
+ * Added back debian/cabal-wrapper, since it still seems needed after all."""]] \ No newline at end of file
diff --git a/doc/special_remotes/comment_23_aba4abb897c6ecc0c6ba72cbd21b9f4b._comment b/doc/special_remotes/comment_23_aba4abb897c6ecc0c6ba72cbd21b9f4b._comment
deleted file mode 100644
index 65c4513..0000000
--- a/doc/special_remotes/comment_23_aba4abb897c6ecc0c6ba72cbd21b9f4b._comment
+++ /dev/null
@@ -1,12 +0,0 @@
-[[!comment format=mdwn
- username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"
- nickname="Bence"
- subject="Amazon Cloud Drive support"
- date="2015-03-28T10:35:47Z"
- content="""
-Is there a special remote implementation for Amazon Cloud Drive?
-
-It's just became unlimited for a fair price: $60/year ( https://www.amazon.com/clouddrive/pricing ).
-
-http://techcrunch.com/2015/03/26/amazon-goes-after-dropbox-google-microsoft-with-unlimited-cloud-drive-storage/
-"""]]
diff --git a/doc/tips/centralized_git_repository_tutorial/on_your_own_server.mdwn b/doc/tips/centralized_git_repository_tutorial/on_your_own_server.mdwn
index cc6bfbe..6d5d1cd 100644
--- a/doc/tips/centralized_git_repository_tutorial/on_your_own_server.mdwn
+++ b/doc/tips/centralized_git_repository_tutorial/on_your_own_server.mdwn
@@ -8,10 +8,16 @@ See for example [[using_gitolite_with_git-annex]].
## set up the server
On the server, you'll want to [[install]] git, and git-annex, if you haven't
-already.
+already. If possible, install it using your distribution's package manager:
server# sudo apt-get install git git-annex
+Note that git-annex-shell needs to be located somewhere in the PATH, so
+that a client can successfully run "ssh yourserver git-annex-shell".
+Installing git-annex using a package manager will take care of this for
+you. But if you're not root or otherwise can't install git-annex that way,
+you may need to do more work; see [[get_git-annex-shell_into_PATH]].
+
Decide where to put the repository on the server, and create a bare git repo
there. In your home directory is a simple choice:
diff --git a/doc/tips/get_git-annex-shell_into_PATH.mdwn b/doc/tips/get_git-annex-shell_into_PATH.mdwn
new file mode 100644
index 0000000..8ecdd16
--- /dev/null
+++ b/doc/tips/get_git-annex-shell_into_PATH.mdwn
@@ -0,0 +1,55 @@
+The [[git-annex-shell]] program is a part of git-annex that is used when
+accessing a git-annex repository on a remote server. The client runs
+something like "ssh server git-annex-shell". For this to work,
+git-annex-shell needs to be installed in PATH.
+
+If you install git-annex on your server as root, using a distribution's
+package manager, like apt-get, or otherwise installing it into /usr/bin, or
+/usr/local/bin, then git-annex-shell will be in PATH, and you'll not have
+any trouble (and can stop reading here).
+
+But, if you need to install git-annex on a server without being root,
+it can be tricky to get it into PATH. The bash shell doesn't source all of
+its config files when ssh uses it to run a non-interactive command like
+git-annex-shell, so even if git-annex-shell seems to be in PATH when you're
+logged onto the server, "ssh server git-annex-shell" won't find it.
+
+ bash: git-annex-shell: command not found; failed; exit code 127
+
+----
+
+In some systems (when it's compiled with `SSH_SOURCE_BASHRC` set), bash will
+load your `~/.bashrc` (but not your `~/.bash_profile`). So you can add to
+PATH in the .bashrc.
+
+Note that many .bashrc files start with something like this:
+
+ # If not running interactively, don't do anything
+ [ -z "$PS1" ] && return
+
+So, make sure to make any PATH changes before such a guard. For example:
+
+ PATH=$HOME/bin/:$PATH
+
+ # If not running interactively, don't do anything else
+ [ -z "$PS1" ] && return
+
+----
+
+In some systems, bash won't load *any* config files at all.
+A few ways to deal with that:
+
+* Move or symlink git-annex-shell into a directory like
+ /usr/bin, that is in the default PATH.
+
+* If you're not root, ask the system administrator to please install
+ git-annex system-wide.
+
+* As a last resort, you can configure the git repository that's using
+ the server to know where git-annex shell is installed, by configuring
+ `remote.<name>.annex-shell`
+
+ For example, if git-annex-shell is installed in ~/bin/git-annex-shell
+ on the server, and the git remote named "annoyingserver" uses the server:
+
+ git config remote.annoyingserver.annex-shell /home/me/bin/git-annex-shell
diff --git a/doc/tips/using_the_SHA1_backend.mdwn b/doc/tips/using_the_SHA1_backend.mdwn
deleted file mode 100644
index 70dc2ef..0000000
--- a/doc/tips/using_the_SHA1_backend.mdwn
+++ /dev/null
@@ -1,11 +0,0 @@
-A handy alternative to the default [[backend|backends]] is the
-SHA1 backend. This backend provides more git-style assurance that your data
-has not been damaged. And the checksum means that when you add the same
-content to the annex twice, only one copy need be stored in the backend.
-
-The only reason it's not the default is that it needs to checksum
-files when they're added to the annex, and this can slow things down
-significantly for really big files. To make SHA1 the default, just
-add something like this to `.gitattributes`:
-
- * annex.backend=SHA1
diff --git a/doc/todo.mdwn b/doc/todo.mdwn
index 62224c3..78947c0 100644
--- a/doc/todo.mdwn
+++ b/doc/todo.mdwn
@@ -1,4 +1,4 @@
This is git-annex's todo list. Link items to [[todo/done]] when done. A more complete [[design/roadmap/]] is also available.
[[!inline pages="./todo/* and !./todo/done and !link(done)
-and !*/Discussion" actions=yes postform=yes show=0 archive=yes]]
+and !*/Discussion" actions=yes postform=yes postformtext="Add a new todo titled:" show=0 archive=yes]]
diff --git a/doc/todo/Amazon_Cloud_Drive.mdwn b/doc/todo/Amazon_Cloud_Drive.mdwn
new file mode 100644
index 0000000..80df302
--- /dev/null
+++ b/doc/todo/Amazon_Cloud_Drive.mdwn
@@ -0,0 +1,14 @@
+Is there a special remote implementation for Amazon Cloud Drive?
+
+It's just became unlimited for a fair price: $60/year ( https://www.amazon.com/clouddrive/pricing ).
+
+http://techcrunch.com/2015/03/26/amazon-goes-after-dropbox-google-microsoft-with-unlimited-cloud-drive-storage/
+
+-- bence
+
+> Not yet, but I just need to investigate haskell api bindings for it, I
+> suppose. --[[Joey]]
+
+> > Don't know if there's such a thing... there seems to be SDKs for android and IOS, but nothing more. It seems like it's a REST API: https://developer.amazon.com/public/apis/experience/cloud-drive/... --[[anarcat]]
+
+>> requested it be added to amazonka <https://github.com/brendanhay/amazonka/issues/168> --[[Joey]]
diff --git a/doc/todo/amazon_prime_photos.mdwn b/doc/todo/amazon_prime_photos.mdwn
new file mode 100644
index 0000000..3956939
--- /dev/null
+++ b/doc/todo/amazon_prime_photos.mdwn
@@ -0,0 +1,3 @@
+ just thought to check if you anyhow considered it Joey: https://www.amazon.ca/clouddrive/primephotos , which could be a great feature for those with prime, even if only for photos. didn't check about any API
+
+ cheers
diff --git a/doc/todo/better_git-annex-shell_init_workflow.mdwn b/doc/todo/better_git-annex-shell_init_workflow.mdwn
new file mode 100644
index 0000000..58bf021
--- /dev/null
+++ b/doc/todo/better_git-annex-shell_init_workflow.mdwn
@@ -0,0 +1,12 @@
+Currently, the workflow for initializing a remote repo has to involve
+manually pushing the git-annex branch to the repo, first. This primes
+git-annex-shell to auto-initialize the repo. Only after that first push,
+can git-annex sync be used. If git-annex sync is run earlier, it will try
+to get the remore uuid, fail, and set annex-ignore.
+
+This should be improved.. It ought to be possible to add a new remote and
+have git-annex sync do everything needed.
+
+> [[done]]; the remote needs git-annex-shell 5.20150805 installed, and so
+> does the user, and then `git-annex sync` will automatically handle
+> initialization of the remote. --[[Joey]]
diff --git a/doc/todo/ditch_yesod.mdwn b/doc/todo/ditch_yesod.mdwn
new file mode 100644
index 0000000..2b53402
--- /dev/null
+++ b/doc/todo/ditch_yesod.mdwn
@@ -0,0 +1,32 @@
+I'd like to move away from using yesod for the web app, for a number of
+reasons:
+
+* It's by far the largest use of TH in git-annex, and TH is of course very
+ painful for the android port, other builds like debian mips that don't
+ currently support TH, etc.
+* I think it's responsible for at least 50% of the executable size, and I
+ suspect a lot of that is unncessary bloat for parts of yesod that
+ git-annex doesn't really use.
+* Hamlet constantly annoys me by rejecting any file that contains tabs.
+ **Rage**
+* Hamlet contains code that's not really haskell, but looks a lot like it.
+ This is a continual frustration when dealing with the hamlet files.
+* I find that Hamlet does not lend itself to being refactored, everything
+ is essentially an IO action with side effects of generating html, so
+ can't really bring proper FP tools to bear.
+
+At the moment, servant seems like the nicest place to end up. Just as type
+safe as yesod afaik, and very lightweight and simple and rather awesome.
+
+As for the html generation, lucid seems like a good way to do it. Just as
+fast as hamlet, and pure haskell code.
+
+Game plan:
+
+1. Uploadd a yesod-lucid to hackage. (done)
+2. Get servant, lucid, maybe yesod-lucid, packaged in Debian
+3. Start converting individual yesod Handler Html to Handler LucidHtml.
+ This will ditch the hamlet. This is by far the most work, but it can be
+ done incrementally w/o breaking the build.
+4. Once all the hamlet is gone, remove the rest of the yesod stuff and
+ re-implement the routing etc with servant.
diff --git a/doc/todo/git_annex_push.mdwn b/doc/todo/git_annex_push.mdwn
new file mode 100644
index 0000000..079c83e
--- /dev/null
+++ b/doc/todo/git_annex_push.mdwn
@@ -0,0 +1 @@
+A common use case for me is to use annex as really just an addition to git to store additional content. What I am ending up with is two stage procedure to submit my changes to our shared repository: git push REMOTE; git annex copy --to=REMOTE . IMHO it would only be logical if there was "git annex push REMOTE [GITPUSHOPTIONS]" which would be merely an alias for "git push REMOTE [GITPUSHOPTIONS]; git annex copy --to=REMOTE" but which will make use of annex for such common usecase simple(r)
diff --git a/doc/todo/git_annex_push/comment_1_54c5494ec21621298b3111cd7c2325b1._comment b/doc/todo/git_annex_push/comment_1_54c5494ec21621298b3111cd7c2325b1._comment
new file mode 100644
index 0000000..608f1f9
--- /dev/null
+++ b/doc/todo/git_annex_push/comment_1_54c5494ec21621298b3111cd7c2325b1._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-08-04T20:19:22Z"
+ content="""
+`git annex sync --content` does what you want, only it also does a pull and
+a merge from remotes.
+
+I don't know that wanting to only push, w/o pull and merge, is common
+enough to make a separate command for it.
+
+There's also the problem that to push the git-annex branch, it really
+makes sense to first pull/merge from the remote. Otherwise, the push
+is not likely to work as well. And too, it makes sense to update the
+git-annex branch from remotes in order to know what files that have, so
+that info can be better used to decide which files to send to them --
+especially when preferred content might make some file not be sent to all
+remotes, depending on which other remotes contain the file.
+"""]]
diff --git a/doc/todo/git_annex_push/comment_2_67938223c42c2a81dbfd32cd8a6a39c2._comment b/doc/todo/git_annex_push/comment_2_67938223c42c2a81dbfd32cd8a6a39c2._comment
new file mode 100644
index 0000000..757824c
--- /dev/null
+++ b/doc/todo/git_annex_push/comment_2_67938223c42c2a81dbfd32cd8a6a39c2._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/EbvxpTI_xP9Aod7Mg4cwGhgjrCrdM5s-#7c0f4"
+ subject="comment 2"
+ date="2015-08-09T03:04:31Z"
+ content="""
+ indeed pull/merge ( ie sync) would often be needed. but the same in regular git workflow - we can't push if remote has new changes. so we know that we need to \" git pull\" ( or alternative merge dance). my whining here is pretty much about dichotomy between regular git command and accompanying annex commands for simple typical workflows - i need to educate people much more beyond \" in your typical use case, when you all collaborate on this repo, just use git annex add to place big files under annex control, and then git annex push to push all your changes\". then if annex push checked first that push of annex branch can't happen and that annex merge is due, and let user know to run it first - they will do, and things will remain clear. now there is a lot of annex uniquely named commands which do not \" correlate\" with git ones even for simple use cases, which makes adoption harder imho.
+"""]]
diff --git a/doc/todo/git_annex_push/comment_3_ccb822eeb9b0d60f811568e4f27f970a._comment b/doc/todo/git_annex_push/comment_3_ccb822eeb9b0d60f811568e4f27f970a._comment
new file mode 100644
index 0000000..f28008d
--- /dev/null
+++ b/doc/todo/git_annex_push/comment_3_ccb822eeb9b0d60f811568e4f27f970a._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2015-08-11T17:37:05Z"
+ content="""
+I tend to be uncomfortable with wrapping many git commands into git-annex
+commands with the same name. All the regular git commands can be used
+in a git-annex repository, and I don't want to get users thinking they need
+to look for git-annex commands instead when the git commands work perfectly
+well.
+
+`git annex copy` is fundamentally different than `git push`, so the user
+needs to learn about the complication of needing to copy the contents
+around separately. Perhaps even copying content to different (special)
+remotes than where git pushes to. `git annex sync --content` is there for
+users who want to keep two repos in sync and don't want to be concerned with the details.
+`git annex push` would seem to be for users who want to know about the details,
+but not all of them. Seems like a losing and/or confusing choice.
+"""]]
diff --git a/doc/todo/subsecond_timestamping_of_the_--debug_output.mdwn b/doc/todo/subsecond_timestamping_of_the_--debug_output.mdwn
new file mode 100644
index 0000000..9820338
--- /dev/null
+++ b/doc/todo/subsecond_timestamping_of_the_--debug_output.mdwn
@@ -0,0 +1 @@
+ATM --debug uses timestamps at second precision. Would be nice (to see where time is spent) to have subsecond timing
diff --git a/doc/walkthrough/using_ssh_remotes.mdwn b/doc/walkthrough/using_ssh_remotes.mdwn
index ee8b629..4797a58 100644
--- a/doc/walkthrough/using_ssh_remotes.mdwn
+++ b/doc/walkthrough/using_ssh_remotes.mdwn
@@ -31,3 +31,6 @@ access, if available. There is a annex-cost setting you can configure in
Also, note that you need full shell access for this to work --
git-annex needs to be able to ssh in and run commands. Or at least,
your shell needs to be able to run the [[git-annex-shell]] command.
+
+For details on setting up ssh remotes, see the
+[[tips/centralized_git_repository_tutorial]].
diff --git a/git-annex.cabal b/git-annex.cabal
index 5d72b0e..5431d6d 100644
--- a/git-annex.cabal
+++ b/git-annex.cabal
@@ -1,5 +1,5 @@
Name: git-annex
-Version: 5.20150731
+Version: 5.20150812
Cabal-Version: >= 1.8
License: GPL-3
Maintainer: Joey Hess <id@joeyh.name>
@@ -109,12 +109,14 @@ Flag Database
Description: Enable building with persistent for database use (disable to build on platforms not supporting TH)
Default: True
+Flag Cryptonite
+ Description: Use the cryptonite library, instead of the older cryptohash
+
Executable git-annex
Main-Is: git-annex.hs
Build-Depends:
base (>= 4.5 && < 4.9),
- optparse-applicative (>= 0.10),
- cryptohash (>= 0.11.0),
+ optparse-applicative (>= 0.11.0),
containers (>= 0.5.0.0),
exceptions (>= 0.6),
QuickCheck (>= 2.1),
@@ -144,6 +146,12 @@ Executable git-annex
else
Build-Depends: network (< 2.6), network (>= 2.0)
+ if flag(Cryptonite)
+ Build-Depends: cryptonite
+ CPP-Options: -DWITH_CRYPTONITE
+ else
+ Build-Depends: cryptohash (>= 0.11.0)
+
if flag(Production)
GHC-Options: -O2
diff --git a/man/git-annex-fsck.1 b/man/git-annex-fsck.1
index f4d4965..7f234f5 100644
--- a/man/git-annex-fsck.1
+++ b/man/git-annex-fsck.1
@@ -31,7 +31,12 @@ Start a new incremental fsck pass. An incremental fsck can be interrupted
at any time, with eg ctrl\-c.
.IP
.IP "\fB\-\-more\fP"
-Continue the last incremental fsck pass, where it left off.
+Resume the last incremental fsck pass, where it left off.
+.IP
+Resuming may redundantly check some files that were checked
+before. Any files that fsck found problems with before will be re\-checked
+on resume. Also, checkpoints are made every 1000 files or every 5 minutes
+during a fsck, and it resumes from the last checkpoint.
.IP
.IP "\fB\-\-incremental\-schedule=time\fP"
This makes a new incremental fsck be started only a specified
diff --git a/man/git-annex-proxy.1 b/man/git-annex-proxy.1
index e801bc2..42f03ed 100644
--- a/man/git-annex-proxy.1
+++ b/man/git-annex-proxy.1
@@ -29,6 +29,14 @@ stage the changes in the index, and then proxy a commit:
git annex add myfile
git annex proxy \-\- git commit myfile \-m foo
.PP
+The temporary work tree that the git command is run in is set up by
+checking out all files that are in the index, and copying (or hard linking)
+any unstaged files from the real work tree. Since the git command is run
+using this temporary work tree, it won't see eg, local modifications to
+files. So, it probably is not useful to proxy a command like "git add".
+However, you can use the proxy with any git command you like, as long as
+you think about how it will interact with the temporary work tree.
+.PP
.SH SEE ALSO
git-annex(1)
.PP
diff --git a/man/git-annex-shell.1 b/man/git-annex-shell.1
index f195be7..ed6a9d6 100644
--- a/man/git-annex-shell.1
+++ b/man/git-annex-shell.1
@@ -27,7 +27,8 @@ repository.
.IP
When run in a repository that does not yet have an annex.uuid, one
will be created, as long as a git-annex branch has already been pushed to
-the repository.
+the repository, or if the autoinit= flag is used to indicate
+initialization is desired.
.IP
.IP "inannex directory [key ...]"
This checks if all specified keys are present in the annex,
@@ -59,11 +60,11 @@ that have been received so far.
This commits any staged changes to the git-annex branch.
It also runs the annex\-content hook.
.IP
-.IP "notifychanges"
+.IP "notifychanges directory"
This is used by \fBgit-annex remotedaemon\fP to be notified when
refs in the remote repository are changed.
.IP
-.IP "gcryptsetup gcryptid"
+.IP "gcryptsetup directory gcryptid"
Sets up a repository as a gcrypt repository.
.IP
.SH OPTIONS
@@ -80,7 +81,7 @@ past versions of git-annex\-shell (that ignore these, but would choke
on new dashed options).
.IP
Currently used fields include remoteuuid=, associatedfile=,
-and direct=
+direct=, and autoinit=
.IP
.SH HOOK
After content is received or dropped from the repository by git-annex\-shell,
diff --git a/standalone/android/cabal.config b/standalone/android/cabal.config
index ccfd3b2..ab31104 100644
--- a/standalone/android/cabal.config
+++ b/standalone/android/cabal.config
@@ -1,1062 +1,199 @@
-constraints: abstract-deque ==0.3,
- abstract-par ==0.3.3,
- accelerate ==0.15.1.0,
- ace ==0.6,
- action-permutations ==0.0.0.1,
- active ==0.1.0.19,
- AC-Vector ==2.3.2,
- ad ==4.2.2,
- adjunctions ==4.2.1,
- aeson-pretty ==0.7.2,
- aeson-qq ==0.7.4,
- aeson-utils ==0.3.0.1,
- alarmclock ==0.2.0.6,
- alex ==3.1.4,
- amazonka ==0.3.4,
- amazonka-autoscaling ==0.3.4,
- amazonka-cloudformation ==0.3.4,
- amazonka-cloudfront ==0.3.4,
- amazonka-cloudhsm ==0.3.4,
- amazonka-cloudsearch ==0.3.4,
- amazonka-cloudsearch-domains ==0.3.4,
- amazonka-cloudtrail ==0.3.4,
- amazonka-cloudwatch ==0.3.4,
- amazonka-cloudwatch-logs ==0.3.4,
- amazonka-codedeploy ==0.3.4,
- amazonka-cognito-identity ==0.3.4,
- amazonka-cognito-sync ==0.3.4,
- amazonka-config ==0.3.4,
- amazonka-core ==0.3.4,
- amazonka-datapipeline ==0.3.4,
- amazonka-directconnect ==0.3.4,
- amazonka-dynamodb ==0.3.4,
- amazonka-ec2 ==0.3.4,
- amazonka-ecs ==0.3.4,
- amazonka-elasticache ==0.3.4,
- amazonka-elasticbeanstalk ==0.3.4,
- amazonka-elastictranscoder ==0.3.4,
- amazonka-elb ==0.3.4,
- amazonka-emr ==0.3.4,
- amazonka-glacier ==0.3.4,
- amazonka-iam ==0.3.4,
- amazonka-importexport ==0.3.4,
- amazonka-kinesis ==0.3.4,
- amazonka-kms ==0.3.4,
- amazonka-lambda ==0.3.4,
- amazonka-opsworks ==0.3.4,
- amazonka-rds ==0.3.4,
- amazonka-redshift ==0.3.4,
- amazonka-route53 ==0.3.4,
- amazonka-route53-domains ==0.3.4,
- amazonka-s3 ==0.3.4,
- amazonka-sdb ==0.3.4,
- amazonka-ses ==0.3.4,
- amazonka-sns ==0.3.4,
- amazonka-sqs ==0.3.4,
- amazonka-ssm ==0.3.4,
- amazonka-storagegateway ==0.3.4,
- amazonka-sts ==0.3.4,
- amazonka-support ==0.3.4,
- amazonka-swf ==0.3.4,
- amqp ==0.12.2,
- ansi-terminal ==0.6.2.1,
- ansi-wl-pprint ==0.6.7.2,
+constraints: Crypto ==4.2.5.1,
+ binary ==0.7.6.1,
+ DAV ==1.0.3,
+ HTTP ==4000.2.17,
+ HUnit ==1.2.5.2,
+ IfElse ==0.85,
+ MissingH ==1.2.1.0,
+ MonadRandom ==0.1.13,
+ QuickCheck ==2.7.6,
+ SafeSemaphore ==0.10.1,
+ aeson ==0.7.0.6,
+ ansi-wl-pprint ==0.6.7.1,
appar ==0.1.4,
- applicative-quoters ==0.1.0.8,
- approximate ==0.2.1.1,
- arbtt ==0.9.0.2,
- arithmoi ==0.4.1.2,
- array installed,
- arrow-list ==0.7,
- asn1-data ==0.7.1,
- asn1-encoding ==0.9.0,
- asn1-parse ==0.9.1,
- asn1-types ==0.3.0,
- async ==2.0.2,
- atto-lisp ==0.2.2,
- attoparsec ==0.12.1.6,
- attoparsec-enumerator ==0.3.4,
- attoparsec-expr ==0.1.1.2,
- authenticate ==1.3.2.11,
- authenticate-oauth ==1.5.1.1,
- auto-update ==0.1.2.1,
- aws ==0.11.4,
- bake ==0.2,
- bank-holidays-england ==0.1.0.3,
- base installed,
+ asn1-encoding ==0.8.1.3,
+ asn1-parse ==0.8.1,
+ asn1-types ==0.2.3,
+ async ==2.0.1.5,
+ attoparsec ==0.11.3.4,
+ attoparsec-conduit ==1.1.0,
+ authenticate ==1.3.2.10,
+ base-unicode-symbols ==0.2.2.4,
base16-bytestring ==0.1.1.6,
base64-bytestring ==1.0.0.1,
- base64-string ==0.2,
- base-compat ==0.6.0,
- base-prelude ==0.1.19,
- base-unicode-symbols ==0.2.2.4,
- basic-prelude ==0.3.13,
- bcrypt ==0.0.6,
- bifunctors ==4.2.1,
- binary installed,
- binary-conduit ==1.2.3,
- binary-list ==1.1.1.0,
- bindings-DSL ==1.0.22,
- bin-package-db installed,
- bioace ==0.0.1,
- bioalign ==0.0.5,
- biocore ==0.3.1,
- biofasta ==0.0.3,
- biofastq ==0.1,
- biophd ==0.0.7,
- biopsl ==0.4,
- biosff ==0.3.7.1,
- bits ==0.4,
- blank-canvas ==0.5,
- BlastHTTP ==1.0.1,
- blastxml ==0.3.2,
- blaze-builder ==0.4.0.1,
- blaze-builder-enumerator ==0.2.1.0,
- blaze-html ==0.8.0.2,
- blaze-markup ==0.7.0.2,
- blaze-svg ==0.3.4.1,
- blaze-textual ==0.2.0.9,
- bloodhound ==0.5.0.1,
- bmp ==1.2.5.2,
- Boolean ==0.2.3,
- boolsimplifier ==0.1.8,
- bound ==1.0.5,
- BoundedChan ==1.0.3.0,
- broadcast-chan ==0.1.0,
- bson ==0.3.1,
- bumper ==0.6.0.3,
+ bifunctors ==4.1.1.1,
+ bloomfilter ==2.0.0.0,
byteable ==0.1.1,
- bytedump ==1.0,
byteorder ==1.0.4,
- bytes ==0.15,
- bytestring installed,
- bytestring-builder ==0.10.6.0.0,
- bytestring-conversion ==0.3.0,
- bytestring-lexing ==0.4.3.2,
- bytestring-mmap ==0.2.2,
- bytestring-progress ==1.0.5,
- bytestring-trie ==0.2.4.1,
- bzlib ==0.5.0.5,
- bzlib-conduit ==0.2.1.3,
- c2hs ==0.25.2,
- Cabal installed,
- cabal-file-th ==0.2.3,
- Cabal-ide-backend ==1.23.0.0,
- cabal-install ==1.18.1.0,
- cabal-rpm ==0.9.6,
- cabal-src ==0.2.5.1,
- cabal-test-quickcheck ==0.1.4,
- cairo ==0.13.1.0,
- cartel ==0.14.2.6,
- case-insensitive ==1.2.0.4,
- cases ==0.1.2.1,
- cassava ==0.4.2.4,
- cereal ==0.4.1.1,
- cereal-conduit ==0.7.2.3,
- certificate ==1.3.9,
- charset ==0.3.7.1,
- Chart ==1.3.3,
- Chart-diagrams ==1.3.3,
- ChasingBottoms ==1.3.0.12,
- check-email ==1.0,
- checkers ==0.4.3,
- chell ==0.4.0.1,
- chell-quickcheck ==0.2.5,
- chunked-data ==0.1.0.1,
- cipher-aes ==0.2.10,
- cipher-aes128 ==0.6.4,
- cipher-blowfish ==0.0.3,
- cipher-camellia ==0.0.2,
+ case-insensitive ==1.2.0.1,
+ cereal ==0.4.0.1,
+ cipher-aes ==0.2.8,
cipher-des ==0.0.6,
cipher-rc4 ==0.1.4,
- circle-packing ==0.1.0.4,
- classy-prelude ==0.11.1.1,
- classy-prelude-conduit ==0.11.1,
- classy-prelude-yesod ==0.11.1,
- clay ==0.10.1,
- clientsession ==0.9.1.1,
- clock ==0.4.6.0,
- cmdargs ==0.10.13,
- code-builder ==0.1.3,
- colour ==2.3.3,
- comonad ==4.2.6,
- comonads-fd ==4.0,
- comonad-transformers ==4.0,
- compdata ==0.9,
- compensated ==0.6.1,
- composition ==1.0.1.1,
- compressed ==3.10,
- concatenative ==1.0.1,
- concurrent-extra ==0.7.0.9,
- concurrent-supply ==0.1.7.1,
- cond ==0.4.1.1,
- conduit ==1.2.4.2,
- conduit-combinators ==0.3.1,
- conduit-extra ==1.1.8,
- configurator ==0.3.0.0,
- connection ==0.2.4,
- constraints ==0.4.1.3,
- consul-haskell ==0.1,
- containers installed,
- containers-unicode-symbols ==0.3.1.1,
- contravariant ==1.3.1.1,
- control-monad-free ==0.6.1,
- control-monad-loop ==0.1,
- convertible ==1.1.1.0,
- cookie ==0.4.1.5,
- courier ==0.1.0.15,
- cpphs ==1.19,
- cprng-aes ==0.6.1,
- cpu ==0.1.2,
- criterion ==1.1.0.0,
+ clientsession ==0.9.0.3,
+ comonad ==4.2,
+ conduit ==1.1.6,
+ conduit-extra ==1.1.3,
+ connection ==0.2.3,
+ contravariant ==0.6.1.1,
+ cookie ==0.4.1.2,
+ cprng-aes ==0.5.2,
crypto-api ==0.13.2,
- crypto-api-tests ==0.3,
- cryptocipher ==0.6.2,
- crypto-cipher-tests ==0.0.11,
crypto-cipher-types ==0.0.9,
+ crypto-numbers ==0.2.3,
+ crypto-pubkey ==0.2.4,
+ crypto-pubkey-types ==0.4.2.2,
+ crypto-random ==0.0.7,
cryptohash ==0.11.6,
cryptohash-conduit ==0.1.1,
- cryptohash-cryptoapi ==0.1.3,
- cryptol ==2.2.2,
- crypto-numbers ==0.2.7,
- crypto-pubkey ==0.2.8,
- crypto-pubkey-types ==0.4.3,
- crypto-random ==0.0.9,
- crypto-random-api ==0.2.0,
css-text ==0.1.2.1,
- csv ==0.1.2,
- csv-conduit ==0.6.6,
- cubicspline ==0.1.1,
- curl ==1.3.8,
- data-accessor ==0.2.2.6,
- data-accessor-mtl ==0.2.0.4,
- data-binary-ieee754 ==0.4.4,
data-default ==0.5.3,
data-default-class ==0.0.1,
data-default-instances-base ==0.0.1,
data-default-instances-containers ==0.0.1,
data-default-instances-dlist ==0.0.1,
data-default-instances-old-locale ==0.0.1,
- data-inttrie ==0.1.0,
- data-lens-light ==0.1.2.1,
- data-memocombinators ==0.5.1,
- data-reify ==0.6.1,
- DAV ==1.0.5,
- Decimal ==0.4.2,
- deepseq installed,
- deepseq-generics ==0.1.1.2,
- derive ==2.5.22,
- descriptive ==0.9.3,
- diagrams ==1.2,
- diagrams-cairo ==1.2.0.7,
- diagrams-canvas ==0.3.0.4,
- diagrams-contrib ==1.1.2.6,
- diagrams-core ==1.2.0.6,
- diagrams-lib ==1.2.0.9,
- diagrams-postscript ==1.1.0.5,
- diagrams-rasterific ==0.1.0.8,
- diagrams-svg ==1.1.0.5,
- Diff ==0.3.2,
- digest ==0.0.1.2,
- digestive-functors ==0.7.1.5,
- dimensional ==0.13.0.2,
- directory installed,
- directory-tree ==0.12.0,
- direct-sqlite ==2.3.15,
- distributed-process ==0.5.3,
- distributed-process-async ==0.2.1,
- distributed-process-client-server ==0.1.2,
- distributed-process-execution ==0.1.1,
- distributed-process-extras ==0.2.0,
- distributed-process-simplelocalnet ==0.2.2.0,
- distributed-process-supervisor ==0.1.2,
- distributed-process-task ==0.1.1,
- distributed-static ==0.3.1.0,
+ sandi ==0.3.0.1,
+ dbus ==0.10.8,
distributive ==0.4.4,
- djinn-ghc ==0.0.2.3,
- djinn-lib ==0.0.1.2,
- dlist ==0.7.1.1,
- dlist-instances ==0.1,
- doctest ==0.9.13,
- double-conversion ==2.0.1.0,
- DRBG ==0.5.4,
- dual-tree ==0.2.0.6,
- easy-file ==0.2.1,
- ede ==0.2.8.2,
- edit-distance ==0.2.1.3,
- effect-handlers ==0.1.0.6,
- either ==4.3.4,
- elm-core-sources ==1.0.0,
- email-validate ==2.0.1,
- enclosed-exceptions ==1.0.1.1,
- entropy ==0.3.6,
- enumerator ==0.4.20,
- eq ==4.0.4,
- erf ==2.0.0.0,
- errorcall-eq-instance ==0.2.0.1,
+ dlist ==0.7.0.1,
+ dns ==1.3.0,
+ edit-distance ==0.2.1.2,
+ either ==4.3,
+ email-validate ==1.0.0,
+ entropy ==0.2.1,
errors ==1.4.7,
- ersatz ==0.3,
- esqueleto ==2.1.3,
- exception-mtl ==0.3.0.5,
- exceptions ==0.8.0.2,
- exception-transformers ==0.3.0.4,
- executable-hash ==0.2.0.0,
- executable-path ==0.0.3,
- extensible-exceptions ==0.1.1.4,
- extra ==1.1,
- fast-logger ==2.3.1,
- fay ==0.23.1.4,
- fay-base ==0.20.0.0,
- fay-builder ==0.2.0.5,
- fay-dom ==0.5.0.1,
- fay-jquery ==0.6.0.3,
- fay-text ==0.3.2.2,
- fay-uri ==0.2.0.0,
- fb ==1.0.10,
- fb-persistent ==0.3.4,
- fclabels ==2.0.2.2,
- FenwickTree ==0.1.2.1,
- fgl ==5.5.1.0,
- file-embed ==0.0.8.2,
- file-location ==0.4.7.1,
- filemanip ==0.3.6.3,
- filepath installed,
- fingertree ==0.1.0.2,
- fixed ==0.2.1.1,
- fixed-list ==0.1.6,
- fixed-vector ==0.7.0.3,
- flexible-defaults ==0.0.1.1,
- flock ==0.3.1.8,
- fmlist ==0.9,
- focus ==0.1.4,
- foldl ==1.0.10,
- FontyFruity ==0.5.1.1,
- force-layout ==0.3.0.11,
- foreign-store ==0.2,
- formatting ==6.2.0,
- free ==4.11,
- freenect ==1.2,
- frisby ==0.2,
- fsnotify ==0.1.0.3,
- fuzzcheck ==0.1.1,
- gd ==3000.7.3,
- generic-aeson ==0.2.0.5,
- generic-deriving ==1.6.3,
- GenericPretty ==1.2.1,
- generics-sop ==0.1.1.2,
- generic-xmlpickler ==0.1.0.2,
- ghc installed,
- ghc-heap-view ==0.5.3,
- ghcid ==0.3.6,
- ghc-mod ==5.2.1.2,
- ghc-mtl ==1.2.1.0,
- ghc-paths ==0.1.0.9,
- ghc-prim installed,
- ghc-syb-utils ==0.2.3,
- gio ==0.13.1.0,
- gipeda ==0.1.0.2,
- git-embed ==0.1.0,
- gitlib ==3.1.0.1,
- gitlib-libgit2 ==3.1.0.4,
- gitlib-test ==3.1.0.2,
- gitrev ==1.0.0,
- gitson ==0.5.1,
- gl ==0.7.7,
- glib ==0.13.1.0,
- Glob ==0.7.5,
- GLURaw ==1.5.0.1,
- GLUT ==2.7.0.1,
- graph-core ==0.2.2.0,
- graphs ==0.6.0.1,
- GraphSCC ==1.0.4,
- graphviz ==2999.17.0.2,
- gravatar ==0.8.0,
- groundhog ==0.7.0.3,
- groundhog-mysql ==0.7.0.1,
- groundhog-postgresql ==0.7.0.2,
- groundhog-sqlite ==0.7.0.1,
- groundhog-th ==0.7.0.1,
- groupoids ==4.0,
- groups ==0.4.0.0,
- gtk ==0.13.6,
- gtk2hs-buildtools ==0.13.0.3,
- gtk3 ==0.13.6,
- hackage-mirror ==0.1.0.0,
- haddock-api ==2.15.0.2,
- haddock-library ==1.1.1,
- hakyll ==4.6.9.0,
- half ==0.2.0.1,
- HandsomeSoup ==0.3.5,
- happstack-server ==7.4.2,
- happy ==1.19.5,
- hashable ==1.2.3.2,
- hashable-extras ==0.2.1,
- hashmap ==1.3.0.1,
- hashtables ==1.2.0.2,
- haskeline installed,
- haskell2010 installed,
- haskell98 installed,
- haskell-lexer ==1.0,
- haskell-names ==0.5.2,
- HaskellNet ==0.4.4,
- haskell-packages ==0.2.4.4,
- haskell-src ==1.0.2.0,
- haskell-src-exts ==1.16.0.1,
- haskell-src-meta ==0.6.0.9,
- haskintex ==0.5.0.3,
- hasql ==0.7.3.1,
- hasql-backend ==0.4.1,
- hasql-postgres ==0.10.3.1,
- hastache ==0.6.1,
- HaTeX ==3.16.1.1,
- HaXml ==1.25.3,
- haxr ==3000.10.4.2,
- HCodecs ==0.5,
- hdaemonize ==0.5.0.0,
- hdevtools ==0.1.0.8,
- hdocs ==0.4.1.3,
- heap ==1.0.2,
- heaps ==0.3.2.1,
- hebrew-time ==0.1.1,
- heist ==0.14.1,
- here ==1.2.7,
- heredoc ==0.2.0.0,
- hexpat ==0.20.9,
- hflags ==0.4,
- highlighting-kate ==0.5.12,
- hindent ==4.4.2,
- hinotify ==0.3.7,
- hint ==0.4.2.3,
- histogram-fill ==0.8.4.1,
- hit ==0.6.3,
+ exceptions ==0.6.1,
+ failure ==0.2.0.3,
+ fast-logger ==2.1.5,
+ fdo-notify ==0.3.1,
+ feed ==0.3.9.2,
+ file-embed ==0.0.6,
+ fingertree ==0.1.0.0,
+ free ==4.9,
+ gnuidn ==0.2,
+ gnutls ==0.1.4,
+ gsasl ==0.3.5,
+ hS3 ==0.5.7,
+ hashable ==1.2.1.0,
+ hinotify ==0.3.5,
hjsmin ==0.1.4.7,
- hledger ==0.24.1,
- hledger-lib ==0.24.1,
- hledger-web ==0.24.1,
- hlibgit2 ==0.18.0.14,
- hlint ==1.9.20,
- hmatrix ==0.16.1.5,
- hmatrix-gsl ==0.16.0.3,
- hmatrix-gsl-stats ==0.2.1,
- hmatrix-repa ==0.1.2.1,
- hoauth2 ==0.4.7,
- holy-project ==0.1.1.1,
- hoogle ==4.2.41,
- hoopl installed,
- hOpenPGP ==2.0,
- hopenpgp-tools ==0.14.1,
- hostname ==1.0,
- hostname-validate ==1.0.0,
- hourglass ==0.2.9,
- hpc installed,
- hpc-coveralls ==0.9.0,
- hPDB ==1.2.0.3,
- hPDB-examples ==1.2.0.2,
- hs-bibutils ==5.5,
- hscolour ==1.22,
- hsdev ==0.1.3.4,
- hse-cpp ==0.1,
- hsignal ==0.2.7,
- hslogger ==1.2.9,
- hslua ==0.3.13,
- HsOpenSSL ==0.11.1.1,
- hspec ==2.1.7,
- hspec-attoparsec ==0.1.0.2,
- hspec-core ==2.1.7,
- hspec-discover ==2.1.7,
- hspec-expectations ==0.6.1.1,
- hspec-meta ==2.1.7,
- hspec-smallcheck ==0.3.0,
- hspec-wai ==0.6.3,
- hspec-wai-json ==0.6.0,
- hstatistics ==0.2.5.2,
- HStringTemplate ==0.8.3,
- hsyslog ==2.0,
- HTF ==0.12.2.4,
- html ==1.0.1.2,
- html-conduit ==1.1.1.2,
- HTTP ==4000.2.19,
- http-client ==0.4.11.2,
- http-client-openssl ==0.2.0.1,
+ hslogger ==1.2.1,
+ http-client ==0.4.11.1,
http-client-tls ==0.2.2,
http-conduit ==2.1.5,
- http-date ==0.0.6.1,
- http-media ==0.6.2,
- http-reverse-proxy ==0.4.2,
- http-types ==0.8.6,
- HUnit ==1.2.5.2,
- hweblib ==0.6.3,
- hxt ==9.3.1.15,
- hxt-charproperties ==9.2.0.1,
- hxt-curl ==9.1.1.1,
- hxt-expat ==9.1.1,
- hxt-http ==9.1.5.2,
- hxt-pickle-utils ==0.1.0.3,
- hxt-regex-xmlschema ==9.2.0.2,
- hxt-relaxng ==9.1.5.5,
- hxt-tagsoup ==9.1.3,
- hxt-unicode ==9.0.2.4,
- hybrid-vectors ==0.1.2.1,
- hyphenation ==0.4.2.1,
- iconv ==0.4.1.2,
- ide-backend ==0.9.0.9,
- ide-backend-common ==0.9.1.1,
- ide-backend-rts ==0.1.3.1,
- idna ==0.3.0,
- ieee754 ==0.7.6,
- IfElse ==0.85,
- imagesize-conduit ==1.1,
- immortal ==0.2,
- include-file ==0.1.0.2,
- incremental-parser ==0.2.3.4,
- indents ==0.3.3,
- ini ==0.3.1,
- integer-gmp installed,
- integration ==0.2.1,
- interpolate ==0.1.0,
- interpolatedstring-perl6 ==0.9.0,
- intervals ==0.7.1,
- io-choice ==0.0.5,
- io-manager ==0.1.0.2,
- io-memoize ==1.1.1.0,
- iproute ==1.3.2,
- iterable ==3.0,
- ixset ==1.0.6,
- jmacro ==0.6.12,
- jmacro-rpc ==0.3.2,
- jmacro-rpc-happstack ==0.3.2,
- jmacro-rpc-snap ==0.3,
- jose-jwt ==0.4.2,
- js-flot ==0.8.3,
- js-jquery ==1.11.3,
- json ==0.9.1,
- json-autotype ==0.2.5.13,
- json-schema ==0.7.3.5,
- JuicyPixels ==3.2.4,
- JuicyPixels-repa ==0.7,
- kan-extensions ==4.2.2,
- kansas-comet ==0.3.1,
- kdt ==0.2.3,
- keter ==1.3.10.1,
- keys ==3.10.2,
- kmeans ==0.1.3,
- koofr-client ==1.0.0.3,
- kure ==2.16.10,
- language-c ==0.4.7,
- language-c-quote ==0.10.2.1,
- language-ecmascript ==0.17,
- language-glsl ==0.1.1,
- language-haskell-extract ==0.2.4,
- language-java ==0.2.7,
- language-javascript ==0.5.13.3,
- lattices ==1.2.1.1,
- lazy-csv ==0.5,
- lca ==0.3,
- lens ==4.7.0.1,
- lens-action ==0.1.0.1,
- lens-aeson ==1.0.0.4,
- lens-family-core ==1.2.0,
- lens-family-th ==0.4.1.0,
- lhs2tex ==1.19,
- libgit ==0.3.1,
- libnotify ==0.1.1.0,
- lifted-async ==0.7.0.1,
- lifted-base ==0.2.3.6,
- linear ==1.18.1.1,
- linear-accelerate ==0.2,
- List ==0.5.2,
- ListLike ==4.2.0,
- list-t ==0.4.5.1,
- loch-th ==0.2.1,
- log-domain ==0.10.0.1,
- logict ==0.6.0.2,
- loop ==0.2.0,
- lrucache ==1.2.0.0,
- lucid ==2.9.2,
- lucid-svg ==0.4.0.4,
- lzma-conduit ==1.1.3,
- machines ==0.4.1,
- machines-directory ==0.2.0.6,
- machines-io ==0.2.0.6,
- machines-process ==0.2.0.4,
- mainland-pretty ==0.2.7.2,
- managed ==1.0.0,
- mandrill ==0.2.2.0,
- map-syntax ==0.2,
- markdown ==0.1.13.2,
- markdown-unlit ==0.2.0.1,
- math-functions ==0.1.5.2,
- matrix ==0.3.4.3,
- maximal-cliques ==0.1.1,
- MaybeT ==0.1.2,
- mbox ==0.3.1,
- MemoTrie ==0.6.2,
- mersenne-random-pure64 ==0.2.0.4,
- messagepack ==0.3.0,
- messagepack-rpc ==0.1.0.3,
- MFlow ==0.4.5.9,
- mime-mail ==0.4.8.2,
- mime-mail-ses ==0.3.2.2,
- mime-types ==0.1.0.6,
- missing-foreign ==0.1.1,
- MissingH ==1.3.0.1,
- mmap ==0.5.9,
- mmorph ==1.0.4,
- MonadCatchIO-transformers ==0.3.1.3,
- monad-control ==1.0.0.4,
- monad-coroutine ==0.9.0.1,
- monadcryptorandom ==0.6.1,
- monadic-arrays ==0.2.1.4,
- monad-journal ==0.7,
- monadLib ==3.7.3,
- monadloc ==0.7.1,
- monad-logger ==0.3.13.1,
- monad-logger-json ==0.1.0.0,
- monad-logger-syslog ==0.1.1.1,
+ http-date ==0.0.2,
+ http-types ==0.8.5,
+ hxt ==9.3.1.4,
+ hxt-charproperties ==9.1.1.1,
+ hxt-regex-xmlschema ==9.0.4,
+ hxt-unicode ==9.0.2.2,
+ idna ==0.2,
+ iproute ==1.2.11,
+ json ==0.5,
+ keys ==3.10.1,
+ language-javascript ==0.5.13,
+ lens ==4.4.0.2,
+ libxml-sax ==0.7.5,
+ mime-mail ==0.4.1.2,
+ mime-types ==0.1.0.4,
+ mmorph ==1.0.3,
+ monad-control ==0.3.2.2,
+ monad-logger ==0.3.6.1,
monad-loops ==0.4.2.1,
- monad-par ==0.3.4.7,
- monad-parallel ==0.7.1.4,
- monad-par-extras ==0.3.3,
- monad-primitive ==0.1,
- monad-products ==4.0.0.1,
- MonadPrompt ==1.0.0.5,
- MonadRandom ==0.3.0.2,
- monad-st ==0.2.4,
monads-tf ==0.1.0.2,
- mongoDB ==2.0.5,
- monoid-extras ==0.3.3.5,
- monoid-subclasses ==0.4.0.4,
- mono-traversable ==0.9.1,
- mtl ==2.1.3.1,
- mtl-compat ==0.2.1.1,
- mtlparse ==0.1.4.0,
- mtl-prelude ==1.0.3,
- multiarg ==0.30.0.8,
- multimap ==1.2.1,
- multipart ==0.1.2,
- MusicBrainz ==0.2.4,
- mutable-containers ==0.3.0,
- mwc-random ==0.13.3.2,
- mysql ==0.1.1.8,
- mysql-simple ==0.2.2.5,
- nanospec ==0.2.1,
- nats ==1,
- neat-interpolation ==0.2.2.1,
- nettle ==0.1.0,
- network ==2.6.1.0,
- network-anonymous-i2p ==0.10.0,
- network-attoparsec ==0.12.2,
+ mtl ==2.1.2,
+ nats ==0.1.2,
+ network ==2.4.1.2,
network-conduit ==1.1.0,
- network-conduit-tls ==1.1.2,
network-info ==0.2.0.5,
- network-multicast ==0.0.11,
- network-simple ==0.4.0.4,
- network-transport ==0.4.1.0,
- network-transport-tcp ==0.4.1,
- network-transport-tests ==0.2.2.0,
- network-uri ==2.6.0.3,
- newtype ==0.2,
- nsis ==0.2.5,
- numbers ==3000.2.0.1,
- numeric-extras ==0.0.3,
- NumInstances ==1.4,
- numtype ==1.1,
- ObjectName ==1.1.0.0,
- Octree ==0.5.4.2,
- old-locale installed,
- OneTuple ==0.2.1,
- opaleye ==0.3.1.2,
- OpenGL ==2.12.0.1,
- OpenGLRaw ==2.4.1.0,
- openpgp-asciiarmor ==0.1,
- operational ==0.2.3.2,
- options ==1.2.1.1,
+ network-multicast ==0.0.10,
+ network-protocol-xmpp ==0.4.6,
+ network-uri ==2.6.0.1,
optparse-applicative ==0.11.0.2,
- optparse-simple ==0.0.2,
- osdkeys ==0.0,
- pagerduty ==0.0.3.1,
- palette ==0.1.0.2,
- pandoc ==1.13.2.1,
- pandoc-citeproc ==0.6.0.1,
- pandoc-types ==1.12.4.2,
- pango ==0.13.1.0,
- parallel ==3.2.0.6,
- parallel-io ==0.3.3,
- parseargs ==0.1.5.2,
- parsec ==3.1.9,
- parsers ==0.12.2.1,
- partial-handler ==0.1.1,
- path-pieces ==0.2.0,
- patience ==0.1.1,
- pcre-heavy ==0.2.2,
- pcre-light ==0.4.0.3,
- pdfinfo ==1.5.4,
+ parallel ==3.2.0.4,
+ path-pieces ==0.1.4,
pem ==0.2.2,
- persistent ==2.1.5,
- persistent-mongoDB ==2.1.2.2,
- persistent-mysql ==2.1.3.1,
- persistent-postgresql ==2.1.5.3,
- persistent-sqlite ==2.1.4.2,
- persistent-template ==2.1.3.1,
- phantom-state ==0.2.0.2,
- picoparsec ==0.1.2.2,
- pipes ==4.1.5,
- pipes-aeson ==0.4.1.3,
- pipes-attoparsec ==0.5.1.2,
- pipes-binary ==0.4.0.4,
- pipes-bytestring ==2.1.1,
- pipes-concurrency ==2.0.3,
- pipes-group ==1.0.2,
- pipes-network ==0.6.4,
- pipes-parse ==3.0.2,
- pipes-safe ==2.2.2,
- placeholders ==0.1,
- plot ==0.2.3.4,
- plot-gtk ==0.2.0.2,
- plot-gtk3 ==0.1,
- pointed ==4.2.0.2,
- polyparse ==1.11,
- postgresql-binary ==0.5.2.1,
- postgresql-libpq ==0.9.0.2,
- postgresql-simple ==0.4.10.0,
- post-mess-age ==0.1.0.0,
- prednote ==0.32.0.6,
- prefix-units ==0.1.0.2,
+ persistent ==1.3.3,
+ persistent-template ==1.3.2.2,
+ pointed ==4.0,
prelude-extras ==0.4,
- presburger ==1.3.1,
- present ==2.2,
- pretty installed,
- prettyclass ==1.0.0.0,
- pretty-class ==1.0.1.1,
- pretty-show ==1.6.8.2,
- primes ==0.2.1.0,
- primitive ==0.6,
- process installed,
- process-extras ==0.3.3.4,
- product-profunctors ==0.6.1,
- profunctor-extras ==4.0,
- profunctors ==4.4.1,
- project-template ==0.1.4.2,
- PSQueue ==1.1,
+ profunctors ==4.0.4,
publicsuffixlist ==0.1,
punycode ==2.0,
- pure-io ==0.2.1,
- pureMD5 ==2.1.2.1,
- pwstore-fast ==2.4.4,
- quandl-api ==0.2.1.0,
- QuasiText ==0.1.2.5,
- QuickCheck ==2.7.6,
- quickcheck-assertions ==0.2.0,
- quickcheck-instances ==0.3.11,
- quickcheck-io ==0.1.1,
- quickcheck-unicode ==1.0.0.1,
- rainbow ==0.22.0.2,
- random ==1.1,
- random-fu ==0.2.6.2,
- random-shuffle ==0.0.4,
- random-source ==0.3.0.6,
- rank1dynamic ==0.2.0.1,
- Rasterific ==0.5.2.1,
- rasterific-svg ==0.1.0.3,
- raw-strings-qq ==1.0.2,
- ReadArgs ==1.2.2,
- reducers ==3.10.3.1,
- reflection ==1.5.2.1,
- RefSerialize ==0.3.1.4,
- regex-applicative ==0.3.1,
+ random ==1.0.1.1,
+ ranges ==0.2.4,
+ reducers ==3.10.2.1,
+ reflection ==1.2.0.1,
regex-base ==0.93.2,
regex-compat ==0.95.1,
- regex-pcre-builtin ==0.94.4.8.8.35,
regex-posix ==0.95.2,
- regexpr ==0.5.4,
regex-tdfa ==1.2.0,
- regex-tdfa-rc ==1.1.8.3,
- regular ==0.3.4.4,
- regular-xmlpickler ==0.2,
- rematch ==0.2.0.0,
- repa ==3.3.1.2,
- repa-algorithms ==3.3.1.2,
- repa-devil ==0.3.2.6,
- repa-io ==3.3.1.2,
- reroute ==0.2.3.0,
- resource-pool ==0.2.3.2,
- resourcet ==1.1.5,
- rest-client ==0.5.0.3,
- rest-core ==0.35.1,
- rest-gen ==0.17.0.4,
- rest-happstack ==0.2.10.8,
- rest-snap ==0.1.17.18,
- rest-stringmap ==0.2.0.4,
- rest-types ==1.13.1,
- rest-wai ==0.1.0.8,
- rethinkdb-client-driver ==0.0.18,
- retry ==0.6,
- rev-state ==0.1,
- rfc5051 ==0.1.0.3,
- RSA ==2.1.0.1,
- rts installed,
- runmemo ==1.0.0.1,
- rvar ==0.2.0.2,
- safe ==0.3.9,
- safecopy ==0.8.5,
- sbv ==4.2,
- scientific ==0.3.3.8,
- scotty ==0.9.1,
- scrobble ==0.2.1.1,
- sdl2 ==1.3.1,
- securemem ==0.1.7,
- semigroupoid-extras ==4.0,
- semigroupoids ==4.3,
- semigroups ==0.16.2.2,
- semver ==0.3.3.1,
- sendfile ==0.7.9,
- seqloc ==0.6.1.1,
- servant ==0.2.2,
- servant-client ==0.2.2,
- servant-docs ==0.3.1,
- servant-jquery ==0.2.2.1,
- servant-server ==0.2.4,
- setenv ==0.1.1.3,
- set-monad ==0.2.0.0,
- SHA ==1.6.4.2,
- shake ==0.15.2,
- shake-language-c ==0.6.4,
+ resource-pool ==0.2.1.1,
+ resourcet ==1.1.2.3,
+ safe ==0.3.8,
+ securemem ==0.1.3,
+ semigroupoids ==4.2,
+ semigroups ==0.15.3,
shakespeare ==2.0.5,
- shakespeare-text ==1.1.0,
- shell-conduit ==4.5.2,
- shelltestrunner ==1.3.5,
- shelly ==1.6.1.2,
silently ==1.2.4.1,
- simple-reflect ==0.3.2,
- simple-sendfile ==0.2.20,
- singletons ==1.1.2,
- siphash ==1.0.3,
- skein ==1.0.9.3,
- slave-thread ==0.1.6,
- smallcheck ==1.1.1,
- smoothie ==0.1.3,
- smtLib ==1.0.7,
- snap ==0.14.0.4,
- snap-core ==0.9.7.0,
- snaplet-fay ==0.3.3.11,
- snap-server ==0.9.5.1,
- snowflake ==0.1.1.1,
- soap ==0.2.2.5,
- soap-openssl ==0.1.0.2,
- soap-tls ==0.1.1.2,
+ simple-sendfile ==0.2.14,
+ skein ==1.0.9,
socks ==0.5.4,
- sodium ==0.11.0.3,
- sourcemap ==0.1.3.0,
- speculation ==1.5.0.2,
- sphinx ==0.6.0.1,
split ==0.2.2,
- Spock ==0.7.9.0,
- Spock-digestive ==0.1.0.0,
- Spock-worker ==0.2.1.3,
- spoon ==0.3.1,
- sqlite-simple ==0.4.8.0,
- srcloc ==0.4.1,
- stackage ==0.7.2.0,
- stackage-build-plan ==0.1.1.0,
- stackage-cli ==0.1.0.2,
- stackage-curator ==0.7.4,
- stackage-install ==0.1.1.1,
- stackage-types ==1.0.1.1,
- stackage-update ==0.1.2,
- stackage-upload ==0.1.0.5,
- stateref ==0.3,
- statestack ==0.2.0.4,
- StateVar ==1.1.0.0,
- statistics ==0.13.2.3,
- statistics-linreg ==0.3,
- stm ==2.4.4,
- stm-chans ==3.0.0.3,
- stm-conduit ==2.5.4,
- stm-containers ==0.2.9,
- stm-stats ==0.2.0.0,
- storable-complex ==0.2.2,
- storable-endian ==0.2.5,
- streaming-commons ==0.1.12.1,
- streams ==3.2,
- strict ==0.3.2,
- stringable ==0.1.3,
- stringbuilder ==0.5.0,
- string-conversions ==0.3.0.3,
- stringprep ==1.0.0,
- stringsearch ==0.3.6.6,
- stylish-haskell ==0.5.13.0,
- SVGFonts ==1.4.0.3,
- svg-tree ==0.1.1,
- syb ==0.4.4,
- syb-with-class ==0.6.1.5,
- symbol ==0.2.4,
- system-canonicalpath ==0.3.2.0,
- system-fileio ==0.3.16.3,
- system-filepath ==0.4.13.4,
- system-posix-redirect ==1.1.0.1,
- tabular ==0.2.2.7,
- tagged ==0.7.3,
- tagshare ==0.0,
- tagsoup ==0.13.3,
- tagstream-conduit ==0.5.5.3,
- tar ==0.4.1.0,
- tardis ==0.3.0.0,
- tasty ==0.10.1.2,
- tasty-ant-xml ==1.0.1,
- tasty-golden ==2.3.0.1,
- tasty-hunit ==0.9.2,
- tasty-kat ==0.0.3,
- tasty-quickcheck ==0.8.3.2,
- tasty-smallcheck ==0.8.0.1,
- tasty-th ==0.1.3,
- TCache ==0.12.0,
- template-haskell installed,
- temporary ==1.2.0.3,
- temporary-rc ==1.2.0.3,
- terminal-progress-bar ==0.0.1.4,
- terminal-size ==0.3.0,
- terminfo installed,
- test-framework ==0.8.1.1,
- test-framework-hunit ==0.3.0.1,
- test-framework-quickcheck2 ==0.3.0.3,
- test-framework-th ==0.2.4,
- testing-feat ==0.4.0.2,
- testpack ==2.1.3.0,
- texmath ==0.8.2,
- text ==1.2.0.6,
- text-binary ==0.1.0,
- text-format ==0.3.1.1,
- text-icu ==0.7.0.1,
- text-manipulate ==0.1.3.1,
+ stm ==2.4.2,
+ stm-chans ==3.0.0.2,
+ streaming-commons ==0.1.4.1,
+ stringprep ==0.1.5,
+ stringsearch ==0.3.6.5,
+ syb ==0.4.0,
+ system-fileio ==0.3.14,
+ system-filepath ==0.4.12,
+ tagged ==0.7.2,
+ tagsoup ==0.13.1,
+ tagstream-conduit ==0.5.5.1,
+ text ==1.1.1.0,
+ text-icu ==0.6.3.7,
tf-random ==0.5,
- th-desugar ==1.5.3,
- th-expand-syns ==0.3.0.6,
- th-extras ==0.0.0.2,
- th-lift ==0.7.2,
- th-orphans ==0.11.1,
- threads ==0.5.1.3,
- th-reify-many ==0.1.3,
- thyme ==0.3.5.5,
- time installed,
- time-compat ==0.1.0.3,
- time-lens ==0.4.0.1,
- time-locale-compat ==0.1.0.1,
- timezone-olson ==0.1.7,
- timezone-series ==0.1.5.1,
- tls ==1.2.17,
- tls-debug ==0.3.4,
- tostring ==0.2.1.1,
- transformers-base ==0.4.4,
- transformers-compat ==0.4.0.3,
- traverse-with-class ==0.2.0.3,
- tree-view ==0.4,
- trifecta ==1.5.1.3,
- tttool ==1.3,
- tuple ==0.3.0.2,
- turtle ==1.0.2,
- type-eq ==0.5,
- type-list ==0.0.0.1,
- udbus ==0.2.1,
- unbounded-delays ==0.1.0.9,
- unbound-generics ==0.1.2.1,
- union-find ==0.2,
- uniplate ==1.6.12,
- unix installed,
- unix-compat ==0.4.1.4,
- unix-time ==0.3.5,
- unordered-containers ==0.2.5.1,
- uri-encode ==1.5.0.4,
- url ==2.1.3,
- users ==0.1.0.0,
- users-postgresql-simple ==0.1.0.1,
- users-test ==0.1.0.0,
- utf8-light ==0.4.2,
- utf8-string ==1,
- uuid ==1.3.10,
- uuid-types ==1.0.1,
- vault ==0.3.0.4,
- vector ==0.10.12.3,
- vector-algorithms ==0.6.0.4,
- vector-binary-instances ==0.2.1.0,
- vector-buffer ==0.4.1,
- vector-instances ==3.3.0.1,
- vector-space ==0.9,
- vector-space-points ==0.2.1.1,
- vector-th-unbox ==0.2.1.2,
- vhd ==0.2.2,
- void ==0.7,
- wai ==3.0.2.3,
- wai-app-static ==3.0.1.1,
- wai-conduit ==3.0.0.2,
- wai-eventsource ==3.0.0,
- wai-extra ==3.0.7.1,
- wai-handler-launch ==3.0.0.3,
- wai-logger ==2.2.4,
- wai-middleware-consul ==0.1.0.2,
- wai-middleware-static ==0.6.0.1,
- waitra ==0.0.3.0,
- wai-websockets ==3.0.0.5,
- warp ==3.0.13.1,
- warp-tls ==3.0.3,
- webdriver ==0.6.1,
- web-fpco ==0.1.1.0,
- websockets ==0.9.4.0,
- wizards ==1.0.2,
- wl-pprint ==1.1,
- wl-pprint-extras ==3.5.0.4,
- wl-pprint-terminfo ==3.7.1.3,
- wl-pprint-text ==1.1.0.4,
- word8 ==0.1.2,
- wordpass ==1.0.0.3,
- Workflow ==0.8.3,
- wrap ==0.0.0,
- wreq ==0.3.0.1,
- X11 ==1.6.1.2,
- x509 ==1.5.0.1,
- x509-store ==1.5.0,
- x509-system ==1.5.0,
- x509-validation ==1.5.2,
- xenstore ==0.1.1,
- xhtml installed,
- xml ==1.3.14,
- xml-conduit ==1.2.6,
- xml-conduit-writer ==0.1.1.1,
- xmlgen ==0.6.2.1,
- xml-hamlet ==0.4.0.11,
- xmlhtml ==0.2.3.4,
- xml-to-json ==2.0.1,
- xml-to-json-fast ==2.0.0,
+ tls ==1.2.9,
+ transformers ==0.3.0.0,
+ transformers-base ==0.4.1,
+ transformers-compat ==0.3.3.3,
+ unbounded-delays ==0.1.0.8,
+ unix-compat ==0.4.1.3,
+ unix-time ==0.2.2,
+ unordered-containers ==0.2.5.0,
+ utf8-string ==0.3.7,
+ uuid ==1.3.3,
+ vault ==0.3.0.3,
+ vector ==0.10.0.1,
+ void ==0.6.1,
+ wai ==3.0.1.1,
+ wai-app-static ==3.0.0.1,
+ wai-extra ==3.0.1.2,
+ wai-logger ==2.1.1,
+ warp ==3.0.0.5,
+ warp-tls ==3.0.0,
+ word8 ==0.1.1,
+ x509 ==1.4.11,
+ x509-store ==1.4.4,
+ x509-system ==1.4.5,
+ x509-validation ==1.5.0,
+ xml ==1.3.13,
+ xml-conduit ==1.2.1,
+ xml-hamlet ==0.4.0.9,
xml-types ==0.3.4,
- xss-sanitize ==0.3.5.5,
- yackage ==0.7.0.8,
- yaml ==0.8.11,
- Yampa ==0.9.7,
- YampaSynth ==0.2,
- yarr ==1.3.3.3,
- yesod ==1.4.1.5,
- yesod-auth ==1.4.5,
- yesod-auth-deskcom ==1.4.0,
- yesod-auth-fb ==1.6.6,
- yesod-auth-hashdb ==1.4.2.1,
- yesod-auth-oauth ==1.4.0.2,
- yesod-auth-oauth2 ==0.0.12,
- yesod-bin ==1.4.9.2,
- yesod-core ==1.4.9.1,
- yesod-eventsource ==1.4.0.1,
- yesod-fay ==0.7.1,
- yesod-fb ==0.3.4,
- yesod-form ==1.4.4.1,
- yesod-gitrepo ==0.1.1.0,
- yesod-newsfeed ==1.4.0.1,
- yesod-persistent ==1.4.0.2,
- yesod-sitemap ==1.4.0.1,
- yesod-static ==1.4.0.4,
- yesod-test ==1.4.3.1,
- yesod-text-markdown ==0.1.7,
- yesod-websockets ==0.2.1.1,
- zeromq4-haskell ==0.6.3,
- zip-archive ==0.2.3.7,
- zlib ==0.5.4.2,
- zlib-bindings ==0.1.1.5,
- zlib-enum ==0.2.3.1,
- zlib-lens ==0.1.2
+ xss-sanitize ==0.3.5.2,
+ yaml ==0.8.9.3,
+ yesod ==1.2.6.1,
+ yesod-auth ==1.3.4.6,
+ yesod-core ==1.2.20.1,
+ yesod-default ==1.2.0,
+ yesod-form ==1.3.16,
+ yesod-persistent ==1.2.3.1,
+ yesod-routes ==1.2.0.7,
+ yesod-static ==1.2.4,
+ zlib ==0.5.4.1,
+ bytestring ==0.10.4.0,
+ scientific ==0.3.3.1,
+ clock ==0.4.6.0
diff --git a/standalone/android/haskell-patches/crypto-numbers_build-fix.patch b/standalone/android/haskell-patches/crypto-numbers_build-fix.patch
new file mode 100644
index 0000000..5c0693a
--- /dev/null
+++ b/standalone/android/haskell-patches/crypto-numbers_build-fix.patch
@@ -0,0 +1,227 @@
+From 0cfdb30120976290068f4bcbebbf236b960afbb6 Mon Sep 17 00:00:00 2001
+From: dummy <dummy@example.com>
+Date: Thu, 26 Dec 2013 20:01:30 -0400
+Subject: [PATCH] hack to build
+
+---
+ Crypto/Number/Basic.hs | 14 --------------
+ Crypto/Number/ModArithmetic.hs | 29 -----------------------------
+ Crypto/Number/Prime.hs | 18 ------------------
+ crypto-numbers.cabal | 2 +-
+ 4 files changed, 1 insertion(+), 62 deletions(-)
+
+diff --git a/Crypto/Number/Basic.hs b/Crypto/Number/Basic.hs
+index 65c14b3..eaee853 100644
+--- a/Crypto/Number/Basic.hs
++++ b/Crypto/Number/Basic.hs
+@@ -20,11 +20,7 @@ module Crypto.Number.Basic
+ , areEven
+ ) where
+
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-import GHC.Integer.GMP.Internals
+-#else
+ import Data.Bits
+-#endif
+
+ -- | sqrti returns two integer (l,b) so that l <= sqrt i <= b
+ -- the implementation is quite naive, use an approximation for the first number
+@@ -63,25 +59,16 @@ sqrti i
+ -- gcde 'a' 'b' find (x,y,gcd(a,b)) where ax + by = d
+ --
+ gcde :: Integer -> Integer -> (Integer, Integer, Integer)
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-gcde a b = (s, t, g)
+- where (# g, s #) = gcdExtInteger a b
+- t = (g - s * a) `div` b
+-#else
+ gcde a b = if d < 0 then (-x,-y,-d) else (x,y,d) where
+ (d, x, y) = f (a,1,0) (b,0,1)
+ f t (0, _, _) = t
+ f (a', sa, ta) t@(b', sb, tb) =
+ let (q, r) = a' `divMod` b' in
+ f t (r, sa - (q * sb), ta - (q * tb))
+-#endif
+
+ -- | get the extended GCD of two integer using the extended binary algorithm (HAC 14.61)
+ -- get (x,y,d) where d = gcd(a,b) and x,y satisfying ax + by = d
+ gcde_binary :: Integer -> Integer -> (Integer, Integer, Integer)
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-gcde_binary = gcde
+-#else
+ gcde_binary a' b'
+ | b' == 0 = (1,0,a')
+ | a' >= b' = compute a' b'
+@@ -105,7 +92,6 @@ gcde_binary a' b'
+ in if u2 >= v2
+ then loop g x y (u2 - v2) v2 (a2 - c2) (b2 - d2) c2 d2
+ else loop g x y u2 (v2 - u2) a2 b2 (c2 - a2) (d2 - b2)
+-#endif
+
+ -- | check if a list of integer are all even
+ areEven :: [Integer] -> Bool
+diff --git a/Crypto/Number/ModArithmetic.hs b/Crypto/Number/ModArithmetic.hs
+index 942c12f..f8cfc32 100644
+--- a/Crypto/Number/ModArithmetic.hs
++++ b/Crypto/Number/ModArithmetic.hs
+@@ -29,12 +29,8 @@ module Crypto.Number.ModArithmetic
+ import Control.Exception (throw, Exception)
+ import Data.Typeable
+
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-import GHC.Integer.GMP.Internals
+-#else
+ import Crypto.Number.Basic (gcde_binary)
+ import Data.Bits
+-#endif
+
+ -- | Raised when two numbers are supposed to be coprimes but are not.
+ data CoprimesAssertionError = CoprimesAssertionError
+@@ -55,13 +51,7 @@ expSafe :: Integer -- ^ base
+ -> Integer -- ^ exponant
+ -> Integer -- ^ modulo
+ -> Integer -- ^ result
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-expSafe b e m
+- | odd m = powModSecInteger b e m
+- | otherwise = powModInteger b e m
+-#else
+ expSafe = exponentiation
+-#endif
+
+ -- | Compute the modular exponentiation of base^exponant using
+ -- the fastest algorithm without any consideration for
+@@ -74,11 +64,7 @@ expFast :: Integer -- ^ base
+ -> Integer -- ^ modulo
+ -> Integer -- ^ result
+ expFast =
+-#if MIN_VERSION_integer_gmp(0,5,1)
+- powModInteger
+-#else
+ exponentiation
+-#endif
+
+ -- note on exponentiation: 0^0 is treated as 1 for mimicking the standard library;
+ -- the mathematic debate is still open on whether or not this is true, but pratically
+@@ -87,22 +73,15 @@ expFast =
+ -- | exponentiation_rtl_binary computes modular exponentiation as b^e mod m
+ -- using the right-to-left binary exponentiation algorithm (HAC 14.79)
+ exponentiation_rtl_binary :: Integer -> Integer -> Integer -> Integer
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-exponentiation_rtl_binary = expSafe
+-#else
+ exponentiation_rtl_binary 0 0 m = 1 `mod` m
+ exponentiation_rtl_binary b e m = loop e b 1
+ where sq x = (x * x) `mod` m
+ loop !0 _ !a = a `mod` m
+ loop !i !s !a = loop (i `shiftR` 1) (sq s) (if odd i then a * s else a)
+-#endif
+
+ -- | exponentiation computes modular exponentiation as b^e mod m
+ -- using repetitive squaring.
+ exponentiation :: Integer -> Integer -> Integer -> Integer
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-exponentiation = expSafe
+-#else
+ exponentiation b e m
+ | b == 1 = b
+ | e == 0 = 1
+@@ -110,7 +89,6 @@ exponentiation b e m
+ | even e = let p = (exponentiation b (e `div` 2) m) `mod` m
+ in (p^(2::Integer)) `mod` m
+ | otherwise = (b * exponentiation b (e-1) m) `mod` m
+-#endif
+
+ --{-# DEPRECATED exponantiation_rtl_binary "typo in API name it's called exponentiation_rtl_binary #-}
+ exponantiation_rtl_binary :: Integer -> Integer -> Integer -> Integer
+@@ -122,17 +100,10 @@ exponantiation = exponentiation
+
+ -- | inverse computes the modular inverse as in g^(-1) mod m
+ inverse :: Integer -> Integer -> Maybe Integer
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-inverse g m
+- | r == 0 = Nothing
+- | otherwise = Just r
+- where r = recipModInteger g m
+-#else
+ inverse g m
+ | d > 1 = Nothing
+ | otherwise = Just (x `mod` m)
+ where (x,_,d) = gcde_binary g m
+-#endif
+
+ -- | Compute the modular inverse of 2 coprime numbers.
+ -- This is equivalent to inverse except that the result
+diff --git a/Crypto/Number/Prime.hs b/Crypto/Number/Prime.hs
+index 0cea9da..458c94d 100644
+--- a/Crypto/Number/Prime.hs
++++ b/Crypto/Number/Prime.hs
+@@ -3,9 +3,7 @@
+ #ifndef MIN_VERSION_integer_gmp
+ #define MIN_VERSION_integer_gmp(a,b,c) 0
+ #endif
+-#if MIN_VERSION_integer_gmp(0,5,1)
+ {-# LANGUAGE MagicHash #-}
+-#endif
+ -- |
+ -- Module : Crypto.Number.Prime
+ -- License : BSD-style
+@@ -30,12 +28,7 @@ import Crypto.Number.Generate
+ import Crypto.Number.Basic (sqrti, gcde_binary)
+ import Crypto.Number.ModArithmetic (exponantiation)
+
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-import GHC.Integer.GMP.Internals
+-import GHC.Base
+-#else
+ import Data.Bits
+-#endif
+
+ -- | returns if the number is probably prime.
+ -- first a list of small primes are implicitely tested for divisibility,
+@@ -78,21 +71,11 @@ findPrimeFromWith rng prop !n
+ -- | find a prime from a starting point with no specific property.
+ findPrimeFrom :: CPRG g => g -> Integer -> (Integer, g)
+ findPrimeFrom rng n =
+-#if MIN_VERSION_integer_gmp(0,5,1)
+- (nextPrimeInteger n, rng)
+-#else
+ findPrimeFromWith rng (\g _ -> (True, g)) n
+-#endif
+
+ -- | Miller Rabin algorithm return if the number is probably prime or composite.
+ -- the tries parameter is the number of recursion, that determines the accuracy of the test.
+ primalityTestMillerRabin :: CPRG g => g -> Int -> Integer -> (Bool, g)
+-#if MIN_VERSION_integer_gmp(0,5,1)
+-primalityTestMillerRabin rng (I# tries) !n =
+- case testPrimeInteger n tries of
+- 0# -> (False, rng)
+- _ -> (True, rng)
+-#else
+ primalityTestMillerRabin rng tries !n
+ | n <= 3 = error "Miller-Rabin requires tested value to be > 3"
+ | even n = (False, rng)
+@@ -129,7 +112,6 @@ primalityTestMillerRabin rng tries !n
+ | x2 == 1 = False
+ | x2 /= nm1 = loop' ws ((x2*x2) `mod` n) (r+1)
+ | otherwise = loop ws
+-#endif
+
+ {-
+ n < z -> witness to test
+diff --git a/crypto-numbers.cabal b/crypto-numbers.cabal
+index 9610e34..6669d78 100644
+--- a/crypto-numbers.cabal
++++ b/crypto-numbers.cabal
+@@ -15,7 +15,7 @@ Extra-Source-Files: Tests/*.hs
+
+ Flag integer-gmp
+ Description: Are we using integer-gmp?
+- Default: True
++ Default: False
+
+ Library
+ Build-Depends: base >= 4 && < 5
+--
+1.7.10.4
+
diff --git a/standalone/android/haskell-patches/entropy_cross-build.patch b/standalone/android/haskell-patches/entropy_cross-build.patch
deleted file mode 100644
index 4c27ac4..0000000
--- a/standalone/android/haskell-patches/entropy_cross-build.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 8e942c1f661b30e5477607b78528634e6d345ae8 Mon Sep 17 00:00:00 2001
-From: androidbuilder <androidbuilder@example.com>
-Date: Thu, 2 Jul 2015 21:16:15 +0000
-Subject: [PATCH] cross build
-
----
- entropy.cabal | 5 +----
- 1 file changed, 1 insertion(+), 4 deletions(-)
-
-diff --git a/entropy.cabal b/entropy.cabal
-index e4fb436..e26896c 100644
---- a/entropy.cabal
-+++ b/entropy.cabal
-@@ -14,10 +14,7 @@ category: Data, Cryptography
- homepage: https://github.com/TomMD/entropy
- bug-reports: https://github.com/TomMD/entropy/issues
- stability: stable
---- build-type: Simple
---- ^^ Used for HaLVM
--build-type: Custom
---- ^^ Test for RDRAND support using 'ghc'
-+build-type: Simple
- cabal-version: >=1.10
- tested-with: GHC == 7.8.2
- -- data-files:
---
-2.1.4
diff --git a/standalone/android/haskell-patches/gnuidn_fix-build-with-new-base.patch b/standalone/android/haskell-patches/gnuidn_fix-build-with-new-base.patch
new file mode 100644
index 0000000..ff9d8f2
--- /dev/null
+++ b/standalone/android/haskell-patches/gnuidn_fix-build-with-new-base.patch
@@ -0,0 +1,50 @@
+From afdec6c9e66211a0ac8419fffe191b059d1fd00c Mon Sep 17 00:00:00 2001
+From: foo <foo@bar>
+Date: Sun, 22 Sep 2013 17:24:33 +0000
+Subject: [PATCH] fix build with new base
+
+---
+ Data/Text/IDN/IDNA.chs | 1 +
+ Data/Text/IDN/Punycode.chs | 1 +
+ Data/Text/IDN/StringPrep.chs | 1 +
+ 3 files changed, 3 insertions(+)
+
+diff --git a/Data/Text/IDN/IDNA.chs b/Data/Text/IDN/IDNA.chs
+index ed29ee4..dbb4ba5 100644
+--- a/Data/Text/IDN/IDNA.chs
++++ b/Data/Text/IDN/IDNA.chs
+@@ -31,6 +31,7 @@ import Foreign
+ import Foreign.C
+
+ import Data.Text.IDN.Internal
++import System.IO.Unsafe
+
+ #include <idna.h>
+ #include <idn-free.h>
+diff --git a/Data/Text/IDN/Punycode.chs b/Data/Text/IDN/Punycode.chs
+index 24b5fa6..4e62555 100644
+--- a/Data/Text/IDN/Punycode.chs
++++ b/Data/Text/IDN/Punycode.chs
+@@ -32,6 +32,7 @@ import Data.List (unfoldr)
+ import qualified Data.ByteString as B
+ import qualified Data.Text as T
+
++import System.IO.Unsafe
+ import Foreign
+ import Foreign.C
+
+diff --git a/Data/Text/IDN/StringPrep.chs b/Data/Text/IDN/StringPrep.chs
+index 752dc9e..5e9fd84 100644
+--- a/Data/Text/IDN/StringPrep.chs
++++ b/Data/Text/IDN/StringPrep.chs
+@@ -39,6 +39,7 @@ import qualified Data.ByteString as B
+ import qualified Data.Text as T
+ import qualified Data.Text.Encoding as TE
+
++import System.IO.Unsafe
+ import Foreign
+ import Foreign.C
+
+--
+1.7.10.4
+
diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0006-build-fixes.patch b/standalone/android/haskell-patches/network_2.4.1.0_0006-build-fixes.patch
deleted file mode 100644
index f7cf7c7..0000000
--- a/standalone/android/haskell-patches/network_2.4.1.0_0006-build-fixes.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From cf110acc7f5863bb80ba835a009a7f59d3453239 Mon Sep 17 00:00:00 2001
-From: dummy <dummy@example.com>
-Date: Thu, 2 Jul 2015 20:19:14 +0000
-Subject: [PATCH] fix build
-
----
- Network/BSD.hsc | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/Network/BSD.hsc b/Network/BSD.hsc
-index e11ac71..039d0f1 100644
---- a/Network/BSD.hsc
-+++ b/Network/BSD.hsc
-@@ -396,7 +396,6 @@ instance Storable NetworkEntry where
- poke _p = error "Storable.poke(BSD.NetEntry) not implemented"
-
-
--#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)
- getNetworkByName :: NetworkName -> IO NetworkEntry
- getNetworkByName name = withLock $ do
- withCString name $ \ name_cstr -> do
---
-2.1.4
-
diff --git a/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch b/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch
index 3f7d2aa..16c4f92 100644
--- a/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch
+++ b/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch
@@ -1,6 +1,6 @@
-From da127aa3b2c6cbf679950eb593eb8c88384cc26b Mon Sep 17 00:00:00 2001
+From db9eb179885874af342bb2c3adef7185496ba1f1 Mon Sep 17 00:00:00 2001
From: dummy <dummy@example.com>
-Date: Thu, 2 Jul 2015 20:34:05 +0000
+Date: Wed, 15 Oct 2014 16:37:32 +0000
Subject: [PATCH] hack for bionic
---
@@ -9,10 +9,10 @@ Subject: [PATCH] hack for bionic
2 files changed, 1 insertion(+), 13 deletions(-)
diff --git a/Data/UnixTime/Types.hsc b/Data/UnixTime/Types.hsc
-index 6253b27..fb5b3fa 100644
+index d30f39b..ec7ca4c 100644
--- a/Data/UnixTime/Types.hsc
+++ b/Data/UnixTime/Types.hsc
-@@ -12,8 +12,6 @@ import Data.Binary
+@@ -9,8 +9,6 @@ import Foreign.Storable
#include <sys/time.h>
@@ -20,8 +20,8 @@ index 6253b27..fb5b3fa 100644
-
-- |
-- Data structure for Unix time.
- --
-@@ -33,16 +31,6 @@ data UnixTime = UnixTime {
+ data UnixTime = UnixTime {
+@@ -20,16 +18,6 @@ data UnixTime = UnixTime {
, utMicroSeconds :: {-# UNPACK #-} !Int32
} deriving (Eq,Ord,Show)
@@ -35,14 +35,14 @@ index 6253b27..fb5b3fa 100644
- (#poke struct timeval, tv_sec) ptr (utSeconds ut)
- (#poke struct timeval, tv_usec) ptr (utMicroSeconds ut)
-
- #if __GLASGOW_HASKELL__ >= 704
- instance Binary UnixTime where
- put (UnixTime (CTime sec) msec) = do
+ -- |
+ -- Format of the strptime()/strftime() style.
+ type Format = ByteString
diff --git a/cbits/conv.c b/cbits/conv.c
-index 669cfda..8fa5f9a 100644
+index ec31fef..b7bc0f9 100644
--- a/cbits/conv.c
+++ b/cbits/conv.c
-@@ -98,7 +98,7 @@ time_t c_parse_unix_time_gmt(char *fmt, char *src) {
+@@ -96,7 +96,7 @@ time_t c_parse_unix_time_gmt(char *fmt, char *src) {
#else
strptime(src, fmt, &dst);
#endif
@@ -52,5 +52,5 @@ index 669cfda..8fa5f9a 100644
size_t c_format_unix_time(char *fmt, time_t src, char* dst, int siz) {
--
-2.1.4
+2.1.1
diff --git a/standalone/android/haskell-patches/vector_cross-build.patch b/standalone/android/haskell-patches/vector_cross-build.patch
deleted file mode 100644
index 2abc305..0000000
--- a/standalone/android/haskell-patches/vector_cross-build.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 6ffd4fcb7d27ec6df709d80a40a262406446a259 Mon Sep 17 00:00:00 2001
-From: dummy <dummy@example.com>
-Date: Wed, 15 Oct 2014 17:00:56 +0000
-Subject: [PATCH] cross build
-
----
- Data/Vector/Fusion/Stream/Monadic.hs | 1 -
- 2 files changed, 14 deletions(-)
-
-diff --git a/Data/Vector/Fusion/Stream/Monadic.hs b/Data/Vector/Fusion/Stream/Monadic.hs
-index 51fec75..b089b3d 100644
---- a/Data/Vector/Fusion/Stream/Monadic.hs
-+++ b/Data/Vector/Fusion/Stream/Monadic.hs
-@@ -101,7 +101,6 @@ import GHC.Exts ( SpecConstrAnnotation(..) )
-
- data SPEC = SPEC | SPEC2
- #if __GLASGOW_HASKELL__ >= 700
--{-# ANN type SPEC ForceSpecConstr #-}
- #endif
-
- emptyStream :: String
---
-2.1.1
-
diff --git a/standalone/android/haskell-patches/warp_avoid-ipv6-for-android.patch b/standalone/android/haskell-patches/warp_avoid-ipv6-for-android.patch
deleted file mode 100644
index 6144aa0..0000000
--- a/standalone/android/haskell-patches/warp_avoid-ipv6-for-android.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From a33437e3150fb33d2fd22d29ff196be28a81c747 Mon Sep 17 00:00:00 2001
-From: androidbuilder <androidbuilder@example.com>
-Date: Thu, 2 Jul 2015 21:48:18 +0000
-Subject: [PATCH] avoid ipv6 for android
-
----
- Network/Wai/Handler/Warp/Run.hs | 9 +--------
- 1 file changed, 1 insertion(+), 8 deletions(-)
-
-diff --git a/Network/Wai/Handler/Warp/Run.hs b/Network/Wai/Handler/Warp/Run.hs
-index 34ae455..ea7475c 100644
---- a/Network/Wai/Handler/Warp/Run.hs
-+++ b/Network/Wai/Handler/Warp/Run.hs
-@@ -14,7 +14,7 @@ import Control.Monad (when, unless, void)
- import Data.ByteString (ByteString)
- import qualified Data.ByteString as S
- import Data.Char (chr)
--import Data.IP (toHostAddress, toHostAddress6)
-+import Data.IP (toHostAddress)
- import Data.IORef (IORef, newIORef, readIORef, writeIORef)
- import Data.Streaming.Network (bindPortTCP)
- import Network (sClose, Socket)
-@@ -323,13 +323,6 @@ serveConnection conn ii origAddr transport settings app = do
- [a] -> Just (SockAddrInet (readInt clientPort)
- (toHostAddress a))
- _ -> Nothing
-- ["PROXY","TCP6",clientAddr,_,clientPort,_] ->
-- case [x | (x, t) <- reads (decodeAscii clientAddr), null t] of
-- [a] -> Just (SockAddrInet6 (readInt clientPort)
-- 0
-- (toHostAddress6 a)
-- 0)
-- _ -> Nothing
- ("PROXY":"UNKNOWN":_) ->
- Just origAddr
- _ ->
---
-2.1.4
-
diff --git a/standalone/android/install-haskell-packages b/standalone/android/install-haskell-packages
index a2e1008..f338cc6 100755
--- a/standalone/android/install-haskell-packages
+++ b/standalone/android/install-haskell-packages
@@ -55,7 +55,7 @@ patched () {
if [ -e config.guess ]; then
cp /usr/share/misc/config.guess .
fi
- cabal install # --reinstall --force-reinstalls
+ cabal install # --force-reinstalls --reinstall
rm -f cabal.config
rm -rf $pkg*
@@ -65,7 +65,7 @@ patched () {
installgitannexdeps () {
pushd ../..
ln -sf standalone/android/cabal.config
- cabal install --only-dependencies "$@"
+ cabal install --only-dependencies "$@" # --force-reinstalls --reinstall
rm -f cabal.config
popd
}
@@ -86,9 +86,9 @@ EOF
patched iproute
patched primitive
patched socks
- patched entropy
patched vector
patched stm-chans
+ patched persistent
patched profunctors
patched skein
patched lens
@@ -97,32 +97,35 @@ EOF
patched persistent-template
patched system-filepath
patched optparse-applicative
- patched warp
patched wai-app-static
+ patched yesod-routes
patched shakespeare
patched yesod-core
+ patched yesod-persistent
patched yesod-form
+ patched crypto-numbers
patched clock
patched yesod-auth
patched yesod
patched process-conduit
patched DAV
patched yesod-static
- patched uuid
patched dns
patched gnutls
patched unbounded-delays
+ patched gnuidn
patched network-protocol-xmpp
+ patched uuid
cd ..
installgitannexdeps -fAndroid -f-Pairing
}
+cabal update
setupcabal
# Install packages for host ghc.
-cabal update
installgitannexdeps
# Install packages for cross ghc, with patches as necessary.
diff --git a/standalone/android/tmp/network-2.4.1.2/cabal.config b/standalone/android/tmp/network-2.4.1.2/cabal.config
index ccfd3b2..ab31104 100644
--- a/standalone/android/tmp/network-2.4.1.2/cabal.config
+++ b/standalone/android/tmp/network-2.4.1.2/cabal.config
@@ -1,1062 +1,199 @@
-constraints: abstract-deque ==0.3,
- abstract-par ==0.3.3,
- accelerate ==0.15.1.0,
- ace ==0.6,
- action-permutations ==0.0.0.1,
- active ==0.1.0.19,
- AC-Vector ==2.3.2,
- ad ==4.2.2,
- adjunctions ==4.2.1,
- aeson-pretty ==0.7.2,
- aeson-qq ==0.7.4,
- aeson-utils ==0.3.0.1,
- alarmclock ==0.2.0.6,
- alex ==3.1.4,
- amazonka ==0.3.4,
- amazonka-autoscaling ==0.3.4,
- amazonka-cloudformation ==0.3.4,
- amazonka-cloudfront ==0.3.4,
- amazonka-cloudhsm ==0.3.4,
- amazonka-cloudsearch ==0.3.4,
- amazonka-cloudsearch-domains ==0.3.4,
- amazonka-cloudtrail ==0.3.4,
- amazonka-cloudwatch ==0.3.4,
- amazonka-cloudwatch-logs ==0.3.4,
- amazonka-codedeploy ==0.3.4,
- amazonka-cognito-identity ==0.3.4,
- amazonka-cognito-sync ==0.3.4,
- amazonka-config ==0.3.4,
- amazonka-core ==0.3.4,
- amazonka-datapipeline ==0.3.4,
- amazonka-directconnect ==0.3.4,
- amazonka-dynamodb ==0.3.4,
- amazonka-ec2 ==0.3.4,
- amazonka-ecs ==0.3.4,
- amazonka-elasticache ==0.3.4,
- amazonka-elasticbeanstalk ==0.3.4,
- amazonka-elastictranscoder ==0.3.4,
- amazonka-elb ==0.3.4,
- amazonka-emr ==0.3.4,
- amazonka-glacier ==0.3.4,
- amazonka-iam ==0.3.4,
- amazonka-importexport ==0.3.4,
- amazonka-kinesis ==0.3.4,
- amazonka-kms ==0.3.4,
- amazonka-lambda ==0.3.4,
- amazonka-opsworks ==0.3.4,
- amazonka-rds ==0.3.4,
- amazonka-redshift ==0.3.4,
- amazonka-route53 ==0.3.4,
- amazonka-route53-domains ==0.3.4,
- amazonka-s3 ==0.3.4,
- amazonka-sdb ==0.3.4,
- amazonka-ses ==0.3.4,
- amazonka-sns ==0.3.4,
- amazonka-sqs ==0.3.4,
- amazonka-ssm ==0.3.4,
- amazonka-storagegateway ==0.3.4,
- amazonka-sts ==0.3.4,
- amazonka-support ==0.3.4,
- amazonka-swf ==0.3.4,
- amqp ==0.12.2,
- ansi-terminal ==0.6.2.1,
- ansi-wl-pprint ==0.6.7.2,
+constraints: Crypto ==4.2.5.1,
+ binary ==0.7.6.1,
+ DAV ==1.0.3,
+ HTTP ==4000.2.17,
+ HUnit ==1.2.5.2,
+ IfElse ==0.85,
+ MissingH ==1.2.1.0,
+ MonadRandom ==0.1.13,
+ QuickCheck ==2.7.6,
+ SafeSemaphore ==0.10.1,
+ aeson ==0.7.0.6,
+ ansi-wl-pprint ==0.6.7.1,
appar ==0.1.4,
- applicative-quoters ==0.1.0.8,
- approximate ==0.2.1.1,
- arbtt ==0.9.0.2,
- arithmoi ==0.4.1.2,
- array installed,
- arrow-list ==0.7,
- asn1-data ==0.7.1,
- asn1-encoding ==0.9.0,
- asn1-parse ==0.9.1,
- asn1-types ==0.3.0,
- async ==2.0.2,
- atto-lisp ==0.2.2,
- attoparsec ==0.12.1.6,
- attoparsec-enumerator ==0.3.4,
- attoparsec-expr ==0.1.1.2,
- authenticate ==1.3.2.11,
- authenticate-oauth ==1.5.1.1,
- auto-update ==0.1.2.1,
- aws ==0.11.4,
- bake ==0.2,
- bank-holidays-england ==0.1.0.3,
- base installed,
+ asn1-encoding ==0.8.1.3,
+ asn1-parse ==0.8.1,
+ asn1-types ==0.2.3,
+ async ==2.0.1.5,
+ attoparsec ==0.11.3.4,
+ attoparsec-conduit ==1.1.0,
+ authenticate ==1.3.2.10,
+ base-unicode-symbols ==0.2.2.4,
base16-bytestring ==0.1.1.6,
base64-bytestring ==1.0.0.1,
- base64-string ==0.2,
- base-compat ==0.6.0,
- base-prelude ==0.1.19,
- base-unicode-symbols ==0.2.2.4,
- basic-prelude ==0.3.13,
- bcrypt ==0.0.6,
- bifunctors ==4.2.1,
- binary installed,
- binary-conduit ==1.2.3,
- binary-list ==1.1.1.0,
- bindings-DSL ==1.0.22,
- bin-package-db installed,
- bioace ==0.0.1,
- bioalign ==0.0.5,
- biocore ==0.3.1,
- biofasta ==0.0.3,
- biofastq ==0.1,
- biophd ==0.0.7,
- biopsl ==0.4,
- biosff ==0.3.7.1,
- bits ==0.4,
- blank-canvas ==0.5,
- BlastHTTP ==1.0.1,
- blastxml ==0.3.2,
- blaze-builder ==0.4.0.1,
- blaze-builder-enumerator ==0.2.1.0,
- blaze-html ==0.8.0.2,
- blaze-markup ==0.7.0.2,
- blaze-svg ==0.3.4.1,
- blaze-textual ==0.2.0.9,
- bloodhound ==0.5.0.1,
- bmp ==1.2.5.2,
- Boolean ==0.2.3,
- boolsimplifier ==0.1.8,
- bound ==1.0.5,
- BoundedChan ==1.0.3.0,
- broadcast-chan ==0.1.0,
- bson ==0.3.1,
- bumper ==0.6.0.3,
+ bifunctors ==4.1.1.1,
+ bloomfilter ==2.0.0.0,
byteable ==0.1.1,
- bytedump ==1.0,
byteorder ==1.0.4,
- bytes ==0.15,
- bytestring installed,
- bytestring-builder ==0.10.6.0.0,
- bytestring-conversion ==0.3.0,
- bytestring-lexing ==0.4.3.2,
- bytestring-mmap ==0.2.2,
- bytestring-progress ==1.0.5,
- bytestring-trie ==0.2.4.1,
- bzlib ==0.5.0.5,
- bzlib-conduit ==0.2.1.3,
- c2hs ==0.25.2,
- Cabal installed,
- cabal-file-th ==0.2.3,
- Cabal-ide-backend ==1.23.0.0,
- cabal-install ==1.18.1.0,
- cabal-rpm ==0.9.6,
- cabal-src ==0.2.5.1,
- cabal-test-quickcheck ==0.1.4,
- cairo ==0.13.1.0,
- cartel ==0.14.2.6,
- case-insensitive ==1.2.0.4,
- cases ==0.1.2.1,
- cassava ==0.4.2.4,
- cereal ==0.4.1.1,
- cereal-conduit ==0.7.2.3,
- certificate ==1.3.9,
- charset ==0.3.7.1,
- Chart ==1.3.3,
- Chart-diagrams ==1.3.3,
- ChasingBottoms ==1.3.0.12,
- check-email ==1.0,
- checkers ==0.4.3,
- chell ==0.4.0.1,
- chell-quickcheck ==0.2.5,
- chunked-data ==0.1.0.1,
- cipher-aes ==0.2.10,
- cipher-aes128 ==0.6.4,
- cipher-blowfish ==0.0.3,
- cipher-camellia ==0.0.2,
+ case-insensitive ==1.2.0.1,
+ cereal ==0.4.0.1,
+ cipher-aes ==0.2.8,
cipher-des ==0.0.6,
cipher-rc4 ==0.1.4,
- circle-packing ==0.1.0.4,
- classy-prelude ==0.11.1.1,
- classy-prelude-conduit ==0.11.1,
- classy-prelude-yesod ==0.11.1,
- clay ==0.10.1,
- clientsession ==0.9.1.1,
- clock ==0.4.6.0,
- cmdargs ==0.10.13,
- code-builder ==0.1.3,
- colour ==2.3.3,
- comonad ==4.2.6,
- comonads-fd ==4.0,
- comonad-transformers ==4.0,
- compdata ==0.9,
- compensated ==0.6.1,
- composition ==1.0.1.1,
- compressed ==3.10,
- concatenative ==1.0.1,
- concurrent-extra ==0.7.0.9,
- concurrent-supply ==0.1.7.1,
- cond ==0.4.1.1,
- conduit ==1.2.4.2,
- conduit-combinators ==0.3.1,
- conduit-extra ==1.1.8,
- configurator ==0.3.0.0,
- connection ==0.2.4,
- constraints ==0.4.1.3,
- consul-haskell ==0.1,
- containers installed,
- containers-unicode-symbols ==0.3.1.1,
- contravariant ==1.3.1.1,
- control-monad-free ==0.6.1,
- control-monad-loop ==0.1,
- convertible ==1.1.1.0,
- cookie ==0.4.1.5,
- courier ==0.1.0.15,
- cpphs ==1.19,
- cprng-aes ==0.6.1,
- cpu ==0.1.2,
- criterion ==1.1.0.0,
+ clientsession ==0.9.0.3,
+ comonad ==4.2,
+ conduit ==1.1.6,
+ conduit-extra ==1.1.3,
+ connection ==0.2.3,
+ contravariant ==0.6.1.1,
+ cookie ==0.4.1.2,
+ cprng-aes ==0.5.2,
crypto-api ==0.13.2,
- crypto-api-tests ==0.3,
- cryptocipher ==0.6.2,
- crypto-cipher-tests ==0.0.11,
crypto-cipher-types ==0.0.9,
+ crypto-numbers ==0.2.3,
+ crypto-pubkey ==0.2.4,
+ crypto-pubkey-types ==0.4.2.2,
+ crypto-random ==0.0.7,
cryptohash ==0.11.6,
cryptohash-conduit ==0.1.1,
- cryptohash-cryptoapi ==0.1.3,
- cryptol ==2.2.2,
- crypto-numbers ==0.2.7,
- crypto-pubkey ==0.2.8,
- crypto-pubkey-types ==0.4.3,
- crypto-random ==0.0.9,
- crypto-random-api ==0.2.0,
css-text ==0.1.2.1,
- csv ==0.1.2,
- csv-conduit ==0.6.6,
- cubicspline ==0.1.1,
- curl ==1.3.8,
- data-accessor ==0.2.2.6,
- data-accessor-mtl ==0.2.0.4,
- data-binary-ieee754 ==0.4.4,
data-default ==0.5.3,
data-default-class ==0.0.1,
data-default-instances-base ==0.0.1,
data-default-instances-containers ==0.0.1,
data-default-instances-dlist ==0.0.1,
data-default-instances-old-locale ==0.0.1,
- data-inttrie ==0.1.0,
- data-lens-light ==0.1.2.1,
- data-memocombinators ==0.5.1,
- data-reify ==0.6.1,
- DAV ==1.0.5,
- Decimal ==0.4.2,
- deepseq installed,
- deepseq-generics ==0.1.1.2,
- derive ==2.5.22,
- descriptive ==0.9.3,
- diagrams ==1.2,
- diagrams-cairo ==1.2.0.7,
- diagrams-canvas ==0.3.0.4,
- diagrams-contrib ==1.1.2.6,
- diagrams-core ==1.2.0.6,
- diagrams-lib ==1.2.0.9,
- diagrams-postscript ==1.1.0.5,
- diagrams-rasterific ==0.1.0.8,
- diagrams-svg ==1.1.0.5,
- Diff ==0.3.2,
- digest ==0.0.1.2,
- digestive-functors ==0.7.1.5,
- dimensional ==0.13.0.2,
- directory installed,
- directory-tree ==0.12.0,
- direct-sqlite ==2.3.15,
- distributed-process ==0.5.3,
- distributed-process-async ==0.2.1,
- distributed-process-client-server ==0.1.2,
- distributed-process-execution ==0.1.1,
- distributed-process-extras ==0.2.0,
- distributed-process-simplelocalnet ==0.2.2.0,
- distributed-process-supervisor ==0.1.2,
- distributed-process-task ==0.1.1,
- distributed-static ==0.3.1.0,
+ sandi ==0.3.0.1,
+ dbus ==0.10.8,
distributive ==0.4.4,
- djinn-ghc ==0.0.2.3,
- djinn-lib ==0.0.1.2,
- dlist ==0.7.1.1,
- dlist-instances ==0.1,
- doctest ==0.9.13,
- double-conversion ==2.0.1.0,
- DRBG ==0.5.4,
- dual-tree ==0.2.0.6,
- easy-file ==0.2.1,
- ede ==0.2.8.2,
- edit-distance ==0.2.1.3,
- effect-handlers ==0.1.0.6,
- either ==4.3.4,
- elm-core-sources ==1.0.0,
- email-validate ==2.0.1,
- enclosed-exceptions ==1.0.1.1,
- entropy ==0.3.6,
- enumerator ==0.4.20,
- eq ==4.0.4,
- erf ==2.0.0.0,
- errorcall-eq-instance ==0.2.0.1,
+ dlist ==0.7.0.1,
+ dns ==1.3.0,
+ edit-distance ==0.2.1.2,
+ either ==4.3,
+ email-validate ==1.0.0,
+ entropy ==0.2.1,
errors ==1.4.7,
- ersatz ==0.3,
- esqueleto ==2.1.3,
- exception-mtl ==0.3.0.5,
- exceptions ==0.8.0.2,
- exception-transformers ==0.3.0.4,
- executable-hash ==0.2.0.0,
- executable-path ==0.0.3,
- extensible-exceptions ==0.1.1.4,
- extra ==1.1,
- fast-logger ==2.3.1,
- fay ==0.23.1.4,
- fay-base ==0.20.0.0,
- fay-builder ==0.2.0.5,
- fay-dom ==0.5.0.1,
- fay-jquery ==0.6.0.3,
- fay-text ==0.3.2.2,
- fay-uri ==0.2.0.0,
- fb ==1.0.10,
- fb-persistent ==0.3.4,
- fclabels ==2.0.2.2,
- FenwickTree ==0.1.2.1,
- fgl ==5.5.1.0,
- file-embed ==0.0.8.2,
- file-location ==0.4.7.1,
- filemanip ==0.3.6.3,
- filepath installed,
- fingertree ==0.1.0.2,
- fixed ==0.2.1.1,
- fixed-list ==0.1.6,
- fixed-vector ==0.7.0.3,
- flexible-defaults ==0.0.1.1,
- flock ==0.3.1.8,
- fmlist ==0.9,
- focus ==0.1.4,
- foldl ==1.0.10,
- FontyFruity ==0.5.1.1,
- force-layout ==0.3.0.11,
- foreign-store ==0.2,
- formatting ==6.2.0,
- free ==4.11,
- freenect ==1.2,
- frisby ==0.2,
- fsnotify ==0.1.0.3,
- fuzzcheck ==0.1.1,
- gd ==3000.7.3,
- generic-aeson ==0.2.0.5,
- generic-deriving ==1.6.3,
- GenericPretty ==1.2.1,
- generics-sop ==0.1.1.2,
- generic-xmlpickler ==0.1.0.2,
- ghc installed,
- ghc-heap-view ==0.5.3,
- ghcid ==0.3.6,
- ghc-mod ==5.2.1.2,
- ghc-mtl ==1.2.1.0,
- ghc-paths ==0.1.0.9,
- ghc-prim installed,
- ghc-syb-utils ==0.2.3,
- gio ==0.13.1.0,
- gipeda ==0.1.0.2,
- git-embed ==0.1.0,
- gitlib ==3.1.0.1,
- gitlib-libgit2 ==3.1.0.4,
- gitlib-test ==3.1.0.2,
- gitrev ==1.0.0,
- gitson ==0.5.1,
- gl ==0.7.7,
- glib ==0.13.1.0,
- Glob ==0.7.5,
- GLURaw ==1.5.0.1,
- GLUT ==2.7.0.1,
- graph-core ==0.2.2.0,
- graphs ==0.6.0.1,
- GraphSCC ==1.0.4,
- graphviz ==2999.17.0.2,
- gravatar ==0.8.0,
- groundhog ==0.7.0.3,
- groundhog-mysql ==0.7.0.1,
- groundhog-postgresql ==0.7.0.2,
- groundhog-sqlite ==0.7.0.1,
- groundhog-th ==0.7.0.1,
- groupoids ==4.0,
- groups ==0.4.0.0,
- gtk ==0.13.6,
- gtk2hs-buildtools ==0.13.0.3,
- gtk3 ==0.13.6,
- hackage-mirror ==0.1.0.0,
- haddock-api ==2.15.0.2,
- haddock-library ==1.1.1,
- hakyll ==4.6.9.0,
- half ==0.2.0.1,
- HandsomeSoup ==0.3.5,
- happstack-server ==7.4.2,
- happy ==1.19.5,
- hashable ==1.2.3.2,
- hashable-extras ==0.2.1,
- hashmap ==1.3.0.1,
- hashtables ==1.2.0.2,
- haskeline installed,
- haskell2010 installed,
- haskell98 installed,
- haskell-lexer ==1.0,
- haskell-names ==0.5.2,
- HaskellNet ==0.4.4,
- haskell-packages ==0.2.4.4,
- haskell-src ==1.0.2.0,
- haskell-src-exts ==1.16.0.1,
- haskell-src-meta ==0.6.0.9,
- haskintex ==0.5.0.3,
- hasql ==0.7.3.1,
- hasql-backend ==0.4.1,
- hasql-postgres ==0.10.3.1,
- hastache ==0.6.1,
- HaTeX ==3.16.1.1,
- HaXml ==1.25.3,
- haxr ==3000.10.4.2,
- HCodecs ==0.5,
- hdaemonize ==0.5.0.0,
- hdevtools ==0.1.0.8,
- hdocs ==0.4.1.3,
- heap ==1.0.2,
- heaps ==0.3.2.1,
- hebrew-time ==0.1.1,
- heist ==0.14.1,
- here ==1.2.7,
- heredoc ==0.2.0.0,
- hexpat ==0.20.9,
- hflags ==0.4,
- highlighting-kate ==0.5.12,
- hindent ==4.4.2,
- hinotify ==0.3.7,
- hint ==0.4.2.3,
- histogram-fill ==0.8.4.1,
- hit ==0.6.3,
+ exceptions ==0.6.1,
+ failure ==0.2.0.3,
+ fast-logger ==2.1.5,
+ fdo-notify ==0.3.1,
+ feed ==0.3.9.2,
+ file-embed ==0.0.6,
+ fingertree ==0.1.0.0,
+ free ==4.9,
+ gnuidn ==0.2,
+ gnutls ==0.1.4,
+ gsasl ==0.3.5,
+ hS3 ==0.5.7,
+ hashable ==1.2.1.0,
+ hinotify ==0.3.5,
hjsmin ==0.1.4.7,
- hledger ==0.24.1,
- hledger-lib ==0.24.1,
- hledger-web ==0.24.1,
- hlibgit2 ==0.18.0.14,
- hlint ==1.9.20,
- hmatrix ==0.16.1.5,
- hmatrix-gsl ==0.16.0.3,
- hmatrix-gsl-stats ==0.2.1,
- hmatrix-repa ==0.1.2.1,
- hoauth2 ==0.4.7,
- holy-project ==0.1.1.1,
- hoogle ==4.2.41,
- hoopl installed,
- hOpenPGP ==2.0,
- hopenpgp-tools ==0.14.1,
- hostname ==1.0,
- hostname-validate ==1.0.0,
- hourglass ==0.2.9,
- hpc installed,
- hpc-coveralls ==0.9.0,
- hPDB ==1.2.0.3,
- hPDB-examples ==1.2.0.2,
- hs-bibutils ==5.5,
- hscolour ==1.22,
- hsdev ==0.1.3.4,
- hse-cpp ==0.1,
- hsignal ==0.2.7,
- hslogger ==1.2.9,
- hslua ==0.3.13,
- HsOpenSSL ==0.11.1.1,
- hspec ==2.1.7,
- hspec-attoparsec ==0.1.0.2,
- hspec-core ==2.1.7,
- hspec-discover ==2.1.7,
- hspec-expectations ==0.6.1.1,
- hspec-meta ==2.1.7,
- hspec-smallcheck ==0.3.0,
- hspec-wai ==0.6.3,
- hspec-wai-json ==0.6.0,
- hstatistics ==0.2.5.2,
- HStringTemplate ==0.8.3,
- hsyslog ==2.0,
- HTF ==0.12.2.4,
- html ==1.0.1.2,
- html-conduit ==1.1.1.2,
- HTTP ==4000.2.19,
- http-client ==0.4.11.2,
- http-client-openssl ==0.2.0.1,
+ hslogger ==1.2.1,
+ http-client ==0.4.11.1,
http-client-tls ==0.2.2,
http-conduit ==2.1.5,
- http-date ==0.0.6.1,
- http-media ==0.6.2,
- http-reverse-proxy ==0.4.2,
- http-types ==0.8.6,
- HUnit ==1.2.5.2,
- hweblib ==0.6.3,
- hxt ==9.3.1.15,
- hxt-charproperties ==9.2.0.1,
- hxt-curl ==9.1.1.1,
- hxt-expat ==9.1.1,
- hxt-http ==9.1.5.2,
- hxt-pickle-utils ==0.1.0.3,
- hxt-regex-xmlschema ==9.2.0.2,
- hxt-relaxng ==9.1.5.5,
- hxt-tagsoup ==9.1.3,
- hxt-unicode ==9.0.2.4,
- hybrid-vectors ==0.1.2.1,
- hyphenation ==0.4.2.1,
- iconv ==0.4.1.2,
- ide-backend ==0.9.0.9,
- ide-backend-common ==0.9.1.1,
- ide-backend-rts ==0.1.3.1,
- idna ==0.3.0,
- ieee754 ==0.7.6,
- IfElse ==0.85,
- imagesize-conduit ==1.1,
- immortal ==0.2,
- include-file ==0.1.0.2,
- incremental-parser ==0.2.3.4,
- indents ==0.3.3,
- ini ==0.3.1,
- integer-gmp installed,
- integration ==0.2.1,
- interpolate ==0.1.0,
- interpolatedstring-perl6 ==0.9.0,
- intervals ==0.7.1,
- io-choice ==0.0.5,
- io-manager ==0.1.0.2,
- io-memoize ==1.1.1.0,
- iproute ==1.3.2,
- iterable ==3.0,
- ixset ==1.0.6,
- jmacro ==0.6.12,
- jmacro-rpc ==0.3.2,
- jmacro-rpc-happstack ==0.3.2,
- jmacro-rpc-snap ==0.3,
- jose-jwt ==0.4.2,
- js-flot ==0.8.3,
- js-jquery ==1.11.3,
- json ==0.9.1,
- json-autotype ==0.2.5.13,
- json-schema ==0.7.3.5,
- JuicyPixels ==3.2.4,
- JuicyPixels-repa ==0.7,
- kan-extensions ==4.2.2,
- kansas-comet ==0.3.1,
- kdt ==0.2.3,
- keter ==1.3.10.1,
- keys ==3.10.2,
- kmeans ==0.1.3,
- koofr-client ==1.0.0.3,
- kure ==2.16.10,
- language-c ==0.4.7,
- language-c-quote ==0.10.2.1,
- language-ecmascript ==0.17,
- language-glsl ==0.1.1,
- language-haskell-extract ==0.2.4,
- language-java ==0.2.7,
- language-javascript ==0.5.13.3,
- lattices ==1.2.1.1,
- lazy-csv ==0.5,
- lca ==0.3,
- lens ==4.7.0.1,
- lens-action ==0.1.0.1,
- lens-aeson ==1.0.0.4,
- lens-family-core ==1.2.0,
- lens-family-th ==0.4.1.0,
- lhs2tex ==1.19,
- libgit ==0.3.1,
- libnotify ==0.1.1.0,
- lifted-async ==0.7.0.1,
- lifted-base ==0.2.3.6,
- linear ==1.18.1.1,
- linear-accelerate ==0.2,
- List ==0.5.2,
- ListLike ==4.2.0,
- list-t ==0.4.5.1,
- loch-th ==0.2.1,
- log-domain ==0.10.0.1,
- logict ==0.6.0.2,
- loop ==0.2.0,
- lrucache ==1.2.0.0,
- lucid ==2.9.2,
- lucid-svg ==0.4.0.4,
- lzma-conduit ==1.1.3,
- machines ==0.4.1,
- machines-directory ==0.2.0.6,
- machines-io ==0.2.0.6,
- machines-process ==0.2.0.4,
- mainland-pretty ==0.2.7.2,
- managed ==1.0.0,
- mandrill ==0.2.2.0,
- map-syntax ==0.2,
- markdown ==0.1.13.2,
- markdown-unlit ==0.2.0.1,
- math-functions ==0.1.5.2,
- matrix ==0.3.4.3,
- maximal-cliques ==0.1.1,
- MaybeT ==0.1.2,
- mbox ==0.3.1,
- MemoTrie ==0.6.2,
- mersenne-random-pure64 ==0.2.0.4,
- messagepack ==0.3.0,
- messagepack-rpc ==0.1.0.3,
- MFlow ==0.4.5.9,
- mime-mail ==0.4.8.2,
- mime-mail-ses ==0.3.2.2,
- mime-types ==0.1.0.6,
- missing-foreign ==0.1.1,
- MissingH ==1.3.0.1,
- mmap ==0.5.9,
- mmorph ==1.0.4,
- MonadCatchIO-transformers ==0.3.1.3,
- monad-control ==1.0.0.4,
- monad-coroutine ==0.9.0.1,
- monadcryptorandom ==0.6.1,
- monadic-arrays ==0.2.1.4,
- monad-journal ==0.7,
- monadLib ==3.7.3,
- monadloc ==0.7.1,
- monad-logger ==0.3.13.1,
- monad-logger-json ==0.1.0.0,
- monad-logger-syslog ==0.1.1.1,
+ http-date ==0.0.2,
+ http-types ==0.8.5,
+ hxt ==9.3.1.4,
+ hxt-charproperties ==9.1.1.1,
+ hxt-regex-xmlschema ==9.0.4,
+ hxt-unicode ==9.0.2.2,
+ idna ==0.2,
+ iproute ==1.2.11,
+ json ==0.5,
+ keys ==3.10.1,
+ language-javascript ==0.5.13,
+ lens ==4.4.0.2,
+ libxml-sax ==0.7.5,
+ mime-mail ==0.4.1.2,
+ mime-types ==0.1.0.4,
+ mmorph ==1.0.3,
+ monad-control ==0.3.2.2,
+ monad-logger ==0.3.6.1,
monad-loops ==0.4.2.1,
- monad-par ==0.3.4.7,
- monad-parallel ==0.7.1.4,
- monad-par-extras ==0.3.3,
- monad-primitive ==0.1,
- monad-products ==4.0.0.1,
- MonadPrompt ==1.0.0.5,
- MonadRandom ==0.3.0.2,
- monad-st ==0.2.4,
monads-tf ==0.1.0.2,
- mongoDB ==2.0.5,
- monoid-extras ==0.3.3.5,
- monoid-subclasses ==0.4.0.4,
- mono-traversable ==0.9.1,
- mtl ==2.1.3.1,
- mtl-compat ==0.2.1.1,
- mtlparse ==0.1.4.0,
- mtl-prelude ==1.0.3,
- multiarg ==0.30.0.8,
- multimap ==1.2.1,
- multipart ==0.1.2,
- MusicBrainz ==0.2.4,
- mutable-containers ==0.3.0,
- mwc-random ==0.13.3.2,
- mysql ==0.1.1.8,
- mysql-simple ==0.2.2.5,
- nanospec ==0.2.1,
- nats ==1,
- neat-interpolation ==0.2.2.1,
- nettle ==0.1.0,
- network ==2.6.1.0,
- network-anonymous-i2p ==0.10.0,
- network-attoparsec ==0.12.2,
+ mtl ==2.1.2,
+ nats ==0.1.2,
+ network ==2.4.1.2,
network-conduit ==1.1.0,
- network-conduit-tls ==1.1.2,
network-info ==0.2.0.5,
- network-multicast ==0.0.11,
- network-simple ==0.4.0.4,
- network-transport ==0.4.1.0,
- network-transport-tcp ==0.4.1,
- network-transport-tests ==0.2.2.0,
- network-uri ==2.6.0.3,
- newtype ==0.2,
- nsis ==0.2.5,
- numbers ==3000.2.0.1,
- numeric-extras ==0.0.3,
- NumInstances ==1.4,
- numtype ==1.1,
- ObjectName ==1.1.0.0,
- Octree ==0.5.4.2,
- old-locale installed,
- OneTuple ==0.2.1,
- opaleye ==0.3.1.2,
- OpenGL ==2.12.0.1,
- OpenGLRaw ==2.4.1.0,
- openpgp-asciiarmor ==0.1,
- operational ==0.2.3.2,
- options ==1.2.1.1,
+ network-multicast ==0.0.10,
+ network-protocol-xmpp ==0.4.6,
+ network-uri ==2.6.0.1,
optparse-applicative ==0.11.0.2,
- optparse-simple ==0.0.2,
- osdkeys ==0.0,
- pagerduty ==0.0.3.1,
- palette ==0.1.0.2,
- pandoc ==1.13.2.1,
- pandoc-citeproc ==0.6.0.1,
- pandoc-types ==1.12.4.2,
- pango ==0.13.1.0,
- parallel ==3.2.0.6,
- parallel-io ==0.3.3,
- parseargs ==0.1.5.2,
- parsec ==3.1.9,
- parsers ==0.12.2.1,
- partial-handler ==0.1.1,
- path-pieces ==0.2.0,
- patience ==0.1.1,
- pcre-heavy ==0.2.2,
- pcre-light ==0.4.0.3,
- pdfinfo ==1.5.4,
+ parallel ==3.2.0.4,
+ path-pieces ==0.1.4,
pem ==0.2.2,
- persistent ==2.1.5,
- persistent-mongoDB ==2.1.2.2,
- persistent-mysql ==2.1.3.1,
- persistent-postgresql ==2.1.5.3,
- persistent-sqlite ==2.1.4.2,
- persistent-template ==2.1.3.1,
- phantom-state ==0.2.0.2,
- picoparsec ==0.1.2.2,
- pipes ==4.1.5,
- pipes-aeson ==0.4.1.3,
- pipes-attoparsec ==0.5.1.2,
- pipes-binary ==0.4.0.4,
- pipes-bytestring ==2.1.1,
- pipes-concurrency ==2.0.3,
- pipes-group ==1.0.2,
- pipes-network ==0.6.4,
- pipes-parse ==3.0.2,
- pipes-safe ==2.2.2,
- placeholders ==0.1,
- plot ==0.2.3.4,
- plot-gtk ==0.2.0.2,
- plot-gtk3 ==0.1,
- pointed ==4.2.0.2,
- polyparse ==1.11,
- postgresql-binary ==0.5.2.1,
- postgresql-libpq ==0.9.0.2,
- postgresql-simple ==0.4.10.0,
- post-mess-age ==0.1.0.0,
- prednote ==0.32.0.6,
- prefix-units ==0.1.0.2,
+ persistent ==1.3.3,
+ persistent-template ==1.3.2.2,
+ pointed ==4.0,
prelude-extras ==0.4,
- presburger ==1.3.1,
- present ==2.2,
- pretty installed,
- prettyclass ==1.0.0.0,
- pretty-class ==1.0.1.1,
- pretty-show ==1.6.8.2,
- primes ==0.2.1.0,
- primitive ==0.6,
- process installed,
- process-extras ==0.3.3.4,
- product-profunctors ==0.6.1,
- profunctor-extras ==4.0,
- profunctors ==4.4.1,
- project-template ==0.1.4.2,
- PSQueue ==1.1,
+ profunctors ==4.0.4,
publicsuffixlist ==0.1,
punycode ==2.0,
- pure-io ==0.2.1,
- pureMD5 ==2.1.2.1,
- pwstore-fast ==2.4.4,
- quandl-api ==0.2.1.0,
- QuasiText ==0.1.2.5,
- QuickCheck ==2.7.6,
- quickcheck-assertions ==0.2.0,
- quickcheck-instances ==0.3.11,
- quickcheck-io ==0.1.1,
- quickcheck-unicode ==1.0.0.1,
- rainbow ==0.22.0.2,
- random ==1.1,
- random-fu ==0.2.6.2,
- random-shuffle ==0.0.4,
- random-source ==0.3.0.6,
- rank1dynamic ==0.2.0.1,
- Rasterific ==0.5.2.1,
- rasterific-svg ==0.1.0.3,
- raw-strings-qq ==1.0.2,
- ReadArgs ==1.2.2,
- reducers ==3.10.3.1,
- reflection ==1.5.2.1,
- RefSerialize ==0.3.1.4,
- regex-applicative ==0.3.1,
+ random ==1.0.1.1,
+ ranges ==0.2.4,
+ reducers ==3.10.2.1,
+ reflection ==1.2.0.1,
regex-base ==0.93.2,
regex-compat ==0.95.1,
- regex-pcre-builtin ==0.94.4.8.8.35,
regex-posix ==0.95.2,
- regexpr ==0.5.4,
regex-tdfa ==1.2.0,
- regex-tdfa-rc ==1.1.8.3,
- regular ==0.3.4.4,
- regular-xmlpickler ==0.2,
- rematch ==0.2.0.0,
- repa ==3.3.1.2,
- repa-algorithms ==3.3.1.2,
- repa-devil ==0.3.2.6,
- repa-io ==3.3.1.2,
- reroute ==0.2.3.0,
- resource-pool ==0.2.3.2,
- resourcet ==1.1.5,
- rest-client ==0.5.0.3,
- rest-core ==0.35.1,
- rest-gen ==0.17.0.4,
- rest-happstack ==0.2.10.8,
- rest-snap ==0.1.17.18,
- rest-stringmap ==0.2.0.4,
- rest-types ==1.13.1,
- rest-wai ==0.1.0.8,
- rethinkdb-client-driver ==0.0.18,
- retry ==0.6,
- rev-state ==0.1,
- rfc5051 ==0.1.0.3,
- RSA ==2.1.0.1,
- rts installed,
- runmemo ==1.0.0.1,
- rvar ==0.2.0.2,
- safe ==0.3.9,
- safecopy ==0.8.5,
- sbv ==4.2,
- scientific ==0.3.3.8,
- scotty ==0.9.1,
- scrobble ==0.2.1.1,
- sdl2 ==1.3.1,
- securemem ==0.1.7,
- semigroupoid-extras ==4.0,
- semigroupoids ==4.3,
- semigroups ==0.16.2.2,
- semver ==0.3.3.1,
- sendfile ==0.7.9,
- seqloc ==0.6.1.1,
- servant ==0.2.2,
- servant-client ==0.2.2,
- servant-docs ==0.3.1,
- servant-jquery ==0.2.2.1,
- servant-server ==0.2.4,
- setenv ==0.1.1.3,
- set-monad ==0.2.0.0,
- SHA ==1.6.4.2,
- shake ==0.15.2,
- shake-language-c ==0.6.4,
+ resource-pool ==0.2.1.1,
+ resourcet ==1.1.2.3,
+ safe ==0.3.8,
+ securemem ==0.1.3,
+ semigroupoids ==4.2,
+ semigroups ==0.15.3,
shakespeare ==2.0.5,
- shakespeare-text ==1.1.0,
- shell-conduit ==4.5.2,
- shelltestrunner ==1.3.5,
- shelly ==1.6.1.2,
silently ==1.2.4.1,
- simple-reflect ==0.3.2,
- simple-sendfile ==0.2.20,
- singletons ==1.1.2,
- siphash ==1.0.3,
- skein ==1.0.9.3,
- slave-thread ==0.1.6,
- smallcheck ==1.1.1,
- smoothie ==0.1.3,
- smtLib ==1.0.7,
- snap ==0.14.0.4,
- snap-core ==0.9.7.0,
- snaplet-fay ==0.3.3.11,
- snap-server ==0.9.5.1,
- snowflake ==0.1.1.1,
- soap ==0.2.2.5,
- soap-openssl ==0.1.0.2,
- soap-tls ==0.1.1.2,
+ simple-sendfile ==0.2.14,
+ skein ==1.0.9,
socks ==0.5.4,
- sodium ==0.11.0.3,
- sourcemap ==0.1.3.0,
- speculation ==1.5.0.2,
- sphinx ==0.6.0.1,
split ==0.2.2,
- Spock ==0.7.9.0,
- Spock-digestive ==0.1.0.0,
- Spock-worker ==0.2.1.3,
- spoon ==0.3.1,
- sqlite-simple ==0.4.8.0,
- srcloc ==0.4.1,
- stackage ==0.7.2.0,
- stackage-build-plan ==0.1.1.0,
- stackage-cli ==0.1.0.2,
- stackage-curator ==0.7.4,
- stackage-install ==0.1.1.1,
- stackage-types ==1.0.1.1,
- stackage-update ==0.1.2,
- stackage-upload ==0.1.0.5,
- stateref ==0.3,
- statestack ==0.2.0.4,
- StateVar ==1.1.0.0,
- statistics ==0.13.2.3,
- statistics-linreg ==0.3,
- stm ==2.4.4,
- stm-chans ==3.0.0.3,
- stm-conduit ==2.5.4,
- stm-containers ==0.2.9,
- stm-stats ==0.2.0.0,
- storable-complex ==0.2.2,
- storable-endian ==0.2.5,
- streaming-commons ==0.1.12.1,
- streams ==3.2,
- strict ==0.3.2,
- stringable ==0.1.3,
- stringbuilder ==0.5.0,
- string-conversions ==0.3.0.3,
- stringprep ==1.0.0,
- stringsearch ==0.3.6.6,
- stylish-haskell ==0.5.13.0,
- SVGFonts ==1.4.0.3,
- svg-tree ==0.1.1,
- syb ==0.4.4,
- syb-with-class ==0.6.1.5,
- symbol ==0.2.4,
- system-canonicalpath ==0.3.2.0,
- system-fileio ==0.3.16.3,
- system-filepath ==0.4.13.4,
- system-posix-redirect ==1.1.0.1,
- tabular ==0.2.2.7,
- tagged ==0.7.3,
- tagshare ==0.0,
- tagsoup ==0.13.3,
- tagstream-conduit ==0.5.5.3,
- tar ==0.4.1.0,
- tardis ==0.3.0.0,
- tasty ==0.10.1.2,
- tasty-ant-xml ==1.0.1,
- tasty-golden ==2.3.0.1,
- tasty-hunit ==0.9.2,
- tasty-kat ==0.0.3,
- tasty-quickcheck ==0.8.3.2,
- tasty-smallcheck ==0.8.0.1,
- tasty-th ==0.1.3,
- TCache ==0.12.0,
- template-haskell installed,
- temporary ==1.2.0.3,
- temporary-rc ==1.2.0.3,
- terminal-progress-bar ==0.0.1.4,
- terminal-size ==0.3.0,
- terminfo installed,
- test-framework ==0.8.1.1,
- test-framework-hunit ==0.3.0.1,
- test-framework-quickcheck2 ==0.3.0.3,
- test-framework-th ==0.2.4,
- testing-feat ==0.4.0.2,
- testpack ==2.1.3.0,
- texmath ==0.8.2,
- text ==1.2.0.6,
- text-binary ==0.1.0,
- text-format ==0.3.1.1,
- text-icu ==0.7.0.1,
- text-manipulate ==0.1.3.1,
+ stm ==2.4.2,
+ stm-chans ==3.0.0.2,
+ streaming-commons ==0.1.4.1,
+ stringprep ==0.1.5,
+ stringsearch ==0.3.6.5,
+ syb ==0.4.0,
+ system-fileio ==0.3.14,
+ system-filepath ==0.4.12,
+ tagged ==0.7.2,
+ tagsoup ==0.13.1,
+ tagstream-conduit ==0.5.5.1,
+ text ==1.1.1.0,
+ text-icu ==0.6.3.7,
tf-random ==0.5,
- th-desugar ==1.5.3,
- th-expand-syns ==0.3.0.6,
- th-extras ==0.0.0.2,
- th-lift ==0.7.2,
- th-orphans ==0.11.1,
- threads ==0.5.1.3,
- th-reify-many ==0.1.3,
- thyme ==0.3.5.5,
- time installed,
- time-compat ==0.1.0.3,
- time-lens ==0.4.0.1,
- time-locale-compat ==0.1.0.1,
- timezone-olson ==0.1.7,
- timezone-series ==0.1.5.1,
- tls ==1.2.17,
- tls-debug ==0.3.4,
- tostring ==0.2.1.1,
- transformers-base ==0.4.4,
- transformers-compat ==0.4.0.3,
- traverse-with-class ==0.2.0.3,
- tree-view ==0.4,
- trifecta ==1.5.1.3,
- tttool ==1.3,
- tuple ==0.3.0.2,
- turtle ==1.0.2,
- type-eq ==0.5,
- type-list ==0.0.0.1,
- udbus ==0.2.1,
- unbounded-delays ==0.1.0.9,
- unbound-generics ==0.1.2.1,
- union-find ==0.2,
- uniplate ==1.6.12,
- unix installed,
- unix-compat ==0.4.1.4,
- unix-time ==0.3.5,
- unordered-containers ==0.2.5.1,
- uri-encode ==1.5.0.4,
- url ==2.1.3,
- users ==0.1.0.0,
- users-postgresql-simple ==0.1.0.1,
- users-test ==0.1.0.0,
- utf8-light ==0.4.2,
- utf8-string ==1,
- uuid ==1.3.10,
- uuid-types ==1.0.1,
- vault ==0.3.0.4,
- vector ==0.10.12.3,
- vector-algorithms ==0.6.0.4,
- vector-binary-instances ==0.2.1.0,
- vector-buffer ==0.4.1,
- vector-instances ==3.3.0.1,
- vector-space ==0.9,
- vector-space-points ==0.2.1.1,
- vector-th-unbox ==0.2.1.2,
- vhd ==0.2.2,
- void ==0.7,
- wai ==3.0.2.3,
- wai-app-static ==3.0.1.1,
- wai-conduit ==3.0.0.2,
- wai-eventsource ==3.0.0,
- wai-extra ==3.0.7.1,
- wai-handler-launch ==3.0.0.3,
- wai-logger ==2.2.4,
- wai-middleware-consul ==0.1.0.2,
- wai-middleware-static ==0.6.0.1,
- waitra ==0.0.3.0,
- wai-websockets ==3.0.0.5,
- warp ==3.0.13.1,
- warp-tls ==3.0.3,
- webdriver ==0.6.1,
- web-fpco ==0.1.1.0,
- websockets ==0.9.4.0,
- wizards ==1.0.2,
- wl-pprint ==1.1,
- wl-pprint-extras ==3.5.0.4,
- wl-pprint-terminfo ==3.7.1.3,
- wl-pprint-text ==1.1.0.4,
- word8 ==0.1.2,
- wordpass ==1.0.0.3,
- Workflow ==0.8.3,
- wrap ==0.0.0,
- wreq ==0.3.0.1,
- X11 ==1.6.1.2,
- x509 ==1.5.0.1,
- x509-store ==1.5.0,
- x509-system ==1.5.0,
- x509-validation ==1.5.2,
- xenstore ==0.1.1,
- xhtml installed,
- xml ==1.3.14,
- xml-conduit ==1.2.6,
- xml-conduit-writer ==0.1.1.1,
- xmlgen ==0.6.2.1,
- xml-hamlet ==0.4.0.11,
- xmlhtml ==0.2.3.4,
- xml-to-json ==2.0.1,
- xml-to-json-fast ==2.0.0,
+ tls ==1.2.9,
+ transformers ==0.3.0.0,
+ transformers-base ==0.4.1,
+ transformers-compat ==0.3.3.3,
+ unbounded-delays ==0.1.0.8,
+ unix-compat ==0.4.1.3,
+ unix-time ==0.2.2,
+ unordered-containers ==0.2.5.0,
+ utf8-string ==0.3.7,
+ uuid ==1.3.3,
+ vault ==0.3.0.3,
+ vector ==0.10.0.1,
+ void ==0.6.1,
+ wai ==3.0.1.1,
+ wai-app-static ==3.0.0.1,
+ wai-extra ==3.0.1.2,
+ wai-logger ==2.1.1,
+ warp ==3.0.0.5,
+ warp-tls ==3.0.0,
+ word8 ==0.1.1,
+ x509 ==1.4.11,
+ x509-store ==1.4.4,
+ x509-system ==1.4.5,
+ x509-validation ==1.5.0,
+ xml ==1.3.13,
+ xml-conduit ==1.2.1,
+ xml-hamlet ==0.4.0.9,
xml-types ==0.3.4,
- xss-sanitize ==0.3.5.5,
- yackage ==0.7.0.8,
- yaml ==0.8.11,
- Yampa ==0.9.7,
- YampaSynth ==0.2,
- yarr ==1.3.3.3,
- yesod ==1.4.1.5,
- yesod-auth ==1.4.5,
- yesod-auth-deskcom ==1.4.0,
- yesod-auth-fb ==1.6.6,
- yesod-auth-hashdb ==1.4.2.1,
- yesod-auth-oauth ==1.4.0.2,
- yesod-auth-oauth2 ==0.0.12,
- yesod-bin ==1.4.9.2,
- yesod-core ==1.4.9.1,
- yesod-eventsource ==1.4.0.1,
- yesod-fay ==0.7.1,
- yesod-fb ==0.3.4,
- yesod-form ==1.4.4.1,
- yesod-gitrepo ==0.1.1.0,
- yesod-newsfeed ==1.4.0.1,
- yesod-persistent ==1.4.0.2,
- yesod-sitemap ==1.4.0.1,
- yesod-static ==1.4.0.4,
- yesod-test ==1.4.3.1,
- yesod-text-markdown ==0.1.7,
- yesod-websockets ==0.2.1.1,
- zeromq4-haskell ==0.6.3,
- zip-archive ==0.2.3.7,
- zlib ==0.5.4.2,
- zlib-bindings ==0.1.1.5,
- zlib-enum ==0.2.3.1,
- zlib-lens ==0.1.2
+ xss-sanitize ==0.3.5.2,
+ yaml ==0.8.9.3,
+ yesod ==1.2.6.1,
+ yesod-auth ==1.3.4.6,
+ yesod-core ==1.2.20.1,
+ yesod-default ==1.2.0,
+ yesod-form ==1.3.16,
+ yesod-persistent ==1.2.3.1,
+ yesod-routes ==1.2.0.7,
+ yesod-static ==1.2.4,
+ zlib ==0.5.4.1,
+ bytestring ==0.10.4.0,
+ scientific ==0.3.3.1,
+ clock ==0.4.6.0
diff --git a/standalone/linux/skel/runshell b/standalone/linux/skel/runshell
index b1f36f0..b540c98 100755
--- a/standalone/linux/skel/runshell
+++ b/standalone/linux/skel/runshell
@@ -26,6 +26,22 @@ cd "$base"
base="$(pwd)"
cd "$orig"
+# --library-path won't work if $base contains : or ;
+# Detect this problem, and work around it by using a temp directory.
+if echo "$base" | grep -q '[:;]'; then
+ tbase=$(mktemp -d -p /tmp annexshimXXXXXXXXX 2>/dev/null || true)
+ if [ -z "$tbase" ]; then
+ tbase="/tmp/annexshim.$$"
+ mkdir "$tbase"
+ fi
+ ln -s "$base" "$tbase/link"
+ base="$tbase/link"
+ cleanuptbase () {
+ rm -rf "$tbase"
+ }
+ trap cleanuptbase EXIT
+fi
+
# Install shim that's used to run git-annex-shell from ssh authorized_keys.
# The assistant also does this when run, but the user may not be using the
# assistant.
@@ -63,7 +79,7 @@ export ORIG_PATH
PATH="$base/bin:$PATH"
export PATH
-# This is used by the shim wrapper around each binary.
+# These env vars are used by the shim wrapper around each binary.
for lib in $(cat "$base/libdirs"); do
GIT_ANNEX_LD_LIBRARY_PATH="$base/$lib:$GIT_ANNEX_LD_LIBRARY_PATH"
done
@@ -103,7 +119,12 @@ export GIT_ANNEX_STANDLONE_ENV
if [ "$1" ]; then
cmd="$1"
shift 1
- exec "$cmd" "$@"
+ if [ -z "$tbase" ]; then
+ exec "$cmd" "$@"
+ else
+ # allow EXIT trap to cleanup
+ "$cmd" "$@"
+ fi
else
sh
fi
diff --git a/standalone/no-th/evilsplicer-headers.hs b/standalone/no-th/evilsplicer-headers.hs
index 903f1fc..1bc8953 100644
--- a/standalone/no-th/evilsplicer-headers.hs
+++ b/standalone/no-th/evilsplicer-headers.hs
@@ -24,6 +24,7 @@ import qualified "blaze-markup" Text.Blaze.Internal
import qualified Yesod.Core.Widget
import qualified Yesod.Routes.TH.Types
import qualified Yesod.Core.Dispatch
+import qualified Yesod.Routes.Dispatch
import qualified WaiAppStatic.Storage.Embedded
import qualified WaiAppStatic.Storage.Embedded.Runtime
import qualified Data.FileEmbed
diff --git a/standalone/no-th/haskell-patches/DAV_build-without-TH.patch b/standalone/no-th/haskell-patches/DAV_build-without-TH.patch
index 8009d92..6d17d63 100644
--- a/standalone/no-th/haskell-patches/DAV_build-without-TH.patch
+++ b/standalone/no-th/haskell-patches/DAV_build-without-TH.patch
@@ -1,6 +1,6 @@
-From 6d4a7c63d737c9215ee55996715250c89f14c398 Mon Sep 17 00:00:00 2001
+From e54cfacbb9fb24f75d3d93cd8ee6da67b161574f Mon Sep 17 00:00:00 2001
From: dummy <dummy@example.com>
-Date: Fri, 3 Jul 2015 01:36:31 +0000
+Date: Thu, 16 Oct 2014 02:51:28 +0000
Subject: [PATCH] remove TH
---
@@ -10,7 +10,7 @@ Subject: [PATCH] remove TH
3 files changed, 306 insertions(+), 46 deletions(-)
diff --git a/DAV.cabal b/DAV.cabal
-index f78c2e5..1ec4d80 100644
+index 95fffd8..5669c51 100644
--- a/DAV.cabal
+++ b/DAV.cabal
@@ -47,33 +47,7 @@ library
@@ -27,7 +27,7 @@ index f78c2e5..1ec4d80 100644
- , containers
- , data-default
- , either >= 4.3
-- , errors < 2.0
+- , errors
- , exceptions
- , http-client >= 0.2
- , http-client-tls >= 0.2
@@ -49,7 +49,7 @@ index f78c2e5..1ec4d80 100644
source-repository head
type: git
diff --git a/Network/Protocol/HTTP/DAV.hs b/Network/Protocol/HTTP/DAV.hs
-index 5d5d6fd..7265d42 100644
+index 4c6d68f..55979b6 100644
--- a/Network/Protocol/HTTP/DAV.hs
+++ b/Network/Protocol/HTTP/DAV.hs
@@ -82,6 +82,7 @@ import Network.HTTP.Types (hContentType, Method, Status, RequestHeaders, unautho
@@ -416,5 +416,5 @@ index 0ecd476..1653bf6 100644
+ Data.Functor.<$> (_f_a3k7 __userAgent'_a3kg))
+{-# INLINE userAgent #-}
--
-2.1.4
+2.1.1
diff --git a/standalone/no-th/haskell-patches/aeson_remove-TH.patch b/standalone/no-th/haskell-patches/aeson_remove-TH.patch
new file mode 100644
index 0000000..dc40de7
--- /dev/null
+++ b/standalone/no-th/haskell-patches/aeson_remove-TH.patch
@@ -0,0 +1,40 @@
+From f147ec9aeaa03ca6e30232c84c413ef29b95fb62 Mon Sep 17 00:00:00 2001
+From: Your Name <you@example.com>
+Date: Tue, 20 May 2014 19:53:55 +0000
+Subject: [PATCH] avoid TH
+
+---
+ aeson.cabal | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/aeson.cabal b/aeson.cabal
+index 493d625..02dc6f4 100644
+--- a/aeson.cabal
++++ b/aeson.cabal
+@@ -88,7 +88,6 @@ library
+ Data.Aeson.Generic
+ Data.Aeson.Parser
+ Data.Aeson.Types
+- Data.Aeson.TH
+
+ other-modules:
+ Data.Aeson.Functions
+@@ -121,7 +120,6 @@ library
+ old-locale,
+ scientific >= 0.3.1 && < 0.4,
+ syb,
+- template-haskell >= 2.4,
+ time,
+ unordered-containers >= 0.2.3.0,
+ vector >= 0.7.1
+@@ -164,7 +162,6 @@ test-suite tests
+ base,
+ containers,
+ bytestring,
+- template-haskell,
+ test-framework,
+ test-framework-quickcheck2,
+ test-framework-hunit,
+--
+2.0.0.rc2
+
diff --git a/standalone/no-th/haskell-patches/file-embed_remove-TH.patch b/standalone/no-th/haskell-patches/file-embed_remove-TH.patch
new file mode 100644
index 0000000..12e3445
--- /dev/null
+++ b/standalone/no-th/haskell-patches/file-embed_remove-TH.patch
@@ -0,0 +1,132 @@
+From 497d09a91f9eb1e5979948cd128078491b0e8bca Mon Sep 17 00:00:00 2001
+From: Joey Hess <joey@kitenet.net>
+Date: Fri, 12 Sep 2014 20:52:08 -0400
+Subject: [PATCH] remove TH
+
+---
+ Data/FileEmbed.hs | 87 ++++---------------------------------------------------
+ 1 file changed, 5 insertions(+), 82 deletions(-)
+
+diff --git a/Data/FileEmbed.hs b/Data/FileEmbed.hs
+index 5617493..adacdba 100644
+--- a/Data/FileEmbed.hs
++++ b/Data/FileEmbed.hs
+@@ -17,13 +17,13 @@
+ -- > {-# LANGUAGE TemplateHaskell #-}
+ module Data.FileEmbed
+ ( -- * Embed at compile time
+- embedFile
+- , embedOneFileOf
+- , embedDir
+- , getDir
++ -- embedFile
++ --, embedOneFileOf
++ --, embedDir
++ getDir
+ -- * Inject into an executable
+ #if MIN_VERSION_template_haskell(2,5,0)
+- , dummySpace
++ --, dummySpace
+ #endif
+ , inject
+ , injectFile
+@@ -56,73 +56,12 @@ import Data.ByteString.Unsafe (unsafePackAddressLen)
+ import System.IO.Unsafe (unsafePerformIO)
+ import System.FilePath ((</>))
+
+--- | Embed a single file in your source code.
+---
+--- > import qualified Data.ByteString
+--- >
+--- > myFile :: Data.ByteString.ByteString
+--- > myFile = $(embedFile "dirName/fileName")
+-embedFile :: FilePath -> Q Exp
+-embedFile fp =
+-#if MIN_VERSION_template_haskell(2,7,0)
+- qAddDependentFile fp >>
+-#endif
+- (runIO $ B.readFile fp) >>= bsToExp
+-
+--- | Embed a single existing file in your source code
+--- out of list a list of paths supplied.
+---
+--- > import qualified Data.ByteString
+--- >
+--- > myFile :: Data.ByteString.ByteString
+--- > myFile = $(embedFile' [ "dirName/fileName", "src/dirName/fileName" ])
+-embedOneFileOf :: [FilePath] -> Q Exp
+-embedOneFileOf ps =
+- (runIO $ readExistingFile ps) >>= \ ( path, content ) -> do
+-#if MIN_VERSION_template_haskell(2,7,0)
+- qAddDependentFile path
+-#endif
+- bsToExp content
+- where
+- readExistingFile :: [FilePath] -> IO ( FilePath, B.ByteString )
+- readExistingFile xs = do
+- ys <- filterM doesFileExist xs
+- case ys of
+- (p:_) -> B.readFile p >>= \ c -> return ( p, c )
+- _ -> throw $ ErrorCall "Cannot find file to embed as resource"
+-
+--- | Embed a directory recursively in your source code.
+---
+--- > import qualified Data.ByteString
+--- >
+--- > myDir :: [(FilePath, Data.ByteString.ByteString)]
+--- > myDir = $(embedDir "dirName")
+-embedDir :: FilePath -> Q Exp
+-embedDir fp = do
+- typ <- [t| [(FilePath, B.ByteString)] |]
+- e <- ListE <$> ((runIO $ fileList fp) >>= mapM (pairToExp fp))
+- return $ SigE e typ
+-
+ -- | Get a directory tree in the IO monad.
+ --
+ -- This is the workhorse of 'embedDir'
+ getDir :: FilePath -> IO [(FilePath, B.ByteString)]
+ getDir = fileList
+
+-pairToExp :: FilePath -> (FilePath, B.ByteString) -> Q Exp
+-pairToExp _root (path, bs) = do
+-#if MIN_VERSION_template_haskell(2,7,0)
+- qAddDependentFile $ _root ++ '/' : path
+-#endif
+- exp' <- bsToExp bs
+- return $! TupE [LitE $ StringL path, exp']
+-
+-bsToExp :: B.ByteString -> Q Exp
+-bsToExp bs = do
+- helper <- [| stringToBs |]
+- let chars = B8.unpack bs
+- return $! AppE helper $! LitE $! StringL chars
+-
+ stringToBs :: String -> B.ByteString
+ stringToBs = B8.pack
+
+@@ -164,22 +103,6 @@ padSize i =
+ let s = show i
+ in replicate (sizeLen - length s) '0' ++ s
+
+-#if MIN_VERSION_template_haskell(2,5,0)
+-dummySpace :: Int -> Q Exp
+-dummySpace space = do
+- let size = padSize space
+- let start = magic ++ size
+- let chars = LitE $ StringPrimL $
+-#if MIN_VERSION_template_haskell(2,6,0)
+- map (toEnum . fromEnum) $
+-#endif
+- start ++ replicate space '0'
+- let len = LitE $ IntegerL $ fromIntegral $ length start + space
+- upi <- [|unsafePerformIO|]
+- pack <- [|unsafePackAddressLen|]
+- getInner' <- [|getInner|]
+- return $ getInner' `AppE` (upi `AppE` (pack `AppE` len `AppE` chars))
+-#endif
+
+ inject :: B.ByteString -- ^ bs to inject
+ -> B.ByteString -- ^ original BS containing dummy
+--
+2.1.0
+
diff --git a/standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch b/standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch
new file mode 100644
index 0000000..83c8ffd
--- /dev/null
+++ b/standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch
@@ -0,0 +1,394 @@
+From 9a41401d903f160e11d56fff35c24eb59d97885d Mon Sep 17 00:00:00 2001
+From: Joey Hess <joey@kitenet.net>
+Date: Tue, 17 Dec 2013 19:04:40 +0000
+Subject: [PATCH] remove TH
+
+---
+ src/Generics/Deriving/TH.hs | 354 --------------------------------------------
+ 1 file changed, 354 deletions(-)
+
+diff --git a/src/Generics/Deriving/TH.hs b/src/Generics/Deriving/TH.hs
+index 783cb65..9aab713 100644
+--- a/src/Generics/Deriving/TH.hs
++++ b/src/Generics/Deriving/TH.hs
+@@ -19,18 +19,6 @@
+
+ -- Adapted from Generics.Regular.TH
+ module Generics.Deriving.TH (
+-
+- deriveMeta
+- , deriveData
+- , deriveConstructors
+- , deriveSelectors
+-
+-#if __GLASGOW_HASKELL__ < 701
+- , deriveAll
+- , deriveRepresentable0
+- , deriveRep0
+- , simplInstance
+-#endif
+ ) where
+
+ import Generics.Deriving.Base
+@@ -41,124 +29,6 @@ import Language.Haskell.TH.Syntax (Lift(..))
+ import Data.List (intercalate)
+ import Control.Monad
+
+--- | Given the names of a generic class, a type to instantiate, a function in
+--- the class and the default implementation, generates the code for a basic
+--- generic instance.
+-simplInstance :: Name -> Name -> Name -> Name -> Q [Dec]
+-simplInstance cl ty fn df = do
+- i <- reify (genRepName 0 ty)
+- x <- newName "x"
+- let typ = ForallT [PlainTV x] []
+- ((foldl (\a -> AppT a . VarT . tyVarBndrToName) (ConT (genRepName 0 ty))
+- (typeVariables i)) `AppT` (VarT x))
+- fmap (: []) $ instanceD (cxt []) (conT cl `appT` conT ty)
+- [funD fn [clause [] (normalB (varE df `appE`
+- (sigE (global 'undefined) (return typ)))) []]]
+-
+-
+--- | Given the type and the name (as string) for the type to derive,
+--- generate the 'Data' instance, the 'Constructor' instances, the 'Selector'
+--- instances, and the 'Representable0' instance.
+-deriveAll :: Name -> Q [Dec]
+-deriveAll n =
+- do a <- deriveMeta n
+- b <- deriveRepresentable0 n
+- return (a ++ b)
+-
+--- | Given the type and the name (as string) for the type to derive,
+--- generate the 'Data' instance, the 'Constructor' instances, and the 'Selector'
+--- instances.
+-deriveMeta :: Name -> Q [Dec]
+-deriveMeta n =
+- do a <- deriveData n
+- b <- deriveConstructors n
+- c <- deriveSelectors n
+- return (a ++ b ++ c)
+-
+--- | Given a datatype name, derive a datatype and instance of class 'Datatype'.
+-deriveData :: Name -> Q [Dec]
+-deriveData = dataInstance
+-
+--- | Given a datatype name, derive datatypes and
+--- instances of class 'Constructor'.
+-deriveConstructors :: Name -> Q [Dec]
+-deriveConstructors = constrInstance
+-
+--- | Given a datatype name, derive datatypes and instances of class 'Selector'.
+-deriveSelectors :: Name -> Q [Dec]
+-deriveSelectors = selectInstance
+-
+--- | Given the type and the name (as string) for the Representable0 type
+--- synonym to derive, generate the 'Representable0' instance.
+-deriveRepresentable0 :: Name -> Q [Dec]
+-deriveRepresentable0 n = do
+- rep0 <- deriveRep0 n
+- inst <- deriveInst n
+- return $ rep0 ++ inst
+-
+--- | Derive only the 'Rep0' type synonym. Not needed if 'deriveRepresentable0'
+--- is used.
+-deriveRep0 :: Name -> Q [Dec]
+-deriveRep0 n = do
+- i <- reify n
+- fmap (:[]) $ tySynD (genRepName 0 n) (typeVariables i) (rep0Type n)
+-
+-deriveInst :: Name -> Q [Dec]
+-deriveInst t = do
+- i <- reify t
+- let typ q = foldl (\a -> AppT a . VarT . tyVarBndrToName) (ConT q)
+- (typeVariables i)
+-#if __GLASGOW_HASKELL__ >= 707
+- let tyIns = TySynInstD ''Rep (TySynEqn [typ t] (typ (genRepName 0 t)))
+-#else
+- let tyIns = TySynInstD ''Rep [typ t] (typ (genRepName 0 t))
+-#endif
+- fcs <- mkFrom t 1 0 t
+- tcs <- mkTo t 1 0 t
+- liftM (:[]) $
+- instanceD (cxt []) (conT ''Generic `appT` return (typ t))
+- [return tyIns, funD 'from fcs, funD 'to tcs]
+-
+-
+-dataInstance :: Name -> Q [Dec]
+-dataInstance n = do
+- i <- reify n
+- case i of
+- TyConI (DataD _ n _ _ _) -> mkInstance n
+- TyConI (NewtypeD _ n _ _ _) -> mkInstance n
+- _ -> return []
+- where
+- mkInstance n = do
+- ds <- mkDataData n
+- is <- mkDataInstance n
+- return $ [ds,is]
+-
+-constrInstance :: Name -> Q [Dec]
+-constrInstance n = do
+- i <- reify n
+- case i of
+- TyConI (DataD _ n _ cs _) -> mkInstance n cs
+- TyConI (NewtypeD _ n _ c _) -> mkInstance n [c]
+- _ -> return []
+- where
+- mkInstance n cs = do
+- ds <- mapM (mkConstrData n) cs
+- is <- mapM (mkConstrInstance n) cs
+- return $ ds ++ is
+-
+-selectInstance :: Name -> Q [Dec]
+-selectInstance n = do
+- i <- reify n
+- case i of
+- TyConI (DataD _ n _ cs _) -> mkInstance n cs
+- TyConI (NewtypeD _ n _ c _) -> mkInstance n [c]
+- _ -> return []
+- where
+- mkInstance n cs = do
+- ds <- mapM (mkSelectData n) cs
+- is <- mapM (mkSelectInstance n) cs
+- return $ concat (ds ++ is)
+-
+ typeVariables :: Info -> [TyVarBndr]
+ typeVariables (TyConI (DataD _ _ tv _ _)) = tv
+ typeVariables (TyConI (NewtypeD _ _ tv _ _)) = tv
+@@ -179,233 +49,9 @@ genName = mkName . (++"_") . intercalate "_" . map nameBase
+ genRepName :: Int -> Name -> Name
+ genRepName n = mkName . (++"_") . (("Rep" ++ show n) ++) . nameBase
+
+-mkDataData :: Name -> Q Dec
+-mkDataData n = dataD (cxt []) (genName [n]) [] [] []
+-
+-mkConstrData :: Name -> Con -> Q Dec
+-mkConstrData dt (NormalC n _) =
+- dataD (cxt []) (genName [dt, n]) [] [] []
+-mkConstrData dt r@(RecC _ _) =
+- mkConstrData dt (stripRecordNames r)
+-mkConstrData dt (InfixC t1 n t2) =
+- mkConstrData dt (NormalC n [t1,t2])
+-
+-mkSelectData :: Name -> Con -> Q [Dec]
+-mkSelectData dt r@(RecC n fs) = return (map one fs)
+- where one (f, _, _) = DataD [] (genName [dt, n, f]) [] [] []
+-mkSelectData dt _ = return []
+-
+-
+-mkDataInstance :: Name -> Q Dec
+-mkDataInstance n =
+- instanceD (cxt []) (appT (conT ''Datatype) (conT $ genName [n]))
+- [funD 'datatypeName [clause [wildP] (normalB (stringE (nameBase n))) []]
+- ,funD 'moduleName [clause [wildP] (normalB (stringE name)) []]]
+- where
+- name = maybe (error "Cannot fetch module name!") id (nameModule n)
+-
+-instance Lift Fixity where
+- lift Prefix = conE 'Prefix
+- lift (Infix a n) = conE 'Infix `appE` [| a |] `appE` [| n |]
+-
+-instance Lift Associativity where
+- lift LeftAssociative = conE 'LeftAssociative
+- lift RightAssociative = conE 'RightAssociative
+- lift NotAssociative = conE 'NotAssociative
+-
+-mkConstrInstance :: Name -> Con -> Q Dec
+-mkConstrInstance dt (NormalC n _) = mkConstrInstanceWith dt n []
+-mkConstrInstance dt (RecC n _) = mkConstrInstanceWith dt n
+- [ funD 'conIsRecord [clause [wildP] (normalB (conE 'True)) []]]
+-mkConstrInstance dt (InfixC t1 n t2) =
+- do
+- i <- reify n
+- let fi = case i of
+- DataConI _ _ _ f -> convertFixity f
+- _ -> Prefix
+- instanceD (cxt []) (appT (conT ''Constructor) (conT $ genName [dt, n]))
+- [funD 'conName [clause [wildP] (normalB (stringE (nameBase n))) []],
+- funD 'conFixity [clause [wildP] (normalB [| fi |]) []]]
+- where
+- convertFixity (Fixity n d) = Infix (convertDirection d) n
+- convertDirection InfixL = LeftAssociative
+- convertDirection InfixR = RightAssociative
+- convertDirection InfixN = NotAssociative
+-
+-mkConstrInstanceWith :: Name -> Name -> [Q Dec] -> Q Dec
+-mkConstrInstanceWith dt n extra =
+- instanceD (cxt []) (appT (conT ''Constructor) (conT $ genName [dt, n]))
+- (funD 'conName [clause [wildP] (normalB (stringE (nameBase n))) []] : extra)
+-
+-mkSelectInstance :: Name -> Con -> Q [Dec]
+-mkSelectInstance dt r@(RecC n fs) = return (map one fs) where
+- one (f, _, _) =
+- InstanceD ([]) (AppT (ConT ''Selector) (ConT $ genName [dt, n, f]))
+- [FunD 'selName [Clause [WildP]
+- (NormalB (LitE (StringL (nameBase f)))) []]]
+-mkSelectInstance _ _ = return []
+-
+-rep0Type :: Name -> Q Type
+-rep0Type n =
+- do
+- -- runIO $ putStrLn $ "processing " ++ show n
+- i <- reify n
+- let b = case i of
+- TyConI (DataD _ dt vs cs _) ->
+- (conT ''D1) `appT` (conT $ genName [dt]) `appT`
+- (foldr1' sum (conT ''V1)
+- (map (rep0Con (dt, map tyVarBndrToName vs)) cs))
+- TyConI (NewtypeD _ dt vs c _) ->
+- (conT ''D1) `appT` (conT $ genName [dt]) `appT`
+- (rep0Con (dt, map tyVarBndrToName vs) c)
+- TyConI (TySynD t _ _) -> error "type synonym?"
+- _ -> error "unknown construct"
+- --appT b (conT $ mkName (nameBase n))
+- b where
+- sum :: Q Type -> Q Type -> Q Type
+- sum a b = conT ''(:+:) `appT` a `appT` b
+-
+-
+-rep0Con :: (Name, [Name]) -> Con -> Q Type
+-rep0Con (dt, vs) (NormalC n []) =
+- conT ''C1 `appT` (conT $ genName [dt, n]) `appT`
+- (conT ''S1 `appT` conT ''NoSelector `appT` conT ''U1)
+-rep0Con (dt, vs) (NormalC n fs) =
+- conT ''C1 `appT` (conT $ genName [dt, n]) `appT`
+- (foldr1 prod (map (repField (dt, vs) . snd) fs)) where
+- prod :: Q Type -> Q Type -> Q Type
+- prod a b = conT ''(:*:) `appT` a `appT` b
+-rep0Con (dt, vs) r@(RecC n []) =
+- conT ''C1 `appT` (conT $ genName [dt, n]) `appT` conT ''U1
+-rep0Con (dt, vs) r@(RecC n fs) =
+- conT ''C1 `appT` (conT $ genName [dt, n]) `appT`
+- (foldr1 prod (map (repField' (dt, vs) n) fs)) where
+- prod :: Q Type -> Q Type -> Q Type
+- prod a b = conT ''(:*:) `appT` a `appT` b
+-
+-rep0Con d (InfixC t1 n t2) = rep0Con d (NormalC n [t1,t2])
+-
+---dataDeclToType :: (Name, [Name]) -> Type
+---dataDeclToType (dt, vs) = foldl (\a b -> AppT a (VarT b)) (ConT dt) vs
+-
+-repField :: (Name, [Name]) -> Type -> Q Type
+---repField d t | t == dataDeclToType d = conT ''I
+-repField d t = conT ''S1 `appT` conT ''NoSelector `appT`
+- (conT ''Rec0 `appT` return t)
+-
+-repField' :: (Name, [Name]) -> Name -> (Name, Strict, Type) -> Q Type
+---repField' d ns (_, _, t) | t == dataDeclToType d = conT ''I
+-repField' (dt, vs) ns (f, _, t) = conT ''S1 `appT` conT (genName [dt, ns, f])
+- `appT` (conT ''Rec0 `appT` return t)
+--- Note: we should generate Par0 too, at some point
+-
+-
+-mkFrom :: Name -> Int -> Int -> Name -> Q [Q Clause]
+-mkFrom ns m i n =
+- do
+- -- runIO $ putStrLn $ "processing " ++ show n
+- let wrapE e = lrE m i e
+- i <- reify n
+- let b = case i of
+- TyConI (DataD _ dt vs cs _) ->
+- zipWith (fromCon wrapE ns (dt, map tyVarBndrToName vs)
+- (length cs)) [0..] cs
+- TyConI (NewtypeD _ dt vs c _) ->
+- [fromCon wrapE ns (dt, map tyVarBndrToName vs) 1 0 c]
+- TyConI (TySynD t _ _) -> error "type synonym?"
+- -- [clause [varP (field 0)] (normalB (wrapE $ conE 'K1 `appE` varE (field 0))) []]
+- _ -> error "unknown construct"
+- return b
+-
+-mkTo :: Name -> Int -> Int -> Name -> Q [Q Clause]
+-mkTo ns m i n =
+- do
+- -- runIO $ putStrLn $ "processing " ++ show n
+- let wrapP p = lrP m i p
+- i <- reify n
+- let b = case i of
+- TyConI (DataD _ dt vs cs _) ->
+- zipWith (toCon wrapP ns (dt, map tyVarBndrToName vs)
+- (length cs)) [0..] cs
+- TyConI (NewtypeD _ dt vs c _) ->
+- [toCon wrapP ns (dt, map tyVarBndrToName vs) 1 0 c]
+- TyConI (TySynD t _ _) -> error "type synonym?"
+- -- [clause [wrapP $ conP 'K1 [varP (field 0)]] (normalB $ varE (field 0)) []]
+- _ -> error "unknown construct"
+- return b
+-
+-fromCon :: (Q Exp -> Q Exp) -> Name -> (Name, [Name]) -> Int -> Int -> Con -> Q Clause
+-fromCon wrap ns (dt, vs) m i (NormalC cn []) =
+- clause
+- [conP cn []]
+- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ appE (conE 'M1) $
+- conE 'M1 `appE` (conE 'U1)) []
+-fromCon wrap ns (dt, vs) m i (NormalC cn fs) =
+- -- runIO (putStrLn ("constructor " ++ show ix)) >>
+- clause
+- [conP cn (map (varP . field) [0..length fs - 1])]
+- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ conE 'M1 `appE`
+- foldr1 prod (zipWith (fromField (dt, vs)) [0..] (map snd fs))) []
+- where prod x y = conE '(:*:) `appE` x `appE` y
+-fromCon wrap ns (dt, vs) m i r@(RecC cn []) =
+- clause
+- [conP cn []]
+- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ conE 'M1 `appE` (conE 'U1)) []
+-fromCon wrap ns (dt, vs) m i r@(RecC cn fs) =
+- clause
+- [conP cn (map (varP . field) [0..length fs - 1])]
+- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ conE 'M1 `appE`
+- foldr1 prod (zipWith (fromField (dt, vs)) [0..] (map trd fs))) []
+- where prod x y = conE '(:*:) `appE` x `appE` y
+-fromCon wrap ns (dt, vs) m i (InfixC t1 cn t2) =
+- fromCon wrap ns (dt, vs) m i (NormalC cn [t1,t2])
+-
+-fromField :: (Name, [Name]) -> Int -> Type -> Q Exp
+---fromField (dt, vs) nr t | t == dataDeclToType (dt, vs) = conE 'I `appE` varE (field nr)
+-fromField (dt, vs) nr t = conE 'M1 `appE` (conE 'K1 `appE` varE (field nr))
+-
+-toCon :: (Q Pat -> Q Pat) -> Name -> (Name, [Name]) -> Int -> Int -> Con -> Q Clause
+-toCon wrap ns (dt, vs) m i (NormalC cn []) =
+- clause
+- [wrap $ conP 'M1 [lrP m i $ conP 'M1 [conP 'M1 [conP 'U1 []]]]]
+- (normalB $ conE cn) []
+-toCon wrap ns (dt, vs) m i (NormalC cn fs) =
+- -- runIO (putStrLn ("constructor " ++ show ix)) >>
+- clause
+- [wrap $ conP 'M1 [lrP m i $ conP 'M1
+- [foldr1 prod (zipWith (toField (dt, vs)) [0..] (map snd fs))]]]
+- (normalB $ foldl appE (conE cn) (map (varE . field) [0..length fs - 1])) []
+- where prod x y = conP '(:*:) [x,y]
+-toCon wrap ns (dt, vs) m i r@(RecC cn []) =
+- clause
+- [wrap $ conP 'M1 [lrP m i $ conP 'M1 [conP 'U1 []]]]
+- (normalB $ conE cn) []
+-toCon wrap ns (dt, vs) m i r@(RecC cn fs) =
+- clause
+- [wrap $ conP 'M1 [lrP m i $ conP 'M1
+- [foldr1 prod (zipWith (toField (dt, vs)) [0..] (map trd fs))]]]
+- (normalB $ foldl appE (conE cn) (map (varE . field) [0..length fs - 1])) []
+- where prod x y = conP '(:*:) [x,y]
+-toCon wrap ns (dt, vs) m i (InfixC t1 cn t2) =
+- toCon wrap ns (dt, vs) m i (NormalC cn [t1,t2])
+-
+-toField :: (Name, [Name]) -> Int -> Type -> Q Pat
+---toField (dt, vs) nr t | t == dataDeclToType (dt, vs) = conP 'I [varP (field nr)]
+-toField (dt, vs) nr t = conP 'M1 [conP 'K1 [varP (field nr)]]
+-
+-
+ field :: Int -> Name
+ field n = mkName $ "f" ++ show n
+
+-lrP :: Int -> Int -> (Q Pat -> Q Pat)
+-lrP 1 0 p = p
+-lrP m 0 p = conP 'L1 [p]
+-lrP m i p = conP 'R1 [lrP (m-1) (i-1) p]
+-
+-lrE :: Int -> Int -> (Q Exp -> Q Exp)
+-lrE 1 0 e = e
+-lrE m 0 e = conE 'L1 `appE` e
+-lrE m i e = conE 'R1 `appE` lrE (m-1) (i-1) e
+
+ trd (_,_,c) = c
+
+--
+1.8.5.1
+
diff --git a/standalone/no-th/haskell-patches/lens_no-TH.patch b/standalone/no-th/haskell-patches/lens_no-TH.patch
index 9b15c04..bc453bf 100644
--- a/standalone/no-th/haskell-patches/lens_no-TH.patch
+++ b/standalone/no-th/haskell-patches/lens_no-TH.patch
@@ -1,20 +1,20 @@
-From 88ff2174944daf90530a33ee06e2e3f667089b6a Mon Sep 17 00:00:00 2001
+From 10c9ade98b3ac2054947f411d77db2eb28896b9f Mon Sep 17 00:00:00 2001
From: dummy <dummy@example.com>
-Date: Fri, 3 Jul 2015 02:06:43 +0000
-Subject: [PATCH] remove TH
+Date: Thu, 16 Oct 2014 01:43:10 +0000
+Subject: [PATCH] avoid TH
---
- lens.cabal | 16 +---------------
- src/Control/Lens.hs | 6 ++----
+ lens.cabal | 17 +----------------
+ src/Control/Lens.hs | 8 ++------
src/Control/Lens/Cons.hs | 2 --
src/Control/Lens/Internal/Fold.hs | 2 --
src/Control/Lens/Operators.hs | 2 +-
src/Control/Lens/Prism.hs | 2 --
src/Control/Monad/Primitive/Lens.hs | 1 -
- 7 files changed, 4 insertions(+), 27 deletions(-)
+ 7 files changed, 4 insertions(+), 30 deletions(-)
diff --git a/lens.cabal b/lens.cabal
-index c7f6009..ab206c5 100644
+index 5388301..d7b02b9 100644
--- a/lens.cabal
+++ b/lens.cabal
@@ -10,7 +10,7 @@ stability: provisional
@@ -26,7 +26,15 @@ index c7f6009..ab206c5 100644
-- build-tools: cpphs
tested-with: GHC == 7.4.1, GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.1, GHC == 7.8.2
synopsis: Lenses, Folds and Traversals
-@@ -230,8 +230,6 @@ library
+@@ -217,7 +217,6 @@ library
+ Control.Exception.Lens
+ Control.Lens
+ Control.Lens.Action
+- Control.Lens.At
+ Control.Lens.Combinators
+ Control.Lens.Cons
+ Control.Lens.Each
+@@ -234,8 +233,6 @@ library
Control.Lens.Internal.Context
Control.Lens.Internal.Deque
Control.Lens.Internal.Exception
@@ -35,7 +43,7 @@ index c7f6009..ab206c5 100644
Control.Lens.Internal.Fold
Control.Lens.Internal.Getter
Control.Lens.Internal.Indexed
-@@ -243,25 +241,21 @@ library
+@@ -247,25 +244,21 @@ library
Control.Lens.Internal.Reflection
Control.Lens.Internal.Review
Control.Lens.Internal.Setter
@@ -61,7 +69,7 @@ index c7f6009..ab206c5 100644
Control.Monad.Primitive.Lens
Control.Parallel.Strategies.Lens
Control.Seq.Lens
-@@ -287,12 +281,8 @@ library
+@@ -291,12 +284,8 @@ library
Data.Typeable.Lens
Data.Vector.Lens
Data.Vector.Generic.Lens
@@ -74,7 +82,7 @@ index c7f6009..ab206c5 100644
Numeric.Lens
other-modules:
-@@ -395,7 +385,6 @@ test-suite doctests
+@@ -403,7 +392,6 @@ test-suite doctests
deepseq,
doctest >= 0.9.1,
filepath,
@@ -82,7 +90,7 @@ index c7f6009..ab206c5 100644
mtl,
nats,
parallel,
-@@ -433,7 +422,6 @@ benchmark plated
+@@ -441,7 +429,6 @@ benchmark plated
comonad,
criterion,
deepseq,
@@ -90,7 +98,7 @@ index c7f6009..ab206c5 100644
lens,
transformers
-@@ -468,7 +456,6 @@ benchmark unsafe
+@@ -476,7 +463,6 @@ benchmark unsafe
comonads-fd,
criterion,
deepseq,
@@ -98,7 +106,7 @@ index c7f6009..ab206c5 100644
lens,
transformers
-@@ -485,6 +472,5 @@ benchmark zipper
+@@ -493,6 +479,5 @@ benchmark zipper
comonads-fd,
criterion,
deepseq,
@@ -106,10 +114,18 @@ index c7f6009..ab206c5 100644
lens,
transformers
diff --git a/src/Control/Lens.hs b/src/Control/Lens.hs
-index d879c58..3d6015b 100644
+index 7e15267..433f1fc 100644
--- a/src/Control/Lens.hs
+++ b/src/Control/Lens.hs
-@@ -56,12 +56,11 @@ module Control.Lens
+@@ -41,7 +41,6 @@
+ ----------------------------------------------------------------------------
+ module Control.Lens
+ ( module Control.Lens.Action
+- , module Control.Lens.At
+ , module Control.Lens.Cons
+ , module Control.Lens.Each
+ , module Control.Lens.Empty
+@@ -53,12 +52,11 @@ module Control.Lens
, module Control.Lens.Lens
, module Control.Lens.Level
, module Control.Lens.Loupe
@@ -123,7 +139,15 @@ index d879c58..3d6015b 100644
, module Control.Lens.TH
#endif
, module Control.Lens.Traversal
-@@ -83,12 +82,11 @@ import Control.Lens.Iso
+@@ -69,7 +67,6 @@ module Control.Lens
+ ) where
+
+ import Control.Lens.Action
+-import Control.Lens.At
+ import Control.Lens.Cons
+ import Control.Lens.Each
+ import Control.Lens.Empty
+@@ -81,12 +78,11 @@ import Control.Lens.Iso
import Control.Lens.Lens
import Control.Lens.Level
import Control.Lens.Loupe
@@ -138,12 +162,12 @@ index d879c58..3d6015b 100644
#endif
import Control.Lens.Traversal
diff --git a/src/Control/Lens/Cons.hs b/src/Control/Lens/Cons.hs
-index 7b35db4..269f307 100644
+index a80e9c8..7d27b80 100644
--- a/src/Control/Lens/Cons.hs
+++ b/src/Control/Lens/Cons.hs
-@@ -56,8 +56,6 @@ import qualified Data.Vector.Unboxed as Unbox
+@@ -55,8 +55,6 @@ import Data.Vector.Unboxed (Unbox)
+ import qualified Data.Vector.Unboxed as Unbox
import Data.Word
- import Prelude
-{-# ANN module "HLint: ignore Eta reduce" #-}
-
@@ -151,12 +175,12 @@ index 7b35db4..269f307 100644
-- >>> :set -XNoOverloadedStrings
-- >>> import Control.Lens
diff --git a/src/Control/Lens/Internal/Fold.hs b/src/Control/Lens/Internal/Fold.hs
-index 4bbde21..16295f4 100644
+index ab09c6b..43aa905 100644
--- a/src/Control/Lens/Internal/Fold.hs
+++ b/src/Control/Lens/Internal/Fold.hs
-@@ -35,8 +35,6 @@ import Data.Semigroup hiding (Min, getMin, Max, getMax)
+@@ -37,8 +37,6 @@ import Data.Maybe
+ import Data.Semigroup hiding (Min, getMin, Max, getMax)
import Data.Reflection
- import Prelude
-{-# ANN module "HLint: ignore Avoid lambda" #-}
-
@@ -164,10 +188,10 @@ index 4bbde21..16295f4 100644
-- Folding
------------------------------------------------------------------------------
diff --git a/src/Control/Lens/Operators.hs b/src/Control/Lens/Operators.hs
-index 302f68e..1625fe5 100644
+index 9992e63..631e8e6 100644
--- a/src/Control/Lens/Operators.hs
+++ b/src/Control/Lens/Operators.hs
-@@ -104,7 +104,7 @@ module Control.Lens.Operators
+@@ -111,7 +111,7 @@ module Control.Lens.Operators
, (<#~)
, (<#=)
-- * "Control.Lens.Plated"
@@ -177,12 +201,12 @@ index 302f68e..1625fe5 100644
, ( # )
-- * "Control.Lens.Setter"
diff --git a/src/Control/Lens/Prism.hs b/src/Control/Lens/Prism.hs
-index 36152d6..3af6bd3 100644
+index b75c870..c6c6596 100644
--- a/src/Control/Lens/Prism.hs
+++ b/src/Control/Lens/Prism.hs
-@@ -62,8 +62,6 @@ import Data.Profunctor.Unsafe
+@@ -61,8 +61,6 @@ import Unsafe.Coerce
+ import Data.Profunctor.Unsafe
#endif
- import Prelude
-{-# ANN module "HLint: ignore Use camelCase" #-}
-
@@ -190,17 +214,17 @@ index 36152d6..3af6bd3 100644
-- >>> :set -XNoOverloadedStrings
-- >>> import Control.Lens
diff --git a/src/Control/Monad/Primitive/Lens.hs b/src/Control/Monad/Primitive/Lens.hs
-index 8f1ec94..482764a 100644
+index ee942c6..2f37134 100644
--- a/src/Control/Monad/Primitive/Lens.hs
+++ b/src/Control/Monad/Primitive/Lens.hs
-@@ -26,7 +26,6 @@ import Control.Lens
- import Control.Monad.Primitive
+@@ -20,7 +20,6 @@ import Control.Lens
+ import Control.Monad.Primitive (PrimMonad(..))
import GHC.Prim (State#)
-{-# ANN module "HLint: ignore Unused LANGUAGE pragma" #-}
- #if MIN_VERSION_primitive(0,6,0)
- prim :: PrimBase m => Iso' (m a) (State# (PrimState m) -> (# State# (PrimState m), a #))
+ prim :: (PrimMonad m) => Iso' (m a) (State# (PrimState m) -> (# State# (PrimState m), a #))
+ prim = iso internal primitive
--
-2.1.4
+2.1.1
diff --git a/standalone/no-th/haskell-patches/monad-logger_remove-TH.patch b/standalone/no-th/haskell-patches/monad-logger_remove-TH.patch
new file mode 100644
index 0000000..c24fa5a
--- /dev/null
+++ b/standalone/no-th/haskell-patches/monad-logger_remove-TH.patch
@@ -0,0 +1,27 @@
+From 8e78a25ce0cc19e52d063f66bd4cd316462393d4 Mon Sep 17 00:00:00 2001
+From: dummy <dummy@example.com>
+Date: Thu, 6 Mar 2014 23:27:06 +0000
+Subject: [PATCH] disable th
+
+---
+ monad-logger.cabal | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/monad-logger.cabal b/monad-logger.cabal
+index b0aa271..cd56c0f 100644
+--- a/monad-logger.cabal
++++ b/monad-logger.cabal
+@@ -14,8 +14,8 @@ cabal-version: >=1.8
+
+ flag template_haskell {
+ Description: Enable Template Haskell support
+- Default: True
+- Manual: True
++ Default: False
++ Manual: False
+ }
+
+ library
+--
+1.9.0
+
diff --git a/standalone/android/haskell-patches/optparse-applicative_remove-ANN.patch b/standalone/no-th/haskell-patches/optparse-applicative_remove-ANN.patch
index 1bb8435..1bb8435 100644
--- a/standalone/android/haskell-patches/optparse-applicative_remove-ANN.patch
+++ b/standalone/no-th/haskell-patches/optparse-applicative_remove-ANN.patch
diff --git a/standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch b/standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch
new file mode 100644
index 0000000..cd86ccd
--- /dev/null
+++ b/standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch
@@ -0,0 +1,41 @@
+From aae3ace106cf26c931cc94c96fb6fbfe83f950f2 Mon Sep 17 00:00:00 2001
+From: dummy <dummy@example.com>
+Date: Wed, 15 Oct 2014 17:05:37 +0000
+Subject: [PATCH] avoid TH
+
+---
+ Database/Persist/Sql/Raw.hs | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/Database/Persist/Sql/Raw.hs b/Database/Persist/Sql/Raw.hs
+index 3ac2ca9..bcc2011 100644
+--- a/Database/Persist/Sql/Raw.hs
++++ b/Database/Persist/Sql/Raw.hs
+@@ -11,7 +11,7 @@ import Data.IORef (writeIORef, readIORef, newIORef)
+ import Control.Exception (throwIO)
+ import Control.Monad (when, liftM)
+ import Data.Text (Text, pack)
+-import Control.Monad.Logger (logDebugS)
++--import Control.Monad.Logger (logDebugS)
+ import Data.Int (Int64)
+ import Control.Monad.Trans.Class (lift)
+ import qualified Data.Text as T
+@@ -23,7 +23,6 @@ rawQuery :: (MonadSqlPersist m, MonadResource m)
+ -> [PersistValue]
+ -> Source m [PersistValue]
+ rawQuery sql vals = do
+- lift $ $logDebugS (pack "SQL") $ pack $ show sql ++ " " ++ show vals
+ conn <- lift askSqlConn
+ bracketP
+ (getStmtConn conn sql)
+@@ -35,7 +34,6 @@ rawExecute x y = liftM (const ()) $ rawExecuteCount x y
+
+ rawExecuteCount :: MonadSqlPersist m => Text -> [PersistValue] -> m Int64
+ rawExecuteCount sql vals = do
+- $logDebugS (pack "SQL") $ pack $ show sql ++ " " ++ show vals
+ stmt <- getStmt sql
+ res <- liftIO $ stmtExecute stmt vals
+ liftIO $ stmtReset stmt
+--
+2.1.1
+
diff --git a/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch b/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch
new file mode 100644
index 0000000..45397f3
--- /dev/null
+++ b/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch
@@ -0,0 +1,26 @@
+From 392602f5ff14c0b5a801397d075ddcbcd890aa83 Mon Sep 17 00:00:00 2001
+From: Joey Hess <joey@kitenet.net>
+Date: Thu, 18 Apr 2013 17:50:59 -0400
+Subject: [PATCH] fix cross build
+
+---
+ src/Data/Profunctor/Unsafe.hs | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/src/Data/Profunctor/Unsafe.hs b/src/Data/Profunctor/Unsafe.hs
+index 025c7c4..0249274 100644
+--- a/src/Data/Profunctor/Unsafe.hs
++++ b/src/Data/Profunctor/Unsafe.hs
+@@ -40,9 +40,6 @@ import Data.Tagged
+ import Prelude hiding (id,(.),sequence)
+ import Unsafe.Coerce
+
+-{-# ANN module "Hlint: ignore Redundant lambda" #-}
+-{-# ANN module "Hlint: ignore Collapse lambdas" #-}
+-
+ infixr 9 #.
+ infixl 8 .#
+
+--
+1.8.2.rc3
+
diff --git a/standalone/no-th/haskell-patches/reflection_remove-TH.patch b/standalone/no-th/haskell-patches/reflection_remove-TH.patch
new file mode 100644
index 0000000..4f8b4bc
--- /dev/null
+++ b/standalone/no-th/haskell-patches/reflection_remove-TH.patch
@@ -0,0 +1,59 @@
+From c0f5dcfd6ba7a05bb84b6adc4664c8dde109e6ac Mon Sep 17 00:00:00 2001
+From: dummy <dummy@example.com>
+Date: Fri, 7 Mar 2014 04:30:22 +0000
+Subject: [PATCH] remove TH
+
+---
+ fast/Data/Reflection.hs | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/fast/Data/Reflection.hs b/fast/Data/Reflection.hs
+index ca57d35..d3f8356 100644
+--- a/fast/Data/Reflection.hs
++++ b/fast/Data/Reflection.hs
+@@ -59,7 +59,7 @@ module Data.Reflection
+ , Given(..)
+ , give
+ -- * Template Haskell reflection
+- , int, nat
++ --, int, nat
+ -- * Useful compile time naturals
+ , Z, D, SD, PD
+ ) where
+@@ -161,6 +161,7 @@ instance Reifies n Int => Reifies (PD n) Int where
+ -- instead of @$(int 3)@. Sometimes the two will produce the same
+ -- representation (if compiled without the @-DUSE_TYPE_LITS@ preprocessor
+ -- directive).
++{-
+ int :: Int -> TypeQ
+ int n = case quotRem n 2 of
+ (0, 0) -> conT ''Z
+@@ -176,7 +177,7 @@ nat :: Int -> TypeQ
+ nat n
+ | n >= 0 = int n
+ | otherwise = error "nat: negative"
+-
++-}
+ #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL < 704
+ instance Show (Q a)
+ instance Eq (Q a)
+@@ -195,6 +196,7 @@ instance Fractional a => Fractional (Q a) where
+ recip = fmap recip
+ fromRational = return . fromRational
+
++{-
+ -- | This permits the use of $(5) as a type splice.
+ instance Num Type where
+ #ifdef USE_TYPE_LITS
+@@ -254,7 +256,7 @@ instance Num Exp where
+ abs = onProxyType1 abs
+ signum = onProxyType1 signum
+ fromInteger n = ConE 'Proxy `SigE` (ConT ''Proxy `AppT` fromInteger n)
+-
++-}
+ #ifdef USE_TYPE_LITS
+ addProxy :: Proxy a -> Proxy b -> Proxy (a + b)
+ addProxy _ _ = Proxy
+--
+1.9.0
+
diff --git a/standalone/android/haskell-patches/skein_hardcode_little-endian.patch b/standalone/no-th/haskell-patches/skein_hardcode_little-endian.patch
index 7333742..7333742 100644
--- a/standalone/android/haskell-patches/skein_hardcode_little-endian.patch
+++ b/standalone/no-th/haskell-patches/skein_hardcode_little-endian.patch
diff --git a/standalone/no-th/haskell-patches/vector_hack-to-build-with-new-ghc.patch b/standalone/no-th/haskell-patches/vector_hack-to-build-with-new-ghc.patch
new file mode 100644
index 0000000..f89f0d6
--- /dev/null
+++ b/standalone/no-th/haskell-patches/vector_hack-to-build-with-new-ghc.patch
@@ -0,0 +1,49 @@
+From 6ffd4fcb7d27ec6df709d80a40a262406446a259 Mon Sep 17 00:00:00 2001
+From: dummy <dummy@example.com>
+Date: Wed, 15 Oct 2014 17:00:56 +0000
+Subject: [PATCH] cross build
+
+---
+ Data/Vector/Fusion/Stream/Monadic.hs | 1 -
+ Data/Vector/Unboxed/Base.hs | 13 -------------
+ 2 files changed, 14 deletions(-)
+
+diff --git a/Data/Vector/Fusion/Stream/Monadic.hs b/Data/Vector/Fusion/Stream/Monadic.hs
+index 51fec75..b089b3d 100644
+--- a/Data/Vector/Fusion/Stream/Monadic.hs
++++ b/Data/Vector/Fusion/Stream/Monadic.hs
+@@ -101,7 +101,6 @@ import GHC.Exts ( SpecConstrAnnotation(..) )
+
+ data SPEC = SPEC | SPEC2
+ #if __GLASGOW_HASKELL__ >= 700
+-{-# ANN type SPEC ForceSpecConstr #-}
+ #endif
+
+ emptyStream :: String
+diff --git a/Data/Vector/Unboxed/Base.hs b/Data/Vector/Unboxed/Base.hs
+index 00350cb..34bfc4a 100644
+--- a/Data/Vector/Unboxed/Base.hs
++++ b/Data/Vector/Unboxed/Base.hs
+@@ -65,19 +65,6 @@ vectorTyCon = mkTyCon3 "vector"
+ vectorTyCon m s = mkTyCon $ m ++ "." ++ s
+ #endif
+
+-instance Typeable1 Vector where
+- typeOf1 _ = mkTyConApp (vectorTyCon "Data.Vector.Unboxed" "Vector") []
+-
+-instance Typeable2 MVector where
+- typeOf2 _ = mkTyConApp (vectorTyCon "Data.Vector.Unboxed.Mutable" "MVector") []
+-
+-instance (Data a, Unbox a) => Data (Vector a) where
+- gfoldl = G.gfoldl
+- toConstr _ = error "toConstr"
+- gunfold _ _ = error "gunfold"
+- dataTypeOf _ = G.mkType "Data.Vector.Unboxed.Vector"
+- dataCast1 = G.dataCast
+-
+ -- ----
+ -- Unit
+ -- ----
+--
+2.1.1
+
diff --git a/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch b/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch
index 76beafd..9331431 100644
--- a/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch
+++ b/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch
@@ -1,8 +1,12 @@
-From a020dd27eda45263db6ac887df4a94efb6ca86db Mon Sep 17 00:00:00 2001
+From 3aef808eee43c973ae1fbf6e8769d89b7f0d355b Mon Sep 17 00:00:00 2001
From: dummy <dummy@example.com>
-Date: Thu, 2 Jul 2015 21:36:02 +0000
+Date: Tue, 10 Jun 2014 14:47:42 +0000
Subject: [PATCH] deal with TH
+Export modules referenced by it.
+
+Should not need these icons in git-annex, so not worth using the Evil
+Splicer.
---
Network/Wai/Application/Static.hs | 4 ----
WaiAppStatic/Storage/Embedded.hs | 8 ++++----
@@ -10,10 +14,10 @@ Subject: [PATCH] deal with TH
3 files changed, 5 insertions(+), 11 deletions(-)
diff --git a/Network/Wai/Application/Static.hs b/Network/Wai/Application/Static.hs
-index 228582d..7d72bb0 100644
+index db2b835..b2c1aec 100644
--- a/Network/Wai/Application/Static.hs
+++ b/Network/Wai/Application/Static.hs
-@@ -34,8 +34,6 @@ import Control.Monad.IO.Class (liftIO)
+@@ -33,8 +33,6 @@ import Control.Monad.IO.Class (liftIO)
import Blaze.ByteString.Builder (toByteString)
@@ -22,10 +26,10 @@ index 228582d..7d72bb0 100644
import Data.Text (Text)
import qualified Data.Text as T
-@@ -218,8 +216,6 @@ staticAppPieces _ _ req sendResponse
+@@ -198,8 +196,6 @@ staticAppPieces _ _ req sendResponse
H.status405
[("Content-Type", "text/plain")]
- "Only GET or HEAD is supported"
+ "Only GET is supported"
-staticAppPieces _ [".hidden", "folder.png"] _ sendResponse = sendResponse $ W.responseLBS H.status200 [("Content-Type", "image/png")] $ L.fromChunks [$(embedFile "images/folder.png")]
-staticAppPieces _ [".hidden", "haskell.png"] _ sendResponse = sendResponse $ W.responseLBS H.status200 [("Content-Type", "image/png")] $ L.fromChunks [$(embedFile "images/haskell.png")]
staticAppPieces ss rawPieces req sendResponse = liftIO $ do
@@ -51,10 +55,10 @@ index daa6e50..9873d4e 100644
-import WaiAppStatic.Storage.Embedded.TH
+--import WaiAppStatic.Storage.Embedded.TH
diff --git a/wai-app-static.cabal b/wai-app-static.cabal
-index 4cca237..3fbfcee 100644
+index ef6f898..9a59d71 100644
--- a/wai-app-static.cabal
+++ b/wai-app-static.cabal
-@@ -35,7 +35,6 @@ library
+@@ -33,7 +33,6 @@ library
, containers >= 0.2
, time >= 1.1.4
, old-locale >= 1.0.0.2
@@ -62,7 +66,7 @@ index 4cca237..3fbfcee 100644
, text >= 0.7
, blaze-builder >= 0.2.1.4
, base64-bytestring >= 0.1
-@@ -63,9 +62,8 @@ library
+@@ -61,9 +60,8 @@ library
WaiAppStatic.Listing
WaiAppStatic.Types
WaiAppStatic.CmdLine
@@ -74,5 +78,5 @@ index 4cca237..3fbfcee 100644
extensions: CPP
--
-2.1.4
+2.0.0
diff --git a/standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch b/standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch
new file mode 100644
index 0000000..b6334d3
--- /dev/null
+++ b/standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch
@@ -0,0 +1,108 @@
+From b53713fbb4f3bb6bdd25b07afcaed4940b32dfa8 Mon Sep 17 00:00:00 2001
+From: Joey Hess <joey@kitenet.net>
+Date: Wed, 18 Dec 2013 03:32:44 +0000
+Subject: [PATCH] remove TH
+
+---
+ Text/Hamlet/XML.hs | 81 +-----------------------------------------------------
+ 1 file changed, 1 insertion(+), 80 deletions(-)
+
+diff --git a/Text/Hamlet/XML.hs b/Text/Hamlet/XML.hs
+index f587410..4e830bd 100644
+--- a/Text/Hamlet/XML.hs
++++ b/Text/Hamlet/XML.hs
+@@ -1,9 +1,7 @@
+ {-# LANGUAGE TemplateHaskell #-}
+ {-# OPTIONS_GHC -fno-warn-missing-fields #-}
+ module Text.Hamlet.XML
+- ( xml
+- , xmlFile
+- ) where
++ () where
+
+ import Language.Haskell.TH.Syntax
+ import Language.Haskell.TH.Quote
+@@ -19,80 +17,3 @@ import qualified Data.Foldable as F
+ import Data.Maybe (fromMaybe)
+ import qualified Data.Map as Map
+
+-xml :: QuasiQuoter
+-xml = QuasiQuoter { quoteExp = strToExp }
+-
+-xmlFile :: FilePath -> Q Exp
+-xmlFile = strToExp . TL.unpack <=< qRunIO . readUtf8File
+-
+-strToExp :: String -> Q Exp
+-strToExp s =
+- case parseDoc s of
+- Error e -> error e
+- Ok x -> docsToExp [] x
+-
+-docsToExp :: Scope -> [Doc] -> Q Exp
+-docsToExp scope docs = [| concat $(fmap ListE $ mapM (docToExp scope) docs) |]
+-
+-docToExp :: Scope -> Doc -> Q Exp
+-docToExp scope (DocTag name attrs cs) =
+- [| [ X.NodeElement (X.Element ($(liftName name)) $(mkAttrs scope attrs) $(docsToExp scope cs))
+- ] |]
+-docToExp _ (DocContent (ContentRaw s)) = [| [ X.NodeContent (pack $(lift s)) ] |]
+-docToExp scope (DocContent (ContentVar d)) = [| [ X.NodeContent $(return $ derefToExp scope d) ] |]
+-docToExp scope (DocContent (ContentEmbed d)) = return $ derefToExp scope d
+-docToExp scope (DocForall deref ident@(Ident ident') inside) = do
+- let list' = derefToExp scope deref
+- name <- newName ident'
+- let scope' = (ident, VarE name) : scope
+- inside' <- docsToExp scope' inside
+- let lam = LamE [VarP name] inside'
+- [| F.concatMap $(return lam) $(return list') |]
+-docToExp scope (DocWith [] inside) = docsToExp scope inside
+-docToExp scope (DocWith ((deref, ident@(Ident name)):dis) inside) = do
+- let deref' = derefToExp scope deref
+- name' <- newName name
+- let scope' = (ident, VarE name') : scope
+- inside' <- docToExp scope' (DocWith dis inside)
+- let lam = LamE [VarP name'] inside'
+- return $ lam `AppE` deref'
+-docToExp scope (DocMaybe deref ident@(Ident name) just nothing) = do
+- let deref' = derefToExp scope deref
+- name' <- newName name
+- let scope' = (ident, VarE name') : scope
+- inside' <- docsToExp scope' just
+- let inside'' = LamE [VarP name'] inside'
+- nothing' <-
+- case nothing of
+- Nothing -> [| [] |]
+- Just n -> docsToExp scope n
+- [| maybe $(return nothing') $(return inside'') $(return deref') |]
+-docToExp scope (DocCond conds final) = do
+- unit <- [| () |]
+- body <- fmap GuardedB $ mapM go $ conds ++ [(DerefIdent $ Ident "otherwise", fromMaybe [] final)]
+- return $ CaseE unit [Match (TupP []) body []]
+- where
+- go (deref, inside) = do
+- inside' <- docsToExp scope inside
+- return (NormalG $ derefToExp scope deref, inside')
+-
+-mkAttrs :: Scope -> [(Maybe Deref, String, [Content])] -> Q Exp
+-mkAttrs _ [] = [| Map.empty |]
+-mkAttrs scope ((mderef, name, value):rest) = do
+- rest' <- mkAttrs scope rest
+- this <- [| Map.insert $(liftName name) (T.concat $(fmap ListE $ mapM go value)) |]
+- let with = [| $(return this) $(return rest') |]
+- case mderef of
+- Nothing -> with
+- Just deref -> [| if $(return $ derefToExp scope deref) then $(with) else $(return rest') |]
+- where
+- go (ContentRaw s) = [| pack $(lift s) |]
+- go (ContentVar d) = return $ derefToExp scope d
+- go ContentEmbed{} = error "Cannot use embed interpolation in attribute value"
+-
+-liftName :: String -> Q Exp
+-liftName s = do
+- X.Name local mns _ <- return $ fromString s
+- case mns of
+- Nothing -> [| X.Name (pack $(lift $ unpack local)) Nothing Nothing |]
+- Just ns -> [| X.Name (pack $(lift $ unpack local)) (Just $ pack $(lift $ unpack ns)) Nothing |]
+--
+1.8.5.1
+
diff --git a/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch b/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch
index 723ec09..f58fcb3 100644
--- a/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch
+++ b/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch
@@ -1,6 +1,6 @@
-From bec7dac77cc7fbe9a620c371d7c2cdbcf234eac6 Mon Sep 17 00:00:00 2001
+From f1feea61dcba0b16afed5ce8dd5d2433fe505461 Mon Sep 17 00:00:00 2001
From: dummy <dummy@example.com>
-Date: Fri, 3 Jul 2015 00:39:53 +0000
+Date: Thu, 16 Oct 2014 02:15:23 +0000
Subject: [PATCH] hack TH
---
@@ -15,7 +15,7 @@ Subject: [PATCH] hack TH
8 files changed, 213 insertions(+), 288 deletions(-)
diff --git a/Yesod/Core.hs b/Yesod/Core.hs
-index f7436e6..2fa62cc 100644
+index 9b29317..7c0792d 100644
--- a/Yesod/Core.hs
+++ b/Yesod/Core.hs
@@ -31,16 +31,16 @@ module Yesod.Core
@@ -45,7 +45,7 @@ index f7436e6..2fa62cc 100644
-- * Sessions
, SessionBackend (..)
, customizeSessionCookies
-@@ -90,17 +90,15 @@ module Yesod.Core
+@@ -87,17 +87,15 @@ module Yesod.Core
, readIntegral
-- * Shakespeare
-- ** Hamlet
@@ -68,10 +68,10 @@ index f7436e6..2fa62cc 100644
, renderCssUrl
) where
diff --git a/Yesod/Core/Class/Yesod.hs b/Yesod/Core/Class/Yesod.hs
-index c2e707a..b594353 100644
+index 8631d27..c40eb10 100644
--- a/Yesod/Core/Class/Yesod.hs
+++ b/Yesod/Core/Class/Yesod.hs
-@@ -5,11 +5,15 @@
+@@ -5,18 +5,22 @@
{-# LANGUAGE CPP #-}
module Yesod.Core.Class.Yesod where
@@ -88,16 +88,15 @@ index c2e707a..b594353 100644
import Blaze.ByteString.Builder (Builder)
import Blaze.ByteString.Builder.Char.Utf8 (fromText)
-@@ -18,7 +22,7 @@ import Control.Exception (bracket)
+ import Control.Arrow ((***), second)
import Control.Monad (forM, when, void)
import Control.Monad.IO.Class (MonadIO (liftIO))
- import Control.Monad.Logger (LogLevel (LevelInfo, LevelOther),
-- LogSource)
-+ LogSource, Loc)
- import Control.Monad.Trans.Resource (InternalState, createInternalState, closeInternalState)
+-import Control.Monad.Logger (LogLevel (LevelInfo, LevelOther),
++import Control.Monad.Logger (Loc, LogLevel (LevelInfo, LevelOther),
+ LogSource)
import qualified Data.ByteString.Char8 as S8
import qualified Data.ByteString.Lazy as L
-@@ -35,7 +39,6 @@ import qualified Data.Text.Encoding.Error as TEE
+@@ -33,7 +37,6 @@ import qualified Data.Text.Encoding.Error as TEE
import Data.Text.Lazy.Builder (toLazyText)
import Data.Text.Lazy.Encoding (encodeUtf8)
import Data.Word (Word64)
@@ -105,7 +104,7 @@ index c2e707a..b594353 100644
import Network.HTTP.Types (encodePath)
import qualified Network.Wai as W
import Data.Default (def)
-@@ -87,18 +90,26 @@ class RenderRoute site => Yesod site where
+@@ -94,18 +97,26 @@ class RenderRoute site => Yesod site where
defaultLayout w = do
p <- widgetToPageContent w
mmsg <- getMessage
@@ -144,7 +143,7 @@ index c2e707a..b594353 100644
-- | Override the rendering function for a particular URL. One use case for
-- this is to offload static hosting to a different domain name to avoid
-@@ -410,45 +421,103 @@ widgetToPageContent w = do
+@@ -374,45 +385,103 @@ widgetToPageContent w = do
-- modernizr should be at the end of the <head> http://www.modernizr.com/docs/#installing
-- the asynchronous loader means your page doesn't have to wait for all the js to load
let (mcomplete, asyncScripts) = asyncHelper render scripts jscript jsLoc
@@ -287,7 +286,7 @@ index c2e707a..b594353 100644
return $ PageContent title headAll $
case jsLoader master of
-@@ -478,10 +547,13 @@ defaultErrorHandler NotFound = selectRep $ do
+@@ -442,10 +511,13 @@ defaultErrorHandler NotFound = selectRep $ do
r <- waiRequest
let path' = TE.decodeUtf8With TEE.lenientDecode $ W.rawPathInfo r
setTitle "Not Found"
@@ -305,7 +304,7 @@ index c2e707a..b594353 100644
provideRep $ return $ object ["message" .= ("Not Found" :: Text)]
-- For API requests.
-@@ -491,10 +563,11 @@ defaultErrorHandler NotFound = selectRep $ do
+@@ -455,10 +527,11 @@ defaultErrorHandler NotFound = selectRep $ do
defaultErrorHandler NotAuthenticated = selectRep $ do
provideRep $ defaultLayout $ do
setTitle "Not logged in"
@@ -321,7 +320,7 @@ index c2e707a..b594353 100644
provideRep $ do
-- 401 *MUST* include a WWW-Authenticate header
-@@ -516,10 +589,13 @@ defaultErrorHandler NotAuthenticated = selectRep $ do
+@@ -480,10 +553,13 @@ defaultErrorHandler NotAuthenticated = selectRep $ do
defaultErrorHandler (PermissionDenied msg) = selectRep $ do
provideRep $ defaultLayout $ do
setTitle "Permission Denied"
@@ -339,7 +338,7 @@ index c2e707a..b594353 100644
provideRep $
return $ object $ [
"message" .= ("Permission Denied. " <> msg)
-@@ -528,30 +604,42 @@ defaultErrorHandler (PermissionDenied msg) = selectRep $ do
+@@ -492,30 +568,42 @@ defaultErrorHandler (PermissionDenied msg) = selectRep $ do
defaultErrorHandler (InvalidArgs ia) = selectRep $ do
provideRep $ defaultLayout $ do
setTitle "Invalid Arguments"
@@ -397,7 +396,7 @@ index c2e707a..b594353 100644
provideRep $ return $ object ["message" .= ("Bad method" :: Text), "method" .= TE.decodeUtf8With TEE.lenientDecode m]
asyncHelper :: (url -> [x] -> Text)
-@@ -718,8 +806,4 @@ loadClientSession key getCachedDate sessionName req = load
+@@ -682,8 +770,4 @@ loadClientSession key getCachedDate sessionName req = load
-- turn the TH Loc loaction information into a human readable string
-- leaving out the loc_end parameter
fileLocationToString :: Loc -> String
@@ -408,7 +407,7 @@ index c2e707a..b594353 100644
- char = show . snd . loc_start
+fileLocationToString loc = "unknown"
diff --git a/Yesod/Core/Dispatch.hs b/Yesod/Core/Dispatch.hs
-index 7e43f74..625a901 100644
+index e0d1f0e..cc23fdd 100644
--- a/Yesod/Core/Dispatch.hs
+++ b/Yesod/Core/Dispatch.hs
@@ -1,4 +1,3 @@
@@ -445,9 +444,9 @@ index 7e43f74..625a901 100644
, PathMultiPiece (..)
, Texts
-- * Convert to WAI
-@@ -141,13 +140,6 @@ toWaiAppLogger logger site = do
+@@ -135,13 +134,6 @@ toWaiAppLogger logger site = do
+ , yreSite = site
, yreSessionBackend = sb
- , yreGen = gen
}
- messageLoggerSource
- site
@@ -459,10 +458,10 @@ index 7e43f74..625a901 100644
middleware <- mkDefaultMiddlewares logger
return $ middleware $ toWaiAppYre yre
-@@ -167,14 +159,7 @@ warp port site = do
- Network.Wai.Handler.Warp.setPort port $
- Network.Wai.Handler.Warp.setServerName serverValue $
- Network.Wai.Handler.Warp.setOnException (\_ e ->
+@@ -170,14 +162,7 @@ warp port site = do
+ ]
+ -}
+ , Network.Wai.Handler.Warp.settingsOnException = const $ \e ->
- when (shouldLog' e) $
- messageLoggerSource
- site
@@ -470,12 +469,12 @@ index 7e43f74..625a901 100644
- $(qLocation >>= liftLoc)
- "yesod-core"
- LevelError
-- (toLogStr $ "Exception from Warp: " ++ show e)) $
-+ when (shouldLog' e) $ error (show e)) $
- Network.Wai.Handler.Warp.defaultSettings)
+- (toLogStr $ "Exception from Warp: " ++ show e)
++ when (shouldLog' e) $ error (show e)
+ }
where
- shouldLog' = Network.Wai.Handler.Warp.defaultShouldDisplayException
-@@ -208,7 +193,6 @@ defaultMiddlewaresNoLogging = acceptOverride . autohead . gzip def . methodOverr
+ shouldLog' =
+@@ -211,7 +196,6 @@ defaultMiddlewaresNoLogging = acceptOverride . autohead . gzip def . methodOverr
-- | Deprecated synonym for 'warp'.
warpDebug :: YesodDispatch site => Int -> site -> IO ()
warpDebug = warp
@@ -484,10 +483,10 @@ index 7e43f74..625a901 100644
-- | Runs your application using default middlewares (i.e., via 'toWaiApp'). It
-- reads port information from the PORT environment variable, as used by tools
diff --git a/Yesod/Core/Handler.hs b/Yesod/Core/Handler.hs
-index 19f4152..c97fb24 100644
+index d2b196b..13cac17 100644
--- a/Yesod/Core/Handler.hs
+++ b/Yesod/Core/Handler.hs
-@@ -178,7 +178,7 @@ import Data.Text.Encoding (decodeUtf8With, encodeUtf8)
+@@ -174,7 +174,7 @@ import Data.Text.Encoding (decodeUtf8With, encodeUtf8)
import Data.Text.Encoding.Error (lenientDecode)
import qualified Data.Text.Lazy as TL
import qualified Text.Blaze.Html.Renderer.Text as RenderText
@@ -496,7 +495,7 @@ index 19f4152..c97fb24 100644
import qualified Data.ByteString as S
import qualified Data.ByteString.Lazy as L
-@@ -206,6 +206,7 @@ import Control.Exception (throwIO)
+@@ -203,6 +203,7 @@ import Control.Exception (throwIO)
import Blaze.ByteString.Builder (Builder)
import Safe (headMay)
import Data.CaseInsensitive (CI)
@@ -504,7 +503,7 @@ index 19f4152..c97fb24 100644
import qualified Data.Conduit.List as CL
import Control.Monad (unless)
import Control.Monad.Trans.Resource (MonadResource, InternalState, runResourceT, withInternalState, getInternalState, liftResourceT, resourceForkIO
-@@ -848,19 +849,15 @@ redirectToPost :: (MonadHandler m, RedirectUrl (HandlerSite m) url)
+@@ -855,19 +856,15 @@ redirectToPost :: (MonadHandler m, RedirectUrl (HandlerSite m) url)
-> m a
redirectToPost url = do
urlText <- toTextUrl url
@@ -534,7 +533,7 @@ index 19f4152..c97fb24 100644
-- | Wraps the 'Content' generated by 'hamletToContent' in a 'RepHtml'.
hamletToRepHtml :: MonadHandler m => HtmlUrl (Route (HandlerSite m)) -> m Html
diff --git a/Yesod/Core/Internal/Run.hs b/Yesod/Core/Internal/Run.hs
-index 651c11c..46e1d2a 100644
+index 311f208..63f666f 100644
--- a/Yesod/Core/Internal/Run.hs
+++ b/Yesod/Core/Internal/Run.hs
@@ -16,7 +16,7 @@ import Control.Exception.Lifted (catch)
@@ -544,18 +543,18 @@ index 651c11c..46e1d2a 100644
-import Control.Monad.Logger (LogLevel (LevelError), LogSource,
+import Control.Monad.Logger (Loc, LogLevel (LevelError), LogSource,
liftLoc)
- import Control.Monad.Trans.Resource (runResourceT, withInternalState, runInternalState)
+ import Control.Monad.Trans.Resource (runResourceT, withInternalState, runInternalState, createInternalState, closeInternalState)
import qualified Data.ByteString as S
-@@ -32,7 +32,7 @@ import Data.Text.Encoding (encodeUtf8)
+@@ -31,7 +31,7 @@ import qualified Data.Text as T
+ import Data.Text.Encoding (encodeUtf8)
import Data.Text.Encoding (decodeUtf8With)
import Data.Text.Encoding.Error (lenientDecode)
- import Data.Time (getCurrentTime, addUTCTime)
-import Language.Haskell.TH.Syntax (Loc, qLocation)
+import Language.Haskell.TH.Syntax (qLocation)
import qualified Network.HTTP.Types as H
import Network.Wai
- import Network.Wai.Internal
-@@ -160,8 +160,6 @@ safeEh :: (Loc -> LogSource -> LogLevel -> LogStr -> IO ())
+ #if MIN_VERSION_wai(2, 0, 0)
+@@ -158,8 +158,6 @@ safeEh :: (Loc -> LogSource -> LogLevel -> LogStr -> IO ())
-> ErrorResponse
-> YesodApp
safeEh log' er req = do
@@ -684,26 +683,26 @@ index 7e84c1c..a273c29 100644
- ]
- return $ LetE [fun] (VarE helper)
diff --git a/Yesod/Core/Types.hs b/Yesod/Core/Types.hs
-index 5fa5c3d..1646d54 100644
+index 388dfe3..b3fce0f 100644
--- a/Yesod/Core/Types.hs
+++ b/Yesod/Core/Types.hs
-@@ -19,6 +19,7 @@ import Control.Monad.Base (MonadBase (liftBase))
- import Control.Monad.Catch (MonadCatch (..))
+@@ -21,6 +21,7 @@ import Control.Monad.Catch (MonadCatch (..))
import Control.Monad.Catch (MonadMask (..))
+ #endif
import Control.Monad.IO.Class (MonadIO (liftIO))
+import qualified Control.Monad.Logger
import Control.Monad.Logger (LogLevel, LogSource,
MonadLogger (..))
import Control.Monad.Trans.Control (MonadBaseControl (..))
-@@ -179,7 +180,7 @@ data RunHandlerEnv site = RunHandlerEnv
+@@ -191,7 +192,7 @@ data RunHandlerEnv site = RunHandlerEnv
, rheRoute :: !(Maybe (Route site))
, rheSite :: !site
, rheUpload :: !(RequestBodyLength -> FileUpload)
- , rheLog :: !(Loc -> LogSource -> LogLevel -> LogStr -> IO ())
+ , rheLog :: !(Control.Monad.Logger.Loc -> LogSource -> LogLevel -> LogStr -> IO ())
, rheOnError :: !(ErrorResponse -> YesodApp)
- , rheGetMaxExpires :: IO Text
-- ^ How to respond when an error is thrown internally.
+ --
diff --git a/Yesod/Core/Widget.hs b/Yesod/Core/Widget.hs
index 481199e..8489fbe 100644
--- a/Yesod/Core/Widget.hs
@@ -765,5 +764,5 @@ index 481199e..8489fbe 100644
ihamletToRepHtml :: (MonadHandler m, RenderMessage (HandlerSite m) message)
=> HtmlUrlI18n message (Route (HandlerSite m))
--
-2.1.4
+2.1.1
diff --git a/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch b/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch
index b9a84b1..84314a8 100644
--- a/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch
+++ b/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch
@@ -1,27 +1,22 @@
-From 4cf9a045569ea0b51b4ee11df2dadbde330f7813 Mon Sep 17 00:00:00 2001
+From 1b24ece1a40c9365f719472ca6e342c8c4065c25 Mon Sep 17 00:00:00 2001
From: dummy <dummy@example.com>
-Date: Fri, 3 Jul 2015 01:06:34 +0000
+Date: Thu, 16 Oct 2014 02:31:20 +0000
Subject: [PATCH] hack TH
-1. EvilSplicer
-2. Add imports
-3. Fix some syntax errors in spliced code
-4. Remove some persistent stuff that doesn't build.
---
- Yesod/Form/Bootstrap3.hs | 189 +++++++++--
- Yesod/Form/Fields.hs | 811 ++++++++++++++++++++++++++++++++++++-----------
- Yesod/Form/Functions.hs | 255 ++++++++++++---
- Yesod/Form/Jquery.hs | 124 ++++++--
+ Yesod/Form/Bootstrap3.hs | 186 +++++++++--
+ Yesod/Form/Fields.hs | 816 +++++++++++++++++++++++++++++++++++------------
+ Yesod/Form/Functions.hs | 257 ++++++++++++---
+ Yesod/Form/Jquery.hs | 134 ++++++--
Yesod/Form/MassInput.hs | 226 ++++++++++---
- Yesod/Form/Nic.hs | 60 +++-
- yesod-form.cabal | 2 +-
- 7 files changed, 1311 insertions(+), 356 deletions(-)
+ Yesod/Form/Nic.hs | 67 +++-
+ 6 files changed, 1322 insertions(+), 364 deletions(-)
diff --git a/Yesod/Form/Bootstrap3.hs b/Yesod/Form/Bootstrap3.hs
-index 8377a68..fa8b7d4 100644
+index 84e85fc..1954fb4 100644
--- a/Yesod/Form/Bootstrap3.hs
+++ b/Yesod/Form/Bootstrap3.hs
-@@ -35,6 +35,9 @@ import Data.String (IsString(..))
+@@ -26,6 +26,9 @@ import Data.String (IsString(..))
import Yesod.Core
import qualified Data.Text as T
@@ -31,7 +26,7 @@ index 8377a68..fa8b7d4 100644
import Yesod.Form.Types
import Yesod.Form.Functions
-@@ -155,44 +158,144 @@ renderBootstrap3 formLayout aform fragment = do
+@@ -152,44 +155,144 @@ renderBootstrap3 formLayout aform fragment = do
let views = views' []
has (Just _) = True
has Nothing = False
@@ -64,22 +59,22 @@ index 8377a68..fa8b7d4 100644
- |]
+ widget = do { (asWidgetT . toWidget) (toHtml fragment);
+ Data.Foldable.mapM_
-+ (\ view_a2d4p
++ (\ view_as0a
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "<div class=\"form-group ");
+ Text.Hamlet.condH
-+ [(fvRequired view_a2d4p,
++ [(fvRequired view_as0a,
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_a2d4p),
++ [(not (fvRequired view_as0a),
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "optional "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(has (fvErrors view_a2d4p),
++ [(has (fvErrors view_as0a),
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "has-error"))]
+ Nothing;
@@ -88,66 +83,66 @@ index 8377a68..fa8b7d4 100644
+ case formLayout of {
+ ; BootstrapBasicForm
+ -> do { Text.Hamlet.condH
-+ [((/=) (fvId view_a2d4p) bootstrapSubmitId,
++ [((/=) (fvId view_as0a) bootstrapSubmitId,
+ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "<label for=\"");
-+ (asWidgetT . toWidget) (toHtml (fvId view_a2d4p));
++ (asWidgetT . toWidget) (toHtml (fvId view_as0a));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
-+ (asWidgetT . toWidget) (toHtml (fvLabel view_a2d4p));
++ (asWidgetT . toWidget) (toHtml (fvLabel view_as0a));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "</label>") })]
+ Nothing;
-+ (asWidgetT . toWidget) (fvInput view_a2d4p);
-+ (asWidgetT . toWidget) (helpWidget view_a2d4p) }
++ (asWidgetT . toWidget) (fvInput view_as0a);
++ (asWidgetT . toWidget) (helpWidget view_as0a) }
+ ; BootstrapInlineForm
+ -> do { Text.Hamlet.condH
-+ [((/=) (fvId view_a2d4p) bootstrapSubmitId,
++ [((/=) (fvId view_as0a) bootstrapSubmitId,
+ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "<label class=\"sr-only\" for=\"");
-+ (asWidgetT . toWidget) (toHtml (fvId view_a2d4p));
++ (asWidgetT . toWidget) (toHtml (fvId view_as0a));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
-+ (asWidgetT . toWidget) (toHtml (fvLabel view_a2d4p));
++ (asWidgetT . toWidget) (toHtml (fvLabel view_as0a));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "</label>") })]
+ Nothing;
-+ (asWidgetT . toWidget) (fvInput view_a2d4p);
-+ (asWidgetT . toWidget) (helpWidget view_a2d4p) }
-+ ; BootstrapHorizontalForm labelOffset_a2d4q
-+ labelSize_a2d4r
-+ inputOffset_a2d4s
-+ inputSize_a2d4t
++ (asWidgetT . toWidget) (fvInput view_as0a);
++ (asWidgetT . toWidget) (helpWidget view_as0a) }
++ ; BootstrapHorizontalForm labelOffset_as0b
++ labelSize_as0c
++ inputOffset_as0d
++ inputSize_as0e
+ -> Text.Hamlet.condH
-+ [((/=) (fvId view_a2d4p) bootstrapSubmitId,
++ [((/=) (fvId view_as0a) bootstrapSubmitId,
+ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "<label class=\"control-label ");
-+ (asWidgetT . toWidget) (toHtml (toOffset labelOffset_a2d4q));
++ (asWidgetT . toWidget) (toHtml (toOffset labelOffset_as0b));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) " ");
-+ (asWidgetT . toWidget) (toHtml (toColumn labelSize_a2d4r));
++ (asWidgetT . toWidget) (toHtml (toColumn labelSize_as0c));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "\" for=\"");
-+ (asWidgetT . toWidget) (toHtml (fvId view_a2d4p));
++ (asWidgetT . toWidget) (toHtml (fvId view_as0a));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
-+ (asWidgetT . toWidget) (toHtml (fvLabel view_a2d4p));
++ (asWidgetT . toWidget) (toHtml (fvLabel view_as0a));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "</label><div class=\"");
-+ (asWidgetT . toWidget) (toHtml (toOffset inputOffset_a2d4s));
++ (asWidgetT . toWidget) (toHtml (toOffset inputOffset_as0d));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) " ");
-+ (asWidgetT . toWidget) (toHtml (toColumn inputSize_a2d4t));
++ (asWidgetT . toWidget) (toHtml (toColumn inputSize_as0e));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
-+ (asWidgetT . toWidget) (fvInput view_a2d4p);
-+ (asWidgetT . toWidget) (helpWidget view_a2d4p);
++ (asWidgetT . toWidget) (fvInput view_as0a);
++ (asWidgetT . toWidget) (helpWidget view_as0a);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "</div>") })]
+ (Just
@@ -158,15 +153,15 @@ index 8377a68..fa8b7d4 100644
+ (toHtml
+ (toOffset
+ (addGO
-+ inputOffset_a2d4s
-+ (addGO labelOffset_a2d4q labelSize_a2d4r))));
++ inputOffset_as0d
++ (addGO labelOffset_as0b labelSize_as0c))));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) " ");
-+ (asWidgetT . toWidget) (toHtml (toColumn inputSize_a2d4t));
++ (asWidgetT . toWidget) (toHtml (toColumn inputSize_as0e));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
-+ (asWidgetT . toWidget) (fvInput view_a2d4p);
-+ (asWidgetT . toWidget) (helpWidget view_a2d4p);
++ (asWidgetT . toWidget) (fvInput view_as0a);
++ (asWidgetT . toWidget) (helpWidget view_as0a);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "</div>") })) };
@@ -187,21 +182,21 @@ index 8377a68..fa8b7d4 100644
-|]
+helpWidget view = do { Text.Hamlet.maybeH
+ (fvTooltip view)
-+ (\ tt_a2d5x
++ (\ tt_as0k
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "<span class=\"help-block\">");
-+ (asWidgetT . toWidget) (toHtml tt_a2d5x);
++ (asWidgetT . toWidget) (toHtml tt_as0k);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "</span>") })
+ Nothing;
+ Text.Hamlet.maybeH
+ (fvErrors view)
-+ (\ err_a2d5y
++ (\ err_as0l
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack)
+ "<span class=\"help-block\">");
-+ (asWidgetT . toWidget) (toHtml err_a2d5y);
++ (asWidgetT . toWidget) (toHtml err_as0l);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "</span>") })
+ Nothing }
@@ -209,7 +204,7 @@ index 8377a68..fa8b7d4 100644
-- | How the 'bootstrapSubmit' button should be rendered.
-@@ -247,7 +350,23 @@ mbootstrapSubmit
+@@ -244,7 +347,22 @@ mbootstrapSubmit
=> BootstrapSubmit msg -> MForm m (FormResult (), FieldView site)
mbootstrapSubmit (BootstrapSubmit msg classes attrs) =
let res = FormSuccess ()
@@ -226,26 +221,40 @@ index 8377a68..fa8b7d4 100644
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) ">");
+ ((liftM (toHtml .) getMessageRender)
-+ >>=
-+ (\ urender_a2d6f -> (asWidgetT . toWidget) (urender_a2d6f msg)));
++ >>= (\ urender_as0w -> (asWidgetT . toWidget) (urender_as0w msg)));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . T.pack) "</button>") }
+
fv = FieldView { fvLabel = ""
, fvTooltip = Nothing
, fvId = bootstrapSubmitId
-@@ -314,4 +433,4 @@ bootstrapSubmitId = "b:ootstrap___unique__:::::::::::::::::submit-id"
- -- > <$> areq textField nameSettings Nothing
- -- > where nameSettings = withAutofocus $
- -- > withPlaceholder "First name" $
---- > (bfs ("Name" :: Text))
-\ No newline at end of file
-+-- > (bfs ("Name" :: Text))
diff --git a/Yesod/Form/Fields.hs b/Yesod/Form/Fields.hs
-index 5fe123e..42fd7d6 100644
+index c6091a9..9e6bd4e 100644
--- a/Yesod/Form/Fields.hs
+++ b/Yesod/Form/Fields.hs
-@@ -52,8 +52,6 @@ module Yesod.Form.Fields
+@@ -1,4 +1,3 @@
+-{-# LANGUAGE QuasiQuotes #-}
+ {-# LANGUAGE TypeFamilies #-}
+ {-# LANGUAGE OverloadedStrings #-}
+ {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+@@ -18,9 +17,6 @@ module Yesod.Form.Fields
+ , timeField
+ , htmlField
+ , emailField
+- , multiEmailField
+- , searchField
+- , AutoFocus
+ , urlField
+ , doubleField
+ , parseDate
+@@ -37,15 +33,11 @@ module Yesod.Form.Fields
+ , selectFieldList
+ , radioField
+ , radioFieldList
+- , checkboxesFieldList
+- , checkboxesField
+ , multiSelectField
+ , multiSelectFieldList
, Option (..)
, OptionList (..)
, mkOptionList
@@ -254,7 +263,7 @@ index 5fe123e..42fd7d6 100644
, optionsPairs
, optionsEnum
) where
-@@ -80,6 +78,15 @@ import Control.Monad (when, unless)
+@@ -72,6 +64,15 @@ import Control.Monad (when, unless)
import Data.Either (partitionEithers)
import Data.Maybe (listToMaybe, fromMaybe)
@@ -270,7 +279,14 @@ index 5fe123e..42fd7d6 100644
import qualified Blaze.ByteString.Builder.Html.Utf8 as B
import Blaze.ByteString.Builder (writeByteString, toLazyByteString)
import Blaze.ByteString.Builder.Internal.Write (fromWriteList)
-@@ -102,8 +109,6 @@ import Control.Applicative ((<$>), (<|>))
+@@ -91,15 +92,12 @@ import qualified Data.Text as T (drop, dropWhile)
+ import qualified Data.Text.Read
+
+ import qualified Data.Map as Map
+-import Yesod.Persist (selectList, runDB, Filter, SelectOpt, Key, YesodPersist, PersistEntity, PersistQuery)
+ import Control.Arrow ((&&&))
+
+ import Control.Applicative ((<$>), (<|>))
import Data.Attoparsec.Text (Parser, char, string, digit, skipSpace, endOfInput, parseOnly)
@@ -279,7 +295,7 @@ index 5fe123e..42fd7d6 100644
defaultFormMessage :: FormMessage -> Text
defaultFormMessage = englishFormMessage
-@@ -115,10 +120,25 @@ intField = Field
+@@ -111,10 +109,25 @@ intField = Field
Right (a, "") -> Right a
_ -> Left $ MsgInvalidInteger s
@@ -287,7 +303,7 @@ index 5fe123e..42fd7d6 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="number" step=1 :isReq:required="" value="#{showVal val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_a2nCq
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJJh
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
@@ -309,7 +325,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
where
-@@ -133,10 +153,25 @@ doubleField = Field
+@@ -128,10 +141,25 @@ doubleField = Field
Right (a, "") -> Right a
_ -> Left $ MsgInvalidNumber s
@@ -317,7 +333,7 @@ index 5fe123e..42fd7d6 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="number" step=any :isReq:required="" value="#{showVal val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_a2nCV
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJJu
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
@@ -339,7 +355,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
where showVal = either id (pack . show)
-@@ -147,10 +182,24 @@ $newline never
+@@ -139,10 +167,24 @@ $newline never
dayField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Day
dayField = Field
{ fieldParse = parseHelper $ parseDate . unpack
@@ -347,7 +363,7 @@ index 5fe123e..42fd7d6 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="date" :isReq:required="" value="#{showVal val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_a2nDh
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJJF
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
@@ -368,22 +384,20 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
where showVal = either id (pack . show)
-@@ -179,10 +228,25 @@ timeFieldTypeText = timeFieldOfType "text"
- timeFieldOfType :: Monad m => RenderMessage (HandlerSite m) FormMessage => Text -> Field m TimeOfDay
- timeFieldOfType inputType = Field
+@@ -150,10 +192,23 @@ $newline never
+ timeField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m TimeOfDay
+ timeField = Field
{ fieldParse = parseHelper parseTime
- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|
-$newline never
--<input id="#{theId}" name="#{name}" *{attrs} type="#{inputType}" :isReq:required="" value="#{showVal val}">
+-<input id="#{theId}" name="#{name}" *{attrs} :isReq:required="" value="#{showVal val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_a2nDN
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJJT
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"");
-+ id (toHtml inputType);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
+ condH
+ [(isReq,
@@ -398,7 +412,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
where
-@@ -196,10 +260,23 @@ $newline never
+@@ -166,10 +221,23 @@ $newline never
htmlField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Html
htmlField = Field
{ fieldParse = parseHelper $ Right . preEscapedText . sanitizeBalance
@@ -406,7 +420,7 @@ index 5fe123e..42fd7d6 100644
-$newline never
-<textarea :isReq:required="" id="#{theId}" name="#{name}" *{attrs}>#{showVal val}
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_a2nEc
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJK4
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<textarea");
+ condH
@@ -426,25 +440,21 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
where showVal = either id (pack . renderHtml)
-@@ -231,10 +308,22 @@ instance ToHtml Textarea where
+@@ -197,10 +265,18 @@ instance ToHtml Textarea where
textareaField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Textarea
textareaField = Field
{ fieldParse = parseHelper $ Right . Textarea
-- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|
+- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|
-$newline never
--<textarea id="#{theId}" name="#{name}" :isReq:required="" *{attrs}>#{either id unTextarea val}
+-<textarea id="#{theId}" name="#{name}" *{attrs}>#{either id unTextarea val}
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_a2nEL
++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_aJKe
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<textarea id=\"");
+ id (toHtml theId);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ condH
-+ [(isReq,
-+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
-+ Nothing;
+ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ id (toHtml (either id unTextarea val));
@@ -453,7 +463,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
-@@ -243,10 +332,19 @@ hiddenField :: (Monad m, PathPiece p, RenderMessage (HandlerSite m) FormMessage)
+@@ -208,10 +284,19 @@ hiddenField :: (Monad m, PathPiece p, RenderMessage (HandlerSite m) FormMessage)
=> Field m p
hiddenField = Field
{ fieldParse = parseHelper $ maybe (Left MsgValueRequired) Right . fromPathPiece
@@ -461,7 +471,7 @@ index 5fe123e..42fd7d6 100644
-$newline never
-<input type="hidden" id="#{theId}" name="#{name}" *{attrs} value="#{either id toPathPiece val}">
-|]
-+ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_a2nFl
++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_aJKo
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<input type=\"hidden\" id=\"");
@@ -477,7 +487,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
-@@ -255,20 +353,53 @@ textField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Tex
+@@ -219,20 +304,53 @@ textField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Tex
textField = Field
{ fieldParse = parseHelper $ Right
, fieldView = \theId name attrs val isReq ->
@@ -509,7 +519,7 @@ index 5fe123e..42fd7d6 100644
+
, fieldEnctype = UrlEncoded
}
- -- | Creates an input with @type="password"@.
+
passwordField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Text
passwordField = Field
{ fieldParse = parseHelper $ Right
@@ -517,7 +527,7 @@ index 5fe123e..42fd7d6 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="password" :isReq:required="" value="#{either id id val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_a2nG7
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJKH
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
@@ -539,7 +549,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
-@@ -342,10 +473,24 @@ emailField = Field
+@@ -304,10 +422,24 @@ emailField = Field
case Email.canonicalizeEmail $ encodeUtf8 s of
Just e -> Right $ decodeUtf8With lenientDecode e
Nothing -> Left $ MsgInvalidEmail s
@@ -547,7 +557,7 @@ index 5fe123e..42fd7d6 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="email" :isReq:required="" value="#{either id id val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_a2nKu
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJLq
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
@@ -568,7 +578,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
-@@ -360,10 +505,25 @@ multiEmailField = Field
+@@ -322,10 +454,25 @@ multiEmailField = Field
in case partitionEithers addrs of
([], good) -> Right good
(bad, _) -> Left $ MsgInvalidEmail $ cat bad
@@ -576,7 +586,7 @@ index 5fe123e..42fd7d6 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="email" multiple :isReq:required="" value="#{either id cat val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_a2nL5
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJMd
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
@@ -598,7 +608,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
where
-@@ -380,20 +540,74 @@ searchField :: Monad m => RenderMessage (HandlerSite m) FormMessage => AutoFocus
+@@ -341,20 +488,75 @@ searchField :: Monad m => RenderMessage (HandlerSite m) FormMessage => AutoFocus
searchField autoFocus = Field
{ fieldParse = parseHelper Right
, fieldView = \theId name attrs val isReq -> do
@@ -651,31 +661,32 @@ index 5fe123e..42fd7d6 100644
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "').focus();}</script>") }
+
-+ toWidget $ \ _render_a2nMA
-+ -> (Text.Css.CssNoWhitespace . (foldr ($) []))
++ toWidget $ \ _render_aJMx
++ -> (Text.Css.CssNoWhitespace
++ . (foldr ($) []))
+ [((++)
+ $ (map
+ Text.Css.TopBlock
+ (((Text.Css.Block
+ {Text.Css.blockSelector = Data.Monoid.mconcat
-+ [(Text.Css.fromText
-+ . Text.Css.pack)
-+ "#",
-+ toCss theId],
++ [(Text.Css.fromText
++ . Text.Css.pack)
++ "#",
++ toCss theId],
+ Text.Css.blockAttrs = (Prelude.concat
-+ $ ([Text.Css.Attr
-+ (Data.Monoid.mconcat
-+ [(Text.Css.fromText
-+ . Text.Css.pack)
-+ "-webkit-appearance"])
-+ (Data.Monoid.mconcat
-+ [(Text.Css.fromText
-+ . Text.Css.pack)
-+ "textfield"])]
-+ :
-+ (map
-+ Text.Css.mixinAttrs
-+ []))),
++ $ ([Text.Css.Attr
++ (Data.Monoid.mconcat
++ [(Text.Css.fromText
++ . Text.Css.pack)
++ "-webkit-appearance"])
++ (Data.Monoid.mconcat
++ [(Text.Css.fromText
++ . Text.Css.pack)
++ "textfield"])]
++ :
++ (map
++ Text.Css.mixinAttrs
++ []))),
+ Text.Css.blockBlocks = (),
+ Text.Css.blockMixins = ()} :)
+ . ((foldr (.) id [])
@@ -684,8 +695,8 @@ index 5fe123e..42fd7d6 100644
+
, fieldEnctype = UrlEncoded
}
- -- | Creates an input with @type="url"@, validating the URL according to RFC3986.
-@@ -404,7 +618,28 @@ urlField = Field
+
+@@ -365,7 +567,28 @@ urlField = Field
Nothing -> Left $ MsgInvalidUrl s
Just _ -> Right s
, fieldView = \theId name attrs val isReq ->
@@ -715,7 +726,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
-@@ -423,18 +658,54 @@ selectField :: (Eq a, RenderMessage site FormMessage)
+@@ -378,18 +601,54 @@ selectField :: (Eq a, RenderMessage site FormMessage)
=> HandlerT site IO (OptionList a)
-> Field (HandlerT site IO) a
selectField = selectFieldHelper
@@ -758,8 +769,8 @@ index 5fe123e..42fd7d6 100644
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_a2nOk
-+ -> (asWidgetT . toWidget) (urender_a2nOk MsgSelectNone)));
++ (\ urender_aJMX
++ -> (asWidgetT . toWidget) (urender_aJMX MsgSelectNone)));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })
+ -- onOpt
@@ -780,9 +791,9 @@ index 5fe123e..42fd7d6 100644
+ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })
+ -- inside
- -- | Creates a @\<select>@ tag for selecting multiple options.
multiSelectFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg)
-@@ -459,11 +730,45 @@ multiSelectField ioptlist =
+ => [(msg, a)]
+@@ -412,11 +671,45 @@ multiSelectField ioptlist =
view theId name attrs val isReq = do
opts <- fmap olOptions $ handlerToWidget ioptlist
let selOpts = map (id &&& (optselected val)) opts
@@ -810,20 +821,20 @@ index 5fe123e..42fd7d6 100644
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ Data.Foldable.mapM_
-+ (\ (opt_a2nPy, optsel_a2nPz)
++ (\ (opt_aJNs, optsel_aJNt)
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<option value=\"");
-+ (asWidgetT . toWidget) (toHtml (optionExternalValue opt_a2nPy));
++ (asWidgetT . toWidget) (toHtml (optionExternalValue opt_aJNs));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
+ condH
-+ [(optsel_a2nPz,
++ [(optsel_aJNt,
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]
+ Nothing;
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
-+ (asWidgetT . toWidget) (toHtml (optionDisplay opt_a2nPy));
++ (asWidgetT . toWidget) (toHtml (optionDisplay opt_aJNs));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })
+ selOpts;
@@ -833,7 +844,7 @@ index 5fe123e..42fd7d6 100644
where
optselected (Left _) _ = False
optselected (Right vals) opt = (optionInternalValue opt) `elem` vals
-@@ -489,37 +794,115 @@ checkboxesField ioptlist = (multiSelectField ioptlist)
+@@ -439,54 +732,196 @@ checkboxesField ioptlist = (multiSelectField ioptlist)
opts <- fmap olOptions $ handlerToWidget ioptlist
let optselected (Left _) _ = False
optselected (Right vals) opt = (optionInternalValue opt) `elem` vals
@@ -850,25 +861,25 @@ index 5fe123e..42fd7d6 100644
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");
+ Data.Foldable.mapM_
-+ (\ opt_a2nQo
++ (\ opt_aJNI
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<label><input type=\"checkbox\" name=\"");
+ (asWidgetT . toWidget) (toHtml name);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");
-+ (asWidgetT . toWidget) (toHtml (optionExternalValue opt_a2nQo));
++ (asWidgetT . toWidget) (toHtml (optionExternalValue opt_aJNI));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
+ condH
-+ [(optselected val opt_a2nQo,
++ [(optselected val opt_aJNI,
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]
+ Nothing;
+ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
-+ (asWidgetT . toWidget) (toHtml (optionDisplay opt_a2nQo));
++ (asWidgetT . toWidget) (toHtml (optionDisplay opt_aJNI));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })
+ opts;
@@ -876,7 +887,7 @@ index 5fe123e..42fd7d6 100644
+ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") }
+
}
- -- | Creates an input with @type="radio"@ for selecting one option.
+
radioField :: (Eq a, RenderMessage site FormMessage)
=> HandlerT site IO (OptionList a)
-> Field (HandlerT site IO) a
@@ -931,8 +942,8 @@ index 5fe123e..42fd7d6 100644
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_a2nR7
-+ -> (asWidgetT . toWidget) (urender_a2nR7 MsgSelectNone)));
++ (\ urender_aJNY
++ -> (asWidgetT . toWidget) (urender_aJNY MsgSelectNone)));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") })
+
@@ -972,9 +983,6 @@ index 5fe123e..42fd7d6 100644
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") })
+
- -- | Creates a group of radio buttons to answer the question given in the message. Radio buttons are used to allow differentiating between an empty response (@Nothing@) and a no response (@Just False@). Consider using the simpler 'checkBoxField' if you don't need to make this distinction.
- --
-@@ -531,19 +914,83 @@ $newline never
boolField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Bool
boolField = Field
{ fieldParse = \e _ -> return $ boolParser e
@@ -984,9 +992,6 @@ index 5fe123e..42fd7d6 100644
- <input id=#{theId}-none *{attrs} type=radio name=#{name} value=none checked>
- <label for=#{theId}-none>_{MsgSelectNone}
-
--
--<input id=#{theId}-yes *{attrs} type=radio name=#{name} value=yes :showVal id val:checked>
--<label for=#{theId}-yes>_{MsgBoolYes}
+ , fieldView = \theId name attrs val isReq -> do { condH
+ [(not isReq,
+ do { (asWidgetT . toWidget)
@@ -1007,8 +1012,8 @@ index 5fe123e..42fd7d6 100644
+ ((Text.Blaze.Internal.preEscapedText . pack) "-none\">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_a2nSk
-+ -> (asWidgetT . toWidget) (urender_a2nSk MsgSelectNone)));
++ (\ urender_aJOn
++ -> (asWidgetT . toWidget) (urender_aJOn MsgSelectNone)));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })]
+ Nothing;
@@ -1034,8 +1039,8 @@ index 5fe123e..42fd7d6 100644
+ ((Text.Blaze.Internal.preEscapedText . pack) "-yes\">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_a2nSl
-+ -> (asWidgetT . toWidget) (urender_a2nSl MsgBoolYes)));
++ (\ urender_aJOo
++ -> (asWidgetT . toWidget) (urender_aJOo MsgBoolYes)));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "</label><input id=\"");
@@ -1059,18 +1064,21 @@ index 5fe123e..42fd7d6 100644
+ ((Text.Blaze.Internal.preEscapedText . pack) "-no\">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_a2nSm
-+ -> (asWidgetT . toWidget) (urender_a2nSm MsgBoolNo)));
++ (\ urender_aJOp
++ -> (asWidgetT . toWidget) (urender_aJOp MsgBoolNo)));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") }
+-<input id=#{theId}-yes *{attrs} type=radio name=#{name} value=yes :showVal id val:checked>
+-<label for=#{theId}-yes>_{MsgBoolYes}
+-
-<input id=#{theId}-no *{attrs} type=radio name=#{name} value=no :showVal not val:checked>
-<label for=#{theId}-no>_{MsgBoolNo}
-|]
, fieldEnctype = UrlEncoded
}
where
-@@ -570,10 +1017,24 @@ $newline never
+@@ -512,10 +947,24 @@ $newline never
checkBoxField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Bool
checkBoxField = Field
{ fieldParse = \e _ -> return $ checkBoxParser e
@@ -1099,31 +1107,25 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = UrlEncoded
}
-@@ -619,66 +1080,6 @@ optionsPairs opts = do
+@@ -559,69 +1008,6 @@ optionsPairs opts = do
optionsEnum :: (MonadHandler m, Show a, Enum a, Bounded a) => m (OptionList a)
optionsEnum = optionsPairs $ map (\x -> (pack $ show x, x)) [minBound..maxBound]
---- | Selects a list of 'Entity's with the given 'Filter' and 'SelectOpt's. The @(a -> msg)@ function is then used to derive the display value for an 'OptionList'. Example usage:
----
---- > Country
---- > name Text
---- > deriving Eq -- Must derive Eq
----
---- > data CountryForm = CountryForm
---- > { country :: Entity Country
---- > }
---- >
---- > countryNameForm :: AForm Handler CountryForm
---- > countryNameForm = CountryForm
---- > <$> areq (selectField countries) "Which country do you live in?" Nothing
---- > where
---- > countries = optionsPersist [] [Asc CountryName] countryName
+-#if MIN_VERSION_persistent(2, 0, 0)
-optionsPersist :: ( YesodPersist site, PersistEntity a
- , PersistQuery (PersistEntityBackend a)
- , PathPiece (Key a)
- , RenderMessage site msg
- , YesodPersistBackend site ~ PersistEntityBackend a
- )
+-#else
+-optionsPersist :: ( YesodPersist site, PersistEntity a
+- , PersistQuery (YesodPersistBackend site (HandlerT site IO))
+- , PathPiece (Key a)
+- , PersistEntityBackend a ~ PersistMonadBackend (YesodPersistBackend site (HandlerT site IO))
+- , RenderMessage site msg
+- )
+-#endif
- => [Filter a]
- -> [SelectOpt a]
- -> (a -> msg)
@@ -1137,10 +1139,11 @@ index 5fe123e..42fd7d6 100644
- , optionExternalValue = toPathPiece key
- }) pairs
-
---- | An alternative to 'optionsPersist' which returns just the 'Key' instead of
---- the entire 'Entity'.
+--- | An alternative to 'optionsPersist' which returns just the @Key@ instead of
+--- the entire @Entity@.
---
--- Since 1.3.2
+-#if MIN_VERSION_persistent(2, 0, 0)
-optionsPersistKey
- :: (YesodPersist site
- , PersistEntity a
@@ -1149,6 +1152,15 @@ index 5fe123e..42fd7d6 100644
- , RenderMessage site msg
- , YesodPersistBackend site ~ PersistEntityBackend a
- )
+-#else
+-optionsPersistKey
+- :: (YesodPersist site
+- , PersistEntity a
+- , PersistQuery (YesodPersistBackend site (HandlerT site IO))
+- , PathPiece (Key a)
+- , RenderMessage site msg
+- , PersistEntityBackend a ~ PersistMonadBackend (YesodDB site))
+-#endif
- => [Filter a]
- -> [SelectOpt a]
- -> (a -> msg)
@@ -1162,18 +1174,17 @@ index 5fe123e..42fd7d6 100644
- , optionInternalValue = key
- , optionExternalValue = toPathPiece key
- }) pairs
--
+
selectFieldHelper
:: (Eq a, RenderMessage site FormMessage)
- => (Text -> Text -> [(Text, Text)] -> WidgetT site IO () -> WidgetT site IO ())
-@@ -722,9 +1123,21 @@ fileField = Field
+@@ -665,9 +1051,21 @@ fileField = Field
case files of
[] -> Right Nothing
file:_ -> Right $ Just file
- , fieldView = \id' name attrs _ isReq -> toWidget [hamlet|
- <input id=#{id'} name=#{name} *{attrs} type=file :isReq:required>
- |]
-+ , fieldView = \id' name attrs _ isReq -> toWidget $ \ _render_a2nUV
++ , fieldView = \id' name attrs _ isReq -> toWidget $ \ _render_aJPt
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml id');
@@ -1191,7 +1202,7 @@ index 5fe123e..42fd7d6 100644
, fieldEnctype = Multipart
}
-@@ -751,10 +1164,19 @@ fileAFormReq fs = AForm $ \(site, langs) menvs ints -> do
+@@ -694,10 +1092,19 @@ fileAFormReq fs = AForm $ \(site, langs) menvs ints -> do
{ fvLabel = toHtml $ renderMessage site langs $ fsLabel fs
, fvTooltip = fmap (toHtml . renderMessage site langs) $ fsTooltip fs
, fvId = id'
@@ -1215,7 +1226,7 @@ index 5fe123e..42fd7d6 100644
, fvErrors = errs
, fvRequired = True
}
-@@ -783,10 +1205,19 @@ fileAFormOpt fs = AForm $ \(master, langs) menvs ints -> do
+@@ -726,10 +1133,19 @@ fileAFormOpt fs = AForm $ \(master, langs) menvs ints -> do
{ fvLabel = toHtml $ renderMessage master langs $ fsLabel fs
, fvTooltip = fmap (toHtml . renderMessage master langs) $ fsTooltip fs
, fvId = id'
@@ -1240,26 +1251,28 @@ index 5fe123e..42fd7d6 100644
, fvRequired = False
}
diff --git a/Yesod/Form/Functions.hs b/Yesod/Form/Functions.hs
-index 0d83b79..61e9b66 100644
+index 9e6abaf..0c2a0ce 100644
--- a/Yesod/Form/Functions.hs
+++ b/Yesod/Form/Functions.hs
-@@ -60,12 +60,14 @@ import Text.Blaze (Markup, toMarkup)
+@@ -60,12 +60,16 @@ import Text.Blaze (Markup, toMarkup)
#define toHtml toMarkup
import Yesod.Core
import Network.Wai (requestMethod)
-import Text.Hamlet (shamlet)
++--import Text.Hamlet (shamlet)
import Data.Monoid (mempty)
import Data.Maybe (listToMaybe, fromMaybe)
import qualified Data.Map as Map
import qualified Data.Text.Encoding as TE
import Control.Arrow (first)
-+import qualified Text.Hamlet
+import qualified Text.Blaze.Internal
++import qualified Yesod.Core.Widget
+import qualified Data.Foldable
++import qualified Text.Hamlet
-- | Get a unique identifier.
newFormIdent :: Monad m => MForm m Text
-@@ -217,7 +219,14 @@ postHelper form env = do
+@@ -217,7 +221,14 @@ postHelper form env = do
let token =
case reqToken req of
Nothing -> mempty
@@ -1275,7 +1288,7 @@ index 0d83b79..61e9b66 100644
m <- getYesod
langs <- languages
((res, xml), enctype) <- runFormGeneric (form token) m langs env
-@@ -298,7 +307,12 @@ getHelper :: MonadHandler m
+@@ -297,7 +308,12 @@ getHelper :: MonadHandler m
-> Maybe (Env, FileEnv)
-> m (a, Enctype)
getHelper form env = do
@@ -1289,7 +1302,7 @@ index 0d83b79..61e9b66 100644
langs <- languages
m <- getYesod
runFormGeneric (form fragment) m langs env
-@@ -333,10 +347,15 @@ identifyForm
+@@ -332,10 +348,15 @@ identifyForm
identifyForm identVal form = \fragment -> do
-- Create hidden <input>.
let fragment' =
@@ -1309,7 +1322,7 @@ index 0d83b79..61e9b66 100644
-- Check if we got its value back.
mp <- askParams
-@@ -366,22 +385,70 @@ renderTable, renderDivs, renderDivsNoLabels :: Monad m => FormRender m a
+@@ -365,22 +386,70 @@ renderTable, renderDivs, renderDivsNoLabels :: Monad m => FormRender m a
renderTable aform fragment = do
(res, views') <- aFormToForm aform
let views = views' []
@@ -1332,20 +1345,20 @@ index 0d83b79..61e9b66 100644
+ let widget = do { Text.Hamlet.condH
+ [(null views, (asWidgetT . toWidget) (toHtml fragment))] Nothing;
+ Data.Foldable.mapM_
-+ (\ (isFirst_aNqW, view_aNqX)
++ (\ (isFirst_ab5u, view_ab5v)
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<tr");
+ Text.Hamlet.condH
-+ [(or [fvRequired view_aNqX, not (fvRequired view_aNqX)],
++ [(or [fvRequired view_ab5v, not (fvRequired view_ab5v)],
+ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " class=\"");
+ Text.Hamlet.condH
-+ [(fvRequired view_aNqX,
++ [(fvRequired view_ab5v,
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_aNqX),
++ [(not (fvRequired view_ab5v),
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))]
+ Nothing;
@@ -1355,37 +1368,37 @@ index 0d83b79..61e9b66 100644
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "><td>");
+ Text.Hamlet.condH
-+ [(isFirst_aNqW, (asWidgetT . toWidget) (toHtml fragment))] Nothing;
++ [(isFirst_ab5u, (asWidgetT . toWidget) (toHtml fragment))] Nothing;
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<label for=\"");
-+ (asWidgetT . toWidget) (toHtml (fvId view_aNqX));
++ (asWidgetT . toWidget) (toHtml (fvId view_ab5v));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");
-+ (asWidgetT . toWidget) (toHtml (fvLabel view_aNqX));
++ (asWidgetT . toWidget) (toHtml (fvLabel view_ab5v));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>");
+ Text.Hamlet.maybeH
-+ (fvTooltip view_aNqX)
-+ (\ tt_aNqY
++ (fvTooltip view_ab5v)
++ (\ tt_ab5w
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<div class=\"tooltip\">");
-+ (asWidgetT . toWidget) (toHtml tt_aNqY);
++ (asWidgetT . toWidget) (toHtml tt_ab5w);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })
+ Nothing;
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</td><td>");
-+ (asWidgetT . toWidget) (fvInput view_aNqX);
++ (asWidgetT . toWidget) (fvInput view_ab5v);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</td>");
+ Text.Hamlet.maybeH
-+ (fvErrors view_aNqX)
-+ (\ err_aNqZ
++ (fvErrors view_ab5v)
++ (\ err_ab5x
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<td class=\"errors\">");
-+ (asWidgetT . toWidget) (toHtml err_aNqZ);
++ (asWidgetT . toWidget) (toHtml err_ab5x);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</td>") })
+ Nothing;
@@ -1396,7 +1409,7 @@ index 0d83b79..61e9b66 100644
return (res, widget)
where
addIsFirst [] = []
-@@ -397,19 +464,66 @@ renderDivsMaybeLabels :: Monad m => Bool -> FormRender m a
+@@ -396,19 +465,66 @@ renderDivsMaybeLabels :: Monad m => Bool -> FormRender m a
renderDivsMaybeLabels withLabels aform fragment = do
(res, views') <- aFormToForm aform
let views = views' []
@@ -1415,20 +1428,20 @@ index 0d83b79..61e9b66 100644
-|]
+ let widget = do { (asWidgetT . toWidget) (toHtml fragment);
+ Data.Foldable.mapM_
-+ (\ view_aNsz
++ (\ view_ab5K
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<div");
+ Text.Hamlet.condH
-+ [(or [fvRequired view_aNsz, not (fvRequired view_aNsz)],
++ [(or [fvRequired view_ab5K, not (fvRequired view_ab5K)],
+ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " class=\"");
+ Text.Hamlet.condH
-+ [(fvRequired view_aNsz,
++ [(fvRequired view_ab5K,
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_aNsz),
++ [(not (fvRequired view_ab5K),
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))]
+ Nothing;
@@ -1441,31 +1454,31 @@ index 0d83b79..61e9b66 100644
+ [(withLabels,
+ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<label for=\"");
-+ (asWidgetT . toWidget) (toHtml (fvId view_aNsz));
++ (asWidgetT . toWidget) (toHtml (fvId view_ab5K));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");
-+ (asWidgetT . toWidget) (toHtml (fvLabel view_aNsz));
++ (asWidgetT . toWidget) (toHtml (fvLabel view_ab5K));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })]
+ Nothing;
+ Text.Hamlet.maybeH
-+ (fvTooltip view_aNsz)
-+ (\ tt_aNsL
++ (fvTooltip view_ab5K)
++ (\ tt_ab5L
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<div class=\"tooltip\">");
-+ (asWidgetT . toWidget) (toHtml tt_aNsL);
++ (asWidgetT . toWidget) (toHtml tt_ab5L);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })
+ Nothing;
-+ (asWidgetT . toWidget) (fvInput view_aNsz);
++ (asWidgetT . toWidget) (fvInput view_ab5K);
+ Text.Hamlet.maybeH
-+ (fvErrors view_aNsz)
-+ (\ err_aNsP
++ (fvErrors view_ab5K)
++ (\ err_ab5M
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<div class=\"errors\">");
-+ (asWidgetT . toWidget) (toHtml err_aNsP);
++ (asWidgetT . toWidget) (toHtml err_ab5M);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })
+ Nothing;
@@ -1476,7 +1489,7 @@ index 0d83b79..61e9b66 100644
return (res, widget)
-- | Render a form using Bootstrap v2-friendly shamlet syntax.
-@@ -437,19 +551,62 @@ renderBootstrap2 aform fragment = do
+@@ -436,19 +552,62 @@ renderBootstrap2 aform fragment = do
let views = views' []
has (Just _) = True
has Nothing = False
@@ -1495,53 +1508,53 @@ index 0d83b79..61e9b66 100644
- |]
+ let widget = do { (asWidgetT . toWidget) (toHtml fragment);
+ Data.Foldable.mapM_
-+ (\ view_aNw8
++ (\ view_ab5Y
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<div class=\"control-group clearfix ");
+ Text.Hamlet.condH
-+ [(fvRequired view_aNw8,
++ [(fvRequired view_ab5Y,
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_aNw8),
++ [(not (fvRequired view_ab5Y),
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "optional "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(has (fvErrors view_aNw8),
++ [(has (fvErrors view_ab5Y),
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "error"))]
+ Nothing;
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "\"><label class=\"control-label\" for=\"");
-+ (asWidgetT . toWidget) (toHtml (fvId view_aNw8));
++ (asWidgetT . toWidget) (toHtml (fvId view_ab5Y));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");
-+ (asWidgetT . toWidget) (toHtml (fvLabel view_aNw8));
++ (asWidgetT . toWidget) (toHtml (fvLabel view_ab5Y));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "</label><div class=\"controls input\">");
-+ (asWidgetT . toWidget) (fvInput view_aNw8);
++ (asWidgetT . toWidget) (fvInput view_ab5Y);
+ Text.Hamlet.maybeH
-+ (fvTooltip view_aNw8)
-+ (\ tt_aNw9
++ (fvTooltip view_ab5Y)
++ (\ tt_ab5Z
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<span class=\"help-block\">");
-+ (asWidgetT . toWidget) (toHtml tt_aNw9);
++ (asWidgetT . toWidget) (toHtml tt_ab5Z);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") })
+ Nothing;
+ Text.Hamlet.maybeH
-+ (fvErrors view_aNw8)
-+ (\ err_aNwa
++ (fvErrors view_ab5Y)
++ (\ err_ab60
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<span class=\"help-block\">");
-+ (asWidgetT . toWidget) (toHtml err_aNwa);
++ (asWidgetT . toWidget) (toHtml err_ab60);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") })
+ Nothing;
@@ -1553,15 +1566,16 @@ index 0d83b79..61e9b66 100644
-- | Deprecated synonym for 'renderBootstrap2'.
diff --git a/Yesod/Form/Jquery.hs b/Yesod/Form/Jquery.hs
-index 63e3d57..47503c2 100644
+index 362eb8a..1df9966 100644
--- a/Yesod/Form/Jquery.hs
+++ b/Yesod/Form/Jquery.hs
-@@ -18,11 +18,23 @@ import Yesod.Core
+@@ -17,11 +17,23 @@ import Yesod.Core
import Yesod.Form
import Data.Time (Day)
import Data.Default
-import Text.Hamlet (shamlet)
-import Text.Julius (julius, rawJS)
++--import Text.Hamlet (shamlet)
+import Text.Julius (rawJS)
import Data.Text (Text, pack, unpack)
import Data.Monoid (mconcat)
@@ -1577,27 +1591,25 @@ index 63e3d57..47503c2 100644
+import qualified Text.Julius
+import qualified Data.Text.Lazy.Builder
+import qualified Text.Shakespeare
-+import qualified Data.Text.Lazy.Builder as Data.Text.Internal.Builder
+
-- | Gets the Google hosted jQuery UI 1.8 CSS file with the given theme.
googleHostedJqueryUiCss :: Text -> Text
googleHostedJqueryUiCss theme = mconcat
-@@ -71,27 +83,54 @@ jqueryDayField' jds inputType = Field
+@@ -61,27 +73,59 @@ jqueryDayField jds = Field
. readMay
. unpack
, fieldView = \theId name attrs val isReq -> do
- toWidget [shamlet|
-$newline never
--<input id="#{theId}" name="#{name}" *{attrs} type="#{inputType}" :isReq:required="" value="#{showVal val}">
+-<input id="#{theId}" name="#{name}" *{attrs} type="date" :isReq:required="" value="#{showVal val}">
-|]
+ toWidget $ do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"");
-+ id (toHtml inputType);
-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
++ id
++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"date\"");
+ Text.Hamlet.condH
+ [(isReq,
+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
@@ -1626,36 +1638,42 @@ index 63e3d57..47503c2 100644
-});
-|]
+ toWidget $ Text.Julius.asJavascriptUrl
-+ (\ _render_a3iGM
++ (\ _render_a2l4S
+ -> mconcat
+ [Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
-+ "\n\n$(function(){\n\n var i = document.getElementById(\""),
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ "\n$(function(){\n var i = document.getElementById(\""),
+ Text.Julius.toJavascript (rawJS theId),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
-+ "\");\n\n if (i.type != \"date\") {\n\n $(i).datepicker({\n\n dateFormat:'yy-mm-dd',\n\n changeMonth:"),
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ "\");\n if (i.type != \"date\") {\n $(i).datepicker({\n dateFormat:'yy-mm-dd',\n changeMonth:"),
+ Text.Julius.toJavascript (jsBool (jdsChangeMonth jds)),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
-+ ",\n\n changeYear:"),
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ ",\n changeYear:"),
+ Text.Julius.toJavascript (jsBool (jdsChangeYear jds)),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
-+ ",\n\n numberOfMonths:"),
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ ",\n numberOfMonths:"),
+ Text.Julius.toJavascript (rawJS (mos (jdsNumberOfMonths jds))),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
-+ ",\n\n yearRange:"),
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ ",\n yearRange:"),
+ Text.Julius.toJavascript (toJSON (jdsYearRange jds)),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
-+ "\n\n });\n\n }\n\n});")])
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ "\n });\n }\n});")])
+
, fieldEnctype = UrlEncoded
}
where
-@@ -118,16 +157,47 @@ jqueryAutocompleteField' :: (RenderMessage site FormMessage, YesodJquery site)
+@@ -108,16 +152,52 @@ jqueryAutocompleteField' :: (RenderMessage site FormMessage, YesodJquery site)
jqueryAutocompleteField' minLen src = Field
{ fieldParse = parseHelper $ Right
, fieldView = \theId name attrs val isReq -> do
@@ -1688,35 +1706,40 @@ index 63e3d57..47503c2 100644
-$(function(){$("##{rawJS theId}").autocomplete({source:"@{src}",minLength:#{toJSON minLen}})});
-|]
+ toWidget $ Text.Julius.asJavascriptUrl
-+ (\ _render_a3iHO
++ (\ _render_a2l58
+ -> mconcat
+ [Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
-+ "\n\n$(function(){$(\"#"),
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ "\n$(function(){$(\"#"),
+ Text.Julius.toJavascript (rawJS theId),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
+ "\").autocomplete({source:\""),
+ Text.Julius.Javascript
-+ (Data.Text.Internal.Builder.fromText (_render_a3iHO src [])),
++ (Data.Text.Lazy.Builder.fromText
++ (_render_a2l58 src [])),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
+ "\",minLength:"),
+ Text.Julius.toJavascript (toJSON minLen),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
+ "})});")])
+
, fieldEnctype = UrlEncoded
}
diff --git a/Yesod/Form/MassInput.hs b/Yesod/Form/MassInput.hs
-index a2b434d..29b45b5 100644
+index a2b434d..75eb484 100644
--- a/Yesod/Form/MassInput.hs
+++ b/Yesod/Form/MassInput.hs
-@@ -22,6 +22,16 @@ import Data.Traversable (sequenceA)
- import qualified Data.Map as Map
- import Data.Maybe (listToMaybe)
+@@ -9,6 +9,16 @@ module Yesod.Form.MassInput
+ , massTable
+ ) where
+import qualified Data.Text
+import qualified Text.Blaze as Text.Blaze.Internal
@@ -1728,9 +1751,9 @@ index a2b434d..29b45b5 100644
+import qualified Data.Foldable
+import qualified Control.Monad
+
- down :: Monad m => Int -> MForm m ()
- down 0 = return ()
- down i | i < 0 = error "called down with a negative number"
+ import Yesod.Form.Types
+ import Yesod.Form.Functions
+ import Yesod.Form.Fields (checkBoxField)
@@ -70,16 +80,27 @@ inputList label fixXml single mdef = formToAForm $ do
{ fvLabel = label
, fvTooltip = Nothing
@@ -1749,7 +1772,7 @@ index a2b434d..29b45b5 100644
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<p>");
+ Data.Foldable.mapM_
-+ (\ xml_a3hPg -> (asWidgetT . toWidget) xml_a3hPg) xmls;
++ (\ xml_a1yM1 -> (asWidgetT . toWidget) xml_a1yM1) xmls;
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<input class=\"count\" type=\"hidden\" name=\"");
@@ -1806,27 +1829,27 @@ index a2b434d..29b45b5 100644
- <div .errors>#{err}
-|]
+massDivs viewss = Data.Foldable.mapM_
-+ (\ views_a3hPz
++ (\ views_a1yMm
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<fieldset>");
+ Data.Foldable.mapM_
-+ (\ view_a3hPA
++ (\ view_a1yMn
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<div");
+ Text.Hamlet.condH
-+ [(or [fvRequired view_a3hPA, not (fvRequired view_a3hPA)],
++ [(or [fvRequired view_a1yMn, not (fvRequired view_a1yMn)],
+ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ " class=\"");
+ Text.Hamlet.condH
-+ [(fvRequired view_a3hPA,
++ [(fvRequired view_a1yMn,
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_a3hPA),
++ [(not (fvRequired view_a1yMn),
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "optional"))]
@@ -1838,38 +1861,38 @@ index a2b434d..29b45b5 100644
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "><label for=\"");
-+ (asWidgetT . toWidget) (toHtml (fvId view_a3hPA));
++ (asWidgetT . toWidget) (toHtml (fvId view_a1yMn));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">");
-+ (asWidgetT . toWidget) (toHtml (fvLabel view_a3hPA));
++ (asWidgetT . toWidget) (toHtml (fvLabel view_a1yMn));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>");
+ Text.Hamlet.maybeH
-+ (fvTooltip view_a3hPA)
-+ (\ tt_a3hPB
++ (fvTooltip view_a1yMn)
++ (\ tt_a1yMo
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<div class=\"tooltip\">");
-+ (asWidgetT . toWidget) (toHtml tt_a3hPB);
++ (asWidgetT . toWidget) (toHtml tt_a1yMo);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</div>") })
+ Nothing;
-+ (asWidgetT . toWidget) (fvInput view_a3hPA);
++ (asWidgetT . toWidget) (fvInput view_a1yMn);
+ Text.Hamlet.maybeH
-+ (fvErrors view_a3hPA)
-+ (\ err_a3hPC
++ (fvErrors view_a1yMn)
++ (\ err_a1yMp
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<div class=\"errors\">");
-+ (asWidgetT . toWidget) (toHtml err_a3hPC);
++ (asWidgetT . toWidget) (toHtml err_a1yMp);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</div>") })
+ Nothing;
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</div>") })
-+ views_a3hPz;
++ views_a1yMm;
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</fieldset>") })
@@ -1877,27 +1900,27 @@ index a2b434d..29b45b5 100644
+
+
+massTable viewss = Data.Foldable.mapM_
-+ (\ views_a3hPH
++ (\ views_a1yMv
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<fieldset><table>");
+ Data.Foldable.mapM_
-+ (\ view_a3hPI
++ (\ view_a1yMw
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<tr");
+ Text.Hamlet.condH
-+ [(or [fvRequired view_a3hPI, not (fvRequired view_a3hPI)],
++ [(or [fvRequired view_a1yMw, not (fvRequired view_a1yMw)],
+ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ " class=\"");
+ Text.Hamlet.condH
-+ [(fvRequired view_a3hPI,
++ [(fvRequired view_a1yMw,
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_a3hPI),
++ [(not (fvRequired view_a1yMw),
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "optional"))]
@@ -1909,19 +1932,19 @@ index a2b434d..29b45b5 100644
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "><td><label for=\"");
-+ (asWidgetT . toWidget) (toHtml (fvId view_a3hPI));
++ (asWidgetT . toWidget) (toHtml (fvId view_a1yMw));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">");
-+ (asWidgetT . toWidget) (toHtml (fvLabel view_a3hPI));
++ (asWidgetT . toWidget) (toHtml (fvLabel view_a1yMw));
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>");
+ Text.Hamlet.maybeH
-+ (fvTooltip view_a3hPI)
-+ (\ tt_a3hPJ
++ (fvTooltip view_a1yMw)
++ (\ tt_a1yMx
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<div class=\"tooltip\">");
-+ (asWidgetT . toWidget) (toHtml tt_a3hPJ);
++ (asWidgetT . toWidget) (toHtml tt_a1yMx);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</div>") })
@@ -1929,23 +1952,23 @@ index a2b434d..29b45b5 100644
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</td><td>");
-+ (asWidgetT . toWidget) (fvInput view_a3hPI);
++ (asWidgetT . toWidget) (fvInput view_a1yMw);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</td>");
+ Text.Hamlet.maybeH
-+ (fvErrors view_a3hPI)
-+ (\ err_a3hPK
++ (fvErrors view_a1yMw)
++ (\ err_a1yMy
+ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<td class=\"errors\">");
-+ (asWidgetT . toWidget) (toHtml err_a3hPK);
++ (asWidgetT . toWidget) (toHtml err_a1yMy);
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</td>") })
+ Nothing;
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</tr>") })
-+ views_a3hPH;
++ views_a1yMv;
+ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</table></fieldset>") })
@@ -1967,19 +1990,12 @@ index a2b434d..29b45b5 100644
- <td .errors>#{err}
-|]
diff --git a/Yesod/Form/Nic.hs b/Yesod/Form/Nic.hs
-index 2862678..a773553 100644
+index 7e4af07..b59745a 100644
--- a/Yesod/Form/Nic.hs
+++ b/Yesod/Form/Nic.hs
-@@ -12,12 +12,24 @@ module Yesod.Form.Nic
- import Yesod.Core
- import Yesod.Form
- import Text.HTML.SanitizeXSS (sanitizeBalance)
--import Text.Hamlet (shamlet)
--import Text.Julius (julius, rawJS)
-+import Text.Julius (rawJS)
- import Text.Blaze.Html.Renderer.String (renderHtml)
- import Data.Text (Text, pack)
- import Data.Maybe (listToMaybe)
+@@ -9,11 +9,22 @@ module Yesod.Form.Nic
+ , nicHtmlField
+ ) where
+import qualified Text.Blaze as Text.Blaze.Internal
+import qualified Text.Blaze.Internal
@@ -1991,19 +2007,24 @@ index 2862678..a773553 100644
+import qualified Control.Monad
+import qualified Text.Julius
+import qualified Data.Text.Lazy.Builder
-+import qualified Data.Text.Lazy.Builder as Data.Text.Internal.Builder
+import qualified Text.Shakespeare
+
- class Yesod a => YesodNic a where
- -- | NIC Editor Javascript file.
- urlNicEdit :: a -> Either (Route a) Text
-@@ -27,20 +39,44 @@ nicHtmlField :: YesodNic site => Field (HandlerT site IO) Html
+ import Yesod.Core
+ import Yesod.Form
+ import Text.HTML.SanitizeXSS (sanitizeBalance)
+-import Text.Hamlet (shamlet)
+-import Text.Julius (julius, rawJS)
++import Text.Julius ( rawJS)
+ import Text.Blaze.Html.Renderer.String (renderHtml)
+ import Data.Text (Text, pack)
+ import Data.Maybe (listToMaybe)
+@@ -27,20 +38,52 @@ nicHtmlField :: YesodNic site => Field (HandlerT site IO) Html
nicHtmlField = Field
{ fieldParse = \e _ -> return . Right . fmap (preEscapedToMarkup . sanitizeBalance) . listToMaybe $ e
- , fieldView = \theId name attrs val _isReq -> do
+ , fieldView = \theId name attrs val isReq -> do
- toWidget [shamlet|
-$newline never
-- <textarea id="#{theId}" *{attrs} name="#{name}" .html>#{showVal val}
+- <textarea id="#{theId}" *{attrs} name="#{name}" :isReq:required .html>#{showVal val}
-|]
+ toWidget $ do { id
+ ((Text.Blaze.Internal.preEscapedText . pack)
@@ -2012,6 +2033,10 @@ index 2862678..a773553 100644
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
++ Text.Hamlet.condH
++ [(isReq,
++ id ((Text.Blaze.Internal.preEscapedText . pack) " required"))]
++ Nothing;
+ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ id (toHtml (showVal val));
@@ -2028,43 +2053,34 @@ index 2862678..a773553 100644
-(function(){new nicEditor({fullPanel:true}).panelInstance("#{rawJS theId}")})();
-|]
+ BottomOfHeadBlocking -> Text.Julius.asJavascriptUrl
-+ (\ _render_a3hYy
++ (\ _render_a2rMh
+ -> Data.Monoid.mconcat
+ [Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
-+ "\n\nbkLib.onDomLoaded(function(){new nicEditor({fullPanel:true}).panelInstance(\""),
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ "\nbkLib.onDomLoaded(function(){new nicEditor({fullPanel:true}).panelInstance(\""),
+ Text.Julius.toJavascript (rawJS theId),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
+ "\")});")])
+
+ _ -> Text.Julius.asJavascriptUrl
-+ (\ _render_a3i1Q
++ (\ _render_a2rMm
+ -> Data.Monoid.mconcat
+ [Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
-+ "\n\n(function(){new nicEditor({fullPanel:true}).panelInstance(\""),
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ "\n(function(){new nicEditor({fullPanel:true}).panelInstance(\""),
+ Text.Julius.toJavascript (rawJS theId),
+ Text.Julius.Javascript
-+ ((Data.Text.Internal.Builder.fromText . Text.Shakespeare.pack')
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
+ "\")})();")])
+
, fieldEnctype = UrlEncoded
}
where
-diff --git a/yesod-form.cabal b/yesod-form.cabal
-index 7849763..9694fe1 100644
---- a/yesod-form.cabal
-+++ b/yesod-form.cabal
-@@ -23,7 +23,7 @@ library
- , yesod-core >= 1.4 && < 1.5
- , yesod-persistent >= 1.4 && < 1.5
- , time >= 1.1.4
-- , shakespeare >= 2.0
-+ , shakespeare >= 2.0.5
- , persistent
- , template-haskell
- , transformers >= 0.2.2
--
-2.1.4
+2.1.1
diff --git a/standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch b/standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch
index 1b850d2..76aad4e 100644
--- a/standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch
+++ b/standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch
@@ -1,6 +1,6 @@
-From 4d8650bd806f50aa2538270f80fa93261c43d056 Mon Sep 17 00:00:00 2001
+From e82ed4e6fd7b5ea6dbe474b5de2755ec5794161c Mon Sep 17 00:00:00 2001
From: dummy <dummy@example.com>
-Date: Fri, 3 Jul 2015 00:12:02 +0000
+Date: Thu, 16 Oct 2014 02:23:50 +0000
Subject: [PATCH] stub out
---
@@ -8,16 +8,16 @@ Subject: [PATCH] stub out
1 file changed, 10 deletions(-)
diff --git a/yesod-persistent.cabal b/yesod-persistent.cabal
-index c3bc1bf..1727dba 100644
+index b116f3a..017b184 100644
--- a/yesod-persistent.cabal
+++ b/yesod-persistent.cabal
-@@ -15,16 +15,6 @@ extra-source-files: README.md ChangeLog.md
+@@ -14,16 +14,6 @@ description: Some helpers for using Persistent from Yesod.
library
build-depends: base >= 4 && < 5
-- , yesod-core >= 1.4.0 && < 1.5
-- , persistent >= 2.1 && < 2.2
-- , persistent-template >= 2.1 && < 2.2
+- , yesod-core >= 1.2.2 && < 1.3
+- , persistent >= 1.2 && < 2.1
+- , persistent-template >= 1.2 && < 2.1
- , transformers >= 0.2.2
- , blaze-builder
- , conduit
@@ -29,5 +29,5 @@ index c3bc1bf..1727dba 100644
test-suite test
--
-2.1.4
+2.1.1
diff --git a/standalone/no-th/haskell-patches/yesod-routes_remove-TH.patch b/standalone/no-th/haskell-patches/yesod-routes_remove-TH.patch
new file mode 100644
index 0000000..99d6c90
--- /dev/null
+++ b/standalone/no-th/haskell-patches/yesod-routes_remove-TH.patch
@@ -0,0 +1,170 @@
+From 8ba08c0efc035486a65f2fd33916a5da7e5210e7 Mon Sep 17 00:00:00 2001
+From: dummy <dummy@example.com>
+Date: Thu, 26 Dec 2013 19:32:55 -0400
+Subject: [PATCH] remove TH
+
+---
+ Yesod/Routes/Parse.hs | 40 +++++-----------------------------------
+ Yesod/Routes/TH.hs | 16 ++++++++--------
+ Yesod/Routes/TH/Types.hs | 16 ----------------
+ yesod-routes.cabal | 4 ----
+ 4 files changed, 13 insertions(+), 63 deletions(-)
+
+diff --git a/Yesod/Routes/Parse.hs b/Yesod/Routes/Parse.hs
+index 232982d..7df7750 100644
+--- a/Yesod/Routes/Parse.hs
++++ b/Yesod/Routes/Parse.hs
+@@ -2,11 +2,11 @@
+ {-# LANGUAGE DeriveDataTypeable #-}
+ {-# OPTIONS_GHC -fno-warn-missing-fields #-} -- QuasiQuoter
+ module Yesod.Routes.Parse
+- ( parseRoutes
+- , parseRoutesFile
+- , parseRoutesNoCheck
+- , parseRoutesFileNoCheck
+- , parseType
++ --( parseRoutes
++ --, parseRoutesFile
++ --, parseRoutesNoCheck
++ --, parseRoutesFileNoCheck
++ ( parseType
+ , parseTypeTree
+ , TypeTree (..)
+ ) where
+@@ -19,42 +19,12 @@ import Yesod.Routes.TH
+ import Yesod.Routes.Overlap (findOverlapNames)
+ import Data.List (foldl')
+
+--- | A quasi-quoter to parse a string into a list of 'Resource's. Checks for
+--- overlapping routes, failing if present; use 'parseRoutesNoCheck' to skip the
+--- checking. See documentation site for details on syntax.
+-parseRoutes :: QuasiQuoter
+-parseRoutes = QuasiQuoter { quoteExp = x }
+- where
+- x s = do
+- let res = resourcesFromString s
+- case findOverlapNames res of
+- [] -> lift res
+- z -> error $ unlines $ "Overlapping routes: " : map show z
+-
+-parseRoutesFile :: FilePath -> Q Exp
+-parseRoutesFile = parseRoutesFileWith parseRoutes
+-
+-parseRoutesFileNoCheck :: FilePath -> Q Exp
+-parseRoutesFileNoCheck = parseRoutesFileWith parseRoutesNoCheck
+-
+-parseRoutesFileWith :: QuasiQuoter -> FilePath -> Q Exp
+-parseRoutesFileWith qq fp = do
+- qAddDependentFile fp
+- s <- qRunIO $ readUtf8File fp
+- quoteExp qq s
+-
+ readUtf8File :: FilePath -> IO String
+ readUtf8File fp = do
+ h <- SIO.openFile fp SIO.ReadMode
+ SIO.hSetEncoding h SIO.utf8_bom
+ SIO.hGetContents h
+
+--- | Same as 'parseRoutes', but performs no overlap checking.
+-parseRoutesNoCheck :: QuasiQuoter
+-parseRoutesNoCheck = QuasiQuoter
+- { quoteExp = lift . resourcesFromString
+- }
+-
+ -- | Convert a multi-line string to a set of resources. See documentation for
+ -- the format of this string. This is a partial function which calls 'error' on
+ -- invalid input.
+diff --git a/Yesod/Routes/TH.hs b/Yesod/Routes/TH.hs
+index 7b2e50b..b05fc57 100644
+--- a/Yesod/Routes/TH.hs
++++ b/Yesod/Routes/TH.hs
+@@ -2,15 +2,15 @@
+ module Yesod.Routes.TH
+ ( module Yesod.Routes.TH.Types
+ -- * Functions
+- , module Yesod.Routes.TH.RenderRoute
+- , module Yesod.Routes.TH.ParseRoute
+- , module Yesod.Routes.TH.RouteAttrs
++ -- , module Yesod.Routes.TH.RenderRoute
++ -- , module Yesod.Routes.TH.ParseRoute
++ -- , module Yesod.Routes.TH.RouteAttrs
+ -- ** Dispatch
+- , module Yesod.Routes.TH.Dispatch
++ -- , module Yesod.Routes.TH.Dispatch
+ ) where
+
+ import Yesod.Routes.TH.Types
+-import Yesod.Routes.TH.RenderRoute
+-import Yesod.Routes.TH.ParseRoute
+-import Yesod.Routes.TH.RouteAttrs
+-import Yesod.Routes.TH.Dispatch
++--import Yesod.Routes.TH.RenderRoute
++--import Yesod.Routes.TH.ParseRoute
++--import Yesod.Routes.TH.RouteAttrs
++--import Yesod.Routes.TH.Dispatch
+diff --git a/Yesod/Routes/TH/Types.hs b/Yesod/Routes/TH/Types.hs
+index d0a0405..3232e99 100644
+--- a/Yesod/Routes/TH/Types.hs
++++ b/Yesod/Routes/TH/Types.hs
+@@ -31,10 +31,6 @@ instance Functor ResourceTree where
+ fmap f (ResourceLeaf r) = ResourceLeaf (fmap f r)
+ fmap f (ResourceParent a b c) = ResourceParent a (map (second $ fmap f) b) $ map (fmap f) c
+
+-instance Lift t => Lift (ResourceTree t) where
+- lift (ResourceLeaf r) = [|ResourceLeaf $(lift r)|]
+- lift (ResourceParent a b c) = [|ResourceParent $(lift a) $(lift b) $(lift c)|]
+-
+ data Resource typ = Resource
+ { resourceName :: String
+ , resourcePieces :: [(CheckOverlap, Piece typ)]
+@@ -48,9 +44,6 @@ type CheckOverlap = Bool
+ instance Functor Resource where
+ fmap f (Resource a b c d) = Resource a (map (second $ fmap f) b) (fmap f c) d
+
+-instance Lift t => Lift (Resource t) where
+- lift (Resource a b c d) = [|Resource a b c d|]
+-
+ data Piece typ = Static String | Dynamic typ
+ deriving Show
+
+@@ -58,10 +51,6 @@ instance Functor Piece where
+ fmap _ (Static s) = (Static s)
+ fmap f (Dynamic t) = Dynamic (f t)
+
+-instance Lift t => Lift (Piece t) where
+- lift (Static s) = [|Static $(lift s)|]
+- lift (Dynamic t) = [|Dynamic $(lift t)|]
+-
+ data Dispatch typ =
+ Methods
+ { methodsMulti :: Maybe typ -- ^ type of the multi piece at the end
+@@ -77,11 +66,6 @@ instance Functor Dispatch where
+ fmap f (Methods a b) = Methods (fmap f a) b
+ fmap f (Subsite a b) = Subsite (f a) b
+
+-instance Lift t => Lift (Dispatch t) where
+- lift (Methods Nothing b) = [|Methods Nothing $(lift b)|]
+- lift (Methods (Just t) b) = [|Methods (Just $(lift t)) $(lift b)|]
+- lift (Subsite t b) = [|Subsite $(lift t) $(lift b)|]
+-
+ resourceMulti :: Resource typ -> Maybe typ
+ resourceMulti Resource { resourceDispatch = Methods (Just t) _ } = Just t
+ resourceMulti _ = Nothing
+diff --git a/yesod-routes.cabal b/yesod-routes.cabal
+index 61980d1..33d2380 100644
+--- a/yesod-routes.cabal
++++ b/yesod-routes.cabal
+@@ -27,10 +27,6 @@ library
+ Yesod.Routes.Class
+ Yesod.Routes.Parse
+ Yesod.Routes.Overlap
+- other-modules: Yesod.Routes.TH.Dispatch
+- Yesod.Routes.TH.RenderRoute
+- Yesod.Routes.TH.ParseRoute
+- Yesod.Routes.TH.RouteAttrs
+ Yesod.Routes.TH.Types
+ ghc-options: -Wall
+
+--
+1.7.10.4
+
diff --git a/standalone/no-th/haskell-patches/yesod-static_hack.patch b/standalone/no-th/haskell-patches/yesod-static_hack.patch
index 20e47b5..46e4b65 100644
--- a/standalone/no-th/haskell-patches/yesod-static_hack.patch
+++ b/standalone/no-th/haskell-patches/yesod-static_hack.patch
@@ -1,6 +1,6 @@
-From 09d7340ff4c9b43f7c8c2ad6529a6c60871d265f Mon Sep 17 00:00:00 2001
+From 606c5f4f4b2d476d274907eb2bb8c12b60fc451f Mon Sep 17 00:00:00 2001
From: dummy <dummy@example.com>
-Date: Fri, 3 Jul 2015 01:39:14 +0000
+Date: Wed, 21 May 2014 04:43:30 +0000
Subject: [PATCH] remove TH
---
@@ -31,7 +31,7 @@ index 08febb9..e3a6d51 100644
-- | Use <https://github.com/mishoo/UglifyJS2 UglifyJS2> to compress javascript.
-- Assumes @uglifyjs@ is located in the path and uses options @[\"-m\", \"-c\"]@
diff --git a/Yesod/Static.hs b/Yesod/Static.hs
-index a18d88e..afb1cda 100644
+index 725ebf4..33eaffd 100644
--- a/Yesod/Static.hs
+++ b/Yesod/Static.hs
@@ -37,8 +37,8 @@ module Yesod.Static
@@ -99,7 +99,7 @@ index a18d88e..afb1cda 100644
@@ -267,7 +270,7 @@ staticFilesList dir fs =
-- see if their copy is up-to-date.
publicFiles :: Prelude.FilePath -> Q [Dec]
- publicFiles dir = mkStaticFiles' dir False
+ publicFiles dir = mkStaticFiles' dir "StaticRoute" False
-
+-}
@@ -111,17 +111,17 @@ index a18d88e..afb1cda 100644
+{-
mkStaticFiles :: Prelude.FilePath -> Q [Dec]
- mkStaticFiles fp = mkStaticFiles' fp True
+ mkStaticFiles fp = mkStaticFiles' fp "StaticRoute" True
-@@ -354,6 +358,7 @@ mkStaticFilesList fp fs makeHash = do
- [ Clause [] (NormalB $ (ConE 'StaticRoute) `AppE` f' `AppE` qs) []
+@@ -357,6 +361,7 @@ mkStaticFilesList fp fs routeConName makeHash = do
+ [ Clause [] (NormalB $ (ConE route) `AppE` f' `AppE` qs) []
]
]
+-}
base64md5File :: Prelude.FilePath -> IO String
base64md5File = fmap (base64 . encode) . hashFile
-@@ -392,7 +397,7 @@ base64 = map tr
+@@ -395,7 +400,7 @@ base64 = map tr
-- single static file at compile time.
data CombineType = JS | CSS
@@ -130,7 +130,7 @@ index a18d88e..afb1cda 100644
combineStatics' :: CombineType
-> CombineSettings
-> [Route Static] -- ^ files to combine
-@@ -426,7 +431,7 @@ combineStatics' combineType CombineSettings {..} routes = do
+@@ -429,7 +434,7 @@ combineStatics' combineType CombineSettings {..} routes = do
case combineType of
JS -> "js"
CSS -> "css"
@@ -139,7 +139,7 @@ index a18d88e..afb1cda 100644
-- | Data type for holding all settings for combining files.
--
-- This data type is a settings type. For more information, see:
-@@ -502,6 +507,7 @@ instance Default CombineSettings where
+@@ -505,6 +510,7 @@ instance Default CombineSettings where
errorIntro :: [FilePath] -> [Char] -> [Char]
errorIntro fps s = "Error minifying " ++ show fps ++ ": " ++ s
@@ -147,7 +147,7 @@ index a18d88e..afb1cda 100644
liftRoutes :: [Route Static] -> Q Exp
liftRoutes =
fmap ListE . mapM go
-@@ -548,4 +554,5 @@ combineScripts' :: Bool -- ^ development? if so, perform no combining
+@@ -551,4 +557,5 @@ combineScripts' :: Bool -- ^ development? if so, perform no combining
-> Q Exp
combineScripts' development cs con routes
| development = [| mapM_ (addScript . $(return $ ConE con)) $(liftRoutes routes) |]
@@ -155,18 +155,18 @@ index a18d88e..afb1cda 100644
+ | otherwise = [| addScript $ $(return $ ConE con) $(combineStatics' JS cs routes) |]a
+-}
diff --git a/yesod-static.cabal b/yesod-static.cabal
-index 4ccb0d7..8758aaa 100644
+index 2582a95..5df03b3 100644
--- a/yesod-static.cabal
+++ b/yesod-static.cabal
-@@ -50,7 +50,6 @@ library
- , system-fileio >= 0.3
+@@ -49,7 +49,6 @@ library
, data-default
+ , shakespeare-css >= 1.0.3
, mime-types >= 0.1
- , hjsmin
, filepath >= 1.3
, resourcet >= 0.4
, unordered-containers >= 0.2
-@@ -63,13 +62,6 @@ library
+@@ -62,13 +61,6 @@ library
, hashable >= 1.1
exposed-modules: Yesod.Static
@@ -181,13 +181,13 @@ index 4ccb0d7..8758aaa 100644
ghc-options: -Wall
extensions: TemplateHaskell
@@ -108,7 +100,6 @@ test-suite tests
- , system-fileio
, data-default
+ , shakespeare-css
, mime-types
- , hjsmin
, filepath
, resourcet
, unordered-containers
--
-2.1.4
+2.0.0.rc2
diff --git a/standalone/no-th/haskell-patches/yesod_hack-TH.patch b/standalone/no-th/haskell-patches/yesod_hack-TH.patch
index 1365b27..ebf8a78 100644
--- a/standalone/no-th/haskell-patches/yesod_hack-TH.patch
+++ b/standalone/no-th/haskell-patches/yesod_hack-TH.patch
@@ -1,13 +1,13 @@
-From 86e7cf433fcd3386893556d690748781f46d3f03 Mon Sep 17 00:00:00 2001
+From 59091cd37958fee79b9e346fe3118d5ed7d0104b Mon Sep 17 00:00:00 2001
From: dummy <dummy@example.com>
-Date: Fri, 3 Jul 2015 01:33:03 +0000
+Date: Thu, 16 Oct 2014 02:36:37 +0000
Subject: [PATCH] hack TH
---
Yesod.hs | 19 ++++++++++++--
- Yesod/Default/Main.hs | 28 +--------------------
- Yesod/Default/Util.hs | 68 ++-------------------------------------------------
- 3 files changed, 20 insertions(+), 95 deletions(-)
+ Yesod/Default/Main.hs | 31 +----------------------
+ Yesod/Default/Util.hs | 69 ++-------------------------------------------------
+ 3 files changed, 20 insertions(+), 99 deletions(-)
diff --git a/Yesod.hs b/Yesod.hs
index b367144..fbe309c 100644
@@ -41,7 +41,7 @@ index b367144..fbe309c 100644
+insert = undefined
+
diff --git a/Yesod/Default/Main.hs b/Yesod/Default/Main.hs
-index 2694825..5a5fbb9 100644
+index 565ed35..bf46642 100644
--- a/Yesod/Default/Main.hs
+++ b/Yesod/Default/Main.hs
@@ -1,10 +1,8 @@
@@ -64,7 +64,7 @@ index 2694825..5a5fbb9 100644
import System.Log.FastLogger (LogStr, toLogStr)
import Language.Haskell.TH.Syntax (qLocation)
-@@ -56,30 +54,6 @@ defaultMain load getApp = do
+@@ -55,33 +53,6 @@ defaultMain load getApp = do
type LogFunc = Loc -> LogSource -> LogLevel -> LogStr -> IO ()
@@ -79,24 +79,27 @@ index 2694825..5a5fbb9 100644
-defaultMainLog load getApp = do
- config <- load
- (app, logFunc) <- getApp config
-- runSettings
-- ( setPort (appPort config)
-- $ setHost (appHost config)
-- $ setOnException (const $ \e -> when (shouldLog' e) $ logFunc
+- runSettings defaultSettings
+- { settingsPort = appPort config
+- , settingsHost = appHost config
+- , settingsOnException = const $ \e -> when (shouldLog' e) $ logFunc
- $(qLocation >>= liftLoc)
- "yesod"
- LevelError
-- (toLogStr $ "Exception from Warp: " ++ show e))
-- $ defaultSettings
-- ) app
+- (toLogStr $ "Exception from Warp: " ++ show e)
+- } app
- where
-- shouldLog' = Warp.defaultShouldDisplayException
--
+- shouldLog' =
+-#if MIN_VERSION_warp(2,1,3)
+- Warp.defaultShouldDisplayException
+-#else
+- const True
+-#endif
+
-- | Run your application continously, listening for SIGINT and exiting
-- when received
- --
diff --git a/Yesod/Default/Util.hs b/Yesod/Default/Util.hs
-index 488312a..5476b54 100644
+index a10358e..0547424 100644
--- a/Yesod/Default/Util.hs
+++ b/Yesod/Default/Util.hs
@@ -5,10 +5,9 @@
@@ -122,7 +125,7 @@ index 488312a..5476b54 100644
import Text.Hamlet (HamletSettings, defaultHamletSettings)
import Data.Maybe (catMaybes)
import Data.Default (Default (def))
-@@ -69,68 +65,8 @@ data TemplateLanguage = TemplateLanguage
+@@ -69,68 +65,7 @@ data TemplateLanguage = TemplateLanguage
, tlReload :: FilePath -> Q Exp
}
@@ -140,7 +143,7 @@ index 488312a..5476b54 100644
{ wfsLanguages :: HamletSettings -> [TemplateLanguage]
, wfsHamletSettings :: HamletSettings
}
-
+-
-instance Default WidgetFileSettings where
- def = WidgetFileSettings defaultTemplateLanguages defaultHamletSettings
-
@@ -159,7 +162,7 @@ index 488312a..5476b54 100644
- , func
- , " on "
- , show file
-- , ", but no templates were found."
+- , ", but no template were found."
- ]
- exps -> return $ DoE $ map NoBindS exps
- where
@@ -192,5 +195,5 @@ index 488312a..5476b54 100644
- else return $ Just ex
- else return Nothing
--
-2.1.4
+2.1.1