(name, dir string)
| 268 | ` |
| 269 | |
| 270 | func (pool *AppPool) LaunchApp(name, dir string) (*App, error) { |
| 271 | tmpDir := filepath.Join(dir, "tmp") |
| 272 | err := os.MkdirAll(tmpDir, 0755) |
| 273 | if err != nil { |
| 274 | return nil, err |
| 275 | } |
| 276 | |
| 277 | socket := filepath.Join(tmpDir, fmt.Sprintf("puma-dev-%d.sock", os.Getpid())) |
| 278 | |
| 279 | shell := os.Getenv("SHELL") |
| 280 | |
| 281 | if shell == "" { |
| 282 | fmt.Printf("! SHELL env var not set, using /bin/bash by default") |
| 283 | shell = "/bin/bash" |
| 284 | } |
| 285 | |
| 286 | cmd := exec.Command(shell, "-l", "-i", "-c", |
| 287 | fmt.Sprintf(executionShell, dir, name, socket, name, socket)) |
| 288 | |
| 289 | cmd.Dir = dir |
| 290 | |
| 291 | cmd.Env = os.Environ() |
| 292 | cmd.Env = append(cmd.Env, |
| 293 | fmt.Sprintf("THREADS=%d", DefaultThreads), |
| 294 | "WORKERS=0", |
| 295 | "CONFIG=-", |
| 296 | ) |
| 297 | |
| 298 | stdout, err := cmd.StdoutPipe() |
| 299 | if err != nil { |
| 300 | return nil, err |
| 301 | } |
| 302 | |
| 303 | cmd.Stderr = cmd.Stdout |
| 304 | |
| 305 | err = cmd.Start() |
| 306 | if err != nil { |
| 307 | return nil, errors.Context(err, "starting app") |
| 308 | } |
| 309 | |
| 310 | fmt.Printf("! Booting app '%s' on socket %s\n", name, socket) |
| 311 | |
| 312 | app := &App{ |
| 313 | Name: name, |
| 314 | Command: cmd, |
| 315 | Events: pool.Events, |
| 316 | stdout: stdout, |
| 317 | dir: dir, |
| 318 | pool: pool, |
| 319 | readyChan: make(chan struct{}), |
| 320 | lastUse: time.Now(), |
| 321 | } |
| 322 | |
| 323 | app.eventAdd("booting_app", "socket", socket) |
| 324 | |
| 325 | stat, err := os.Stat(filepath.Join(dir, "public")) |
| 326 | if err == nil { |
| 327 | app.Public = stat.IsDir() |
no test coverage detected