@@ -167,8 +167,81 @@ + (NSString *)modeExtraArgumentsSectionName:(NSUInteger)sectionIndex
167167
168168+ (int )run : (NOZCLIZipModeInfo *)info
169169{
170- printf (" NYI!\n " );
171- return -1 ;
170+ if (!info) {
171+ return -1 ;
172+ }
173+
174+ if (!NOZCLI_registerMethodToNumberMap (info.methodToNumberMap )) {
175+ return -1 ;
176+ }
177+
178+ NSError *error;
179+ NOZZipper *zipper = [[NOZZipper alloc ] initWithZipFile: info.outputFile];
180+ zipper.globalComment = info.globalComment ;
181+
182+ if (![zipper openWithMode: NOZZipperModeCreate error: &error]) {
183+ NOZCLI_printError (error);
184+ return -1 ;
185+ }
186+
187+ for (NOZCLIZipModeEntryInfo *entryInfo in info.entryInfos ) {
188+ MethodInfo *methodInfo = (entryInfo.methodName ) ? NOZCLI_lookupMethodByName (entryInfo.methodName ) : NOZCLI_lookupMethod (NOZCompressionMethodDeflate);
189+ if (!methodInfo) {
190+ printf (" unrecognized compression method '%s '\n " , entryInfo.methodName .UTF8String );
191+ return -1 ;
192+ }
193+
194+ UInt16 overrideMethodNumber = methodInfo.method ;
195+ if (entryInfo.methodName && info.methodToNumberMap [entryInfo.methodName]) {
196+ overrideMethodNumber = info.methodToNumberMap [entryInfo.methodName].unsignedShortValue ;
197+ }
198+
199+ // TODO - support preventing recursion
200+ // TODO - support avoiding hidden files
201+
202+ NSFileManager *fm = [NSFileManager defaultManager ];
203+ NSDirectoryEnumerator *enumerator = [fm enumeratorAtPath: entryInfo.entryPath];
204+ if (!enumerator) {
205+ NOZFileZipEntry *entry = [[NOZFileZipEntry alloc ] initWithFilePath: entryInfo.entryPath];
206+ if (![self _zip: zipper entry: entry methodInfo: methodInfo entryInfo: entryInfo method: overrideMethodNumber]) {
207+ return -1 ;
208+ }
209+ } else {
210+ NSString *filePath = nil ;
211+ while (nil != (filePath = enumerator.nextObject )) {
212+ NSString *fullPath = [entryInfo.entryPath stringByAppendingPathComponent: filePath];
213+ BOOL isDir = NO ;
214+ if ([fm fileExistsAtPath: fullPath isDirectory: &isDir] && !isDir) {
215+ NOZFileZipEntry *entry = [[NOZFileZipEntry alloc ] initWithFilePath: fullPath name: filePath];
216+ if (![self _zip: zipper entry: entry methodInfo: methodInfo entryInfo: entryInfo method: overrideMethodNumber]) {
217+ return -1 ;
218+ }
219+ }
220+ }
221+ }
222+ }
223+
224+ if (![zipper closeAndReturnError: &error]) {
225+ NOZCLI_printError (error);
226+ return -1 ;
227+ }
228+
229+ return 0 ;
230+ }
231+
232+ + (BOOL )_zip : (NOZZipper *)zipper entry : (NOZFileZipEntry *)entry methodInfo : (MethodInfo *)methodInfo entryInfo : (NOZCLIZipModeEntryInfo *)entryInfo method : (NOZCompressionMethod)method
233+ {
234+ entry.compressionMethod = method;
235+ entry.compressionLevel = NOZCompressionLevelFromCustomEncoderLevel (1 , 1 + methodInfo.levels , entryInfo.level ? (NSUInteger )[entryInfo.level integerValue ] : methodInfo.defaultLevel );
236+ entry.comment = entryInfo.comment ;
237+
238+ printf (" %s ...\n " , entry.filePath .UTF8String );
239+ NSError *error;
240+ if (![zipper addEntry: entry progressBlock: NULL error: &error]) {
241+ NOZCLI_printError (error);
242+ return NO ;
243+ }
244+ return YES ;
172245}
173246
174247@end
@@ -187,12 +260,14 @@ @implementation NOZCLIZipModeEntryInfo
187260 return nil ;
188261 }
189262
190- NSUInteger prevIndex = NSNotFound ;
263+ NSUInteger prevIndex = 0 ;
191264 do {
192265 const NSUInteger curIndex = eIndexes.firstIndex ;
193266 [eIndexes removeIndex: curIndex];
194267 if (prevIndex != NSNotFound ) {
195- [entryArgs addObject: [args subarrayWithRange: NSMakeRange (prevIndex, curIndex - prevIndex)]];
268+ if (prevIndex != curIndex) {
269+ [entryArgs addObject: [args subarrayWithRange: NSMakeRange (prevIndex, curIndex - prevIndex)]];
270+ }
196271 if (!eIndexes.count ) {
197272 [entryArgs addObject: [args subarrayWithRange: NSMakeRange (curIndex, args.count - curIndex)]];
198273 }
@@ -276,7 +351,7 @@ + (instancetype)entryFromArgs:(NSArray<NSString *> *)args environmentPath:(NSStr
276351 }
277352 }
278353
279- entryPath = NOZCLI_normalizedPath (envPath, envPath );
354+ entryPath = NOZCLI_normalizedPath (envPath, entryPath );
280355 if (!entryPath) {
281356 return nil ;
282357 }
0 commit comments