13f2779e1f
T6.1: split jobs_view.go into three files — jobs_view_helpers.go (pure helpers) and jobs_view_details.go (detailsPanel struct with widget creation, update, clear, and container methods) — bringing jobs_view.go from 459 to ~200 lines. T6.2: remove stale YAML upgrade note from README; drop *.yaml from .dockerignore. T6.3: delete YAML shadow structs (yamlConfig/yamlJob/yamlJobsFile), importYAMLConfig/importYAMLJobs, legacy path constants, and all YAML-import tests; run go mod tidy to remove go.yaml.in/yaml/v4. T6.4: refresh ARCHITECTURE.md — JSON storage references, new Key Domain Concepts section (per-job overlap policy, run-time statistics + log seeding, persisted pause flag, jobs_view split). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
52 lines
1.5 KiB
Go
52 lines
1.5 KiB
Go
package storage
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
const (
|
|
// The config file stays beside the executable so the portable build behaves
|
|
// predictably: moving the program folder moves its settings with it.
|
|
ConfigFileName = "gosentry.json"
|
|
// Jobs are kept in a separate JSON file because the user can choose a
|
|
// different jobs directory, while application settings remain local to the
|
|
// installed/copied program.
|
|
JobsFileName = "jobs.json"
|
|
|
|
)
|
|
|
|
// Paths contains both the physical program location and the resolved runtime
|
|
// storage locations. Keeping resolved paths in one struct prevents the GUI and
|
|
// scheduler from interpreting relative directories differently.
|
|
type Paths struct {
|
|
ExecutablePath string
|
|
AppDir string
|
|
ConfigPath string
|
|
JobsDir string
|
|
JobsPath string
|
|
LogsDir string
|
|
DesktopIcon string
|
|
}
|
|
|
|
func ResolvePaths() (Paths, error) {
|
|
// os.Executable is used instead of the current working directory because GUI
|
|
// apps are often launched from Explorer, a tray shortcut, or a desktop file.
|
|
// In those cases the working directory can be surprising, but the executable
|
|
// path is stable and matches the "portable app folder" storage model.
|
|
executable, err := os.Executable()
|
|
if err != nil {
|
|
return Paths{}, err
|
|
}
|
|
|
|
appDir := filepath.Dir(executable)
|
|
configPath := filepath.Join(appDir, ConfigFileName)
|
|
return Paths{
|
|
ExecutablePath: executable,
|
|
AppDir: appDir,
|
|
ConfigPath: configPath,
|
|
JobsDir: appDir,
|
|
JobsPath: filepath.Join(appDir, JobsFileName),
|
|
}, nil
|
|
}
|