@@ -7,9 +7,9 @@ function backupApp() {
77 info " Backing up app $packageName to $baseDestFolder "
88
99 if [[ " ${APK} " != ' true' ]]; then
10- backupFolder " /data/data/$packageName "
10+ backupFolder " /data/data/${ packageName} " " ${baseDestFolder} /data/data "
1111
12- backupFolder " /sdcard/Android/data/$packageName "
12+ backupFolder " /sdcard/Android/data/${ packageName} " " ${baseDestFolder} /sdcard/Android/data/ "
1313 fi
1414
1515 if [[ " ${DATA} " != ' true' ]]; then
@@ -24,13 +24,13 @@ function backupApp() {
2424
2525function backupFolder() {
2626 srcFolder=" $1 "
27- actualDestFolder=" ${baseDestFolder} /${srcFolder} "
28- additionalArgs=(" $@ " )
29- # Treat all args after src and dst as addition rsync args
30- additionalArgs=${additionalArgs[@]: 1}
27+ rootDestFolder=" $2 "
28+
3129 if [[ -d " ${srcFolder} " ]]; then
32- trace " Syncing ${srcFolder} to ${actualDestFolder} "
33- doSync " ${srcFolder} /" " ${actualDestFolder} " $( excludeCache) ${additionalArgs}
30+ trace " Syncing ${srcFolder} to ${rootDestFolder} "
31+ # Add --delete here to remove files ins dest that have been deleted
32+ # This should also migrate from data/data/${packageName} to data/data
33+ doSync " ${srcFolder} /" " ${rootDestFolder} " $( excludeCache) --delete
3434 fi
3535}
3636
@@ -39,27 +39,36 @@ function restoreApp() {
3939 # For now just assume folder name = package name. Reading from apk would be more defensive... and effort.
4040 local packageName=${rootSrcFolder##*/ }
4141
42- info " Restoring app $packageName from $rootSrcFolder "
42+ info " Restoring app ${ packageName} from ${ rootSrcFolder} "
4343
4444 if [[ " ${DATA} " != ' true' ]]; then
45- installMultiple " $rootSrcFolder /"
45+ installMultiple " ${ rootSrcFolder} /"
4646 fi
4747
4848 if [[ " ${APK} " != ' true' ]]; then
4949 user=$( stat -c ' %U' " /data/data/$packageName " )
5050 group=$( stat -c ' %G' " /data/data/$packageName " )
5151
52- restoreFolder " ${rootSrcFolder} " " /data/data/ ${packageName} "
52+ restoreFolder " ${rootSrcFolder} " " /data/data" " ${packageName} "
5353
54- restoreFolder " ${rootSrcFolder} " " /sdcard/Android/data/ ${packageName} "
54+ restoreFolder " ${rootSrcFolder} " " /sdcard/Android/data" " ${packageName} "
5555 fi
5656}
5757
5858function restoreFolder() {
59+ # e.g. /my/folder/backup/com.nxp.taginfolite
5960 local rootSrcFolder=" $1 "
60- local destFolder=" $2 "
61- local actualSrcFolder=" ${rootSrcFolder} /${destFolder} "
61+ # e.g. /data/data
62+ local rootDestFolder=" $2 "
63+ # e.g. com.nxp.taginfolite
64+ local packageName=" $3 "
65+
66+ local actualSrcFolder=" ${rootSrcFolder} /${rootDestFolder} "
67+ local actualDestFolder=" ${rootDestFolder} /${packageName} "
6268
69+ # TODO build backward compatibility for backups create with old folder format
70+ # e.g. /my/folder/backup/com.nxp.taginfolite/data/data/com.nxp.taginfolite
71+ # This is not necessary for rclone, because rclone feature didn't exist with old folder format
6372 actualSourceFolderExists=false
6473 if [[ " ${actualSrcFolder} " == * :* ]]; then
6574 # ssh '[ -d /a/b/c ]'
@@ -74,10 +83,10 @@ function restoreFolder() {
7483 fi
7584
7685 if [[ " ${actualSourceFolderExists} " != ' false' ]]; then
77- trace " Restoring data to ${destFolder } "
78- doSync " ${actualSrcFolder} /" " ${destFolder } "
79- trace " Fixing owner/group ${user} :${group} in ${destFolder } "
80- sudo chown -R " ${user} :${group} " " ${destFolder } "
86+ trace " Restoring data to ${actualDestFolder } "
87+ doSync " ${actualSrcFolder} /" " ${actualDestFolder } "
88+ trace " Fixing owner/group ${user} :${group} in ${actualDestFolder } "
89+ sudo chown -R " ${user} :${group} " " ${actualDestFolder } "
8190 else
8291 info " Backup does not contain folder '${actualSrcFolder} '. Skipping"
8392 fi
@@ -87,20 +96,15 @@ function restoreFolder() {
8796function excludeCache() {
8897 if [[ " ${RCLONE} " == ' true' ]]; then
8998 echo --filter=" - /cache/**"
90- # echo --filter-from=<(echo "'- /cache/**'")
91- # echo "--exclude='/cache/**'"
9299 else
93100 echo --exclude=' /cache'
94101 fi
95102}
96103
97104function includeOnlyApk() {
98105 if [[ " ${RCLONE} " == ' true' ]]; then
99- # echo "--include='/*.apk'"
100- # echo -n --filter="+ /*.apk" --filter='- \*'
101- echo --filter-from=$LIB_DIR /rclone-apk-only-filter.txt
102- # echo --filter={+ /*.apk,- *}
103-
106+ # Avoid fuss with whitespaces inside the filter rules by importing them from a file
107+ echo --filter-from=" ${LIB_DIR} /rclone-apk-only-filter.txt"
104108 else
105109 echo -m --include=' */' --include=' *.apk' --exclude=' *'
106110 fi
@@ -124,8 +128,6 @@ function doRclone() {
124128 additionalArgs=${additionalArgs[@]: 2}
125129 RSYNC_ARGS=${RSYNC_ARGS:- ' ' }
126130
127-
128- # --progress \
129131 sudo rclone sync \
130132 $( rsyncExternalArgs) \
131133 " ${additionalArgs} " \
0 commit comments