another directory. (Introduced in version 10.20220624)
* filter-process: Fix a bug involving handling of empty files,
that caused git to kill git-annex filter-process.
+ * adb: Added configuration setting oldandroid=true to avoid using
+ find -printf, which was first supported in Android around 2019-2020.
+ This may need to be enabled for old android devices that used to work
+ without it being set, since version 10.20220222 started using
+ find -printf.
-- Joey Hess <id@joeyh.name> Tue, 28 Jun 2022 14:49:17 -0400
(FieldDesc "sometimes needed to specify which Android device to use")
, yesNoParser ignorefinderrorField (Just False)
(FieldDesc "ignore adb find errors")
+ , yesNoParser oldandroidField (Just False)
+ (FieldDesc "support old versions of android (slower)")
]
, setup = adbSetup
, exportSupported = exportIsSupported
ignorefinderrorField :: RemoteConfigField
ignorefinderrorField = Accepted "ignorefinderror"
+oldandroidField :: RemoteConfigField
+oldandroidField = Accepted "oldandroid"
gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> RemoteStateHandle -> Annex (Maybe Remote)
gen r u rc gc rs = do
ImportableContents (mapMaybe mk ls) []
Nothing -> giveup "adb find failed"
where
- adbfind = adbShell' serial
+ adbfind = adbShell' serial findparams
+ (\s -> if oldandroid
+ then s ++ ignorefinderrorsh
+ else concat
+ [ "set -o pipefail; "
+ , s
+ , "| xargs -0 stat -c " ++ shellEscape statformat ++ " --"
+ , ignorefinderrorsh
+ ]
+ )
+
+ findparams =
[ Param "find"
-- trailing slash is needed, or android's find command
-- won't recurse into the directory
, File $ fromAndroidPath adir ++ "/"
, Param "-type", Param "f"
- , Param "-printf", Param "%p\\0"
- ]
- (\s -> concat
- [ "set -o pipefail; "
- , s
- , "| xargs -0 stat -c " ++ shellEscape statformat ++ " --"
- , if ignorefinderror then " || true" else ""
- ]
- )
+ ] ++ if oldandroid
+ then
+ [ Param "-exec"
+ , Param "stat"
+ , Param "-c"
+ , Param statformat
+ , Param "{}"
+ , Param ";"
+ ]
+ else
+ [ Param "-printf"
+ , Param "%p\\0"
+ ]
ignorefinderror = fromMaybe False (getRemoteConfigValue ignorefinderrorField c)
+ oldandroid = fromMaybe False (getRemoteConfigValue oldandroidField c)
statformat = adbStatFormat ++ "\t%n"
+ ignorefinderrorsh = if ignorefinderror then " || true" else ""
+
mk ('S':'T':'\t':l) =
let (stat, fn) = separate (== '\t') l
sz = fromMaybe 0 (readish (takeWhile (/= ' ') stat))
--- /dev/null
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2022-07-13T19:18:13Z"
+ content="""
+Ok, I've added an oldandroid=yes configuration to fix this. To enable it:
+
+ git-annex enableremote android oldandroid=yes
+
+(Replace "android" with whatever name you used for the adb remote.)
+
+I don't much like this, but it's better than git-annex being slow with new
+phones, and being slow with old phones is better than failing when there are
+too many files to import. I did consider trying to auto-probe it from the
+error message, but that seemed likely to be too fragile.
+"""]]
by [[git-annex-import]]. When set in combination with exporttree,
this lets files be imported from it, and changes exported back to it.
+* `oldandroid` - Set to "yes" if your Android device is too old
+ to support `find -printf`. Enabling this will make importing slower.
+ If you see an error like "bad arg '-printf'", you can enable this
+ option, by running eg: `git-annex enableremote android oldandroid=yes`
+
* `ignorefinderror` - Set to "yes" to ignore errors when running "adb find"
on the Android device. This can be useful eg, if some subdirectories are
not readable, to let it import the other things that are readable.