Browse Source

choose from an interactive list to re-create packages from

Kevin Bradley 7 months ago
parent
commit
3f60042146

+ 101 - 0
bootstrapTool.xcodeproj/project.pbxproj

@@ -18,6 +18,7 @@
 		32B2C838236BC8270085F065 /* Universalize.m in Sources */ = {isa = PBXBuildFile; fileRef = 32B2C837236BC8270085F065 /* Universalize.m */; };
 		4C56B59D29E670DD00D47844 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C56B59C29E670DD00D47844 /* main.m */; };
 		4C56B5A129E670F000D47844 /* Universalize.m in Sources */ = {isa = PBXBuildFile; fileRef = 32B2C837236BC8270085F065 /* Universalize.m */; };
+		4CADFF8C2AC0CD4C00218BB8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CADFF8B2AC0CD4C00218BB8 /* main.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -39,6 +40,15 @@
 			);
 			runOnlyForDeploymentPostprocessing = 1;
 		};
+		4CADFF872AC0CD4C00218BB8 /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = /usr/share/man/man1/;
+			dstSubfolderSpec = 0;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+		};
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
@@ -63,6 +73,8 @@
 		32B2C839236D1BD40085F065 /* Universalize.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Universalize.h; sourceTree = "<group>"; };
 		4C56B59A29E670DD00D47844 /* universalize */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = universalize; sourceTree = BUILT_PRODUCTS_DIR; };
 		4C56B59C29E670DD00D47844 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		4CADFF892AC0CD4C00218BB8 /* chartest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = chartest; sourceTree = BUILT_PRODUCTS_DIR; };
+		4CADFF8B2AC0CD4C00218BB8 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -80,6 +92,13 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		4CADFF862AC0CD4C00218BB8 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
@@ -88,6 +107,7 @@
 			children = (
 				3249302920E4E29700E99767 /* bootstrapTool */,
 				4C56B59B29E670DD00D47844 /* univerisalize */,
+				4CADFF8A2AC0CD4C00218BB8 /* chartest */,
 				3249302820E4E29700E99767 /* Products */,
 			);
 			sourceTree = "<group>";
@@ -97,6 +117,7 @@
 			children = (
 				3249302720E4E29700E99767 /* bootstrapTool */,
 				4C56B59A29E670DD00D47844 /* universalize */,
+				4CADFF892AC0CD4C00218BB8 /* chartest */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -142,6 +163,14 @@
 			path = univerisalize;
 			sourceTree = "<group>";
 		};
+		4CADFF8A2AC0CD4C00218BB8 /* chartest */ = {
+			isa = PBXGroup;
+			children = (
+				4CADFF8B2AC0CD4C00218BB8 /* main.m */,
+			);
+			path = chartest;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -179,6 +208,23 @@
 			productReference = 4C56B59A29E670DD00D47844 /* universalize */;
 			productType = "com.apple.product-type.tool";
 		};
+		4CADFF882AC0CD4C00218BB8 /* chartest */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 4CADFF8F2AC0CD4C00218BB8 /* Build configuration list for PBXNativeTarget "chartest" */;
+			buildPhases = (
+				4CADFF852AC0CD4C00218BB8 /* Sources */,
+				4CADFF862AC0CD4C00218BB8 /* Frameworks */,
+				4CADFF872AC0CD4C00218BB8 /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = chartest;
+			productName = chartest;
+			productReference = 4CADFF892AC0CD4C00218BB8 /* chartest */;
+			productType = "com.apple.product-type.tool";
+		};
 /* End PBXNativeTarget section */
 
 /* Begin PBXProject section */
@@ -196,6 +242,10 @@
 						CreatedOnToolsVersion = 14.2;
 						ProvisioningStyle = Automatic;
 					};
+					4CADFF882AC0CD4C00218BB8 = {
+						CreatedOnToolsVersion = 14.2;
+						ProvisioningStyle = Automatic;
+					};
 				};
 			};
 			buildConfigurationList = 3249302220E4E29700E99767 /* Build configuration list for PBXProject "bootstrapTool" */;
@@ -212,6 +262,7 @@
 			targets = (
 				3249302620E4E29700E99767 /* bootstrapTool */,
 				4C56B59929E670DD00D47844 /* universalize */,
+				4CADFF882AC0CD4C00218BB8 /* chartest */,
 			);
 		};
 /* End PBXProject section */
@@ -242,6 +293,14 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		4CADFF852AC0CD4C00218BB8 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4CADFF8C2AC0CD4C00218BB8 /* main.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXSourcesBuildPhase section */
 
 /* Begin XCBuildConfiguration section */
@@ -407,6 +466,39 @@
 			};
 			name = Release;
 		};
