@@ -10,27 +10,47 @@ function backupApp() {
10
10
fi
11
11
12
12
if [[ " ${APK} " != ' true' ]]; then
13
-
14
- # Backup to target paths as short as possible to avoid "path too long" errors
15
- backupFolder " /data/data/${packageName} " " ${baseDestFolder} /data/"
16
-
17
- backupFolder " /sdcard/Android/data/${packageName} " " ${baseDestFolder} /sdcard/"
18
-
19
- # Backing up to /sdcard/data and /sdcard/media would have been more intuitive
20
- # But: media was added later and migrating data would be too much effort for me right now
21
- backupFolder " /sdcard/Android/media/${packageName} " " ${baseDestFolder} /sdcard-media/"
13
+ if [[ " ${packageName} " != ' com.termux' ]]; then
14
+ # Backup to target paths as short as possible to avoid "path too long" errors
15
+ backupFolder " /data/data/${packageName} " " ${baseDestFolder} /data/"
16
+
17
+ backupFolder " /sdcard/Android/data/${packageName} " " ${baseDestFolder} /sdcard/"
18
+
19
+ # Backing up to /sdcard/data and /sdcard/media would have been more intuitive
20
+ # But: media was added later and migrating data would be too much effort for me right now
21
+ backupFolder " /sdcard/Android/media/${packageName} " " ${baseDestFolder} /sdcard-media/"
22
+ else
23
+ backupTermux " $@ "
24
+ fi
22
25
fi
23
26
24
27
if [[ " ${DATA} " != ' true' ]]; then
25
- # Backup all APKs from path (can be multiple for split-apks!)
26
- apkPath=$( dirname " $( sudo pm path " $packageName " | head -n1 | sed ' s/package://' ) " )
27
- # Only sync APKs, libs, etc are extracted during install
28
- # shellcheck disable=SC2046
29
- # This might return multiple parameters that we don't want quoted here
30
- doSync " $apkPath /" " $baseDestFolder /" $( includeOnlyApk)
28
+ # Backup all APKs from path (can be multiple for split-apks!)
29
+ apkPath=$( dirname " $( sudo pm path " $packageName " | head -n1 | sed ' s/package://' ) " )
30
+ # Only sync APKs, libs, etc are extracted during install
31
+ # shellcheck disable=SC2046
32
+ # This might return multiple parameters that we don't want quoted here
33
+ doSync " $apkPath /" " $baseDestFolder /" $( includeOnlyApk)
31
34
fi
32
35
}
33
36
37
+ function backupTermux() {
38
+ local tmpFolder packageName=" $1 "
39
+ local baseDestFolder=" $2 /$1 "
40
+ # Create in HOME, because usr/tmp is part of the backup
41
+ # For local backups we could get rid of the temp folder, but this would make the code more complicated
42
+ tmpFolder=$( mktemp -d " --tmpdir=$HOME " )
43
+
44
+ backupFolder " /data/data/${packageName} /files/home" " ${baseDestFolder} /data/files/home"
45
+
46
+ trace " Writing termux.tgz to ${tmpFolder} "
47
+ trap " rm -rf ${tmpFolder} " 0
48
+ termux-backup " ${tmpFolder} /termux.tgz"
49
+ doSync " ${tmpFolder} /termux.tgz" " ${baseDestFolder} /"
50
+
51
+ rm -rf " ${tmpFolder} "
52
+ }
53
+
34
54
function backupFolder() {
35
55
srcFolder=" $1 "
36
56
rootDestFolder=" $2 "
@@ -60,35 +80,63 @@ function restoreApp() {
60
80
fi
61
81
62
82
if [[ " ${APK} " != ' true' ]]; then
63
- user=$( sudo stat -c ' %U' " /data/data/$packageName " )
64
- group=$( sudo stat -c ' %G' " /data/data/$packageName " )
83
+ user=$( sudo stat -c ' %U' " /data/data/${ packageName} " )
84
+ group=$( sudo stat -c ' %G' " /data/data/${ packageName} " )
65
85
66
- restoreFolder " ${rootSrcFolder} " " data" " /data/data"
86
+ if [[ " ${packageName} " != ' com.termux' ]]; then
87
+ restoreFolder " ${rootSrcFolder} " " data" " /data/data"
67
88
68
- restoreFolder " ${rootSrcFolder} " " sdcard" " /sdcard/Android/data"
89
+ restoreFolder " ${rootSrcFolder} " " sdcard" " /sdcard/Android/data"
69
90
70
- restoreFolder " ${rootSrcFolder} " " sdcard-media" " /sdcard/Android/media"
91
+ restoreFolder " ${rootSrcFolder} " " sdcard-media" " /sdcard/Android/media"
92
+ else
93
+ restoreTermux " $@ "
94
+ fi
71
95
fi
72
96
}
73
97
98
+ function restoreTermux() {
99
+ local tmpFolder rootSrcFolder=" $1 "
100
+
101
+ restoreFolder " ${rootSrcFolder} " " data/files/home" " /data/data"
102
+
103
+ # Create in HOME, because usr/tmp is part of the restore.
104
+ # This might not be strictly necessary here but, still might avoid trouble
105
+ # For restores from local source we could get rid of the temp folder, but this would make the code more complicated
106
+ tmpFolder=$( mktemp -d " --tmpdir=$HOME " )
107
+
108
+ trace " Fetching termux.tgz to ${tmpFolder} "
109
+ trap " rm -rf ${tmpFolder} " 0
110
+ doSync " ${rootSrcFolder} /termux.tgz" " ${tmpFolder} " ' --include=*.tgz'
111
+ sudo chown -R " $( id -u) :$( id -g) " " ${tmpFolder} "
112
+ rm -rf " ${tmpFolder} "
113
+
114
+ trace " Restoring termux from ${tmpFolder} "
115
+ termux-restore " ${tmpFolder} /termux.tgz"
116
+
117
+ info " Restored termux. Pleas restart termux app."
118
+ info " Optional: if you used a shell other than bash, set it as default again, e.g. chsh zsh"
119
+ }
120
+
74
121
function restoreFolder() {
75
122
# e.g. /folder/com.nxp.taginfolite
76
123
# or remote:/folder/com.nxp.taginfolite
77
124
# or remote:/folder/com.nxp.taginfolite/
78
125
local packageName rootSrcFolder=" $1 "
79
126
# e.g. com.nxp.taginfolite
80
127
packageName=$( extractAppNameFromFolder " $rootSrcFolder " )
81
- # e.g. data
128
+ # e.g. data or data/foo/bar
82
129
local relativeSrcFolder=" $2 "
130
+ # e.g. '' or 'foo/bar'
131
+ local subFolder=' '
132
+ [[ " ${relativeSrcFolder} " == * /* ]] && subFolder=" /${relativeSrcFolder#*/ } "
83
133
# e.g. /data/data
84
134
local rootDestFolder=" $3 "
85
135
86
-
87
136
# e.g. /folder/com.nxp.taginfolite/data/
88
137
local actualSrcFolder=" ${rootSrcFolder} /${relativeSrcFolder} "
89
138
# e.g. /data/data/com.nxp.taginfolite
90
- local actualDestFolder=" ${rootDestFolder} /${packageName} "
91
-
139
+ local actualDestFolder=" ${rootDestFolder} /${packageName}${subFolder} "
92
140
93
141
if [[ " $( checkActualSourceFolderExists " ${actualSrcFolder} " ) " == ' true' ]]; then
94
142
trace " Restoring data to ${actualDestFolder} "
@@ -101,8 +149,7 @@ function restoreFolder() {
101
149
fi
102
150
else
103
151
info " Backup does not contain folder '${actualSrcFolder} '. Skipping"
104
- fi
105
-
152
+ fi
106
153
}
107
154
108
155
function extractAppNameFromFolder() {
@@ -160,6 +207,7 @@ function backupFolderSyncArgs() {
160
207
}
161
208
162
209
function includeOnlyApk() {
210
+ # TODO simplify using '--include=*.apk'?
163
211
if [[ " ${RCLONE} " == ' true' ]]; then
164
212
# Avoid fuss with whitespaces inside the filter rules by importing them from a file
165
213
echo --filter-from=" ${LIB_DIR} /rclone-apk-filter.txt"
0 commit comments