@@ -166,9 +166,9 @@ proto.downloadPackageAndExtract = function (workDirectoryPath, packageHash, blob
166166 return dataCenterManager . getPackageInfo ( packageHash ) ;
167167 } else {
168168 var downloadURL = common . getBlobDownloadUrl ( blobHash ) ;
169- return common . createFileFromRequest ( downloadURL , ` ${ workDirectoryPath } / ${ blobHash } ` )
169+ return common . createFileFromRequest ( downloadURL , path . join ( workDirectoryPath , blobHash ) )
170170 . then ( ( download ) => {
171- return common . unzipFile ( ` ${ workDirectoryPath } / ${ blobHash } ` , ` ${ workDirectoryPath } / current` )
171+ return common . unzipFile ( path . join ( workDirectoryPath , blobHash ) , path . join ( workDirectoryPath , ' current' ) )
172172 . then ( ( outputPath ) => {
173173 return dataCenterManager . storePackage ( outputPath , true ) ;
174174 } ) ;
@@ -193,14 +193,22 @@ proto.zipDiffPackage = function (fileName, files, baseDirectoryPath, hotCodePush
193193 } ) ;
194194 for ( var i = 0 ; i < files . length ; ++ i ) {
195195 var file = files [ i ] ;
196- zipFile . addFile ( ` ${ baseDirectoryPath } / ${ file } ` , slash ( file ) ) ;
196+ zipFile . addFile ( path . join ( baseDirectoryPath , file ) , slash ( file ) ) ;
197197 }
198198 zipFile . addFile ( hotCodePushFile , constConfig . DIFF_MANIFEST_FILE_NAME ) ;
199199 zipFile . end ( ) ;
200200 } ) ;
201201}
202202
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+ ) {
204212 var self = this ;
205213 return models . PackagesDiff . findOne ( {
206214 where :{
@@ -212,24 +220,53 @@ proto.generateOneDiffPackage = function (workDirectoryPath, packageId, dataCente
212220 if ( ! _ . isEmpty ( diffPackage ) ) {
213221 return ;
214222 }
223+ log . debug ( 'originDataCenter' , originDataCenter ) ;
224+ log . debug ( 'oldPackageDataCenter' , oldPackageDataCenter ) ;
215225 var downloadURL = common . getBlobDownloadUrl ( diffManifestBlobHash ) ;
216- return common . createFileFromRequest ( downloadURL , ` ${ workDirectoryPath } / ${ diffManifestBlobHash } ` )
226+ return common . createFileFromRequest ( downloadURL , path . join ( workDirectoryPath , diffManifestBlobHash ) )
217227 . 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" ) )
221233 var json = common . diffCollectionsSync ( originManifestJson , diffManifestJson ) ;
222234 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` ) ; ;
225264 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 )
229267 . then ( ( data ) => {
230268 return security . qetag ( data . path )
231269 . then ( ( diffHash ) => {
232- log . debug ( 'diff' ) ;
233270 return common . uploadFileToStorage ( diffHash , fileName )
234271 . then ( ( ) => {
235272 var stats = fs . statSync ( fileName ) ;
@@ -246,40 +283,36 @@ proto.generateOneDiffPackage = function (workDirectoryPath, packageId, dataCente
246283 } ) ;
247284} ;
248285
249- proto . createDiffPackagesByLastNums = function ( packageId , num ) {
286+ proto . createDiffPackagesByLastNums = function ( appId , originalPackage , num ) {
250287 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 ) ) ;
279312 } ) ;
280313} ;
281314
282- proto . createDiffPackages = function ( originalPackage , destPackages ) {
315+ proto . createDiffPackages = function ( originalPackage , destPackages , isUseDiffText ) {
283316 if ( ! _ . isArray ( destPackages ) ) {
284317 return Promise . reject ( new AppError . AppError ( '第二个参数必须是数组' ) ) ;
285318 }
@@ -291,10 +324,26 @@ proto.createDiffPackages = function (originalPackage, destPackages) {
291324 var manifest_blob_url = _ . get ( originalPackage , 'manifest_blob_url' ) ;
292325 var blob_url = _ . get ( originalPackage , 'blob_url' ) ;
293326 var workDirectoryPath = path . join ( os . tmpdir ( ) , 'codepush_' + security . randToken ( 32 ) ) ;
327+ log . debug ( 'workDirectoryPath' , workDirectoryPath ) ;
294328 return common . createEmptyFolder ( workDirectoryPath )
295329 . 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+ }
298347 ) )
299348 . finally ( ( ) => common . deleteFolderSync ( workDirectoryPath ) ) ;
300349}
@@ -312,7 +361,8 @@ proto.releasePackage = function (appId, deploymentId, packageInfo, filePath, rel
312361 var rollout = packageInfo . rollout ; //灰度百分比
313362 var isMandatory = packageInfo . isMandatory ; //是否强制更新,无法跳过
314363 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' ) ;
316366 log . debug ( `releasePackage generate an random dir path: ${ directoryPath } ` ) ;
317367 return Promise . all ( [
318368 security . qetag ( filePath ) ,
@@ -382,7 +432,7 @@ proto.releasePackage = function (appId, deploymentId, packageInfo, filePath, rel
382432 }
383433 return self . createPackage ( deploymentId , appVersion , packageHash , manifestHash , blobHash , params ) ;
384434 } )
385- . finally ( ( ) => common . deleteFolderSync ( directoryPath ) )
435+ . finally ( ( ) => common . deleteFolderSync ( directoryPathParent ) )
386436} ;
387437
388438proto . modifyReleasePackage = function ( packageId , params ) {
0 commit comments