ALR

Форк
1
/
paths.go 
108 строк · 2.7 Кб
1
/*
2
 * ALR - Any Linux Repository
3
 * Copyright (C) 2024 Евгений Храмов
4
 *
5
 * This program is free software: you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation, either version 3 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
 */
18

19
package config
20

21
import (
22
	"context"
23
	"os"
24
	"path/filepath"
25
	"sync"
26

27
	"github.com/pelletier/go-toml/v2"
28
	"plemya-x.ru/alr/pkg/loggerctx"
29
)
30

31
// Paths contains various paths used by ALR
32
type Paths struct {
33
	ConfigDir  string
34
	ConfigPath string
35
	CacheDir   string
36
	RepoDir    string
37
	PkgsDir    string
38
	DBPath     string
39
}
40

41
var (
42
	pathsMtx sync.Mutex
43
	paths    *Paths
44
)
45

46
// GetPaths returns a Paths struct.
47
// The first time it's called, it'll generate the struct
48
// using information from the system.
49
// Subsequent calls will return the same value.
50
func GetPaths(ctx context.Context) *Paths {
51
	pathsMtx.Lock()
52
	defer pathsMtx.Unlock()
53

54
	log := loggerctx.From(ctx)
55
	if paths == nil {
56
		paths = &Paths{}
57

58
		cfgDir, err := os.UserConfigDir()
59
		if err != nil {
60
			log.Fatal("Unable to detect user config directory").Err(err).Send()
61
		}
62

63
		paths.ConfigDir = filepath.Join(cfgDir, "alr")
64

65
		err = os.MkdirAll(paths.ConfigDir, 0o755)
66
		if err != nil {
67
			log.Fatal("Unable to create ALR config directory").Err(err).Send()
68
		}
69

70
		paths.ConfigPath = filepath.Join(paths.ConfigDir, "alr.toml")
71

72
		if _, err := os.Stat(paths.ConfigPath); err != nil {
73
			cfgFl, err := os.Create(paths.ConfigPath)
74
			if err != nil {
75
				log.Fatal("Unable to create ALR config file").Err(err).Send()
76
			}
77

78
			err = toml.NewEncoder(cfgFl).Encode(&defaultConfig)
79
			if err != nil {
80
				log.Fatal("Error encoding default configuration").Err(err).Send()
81
			}
82

83
			cfgFl.Close()
84
		}
85

86
		cacheDir, err := os.UserCacheDir()
87
		if err != nil {
88
			log.Fatal("Unable to detect cache directory").Err(err).Send()
89
		}
90

91
		paths.CacheDir = filepath.Join(cacheDir, "alr")
92
		paths.RepoDir = filepath.Join(paths.CacheDir, "repo")
93
		paths.PkgsDir = filepath.Join(paths.CacheDir, "pkgs")
94

95
		err = os.MkdirAll(paths.RepoDir, 0o755)
96
		if err != nil {
97
			log.Fatal("Unable to create repo cache directory").Err(err).Send()
98
		}
99

100
		err = os.MkdirAll(paths.PkgsDir, 0o755)
101
		if err != nil {
102
			log.Fatal("Unable to create package cache directory").Err(err).Send()
103
		}
104

105
		paths.DBPath = filepath.Join(paths.CacheDir, "db")
106
	}
107
	return paths
108
}
109

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.