react-native-bspatch 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/ota/storage/GitHubRawStorage.js +9 -2
- package/lib/commonjs/ota/storage/GitHubRawStorage.js.map +1 -1
- package/lib/module/ota/storage/GitHubRawStorage.js +9 -2
- package/lib/module/ota/storage/GitHubRawStorage.js.map +1 -1
- package/lib/typescript/ota/storage/GitHubRawStorage.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/ota/storage/GitHubRawStorage.ts +10 -4
- package/tools/build_ota.sh +0 -2
- package/tools/setup_project.js +45 -12
- package/tools/upload_ota_custom.sh +9 -0
|
@@ -28,6 +28,12 @@ const NO_CACHE_HEADERS = {
|
|
|
28
28
|
|
|
29
29
|
/** Append a timestamp query param to defeat CDN caches on mutable URLs */
|
|
30
30
|
const bustCache = url => `${url}?cb=${Date.now()}`;
|
|
31
|
+
const normalizeChannel = channel => {
|
|
32
|
+
const lower = channel.toLowerCase();
|
|
33
|
+
if (lower === 'dev') return 'development';
|
|
34
|
+
if (lower === 'prod') return 'production';
|
|
35
|
+
return lower;
|
|
36
|
+
};
|
|
31
37
|
class GitHubRawStorageProvider {
|
|
32
38
|
async fetchManifest(config) {
|
|
33
39
|
if (!config.customServer) return config.bundledPatches || [];
|
|
@@ -36,6 +42,7 @@ class GitHubRawStorageProvider {
|
|
|
36
42
|
channel,
|
|
37
43
|
baseFolder = 'ota'
|
|
38
44
|
} = config.customServer;
|
|
45
|
+
const channelName = normalizeChannel(channel);
|
|
39
46
|
const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
40
47
|
// Cache-bust: registry is mutable; must always fetch the latest version
|
|
41
48
|
const registryUrl = bustCache(`${normalizedBaseUrl}/${baseFolder}/ota_registry.json`);
|
|
@@ -46,7 +53,7 @@ class GitHubRawStorageProvider {
|
|
|
46
53
|
}
|
|
47
54
|
const registry = typeof res.data === 'string' ? JSON.parse(res.data) : res.data;
|
|
48
55
|
const appGroup = registry?.apps?.[config.appVersion];
|
|
49
|
-
const flavorGroup = appGroup?.flavors?.[
|
|
56
|
+
const flavorGroup = appGroup?.flavors?.[channelName];
|
|
50
57
|
if (!flavorGroup?.patches?.length) {
|
|
51
58
|
return config.bundledPatches || [];
|
|
52
59
|
}
|
|
@@ -66,7 +73,7 @@ class GitHubRawStorageProvider {
|
|
|
66
73
|
channel
|
|
67
74
|
} = config.customServer;
|
|
68
75
|
const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
69
|
-
const channelName = channel
|
|
76
|
+
const channelName = normalizeChannel(channel);
|
|
70
77
|
|
|
71
78
|
// Cache-bust: patch files are versioned by name but GitHub CDN may
|
|
72
79
|
// serve a stale 404 response for newly uploaded files within 5 min.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_reactNativeBlobUtil","_interopRequireDefault","e","__esModule","default","NO_CACHE_HEADERS","bustCache","url","Date","now","GitHubRawStorageProvider","fetchManifest","config","customServer","bundledPatches","baseUrl","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_reactNativeBlobUtil","_interopRequireDefault","e","__esModule","default","NO_CACHE_HEADERS","bustCache","url","Date","now","normalizeChannel","channel","lower","toLowerCase","GitHubRawStorageProvider","fetchManifest","config","customServer","bundledPatches","baseUrl","baseFolder","channelName","normalizedBaseUrl","endsWith","slice","registryUrl","res","ReactNativeBlobUtil","fetch","respInfo","status","Error","registry","data","JSON","parse","appGroup","apps","appVersion","flavorGroup","flavors","patches","length","filter","p","platform","Platform","OS","error","console","warn","message","getUpdateFileUrl","filename","getAssetUrl","hash","ext","exports"],"sourceRoot":"../../../../src","sources":["ota/storage/GitHubRawStorage.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAyD,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAMG,gBAAgB,GAAG;EAAE,eAAe,EAAE;AAAW,CAAC;;AAExD;AACA,MAAMC,SAAS,GAAIC,GAAW,IAC1B,GAAGA,GAAG,OAAOC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE;AAE7B,MAAMC,gBAAgB,GAAIC,OAAe,IAAa;EAClD,MAAMC,KAAK,GAAGD,OAAO,CAACE,WAAW,CAAC,CAAC;EACnC,IAAID,KAAK,KAAK,KAAK,EAAE,OAAO,aAAa;EACzC,IAAIA,KAAK,KAAK,MAAM,EAAE,OAAO,YAAY;EACzC,OAAOA,KAAK;AAChB,CAAC;AAEM,MAAME,wBAAwB,CAA+B;EAChE,MAAMC,aAAaA,CAACC,MAAiB,EAAuB;IACxD,IAAI,CAACA,MAAM,CAACC,YAAY,EAAE,OAAOD,MAAM,CAACE,cAAc,IAAI,EAAE;IAE5D,MAAM;MAAEC,OAAO;MAAER,OAAO;MAAES,UAAU,GAAG;IAAM,CAAC,GAAGJ,MAAM,CAACC,YAAY;IACpE,MAAMI,WAAW,GAAGX,gBAAgB,CAACC,OAAO,CAAC;IAC7C,MAAMW,iBAAiB,GAAGH,OAAO,CAACI,QAAQ,CAAC,GAAG,CAAC,GACzCJ,OAAO,CAACK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACpBL,OAAO;IACb;IACA,MAAMM,WAAW,GAAGnB,SAAS,CACzB,GAAGgB,iBAAiB,IAAIF,UAAU,oBACtC,CAAC;IAED,IAAI;MACA,MAAMM,GAAG,GAAG,MAAMC,4BAAmB,CAACC,KAAK,CACvC,KAAK,EACLH,WAAW,EACXpB,gBACJ,CAAC;MACD,IAAIqB,GAAG,CAACG,QAAQ,CAACC,MAAM,KAAK,GAAG,EAAE;QAC7B,MAAM,IAAIC,KAAK,CACX,qCAAqCL,GAAG,CAACG,QAAQ,CAACC,MAAM,EAC5D,CAAC;MACL;MAEA,MAAME,QAAQ,GACV,OAAON,GAAG,CAACO,IAAI,KAAK,QAAQ,GACtBC,IAAI,CAACC,KAAK,CAACT,GAAG,CAACO,IAAI,CAAC,GACpBP,GAAG,CAACO,IAAI;MAElB,MAAMG,QAAQ,GAAGJ,QAAQ,EAAEK,IAAI,GAAGrB,MAAM,CAACsB,UAAU,CAAC;MACpD,MAAMC,WAAW,GAAGH,QAAQ,EAAEI,OAAO,GAAGnB,WAAW,CAAC;MAEpD,IAAI,CAACkB,WAAW,EAAEE,OAAO,EAAEC,MAAM,EAAE;QAC/B,OAAO1B,MAAM,CAACE,cAAc,IAAI,EAAE;MACtC;MAEA,OAAO,CAACqB,WAAW,CAACE,OAAO,IAAI,EAAE,EAAEE,MAAM,CACpCC,CAAW,IACR,CAACA,CAAC,CAACC,QAAQ,IACXD,CAAC,CAACC,QAAQ,CAAChC,WAAW,CAAC,CAAC,KAAKiC,qBAAQ,CAACC,EAAE,CAAClC,WAAW,CAAC,CAC7D,CAAC;IACL,CAAC,CAAC,OAAOmC,KAAK,EAAE;MACZC,OAAO,CAACC,IAAI,CACR,0CAA0C,EACzCF,KAAK,CAAWG,OACrB,CAAC;MACD,OAAOnC,MAAM,CAACE,cAAc,IAAI,EAAE;IACtC;EACJ;EAEA,MAAMkC,gBAAgBA,CAClBC,QAAgB,EAChBrC,MAAiB,EACF;IACf,IAAI,CAACA,MAAM,CAACC,YAAY,EAAE;MACtB,MAAM,IAAIc,KAAK,CAAC,oCAAoC,CAAC;IACzD;IAEA,MAAM;MAAEZ,OAAO;MAAEC,UAAU,GAAG,KAAK;MAAET;IAAQ,CAAC,GAAGK,MAAM,CAACC,YAAY;IACpE,MAAMK,iBAAiB,GAAGH,OAAO,CAACI,QAAQ,CAAC,GAAG,CAAC,GACzCJ,OAAO,CAACK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACpBL,OAAO;IACb,MAAME,WAAW,GAAGX,gBAAgB,CAACC,OAAO,CAAC;;IAE7C;IACA;IACA,OAAOL,SAAS,CACZ,GAAGgB,iBAAiB,IAAIF,UAAU,IAAIJ,MAAM,CAACsB,UAAU,IAAIjB,WAAW,IAAIgC,QAAQ,EACtF,CAAC;EACL;EAEA,MAAMC,WAAWA,CACbC,IAAY,EACZC,GAAW,EACXxC,MAAiB,EACF;IACf,IAAI,CAACA,MAAM,CAACC,YAAY,EAAE,OAAO,EAAE;IAEnC,MAAM;MAAEE,OAAO;MAAEC,UAAU,GAAG;IAAM,CAAC,GAAGJ,MAAM,CAACC,YAAY;IAC3D,MAAMK,iBAAiB,GAAGH,OAAO,CAACI,QAAQ,CAAC,GAAG,CAAC,GACzCJ,OAAO,CAACK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACpBL,OAAO;;IAEb;IACA,OAAO,GAAGG,iBAAiB,IAAIF,UAAU,WAAWmC,IAAI,IAAIC,GAAG,EAAE;EACrE;AACJ;AAACC,OAAA,CAAA3C,wBAAA,GAAAA,wBAAA","ignoreList":[]}
|
|
@@ -23,6 +23,12 @@ const NO_CACHE_HEADERS = {
|
|
|
23
23
|
|
|
24
24
|
/** Append a timestamp query param to defeat CDN caches on mutable URLs */
|
|
25
25
|
const bustCache = url => `${url}?cb=${Date.now()}`;
|
|
26
|
+
const normalizeChannel = channel => {
|
|
27
|
+
const lower = channel.toLowerCase();
|
|
28
|
+
if (lower === 'dev') return 'development';
|
|
29
|
+
if (lower === 'prod') return 'production';
|
|
30
|
+
return lower;
|
|
31
|
+
};
|
|
26
32
|
export class GitHubRawStorageProvider {
|
|
27
33
|
async fetchManifest(config) {
|
|
28
34
|
if (!config.customServer) return config.bundledPatches || [];
|
|
@@ -31,6 +37,7 @@ export class GitHubRawStorageProvider {
|
|
|
31
37
|
channel,
|
|
32
38
|
baseFolder = 'ota'
|
|
33
39
|
} = config.customServer;
|
|
40
|
+
const channelName = normalizeChannel(channel);
|
|
34
41
|
const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
35
42
|
// Cache-bust: registry is mutable; must always fetch the latest version
|
|
36
43
|
const registryUrl = bustCache(`${normalizedBaseUrl}/${baseFolder}/ota_registry.json`);
|
|
@@ -41,7 +48,7 @@ export class GitHubRawStorageProvider {
|
|
|
41
48
|
}
|
|
42
49
|
const registry = typeof res.data === 'string' ? JSON.parse(res.data) : res.data;
|
|
43
50
|
const appGroup = registry?.apps?.[config.appVersion];
|
|
44
|
-
const flavorGroup = appGroup?.flavors?.[
|
|
51
|
+
const flavorGroup = appGroup?.flavors?.[channelName];
|
|
45
52
|
if (!flavorGroup?.patches?.length) {
|
|
46
53
|
return config.bundledPatches || [];
|
|
47
54
|
}
|
|
@@ -61,7 +68,7 @@ export class GitHubRawStorageProvider {
|
|
|
61
68
|
channel
|
|
62
69
|
} = config.customServer;
|
|
63
70
|
const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
64
|
-
const channelName = channel
|
|
71
|
+
const channelName = normalizeChannel(channel);
|
|
65
72
|
|
|
66
73
|
// Cache-bust: patch files are versioned by name but GitHub CDN may
|
|
67
74
|
// serve a stale 404 response for newly uploaded files within 5 min.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","ReactNativeBlobUtil","NO_CACHE_HEADERS","bustCache","url","Date","now","GitHubRawStorageProvider","fetchManifest","config","customServer","bundledPatches","baseUrl","
|
|
1
|
+
{"version":3,"names":["Platform","ReactNativeBlobUtil","NO_CACHE_HEADERS","bustCache","url","Date","now","normalizeChannel","channel","lower","toLowerCase","GitHubRawStorageProvider","fetchManifest","config","customServer","bundledPatches","baseUrl","baseFolder","channelName","normalizedBaseUrl","endsWith","slice","registryUrl","res","fetch","respInfo","status","Error","registry","data","JSON","parse","appGroup","apps","appVersion","flavorGroup","flavors","patches","length","filter","p","platform","OS","error","console","warn","message","getUpdateFileUrl","filename","getAssetUrl","hash","ext"],"sourceRoot":"../../../../src","sources":["ota/storage/GitHubRawStorage.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubRawStorage.d.ts","sourceRoot":"","sources":["../../../../src/ota/storage/GitHubRawStorage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"GitHubRawStorage.d.ts","sourceRoot":"","sources":["../../../../src/ota/storage/GitHubRawStorage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AA8BxE,qBAAa,wBAAyB,YAAW,kBAAkB;IACzD,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmDrD,gBAAgB,CAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAClB,OAAO,CAAC,MAAM,CAAC;IAkBZ,WAAW,CACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,GAClB,OAAO,CAAC,MAAM,CAAC;CAWrB"}
|
package/package.json
CHANGED
|
@@ -23,11 +23,19 @@ const NO_CACHE_HEADERS = { 'Cache-Control': 'no-cache' };
|
|
|
23
23
|
const bustCache = (url: string): string =>
|
|
24
24
|
`${url}?cb=${Date.now()}`;
|
|
25
25
|
|
|
26
|
+
const normalizeChannel = (channel: string): string => {
|
|
27
|
+
const lower = channel.toLowerCase();
|
|
28
|
+
if (lower === 'dev') return 'development';
|
|
29
|
+
if (lower === 'prod') return 'production';
|
|
30
|
+
return lower;
|
|
31
|
+
};
|
|
32
|
+
|
|
26
33
|
export class GitHubRawStorageProvider implements OtaStorageProvider {
|
|
27
34
|
async fetchManifest(config: OtaConfig): Promise<OtaPatch[]> {
|
|
28
35
|
if (!config.customServer) return config.bundledPatches || [];
|
|
29
36
|
|
|
30
37
|
const { baseUrl, channel, baseFolder = 'ota' } = config.customServer;
|
|
38
|
+
const channelName = normalizeChannel(channel);
|
|
31
39
|
const normalizedBaseUrl = baseUrl.endsWith('/')
|
|
32
40
|
? baseUrl.slice(0, -1)
|
|
33
41
|
: baseUrl;
|
|
@@ -54,9 +62,7 @@ export class GitHubRawStorageProvider implements OtaStorageProvider {
|
|
|
54
62
|
: res.data;
|
|
55
63
|
|
|
56
64
|
const appGroup = registry?.apps?.[config.appVersion];
|
|
57
|
-
const flavorGroup =
|
|
58
|
-
appGroup?.flavors?.[channel.toLowerCase()] ||
|
|
59
|
-
appGroup?.flavors?.development;
|
|
65
|
+
const flavorGroup = appGroup?.flavors?.[channelName];
|
|
60
66
|
|
|
61
67
|
if (!flavorGroup?.patches?.length) {
|
|
62
68
|
return config.bundledPatches || [];
|
|
@@ -88,7 +94,7 @@ export class GitHubRawStorageProvider implements OtaStorageProvider {
|
|
|
88
94
|
const normalizedBaseUrl = baseUrl.endsWith('/')
|
|
89
95
|
? baseUrl.slice(0, -1)
|
|
90
96
|
: baseUrl;
|
|
91
|
-
const channelName = channel
|
|
97
|
+
const channelName = normalizeChannel(channel);
|
|
92
98
|
|
|
93
99
|
// Cache-bust: patch files are versioned by name but GitHub CDN may
|
|
94
100
|
// serve a stale 404 response for newly uploaded files within 5 min.
|
package/tools/build_ota.sh
CHANGED
|
@@ -254,7 +254,6 @@ fi
|
|
|
254
254
|
|
|
255
255
|
# ── Reset ─────────────────────────────────────────────────────────────────────
|
|
256
256
|
if [ "$ACTION" = "reset" ]; then
|
|
257
|
-
FLAVOR_LOWER=$(echo "$FLAVOR" | tr '[:upper:]' '[:lower:]')
|
|
258
257
|
echo "Resetting OTA registry and output for flavor '$FLAVOR_LOWER'..."
|
|
259
258
|
|
|
260
259
|
# Reset only the specific flavor in registry JSON if registry exists
|
|
@@ -523,4 +522,3 @@ echo "=== All Builds Complete ==="
|
|
|
523
522
|
|
|
524
523
|
|
|
525
524
|
|
|
526
|
-
|
package/tools/setup_project.js
CHANGED
|
@@ -85,6 +85,22 @@ const IOS_BUNDLE_URL_OVERRIDE = `
|
|
|
85
85
|
const ANDROID_IMPORT = 'import vn.reactnativebspatch.OtaBundleResolver';
|
|
86
86
|
const ANDROID_JS_BUNDLE = 'jsBundleFilePath = OtaBundleResolver.resolve(applicationContext)';
|
|
87
87
|
|
|
88
|
+
function findClosingParen(source, openParenIdx) {
|
|
89
|
+
let depth = 0;
|
|
90
|
+
for (let i = openParenIdx; i < source.length; i += 1) {
|
|
91
|
+
const char = source[i];
|
|
92
|
+
if (char === '(') {
|
|
93
|
+
depth += 1;
|
|
94
|
+
} else if (char === ')') {
|
|
95
|
+
depth -= 1;
|
|
96
|
+
if (depth === 0) {
|
|
97
|
+
return i;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return -1;
|
|
102
|
+
}
|
|
103
|
+
|
|
88
104
|
// ── iOS: project.pbxproj ─────────────────────────────────────────────────────
|
|
89
105
|
|
|
90
106
|
function patchPbxproj(content) {
|
|
@@ -172,18 +188,35 @@ function patchMainApplication(content) {
|
|
|
172
188
|
|
|
173
189
|
// 2. Add jsBundleFilePath if missing
|
|
174
190
|
if (!result.includes('OtaBundleResolver.resolve')) {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
191
|
+
const hostCallMatch = result.match(/getDefaultReactHost\s*\(/);
|
|
192
|
+
if (hostCallMatch && hostCallMatch.index !== undefined) {
|
|
193
|
+
const hostCallStart = hostCallMatch.index;
|
|
194
|
+
const openParenIdx = result.indexOf('(', hostCallStart);
|
|
195
|
+
const closeIdx =
|
|
196
|
+
openParenIdx === -1
|
|
197
|
+
? -1
|
|
198
|
+
: findClosingParen(result, openParenIdx);
|
|
199
|
+
|
|
200
|
+
if (closeIdx === -1) {
|
|
201
|
+
console.log(' ⚠ Could not find the closing parenthesis for getDefaultReactHost(...). Please add jsBundleFilePath manually.');
|
|
202
|
+
} else {
|
|
203
|
+
const trailingWhitespaceMatch = result
|
|
204
|
+
.slice(0, closeIdx)
|
|
205
|
+
.match(/\s*$/);
|
|
206
|
+
const trailingWhitespace =
|
|
207
|
+
trailingWhitespaceMatch?.[0] ?? '';
|
|
208
|
+
const insertIdx = closeIdx - trailingWhitespace.length;
|
|
209
|
+
const beforeClose = result.slice(0, insertIdx).trimEnd();
|
|
210
|
+
const separator = beforeClose.endsWith(',') ? '\n' : ',\n';
|
|
211
|
+
result =
|
|
212
|
+
result.slice(0, insertIdx) +
|
|
213
|
+
separator +
|
|
214
|
+
' ' +
|
|
215
|
+
ANDROID_JS_BUNDLE +
|
|
216
|
+
trailingWhitespace +
|
|
217
|
+
result.slice(closeIdx);
|
|
218
|
+
changed = true;
|
|
219
|
+
}
|
|
187
220
|
} else {
|
|
188
221
|
console.log(' ⚠ Could not find getDefaultReactHost(...) call. Please add jsBundleFilePath manually.');
|
|
189
222
|
}
|
|
@@ -107,6 +107,15 @@ if [[ "$BASE_URL" == *"github"* ]] || [[ "$BASE_URL" == *"raw.githubusercontent"
|
|
|
107
107
|
for FILE in "$OUTPUT_DIR"/*_${CHANNEL}.json "$OUTPUT_DIR"/*_${CHANNEL}.hbc "$OUTPUT_DIR"/*_${CHANNEL}_*.patch "$OUTPUT_DIR"/*_${CHANNEL}.patch; do
|
|
108
108
|
[[ -f "$FILE" ]] || continue
|
|
109
109
|
FNAME=$(basename "$FILE")
|
|
110
|
+
if [[ "$FNAME" == "patch_"* ]] || [[ "$FNAME" == "bundle_"* ]]; then
|
|
111
|
+
if [[ "$FNAME" != *"_${APP_VERSION}_"* ]]; then
|
|
112
|
+
continue
|
|
113
|
+
fi
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
if [[ "$FNAME" != *"_${APP_VERSION}_"* ]] && [[ "$FNAME" != *"_${CHANNEL}_"* ]] && [[ "$FNAME" != "asset-manifest"* ]] && [[ "$FNAME" != "base-assets"* ]]; then
|
|
117
|
+
continue
|
|
118
|
+
fi
|
|
110
119
|
cp "$FILE" "$TARGET_RELEASE_DIR/$FNAME"
|
|
111
120
|
done
|
|
112
121
|
|