Recent changes to this wiki:

Added a comment
diff --git a/doc/devblog/day_360__results_of_2015_user_survey/comment_1_5f30c583cd20c33e2bcd386f674d6f3b._comment b/doc/devblog/day_360__results_of_2015_user_survey/comment_1_5f30c583cd20c33e2bcd386f674d6f3b._comment
new file mode 100644
index 0000000..4c53ea4
--- /dev/null
+++ b/doc/devblog/day_360__results_of_2015_user_survey/comment_1_5f30c583cd20c33e2bcd386f674d6f3b._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="anarcat"
+ subject="comment 1"
+ date="2016-02-05T23:06:11Z"
+ content="""
+thanks for the review! great to see those surveys every once in a while...
+
+i wonder if [[todo/build_a_user_guide/]] could help with the documentation. the [[todo]] and [[forum]] pages are useful, but they are more \"search\" based than a handbook would be. there is the [[walkthrough]], but it could cover a *lot* more ground and i am not sure the wiki format is appropriate for this...
+"""]]

Added a comment
diff --git a/doc/forum/Multisession_compatible__63__/comment_7_0e6c8ab32c589f0d971d4c208a8d1645._comment b/doc/forum/Multisession_compatible__63__/comment_7_0e6c8ab32c589f0d971d4c208a8d1645._comment
new file mode 100644
index 0000000..49d2187
--- /dev/null
+++ b/doc/forum/Multisession_compatible__63__/comment_7_0e6c8ab32c589f0d971d4c208a8d1645._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="mark@6b90344cdab3158eacb94a3944460d138afc9bef"
+ nickname="mark"
+ subject="comment 7"
+ date="2016-02-05T22:35:19Z"
+ content="""
+Seems to be working with \"+\" fetch. I did have to put the fetch before the git annex commands and the push afterward or some of the changed git state from the git annex operations was lost (for example a drop and subsequent get wouldn't work because the drop wasn't probably tracked).
+
+Mark
+"""]]

devblog
diff --git a/doc/devblog/day_360__results_of_2015_user_survey.mdwn b/doc/devblog/day_360__results_of_2015_user_survey.mdwn
new file mode 100644
index 0000000..c515981
--- /dev/null
+++ b/doc/devblog/day_360__results_of_2015_user_survey.mdwn
@@ -0,0 +1,56 @@
+The [2015 git-annex user servey](http://git-annex-survey.branchable.com/polls/2015/)
+is over with, and I'm reading through it and comparing with the
+[2013 survey](http://git-annex-survey.branchable.com/polls/2013/).
+
+37% fewer users responded to the 2015 survey than in 2013.
+It's hard to tell if this has anything to do with the total number of
+git-annex users; Debian's popcon suggests the number of users has doubled
+since 2013, although its graph also suggests the number of users has
+flattened off since 2014. The difference may just be that I 
+promoted the 2013 survey better than the 2015 survey, perhaps reaching
+kickstarter backers who I was in touch with back then.
+
+25% use the assistant. Of those, 20% use XMPP, which is good to know as I'd
+like to get rid of it.
+
+Android use has quardrupled, and Windows use has doubled; both are now at
+4%. It's not surprising that Android and Windows users still think more
+porting work is needed for those OSes. iOS is the only unsupported OS that
+more than 1% of users want. Embedded and NAS systems were mentioned much
+less than in 2013; probably the
+[[arm_tarball_build|forum/new_linux_arm_tarball_build]] met many such
+needs.
+
+About the same percentage of users prefer direct mode in 2015 as did in 2013,
+and ditto for indirect mode. But, more users in 2015 only use direct mode
+on platforms that force its use. Correlating with the OS percentages
+suggests that many of these users are using removable media with the
+FAT filesystem, rather than an OS like Windows or Android. Hopefully
+v6 unlocked files will eventually better meet those user's needs.
+
+The percent of users installing git-annex from source has halved since 2013,
+and it seems that builds from this website have taken up most of that slack;
+I would have expected more installs from Debian, Homebrew etc, but that
+seems not to have increased.
+
+The number of repositories per user has gone up quite a lot since 2013,
+when only 7% of users had more than 10 repos. Now, 23% of users do. And,
+2% of users have more than 100 repos! This probably involves both more
+repositories for different purposes, and cloning of repositories
+to more devices.
+
+Similarly, the amount of data stored has gone up. 34% have more than 1
+terabyte stored, up from 18% in 2013. 2% have more than 16 terabytes.
+
+There's some indications of more users sharing repositories or
+otherwise using it in teams of larger groups, although most users still use
+it by themselves.
+
+Users seem happier with git-annex now than in 2013. 16% call it "one of my
+favorite applications of all time". And, significantly fewer find it too
+hard to use than in 2013.
+
+The main blocking problems are documentation, performance with many
+files (a general git problem), and various issues with the assistant.
+Respondants suggest more focus on making it easier for nontechnical users,
+and for use in larger groups/organizations.

update for MagicMime with stack
diff --git a/doc/install/fromsource.mdwn b/doc/install/fromsource.mdwn
index 853d946..85df281 100644
--- a/doc/install/fromsource.mdwn
+++ b/doc/install/fromsource.mdwn
@@ -53,17 +53,19 @@ Move git-annex into some directory that is in your PATH:
 
 	mv ~/.local/bin/git-annex ~/bin # or /usr/local/bin/ or whatever
 
-Note that this build produces a git-annex without XMPP and DBUS support.
-These optional features are only used by the webapp, and require
-installing additional C libraries. To try to build with these features
+Note that this build produces a git-annex without the build flags
+XMPP, DBUS, and MagicMime.
+These optional features require installing additional C libraries.
+To try to build with these features 
 enabled, pass extra parameters when running stack: 
-`--flag git-annex:XMPP --flag git-annex:DBUS`
+`--flag git-annex:XMPP --flag git-annex:DBUS --flag git-annex:MagicMime`
 
 ## minimal build from source with cabal
 
-This can be done anywhere, and builds git-annex without some optional features
-that require harder-to-install C libraries. This is plenty to let you get started with
-git-annex, but it does not include the assistant or webapp.
+This can be done anywhere, and builds git-annex without some optional
+features that require harder-to-install C libraries. This is plenty to let
+you get started with git-annex, but it does not include the assistant or
+webapp.
 
 Be warned that this involves building a lot of Haskell libraries from
 source, and so it has a lot of moving parts, and it's not uncommon for it
@@ -81,8 +83,8 @@ Inside the source tree, run:
 
 To build with all features enabled, including the assistant and webapp,
 you will need to install several C libraries and their headers,
-including libgnutls, libgsasl, libxml2, and zlib. How to do that for
-your OS is beyond the scope of this page. 
+including libgnutls, libgsasl, libxml2, libmagic, and zlib. How to do
+that for your OS is beyond the scope of this page. 
 
 Once the C libraries are installed, run inside the source tree:
 

Added a comment
diff --git a/doc/forum/Multisession_compatible__63__/comment_6_e2319f774eda62600c27ab9d2d0d1e50._comment b/doc/forum/Multisession_compatible__63__/comment_6_e2319f774eda62600c27ab9d2d0d1e50._comment
new file mode 100644
index 0000000..d85de4c
--- /dev/null
+++ b/doc/forum/Multisession_compatible__63__/comment_6_e2319f774eda62600c27ab9d2d0d1e50._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="mark@6b90344cdab3158eacb94a3944460d138afc9bef"
+ nickname="mark"
+ subject="comment 6"
+ date="2016-02-05T18:18:58Z"
+ content="""
+Ah, that is very helpful information. I'll explore that. Any reason the fetch should not use the \"+\" to work with non-fast-forward updates?
+
+I greatly appreciate your time. Thanks!
+"""]]

response
diff --git a/doc/forum/Multisession_compatible__63__/comment_5_d0ddac05268d978e950c91e76b023ffe._comment b/doc/forum/Multisession_compatible__63__/comment_5_d0ddac05268d978e950c91e76b023ffe._comment
new file mode 100644
index 0000000..65a5694
--- /dev/null
+++ b/doc/forum/Multisession_compatible__63__/comment_5_d0ddac05268d978e950c91e76b023ffe._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2016-02-05T17:34:37Z"
+ content="""
+`git annex sync` does not check out the git-annex branch; nothing in git-annex does.
+
+git-annex checks for any remote/git-annex branches that have not been
+merged yet and auto-merges them, whenever it's run. So, probably all you
+need to do is `git fetch` and possibly `git push` of the branch.
+"""]]

Added a comment
diff --git a/doc/forum/Multisession_compatible__63__/comment_4_b7148c3afd31ce1effd135a4f7c92dbc._comment b/doc/forum/Multisession_compatible__63__/comment_4_b7148c3afd31ce1effd135a4f7c92dbc._comment
new file mode 100644
index 0000000..6d0129f
--- /dev/null
+++ b/doc/forum/Multisession_compatible__63__/comment_4_b7148c3afd31ce1effd135a4f7c92dbc._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="mark@6b90344cdab3158eacb94a3944460d138afc9bef"
+ nickname="mark"
+ subject="comment 4"
+ date="2016-02-05T17:32:22Z"
+ content="""
+Thanks again. Good information.
+
+So does \"git annex sync\" do any branch checkout?
+
+I'm using git annex to manage regression test outputs for audio. I don't want \"git annex sync\" because I want annex gets, etc. to be basically automatic. But I need to make sure when a test starts that the git-annex branch is up-to-date in case updated reference outputs were checked in elsewhere. So I want to sync the git-annex branch (but not the master because someone maybe locally testing code changes to vet the impact). I'm not a git expert, but it appears that you can't pull (or more specifically merge) outside of your working directory, so I'm simply switching branches to pull/push the git annex branch, but as we've discussed that isn't multisession safe.
+
+So, if you're able to do the git annex sync without a branch checkout, then there is hope that I can do a subset (just a sync of the git-annex branch) without a branch checkout.
+
+If I'm displaying a fundamental misunderstanding or missing something obvious, I'm all ears.
+"""]]

followup
diff --git a/doc/bugs/Unable_to_take_transfer_lock/comment_5_e33957c5a75b06d77b188a10b69a39fd._comment b/doc/bugs/Unable_to_take_transfer_lock/comment_5_e33957c5a75b06d77b188a10b69a39fd._comment
new file mode 100644
index 0000000..89ac131
--- /dev/null
+++ b/doc/bugs/Unable_to_take_transfer_lock/comment_5_e33957c5a75b06d77b188a10b69a39fd._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2016-02-05T17:01:24Z"
+ content="""
+@luca you might get that with -J2 if you have two work tree files that
+point to the same key. The first thread will start copying the first file,
+and then the second thread tries to copy the second file but sees the key
+is already being copied.
+
+It shouldn't happen otherwise; the way -J works is it splits files between
+threads. So, no two threads will be working on the same file, except in the
+situation described above.
+
+I doubt that whatever you're seeing is the same problem originally
+described in this bug report. I'm still waiting for a followup with missing
+information about the originally described bug.
+"""]]

response
diff --git a/doc/forum/Multisession_compatible__63__/comment_2_c1dc4294cc2a43cfecfb7279d6411924._comment b/doc/forum/Multisession_compatible__63__/comment_2_c1dc4294cc2a43cfecfb7279d6411924._comment
new file mode 100644
index 0000000..0d4c150
--- /dev/null
+++ b/doc/forum/Multisession_compatible__63__/comment_2_c1dc4294cc2a43cfecfb7279d6411924._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2016-02-05T16:37:48Z"
+ content="""
+Well obviously if you have the git-annex branch checked out, any operation
+involving the work tree is not going to operate on the usual work tree.
+So obviously `git add` and `git annex add` are not going to do what you
+want them to do (unless you want them to add files to the checked-out
+git-annex branch). I'm not sure what other problems you might run into
+doing that.
+
+git-annex uses the .git/annex/index file to stage commits to the git-annex
+branch. Using that index file might help with rebasing or other operations
+on the branch. 
+
+It's certianly
+theoretically possible to rebase without touching the work tree and only
+using such an index file, but I don't know if git's rebase works that way.
+I also don't see any particular benefit to rebasing the git-annex branch.
+"""]]

removed
diff --git a/doc/bugs/Unable_to_take_transfer_lock/comment_5_f864fdd2e9adba0a7661068471cf31b2._comment b/doc/bugs/Unable_to_take_transfer_lock/comment_5_f864fdd2e9adba0a7661068471cf31b2._comment
deleted file mode 100644
index f97ad2c..0000000
--- a/doc/bugs/Unable_to_take_transfer_lock/comment_5_f864fdd2e9adba0a7661068471cf31b2._comment
+++ /dev/null
@@ -1,16 +0,0 @@
-[[!comment format=mdwn
- username="luca@b7e273474d087a5c7fc4428503f21d5624636d9f"
- nickname="luca"
- subject="comment 5"
- date="2016-02-05T06:43:28Z"
- content="""
-I get this error on OS X when setting the `-J` parameter to > 1, this works:
-
-    git annex copy --to usb -J1 --auto
-
-This consistently throughs the error (but seems to copy everything):
-
-    git annex copy --to usb -J2 --auto
-
-I'm running 6.20160126 on version 5 repositories.
-"""]]

Added a comment
diff --git a/doc/bugs/Unable_to_take_transfer_lock/comment_5_f864fdd2e9adba0a7661068471cf31b2._comment b/doc/bugs/Unable_to_take_transfer_lock/comment_5_f864fdd2e9adba0a7661068471cf31b2._comment
new file mode 100644
index 0000000..f97ad2c
--- /dev/null
+++ b/doc/bugs/Unable_to_take_transfer_lock/comment_5_f864fdd2e9adba0a7661068471cf31b2._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="luca@b7e273474d087a5c7fc4428503f21d5624636d9f"
+ nickname="luca"
+ subject="comment 5"
+ date="2016-02-05T06:43:28Z"
+ content="""
+I get this error on OS X when setting the `-J` parameter to > 1, this works:
+
+    git annex copy --to usb -J1 --auto
+
+This consistently throughs the error (but seems to copy everything):
+
+    git annex copy --to usb -J2 --auto
+
+I'm running 6.20160126 on version 5 repositories.
+"""]]

Added a comment
diff --git a/doc/bugs/Unable_to_take_transfer_lock/comment_4_7468862a6d4ec47320071aa52ae4072a._comment b/doc/bugs/Unable_to_take_transfer_lock/comment_4_7468862a6d4ec47320071aa52ae4072a._comment
new file mode 100644
index 0000000..a3ef3c0
--- /dev/null
+++ b/doc/bugs/Unable_to_take_transfer_lock/comment_4_7468862a6d4ec47320071aa52ae4072a._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="luca@b7e273474d087a5c7fc4428503f21d5624636d9f"
+ nickname="luca"
+ subject="comment 4"
+ date="2016-02-05T06:43:11Z"
+ content="""
+I get this error on OS X when setting the `-J` parameter to > 1, this works:
+
+    git annex copy --to usb -J1 --auto
+
+This consistently throughs the error (but seems to copy everything):
+
+    git annex copy --to usb -J2 --auto
+
+I'm running 6.20160126 on version 5 repositories.
+"""]]

Added a comment
diff --git a/doc/forum/Multisession_compatible__63__/comment_2_1c8d0f97d353c3e1d290edbe0a48b359._comment b/doc/forum/Multisession_compatible__63__/comment_2_1c8d0f97d353c3e1d290edbe0a48b359._comment
new file mode 100644
index 0000000..1eedafd
--- /dev/null
+++ b/doc/forum/Multisession_compatible__63__/comment_2_1c8d0f97d353c3e1d290edbe0a48b359._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="mark@6b90344cdab3158eacb94a3944460d138afc9bef"
+ nickname="mark"
+ subject="comment 2"
+ date="2016-02-04T18:23:07Z"
+ content="""
+Thanks Joey for the response.
+
+This brings up two questions. 
+
+1) In my setup I have my own \"sync\" of just the git-annex branch with the remote after git annex operations. (I didn't want the master branch synch of \"git annex sync\". In this sync of mine I switch branches to do a pull/push on the git-annex branch. I found that I had to put file locks around all other git annex operations in order for things to keep from getting messed up in git. Is this because if I switch to another branch the git annex add (for example) won't work correctly even though it doesn't switch branches?
+
+2) I could avoid the whole issue if I could \"pull -rebase\" and push the git-annex branch without switching branches. Is there a way to do that?
+
+Thanks! -Mark
+"""]]

response
diff --git a/doc/forum/Multisession_compatible__63__/comment_1_dab5a92416314a7d4c02663d4e46cd60._comment b/doc/forum/Multisession_compatible__63__/comment_1_dab5a92416314a7d4c02663d4e46cd60._comment
new file mode 100644
index 0000000..9dc2283
--- /dev/null
+++ b/doc/forum/Multisession_compatible__63__/comment_1_dab5a92416314a7d4c02663d4e46cd60._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2016-02-04T16:30:30Z"
+ content="""
+git-annex has quite extensive locking, so it's entirely safe to run any
+combination of any git-annex commands at the same time.
+
+(It doesn't actually check out the git-annex branch when making commits to
+it BTW.)
+"""]]

note
diff --git a/doc/tips/largefiles.mdwn b/doc/tips/largefiles.mdwn
index 40cd3ea..ae81e54 100644
--- a/doc/tips/largefiles.mdwn
+++ b/doc/tips/largefiles.mdwn
@@ -67,6 +67,8 @@ The following terms can be used in annex.largefiles:
   including "text/plain", but also "text/x-shellscript", "text/x-makefile",
   etc.
 
+  The MIME types are the same that are displayed by running `file --mime-type`
+
   This is only available to use when git-annex was built with the
   MagicMime build flag.
 

comment
diff --git a/doc/devblog/day_359__annex.largefiles_gitattributes/comment_2_cfbf4fb5a3a1beb582faa051d1627a31._comment b/doc/devblog/day_359__annex.largefiles_gitattributes/comment_2_cfbf4fb5a3a1beb582faa051d1627a31._comment
new file mode 100644
index 0000000..b3633c2
--- /dev/null
+++ b/doc/devblog/day_359__annex.largefiles_gitattributes/comment_2_cfbf4fb5a3a1beb582faa051d1627a31._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2016-02-03T21:00:55Z"
+ content="""
+Weirdly, that hack wouldn't work if I had used a more lisp-style format for
+the expressions. At least, I don't think lisp can be written with no
+whitespace at all, in general. It was just luck that the expression format
+happened to work out that way.
+
+Anyway, it's a hack, but it works. Would be nice if git got a way to put
+spaces in gitattribute values..
+"""]]

devblog
diff --git a/doc/devblog/day_360__annex.largefiles_mimetype.mdwn b/doc/devblog/day_360__annex.largefiles_mimetype.mdwn
new file mode 100644
index 0000000..587dcda
--- /dev/null
+++ b/doc/devblog/day_360__annex.largefiles_mimetype.mdwn
@@ -0,0 +1,8 @@
+The same parser was used for both preferred content expressions and
+annex.largefiles. Reworked that today, splitting it into two distinct
+parsers. It doesn't make any sense to use terms like "standard" or
+"lackingcopies" in annex.largefiles, and such are now rejected.
+
+That groundwork also let me add a feature that only makes sense for
+annex.largefiles, and not for preferred content expressions: Matching by
+mime type, such as `mimetype=text/*`

matchexpression: Added --largefiles option to parse an annex.largefiles expression.
diff --git a/Annex/FileMatcher.hs b/Annex/FileMatcher.hs
index 70ea939..e97b80c 100644
--- a/Annex/FileMatcher.hs
+++ b/Annex/FileMatcher.hs
@@ -14,6 +14,7 @@ module Annex.FileMatcher (
 	matchAll,
 	preferredContentParser,
 	parsedToMatcher,
+	mkLargeFilesParser,
 	largeFilesMatcher,
 ) where
 
diff --git a/Command/MatchExpression.hs b/Command/MatchExpression.hs
index a75101d..fe18e9f 100644
--- a/Command/MatchExpression.hs
+++ b/Command/MatchExpression.hs
@@ -27,12 +27,17 @@ cmd = noCommit $
 
 data MatchExpressionOptions = MatchExpressionOptions
 	{ matchexpr :: String
+	, largeFilesExpression :: Bool
 	, matchinfo :: MatchInfo
 	}
 
 optParser :: CmdParamsDesc -> Parser MatchExpressionOptions
 optParser desc = MatchExpressionOptions
 	<$> argument str (metavar desc)
+	<*> switch
+		( long "largefiles"
+		<> help "parse as annex.largefiles expression"
+		)
 	<*> (addkeysize <$> dataparser)
   where
 	dataparser = MatchingInfo
@@ -48,19 +53,27 @@ optParser desc = MatchExpressionOptions
 			( long "size" <> metavar paramSize
 			<> help "specify size to match against"
 			))
+		<*> optinfo "mimetype" (strOption
+			( long "mimetype" <> metavar paramValue
+			<> help "specify mime type to match against"
+			))
+
 	optinfo datadesc mk = (Right <$> mk)
 		<|> (pure $ Left $ missingdata datadesc)
 	missingdata datadesc = bail $ "cannot match this expression without " ++ datadesc ++ " data"
 	-- When a key is provided, use its size.
