From af189f8a1a5b67f463a7268026d611395357a5a2 Mon Sep 17 00:00:00 2001 From: lvbingru Date: Wed, 6 Apr 2016 10:21:00 +0800 Subject: [PATCH 1/3] bug fixed --- ios/RCTHotUpdate/RCTHotUpdate.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/RCTHotUpdate/RCTHotUpdate.m b/ios/RCTHotUpdate/RCTHotUpdate.m index 539daa5..0bdf813 100644 --- a/ios/RCTHotUpdate/RCTHotUpdate.m +++ b/ios/RCTHotUpdate/RCTHotUpdate.m @@ -249,7 +249,7 @@ RCT_EXPORT_METHOD(reloadUpdate:(NSDictionary *)options) } } -RCT_EXPORT_METHOD(markSuccuss) +RCT_EXPORT_METHOD(markSuccess) { // update package info NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; From 11ef71b9784f63831924aacb4fd2ec1ab8af6a2e Mon Sep 17 00:00:00 2001 From: lvbingru Date: Wed, 6 Apr 2016 10:34:11 +0800 Subject: [PATCH 2/3] bug fixed --- ios/RCTHotUpdate/RCTHotUpdate.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/RCTHotUpdate/RCTHotUpdate.m b/ios/RCTHotUpdate/RCTHotUpdate.m index 0bdf813..2fd4619 100644 --- a/ios/RCTHotUpdate/RCTHotUpdate.m +++ b/ios/RCTHotUpdate/RCTHotUpdate.m @@ -322,7 +322,7 @@ RCT_EXPORT_METHOD(markSuccess) { NSString *sourceOrigin = [[NSBundle mainBundle] resourcePath]; NSString *bundleOrigin = [[RCTHotUpdate binaryBundleURL] path]; - [self patch:hashName romBundle:bundleOrigin source:sourceOrigin callback:callback]; + [self patch:hashName fromBundle:bundleOrigin source:sourceOrigin callback:callback]; } break; case HotUpdateTypePatchFromPpk: @@ -331,7 +331,7 @@ RCT_EXPORT_METHOD(markSuccess) NSString *sourceOrigin = lastVertionDir; NSString *bundleOrigin = [lastVertionDir stringByAppendingPathComponent:BUNDLE_FILE_NAME]; - [self patch:hashName romBundle:bundleOrigin source:sourceOrigin callback:callback]; + [self patch:hashName fromBundle:bundleOrigin source:sourceOrigin callback:callback]; } break; default: @@ -345,7 +345,7 @@ RCT_EXPORT_METHOD(markSuccess) }]; } -- (void)patch:(NSString *)hashName romBundle:(NSString *)bundleOrigin source:(NSString *)sourceOrigin callback:(void (^)(NSError *error))callback +- (void)patch:(NSString *)hashName fromBundle:(NSString *)bundleOrigin source:(NSString *)sourceOrigin callback:(void (^)(NSError *error))callback { NSString *unzipDir = [[RCTHotUpdate downloadDir] stringByAppendingPathComponent:hashName]; NSString *sourcePatch = [unzipDir stringByAppendingPathComponent:SOURCE_PATCH_NAME]; From e2e95d6a2306a7e2d332d9f64bfa21c1b9b05909 Mon Sep 17 00:00:00 2001 From: lvbingru Date: Wed, 6 Apr 2016 13:05:52 +0800 Subject: [PATCH 3/3] bug fixed --- ios/RCTHotUpdate/RCTHotUpdate.m | 7 ++- ios/RCTHotUpdate/RCTHotUpdateManager.h | 1 + ios/RCTHotUpdate/RCTHotUpdateManager.m | 63 +++++++++++++++++++++++++- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/ios/RCTHotUpdate/RCTHotUpdate.m b/ios/RCTHotUpdate/RCTHotUpdate.m index 2fd4619..1a9afa6 100644 --- a/ios/RCTHotUpdate/RCTHotUpdate.m +++ b/ios/RCTHotUpdate/RCTHotUpdate.m @@ -361,8 +361,11 @@ RCT_EXPORT_METHOD(markSuccess) callback(error); return; } + NSDictionary *copies = json[@"copies"]; - [_fileManager copyFiles:copies fromDir:sourceOrigin toDir:unzipDir completionHandler:^(NSError *error) { + NSDictionary *deletes = json[@"deletes"]; + + [_fileManager copyFiles:copies fromDir:sourceOrigin toDir:unzipDir deletes:deletes completionHandler:^(NSError *error) { if (error) { callback(error); } @@ -392,7 +395,7 @@ RCT_EXPORT_METHOD(markSuccess) for(NSString *fileName in list) { if (![fileName isEqualToString:curVersion]) { - [_fileManager removeFile:curVersion completionHandler:nil]; + [_fileManager removeFile:[downloadDir stringByAppendingPathComponent:fileName] completionHandler:nil]; } } } diff --git a/ios/RCTHotUpdate/RCTHotUpdateManager.h b/ios/RCTHotUpdate/RCTHotUpdateManager.h index 94425ce..b80ed09 100644 --- a/ios/RCTHotUpdate/RCTHotUpdateManager.h +++ b/ios/RCTHotUpdate/RCTHotUpdateManager.h @@ -26,6 +26,7 @@ - (void)copyFiles:(NSDictionary *)filesDic fromDir:(NSString *)fromDir toDir:(NSString *)toDir + deletes:(NSDictionary *)deletes completionHandler:(void (^)(NSError *error))completionHandler; - (void)removeFile:(NSString *)filePath diff --git a/ios/RCTHotUpdate/RCTHotUpdateManager.m b/ios/RCTHotUpdate/RCTHotUpdateManager.m index a89a04f..bada051 100644 --- a/ios/RCTHotUpdate/RCTHotUpdateManager.m +++ b/ios/RCTHotUpdate/RCTHotUpdateManager.m @@ -91,9 +91,27 @@ - (void)copyFiles:(NSDictionary *)filesDic fromDir:(NSString *)fromDir toDir:(NSString *)toDir + deletes:(NSDictionary *)deletes completionHandler:(void (^)(NSError *error))completionHandler { dispatch_async(_opQueue, ^{ + NSFileManager *fm = [NSFileManager defaultManager]; + + // merge old files + if (deletes!= nil) { + NSError *error = nil; + NSString *srcDir = [fromDir stringByAppendingPathComponent:@"assets"]; + NSString *desDir = [toDir stringByAppendingPathComponent:@"assets"]; + [self _mergeContentsOfPath:srcDir intoPath:desDir deletes:deletes error:&error]; + if (error) { + if (completionHandler) { + completionHandler(error); + } + return; + } + } + + // copy files for (NSString *to in filesDic.allKeys) { NSString *from = filesDic[to]; if (from.length <=0) { @@ -102,8 +120,11 @@ completionHandler:(void (^)(NSError *error))completionHandler NSString *fromPath = [fromDir stringByAppendingPathComponent:from]; NSString *toPath = [toDir stringByAppendingPathComponent:to]; + if ([fm fileExistsAtPath:toPath]) { + [fm removeItemAtPath:toPath error:nil]; + } NSError *error = nil; - [[NSFileManager defaultManager] copyItemAtPath:fromPath toPath:toPath error:&error]; + [fm copyItemAtPath:fromPath toPath:toPath error:&error]; if (error) { if (completionHandler) { completionHandler(error); @@ -129,4 +150,44 @@ completionHandler:(void (^)(NSError *error))completionHandler }); } +- (void)_mergeContentsOfPath:(NSString *)srcDir intoPath:(NSString *)dstDir deletes:(NSDictionary *)deletes error:(NSError**)err +{ + NSFileManager *fm = [NSFileManager defaultManager]; + NSDirectoryEnumerator *srcDirEnum = [fm enumeratorAtPath:srcDir]; + NSString *subPath; + while ((subPath = [srcDirEnum nextObject])) { + + NSString *srcFullPath = [srcDir stringByAppendingPathComponent:subPath]; + NSString *potentialDstPath = [dstDir stringByAppendingPathComponent:subPath]; + + BOOL isDirectory = ([fm fileExistsAtPath:srcFullPath isDirectory:&isDirectory] && isDirectory); + if (isDirectory) { + if (![fm fileExistsAtPath:potentialDstPath isDirectory:nil]) { + [fm createDirectoryAtPath:potentialDstPath withIntermediateDirectories:YES attributes:nil error:err]; + if (err && *err) { + return; + } + } + } + else { + BOOL inDeletes = NO; + if (deletes) { + NSString *path = [@"assets" stringByAppendingPathComponent:subPath]; + for (NSString *del in deletes) { + if ([subPath isEqualToString:path]) { + inDeletes = YES; + break; + } + } + } + if (!inDeletes && ![fm fileExistsAtPath:potentialDstPath]) { + [fm copyItemAtPath:srcFullPath toPath:potentialDstPath error:err]; + if (err && *err) { + return; + } + } + } + } +} + @end