+		4CADFF8D2AC0CD4C00218BB8 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
+				CODE_SIGN_STYLE = Automatic;
+				MACOSX_DEPLOYMENT_TARGET = 12.6;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		4CADFF8E2AC0CD4C00218BB8 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
+				CODE_SIGN_STYLE = Automatic;
+				MACOSX_DEPLOYMENT_TARGET = 12.6;
+				MTL_FAST_MATH = YES;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
@@ -437,6 +529,15 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
+		4CADFF8F2AC0CD4C00218BB8 /* Build configuration list for PBXNativeTarget "chartest" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4CADFF8D2AC0CD4C00218BB8 /* Debug */,
+				4CADFF8E2AC0CD4C00218BB8 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
 /* End XCConfigurationList section */
 	};
 	rootObject = 3249301F20E4E29700E99767 /* Project object */;

+ 2 - 1
bootstrapTool/Classes/HelperClass.h

@@ -6,6 +6,7 @@
 + (InputPackage *)packageForDeb:(NSString *)debFile;
 + (NSString *)octalFromSymbols:(NSString *)theSymbols;
 + (NSString *)octalFromGroupSymbols:(NSString *)theSymbols;
++ (NSString *)numberedArrayFromStatusFile:(NSString *)statusFile bootstrapPath:(NSString *)boostrapPath;
 + (NSArray <StatusPackageModel*>*)statusInstalledPackagesFromFile:(NSString *)statusFile;
 + (NSArray <StatusPackageModel*>*)statusInstalledPackagesFromFile:(NSString *)statusFile bootstrapPath:(NSString *)bootstrapPath;
 + (NSString *)singleLineReturnForProcess:(NSString *)format, ...;
@@ -18,5 +19,5 @@
 + (int)cleanBootstrapAtPath:(NSString *)bootstrapPath;
 + (int)deletePackage:(NSString *)deletePackage inBootstrap:(NSString *)bootstrapPath;
 + (int)createNewBootstrap:(NSString *)bootstrapPath withPackages:(NSString *)packagesFolder;
-+ (NSString *)getNumberWithLimit:(NSInteger)limit;
++ (NSInteger)getNumberFromPrompt:(NSString *)prompt;
 @end

+ 22 - 7
bootstrapTool/Classes/HelperClass.m

@@ -196,6 +196,19 @@
     return [self statusInstalledPackagesFromFile:statusFile bootstrapPath:nil];
 }
 