-	addkeysize i@(MatchingInfo f (Right k) _) = case keySize k of
-		Just sz -> MatchingInfo f (Right k) (Right sz)
+	addkeysize i@(MatchingInfo f (Right k) _ m) = case keySize k of
+		Just sz -> MatchingInfo f (Right k) (Right sz) m
 		Nothing -> i
 	addkeysize i = i
 
 seek :: MatchExpressionOptions -> CommandSeek
 seek o = do
-	u <- getUUID
-	case parsedToMatcher $ preferredContentParser matchAll matchAll groupMap M.empty (Just u) (matchexpr o) of
+	parser <- if largeFilesExpression o
+		then mkLargeFilesParser
+		else preferredContentParser 
+			matchAll matchAll groupMap M.empty . Just <$> getUUID
+	case parsedToMatcher $ parser ((matchexpr o)) of
 		Left e -> liftIO $ bail $ "bad expression: " ++ e
 		Right matcher -> ifM (checkmatcher matcher)
 			( liftIO exitSuccess
diff --git a/Limit.hs b/Limit.hs
index e48182e..9bf5e22 100644
--- a/Limit.hs
+++ b/Limit.hs
@@ -94,7 +94,7 @@ matchGlobFile glob = go
 	cglob = compileGlob glob CaseSensative -- memoized
 	go (MatchingKey _) = pure False
 	go (MatchingFile fi) = pure $ matchGlob cglob (matchFile fi)
-	go (MatchingInfo af _ _) = matchGlob cglob <$> getInfo af
+	go (MatchingInfo af _ _ _) = matchGlob cglob <$> getInfo af
 
 #ifdef WITH_MAGICMIME
 matchMagic :: Magic -> MkLimit Annex
@@ -102,10 +102,9 @@ matchMagic magic glob = Right $ const go
   where
  	cglob = compileGlob glob CaseSensative -- memoized
 	go (MatchingKey _) = pure False
-	go (MatchingFile fi) = check (matchFile fi)
-	go (MatchingInfo af _ _) = check =<< getInfo af
-	check f = liftIO $ catchBoolIO $
-		matchGlob cglob <$> magicFile magic f
+	go (MatchingFile fi) = liftIO $ catchBoolIO $
+		matchGlob cglob <$> magicFile magic (matchFile fi)
+	go (MatchingInfo _ _ _ mimeval) = matchGlob cglob <$> getInfo mimeval
 #endif
 
 {- Adds a limit to skip files not believed to be present
@@ -151,7 +150,7 @@ limitInDir dir = const go
   where
 	go (MatchingFile fi) = checkf $ matchFile fi
 	go (MatchingKey _) = return False
-	go (MatchingInfo af _ _) = checkf =<< getInfo af
+	go (MatchingInfo af _ _ _) = checkf =<< getInfo af
 	checkf = return . elem dir . splitPath . takeDirectory
 
 {- Adds a limit to skip files not believed to have the specified number
@@ -197,7 +196,7 @@ limitLackingCopies approx want = case readish want of
 			else case mi of
 				MatchingFile fi -> getGlobalFileNumCopies $ matchFile fi
 				MatchingKey _ -> approxNumCopies
-				MatchingInfo _ _ _ -> approxNumCopies
+				MatchingInfo _ _ _ _ -> approxNumCopies
 		us <- filter (`S.notMember` notpresent)
 			<$> (trustExclude UnTrusted =<< Remote.keyLocations key)
 		return $ numcopies - length us >= needed
@@ -211,7 +210,7 @@ limitLackingCopies approx want = case readish want of
 limitUnused :: MatchFiles Annex
 limitUnused _ (MatchingFile _) = return False
 limitUnused _ (MatchingKey k) = S.member k <$> unusedKeys
-limitUnused _ (MatchingInfo _ ak _) = do
+limitUnused _ (MatchingInfo _ ak _ _) = do
 	k <- getInfo ak
 	S.member k <$> unusedKeys
 
@@ -266,7 +265,7 @@ limitSize vs s = case readSize dataUnits s of
   where
 	go sz _ (MatchingFile fi) = lookupFileKey fi >>= check fi sz
 	go sz _ (MatchingKey key) = checkkey sz key
-	go sz _ (MatchingInfo _ _ as) =
+	go sz _ (MatchingInfo _ _ as _) =
 		getInfo as >>= \sz' -> return (Just sz' `vs` Just sz)
 	checkkey sz key = return $ keySize key `vs` Just sz
 	check _ sz (Just key) = checkkey sz key
@@ -309,4 +308,4 @@ lookupFileKey = lookupFile . currFile
 checkKey :: (Key -> Annex Bool) -> MatchInfo -> Annex Bool
 checkKey a (MatchingFile fi) = lookupFileKey fi >>= maybe (return False) a
 checkKey a (MatchingKey k) = a k
-checkKey a (MatchingInfo _ ak _) = a =<< getInfo ak
+checkKey a (MatchingInfo _ ak _ _) = a =<< getInfo ak
diff --git a/Types/FileMatcher.hs b/Types/FileMatcher.hs
index be7ac97..ecf4fbb 100644
--- a/Types/FileMatcher.hs
+++ b/Types/FileMatcher.hs
@@ -19,7 +19,9 @@ import qualified Data.Set as S
 data MatchInfo
 	= MatchingFile FileInfo
 	| MatchingKey Key
-	| MatchingInfo (OptInfo FilePath) (OptInfo Key) (OptInfo FileSize)
+	| MatchingInfo (OptInfo FilePath) (OptInfo Key) (OptInfo FileSize) (OptInfo MimeType)
+
+type MimeType = String
 
 data FileInfo = FileInfo
 	{ currFile :: FilePath
diff --git a/debian/changelog b/debian/changelog
index 4295168..d3a28c4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -15,6 +15,8 @@ git-annex (6.20160127) UNRELEASED; urgency=medium
     or "lackingcopies", etc.
   * annex.largefiles: Add support for mimetype=text/* etc, when git-annex
     is linked with libmagic.
+  * matchexpression: Added --largefiles option to parse an annex.largefiles
+    expression.
 
  -- Joey Hess <id@joeyh.name>  Thu, 28 Jan 2016 13:53:09 -0400
 
diff --git a/doc/git-annex-matchexpression.mdwn b/doc/git-annex-matchexpression.mdwn
index c148487..0cfeaa1 100644
--- a/doc/git-annex-matchexpression.mdwn
+++ b/doc/git-annex-matchexpression.mdwn
@@ -1,6 +1,6 @@
 # NAME
 
-git-annex matchexpression - checks if a preferred content expression matches
+git-annex matchexpression - checks if an expression matches
 
 # SYNOPSIS
 
@@ -8,7 +8,7 @@ git annex matchexpression `expression [data]`
 
 # DESCRIPTION
 
-This plumbing-level command is given a prefferred content expression,
+This plumbing-level command is given a preferred content expression,
 and some data, and checks if the expression matches the data. It exits 0 if
 it matches, and 1 if not. If not enough data was provided, it displays an
 error and exits with special code 42.
@@ -38,6 +38,16 @@ For example, this will exit 0:
   Many keys have a known size, and so --size is not needed when specifying
   such a key.
 
+* `--largefiles`
+
+  Parse the expression as an annex.largefiles expression, rather than a
+  preferred content expression.
+
+* `--mimetype=`
+
+  Tell what the mime type of the file is. Only needed when using
+  --largefiles with a mimetype= expression.
+
 # SEE ALSO
 

(Diff truncated)
annex.largefiles: Add support for mimetype=text/* etc, when git-annex is linked with libmagic.
diff --git a/Annex/FileMatcher.hs b/Annex/FileMatcher.hs
index b4a4b6d..70ea939 100644
--- a/Annex/FileMatcher.hs
+++ b/Annex/FileMatcher.hs
@@ -5,6 +5,8 @@
  - Licensed under the GNU GPL version 3 or higher.
  -}
 
+{-# LANGUAGE CPP #-}
+
 module Annex.FileMatcher (
 	GetFileMatcher,
 	checkFileMatcher,
@@ -28,6 +30,10 @@ import Types.Remote (RemoteConfig)
 import Annex.CheckAttr
 import Git.CheckAttr (unspecifiedAttr)
 
+#ifdef WITH_MAGICMIME
+import Magic
+#endif
+
 import Data.Either
 import qualified Data.Set as S
 
@@ -119,10 +125,19 @@ preferredContentParser matchstandard matchgroupwanted getgroupmap configmap mu e
 	preferreddir = fromMaybe "public" $
 		M.lookup "preferreddir" =<< (`M.lookup` configmap) =<< mu
 
-largeFilesParser :: String -> [ParseResult]
-largeFilesParser expr = map parse $ tokenizeMatcher expr
-  where
-	parse = parseToken commonTokens
+mkLargeFilesParser :: Annex (String -> [ParseResult])
+mkLargeFilesParser = do
+#ifdef WITH_MAGICMIME
+	magicmime <- liftIO $ magicOpen [MagicMimeType]
+	liftIO $ magicLoadDefault magicmime
+#endif
+	let parse = parseToken $ commonTokens
+#ifdef WITH_MAGICMIME
+		++ [ ValueToken "mimetype" (usev $ matchMagic magicmime) ]
+#else
+		++ [ ValueToken "mimetype" (const $ Left "\"mimetype\" not supported; not built with MagicMime support") ]
+#endif
+	return $ map parse . tokenizeMatcher
 
 {- Generates a matcher for files large enough (or meeting other criteria)
  - to be added to the annex, rather than directly to git. -}
@@ -138,7 +153,9 @@ largeFilesMatcher = go =<< annexLargeFiles <$> Annex.getGitConfig
 			then return matchAll
 			else mkmatcher expr
 
-	mkmatcher = either badexpr return . parsedToMatcher . largeFilesParser
+	mkmatcher expr = do
+		parser <- mkLargeFilesParser
+		either badexpr return $ parsedToMatcher $ parser expr
 	badexpr e = error $ "bad annex.largefiles configuration: " ++ e
 
 simply :: MatchFiles Annex -> ParseResult
diff --git a/BuildFlags.hs b/BuildFlags.hs
index 52e489e..db19372 100644
--- a/BuildFlags.hs
+++ b/BuildFlags.hs
@@ -76,6 +76,9 @@ buildFlags = filter (not . null)
 #ifdef WITH_TORRENTPARSER
 	, "TorrentParser"
 #endif
+#ifdef WITH_MAGICMIME
+	, "MagicMime"
+#endif
 #ifdef WITH_EKG
 	, "EKG"
 #endif
diff --git a/Limit.hs b/Limit.hs
index 81b6d75..e48182e 100644
--- a/Limit.hs
+++ b/Limit.hs
@@ -1,10 +1,12 @@
 {- user-specified limits on files to act on
  -
- - Copyright 2011-2014 Joey Hess <id@joeyh.name>
+ - Copyright 2011-2016 Joey Hess <id@joeyh.name>
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
 
+{-# LANGUAGE CPP #-}
+
 module Limit where
 
 import Annex.Common
@@ -30,6 +32,10 @@ import Utility.Glob
 import Utility.HumanTime
 import Utility.DataUnits
 
+#ifdef WITH_MAGICMIME
+import Magic
+#endif
+
 import Data.Time.Clock.POSIX
 import qualified Data.Set as S
 import qualified Data.Map as M
@@ -84,11 +90,23 @@ limitExclude glob = Right $ const $ not <$$> matchGlobFile glob
 
 matchGlobFile :: String -> MatchInfo -> Annex Bool
 matchGlobFile glob = go
-	where
-		cglob = compileGlob glob CaseSensative -- memoized
-		go (MatchingKey _) = pure False
-		go (MatchingFile fi) = pure $ matchGlob cglob (matchFile fi)
-		go (MatchingInfo af _ _) = matchGlob cglob <$> getInfo af
+  where
+	cglob = compileGlob glob CaseSensative -- memoized
+	go (MatchingKey _) = pure False
+	go (MatchingFile fi) = pure $ matchGlob cglob (matchFile fi)
+	go (MatchingInfo af _ _) = matchGlob cglob <$> getInfo af
+
+#ifdef WITH_MAGICMIME
+matchMagic :: Magic -> MkLimit Annex
+matchMagic magic glob = Right $ const go
+  where
+ 	cglob = compileGlob glob CaseSensative -- memoized
+	go (MatchingKey _) = pure False
+	go (MatchingFile fi) = check (matchFile fi)
+	go (MatchingInfo af _ _) = check =<< getInfo af
+	check f = liftIO $ catchBoolIO $
+		matchGlob cglob <$> magicFile magic f
+#endif
 
 {- Adds a limit to skip files not believed to be present
  - in a specfied repository. Optionally on a prior date. -}
diff --git a/debian/changelog b/debian/changelog
index 6b4373a..4295168 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -13,6 +13,8 @@ git-annex (6.20160127) UNRELEASED; urgency=medium
   * Limit annex.largefiles parsing to the subset of preferred content
     expressions that make sense in its context. So, not "standard"
     or "lackingcopies", etc.
+  * annex.largefiles: Add support for mimetype=text/* etc, when git-annex
+    is linked with libmagic.
 
  -- Joey Hess <id@joeyh.name>  Thu, 28 Jan 2016 13:53:09 -0400
 
diff --git a/debian/control b/debian/control
index f9025eb..3ebfbc2 100644
--- a/debian/control
+++ b/debian/control
@@ -72,6 +72,7 @@ Build-Depends:
 	libghc-optparse-applicative-dev (>= 0.11.0),
 	libghc-torrent-dev,
 	libghc-concurrent-output-dev,
+	libghc-magic-dev,
 	lsof [linux-any],
 	ikiwiki,
 	perlmagick,
diff --git a/doc/tips/largefiles.mdwn b/doc/tips/largefiles.mdwn
index c07d7f3..40cd3ea 100644
--- a/doc/tips/largefiles.mdwn
+++ b/doc/tips/largefiles.mdwn
@@ -50,6 +50,8 @@ The following terms can be used in annex.largefiles:
 
   Specify files to include or exclude.
 
+  The glob can contain `*` and `?` to match arbitrary characters.
+
 * `smallerthan=size` / `largerthan=size`
 
   Matches only files smaller than, or larger than the specified size.
@@ -57,6 +59,17 @@ The following terms can be used in annex.largefiles:
   The size can be specified with any commonly used units, for example,
   "0.5 gb" or "100 KiloBytes"
 
+* `mimetype=glob`
+
+  Looks up the MIME type of a file, and checks if the glob matches it.
+
+  For example, "mimetype=text/*" will match many varieties of text files,
+  including "text/plain", but also "text/x-shellscript", "text/x-makefile",
+  etc.
+
+  This is only available to use when git-annex was built with the
+  MagicMime build flag.
+
 * `anything`
 
   Matches any file.
diff --git a/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn
index f38e41d..b64eb45 100644
--- a/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn
+++ b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn
@@ -1 +1,7 @@
 It would be nice to have mimetype support on the `annex.largefiles` configuration directive. F.e. `git config annex.largefiles "not mimetype=text/plain"`
+
+> [[done]]; Implemented support for mimetype=text/plain or even
+> mimetype=text/*
+> 
+> Decided not to add external command test support, at least not for now.
+> --[[Joey]]
diff --git a/git-annex.cabal b/git-annex.cabal

(Diff truncated)
comment
diff --git a/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_4_d06a7c7f1a4fe78af548e2af2fbe8e2b._comment b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_4_d06a7c7f1a4fe78af548e2af2fbe8e2b._comment
new file mode 100644
index 0000000..c379c73
--- /dev/null
+++ b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_4_d06a7c7f1a4fe78af548e2af2fbe8e2b._comment
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2016-02-03T19:08:38Z"
+ content="""
+Update: There are now separate parsers for preferred content and
+annex.largefiles expressions, so this could be put in only the
+annex.largefiles parser.
+
+I kind of like the idea of letting an external program be run
+to test if the file is large. Of course, it would be up to the user to
+make the external program fast enough.
+
+The expression could be something like "checkprogram=foo". Since
+expressions have simple word-based tokenization, no parameters
+would be able to be passed to the program (except the file to check).
+
+For getting mime type, the best way seems to be to use 
+<http://hackage.haskell.org/package/magic>. Using `magicOpen [MagicMimeType]`
+I got it to probe mime types for files.
+
+Since libmagic won't be available everywhere, it would have to be a build flag,
+and if a git-annex not built with support for it is fed an expression with
+"magic=", it would have to error out when parsing the expression.
+
+Of course, these options are not mutually exclusive..
+"""]]

Limit annex.largefiles parsing to the subset of preferred content expressions that make sense in its context.
So, not "standard" or "lackingcopies", etc.
diff --git a/Annex/FileMatcher.hs b/Annex/FileMatcher.hs
index e3482ec..b4a4b6d 100644
--- a/Annex/FileMatcher.hs
+++ b/Annex/FileMatcher.hs
@@ -5,7 +5,15 @@
  - Licensed under the GNU GPL version 3 or higher.
  -}
 
-module Annex.FileMatcher where
+module Annex.FileMatcher (
+	GetFileMatcher,
+	checkFileMatcher,
+	checkMatcher,
+	matchAll,
+	preferredContentParser,
+	parsedToMatcher,
+	largeFilesMatcher,
+) where
 
 import qualified Data.Map as M
 
@@ -13,8 +21,6 @@ import Annex.Common
 import Limit
 import Utility.Matcher
 import Types.Group
-import Logs.Group
-import Annex.UUID
 import qualified Annex
 import Types.FileMatcher
 import Git.FilePath
@@ -53,53 +59,38 @@ fileMatchInfo file = do
 matchAll :: FileMatcher Annex
 matchAll = generate []
 
-parsedToMatcher :: [Either String (Token (MatchFiles Annex))] -> Either String (FileMatcher Annex)
+parsedToMatcher :: [ParseResult] -> Either String (FileMatcher Annex)
 parsedToMatcher parsed = case partitionEithers parsed of
 	([], vs) -> Right $ generate vs
 	(es, _) -> Left $ unwords $ map ("Parse failure: " ++) es
 
-exprParser :: FileMatcher Annex -> FileMatcher Annex -> Annex GroupMap -> M.Map UUID RemoteConfig -> Maybe UUID -> String -> [Either String (Token (MatchFiles Annex))]
-exprParser matchstandard matchgroupwanted getgroupmap configmap mu expr =
-	map parse $ tokenizeMatcher expr
-  where
-	parse = parseToken
-		matchstandard
-		matchgroupwanted
-		(limitPresent mu)
-		(limitInDir preferreddir)
-		getgroupmap
-	preferreddir = fromMaybe "public" $
-		M.lookup "preferreddir" =<< (`M.lookup` configmap) =<< mu
+data ParseToken
+	= SimpleToken String ParseResult
+	| ValueToken String (String -> ParseResult)
 
-parseToken :: FileMatcher Annex -> FileMatcher Annex -> MatchFiles Annex -> MatchFiles Annex -> Annex GroupMap -> String -> Either String (Token (MatchFiles Annex))
-parseToken matchstandard matchgroupwanted checkpresent checkpreferreddir getgroupmap t
+type ParseResult = Either String (Token (MatchFiles Annex))
+
+parseToken :: [ParseToken] -> String -> ParseResult
+parseToken l t
 	| t `elem` tokens = Right $ token t
-	| otherwise = case t of
-		"standard" -> call matchstandard
-		"groupwanted" -> call matchgroupwanted
-		"present" -> simply checkpresent
-		"inpreferreddir" -> simply checkpreferreddir
-		"unused" -> simply limitUnused
-		"anything" -> simply limitAnything
-		"nothing" -> simply limitNothing
-		_ -> case k of
-			"include" -> usev limitInclude
-			"exclude" -> usev limitExclude
-			"copies" -> usev limitCopies
-			"lackingcopies" -> usev $ limitLackingCopies False
-			"approxlackingcopies" -> usev $ limitLackingCopies True
-			"inbackend" -> usev limitInBackend
-			"largerthan" -> usev $ limitSize (>)
-			"smallerthan" -> usev $ limitSize (<)
-			"metadata" -> usev limitMetaData
-			"inallgroup" -> usev $ limitInAllGroup getgroupmap
-			_ -> Left $ "near " ++ show t
+	| otherwise = go l
   where
+	go [] = Left $ "near " ++ show t
+	go (SimpleToken s r : _) | s == t = r
+	go (ValueToken s mkr : _) | s == k = mkr v
+	go (_ : ps) = go ps
 	(k, v) = separate (== '=') t
-	simply = Right . Operation
-	usev a = Operation <$> a v
-	call sub = Right $ Operation $ \notpresent mi ->
-		matchMrun sub $ \a -> a notpresent mi
+
+commonTokens :: [ParseToken]
+commonTokens =
+	[ SimpleToken "unused" (simply limitUnused)
+	, SimpleToken "anything" (simply limitAnything)
+	, SimpleToken "nothing" (simply limitNothing)
+	, ValueToken "include" (usev limitInclude)
+	, ValueToken "exclude" (usev limitExclude)
+	, ValueToken "largerthan" (usev $ limitSize (>))
+	, ValueToken "smallerthan" (usev $ limitSize (<))
+	]
 
 {- This is really dumb tokenization; there's no support for quoted values.
  - Open and close parens are always treated as standalone tokens;
@@ -109,6 +100,30 @@ tokenizeMatcher = filter (not . null ) . concatMap splitparens . words
   where
 	splitparens = segmentDelim (`elem` "()")
 
+preferredContentParser :: FileMatcher Annex -> FileMatcher Annex -> Annex GroupMap -> M.Map UUID RemoteConfig -> Maybe UUID -> String -> [ParseResult]
+preferredContentParser matchstandard matchgroupwanted getgroupmap configmap mu expr =
+	map parse $ tokenizeMatcher expr
+  where
+ 	parse = parseToken $
+		[ SimpleToken "standard" (call matchstandard)
+		, SimpleToken "groupwanted" (call matchgroupwanted)
+		, SimpleToken "present" (simply $ limitPresent mu)
+		, SimpleToken "inpreferreddir" (simply $ limitInDir preferreddir)
+		, ValueToken "copies" (usev limitCopies)
+		, ValueToken "lackingcopies" (usev $ limitLackingCopies False)
+		, ValueToken "approxlackingcopies" (usev $ limitLackingCopies True)
+		, ValueToken "inbacked" (usev limitInBackend)
+		, ValueToken "metadata" (usev limitMetaData)
+		, ValueToken "inallgroup" (usev $ limitInAllGroup getgroupmap)
+		] ++ commonTokens
+	preferreddir = fromMaybe "public" $
+		M.lookup "preferreddir" =<< (`M.lookup` configmap) =<< mu
+
+largeFilesParser :: String -> [ParseResult]
+largeFilesParser expr = map parse $ tokenizeMatcher expr
+  where
+	parse = parseToken commonTokens
+
 {- Generates a matcher for files large enough (or meeting other criteria)
  - to be added to the annex, rather than directly to git. -}
 largeFilesMatcher :: Annex GetFileMatcher
@@ -123,13 +138,15 @@ largeFilesMatcher = go =<< annexLargeFiles <$> Annex.getGitConfig
 			then return matchAll
 			else mkmatcher expr
 
-	mkmatcher expr = do
-		u <- getUUID
-		-- No need to read remote configs, that's only needed for
-		-- inpreferreddir, which is used in preferred content
-		-- expressions but does not make sense in the 
-		-- annex.largefiles expression.
-		let emptyconfig = M.empty
-		either badexpr return $
-			parsedToMatcher $ exprParser matchAll matchAll groupMap emptyconfig (Just u) expr
+	mkmatcher = either badexpr return . parsedToMatcher . largeFilesParser
 	badexpr e = error $ "bad annex.largefiles configuration: " ++ e
+
+simply :: MatchFiles Annex -> ParseResult
+simply = Right . Operation
+
+usev :: MkLimit Annex -> String -> ParseResult
+usev a v = Operation <$> a v
+
+call :: FileMatcher Annex -> ParseResult
+call sub = Right $ Operation $ \notpresent mi ->
+	matchMrun sub $ \a -> a notpresent mi
diff --git a/Command/MatchExpression.hs b/Command/MatchExpression.hs
index 062a46b..a75101d 100644
--- a/Command/MatchExpression.hs
+++ b/Command/MatchExpression.hs
@@ -60,7 +60,7 @@ optParser desc = MatchExpressionOptions
 seek :: MatchExpressionOptions -> CommandSeek
 seek o = do
 	u <- getUUID
-	case parsedToMatcher $ exprParser matchAll matchAll groupMap M.empty (Just u) (matchexpr o) of
+	case parsedToMatcher $ preferredContentParser matchAll matchAll groupMap M.empty (Just u) (matchexpr o) of
 		Left e -> liftIO $ bail $ "bad expression: " ++ e
 		Right matcher -> ifM (checkmatcher matcher)
 			( liftIO exitSuccess
diff --git a/Logs/PreferredContent.hs b/Logs/PreferredContent.hs
index a74effb..d84abba 100644
--- a/Logs/PreferredContent.hs
+++ b/Logs/PreferredContent.hs
@@ -102,7 +102,7 @@ makeMatcher groupmap configmap groupwantedmap u = go True True
 		| null (lefts tokens) = generate $ rights tokens
 		| otherwise = unknownMatcher u
 	  where
-		tokens = exprParser matchstandard matchgroupwanted (pure groupmap) configmap (Just u) expr
+		tokens = preferredContentParser matchstandard matchgroupwanted (pure groupmap) configmap (Just u) expr
 		matchstandard
 			| expandstandard = maybe (unknownMatcher u) (go False False)
 				(standardPreferredContent <$> getStandardGroup mygroups)
@@ -133,7 +133,7 @@ checkPreferredContentExpression expr = case parsedToMatcher tokens of
 	Left e -> Just e
 	Right _ -> Nothing
   where
-	tokens = exprParser matchAll matchAll (pure emptyGroupMap) M.empty Nothing expr
+	tokens = preferredContentParser matchAll matchAll (pure emptyGroupMap) M.empty Nothing expr
 
 {- Puts a UUID in a standard group, and sets its preferred content to use
  - the standard expression for that group (unless preferred content is
diff --git a/debian/changelog b/debian/changelog

(Diff truncated)
Added a comment: git-annex-getcopy.sh
diff --git a/doc/forum/Sync_files_from_remote_to_remote/comment_8_4d3c05acc310a21f6c8ab77fb2638a8c._comment b/doc/forum/Sync_files_from_remote_to_remote/comment_8_4d3c05acc310a21f6c8ab77fb2638a8c._comment
new file mode 100644
index 0000000..279929f
--- /dev/null
+++ b/doc/forum/Sync_files_from_remote_to_remote/comment_8_4d3c05acc310a21f6c8ab77fb2638a8c._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="konubinix"
+ subject="git-annex-getcopy.sh"
+ date="2016-02-03T12:32:55Z"
+ content="""
+To do that, I created a simple bash script that get locally the files and then copies them to the remote
+
+https://github.com/Konubinix/Devel/blob/master/bin/git-annex-getcopy.sh
+
+I hope that helps.
+"""]]

Added a comment: adding a simple counter?
diff --git a/doc/todo/wishlist:_global_progress_status/comment_2_816f41f5436543fc09e7d7df82a8c8d5._comment b/doc/todo/wishlist:_global_progress_status/comment_2_816f41f5436543fc09e7d7df82a8c8d5._comment
new file mode 100644
index 0000000..a75aea4
--- /dev/null
+++ b/doc/todo/wishlist:_global_progress_status/comment_2_816f41f5436543fc09e7d7df82a8c8d5._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="atrent"
+ subject="adding a simple counter?"
+ date="2016-02-03T07:48:10Z"
+ content="""
+could you add a simple file counter?
+
+i.e. for a single \"git annex copy/get/etc.\" operation initiating a file counter and incrementing it on every examined file (transferred or not), thus giving a very rough idea of the progress on the whole set (the user should know the amount of files in the annex)
+"""]]

diff --git a/doc/bugs/Android_cannot_setup_gitlab_repo_due_to_ECDSA_key.mdwn b/doc/bugs/Android_cannot_setup_gitlab_repo_due_to_ECDSA_key.mdwn
new file mode 100644
index 0000000..fea52a7
--- /dev/null
+++ b/doc/bugs/Android_cannot_setup_gitlab_repo_due_to_ECDSA_key.mdwn
@@ -0,0 +1,40 @@
+### Please describe the problem.
+Cannot add gitlab repository on Android.
+
+### What steps will reproduce the problem?
+After attempting to add a gitlab repository on git-annex assistant, I am presented with a ssh key and prompted to add it to my gitlab account. After doing so and continuing, git-annex assistant returns to the same page and presents the ssh key again. Attempting to continue repeats the cycle as the ssh key is presented over and over.
+
+### What version of git-annex are you using? On what operating system?
+Stable version for Lollipop (I experienced this same error on Kit Kat ~6 months ago but could not resolve it at that point)
+Android 5.0 git-annex.apk
+
+### Please provide any additional information below.
+In the git-annex assistant log I see:
+
+    No ECDSA host key is known for gitlab.com and you have requested strict checking. 
+    Host key verification failed. 
+    No ECDSA host key is known for gitlab.com and you have requested strict checking. 
+    Host key verification failed. 
+    fatal: Could not read from remote repository
+    
+    Please make sure you have the correct access rights and the repository exists.
+    Host key verification failed.
+    Host key verification failed.
+    fatal: Could not read from remote repository.
+
+I resolved the issue by opening a new terminal window, attempting to connect to gitlab (ssh git@gitlab.com), verifying the ECDSA key against the gitlab website (https://about.gitlab.com/gitlab-com/) and accepting the key. The file .ssh/known_hosts was created. The gitlab repository could then be added in git annex assistant.
+
+The lack of information about the error presented to the user in git annex assistant was part of the problem.
+
+
+[[!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
+
+
+# End of transcript or log.
+"""]]
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+

Added a comment
diff --git a/doc/forum/Sync_files_from_remote_to_remote/comment_7_77c6550397435e9601fbae467be90976._comment b/doc/forum/Sync_files_from_remote_to_remote/comment_7_77c6550397435e9601fbae467be90976._comment
new file mode 100644
index 0000000..bbacebb
--- /dev/null
+++ b/doc/forum/Sync_files_from_remote_to_remote/comment_7_77c6550397435e9601fbae467be90976._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="Jan"
+ subject="comment 7"
+ date="2016-02-03T02:49:01Z"
+ content="""
+I can confirm that Remi's suggestion does work as expected, thanks!
+
+    $ git annex sync --content
+    get 2014/2014-06-14/IMG_1448.JPG (from origin...) (checksum...) ok
+    copy 2014/2014-06-14/IMG_1448.JPG copy 2014/2014-06-14/IMG_1448.JPG (to usb...) ok
+    drop 2014/2014-06-14/IMG_1448.JPG ok
+"""]]

Added a comment: all those parenthesis...
diff --git a/doc/devblog/day_359__annex.largefiles_gitattributes/comment_1_ac73ad4147629c25cd51d13cfea206cf._comment b/doc/devblog/day_359__annex.largefiles_gitattributes/comment_1_ac73ad4147629c25cd51d13cfea206cf._comment
new file mode 100644
index 0000000..d1732a4
--- /dev/null
+++ b/doc/devblog/day_359__annex.largefiles_gitattributes/comment_1_ac73ad4147629c25cd51d13cfea206cf._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="anarcat"
+ subject="all those parenthesis..."
+ date="2016-02-02T22:56:51Z"
+ content="""
+... is that lisp showing through your haskell sir? :)
+
+jokes aside, it's cool that you can actually do that, i didn't know! is the \"non-space expression\" new too?
+"""]]

Revert incorrect typo fix
diff --git a/doc/tips/largefiles.mdwn b/doc/tips/largefiles.mdwn
index 6033a7c..ec51ecf 100644
--- a/doc/tips/largefiles.mdwn
+++ b/doc/tips/largefiles.mdwn
@@ -66,4 +66,4 @@ If you've set up an annex.largefiles configuration but want to force a file to
 be stored in the annex, you can temporarily override the configuration like
 this:
 
-	git annex add -c annex.largefiles=nothing smallfile
+	git annex add -c annex.largefiles=anything smallfile

typo
diff --git a/doc/tips/largefiles.mdwn b/doc/tips/largefiles.mdwn
index ec51ecf..6033a7c 100644
--- a/doc/tips/largefiles.mdwn
+++ b/doc/tips/largefiles.mdwn
@@ -66,4 +66,4 @@ If you've set up an annex.largefiles configuration but want to force a file to
 be stored in the annex, you can temporarily override the configuration like
 this:
 
-	git annex add -c annex.largefiles=anything smallfile
+	git annex add -c annex.largefiles=nothing smallfile

improve
diff --git a/doc/tips/largefiles.mdwn b/doc/tips/largefiles.mdwn
index 46e1533..ec51ecf 100644
--- a/doc/tips/largefiles.mdwn
+++ b/doc/tips/largefiles.mdwn
@@ -17,10 +17,12 @@ also used by `git annex addurl` and `git annex importfeed` when downloading
 files. When a file does not match annex.largefiles, these commands will
 add its content to git instead of to the annex.
 
+This saves you the bother of keeping things straight when adding files.
+
 ## examples
 
 For example, let's make only files larger than 100 kb be added to the annex,
-and never *.c and *.h source files.
+and never `*.c` and `*.h` source code files.
 
 Write this to the `.gitattributes` file:
 
@@ -40,7 +42,7 @@ checkouts behave differently. The git configuration overrides the
 
 ## syntax
 
-The way the `.gitattributes` example above works is, *.c and *.h files
+The way the `.gitattributes` example above works is, `*.c` and `*.h` files
 have the annex.largefiles attribute set to "nothing", which matches nothing,
 and so those files are never treated as large files. All other files use
 the other value, which checks the file size.

rework largefiles documentation
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 77a2b38..cb27ec1 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -810,7 +810,12 @@ Here are all the supported configuration settings.
 
 * `annex.largefiles`
 
-  See "LARGE FILES CONFIGURATION" below.
+  Used to configure which files are large enough to be added to the annex.
+  Default: All files.
+
+  Overrides any annex.largefiles attributes in `.gitattributes` files.
+
+  See <https://git-annex.branchable.com/tips/largefiles> for details.
 
 * `annex.addsmallfiles`
 
@@ -1277,7 +1282,7 @@ Here are all the supported configuration settings.
 
   These can be passed to `git annex init` to tune the repository.
   They cannot be safely changed in a running repository.
-  For details, see <http://git-annex.branchable.com/tuning/>.
+  For details, see <https://git-annex.branchable.com/tuning/>.
 
 # CONFIGURATION VIA .gitattributes
 
@@ -1290,8 +1295,9 @@ but the SHA256E backend for ogg files:
 	* annex.backend=WORM
 	*.ogg annex.backend=SHA256E
 
-There is a annex.largefiles attribute; see "LARGE FILES CONFIGURATION"
-below.
+There is a annex.largefiles attribute; which is used to configure which
+files are large enough to be added to the annex.
+See <https://git-annex.branchable.com/tips/largefiles> for details.
 
 The numcopies setting can also be configured on a per-file-type basis via
 the `annex.numcopies` attribute in `.gitattributes` files. This overrides
@@ -1314,61 +1320,6 @@ Also note that when using views, only the toplevel .gitattributes file is
 preserved in the view, so other settings in other files won't have any
 effect.
 
-# LARGE FILES CONFIGURATION
-
-Normally commands like `git annex add` always add files to the annex.
-And when using the v6 repository mode, even `git add` and `git commit -a`
-will add files to the annex.
-
-However, sometimes it's useful to keep the content of some smaller files in
-git, any only annex the larger files. For example, a game's code should be
-committed to git while its artwork is stored in the annex.
-
-The annex.largefiles configuration meets this need. It's checked by
-`git annex add`, by `git add` and `git commit -a` (in v6 repositories),
-by `git annex import` and the assistant. It's also used by
-`git annex addurl` and `git annex importfeed` when downloading files.
-When a file does not match annex.largefiles, it will be added to git instead
-of to the annex.
-
-There are two ways to configure annex.largefiles. Setting it in the
-`.gitattributes` file is recommended to consistently use the same
-configuration across different checkouts of the repository. Setting the
-annex.largefiles git configuration lets different checkouts behave
-differently. The git configuration overrides the `.gitattributes`
-configuration.
-
-For example, in the game scenario, here's how to make only files of a
-certian size be annexed, and never source code files:
-  
-	git config annex.largefiles 'largerthan=100kb and (not include=*.c)'
-
-The value is a preferred content expression.
-See [[git-annex-preferred-content]](1) for details.
-
-To configure the same thing in the `.gitattributes` file, looks a little
-bit different:
-
-	* annex.largefiles=(largerthan=100kb)
-	*.c annex.largefiles=nothing
-
-That has the same effect as the git configuration, because the attribute for
-*.c overrides the previous attribute. 
-
-Note that, since git attribute values cannot contain whitespace,
-it's useful to instead parenthesize the terms of the preferred content
-expression. This trick allows setting the annex.largefiles attribute to more
-complicated expressions. For example, this is the same as the git config
-shown earlier:
-
-	* annex.largefiles=(largerthan=100kb)and(not(include=*.c))
-
-By the way, if you've set up an annex.largefiles configuration but want to
-force a file to be stored in the annex, you can temporarily override the
-configuration like this:
-
-	git annex add -c annex.largefiles=anything smallfile
-
 # EXIT STATUS
 
 git-annex, when called as a git subcommand, may return exit codes 0 or 1
@@ -1402,7 +1353,7 @@ whenever the git-annex branch is updated. You can make this hook run
 # SEE ALSO
 
 More git-annex documentation is available on its web site,
-<http://git-annex.branchable.com/>
+<https://git-annex.branchable.com/>
 
 If git-annex is installed from a package, a copy of its documentation
 should be included, in, for example, `/usr/share/doc/git-annex/`.
@@ -1411,6 +1362,6 @@ should be included, in, for example, `/usr/share/doc/git-annex/`.
 
 Joey Hess <id@joeyh.name>
 
-<http://git-annex.branchable.com/>
+<https://git-annex.branchable.com/>
 
 Warning: Automatically converted into a man page by mdwn2man. Edit with care.
diff --git a/doc/tips/largefiles.mdwn b/doc/tips/largefiles.mdwn
new file mode 100644
index 0000000..46e1533
--- /dev/null
+++ b/doc/tips/largefiles.mdwn
@@ -0,0 +1,67 @@
+[[!meta title="annex.largefiles: configuring mixed content repositories"]]
+
+Normally commands like `git annex add` always add files to the annex.
+And when using the v6 repository mode, even `git add` and `git commit -a`
+will add files to the annex.
+
+Let's suppose you're developing a video game, written in C. You have
+source code, and some large game assets. You want to ensure the source
+code is stored in git -- that's what git's for! And you want to store
+the game assets in the git annex -- to avod bloating your git repos with
+possibly enormous files, but still version control them.
+
+The annex.largefiles configuration is useful for such mixed content
+repositories. It's checked by `git annex add`, by `git add` and `git commit -a`
+(in v6 repositories), by `git annex import` and the assistant. It's
+also used by `git annex addurl` and `git annex importfeed` when downloading
+files. When a file does not match annex.largefiles, these commands will
+add its content to git instead of to the annex.
+
+## examples
+
+For example, let's make only files larger than 100 kb be added to the annex,
+and never *.c and *.h source files.
+
+Write this to the `.gitattributes` file:
+
+	* annex.largefiles=(largerthan=100kb)
+	*.c annex.largefiles=nothing
+	*.h annex.largefiles=nothing
+
+Or, set the git configuration instead:
+  
+	git config annex.largefiles 'largerthan=100kb and not (include=*.c or include=*.h)'
+
+Both of these settings do the same thing. Setting it in the `.gitattributes`
+file makes any checkout of the repository share that configuration, so is often
+a good choice. Setting the annex.largefiles git configuration lets different
+checkouts behave differently. The git configuration overrides the
+`.gitattributes` configuration.
+
+## syntax
+
+The way the `.gitattributes` example above works is, *.c and *.h files
+have the annex.largefiles attribute set to "nothing", which matches nothing,
+and so those files are never treated as large files. All other files use
+the other value, which checks the file size.
+
+The value of annex.largefiles is a
+[[preferred content expression|git-annex-preferred-content]] that is
+used to match the large files.
+
+Note that, since git attribute values cannot contain whitespace,
+it's useful to instead parenthesize the terms of the 
+[[preferred content expression|git-annex-preferred-content]]. This trick
+allows setting the annex.largefiles attribute to more complicated expressions.
+For example, this is the same as the git config shown earlier, shoehorned
+into a git attribute:
+
+	* annex.largefiles=(largerthan=100kb)and(not((include=*.c)or(include=*.h)))
+
+## temporarily override
+
+If you've set up an annex.largefiles configuration but want to force a file to
+be stored in the annex, you can temporarily override the configuration like
+this:
+
+	git annex add -c annex.largefiles=anything smallfile
diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn
index 893408c..cfe422e 100644
--- a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn
+++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn
@@ -8,11 +8,7 @@ thing, but even better!
 
 ----
 
-First, get git-annex version 4.20130329 or newer.

(Diff truncated)
devblog
diff --git a/doc/devblog/day_359__annex.largefiles_gitattributes.mdwn b/doc/devblog/day_359__annex.largefiles_gitattributes.mdwn
new file mode 100644
index 0000000..7cd5013
--- /dev/null
+++ b/doc/devblog/day_359__annex.largefiles_gitattributes.mdwn
@@ -0,0 +1,18 @@
+For use cases that mix annexed files with files stored in git, the
+annex.largefiles config is more important in v6 repositories than before,
+since it configures the behavior of `git add` and even `git commit -a`. To
+make it possible to set annex.largefiles so it'll stick across clones of
+a repository, I have now made it be supported in `.gitattributes` files
+as well as git config.
+
+Setting it in .gitattributes looks a little bit different, since
+the regular .gitattributes syntax can be used to match on the filename.
+
+	* annex.largefiles=(largerthan=100kb)
+	*.c annex.largefiles=nothing
+
+It seems there's no way to make a git attribute value contain whitespace.
+So, more complicated annex.largefiles expressions need to use parens to
+break up the words.
+
+	* annex.largefiles=(largerthan=100kb)and(not(include=*.c))

annex.largefiles can be configured in .gitattributes too
This is particulary useful for v6 repositories, since the .gitattributes
configuration will apply in all clones of the repository.
diff --git a/Annex/CheckAttr.hs b/Annex/CheckAttr.hs
index 28c5ffe..2be9548 100644
--- a/Annex/CheckAttr.hs
+++ b/Annex/CheckAttr.hs
@@ -20,6 +20,7 @@ annexAttrs :: [Git.Attr]
 annexAttrs =
 	[ "annex.backend"
 	, "annex.numcopies"
+	, "annex.largefiles"
 	]
 
 checkAttr :: Git.Attr -> FilePath -> Annex String
diff --git a/Annex/FileMatcher.hs b/Annex/FileMatcher.hs
index a8e431a..4c7541b 100644
--- a/Annex/FileMatcher.hs
+++ b/Annex/FileMatcher.hs
@@ -1,6 +1,6 @@
 {- git-annex file matching
  -
- - Copyright 2012-2014 Joey Hess <id@joeyh.name>
+ - Copyright 2012-2016 Joey Hess <id@joeyh.name>
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
@@ -19,12 +19,18 @@ import qualified Annex
 import Types.FileMatcher
 import Git.FilePath
 import Types.Remote (RemoteConfig)
+import Annex.CheckAttr
+import Git.CheckAttr (unspecifiedAttr)
 
 import Data.Either
 import qualified Data.Set as S
 
-checkFileMatcher :: FileMatcher Annex -> FilePath -> Annex Bool
-checkFileMatcher matcher file = checkMatcher matcher Nothing (Just file) S.empty True
+type GetFileMatcher = FilePath -> Annex (FileMatcher Annex)
+
+checkFileMatcher :: GetFileMatcher -> FilePath -> Annex Bool
+checkFileMatcher getmatcher file = do
+	matcher <- getmatcher file
+	checkMatcher matcher Nothing (Just file) S.empty True
 
 checkMatcher :: FileMatcher Annex -> Maybe Key -> AssociatedFile -> AssumeNotPresent -> Bool -> Annex Bool
 checkMatcher matcher mkey afile notpresent d
@@ -104,11 +110,19 @@ tokenizeMatcher = filter (not . null ) . concatMap splitparens . words
 
 {- Generates a matcher for files large enough (or meeting other criteria)
  - to be added to the annex, rather than directly to git. -}
-largeFilesMatcher :: Annex (FileMatcher Annex)
+largeFilesMatcher :: Annex GetFileMatcher
 largeFilesMatcher = go =<< annexLargeFiles <$> Annex.getGitConfig
   where
-	go Nothing = return matchAll
 	go (Just expr) = do
+		matcher <- mkmatcher expr
+		return $ const $ return matcher
+	go Nothing = return $ \file -> do
+		expr <- checkAttr "annex.largefiles" file
+		if null expr || expr == unspecifiedAttr
+			then return matchAll
+			else mkmatcher expr
+
+	mkmatcher expr = do
 		u <- getUUID
 		-- No need to read remote configs, that's only needed for
 		-- inpreferreddir, which is used in preferred content
diff --git a/Assistant/Threads/Watcher.hs b/Assistant/Threads/Watcher.hs
index 1fc20a9..f0a6399 100644
--- a/Assistant/Threads/Watcher.hs
+++ b/Assistant/Threads/Watcher.hs
@@ -35,7 +35,6 @@ import Annex.CatFile
 import Annex.CheckIgnore
 import Annex.Link
 import Annex.FileMatcher
-import Types.FileMatcher
 import Annex.Content
 import Annex.ReplaceFile
 import Annex.Version
@@ -202,8 +201,8 @@ runHandler handler file filestatus = void $ do
 		| otherwise = f
 
 {- Small files are added to git as-is, while large ones go into the annex. -}
-add :: FileMatcher Annex -> FilePath -> Assistant (Maybe Change)
-add bigfilematcher file = ifM (liftAnnex $ checkFileMatcher bigfilematcher file)
+add :: GetFileMatcher -> FilePath -> Assistant (Maybe Change)
+add largefilematcher file = ifM (liftAnnex $ checkFileMatcher largefilematcher file)
 	( pendingAddChange file
 	, do
 		liftAnnex $ Annex.Queue.addCommand "add"
@@ -211,7 +210,7 @@ add bigfilematcher file = ifM (liftAnnex $ checkFileMatcher bigfilematcher file)
 		madeChange file AddFileChange
 	)
 
-onAdd :: FileMatcher Annex -> Handler
+onAdd :: GetFileMatcher -> Handler
 onAdd matcher file filestatus
 	| maybe False isRegularFile filestatus =
 		unlessIgnored file $
@@ -221,7 +220,7 @@ onAdd matcher file filestatus
 shouldRestage :: DaemonStatus -> Bool
 shouldRestage ds = scanComplete ds || forceRestage ds
 
-onAddUnlocked :: Bool -> FileMatcher Annex -> Handler
+onAddUnlocked :: Bool -> GetFileMatcher -> Handler
 onAddUnlocked = onAddUnlocked' False contentchanged addassociatedfile samefilestatus
   where
 	addassociatedfile key file = 
@@ -243,10 +242,10 @@ onAddUnlocked = onAddUnlocked' False contentchanged addassociatedfile samefilest
 {- In direct mode, add events are received for both new files, and
  - modified existing files.
  -}
-onAddDirect :: Bool -> FileMatcher Annex -> Handler
+onAddDirect :: Bool -> GetFileMatcher -> Handler
 onAddDirect = onAddUnlocked' True changedDirect (\k f -> void $ addAssociatedFile k f) sameFileStatus
 
-onAddUnlocked' :: Bool -> (Key -> FilePath -> Annex ()) -> (Key -> FilePath -> Annex ()) -> (Key -> FilePath -> FileStatus -> Annex Bool) -> Bool -> FileMatcher Annex -> Handler
+onAddUnlocked' :: Bool -> (Key -> FilePath -> Annex ()) -> (Key -> FilePath -> Annex ()) -> (Key -> FilePath -> FileStatus -> Annex Bool) -> Bool -> GetFileMatcher -> Handler
 onAddUnlocked' isdirect contentchanged addassociatedfile samefilestatus symlinkssupported matcher file fs = do
 	v <- liftAnnex $ catKeyFile file
 	case (v, fs) of
diff --git a/Command/Import.hs b/Command/Import.hs
index 8478419..d5a2fee 100644
--- a/Command/Import.hs
+++ b/Command/Import.hs
@@ -17,7 +17,6 @@ import Remote
 import Types.KeySource
 import Annex.CheckIgnore
 import Annex.NumCopies
-import Types.FileMatcher
 import Annex.FileMatcher
 
 cmd :: Command
@@ -67,7 +66,7 @@ seek o = allowConcurrentOutput $ do
 	largematcher <- largeFilesMatcher
 	withPathContents (start largematcher (duplicateMode o)) (importFiles o)
 
-start :: FileMatcher Annex -> DuplicateMode -> (FilePath, FilePath) -> CommandStart
+start :: GetFileMatcher -> DuplicateMode -> (FilePath, FilePath) -> CommandStart
 start largematcher mode (srcfile, destfile) =
 	ifM (liftIO $ isRegularFile <$> getSymbolicLinkStatus srcfile)
 		( do
diff --git a/Git/CheckAttr.hs b/Git/CheckAttr.hs
index 23ed226..465bbba 100644
--- a/Git/CheckAttr.hs
+++ b/Git/CheckAttr.hs
@@ -92,3 +92,6 @@ checkAttr (h, attrs, oldgit, currdir) want file = do
 		sep = ": " ++ attr ++ ": "
 	getattrvalues (_filename:attr:val:rest) c = getattrvalues rest ((attr,val):c)
 	getattrvalues _ c = c
+
+unspecifiedAttr :: String
+unspecifiedAttr = "!"
diff --git a/Limit.hs b/Limit.hs
index 79335d3..b8053e6 100644
--- a/Limit.hs
+++ b/Limit.hs
@@ -200,10 +200,14 @@ limitUnused _ (MatchingInfo _ ak _) = do
 	k <- getInfo ak
 	S.member k <$> unusedKeys
 
-{- Limit that matches any version of any file. -}
+{- Limit that matches any version of any file or key. -}
 limitAnything :: MatchFiles Annex
 limitAnything _ _ = return True
 
+{- Limit that never matches. -}
+limitNothing :: MatchFiles Annex
+limitNothing _ _ = return False
+
 {- Adds a limit to skip files not believed to be present in all
  - repositories in the specified group. -}
 addInAllGroup :: String -> Annex ()
diff --git a/debian/changelog b/debian/changelog
index b3491f6..a834e3d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -6,6 +6,10 @@ git-annex (6.20160127) UNRELEASED; urgency=medium
     caused them to sometimes output side messages.
   * webapp: Fix deletion of current repository directory.
   * Added "nothing" to preferred content expression syntax.
+  * annex.largefiles can be configured in .gitattributes too;
+    this is particulary useful for v6 repositories, since the
+    .gitattributes configuration will apply in all clones of the
+    repository.
 
  -- Joey Hess <id@joeyh.name>  Thu, 28 Jan 2016 13:53:09 -0400
 
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 471f219..77a2b38 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -795,6 +795,9 @@ Here are all the supported configuration settings.
   Space-separated list of names of the key-value backends to use.
   The first listed is used to store new files by default.
 
+  This is overridden by annex annex.backend configuration in the
+  .gitattributes files.
+
 * `annex.diskreserve`

(Diff truncated)
add "nothing" to preferred content DSL
Same as "not anything"; will be particularly useful in annex.largefiles
gitattributes.
diff --git a/Annex/FileMatcher.hs b/Annex/FileMatcher.hs
index f1936bc..a8e431a 100644
--- a/Annex/FileMatcher.hs
+++ b/Annex/FileMatcher.hs
@@ -74,6 +74,7 @@ parseToken matchstandard matchgroupwanted checkpresent checkpreferreddir getgrou
 	| t == "inpreferreddir" = use checkpreferreddir
 	| t == "unused" = Right $ Operation limitUnused
 	| t == "anything" = Right $ Operation limitAnything
+	| t == "nothing" = Right $ Operation limitNothing
 	| otherwise = maybe (Left $ "near " ++ show t) use $ M.lookup k $
 		M.fromList
 			[ ("include", limitInclude)
diff --git a/debian/changelog b/debian/changelog
index ffe840a..b3491f6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -5,6 +5,7 @@ git-annex (6.20160127) UNRELEASED; urgency=medium
   * Fix reversion in lookupkey, contentlocation, and examinekey which
     caused them to sometimes output side messages.
   * webapp: Fix deletion of current repository directory.
+  * Added "nothing" to preferred content expression syntax.
 
  -- Joey Hess <id@joeyh.name>  Thu, 28 Jan 2016 13:53:09 -0400
 
diff --git a/doc/git-annex-preferred-content.mdwn b/doc/git-annex-preferred-content.mdwn
index 8ac8df0..c8c5d06 100644
--- a/doc/git-annex-preferred-content.mdwn
+++ b/doc/git-annex-preferred-content.mdwn
@@ -218,6 +218,10 @@ elsewhere to allow removing it).
 
   Matches any version of any file.
 
+* `nothing`
+
+  Matches nothing. (Same as "not anything")
+
 * `not expression`
 
   Inverts what the expression matches. For example, `not include=archive/*`
diff --git a/doc/preferred_content.mdwn b/doc/preferred_content.mdwn
index 26db054..f8c6ce6 100644
--- a/doc/preferred_content.mdwn
+++ b/doc/preferred_content.mdwn
@@ -58,6 +58,7 @@ it assumes all files that are currently present are preferred content.
 Here are recent changes to preferred content expressions, and the version
 they were added in.
 
+* "nothing" 6.201600202
 * "anything" 5.20150616
 * "standard" 5.20140314  
   (only when used in a more complicated expression; "standard" by

diff --git a/doc/forum/Multisession_compatible__63__.mdwn b/doc/forum/Multisession_compatible__63__.mdwn
new file mode 100644
index 0000000..6c117a5
--- /dev/null
+++ b/doc/forum/Multisession_compatible__63__.mdwn
@@ -0,0 +1,8 @@
+Thanks for the great tool!
+
+Is git-annex multisession compatible? I'm assuming that an "add" for example, will switch to the git-annex branch, commit data, and switch back to the previous branch. Is this protected by a Lock of some sort so that if two separate processes are interacting with the same repo/annex simultaneously there won't be any corruption?
+
+If not, is this something I could add within my python class that is implementing the interface to the Annex?
+
+Thanks,
+Mark

Added a comment
diff --git a/doc/tips/Repositories_with_large_number_of_files/comment_5_8540bf807eaf1b4e927eafc03deef304._comment b/doc/tips/Repositories_with_large_number_of_files/comment_5_8540bf807eaf1b4e927eafc03deef304._comment
new file mode 100644
index 0000000..2d1e238
--- /dev/null
+++ b/doc/tips/Repositories_with_large_number_of_files/comment_5_8540bf807eaf1b4e927eafc03deef304._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="CandyAngel"
+ subject="comment 5"
+ date="2016-02-02T10:08:06Z"
+ content="""
+Splitting the index (git update-index --split-index) doesn't work for me at all. While it may initially reduce the size of .git/index, making a commit inflates it back to its original size anyway.
+
+I thought it might be some interaction with v4 index and its compression mechanics but it does the same if I set it to v3 index. For (manufactured) example:
+
+    $ git update-index --split-index
+    $ du -sh .git/*index*
+    4.0K    .git/index
+    76M     .git/sharedindex.70e661456302b51a7ec59bf5b32d630e74b34c7c
+
+    ... add 8000 files ...
+
+    $ git commit -m \"add files\"
+    $ du -sh .git/*index*
+    80M     .git/index
+    76M     .git/sharedindex.70e661456302b51a7ec59bf5b32d630e74b34c7c
+"""]]

poll vote (DCIM directory (photos and videos only))
diff --git a/doc/design/assistant/polls/Android_default_directory.mdwn b/doc/design/assistant/polls/Android_default_directory.mdwn
index c1e2598..3febc95 100644
--- a/doc/design/assistant/polls/Android_default_directory.mdwn
+++ b/doc/design/assistant/polls/Android_default_directory.mdwn
@@ -4,4 +4,4 @@ Same as the desktop webapp, users will be able to enter a directory they
 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 73 "/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 73 "/sdcard/annex" 6 "Whole /sdcard" 8 "DCIM directory (photos and videos only)" 2 "Same as for regular git-annex. ~/annex/"]]

Added a comment: 10.10 build works on El Capitan (10.11)
diff --git a/doc/install/OSX/comment_12_17b84f51de6bed88e373350b194c8a8d._comment b/doc/install/OSX/comment_12_17b84f51de6bed88e373350b194c8a8d._comment
new file mode 100644
index 0000000..8f937d1
--- /dev/null
+++ b/doc/install/OSX/comment_12_17b84f51de6bed88e373350b194c8a8d._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="andrew.grangaard@bf525d11f8ebfbfb0976f7df2301aa0f36668f59"
+ nickname="andrew.grangaard"
+ subject="10.10 build works on El Capitan (10.11)"
+ date="2016-02-02T01:30:45Z"
+ content="""
+The OSX 10.10 build works fine on my 10.11 El Capitan machine.   Updated this page to reflect that.
+
+git-annex is also in 'brew cask', automating installation from the OSX binaries.   I've sent  [PR 18105](https://github.com/caskroom/homebrew-cask/pull/18105) to the brew cask team to get the cask to work for 10.11.
+"""]]

diff --git a/doc/install/OSX.mdwn b/doc/install/OSX.mdwn
index cec766ca..b1ff1cc 100644
--- a/doc/install/OSX.mdwn
+++ b/doc/install/OSX.mdwn
@@ -28,7 +28,7 @@ Thanks to Kevin McKenzie for hosting the autobuilder.
 
 ## using Homebrew
 
-git-annex is now [[available in Homebrew|Homebrew]] (source) as well as [[available in Homebrew Cask|Homebrew-cask]](binary).
+git-annex is now [[available in Homebrew|Homebrew]] (source) as well as [[available in Homebrew Cask|Homebrew-cask]] (binary).
 
 ## using MacPorts
 

Add homebrew cask instructions.
diff --git a/doc/install/Homebrew-cask.mdwn b/doc/install/Homebrew-cask.mdwn
new file mode 100644
index 0000000..a7517f7
--- /dev/null
+++ b/doc/install/Homebrew-cask.mdwn
@@ -0,0 +1,3 @@
+[Homebrew Cask](http://caskroom.io) has a [cask](https://github.com/caskroom/homebrew-cask/blob/master/Casks/git-annex.rb) for git-annex.
+
+Homebrew cask users can simply run `brew cask install git-annex` to install git-annex and git-annex-shell from the OSX binary images.

Tested as working in 10.11 / El Capitan. Add hombrew-cask reference.
diff --git a/doc/install/OSX.mdwn b/doc/install/OSX.mdwn
index 7d272be..cec766ca 100644
--- a/doc/install/OSX.mdwn
+++ b/doc/install/OSX.mdwn
@@ -3,7 +3,7 @@
 [[!img /assistant/osx-app.png align=right link=/assistant]]
 For easy installation, use the prebuilt app bundle.
 
-* 10.10 Yosemite / 10.9 Mavericks: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.10_Yosemite/git-annex.dmg)
+* 10.11 El Capitan / 10.10 Yosemite / 10.9 Mavericks: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.10_Yosemite/git-annex.dmg)
 * 10.8.2 Mountain Lion: [git-annex.dmg.bz2](https://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/git-annex.dmg.bz2) **warning: not being updated any longer**
 * 10.7.5 Lion: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg) **warning: not being updated any longer**
 
@@ -21,14 +21,14 @@ several more. Handy if you don't otherwise have git installed.
 ## autobuilds
 
 [[Joey]] autobuilds the app for 10.10 Yosemite
-(also reported to work on 10.9 Mavericks).
+(also reported to work on 10.9 Mavericks and 10.11 El Capitan).
 Thanks to Kevin McKenzie for hosting the autobuilder.
 
 * [autobuild of git-annex.dmg](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-yosemite/git-annex.dmg) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-yosemite/))
 
 ## using Homebrew
 
-git-annex is now [[available in Homebrew|Homebrew]]!
+git-annex is now [[available in Homebrew|Homebrew]] (source) as well as [[available in Homebrew Cask|Homebrew-cask]](binary).
 
 ## using MacPorts
 

diff --git a/doc/todo/hide_missing_files.mdwn b/doc/todo/hide_missing_files.mdwn
index fb69849..4f7b4b5 100644
--- a/doc/todo/hide_missing_files.mdwn
+++ b/doc/todo/hide_missing_files.mdwn
@@ -4,4 +4,6 @@ Now this behavior has changed, and with v6 coming up, all those distinctions hav
 
 So what's someone to do if he wants to deal with the usability issue mentioned above? To restate: the problem is users I share files with often see a *lot* of files, with only a fraction of them being actually present. A lot of those files are obviously large, and so they are having a frustrating experience with git-annex because they see all those promises of "files being there" but they have a hard time actually finding which files *really* are there. So they click one one broken link after the other and generally give up before they figure out how to pop a terminal open, use `find -L -type l` or `find -type l` (i can never remember which!) - something we can hardly expect from the average GUI user...
 
+Maybe this could be accomplished through a [[dumb, unsafe, human-readable backend]]?
+
 Thanks for any advice! --[[anarcat]]

another idea
diff --git a/doc/todo/dumb__44___unsafe__44___human-readable_backend.mdwn b/doc/todo/dumb__44___unsafe__44___human-readable_backend.mdwn
new file mode 100644
index 0000000..b73467f
--- /dev/null
+++ b/doc/todo/dumb__44___unsafe__44___human-readable_backend.mdwn
@@ -0,0 +1,12 @@
+This was already discussed twice previously: [[forum/original_filename_on_s3/]] and [[todo/Facilitate_public_pretty_S3_URLs/]]. Yet I am still constantly having problems with this when trying to use git-annex to do some particular stuff.
+
+My latest example is a friend that wanted to sync files to a remote Webdav server. While I know he can use [[special_remotes/webdav/]] support, the resulting filenames on the webdav server will be basically garbled beyond recognition for any user that will use the Webdav server without git-annex.
+
+I understand the rationale behind the existing [[backends]], but wouldn't it be possible to implement a new backend that would just use the filename as a key?
+
+I know this would have several downsides:
+
+* lack of deduplication
+* much more exposed to corruption (no checksum to check against recorded? or can this be put somewhere else?)
+
+The main advantage, for me, is much better interoperability: any remote becomes usable by other non-git-annex clients... It would also be great as it would allow me to store only a *part* of my git-annex files on a remote without having a forest of empty files (on broken filesystems) or symlinks (on real filesystems) for files that are missing, something that is a massive source of confusion for users I work with. It could, for example, allow me to create thumb drives that would solve the [[hide missing files]] problem. -- [[anarcat]]

diff --git a/doc/todo/hide_missing_files.mdwn b/doc/todo/hide_missing_files.mdwn
new file mode 100644
index 0000000..fb69849
--- /dev/null
+++ b/doc/todo/hide_missing_files.mdwn
@@ -0,0 +1,7 @@
+I seem to recall a time when [[direct mode]] would hide files that were not present in the local repository. While this created a bunch of headaches for people that wanted to get the missing files, it was great for users that didn't care and only wanted to see what was actually there. (In fact, it was suggested as a solution in [[forum/usability:_what_are_those_arrow_things__63__/]], a year and a half ago.)
+
+Now this behavior has changed, and with v6 coming up, all those distinctions have basically gone away anyways...
+
+So what's someone to do if he wants to deal with the usability issue mentioned above? To restate: the problem is users I share files with often see a *lot* of files, with only a fraction of them being actually present. A lot of those files are obviously large, and so they are having a frustrating experience with git-annex because they see all those promises of "files being there" but they have a hard time actually finding which files *really* are there. So they click one one broken link after the other and generally give up before they figure out how to pop a terminal open, use `find -L -type l` or `find -type l` (i can never remember which!) - something we can hardly expect from the average GUI user...
+
+Thanks for any advice! --[[anarcat]]

Added a comment
diff --git a/doc/devblog/day_358__bugfix_release/comment_1_a9aa122010e576c572ca719638ecf2e6._comment b/doc/devblog/day_358__bugfix_release/comment_1_a9aa122010e576c572ca719638ecf2e6._comment
new file mode 100644
index 0000000..b55f0b0
--- /dev/null
+++ b/doc/devblog/day_358__bugfix_release/comment_1_a9aa122010e576c572ca719638ecf2e6._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="CandyAngel"
+ subject="comment 1"
+ date="2016-02-01T12:43:47Z"
+ content="""
+--batch and --with-files on addurl is amazing! I migrated one of my scripts last night, that used to use 'parallel' and disabling autocommit, and it simplified the workflow a *lot*.
+"""]]

Added a comment: Disabling SSH connection caching
diff --git a/doc/bugs/Android_6.0_compatibility/comment_5_0bcee221dd22b424f08720604a486c79._comment b/doc/bugs/Android_6.0_compatibility/comment_5_0bcee221dd22b424f08720604a486c79._comment
new file mode 100644
index 0000000..7ed65ea
--- /dev/null
+++ b/doc/bugs/Android_6.0_compatibility/comment_5_0bcee221dd22b424f08720604a486c79._comment
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="divergentdave@5c17d06f6d67c6f157b76a4cc95ca764b7d2f899"
+ nickname="divergentdave"
+ subject="Disabling SSH connection caching"
+ date="2016-02-01T06:52:55Z"
+ content="""
+I was looking into how SSH connection caching is handled, and it seems there's a bug in the sshCacheDir function in Annex/Ssh.hs. If I'm reading things right, `annex.sshcaching` is ignored when `annex.crippledfilesystem` is set. Thus, even though the configuration says SSH caching is disabled, this function still creates and passes out a temporary directory to be used for connection caching. Further up, this results in ControlPersist, ControlMaster, etc. being passed to OpenSSH, which runs into the SELinux rules. I think the `ifM` calls should be nested the other way around, (see below) which would allow me to turn off connection caching and hopefully get SSH working. I haven't tested this yet, though I plan to get a build environment set up within a month for further tinkering.
+
+Revised sshCacheDir:
+
+```
+sshCacheDir :: Annex (Maybe FilePath)
+sshCacheDir
+        | SysConfig.sshconnectioncaching = ifM
+                ( fromMaybe True . annexSshCaching <$> Annex.getGitConfig )
+                ( ifM crippledFileSystem
+                        ( maybe (return Nothing) usetmpdir =<< gettmpdir
+                        , Just <$> fromRepo gitAnnexSshDir )
+                , return Nothing
+                )
+        | otherwise = return Nothing
+  where
+        gettmpdir = liftIO $ getEnv \"GIT_ANNEX_TMP_DIR\"
+        usetmpdir tmpdir = liftIO $ catchMaybeIO $ do
+                let socktmp = tmpdir </> \"ssh\"
+                createDirectoryIfMissing True socktmp
+                return socktmp
+```
+"""]]

Added a comment
diff --git a/doc/forum/Syncing_Compressed_files/comment_5_0c7af752cc35013273a07a5fa1f71f6e._comment b/doc/forum/Syncing_Compressed_files/comment_5_0c7af752cc35013273a07a5fa1f71f6e._comment
new file mode 100644
index 0000000..574ba4e
--- /dev/null
+++ b/doc/forum/Syncing_Compressed_files/comment_5_0c7af752cc35013273a07a5fa1f71f6e._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="moird"
+ subject="comment 5"
+ date="2016-01-30T19:01:28Z"
+ content="""
+well that figures... I forgot I had a global .gitignore file and it by default filtered out compressed files like zips and such.  Removed that restarted the agents, everything is good.
+"""]]

diff --git a/doc/bugs/git_annex_get_fails_from_read-only_repository.mdwn b/doc/bugs/git_annex_get_fails_from_read-only_repository.mdwn
index 5924c03..c26722c 100644
--- a/doc/bugs/git_annex_get_fails_from_read-only_repository.mdwn
+++ b/doc/bugs/git_annex_get_fails_from_read-only_repository.mdwn
@@ -32,7 +32,7 @@ Using `ps` I got the command executed on the remote side. Running it directly gi
 
 [[!format sh """
 $ git-annex-shell sendkey /home/annex/repo SHA256E-sxxxxxxx52--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8c.avi --uuid 9axxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxde -- remoteuuid=9bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb4 direct= associatedfile=somefile.avi -- dummy rsync --server --sender -pe.Lsfx --inplace . .
-git-annex: ../../../home/yggdrasil/Yggdrasil/.git/annex/transfer/upload/9bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb4/lck.SHA256E-sxxxxxxx52--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8c.avi: openFd: does not exist (No such file or directory)
+git-annex: ../../../home/annex/repo/.git/annex/transfer/upload/9bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb4/lck.SHA256E-sxxxxxxx52--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8c.avi: openFd: does not exist (No such file or directory)
 failed
 git-annex-shell: sendkey: 1 failed
 """]]

diff --git a/doc/bugs/git_annex_get_fails_from_read-only_repository.mdwn b/doc/bugs/git_annex_get_fails_from_read-only_repository.mdwn
new file mode 100644
index 0000000..5924c03
--- /dev/null
+++ b/doc/bugs/git_annex_get_fails_from_read-only_repository.mdwn
@@ -0,0 +1,44 @@
+### Please describe the problem.
+
+Getting a file from a read-only remote fails with the following error:
+
+[[!format sh """
+$ git annex get somefile.avi
+get somefile.avi (from some.repo...)
+git-annex: ../../../home/annex/repo/.git/annex/transfer/upload/9bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb4/lck.SHA256E-sxxxxxxx52--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8c.avi: openFd: does not exist (No su
+ch file oprotocol version mismatch -- is your shell clean?
+(see the rsync man page for an explanation)
+rsync error: protocol incompatibility (code 2) at compat.c(176) [Receiver=3.1.1]
+r directory)
+git-annex-shell: sendkey: 1 failed
+
+  rsync failed -- run git annex again to resume file transfer
+
+  Unable to access these remotes: some.repo
+
+  Try making some of these repositories available:
+        xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -- [some.repo]
+failed
+git-annex: get: 1 failed
+"""]]
+
+### What version of git-annex are you using? On what operating system?
+
+Locally git-annex 5.20141125 on debian/jessie, remotely 5.20150727 on FreeBSD.
+
+### Please provide any additional information below.
+
+Using `ps` I got the command executed on the remote side. Running it directly gives:
+
+[[!format sh """
+$ git-annex-shell sendkey /home/annex/repo SHA256E-sxxxxxxx52--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8c.avi --uuid 9axxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxde -- remoteuuid=9bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb4 direct= associatedfile=somefile.avi -- dummy rsync --server --sender -pe.Lsfx --inplace . .
+git-annex: ../../../home/yggdrasil/Yggdrasil/.git/annex/transfer/upload/9bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb4/lck.SHA256E-sxxxxxxx52--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8c.avi: openFd: does not exist (No such file or directory)
+failed
+git-annex-shell: sendkey: 1 failed
+"""]]
+
+The remote repository is marked as read-only. The user on the remote has only read-only access to the git-annex repository.
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+Yes! :-) Despite this, everything works like a charm with several repos on different OSs with lots of data. Thanks for this great tool!

Added a comment: Use --used-refspec
diff --git a/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_8_7259b8e9616009472ad3a10426f3d8ea._comment b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_8_7259b8e9616009472ad3a10426f3d8ea._comment
new file mode 100644
index 0000000..0e81791
--- /dev/null
+++ b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_8_7259b8e9616009472ad3a10426f3d8ea._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="viric@582d0845fdeae54b262502f49509b4577a5adbf8"
+ nickname="viric"
+ subject="Use --used-refspec"
+ date="2016-01-29T21:37:35Z"
+ content="""
+\"joeyh\" just helped me on irc, because I had this very same problem. I have git-annex repositories in A, and in external hard disks B, C, D, ...
+
+If I remove a file in A, I mean to 1) free space in A (drop) and 2) this to propagate later to the drives.
+
+No matter what \"git annex sync\" you do from A, the hard disks in your armchair will keep references to the file in their checkout, so A will refuse to drop the file contents until you run \"git annex sync\" from *each* of your external hard disks.
+
+What you need (and what I also needed) was to rule the drop/unused from A alone. You have to use \"git annex unused --used-refspec=+master\" from A, and that
+will only keep into account the contents referenced by your current A master, ignoring the checkouts of B, C, D, ...
+
+The \"used-refspec\" can even be set up in the git config.
+"""]]

Added a comment
diff --git a/doc/forum/Syncing_Compressed_files/comment_4_d619d9b7ad4ca3f2fa9505ea928d5bf7._comment b/doc/forum/Syncing_Compressed_files/comment_4_d619d9b7ad4ca3f2fa9505ea928d5bf7._comment
new file mode 100644
index 0000000..65f44a0
--- /dev/null
+++ b/doc/forum/Syncing_Compressed_files/comment_4_d619d9b7ad4ca3f2fa9505ea928d5bf7._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="moird"
+ subject="comment 4"
+ date="2016-01-29T19:43:21Z"
+ content="""
+yes, this is arch linux.  It seems to be more of an issue of the extension, I was toying with a zip file and renaming it and like if the extension was zipper then it would sync the file.  It would not sync the file if it was named with gz.  Was messing with inotifywatch and it is seeing the zip file creation:
+
+    total  create  filename
+    2      2       /home/daniel/annex/.git/refs/remotes/annex/synced/
+    2      2       /home/daniel/annex/.git/
+    1      1       /home/daniel/annex/.git/refs/heads/synced/
+    1      1       /home/daniel/annex/.git/refs/heads/
+    1      1       /home/daniel/annex/.git/refs/remotes/annex/
+    1      1       /home/daniel/annex/
+
+On successful files syncing will show the hashed annex folders 
+"""]]

comment
diff --git a/doc/forum/Syncing_Compressed_files/comment_3_885c045c8ddfccbd426a6bc1bc053435._comment b/doc/forum/Syncing_Compressed_files/comment_3_885c045c8ddfccbd426a6bc1bc053435._comment
new file mode 100644
index 0000000..32e67c3
--- /dev/null
+++ b/doc/forum/Syncing_Compressed_files/comment_3_885c045c8ddfccbd426a6bc1bc053435._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2016-01-29T18:50:57Z"
+ content="""
+Is this on Linux? It may be some kind of problem with inotify..
+"""]]

Added a comment
diff --git a/doc/forum/Syncing_Compressed_files/comment_2_db1ea446ae9720fe1651c56da38e7088._comment b/doc/forum/Syncing_Compressed_files/comment_2_db1ea446ae9720fe1651c56da38e7088._comment
new file mode 100644
index 0000000..595ccc7
--- /dev/null
+++ b/doc/forum/Syncing_Compressed_files/comment_2_db1ea446ae9720fe1651c56da38e7088._comment
@@ -0,0 +1,158 @@
+[[!comment format=mdwn
+ username="moird"
+ subject="comment 2"
+ date="2016-01-29T18:42:12Z"
+ content="""
+Using assistant on a folder.  Any files that are dropped in that folder will immediately be synced as far as I can tell except for a couple of zip files.  I turned on debug logging to look at it, and it looks like the watcher is not being called when the zip file is being copied into the folder, but is when the file is being removed from the folder.  Compared to when a regular file is dropped into the folder where it will run without issue:
+
+    [2016-01-27 06:51:26.988169] feed: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"]
+    [2016-01-27 06:51:26.990623] process done ExitSuccess
+    [2016-01-27 06:51:26.990908] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"-q\",\"HEAD\"]
+    [2016-01-27 06:51:26.992654] process done ExitSuccess
+    [2016-01-27 06:51:26.992981] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/annex/direct/master\"]
+    [2016-01-27 06:51:26.995703] process done ExitSuccess
+    [2016-01-27 06:51:26.995998] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"write-tree\"]
+    [2016-01-27 06:51:26.997896] process done ExitSuccess
+    [2016-01-27 06:51:26.998196] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"rev-parse\",\"db03e812e512e24afe7f4b440a6ca174aa33cbdd:\"]
+    [2016-01-27 06:51:27.000111] process done ExitSuccess
+    [2016-01-27 06:51:27.00038] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"-q\",\"HEAD\"]
+    [2016-01-27 06:51:27.001926] process done ExitSuccess
+    [2016-01-27 06:51:27.002223] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"refs/heads/annex/direct/master\"]
+    [2016-01-27 06:51:27.00406] process done ExitSuccess
+    [2016-01-27 06:51:27.004382] call: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"branch\",\"-f\",\"synced/master\"]
+    [2016-01-27 06:51:27.006269] process done ExitSuccess
+    [2016-01-27 06:51:27.006567] call: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"branch\",\"-f\",\"master\"]
+    [2016-01-27 06:51:27.008293] process done ExitSuccess
+    [2016-01-27 06:51:27.008992] Pusher: Syncing with annex 
+    [2016-01-27 06:51:27.009551] chat: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"]
+    [2016-01-27 06:51:27.010828] feed: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"]
+    [2016-01-27 06:51:27.013085] process done ExitSuccess
+    [2016-01-27 06:51:27.013608] process done ExitSuccess
+    [2016-01-27 06:51:27.014011] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+    [2016-01-27 06:51:27.01584] process done ExitSuccess
+    (recording state in git...)
+    [2016-01-27 06:51:27.016212] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"write-tree\"]
+    [2016-01-27 06:51:27.018706] process done ExitSuccess
+    [2016-01-27 06:51:27.018978] chat: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"commit-tree\",\"29075d2d02995138a1774809a34c5220f54cea52\",\"--no-gpg-sign\",\"-p\",\"refs/heads/git-annex\"]
+    [2016-01-27 06:51:27.021681] process done ExitSuccess
+    [2016-01-27 06:51:27.021966] call: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"update-ref\",\"refs/heads/git-annex\",\"c833bef56cf282eefb957347e2a1938ef8568da6\"]
+    [2016-01-27 06:51:27.024413] process done ExitSuccess
+    [2016-01-27 06:51:27.025057] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"-q\",\"HEAD\"]
+    [2016-01-27 06:51:27.027394] process done ExitSuccess
+    [2016-01-27 06:51:27.027759] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"refs/heads/annex/direct/master\"]
+    [2016-01-27 06:51:27.030137] process done ExitSuccess
+    [2016-01-27 06:51:27.030507] Pusher: pushing to [Remote { name =\"annex\" }]
+    [2016-01-27 06:51:27.030554] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"]
+    [2016-01-27 06:51:27.033305] process done ExitSuccess
+    [2016-01-27 06:51:27.033621] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+    [2016-01-27 06:51:27.035758] process done ExitSuccess
+    [2016-01-27 06:51:27.036238] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..c833bef56cf282eefb957347e2a1938ef8568da6\",\"-n1\",\"--pretty=%H\"]
+    [2016-01-27 06:51:27.039257] process done ExitSuccess
+    [2016-01-27 06:51:27.039752] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..7e6f7d4c9ff0bdb8f942c8edcb8a5a2581e7adb2\",\"-n1\",\"--pretty=%H\"]
+    [2016-01-27 06:51:27.043657] process done ExitSuccess
+    [2016-01-27 06:51:27.044082] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"]
+    [2016-01-27 06:51:27.047843] process done ExitSuccess
+    [2016-01-27 06:51:27.048343] ConfigMonitor: reloading config numcopies.log
+    [2016-01-27 06:51:27.04847] call: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"push\",\"annex\",\"+git-annex:synced/git-annex\",\"annex/direct/master:synced/master\"]
+    [2016-01-27 06:51:27.050624] Cronner: reloading changed activities
+    To /home/daniel/store/annex
+       7e6f7d4..c833bef  git-annex -> synced/git-annex
+    [2016-01-27 06:51:27.290878] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"]
+    [2016-01-27 06:51:27.291094] process done ExitSuccess
+    [2016-01-27 06:51:27.292194] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"push\",\"annex\",\"git-annex\",\"master\"]
+    [2016-01-27 06:51:27.293901] process done ExitSuccess
+    [2016-01-27 06:51:27.294222] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+    [2016-01-27 06:51:27.297276] process done ExitSuccess
+    [2016-01-27 06:51:27.297782] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..c833bef56cf282eefb957347e2a1938ef8568da6\",\"-n1\",\"--pretty=%H\"]
+    [2016-01-27 06:51:27.300978] process done ExitSuccess
+    [2016-01-27 06:51:27.301324] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..7e6f7d4c9ff0bdb8f942c8edcb8a5a2581e7adb2\",\"-n1\",\"--pretty=%H\"]
+    [2016-01-27 06:51:27.304226] process done ExitSuccess
+    [2016-01-27 06:51:27.309109] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"]
+    [2016-01-27 06:51:27.30931] process done ExitSuccess
+    [2016-01-27 06:51:27.3116] process done ExitSuccess
+    [2016-01-27 06:51:27.311946] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+    [2016-01-27 06:51:27.314424] process done ExitSuccess
+    [2016-01-27 06:51:27.314803] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..c833bef56cf282eefb957347e2a1938ef8568da6\",\"-n1\",\"--pretty=%H\"]
+    [2016-01-27 06:51:27.317614] process done ExitSuccess
+    [2016-01-27 06:51:29.311876] Pusher: Syncing with annex 
+    [2016-01-27 06:51:29.312427] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"-q\",\"HEAD\"]
+    [2016-01-27 06:51:29.315265] process done ExitSuccess
+    [2016-01-27 06:51:29.315673] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"refs/heads/annex/direct/master\"]
+    [2016-01-27 06:51:29.318964] process done ExitSuccess
+    [2016-01-27 06:51:29.319639] Pusher: pushing to [Remote { name =\"annex\" }]
+    [2016-01-27 06:51:29.32004] call: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"push\",\"annex\",\"+git-annex:synced/git-annex\",\"annex/direct/master:synced/master\"]
+    Everything up-to-date
+    [2016-01-27 06:51:29.329677] process done ExitSuccess
+    [2016-01-27 06:51:29.330047] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"push\",\"annex\",\"git-annex\",\"master\"]
+    [2016-01-27 06:51:29.339748] process done ExitSuccess
+    [2016-01-27 06:52:27.059869] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"]
+    [2016-01-27 06:52:27.064751] process done ExitSuccess
+    [2016-01-27 06:55:25.738944] Watcher: file deleted Documents/Innovation.zip
+    [2016-01-27 06:55:25.75008] Committer: committing 1 changes
+    [2016-01-27 06:55:25.75047] Committer: Committing changes to git
+    (recording state in git...)
+    [2016-01-27 06:55:25.750868] feed: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"]
+    [2016-01-27 06:55:25.753501] process done ExitSuccess
+    [2016-01-27 06:55:25.753793] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"-q\",\"HEAD\"]
+    [2016-01-27 06:55:25.755492] process done ExitSuccess
+    [2016-01-27 06:55:25.755827] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/annex/direct/master\"]
+    [2016-01-27 06:55:25.75798] process done ExitSuccess
+    [2016-01-27 06:55:25.758268] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"write-tree\"]
+    [2016-01-27 06:55:25.760247] process done ExitSuccess
+    [2016-01-27 06:55:25.760524] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"rev-parse\",\"db03e812e512e24afe7f4b440a6ca174aa33cbdd:\"]
+    [2016-01-27 06:55:25.762615] process done ExitSuccess
+    [2016-01-27 06:55:25.762953] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"-q\",\"HEAD\"]
+    [2016-01-27 06:55:25.764649] process done ExitSuccess
+    [2016-01-27 06:55:25.764895] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"refs/heads/annex/direct/master\"]
+    [2016-01-27 06:55:25.766833] process done ExitSuccess
+    [2016-01-27 06:55:25.767095] call: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"branch\",\"-f\",\"synced/master\"]
+    [2016-01-27 06:55:25.769018] process done ExitSuccess
+    [2016-01-27 06:55:25.769381] call: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"branch\",\"-f\",\"master\"]
+    [2016-01-27 06:55:25.771227] process done ExitSuccess
+    [2016-01-27 06:55:25.771526] Pusher: Syncing with annex 
+    [2016-01-27 06:55:25.771855] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"-q\",\"HEAD\"]
+    [2016-01-27 06:55:25.773533] process done ExitSuccess
+    [2016-01-27 06:55:25.773778] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"refs/heads/annex/direct/master\"]
+    [2016-01-27 06:55:25.775489] process done ExitSuccess
+    [2016-01-27 06:55:25.775781] Pusher: pushing to [Remote { name =\"annex\" }]
+    [2016-01-27 06:55:25.776187] call: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"push\",\"annex\",\"+git-annex:synced/git-annex\",\"annex/direct/master:synced/master\"]
+    Everything up-to-date
+    [2016-01-27 06:55:25.783416] process done ExitSuccess
+    [2016-01-27 06:55:25.78379] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"push\",\"annex\",\"git-annex\",\"master\"]
+    [2016-01-27 06:55:25.792144] process done ExitSuccess
+    [2016-01-27 06:56:55.488921] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"-q\",\"HEAD\"]
+    [2016-01-27 06:56:55.491198] process done ExitSuccess
+    [2016-01-27 06:56:55.491606] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"refs/heads/annex/direct/master\"]
+    [2016-01-27 06:56:55.494862] process done ExitSuccess
+    [2016-01-27 06:56:55.495272] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"]
+    [2016-01-27 06:56:55.49766] process done ExitSuccess
+    [2016-01-27 06:56:55.498193] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+    [2016-01-27 06:56:55.50149] process done ExitSuccess
+    [2016-01-27 06:56:55.501967] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..c833bef56cf282eefb957347e2a1938ef8568da6\",\"-n1\",\"--pretty=%H\"]
+    [2016-01-27 06:56:55.505598] process done ExitSuccess
+    [2016-01-27 06:56:55.506265] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"-q\",\"HEAD\"]
+    [2016-01-27 06:56:55.508634] process done ExitSuccess
+    [2016-01-27 06:56:55.50908] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"show-ref\",\"refs/heads/annex/direct/master\"]
+    [2016-01-27 06:56:55.512201] process done ExitSuccess
+    [2016-01-27 07:01:34.745946] Watcher: add Videos/SPOT0001.avi
+    [2016-01-27 07:01:34.757341] read: lsof [\"-F0can\",\"+d\",\".git/annex/misctmp/\"]
+    lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/120/gvfs
+          Output information may be incomplete.
+    [2016-01-27 07:01:34.922312] process done ExitFailure 1
+
+      Videos/SPOT0001.avi still has writers, not adding
+    [2016-01-27 07:01:34.92397] Watcher: add Videos/SPOT0001.avi
+    [2016-01-27 07:01:35.93566] read: lsof [\"-F0can\",\"+d\",\".git/annex/misctmp/\"]
+    lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/120/gvfs
+          Output information may be incomplete.
+    [2016-01-27 07:01:36.076194] process done ExitFailure 1
+    [2016-01-27 07:01:36.076529] Committer: Adding SPOT0001.avi
+    add Videos/SPOT0001.avi [2016-01-27 07:01:36.077018] read: sha256sum [\".git/annex/misctmp/SPOT00017523927541474612399.avi\"]
+    [2016-01-27 07:01:36.173532] process done ExitSuccess
+    [2016-01-27 07:01:36.18156] chat: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"-c\",\"core.bare=false\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"]
+    [2016-01-27 07:01:36.183854] process done ExitSuccess
+    ok
+    << trimmed because it worked >>
+
+I did end up leaving the zip in the folder, but I have tried in different subfolders and different zips, just not tar.gzs...
+"""]]

comment
diff --git a/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_7_bff3bcf9f1b7c458afa98cdb18883153._comment b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_7_bff3bcf9f1b7c458afa98cdb18883153._comment
new file mode 100644
index 0000000..f75c321
--- /dev/null
+++ b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_7_bff3bcf9f1b7c458afa98cdb18883153._comment
@@ -0,0 +1,28 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 7"""
+ date="2016-01-29T18:20:06Z"
+ content="""
+As someone else ran into a similar case of this, let me explain a little
+bit more..
+
+`git-annex unused` finds files that are not used by the currently checked
+out branch, or any other branch or tag. This includes remote branches.
+
+This is an important safeguard, because there might be a clone of the
+repository that intentionally still has that file checked out, and it
+wouldn't be good for `git-annex unused` to treat such a file as unused.
+
+But if there's an old remote, that's perhaps not getting updated any longer
+and has a branch that points to a file, `git annex unused` won't find that file
+as unused.
+
+So, one solution is to use `git remote rm` to delete the old remote. Or,
+otherwise get git to delete the old remote branch that is keeping the file
+around.
+
+The other solution is to run something like `git annex unused
+--used-refspec=+master` What this does is only considers the local master
+branch as used, and not any other branch or tags. I'd recommend only using
+this with caution.
+"""]]

webapp: Fix deletion of current repository directory.
removeDirectoryRecursive "." fails; need full path.
I think this is a reversion introduced in the relative path conversion, in
january of *last* year!
diff --git a/Assistant/WebApp/Configurators/Delete.hs b/Assistant/WebApp/Configurators/Delete.hs
index 8db0721..d3393d1 100644
--- a/Assistant/WebApp/Configurators/Delete.hs
+++ b/Assistant/WebApp/Configurators/Delete.hs
@@ -104,7 +104,7 @@ deleteCurrentRepository = dangerPage $ do
 			liftIO $ do
 				recurseDir SystemFS dir
 					>>= mapM_ (void . tryIO . allowWrite)
-				removeDirectoryRecursive dir
+				removeDirectoryRecursive =<< absPath dir
 			
 			redirect ShutdownConfirmedR
 		_ -> $(widgetFile "configurators/delete/currentrepository")
diff --git a/debian/changelog b/debian/changelog
index 962c76d..ffe840a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,6 +4,7 @@ git-annex (6.20160127) UNRELEASED; urgency=medium
     adding files not matching annex.largefiles.
   * Fix reversion in lookupkey, contentlocation, and examinekey which
     caused them to sometimes output side messages.
+  * webapp: Fix deletion of current repository directory.
 
  -- Joey Hess <id@joeyh.name>  Thu, 28 Jan 2016 13:53:09 -0400
 
diff --git a/doc/bugs/removeDirectoryRecursive.mdwn b/doc/bugs/removeDirectoryRecursive.mdwn
index 3b8ab23..b1b3630 100644
--- a/doc/bugs/removeDirectoryRecursive.mdwn
+++ b/doc/bugs/removeDirectoryRecursive.mdwn
@@ -27,4 +27,4 @@ I just downloaded and installed Git Annex. This problem was there from day 1.
 
 ### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
 
-
+> Fixed it to properly delete the repo. [[done]] --[[Joey]]
diff --git a/doc/bugs/removeDirectoryRecursive/comment_1_dc8d7f4072833b013e17935b657a9cdd._comment b/doc/bugs/removeDirectoryRecursive/comment_1_dc8d7f4072833b013e17935b657a9cdd._comment
new file mode 100644
index 0000000..db96cf3
--- /dev/null
+++ b/doc/bugs/removeDirectoryRecursive/comment_1_dc8d7f4072833b013e17935b657a9cdd._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2016-01-29T17:59:18Z"
+ content="""
+Reproduced this. The repository deletion seems to work, except it falls on
+the last hurdle, of removing the actual repository itself. This also
+prevents the webapp from shutting down properly.
+
+So, to get out of this state, kill git-annex and delete the directory
+yourself.
+"""]]

comment
diff --git a/doc/forum/Repository_backup/comment_4_6f20653dff70aaaea4460a5efb28081f._comment b/doc/forum/Repository_backup/comment_4_6f20653dff70aaaea4460a5efb28081f._comment
new file mode 100644
index 0000000..fa44e67
--- /dev/null
+++ b/doc/forum/Repository_backup/comment_4_6f20653dff70aaaea4460a5efb28081f._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2016-01-29T18:02:14Z"
+ content="""
+Storing a tarball of the .git repository as a file inside the repository
+presents a chicken and egg problem when it comes to restoring it. You'll
+have to find the object file that git-annex has stored in the special
+remote. If the special remote is encrypted, you may not be able to decrypt
+it without the key stored in the repository. Etc.
+
+Better to make a clone of the git repository elsewhere.
+"""]]

comment
diff --git a/doc/forum/files_got_replaced_by_broken_symblinks__44___how_to_get_them_back__63__/comment_5_4333c2f189cea3430104ece6769143bc._comment b/doc/forum/files_got_replaced_by_broken_symblinks__44___how_to_get_them_back__63__/comment_5_4333c2f189cea3430104ece6769143bc._comment
new file mode 100644
index 0000000..5c4c91f
--- /dev/null
+++ b/doc/forum/files_got_replaced_by_broken_symblinks__44___how_to_get_them_back__63__/comment_5_4333c2f189cea3430104ece6769143bc._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2016-01-29T17:49:47Z"
+ content="""
+Does `git annex info` show this repository as being in direct mode, or
+indirect mode? (It's the first line of its output.)
+
+I'm thinking you might somehow have a repository that is not really in
+direct mode despite the current branch being annex/direct/master.
+"""]]

comment
diff --git a/doc/forum/Git_annex_hangs/comment_8_1bad17001364d192e0d9affe5f0ea554._comment b/doc/forum/Git_annex_hangs/comment_8_1bad17001364d192e0d9affe5f0ea554._comment
new file mode 100644
index 0000000..e0d360f
--- /dev/null
+++ b/doc/forum/Git_annex_hangs/comment_8_1bad17001364d192e0d9affe5f0ea554._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 8"""
+ date="2016-01-29T17:47:02Z"
+ content="""
+This was fixed in git-annex back in January 2015. It now checks the git
+version at runtime, not assuming it will be used with as recent a version
+of git as was available at compile time.
+
+So if you're still seeing this problem, upgrading git-annex or git is the only
+solution.
+"""]]

comment
diff --git a/doc/forum/Syncing_Compressed_files/comment_1_e44598cd735830a8df9a29e0031d34f1._comment b/doc/forum/Syncing_Compressed_files/comment_1_e44598cd735830a8df9a29e0031d34f1._comment
new file mode 100644
index 0000000..bc20f3e
--- /dev/null
+++ b/doc/forum/Syncing_Compressed_files/comment_1_e44598cd735830a8df9a29e0031d34f1._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2016-01-29T17:44:15Z"
+ content="""
+git-annex doesn't differentiate between different sorts of files in any
+way.
+
+Are you sure you're adding these compressed files to the repo?
+"""]]

comment
diff --git a/doc/forum/Move_files_in_git_annex___40__direct_mode__41__/comment_1_6426aca2296b5e03b333d5253ae7d88c._comment b/doc/forum/Move_files_in_git_annex___40__direct_mode__41__/comment_1_6426aca2296b5e03b333d5253ae7d88c._comment
new file mode 100644
index 0000000..4482ac4
--- /dev/null
+++ b/doc/forum/Move_files_in_git_annex___40__direct_mode__41__/comment_1_6426aca2296b5e03b333d5253ae7d88c._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2016-01-29T17:39:13Z"
+ content="""
+Well, that should work; the files should get moved in the second clone
+automatically when it's synced.
+
+Just tested it, seems to work ok.
+
+What does `git annex status` say in the second repo?
+"""]]

comment
diff --git a/doc/preferred_content/comment_11_fa7249ebbd7d5b499b486311c0a8f96d._comment b/doc/preferred_content/comment_11_fa7249ebbd7d5b499b486311c0a8f96d._comment
new file mode 100644
index 0000000..3c9de44
--- /dev/null
+++ b/doc/preferred_content/comment_11_fa7249ebbd7d5b499b486311c0a8f96d._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 11"""
+ date="2016-01-29T17:30:52Z"
+ content="""
+@grawity, the empty (or unset) preferred content setting causes a default behavior to
+be used. What the default is varies depending on what you're doing. For
+example, if you're running `git annex drop --auto`, it defaults to dropping
+everything when there's no preferred content setting. On the other hand,
+`git annex sync --content` defaults to getting everything. So, this is
+diffent than using "anything".
+
+If you use "standard" and the repo is not in exactly one of the standard
+groups, it behaves the same as if you'd given it an unparseable preferred
+content setting. It will want all files it has and none it doesn't have.
+"""]]

comment
diff --git a/doc/forum/new_linux_arm_tarball_build/comment_18_0a76ce3895ba9598bd79625268d95ef4._comment b/doc/forum/new_linux_arm_tarball_build/comment_18_0a76ce3895ba9598bd79625268d95ef4._comment
new file mode 100644
index 0000000..b5e5881
--- /dev/null
+++ b/doc/forum/new_linux_arm_tarball_build/comment_18_0a76ce3895ba9598bd79625268d95ef4._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 18"""
+ date="2016-01-29T17:27:42Z"
+ content="""
+@db, git-annex supports the standard TMPDIR environment variable.
+But, this is getting quite far afield from the topic of this thread.
+"""]]

done
diff --git a/doc/todo/Remove___39__superfluous_constraints__39___warnings.mdwn b/doc/todo/Remove___39__superfluous_constraints__39___warnings.mdwn
index c0e5e9f..d159ce5 100644
--- a/doc/todo/Remove___39__superfluous_constraints__39___warnings.mdwn
+++ b/doc/todo/Remove___39__superfluous_constraints__39___warnings.mdwn
@@ -3,3 +3,5 @@ Please pull branch `patch-1` from repo
 https://github.com/ggreif/git-annex.git
 
 It contains some cleanups from warnings that appear with GHC 7.11 (and probably 8.0 too).
+
+> Merged and thank you! [[done]] --[[Joey]] 

comment
diff --git a/doc/bugs/cannot_remove___96__.t__96___directory/comment_1_98e0522782acbe51fcc274a974e3e346._comment b/doc/bugs/cannot_remove___96__.t__96___directory/comment_1_98e0522782acbe51fcc274a974e3e346._comment
new file mode 100644
index 0000000..6ef5bd4
--- /dev/null
+++ b/doc/bugs/cannot_remove___96__.t__96___directory/comment_1_98e0522782acbe51fcc274a974e3e346._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2016-01-29T17:20:38Z"
+ content="""
+`chmod -R u+w` will let you delete the directory.
+
+`git-annex test` normally takes care of removing the directory for you.
+Only because it crashed did it not in this case. It would be helpful if you
+could show the actual result of running it, including the real error
+message. Perhaps there's something that could be improved.
+"""]]

Fix reversion in lookupkey, contentlocation, and examinekey which caused them to sometimes output side messages.
diff --git a/Command/ContentLocation.hs b/Command/ContentLocation.hs
index 7cd6c29..5b2acb6 100644
--- a/Command/ContentLocation.hs
+++ b/Command/ContentLocation.hs
@@ -11,7 +11,7 @@ import Command
 import Annex.Content
 
 cmd :: Command
-cmd = noCommit $ 
+cmd = noCommit $ noMessages $
 	command "contentlocation" SectionPlumbing 
 		"looks up content for a key"
 		(paramRepeating paramKey)
diff --git a/Command/ExamineKey.hs b/Command/ExamineKey.hs
index 1ca1f9f..5f67587 100644
--- a/Command/ExamineKey.hs
+++ b/Command/ExamineKey.hs
@@ -12,7 +12,7 @@ import qualified Utility.Format
 import Command.Find (parseFormatOption, showFormatted, keyVars)
 
 cmd :: Command
-cmd = noCommit $ withGlobalOptions [jsonOption] $
+cmd = noCommit $ noMessages $ withGlobalOptions [jsonOption] $
 	command "examinekey" SectionPlumbing 
 		"prints information from a key"
 		(paramRepeating paramKey)
diff --git a/Command/LookupKey.hs b/Command/LookupKey.hs
index 1f21a58..609fe56 100644
--- a/Command/LookupKey.hs
+++ b/Command/LookupKey.hs
@@ -11,7 +11,7 @@ import Command
 import Annex.CatFile
 
 cmd :: Command
-cmd = notBareRepo $ noCommit $
+cmd = notBareRepo $ noCommit $ noMessages $
 	command "lookupkey" SectionPlumbing 
 		"looks up key used for file"
 		(paramRepeating paramFile)
diff --git a/debian/changelog b/debian/changelog
index 705fb0f..962c76d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,8 @@ git-annex (6.20160127) UNRELEASED; urgency=medium
 
   * annex.addsmallfiles: New option controlling what is done when
     adding files not matching annex.largefiles.
+  * Fix reversion in lookupkey, contentlocation, and examinekey which
+    caused them to sometimes output side messages.
 
  -- Joey Hess <id@joeyh.name>  Thu, 28 Jan 2016 13:53:09 -0400
 
diff --git a/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout.mdwn b/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout.mdwn
index 5f3d0a6..265005c 100644
--- a/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout.mdwn
+++ b/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout.mdwn
@@ -37,3 +37,5 @@ SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat
 I guess I will just skip all lines starting with ( for now but thought to let you know about such changed behavior which might complicate pipelining etc
 
 [[!meta author=yoh]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout/comment_1_740035f35d149f453e66c3ed03d525b5._comment b/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout/comment_1_740035f35d149f453e66c3ed03d525b5._comment
new file mode 100644
index 0000000..054c691
--- /dev/null
+++ b/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout/comment_1_740035f35d149f453e66c3ed03d525b5._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2016-01-29T17:16:57Z"
+ content="""
+Argh, that was a dumb mistake. I've fixed this in git.
+
+A better workaround would be to use --quiet which will silence all messages
+except the main command output.
+"""]]

followup
diff --git a/doc/bugs/Unable_to_parallel_fsck/comment_2_0735b87747e1f56f381ed0a1b25bdffa._comment b/doc/bugs/Unable_to_parallel_fsck/comment_2_0735b87747e1f56f381ed0a1b25bdffa._comment
new file mode 100644
index 0000000..3961c92
--- /dev/null
+++ b/doc/bugs/Unable_to_parallel_fsck/comment_2_0735b87747e1f56f381ed0a1b25bdffa._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2016-01-29T17:05:34Z"
+ content="""
+I finished the use-bytestring branch, but that turns out not to work; once
+the FilePath is converted to a ByteString, all the specially encoded
+characters don't get decoded back properly, and so the result is a bunch of
+�����.
+
+I think that for this to work, System.Console.Regions would need to use
+String exclusively, and probably System.Console.Concurrent would too. Which
+would probably slow it down and complicate it significantly.
+"""]]

Added a comment: Does a tar of `.git` solve the problem
diff --git a/doc/forum/Repository_backup/comment_3_ead30baf0a6d718569feb4002ba19b9e._comment b/doc/forum/Repository_backup/comment_3_ead30baf0a6d718569feb4002ba19b9e._comment
new file mode 100644
index 0000000..3db7f7d
--- /dev/null
+++ b/doc/forum/Repository_backup/comment_3_ead30baf0a6d718569feb4002ba19b9e._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="git-annex.branchable.com@69b3f2da2837a3d9de8eab0b93771008294b7d69"
+ nickname="git-annex.branchable.com"
+ subject="Does a tar of `.git` solve the problem"
+ date="2016-01-28T19:03:08Z"
+ content="""
+Just wondering if tarring .git (excluding .git/annex of course}) into a file in the root of the repo will serve this purpose? Seems like it would to me... How would one restore from this... it'd be (practically) a bare repo right?
+"""]]

annex.addsmallfiles: New option controlling what is done when adding files not matching annex.largefiles.
diff --git a/Command/Add.hs b/Command/Add.hs
index 23c9318..7a1150d 100644
--- a/Command/Add.hs
+++ b/Command/Add.hs
@@ -49,7 +49,10 @@ seek o = allowConcurrentOutput $ do
 	matcher <- largeFilesMatcher
 	let gofile file = ifM (checkFileMatcher matcher file <||> Annex.getState Annex.force)
 		( start file
-		, startSmall file
+		, ifM (annexAddSmallFiles <$> Annex.getGitConfig)
+			( startSmall file
+			, stop
+			)
 		)
 	case batchOption o of
 		Batch -> batchFiles gofile
diff --git a/Types/GitConfig.hs b/Types/GitConfig.hs
index 208da4a..fbc3484 100644
--- a/Types/GitConfig.hs
+++ b/Types/GitConfig.hs
@@ -54,6 +54,7 @@ data GitConfig = GitConfig
 	, annexWebDownloadCommand :: Maybe String
 	, annexCrippledFileSystem :: Bool
 	, annexLargeFiles :: Maybe String
+	, annexAddSmallFiles :: Bool
 	, annexFsckNudge :: Bool
 	, annexAutoUpgrade :: AutoUpgrade
 	, annexExpireUnused :: Maybe (Maybe Duration)
@@ -99,6 +100,7 @@ extractGitConfig r = GitConfig
 	, annexWebDownloadCommand = getmaybe (annex "web-download-command")
 	, annexCrippledFileSystem = getbool (annex "crippledfilesystem") False
 	, annexLargeFiles = getmaybe (annex "largefiles")
+	, annexAddSmallFiles = getbool (annex "addsmallfiles") True
 	, annexFsckNudge = getbool (annex "fscknudge") True
 	, annexAutoUpgrade = toAutoUpgrade $ getmaybe (annex "autoupgrade")
 	, annexExpireUnused = maybe Nothing Just . parseDuration
diff --git a/debian/changelog b/debian/changelog
index e61aa22..705fb0f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+git-annex (6.20160127) UNRELEASED; urgency=medium
+
+  * annex.addsmallfiles: New option controlling what is done when
+    adding files not matching annex.largefiles.
+
+ -- Joey Hess <id@joeyh.name>  Thu, 28 Jan 2016 13:53:09 -0400
+
 git-annex (6.20160126) unstable; urgency=medium
 
   * Fix nasty reversion in the last release that broke sync --content's
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 91ae785..471f219 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -828,6 +828,12 @@ Here are all the supported configuration settings.
 
   	git annex add -c annex.largefiles='include=*' 99kbfile
 
+* `annex.addsmallfiles`
+
+  Controls whether small files (not matching annex.largefiles)
+  should be checked into git by `git annex add`. Defaults to true;
+  set to false to instead make small files be skipped.
+
 * `annex.numcopies`
 
   This is a deprecated setting. You should instead use the

Added a comment: Similar sounding issue
diff --git a/doc/forum/Git_annex_hangs/comment_7_f3ea42dc6699275143ba44e7f57e7d5e._comment b/doc/forum/Git_annex_hangs/comment_7_f3ea42dc6699275143ba44e7f57e7d5e._comment
new file mode 100644
index 0000000..336a4ee
--- /dev/null
+++ b/doc/forum/Git_annex_hangs/comment_7_f3ea42dc6699275143ba44e7f57e7d5e._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="parmour@1304ead3ef9008fa9fe66af7c8678dec867328da"
+ nickname="parmour"
+ subject="Similar sounding issue"
+ date="2016-01-28T15:02:31Z"
+ content="""
+I have seen a similar sounding version on Centos 6.5. I had git version 2.6.4 and installed git annex using:
+wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
+rpm -ivh epel-release-6-8.noarch.rpm
+yum install git-annex
+
+git annex would hang when running 'git annex add'
+
+When I changed the git version to be 1.7.1 this problem went away. So it is something to do with the combination of client git version and git annex version.
+"""]]

diff --git a/doc/bugs/cannot_remove___96__.t__96___directory.mdwn b/doc/bugs/cannot_remove___96__.t__96___directory.mdwn
new file mode 100644
index 0000000..3c2b1aa
--- /dev/null
+++ b/doc/bugs/cannot_remove___96__.t__96___directory.mdwn
@@ -0,0 +1,34 @@
+### Please describe the problem.
+
+I am running `git-annex test`, it stops on an NFS mount with exhausted resources (too many open FDs).
+
+Then I try to remove the `.t` directory with `rm -rf .t` and get many errors like:
+
+```
+rm: cannot remove `.t/tmprepo61/.git/annex/objects/96/qw/SHA256E-s10--bcc2eba25d48be76c9d968f2d818196b0e10e13476dcff75371fc0ca4910450c/SHA256E-s10--bcc2eba25d48be76c9d968f2d818196b0e10e13476dcff75371fc0ca4910450c': Permission denied
+```
+
+The permissions on those files look normal (they are mine).
+
+### What steps will reproduce the problem?
+
+see above
+
+### What version of git-annex are you using? On what operating system?
+
+git HEAD (self-built). On Linux.
+
+### 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
+
+
+# End of transcript or log.
+"""]]
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+On /tmp the self-test works. Maybe it is related to NFS?
+

diff --git a/doc/forum/Move_files_in_git_annex___40__direct_mode__41__.mdwn b/doc/forum/Move_files_in_git_annex___40__direct_mode__41__.mdwn
index fa27a7c..7974a3e 100644
--- a/doc/forum/Move_files_in_git_annex___40__direct_mode__41__.mdwn
+++ b/doc/forum/Move_files_in_git_annex___40__direct_mode__41__.mdwn
@@ -9,7 +9,7 @@ git annex add
 git annex sync
 ```
 
-The I went to another repo (clone of the first) and did:
+Then I went to another repo (clone of the first) and did:
 
 ```
 cd /paht1

move files, direct mode
diff --git a/doc/forum/Move_files_in_git_annex___40__direct_mode__41__.mdwn b/doc/forum/Move_files_in_git_annex___40__direct_mode__41__.mdwn
new file mode 100644
index 0000000..fa27a7c
--- /dev/null
+++ b/doc/forum/Move_files_in_git_annex___40__direct_mode__41__.mdwn
@@ -0,0 +1,22 @@
+Hi guys, I have a git annex repo under `/path`.
+
+I ran:
+
+```
+cd /path/subdir2
+mv ../subdir1/stuff* .
+git annex add
+git annex sync
+```
+
+The I went to another repo (clone of the first) and did:
+
+```
+cd /paht1
+git annex sync
+git annex get .
+```
+
+Now I got the stuff from under `subdir2` in my second repo, just that the same stuff is also still under `subdir1` - how do I make git-annex aware of this change?
+
+Also, someone suggested running `git annex watch`

Added a comment: default settings?
diff --git a/doc/preferred_content/comment_10_d9eb7d8efe731cbcdb456fc56935d886._comment b/doc/preferred_content/comment_10_d9eb7d8efe731cbcdb456fc56935d886._comment
new file mode 100644
index 0000000..c7a898c
--- /dev/null
+++ b/doc/preferred_content/comment_10_d9eb7d8efe731cbcdb456fc56935d886._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="grawity@2ea26be48562f66fcb9b66307da72b1e2e37453f"
+ nickname="grawity"
+ subject="default settings?"
+ date="2016-01-28T09:32:45Z"
+ content="""
+Could you clarify how the _default_ (empty) preferred content setting works? Is it equivalent to `anything`, or more magical than that?
+
+(Asking because I noticed that `annex find --in . --want-drop` in such a repo matches basically all files, even the ones that `annex sync --content` just retrieved. Likewise, it retrieves files while `annex find --not --in . --want-get` lists nothing. I'm fine with the sync behavior here, but somewhat worried that a _future_ `annex sync --content` would actually decide to drop everything... I'm running 6.20160126 with numcopies=1.)
+
+Also, what happens if I use `standard` for a repo that's not in any group?
+"""]]

pull request
diff --git a/doc/todo/Remove___39__superfluous_constraints__39___warnings.mdwn b/doc/todo/Remove___39__superfluous_constraints__39___warnings.mdwn
new file mode 100644
index 0000000..c0e5e9f
--- /dev/null
+++ b/doc/todo/Remove___39__superfluous_constraints__39___warnings.mdwn
@@ -0,0 +1,5 @@
+Please pull branch `patch-1` from repo
+
+https://github.com/ggreif/git-annex.git
+
+It contains some cleanups from warnings that appear with GHC 7.11 (and probably 8.0 too).

diff --git a/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout.mdwn b/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout.mdwn
new file mode 100644
index 0000000..5f3d0a6
--- /dev/null
+++ b/doc/bugs/lookupkey_started_to_spit_out___34__debug__34___messages_to_stdout.mdwn
@@ -0,0 +1,39 @@
+### Please describe the problem.
+
+with previous snapshot (6.20160119+gitgb2a2f5d-1~ndall+1) you just get a clean output
+
+[[!format sh """
+hopa:~/.tmp
+$> git clone /home/yoh/.tmp/datalad_temp_clone_url_RmXPyt 123
+Cloning into '123'...                    
+done.
+
+$> cd 123 
+INFO.txt  test-annex.dat@  test.dat
+
+$> git annex lookupkey test-annex.dat                                        
+SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat
+
+"""]]
+
+with new one (6.20160126+gitg65f4442-1~ndall+1) you get it polluted in such a freshly cloned repo with
+
+[[!format sh """
+$> git annex lookupkey test-annex.dat                        
+(merging origin/git-annex into git-annex...)
+(recording state in git...)
+SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat
+"""]]
+
+and since I am a "dude" who likes "devnulling" things for some reason (I hope reason is clear here ;)):
+
+[[!format sh """
+$> git annex lookupkey test-annex.dat 2>/dev/null            
+(merging origin/git-annex into git-annex...)     
+(recording state in git...)
+SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat
+"""]]
+
+I guess I will just skip all lines starting with ( for now but thought to let you know about such changed behavior which might complicate pipelining etc
+
+[[!meta author=yoh]]

diff --git a/doc/forum/Syncing_Compressed_files.mdwn b/doc/forum/Syncing_Compressed_files.mdwn
new file mode 100644
index 0000000..dd2f5ad
--- /dev/null
+++ b/doc/forum/Syncing_Compressed_files.mdwn
@@ -0,0 +1 @@
+I don't see anywhere in the documentation that specifies this, but git-annex hasn't been syncing any kind of compressed file for me like zip files or 7z compressed files.  Haven't tried gzip files.  It has been working fine with other files like PDFs, video, images etc.  Was wanting to know if that is expected behaviour or if something is wrong?

Added a comment: Linux-Windows repo
diff --git a/doc/todo/windows_support/comment_14_a8519b722cb94f9363d4a8a8bd40e942._comment b/doc/todo/windows_support/comment_14_a8519b722cb94f9363d4a8a8bd40e942._comment
new file mode 100644
index 0000000..587ea02
--- /dev/null
+++ b/doc/todo/windows_support/comment_14_a8519b722cb94f9363d4a8a8bd40e942._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="tomekwi"
+ subject="Linux-Windows repo"
+ date="2016-01-26T20:46:58Z"
+ content="""
+Ping!
+
+I’m trying to organize my Linux + Windows workflow again. Has anyone had success managing an annex repo from Linux and Windows?
+"""]]

add news item for git-annex 6.20160126
diff --git a/doc/news/version_5.20151116.mdwn b/doc/news/version_5.20151116.mdwn
deleted file mode 100644
index b449e0d..0000000
--- a/doc/news/version_5.20151116.mdwn
+++ /dev/null
@@ -1,32 +0,0 @@
-git-annex 5.20151116 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Use concurrent-output library when configured with -fConcurrentOutput.
-     This allows nicely displayed messages when using the -J flag.
-   * Additional commands now support the -J flag:
-     fsck, drop, add, addurl, import
-   * import: Avoid very ugly error messages when the directory files
-     are imported to is not a directort, but perhaps an annexed file.
-   * Concurrent progress bars are now displayed when using -J with a command
-     that moves file contents around.
-   * Fix race that could result in an annexed file's symlink not being
-     created, when eg, running concurrent git-annex adds.
-   * add: Fix error recovery rollback to not move the injested file content
-     out of the annex back to the file, because other files may point to
-     that same content. Instead, copy the injected file content out to
-     recover.
-   * quvi may output utf-8 encoded data when the conifigured locale doesn't
-     support that; avoid crashing on such invalid encoding.
-   * runshell: Avoid failing when $HOME/.ssh does not exist and cannot be
-     created.
-   * Make the git-annex-standalone.deb prevent runshell from installing
-     wrappers into $HOME/.ssh
-   * Make git-annex-standalone.deb include the git-annex html documentation,
-     desktop file, and base completion file, same as the regular git-annex.deb.
-   * fsck: When fscking a dead repo, avoid incorrect "fixing location log"
-     message, and display a warning about it being dead, since it's unusual
-     to have access to a dead repo.
-   * assistant: Pass ssh-options through 3 more git pull/push calls
-     that were missed before.
-   * Added annex.pidlock and annex.pidlocktimeout configuration to support
-     filesystems where POSIX fcntl locks cannot be used.
-   * init: Automatically enable annex.pidlock when necessary."""]]
\ No newline at end of file
diff --git a/doc/news/version_6.20160126.mdwn b/doc/news/version_6.20160126.mdwn
new file mode 100644
index 0000000..2f1f2f0
--- /dev/null
+++ b/doc/news/version_6.20160126.mdwn
@@ -0,0 +1,29 @@
+git-annex 6.20160126 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Fix nasty reversion in the last release that broke sync --content's
+     handling of many preferred content expressions.
+   * whereis --json: Urls are now listed inside the remote that claims them,
+     rather than all together at the end.
+   * info, add, whereis, find: Support --batch mode.
+   * Force output to be line-buffered, even when it's not connected to the
+     terminal. This is particuarly important for commands with --batch
+     output, which was not always being flushed at an appropriate time.
+   * add, import: Support --json output.
+   * addurl --json: Include field for added key (unless the file was
+     added directly to git due to annex.largefiles configuration.)
+     (Also done by add --json and import --json)
+   * registerurl: Check if a remote claims the url, same as addurl does.
+   * Bug fix: Git config settings passed to git-annex -c did not always take
+     effect.
+   * assistant: Use udisks2 dbus events to detect when disks are mounted,
+     instead of relying on gnome/kde stuff that is not stable.
+   * Fix build with QuickCheck 2.8.2
+   * matchexpression: New plumbing command to check if a preferred content
+     expression matches some data.
+   * Removed the webapp-secure build flag, rolling it into the webapp build
+     flag.
+   * Removed the quvi, tahoe, feed, and tfds build flags, adding
+     aeson feed and regex-tdfa to the core dependencies.
+   * Roll the dns build flag into the assistant build flag.
+   * Debian: Avoid building debug package, since gdb is not often useful
+     to debug haskell programs."""]]
\ No newline at end of file

devblog
diff --git a/doc/devblog/day_358__bugfix_release.mdwn b/doc/devblog/day_358__bugfix_release.mdwn
new file mode 100644
index 0000000..fb2b066
--- /dev/null
+++ b/doc/devblog/day_358__bugfix_release.mdwn
@@ -0,0 +1,9 @@
+Bugfix release of git-annex today. The release earlier this month had a bug
+that caused `git annex sync --content` to drop files that should be
+preferred content. So I had to rush out a fix after that [bug was reported](http://git-annex.branchable.com/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__/).
+(Some of the builds for the new release are still updating as I post this.)
+
+In the past week I've been dealing with a blizzard. Snowed in for 6 days
+and counting. That has slightly back-burnered working on git-annex, and
+I've mostly been making enhancements that the DataLad project needs, along
+the lines of more commands supporting --batch and better --json output. 

bug
diff --git a/doc/bugs/put_gpg_last_in_OSX_dmg_PATH.mdwn b/doc/bugs/put_gpg_last_in_OSX_dmg_PATH.mdwn
new file mode 100644
index 0000000..2f30352
--- /dev/null
+++ b/doc/bugs/put_gpg_last_in_OSX_dmg_PATH.mdwn
@@ -0,0 +1,8 @@
+git-annex bundles gpg on OSX, but this bundled one is not integrated with
+gpg-agent. So, if gpg is installed system-wide, it's probably better to use
+that one (barring any versioning issues).
+
+A solution might be to move the gpg binary to a different directory and put
+it at the end of PATH, not the front. So system one is used if available.
+
+This should also be considered for the linux standalone builds.

Added a comment
diff --git a/doc/forum/Don__39__t_understand_sync_with_ssh_remote/comment_1_be10d6b564e130f4a516d438831681d1._comment b/doc/forum/Don__39__t_understand_sync_with_ssh_remote/comment_1_be10d6b564e130f4a516d438831681d1._comment
new file mode 100644
index 0000000..3a96e88
--- /dev/null
+++ b/doc/forum/Don__39__t_understand_sync_with_ssh_remote/comment_1_be10d6b564e130f4a516d438831681d1._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="reyman64@740e43250854ada1b8484b3bc44b53be03367d70"
+ nickname="reyman64"
+ subject="comment 1"
+ date="2016-01-26T19:14:51Z"
+ content="""
+Ok i finally understand.
+
+I remove the ssh with `git add remove pdfwebfaction` and recreate with
+
+`git remote add pdfwebfaction ssh://reyman@webxxx.webfaction.com:/home/reyman/webdav/pdf`
+
+At this step, `git annex get --from pdfwebfaction` doesn't work, i need to create and add a file like `touch test` to my local empty git repository.
+
+After that, the previous command work.
+
+
+"""]]

Added a comment
diff --git a/doc/install/fromsource/comment_58_64b44da5ec93fe4f50ad8b856823558d._comment b/doc/install/fromsource/comment_58_64b44da5ec93fe4f50ad8b856823558d._comment
new file mode 100644
index 0000000..be94ec1
--- /dev/null
+++ b/doc/install/fromsource/comment_58_64b44da5ec93fe4f50ad8b856823558d._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="reyman64@740e43250854ada1b8484b3bc44b53be03367d70"
+ nickname="reyman64"
+ subject="comment 58"
+ date="2016-01-26T19:09:05Z"
+ content="""
+Ok thanks for your answer :) 
+
+"""]]

comment
diff --git a/doc/install/fromsource/comment_57_13a198daa871e001b02b9df2e8d7c446._comment b/doc/install/fromsource/comment_57_13a198daa871e001b02b9df2e8d7c446._comment
new file mode 100644
index 0000000..221b765
--- /dev/null
+++ b/doc/install/fromsource/comment_57_13a198daa871e001b02b9df2e8d7c446._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 57"""
+ date="2016-01-26T18:50:30Z"
+ content="""
+Check out the tag for the release of git-annex that you want to build to
+avoid building from master, which may not be ready. In this case, I was
+adjusting some build flags this morning and hadn't tried a stack build yet.
+
+git-annex-shell is just a symlink to git-annex. I guess that stack install 
+bypasses the code that makes cabal install set up that symlink. You can make
+the symlink yourself I suppose.
+"""]]

Fix nasty reversion in the last release that broke sync --content's handling of many preferred content expressions.
The type checker should have noticed this, but the changes to mapM
that make it accept any Traversable hid the fact that it was not being
passed a list at all. Thus, what should have returned an empty list most
of the time instead returned [""] which was treated as the name of the
associated file, with disasterout consequences.
When I have time, I should add a test case checking what sync --content
drops. I should also consider replacing mapM with one re-specialized to
lists.
diff --git a/Annex/Drop.hs b/Annex/Drop.hs
index 8a86c0b..e5508b2 100644
--- a/Annex/Drop.hs
+++ b/Annex/Drop.hs
@@ -8,6 +8,7 @@
 module Annex.Drop where
 
 import Annex.Common
+import qualified Annex
 import Logs.Trust
 import Annex.NumCopies
 import Types.Remote (uuid)
@@ -49,7 +50,9 @@ handleDropsFrom :: [UUID] -> [Remote] -> Reason -> Bool -> Key -> AssociatedFile
 handleDropsFrom locs rs reason fromhere key afile preverified runner = do
 	l <- ifM isDirect
 		( associatedFilesRelative key
-		, mapM getTopFilePath <$> Database.Keys.getAssociatedFiles key
+		, do
+			g <- Annex.gitRepo
+			map (`fromTopFilePath` g) <$> Database.Keys.getAssociatedFiles key
 		)
 	let fs = if null l then maybeToList afile else l
 	n <- getcopies fs
diff --git a/Command/Lock.hs b/Command/Lock.hs
index 9611d24..f002f01 100644
--- a/Command/Lock.hs
+++ b/Command/Lock.hs
@@ -86,7 +86,7 @@ performNew file key filemodified = do
 	repopulate obj
 		| filemodified = modifyContent obj $ do
 			g <- Annex.gitRepo
-			fs <- mapM (`fromTopFilePath` g)
+			fs <- map (`fromTopFilePath` g)
 				<$> Database.Keys.getAssociatedFiles key
 			mfile <- firstM (isUnmodified key) fs
 			liftIO $ nukeFile obj
diff --git a/debian/changelog b/debian/changelog
index 4c52b5a..7371a86 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,7 @@
 git-annex (6.20160115) UNRELEASED; urgency=medium
 
+  * Fix nasty reversion in the last release that broke sync --content's
+    handling of many preferred content expressions.
   * whereis --json: Urls are now listed inside the remote that claims them,
     rather than all together at the end.
   * info, add, whereis, find: Support --batch mode.
diff --git a/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__.mdwn b/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__.mdwn
index 557b1f1..470b507 100644
--- a/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__.mdwn
+++ b/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__.mdwn
@@ -16,3 +16,5 @@ git-annex version 6.20160114 on Arch Linux.
 ### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
 
 This behaviour is relatively recent. Until some time ago everything worked as expected with the expression above.
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__/comment_1_410adea7a16e77756579556a2270a458._comment b/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__/comment_1_410adea7a16e77756579556a2270a458._comment
new file mode 100644
index 0000000..dc4b3dc
--- /dev/null
+++ b/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__/comment_1_410adea7a16e77756579556a2270a458._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2016-01-26T18:22:48Z"
+ content="""
+I think it's worse than that, it lost track of the filename, so
+preferred content expressions with include= or exclude= will also do the
+wrong thing.
+
+Going to have to rush out a release fixing this..
+"""]]

retitle
diff --git a/doc/bugs/Unable_to_parallel_fsck.mdwn b/doc/bugs/Unable_to_parallel_fsck.mdwn
index df7286b..2d41991 100644
--- a/doc/bugs/Unable_to_parallel_fsck.mdwn
+++ b/doc/bugs/Unable_to_parallel_fsck.mdwn
@@ -79,3 +79,5 @@ FAIL 1
 
 Plenty. In fact I've been using it for a long time - I just only recently tried to use -J2 to speed up the fsck'ing :)
 
+
+[[!meta title="-J can crash on displaying filenames not supported by current locale"]]

update
diff --git a/doc/bugs/Unable_to_parallel_fsck/comment_1_ce99be8d0ff0851840c77820ed1c0cbf._comment b/doc/bugs/Unable_to_parallel_fsck/comment_1_ce99be8d0ff0851840c77820ed1c0cbf._comment
new file mode 100644
index 0000000..104d6b3
--- /dev/null
+++ b/doc/bugs/Unable_to_parallel_fsck/comment_1_ce99be8d0ff0851840c77820ed1c0cbf._comment
@@ -0,0 +1,39 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2016-01-26T16:21:56Z"
+ content="""
+I can reproduce this with LANG=C.
+
+The cause seems to be that concurrent-output uses Text internally, and
+Strings encoded using the filesystem encoding fail to round-trip through
+Text.
+
+I tried changing concurrent-output from using `T.hPutStr stdout t` to
+`hPutStr stdout (T.unpack t)` but that doesn't help; by the time the String
+comes back out it's lost the filesystem encoding and so contains invalid
+characters.
+
+Seems that the only way to fix this would be to change concurrent-output
+not to use Text. However, it can't use ByteString because it needs to
+operate on individual unicode characters when updating a region.
+Which leaves only String, which I fear would slow
+concurrent-output down quite significantly.
+
+(It might be possible to use ByteString for most of it, and fall back to
+String only when calculating the display update and so avoid most of the
+permformance impact. I have an incomplete conversion headed in that
+direction in the use-bytestring branch in concurrent-output git repo. After
+spending 2 hours on it, it's nowhere near done.)
+
+Since git-annex remains usable without -J, and since this only affects
+systems that don't have a unicode locale configured and yet are using
+unicode filenames (or systems that do use a unicode locale and have
+filenames that are not valid utf-8), I'm kind of inclined not to massively
+rework and likely slow down concurrent-output just to handle this case.
+But I don't like it.
+
+Workaround: Compile git-annex with -f-ConcurrentOutput and the problem
+will be avoided, although then you won't get progress displays when doing a
+`git-annex get -Jn`
+"""]]

removed
diff --git a/doc/install/fromsource/comment_56_3f0843dbb15557032b224cd1722ffca3._comment b/doc/install/fromsource/comment_56_3f0843dbb15557032b224cd1722ffca3._comment
deleted file mode 100644
index 1f2b118..0000000
--- a/doc/install/fromsource/comment_56_3f0843dbb15557032b224cd1722ffca3._comment
+++ /dev/null
@@ -1,45 +0,0 @@
-[[!comment format=mdwn
- username="reyman64@740e43250854ada1b8484b3bc44b53be03367d70"
- nickname="reyman64"
- subject="problem with latest pull and stack"
- date="2016-01-26T16:48:42Z"
- content="""
-
-Is there a tag in github to download the latest dev build  (if i want to compile a build with v6 repository for example) ? 
-
-Because after a recent `git pull` (commit `65f44423d1b9407a9c0e4a2b2e7e24b701f6dc32`
- ) on master, i have this error on `stack install` :
-
-Also, `git-annex-shell` is not created by stack install, is it normal ? 
-
-```
-[reyman64@web504 git-annex]$ stack install git-annex --local-bin-path /home/reyman64/bin
-Invalid flag specification:
-- Package 'git-annex' does not define the following flags (specified in stack.yaml):
-  feed
-  quvi
-  tahoe
-  webapp-secure
-- Flags defined by package 'git-annex':
-  git-annex:android
-  git-annex:androidsplice
-  git-annex:assistant
-  git-annex:benchmark
-  git-annex:concurrentoutput
-  git-annex:cryptonite
-  git-annex:dns
-  git-annex:ekg
-  git-annex:network-uri
-  git-annex:pairing
-  git-annex:production
-  git-annex:s3
-  git-annex:tdfa
-  git-annex:testsuite
-  git-annex:torrentparser
-  git-annex:webapp
-  git-annex:webdav
-```
-
-Best,
-SR.
-"""]]

Added a comment: problem with latest pull and stack
diff --git a/doc/install/fromsource/comment_57_efac370d382fc79e1f207e8090e0f06b._comment b/doc/install/fromsource/comment_57_efac370d382fc79e1f207e8090e0f06b._comment
new file mode 100644
index 0000000..286d609
--- /dev/null
+++ b/doc/install/fromsource/comment_57_efac370d382fc79e1f207e8090e0f06b._comment
@@ -0,0 +1,45 @@
+[[!comment format=mdwn
+ username="reyman64@740e43250854ada1b8484b3bc44b53be03367d70"
+ nickname="reyman64"
+ subject="problem with latest pull and stack"
+ date="2016-01-26T16:49:05Z"
+ content="""
+
+Is there a tag in github to download the latest dev build  (if i want to compile a build with v6 repository for example) ? 
+
+Because after a recent `git pull` (commit `65f44423d1b9407a9c0e4a2b2e7e24b701f6dc32`
+ ) on master, i have this error on `stack install` :
+
+Also, `git-annex-shell` is not created by stack install, is it normal ? 
+
+```
+[reyman64@web504 git-annex]$ stack install git-annex --local-bin-path /home/reyman64/bin
+Invalid flag specification:
+- Package 'git-annex' does not define the following flags (specified in stack.yaml):
+  feed
+  quvi
+  tahoe
+  webapp-secure
+- Flags defined by package 'git-annex':
+  git-annex:android
+  git-annex:androidsplice
+  git-annex:assistant
+  git-annex:benchmark
+  git-annex:concurrentoutput
+  git-annex:cryptonite
+  git-annex:dns
+  git-annex:ekg
+  git-annex:network-uri
+  git-annex:pairing
+  git-annex:production
+  git-annex:s3
+  git-annex:tdfa
+  git-annex:testsuite
+  git-annex:torrentparser
+  git-annex:webapp
+  git-annex:webdav
+```
+
+Best,
+SR.
+"""]]

Added a comment: problem with latest pull and stack
diff --git a/doc/install/fromsource/comment_56_3f0843dbb15557032b224cd1722ffca3._comment b/doc/install/fromsource/comment_56_3f0843dbb15557032b224cd1722ffca3._comment
new file mode 100644
index 0000000..1f2b118
--- /dev/null
+++ b/doc/install/fromsource/comment_56_3f0843dbb15557032b224cd1722ffca3._comment
@@ -0,0 +1,45 @@
+[[!comment format=mdwn
+ username="reyman64@740e43250854ada1b8484b3bc44b53be03367d70"
+ nickname="reyman64"
+ subject="problem with latest pull and stack"
+ date="2016-01-26T16:48:42Z"
+ content="""
+
+Is there a tag in github to download the latest dev build  (if i want to compile a build with v6 repository for example) ? 
+
+Because after a recent `git pull` (commit `65f44423d1b9407a9c0e4a2b2e7e24b701f6dc32`
+ ) on master, i have this error on `stack install` :
+
+Also, `git-annex-shell` is not created by stack install, is it normal ? 
+
+```
+[reyman64@web504 git-annex]$ stack install git-annex --local-bin-path /home/reyman64/bin
+Invalid flag specification:
+- Package 'git-annex' does not define the following flags (specified in stack.yaml):
+  feed
+  quvi
+  tahoe
+  webapp-secure
+- Flags defined by package 'git-annex':
+  git-annex:android
+  git-annex:androidsplice
+  git-annex:assistant
+  git-annex:benchmark
+  git-annex:concurrentoutput
+  git-annex:cryptonite
+  git-annex:dns
+  git-annex:ekg
+  git-annex:network-uri
+  git-annex:pairing
+  git-annex:production
+  git-annex:s3
+  git-annex:tdfa
+  git-annex:testsuite
+  git-annex:torrentparser
+  git-annex:webapp
+  git-annex:webdav
+```
+
+Best,
+SR.
+"""]]

diff --git a/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__.mdwn b/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__.mdwn
new file mode 100644
index 0000000..557b1f1
--- /dev/null
+++ b/doc/bugs/wanted___61___present_gets_ignored_in___39__git_annex_sync_--content__39__.mdwn
@@ -0,0 +1,18 @@
+### Please describe the problem.
+
+The 'present' flag in the wanted files flag for a repository is ignored when doing a `git annex sync --content`, which causes git annex to (try to) drop all files. E.g. the line 
+
+    wanted $repoid = lackingcopies=1 or present
+
+in `git annex vicfg` tries to drop all files if enough copies are available. `git annex drop --auto` works as expected and doesn't try to drop files.
+
+### What steps will reproduce the problem?
+Use 'present' in the 'wanted' option of a repo and do a `git annex sync --content`. `wanted $repouuid = present` was enough to trigger that behaviour.
+
+### What version of git-annex are you using? On what operating system?
+git-annex version 6.20160114 on Arch Linux.
+
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+This behaviour is relatively recent. Until some time ago everything worked as expected with the expression above.

close
diff --git a/doc/bugs/treatment_of_largefiles_is_not_working_for_addurl_--fast___40__or_--relaxed__41__.mdwn b/doc/bugs/treatment_of_largefiles_is_not_working_for_addurl_--fast___40__or_--relaxed__41__.mdwn
index 14ddaa6..a77ee21 100644
--- a/doc/bugs/treatment_of_largefiles_is_not_working_for_addurl_--fast___40__or_--relaxed__41__.mdwn
+++ b/doc/bugs/treatment_of_largefiles_is_not_working_for_addurl_--fast___40__or_--relaxed__41__.mdwn
@@ -23,3 +23,7 @@ lrwxrwxrwx 1 yoh yoh 132 Jan 13 18:44 test.txt -> .git/annex/objects/KW/kj/URL-s
 it does consider largefiles for if addurl without  --fast, or --relaxed
 
 [[!meta author=yoh]]
+
+> [[done]]; this can't really be done, but I added `git annex
+> matchexpression` to allow scripting that checks expressions such as
+> annex.largefiles. --[[Joey]]

Add bug report
diff --git a/doc/bugs/Unable_to_parallel_fsck.mdwn b/doc/bugs/Unable_to_parallel_fsck.mdwn
new file mode 100644
index 0000000..df7286b
--- /dev/null
+++ b/doc/bugs/Unable_to_parallel_fsck.mdwn
@@ -0,0 +1,81 @@
+### Please describe the problem.
+
+If I run git annex fsck with the parallel jobs switch (e.g. -J2) it fails when it encounters files with non-ASCII filenames. It works fine without
+this switch.
+
+
+### What steps will reproduce the problem?
+
+Make a git annex repository with non-ascii filenames, add the files, and then run fsck with the parallel switch. A script to do this
+is included below.
+
+
+### What version of git-annex are you using? On what operating system?
+
+Arch Linux (64bit)
+
+git-annex version: 6.20160114-g297a744
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3(multipartupload) WebDAV Inotify DBus DesktopNotify XMPP ConcurrentOutput DNS Feeds Quvi TDFA TorrentParser
+key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 SHA1E SHA1 MD5E MD5 WORM URL
+remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external
+local repository version: 5
+supported repository versions: 5 6
+upgrade supported from repository versions: 0 1 2 4 5
+
+### Please provide any additional information below.
+
+[[!format sh """
+#!/bin/bash
+set -o errexit -o nounset
+
+mkdir testing-repo
+cd testing-repo
+git init
+git annex init testing-repo
+
+make_fake_file() {
+  local filename="$1"
+  mkdir -p "$(dirname "$filename")"
+  echo "hello world" > "$filename"
+  git annex add "$filename"
+}
+
+export -f make_fake_file
+parallel -j1 'make_fake_file {}' <<EOF
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/folder.jpg
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/01 - 遥か彼方 - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/02 - 未来の破片 - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/03 - アンダースタンド - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/04 - 君という花 - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/05 - リライト - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/06 - 君の街まで - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/07 - ループ & ループ - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/08 - ブラックアウト - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/09 - ブルートレイン - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/10 - 或る街の群青 - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/11 - アフターダーク - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/12 - 転がる岩、君に朝が降る - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/13 - ムスタング - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/14 - 藤沢ルーザー - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/15 - 新世紀のラブソング - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/16 - ソラニン - ASIAN KUNG-FU GENERATION.flac
+ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/17 - マーチングバンド - ASIAN KUNG-FU GENERATION.flac
+EOF
+
+git commit -m 'Add testing files.'
+git annex fsck -J2
+"""]]
+
+On my system this produces:
+
+[[!format sh """
+fsck ASIAN KUNG-FU GENERATION/2012 - BEST HIT AKG/flac/01 - git-annex: <stdout>: commitAndReleaseBuffer: invalid argument (invalid character)
+FAIL 1
+"""]]
+
+(The FAIL 1 output is just my terminal printing that the exit code was 1)
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+Plenty. In fact I've been using it for a long time - I just only recently tried to use -J2 to speed up the fsck'ing :)
+

Added a comment
diff --git a/doc/bugs/treatment_of_largefiles_is_not_working_for_addurl_--fast___40__or_--relaxed__41__/comment_5_fee83d2df645740841d6662cf543878b._comment b/doc/bugs/treatment_of_largefiles_is_not_working_for_addurl_--fast___40__or_--relaxed__41__/comment_5_fee83d2df645740841d6662cf543878b._comment
new file mode 100644
index 0000000..45051c2
--- /dev/null
+++ b/doc/bugs/treatment_of_largefiles_is_not_working_for_addurl_--fast___40__or_--relaxed__41__/comment_5_fee83d2df645740841d6662cf543878b._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/EbvxpTI_xP9Aod7Mg4cwGhgjrCrdM5s-#7c0f4"
+ subject="comment 5"
+ date="2016-01-25T20:23:22Z"
+ content="""
+Sounds like reasonably fast to me.  Let me try adopting it, and then if it would become a bottleneck I would whine ;)
+"""]]

matchexpression: New plumbing command to check if a preferred content expression matches some data.
diff --git a/CmdLine/GitAnnex.hs b/CmdLine/GitAnnex.hs
index 0383dad..ec35285 100644
--- a/CmdLine/GitAnnex.hs
+++ b/CmdLine/GitAnnex.hs
@@ -27,6 +27,7 @@ import qualified Command.Fsck
 import qualified Command.LookupKey
 import qualified Command.ContentLocation
 import qualified Command.ExamineKey
+import qualified Command.MatchExpression
 import qualified Command.FromKey
 import qualified Command.RegisterUrl
 import qualified Command.SetKey
@@ -166,6 +167,7 @@ cmds testoptparser testrunner =
 	, Command.LookupKey.cmd
 	, Command.ContentLocation.cmd
 	, Command.ExamineKey.cmd
+	, Command.MatchExpression.cmd
 	, Command.FromKey.cmd
 	, Command.RegisterUrl.cmd
 	, Command.SetKey.cmd
diff --git a/Command/MatchExpression.hs b/Command/MatchExpression.hs
new file mode 100644
index 0000000..062a46b
--- /dev/null
+++ b/Command/MatchExpression.hs
@@ -0,0 +1,75 @@
+{- git-annex command
+ -
+ - Copyright 2016 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Command.MatchExpression where
+
+import Command
+import Annex.FileMatcher
+import Types.FileMatcher
+import Utility.DataUnits
+import Utility.Matcher
+import Annex.UUID
+import Logs.Group
+
+import qualified Data.Map as M
+import qualified Data.Set as S
+
+cmd :: Command
+cmd = noCommit $
+	command "matchexpression" SectionPlumbing 
+		"checks if a preferred content expression matches"
+		paramExpression
+		(seek <$$> optParser)
+
+data MatchExpressionOptions = MatchExpressionOptions
+	{ matchexpr :: String
+	, matchinfo :: MatchInfo
+	}
+
+optParser :: CmdParamsDesc -> Parser MatchExpressionOptions
+optParser desc = MatchExpressionOptions
+	<$> argument str (metavar desc)
+	<*> (addkeysize <$> dataparser)
+  where
+	dataparser = MatchingInfo
+		<$> optinfo "file" (strOption
+			( long "file" <> metavar paramFile
+			<> help "specify filename to match against"
+			))
+		<*> optinfo "key" (option (str >>= parseKey)
+			( long "key" <> metavar paramKey
+			<> help "specify key to match against"
+			))
+		<*> optinfo "size" (option (str >>= maybe (fail "parse error") return . readSize dataUnits)
+			( long "size" <> metavar paramSize
+			<> help "specify size to match against"
+			))
+	optinfo datadesc mk = (Right <$> mk)
+		<|> (pure $ Left $ missingdata datadesc)
+	missingdata datadesc = bail $ "cannot match this expression without " ++ datadesc ++ " data"
+	-- When a key is provided, use its size.
+	addkeysize i@(MatchingInfo f (Right k) _) = case keySize k of
+		Just sz -> MatchingInfo f (Right k) (Right sz)
+		Nothing -> i
+	addkeysize i = i
+
+seek :: MatchExpressionOptions -> CommandSeek
+seek o = do
+	u <- getUUID
+	case parsedToMatcher $ exprParser matchAll matchAll groupMap M.empty (Just u) (matchexpr o) of
+		Left e -> liftIO $ bail $ "bad expression: " ++ e
+		Right matcher -> ifM (checkmatcher matcher)
+			( liftIO exitSuccess
+			, liftIO exitFailure
+			)
+  where
+	checkmatcher matcher = matchMrun matcher $ \a -> a S.empty (matchinfo o)
+
+bail :: String -> IO a
+bail s = do
+	hPutStrLn stderr s
+	exitWith $ ExitFailure 42
diff --git a/Limit.hs b/Limit.hs
index c4bab31..79335d3 100644
--- a/Limit.hs
+++ b/Limit.hs
@@ -73,21 +73,22 @@ addInclude :: String -> Annex ()
 addInclude = addLimit . limitInclude
 
 limitInclude :: MkLimit Annex
-limitInclude glob = Right $ const $ return . matchGlobFile glob
+limitInclude glob = Right $ const $ matchGlobFile glob
 
 {- Add a limit to skip files that match the glob. -}
 addExclude :: String -> Annex ()
 addExclude = addLimit . limitExclude
 
 limitExclude :: MkLimit Annex
-limitExclude glob = Right $ const $ return . not . matchGlobFile glob
+limitExclude glob = Right $ const $ not <$$> matchGlobFile glob
 
-matchGlobFile :: String -> MatchInfo -> Bool
+matchGlobFile :: String -> MatchInfo -> Annex Bool
 matchGlobFile glob = go
 	where
 		cglob = compileGlob glob CaseSensative -- memoized
-		go (MatchingKey _) = False
-		go (MatchingFile fi) = matchGlob cglob (matchFile fi)
+		go (MatchingKey _) = pure False
+		go (MatchingFile fi) = pure $ matchGlob cglob (matchFile fi)
+		go (MatchingInfo af _ _) = matchGlob cglob <$> getInfo af
 
 {- Adds a limit to skip files not believed to be present
  - in a specfied repository. Optionally on a prior date. -}
@@ -133,8 +134,10 @@ matchPresent u _ = checkKey $ \key -> do
 limitInDir :: FilePath -> MkLimit Annex
 limitInDir dir = const $ Right $ const go
   where
-	go (MatchingFile fi) = return $ elem dir $ splitPath $ takeDirectory $ matchFile fi
+	go (MatchingFile fi) = checkf $ matchFile fi
 	go (MatchingKey _) = return False
+	go (MatchingInfo af _ _) = checkf =<< getInfo af
+	checkf = return . elem dir . splitPath . takeDirectory
 
 {- Adds a limit to skip files not believed to have the specified number
  - of copies. -}
@@ -177,8 +180,9 @@ limitLackingCopies approx want = case readish want of
 		NumCopies numcopies <- if approx
 			then approxNumCopies
 			else case mi of
-				MatchingKey _ -> approxNumCopies
 				MatchingFile fi -> getGlobalFileNumCopies $ matchFile fi
+				MatchingKey _ -> approxNumCopies
+				MatchingInfo _ _ _ -> approxNumCopies
 		us <- filter (`S.notMember` notpresent)
 			<$> (trustExclude UnTrusted =<< Remote.keyLocations key)
 		return $ numcopies - length us >= needed
@@ -192,6 +196,9 @@ limitLackingCopies approx want = case readish want of
 limitUnused :: MatchFiles Annex
 limitUnused _ (MatchingFile _) = return False
 limitUnused _ (MatchingKey k) = S.member k <$> unusedKeys
+limitUnused _ (MatchingInfo _ ak _) = do
+	k <- getInfo ak
+	S.member k <$> unusedKeys
 
 {- Limit that matches any version of any file. -}
 limitAnything :: MatchFiles Annex
@@ -240,6 +247,8 @@ limitSize vs s = case readSize dataUnits s of
   where
 	go sz _ (MatchingFile fi) = lookupFileKey fi >>= check fi sz
 	go sz _ (MatchingKey key) = checkkey sz key
+	go sz _ (MatchingInfo _ _ as) =
+		getInfo as >>= \sz' -> return (Just sz' `vs` Just sz)
 	checkkey sz key = return $ keySize key `vs` Just sz
 	check _ sz (Just key) = checkkey sz key
 	check fi sz Nothing = do
@@ -281,3 +290,4 @@ lookupFileKey = lookupFile . currFile
 checkKey :: (Key -> Annex Bool) -> MatchInfo -> Annex Bool
 checkKey a (MatchingFile fi) = lookupFileKey fi >>= maybe (return False) a
 checkKey a (MatchingKey k) = a k
+checkKey a (MatchingInfo _ ak _) = a =<< getInfo ak
diff --git a/Limit/Wanted.hs b/Limit/Wanted.hs
index 237cb7a..c11e24b 100644
--- a/Limit/Wanted.hs
+++ b/Limit/Wanted.hs
@@ -21,3 +21,4 @@ addWantDrop = addLimit $ Right $ const $ checkWant $ wantDrop False Nothing Noth
 checkWant :: (Maybe FilePath -> Annex Bool) -> MatchInfo -> Annex Bool
 checkWant a (MatchingFile fi) = a (Just $ matchFile fi)
 checkWant _ (MatchingKey _) = return False
+checkWant _ (MatchingInfo {}) = return False
diff --git a/Types/FileMatcher.hs b/Types/FileMatcher.hs
index 377bba7..43f05ef 100644
--- a/Types/FileMatcher.hs
+++ b/Types/FileMatcher.hs
@@ -1,6 +1,6 @@
 {- git-annex file matcher types
  -
- - Copyright 2013 Joey Hess <id@joeyh.name>
+ - Copyright 2013-2016 Joey Hess <id@joeyh.name>
  -
  - Licensed under the GNU GPL version 3 or higher.

(Diff truncated)