git-annex 5.20140831 → 5.20140915
raw patch · 78 files changed
+4602/−1977 lines, 78 filesdep +network-uridep ~network
Dependencies added: network-uri
Dependency ranges changed: network
Files
- Annex/Content.hs +1/−1
- Annex/Init.hs +12/−0
- Annex/Transfer.hs +3/−1
- Backend/WORM.hs +4/−6
- CHANGELOG +30/−0
- CmdLine/Seek.hs +1/−2
- Command/Sync.hs +16/−16
- Command/Unused.hs +6/−1
- Git/Objects.hs +14/−0
- Git/Remote.hs +7/−1
- Logs/Trust.hs +1/−15
- Logs/Trust/Basic.hs +32/−0
- Messages.hs +0/−14
- Remote/Git.hs +15/−3
- Remote/Rsync.hs +1/−1
- Test.hs +2/−8
- Types/GitConfig.hs +2/−0
- Types/Messages.hs +1/−4
- Utility/Bloom.hs +2/−2
- debian/changelog +30/−0
- doc/backends.mdwn +1/−1
- doc/bugs/Assistant_removed_all_references_to_files.mdwn +1305/−0
- doc/bugs/Bloom_filter_capacity_too_large_to_represent.mdwn +44/−0
- doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths.mdwn +1/−0
- doc/bugs/Visual_glitch_while_xmpp_pairing.mdwn +2/−0
- doc/bugs/Windows_build_has_hardcoded_paths.mdwn +14/−0
- doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn +3/−0
- doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn +30/−0
- doc/bugs/annex-rsync-transport_ignored.mdwn +30/−0
- doc/bugs/annex_tries_to_start_old_binaray.mdwn +45/−0
- doc/bugs/box.com.mdwn +33/−0
- doc/bugs/cotinually_prompting_for_gpg_passphrase.mdwn +77/−0
- doc/bugs/ssh_over_IPv6.mdwn +9/−0
- doc/bugs/ssh_over_IPv6/comment_2_cfa63d226ae411551a728af5ab043491._comment +29/−0
- doc/bugs/too_many_open_files_on_OSX.mdwn +42/−0
- doc/bugs/webapp_missing_on_redhat.mdwn +7/−0
- doc/bugs/webapp_on_windows_7_64_bit_fail_to_add_server_repo.mdwn +66/−0
- doc/bugs/whereis_does_not_work_in_direct_mode.mdwn +2/−0
- doc/design/assistant/polls/Android_default_directory.mdwn +1/−1
- doc/design/metadata.mdwn +1/−1
- doc/design/roadmap.mdwn +2/−2
- doc/devblog/day_219__catching_up_and_looking_back.mdwn +109/−0
- doc/forum/Creating_a_more_secure_shared_encryption.mdwn +7/−0
- doc/forum/Git_remote__63_____40__bitbucket__44___github__41__.mdwn +1/−0
- doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__.mdwn +13/−0
- doc/forum/Move_unsynced_file_in_direct_mode.mdwn +97/−0
- doc/forum/SSH_remote_transfers_queued_but_no_movement.mdwn +3/−0
- doc/forum/Web_app_on_server_without_X11__63__.mdwn +3/−0
- doc/forum/Windows_installation_notes.mdwn +146/−0
- doc/forum/annex_merge_creates___34__synced__47____42____34___branches.mdwn +7/−0
- doc/forum/armhf_binary/comment_2_743ecf263d1ec1bc4f24e32c0a178f2b._comment +8/−0
- doc/forum/big_overhead.mdwn +44/−0
- doc/forum/big_overhead/comment_1_0c184520c30a89bd2604ab7c0eb7ac45._comment +8/−0
- doc/forum/big_overhead/comment_2_13a017c6c84511894ded2d89d86eb541._comment +10/−0
- doc/forum/big_overhead/comment_3_b4761cacc02396b5bdf34bcf3457cb91._comment +10/−0
- doc/forum/big_overhead/comment_4_633f8538f368220eaca82b8bbfe9b49d._comment +16/−0
- doc/forum/big_overhead/comment_5_599092b8d4f1fc8f378796328ef42931._comment +8/−0
- doc/forum/big_overhead/comment_6_adb4b4e7eb4dac7760f3425bae6cbbc2._comment +8/−0
- doc/forum/schedule_repository___91__expression__93__.mdwn +1/−0
- doc/git-annex.mdwn +14/−1
- doc/install/Windows.mdwn +2/−1
- doc/internals/comment_3_5a26ee5aab274f321a4ea6f8527f53bd._comment +12/−0
- doc/news/version_5.20140707.mdwn +0/−23
- doc/news/version_5.20140915.mdwn +27/−0
- doc/not.mdwn +1/−1
- doc/related_software.mdwn +2/−2
- doc/tips/emacs_integration.mdwn +2/−2
- doc/tips/megaannex/comment_2_c1158b7ec15646d64cae8215ce845642._comment +10/−0
- doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment +8/−0
- doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment +10/−0
- doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment +33/−0
- doc/todo/merge_in_ram___40__disk__41____63__.mdwn +3/−0
- git-annex.1 +13/−1
- git-annex.cabal +11/−2
- standalone/linux/install-haskell-packages +1/−2
- standalone/no-th/haskell-patches/file-embed_remove-TH.patch +11/−29
- standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch +2018/−1832
- templates/configurators/xmpp/buddylist.hamlet +1/−1
Annex/Content.hs view
@@ -377,7 +377,7 @@ ) {- Returns a file that contains an object's content,- - and an check to run after the transfer is complete.+ - and a check to run after the transfer is complete. - - In direct mode, it's possible for the file to change as it's being sent, - and the check detects this case and returns False.
Annex/Init.hs view
@@ -23,8 +23,11 @@ import qualified Git.Config import qualified Git.Construct import qualified Git.Types as Git+import qualified Git.Objects import qualified Annex.Branch import Logs.UUID+import Logs.Trust.Basic+import Types.TrustLevel import Annex.Version import Annex.UUID import Config@@ -70,6 +73,7 @@ Annex.Branch.create describeUUID u =<< genDescription mdescription +-- Everything except for uuid setup. initialize' :: Annex () initialize' = do checkFifoSupport@@ -87,6 +91,7 @@ switchHEADBack ) createInodeSentinalFile+ checkSharedClone uninitialize :: Annex () uninitialize = do@@ -242,3 +247,10 @@ where hasPreCommitHook = inRepo $ doesFileExist . hookFile preCommitHook hasDotGitHEAD = inRepo $ \r -> doesFileExist $ Git.localGitDir r </> "HEAD"++checkSharedClone :: Annex ()+checkSharedClone = whenM (inRepo Git.Objects.isSharedClone) $ do+ showSideAction "Repository was cloned with --shared; setting annex.hardlink=true and making repository untrusted."+ u <- getUUID+ trustSet u UnTrusted+ setConfig (annexConfig "hardlink") (Git.Config.boolConfig True)
Annex/Transfer.hs view
@@ -85,7 +85,9 @@ locked <- catchMaybeIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0) if isNothing locked- then return (Nothing, True)+ then do+ closeFd fd+ return (Nothing, True) else do void $ tryIO $ writeTransferInfoFile info tfile return (mfd, False)
Backend/WORM.hs view
@@ -12,6 +12,7 @@ import Types.Key import Types.KeySource import Backend.Utilities+import Git.FilePath backends :: [Backend] backends = [backend]@@ -27,16 +28,13 @@ } {- The key includes the file size, modification time, and the- - basename of the filename.- -- - That allows multiple files with the same names to have different keys,- - while also allowing a file to be moved around while retaining the- - same key.+ - original filename relative to the top of the git repository. -} keyValue :: KeySource -> Annex (Maybe Key) keyValue source = do stat <- liftIO $ getFileStatus $ contentLocation source- n <- genKeyName $ takeFileName $ keyFilename source+ relf <- getTopFilePath <$> inRepo (toTopFilePath $ keyFilename source)+ n <- genKeyName relf return $ Just $ stubKey { keyName = n , keyBackendName = name backend
CHANGELOG view
@@ -1,3 +1,33 @@+git-annex (5.20140915) unstable; urgency=medium++ * New annex.hardlink setting. Closes: #758593+ * init: Automatically detect when a repository was cloned with --shared,+ and set annex.hardlink=true, as well as marking the repository as+ untrusted.+ * Fix parsing of ipv6 address in git remote address when it was not+ formatted as an url.+ * The annex-rsync-transport configuration is now also used when checking+ if a key is present on a rsync remote, and when dropping a key from+ the remote.+ * Promote file not found warning message to an error.+ * Fix transfer lock file FD leak that could occur when two separate+ git-annex processes were both working to perform the same set of+ transfers.+ * sync: Ensure that pending changes to git-annex branch are committed+ before push when in direct mode. (Fixing a very minor reversion.)+ * WORM backend: Switched to include the relative path to the file inside+ the repository, rather than just the file's base name. Note that if you're+ relying on such things to keep files separate with WORM, you should really+ be using a better backend.+ * Rather than crashing when there's a problem with the requested bloomfilter+ capacity/accuracy, fall back to a reasonable default bloom filter size.+ * Fix build with optparse-applicative 0.10. Closes: #761484+ * webapp: Fixed visual glitch in xmpp pairing that was reported live by a+ user who tracked me down in front of a coffee cart in Portland. + (New bug reporting method of choice?)++ -- Joey Hess <joeyh@debian.org> Mon, 15 Sep 2014 10:45:00 -0400+ git-annex (5.20140831) unstable; urgency=medium * Make --help work when not in a git repository. Closes: #758592
CmdLine/Seek.hs view
@@ -189,10 +189,9 @@ seekHelper a params = do ll <- inRepo $ \g -> runSegmentPaths (\fs -> Git.Command.leaveZombie <$> a fs g) params- {- Show warnings only for files/directories that do not exist. -} forM_ (map fst $ filter (null . snd) $ zip params ll) $ \p -> unlessM (isJust <$> liftIO (catchMaybeIO $ getSymbolicLinkStatus p)) $- fileNotFound p+ error $ p ++ " not found" return $ concat ll notSymlink :: FilePath -> IO Bool
Command/Sync.hs view
@@ -122,22 +122,22 @@ fastest = fromMaybe [] . headMaybe . Remote.byCost commit :: CommandStart-commit = next $ next $ ifM isDirect- ( do- showStart "commit" ""- void stageDirect- void preCommitDirect- commitStaged Git.Branch.ManualCommit commitmessage- , do- showStart "commit" ""- Annex.Branch.commit "update"- inRepo $ Git.Branch.commitQuiet Git.Branch.ManualCommit- [ Param "-a"- , Param "-m"- , Param commitmessage- ]- return True- )+commit = next $ next $ do+ showStart "commit" ""+ Annex.Branch.commit "update"+ ifM isDirect+ ( do+ void stageDirect+ void preCommitDirect+ commitStaged Git.Branch.ManualCommit commitmessage+ , do+ inRepo $ Git.Branch.commitQuiet Git.Branch.ManualCommit+ [ Param "-a"+ , Param "-m"+ , Param commitmessage+ ]+ return True+ ) where commitmessage = "git-annex automatic sync"
Command/Unused.hs view
@@ -189,7 +189,12 @@ bloomBitsHashes = do capacity <- bloomCapacity accuracy <- bloomAccuracy- return $ suggestSizing capacity (1/ fromIntegral accuracy)+ case safeSuggestSizing capacity (1 / fromIntegral accuracy) of+ Left e -> do+ warning $ "bloomfilter " ++ e ++ "; falling back to sane value"+ -- precaulculated value for 500000 (1/1000)+ return (8388608,10)+ Right v -> return v {- Creates a bloom filter, and runs an action, such as withKeysReferenced, - to populate it.
Git/Objects.hs view
@@ -33,3 +33,17 @@ looseObjectFile r sha = objectsDir r </> prefix </> rest where (prefix, rest) = splitAt 2 (fromRef sha)++listAlternates :: Repo -> IO [FilePath]+listAlternates r = catchDefaultIO [] (lines <$> readFile alternatesfile)+ where+ alternatesfile = objectsDir r </> "info" </> "alternates"++{- A repository recently cloned with --shared will have one or more+ - alternates listed, and contain no loose objects or packs. -}+isSharedClone :: Repo -> IO Bool+isSharedClone r = allM id+ [ not . null <$> listAlternates r+ , null <$> listLooseObjectShas r+ , null <$> listPackFiles r+ ]
Git/Remote.hs view
@@ -102,7 +102,13 @@ && not ("::" `isInfixOf` v) scptourl v = "ssh://" ++ host ++ slash dir where- (host, dir) = separate (== ':') v+ (host, dir)+ -- handle ipv6 address inside []+ | "[" `isPrefixOf` v = case break (== ']') v of+ (h, ']':':':d) -> (h ++ "]", d)+ (h, ']':d) -> (h ++ "]", d)+ (h, d) -> (h, d)+ | otherwise = separate (== ':') v slash d | d == "" = "/~/" ++ d | "/" `isPrefixOf` d = d | "~" `isPrefixOf` d = '/':d
Logs/Trust.hs view
@@ -11,7 +11,6 @@ TrustLevel(..), trustGet, trustMap,- trustSet, trustPartition, trustExclude, lookupTrust,@@ -20,17 +19,15 @@ ) where import qualified Data.Map as M-import Data.Time.Clock.POSIX import Common.Annex import Types.TrustLevel import qualified Annex.Branch import qualified Annex import Logs-import Logs.UUIDBased import Remote.List import qualified Types.Remote-import Logs.Trust.Pure as X+import Logs.Trust.Basic as X {- Returns a list of UUIDs that the trustLog indicates have the - specified trust level.@@ -38,17 +35,6 @@ - the default. -} trustGet :: TrustLevel -> Annex [UUID] trustGet level = M.keys . M.filter (== level) <$> trustMap--{- Changes the trust level for a uuid in the trustLog. -}-trustSet :: UUID -> TrustLevel -> Annex ()-trustSet uuid@(UUID _) level = do- ts <- liftIO getPOSIXTime- Annex.Branch.change trustLog $- showLog showTrustLog .- changeLog ts uuid level .- parseLog (Just . parseTrustLog)- Annex.changeState $ \s -> s { Annex.trustmap = Nothing }-trustSet NoUUID _ = error "unknown UUID; cannot modify" {- Returns the TrustLevel of a given repo UUID. -} lookupTrust :: UUID -> Annex TrustLevel
+ Logs/Trust/Basic.hs view
@@ -0,0 +1,32 @@+{- git-annex trust log, basics+ -+ - Copyright 2010-2012 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Logs.Trust.Basic (+ module X,+ trustSet,+) where++import Data.Time.Clock.POSIX++import Common.Annex+import Types.TrustLevel+import qualified Annex.Branch+import qualified Annex+import Logs+import Logs.UUIDBased+import Logs.Trust.Pure as X++{- Changes the trust level for a uuid in the trustLog. -}+trustSet :: UUID -> TrustLevel -> Annex ()+trustSet uuid@(UUID _) level = do+ ts <- liftIO getPOSIXTime+ Annex.Branch.change trustLog $+ showLog showTrustLog .+ changeLog ts uuid level .+ parseLog (Just . parseTrustLog)+ Annex.changeState $ \s -> s { Annex.trustmap = Nothing }+trustSet NoUUID _ = error "unknown UUID; cannot modify"
Messages.hs view
@@ -25,7 +25,6 @@ showErr, warning, warningIO,- fileNotFound, indent, maybeShowJSON, showFullJSON,@@ -45,7 +44,6 @@ import System.Log.Formatter import System.Log.Handler (setFormatter, LogHandler) import System.Log.Handler.Simple-import qualified Data.Set as S import Common hiding (handle) import Types@@ -171,18 +169,6 @@ putStr "\n" hFlush stdout hPutStrLn stderr w--{- Displays a warning one time about a file the user specified not existing. -}-fileNotFound :: FilePath -> Annex ()-fileNotFound file = do- st <- Annex.getState Annex.output- let shown = fileNotFoundShown st- when (S.notMember file shown) $ do- let shown' = S.insert file shown- let st' = st { fileNotFoundShown = shown' }- Annex.changeState $ \s -> s { Annex.output = st' }- liftIO $ hPutStrLn stderr $ unwords- [ "git-annex:", file, "not found" ] indent :: String -> String indent = intercalate "\n" . map (\l -> " " ++ l) . lines
Remote/Git.hs view
@@ -355,15 +355,27 @@ | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) (return False) $ do params <- Ssh.rsyncParams r Download u <- getUUID+ hardlink <- annexHardLink <$> Annex.getGitConfig -- run copy from perspective of remote onLocal r $ do ensureInitialized v <- Annex.Content.prepSendAnnex key case v of Nothing -> return False- Just (object, checksuccess) ->- runTransfer (Transfer Download u key) file noRetry- (rsyncOrCopyFile params object dest)+ Just (object, checksuccess) -> do+ let copier = rsyncOrCopyFile params object dest+#ifndef mingw32_HOST_OS+ let linker = createLink object dest >> return True+ go <- ifM (pure hardlink <&&> not <$> isDirect)+ ( return $ \m -> liftIO (catchBoolIO linker)+ <||> copier m+ , return copier+ )+#else+ let go = copier+#endif+ runTransfer (Transfer Download u key)+ file noRetry go <&&> checksuccess | Git.repoIsSsh (repo r) = feedprogressback $ \feeder -> do direct <- isDirect
Remote/Rsync.hs view
@@ -92,7 +92,7 @@ genRsyncOpts :: RemoteConfig -> RemoteGitConfig -> [CommandParam] -> RsyncUrl -> RsyncOpts genRsyncOpts c gc transport url = RsyncOpts { rsyncUrl = url- , rsyncOptions = opts []+ , rsyncOptions = transport ++ opts [] , rsyncUploadOptions = transport ++ opts (remoteAnnexRsyncUploadOptions gc) , rsyncDownloadOptions = transport ++ opts (remoteAnnexRsyncDownloadOptions gc) , rsyncShellEscape = M.lookup "shellescape" c /= Just "no"
Test.hs view
@@ -17,9 +17,6 @@ import Data.Monoid import Options.Applicative hiding (command)-#if MIN_VERSION_optparse_applicative(0,8,0)-import qualified Options.Applicative.Types as Opt-#endif import qualified Data.Map as M import qualified Text.JSON @@ -115,16 +112,13 @@ exitFailure ) where- progdesc = "git-annex test" parseOpts pprefs pinfo args = #if MIN_VERSION_optparse_applicative(0,8,0)- pure $ case execParserPure pprefs pinfo args of- Opt.Success v -> v- Opt.Failure f -> error $ fst $ Opt.execFailure f progdesc- Opt.CompletionInvoked _ -> error "completion not supported"+ handleParseResult $ execParserPure pprefs pinfo args #else either (error <=< flip errMessage progdesc) return $ execParserPure pprefs pinfo args+ progdesc = "git-annex test" #endif ingredients :: [Ingredient]
Types/GitConfig.hs view
@@ -52,6 +52,7 @@ , annexGenMetaData :: Bool , annexListen :: Maybe String , annexStartupScan :: Bool+ , annexHardLink :: Bool , coreSymlinks :: Bool , gcryptId :: Maybe String }@@ -87,6 +88,7 @@ , annexGenMetaData = getbool (annex "genmetadata") False , annexListen = getmaybe (annex "listen") , annexStartupScan = getbool (annex "startupscan") True+ , annexHardLink = getbool (annex "hardlink") False , coreSymlinks = getbool "core.symlinks" True , gcryptId = getmaybe "core.gcrypt-id" }
Types/Messages.hs view
@@ -7,8 +7,6 @@ module Types.Messages where -import qualified Data.Set as S- data OutputType = NormalOutput | QuietOutput | JSONOutput data SideActionBlock = NoBlock | StartBlock | InBlock@@ -17,8 +15,7 @@ data MessageState = MessageState { outputType :: OutputType , sideActionBlock :: SideActionBlock- , fileNotFoundShown :: S.Set FilePath } defaultMessageState :: MessageState-defaultMessageState = MessageState NormalOutput NoBlock S.empty+defaultMessageState = MessageState NormalOutput NoBlock
Utility/Bloom.hs view
@@ -9,7 +9,7 @@ module Utility.Bloom ( Bloom,- suggestSizing,+ safeSuggestSizing, Hashable, cheapHashes, notElemB,@@ -25,7 +25,7 @@ #else import qualified Data.BloomFilter as Bloom #endif-import Data.BloomFilter.Easy (suggestSizing, Bloom)+import Data.BloomFilter.Easy (safeSuggestSizing, Bloom) import Data.BloomFilter.Hash (Hashable, cheapHashes) import Control.Monad.ST.Safe (ST)
debian/changelog view
@@ -1,3 +1,33 @@+git-annex (5.20140915) unstable; urgency=medium++ * New annex.hardlink setting. Closes: #758593+ * init: Automatically detect when a repository was cloned with --shared,+ and set annex.hardlink=true, as well as marking the repository as+ untrusted.+ * Fix parsing of ipv6 address in git remote address when it was not+ formatted as an url.+ * The annex-rsync-transport configuration is now also used when checking+ if a key is present on a rsync remote, and when dropping a key from+ the remote.+ * Promote file not found warning message to an error.+ * Fix transfer lock file FD leak that could occur when two separate+ git-annex processes were both working to perform the same set of+ transfers.+ * sync: Ensure that pending changes to git-annex branch are committed+ before push when in direct mode. (Fixing a very minor reversion.)+ * WORM backend: Switched to include the relative path to the file inside+ the repository, rather than just the file's base name. Note that if you're+ relying on such things to keep files separate with WORM, you should really+ be using a better backend.+ * Rather than crashing when there's a problem with the requested bloomfilter+ capacity/accuracy, fall back to a reasonable default bloom filter size.+ * Fix build with optparse-applicative 0.10. Closes: #761484+ * webapp: Fixed visual glitch in xmpp pairing that was reported live by a+ user who tracked me down in front of a coffee cart in Portland. + (New bug reporting method of choice?)++ -- Joey Hess <joeyh@debian.org> Mon, 15 Sep 2014 10:45:00 -0400+ git-annex (5.20140831) unstable; urgency=medium * Make --help work when not in a git repository. Closes: #758592
doc/backends.mdwn view
@@ -13,7 +13,7 @@ * `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 basename, size, and modification time has the same content.+ 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. * `SHA512`, `SHA512E` -- Best SHA-2 hash, for the very paranoid.
+ doc/bugs/Assistant_removed_all_references_to_files.mdwn view
@@ -0,0 +1,1305 @@+### Please describe the problem.++Over the last few days, the assistant has recorded commits which have removed all the files from four (which is to say: all) of my local repositories. Two were direct mode, two indirect. All still had the actual file data saved still, so switching to indirect mode and reverting the relevant commits restored all my files. The two indirect repositories are synced with each other.++One of the direct repositories also got all of its refs scrambled, pointing to objects that don't exist. I reset that one to indirect mode, found a valid commit from a clone and reset master to that commit. The other I've yet to work on.++The iffy commits appear to have arrived just after the assistant auto-updated to 20140708.++### What steps will reproduce the problem?++I've not tried reproducing it.++### What version of git-annex are you using? On what operating system?++git-annex version: 5.20140708-g42df533+Fedora 20+I'm letting the assistant auto-update itself.++### Please provide any additional information below.++Here's a log for the indirect mode repo that's synced. I have two commits at 18:56:43, each removing half of the files.++[[!format text """+[2014-08-30 18:56:40 BST] main: starting assistant version 5.20140708-g42df533+[2014-08-30 18:56:40 BST] TransferScanner: Syncing with apollo +[2014-08-30 18:56:40 BST] UpgradeWatcher: Finished upgrading git-annex to version 5.20140708-g42df533 ++(scanning...) [2014-08-30 18:56:40 BST] Watcher: Performing startup scan+error: Ref refs/remotes/apollo/master is at cca3ca9633a98af7af4e029199b31768925298ed but expected efb22a8c5ff1c116ce43d99156112d4cafbdf967+From apollo.aylett.co.uk:Annex/Family+ ! efb22a8..cca3ca9 master -> apollo/master (unable to update local ref)+TransferScanner crashed: /home/axa/Annex/Family/.git/annex/merge/: getDirectoryContents: does not exist (No such file or directory)+[2014-08-30 18:56:41 BST] TransferScanner: warning TransferScanner crashed: /home/axa/Annex/Family/.git/annex/merge/: getDirectoryContents: does not exist (No such file or directory)++++(started...) [2014-08-30 18:56:43 BST] Committer: Committing changes to git+[2014-08-30 18:56:43 BST] Pusher: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ 6924eb5..a13c0cd git-annex -> synced/git-annex+ 5f56a47..972c8da annex/direct/master -> synced/master+fatal: Run with no arguments or with -c cmd+git-annex-shell: git-shell failed+[2014-08-30 18:56:50 BST] RemoteControl: warning Remote apollo needs its git-annex upgraded to 5.20140405 or newer+[2014-08-30 19:56:40 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 6924eb5..a13c0cd git-annex -> apollo/git-annex+To lizzie@apollo.aylett.co.uk:Annex/Family+ 04e7150..9095d13 annex/direct/master -> synced/master+error: duplicate parent 9095d132bb1bd6f03ba4494bcccec6973a322f1c ignored+[2014-08-30 20:56:42 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 5f56a47..9095d13 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 9095d13..1a1d324 annex/direct/master -> synced/master+error: duplicate parent 1a1d32492a093c00c7386de55be3fc25a9a56187 ignored+[2014-08-30 21:56:43 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 9095d13..1a1d324 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 1a1d324..225e820 annex/direct/master -> synced/master+error: duplicate parent 225e820c9e27db3d278101519932dc5c8b62b64e ignored+[2014-08-30 22:56:58 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 1a1d324..225e820 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 225e820..205376f annex/direct/master -> synced/master+error: duplicate parent 205376fa7f5027653ae3a0bd177562b033b2c06a ignored+[2014-08-30 23:57:05 BST] NetWatcherFallback: Syncing with apollo +ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing+From apollo.aylett.co.uk:Annex/Family+ 225e820..205376f master -> apollo/master+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-31 00:00:00 BST] Cronner: Consistency check in progress+[2014-08-31 00:27:29 BST] PushRetrier: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ 205376f..b74eb7b annex/direct/master -> synced/master+error: duplicate parent b74eb7b1ecc520850efdb304ba995b14b124692c ignored+[2014-08-31 00:57:29 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 205376f..b74eb7b master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ b74eb7b..cb1254d annex/direct/master -> synced/master+error: duplicate parent cb1254d5ab344a250675fbdaf5dec942636f6026 ignored+[2014-08-31 01:57:31 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ b74eb7b..cb1254d master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ cb1254d..8ad18dc annex/direct/master -> synced/master+error: duplicate parent 8ad18dcdf634a6c2aae224575b232c99c5b92a7c ignored+[2014-08-31 02:57:33 BST] NetWatcherFallback: Syncing with apollo +ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing+From apollo.aylett.co.uk:Annex/Family+ cb1254d..8ad18dc master -> apollo/master+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-08-31 03:27:55 BST] PushRetrier: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ 8ad18dc..868ab0f annex/direct/master -> synced/master+error: duplicate parent 868ab0f36977fb70ac2c8ddda86391289b6b0a3c ignored+[2014-08-31 03:57:55 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 8ad18dc..868ab0f master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 868ab0f..1eea08e annex/direct/master -> synced/master+error: duplicate parent 1eea08ee2340ccceb7554f8dd8fbae28edd0ee49 ignored+[2014-08-31 04:57:56 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 868ab0f..1eea08e master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 1eea08e..b542ca6 annex/direct/master -> synced/master+error: duplicate parent b542ca6756ba13377efa8884453c82eba71e27e6 ignored+[2014-08-31 05:57:59 BST] NetWatcherFallback: Syncing with apollo +ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing+From apollo.aylett.co.uk:Annex/Family+ 1eea08e..b542ca6 master -> apollo/master+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-08-31 06:28:01 BST] PushRetrier: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ b542ca6..0de348c annex/direct/master -> synced/master+error: duplicate parent 0de348caffaa453ce30e72ba2e240d8bbba34337 ignored+[2014-08-31 06:58:01 BST] NetWatcherFallback: Syncing with apollo +p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+gpg: Signature made Mon 18 Aug 2014 20:14:04 BST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+From apollo.aylett.co.uk:Annex/Family+ b542ca6..0de348c master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 0de348c..8467b09 annex/direct/master -> synced/master+error: duplicate parent 8467b0948d5e6e3dfb8375c4e84e7770ff9798e2 ignored+[2014-08-31 07:58:04 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 0de348c..8467b09 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 8467b09..3a56258 annex/direct/master -> synced/master+error: duplicate parent 3a56258c6b5b9551a61756c97c563720c87bf692 ignored+[2014-08-31 08:58:07 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 8467b09..3a56258 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 3a56258..122eb0d annex/direct/master -> synced/master+error: duplicate parent 122eb0dbc0e863d4f044a5e0c6eccd4f39dc6599 ignored+[2014-08-31 09:58:10 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 3a56258..122eb0d master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 122eb0d..46fbb4e annex/direct/master -> synced/master+error: duplicate parent 46fbb4e5a9d330cbf2fe68c329cb9f10bbba38d6 ignored+[2014-08-31 10:58:12 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 122eb0d..46fbb4e master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 46fbb4e..cca5e72 annex/direct/master -> synced/master+error: duplicate parent cca5e72784496181ade94e702533aa5c8e741309 ignored+[2014-08-31 11:58:14 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 46fbb4e..cca5e72 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ cca5e72..20f0c9d annex/direct/master -> synced/master+error: duplicate parent 20f0c9da173562c13c4bf109333c9f9787f3a23b ignored+[2014-08-31 12:58:17 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ cca5e72..20f0c9d master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 20f0c9d..3c9eb47 annex/direct/master -> synced/master+error: duplicate parent 3c9eb47d6ff77f1f7949b64e10d0378220ea95b7 ignored+[2014-08-31 13:58:19 BST] NetWatcherFallback: Syncing with apollo +ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing+From apollo.aylett.co.uk:Annex/Family+ 20f0c9d..3c9eb47 master -> apollo/master+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-08-31 14:28:21 BST] PushRetrier: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ 3c9eb47..87cbe02 annex/direct/master -> synced/master+error: duplicate parent 87cbe029cf1b65809cadf6067e9cdbd4ba695118 ignored+[2014-08-31 14:58:21 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 3c9eb47..87cbe02 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 87cbe02..71238f0 annex/direct/master -> synced/master+error: duplicate parent 71238f04ff0429c64d3f3bb24116860e0cc80129 ignored+[2014-08-31 15:58:23 BST] NetWatcherFallback: Syncing with apollo +ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing+From apollo.aylett.co.uk:Annex/Family+ 87cbe02..71238f0 master -> apollo/master+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-08-31 16:28:31 BST] PushRetrier: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ 71238f0..600343d annex/direct/master -> synced/master+error: duplicate parent 600343d16d98bb7dd84ffbb1e2c8f27a49bd0bfe ignored+[2014-08-31 16:58:31 BST] NetWatcherFallback: Syncing with apollo +git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-08-31 17:28:38 BST] PushRetrier: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ 600343d..50a6288 annex/direct/master -> synced/master+error: duplicate parent 50a6288026156f5956291ad1100bd420fdde564c ignored+[2014-08-31 17:58:38 BST] NetWatcherFallback: Syncing with apollo +git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-08-31 18:28:40 BST] PushRetrier: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ 50a6288..5b1813a annex/direct/master -> synced/master+error: duplicate parent 5b1813a8dbbd7ea4b17e230e927419f1d3230534 ignored+[2014-08-31 18:56:40 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok.+unused . (checking for unused data...) (checking HEAD...) (checking master...) (checking apollo/master...) (checking apollo/synced/master...) + Some annexed data is no longer used by any files:+ NUMBER KEY+ 1 SHA256E-s1103321--51418dc7fc654ebbeb9173bff598b4031d07d3c5cf651bd18a18ca6af9f7f1f7.jpg+ 2 SHA256E-s3754--39631a60a771a00e88ef5ab011ab3f56fa8e539619b06aa68e66f2c71f252f9f.png+ 3 SHA256E-s628641--2eeef2179787270c6307e1070678b6b27cbf0fe12cce71c136e0a89e1df78565.jpg+ 4 SHA256E-s848--66e696444c6e570fc00d79f6651018d7e6549585e587394b933dcb0d74d8c214.js+ 5 SHA256E-s21214--f26fa07b51fe0f4c5bc0d746f8b23e50115116bbcd80db057740bccb9841e4b6.png+ 6 SHA256E-s852198--9fcc545c030c268d660381fd33d66b06605f7c5df16dca0b3fbe4eddfbf6b339.jpg+ 7 SHA256E-s1334033--d6e722f76229c10ea6a1ff8dce2814ee42c92b643a19ec3f4d72222e1891c210.jpg+ 8 SHA256E-s664656--85aaeced38501abfec6d23591edb07d7ab98bbe303b98eb07cfa0577ec8309b2.jpg+ 9 SHA256E-s3213396--90e4ec9054de04c2b2c60a49b812582ba15c8da00208c9fc74acbc69b83182dc.JPG+ 10 SHA256E-s820026--c1fc64d12cc74f60f8d17302a95217978782ea99758bce99ea2233709be60a6d.jpg+ 11 SHA256E-s622679--5e8412b3955db206c6836fbd5731b0ab835aa325fc75bc7d75d4511ddbf67644.jpg+ 12 SHA256E-s917793--7f2ecba64196449b9d7f1ea79e07f496d90d59c59d12472d058566a0881a5c6c.jpg+ 13 SHA256E-s3493204--7ce9ad40b32b5cd1237e5efbb8f6885f7d734f8af65da8d0e92dc2de13162e07.JPG+ 14 SHA256E-s910114--be8d66d9261108572efe0266ae386fefa653cea4ef43be9fbd10f7e2fe8d1c4c.jpg+ 15 SHA256E-s636389--07b609b0cbf827a45cff2ca92367f3c5bf9a9527d4b3cb43961487bca8068ffd.jpg+ 16 SHA256E-s823401--4cf12d87a9034d34a3019b5002000c92512f901a82f1081705c12e73b5870bad.jpg+ 17 SHA256E-s1880--add7e1d7d7d98ff96afaec27bb066d6747551358e025176265a31b2b0f74bec0.log+ 18 SHA256E-s8784--e28377207d41b4fef538b2fcbbd25c05275103a299e74966a88dce53ad5f50c0+ 19 SHA256E-s8694--490b9f2f9c4c826b68bad68a50cf672ec36c58acb9e24fd46e84abaddec19b9b+ 20 SHA256E-s2656--96dd5f3d5f8e87ce1552798dd5fe4c8dedab6268c0df9e391a202ffdc4b8fa71.log+ 21 SHA256E-s459593--b68a62596f7524b6f877d8bd3dbbe49f4de02310e9dd6d5134bbdabfcd5d957a.jpg+ 22 SHA256E-s11931--5ce30bd4424d544ed954e4722d7ed590a5be46a267c5045953e034309d942a8f.odp+ 23 SHA256E-s1249581--d834f2dc34ded72086e26c32784e693597be011f28398635286394c7e8b5ded7.jpg+ 24 SHA256E-s335736--9638a3225f1adbdb736a2cacc476f8eb5201c8124b83dab887a26c6d3a0e5899.jpg+ 25 SHA256E-s6339776--f42083be1dba62acf81ad5ee8bccad47f267e2ce34c9e73e9aaafe3c69b462bd.pdf+ 26 SHA256E-s582899--858ad02a9e5f58a6f5ea509865831acd540c290837beb87b37cb36bb62a7b982.jpg+ 27 SHA256E-s2475657--d3fa5e460a2b164e849213d0417790704d1b4a2df9af5f6b281ac17dbacad30b.jpg+ 28 SHA256E-s637475--68315445dd9477f07a695cb9fd12bb2c95f3117d949665ec2690184ded6b1ee6.jpg+ 29 SHA256E-s77771--484ed3d8cc44de2db74c5680659c5c23ccb29ed5e99d0fb4b470a2c130c64c79.pdf+ 30 SHA256E-s2343639--a7fccfe9a2c8de20ce8df10048b075758c445e5f4c9d9b78368db179e74e9a47.jpg+ 31 SHA256E-s2282836--66e945f3a37651e1c88c58ff42b4dba9c6c5d822dc59f3e59895c336a0428c3d.jpg+ 32 SHA256E-s5902--da66d622f9ed0987a0466c2c05c2aea56572e2f991c542b1120d564fb7459e7b.log+ 33 SHA256E-s61410--4d3f0160bc92d0095a824baa17a08499dc748d06648029051802d24a772ba75d.css+ 34 SHA256E-s1958077--1717f3036e7ca6b61fe8eeb3ce319de728b9bea10fd814108b9e13397a336db5.jpg+ 35 SHA256E-s80930--f9b79963053221a10e32c4061b9da3622e89ce56aeed26c58f23bb70a2a57496.jpg+ 36 SHA256E-s4956--a05854e0d26affdbb3e171c8e9ca3f663c8bc930f6402d9a370104e239bc2601.log+ 37 SHA256E-s202851--3689503ce6f780d04e659fc85e4e7978c3c445afbd103f3ac118e1c6f3a4b738.jpg+ 38 SHA256E-s5258--a243d289f629eb2e321c7232aa59c65d10ec79e70d07f25758ac04c0b9ff3f79.log+ 39 SHA256E-s5406--dc07212d5aaaf5a320b3f9d710a72b68f7112140c76b43b7c0b4bb71f91e823f.log+ 40 SHA256E-s8427--439c4f2144c9ea726b739494565b05dc47b59a8835e24e9a083171efc0834fc1+ 41 SHA256E-s46--ca4a766fadecf16bbc25afbd805e2befbfb4cb270f122b0de813fbcfc933c1a2+ 42 SHA256E-s839129--921ddf15c906a0353cb18bdd0b321bd5a37dfe653edbffc8e3b6b47996d54d8f.jpg+ 43 SHA256E-s2922183--3aa5d5b22a980a11cee928ba701ffd389542db84fe96219442de1b33a64f840c.JPG+ 44 SHA256E-s1305363--0b14938c28492e288d35a62334d6436ba8edfb7f65a066dbd9587478f157ab99.jpg+ 45 SHA256E-s8602--819b18ca30f477f66e558ba1488a06e438a5f0b9c8f6987f68daad039d8020ca.png+ 46 SHA256E-s6205--14691e198b05dd68b5fe3ed39eb8739182f4f5e75dc43dd7ecb252f01978c7ed.png+ 47 SHA256E-s5070994--d0c5367647750b1f0b54c9fea7c7c9e1a0f7a0a7f61c92a688887538df3abf7f.m4v+ 48 SHA256E-s134807--7100078e84c39a2123c0ea7d713e3361c7174f21fb72d39dac2a99a4844f89b7.jpg+ 49 SHA256E-s535905--f317f11e4e0536ea8172e7827369bd9a3c887fcef2586b8eeda28b2dd36a791c.jpg+ 50 SHA256E-s6420--72622a4453f4ea48acc0337bb1b288e0fb034d1ee1aa74f98eb9062066c025b5+ 51 SHA256E-s51483--c9fba5eb0b29216afd9b6f13dd2f351367b7bcd0c8eb93fa0a1b6a0ce4535d57.sla+ 52 SHA256E-s1957447--c3eddff4df50e1b0c5dc93f85e39acd24723013dd9b27b7b8a407eb5e55f1903.jpg+ 53 SHA256E-s5345--ee879c6bc3c3ac59f449a9d9f92ec9cc2d15dced1f166805a179b6874d190c25.png+ 54 SHA256E-s153751--c3fd0000f94ff9c44fef856ee440837fa4c228918ae70d0813d1635d50e6d4a0.odt+ 55 SHA256E-s682324--33a6a1b34570f9abe0516d9abceefe14aae4cdacc41dc3f30ca92222d545631f.jpg+ 56 SHA256E-s370109--a00b1c78753de6ae1d64a01d457b53a3572a9324a0facda4ec39a149d9adb37b.jpg+ 57 SHA256E-s310217--aa0c575a44cac4957e06cd8ed0b058a16454a7be7f32ec8e79c815be6057bfbd.jpg+ 58 SHA256E-s5798--61852a3ad168d4f27fe0f0e924e7418e838ae4363d85a64ebea80c9154e0c9a0.gif+ 59 SHA256E-s47071--f1a74e5f9a20776adbe88ac3092e5a20a69d254905c0f93aa0b95a1ad0a5ed00.sla+ 60 SHA256E-s988--b1f5fb3d38001b8bcf214158c6c7571f5aadb03093d2c307970a728edcb8012b+ 61 SHA256E-s1397011--b67c04c6c99ccc208734dd39e18d4304a4963ef36600d4adc5827df21bfcc260.jpg+ 62 SHA256E-s2124--1c64d2a60a40242432550ab3292e1ee38072481c36b8f028f75e3b4ea52fec29.log+ 63 SHA256E-s1640512--ccb4940713e190a9242b34e18896156733f36df909c7e399bfdfe36299bfa748.jpg+ 64 SHA256E-s484856--55f146177198dcd03069703c7b8bdf5c10cd7750aaf4b6f9af1946d72a9f9d23.jpg+ 65 SHA256E-s7031--88bedea3e75aff77858c63a6c30bb06180bd9167fd380d94f132486d6ffeddf4+ 66 SHA256E-s10100--1df9143f4c02f877ec891262bcbc407a9d4b960dd80c6826d5c1078012dc2614.js+ 67 SHA256E-s2454--778574fe7cae3bfc2a49cbe3be18ed313b049b6e0bc333cea80723ae2136f9c3.log+ 68 SHA256E-s63103--474c29d016927bd7dc42d992fc07c353148d393cfbd7c3e8193df91c3bb2d805.jpg+ 69 SHA256E-s245481--ba0e9ed8876970e0aad7e22aeaf4f7403e1ef6fca474e0b4e90837381c0b810f.js+ 70 SHA256E-s708--ab8f3c450c5c8944d6d91c35258b9da5ff4564b9b05b1e09ebbaa9b740d14aa4.log+ 71 SHA256E-s582241--fb565e6fa923f3265a9406abf566d5de7a8e062b1d9ccb8ba7ec61a902ea277e.jpg+ 72 SHA256E-s601517--fd4a4effd6c6b064be34910b36f1de8011bb3949d0f883a57ed4ca60eff6a642.jpg+ 73 SHA256E-s613354--0d78d51b5047055d9bd2727e01a7c73ec25bcb99925be26550f3b921054e336b.jpg+ 74 SHA256E-s20794--0ba2f6756001669bdf934f9d79e8fd1ccf2028130c33a0510279581ec9dfd73a.js+ 75 SHA256E-s654750--be05edd69e61fb5ebecbddc8c39ae9ebdbca5e94ee395f604bbd73910a7e40f9.jpg+ 76 SHA256E-s440--4e8500857e2b6a08a6922ca852ff4c9702e2397843011a14dee43d6e20c4f787.log+ 77 SHA256E-s72381--a170eff1ba771b3e4e769ab2974b8fb1f66cff07bf8b19561a97f9d7767b565a.jpg+ 78 SHA256E-s344661--21564a2da0f6b1ea6c4a39f4a96ba02680facb9d8a084d4fffa28b0e527c9fc8.jpg+ 79 SHA256E-s51248--f940d364ad2583a9ae3c0f777fd61406914daa1837ed8dd78f3461760c4ca747.sla+ 80 SHA256E-s502234--251053730579880833dc12058a6c689ba074f0a981331ec7eb685b69f08e292c.pdf+ 81 SHA256E-s3682--f75a95ae16e2f8a8e0a607782cf332dc34c1e317d473023cbd7f9915fa400d62+ 82 SHA256E-s3544--9b40beb44b624520a74057a82ae5e6adb18601e6c1fc7d8496bdd59e3b248945+ 83 SHA256E-s355156--7056bee290696e681cd3538e2ff2e740842bce032effe509f0919e888cc03ee4.jpg+ 84 SHA256E-s879539--12cc34616b2dda153890db0a724290fa01bd9dd664061a05c8d2c1039cd4cc3c.odg+ 85 SHA256E-s2051310--69387e84897ed700b6dd7c418fc3a7884a1e6e16a4267297b3effb95b02a7bc7.jpg+ 86 SHA256E-s620--eb69406700a3a6122cb532614f4ae6899d97409d76259820176f7ae77158684b.png+ 87 SHA256E-s693427--e20c50c86937800b14e2773d79eb63d13c0300781f8e71ee3947fb5a2fe98fe5.jpg+ 88 SHA256E-s87985--b89b279ca5dede3643e8a48402e9b112b1e1fdc14b3326c98cbdb32f9f7fa2cc.jpg+ 89 SHA256E-s35739--378d1bcb19c2742b8d344459a74f9b4ea44287c4e5cf046b80a46b209ea1ebbb.sla+ 90 SHA256E-s51515--d4805b60c6e0ea396dc157ca0e399ba355482f2a9696f31fdcf819aa176ea3e7.sla+ 91 SHA256E-s396738--5e18be640581ced943a676323c80dc283b15d3caf37b2bc2d0b05ceee1d178e5.jpg+ 92 SHA256E-s334295--7f97df9f93e42a2db9e9efb0aa34a2a9a6b9af49846e6a73f320ee151d535eed.jpg+ 93 SHA256E-s425513--0f6228a7466c12d1d0e4beda9825f17442b15286a5639e3a894a36d33497c77a.jpg+ 94 SHA256E-s114076--6a1822942964efa5531de2cae48d3fd69e71baca7ade38b7cbe23964637d4478.jpg+ 95 SHA256E-s118034--a8b1e6f81534106e9f4563dfe3f288e9425284fbaa74247065cf80448cdb216f.jpg+ 96 SHA256E-s639--4b491df2b47c2fd4dcfbb99b50ec1367e138c61216704490ada08cddd0d32fda.css+ 97 SHA256E-s734079--0602d1c85bca8508010ed03c2b1c26c88a8c759783f49d7f7b282b30837c6b32.jpg+ 98 SHA256E-s130889--751d2fa73ac74e17d2e82fc9a89b3d393028197790657aa075effc7c16b8f528.js+ 99 SHA256E-s485283--63716cdb8953a9318eb28953af25db2afa02251e6f152d487f5ab05f1d27930e.jpg+ 100 SHA256E-s59518--6a80f10665ad39dc27ee3a5727ebeee321a289dbc958916f9e6eda01f2703d25.jpg+ 101 SHA256E-s194--4c0fc707f629bcb314433fc700c6090c970d343adbb921f46084bdb08f99cf6e+ 102 SHA256E-s303--07ae4fec1962f2f83808ec861e477d5669dd71ff1089cb25a0e1da7b3ec9a5a6.css+ 103 SHA256E-s24519--3f3cba473c1818b2ce46a034fc323d528df85dd88d3f2ed411ad644a08ff9132+ 104 SHA256E-s316292--691e653f57643e579c261a827441e63ee3d8cf1f9ed5cdc43d861cf340510d34.pdf+ 105 SHA256E-s11916--88e5b1e2f5bd0f5c458abb41589028ef35dc75872abd7e04eee4a12ae7bfef38+ 106 SHA256E-s733240--fe7b7c77712b866c932d391f8305560d488d0e5515f3d9c890ddd11c96ff6069.odt+ 107 SHA256E-s4323950--c71e34a9fa2d1f54934d3caf829e4b5330811c2937d523f856d43cf5d92b7275.m4v+ 108 SHA256E-s475740--e2d4880b8561167dd91b57a666f3eba68931ae3546231d102469c76d341f560a.jpg+ 109 SHA256E-s574--5d1bd8763457376e0ff677895456f9aad26b6d85e15648696e9f4c77af104fee.png+ 110 SHA256E-s11608--f815f1bad38a05f27b1f7cd416236148fa79554ed2546a014afe148c0e427839.log+ 111 SHA256E-s3300--7164c4d91218528eedb0310af14927d4ce483889b53da24fdcc01fadae107fbd+ 112 SHA256E-s962958--9a81dba98b0b910641d035bf662b847fb4785ef2378bef7b2ae6713b1fbd903c.jpg+ 113 SHA256E-s845627--09f3e811c372a7ee936064d4c48c8b4f36db519a49a0b274f69e3da12a0e2ffe.jpg+ 114 SHA256E-s2380622--05725288b66460ff1befda38280dea4d05c5dff42818de7d64e619e12aebeaa0.jpg+ 115 SHA256E-s62795--a32762ee80e176ca1d7869cd5f68e7442327e1a861ed70290f2256179ebd844c.js+ 116 SHA256E-s3486--f148d21e252ab05ff7039fa276ee309e6d16d2ba7444043acc148b9986164162.log+ 117 SHA256E-s2393747--1ba6fc7f4d47ced145ceab80128e3ceaf8cfe8f2155b5e33e9273c736a81b910.jpg+ 118 SHA256E-s4611--bbc334899e27d8fe781f61e06be1c28852e618d1e2bd8b98de0aed7fb6106ad8.js+ 119 SHA256E-s826134--426211e056784356538d3ac80838e197e2cdf29742cd31db6a386ce7c05aa052.jpg+ 120 SHA256E-s1072403--87da8298b8c3c76bdfb8c96ac7dcb11349763067056eb0e1fadf5241fc134141.jpg+ 121 SHA256E-s51028--d6d044282ee1d1d8fc02130ac42ab1d7ee3a6a7e2987b78bb1062529019cf3e5.sla+ 122 SHA256E-s45783--35b9963b4a8bc3dbee5bbe827c2e18c795b8fce86bb1eb87c6b3b09327380f1f.js+ 123 SHA256E-s999195--c0fa3d678c9ebe118ea3fb1b664a2f63ccc792a7578fe921d0c299adf40d97f3.jpg+ 124 SHA256E-s96828--c5ebf871d1c98e5f49d15dc22131e483b514754ad86c6293c69b6d5aa3d44cf9.jpg+ 125 SHA256E-s159835--47a9ba3de62d6a4b11dd59a60b0047d3d377c224ceac85bfb6a81a972f25fff9.css+ 126 SHA256E-s9629--588e723593992acb553dd4f2c76a6993135b4f49e674358fae63ff06e145f07a+ 127 SHA256E-s39867--6e96f4658811bba2f27f930f764111501e438135d793e28fe7eacb6b10866e0d.js+ 128 SHA256E-s62332730--a2c804ddc66d8175fb5e187d17c904954f1e2cae634c4604ac363eb97d78f7e1.odt+ 129 SHA256E-s1711933--dd49df68da23021d3e9cc775e86bd5341dda6ba71714c8287872deb9416e051a.jpg+ 130 SHA256E-s290639--0803de7a02e9a4a1caca69b2a7b2c948e7faf2e4ef2bf3bcdaec148c0f26b842.pdf+ 131 SHA256E-s5799--fa90e9a478760bc12c2707962f2ea6b9ab213bc7d4b158f28f6739727ffe05e7.log+ 132 SHA256E-s11156--17ca703a57e9f02ebd71251ca8bdb6d82b71fa586deb034cd384b21a3818035a+ 133 SHA256E-s16171--47a7946e6364fa5ad3dc595105c79a4946f18cbef0818e72682d9304625ceab9.odt+ 134 SHA256E-s1962015--2eae4dfa79e014bf4468141bfac8c0065d1b05f2532758c6e68deedd297f22ee.jpg+ 135 SHA256E-s31268--560829df213299f5db9aeb0b31b40044300c34e92818680f422d0ddfe7602f2c.axd+ 136 SHA256E-s145407--c34c44643d9d0f7114cce8b31f3442a7b6392c4687af9ab97995bd30ddd3167c.pdf+ 137 SHA256E-s1773--8417f863ffa4a076dd2d8b5a63170bb0c5b83cf275d72245a79c31d94358fd20.log+ 138 SHA256E-s701838--3d7abfd8b091e4da1bb61881155c299b78ed693f128f1c693c7970bcbce4e8e0.jpg+ 139 SHA256E-s2089502--f4c9ec5dce63924cba6f77efd5e20b17cfc0f3c9ae45dce7bb0ecc5a10986205.jpg+ 140 SHA256E-s1085890--0346c7a329e7b80c7f93b8aa7de039bf322070ebac33cee6ade6fcc4a4f296be.jpg+ 141 SHA256E-s3998--e38f3a315b698a0e8ccfa395431393af757f882413cea8b4879b5b5993543f86.js+ 142 SHA256E-s7372--181699a3ca4be8bb0e9913fd96dc5c44ed8a790ea6ef2bb0fb285e741f2c46ab+ 143 SHA256E-s864279--364b4a4d0a30ddbf1164d5d3ded0702a4b016ffc27d26eb6005d96e68aa4f77f.jpg+ 144 SHA256E-s2941--7ca4f001618fda61146802286daf472c5daaaded2471e356a752b6a69834e7f7.log+ 145 SHA256E-s153049--5805df5cecdaa15a549bf7751b1d66f7455e71e2243709d9799f839e42d082f2.jpg+ 146 SHA256E-s542959--5823d605d7258bd813d09712fd124fd7c63f2cbdf46a9b52c3eb67eb7bb538bc.jpg+ 147 SHA256E-s45282--b20a77431de35f8e70867cfe520503528fb948d63f724ed90fc249994875b77a.jpg+ 148 SHA256E-s19556--e5bdba04d2a9d805c491778a742744d3007d38a23c9dc11cf8f6eab7b2dd0a1d.log+ 149 SHA256E-s392108--c9c76c131588fc29d588afed12d98b6b3a6aa0a9971ad368112bc0c2a603e70c.pdf+ 150 SHA256E-s8275--ff63b5b012ea62b178310424d817a8a77fb31151dd697659f85f23a6298cf28d+ 151 SHA256E-s1769251--7d0a2ec1652f1287884f6bd4e0df14106af271e81fc38cae5aac1357966ea672.pdf+ 152 SHA256E-s464748--aa63c72a4b064f91083228395e1391d970873ad1370900a468db154ed266d475.jpg+ 153 SHA256E-s6130263--3521b18281dba779713e600fde1a4d15568328baad6baf43cba1530df7165c5d.JPG+ 154 SHA256E-s494260--aeb91b314f3dee3580093e9610dacd5917265794b49acea9d80dfca83d56b88d.odt+ 155 SHA256E-s3362329--05fde815df42455fdc1b563ce41bf13d585135da628d01c5ffc9ca627c008225.jpg+ 156 SHA256E-s489239--d2ab01a94808613489205b7aa5d666cccfeac0a28b5a76ab18fc9fd9435dcabc.jpg+ 157 SHA256E-s482249--e4979b950d4633515316102d934115b1981c8adf5a14ea80bfda87e623af7989.jpg+ 158 SHA256E-s93506--3f44779fc3ce611f607c9cde2c114f6f038775485a677e17bcb6bb034e6ac888.jpg+ 159 SHA256E-s818--66d21ef5da07cc00768b23bb711ccc8e18b91c99ccad2084ec309f51e6c52db6.log+ 160 SHA256E-s171892--33f34e7d16851c2291d7495754505d391be4668883b43e4b9e587126c693b1d2.png+ 161 SHA256E-s278132--fca8b8bbcc0f9fe8addb57994c69a9c511b206c27424491809ab31aef86f21b4.jpg+ 162 SHA256E-s2418631--deb0aadf97aa49010ac3cab5f5299e2d68eeb5ecb4dd5de93316f23a714734f6.jpg+ 163 SHA256E-s125121--2b2cc905b8c05d4c7253a9c2b45a961df545842e4ce9d17e5248aa6240e77557.pdf+ 164 SHA256E-s199793--615ac75e6766d637d17159ebe3d48eedf27096e93b83efc159431da4d032e21b.axd+ 165 SHA256E-s223221--ca5f5160688546f422cf7d041e58f07d5d90e8359666e523a5af515baf0b2980.jpg+ 166 SHA256E-s1959724--2e44ed4b10ab3c1655b16335b901547713ac8d5c38d4ed3735bcbabb272242b5.jpg+ 167 SHA256E-s11609--df8dcf81585eccae95b7c4f0a0ba8c6fc4cfe90ebbf9657bd6a10320f7195e61+ 168 SHA256E-s483419--96cfd3b43e5b7bb1d6a5bc3f78d33e873fa36ee6e53c9f1de083f279c19c5f70.jpg+ 169 SHA256E-s560766--96f47b698f6502bc758e6d8b9b538368f8085d040306388bfd42d3026c465ff5.jpg+ 170 SHA256E-s3848--4d18299f8d8ef1bfbd7b206d419ef6f65cbd09a3ae999f3c7cc8496051b34080+ 171 SHA256E-s1141493--80b7a82ee4edc420c538c4a2a37fc9d80cce4c321f5a9a7fa7e66df0c9e3693c.jpg+ 172 SHA256E-s9726--14b5e76da3417f5f25f48c2a793aa50da9c920451495af7612b76d3c052d3f13.odt+ 173 SHA256E-s939529--43d05562e75f2477aa6d412d8a672ce7b6cf2890d4e1578bf88692aabfd0e70d.jpg+ 174 SHA256E-s888147--948ca59b827f77f75ea981b149a72df976aea360cd263d0f7c03275375a47232.jpg+ 175 SHA256E-s740710--f1e98c032815161aff44c8ccbb882af5cb234f91c4430cf91d01115649bc9aa5.jpg+ 176 SHA256E-s961257--e6b21901e268f6d0f3a38b43e5a06d8ad9ec0901f4c9639954da7ecf2ee4a666.jpg+ 177 SHA256E-s616645--bd10a26926e6cd0fd0ee6cf72692c92134b183927280a00a74e869bbeae8bde6.jpg+ 178 SHA256E-s47996--f862cbc7bea6fe4b5fe3a3af2b393973220a34975dd36a9d5f92b30d1db80acc.sla+ 179 SHA256E-s2396909--2e6d435cf96f81a3f3247f2d35b01701f8a46977e813745324ca5b40717fdea9.jpg+ 180 SHA256E-s180605--66c6df69bba4602100148ffd0f0a0ba0a14b74eaefb3b27708c6792d2b5cd09c.jpg+ 181 SHA256E-s721289--159f9398adde99e23b05c8c8c99aadd98b6a3a80afe5e3745ff37b0668fe4a24.jpg+ 182 SHA256E-s95559--0d932a11d465d523f85b17803d44fb0748459771b2cd843dbcfd677248abb0f5.jpg+ 183 SHA256E-s368166--98be96450123c166cf11f1763aa25040ffb1674f7267a4041cc1a4fbe8e433a1.jpg+ 184 SHA256E-s846--b3c9f5697bee76715237040d6ba5ff9f657dee2d882e36d818ed2ff50e8e0835.log+ 185 SHA256E-s581051--217882c3f655c62dd323afe0689c9485d0d09430d5356a63105632cce08ea88e.jpg+ 186 SHA256E-s586436--006bfd4f9697d8b64be920876bd8c0a40967b253806072ec09d2a630909826e4.jpg+ 187 SHA256E-s398620--1ab7d488bafe19941f33155959c1bbec199a86ef2334c08b75b450bc9f36a16b.jpg+ 188 SHA256E-s10457--0be429c323998556486e8f9977ccc980be3ba3920d5cc3bf16a6c7bb57b0fe3c+ 189 SHA256E-s83789--c286b21f977391efd38b5a5a341f9dbec4da611a16bc1d17d8ca71d49ad64d30.jpg+ 190 SHA256E-s321943--5e3983f4b43ae782b6f41c4f899027f1d55f78347e2106bc4c96e7f65c652918.jpg+ 191 SHA256E-s7518--be582d1ce8295d8c47e261eb7bd78a0e720e78dd58805808e9bf64ddfc3c4fe4+ 192 SHA256E-s6118--3ca5d8ca6cda3acc6c07c604f6880c017e6faa7dad4ba61e9aa956a9fa8b4b0d+ 193 SHA256E-s1086965--e170514a3651dda3313f4dcfdb9490f039a825b8349f74957a17313bdbcd7e8d.jpg+ 194 SHA256E-s10504--a57d3172d4a009a1a0d38993ea6dbe03fab6aa1ec429aa4aab563465b0dc43bd.js+ 195 SHA256E-s530445--7c8e603a03e17bb0c6440df6b695e557357527bc081871b51d0b5a61222dd674.jpg+ 196 SHA256E-s37480--ba3a0b04e4325bf0853c6201ecf7bb0fc08a0a13f5fdf0a4477c6a1f0cc82559.js+ 197 SHA256E-s394333--77f7debb969fd22698b60339ed0a0e98d9c43b8c74203528a02f6a185784e808.jpg+ 198 SHA256E-s568976--43c009e20c1b4b28d651c64ac1faa9ebd5e704bb975e2fb65ece83f4cb8867d2.jpg+ 199 SHA256E-s13813--4b4db06a82938c002539bc21d9285d63387e1a6241932c111c4f3992fa093092.axd+ 200 SHA256E-s2735--f73ac06c4be021a97a8c40f5371f0e62fd7094d863d9679407784c09c13ddd5b.log+ 201 SHA256E-s25176948--4493a4fd3160627db1fdd24c2a6bd402b544c495565815007c2d0d5093478d2a.odt+ 202 SHA256E-s596273--de2ec9fe99774ea6ce0a746a66888b71cfd744d3d97084439d054e58adebe709.jpg+ 203 SHA256E-s947995--956f7ec6d1c0c931c40e055fe21c2cfde8ef135f816052147406cb0c3ed0f948.jpg+ 204 SHA256E-s5283--5fbb8a58b8bf48ea0511c26b1b319f737df54e8e35f13b5d851dc7c0ce662458.png+ 205 SHA256E-s777575--c9fea606bc2e419967c550c43b5345bf7b08b43a81d0cdc561e048b94d536e10.jpg+ 206 SHA256E-s51496--36143df60284eae68573cb266a34a25f3c042bfd8314bdf0730c03a4fb81bb38.sla+ 207 SHA256E-s3013379--4f47c51193c043d2e81aa0bf46927a5f5c305625a09ac9034f9cb6e25ea2c6bc.jpg+ 208 SHA256E-s592379--4cea82764a163f6da9c6e63f553f82f119d5188d187c0747ee467a337f81446e.jpg+ 209 SHA256E-s8402--5b400d459743a01405d2d1ffc4d07651c36712caf9030e2a091e48f97c58a2bb.png+ 210 SHA256E-s662301--f0cf51849e330e861513bee59063450d14759055c67986e8a31dbbde0907a254.jpg+ 211 SHA256E-s1371822--0c85f348595f845e0076e52157fbb772a9d72a4821310c187b183370d7bb1b4c.jpg+ 212 SHA256E-s13445--460f9e3ea4f8a260af278d81c59faa45f16b2069b10030a8a253cd852f2e8e34.log+ 213 SHA256E-s19780--3f513b835cc3299a15178dae45cc523f1b06a1c13bd0e1c29f958027d3f5dc8a.axd+ 214 SHA256E-s311438--00b3cbd6de31a75e3a017c452099991f1ec09327efe9c6450012f6015eb6e1a4.jpg+ 215 SHA256E-s8942--e267fde4da4719de2c454d82f907796167f425510ea84098a39b425b69d2df5e+ 216 SHA256E-s845884--58974bcab0e36d65d606c1acf57e34e2e6f89872fbab65b9abf5250c632967a5.jpg+ 217 SHA256E-s331598--de52b228ad93c774d4dd1d41556ff27f7f03802378747807f324a9604e32ed66.jpg+ 218 SHA256E-s201837--d3f750f64687f347f0254d3c602a010ef71636a85f37954690d20bb6548437b1.jpg+ 219 SHA256E-s537652--aeaa479c57d39b3618006162c80e1c0eaa2cfa0b2a9a2c069a3d601bfe5b0706.jpg+ 220 SHA256E-s1174974--1d506c737c2dbde4aa286a2a25b22412c83edc5e55c3cc94fa38fb224677cf01.jpg+ 221 SHA256E-s7068886--945cfae8e22db1c96ec4cfa7b7de021c6bfe4d9e4961eeb2860716d6c8a57354.m4v+ 222 SHA256E-s684839--02293539aa97de6ab57e9caaec6998f4e64a08967d9f5f2c44581fb1df0acdd0.jpg+ 223 SHA256E-s371333--36110b44ea216b0166b023d09b52d0d32c3bdd01dafa857ed62e7c806be93193.jpg+ 224 SHA256E-s195249--21a08a5510bc88e85db2b5da660c61320ccd101a4b86cf3558618bbf37d659f0.jpg+ 225 SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.xcf+ 226 SHA256E-s26368--302de7e36ca407cf1441ab2d3fa855192c9d8b2e6a7ec04638d19db7056b7f2a.png+ 227 SHA256E-s965404--fd61bc28b2adfd4d2f175e02c662b7a71dc4b09880c8198795994e70f156c46d.jpg+ 228 SHA256E-s7254--2fcb58c8f60caadcb3e2d9e38921a49e470a9d854a55c89cb9c80f6ed0334669.csv+ 229 SHA256E-s482912--24330dbfb1d90882bf3f42e96c236f818913c343fd828992cd03ca84a3b9b2f5.jpg+ 230 SHA256E-s641334--bb06cea748a2feefa1a608635b83ed4311da1990275e32a9fd4549048c91a453.jpg+ 231 SHA256E-s1239159--2d15a6bf658d588697c5b3c2b1d1382450a40517779c32d435ff672e45539a5c.jpg+ 232 SHA256E-s2125768--a04f47c1fa5136fa397897bc907b6754a9598b37d34920250b8f70a87aaaa0b8.jpg+ 233 SHA256E-s3968--f4147a07111527be5bc7e9a5c83e3fd7ed871937167fc6d20fb7ee4d7059aa69.js+ 234 SHA256E-s462918--aa97a7f50f004dffdf444bb7f69e09c650c8987f52b5f4a0164c6acdeb4a8b28.jpg+ 235 SHA256E-s29501--67fa8330853830c4b29e05f96e6e3b6369ab908238e425e8faff4ac57e12bdb0.log+ 236 SHA256E-s158417--4058a56c1350032d640519f3aeb94ba27cd8e8b5afceb6d65e746af4f94777e0.pdf+ 237 SHA256E-s3437070--12a5bafa210aa79e9abb86c21032003c30c3a1eb5fce45a31488b6ff08db084d.jpg+ 238 SHA256E-s4373--12f64c274107733ae44f8ea9dc92e3ecf15400d98b3d76f9cc7e11527e4ed81a+ 239 SHA256E-s51497--218e86c2eb9ded51b764b5296cfff76bae4dca82e07a1602c9c597a1c34e98d7.sla+ 240 SHA256E-s4372--20e4d3e47c5fd381ffc31e6effbeb29eda97d6def773a3e42596501c6beb6317+ 241 SHA256E-s317548--cb605575ca9fab16501f2819b000d11bb06fbb2ad1f300cfba3d011e3e8e2ffc.pdf+ 242 SHA256E-s4960--c10e8c25e9b66e3ef77723373beae89e2fab1010c8b36ca329a3e9da20cbdc7e.log+ 243 SHA256E-s517805--9c14fd5e5da48efd9951b086c25c04a7c5427111ef2829543497e707f93fce99.jpg+ 244 SHA256E-s1857451--616661a96876b89472a69d32bd567aeeb95fa7da19ba4c3aa6a0ab237e2dcec3.jpg+ 245 SHA256E-s2760813--63d375f82234356889c6222a0162bdba3b7f5a1a0cb31e24c2c209f43fc2f37e.jpg+ 246 SHA256E-s832772--530816bf7c52c72e9b951289b5a35da753c66726d4e7bb2c2267faec6c8c263c.jpg+ 247 SHA256E-s4660164--2832a896d7af11fc35e1dd7ab527b0fdfeedf7ffe93bcce147381a8739c81298.JPG+ 248 SHA256E-s688782--71733ec7ffd2077ecf2973a739e4928be5824ad92034f64446a216cf513a1f29.jpg+ 249 SHA256E-s2876462--92eb9385b333bf9eb8ad56de86e46d1ba9b21c1166814e6f16e50e4a769936fc.odt+ 250 SHA256E-s496541--80d2e40f680dbd998b487e0ee8d479cb92741ec9c3e1f9d1d1d6d2f21a8cd795.jpg+ 251 SHA256E-s69339--97fe05a5b2c230c5b1fde5d18555aca13d12a35940d7d8c15249e7e80629aed6.jpg+ 252 SHA256E-s169446--5e1e9e262a58c5692f0d3c428fb71c0980311a88b474ffee95a5ea8cb5d5bf15.jpg+ 253 SHA256E-s2678100--a347450551a9055011016920280dd0a63dfc541f4f52f8ee78ef2b7a09afd46a.jpg+ 254 SHA256E-s87--5c2582459e3550daa4889fae41e3c8f6f4ad26dfa670502e4f516749aeac4113.png+ 255 SHA256E-s5798--c7167ef62bc21326b00d78b47d672bc25026eb6c7f3919fa47db2e7db8855ba9.gif+ 256 SHA256E-s53033--80840b2105a7a316a010ec3c3775031bef7fbdabbb7d3f6b7ece1a6253ef1b59.jpg+ 257 SHA256E-s7407--8ec4462ca6a05614378729bb20bb33c3b892bc943fd698389e44d959c4506843.log+ 258 SHA256E-s1189946--d23ba452e6e267d93f6233e885bd6f9e15b8ad1aea4c3d2368d901428df78970.jpg+ 259 SHA256E-s3447000--61a3bd3f7dda48544b67040012d6cd5999499d25e75dc34b82d11955d0fc9b6a.jpg+ 260 SHA256E-s3263208--69ad68aaad7058af8d14f7e4c03e5b52c9a78dbac7ffd33bd7bc5220c847d6bb.JPG+ 261 SHA256E-s1226280--d372b699459664c382f607ff56294df49e6d8d0fcab90b509337c347943357cf.jpg+ 262 SHA256E-s16890--12861c187e68e3591ccd5f708b935cc43bf25f5672daf50913e152c1c55e510c.png+ 263 SHA256E-s1092669--8e7f7431c487c6cff11ee9f7c8a87aa0d057b518e60bd2b92fd677e5c9a88313.jpg+ 264 SHA256E-s307511--5fad92167d8f9a7ed4076909a1540388cdae89df956e6011065526bfb10564a4.jpg+ 265 SHA256E-s8334--212df98aca1ee3d4f10539a786ad746f3856c2715e23d5cb816a2374b5e6c43c.png+ 266 SHA256E-s3375--2b403c31d4934895cccbe05556b0134bd4b78d4b873193d2b12a8893ab170681.txt+ 267 SHA256E-s691014--470d607465715a4c0735d74da75a5aafb5f6707b9d10a9a6a8c002f095f447e2.jpg+ 268 SHA256E-s680701--133c1dc67e394103d9f900cbf80ef508c7d7818edb23406c5f67f027a38093a4.jpg+ 269 SHA256E-s4024--b5d3e2bb6d51ff8ceb54f501035a5feebe7d5178d35b98abe9e41531bd2abd22+ 270 SHA256E-s1117--b7c94c25be8e78468071e78481641927450d754fd1bbd8d0d751f116d02b9ab3+ 271 SHA256E-s476926--ea981873de3e0ca8156ff710429894abbd8a51384b210cc142b074ec9b2c9ba0.jpg+ 272 SHA256E-s56655--7df6526b49b7aa986070db456b6a3a378c8aaaee8cb7c8892c154eecf401002a.com.htm+ 273 SHA256E-s2963--4fc53b3029a595b3b7f1f201eb4b7c2df78afc7e083abccd070c8e6fae79a661.txt+ 274 SHA256E-s761655--486ef18d41898ba80505d7630170305c4b58fa647786bd5447f20045bd6f3b2e.jpg+ 275 SHA256E-s1389414--3599c1a4da6a3b61cbc4dc431c436af9bf201b634fde2f99ddf54eae8c3590d5.jpg+ 276 SHA256E-s39678--bea819324e10bc288c75650e2196bebd5339952ce33574625ae5091ad749b63c.jpg+ 277 SHA256E-s47531--a91ecea2694b4b5c8daab84aa25c675f2f73dbfaa8ccfd581d6868b1e2568b7a.jpg+ 278 SHA256E-s4923--2f1b9afef156e9c7f4994106eda088868a992d92e66a5d601f77980fea80f777+ 279 SHA256E-s84101--bca6a8a9640b1ebfa8a2ba01b3a0f7ed20ad77fa5cbb5588d46ce75949fc38db.jpg+ 280 SHA256E-s1245742--d547d4a18279ec671be7869896c0b3e763cf8499c4dc28a62a49cd657fdf4200.jpg+ 281 SHA256E-s655461--f9b43d2794fe757d7cb61a704a01c85bc09eb20d70a1550d6934dec12f46f0bf.jpg+ 282 SHA256E-s137484--51fbe9bc815e41dfe22b9f9d4ed8f3ca98a8cb5cc7b81522b296d45b0279a413.jpg+ 283 SHA256E-s607392--ead4548b66ac3ab5c930cd89bd60de480184a4f23ffce9b5da24f9269b796283.jpg+ 284 SHA256E-s6888--405748982bbb3340eea34acbe45085ea62c80767866f0c76c355e4f94b969c7c.png+ 285 SHA256E-s4327767--eef5840e2f4294a125aaa3ed33f8ccc96c5c2c3e31cbee356013de354e628df9.pdf+ 286 SHA256E-s411064--4e5e5d477ccc542f78649e4b4ee6aa132bf79ae9aeb64a46cb45a7ee133eb2f7.pdf+ 287 SHA256E-s224149--204dbb62c5d5352c9b5baead124ecf52c6fffd49120343cc21bb10343353934e.jpg+ 288 SHA256E-s1333719--9d9ac54db47723755ee0d19731c0b2f4b40074d946da4a1e283a4904feea4534.jpg+ 289 SHA256E-s1889687--07b79ce21bf5ffe2d80f9878d338fcd63ddc92c5381eb3c290639c3e73a7b927.jpg+ 290 SHA256E-s686131--93ba1a21ff8cc7d9baa61a2af8407ccc8c1b22705a191e9f0a393d14ec95e232.jpg+ 291 SHA256E-s619954--3d900d39d16eca00287a0c4bbe20b46767867b5065260a4a1fa8444081998e25.jpg+ 292 SHA256E-s828309--f1d702dcb350cff7a3229fe62c4f0f4beb5f95ad2f00a6fd1bfb82549cd08129.jpg+ 293 SHA256E-s516404--0ca06e98fd119847c99bee56264a31ac99b36ae71136624018d308ff8c6a2e3d.jpg+ 294 SHA256E-s783842--0618e7c3ebc7ff8fcdff82b9fd227e8b83f491e8e1b96c2d0e566fc7fbea27ea.jpg+ 295 SHA256E-s20748--df0711c99c30b5fdcbfdd109c093f02f6a7f5196e7ffbc8e291bb2780c5735c0.css+ 296 SHA256E-s61739--387a27967c79b09e21d93f8a8b969dda930e8d26e9ce379c1d71718d4cc5a1df.jpg+ 297 SHA256E-s1461106--37222c3cd7a3af846c8aaed3a174a0a7e6f775ea4c08c4e2f792c6da724812b9.jpg+ (To see where data was previously used, try: git log --stat -S'KEY')+ + To remove unwanted data: git-annex dropunused NUMBER+ +ok+[2014-08-31 18:58:39 BST] NetWatcherFallback: Syncing with apollo +p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+gpg: Signature made Mon 18 Aug 2014 20:14:04 BST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-08-31 19:28:42 BST] PushRetrier: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ 5b1813a..68b2827 annex/direct/master -> synced/master+error: duplicate parent 68b28274ba1f0451a2e93ef4c2757ab795b920e6 ignored+[2014-08-31 19:58:41 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 71238f0..68b2827 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 68b2827..16f040e annex/direct/master -> synced/master+error: duplicate parent 16f040e9cd0bd085dd42e8869cc99d6982f8ea9c ignored+[2014-08-31 20:58:43 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 68b2827..16f040e master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 16f040e..e8ecdba annex/direct/master -> synced/master+error: duplicate parent e8ecdbace26ba300e7bf3f4b8237f8cf4d825955 ignored+[2014-08-31 21:58:46 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 16f040e..e8ecdba master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ e8ecdba..82f1c3d annex/direct/master -> synced/master+error: duplicate parent 82f1c3da446ea356933e764e4ab0f6533d8688f7 ignored+[2014-08-31 22:58:47 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ e8ecdba..82f1c3d master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 82f1c3d..1d82f6d annex/direct/master -> synced/master+error: duplicate parent 1d82f6dc915ff33c86f9001c50b7c60f212b80a4 ignored+[2014-08-31 23:58:50 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 82f1c3d..1d82f6d master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 1d82f6d..e6f51b1 annex/direct/master -> synced/master+error: duplicate parent e6f51b190fc3412b8c10988c2dd9f281014802f0 ignored+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress+[2014-09-01 00:00:00 BST] Cronner: Consistency check in progress+[2014-09-01 00:58:52 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 1d82f6d..e6f51b1 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ e6f51b1..e6d090c annex/direct/master -> synced/master+error: duplicate parent e6d090c41e0226cfb58bec304c1205b2fb2a738d ignored+[2014-09-01 01:58:54 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ e6f51b1..e6d090c master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ e6d090c..e21ddb1 annex/direct/master -> synced/master+error: duplicate parent e21ddb1bf0530ae415419ae15edeb1287ef6d9af ignored+[2014-09-01 02:58:57 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ e6d090c..e21ddb1 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ e21ddb1..03a2d0f annex/direct/master -> synced/master+error: duplicate parent 03a2d0fea214ae4a6acad0837587f5539f06efd8 ignored+[2014-09-01 03:58:59 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ e21ddb1..03a2d0f master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 03a2d0f..f062d0b annex/direct/master -> synced/master+error: duplicate parent f062d0ba684347871b780a4f0d5ff3e203329cdd ignored+[2014-09-01 04:59:01 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 03a2d0f..f062d0b master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ f062d0b..a695f4d annex/direct/master -> synced/master+error: duplicate parent a695f4dc83028907d2c9272f8cf8ec88d38049d6 ignored+[2014-09-01 05:59:03 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ f062d0b..a695f4d master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ a695f4d..7706c3b annex/direct/master -> synced/master+error: duplicate parent 7706c3bf24b8529bd248c7a4bfe817573bfa0368 ignored+[2014-09-01 06:59:05 BST] NetWatcherFallback: Syncing with apollo +p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+gpg: Signature made Sun 31 Aug 2014 21:52:56 BST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing+From apollo.aylett.co.uk:Annex/Family+ a695f4d..7706c3b master -> apollo/master+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-09-01 07:29:09 BST] PushRetrier: Syncing with apollo +To lizzie@apollo.aylett.co.uk:Annex/Family+ 7706c3b..6936dd7 annex/direct/master -> synced/master+error: duplicate parent 6936dd71b925b08dac26890cec58186fe0f5da89 ignored+[2014-09-01 07:59:09 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 7706c3b..6936dd7 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 6936dd7..dc51bb1 annex/direct/master -> synced/master+error: duplicate parent dc51bb1571c950330650a2881d443449bae64db1 ignored+[2014-09-01 18:38:55 BST] NetWatcher: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 6936dd7..dc51bb1 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ dc51bb1..8f55d1c annex/direct/master -> synced/master+error: duplicate parent 8f55d1ccbb0ee6d44e3176006abf71d76f80376d ignored+[2014-09-01 19:15:05 BST] NetWatcherFallback: Syncing with apollo +p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+gpg: Signature made Sun 31 Aug 2014 21:52:56 BST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+From apollo.aylett.co.uk:Annex/Family+ dc51bb1..8f55d1c master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 8f55d1c..6cfcfe7 annex/direct/master -> synced/master+error: duplicate parent 6cfcfe7d46e622dd1e28d7c0d182e8c5082d88df ignored+[2014-09-01 20:15:07 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 8f55d1c..6cfcfe7 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 6cfcfe7..0048860 annex/direct/master -> synced/master+error: duplicate parent 0048860fa55502c1c58d3e4d55d3a687a5fee1cb ignored+[2014-09-01 21:15:09 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 6cfcfe7..0048860 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 0048860..3092f0e annex/direct/master -> synced/master+error: duplicate parent 3092f0e9d36cfb780bf0eb4a667bfe6a8a7b3ba4 ignored+[2014-09-01 22:15:11 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 0048860..3092f0e master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 3092f0e..c2d3665 annex/direct/master -> synced/master+error: duplicate parent c2d3665970d928b3eb4b93c0a69f4f1533a01c84 ignored+[2014-09-01 23:15:13 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 3092f0e..c2d3665 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ c2d3665..0966032 annex/direct/master -> synced/master+error: duplicate parent 09660328b05c3eb55e78e5ec38d9d043cd6aa78a ignored+[2014-09-02 00:15:15 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ c2d3665..0966032 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 0966032..b4bd0aa annex/direct/master -> synced/master+error: duplicate parent b4bd0aae9a45c024247c5ea120970ede21d52b34 ignored+[2014-09-02 01:15:17 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 0966032..b4bd0aa master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ b4bd0aa..dff7898 annex/direct/master -> synced/master+error: duplicate parent dff789833ff9f83324c35d1892fb271e7f59b6f4 ignored+[2014-09-02 02:15:18 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ b4bd0aa..dff7898 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ dff7898..628cc98 annex/direct/master -> synced/master+error: duplicate parent 628cc98b8f571d27b1b7f671992d884be9bb776a ignored+[2014-09-02 03:15:20 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ dff7898..628cc98 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 628cc98..11f0e77 annex/direct/master -> synced/master+error: duplicate parent 11f0e7756811654bee5ab1ae57068ad4cfebe698 ignored+[2014-09-02 04:15:22 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 628cc98..11f0e77 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 11f0e77..fb4d2b8 annex/direct/master -> synced/master+error: duplicate parent fb4d2b8eda7b2a194d98cf841c63374bf46cc2e0 ignored+[2014-09-02 05:12:34 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok.+unused . (checking for unused data...) (checking HEAD...) (checking master...) (checking apollo/master...) (checking apollo/synced/master...) + Some annexed data is no longer used by any files:+ NUMBER KEY+ 1 SHA256E-s1103321--51418dc7fc654ebbeb9173bff598b4031d07d3c5cf651bd18a18ca6af9f7f1f7.jpg+ 2 SHA256E-s3754--39631a60a771a00e88ef5ab011ab3f56fa8e539619b06aa68e66f2c71f252f9f.png+ 3 SHA256E-s628641--2eeef2179787270c6307e1070678b6b27cbf0fe12cce71c136e0a89e1df78565.jpg+ 4 SHA256E-s848--66e696444c6e570fc00d79f6651018d7e6549585e587394b933dcb0d74d8c214.js+ 5 SHA256E-s21214--f26fa07b51fe0f4c5bc0d746f8b23e50115116bbcd80db057740bccb9841e4b6.png+ 6 SHA256E-s852198--9fcc545c030c268d660381fd33d66b06605f7c5df16dca0b3fbe4eddfbf6b339.jpg+ 7 SHA256E-s1334033--d6e722f76229c10ea6a1ff8dce2814ee42c92b643a19ec3f4d72222e1891c210.jpg+ 8 SHA256E-s664656--85aaeced38501abfec6d23591edb07d7ab98bbe303b98eb07cfa0577ec8309b2.jpg+ 9 SHA256E-s3213396--90e4ec9054de04c2b2c60a49b812582ba15c8da00208c9fc74acbc69b83182dc.JPG+ 10 SHA256E-s820026--c1fc64d12cc74f60f8d17302a95217978782ea99758bce99ea2233709be60a6d.jpg+ 11 SHA256E-s622679--5e8412b3955db206c6836fbd5731b0ab835aa325fc75bc7d75d4511ddbf67644.jpg+ 12 SHA256E-s917793--7f2ecba64196449b9d7f1ea79e07f496d90d59c59d12472d058566a0881a5c6c.jpg+ 13 SHA256E-s3493204--7ce9ad40b32b5cd1237e5efbb8f6885f7d734f8af65da8d0e92dc2de13162e07.JPG+ 14 SHA256E-s910114--be8d66d9261108572efe0266ae386fefa653cea4ef43be9fbd10f7e2fe8d1c4c.jpg+ 15 SHA256E-s636389--07b609b0cbf827a45cff2ca92367f3c5bf9a9527d4b3cb43961487bca8068ffd.jpg+ 16 SHA256E-s823401--4cf12d87a9034d34a3019b5002000c92512f901a82f1081705c12e73b5870bad.jpg+ 17 SHA256E-s1880--add7e1d7d7d98ff96afaec27bb066d6747551358e025176265a31b2b0f74bec0.log+ 18 SHA256E-s8784--e28377207d41b4fef538b2fcbbd25c05275103a299e74966a88dce53ad5f50c0+ 19 SHA256E-s8694--490b9f2f9c4c826b68bad68a50cf672ec36c58acb9e24fd46e84abaddec19b9b+ 20 SHA256E-s2656--96dd5f3d5f8e87ce1552798dd5fe4c8dedab6268c0df9e391a202ffdc4b8fa71.log+ 21 SHA256E-s459593--b68a62596f7524b6f877d8bd3dbbe49f4de02310e9dd6d5134bbdabfcd5d957a.jpg+ 22 SHA256E-s11931--5ce30bd4424d544ed954e4722d7ed590a5be46a267c5045953e034309d942a8f.odp+ 23 SHA256E-s1249581--d834f2dc34ded72086e26c32784e693597be011f28398635286394c7e8b5ded7.jpg+ 24 SHA256E-s335736--9638a3225f1adbdb736a2cacc476f8eb5201c8124b83dab887a26c6d3a0e5899.jpg+ 25 SHA256E-s6339776--f42083be1dba62acf81ad5ee8bccad47f267e2ce34c9e73e9aaafe3c69b462bd.pdf+ 26 SHA256E-s582899--858ad02a9e5f58a6f5ea509865831acd540c290837beb87b37cb36bb62a7b982.jpg+ 27 SHA256E-s2475657--d3fa5e460a2b164e849213d0417790704d1b4a2df9af5f6b281ac17dbacad30b.jpg+ 28 SHA256E-s637475--68315445dd9477f07a695cb9fd12bb2c95f3117d949665ec2690184ded6b1ee6.jpg+ 29 SHA256E-s77771--484ed3d8cc44de2db74c5680659c5c23ccb29ed5e99d0fb4b470a2c130c64c79.pdf+ 30 SHA256E-s2343639--a7fccfe9a2c8de20ce8df10048b075758c445e5f4c9d9b78368db179e74e9a47.jpg+ 31 SHA256E-s2282836--66e945f3a37651e1c88c58ff42b4dba9c6c5d822dc59f3e59895c336a0428c3d.jpg+ 32 SHA256E-s5902--da66d622f9ed0987a0466c2c05c2aea56572e2f991c542b1120d564fb7459e7b.log+ 33 SHA256E-s61410--4d3f0160bc92d0095a824baa17a08499dc748d06648029051802d24a772ba75d.css+ 34 SHA256E-s1958077--1717f3036e7ca6b61fe8eeb3ce319de728b9bea10fd814108b9e13397a336db5.jpg+ 35 SHA256E-s80930--f9b79963053221a10e32c4061b9da3622e89ce56aeed26c58f23bb70a2a57496.jpg+ 36 SHA256E-s4956--a05854e0d26affdbb3e171c8e9ca3f663c8bc930f6402d9a370104e239bc2601.log+ 37 SHA256E-s202851--3689503ce6f780d04e659fc85e4e7978c3c445afbd103f3ac118e1c6f3a4b738.jpg+ 38 SHA256E-s5258--a243d289f629eb2e321c7232aa59c65d10ec79e70d07f25758ac04c0b9ff3f79.log+ 39 SHA256E-s5406--dc07212d5aaaf5a320b3f9d710a72b68f7112140c76b43b7c0b4bb71f91e823f.log+ 40 SHA256E-s8427--439c4f2144c9ea726b739494565b05dc47b59a8835e24e9a083171efc0834fc1+ 41 SHA256E-s46--ca4a766fadecf16bbc25afbd805e2befbfb4cb270f122b0de813fbcfc933c1a2+ 42 SHA256E-s839129--921ddf15c906a0353cb18bdd0b321bd5a37dfe653edbffc8e3b6b47996d54d8f.jpg+ 43 SHA256E-s2922183--3aa5d5b22a980a11cee928ba701ffd389542db84fe96219442de1b33a64f840c.JPG+ 44 SHA256E-s1305363--0b14938c28492e288d35a62334d6436ba8edfb7f65a066dbd9587478f157ab99.jpg+ 45 SHA256E-s8602--819b18ca30f477f66e558ba1488a06e438a5f0b9c8f6987f68daad039d8020ca.png+ 46 SHA256E-s6205--14691e198b05dd68b5fe3ed39eb8739182f4f5e75dc43dd7ecb252f01978c7ed.png+ 47 SHA256E-s5070994--d0c5367647750b1f0b54c9fea7c7c9e1a0f7a0a7f61c92a688887538df3abf7f.m4v+ 48 SHA256E-s134807--7100078e84c39a2123c0ea7d713e3361c7174f21fb72d39dac2a99a4844f89b7.jpg+ 49 SHA256E-s535905--f317f11e4e0536ea8172e7827369bd9a3c887fcef2586b8eeda28b2dd36a791c.jpg+ 50 SHA256E-s6420--72622a4453f4ea48acc0337bb1b288e0fb034d1ee1aa74f98eb9062066c025b5+ 51 SHA256E-s51483--c9fba5eb0b29216afd9b6f13dd2f351367b7bcd0c8eb93fa0a1b6a0ce4535d57.sla+ 52 SHA256E-s1957447--c3eddff4df50e1b0c5dc93f85e39acd24723013dd9b27b7b8a407eb5e55f1903.jpg+ 53 SHA256E-s5345--ee879c6bc3c3ac59f449a9d9f92ec9cc2d15dced1f166805a179b6874d190c25.png+ 54 SHA256E-s153751--c3fd0000f94ff9c44fef856ee440837fa4c228918ae70d0813d1635d50e6d4a0.odt+ 55 SHA256E-s682324--33a6a1b34570f9abe0516d9abceefe14aae4cdacc41dc3f30ca92222d545631f.jpg+ 56 SHA256E-s370109--a00b1c78753de6ae1d64a01d457b53a3572a9324a0facda4ec39a149d9adb37b.jpg+ 57 SHA256E-s310217--aa0c575a44cac4957e06cd8ed0b058a16454a7be7f32ec8e79c815be6057bfbd.jpg+ 58 SHA256E-s5798--61852a3ad168d4f27fe0f0e924e7418e838ae4363d85a64ebea80c9154e0c9a0.gif+ 59 SHA256E-s47071--f1a74e5f9a20776adbe88ac3092e5a20a69d254905c0f93aa0b95a1ad0a5ed00.sla+ 60 SHA256E-s988--b1f5fb3d38001b8bcf214158c6c7571f5aadb03093d2c307970a728edcb8012b+ 61 SHA256E-s1397011--b67c04c6c99ccc208734dd39e18d4304a4963ef36600d4adc5827df21bfcc260.jpg+ 62 SHA256E-s2124--1c64d2a60a40242432550ab3292e1ee38072481c36b8f028f75e3b4ea52fec29.log+ 63 SHA256E-s1640512--ccb4940713e190a9242b34e18896156733f36df909c7e399bfdfe36299bfa748.jpg+ 64 SHA256E-s484856--55f146177198dcd03069703c7b8bdf5c10cd7750aaf4b6f9af1946d72a9f9d23.jpg+ 65 SHA256E-s7031--88bedea3e75aff77858c63a6c30bb06180bd9167fd380d94f132486d6ffeddf4+ 66 SHA256E-s10100--1df9143f4c02f877ec891262bcbc407a9d4b960dd80c6826d5c1078012dc2614.js+ 67 SHA256E-s2454--778574fe7cae3bfc2a49cbe3be18ed313b049b6e0bc333cea80723ae2136f9c3.log+ 68 SHA256E-s63103--474c29d016927bd7dc42d992fc07c353148d393cfbd7c3e8193df91c3bb2d805.jpg+ 69 SHA256E-s245481--ba0e9ed8876970e0aad7e22aeaf4f7403e1ef6fca474e0b4e90837381c0b810f.js+ 70 SHA256E-s708--ab8f3c450c5c8944d6d91c35258b9da5ff4564b9b05b1e09ebbaa9b740d14aa4.log+ 71 SHA256E-s582241--fb565e6fa923f3265a9406abf566d5de7a8e062b1d9ccb8ba7ec61a902ea277e.jpg+ 72 SHA256E-s601517--fd4a4effd6c6b064be34910b36f1de8011bb3949d0f883a57ed4ca60eff6a642.jpg+ 73 SHA256E-s613354--0d78d51b5047055d9bd2727e01a7c73ec25bcb99925be26550f3b921054e336b.jpg+ 74 SHA256E-s20794--0ba2f6756001669bdf934f9d79e8fd1ccf2028130c33a0510279581ec9dfd73a.js+ 75 SHA256E-s654750--be05edd69e61fb5ebecbddc8c39ae9ebdbca5e94ee395f604bbd73910a7e40f9.jpg+ 76 SHA256E-s440--4e8500857e2b6a08a6922ca852ff4c9702e2397843011a14dee43d6e20c4f787.log+ 77 SHA256E-s72381--a170eff1ba771b3e4e769ab2974b8fb1f66cff07bf8b19561a97f9d7767b565a.jpg+ 78 SHA256E-s344661--21564a2da0f6b1ea6c4a39f4a96ba02680facb9d8a084d4fffa28b0e527c9fc8.jpg+ 79 SHA256E-s51248--f940d364ad2583a9ae3c0f777fd61406914daa1837ed8dd78f3461760c4ca747.sla+ 80 SHA256E-s502234--251053730579880833dc12058a6c689ba074f0a981331ec7eb685b69f08e292c.pdf+ 81 SHA256E-s3682--f75a95ae16e2f8a8e0a607782cf332dc34c1e317d473023cbd7f9915fa400d62+ 82 SHA256E-s3544--9b40beb44b624520a74057a82ae5e6adb18601e6c1fc7d8496bdd59e3b248945+ 83 SHA256E-s355156--7056bee290696e681cd3538e2ff2e740842bce032effe509f0919e888cc03ee4.jpg+ 84 SHA256E-s879539--12cc34616b2dda153890db0a724290fa01bd9dd664061a05c8d2c1039cd4cc3c.odg+ 85 SHA256E-s2051310--69387e84897ed700b6dd7c418fc3a7884a1e6e16a4267297b3effb95b02a7bc7.jpg+ 86 SHA256E-s620--eb69406700a3a6122cb532614f4ae6899d97409d76259820176f7ae77158684b.png+ 87 SHA256E-s693427--e20c50c86937800b14e2773d79eb63d13c0300781f8e71ee3947fb5a2fe98fe5.jpg+ 88 SHA256E-s87985--b89b279ca5dede3643e8a48402e9b112b1e1fdc14b3326c98cbdb32f9f7fa2cc.jpg+ 89 SHA256E-s35739--378d1bcb19c2742b8d344459a74f9b4ea44287c4e5cf046b80a46b209ea1ebbb.sla+ 90 SHA256E-s51515--d4805b60c6e0ea396dc157ca0e399ba355482f2a9696f31fdcf819aa176ea3e7.sla+ 91 SHA256E-s396738--5e18be640581ced943a676323c80dc283b15d3caf37b2bc2d0b05ceee1d178e5.jpg+ 92 SHA256E-s334295--7f97df9f93e42a2db9e9efb0aa34a2a9a6b9af49846e6a73f320ee151d535eed.jpg+ 93 SHA256E-s425513--0f6228a7466c12d1d0e4beda9825f17442b15286a5639e3a894a36d33497c77a.jpg+ 94 SHA256E-s114076--6a1822942964efa5531de2cae48d3fd69e71baca7ade38b7cbe23964637d4478.jpg+ 95 SHA256E-s118034--a8b1e6f81534106e9f4563dfe3f288e9425284fbaa74247065cf80448cdb216f.jpg+ 96 SHA256E-s639--4b491df2b47c2fd4dcfbb99b50ec1367e138c61216704490ada08cddd0d32fda.css+ 97 SHA256E-s734079--0602d1c85bca8508010ed03c2b1c26c88a8c759783f49d7f7b282b30837c6b32.jpg+ 98 SHA256E-s130889--751d2fa73ac74e17d2e82fc9a89b3d393028197790657aa075effc7c16b8f528.js+ 99 SHA256E-s485283--63716cdb8953a9318eb28953af25db2afa02251e6f152d487f5ab05f1d27930e.jpg+ 100 SHA256E-s59518--6a80f10665ad39dc27ee3a5727ebeee321a289dbc958916f9e6eda01f2703d25.jpg+ 101 SHA256E-s194--4c0fc707f629bcb314433fc700c6090c970d343adbb921f46084bdb08f99cf6e+ 102 SHA256E-s303--07ae4fec1962f2f83808ec861e477d5669dd71ff1089cb25a0e1da7b3ec9a5a6.css+ 103 SHA256E-s24519--3f3cba473c1818b2ce46a034fc323d528df85dd88d3f2ed411ad644a08ff9132+ 104 SHA256E-s316292--691e653f57643e579c261a827441e63ee3d8cf1f9ed5cdc43d861cf340510d34.pdf+ 105 SHA256E-s11916--88e5b1e2f5bd0f5c458abb41589028ef35dc75872abd7e04eee4a12ae7bfef38+ 106 SHA256E-s733240--fe7b7c77712b866c932d391f8305560d488d0e5515f3d9c890ddd11c96ff6069.odt+ 107 SHA256E-s4323950--c71e34a9fa2d1f54934d3caf829e4b5330811c2937d523f856d43cf5d92b7275.m4v+ 108 SHA256E-s475740--e2d4880b8561167dd91b57a666f3eba68931ae3546231d102469c76d341f560a.jpg+ 109 SHA256E-s574--5d1bd8763457376e0ff677895456f9aad26b6d85e15648696e9f4c77af104fee.png+ 110 SHA256E-s11608--f815f1bad38a05f27b1f7cd416236148fa79554ed2546a014afe148c0e427839.log+ 111 SHA256E-s3300--7164c4d91218528eedb0310af14927d4ce483889b53da24fdcc01fadae107fbd+ 112 SHA256E-s962958--9a81dba98b0b910641d035bf662b847fb4785ef2378bef7b2ae6713b1fbd903c.jpg+ 113 SHA256E-s845627--09f3e811c372a7ee936064d4c48c8b4f36db519a49a0b274f69e3da12a0e2ffe.jpg+ 114 SHA256E-s2380622--05725288b66460ff1befda38280dea4d05c5dff42818de7d64e619e12aebeaa0.jpg+ 115 SHA256E-s62795--a32762ee80e176ca1d7869cd5f68e7442327e1a861ed70290f2256179ebd844c.js+ 116 SHA256E-s3486--f148d21e252ab05ff7039fa276ee309e6d16d2ba7444043acc148b9986164162.log+ 117 SHA256E-s2393747--1ba6fc7f4d47ced145ceab80128e3ceaf8cfe8f2155b5e33e9273c736a81b910.jpg+ 118 SHA256E-s4611--bbc334899e27d8fe781f61e06be1c28852e618d1e2bd8b98de0aed7fb6106ad8.js+ 119 SHA256E-s826134--426211e056784356538d3ac80838e197e2cdf29742cd31db6a386ce7c05aa052.jpg+ 120 SHA256E-s1072403--87da8298b8c3c76bdfb8c96ac7dcb11349763067056eb0e1fadf5241fc134141.jpg+ 121 SHA256E-s51028--d6d044282ee1d1d8fc02130ac42ab1d7ee3a6a7e2987b78bb1062529019cf3e5.sla+ 122 SHA256E-s45783--35b9963b4a8bc3dbee5bbe827c2e18c795b8fce86bb1eb87c6b3b09327380f1f.js+ 123 SHA256E-s999195--c0fa3d678c9ebe118ea3fb1b664a2f63ccc792a7578fe921d0c299adf40d97f3.jpg+ 124 SHA256E-s96828--c5ebf871d1c98e5f49d15dc22131e483b514754ad86c6293c69b6d5aa3d44cf9.jpg+ 125 SHA256E-s159835--47a9ba3de62d6a4b11dd59a60b0047d3d377c224ceac85bfb6a81a972f25fff9.css+ 126 SHA256E-s9629--588e723593992acb553dd4f2c76a6993135b4f49e674358fae63ff06e145f07a+ 127 SHA256E-s39867--6e96f4658811bba2f27f930f764111501e438135d793e28fe7eacb6b10866e0d.js+ 128 SHA256E-s62332730--a2c804ddc66d8175fb5e187d17c904954f1e2cae634c4604ac363eb97d78f7e1.odt+ 129 SHA256E-s1711933--dd49df68da23021d3e9cc775e86bd5341dda6ba71714c8287872deb9416e051a.jpg+ 130 SHA256E-s290639--0803de7a02e9a4a1caca69b2a7b2c948e7faf2e4ef2bf3bcdaec148c0f26b842.pdf+ 131 SHA256E-s5799--fa90e9a478760bc12c2707962f2ea6b9ab213bc7d4b158f28f6739727ffe05e7.log+ 132 SHA256E-s11156--17ca703a57e9f02ebd71251ca8bdb6d82b71fa586deb034cd384b21a3818035a+ 133 SHA256E-s16171--47a7946e6364fa5ad3dc595105c79a4946f18cbef0818e72682d9304625ceab9.odt+ 134 SHA256E-s1962015--2eae4dfa79e014bf4468141bfac8c0065d1b05f2532758c6e68deedd297f22ee.jpg+ 135 SHA256E-s31268--560829df213299f5db9aeb0b31b40044300c34e92818680f422d0ddfe7602f2c.axd+ 136 SHA256E-s145407--c34c44643d9d0f7114cce8b31f3442a7b6392c4687af9ab97995bd30ddd3167c.pdf+ 137 SHA256E-s1773--8417f863ffa4a076dd2d8b5a63170bb0c5b83cf275d72245a79c31d94358fd20.log+ 138 SHA256E-s701838--3d7abfd8b091e4da1bb61881155c299b78ed693f128f1c693c7970bcbce4e8e0.jpg+ 139 SHA256E-s2089502--f4c9ec5dce63924cba6f77efd5e20b17cfc0f3c9ae45dce7bb0ecc5a10986205.jpg+ 140 SHA256E-s1085890--0346c7a329e7b80c7f93b8aa7de039bf322070ebac33cee6ade6fcc4a4f296be.jpg+ 141 SHA256E-s3998--e38f3a315b698a0e8ccfa395431393af757f882413cea8b4879b5b5993543f86.js+ 142 SHA256E-s7372--181699a3ca4be8bb0e9913fd96dc5c44ed8a790ea6ef2bb0fb285e741f2c46ab+ 143 SHA256E-s864279--364b4a4d0a30ddbf1164d5d3ded0702a4b016ffc27d26eb6005d96e68aa4f77f.jpg+ 144 SHA256E-s2941--7ca4f001618fda61146802286daf472c5daaaded2471e356a752b6a69834e7f7.log+ 145 SHA256E-s153049--5805df5cecdaa15a549bf7751b1d66f7455e71e2243709d9799f839e42d082f2.jpg+ 146 SHA256E-s542959--5823d605d7258bd813d09712fd124fd7c63f2cbdf46a9b52c3eb67eb7bb538bc.jpg+ 147 SHA256E-s45282--b20a77431de35f8e70867cfe520503528fb948d63f724ed90fc249994875b77a.jpg+ 148 SHA256E-s19556--e5bdba04d2a9d805c491778a742744d3007d38a23c9dc11cf8f6eab7b2dd0a1d.log+ 149 SHA256E-s392108--c9c76c131588fc29d588afed12d98b6b3a6aa0a9971ad368112bc0c2a603e70c.pdf+ 150 SHA256E-s8275--ff63b5b012ea62b178310424d817a8a77fb31151dd697659f85f23a6298cf28d+ 151 SHA256E-s1769251--7d0a2ec1652f1287884f6bd4e0df14106af271e81fc38cae5aac1357966ea672.pdf+ 152 SHA256E-s464748--aa63c72a4b064f91083228395e1391d970873ad1370900a468db154ed266d475.jpg+ 153 SHA256E-s6130263--3521b18281dba779713e600fde1a4d15568328baad6baf43cba1530df7165c5d.JPG+ 154 SHA256E-s494260--aeb91b314f3dee3580093e9610dacd5917265794b49acea9d80dfca83d56b88d.odt+ 155 SHA256E-s3362329--05fde815df42455fdc1b563ce41bf13d585135da628d01c5ffc9ca627c008225.jpg+ 156 SHA256E-s489239--d2ab01a94808613489205b7aa5d666cccfeac0a28b5a76ab18fc9fd9435dcabc.jpg+ 157 SHA256E-s482249--e4979b950d4633515316102d934115b1981c8adf5a14ea80bfda87e623af7989.jpg+ 158 SHA256E-s93506--3f44779fc3ce611f607c9cde2c114f6f038775485a677e17bcb6bb034e6ac888.jpg+ 159 SHA256E-s818--66d21ef5da07cc00768b23bb711ccc8e18b91c99ccad2084ec309f51e6c52db6.log+ 160 SHA256E-s171892--33f34e7d16851c2291d7495754505d391be4668883b43e4b9e587126c693b1d2.png+ 161 SHA256E-s278132--fca8b8bbcc0f9fe8addb57994c69a9c511b206c27424491809ab31aef86f21b4.jpg+ 162 SHA256E-s2418631--deb0aadf97aa49010ac3cab5f5299e2d68eeb5ecb4dd5de93316f23a714734f6.jpg+ 163 SHA256E-s125121--2b2cc905b8c05d4c7253a9c2b45a961df545842e4ce9d17e5248aa6240e77557.pdf+ 164 SHA256E-s199793--615ac75e6766d637d17159ebe3d48eedf27096e93b83efc159431da4d032e21b.axd+ 165 SHA256E-s223221--ca5f5160688546f422cf7d041e58f07d5d90e8359666e523a5af515baf0b2980.jpg+ 166 SHA256E-s1959724--2e44ed4b10ab3c1655b16335b901547713ac8d5c38d4ed3735bcbabb272242b5.jpg+ 167 SHA256E-s11609--df8dcf81585eccae95b7c4f0a0ba8c6fc4cfe90ebbf9657bd6a10320f7195e61+ 168 SHA256E-s483419--96cfd3b43e5b7bb1d6a5bc3f78d33e873fa36ee6e53c9f1de083f279c19c5f70.jpg+ 169 SHA256E-s560766--96f47b698f6502bc758e6d8b9b538368f8085d040306388bfd42d3026c465ff5.jpg+ 170 SHA256E-s3848--4d18299f8d8ef1bfbd7b206d419ef6f65cbd09a3ae999f3c7cc8496051b34080+ 171 SHA256E-s1141493--80b7a82ee4edc420c538c4a2a37fc9d80cce4c321f5a9a7fa7e66df0c9e3693c.jpg+ 172 SHA256E-s9726--14b5e76da3417f5f25f48c2a793aa50da9c920451495af7612b76d3c052d3f13.odt+ 173 SHA256E-s939529--43d05562e75f2477aa6d412d8a672ce7b6cf2890d4e1578bf88692aabfd0e70d.jpg+ 174 SHA256E-s888147--948ca59b827f77f75ea981b149a72df976aea360cd263d0f7c03275375a47232.jpg+ 175 SHA256E-s740710--f1e98c032815161aff44c8ccbb882af5cb234f91c4430cf91d01115649bc9aa5.jpg+ 176 SHA256E-s961257--e6b21901e268f6d0f3a38b43e5a06d8ad9ec0901f4c9639954da7ecf2ee4a666.jpg+ 177 SHA256E-s616645--bd10a26926e6cd0fd0ee6cf72692c92134b183927280a00a74e869bbeae8bde6.jpg+ 178 SHA256E-s47996--f862cbc7bea6fe4b5fe3a3af2b393973220a34975dd36a9d5f92b30d1db80acc.sla+ 179 SHA256E-s2396909--2e6d435cf96f81a3f3247f2d35b01701f8a46977e813745324ca5b40717fdea9.jpg+ 180 SHA256E-s180605--66c6df69bba4602100148ffd0f0a0ba0a14b74eaefb3b27708c6792d2b5cd09c.jpg+ 181 SHA256E-s721289--159f9398adde99e23b05c8c8c99aadd98b6a3a80afe5e3745ff37b0668fe4a24.jpg+ 182 SHA256E-s95559--0d932a11d465d523f85b17803d44fb0748459771b2cd843dbcfd677248abb0f5.jpg+ 183 SHA256E-s368166--98be96450123c166cf11f1763aa25040ffb1674f7267a4041cc1a4fbe8e433a1.jpg+ 184 SHA256E-s846--b3c9f5697bee76715237040d6ba5ff9f657dee2d882e36d818ed2ff50e8e0835.log+ 185 SHA256E-s581051--217882c3f655c62dd323afe0689c9485d0d09430d5356a63105632cce08ea88e.jpg+ 186 SHA256E-s586436--006bfd4f9697d8b64be920876bd8c0a40967b253806072ec09d2a630909826e4.jpg+ 187 SHA256E-s398620--1ab7d488bafe19941f33155959c1bbec199a86ef2334c08b75b450bc9f36a16b.jpg+ 188 SHA256E-s10457--0be429c323998556486e8f9977ccc980be3ba3920d5cc3bf16a6c7bb57b0fe3c+ 189 SHA256E-s83789--c286b21f977391efd38b5a5a341f9dbec4da611a16bc1d17d8ca71d49ad64d30.jpg+ 190 SHA256E-s321943--5e3983f4b43ae782b6f41c4f899027f1d55f78347e2106bc4c96e7f65c652918.jpg+ 191 SHA256E-s7518--be582d1ce8295d8c47e261eb7bd78a0e720e78dd58805808e9bf64ddfc3c4fe4+ 192 SHA256E-s6118--3ca5d8ca6cda3acc6c07c604f6880c017e6faa7dad4ba61e9aa956a9fa8b4b0d+ 193 SHA256E-s1086965--e170514a3651dda3313f4dcfdb9490f039a825b8349f74957a17313bdbcd7e8d.jpg+ 194 SHA256E-s10504--a57d3172d4a009a1a0d38993ea6dbe03fab6aa1ec429aa4aab563465b0dc43bd.js+ 195 SHA256E-s530445--7c8e603a03e17bb0c6440df6b695e557357527bc081871b51d0b5a61222dd674.jpg+ 196 SHA256E-s37480--ba3a0b04e4325bf0853c6201ecf7bb0fc08a0a13f5fdf0a4477c6a1f0cc82559.js+ 197 SHA256E-s394333--77f7debb969fd22698b60339ed0a0e98d9c43b8c74203528a02f6a185784e808.jpg+ 198 SHA256E-s568976--43c009e20c1b4b28d651c64ac1faa9ebd5e704bb975e2fb65ece83f4cb8867d2.jpg+ 199 SHA256E-s13813--4b4db06a82938c002539bc21d9285d63387e1a6241932c111c4f3992fa093092.axd+ 200 SHA256E-s2735--f73ac06c4be021a97a8c40f5371f0e62fd7094d863d9679407784c09c13ddd5b.log+ 201 SHA256E-s25176948--4493a4fd3160627db1fdd24c2a6bd402b544c495565815007c2d0d5093478d2a.odt+ 202 SHA256E-s596273--de2ec9fe99774ea6ce0a746a66888b71cfd744d3d97084439d054e58adebe709.jpg+ 203 SHA256E-s947995--956f7ec6d1c0c931c40e055fe21c2cfde8ef135f816052147406cb0c3ed0f948.jpg+ 204 SHA256E-s5283--5fbb8a58b8bf48ea0511c26b1b319f737df54e8e35f13b5d851dc7c0ce662458.png+ 205 SHA256E-s777575--c9fea606bc2e419967c550c43b5345bf7b08b43a81d0cdc561e048b94d536e10.jpg+ 206 SHA256E-s51496--36143df60284eae68573cb266a34a25f3c042bfd8314bdf0730c03a4fb81bb38.sla+ 207 SHA256E-s3013379--4f47c51193c043d2e81aa0bf46927a5f5c305625a09ac9034f9cb6e25ea2c6bc.jpg+ 208 SHA256E-s592379--4cea82764a163f6da9c6e63f553f82f119d5188d187c0747ee467a337f81446e.jpg+ 209 SHA256E-s8402--5b400d459743a01405d2d1ffc4d07651c36712caf9030e2a091e48f97c58a2bb.png+ 210 SHA256E-s662301--f0cf51849e330e861513bee59063450d14759055c67986e8a31dbbde0907a254.jpg+ 211 SHA256E-s1371822--0c85f348595f845e0076e52157fbb772a9d72a4821310c187b183370d7bb1b4c.jpg+ 212 SHA256E-s13445--460f9e3ea4f8a260af278d81c59faa45f16b2069b10030a8a253cd852f2e8e34.log+ 213 SHA256E-s19780--3f513b835cc3299a15178dae45cc523f1b06a1c13bd0e1c29f958027d3f5dc8a.axd+ 214 SHA256E-s311438--00b3cbd6de31a75e3a017c452099991f1ec09327efe9c6450012f6015eb6e1a4.jpg+ 215 SHA256E-s8942--e267fde4da4719de2c454d82f907796167f425510ea84098a39b425b69d2df5e+ 216 SHA256E-s845884--58974bcab0e36d65d606c1acf57e34e2e6f89872fbab65b9abf5250c632967a5.jpg+ 217 SHA256E-s331598--de52b228ad93c774d4dd1d41556ff27f7f03802378747807f324a9604e32ed66.jpg+ 218 SHA256E-s201837--d3f750f64687f347f0254d3c602a010ef71636a85f37954690d20bb6548437b1.jpg+ 219 SHA256E-s537652--aeaa479c57d39b3618006162c80e1c0eaa2cfa0b2a9a2c069a3d601bfe5b0706.jpg+ 220 SHA256E-s1174974--1d506c737c2dbde4aa286a2a25b22412c83edc5e55c3cc94fa38fb224677cf01.jpg+ 221 SHA256E-s7068886--945cfae8e22db1c96ec4cfa7b7de021c6bfe4d9e4961eeb2860716d6c8a57354.m4v+ 222 SHA256E-s684839--02293539aa97de6ab57e9caaec6998f4e64a08967d9f5f2c44581fb1df0acdd0.jpg+ 223 SHA256E-s371333--36110b44ea216b0166b023d09b52d0d32c3bdd01dafa857ed62e7c806be93193.jpg+ 224 SHA256E-s195249--21a08a5510bc88e85db2b5da660c61320ccd101a4b86cf3558618bbf37d659f0.jpg+ 225 SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.xcf+ 226 SHA256E-s26368--302de7e36ca407cf1441ab2d3fa855192c9d8b2e6a7ec04638d19db7056b7f2a.png+ 227 SHA256E-s965404--fd61bc28b2adfd4d2f175e02c662b7a71dc4b09880c8198795994e70f156c46d.jpg+ 228 SHA256E-s7254--2fcb58c8f60caadcb3e2d9e38921a49e470a9d854a55c89cb9c80f6ed0334669.csv+ 229 SHA256E-s482912--24330dbfb1d90882bf3f42e96c236f818913c343fd828992cd03ca84a3b9b2f5.jpg+ 230 SHA256E-s641334--bb06cea748a2feefa1a608635b83ed4311da1990275e32a9fd4549048c91a453.jpg+ 231 SHA256E-s1239159--2d15a6bf658d588697c5b3c2b1d1382450a40517779c32d435ff672e45539a5c.jpg+ 232 SHA256E-s2125768--a04f47c1fa5136fa397897bc907b6754a9598b37d34920250b8f70a87aaaa0b8.jpg+ 233 SHA256E-s3968--f4147a07111527be5bc7e9a5c83e3fd7ed871937167fc6d20fb7ee4d7059aa69.js+ 234 SHA256E-s462918--aa97a7f50f004dffdf444bb7f69e09c650c8987f52b5f4a0164c6acdeb4a8b28.jpg+ 235 SHA256E-s29501--67fa8330853830c4b29e05f96e6e3b6369ab908238e425e8faff4ac57e12bdb0.log+ 236 SHA256E-s158417--4058a56c1350032d640519f3aeb94ba27cd8e8b5afceb6d65e746af4f94777e0.pdf+ 237 SHA256E-s3437070--12a5bafa210aa79e9abb86c21032003c30c3a1eb5fce45a31488b6ff08db084d.jpg+ 238 SHA256E-s4373--12f64c274107733ae44f8ea9dc92e3ecf15400d98b3d76f9cc7e11527e4ed81a+ 239 SHA256E-s51497--218e86c2eb9ded51b764b5296cfff76bae4dca82e07a1602c9c597a1c34e98d7.sla+ 240 SHA256E-s4372--20e4d3e47c5fd381ffc31e6effbeb29eda97d6def773a3e42596501c6beb6317+ 241 SHA256E-s317548--cb605575ca9fab16501f2819b000d11bb06fbb2ad1f300cfba3d011e3e8e2ffc.pdf+ 242 SHA256E-s4960--c10e8c25e9b66e3ef77723373beae89e2fab1010c8b36ca329a3e9da20cbdc7e.log+ 243 SHA256E-s517805--9c14fd5e5da48efd9951b086c25c04a7c5427111ef2829543497e707f93fce99.jpg+ 244 SHA256E-s1857451--616661a96876b89472a69d32bd567aeeb95fa7da19ba4c3aa6a0ab237e2dcec3.jpg+ 245 SHA256E-s2760813--63d375f82234356889c6222a0162bdba3b7f5a1a0cb31e24c2c209f43fc2f37e.jpg+ 246 SHA256E-s832772--530816bf7c52c72e9b951289b5a35da753c66726d4e7bb2c2267faec6c8c263c.jpg+ 247 SHA256E-s4660164--2832a896d7af11fc35e1dd7ab527b0fdfeedf7ffe93bcce147381a8739c81298.JPG+ 248 SHA256E-s688782--71733ec7ffd2077ecf2973a739e4928be5824ad92034f64446a216cf513a1f29.jpg+ 249 SHA256E-s2876462--92eb9385b333bf9eb8ad56de86e46d1ba9b21c1166814e6f16e50e4a769936fc.odt+ 250 SHA256E-s496541--80d2e40f680dbd998b487e0ee8d479cb92741ec9c3e1f9d1d1d6d2f21a8cd795.jpg+ 251 SHA256E-s69339--97fe05a5b2c230c5b1fde5d18555aca13d12a35940d7d8c15249e7e80629aed6.jpg+ 252 SHA256E-s169446--5e1e9e262a58c5692f0d3c428fb71c0980311a88b474ffee95a5ea8cb5d5bf15.jpg+ 253 SHA256E-s2678100--a347450551a9055011016920280dd0a63dfc541f4f52f8ee78ef2b7a09afd46a.jpg+ 254 SHA256E-s87--5c2582459e3550daa4889fae41e3c8f6f4ad26dfa670502e4f516749aeac4113.png+ 255 SHA256E-s5798--c7167ef62bc21326b00d78b47d672bc25026eb6c7f3919fa47db2e7db8855ba9.gif+ 256 SHA256E-s53033--80840b2105a7a316a010ec3c3775031bef7fbdabbb7d3f6b7ece1a6253ef1b59.jpg+ 257 SHA256E-s7407--8ec4462ca6a05614378729bb20bb33c3b892bc943fd698389e44d959c4506843.log+ 258 SHA256E-s1189946--d23ba452e6e267d93f6233e885bd6f9e15b8ad1aea4c3d2368d901428df78970.jpg+ 259 SHA256E-s3447000--61a3bd3f7dda48544b67040012d6cd5999499d25e75dc34b82d11955d0fc9b6a.jpg+ 260 SHA256E-s3263208--69ad68aaad7058af8d14f7e4c03e5b52c9a78dbac7ffd33bd7bc5220c847d6bb.JPG+ 261 SHA256E-s1226280--d372b699459664c382f607ff56294df49e6d8d0fcab90b509337c347943357cf.jpg+ 262 SHA256E-s16890--12861c187e68e3591ccd5f708b935cc43bf25f5672daf50913e152c1c55e510c.png+ 263 SHA256E-s1092669--8e7f7431c487c6cff11ee9f7c8a87aa0d057b518e60bd2b92fd677e5c9a88313.jpg+ 264 SHA256E-s307511--5fad92167d8f9a7ed4076909a1540388cdae89df956e6011065526bfb10564a4.jpg+ 265 SHA256E-s8334--212df98aca1ee3d4f10539a786ad746f3856c2715e23d5cb816a2374b5e6c43c.png+ 266 SHA256E-s3375--2b403c31d4934895cccbe05556b0134bd4b78d4b873193d2b12a8893ab170681.txt+ 267 SHA256E-s691014--470d607465715a4c0735d74da75a5aafb5f6707b9d10a9a6a8c002f095f447e2.jpg+ 268 SHA256E-s680701--133c1dc67e394103d9f900cbf80ef508c7d7818edb23406c5f67f027a38093a4.jpg+ 269 SHA256E-s4024--b5d3e2bb6d51ff8ceb54f501035a5feebe7d5178d35b98abe9e41531bd2abd22+ 270 SHA256E-s1117--b7c94c25be8e78468071e78481641927450d754fd1bbd8d0d751f116d02b9ab3+ 271 SHA256E-s476926--ea981873de3e0ca8156ff710429894abbd8a51384b210cc142b074ec9b2c9ba0.jpg+ 272 SHA256E-s56655--7df6526b49b7aa986070db456b6a3a378c8aaaee8cb7c8892c154eecf401002a.com.htm+ 273 SHA256E-s2963--4fc53b3029a595b3b7f1f201eb4b7c2df78afc7e083abccd070c8e6fae79a661.txt+ 274 SHA256E-s761655--486ef18d41898ba80505d7630170305c4b58fa647786bd5447f20045bd6f3b2e.jpg+ 275 SHA256E-s1389414--3599c1a4da6a3b61cbc4dc431c436af9bf201b634fde2f99ddf54eae8c3590d5.jpg+ 276 SHA256E-s39678--bea819324e10bc288c75650e2196bebd5339952ce33574625ae5091ad749b63c.jpg+ 277 SHA256E-s47531--a91ecea2694b4b5c8daab84aa25c675f2f73dbfaa8ccfd581d6868b1e2568b7a.jpg+ 278 SHA256E-s4923--2f1b9afef156e9c7f4994106eda088868a992d92e66a5d601f77980fea80f777+ 279 SHA256E-s84101--bca6a8a9640b1ebfa8a2ba01b3a0f7ed20ad77fa5cbb5588d46ce75949fc38db.jpg+ 280 SHA256E-s1245742--d547d4a18279ec671be7869896c0b3e763cf8499c4dc28a62a49cd657fdf4200.jpg+ 281 SHA256E-s655461--f9b43d2794fe757d7cb61a704a01c85bc09eb20d70a1550d6934dec12f46f0bf.jpg+ 282 SHA256E-s137484--51fbe9bc815e41dfe22b9f9d4ed8f3ca98a8cb5cc7b81522b296d45b0279a413.jpg+ 283 SHA256E-s607392--ead4548b66ac3ab5c930cd89bd60de480184a4f23ffce9b5da24f9269b796283.jpg+ 284 SHA256E-s6888--405748982bbb3340eea34acbe45085ea62c80767866f0c76c355e4f94b969c7c.png+ 285 SHA256E-s4327767--eef5840e2f4294a125aaa3ed33f8ccc96c5c2c3e31cbee356013de354e628df9.pdf+ 286 SHA256E-s411064--4e5e5d477ccc542f78649e4b4ee6aa132bf79ae9aeb64a46cb45a7ee133eb2f7.pdf+ 287 SHA256E-s224149--204dbb62c5d5352c9b5baead124ecf52c6fffd49120343cc21bb10343353934e.jpg+ 288 SHA256E-s1333719--9d9ac54db47723755ee0d19731c0b2f4b40074d946da4a1e283a4904feea4534.jpg+ 289 SHA256E-s1889687--07b79ce21bf5ffe2d80f9878d338fcd63ddc92c5381eb3c290639c3e73a7b927.jpg+ 290 SHA256E-s686131--93ba1a21ff8cc7d9baa61a2af8407ccc8c1b22705a191e9f0a393d14ec95e232.jpg+ 291 SHA256E-s619954--3d900d39d16eca00287a0c4bbe20b46767867b5065260a4a1fa8444081998e25.jpg+ 292 SHA256E-s828309--f1d702dcb350cff7a3229fe62c4f0f4beb5f95ad2f00a6fd1bfb82549cd08129.jpg+ 293 SHA256E-s516404--0ca06e98fd119847c99bee56264a31ac99b36ae71136624018d308ff8c6a2e3d.jpg+ 294 SHA256E-s783842--0618e7c3ebc7ff8fcdff82b9fd227e8b83f491e8e1b96c2d0e566fc7fbea27ea.jpg+ 295 SHA256E-s20748--df0711c99c30b5fdcbfdd109c093f02f6a7f5196e7ffbc8e291bb2780c5735c0.css+ 296 SHA256E-s61739--387a27967c79b09e21d93f8a8b969dda930e8d26e9ce379c1d71718d4cc5a1df.jpg+ 297 SHA256E-s1461106--37222c3cd7a3af846c8aaed3a174a0a7e6f775ea4c08c4e2f792c6da724812b9.jpg+ (To see where data was previously used, try: git log --stat -S'KEY')+ + To remove unwanted data: git-annex dropunused NUMBER+ +ok+[2014-09-02 05:15:23 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ 11f0e77..fb4d2b8 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ fb4d2b8..490e8d4 annex/direct/master -> synced/master+error: duplicate parent 490e8d462bf7572cf44bf4fb6a820ed38d471a54 ignored+[2014-09-02 06:15:25 BST] NetWatcherFallback: Syncing with apollo +From apollo.aylett.co.uk:Annex/Family+ fb4d2b8..490e8d4 master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 490e8d4..08b6a0a annex/direct/master -> synced/master+error: duplicate parent 08b6a0ab11b225b34261a4cd5962a6630eed4495 ignored+[2014-09-02 07:15:27 BST] NetWatcherFallback: Syncing with apollo +p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory+gpg: Signature made Sun 31 Aug 2014 21:52:56 BST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+From apollo.aylett.co.uk:Annex/Family+ 490e8d4..08b6a0a master -> apollo/master+To lizzie@apollo.aylett.co.uk:Annex/Family+ 08b6a0a..69244bb annex/direct/master -> synced/master+error: duplicate parent 69244bbcf029c21782995b78cdfbff789c0d198e ignored+[2014-09-02 12:19:20 BST] NetWatcher: Syncing with apollo +ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing+From apollo.aylett.co.uk:Annex/Family+ 08b6a0a..69244bb master -> apollo/master+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+[2014-09-02 12:20:01 BST] UpgradeWatcher: Upgrading git-annex+error: refs/heads/synced/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!+error: refs/heads/synced/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!+error: refs/heads/synced/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!+error: refs/heads/synced/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!+[2014-09-02 12:21:36 BST] NetWatcherFallback: Syncing with apollo +git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+"""]]++> This is due to using an old and buggy version of git-annex. This bug was+> fixed 3 full months ago, in version 5.20140709. [[done]] --[[Joey]]
+ doc/bugs/Bloom_filter_capacity_too_large_to_represent.mdwn view
@@ -0,0 +1,44 @@+### Please describe the problem.+When running git-annex info I get an error when it tries to show the bloom filter size++### What steps will reproduce the problem?+git-annex info in my Photos repo+++### What version of git-annex are you using? On what operating system?+[[!format sh """+$ git-annex version+git-annex version: 5.20140814-g9b89b5c+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external+local repository version: 5+supported repository version: 5+upgrade supported from repository versions: 0 1 2 4+"""]]++### Please provide any additional information below.++[[!format sh """+$ git-annex info +repository mode: direct+trusted repositories: 2+ c0e4106e-2631-11e2-9749-1bfa37a61069 -- [rose]+ ca735977-973c-44bc-9257-915b2c875e39 -- synology [here]+semitrusted repositories: 3+ 00000000-0000-0000-0000-000000000001 -- web+ 7e5c0010-2634-4a5e-bc7b-6fea84b8b947 -- [glacier]+ d7e01abc-d74b-40e2-8607-3d41ce8bc4bd -- seagate3+untrusted repositories: 1+ c1fe5922-43f1-11e2-b146-33530f7fa6cc -- x200s+transfers in progress: none+available local disk space: 928.4 gigabytes (+1 megabyte reserved)+local annex keys: 34758 +local annex size: 186.78 gigabytes+annexed files in working tree: 35300+size of annexed files in working tree: 193.76 gigabytes+bloom filter size: git-annex: Data.BloomFilter.Util.suggestSizing: capacity too large to represent+"""]]++> I've worked around this problem in the arm autobuilder (only build+> affected), so [[done]] --[[Joey]]
doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths.mdwn view
@@ -21,3 +21,4 @@ using the relative path and anchoring it to the root of the repository. +> [[fixed|done]] --[[Joey]]
doc/bugs/Visual_glitch_while_xmpp_pairing.mdwn view
@@ -10,3 +10,5 @@ ### Please provide any additional information below. ++> [[fixed|done]] --[[Joey]]
doc/bugs/Windows_build_has_hardcoded_paths.mdwn view
@@ -23,3 +23,17 @@ # End of transcript or log. """]]++[[!meta title="git-annex on windows does not find msgit if user does not let msysgit add itsselt to PATH"]]++> I don't think it's any better for git-annex's installer to prompt for the+> path to git, than it is for msysgit's installer to prompt for adding it+> to the system path.+> +> The best fix would be to bundle msysgit into the git-annex installer+> along with all the other stuff. But, that adds build-time complications+> I would rather avoid.+>+> For now, I am going to treat this as a documentation problem;+> I've updated the install page to be clear that msysgit needs to be+> installed into PATH. [[done]] --[[Joey]]
doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn view
@@ -26,3 +26,6 @@ .git/annex/objects/df3/9a8/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG .git/annex/objects/df3/9a8/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG ~~~~++> Unforunately, I cannot see through the attitude problem to a clear bug+> report. Lacking time/energy to try to coax one out. [[done]] --[[Joey]]
+ doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn view
@@ -0,0 +1,30 @@+### Please describe the problem.+When attempting to 'git annex get' a file that does not exist in the git repository, git-annex correctly reports "not found". But it still returns exit code 0, incorrectly indicating success. This is problematic for scripting.++### What steps will reproduce the problem?+See transcript++### What version of git-annex are you using? On what operating system?+git-annex 5.20140517.4 as supplied by 'git-annex' aptitude package on Ubuntu 12.04.4 LTS (32-bit) ++### Please provide any additional information below.++[[!format sh """++henry@commsbox:~/work/tmp$ git init test+Initialized empty Git repository in /home/henry/work/tmp/test/.git/+henry@commsbox:~/work/tmp$ cd test+henry@commsbox:~/work/tmp/test$ git annex init+init ok+(Recording state in git...)+henry@commsbox:~/work/tmp/test$ git annex get nonexistent.file+git-annex: nonexistent.file not found+henry@commsbox:~/work/tmp/test$ echo $?+0+++"""]]++> Ok, I can find no reason why it was implemented as a warning in +> 5f3661238de9f31e6fed0be74fca9d5f1659278c in the bug report associated+> with that commit. So, promoted to error. [[done]] --[[Joey]]
+ doc/bugs/annex-rsync-transport_ignored.mdwn view
@@ -0,0 +1,30 @@+### Please describe the problem.+I have an rsync remote with the following option in config:+annex-rsync-transport = ssh -i /path/to/private/key++and git annex copy --to <remote> still asks for the remote's password. I've checked and I can ssh into the remote using that key with no problems, here's the --debug output:++ copy SHA256E-s152396--56bcf5e3f72daa1a194b16e42330fe82806cc1dbc6f3bb52888ff5e5c57b8d08.log (gpg) (checking <remote>...) [2014-09-05 13:12:41 CEST] read: rsync ["<user>@<remote>:<remote path>/81c/b5e/'GPGHMACSHA1--7d9470e207a5669e2d9120538b68815274dbf16d/GPGHMACSHA1--7d9470e207a5669e2d9120538b68815274dbf16d'"]+ <user>@<remote>'s password: +++Once it has asked for the password twice, it starts using the rsync options correctly to copy and the password is no longer needed, until the next "checking remote…". Maybe the "checking remote…" part ignores the configuration?++### What steps will reproduce the problem?+Use an rsync remote with annex-rsync-transport config set.++### What version of git-annex are you using? On what operating system?+git annex version gives:++ git-annex version: 5.20140814-g9b89b5c+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+ remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external+ local repository version: 5+ supported repository version: 5+ upgrade supported from repository versions: 0 1 2 4++which is the latest available linux-armel version.++> Also removing didn't use the configured transport. Both [[fixed|done]]+> --[[Joey]]
+ doc/bugs/annex_tries_to_start_old_binaray.mdwn view
@@ -0,0 +1,45 @@+### Please describe the problem.+See the logs. git-annex-shell tries to use not existing runshell+++### What steps will reproduce the problem?+I am on Debian testing and have, some month ago, tried the tarball distribution.+I have returned to deb packages later and deleted the tarball installation. +Seems that there some traces left. ++I have tried to find the runshell configuration, but failed to do so.++I have destroyed the repo completely, has not helped.++### What version of git-annex are you using? On what operating system?+ii git-annex 5.20140831 amd64 ++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++[2014-09-07 17:15:04 CEST] main: starting assistant version 5.20140831+[2014-09-07 17:15:04 CEST] Cronner: Consistency check in progress+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found+(scanning...) [2014-09-07 17:16:47 CEST] Watcher: Performing startup scan+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.2013121/+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found++# End of transcript or log.+"""]]
+ doc/bugs/box.com.mdwn view
@@ -0,0 +1,33 @@+### Please describe the problem.++I´m trying to use an box.com acount as special remote repository for transfering data amoung my clients. Adding the box.com is possible. On the box.com website i see that git-annex has create an folder, but there is no syncing.++When i try to enable the box.com Repository on an another client i get an Internal Error Server: bad creds.+++### What version of git-annex are you using? On what operating system?++Git-Annex Version: git-annex version 5.20140830-g3c96b79++Mac OS X 10.9.4++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++03/Sep/2014:20:41:31 +0200 [Error#yesod-core] bad creds @(yesod-core-1.2.19:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:503:5)++[2014-09-03 20:41:47 CEST] main: Syncing with Box.com ++ bad creds++ bad creds++ bad creds++ bad creds++# End of transcript or log.+"""]]
+ doc/bugs/cotinually_prompting_for_gpg_passphrase.mdwn view
@@ -0,0 +1,77 @@+### Please describe the problem.++While the assistant is synchronizing (to local USB backup disks or remote repositories) I am continually prompted for GPG passphrase when it is most definitely already in the gpg-agent.++### What steps will reproduce the problem?++Set up some remote gcrypt repositores using an existing GPG key, add some files, use the system, you are prompted for the passphrase far more often than the timeout of the passphrase in the agent (every few minutes). The number of times you are prompted also seems to increase linearly with the number of repositories - I am guessing they all exhibit the same need for the passphrase and all request at once, resulting in a string of 10+ pinentry popups.++I am wondering if there is something specific in my gpg setup that git annex isn't expecting. Always encrypt to self? Signing subkeys? Either way, standard tools manage to call gpg to encrypt/decrypt using gpg-agent and not prompting for the passphrase, so git annex should be able to as well.++### What version of git-annex are you using? On what operating system?++Arch Linux, 5.20140831-g62e6ad8 ++### Please provide any additional information below.++I have read the various discussions about using -R or -r for the recipients, and I can see in the logs that -r is being used, but there is definitely something not working correctly. At the same time that git annex is making a gpg-agent request that results in a passphrase request, I can encrypt and decrypt whatever files I want manually with no prompting.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++gcrypt: Development version -- Repository format MAY CHANGE+gcrypt: Development version -- Repository format MAY CHANGE+gcrypt: Development version -- Repository format MAY CHANGE+gcrypt: Decrypting manifest+gcrypt: Decrypting manifest+gpg: anonymous recipient; trying secret key 7426266D ...+gpg: anonymous recipient; trying secret key 7426266D ...+gpg: okay, we are the anonymous recipient.+gpg: Signature made Thu 11 Sep 2014 06:21:58 BST using RSA key ID AC305414+gpg: Good signature from "user <XXXXXX>" [ultimate]+gpg: aka "[jpeg image of size 2004]" [ultimate]+gpg: okay, we are the anonymous recipient.+gpg: Signature made Thu 11 Sep 2014 06:21:58 BST using RSA key ID AC305414+gpg: Good signature from "user <XXXXXX>" [ultimate]+gpg: aka "[jpeg image of size 2004]" [ultimate]+gcrypt: WARNING:+gcrypt: WARNING: Remote ID has changed!+gcrypt: WARNING: from :id:QydYJR8dPq7y7kMUQDG1+gcrypt: WARNING: to :id:gU3sc34/rhmta4xfSm3O+gcrypt: WARNING:+gcrypt: Encrypting to: -r 49AFD42BB9E8CD9D+gcrypt: Requesting manifest signature+gcrypt: Encrypting to: -r 49AFD42BB9E8CD9D+gcrypt: Requesting manifest signature+gcrypt: Decrypting manifest+gpg: anonymous recipient; trying secret key 7426266D ...+gpg: okay, we are the anonymous recipient.+gpg: Signature made Thu 11 Sep 2014 06:22:58 BST using RSA key ID AC305414+gpg: Good signature from "user <XXXXXXX>" [ultimate]+gpg: aka "[jpeg image of size 2004]" [ultimate]+gcrypt: Encrypting to: -r 49AFD42BB9E8CD9D+gcrypt: Requesting manifest signature+gpg: cancelled by user+gpg: skipped "49AFD42BB9E8CD9D": Operation cancelled+gpg: [stdin]: sign+encrypt failed: Operation cancelled+error: failed to push some refs to 'gcrypt::/autofs/ext/wdpassport0/annexes/user/docs'+[2014-09-11 06:36:18 BST] read: git ["--git-dir=/home/user/docs/.git","--work-tree=/home/user/docs","-c","core.bare=false","push","wdpassport0","master"]+...++# End of transcript or log.+"""]]++The section above I clicked cancel on the pinentry dialog as can be seen. The question is, why was it asking me anyway?++> gpg: anonymous recipient; trying secret key 7426266D ...+> +> That means that you have git-remote-gcrypt configured to use anonymous+> recipients. This causes gpg to try a bunch of gpg keys until it finds one+> that works, rather than immediately trying the right key. +> +> I modified git-remote-gcrypt in July so you can configure+> gcrypt.publish-participants to avoid this problem. +> +> There may also be a local confguration problem; I don't know. In any+> case, it's not git-annex responsible, but git-remote-gcrypt. [[done]] --[[Joey]]
doc/bugs/ssh_over_IPv6.mdwn view
@@ -18,3 +18,12 @@ supported repository version: 5 upgrade supported from repository versions: 0 1 2 4 ```++> [[Fixed|done]] by adding support for ipv6 addresses when git-annex+> converts a git remote loction into an url. BTW, the +> simple workaround is to give it a valid url from the beginning+> `ssh://[fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e]/home/thomas/git/musik"`+> +> As to any problems using an ipv6 remote once it's set up, I've used them+> with no problems.+> --[[Joey]]
+ doc/bugs/ssh_over_IPv6/comment_2_cfa63d226ae411551a728af5ab043491._comment view
@@ -0,0 +1,29 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlog_5wIICaMcrKTexlFNA6IO6UTp323aE"+ nickname="Torkaly"+ subject="comment 2"+ date="2014-09-01T11:01:30Z"+ content="""+thank you. I workaround this by using the DNS hostname instead the IPv6 address directly. But this is not a nice solution, like any workaround. But now i have problems with `git annex get` over IPv6-only:++```+get ***.mp3 (not available) + Try making some of these repositories available:+ 5636aefa-c509-4ea0-bebe-f5b96d8eb15a -- hserver+failed+<snip>+```++but i can ping it:+```+thomas@alus:~/Musik$ ping6 hserver.h.b128.net+PING hserver.h.b128.net(fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e) 56 data bytes+64 bytes from fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e: icmp_seq=1 ttl=42 time=453 ms+64 bytes from fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e: icmp_seq=2 ttl=42 time=441 ms+64 bytes from fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e: icmp_seq=3 ttl=42 time=425 ms+64 bytes from fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e: icmp_seq=5 ttl=42 time=413 ms+```+(the high pings are caused by a download from an other source. Also i have no problems with rsync over IPv6)++PS: the markdown for code blocks is not working too :)+"""]]
+ doc/bugs/too_many_open_files_on_OSX.mdwn view
@@ -0,0 +1,42 @@+### Please describe the problem.++error message:++ copy somefile.jpg (checking myserver...) (to myserver...) + git-annex: runInteractiveProcess: pipe: Too many open files++ rsync failed -- run git annex again to resume file transfer+ failed+++### What steps will reproduce the problem?++1. Start a `git annex copy` with lots of files in the queue.+2. Start a second `git annex copy` on the same set of files.+The intention is to minimize the amount of silent time on the wire due to administrative work between actual file transfers. These two processes will trip over each other and see that transfer X is already going, and skip to the next file Y, so in the end they upload about half of the files each.++3. Expect all files to be uploaded. Actually observe the above error message for at least one of the processes.++### What version of git-annex are you using? On what operating system?++ git-annex version: 5.20140420-ga25b8bb+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+ remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external++ Darwin mymacbook 13.3.0 Darwin Kernel Version 13.3.0: Tue Jun 3 21:27:35 PDT 2014; root:xnu-2422.110.17~1/RELEASE_X86_64 x86_64++### Please provide any additional information below.++[[!format sh """+lsof -p <my annex process>++... some .app/** files, tty etc ...+... some unnamed pipes ...+.../.git/annex/ssh/myserver.lock+.../.git/annex/transfer/upload/b4d67c4f-8cca-423c-9363-f3063b7fe3e4/lck.SHA256E-s10448418--4f61fab4... ~200 different files.+"""]]++> Thanks for a very clear bug report! Was easy from that to find+> where the lock file was not being closed in this situation.+> [[fixed|done]] --[[Joey]]
doc/bugs/webapp_missing_on_redhat.mdwn view
@@ -12,3 +12,10 @@ git-annex: unknown command webapp +> git-annex can be built without the webapp, and this is+> often done if a distribution does not have the full haskell stack+> packaged yet. The solution is to contact the distribution and let them+> know they need to improve it, and/or use the standalone build from this+> website.+> +> So, please file a bug on redhat. [[done]] --[[Joey]]
+ doc/bugs/webapp_on_windows_7_64_bit_fail_to_add_server_repo.mdwn view
@@ -0,0 +1,66 @@+### Please describe the problem.+Cant add Server repo++### What steps will reproduce the problem?+install linux prebuild torball on server (readynas pro 600)+un-tar and run with ./git-annex+(git-annex test pass without error)+install windows client on win7 64 bit and start webapp+try add server repo as second repo will led to an internal server error about gpg++followed the assistend video+### What version of git-annex are you using? On what operating system?+Readynas (Linux):+annex@readynas-pro:~/git-annex.linux$ ./git-annex version+git-annex version: 5.20140831-g62e6ad8+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external++Windows:+Version: 5.20140914-gb169612+Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash ++Git on Windows:+C:\Users\Xaver>git --version+git version 1.9.4.msysgit.1++GPG on Windows:+C:\Users\Xaver>gpg --version+gpg (GnuPG) 2.0.26 (Gpg4win 2.2.2)+libgcrypt 1.6.1+Copyright (C) 2013 Free Software Foundation, Inc.+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>+This is free software: you are free to change and redistribute it.+There is NO WARRANTY, to the extent permitted by law.++Home: C:/Users/Xaver/AppData/Roaming/gnupg+Unterstützte Verfahren:+Öff. Schlüssel: RSA, ELG, DSA+Verschlü.: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,+ CAMELLIA128, CAMELLIA192, CAMELLIA256+Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224+Komprimierung: nicht komprimiert, ZIP, ZLIB, BZIP2+### Please provide any additional information below.+Internal Server Error+user error (gpg ["--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 2)++gpg: fatal: can't create directory `/home/Xaver/.gnupg': No such file or directory++makes no sense on windows machine++must be like "C:\Users\Xaver\AppData\Roaming\gnupg" or %Username%\AppData\Roaming\gnupg I guess.++gpg itself works fine I use it with thunderbird++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+gpg: WARNING: using insecure memory!+gpg: please see http://www.gnupg.org/documentation/faqs.html for more information+gpg: fatal: can't create directory `/home/Xaver/.gnupg': No such file or directory+secmem usage: 0/0 bytes in 0/0 blocks of pool 0/65536+14/Sep/2014:23:17:08 +0200 [Error#yesod-core] user error (gpg ["--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 2) @(yesod-core-1.2.19:Yesod.Core.Class.Yesod .\Yesod\Core\Class\Yesod.hs:503:5)++# End of transcript or log.+"""]]
doc/bugs/whereis_does_not_work_in_direct_mode.mdwn view
@@ -87,3 +87,5 @@ ### What version of git-annex are you using? On what operating system? git-annex version: 5.20140716-g8c14ba8++> [[fixed|done]] --[[Joey]]
doc/design/assistant/polls/Android_default_directory.mdwn view
@@ -4,4 +4,4 @@ want the first time they run it, but to save typing on android, anything that gets enough votes will be included in a list of choices as well. -[[!poll open=yes expandable=yes 68 "/sdcard/annex" 6 "Whole /sdcard" 7 "DCIM directory (photos and videos only)" 2 "Same as for regular git-annex. ~/annex/"]]+[[!poll open=yes expandable=yes 69 "/sdcard/annex" 6 "Whole /sdcard" 7 "DCIM directory (photos and videos only)" 2 "Same as for regular git-annex. ~/annex/"]]
doc/design/metadata.mdwn view
@@ -53,7 +53,7 @@ ## automatically added metadata -When annex.genmetadata is set, git annex add automatically attaches+When `annex.genmetadata` is set, git annex add automatically attaches some metadata to a file. Currently year and month fields, from its mtime. There's also a post-commit-annex hook script.
doc/design/roadmap.mdwn view
@@ -1,6 +1,6 @@ ## roadmap -Now in the +Just finished the [sustaining git-annex development](https://campaign.joeyh.name/) year (starting September 2013). @@ -15,7 +15,7 @@ * Month 9 Brazil!, [[!traillink assistant/sshpassword]] * Month 10 polish [[assistant/Windows]] port * Month 11 [[!traillink assistant/chunks]]-* **Month 12** user-driven features and polishing+* Month 12 user-driven features and polishing Deferred until later:
+ doc/devblog/day_219__catching_up_and_looking_back.mdwn view
@@ -0,0 +1,109 @@+Yesterday and today were the first good solid days working on git-annex in a+while. There's a big backlog, currently of 133 messages, so I have been+concentrating on bug reports first. Happily, not many new bugs have been+reported lately, and I've made good progress on them, fixing 5 bugs today,+including a file descriptor leak.++## catching up++In this end of summer rush, I've been too busy to blog for the past 20 days,+but not entirely too busy to work on git-annex. Two releases have been made+in that time, and a fair amount of improvements worked on.++Including a new feature: When a local git repository is cloned with `git+clone --shared`, git-annex detects this and defaults to a special mode+where file contents get hard linked into the clone. It also makes the cloned+repository be untrusted, to avoid confusing numcopies counting with the+hard links. This can be useful for temporary working repositories without+the overhead of lots of copies of files.++## looking back++I want to look back further, over the crowdfunded year of work covered+by this devblog. There were a lot of things I wanted to accomplish this+past year, and I managed to get to most of them. As well as a few surprises.++* Windows support improved more than I guessed in my wildest dreams. + git-annex went from working not too well on the command line to+ being pretty solid there, as well as having a working+ and almost polished webapp on Windows. + There are still warts -- it's Windows after all!++* Android didn't get many improvements. Most of the time I had budgeted to+ Android porting ended up being used on Windows porting instead. I did,+ however, get the Android build environment cleaned up a lot from the initial+ hacked together one, and generally kept it building and working on Android.++* The [direct mode guard](http://git-annex.branchable.com/devblog/day_48__direct_mode_guard_design/)+ was not planned, but the need for it became clear, and+ it's dramatically reduced the amount of command-line foot-shooting+ that goes on in direct mode.++* Repository repair was planned, and I've very proud of [git-repair](http://git-repair.branchable.com/).+ Also pleased with the webapp's UI for scheduling repository consistency+ checks. + Always room for improvement in this kind of thing, but this brings a new+ capability to both git and git-annex.++* The [[external_special_remote_interface|special_remotes/external]] came+ together beautifully. External special remotes are now just as well+ supported as built-in ones, except the webapp cannot be used to configure+ them.++* Using git-remote-gcrypt for fully encrypted git repositories, including+ support in the webapp for setting them (and gpg keys if necessary),+ happened. Still needs testing/more use/improvements. Avoided doing+ much in the area of gpg key management, which is probably good to avoid when+ possible, but is probably needed to make this a really suitable option for+ end users.++* Telehash is still being built, and it's not clear if they've gotten it+ to work at all yet. The v2 telehash has recently been superseded by a+ a new v3. So I am not pleased that I didn't get git-annex working with+ telehash, but it was outside my control. This is a problem that needs to get+ solved outside git-annex first, either by telehash or something else.+ The plan is to keep an eye on everything in this space, including for example,+ Maidsafe.++* In the meantime, the new notifychanges support in git-annex-shell+ makes XMPP/telehash/whatever unnecessary in a lot of configurations.+ git-annex's remotedaemon architecture supports that and is designed+ to support other notification methods later. And the webapp has a lot of+ improvements in the area of setting up ssh remotes, so fewer users will+ be stuck with XMPP.++* I didn't quite get to [[design/assistant/deltas]], but the final month+ of work on chunking provides a lot of new features and hopefully a+ foundation that will get to deltas eventually. There is a new haskell+ library that's being developed with the goal of being used for git-annex+ deltas.++* I hadn't planned to make git-annex be able to upgrade itself, when installed+ from this website. But there was a need for that, and so it happened.+ Even got a gpg key trust path for the distribution of git-annex.++* Metadata driven views was an entirely unplanned feature. The current+ prototype is very exciting, it opens up entire new use cases. + I had to hold myself back to not work on it too much,+ especially as it shaded into adding a caching database to git-annex.+ Had too much other stuff planned to do all I wanted.+ Clearly this is an area I want to spend more time on!++Those are most of the big features and changes, but probably half+of my work on git-annex this past year was in smaller things, and general+maintenance. Lots of others have contributed, some with +code (like the large effort to switch to bootstrap3),+and others with documentation, bug reports, etc.++Perhaps it's best to turn to `git diff --stat` to sum up the activity+and see just how much both the crowdfunding campaign and+the previous kickstarter have pushed git-annex into high gear:+ + campaign: 5410 files changed, 124159 insertions(+), 79395 deletions(-)+ kickstarter: 4411 files changed, 123262 insertions(+), 13935 deletions(-)+ year before: 1281 files changed, 7263 insertions(+), 55831 deletions(-)++What's next? The hope is, no more crowdfunded campaigns where I have+to promise the moon anytime soon. Instead, the goal is to move to a more+mature and sustainable funding model, and continue to grow the git-annex+community, and the spaces where it's useful.
@@ -0,0 +1,7 @@+I was wondering if there was a way to make shared encryption more secure. Here is my suggestion: +The shared repository is encrypted using a key for the whole repository, just the way normal encryption would work. +The server additionally keeps a copy of every user's public key. +When a user is authorized, their repository is initialized and they receive the common key, encrypted by their public key. +The only issue would be storage of the common key, which would have to be restricted to repository on a trusted machine. ++Not sure if this would be easy for you to implement, but I figured I'd submit a post detailing it, to see if maybe it was doable.
+ doc/forum/Git_remote__63_____40__bitbucket__44___github__41__.mdwn view
@@ -0,0 +1,1 @@+Is it possible to use bitbucket as a remote?
+ doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__.mdwn view
@@ -0,0 +1,13 @@+I have a local repo on a computer with some folder on the path+/computer1/annex/++Then I tried to run git annex on my phone and added a remote ssh repo syncing to+/computer1/annex/mobile/ from my mobile's picture folder.++But the files ending up there are:+ls /computer1/annex/mobile/+annex branches config description HEAD hooks info objects refs ++I chose "full backup"++Why dont I see my pictures there, even if they are hiding in the metadata ?
+ doc/forum/Move_unsynced_file_in_direct_mode.mdwn view
@@ -0,0 +1,97 @@+When I rename unsynced files in a direct mode repo, the original symlink gets removed from git, but the new symlink doesn't get added back by autocommit or by explicitly using `git annex add`.++First, I create a file in a git-annex repo:++ $ mkdir annex1+ $ cd annex1+ $ git init+ Initialized empty Git repository in /home/cwarden/annex1/.git/+ $ git annex init+ init ok+ (Recording state in git...)+ $ echo test > test1+ $ git annex add test1+ add test1 ok+ (Recording state in git...)+ $ git annex sync+ commit ok+ $ ls -l+ total 4+ lrwxrwxrwx 1 cwarden cwarden 178 Sep 12 10:14 test1 -> .git/annex/objects/w8/pv/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2+ $ cat test1+ test++Now, I clone the repo and enable autocommit and direct mode in the second repo:++ $ cd ..+ $ git clone annex1 annex2+ Cloning into 'annex2'...+ done.+ $ cd annex2+ $ git config annex.autocommit true+ $ git annex direct+ commit+ On branch master+ Your branch is up-to-date with 'origin/master'.++ nothing to commit, working directory clean+ ok+ direct ok++I drop the file, then rename it:++ $ git annex drop test1+ (merging origin/git-annex into git-annex...)+ (Recording state in git...)+ $ mv test1 test2+ $ ls -l+ total 4+ lrwxrwxrwx 1 cwarden cwarden 178 Sep 12 10:14 test2 -> .git/annex/objects/w8/pv/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2+ $ git annex sync+ commit (Recording state in git...)+ ok+ pull origin+ ok+ push origin+ Counting objects: 6, done.+ Delta compression using up to 4 threads.+ Compressing objects: 100% (5/5), done.+ Writing objects: 100% (6/6), 674 bytes | 0 bytes/s, done.+ Total 6 (delta 1), reused 0 (delta 0)+ To /home/cwarden/annex1+ 2772756..ffcb7a1 annex/direct/master -> synced/master+ * [new branch] git-annex -> synced/git-annex+ ok+ (Recording state in git...)++Now, I want to get the renamed file:++ $ git annex get test2+ $ ls -l+ total 4+ lrwxrwxrwx 1 cwarden cwarden 178 Sep 12 10:14 test2 -> .git/annex/objects/w8/pv/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2+ $ cat test2+ cat: test2: No such file or directory++Explicitly adding test2 doesn't work:++ $ git annex add test2+ $ git annex get test2+ $ cat test2+ cat: test2: No such file or directory++`git annex fsck` doesn't help:++ $ git annex fsck+ $ cat test2+ cat: test2: No such file or directory++The only way I've found to get the renamed file back into git is to use `core.bare=false`, but the [documentation](http://git-annex.branchable.com/direct_mode/) says that "there should be no good reason to need to do this, ever".++ $ git -c core.bare=false add test2+ $ git -c core.bare=false commit -m'force renamed file back into git'+ $ git annex get test2+ $ cat test2+ test++Is there a better solution?
+ doc/forum/SSH_remote_transfers_queued_but_no_movement.mdwn view
@@ -0,0 +1,3 @@+I created a local repository using the assistant, followed by setting up a remote ssh 'full backup' repository. While the assistant is running, changes in the local repository are detected and transfers are initiated, but they stay at 0%. How can I go about trouble-shooting this? I've made the remote annex directories 777 permissions for testing, but no change.++Thanks
+ doc/forum/Web_app_on_server_without_X11__63__.mdwn view
@@ -0,0 +1,3 @@+When I run git-annex-webapp, a browser is opened and I am redirected to the assistant. However, how can I run the web app and just have it start the server process without opening a browser, and navigating to the page from a remote computer?++Thanks!
+ doc/forum/Windows_installation_notes.mdwn view
@@ -0,0 +1,146 @@+[[!toc]]++# Introduction++Hello.++I've installed git-annex and git-annex assistant on Windows 7 in a corp environment (hello gotchas!).++In this post I'll describe issues I encountered, how I fixed them, recommendations I have for the installer, and some results from a couple `git annex test` runs.++# Background++My regular domain user doesn't have permissions to write to `C:\Program Files (x86)`, so I use a secondary domain user which is in the Administrators group. I use "Run as different user" to run installers, etc. (cf. "Run as Administrator")++During msysgit installation I checked "only bash, don't add to path, don't integrate with Explorer" etc, since I like my third-party applications isolated.++# The installer++## Where to install `git-annex.exe`++The nightly build of git-annex/assistant from NEST (20140908) only prompts for the base path of the msysgit location and it installs files in `$BASE/bin` and `$BASE/cmd`... I'll try manually copying files post-install to mitigate the path issues described in other posts on this forum.++The msysgit installer (1.9.4-preview20140815) presents a certain screen with three radio options:++1. git bash only+2. just git in `cmd.exe`+3. git + unix tools in `cmd.exe`.++I *think* this is the meaning of each:++1. cmd.exe's PATH is not touched.+2. `$GITBASE/cmd` is added to PATH+3. `$GITBASE/bin` is added to PATH++Therefore, I think that if you do something so that `git-annex.exe` is added to both $GITBASE/cmd and $GITBASE/bin (perhaps a symlink or even a .lnk file) then all three user preference options will be covered.++All I did was copy `$BASE/cmd/git-annex.exe` to `$BASE/bin/git-annex.exe` and now both `git annex` and `git-annex` work in my msysgit "git bash" console. I didn't test `cmd.exe` since I selected option 1 in the msysgit installer.++## Installer locations: user profile or system-wide?++I found a shortcut for the webapp in Start Menu/Startup ... for the wrong user. Please prompt the user during the installation: "Install startup link system-wide or for current user?"++# git annex test results++## `$HOME` defaulted to some mapped drive, whoops!++The test suite has been running since before I started this post. Is that normal? :)++I notice that it emits "Detected a crippled filesystem", "Enabling direct mode." and other messages again and again. If those checks are expensive, maybe the result should be memoized/cached.++Oh goodness, the test is reading and writing to my "home directory": a remote filesystem I never use. It's slow. I'll have to configure msysgit to use a different, more local `$HOME`. This a common problem on this workstation. I'll let the test finish in case it reveals something useful to you, but this will not be how I use it going forward...++I am unable to attach `testWithMappedDriveHomeDirConsoleOutput.txt` to this post. 1 out of 84 tests failed. Here is the only case sensitive occurrence of FAIL in the console output, with some lines of context.++ OK+ info: Detected a filesystem without fifo support.+ Disabling ssh connection caching.+ Detected a crippled filesystem.+ Enabling direct mode.+ git-annex: Data.BloomFilter.Util.suggestSizing: capacity too large to represent+ FAIL+ Exception: user error (git-annex ["info","--json"] exited 1)+ version: Detected a filesystem without fifo support.+ Disabling ssh connection caching.+ Detected a crippled filesystem.+ Enabling direct mode.+ git-annex version: 5.20140908-g378fbb1+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash++## test results with local NTFS `$HOME`++...The console output is scrolling by much more quickly.++2 out of 84 tests failed.++ prop_past_sane: OK+ +++ OK, passed 1000 tests.+ prop_duration_roundtrips: OK+ +++ OK, passed 1000 tests.+ prop_metadata_sane: OK+ +++ OK, passed 1000 tests.+ prop_metadata_serialize: OK+ +++ OK, passed 1000 tests.+ prop_branchView_legal: OK+ +++ OK, passed 1000 tests.+ prop_view_roundtrips: OK+ +++I nOiKt, Tpeasstsse+ d 1 0i0n0i tt:e sts.+ prop_viewedFile_rountrips: FAIL+ *** Failed! Falsifiable (after 51 tests and 1 shrink):+ "a:"+ Use --quickcheck-replay '50 592211036 1831676953' to reproduce.+ Unit Tests+ add sha1dup: init test repo+ Detected a filesystem without fifo support.+ + Disabling ssh connection caching.++and++ OK+ info: Detected a filesystem without fifo support.+ Disabling ssh connection caching.+ Detected a crippled filesystem.+ Enabling direct mode.+ git-annex: Data.BloomFilter.Util.suggestSizing: capacity too large to represent+ FAIL+ Exception: user error (git-annex ["info","--json"] exited 1)+ version: Detected a filesystem without fifo support.+ Disabling ssh connection caching.+ Detected a crippled filesystem.+ Enabling direct mode.+ git-annex version: 5.20140908-g378fbb1+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash++...Note the corruption. I think this happens when I drag the scroll bar while console output is being emitted. (msysgit's problem?) I would presume and hope that this is a "display only" issue. UPDATE: see section Corruption below.++# .vbs failure++I copied the `git-annex.lnk` out of my admin user's start menu onto my desktop and double clicked it. `wscript.exe` got stuck in a loop where new copies were being spawned over and over again (and old copies dieing at the same rate).++I think I know why. `git-annex.exe` isn't on the path... but `git-annex.lnk` is in the CWD (Desktop in this case). Yeah, that is the problem. The vbs attempts to run "git-annex webapp", and this .lnk points to a valid "executable": `git-annex-webapp.vbs`... So it just calls itself with an argument over and over again.++Workaround: invoke `git annex webapp` from the normal git bash console.++# Corruption?++In some section above I speculated that the "jittery" corruption I was seeing in my console was a "display only" problem caused by scrolling around while new characters were being printed to the console. Now, I don't think so.++The corruption can be seen in the Log in the webapp. Here's an example from the top of the log:++ [2014-09-08 13:37:45 Central Daylight Time] main: starting assistant version 5.20140908-g378fbb1+ Launching web browser on file://d:\annex\.git\annex\webapp.html+ [2014-09-08 13:37:45 Central Daylight Time] Cronner: You should enable consistency checking to protect your data. + (scanning...) [2014-09-08 13:37:45 Central Daylight Time] Watcher: Performing startup scan+ (started...) rreerrcceevvcc::vv ::ff aaffiiaalliieellddee dd(( NN((ooNN ooee rreerrrroorrrroo))rr+ + ))++I have no clue about this! (Well... "I think it's trying to communicate!") ++# Conclusion++I hope this information is helpful. I've enabled the 'email comments to me' option on this post and I'd be happy to perform further tests upon request.++Cheers!
+ doc/forum/annex_merge_creates___34__synced__47____42____34___branches.mdwn view
@@ -0,0 +1,7 @@+Hi,++when I fetch from a central repository and `git annex merge` a synced/master branch is created. How can I disable this behaviour?++Or is there a better workflow for getting and pushing updates from/to a central git repo?++bye
+ doc/forum/armhf_binary/comment_2_743ecf263d1ec1bc4f24e32c0a178f2b._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="justinl"+ ip="184.17.213.135"+ subject="works"+ date="2014-09-10T17:59:48Z"+ content="""+Yep, the standalone armel build worked perfectly. Thanks!+"""]]
+ doc/forum/big_overhead.mdwn view
@@ -0,0 +1,44 @@+Hi,++I am been seeing quite big overheads using `git-annex`. Is this is normal?++The `.git/objects` folder is explosive in my system, often being larger+than the content watched by git-annex. Here's the actual statistics+of my git-annex folders, where the fourth column is calculated as col3/(col2-col3).++[[!table data="""+folder,size,size .git,relative size+conf.annex,777536,720100,12.537433+doc.annex,20351624,11260204,1.2385528+images.annex,817064,435580,1.1418041+misc.annex,803328,572476,2.4798399+music.annex,23756116,9192740,0.63122314"""]]++That is, four of five repos require more space for the `.git` folder than the actual files. Most of this comes from the `objects` folder. ++Number of files:++[[!table data="""+folder,no. files,no files .git,relative size+conf.annex,11350,9539,5.2672557+doc.annex,84954,66824,3.6858246+images.annex,92787,91285,60.775632+misc.annex,95461,95160,316.14618+music.annex,16414,13520,4.6717346+"""]]+++I use the assistant web interface, and direct+mode. I use two laptops running Linux that are synchronized+directly over LAN at home or via a transfer repo on a ssh server+where git-annex is installed. The latter is set up using the web interface and the gcrypt repo.+[Mostly, the transfer repo isn't working+and I often end up with only symlinks on the computer where I did not edit the file in question, +but this is probably unrelated.]++I have previously tried to fix it using `git gc` or `git annex forget`, but it doesn't seem to significantly reduce the sizes, and what it helps isn't persistent.++Is this kind of 'overhead' something that one must accept when using+`git-annex` or do such numbers indicate that something is wrong?++Thanks.
+ doc/forum/big_overhead/comment_1_0c184520c30a89bd2604ab7c0eb7ac45._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm8wY171R5c4u_jPmB6LU6n6Px2xePM4sE"+ nickname="Efraim"+ subject="comment 1"+ date="2014-09-07T14:09:05Z"+ content="""+have you tried from the command line `git annex unused` to see if you have unused files in your repo? From the assistant, the option under configuration -> Unused files gives you an option to expire old files after a period of time so they get deleted from your repo.+"""]]
+ doc/forum/big_overhead/comment_2_13a017c6c84511894ded2d89d86eb541._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="rasmus"+ ip="109.201.154.150"+ subject="comment 2"+ date="2014-09-07T15:17:25Z"+ content="""+Thanks for help, Efraim.++I'm not sure this is it. On my other laptop, where the above statics were not calculated the `.git` folder of `doc.annex` is 26Gb (contents is 8.6Gb). Meanwhile, unused files are 0.6Gb. In `conf.annex` the `.git` folder is 3.2Gb, content is 70Mb and unused files is 2.2Mb. I used the web interface to find the size of unused files.+"""]]
+ doc/forum/big_overhead/comment_3_b4761cacc02396b5bdf34bcf3457cb91._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://id.clacke.se/"+ nickname="Claes"+ subject="repack parameters"+ date="2014-09-07T21:53:10Z"+ content="""+Because git-annex tracks all the events of an annexed file for each repo -- added, dropped, copied etc -- and it tracks these in one object per file in the git-annex branch, it does indeed create a lot of objects. To improve both space and performance I made sure to add `git gc --auto` as a post-commit hook, as the objects in my case can quickly reach the tens or even hundreds of thousands.++To further improve performance and space, you can choose to set `pack.window` and `pack.depth` to vastly higher values than the defaults (10 and 50, respectively), because there is a large amount of objects with very similar content. I did a `git repack --window 2500 --depth 1000 -f -a d` and brought down my repo from 3 GiB (packed!) to 300 MiB. Make sure to have a lot of memory and CPU available when doing this, or it will take forever. You can set `pack.window` ridiculously high if you like, as long as you limit it with `pack.windowMemory`, so that it makes use of all your available memory for comparing objects and finding the optimal delta.+"""]]
+ doc/forum/big_overhead/comment_4_633f8538f368220eaca82b8bbfe9b49d._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="rasmus"+ ip="109.201.154.209"+ subject="Re: repack parameters"+ date="2014-09-08T13:20:36Z"+ content="""+Thanks for your tips, Claes. I was really aware of `git repack` and that set of parameters.++I didn't mention, but sadly I'd run `git gc` on the repos just before collecting the above numbers.++I tried to repack two repositories -- `doc.annex` and `config.annex` -- using the values you suggested. However, it did not have any measurable effect (less than 100mb in both cases). ++The number of unused files seem to be (much) less than 500 files in the repos.++BTW: All of the extra size is in the `.git/objects/` folder. `.git/annex/` is quite small (always much less than 1GB). Would that indicate that large files are checked in with git sans annex somehow?+"""]]
+ doc/forum/big_overhead/comment_5_599092b8d4f1fc8f378796328ef42931._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="rasmus"+ ip="109.201.154.183"+ subject="comment 5"+ date="2014-09-08T13:48:03Z"+ content="""+So `git prune` worked wonders on my repos, getting rid of GBs of stuff in the `.git/objects` folders. I don't know why they weren't picked up by `git gc`. In retrospect, it was perhaps a bit careless of me to run `git prune` directly, but hopefully I will be OK. . .+"""]]
+ doc/forum/big_overhead/comment_6_adb4b4e7eb4dac7760f3425bae6cbbc2._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="rasmus"+ ip="193.145.48.43"+ subject="comment 6"+ date="2014-09-10T12:07:53Z"+ content="""+Seems `git prune` only worked as a temporary fix. My `doc.annex/.git/objects` is 3.6Gb after two days. I don't get why `git` sans `annex` is checking in stuff -- which I assume is the reason it's stored in `.git/objects`.+"""]]
+ doc/forum/schedule_repository___91__expression__93__.mdwn view
@@ -0,0 +1,1 @@+what sort of options can we use in the expression field? from the [git annex bible](http://git-annex.branchable.com/git-annex/) it suggests for incremental fscks, but I'm wondering if it can run shell scripts or `git annex importurl` lines too.
doc/git-annex.mdwn view
@@ -513,7 +513,7 @@ * `fsck [path ...]` With no parameters, this command checks the whole annex for consistency,- and warns about or fixes any problems found. This is a good compliment to+ and warns about or fixes any problems found. This is a good complement to `git fsck`. With parameters, only the specified files are checked.@@ -1432,6 +1432,19 @@ run the commands with `-c annex.alwayscommit=false`. You can later commit the data by running `git annex merge` (or by automatic merges) or `git annex sync`.++* `annex.hardlink`++ Set this to `true` to make file contents be hard linked into the+ repository when possible, instead of a more expensive copy.++ Use with caution -- This can invalidate numcopies counting, since+ with hard links, fewer copies of a file can exist. So, it is a good+ idea to mark a repository using this setting as untrusted.++ When a repository is set up using `git clone --shared`, git-annex init+ will automatically set annex.hardlink and mark the repository as+ untrusted. * `annex.delayadd`
doc/install/Windows.mdwn view
@@ -1,6 +1,7 @@ git-annex now does Windows! -* First, [install git](http://git-scm.com/downloads) (msysgit 1.9 or newer is needed)+* First, [install git](http://git-scm.com/downloads) (msysgit 1.9 or newer is needed) + _Be sure to tell the msysgit installer to add git to the PATH._ * Then, [install git-annex](https://downloads.kitenet.net/git-annex/windows/current/) This port is now in reasonably good shape for command-line use of
+ doc/internals/comment_3_5a26ee5aab274f321a4ea6f8527f53bd._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="zardoz"+ ip="134.147.14.84"+ subject="comment 3"+ date="2014-09-15T10:34:36Z"+ content="""+Some documentation that would be nice having added in the appropriate places:++* Exactly how is the index file being used? Is this just a copy of the git index file that we would get when checking out the git-annex branch? Why is the file kept around? Which sort of operations are done on the index, e.g. when doing git annex add?++* For all time-stamped data-structures: Exactly which significance does the time-stamp have? E.g., for uuid.log, is this the date the name was changed?+"""]]
− doc/news/version_5.20140707.mdwn
@@ -1,23 +0,0 @@-git-annex 5.20140707 released with [[!toggle text="these changes"]]-[[!toggleable text="""- * assistant: Fix bug, introduced in last release, that caused the assistant- to make many unncessary empty merge commits.- * assistant: Fix one-way assistant->assistant sync in direct mode.- * Fix bug in annex.queuesize calculation that caused much more- queue flushing than necessary.- * importfeed: When annex.genmetadata is set, metadata from the feed- is added to files that are imported from it.- * Support users who have set commit.gpgsign, by disabling gpg signatures- for git-annex branch commits and commits made by the assistant.- * Fix memory leak when committing millions of changes to the git-annex- branch, eg after git-annex add has run on 2 million files in one go.- * Support building with bloomfilter 2.0.0.- * Run standalone install process when the assistant is started- (was only being run when the webapp was opened).- * Android: patch git to avoid fchmod, which fails on /sdcard.- * Windows: Got rid of that pesky DOS box when starting the webapp.- * Windows: Added Startup menu item so assistant starts automatically- on login.- * Windows: Fix opening file browser from webapp when repo is in a- directory with spaces.- * Windows: Assistant now logs to daemon.log."""]]
+ doc/news/version_5.20140915.mdwn view
@@ -0,0 +1,27 @@+git-annex 5.20140915 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * New annex.hardlink setting. Closes: #[758593](http://bugs.debian.org/758593)+ * init: Automatically detect when a repository was cloned with --shared,+ and set annex.hardlink=true, as well as marking the repository as+ untrusted.+ * Fix parsing of ipv6 address in git remote address when it was not+ formatted as an url.+ * The annex-rsync-transport configuration is now also used when checking+ if a key is present on a rsync remote, and when dropping a key from+ the remote.+ * Promote file not found warning message to an error.+ * Fix transfer lock file FD leak that could occur when two separate+ git-annex processes were both working to perform the same set of+ transfers.+ * sync: Ensure that pending changes to git-annex branch are committed+ before push when in direct mode. (Fixing a very minor reversion.)+ * WORM backend: Switched to include the relative path to the file inside+ the repository, rather than just the file's base name. Note that if you're+ relying on such things to keep files separate with WORM, you should really+ be using a better backend.+ * Rather than crashing when there's a problem with the requested bloomfilter+ capacity/accuracy, fall back to a reasonable default bloom filter size.+ * Fix build with optparse-applicative 0.10. Closes: #[761484](http://bugs.debian.org/761484)+ * webapp: Fixed visual glitch in xmpp pairing that was reported live by a+ user who tracked me down in front of a coffee cart in Portland.+ (New bug reporting method of choice?)"""]]
doc/not.mdwn view
@@ -5,7 +5,7 @@ system. For a backup system that uses git and that git-annex supports storing data in, see [[special_remotes/bup]]. -* git-annex is not a filesystem or DropBox clone. However, the git-annex+* git-annex is not a filesystem or Dropbox clone. However, the git-annex [[assistant]] is addressing some of the same needs in its own unique ways. (There is also a FUSE filesystem built on top of git-annex, called [ShareBox](https://github.com/chmduquesne/sharebox-fs).)
@@ -11,5 +11,5 @@ utility, with a `-A` switch that enables git-annex support. * Emacs Org mode can auto-commit attached files to git-annex. * [git annex darktable integration](https://github.com/xxv/darktable-git-annex)-* Emacs's [Magit mode](http://www.emacswiki.org/emacs/Magit) has- [magit integration](http://melpa.milkbox.net/?utm_source=dlvr.it&utm_medium=twitter#/magit-annex)+* [Magit](http://github.com/magit/magit), an Emacs mode for Git, has+ [an extension](https://github.com/magit/magit-annex) for git annex.
doc/tips/emacs_integration.mdwn view
@@ -21,5 +21,5 @@ ---- -[magit-annex](https://github.com/kyleam/magit-annex) adds magit support-for a few features, including adding files and syncing.+[magit-annex](https://github.com/magit/magit-annex) adds git annex+operations to Magit.
+ doc/tips/megaannex/comment_2_c1158b7ec15646d64cae8215ce845642._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw"+ nickname="dxtrish"+ subject="comment 2"+ date="2014-09-07T21:16:09Z"+ content="""+Because megaannex apparently isn't working nowadays I have created a compatible program in Go. I think it should handle everything except REMOVE right now.++You can find it on github: https://github.com/dxtr/megaannex-go+"""]]
+ doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkmN2ZZIdYNiFKmEH7rz4jMb6sYsx_dptA"+ nickname="Jack William"+ subject="What if you do not want to encrypt?"+ date="2014-09-07T18:35:19Z"+ content="""+Once use case for GIT with Amazon S3 is to maintain a web site on S3 you can easily update from a local machine. In that case you would not want to encrypt. Is encryption optional? This isn't clear from the instructions.+"""]]
+ doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://schnouki.net/"+ nickname="Schnouki"+ subject="comment 6"+ date="2014-09-09T12:48:59Z"+ content="""+Jack, if you don't want to use encryption you can use `encryption=none` as documented [here](http://git-annex.branchable.com/special_remotes/S3/).++I'm not sure exactly what you're trying to do, but please note that you files won't be easily available on S3: they will be named as git-annex keys, with long and unreadable names such as \"SHA256E-s6311--c7533fdd259d872793b7298cbb56a1912e80c52a845661b0b9ff391c65ee2abc.html\" instead of \"index.html\".+"""]]
+ doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment view
@@ -0,0 +1,33 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmH7o6q2l99M-PQolOfbR3_i5B_jtTIcAE"+ nickname="Giovanni"+ subject="How to publish your files to the public"+ date="2014-09-13T15:29:18Z"+ content="""+I don't know if this is what Jack wanted, but you can upload your files to S3 and let them be accessible through a public URL.++First, go to (or create) the bucket you will use at [S3](https://console.aws.amazon.com/s3/) and add a public get policy to it:++```+ {+ \"Version\": \"2008-10-17\",+ \"Statement\": [+ {+ \"Sid\": \"AllowPublicRead\",+ \"Effect\": \"Allow\",+ \"Principal\": {+ \"AWS\": \"*\"+ },+ \"Action\": \"s3:GetObject\",+ \"Resource\": \"arn:aws:s3:::BUCKETNAME/*\"+ }+ ]+ }+```++Then set up your special remote with the options `encryption=none`, `bucket='BUCKETNAME'` `chunk=0` (and any others you want).++Your files will be accessible through `http://BUCKETNAME.s3-website-LOCATION.amazonaws.com/KEY` where location is the one specified through the options `datacenter` and KEY is the SHA-SOMETHING hash of the file, created by git annex and accessible if you run `git annex lookupkey FILEPATH`.++This way you can share a link to each file you have at your S3 remote.+"""]]
doc/todo/merge_in_ram___40__disk__41____63__.mdwn view
@@ -3,3 +3,6 @@ (merging fotos_enc_pg/synced/git-annex into git-annex...) Since git-annex is another branch (than master) and git usually needs a worktree for merging I assume that git-annex branch is temporarily checked out somewhere. Would it be possible to move this operation to RAM? Or a RAM-Disk?++> No, it is not checked out. All operations are done with the most+> effective available git plumbing. [[done]] --[[Joey]]
git-annex.1 view
@@ -473,7 +473,7 @@ .IP "\fBfsck [path ...]\fP" .IP With no parameters, this command checks the whole annex for consistency,-and warns about or fixes any problems found. This is a good compliment to+and warns about or fixes any problems found. This is a good complement to \fBgit fsck\fP. .IP With parameters, only the specified files are checked.@@ -1294,6 +1294,18 @@ run the commands with \fB\-c annex.alwayscommit=false\fP. You can later commit the data by running \fBgit annex merge\fP (or by automatic merges) or \fBgit annex sync\fP.+.IP+.IP "\fBannex.hardlink\fP"+Set this to \fBtrue\fP to make file contents be hard linked into the+repository when possible, instead of a more expensive copy.+.IP+Use with caution \-\- This can invalidate numcopies counting, since+with hard links, fewer copies of a file can exist. So, it is a good+idea to mark a repository using this setting as untrusted.+.IP+When a repository is set up using \fBgit clone \-\-shared\fP, git\-annex init+will automatically set annex.hardlink and mark the repository as+untrusted. .IP .IP "\fBannex.delayadd\fP" Makes the watch and assistant commands delay for the specified number of
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 5.20140831+Version: 5.20140915 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <joey@kitenet.net>@@ -92,10 +92,14 @@ Description: Enable use of EKG to monitor git-annex as it runs (at http://localhost:4242/) Default: False +Flag network-uri+ Description: Get Network.URI from the network-uri package+ Default: True+ Executable git-annex Main-Is: git-annex.hs Build-Depends: MissingH, hslogger, directory, filepath,- containers, utf8-string, network (>= 2.0), mtl (>= 2),+ containers, utf8-string, mtl (>= 2), bytestring, old-locale, time, dataenc, SHA, process, json, base (>= 4.5 && < 4.9), monad-control, exceptions (>= 0.6), transformers, IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance, process,@@ -106,6 +110,11 @@ Extensions: PackageImports -- Some things don't work with the non-threaded RTS. GHC-Options: -threaded++ if flag(network-uri)+ Build-Depends: network-uri (>= 2.6), network (>= 2.6)+ else+ Build-Depends: network (< 2.6), network (>= 2.0) if flag(Production) GHC-Options: -O2
standalone/linux/install-haskell-packages view
@@ -28,7 +28,6 @@ pkg=$1 shift 1 cabal unpack $pkg$1- shift 1 cd $pkg* git init git config user.name dummy@@ -45,7 +44,7 @@ fi fi done- cabalinstall "$@"+ cabalinstall rm -rf $pkg* cd .. }
standalone/no-th/haskell-patches/file-embed_remove-TH.patch view
@@ -1,17 +1,17 @@-From 2b41af230ea5675592e87a2362d9c17bcd8df1db Mon Sep 17 00:00:00 2001-From: dummy <dummy@example.com>-Date: Tue, 10 Jun 2014 19:00:44 +0000+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 | 100 +++---------------------------------------------------- 1 file changed, 5 insertions(+), 95 deletions(-)+ Data/FileEmbed.hs | 87 ++++---------------------------------------------------+ 1 file changed, 5 insertions(+), 82 deletions(-) diff --git a/Data/FileEmbed.hs b/Data/FileEmbed.hs-index aae9d5a..efdbb7b 100644+index 5617493..adacdba 100644 --- a/Data/FileEmbed.hs +++ b/Data/FileEmbed.hs-@@ -17,19 +17,18 @@+@@ -17,13 +17,13 @@ -- > {-# LANGUAGE TemplateHaskell #-} module Data.FileEmbed ( -- * Embed at compile time@@ -19,7 +19,7 @@ - , embedOneFileOf - , embedDir - , getDir-+ -- embedFile++ -- embedFile + --, embedOneFileOf + --, embedDir + getDir@@ -30,13 +30,7 @@ #endif , inject , injectFile- -- * Internal- , stringToBs-- , bsToExp- ) where- - import Language.Haskell.TH.Syntax-@@ -57,85 +56,12 @@ import Data.ByteString.Unsafe (unsafePackAddressLen)+@@ -56,73 +56,12 @@ import Data.ByteString.Unsafe (unsafePackAddressLen) import System.IO.Unsafe (unsafePerformIO) import System.FilePath ((</>)) @@ -102,27 +96,15 @@ - return $! TupE [LitE $ StringL path, exp'] - -bsToExp :: B.ByteString -> Q Exp--#if MIN_VERSION_template_haskell(2, 5, 0)--bsToExp bs =-- return $ VarE 'unsafePerformIO-- `AppE` (VarE 'unsafePackAddressLen-- `AppE` LitE (IntegerL $ fromIntegral $ B8.length bs)--#if MIN_VERSION_template_haskell(2, 8, 0)-- `AppE` LitE (StringPrimL $ B.unpack bs))--#else-- `AppE` LitE (StringPrimL $ B8.unpack bs))--#endif--#else -bsToExp bs = do - helper <- [| stringToBs |] - let chars = B8.unpack bs - return $! AppE helper $! LitE $! StringL chars--#endif - stringToBs :: String -> B.ByteString stringToBs = B8.pack -@@ -177,22 +103,6 @@ padSize i =+@@ -164,22 +103,6 @@ padSize i = let s = show i in replicate (sizeLen - length s) '0' ++ s @@ -146,5 +128,5 @@ inject :: B.ByteString -- ^ bs to inject -> B.ByteString -- ^ original BS containing dummy -- -2.0.0+2.1.0
standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch view
@@ -1,1833 +1,2019 @@-From 38834f94992679d8c4d936fec12eb32b82073553 Mon Sep 17 00:00:00 2001-From: dummy <dummy@example.com>-Date: Wed, 21 May 2014 05:23:19 +0000-Subject: [PATCH] splice TH------ Yesod/Form/Fields.hs | 738 +++++++++++++++++++++++++++++++++---------------- Yesod/Form/Functions.hs | 289 +++++++++++++------- Yesod/Form/Jquery.hs | 129 +++++++--- Yesod/Form/MassInput.hs | 233 ++++++++++++---- Yesod/Form/Nic.hs | 65 ++++-- yesod-form.cabal | 1 -- 6 files changed, 1054 insertions(+), 401 deletions(-)--diff --git a/Yesod/Form/Fields.hs b/Yesod/Form/Fields.hs-index cd67820..46b5d96 100644---- a/Yesod/Form/Fields.hs-+++ b/Yesod/Form/Fields.hs-@@ -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-- , optionsPersist-- , optionsPersistKey- , optionsPairs- , optionsEnum- ) where-@@ -72,6 +64,15 @@ import Control.Monad (when, unless)- import Data.Either (partitionEithers)- import Data.Maybe (listToMaybe, fromMaybe)- -+import qualified Text.Blaze as Text.Blaze.Internal-+import qualified Text.Blaze.Internal-+import qualified Text.Hamlet-+import qualified Yesod.Core.Widget-+import qualified Text.Css-+import qualified Data.Monoid-+import qualified Data.Foldable-+import qualified Control.Monad-+- import qualified Blaze.ByteString.Builder.Html.Utf8 as B- import Blaze.ByteString.Builder (writeByteString, toLazyByteString)- import Blaze.ByteString.Builder.Internal.Write (fromWriteList)-@@ -84,15 +85,12 @@ import Data.Text as T (Text, concat, intercalate, unpack, pack, splitOn)- 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)- --import Yesod.Persist.Core--- defaultFormMessage :: FormMessage -> Text- defaultFormMessage = englishFormMessage- -@@ -104,10 +102,24 @@ intField = Field- Right (a, "") -> Right a- _ -> Left $ MsgInvalidInteger s- -- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|--$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_arOn-+ -> 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=\"number\"");-+ Text.Hamlet.condH-+ [(isReq, -+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]-+ Nothing;-+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ id (toHtml (showVal val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = UrlEncoded- }- where-@@ -121,10 +133,24 @@ doubleField = Field- Right (a, "") -> Right a- _ -> Left $ MsgInvalidNumber s- -- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|--$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_arOz-+ -> 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=\"text\"");-+ Text.Hamlet.condH-+ [(isReq, -+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]-+ Nothing;-+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ id (toHtml (showVal val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = UrlEncoded- }- where showVal = either id (pack . show)-@@ -132,10 +158,24 @@ $newline never- dayField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Day- dayField = Field- { fieldParse = parseHelper $ parseDate . unpack-- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|--$newline never--<input id="#{theId}" name="#{name}" *{attrs} type="date" :isReq:required="" value="#{showVal val}">--|]-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOJ-+ -> 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=\"date\"");-+ Text.Hamlet.condH-+ [(isReq, -+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]-+ Nothing;-+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ id (toHtml (showVal val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = UrlEncoded- }- where showVal = either id (pack . show)-@@ -143,10 +183,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} :isReq:required="" value="#{showVal val}">--|]-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOW-+ -> 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) "\"");-+ Text.Hamlet.condH-+ [(isReq, -+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]-+ Nothing;-+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ id (toHtml (showVal val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = UrlEncoded- }- where-@@ -159,10 +212,18 @@ $newline never- htmlField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Html- htmlField = Field- { fieldParse = parseHelper $ Right . preEscapedText . sanitizeBalance-- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|--$newline never--<textarea id="#{theId}" name="#{name}" *{attrs}>#{showVal val}--|]-+ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_arP6-+ -> 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) "\"");-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ id (toHtml (showVal val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") }-+- , fieldEnctype = UrlEncoded- }- where showVal = either id (pack . renderHtml)-@@ -171,8 +232,6 @@ $newline never- -- br-tags.- newtype Textarea = Textarea { unTextarea :: Text }- deriving (Show, Read, Eq, PersistField, Ord, ToJSON, FromJSON)--instance PersistFieldSql Textarea where-- sqlType _ = SqlString- instance ToHtml Textarea where- toHtml =- unsafeByteString-@@ -190,10 +249,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|--$newline never--<textarea id="#{theId}" name="#{name}" *{attrs}>#{either id unTextarea val}--|]-+ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_arPf-+ -> 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) "\"");-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ id (toHtml (either id unTextarea val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") }-+- , fieldEnctype = UrlEncoded- }- -@@ -201,10 +268,19 @@ hiddenField :: (Monad m, PathPiece p, RenderMessage (HandlerSite m) FormMessage)- => Field m p- hiddenField = Field- { fieldParse = parseHelper $ maybe (Left MsgValueRequired) Right . fromPathPiece-- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|--$newline never--<input type="hidden" id="#{theId}" name="#{name}" *{attrs} value="#{either id toPathPiece val}">--|]-+ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_arPo-+ -> do { id-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<input type=\"hidden\" id=\"");-+ id (toHtml theId);-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");-+ id (toHtml name);-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");-+ id (toHtml (either id toPathPiece val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = UrlEncoded- }- -@@ -212,20 +288,55 @@ textField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Tex- textField = Field- { fieldParse = parseHelper $ Right- , fieldView = \theId name attrs val isReq ->-- [whamlet|--$newline never--<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required value="#{either id id val}">--|]-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"text\"");-+ Text.Hamlet.condH-+ [(isReq, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " required"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml (either id id val));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = UrlEncoded- }- - passwordField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Text- passwordField = Field- { fieldParse = parseHelper $ Right-- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|--$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_arPF-+ -> 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=\"password\"");-+ Text.Hamlet.condH-+ [(isReq, -+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]-+ Nothing;-+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ id (toHtml (either id id val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = UrlEncoded- }- -@@ -297,57 +408,24 @@ emailField = Field- case Email.canonicalizeEmail $ encodeUtf8 s of- Just e -> Right $ decodeUtf8With lenientDecode e- Nothing -> Left $ MsgInvalidEmail s-- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|--$newline never--<input id="#{theId}" name="#{name}" *{attrs} type="email" :isReq:required="" value="#{either id id val}">--|]-- , fieldEnctype = UrlEncoded-- }-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arQe-+ -> 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=\"email\"");-+ Text.Hamlet.condH-+ [(isReq, -+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]-+ Nothing;-+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ id (toHtml (either id id val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }- ---- |-------- Since 1.3.7--multiEmailField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m [Text]--multiEmailField = Field-- { fieldParse = parseHelper $-- \s ->-- let addrs = map validate $ splitOn "," s-- in case partitionEithers addrs of-- ([], good) -> Right good-- (bad, _) -> Left $ MsgInvalidEmail $ cat bad-- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|--$newline never--<input id="#{theId}" name="#{name}" *{attrs} type="email" multiple :isReq:required="" value="#{either id cat val}">--|]-- , fieldEnctype = UrlEncoded-- }-- where-- -- report offending address along with error-- validate a = case Email.validate $ encodeUtf8 a of-- Left e -> Left $ T.concat [a, " (", pack e, ")"]-- Right r -> Right $ emailToText r-- cat = intercalate ", "-- emailToText = decodeUtf8With lenientDecode . Email.toByteString----type AutoFocus = Bool--searchField :: Monad m => RenderMessage (HandlerSite m) FormMessage => AutoFocus -> Field m Text--searchField autoFocus = Field-- { fieldParse = parseHelper Right-- , fieldView = \theId name attrs val isReq -> do-- [whamlet|--$newline never--<input id="#{theId}" name="#{name}" *{attrs} type="search" :isReq:required="" :autoFocus:autofocus="" value="#{either id id val}">--|]-- when autoFocus $ do-- -- we want this javascript to be placed immediately after the field-- [whamlet|--$newline never--<script>if (!('autofocus' in document.createElement('input'))) {document.getElementById('#{theId}').focus();}--|]-- toWidget [cassius|-- ##{theId}-- -webkit-appearance: textfield-- |]- , fieldEnctype = UrlEncoded- }- -@@ -358,7 +436,30 @@ urlField = Field- Nothing -> Left $ MsgInvalidUrl s- Just _ -> Right s- , fieldView = \theId name attrs val isReq ->-- [whamlet|<input ##{theId} name=#{name} *{attrs} type=url :isReq:required value=#{either id id val}>|]-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"url\"");-+ Text.Hamlet.condH-+ [(isReq, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " required"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml (either id id val));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = UrlEncoded- }- -@@ -371,18 +472,56 @@ selectField :: (Eq a, RenderMessage site FormMessage)- => HandlerT site IO (OptionList a)- -> Field (HandlerT site IO) a- selectField = selectFieldHelper-- (\theId name attrs inside -> [whamlet|--$newline never--<select ##{theId} name=#{name} *{attrs}>^{inside}--|]) -- outside-- (\_theId _name isSel -> [whamlet|--$newline never--<option value=none :isSel:selected>_{MsgSelectNone}--|]) -- onOpt-- (\_theId _name _attrs value isSel text -> [whamlet|--$newline never--<option value=#{value} :isSel:selected>#{text}--|]) -- inside-+ (\theId name attrs inside -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<select id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) inside;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</select>") })-+ -- outside-+ (\_theId _name isSel -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<option value=\"none\"");-+ Text.Hamlet.condH-+ [(isSel, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ ((Control.Monad.liftM (toHtml .) getMessageRender)-+ >>=-+ (\ urender_arQS-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)-+ (urender_arQS MsgSelectNone)));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })-+ -- onOpt-+ (\_theId _name _attrs value isSel text -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<option value=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml value);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ Text.Hamlet.condH-+ [(isSel, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml text);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })-+ -- inside- - multiSelectFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg)- => [(msg, a)]-@@ -405,11 +544,48 @@ multiSelectField ioptlist =- view theId name attrs val isReq = do- opts <- fmap olOptions $ handlerToWidget ioptlist- let selOpts = map (id &&& (optselected val)) opts-- [whamlet|-- <select ##{theId} name=#{name} :isReq:required multiple *{attrs}>-- $forall (opt, optsel) <- selOpts-- <option value=#{optionExternalValue opt} :optsel:selected>#{optionDisplay opt}-- |]-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<select id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ Text.Hamlet.condH-+ [(isReq, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " required"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " multiple");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ Data.Foldable.mapM_-+ (\ (opt_arRl, optsel_arRm)-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<option value=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml (optionExternalValue opt_arRl));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ Text.Hamlet.condH-+ [(optsel_arRm, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml (optionDisplay opt_arRl));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })-+ selOpts;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</select>") }-+- where- optselected (Left _) _ = False- optselected (Right vals) opt = (optionInternalValue opt) `elem` vals-@@ -419,67 +595,172 @@ radioFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg)- -> Field (HandlerT site IO) a- radioFieldList = radioField . optionsPairs- --checkboxesFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg) => [(msg, a)]-- -> Field (HandlerT site IO) [a]--checkboxesFieldList = checkboxesField . optionsPairs----checkboxesField :: (Eq a, RenderMessage site FormMessage)-- => HandlerT site IO (OptionList a)-- -> Field (HandlerT site IO) [a]--checkboxesField ioptlist = (multiSelectField ioptlist)-- { fieldView =-- \theId name attrs val isReq -> do-- opts <- fmap olOptions $ handlerToWidget ioptlist-- let optselected (Left _) _ = False-- optselected (Right vals) opt = (optionInternalValue opt) `elem` vals-- [whamlet|-- <span ##{theId}>-- $forall opt <- opts-- <label>-- <input type=checkbox name=#{name} value=#{optionExternalValue opt} *{attrs} :optselected val opt:checked>-- #{optionDisplay opt}-- |]-- }- - radioField :: (Eq a, RenderMessage site FormMessage)- => HandlerT site IO (OptionList a)- -> Field (HandlerT site IO) a- radioField = selectFieldHelper-- (\theId _name _attrs inside -> [whamlet|--$newline never--<div ##{theId}>^{inside}--|])-- (\theId name isSel -> [whamlet|--$newline never--<label .radio for=#{theId}-none>-- <div>-- <input id=#{theId}-none type=radio name=#{name} value=none :isSel:checked>-- _{MsgSelectNone}--|])-- (\theId name attrs value isSel text -> [whamlet|--$newline never--<label .radio for=#{theId}-#{value}>-- <div>-- <input id=#{theId}-#{value} type=radio name=#{name} value=#{value} :isSel:checked *{attrs}>-- \#{text}--|])-+ (\theId _name _attrs inside -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<div id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) inside;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })-+-+ (\theId name isSel -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<label class=\"radio\" for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "-none\"><div><input id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "-none\" type=\"radio\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"none\"");-+ Text.Hamlet.condH-+ [(isSel, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ ((Control.Monad.liftM (toHtml .) getMessageRender)-+ >>=-+ (\ urender_arRA-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)-+ (urender_arRA MsgSelectNone)));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") })-+-+ (\theId name attrs value isSel text -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<label class=\"radio\" for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "-");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml value);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "\"><div><input id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "-");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml value);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "\" type=\"radio\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml value);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ Text.Hamlet.condH-+ [(isSel, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml text);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") })-+- - boolField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Bool- boolField = Field- { fieldParse = \e _ -> return $ boolParser e-- , fieldView = \theId name attrs val isReq -> [whamlet|--$newline never-- $if not isReq-- <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 { Text.Hamlet.condH-+ [(not isReq, -+ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "-none\" type=\"radio\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "\" value=\"none\" checked");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "-none\">");-+ ((Control.Monad.liftM (toHtml .) getMessageRender)-+ >>=-+ (\ urender_arRX-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)-+ (urender_arRX MsgSelectNone)));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "-yes\" type=\"radio\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"yes\"");-+ Text.Hamlet.condH-+ [(showVal id val, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "-yes\">");-+ ((Control.Monad.liftM (toHtml .) getMessageRender)-+ >>=-+ (\ urender_arRY-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)-+ (urender_arRY MsgBoolYes)));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "</label><input id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "-no\" type=\"radio\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"no\"");-+ Text.Hamlet.condH-+ [(showVal not val, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "-no\">");-+ ((Control.Monad.liftM (toHtml .) getMessageRender)-+ >>=-+ (\ urender_arRZ-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)-+ (urender_arRZ MsgBoolNo)));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") }- --<input id=#{theId}-no *{attrs} type=radio name=#{name} value=no :showVal not val:checked>--<label for=#{theId}-no>_{MsgBoolNo}--|]- , fieldEnctype = UrlEncoded- }- where-@@ -505,10 +786,25 @@ $newline never- checkBoxField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Bool- checkBoxField = Field- { fieldParse = \e _ -> return $ checkBoxParser e-- , fieldView = \theId name attrs val _ -> [whamlet|--$newline never--<input id=#{theId} *{attrs} type=checkbox name=#{name} value=yes :showVal id val:checked>--|]-+ , fieldView = \theId name attrs val _ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "\" type=\"checkbox\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"yes\"");-+ Text.Hamlet.condH-+ [(showVal id val, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = UrlEncoded- }- -@@ -552,50 +848,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]- --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-- )-- => [Filter a]-- -> [SelectOpt a]-- -> (a -> msg)-- -> HandlerT site IO (OptionList (Entity a))--optionsPersist filts ords toDisplay = fmap mkOptionList $ do-- mr <- getMessageRender-- pairs <- runDB $ selectList filts ords-- return $ map (\(Entity key value) -> Option-- { optionDisplay = mr (toDisplay value)-- , optionInternalValue = Entity key value-- , optionExternalValue = toPathPiece key-- }) pairs------ | An alternative to 'optionsPersist' which returns just the @Key@ instead of---- the entire @Entity@.-------- Since 1.3.2--optionsPersistKey-- :: (YesodPersist site-- , PersistEntity a-- , PersistQuery (YesodPersistBackend site (HandlerT site IO))-- , PathPiece (Key a)-- , RenderMessage site msg-- , PersistEntityBackend a ~ PersistMonadBackend (YesodPersistBackend site (HandlerT site IO)))-- => [Filter a]-- -> [SelectOpt a]-- -> (a -> msg)-- -> HandlerT site IO (OptionList (Key a))----optionsPersistKey filts ords toDisplay = fmap mkOptionList $ do-- mr <- getMessageRender-- pairs <- runDB $ selectList filts ords-- return $ map (\(Entity key value) -> Option-- { optionDisplay = mr (toDisplay value)-- , optionInternalValue = key-- , optionExternalValue = toPathPiece key-- }) pairs--- selectFieldHelper- :: (Eq a, RenderMessage site FormMessage)- => (Text -> Text -> [(Text, Text)] -> WidgetT site IO () -> WidgetT site IO ())-@@ -638,9 +890,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_arSN-+ -> do { id-+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");-+ id (toHtml id');-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");-+ id (toHtml name);-+ id-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"file\"");-+ Text.Hamlet.condH-+ [(isReq, -+ id ((Text.Blaze.Internal.preEscapedText . pack) " required"))]-+ Nothing;-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fieldEnctype = Multipart- }- -@@ -667,10 +931,20 @@ 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'-- , fvInput = [whamlet|--$newline never--<input type=file name=#{name} ##{id'} *{fsAttrs fs}>--|]-+ , fvInput = do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<input type=\"file\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml id');-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) (fsAttrs fs));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fvErrors = errs- , fvRequired = True- }-@@ -699,10 +973,20 @@ 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'-- , fvInput = [whamlet|--$newline never--<input type=file name=#{name} ##{id'} *{fsAttrs fs}>--|]-+ , fvInput = do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<input type=\"file\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" id=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml id');-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Hamlet.attrsToHtml . toAttributes) (fsAttrs fs));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- , fvErrors = errs- , fvRequired = False- }-diff --git a/Yesod/Form/Functions.hs b/Yesod/Form/Functions.hs-index d84633e..9d9257f 100644---- a/Yesod/Form/Functions.hs-+++ b/Yesod/Form/Functions.hs-@@ -25,7 +25,6 @@ module Yesod.Form.Functions- , generateFormPost- , generateFormGet- -- * More than one form on a handler-- , identifyForm- -- * Rendering- , FormRender- , renderTable-@@ -56,12 +55,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.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-@@ -213,7 +216,14 @@ postHelper form env = do- let token =- case reqToken req of- Nothing -> mempty-- Just n -> [shamlet|<input type=hidden name=#{tokenKey} value=#{n}>|]-+ Just n -> do { id-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<input type=\"hidden\" name=\"");-+ id (toHtml tokenKey);-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");-+ id (toHtml n);-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\">") }-+- m <- getYesod- langs <- languages- ((res, xml), enctype) <- runFormGeneric (form token) m langs env-@@ -282,61 +292,17 @@ getHelper :: MonadHandler m- -> Maybe (Env, FileEnv)- -> m (a, Enctype)- getHelper form env = do-- let fragment = [shamlet|<input type=hidden name=#{getKey}>|]-+ let fragment = do { id-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<input type=\"hidden\" name=\"");-+ id (toHtml getKey);-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\">") }-+- langs <- languages- m <- getYesod- runFormGeneric (form fragment) m langs env- - ---- | Creates a hidden field on the form that identifies it. This---- identification is then used to distinguish between /missing/---- and /wrong/ form data when a single handler contains more than---- one form.-------- For instance, if you have the following code on your handler:-------- > ((fooRes, fooWidget), fooEnctype) <- runFormPost fooForm---- > ((barRes, barWidget), barEnctype) <- runFormPost barForm-------- Then replace it with-------- > ((fooRes, fooWidget), fooEnctype) <- runFormPost $ identifyForm "foo" fooForm---- > ((barRes, barWidget), barEnctype) <- runFormPost $ identifyForm "bar" barForm-------- Note that it's your responsibility to ensure that the---- identification strings are unique (using the same one twice on a---- single handler will not generate any errors). This allows you---- to create a variable number of forms and still have them work---- even if their number or order change between the HTML---- generation and the form submission.--identifyForm-- :: Monad m-- => Text -- ^ Form identification string.-- -> (Html -> MForm m (FormResult a, WidgetT (HandlerSite m) IO ()))-- -> (Html -> MForm m (FormResult a, WidgetT (HandlerSite m) IO ()))--identifyForm identVal form = \fragment -> do-- -- Create hidden <input>.-- let fragment' =-- [shamlet|-- <input type=hidden name=#{identifyFormKey} value=#{identVal}>-- #{fragment}-- |]---- -- Check if we got its value back.-- mp <- askParams-- let missing = (mp >>= Map.lookup identifyFormKey) /= Just [identVal]---- -- Run the form proper (with our hidden <input>). If the-- -- data is missing, then do not provide any params to the-- -- form, which will turn its result into FormMissing. Also,-- -- doing this avoids having lots of fields with red errors.-- let eraseParams | missing = local (\(_, h, l) -> (Nothing, h, l))-- | otherwise = id-- eraseParams (form fragment')----identifyFormKey :: Text--identifyFormKey = "_formid"--- - type FormRender m a =- AForm m a-@@ -347,19 +313,66 @@ renderTable, renderDivs, renderDivsNoLabels :: Monad m => FormRender m a- renderTable aform fragment = do- (res, views') <- aFormToForm aform- let views = views' []-- let widget = [whamlet|--$newline never--\#{fragment}--$forall view <- views-- <tr :fvRequired view:.required :not $ fvRequired view:.optional>-- <td>-- <label for=#{fvId view}>#{fvLabel view}-- $maybe tt <- fvTooltip view-- <div .tooltip>#{tt}-- <td>^{fvInput view}-- $maybe err <- fvErrors view-- <td .errors>#{err}--|]-+ let widget = do { (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml fragment);-+ Data.Foldable.mapM_-+ (\ view_aagq-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<tr");-+ Text.Hamlet.condH-+ [(or [fvRequired view_aagq, not (fvRequired view_aagq)], -+ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " class=\"");-+ Text.Hamlet.condH-+ [(fvRequired view_aagq, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]-+ Nothing;-+ Text.Hamlet.condH-+ [(not (fvRequired view_aagq), -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"") })]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "><td><label for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aagq));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml (fvLabel view_aagq));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>");-+ Text.Hamlet.maybeH-+ (fvTooltip view_aagq)-+ (\ tt_aagr-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<div class=\"tooltip\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml tt_aagr);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</td><td>");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aagq);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</td>");-+ Text.Hamlet.maybeH-+ (fvErrors view_aagq)-+ (\ err_aags-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<td class=\"errors\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml err_aags);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</td>") })-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</tr>") })-+ views }-+- return (res, widget)- - -- | render a field inside a div-@@ -372,19 +385,67 @@ renderDivsMaybeLabels :: Monad m => Bool -> FormRender m a- renderDivsMaybeLabels withLabels aform fragment = do- (res, views') <- aFormToForm aform- let views = views' []-- let widget = [whamlet|--$newline never--\#{fragment}--$forall view <- views-- <div :fvRequired view:.required :not $ fvRequired view:.optional>-- $if withLabels-- <label for=#{fvId view}>#{fvLabel view}-- $maybe tt <- fvTooltip view-- <div .tooltip>#{tt}-- ^{fvInput view}-- $maybe err <- fvErrors view-- <div .errors>#{err}--|]-+ let widget = do { (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml fragment);-+ Data.Foldable.mapM_-+ (\ view_aagE-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<div");-+ Text.Hamlet.condH-+ [(or [fvRequired view_aagE, not (fvRequired view_aagE)], -+ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) " class=\"");-+ Text.Hamlet.condH-+ [(fvRequired view_aagE, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]-+ Nothing;-+ Text.Hamlet.condH-+ [(not (fvRequired view_aagE), -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\"") })]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ Text.Hamlet.condH-+ [(withLabels, -+ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "<label for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aagE));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml (fvLabel view_aagE));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })]-+ Nothing;-+ Text.Hamlet.maybeH-+ (fvTooltip view_aagE)-+ (\ tt_aagF-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<div class=\"tooltip\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml tt_aagF);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aagE);-+ Text.Hamlet.maybeH-+ (fvErrors view_aagE)-+ (\ err_aagG-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<div class=\"errors\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml err_aagG);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })-+ views }-+- return (res, widget)- - -- | Render a form using Bootstrap v2-friendly shamlet syntax.-@@ -410,19 +471,63 @@ renderBootstrap aform fragment = do- let views = views' []- has (Just _) = True- has Nothing = False-- let widget = [whamlet|-- $newline never-- \#{fragment}-- $forall view <- views-- <div .control-group .clearfix :fvRequired view:.required :not $ fvRequired view:.optional :has $ fvErrors view:.error>-- <label .control-label for=#{fvId view}>#{fvLabel view}-- <div .controls .input>-- ^{fvInput view}-- $maybe tt <- fvTooltip view-- <span .help-block>#{tt}-- $maybe err <- fvErrors view-- <span .help-block>#{err}-- |]-+ let widget = do { (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml fragment);-+ Data.Foldable.mapM_-+ (\ view_aagR-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<div class=\"control-group clearfix ");-+ Text.Hamlet.condH-+ [(fvRequired view_aagR, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]-+ Nothing;-+ Text.Hamlet.condH-+ [(not (fvRequired view_aagR), -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "optional "))]-+ Nothing;-+ Text.Hamlet.condH-+ [(has (fvErrors view_aagR), -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "error"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "\"><label class=\"control-label\" for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aagR));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml (fvLabel view_aagR));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "</label><div class=\"controls input\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aagR);-+ Text.Hamlet.maybeH-+ (fvTooltip view_aagR)-+ (\ tt_aagS-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<span class=\"help-block\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml tt_aagS);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") })-+ Nothing;-+ Text.Hamlet.maybeH-+ (fvErrors view_aagR)-+ (\ err_aagT-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<span class=\"help-block\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml err_aagT);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") })-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . pack) "</div></div>") })-+ views }-+- return (res, widget)- {-# DEPRECATED renderBootstrap "Please use the Yesod.Form.Bootstrap3 module." #-}- -diff --git a/Yesod/Form/Jquery.hs b/Yesod/Form/Jquery.hs-index 2c4ae25..ed9b366 100644---- a/Yesod/Form/Jquery.hs-+++ b/Yesod/Form/Jquery.hs-@@ -12,12 +12,24 @@ module Yesod.Form.Jquery- , Default (..)- ) where- -+import qualified Text.Blaze as Text.Blaze.Internal-+import qualified Text.Blaze.Internal-+import qualified Text.Hamlet-+import qualified Yesod.Core.Widget-+import qualified Text.Css-+import qualified Data.Monoid-+import qualified Data.Foldable-+import qualified Control.Monad-+import qualified Text.Julius-+import qualified Data.Text.Lazy.Builder-+import qualified Text.Shakespeare-+- 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)- -@@ -60,27 +72,59 @@ jqueryDayField jds = Field- . readMay- . unpack- , fieldView = \theId name attrs val isReq -> do-- toWidget [shamlet|--$newline never--<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=\"date\"");-+ Text.Hamlet.condH-+ [(isReq, -+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]-+ Nothing;-+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ id (toHtml (showVal val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- addScript' urlJqueryJs- addScript' urlJqueryUiJs- addStylesheet' urlJqueryUiCss-- toWidget [julius|--$(function(){-- var i = document.getElementById("#{rawJS theId}");-- if (i.type != "date") {-- $(i).datepicker({-- dateFormat:'yy-mm-dd',-- changeMonth:#{jsBool $ jdsChangeMonth jds},-- changeYear:#{jsBool $ jdsChangeYear jds},-- numberOfMonths:#{rawJS $ mos $ jdsNumberOfMonths jds},-- yearRange:#{toJSON $ jdsYearRange jds}-- });-- }--});--|]-+ toWidget $ Text.Julius.asJavascriptUrl-+ (\ _render_a1lYC-+ -> mconcat-+ [Text.Julius.Javascript-+ ((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.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.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ ",\n changeYear:"),-+ Text.Julius.toJavascript (jsBool (jdsChangeYear jds)),-+ Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ ",\n numberOfMonths:"),-+ Text.Julius.toJavascript (rawJS (mos (jdsNumberOfMonths jds))),-+ Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ ",\n yearRange:"),-+ Text.Julius.toJavascript (toJSON (jdsYearRange jds)),-+ Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ "\n });\n }\n});")])-+- , fieldEnctype = UrlEncoded- }- where-@@ -101,16 +145,47 @@ jqueryAutocompleteField :: (RenderMessage site FormMessage, YesodJquery site)- jqueryAutocompleteField src = Field- { fieldParse = parseHelper $ Right- , fieldView = \theId name attrs val isReq -> do-- toWidget [shamlet|--$newline never--<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required="" value="#{either id id val}" .autocomplete>--|]-+ toWidget $ do { id-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<input class=\"autocomplete\" id=\"");-+ id (toHtml theId);-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");-+ id (toHtml name);-+ id-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"text\"");-+ Text.Hamlet.condH-+ [(isReq, -+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]-+ Nothing;-+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");-+ id (toHtml (either id id val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }-+- addScript' urlJqueryJs- addScript' urlJqueryUiJs- addStylesheet' urlJqueryUiCss-- toWidget [julius|--$(function(){$("##{rawJS theId}").autocomplete({source:"@{src}",minLength:2})});--|]-+ toWidget $ Text.Julius.asJavascriptUrl-+ (\ _render_a1lYP-+ -> mconcat-+ [Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ "\n$(function(){$(\"#"),-+ Text.Julius.toJavascript (rawJS theId),-+ Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ "\").autocomplete({source:\""),-+ Text.Julius.Javascript-+ (Data.Text.Lazy.Builder.fromText-+ (_render_a1lYP src [])),-+ Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ "\",minLength:2})});")])-+- , fieldEnctype = UrlEncoded- }- -diff --git a/Yesod/Form/MassInput.hs b/Yesod/Form/MassInput.hs-index a2b434d..6766ad8 100644---- a/Yesod/Form/MassInput.hs-+++ b/Yesod/Form/MassInput.hs-@@ -9,6 +9,16 @@ module Yesod.Form.MassInput- , massTable- ) where- -+import qualified Data.Text-+import qualified Text.Blaze as Text.Blaze.Internal-+import qualified Text.Blaze.Internal-+import qualified Text.Hamlet-+import qualified Yesod.Core.Widget-+import qualified Text.Css-+import qualified Data.Monoid-+import qualified Data.Foldable-+import qualified Control.Monad-+- import Yesod.Form.Types- import Yesod.Form.Functions- import Yesod.Form.Fields (checkBoxField)-@@ -70,16 +80,28 @@ inputList label fixXml single mdef = formToAForm $ do- { fvLabel = label- , fvTooltip = Nothing- , fvId = theId-- , fvInput = [whamlet|--$newline never--^{fixXml views}--<p>-- $forall xml <- xmls-- ^{xml}-- <input .count type=hidden name=#{countName} value=#{count}>-- <input type=checkbox name=#{addName}>-- Add another row--|]-+ , fvInput = do { (Yesod.Core.Widget.asWidgetT . toWidget) (fixXml views);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<p>");-+ Data.Foldable.mapM_-+ (\ xml_aUS3 -> (Yesod.Core.Widget.asWidgetT . toWidget) xml_aUS3)-+ xmls;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "<input class=\"count\" type=\"hidden\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml countName);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "\" value=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml count);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "\"><input type=\"checkbox\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml addName);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "\">Add another row</p>") }-+- , fvErrors = Nothing- , fvRequired = False- }])-@@ -92,10 +114,14 @@ withDelete af = do- deleteName <- newFormIdent- (menv, _, _) <- ask- res <- case menv >>= Map.lookup deleteName . fst of-- Just ("yes":_) -> return $ Left [whamlet|--$newline never--<input type=hidden name=#{deleteName} value=yes>--|]-+ Just ("yes":_) -> return $ Left $ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "<input type=\"hidden\" name=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml deleteName);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "\" value=\"yes\">") }-+- _ -> do- (_, xml2) <- aFormToForm $ areq checkBoxField FieldSettings- { fsLabel = SomeMessage MsgDelete-@@ -121,32 +147,155 @@ fixme eithers =- massDivs, massTable- :: [[FieldView site]]- -> WidgetT site IO ()--massDivs viewss = [whamlet|--$newline never--$forall views <- viewss-- <fieldset>-- $forall view <- views-- <div :fvRequired view:.required :not $ fvRequired view:.optional>-- <label for=#{fvId view}>#{fvLabel view}-- $maybe tt <- fvTooltip view-- <div .tooltip>#{tt}-- ^{fvInput view}-- $maybe err <- fvErrors view-- <div .errors>#{err}--|]-+massDivs viewss = Data.Foldable.mapM_-+ (\ views_aUSm-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "<fieldset>");-+ Data.Foldable.mapM_-+ (\ view_aUSn-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<div");-+ Text.Hamlet.condH-+ [(or [fvRequired view_aUSn, not (fvRequired view_aUSn)], -+ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ " class=\"");-+ Text.Hamlet.condH-+ [(fvRequired view_aUSn, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "required "))]-+ Nothing;-+ Text.Hamlet.condH-+ [(not (fvRequired view_aUSn), -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "optional"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "\"") })]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "><label for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aUSn));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml (fvLabel view_aUSn));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>");-+ Text.Hamlet.maybeH-+ (fvTooltip view_aUSn)-+ (\ tt_aUSo-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "<div class=\"tooltip\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml tt_aUSo);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "</div>") })-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aUSn);-+ Text.Hamlet.maybeH-+ (fvErrors view_aUSn)-+ (\ err_aUSp-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "<div class=\"errors\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml err_aUSp);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "</div>") })-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</div>") })-+ views_aUSm;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "</fieldset>") })-+ viewss-+-+-+massTable viewss = Data.Foldable.mapM_-+ (\ views_aUSu-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "<fieldset><table>");-+ Data.Foldable.mapM_-+ (\ view_aUSv-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<tr");-+ Text.Hamlet.condH-+ [(or [fvRequired view_aUSv, not (fvRequired view_aUSv)], -+ do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ " class=\"");-+ Text.Hamlet.condH-+ [(fvRequired view_aUSv, -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "required "))]-+ Nothing;-+ Text.Hamlet.condH-+ [(not (fvRequired view_aUSv), -+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "optional"))]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "\"") })]-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "><td><label for=\"");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aUSv));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml (fvLabel view_aUSv));-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>");-+ Text.Hamlet.maybeH-+ (fvTooltip view_aUSv)-+ (\ tt_aUSw-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "<div class=\"tooltip\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml tt_aUSw);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "</div>") })-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "</td><td>");-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aUSv);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</td>");-+ Text.Hamlet.maybeH-+ (fvErrors view_aUSv)-+ (\ err_aUSx-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "<td class=\"errors\">");-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ (toHtml err_aUSx);-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "</td>") })-+ Nothing;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</tr>") })-+ views_aUSu;-+ (Yesod.Core.Widget.asWidgetT . toWidget)-+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)-+ "</table></fieldset>") })-+ viewss- --massTable viewss = [whamlet|--$newline never--$forall views <- viewss-- <fieldset>-- <table>-- $forall view <- views-- <tr :fvRequired view:.required :not $ fvRequired view:.optional>-- <td>-- <label for=#{fvId view}>#{fvLabel view}-- $maybe tt <- fvTooltip view-- <div .tooltip>#{tt}-- <td>^{fvInput view}-- $maybe err <- fvErrors view-- <td .errors>#{err}--|]-diff --git a/Yesod/Form/Nic.hs b/Yesod/Form/Nic.hs-index 2862678..04ddaba 100644---- a/Yesod/Form/Nic.hs-+++ b/Yesod/Form/Nic.hs-@@ -9,11 +9,24 @@ module Yesod.Form.Nic- , nicHtmlField- ) where- -+import qualified Text.Blaze as Text.Blaze.Internal-+import qualified Text.Blaze.Internal-+import qualified Text.Hamlet-+import qualified Yesod.Core.Widget-+import qualified Text.Css-+import qualified Data.Monoid-+import qualified Data.Foldable-+import qualified Control.Monad-+import qualified Text.Julius-+import qualified Data.Text.Lazy.Builder-+import qualified Text.Shakespeare-+-+- import Yesod.Core- import Yesod.Form- import Text.HTML.SanitizeXSS (sanitizeBalance)--import Text.Hamlet (shamlet)--import Text.Julius (julius, rawJS)-+--import Text.Hamlet (shamlet)-+import Text.Julius ( rawJS)- import Text.Blaze.Html.Renderer.String (renderHtml)- import Data.Text (Text, pack)- import Data.Maybe (listToMaybe)-@@ -27,20 +40,48 @@ 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-- toWidget [shamlet|--$newline never-- <textarea id="#{theId}" *{attrs} name="#{name}" .html>#{showVal val}--|]-+ toWidget $ do { id-+ ((Text.Blaze.Internal.preEscapedText . pack)-+ "<textarea class=\"html\" id=\"");-+ id (toHtml theId);-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");-+ id (toHtml name);-+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");-+ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs);-+ id ((Text.Blaze.Internal.preEscapedText . pack) ">");-+ id (toHtml (showVal val));-+ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") }-+- addScript' urlNicEdit- master <- getYesod- toWidget $- case jsLoader master of-- BottomOfHeadBlocking -> [julius|--bkLib.onDomLoaded(function(){new nicEditor({fullPanel:true}).panelInstance("#{rawJS theId}")});--|]-- _ -> [julius|--(function(){new nicEditor({fullPanel:true}).panelInstance("#{rawJS theId}")})();--|]-+ BottomOfHeadBlocking -> Text.Julius.asJavascriptUrl-+ (\ _render_a1qhO-+ -> Data.Monoid.mconcat-+ [Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ "\nbkLib.onDomLoaded(function(){new nicEditor({true}).panelInstance(\""),-+ Text.Julius.toJavascript (rawJS theId),-+ Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ "\")});")])-+-+ _ -> Text.Julius.asJavascriptUrl-+ (\ _render_a1qhS-+ -> Data.Monoid.mconcat-+ [Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ "\n(function(){new nicEditor({true}).panelInstance(\""),-+ Text.Julius.toJavascript (rawJS theId),-+ Text.Julius.Javascript-+ ((Data.Text.Lazy.Builder.fromText-+ . Text.Shakespeare.pack')-+ "\")})();")])-+- , fieldEnctype = UrlEncoded- }- where-diff --git a/yesod-form.cabal b/yesod-form.cabal-index 56a3053..e7a0729 100644---- a/yesod-form.cabal-+++ b/yesod-form.cabal-@@ -43,7 +43,6 @@ library- exposed-modules: Yesod.Form- Yesod.Form.Types- Yesod.Form.Functions-- Yesod.Form.Bootstrap3- Yesod.Form.Input- Yesod.Form.Fields- Yesod.Form.Jquery--- -2.0.0.rc2+From 6aabd510081681f81f4259190be32fbb2819b46c Mon Sep 17 00:00:00 2001+From: Joey Hess <joey@kitenet.net>+Date: Fri, 12 Sep 2014 21:30:27 -0400+Subject: [PATCH] splice TH++---+ Yesod/Form/Bootstrap3.hs | 183 +++++++++---+ Yesod/Form/Fields.hs | 753 ++++++++++++++++++++++++++++++++++++++---------+ Yesod/Form/Functions.hs | 257 +++++++++++++---+ Yesod/Form/Jquery.hs | 134 +++++++--+ Yesod/Form/MassInput.hs | 226 +++++++++++---+ Yesod/Form/Nic.hs | 67 ++++-+ yesod-form.cabal | 1 -+ 7 files changed, 1319 insertions(+), 302 deletions(-)++diff --git a/Yesod/Form/Bootstrap3.hs b/Yesod/Form/Bootstrap3.hs+index 84e85fc..943c416 100644+--- a/Yesod/Form/Bootstrap3.hs++++ b/Yesod/Form/Bootstrap3.hs+@@ -152,44 +152,144 @@ renderBootstrap3 formLayout aform fragment = do+ let views = views' []+ has (Just _) = True+ has Nothing = False+- widget = [whamlet|+- $newline never+- #{fragment}+- $forall view <- views+- <div .form-group :fvRequired view:.required :not $ fvRequired view:.optional :has $ fvErrors view:.has-error>+- $case formLayout+- $of BootstrapBasicForm+- $if fvId view /= bootstrapSubmitId+- <label for=#{fvId view}>#{fvLabel view}+- ^{fvInput view}+- ^{helpWidget view}+- $of BootstrapInlineForm+- $if fvId view /= bootstrapSubmitId+- <label .sr-only for=#{fvId view}>#{fvLabel view}+- ^{fvInput view}+- ^{helpWidget view}+- $of BootstrapHorizontalForm labelOffset labelSize inputOffset inputSize+- $if fvId view /= bootstrapSubmitId+- <label .control-label .#{toOffset labelOffset} .#{toColumn labelSize} for=#{fvId view}>#{fvLabel view}+- <div .#{toOffset inputOffset} .#{toColumn inputSize}>+- ^{fvInput view}+- ^{helpWidget view}+- $else+- <div .#{toOffset (addGO inputOffset (addGO labelOffset labelSize))} .#{toColumn inputSize}>+- ^{fvInput view}+- ^{helpWidget view}+- |]++ widget = do { (asWidgetT . toWidget) (toHtml fragment);++ Data.Foldable.mapM_++ (\ view_as0a++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "<div class=\"form-group ");++ Text.Hamlet.condH++ [(fvRequired view_as0a, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "required "))]++ Nothing;++ Text.Hamlet.condH++ [(not (fvRequired view_as0a), ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "optional "))]++ Nothing;++ Text.Hamlet.condH++ [(has (fvErrors view_as0a), ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "has-error"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");++ case formLayout of {++ ; BootstrapBasicForm++ -> do { Text.Hamlet.condH++ [((/=) (fvId view_as0a) bootstrapSubmitId, ++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "<label for=\"");++ (asWidgetT . toWidget) (toHtml (fvId view_as0a));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");++ (asWidgetT . toWidget) (toHtml (fvLabel view_as0a));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "</label>") })]++ Nothing;++ (asWidgetT . toWidget) (fvInput view_as0a);++ (asWidgetT . toWidget) (helpWidget view_as0a) }++ ; BootstrapInlineForm++ -> do { Text.Hamlet.condH++ [((/=) (fvId view_as0a) bootstrapSubmitId, ++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "<label class=\"sr-only\" for=\"");++ (asWidgetT . toWidget) (toHtml (fvId view_as0a));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");++ (asWidgetT . toWidget) (toHtml (fvLabel view_as0a));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "</label>") })]++ Nothing;++ (asWidgetT . toWidget) (fvInput view_as0a);++ (asWidgetT . toWidget) (helpWidget view_as0a) }++ BootstrapHorizontalForm labelOffset_as0b++ labelSize_as0c++ inputOffset_as0d++ inputSize_as0e++ -> Text.Hamlet.condH++ [((/=) (fvId view_as0a) bootstrapSubmitId, ++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "<label class=\"control-label ");++ (asWidgetT . toWidget) (toHtml (toOffset labelOffset_as0b));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) " ");++ (asWidgetT . toWidget) (toHtml (toColumn labelSize_as0c));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\" for=\"");++ (asWidgetT . toWidget) (toHtml (fvId view_as0a));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");++ (asWidgetT . toWidget) (toHtml (fvLabel view_as0a));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "</label><div class=\"");++ (asWidgetT . toWidget) (toHtml (toOffset inputOffset_as0d));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) " ");++ (asWidgetT . toWidget) (toHtml (toColumn inputSize_as0e));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");++ (asWidgetT . toWidget) (fvInput view_as0a);++ (asWidgetT . toWidget) (helpWidget view_as0a);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</div>") })]++ (Just++ (do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "<div class=\"");++ (asWidgetT . toWidget)++ (toHtml++ (toOffset++ (addGO++ inputOffset_as0d++ (addGO labelOffset_as0b labelSize_as0c))));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) " ");++ (asWidgetT . toWidget) (toHtml (toColumn inputSize_as0e));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");++ (asWidgetT . toWidget) (fvInput view_as0a);++ (asWidgetT . toWidget) (helpWidget view_as0a);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "</div>") })) };++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</div>") })++ views }+++ return (res, widget)+ + + -- | (Internal) Render a help widget for tooltips and errors.+ helpWidget :: FieldView site -> WidgetT site IO ()+-helpWidget view = [whamlet|+- $maybe tt <- fvTooltip view+- <span .help-block>#{tt}+- $maybe err <- fvErrors view+- <span .help-block>#{err}+-|]++helpWidget view = do { Text.Hamlet.maybeH++ (fvTooltip view)++ (\ tt_as0k++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "<span class=\"help-block\">");++ (asWidgetT . toWidget) (toHtml tt_as0k);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</span>") })++ Nothing;++ Text.Hamlet.maybeH++ (fvErrors view)++ (\ err_as0l++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "<span class=\"help-block\">");++ (asWidgetT . toWidget) (toHtml err_as0l);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</span>") })++ Nothing }+++ + + -- | How the 'bootstrapSubmit' button should be rendered.+@@ -244,7 +344,22 @@ mbootstrapSubmit+ => BootstrapSubmit msg -> MForm m (FormResult (), FieldView site)+ mbootstrapSubmit (BootstrapSubmit msg classes attrs) =+ let res = FormSuccess ()+- widget = [whamlet|<button class="btn #{classes}" type=submit *{attrs}>_{msg}|]++ widget = do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "<button class=\"btn ");++ (asWidgetT . toWidget) (toHtml classes);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack)++ "\" type=\"submit\"");++ (asWidgetT . toWidget)++ ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) ">");++ ((liftM (toHtml .) getMessageRender)++ >>= (\ urender_as0w -> (asWidgetT . toWidget) (urender_as0w msg)));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</button>") }+++ fv = FieldView { fvLabel = ""+ , fvTooltip = Nothing+ , fvId = bootstrapSubmitId+diff --git a/Yesod/Form/Fields.hs b/Yesod/Form/Fields.hs+index c6091a9..3d7b267 100644+--- a/Yesod/Form/Fields.hs++++ b/Yesod/Form/Fields.hs+@@ -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+- , optionsPersist+- , optionsPersistKey+ , optionsPairs+ , optionsEnum+ ) where+@@ -72,6 +64,15 @@ import Control.Monad (when, unless)+ import Data.Either (partitionEithers)+ import Data.Maybe (listToMaybe, fromMaybe)+ ++import qualified Text.Blaze as Text.Blaze.Internal++import qualified Text.Blaze.Internal++import qualified Text.Hamlet++import qualified Yesod.Core.Widget++import qualified Text.Css++import qualified Data.Monoid++import qualified Data.Foldable++import qualified Control.Monad+++ import qualified Blaze.ByteString.Builder.Html.Utf8 as B+ import Blaze.ByteString.Builder (writeByteString, toLazyByteString)+ import Blaze.ByteString.Builder.Internal.Write (fromWriteList)+@@ -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)+ +-import Yesod.Persist.Core+-+ defaultFormMessage :: FormMessage -> Text+ defaultFormMessage = englishFormMessage+ +@@ -111,10 +109,25 @@ intField = Field+ Right (a, "") -> Right a+ _ -> Left $ MsgInvalidInteger s+ +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|+-$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_aJJh++ -> 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=\"number\" step=\"1\"");++ condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ id (toHtml (showVal val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ where+@@ -128,10 +141,25 @@ doubleField = Field+ Right (a, "") -> Right a+ _ -> Left $ MsgInvalidNumber s+ +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|+-$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_aJJu++ -> 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=\"number\" step=\"any\"");++ condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ id (toHtml (showVal val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ where showVal = either id (pack . show)+@@ -139,10 +167,24 @@ $newline never+ dayField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Day+ dayField = Field+ { fieldParse = parseHelper $ parseDate . unpack+- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|+-$newline never+-<input id="#{theId}" name="#{name}" *{attrs} type="date" :isReq:required="" value="#{showVal val}">+-|]++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJJF++ -> 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=\"date\"");++ condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ id (toHtml (showVal val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ where showVal = either id (pack . show)+@@ -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} :isReq:required="" value="#{showVal val}">+-|]++ , 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) "\"");++ condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ id (toHtml (showVal val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ where+@@ -166,10 +221,23 @@ $newline never+ htmlField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Html+ htmlField = Field+ { fieldParse = parseHelper $ Right . preEscapedText . sanitizeBalance+- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|+-$newline never+-<textarea :isReq:required="" id="#{theId}" name="#{name}" *{attrs}>#{showVal val}+-|]++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJK4++ -> do { id++ ((Text.Blaze.Internal.preEscapedText . pack) "<textarea");++ condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " id=\"");++ id (toHtml theId);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");++ id (toHtml name);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">");++ id (toHtml (showVal val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") }+++ , fieldEnctype = UrlEncoded+ }+ where showVal = either id (pack . renderHtml)+@@ -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|+-$newline never+-<textarea id="#{theId}" name="#{name}" *{attrs}>#{either id unTextarea val}+-|]++ , 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) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">");++ id (toHtml (either id unTextarea val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") }+++ , fieldEnctype = UrlEncoded+ }+ +@@ -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+- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|+-$newline never+-<input type="hidden" id="#{theId}" name="#{name}" *{attrs} value="#{either id toPathPiece val}">+-|]++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_aJKo++ -> do { id++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<input type=\"hidden\" id=\"");++ id (toHtml theId);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");++ id (toHtml name);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");++ id (toHtml (either id toPathPiece val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ +@@ -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 ->+- [whamlet|+-$newline never+-<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required value="#{either id id val}">+-|]++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"text\"");++ condH++ [(isReq, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " required"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ (asWidgetT . toWidget) (toHtml (either id id val));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ + passwordField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Text+ passwordField = Field+ { fieldParse = parseHelper $ Right+- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|+-$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_aJKH++ -> 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=\"password\"");++ condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ id (toHtml (either id id val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ +@@ -304,10 +422,24 @@ emailField = Field+ case Email.canonicalizeEmail $ encodeUtf8 s of+ Just e -> Right $ decodeUtf8With lenientDecode e+ Nothing -> Left $ MsgInvalidEmail s+- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|+-$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_aJLq++ -> 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=\"email\"");++ condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ id (toHtml (either id id val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ +@@ -322,10 +454,25 @@ multiEmailField = Field+ in case partitionEithers addrs of+ ([], good) -> Right good+ (bad, _) -> Left $ MsgInvalidEmail $ cat bad+- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|+-$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_aJMd++ -> 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=\"email\" multiple");++ condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ id (toHtml (either id cat val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ where+@@ -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+- [whamlet|+-$newline never+-<input id="#{theId}" name="#{name}" *{attrs} type="search" :isReq:required="" :autoFocus:autofocus="" value="#{either id id val}">+-|]++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"search\"");++ condH++ [(isReq, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ condH++ [(autoFocus, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " autofocus=\"\""))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ (asWidgetT . toWidget) (toHtml (either id id val));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ when autoFocus $ do+ -- we want this javascript to be placed immediately after the field+- [whamlet|+-$newline never+-<script>if (!('autofocus' in document.createElement('input'))) {document.getElementById('#{theId}').focus();}+-|]+- toWidget [cassius|+- ##{theId}+- -webkit-appearance: textfield+- |]++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<script>if (!('autofocus' in document.createElement('input'))) {document.getElementById('");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "').focus();}</script>") }++++ 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.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.blockBlocks = (),++ Text.Css.blockMixins = ()} :)++ . ((foldr (.) id [])++ . (concatMap Text.Css.mixinBlocks [] ++)))++ [])))]+++ , fieldEnctype = UrlEncoded+ }+ +@@ -365,7 +567,28 @@ urlField = Field+ Nothing -> Left $ MsgInvalidUrl s+ Just _ -> Right s+ , fieldView = \theId name attrs val isReq ->+- [whamlet|<input ##{theId} name=#{name} *{attrs} type=url :isReq:required value=#{either id id val}>|]++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"url\"");++ condH++ [(isReq, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " required"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ (asWidgetT . toWidget) (toHtml (either id id val));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ +@@ -378,18 +601,54 @@ selectField :: (Eq a, RenderMessage site FormMessage)+ => HandlerT site IO (OptionList a)+ -> Field (HandlerT site IO) a+ selectField = selectFieldHelper+- (\theId name attrs inside -> [whamlet|+-$newline never+-<select ##{theId} name=#{name} *{attrs}>^{inside}+-|]) -- outside+- (\_theId _name isSel -> [whamlet|+-$newline never+-<option value=none :isSel:selected>_{MsgSelectNone}+-|]) -- onOpt+- (\_theId _name _attrs value isSel text -> [whamlet|+-$newline never+-<option value=#{value} :isSel:selected>#{text}+-|]) -- inside++ (\theId name attrs inside -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<select id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">");++ (asWidgetT . toWidget) inside;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</select>") })++ -- outside++ (\_theId _name isSel -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<option value=\"none\"");++ condH++ [(isSel, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">");++ ((Control.Monad.liftM (toHtml .) getMessageRender)++ >>=++ (\ urender_aJMX++ -> (asWidgetT . toWidget) (urender_aJMX MsgSelectNone)));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })++ -- onOpt++ (\_theId _name _attrs value isSel text -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<option value=\"");++ (asWidgetT . toWidget) (toHtml value);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ condH++ [(isSel, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">");++ (asWidgetT . toWidget) (toHtml text);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })++ -- inside+ + multiSelectFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg)+ => [(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+- [whamlet|+- <select ##{theId} name=#{name} :isReq:required multiple *{attrs}>+- $forall (opt, optsel) <- selOpts+- <option value=#{optionExternalValue opt} :optsel:selected>#{optionDisplay opt}+- |]++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<select id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ condH++ [(isReq, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " required"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " multiple");++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">");++ Data.Foldable.mapM_++ (\ (opt_aJNs, optsel_aJNt)++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<option value=\"");++ (asWidgetT . toWidget) (toHtml (optionExternalValue opt_aJNs));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ condH++ [(optsel_aJNt, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">");++ (asWidgetT . toWidget) (toHtml (optionDisplay opt_aJNs));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })++ selOpts;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</select>") }+++ where+ optselected (Left _) _ = False+ optselected (Right vals) opt = (optionInternalValue opt) `elem` vals+@@ -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+- [whamlet|+- <span ##{theId}>+- $forall opt <- opts+- <label>+- <input type=checkbox name=#{name} value=#{optionExternalValue opt} *{attrs} :optselected val opt:checked>+- #{optionDisplay opt}+- |]++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<span id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\">");++ Data.Foldable.mapM_++ (\ 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_aJNI));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ condH++ [(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_aJNI));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })++ opts;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") }+++ }+ + radioField :: (Eq a, RenderMessage site FormMessage)+ => HandlerT site IO (OptionList a)+ -> Field (HandlerT site IO) a+ radioField = selectFieldHelper+- (\theId _name _attrs inside -> [whamlet|+-$newline never+-<div ##{theId}>^{inside}+-|])+- (\theId name isSel -> [whamlet|+-$newline never+-<label .radio for=#{theId}-none>+- <div>+- <input id=#{theId}-none type=radio name=#{name} value=none :isSel:checked>+- _{MsgSelectNone}+-|])+- (\theId name attrs value isSel text -> [whamlet|+-$newline never+-<label .radio for=#{theId}-#{value}>+- <div>+- <input id=#{theId}-#{value} type=radio name=#{name} value=#{value} :isSel:checked *{attrs}>+- \#{text}+-|])++ (\theId _name _attrs inside -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<div id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\">");++ (asWidgetT . toWidget) inside;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") }++++ (\theId name isSel -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<label class=\"radio\" for=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "-none\"><div><input id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "-none\" type=\"radio\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"none\"");++ condH++ [(isSel, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">");++ ((Control.Monad.liftM (toHtml .) getMessageRender)++ >>=++ (\ urender_aJNY++ -> (asWidgetT . toWidget) (urender_aJNY MsgSelectNone)));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") })++++ (\theId name attrs value isSel text -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<label class=\"radio\" for=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "-");++ (asWidgetT . toWidget) (toHtml value);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "\"><div><input id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "-");++ (asWidgetT . toWidget) (toHtml value);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "\" type=\"radio\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");++ (asWidgetT . toWidget) (toHtml value);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ condH++ [(isSel, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]++ Nothing;++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">");++ (asWidgetT . toWidget) (toHtml text);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") })+++ + boolField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Bool+ boolField = Field+ { fieldParse = \e _ -> return $ boolParser e+- , fieldView = \theId name attrs val isReq -> [whamlet|+-$newline never+- $if not isReq+- <input id=#{theId}-none *{attrs} type=radio name=#{name} value=none checked>+- <label for=#{theId}-none>_{MsgSelectNone}+-++ , fieldView = \theId name attrs val isReq -> do { condH++ [(not isReq, ++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "-none\" type=\"radio\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "\" value=\"none\" checked");++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "-none\">");++ ((Control.Monad.liftM (toHtml .) getMessageRender)++ >>=++ (\ urender_aJOn++ -> (asWidgetT . toWidget) (urender_aJOn MsgSelectNone)));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "-yes\" type=\"radio\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"yes\"");++ condH++ [(showVal id val, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]++ Nothing;++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "-yes\">");++ ((Control.Monad.liftM (toHtml .) getMessageRender)++ >>=++ (\ urender_aJOo++ -> (asWidgetT . toWidget) (urender_aJOo MsgBoolYes)));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "</label><input id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "-no\" type=\"radio\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"no\"");++ condH++ [(showVal not val, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]++ Nothing;++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "-no\">");++ ((Control.Monad.liftM (toHtml .) getMessageRender)++ >>=++ (\ 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+@@ -512,10 +947,24 @@ $newline never+ checkBoxField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Bool+ checkBoxField = Field+ { fieldParse = \e _ -> return $ checkBoxParser e+- , fieldView = \theId name attrs val _ -> [whamlet|+-$newline never+-<input id=#{theId} *{attrs} type=checkbox name=#{name} value=yes :showVal id val:checked>+-|]++ , fieldView = \theId name attrs val _ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");++ (asWidgetT . toWidget) (toHtml theId);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "\" type=\"checkbox\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"yes\"");++ condH++ [(showVal id val, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]++ Nothing;++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = UrlEncoded+ }+ +@@ -665,9 +1114,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_aJPt++ -> do { id++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");++ id (toHtml id');++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");++ id (toHtml name);++ id++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"file\"");++ condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required"))]++ Nothing;++ id ((attrsToHtml . toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fieldEnctype = Multipart+ }+ +@@ -694,10 +1155,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'+- , fvInput = [whamlet|+-$newline never+-<input type=file name=#{name} ##{id'} *{fsAttrs fs}>+-|]++ , fvInput = do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<input type=\"file\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" id=\"");++ (asWidgetT . toWidget) (toHtml id');++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) (fsAttrs fs));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fvErrors = errs+ , fvRequired = True+ }+@@ -726,10 +1196,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'+- , fvInput = [whamlet|+-$newline never+-<input type=file name=#{name} ##{id'} *{fsAttrs fs}>+-|]++ , fvInput = do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<input type=\"file\" name=\"");++ (asWidgetT . toWidget) (toHtml name);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\" id=\"");++ (asWidgetT . toWidget) (toHtml id');++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) (fsAttrs fs));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ , fvErrors = errs+ , fvRequired = False+ }+diff --git a/Yesod/Form/Functions.hs b/Yesod/Form/Functions.hs+index 5fd03e6..b14d900 100644+--- a/Yesod/Form/Functions.hs++++ b/Yesod/Form/Functions.hs+@@ -59,12 +59,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.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+@@ -216,7 +220,14 @@ postHelper form env = do+ let token =+ case reqToken req of+ Nothing -> mempty+- Just n -> [shamlet|<input type=hidden name=#{tokenKey} value=#{n}>|]++ Just n -> do { id++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<input type=\"hidden\" name=\"");++ id (toHtml tokenKey);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");++ id (toHtml n);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\">") }+++ m <- getYesod+ langs <- languages+ ((res, xml), enctype) <- runFormGeneric (form token) m langs env+@@ -296,7 +307,12 @@ getHelper :: MonadHandler m+ -> Maybe (Env, FileEnv)+ -> m (a, Enctype)+ getHelper form env = do+- let fragment = [shamlet|<input type=hidden name=#{getKey}>|]++ let fragment = do { id++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<input type=\"hidden\" name=\"");++ id (toHtml getKey);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\">") }+++ langs <- languages+ m <- getYesod+ runFormGeneric (form fragment) m langs env+@@ -331,10 +347,15 @@ identifyForm+ identifyForm identVal form = \fragment -> do+ -- Create hidden <input>.+ let fragment' =+- [shamlet|+- <input type=hidden name=#{identifyFormKey} value=#{identVal}>+- #{fragment}+- |]++ do { id++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<input type=\"hidden\" name=\"");++ id (toHtml identifyFormKey);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");++ id (toHtml identVal);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\">");++ id (toHtml fragment) }+++ + -- Check if we got its value back.+ mp <- askParams+@@ -364,22 +385,70 @@ renderTable, renderDivs, renderDivsNoLabels :: Monad m => FormRender m a+ renderTable aform fragment = do+ (res, views') <- aFormToForm aform+ let views = views' []+- let widget = [whamlet|+-$newline never+-$if null views+- \#{fragment}+-$forall (isFirst, view) <- addIsFirst views+- <tr :fvRequired view:.required :not $ fvRequired view:.optional>+- <td>+- $if isFirst+- \#{fragment}+- <label for=#{fvId view}>#{fvLabel view}+- $maybe tt <- fvTooltip view+- <div .tooltip>#{tt}+- <td>^{fvInput view}+- $maybe err <- fvErrors view+- <td .errors>#{err}+-|]++ let widget = do { Text.Hamlet.condH++ [(null views, (asWidgetT . toWidget) (toHtml fragment))] Nothing;++ Data.Foldable.mapM_++ (\ (isFirst_ab5u, view_ab5v)++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<tr");++ Text.Hamlet.condH++ [(or [fvRequired view_ab5v, not (fvRequired view_ab5v)], ++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " class=\"");++ Text.Hamlet.condH++ [(fvRequired view_ab5v, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]++ Nothing;++ Text.Hamlet.condH++ [(not (fvRequired view_ab5v), ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"") })]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "><td>");++ Text.Hamlet.condH++ [(isFirst_ab5u, (asWidgetT . toWidget) (toHtml fragment))] Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<label for=\"");++ (asWidgetT . toWidget) (toHtml (fvId view_ab5v));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\">");++ (asWidgetT . toWidget) (toHtml (fvLabel view_ab5v));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</label>");++ Text.Hamlet.maybeH++ (fvTooltip view_ab5v)++ (\ tt_ab5w++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<div class=\"tooltip\">");++ (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_ab5v);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</td>");++ Text.Hamlet.maybeH++ (fvErrors view_ab5v)++ (\ err_ab5x++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<td class=\"errors\">");++ (asWidgetT . toWidget) (toHtml err_ab5x);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</td>") })++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</tr>") })++ (addIsFirst views) }+++ return (res, widget)+ where+ addIsFirst [] = []+@@ -395,19 +464,66 @@ renderDivsMaybeLabels :: Monad m => Bool -> FormRender m a+ renderDivsMaybeLabels withLabels aform fragment = do+ (res, views') <- aFormToForm aform+ let views = views' []+- let widget = [whamlet|+-$newline never+-\#{fragment}+-$forall view <- views+- <div :fvRequired view:.required :not $ fvRequired view:.optional>+- $if withLabels+- <label for=#{fvId view}>#{fvLabel view}+- $maybe tt <- fvTooltip view+- <div .tooltip>#{tt}+- ^{fvInput view}+- $maybe err <- fvErrors view+- <div .errors>#{err}+-|]++ let widget = do { (asWidgetT . toWidget) (toHtml fragment);++ Data.Foldable.mapM_++ (\ view_ab5K++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<div");++ Text.Hamlet.condH++ [(or [fvRequired view_ab5K, not (fvRequired view_ab5K)], ++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) " class=\"");++ Text.Hamlet.condH++ [(fvRequired view_ab5K, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]++ Nothing;++ Text.Hamlet.condH++ [(not (fvRequired view_ab5K), ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\"") })]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) ">");++ Text.Hamlet.condH++ [(withLabels, ++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "<label for=\"");++ (asWidgetT . toWidget) (toHtml (fvId view_ab5K));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\">");++ (asWidgetT . toWidget) (toHtml (fvLabel view_ab5K));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })]++ Nothing;++ Text.Hamlet.maybeH++ (fvTooltip view_ab5K)++ (\ tt_ab5L++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<div class=\"tooltip\">");++ (asWidgetT . toWidget) (toHtml tt_ab5L);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })++ Nothing;++ (asWidgetT . toWidget) (fvInput view_ab5K);++ Text.Hamlet.maybeH++ (fvErrors view_ab5K)++ (\ err_ab5M++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<div class=\"errors\">");++ (asWidgetT . toWidget) (toHtml err_ab5M);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })++ views }+++ return (res, widget)+ + -- | Render a form using Bootstrap v2-friendly shamlet syntax.+@@ -435,19 +551,62 @@ renderBootstrap2 aform fragment = do+ let views = views' []+ has (Just _) = True+ has Nothing = False+- let widget = [whamlet|+- $newline never+- \#{fragment}+- $forall view <- views+- <div .control-group .clearfix :fvRequired view:.required :not $ fvRequired view:.optional :has $ fvErrors view:.error>+- <label .control-label for=#{fvId view}>#{fvLabel view}+- <div .controls .input>+- ^{fvInput view}+- $maybe tt <- fvTooltip view+- <span .help-block>#{tt}+- $maybe err <- fvErrors view+- <span .help-block>#{err}+- |]++ let widget = do { (asWidgetT . toWidget) (toHtml fragment);++ Data.Foldable.mapM_++ (\ view_ab5Y++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<div class=\"control-group clearfix ");++ Text.Hamlet.condH++ [(fvRequired view_ab5Y, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]++ Nothing;++ Text.Hamlet.condH++ [(not (fvRequired view_ab5Y), ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "optional "))]++ Nothing;++ Text.Hamlet.condH++ [(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_ab5Y));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "\">");++ (asWidgetT . toWidget) (toHtml (fvLabel view_ab5Y));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "</label><div class=\"controls input\">");++ (asWidgetT . toWidget) (fvInput view_ab5Y);++ Text.Hamlet.maybeH++ (fvTooltip view_ab5Y)++ (\ tt_ab5Z++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<span class=\"help-block\">");++ (asWidgetT . toWidget) (toHtml tt_ab5Z);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") })++ Nothing;++ Text.Hamlet.maybeH++ (fvErrors view_ab5Y)++ (\ err_ab60++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<span class=\"help-block\">");++ (asWidgetT . toWidget) (toHtml err_ab60);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") })++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . pack) "</div></div>") })++ views }+++ return (res, widget)+ + -- | Deprecated synonym for 'renderBootstrap2'.+diff --git a/Yesod/Form/Jquery.hs b/Yesod/Form/Jquery.hs+index 362eb8a..1df9966 100644+--- a/Yesod/Form/Jquery.hs++++ b/Yesod/Form/Jquery.hs+@@ -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)+ ++import qualified Text.Blaze as Text.Blaze.Internal++import qualified Text.Blaze.Internal++import qualified Text.Hamlet++import qualified Yesod.Core.Widget++import qualified Text.Css++import qualified Data.Monoid++import qualified Data.Foldable++import qualified Control.Monad++import qualified Text.Julius++import qualified Data.Text.Lazy.Builder++import qualified Text.Shakespeare+++ -- | Gets the Google hosted jQuery UI 1.8 CSS file with the given theme.+ googleHostedJqueryUiCss :: Text -> Text+ googleHostedJqueryUiCss theme = mconcat+@@ -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="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=\"date\"");++ Text.Hamlet.condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ id (toHtml (showVal val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ addScript' urlJqueryJs+ addScript' urlJqueryUiJs+ addStylesheet' urlJqueryUiCss+- toWidget [julius|+-$(function(){+- var i = document.getElementById("#{rawJS theId}");+- if (i.type != "date") {+- $(i).datepicker({+- dateFormat:'yy-mm-dd',+- changeMonth:#{jsBool $ jdsChangeMonth jds},+- changeYear:#{jsBool $ jdsChangeYear jds},+- numberOfMonths:#{rawJS $ mos $ jdsNumberOfMonths jds},+- yearRange:#{toJSON $ jdsYearRange jds}+- });+- }+-});+-|]++ toWidget $ Text.Julius.asJavascriptUrl++ (\ _render_a2l4S++ -> mconcat++ [Text.Julius.Javascript++ ((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.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.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ ",\n changeYear:"),++ Text.Julius.toJavascript (jsBool (jdsChangeYear jds)),++ Text.Julius.Javascript++ ((Data.Text.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ ",\n numberOfMonths:"),++ Text.Julius.toJavascript (rawJS (mos (jdsNumberOfMonths jds))),++ Text.Julius.Javascript++ ((Data.Text.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ ",\n yearRange:"),++ Text.Julius.toJavascript (toJSON (jdsYearRange jds)),++ Text.Julius.Javascript++ ((Data.Text.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ "\n });\n }\n});")])+++ , fieldEnctype = UrlEncoded+ }+ where+@@ -108,16 +152,52 @@ jqueryAutocompleteField' :: (RenderMessage site FormMessage, YesodJquery site)+ jqueryAutocompleteField' minLen src = Field+ { fieldParse = parseHelper $ Right+ , fieldView = \theId name attrs val isReq -> do+- toWidget [shamlet|+-$newline never+-<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required="" value="#{either id id val}" .autocomplete>+-|]++ toWidget $ do { id++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<input class=\"autocomplete\" id=\"");++ id (toHtml theId);++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");++ id (toHtml name);++ id++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"text\"");++ Text.Hamlet.condH++ [(isReq, ++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]++ Nothing;++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");++ id (toHtml (either id id val));++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");++ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs);++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }+++ addScript' urlJqueryJs+ addScript' urlJqueryUiJs+ addStylesheet' urlJqueryUiCss+- toWidget [julius|+-$(function(){$("##{rawJS theId}").autocomplete({source:"@{src}",minLength:#{toJSON minLen}})});+-|]++ toWidget $ Text.Julius.asJavascriptUrl++ (\ _render_a2l58++ -> mconcat++ [Text.Julius.Javascript++ ((Data.Text.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ "\n$(function(){$(\"#"),++ Text.Julius.toJavascript (rawJS theId),++ Text.Julius.Javascript++ ((Data.Text.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ "\").autocomplete({source:\""),++ Text.Julius.Javascript++ (Data.Text.Lazy.Builder.fromText++ (_render_a2l58 src [])),++ Text.Julius.Javascript++ ((Data.Text.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ "\",minLength:"),++ Text.Julius.toJavascript (toJSON minLen),++ Text.Julius.Javascript++ ((Data.Text.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ "})});")])+++ , fieldEnctype = UrlEncoded+ }+ +diff --git a/Yesod/Form/MassInput.hs b/Yesod/Form/MassInput.hs+index a2b434d..75eb484 100644+--- a/Yesod/Form/MassInput.hs++++ b/Yesod/Form/MassInput.hs+@@ -9,6 +9,16 @@ module Yesod.Form.MassInput+ , massTable+ ) where+ ++import qualified Data.Text++import qualified Text.Blaze as Text.Blaze.Internal++import qualified Text.Blaze.Internal++import qualified Text.Hamlet++import qualified Yesod.Core.Widget++import qualified Text.Css++import qualified Data.Monoid++import qualified Data.Foldable++import qualified Control.Monad+++ 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+ , fvId = theId+- , fvInput = [whamlet|+-$newline never+-^{fixXml views}+-<p>+- $forall xml <- xmls+- ^{xml}+- <input .count type=hidden name=#{countName} value=#{count}>+- <input type=checkbox name=#{addName}>+- Add another row+-|]++ , fvInput = do { (asWidgetT . toWidget) (fixXml views);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<p>");++ Data.Foldable.mapM_++ (\ xml_a1yM1 -> (asWidgetT . toWidget) xml_a1yM1) xmls;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "<input class=\"count\" type=\"hidden\" name=\"");++ (asWidgetT . toWidget) (toHtml countName);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "\" value=\"");++ (asWidgetT . toWidget) (toHtml count);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "\"><input type=\"checkbox\" name=\"");++ (asWidgetT . toWidget) (toHtml addName);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "\">Add another row</p>") }+++ , fvErrors = Nothing+ , fvRequired = False+ }])+@@ -92,10 +113,14 @@ withDelete af = do+ deleteName <- newFormIdent+ (menv, _, _) <- ask+ res <- case menv >>= Map.lookup deleteName . fst of+- Just ("yes":_) -> return $ Left [whamlet|+-$newline never+-<input type=hidden name=#{deleteName} value=yes>+-|]++ Just ("yes":_) -> return $ Left $ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "<input type=\"hidden\" name=\"");++ (asWidgetT . toWidget) (toHtml deleteName);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "\" value=\"yes\">") }+++ _ -> do+ (_, xml2) <- aFormToForm $ areq checkBoxField FieldSettings+ { fsLabel = SomeMessage MsgDelete+@@ -121,32 +146,149 @@ fixme eithers =+ massDivs, massTable+ :: [[FieldView site]]+ -> WidgetT site IO ()+-massDivs viewss = [whamlet|+-$newline never+-$forall views <- viewss+- <fieldset>+- $forall view <- views+- <div :fvRequired view:.required :not $ fvRequired view:.optional>+- <label for=#{fvId view}>#{fvLabel view}+- $maybe tt <- fvTooltip view+- <div .tooltip>#{tt}+- ^{fvInput view}+- $maybe err <- fvErrors view+- <div .errors>#{err}+-|]++massDivs viewss = Data.Foldable.mapM_++ (\ views_a1yMm++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "<fieldset>");++ Data.Foldable.mapM_++ (\ view_a1yMn++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<div");++ Text.Hamlet.condH++ [(or [fvRequired view_a1yMn, not (fvRequired view_a1yMn)], ++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ " class=\"");++ Text.Hamlet.condH++ [(fvRequired view_a1yMn, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "required "))]++ Nothing;++ Text.Hamlet.condH++ [(not (fvRequired view_a1yMn), ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "optional"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "\"") })]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "><label for=\"");++ (asWidgetT . toWidget) (toHtml (fvId view_a1yMn));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">");++ (asWidgetT . toWidget) (toHtml (fvLabel view_a1yMn));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>");++ Text.Hamlet.maybeH++ (fvTooltip view_a1yMn)++ (\ tt_a1yMo++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "<div class=\"tooltip\">");++ (asWidgetT . toWidget) (toHtml tt_a1yMo);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "</div>") })++ Nothing;++ (asWidgetT . toWidget) (fvInput view_a1yMn);++ Text.Hamlet.maybeH++ (fvErrors view_a1yMn)++ (\ err_a1yMp++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "<div class=\"errors\">");++ (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_a1yMm;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "</fieldset>") })++ viewss++++++massTable viewss = Data.Foldable.mapM_++ (\ views_a1yMv++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "<fieldset><table>");++ Data.Foldable.mapM_++ (\ view_a1yMw++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<tr");++ Text.Hamlet.condH++ [(or [fvRequired view_a1yMw, not (fvRequired view_a1yMw)], ++ do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ " class=\"");++ Text.Hamlet.condH++ [(fvRequired view_a1yMw, ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "required "))]++ Nothing;++ Text.Hamlet.condH++ [(not (fvRequired view_a1yMw), ++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "optional"))]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "\"") })]++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "><td><label for=\"");++ (asWidgetT . toWidget) (toHtml (fvId view_a1yMw));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">");++ (asWidgetT . toWidget) (toHtml (fvLabel view_a1yMw));++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>");++ Text.Hamlet.maybeH++ (fvTooltip view_a1yMw)++ (\ tt_a1yMx++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "<div class=\"tooltip\">");++ (asWidgetT . toWidget) (toHtml tt_a1yMx);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "</div>") })++ Nothing;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "</td><td>");++ (asWidgetT . toWidget) (fvInput view_a1yMw);++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</td>");++ Text.Hamlet.maybeH++ (fvErrors view_a1yMw)++ (\ err_a1yMy++ -> do { (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "<td class=\"errors\">");++ (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_a1yMv;++ (asWidgetT . toWidget)++ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)++ "</table></fieldset>") })++ viewss+ +-massTable viewss = [whamlet|+-$newline never+-$forall views <- viewss+- <fieldset>+- <table>+- $forall view <- views+- <tr :fvRequired view:.required :not $ fvRequired view:.optional>+- <td>+- <label for=#{fvId view}>#{fvLabel view}+- $maybe tt <- fvTooltip view+- <div .tooltip>#{tt}+- <td>^{fvInput view}+- $maybe err <- fvErrors view+- <td .errors>#{err}+-|]+diff --git a/Yesod/Form/Nic.hs b/Yesod/Form/Nic.hs+index 7e4af07..b59745a 100644+--- a/Yesod/Form/Nic.hs++++ b/Yesod/Form/Nic.hs+@@ -9,11 +9,22 @@ module Yesod.Form.Nic+ , nicHtmlField+ ) where+ ++import qualified Text.Blaze as Text.Blaze.Internal++import qualified Text.Blaze.Internal++import qualified Text.Hamlet++import qualified Yesod.Core.Widget++import qualified Text.Css++import qualified Data.Monoid++import qualified Data.Foldable++import qualified Control.Monad++import qualified Text.Julius++import qualified Data.Text.Lazy.Builder++import qualified Text.Shakespeare+++ 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+- toWidget [shamlet|+-$newline never+- <textarea id="#{theId}" *{attrs} name="#{name}" :isReq:required .html>#{showVal val}+-|]++ toWidget $ do { id++ ((Text.Blaze.Internal.preEscapedText . pack)++ "<textarea class=\"html\" id=\"");++ id (toHtml theId);++ 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));++ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") }+++ addScript' urlNicEdit+ master <- getYesod+ toWidget $+ case jsLoader master of+- BottomOfHeadBlocking -> [julius|+-bkLib.onDomLoaded(function(){new nicEditor({fullPanel:true}).panelInstance("#{rawJS theId}")});+-|]+- _ -> [julius|+-(function(){new nicEditor({fullPanel:true}).panelInstance("#{rawJS theId}")})();+-|]++ BottomOfHeadBlocking -> Text.Julius.asJavascriptUrl++ (\ _render_a2rMh++ -> Data.Monoid.mconcat++ [Text.Julius.Javascript++ ((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.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ "\")});")])++++ _ -> Text.Julius.asJavascriptUrl++ (\ _render_a2rMm++ -> Data.Monoid.mconcat++ [Text.Julius.Javascript++ ((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.Lazy.Builder.fromText++ . Text.Shakespeare.pack')++ "\")})();")])+++ , fieldEnctype = UrlEncoded+ }+ where+diff --git a/yesod-form.cabal b/yesod-form.cabal+index bfe94df..1f5aef5 100644+--- a/yesod-form.cabal++++ b/yesod-form.cabal+@@ -51,7 +51,6 @@ library+ exposed-modules: Yesod.Form+ Yesod.Form.Types+ Yesod.Form.Functions+- Yesod.Form.Bootstrap3+ Yesod.Form.Input+ Yesod.Form.Fields+ Yesod.Form.Jquery+-- +2.1.0
templates/configurators/xmpp/buddylist.hamlet view
@@ -1,4 +1,4 @@-<div .col-sm-9 ##{ident}>+<div ##{ident}> <table .table> <tbody> $if null buddies