@@ -166,9 +166,9 @@ proto.downloadPackageAndExtract = function (workDirectoryPath, packageHash, blob
166
166
return dataCenterManager . getPackageInfo ( packageHash ) ;
167
167
} else {
168
168
var downloadURL = common . getBlobDownloadUrl ( blobHash ) ;
169
- return common . createFileFromRequest ( downloadURL , ` ${ workDirectoryPath } / ${ blobHash } ` )
169
+ return common . createFileFromRequest ( downloadURL , path . join ( workDirectoryPath , blobHash ) )
170
170
. then ( ( download ) => {
171
- return common . unzipFile ( ` ${ workDirectoryPath } / ${ blobHash } ` , ` ${ workDirectoryPath } / current` )
171
+ return common . unzipFile ( path . join ( workDirectoryPath , blobHash ) , path . join ( workDirectoryPath , ' current' ) )
172
172
. then ( ( outputPath ) => {
173
173
return dataCenterManager . storePackage ( outputPath , true ) ;
174
174
} ) ;
@@ -193,14 +193,22 @@ proto.zipDiffPackage = function (fileName, files, baseDirectoryPath, hotCodePush
193
193
} ) ;
194
194
for ( var i = 0 ; i < files . length ; ++ i ) {
195
195
var file = files [ i ] ;
196
- zipFile . addFile ( ` ${ baseDirectoryPath } / ${ file } ` , slash ( file ) ) ;
196
+ zipFile . addFile ( path . join ( baseDirectoryPath , file ) , slash ( file ) ) ;
197
197
}
198
198
zipFile . addFile ( hotCodePushFile , constConfig . DIFF_MANIFEST_FILE_NAME ) ;
199
199
zipFile . end ( ) ;
200
200
} ) ;
201
201
}
202
202
203
- proto . generateOneDiffPackage = function ( workDirectoryPath , packageId , dataCenter , diffPackageHash , diffManifestBlobHash ) {
203
+ proto . generateOneDiffPackage = function (
204
+ workDirectoryPath ,
205
+ packageId ,
206
+ originDataCenter ,
207
+ oldPackageDataCenter ,
208
+ diffPackageHash ,
209
+ diffManifestBlobHash ,
210
+ isUseDiffText
211
+ ) {
204
212
var self = this ;
205
213
return models . PackagesDiff . findOne ( {
206
214
where :{
@@ -212,24 +220,53 @@ proto.generateOneDiffPackage = function (workDirectoryPath, packageId, dataCente
212
220
if ( ! _ . isEmpty ( diffPackage ) ) {
213
221
return ;
214
222
}
223
+ log . debug ( 'originDataCenter' , originDataCenter ) ;
224
+ log . debug ( 'oldPackageDataCenter' , oldPackageDataCenter ) ;
215
225
var downloadURL = common . getBlobDownloadUrl ( diffManifestBlobHash ) ;
216
- return common . createFileFromRequest ( downloadURL , ` ${ workDirectoryPath } / ${ diffManifestBlobHash } ` )
226
+ return common . createFileFromRequest ( downloadURL , path . join ( workDirectoryPath , diffManifestBlobHash ) )
217
227
. then ( ( ) => {
218
- var originContentPath = dataCenter . contentPath ;
219
- var originManifestJson = JSON . parse ( fs . readFileSync ( dataCenter . manifestFilePath , "utf8" ) )
220
- var diffManifestJson = JSON . parse ( fs . readFileSync ( `${ workDirectoryPath } /${ diffManifestBlobHash } ` , "utf8" ) )
228
+ var dataCenterContentPath = path . join ( workDirectoryPath , 'dataCenter' ) ;
229
+ common . copySync ( originDataCenter . contentPath , dataCenterContentPath ) ;
230
+ var oldPackageDataCenterContentPath = oldPackageDataCenter . contentPath ;
231
+ var originManifestJson = JSON . parse ( fs . readFileSync ( originDataCenter . manifestFilePath , "utf8" ) )
232
+ var diffManifestJson = JSON . parse ( fs . readFileSync ( path . join ( workDirectoryPath , diffManifestBlobHash ) , "utf8" ) )
221
233
var json = common . diffCollectionsSync ( originManifestJson , diffManifestJson ) ;
222
234
var files = _ . concat ( json . diff , json . collection1Only ) ;
223
- var hotcodepush = { deletedFiles : json . collection2Only } ;
224
- var hotCodePushFile = `${ workDirectoryPath } /${ diffManifestBlobHash } _hotcodepush` ;
235
+ var hotcodepush = { deletedFiles : json . collection2Only , patchedFiles :[ ] } ;
236
+ if ( isUseDiffText == constConfig . IS_USE_DIFF_TEXT_YES ) {
237
+ //使用google diff-match-patch
238
+ _ . forEach ( json . diff , function ( tmpFilePath ) {
239
+ var dataCenterContentPathTmpFilePath = path . join ( dataCenterContentPath , tmpFilePath ) ;
240
+ var oldPackageDataCenterContentPathTmpFilePath = path . join ( oldPackageDataCenterContentPath , tmpFilePath ) ;
241
+ if (
242
+ fs . existsSync ( dataCenterContentPathTmpFilePath )
243
+ && fs . existsSync ( oldPackageDataCenterContentPathTmpFilePath )
244
+ && common . detectIsTextFile ( dataCenterContentPathTmpFilePath )
245
+ && common . detectIsTextFile ( oldPackageDataCenterContentPathTmpFilePath )
246
+ ) {
247
+ var textOld = fs . readFileSync ( oldPackageDataCenterContentPathTmpFilePath , 'utf-8' ) ;
248
+ var textNew = fs . readFileSync ( dataCenterContentPathTmpFilePath , 'utf-8' ) ;
249
+ if ( ! textOld || ! textNew ) {
250
+ return ;
251
+ }
252
+ var DiffMatchPatch = require ( 'diff-match-patch' ) ;
253
+ var dmp = new DiffMatchPatch ( ) ;
254
+ var patchs = dmp . patch_make ( textOld , textNew ) ;
255
+ var patchText = dmp . patch_toText ( patchs ) ;
256
+ if ( patchText && patchText . length < _ . parseInt ( textNew . length * 0.8 ) ) {
257
+ fs . writeFileSync ( dataCenterContentPathTmpFilePath , patchText ) ;
258
+ hotcodepush . patchedFiles . push ( tmpFilePath ) ;
259
+ }
260
+ }
261
+ } ) ;
262
+ }
263
+ var hotCodePushFile = path . join ( workDirectoryPath , `${ diffManifestBlobHash } _hotcodepush` ) ; ;
225
264
fs . writeFileSync ( hotCodePushFile , JSON . stringify ( hotcodepush ) ) ;
226
- var fileName = `${ workDirectoryPath } /${ diffManifestBlobHash } .zip` ;
227
-
228
- return self . zipDiffPackage ( fileName , files , originContentPath , hotCodePushFile )
265
+ var fileName = path . join ( workDirectoryPath , `${ diffManifestBlobHash } .zip` ) ; ;
266
+ return self . zipDiffPackage ( fileName , files , dataCenterContentPath , hotCodePushFile )
229
267
. then ( ( data ) => {
230
268
return security . qetag ( data . path )
231
269
. then ( ( diffHash ) => {
232
- log . debug ( 'diff' ) ;
233
270
return common . uploadFileToStorage ( diffHash , fileName )
234
271
. then ( ( ) => {
235
272
var stats = fs . statSync ( fileName ) ;
@@ -246,40 +283,36 @@ proto.generateOneDiffPackage = function (workDirectoryPath, packageId, dataCente
246
283
} ) ;
247
284
} ;
248
285
249
- proto . createDiffPackagesByLastNums = function ( packageId , num ) {
286
+ proto . createDiffPackagesByLastNums = function ( appId , originalPackage , num ) {
250
287
var self = this ;
251
- return models . Packages . findById ( packageId )
252
- . then ( ( originalPackage ) => {
253
- if ( _ . isEmpty ( originalPackage ) ) {
254
- throw AppError . AppError ( 'can\'t find Package' ) ;
255
- }
256
- var Sequelize = require ( 'sequelize' ) ;
257
- return Promise . all ( [
258
- models . Packages . findAll ( {
259
- where :{
260
- deployment_version_id : originalPackage . deployment_version_id ,
261
- id : { [ Sequelize . Op . lt ] : packageId } } ,
262
- order : [ [ 'id' , 'desc' ] ] ,
263
- limit : num
264
- } ) ,
265
- models . Packages . findAll ( {
266
- where :{
267
- deployment_version_id : originalPackage . deployment_version_id ,
268
- id : { [ Sequelize . Op . lt ] : packageId } } ,
269
- order : [ [ 'id' , 'asc' ] ] ,
270
- limit : 2
271
- } )
272
- ] )
273
- . spread ( ( lastNumsPackages , basePackages ) => {
274
- return _ . unionBy ( lastNumsPackages , basePackages , 'id' ) ;
275
- } )
276
- . then ( ( lastNumsPackages ) => {
277
- return self . createDiffPackages ( originalPackage , lastNumsPackages ) ;
278
- } ) ;
288
+ var Sequelize = require ( 'sequelize' ) ;
289
+ var packageId = originalPackage . id ;
290
+ return Promise . all ( [
291
+ models . Packages . findAll ( {
292
+ where :{
293
+ deployment_version_id : originalPackage . deployment_version_id ,
294
+ id : { [ Sequelize . Op . lt ] : packageId } } ,
295
+ order : [ [ 'id' , 'desc' ] ] ,
296
+ limit : num
297
+ } ) ,
298
+ models . Packages . findAll ( {
299
+ where :{
300
+ deployment_version_id : originalPackage . deployment_version_id ,
301
+ id : { [ Sequelize . Op . lt ] : packageId } } ,
302
+ order : [ [ 'id' , 'asc' ] ] ,
303
+ limit : 2
304
+ } ) ,
305
+ models . Apps . findById ( appId ) ,
306
+ ] )
307
+ . spread ( ( lastNumsPackages , basePackages , appInfo ) => {
308
+ return [ _ . uniqBy ( _ . unionBy ( lastNumsPackages , basePackages , 'id' ) , 'package_hash' ) , appInfo ] ;
309
+ } )
310
+ . spread ( ( lastNumsPackages , appInfo ) => {
311
+ return self . createDiffPackages ( originalPackage , lastNumsPackages , _ . get ( appInfo , 'is_use_diff_text' , constConfig . IS_USE_DIFF_TEXT_NO ) ) ;
279
312
} ) ;
280
313
} ;
281
314
282
- proto . createDiffPackages = function ( originalPackage , destPackages ) {
315
+ proto . createDiffPackages = function ( originalPackage , destPackages , isUseDiffText ) {
283
316
if ( ! _ . isArray ( destPackages ) ) {
284
317
return Promise . reject ( new AppError . AppError ( '第二个参数必须是数组' ) ) ;
285
318
}
@@ -291,10 +324,26 @@ proto.createDiffPackages = function (originalPackage, destPackages) {
291
324
var manifest_blob_url = _ . get ( originalPackage , 'manifest_blob_url' ) ;
292
325
var blob_url = _ . get ( originalPackage , 'blob_url' ) ;
293
326
var workDirectoryPath = path . join ( os . tmpdir ( ) , 'codepush_' + security . randToken ( 32 ) ) ;
327
+ log . debug ( 'workDirectoryPath' , workDirectoryPath ) ;
294
328
return common . createEmptyFolder ( workDirectoryPath )
295
329
. then ( ( ) => self . downloadPackageAndExtract ( workDirectoryPath , package_hash , blob_url ) )
296
- . then ( ( dataCenter ) => Promise . map ( destPackages ,
297
- ( v ) => self . generateOneDiffPackage ( workDirectoryPath , originalPackage . id , dataCenter , v . package_hash , v . manifest_blob_url )
330
+ . then ( ( originDataCenter ) => Promise . map ( destPackages ,
331
+ ( v ) => {
332
+ var diffWorkDirectoryPath = path . join ( workDirectoryPath , _ . get ( v , 'package_hash' ) ) ;
333
+ common . createEmptyFolderSync ( diffWorkDirectoryPath ) ;
334
+ return self . downloadPackageAndExtract ( diffWorkDirectoryPath , _ . get ( v , 'package_hash' ) , _ . get ( v , 'blob_url' ) )
335
+ . then ( ( oldPackageDataCenter ) =>
336
+ self . generateOneDiffPackage (
337
+ diffWorkDirectoryPath ,
338
+ originalPackage . id ,
339
+ originDataCenter ,
340
+ oldPackageDataCenter ,
341
+ v . package_hash ,
342
+ v . manifest_blob_url ,
343
+ isUseDiffText
344
+ )
345
+ )
346
+ }
298
347
) )
299
348
. finally ( ( ) => common . deleteFolderSync ( workDirectoryPath ) ) ;
300
349
}
@@ -312,7 +361,8 @@ proto.releasePackage = function (appId, deploymentId, packageInfo, filePath, rel
312
361
var rollout = packageInfo . rollout ; //灰度百分比
313
362
var isMandatory = packageInfo . isMandatory ; //是否强制更新,无法跳过
314
363
var tmpDir = os . tmpdir ( ) ;
315
- var directoryPath = path . join ( tmpDir , 'codepush_' + security . randToken ( 32 ) ) ;
364
+ var directoryPathParent = path . join ( tmpDir , 'codepuh_' + security . randToken ( 32 ) ) ;
365
+ var directoryPath = path . join ( directoryPathParent , 'current' ) ;
316
366
log . debug ( `releasePackage generate an random dir path: ${ directoryPath } ` ) ;
317
367
return Promise . all ( [
318
368
security . qetag ( filePath ) ,
@@ -382,7 +432,7 @@ proto.releasePackage = function (appId, deploymentId, packageInfo, filePath, rel
382
432
}
383
433
return self . createPackage ( deploymentId , appVersion , packageHash , manifestHash , blobHash , params ) ;
384
434
} )
385
- . finally ( ( ) => common . deleteFolderSync ( directoryPath ) )
435
+ . finally ( ( ) => common . deleteFolderSync ( directoryPathParent ) )
386
436
} ;
387
437
388
438
proto . modifyReleasePackage = function ( packageId , params ) {
0 commit comments