assets.go 1.27 KB
Newer Older
Daniel Hiltgen's avatar
Daniel Hiltgen committed
1
2
3
4
5
6
7
8
9
package gpu

import (
	"fmt"
	"log/slog"
	"os"
	"path/filepath"
	"runtime"
	"strings"
10
11
	"sync"
)
Daniel Hiltgen's avatar
Daniel Hiltgen committed
12

13
14
15
var (
	lock        sync.Mutex
	payloadsDir = ""
Daniel Hiltgen's avatar
Daniel Hiltgen committed
16
17
)

18
19
20
21
22
23
24
25
26
func PayloadsDir() (string, error) {
	lock.Lock()
	defer lock.Unlock()
	if payloadsDir == "" {
		tmpDir, err := os.MkdirTemp("", "ollama")
		if err != nil {
			return "", fmt.Errorf("failed to generate tmp dir: %w", err)
		}
		payloadsDir = tmpDir
Daniel Hiltgen's avatar
Daniel Hiltgen committed
27
	}
28
29
30
31
32
33
34
	return payloadsDir, nil
}

func Cleanup() {
	lock.Lock()
	defer lock.Unlock()
	if payloadsDir != "" {
Jeffrey Morgan's avatar
Jeffrey Morgan committed
35
		slog.Debug("cleaning up", "dir", payloadsDir)
36
37
		err := os.RemoveAll(payloadsDir)
		if err != nil {
Jeffrey Morgan's avatar
Jeffrey Morgan committed
38
			slog.Warn("failed to clean up", "dir", payloadsDir, "err", err)
Daniel Hiltgen's avatar
Daniel Hiltgen committed
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
		}
	}
}

func UpdatePath(dir string) {
	if runtime.GOOS == "windows" {
		tmpDir := filepath.Dir(dir)
		pathComponents := strings.Split(os.Getenv("PATH"), ";")
		i := 0
		for _, comp := range pathComponents {
			if strings.EqualFold(comp, dir) {
				return
			}
			// Remove any other prior paths to our temp dir
			if !strings.HasPrefix(strings.ToLower(comp), strings.ToLower(tmpDir)) {
				pathComponents[i] = comp
				i++
			}
		}
		newPath := strings.Join(append([]string{dir}, pathComponents...), ";")
		slog.Info(fmt.Sprintf("Updating PATH to %s", newPath))
		os.Setenv("PATH", newPath)
	}
	// linux and darwin rely on rpath
}