aboutsummaryrefslogtreecommitdiff
path: root/internal/conf/computed.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/conf/computed.go')
-rw-r--r--internal/conf/computed.go116
1 files changed, 116 insertions, 0 deletions
diff --git a/internal/conf/computed.go b/internal/conf/computed.go
new file mode 100644
index 00000000..07a5a94c
--- /dev/null
+++ b/internal/conf/computed.go
@@ -0,0 +1,116 @@
+// Copyright 2020 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package conf
+
+import (
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "sync"
+)
+
+// ℹ️ README: This file contains configuration values that require computation to be useful.
+
+// IsWindowsRuntime returns true if the current runtime in Windows.
+func IsWindowsRuntime() bool {
+ return runtime.GOOS == "windows"
+}
+
+// IsProdMode returns true if the application is running in production mode.
+func IsProdMode() bool {
+ return strings.EqualFold(App.RunMode, "prod")
+}
+
+var (
+ appPath string
+ appPathOnce sync.Once
+)
+
+// AppPath returns the absolute path of the application's binary.
+func AppPath() string {
+ appPathOnce.Do(func() {
+ var err error
+ appPath, err = exec.LookPath(os.Args[0])
+ if err != nil {
+ panic("look executable path: " + err.Error())
+ }
+
+ appPath, err = filepath.Abs(appPath)
+ if err != nil {
+ panic("get absolute executable path: " + err.Error())
+ }
+ })
+
+ return appPath
+}
+
+var (
+ workDir string
+ workDirOnce sync.Once
+)
+
+// WorkDir returns the absolute path of work directory. It reads the value of envrionment
+// variable GOGS_WORK_DIR. When not set, it uses the directory where the application's
+// binary is located.
+func WorkDir() string {
+ workDirOnce.Do(func() {
+ workDir = os.Getenv("GOGS_WORK_DIR")
+ if workDir != "" {
+ return
+ }
+
+ workDir = filepath.Dir(AppPath())
+ })
+
+ return workDir
+}
+
+var (
+ customDir string
+ customDirOnce sync.Once
+)
+
+// CustomDir returns the absolute path of the custom directory that contains local overrides.
+// It reads the value of envrionment variable GOGS_CUSTOM. When not set, it uses the work
+// directory returned by WorkDir fucntion.
+func CustomDir() string {
+ customDirOnce.Do(func() {
+ customDir = os.Getenv("GOGS_CUSTOM")
+ if customDir != "" {
+ return
+ }
+
+ customDir = filepath.Join(WorkDir(), "custom")
+ })
+
+ return customDir
+}
+
+var (
+ homeDir string
+ homeDirOnce sync.Once
+)
+
+// HomeDir returns the home directory by reading environment variables. It may return empty
+// string when environment variables are not set.
+func HomeDir() string {
+ homeDirOnce.Do(func() {
+ if !IsWindowsRuntime() {
+ homeDir = os.Getenv("HOME")
+ return
+ }
+
+ homeDir = os.Getenv("USERPROFILE")
+ if homeDir != "" {
+ return
+ }
+
+ homeDir = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
+ })
+
+ return homeDir
+}