diff --git a/main.go b/main.go index b829dbd..23e3492 100644 --- a/main.go +++ b/main.go @@ -1,231 +1,248 @@ package main import ( - "flag" - "fmt" - "log" - "os" - "path/filepath" - "runtime" // for detecting system architecture and platform - "time" - "spitfire/spitfire" - //"errors" + "flag" + "fmt" + "log" + "os" + "path/filepath" + "runtime" // for detecting system architecture and platform + "spitfire/spitfire" + "time" + //"errors" ) var ( - // Define all flags as package-level variables - all bool - buildFlag bool - clean bool - update bool - patches bool - run bool - compress bool - buildPath string - target string - version string - component string - arch string - release string - platform string - upload bool - uploadPath string - sourceRepo = "https://hg.mozilla.org/mozilla-central" - patchesRepo = "https://weforgecode.xyz/Spitfire/Browser.git" - url = "https://spitfirebrowser.com/" - licence = "AGPL-3.0" - name = "Spitfire" - maintainer = "Internet Addict" - initialDir string + // Define all flags as package-level variables + all bool + buildFlag bool + clean bool + update bool + patches bool + run bool + compress bool + buildPath string + target string + version string + component string + arch string + release string + platform string + upload bool + uploadPath string + sourceRepo = "https://hg.mozilla.org/mozilla-central" + patchesRepo = "https://weforgecode.xyz/Spitfire/Browser.git" + url = "https://spitfirebrowser.com/" + licence = "AGPL-3.0" + name = "Spitfire" + maintainer = "Internet Addict" + initialDir string ) func init() { - flag.StringVar(&buildPath, "p", "", "Path to the build directory") - flag.StringVar(&target, "t", "", "Target location format: component-arch-release-platform") - flag.BoolVar(&compress, "c", false, "Compress the build directory into a tar.gz file before uploading") - flag.StringVar(&version, "v", "", "Specify version for the package. For nightly, use current date if not specified.") - flag.StringVar(&component, "component", "browser", "Component name (default: browser)") - flag.StringVar(&arch, "arch", runtime.GOARCH, "Architecture (default: system architecture)") - flag.StringVar(&release, "release", "nightly", "Release type (default: nightly)") - flag.StringVar(&platform, "platform", runtime.GOOS, "Platform (default: system platform)") - flag.BoolVar(&all, "a", false, "Perform all steps (build, clean, update)") - flag.BoolVar(&buildFlag, "b", false, "Build Spitfire") - flag.BoolVar(&clean, "clean", false, "Clean build") - flag.BoolVar(&update, "u", false, "Update Mozilla repository") - flag.BoolVar(&patches, "patches", false, "Update patches") - flag.BoolVar(&run, "r", false, "Run the project after build") - flag.BoolVar(&upload, "upload", false, "Upload the compressed build file to SourceForge") - flag.StringVar(&uploadPath, "upload-path", "", "Path to the file to upload if no build present") - flag.Bool("h", false, "Display help message") + flag.StringVar(&buildPath, "p", "", "Path to the build directory") + flag.StringVar(&target, "t", "", "Target location format: component-arch-release-platform") + flag.BoolVar(&compress, "c", false, "Compress the build directory into a tar.gz file before uploading") + flag.StringVar(&version, "v", "", "Specify version for the package. For nightly, use current date if not specified.") + flag.StringVar(&component, "component", "browser", "Component name (default: browser)") + flag.StringVar(&arch, "arch", runtime.GOARCH, "Architecture (default: system architecture)") + flag.StringVar(&release, "release", "nightly", "Release type (default: nightly)") + flag.StringVar(&platform, "platform", runtime.GOOS, "Platform (default: system platform)") + flag.BoolVar(&all, "a", false, "Perform all steps (build, clean, update)") + flag.BoolVar(&buildFlag, "b", false, "Build Spitfire") + flag.BoolVar(&clean, "clean", false, "Clean build") + flag.BoolVar(&update, "u", false, "Update Mozilla repository") + flag.BoolVar(&patches, "patches", false, "Update patches") + flag.BoolVar(&run, "r", false, "Run the project after build") + flag.BoolVar(&upload, "upload", false, "Upload the compressed build file to SourceForge") + flag.StringVar(&uploadPath, "upload-path", "", "Path to the file to upload if no build present") + flag.Bool("h", false, "Display help message") } func printHelp() { - fmt.Println("Usage: ./main -p= -t= [-c|--compress] [-v|--version=] [-component=] [-arch=] [-release=] [-platform=]") - flag.PrintDefaults() - fmt.Println("Example: go run . --upload -c --upload-path=./mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin -a") - os.Exit(0) + fmt.Println("Usage: ./main -p= -t= [-c|--compress] [-v|--version=] [-component=] [-arch=] [-release=] [-platform=]") + flag.PrintDefaults() + fmt.Println("Example: go run . --upload -c --upload-path=./mozilla-central/obj-x86_64-pc-linux-gnu/dist/bin -a") + os.Exit(0) } func main() { - flag.Parse() + flag.Parse() - if flag.Lookup("h").Value.(flag.Getter).Get().(bool) { - printHelp() - } + if flag.Lookup("h").Value.(flag.Getter).Get().(bool) { + printHelp() + } - // Set version to current date if it's empty and release is nightly - if version == "" && release == "nightly" { - version = time.Now().Format("2006.01.02") // Set version to current date if nightly - } + // Set version to current date if it's empty and release is nightly + if version == "" && release == "nightly" { + version = time.Now().Format("2006.01.02") // Set version to current date if nightly + } - // Save the initial directory - var err error - initialDir, err = os.Getwd() - if err != nil { - log.Fatalf("Failed to get current working directory: %v", err) - } - fmt.Printf("Initial working directory: %s\n", initialDir) + // Save the initial directory + var err error + initialDir, err = os.Getwd() + if err != nil { + log.Fatalf("Failed to get current working directory: %v", err) + } + fmt.Printf("Initial working directory: %s\n", initialDir) - if all || buildFlag { - BuildProcess() - } + // Convert buildPath and uploadPath to absolute paths + if buildPath != "" { + buildPath, err = spitfire.ResolvePath(buildPath) + if err != nil { + log.Fatalf("Failed to convert buildPath to absolute path: %v", err) + } + fmt.Printf("Resolved buildPath: %s\n", buildPath) + } - if compress || upload { - PackageAndUploadProcess() - } + if uploadPath != "" { + uploadPath, err = spitfire.ResolvePath(uploadPath) + if err != nil { + log.Fatalf("Failed to convert uploadPath to absolute path: %v", err) + } + fmt.Printf("Resolved uploadPath: %s\n", uploadPath) + } - spitfire.PrintErrors() + if all || buildFlag { + BuildProcess() + } + + if compress || upload { + PackageAndUploadProcess() + } + + spitfire.PrintErrors() } // BuildProcess handles the build process: downloading, cleaning, configuring, and building the project. func BuildProcess() { - sourcePath, err := spitfire.ResolvePath("./mozilla-central") - if err != nil { - log.Fatalf("Error resolving source path: %v", err) - } + sourcePath, err := spitfire.ResolvePath("./mozilla-central") + if err != nil { + log.Fatalf("Error resolving source path: %v", err) + } - patchesDir, err := spitfire.ResolvePath(filepath.Join(sourcePath, "Spitfire")) - if err != nil { - log.Fatalf("Error resolving patches directory: %v", err) - } + patchesDir, err := spitfire.ResolvePath(filepath.Join(sourcePath, "Spitfire")) + if err != nil { + log.Fatalf("Error resolving patches directory: %v", err) + } - if all { - spitfire.DownloadSource(sourcePath, sourceRepo) - spitfire.DiscardChanges(sourcePath) - spitfire.CleanBuild(sourcePath) - spitfire.UpdateRepo(sourcePath) - spitfire.UpdatePatches(patchesDir, patchesRepo, sourcePath) - spitfire.Configure(sourcePath) - spitfire.Build(sourcePath) - if run { - spitfire.RunProject(sourcePath) - } - fmt.Println("Spitfire build completed successfully.") - } else if clean { - spitfire.CleanBuild(sourcePath) - fmt.Println("Cleaned Firefox build.") - } else if update { - spitfire.DownloadSource(sourcePath, sourceRepo) - spitfire.UpdateRepo(sourcePath) - fmt.Println("Mozilla repository updated.") - } else if patches { - spitfire.DownloadSource(sourcePath, sourceRepo) - spitfire.UpdatePatches(patchesDir, patchesRepo, sourcePath) - fmt.Println("Patches updated.") - } else if buildFlag { - spitfire.Configure(sourcePath) - spitfire.Build(sourcePath) - if run { - spitfire.RunProject(sourcePath) - } - fmt.Println("Spitfire build completed successfully.") - } + if all { + spitfire.DownloadSource(sourcePath, sourceRepo) + spitfire.DiscardChanges(sourcePath) + spitfire.CleanBuild(sourcePath) + spitfire.UpdateRepo(sourcePath) + spitfire.UpdatePatches(patchesDir, patchesRepo, sourcePath) + spitfire.Configure(sourcePath) + spitfire.Build(sourcePath) + if run { + spitfire.RunProject(sourcePath) + } + fmt.Println("Spitfire build completed successfully.") + } else if clean { + spitfire.CleanBuild(sourcePath) + fmt.Println("Cleaned Firefox build.") + } else if update { + spitfire.DownloadSource(sourcePath, sourceRepo) + spitfire.UpdateRepo(sourcePath) + fmt.Println("Mozilla repository updated.") + } else if patches { + spitfire.DownloadSource(sourcePath, sourceRepo) + spitfire.UpdatePatches(patchesDir, patchesRepo, sourcePath) + fmt.Println("Patches updated.") + } else if buildFlag { + spitfire.Configure(sourcePath) + spitfire.Build(sourcePath) + if run { + spitfire.RunProject(sourcePath) + } + fmt.Println("Spitfire build completed successfully.") + } } // PackageAndUploadProcess handles compressing, packaging, and uploading the build to SourceForge. func PackageAndUploadProcess() { - - // Restore working directory before performing SourceForge operations - restoreWorkingDirectory() - pathToUse := buildPath - if upload && uploadPath != "" { - pathToUse = uploadPath - } + // Restore working directory before performing SourceForge operations + restoreWorkingDirectory() - if pathToUse == "" { - log.Fatalf("Error: no valid build or upload path provided.") - } + pathToUse := buildPath + if upload && uploadPath != "" { + pathToUse = uploadPath + } - // // This is stupid, it wait for the path to exist (up to a maximum wait time) - // err := waitForPath(pathToUse, 60, 5) // Max 60 seconds, checking every 5 seconds - // if err != nil { - // log.Fatalf("Error: Build path or upload path not found: %v", err) - // } + if pathToUse == "" { + log.Fatalf("Error: no valid build or upload path provided.") + } - uncompressedSize, err := spitfire.GetDirectorySize(pathToUse) - if err != nil { - log.Fatalf("Failed to calculate uncompressed size: %v", err) - } - fmt.Printf("Uncompressed directory size: %d bytes\n", uncompressedSize) + // // This is stupid, it wait for the path to exist (up to a maximum wait time) + // err := waitForPath(pathToUse, 60, 5) // Max 60 seconds, checking every 5 seconds + // if err != nil { + // log.Fatalf("Error: Build path or upload path not found: %v", err) + // } - outputCompressedFile := filepath.Join(".", fmt.Sprintf("%s-%s-%s-%s.tar.gz", component, arch, release, platform)) - if compress { - err := spitfire.CompressDirectory(pathToUse, outputCompressedFile) - if err != nil { - log.Fatalf("Failed to compress build directory: %v", err) - } - fmt.Printf("Build directory compressed to: %s\n", outputCompressedFile) - } + uncompressedSize, err := spitfire.GetDirectorySize(pathToUse) + if err != nil { + log.Fatalf("Failed to calculate uncompressed size: %v", err) + } + fmt.Printf("Uncompressed directory size: %d bytes\n", uncompressedSize) - compressedSize, err := spitfire.GetFileSize(outputCompressedFile) - if err != nil { - log.Fatalf("Failed to get compressed file size: %v", err) - } - fmt.Printf("Compressed file size: %d bytes\n", compressedSize) + outputCompressedFile := filepath.Join(".", fmt.Sprintf("%s-%s-%s-%s.tar.gz", component, arch, release, platform)) + if compress { + err := spitfire.CompressDirectory(pathToUse, outputCompressedFile) + if err != nil { + log.Fatalf("Failed to compress build directory: %v", err) + } + fmt.Printf("Build directory compressed to: %s\n", outputCompressedFile) + } - if upload { - config, err := spitfire.LoadConfig() - if err != nil { - log.Fatalf("Failed to load SourceForge config: %v", err) - } + compressedSize, err := spitfire.GetFileSize(outputCompressedFile) + if err != nil { + log.Fatalf("Failed to get compressed file size: %v", err) + } + fmt.Printf("Compressed file size: %d bytes\n", compressedSize) - if _, err := os.Stat(outputCompressedFile); err == nil { - err = spitfire.Upload(config, outputCompressedFile, "/home/frs/project/spitfire-browser/"+component+"/"+arch+"/"+release+"/"+version+"/") - if err != nil { - log.Fatalf("Failed to upload compressed file: %v", err) - } - fmt.Println("Compressed file uploaded successfully.") - } else { - log.Fatalf("No compressed file found to upload.") - } + if upload { + config, err := spitfire.LoadConfig() + if err != nil { + log.Fatalf("Failed to load SourceForge config: %v", err) + } - err = spitfire.DownloadAPPINDEX(config, "/home/frs/project/spitfire-browser/") - if err != nil { - fmt.Println("Failed to download APPINDEX. A new APPINDEX will be created and uploaded.") - } + if _, err := os.Stat(outputCompressedFile); err == nil { + err = spitfire.Upload(config, outputCompressedFile, "/home/frs/project/spitfire-browser/"+component+"/"+arch+"/"+release+"/"+version+"/") + if err != nil { + log.Fatalf("Failed to upload compressed file: %v", err) + } + fmt.Println("Compressed file uploaded successfully.") + } else { + log.Fatalf("No compressed file found to upload.") + } - err = spitfire.PackageAPPINDEX( - name, release, version, arch, - fmt.Sprintf("%d", compressedSize), - fmt.Sprintf("%d", uncompressedSize), - "Spitfire build", url, licence, component, maintainer, "", platform, - ) - if err != nil { - log.Fatalf("Failed to update APPINDEX: %v", err) - } - fmt.Println("APPINDEX updated successfully.") + err = spitfire.DownloadAPPINDEX(config, "/home/frs/project/spitfire-browser/") + if err != nil { + fmt.Println("Failed to download APPINDEX. A new APPINDEX will be created and uploaded.") + } - if err := spitfire.CleanAppIndex(); err != nil { - log.Fatalf("Failed to clean APPINDEX: %v", err) - } + err = spitfire.PackageAPPINDEX( + name, release, version, arch, + fmt.Sprintf("%d", compressedSize), + fmt.Sprintf("%d", uncompressedSize), + "Spitfire build", url, licence, component, maintainer, "", platform, + ) + if err != nil { + log.Fatalf("Failed to update APPINDEX: %v", err) + } + fmt.Println("APPINDEX updated successfully.") - err = spitfire.UploadAPPINDEX(config, "/home/frs/project/spitfire-browser/") - if err != nil { - log.Fatalf("Failed to upload updated APPINDEX: %v", err) - } - fmt.Println("APPINDEX uploaded successfully.") - } + if err := spitfire.CleanAppIndex(); err != nil { + log.Fatalf("Failed to clean APPINDEX: %v", err) + } + + err = spitfire.UploadAPPINDEX(config, "/home/frs/project/spitfire-browser/") + if err != nil { + log.Fatalf("Failed to upload updated APPINDEX: %v", err) + } + fmt.Println("APPINDEX uploaded successfully.") + } } // // waitForPath checks if a path exists, waiting for up to maxWait seconds and retrying every interval seconds. @@ -252,9 +269,9 @@ func PackageAndUploadProcess() { // restoreWorkingDirectory restores the initial working directory after any operation that might change it. func restoreWorkingDirectory() { - err := os.Chdir(initialDir) - if err != nil { - log.Fatalf("Failed to restore the working directory: %v", err) - } - fmt.Printf("Restored working directory to: %s\n", initialDir) -} \ No newline at end of file + err := os.Chdir(initialDir) + if err != nil { + log.Fatalf("Failed to restore the working directory: %v", err) + } + fmt.Printf("Restored working directory to: %s\n", initialDir) +}