Commit 187e36f

mo khan <mo@mokhan.ca>
2025-07-31 16:38:12
refactor: extract a procfile package
1 parent f6bb23d
Changed files (2)
pkg/procfile/parse.go
@@ -0,0 +1,62 @@
+package procfile
+
+import (
+	"bufio"
+	"log"
+	"os"
+	"os/exec"
+	"strings"
+	"syscall"
+)
+
+type Proc struct {
+	name string
+	args []string
+}
+
+func New(name string, args []string) *Proc {
+	return &Proc{
+		name: name,
+		args: args,
+	}
+}
+
+func Parse(procfilePath string) []*Proc {
+	file, err := os.Open(procfilePath)
+	if err != nil {
+		log.Fatalln(err)
+	}
+	defer file.Close()
+
+	var processes []*Proc
+	scanner := bufio.NewScanner(file)
+
+	for scanner.Scan() {
+		line := strings.TrimSpace(scanner.Text())
+		if line == "" || strings.HasPrefix(line, "#") {
+			continue
+		}
+
+		parts := strings.SplitN(line, ":", 2)
+		if len(parts) != 2 {
+			continue
+		}
+
+		args := strings.Fields(os.ExpandEnv(strings.TrimSpace(parts[1])))
+		if len(args) == 0 {
+			continue
+		}
+
+		processes = append(processes, New(parts[0], args))
+	}
+
+	return processes
+}
+
+func (p *Proc) NewCommand() *exec.Cmd {
+	cmd := exec.Command(p.args[0], p.args[1:]...)
+	cmd.Stdout = os.Stdout
+	cmd.Stderr = os.Stderr
+	cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+	return cmd
+}
main.go
@@ -1,7 +1,6 @@
 package main
 
 import (
-	"bufio"
 	"flag"
 	"log"
 	"os"
@@ -12,6 +11,8 @@ import (
 	"sync/atomic"
 	"syscall"
 	"time"
+
+	"github.com/xlgmokha/minit/pkg/procfile"
 )
 
 var procfilePath *string
@@ -23,57 +24,32 @@ func init() {
 }
 
 func main() {
-	file, err := os.Open(*procfilePath)
-	if err != nil {
-		log.Fatalln(err)
-	}
-	defer file.Close()
-
-	var cmds []*exec.Cmd
 	var wg sync.WaitGroup
 	var shutdown int32
 
-	scanner := bufio.NewScanner(file)
-	for scanner.Scan() {
-		line := strings.TrimSpace(scanner.Text())
-		if line == "" || strings.HasPrefix(line, "#") {
-			continue
-		}
-
-		parts := strings.SplitN(line, ":", 2)
-		if len(parts) != 2 {
-			continue
-		}
-
-		args := strings.Fields(os.ExpandEnv(strings.TrimSpace(parts[1])))
-		if len(args) == 0 {
-			continue
-		}
-
-		cmd := exec.Command(args[0], args[1:]...)
-		cmd.Stdout = os.Stdout
-		cmd.Stderr = os.Stderr
-		cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
-
-		cmds = append(cmds, cmd)
-
-		wg.Add(1)
-		go func(args []string) {
-			defer wg.Done()
-			for atomic.LoadInt32(&shutdown) == 0 {
-				cmd := exec.Command(args[0], args[1:]...)
-				cmd.Stdout = os.Stdout
-				cmd.Stderr = os.Stderr
-				cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+	for _, path := range strings.Split(*procfilePath, ",") {
+		for _, proc := range procfile.Parse(path) {
+			wg.Add(1)
+			go func(proc *procfile.Proc) {
+				defer wg.Done()
+				var cmd *exec.Cmd
+
+				for atomic.LoadInt32(&shutdown) == 0 {
+					cmd = proc.NewCommand()
+
+					if cmd.Start() != nil {
+						time.Sleep(2 * time.Second)
+						continue
+					}
+					cmd.Wait()
+					time.Sleep(time.Second)
+				}
 
-				if cmd.Start() != nil {
-					time.Sleep(2 * time.Second)
-					continue
+				if cmd != nil && cmd.Process != nil {
+					syscall.Kill(-cmd.Process.Pid, syscall.SIGTERM)
 				}
-				cmd.Wait()
-				time.Sleep(time.Second)
-			}
-		}(args)
+			}(proc)
+		}
 	}
 
 	sigChan := make(chan os.Signal, 1)
@@ -82,12 +58,6 @@ func main() {
 	go func() {
 		<-sigChan
 		atomic.StoreInt32(&shutdown, 1)
-
-		for _, cmd := range cmds {
-			if cmd.Process != nil {
-				syscall.Kill(-cmd.Process.Pid, syscall.SIGTERM)
-			}
-		}
 	}()
 
 	wg.Wait()