From 175946ac836a4623792702e87dafb439e40ad599 Mon Sep 17 00:00:00 2001 From: Mohammed Sazid Al Rashid Date: Fri, 27 Feb 2026 00:01:10 +0600 Subject: [PATCH 1/3] node_runner: use existing local ZeuZ Node before download --- Apps/node_runner/main.go | 71 ++++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 17 deletions(-) diff --git a/Apps/node_runner/main.go b/Apps/node_runner/main.go index ab46de7e..33050773 100644 --- a/Apps/node_runner/main.go +++ b/Apps/node_runner/main.go @@ -139,24 +139,59 @@ func getZeuZNodeDir() string { if version != "dev" && !strings.HasPrefix(version, "dev-") { selectedVersion = version } + if selectedVersion == "" { + selectedVersion = "dev" + } return fmt.Sprintf("ZeuZ_Node-%s", selectedVersion) } +func containsNodeCLI(dir string) bool { + if info, err := os.Stat(filepath.Join(dir, "node_cli.py")); err == nil && !info.IsDir() { + return true + } + return false +} + +func findExistingZeuzNodeDir(expectedDir string) (string, error) { + if info, err := os.Stat(expectedDir); err == nil && info.IsDir() && containsNodeCLI(expectedDir) { + return expectedDir, nil + } + + entries, err := os.ReadDir(".") + if err != nil { + return "", fmt.Errorf("failed to read current directory: %v", err) + } + + for _, entry := range entries { + if !entry.IsDir() { + continue + } + name := entry.Name() + if !strings.HasPrefix(name, "ZeuZ_Node-") { + continue + } + if containsNodeCLI(name) { + return name, nil + } + } + + return "", nil +} + // setupZeuzNode downloads and extracts the ZeuZ Node repository if not already present -func setupZeuzNode() error { +func setupZeuzNode() (string, error) { zeuzDir := getZeuZNodeDir() - // Check if ZeuZ Node directory already exists and contains files - if info, err := os.Stat(zeuzDir); err == nil && info.IsDir() { - // Check if directory is not empty - f, err := os.Open(zeuzDir) - if err == nil { - defer f.Close() - _, err = f.Readdirnames(1) // Try to read at least one file - if err == nil { // Directory is not empty - return nil - } + + existingDir, err := findExistingZeuzNodeDir(zeuzDir) + if err != nil { + return "", err + } + if existingDir != "" { + if existingDir != zeuzDir { + fmt.Printf("Using existing ZeuZ Node directory: %s\n", existingDir) } + return existingDir, nil } fmt.Println("Setting up ZeuZ Node...") @@ -164,7 +199,7 @@ func setupZeuzNode() error { // Create temporary directory for zip file tempDir, err := os.MkdirTemp("", "zeuz-download") if err != nil { - return fmt.Errorf("failed to create temp directory: %v", err) + return "", fmt.Errorf("failed to create temp directory: %v", err) } defer os.RemoveAll(tempDir) @@ -173,21 +208,21 @@ func setupZeuzNode() error { zeuzURL := getZeuZNodeURL() fmt.Printf("Downloading ZeuZ Node repository from: %s\n", zeuzURL) if err := downloadFile(zeuzURL, zipPath); err != nil { - return err + return "", err } // Remove existing ZeuZ Node directory if it exists if err := os.RemoveAll(zeuzDir); err != nil { - return fmt.Errorf("failed to remove existing directory: %v", err) + return "", fmt.Errorf("failed to remove existing directory: %v", err) } // Extract zip file fmt.Println("Extracting ZeuZ Node repository...") if err := unzip(zipPath, zeuzDir); err != nil { - return err + return "", err } - return nil + return zeuzDir, nil } // installUV installs the UV package manager if not already installed @@ -306,10 +341,12 @@ func main() { } // Setup ZeuZ Node directory and change into it - if err := setupZeuzNode(); err != nil { + resolvedZeuzDir, err := setupZeuzNode() + if err != nil { fmt.Printf("Error setting up ZeuZ Node: %v\n", err) os.Exit(1) } + zeuzDir = resolvedZeuzDir // Change directory to ZeuZ Node if err := os.Chdir(zeuzDir); err != nil { From a6120c27fc90b6e0d6da231000dc2cf3230288f7 Mon Sep 17 00:00:00 2001 From: Mohammed Sazid Al Rashid Date: Fri, 27 Feb 2026 00:07:33 +0600 Subject: [PATCH 2/3] node_runner: address cleanup and local-dir review feedback --- Apps/node_runner/main.go | 67 +++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/Apps/node_runner/main.go b/Apps/node_runner/main.go index 33050773..0578d6ef 100644 --- a/Apps/node_runner/main.go +++ b/Apps/node_runner/main.go @@ -10,6 +10,7 @@ import ( "os/exec" "path/filepath" "runtime" + "sort" "strings" "github.com/automationsolutionz/Zeuz_Python_Node/Apps/node_runner/uv_installer" @@ -163,6 +164,7 @@ func findExistingZeuzNodeDir(expectedDir string) (string, error) { return "", fmt.Errorf("failed to read current directory: %v", err) } + var candidates []string for _, entry := range entries { if !entry.IsDir() { continue @@ -172,11 +174,56 @@ func findExistingZeuzNodeDir(expectedDir string) (string, error) { continue } if containsNodeCLI(name) { - return name, nil + candidates = append(candidates, name) } } - return "", nil + if len(candidates) == 0 { + return "", nil + } + + sort.Strings(candidates) + return candidates[0], nil +} + +func removeDirIfExists(path string) (bool, error) { + if _, err := os.Stat(path); err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + + if err := os.RemoveAll(path); err != nil { + return false, err + } + + return true, nil +} + +func removeZeuzNodeDirs() (bool, error) { + entries, err := os.ReadDir(".") + if err != nil { + return false, fmt.Errorf("failed to read current directory: %v", err) + } + + removedAny := false + for _, entry := range entries { + if !entry.IsDir() || !strings.HasPrefix(entry.Name(), "ZeuZ_Node-") { + continue + } + + removed, err := removeDirIfExists(entry.Name()) + if err != nil { + return removedAny, fmt.Errorf("failed to remove %s: %v", entry.Name(), err) + } + if removed { + fmt.Printf("Removed %s\n", entry.Name()) + removedAny = true + } + } + + return removedAny, nil } // setupZeuzNode downloads and extracts the ZeuZ Node repository if not already present @@ -312,22 +359,20 @@ func main() { zeuzDir := getZeuZNodeDir() if *cleanFlag { - var removedAny bool - if err := os.RemoveAll(zeuzDir); err == nil { - fmt.Printf("Removed %s\n", zeuzDir) - removedAny = true - } else if !os.IsNotExist(err) { - fmt.Printf("Failed to remove %s: %v\n", zeuzDir, err) + removedAny, err := removeZeuzNodeDirs() + if err != nil { + fmt.Printf("Failed during ZeuZ Node cleanup: %v\n", err) } home, err := os.UserHomeDir() if err == nil { zeuzHome := filepath.Join(home, ".zeuz") - if err := os.RemoveAll(zeuzHome); err == nil { + removed, removeErr := removeDirIfExists(zeuzHome) + if removeErr != nil { + fmt.Printf("Failed to remove %s: %v\n", zeuzHome, removeErr) + } else if removed { fmt.Printf("Removed %s\n", zeuzHome) removedAny = true - } else if !os.IsNotExist(err) { - fmt.Printf("Failed to remove %s: %v\n", zeuzHome, err) } } else { fmt.Printf("Could not determine user home dir: %v\n", err) From 30be46a662f8f32aebb0ad88282ce1e1e5ab56d7 Mon Sep 17 00:00:00 2001 From: Mohammed Sazid Al Rashid Date: Fri, 27 Feb 2026 00:21:29 +0600 Subject: [PATCH 3/3] node_runner: avoid fallback to wrong local revision --- Apps/node_runner/main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Apps/node_runner/main.go b/Apps/node_runner/main.go index 0578d6ef..881c9280 100644 --- a/Apps/node_runner/main.go +++ b/Apps/node_runner/main.go @@ -159,6 +159,11 @@ func findExistingZeuzNodeDir(expectedDir string) (string, error) { return expectedDir, nil } + requestedSpecificRevision := *branch != "" || (version != "dev" && !strings.HasPrefix(version, "dev-")) + if requestedSpecificRevision { + return "", nil + } + entries, err := os.ReadDir(".") if err != nil { return "", fmt.Errorf("failed to read current directory: %v", err)