adb: Added configuration setting oldandroid=true
To avoid using find -printf, which was first supported in Android around 2019-2020. Probing seems too fragile, and execing stat once per file is too slow to do when there's a faster way available, which brought me to an option... Sponsored-by: Brett Eisenberg on Patreon
This commit is contained in:
parent
6c7550ba62
commit
50c2cac7e7
5 changed files with 59 additions and 10 deletions
|
@ -10,6 +10,11 @@ git-annex (10.20220625) UNRELEASED; urgency=medium
|
||||||
another directory. (Introduced in version 10.20220624)
|
another directory. (Introduced in version 10.20220624)
|
||||||
* filter-process: Fix a bug involving handling of empty files,
|
* filter-process: Fix a bug involving handling of empty files,
|
||||||
that caused git to kill git-annex filter-process.
|
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
|
-- Joey Hess <id@joeyh.name> Tue, 28 Jun 2022 14:49:17 -0400
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,8 @@ remote = specialRemoteType $ RemoteType
|
||||||
(FieldDesc "sometimes needed to specify which Android device to use")
|
(FieldDesc "sometimes needed to specify which Android device to use")
|
||||||
, yesNoParser ignorefinderrorField (Just False)
|
, yesNoParser ignorefinderrorField (Just False)
|
||||||
(FieldDesc "ignore adb find errors")
|
(FieldDesc "ignore adb find errors")
|
||||||
|
, yesNoParser oldandroidField (Just False)
|
||||||
|
(FieldDesc "support old versions of android (slower)")
|
||||||
]
|
]
|
||||||
, setup = adbSetup
|
, setup = adbSetup
|
||||||
, exportSupported = exportIsSupported
|
, exportSupported = exportIsSupported
|
||||||
|
@ -62,6 +64,8 @@ androidserialField = Accepted "androidserial"
|
||||||
ignorefinderrorField :: RemoteConfigField
|
ignorefinderrorField :: RemoteConfigField
|
||||||
ignorefinderrorField = Accepted "ignorefinderror"
|
ignorefinderrorField = Accepted "ignorefinderror"
|
||||||
|
|
||||||
|
oldandroidField :: RemoteConfigField
|
||||||
|
oldandroidField = Accepted "oldandroid"
|
||||||
|
|
||||||
gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> RemoteStateHandle -> Annex (Maybe Remote)
|
gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> RemoteStateHandle -> Annex (Maybe Remote)
|
||||||
gen r u rc gc rs = do
|
gen r u rc gc rs = do
|
||||||
|
@ -305,26 +309,44 @@ listImportableContentsM serial adir c = adbfind >>= \case
|
||||||
ImportableContents (mapMaybe mk ls) []
|
ImportableContents (mapMaybe mk ls) []
|
||||||
Nothing -> giveup "adb find failed"
|
Nothing -> giveup "adb find failed"
|
||||||
where
|
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"
|
[ Param "find"
|
||||||
-- trailing slash is needed, or android's find command
|
-- trailing slash is needed, or android's find command
|
||||||
-- won't recurse into the directory
|
-- won't recurse into the directory
|
||||||
, File $ fromAndroidPath adir ++ "/"
|
, File $ fromAndroidPath adir ++ "/"
|
||||||
, Param "-type", Param "f"
|
, Param "-type", Param "f"
|
||||||
, Param "-printf", Param "%p\\0"
|
] ++ if oldandroid
|
||||||
|
then
|
||||||
|
[ Param "-exec"
|
||||||
|
, Param "stat"
|
||||||
|
, Param "-c"
|
||||||
|
, Param statformat
|
||||||
|
, Param "{}"
|
||||||
|
, Param ";"
|
||||||
]
|
]
|
||||||
(\s -> concat
|
else
|
||||||
[ "set -o pipefail; "
|
[ Param "-printf"
|
||||||
, s
|
, Param "%p\\0"
|
||||||
, "| xargs -0 stat -c " ++ shellEscape statformat ++ " --"
|
|
||||||
, if ignorefinderror then " || true" else ""
|
|
||||||
]
|
]
|
||||||
)
|
|
||||||
|
|
||||||
ignorefinderror = fromMaybe False (getRemoteConfigValue ignorefinderrorField c)
|
ignorefinderror = fromMaybe False (getRemoteConfigValue ignorefinderrorField c)
|
||||||
|
oldandroid = fromMaybe False (getRemoteConfigValue oldandroidField c)
|
||||||
|
|
||||||
statformat = adbStatFormat ++ "\t%n"
|
statformat = adbStatFormat ++ "\t%n"
|
||||||
|
|
||||||
|
ignorefinderrorsh = if ignorefinderror then " || true" else ""
|
||||||
|
|
||||||
mk ('S':'T':'\t':l) =
|
mk ('S':'T':'\t':l) =
|
||||||
let (stat, fn) = separate (== '\t') l
|
let (stat, fn) = separate (== '\t') l
|
||||||
sz = fromMaybe 0 (readish (takeWhile (/= ' ') stat))
|
sz = fromMaybe 0 (readish (takeWhile (/= ' ') stat))
|
||||||
|
|
|
@ -72,3 +72,4 @@ http://git-annex.branchable.com/tips/android_sync_with_adb/#comment-88511cef6861
|
||||||
### 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)
|
### 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)
|
||||||
git annex has been great so far, aside from some pitfalls on some of the more advanced features, i have been using it to manage my files using all kinds of special and non special remotes very solidly for 2 years now.
|
git annex has been great so far, aside from some pitfalls on some of the more advanced features, i have been using it to manage my files using all kinds of special and non special remotes very solidly for 2 years now.
|
||||||
|
|
||||||
|
> [[fixed|done]] --[[Joey]]
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
[[!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.
|
||||||
|
"""]]
|
|
@ -32,6 +32,11 @@ the adb remote.
|
||||||
by [[git-annex-import]]. When set in combination with exporttree,
|
by [[git-annex-import]]. When set in combination with exporttree,
|
||||||
this lets files be imported from it, and changes exported back to it.
|
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"
|
* `ignorefinderror` - Set to "yes" to ignore errors when running "adb find"
|
||||||
on the Android device. This can be useful eg, if some subdirectories are
|
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.
|
not readable, to let it import the other things that are readable.
|
||||||
|
|
Loading…
Reference in a new issue