++ (NSString *)numberedArrayFromStatusFile:(NSString *)statusFile bootstrapPath:(NSString *)boostrapPath {
+    if (![FM fileExistsAtPath:statusFile]) {
+        return nil;
+    }
+    NSArray <StatusPackageModel *> *packages = [self statusInstalledPackagesFromFile:statusFile bootstrapPath:boostrapPath];
+    __block NSMutableArray *newItems = [NSMutableArray new];
+    [packages enumerateObjectsUsingBlock:^(StatusPackageModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+        NSString *currentString = [NSString stringWithFormat:@"%02lu. %@", idx+1, obj.package];
+        [newItems addObject:currentString];
+    }];
+    return [newItems componentsJoinedByString:@"\n"];
+}
+
 + (NSArray <StatusPackageModel*>*)statusInstalledPackagesFromFile:(NSString *)statusFile bootstrapPath:(NSString *)bootstrapPath {
     
     if (![FM fileExistsAtPath:statusFile]) {
@@ -225,17 +238,19 @@
     return sortedArray;
 }
 
-+ (NSString *)getNumberWithLimit:(NSInteger)limit {
-    NSString *errorString = @"\nChoose a number, 0 to exit. [1]: ";
++ (NSInteger)getNumberFromPrompt:(NSString *)prompt {
     char c;
-    printf("%s", [errorString UTF8String] );
+    char buf[64];
+    int i = 0;
+    printf("%s", [prompt UTF8String]);
     c=getchar();
-    while (c > limit) {
-        printf("c = %c", c);
+    while (c != '\n') {
+        buf[i] = c;
+        i++;
         c=getchar();
     }
-    printf("c = %c", c);
-    return @"";
+    buf[i] = '\0';
+    return atoi(buf);
 }
 
 + (BOOL)shouldContinueWithError:(NSString *)errorMessage {

+ 29 - 7
bootstrapTool/main.m

@@ -16,7 +16,7 @@
 #import <sys/utsname.h>
 #import "HelperClass.h"
 
-#define OPTION_FLAGS "o:i:ld:hcrbp:su:yn:a:"
+#define OPTION_FLAGS "o:i:ld:hcrbp:su:yn:a:C"
 
 char *progname;
 char *path;
@@ -36,6 +36,7 @@ static struct option longopts[] = {
     { "yes",                       no_argument,            NULL,   'y' },
     { "new",                       required_argument,      NULL,   'n' },
     { "arch",                      required_argument,      NULL,   'a' },
+    { "create",                    no_argument,            NULL,   'C' },
     { NULL,                        0,                      NULL,    0  }
 };
 
@@ -55,6 +56,7 @@ void cmd_help(void){
     printf("  -s, --skip\t\t\tskip code signature checks when bumping and repackaging\n");
     printf("  -y, --yes\t\t\talways answer yes to prompts to overwrite files\n");
     printf("  -p, --prefix\t\t\tthe prefix to append to all packages when repackaging or bumping a version number\n");
+    printf("  -C, --create\t\t\tcreate a package from the bootstrap with an interactive list\n");
     
     printf("\n");
 }
@@ -81,7 +83,7 @@ int main(int argc, char **argv) {
         BOOL clean = FALSE;
         BOOL forceYes = FALSE;
         BOOL new = FALSE;
-        [HelperClass getNumberWithLimit:20];
+        BOOL create = FALSE;
         /*
         NSString *searchPathString = @"/Users/bradleyk/.rbenv/shims:/Users/bradleyk/Library/Python/3.9/bin:/Users/bradleyk/Library/Python/3.8/bin:/usr/local/lib/ruby/gems/3.0.0/bin:/usr/local/lib/ruby/gems/bin:/usr/local/opt/ruby/bin:/opt/local/bin:/opt/local/sbin:/Users/bradleyk/local/bin:/usr/local/mysql/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/Users/bradleyk/Projects/goprojects/bin:/Users/bradleyk/Projects/theos/bin:/usr/local/bin/:/usr/local/bin:/bin/:/sbin/:/usr/sbin/";
         NSString *target = @"dpkg-deb";
@@ -154,6 +156,10 @@ int main(int argc, char **argv) {
                     packagesFolder = [NSString stringWithUTF8String:optarg];
                     break;
                     
+                case 'C':
+                    create = TRUE;
+                    break;
+                    
                 default:
                     cmd_help();
                     return -1;
@@ -209,16 +215,32 @@ int main(int argc, char **argv) {
             DLog(@"%@", octal);
             return 0;
         }
-        if (listPackage && bootstrapPath) {
+        if (create && bootstrapPath) {
             NSString *statusFile = [bootstrapPath relativeStatusFilePath];
             NSArray *installedPackages = [HelperClass statusInstalledPackagesFromFile:statusFile bootstrapPath:bootstrapPath];
-            DLog(@"%@", installedPackages);
-            /*
-            StatusPackageModel *model = installedPackages[8];
+            NSString *numered = [HelperClass numberedArrayFromStatusFile:statusFile bootstrapPath:bootstrapPath];
+            DLog(@"Choose a package from the list below to create from the bootstrap\n");
+            DLog(@"%@", numered);
+            DLog(@"\n");
+            NSInteger getNumber = [HelperClass getNumberFromPrompt:@"Choose a package index from above: "];
+            while (getNumber > installedPackages.count) {
+                getNumber = [HelperClass getNumberFromPrompt:@"Choose a package index from above: "];
+            }
+            DLog(@"chosen package: %lu: %@", getNumber, installedPackages[getNumber-1]);
+            StatusPackageModel *model = installedPackages[getNumber-1];
             DLog(@"info files: %@", model.infoFiles);
             DLog(@"files: %@", model.files);
             [model createPackage];
-            */
+            return 0;
+        } else if (create) {
+            
+            DLog(@"\nYou need to choose a bootstrap path to create packages from!\n\n");
+            return 1;
+        }
+        if (listPackage && bootstrapPath) {
+            NSString *statusFile = [bootstrapPath relativeStatusFilePath];
+            NSArray *installedPackages = [HelperClass statusInstalledPackagesFromFile:statusFile bootstrapPath:bootstrapPath];
+            DLog(@"%@", installedPackages);
             return 0;
             
         } else if (listPackage) {

+ 59 - 0
chartest/main.m

@@ -0,0 +1,59 @@
+//
+//  main.m
+//  chartest
+//
+//  Created by Kevin Bradley on 9/24/23.
+//  Copyright © 2023 nito. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+/*
+ + (NSString *)getNumberWithLimit:(NSInteger)limit {
+     NSString *errorString = @"\nChoose a number, 0 to exit. [1]: ";
+     char c;
+     printf("%s", [errorString UTF8String] );
+     c=getchar();
+     while (c > limit) {
+         printf("c = %c", c);
+         c=getchar();
+     }
+     printf("c = %c", c);
+     return @"";
+ }
+ */
+
+@interface Dumb: NSObject
++ (NSInteger)getNumberFromPrompt:(NSString *)prompt;
+@end
+
+@implementation Dumb
++ (NSInteger)getNumberFromPrompt:(NSString *)prompt {
+    char c;
+    char buf[64];
+    int i = 0;
+    printf("%s", [prompt UTF8String]);
+    c=getchar();
+    while (c != '\n') {
+        buf[i] = c;
+        i++;
+        c=getchar();
+    }
+    buf[i] = '\0';
+    return atoi(buf);
+}
+@end
+
+int main(int argc, const char * argv[]) {
+    @autoreleasepool {
+        // insert code here...
+        NSInteger limit = 20;
+        NSInteger number = [Dumb getNumberFromPrompt:@"\nChoose a number, 0 to exit. [1]: "];
+        NSLog(@"number: %lu", number);
+        while (number > limit) {
+            number = [Dumb getNumberFromPrompt:@"\nChoose a number, 0 to exit. [1]: "];
+            NSLog(@"number: %lu", number);
+        }
+    }
+    return 0;
+}