mirror of
https://github.com/cupcakearmy/autorestic.git
synced 2024-12-24 01:06:23 +00:00
Compare commits
6 Commits
812fed163e
...
3b5f4f7883
Author | SHA1 | Date | |
---|---|---|---|
|
3b5f4f7883 | ||
ced20801c1 | |||
|
ce9140fa1e | ||
|
046c79fd15 | ||
|
f8603425d1 | ||
|
0c7da11f4d |
@ -7,7 +7,7 @@ COPY . .
|
||||
RUN go build
|
||||
|
||||
FROM restic/restic:0.16.0
|
||||
RUN apk add --no-cache rclone bash
|
||||
RUN apk add --no-cache rclone bash curl
|
||||
COPY --from=builder /app/autorestic /usr/bin/autorestic
|
||||
ENTRYPOINT []
|
||||
CMD [ "autorestic" ]
|
||||
|
38
cmd/root.go
38
cmd/root.go
@ -59,24 +59,7 @@ func initConfig() {
|
||||
os.Exit(1)
|
||||
}
|
||||
} else {
|
||||
configPaths := []string{"."}
|
||||
|
||||
// Home
|
||||
if home, err := homedir.Dir(); err == nil {
|
||||
configPaths = append(configPaths, home)
|
||||
}
|
||||
|
||||
// XDG_CONFIG_HOME
|
||||
{
|
||||
prefix, found := os.LookupEnv("XDG_CONFIG_HOME")
|
||||
if !found {
|
||||
if home, err := homedir.Dir(); err != nil {
|
||||
prefix = filepath.Join(home, ".config")
|
||||
}
|
||||
}
|
||||
xdgConfig := filepath.Join(prefix, "autorestic")
|
||||
configPaths = append(configPaths, xdgConfig)
|
||||
}
|
||||
configPaths := getConfigPaths()
|
||||
for _, cfgPath := range configPaths {
|
||||
viper.AddConfigPath(cfgPath)
|
||||
}
|
||||
@ -88,3 +71,22 @@ func initConfig() {
|
||||
viper.AutomaticEnv()
|
||||
}
|
||||
}
|
||||
|
||||
func getConfigPaths() []string {
|
||||
result := []string{"."}
|
||||
if home, err := homedir.Dir(); err == nil {
|
||||
result = append(result, home)
|
||||
}
|
||||
|
||||
{
|
||||
xdgConfigHome, found := os.LookupEnv("XDG_CONFIG_HOME")
|
||||
if !found {
|
||||
if home, err := homedir.Dir(); err == nil {
|
||||
xdgConfigHome = filepath.Join(home, ".config")
|
||||
}
|
||||
}
|
||||
xdgConfig := filepath.Join(xdgConfigHome, "autorestic")
|
||||
result = append(result, xdgConfig)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
36
cmd/root_test.go
Normal file
36
cmd/root_test.go
Normal file
@ -0,0 +1,36 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"github.com/mitchellh/go-homedir"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"slices"
|
||||
"testing"
|
||||
)
|
||||
|
||||
const xdgConfigHome = "XDG_CONFIG_HOME"
|
||||
|
||||
func assertContains(t *testing.T, array []string, element string) {
|
||||
if !slices.Contains(array, element) {
|
||||
t.Errorf("Expected %s to be contained in %s", element, array)
|
||||
}
|
||||
}
|
||||
|
||||
func TestConfigResolving(t *testing.T) {
|
||||
t.Run("~/.config/autorestic is used if XDG_CONFIG_HOME is not set", func(t *testing.T) {
|
||||
// Override env using testing so that env gets restored after test
|
||||
t.Setenv(xdgConfigHome, "")
|
||||
_ = os.Unsetenv("XDG_CONFIG_HOME")
|
||||
configPaths := getConfigPaths()
|
||||
homeDir, _ := homedir.Dir()
|
||||
expectedConfigPath := filepath.Join(homeDir, ".config/autorestic")
|
||||
assertContains(t, configPaths, expectedConfigPath)
|
||||
})
|
||||
|
||||
t.Run("XDG_CONFIG_HOME is respected if set", func(t *testing.T) {
|
||||
t.Setenv(xdgConfigHome, "/foo/bar")
|
||||
|
||||
configPaths := getConfigPaths()
|
||||
assertContains(t, configPaths, filepath.Join("/", "foo", "bar", "autorestic"))
|
||||
})
|
||||
}
|
@ -2,10 +2,11 @@
|
||||
|
||||
## Path
|
||||
|
||||
By default autorestic searches for a `.autorestic.yml` file in the current directory and your home folder.
|
||||
By default autorestic searches for a `.autorestic.yml` file in the current directory, your home folder and your XDG config folder (`~/.config/` by default):
|
||||
|
||||
- `./.autorestic.yml`
|
||||
- `~/.autorestic.yml`
|
||||
- `~/.config/autorestic/.autorestic.yml`
|
||||
|
||||
You can also specify a custom file with the `-c path/to/some/config.yml`
|
||||
|
||||
|
@ -30,4 +30,4 @@ Fedora users can install the [autorestic](https://src.fedoraproject.org/rpms/aut
|
||||
|
||||
### AUR
|
||||
|
||||
~~If you are on Arch there is an [AUR Package](https://aur.archlinux.org/packages/autorestic-bin/) (looking for maintainers).~~ - Deprecated
|
||||
If you are on Arch there is an [AUR Package](https://aur.archlinux.org/packages/autorestic-bin/)
|
||||
|
@ -6,7 +6,6 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
@ -37,7 +36,7 @@ func dlJSON(url string) (GithubRelease, error) {
|
||||
return parsed, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return parsed, err
|
||||
|
||||
@ -73,9 +72,10 @@ func downloadAndInstallAsset(body GithubRelease, name string) error {
|
||||
// Uncompress
|
||||
bz := bzip2.NewReader(resp.Body)
|
||||
|
||||
// Save to tmp
|
||||
// Linux does not support overwriting the file that is currently being overwritten, but it can be deleted and a new one moved in its place.
|
||||
tmp, err := ioutil.TempFile(os.TempDir(), "autorestic-")
|
||||
// Save to tmp file in the same directory as the install directory
|
||||
// Linux does not support overwriting the file that is currently being running
|
||||
// But it can be delete the old one and a new one moved in its place.
|
||||
tmp, err := os.CreateTemp(INSTALL_PATH, "autorestic-")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -89,23 +89,25 @@ func downloadAndInstallAsset(body GithubRelease, name string) error {
|
||||
|
||||
to := path.Join(INSTALL_PATH, name)
|
||||
defer os.Remove(tmp.Name()) // Cleanup temporary file after thread exits
|
||||
if err := os.Rename(tmp.Name(), to); err != nil {
|
||||
colors.Error.Printf("os.Rename() failed (%v), retrying with io.Copy()\n", err.Error())
|
||||
var src *os.File
|
||||
var dst *os.File
|
||||
if src, err = os.Open(tmp.Name()); err != nil {
|
||||
|
||||
mode := os.FileMode(0755)
|
||||
if originalBin, err := os.Lstat(to); err == nil {
|
||||
mode = originalBin.Mode()
|
||||
err := os.Remove(to)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if dst, err = os.Create(to); err != nil {
|
||||
}
|
||||
|
||||
err = os.Rename(tmp.Name(), to)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := io.Copy(dst, src); err != nil {
|
||||
|
||||
err = os.Chmod(to, mode)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := os.Chmod(to, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
colors.Success.Printf("Successfully installed '%s' under %s\n", name, INSTALL_PATH)
|
||||
return nil
|
||||
|
@ -17,7 +17,7 @@ import (
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
const VERSION = "1.7.9"
|
||||
const VERSION = "1.7.10"
|
||||
|
||||
type OptionMap map[string][]interface{}
|
||||
type Options map[string]OptionMap
|
||||
|
Loading…
Reference in New Issue
Block a user