Skip to content

Commit

Permalink
Recreate folders on restart
Browse files Browse the repository at this point in the history
  • Loading branch information
jotadrilo committed Jun 17, 2019
1 parent 54680f6 commit dc666aa
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 18 deletions.
4 changes: 4 additions & 0 deletions BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ go_library(
],
importpath = "github.com/jotadrilo/rubbi-sh",
visibility = ["//visibility:private"],
deps = [
"//vendor/github.com/juju/errors:go_default_library",
"//vendor/github.com/mmikulicic/multierror:go_default_library",
],
)

go_binary(
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
## Release 0.0.9 (2019-06-15)

- Re-create folder structure on restart

## Release 0.0.9 (2019-06-15)

- Test release

## Release 0.0.8 (2019-06-15)
Expand Down
44 changes: 32 additions & 12 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import (
"io/ioutil"
"os"
"path/filepath"

"github.com/juju/errors"
"github.com/mmikulicic/multierror"
)

var (
Expand Down Expand Up @@ -40,7 +43,7 @@ func Initialize(root string) error {
} else {
configFolder = filepath.Join(home, configFolderName)
if err := os.MkdirAll(configFolder, 0755); err != nil {
return fmt.Errorf("unable to create directory tree: %+v", err)
return errors.Errorf("unable to create directory tree: %+v", err)
}
configFile = filepath.Join(home, configFolderName, configFileName)
}
Expand Down Expand Up @@ -79,7 +82,7 @@ func initConifg() error {
Root: rubbishFolder,
}
if _, err := os.Create(configFile); err != nil {
return fmt.Errorf("failed to create configuration file: %+v", err)
return errors.Errorf("failed to create configuration file: %+v", err)
}
if err := config.Save(); err != nil {
return err
Expand All @@ -90,7 +93,7 @@ func initConifg() error {
// Clean will remove the root rubbish folder and will recreate the configuration
func (config *Config) Clean() error {
if err := os.RemoveAll(config.Root); err != nil {
return fmt.Errorf("failed to remove the folder: %+v", err)
return errors.Errorf("failed to remove the folder: %+v", err)
}
if err := initConifg(); err != nil {
return err
Expand All @@ -102,12 +105,12 @@ func (config *Config) Clean() error {
func Load() (*Config, error) {
b, err := ioutil.ReadFile(configFile)
if err != nil {
return nil, fmt.Errorf("failed to read file: %+v", err)
return nil, errors.Errorf("failed to read file: %+v", err)
}

config := &Config{}
if err := json.Unmarshal([]byte(b), config); err != nil {
return nil, fmt.Errorf("failed to decode data: %+v", err)
return nil, errors.Errorf("failed to decode data: %+v", err)
}

return config, nil
Expand All @@ -117,17 +120,17 @@ func Load() (*Config, error) {
func (config *Config) Save() error {
data, err := json.MarshalIndent(config, "", " ")
if err != nil {
return fmt.Errorf("failed to encode data: %+v", err)
return errors.Errorf("failed to encode data: %+v", err)
}
if err := ioutil.WriteFile(configFile, data, 0644); err != nil {
return fmt.Errorf("failed to write file: %+v", err)
return errors.Errorf("failed to write file: %+v", err)
}
return nil
}

func createFolder(folder Folder) error {
if err := os.MkdirAll(folder.Path, 0755); err != nil {
return fmt.Errorf("failed to create directory tree: %+v", err)
return errors.Errorf("failed to create directory tree: %+v", err)
}
return nil
}
Expand Down Expand Up @@ -181,7 +184,7 @@ func (config *Config) Show() error {
// Use changes the latest folder to the provided folder number
func (config *Config) Use(fn int) error {
if fn > len(config.Folders)-1 {
return fmt.Errorf("the provided folder number does not match any existing folder")
return errors.Errorf("the provided folder number does not match any existing folder")
}
config.Latest = config.Folders[fn]
return nil
Expand All @@ -192,7 +195,7 @@ func (config *Config) Use(fn int) error {
func (config *Config) RemoveFolder(fn int) error {
targetFolder := config.Folders[fn]
if err := os.RemoveAll(targetFolder.Path); err != nil {
return fmt.Errorf("failed to remove the folder: %+v", err)
return errors.Errorf("failed to remove the folder: %+v", err)
}
config.Folders = remove(config.Folders, fn)

Expand All @@ -203,6 +206,23 @@ func (config *Config) RemoveFolder(fn int) error {
return nil
}

// Iterate over the folder entries and create them again.
func (config *Config) Recreate() (errs error) {
for _, fol := range config.Folders {
if _, err := os.Stat(configFile); err != nil {
if os.IsNotExist(err) {
if err := createFolder(fol); err != nil {
errs = multierror.Append(errs, errors.Errorf("failed to create folder %s: %+v", fol.Name, err))
}
}
} else {
errs = multierror.Append(errs, errors.Errorf("failed to recreate folder %s: %+v", fol.Name, err))
}
}

return errors.Trace(errs)
}

// https://stackoverflow.com/questions/37334119/how-to-delete-an-element-from-a-slice-in-golang/37335777#37335777
func remove(s []Folder, i int) []Folder {
s[len(s)-1], s[i] = s[i], s[len(s)-1]
Expand All @@ -216,12 +236,12 @@ func (config *Config) updateLatest(folder Folder) error {
// Remove existing symlink
if _, err := os.Lstat(latestFolder.Path); err == nil {
if err := os.Remove(latestFolder.Path); err != nil {
return fmt.Errorf("failed to remove the current latest symlink: %+v", err)
return errors.Errorf("failed to remove the current latest symlink: %+v", err)
}
}

if err := os.Symlink(config.Latest.Name, latestFolder.Path); err != nil {
return fmt.Errorf("failed to create the latest symlink: %+v", err)
return errors.Errorf("failed to create the latest symlink: %+v", err)
}

return nil
Expand Down
12 changes: 12 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
module github.com/jotadrilo/rubbi-sh

go 1.12

require (
github.com/cesanta/errors v0.0.0-20160612174407-5adec772d663 // indirect
github.com/juju/errors v0.0.0-20190207033735-e65537c515d7
github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 // indirect
github.com/juju/testing v0.0.0-20190613124551-e81189438503 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/mmikulicic/multierror v0.0.0-20170428094957-c1ad6b5ecd26
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce // indirect
gopkg.in/yaml.v2 v2.2.2 // indirect
)
22 changes: 22 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
github.com/cesanta/errors v0.0.0-20160612174407-5adec772d663 h1:yxe0VAaLkwh7cXoC9IhNhUuJa91au1BMEOWWKxgjK94=
github.com/cesanta/errors v0.0.0-20160612174407-5adec772d663/go.mod h1:5V6uYRtJZjiJla602WCKuuB+JiHZDG1E3KOHWmBxr48=
github.com/juju/errors v0.0.0-20190207033735-e65537c515d7 h1:dMIPRDg6gi7CUp0Kj2+HxqJ5kTr1iAdzsXYIrLCNSmU=
github.com/juju/errors v0.0.0-20190207033735-e65537c515d7/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 h1:UUHMLvzt/31azWTN/ifGWef4WUqvXk0iRqdhdy/2uzI=
github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
github.com/juju/testing v0.0.0-20190613124551-e81189438503 h1:ZUgTbk8oHgP0jpMieifGC9Lv47mHn8Pb3mFX3/Ew4iY=
github.com/juju/testing v0.0.0-20190613124551-e81189438503/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mmikulicic/multierror v0.0.0-20170428094957-c1ad6b5ecd26 h1:Sk/rGhRF3TAxGR8Ldp3lAUw8GJehJct+5LVU79F13DI=
github.com/mmikulicic/multierror v0.0.0-20170428094957-c1ad6b5ecd26/go.mod h1:GNJ15ZAuaQsmIEb/VWpp0pn83vYzb6PglASRGNhEPww=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU=
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
19 changes: 13 additions & 6 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ func run() error {
if *use != "" {
fn, err := strconv.Atoi(*use)
if err != nil {
return fmt.Errorf("failed to parse folder number to use: %+v", err)
return errors.Errorf("failed to parse folder number to use: %+v", err)
}
if err := config.Use(fn); err != nil {
return err
Expand Down Expand Up @@ -99,7 +99,7 @@ func run() error {
if *del != "" {
fn, err := strconv.Atoi(*del)
if err != nil {
return fmt.Errorf("failed to parse folder number to delete: %+v", err)
return errors.Errorf("failed to parse folder number to delete: %+v", err)
}
if err := config.RemoveFolder(fn); err != nil {
return err
Expand All @@ -110,14 +110,21 @@ func run() error {

// Try to change to the target directory
if err := os.Chdir(config.Latest.Path); err != nil {
return fmt.Errorf("failed to change to directory: %+v", err)
// There possibily was a restart that removed the `tmp` folder.
if err := config.AddFolder(config.Latest.Name); err != nil {
return err
}
if err := os.Chdir(config.Latest.Path); err != nil {
return errors.Errorf("failed to change to directory: %+v", err)
}
}
// Print path as we cannot change the shell working directory
// from an external binary
fmt.Printf(config.Latest.Path)

// Dump all the changes in the done configuration
config.Save()

// Print path as we cannot change the shell working directory
// from an external binary
fmt.Printf(config.Latest.Path)

return nil
}

0 comments on commit dc666aa

Please sign in to comment.