diff --git a/cmd/writeas/cli.go b/cmd/writeas/cli.go index a7e91da..f122d08 100644 --- a/cmd/writeas/cli.go +++ b/cmd/writeas/cli.go @@ -197,6 +197,22 @@ func main() { }, }, { + Name: "fetch", + Usage: "Fetch authenticated user's Write.as posts", + Action: cmdPull, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "tor, t", + Usage: "Authenticate via Tor hidden service", + }, + cli.IntFlag{ + Name: "tor-port", + Usage: "Use a different port to connect to Tor", + Value: 9150, + }, + }, + }, + { Name: "auth", Usage: "Authenticate with Write.as", Action: cmdAuth, diff --git a/cmd/writeas/sync.go b/cmd/writeas/sync.go new file mode 100644 index 0000000..f5ec3b7 --- /dev/null +++ b/cmd/writeas/sync.go @@ -0,0 +1,112 @@ +package main + +import ( + //"github.com/writeas/writeas-cli/sync" + "fmt" + "github.com/writeas/writeas-cli/fileutils" + "gopkg.in/urfave/cli.v1" + "io/ioutil" + "os" + "path/filepath" +) + +const ( + postFileExt = ".txt" +) + +func cmdPull(c *cli.Context) error { + cfg, err := loadConfig() + if err != nil { + return err + } + // Create posts directory if needed + if cfg.Posts.Directory == "" { + syncSetUp(cfg) + } + + // Fetch posts + cl, err := newClient(c, true) + if err != nil { + return err + } + + posts, err := cl.GetUserPosts() + if err != nil { + return err + } + + for _, p := range *posts { + postFilename := p.ID + collDir := "" + if p.Collection != nil { + postFilename = p.Slug + // Create directory for collection + collDir = p.Collection.Alias + if !fileutils.Exists(filepath.Join(cfg.Posts.Directory, collDir)) { + Info(c, "Creating folder "+collDir) + err = os.Mkdir(filepath.Join(cfg.Posts.Directory, collDir), 0755) + if err != nil { + Errorln("Error creating blog directory %s: %s. Skipping post %s.", collDir, err, postFilename) + continue + } + } + } + postFilename += postFileExt + + // Write file + err = ioutil.WriteFile(filepath.Join(cfg.Posts.Directory, collDir, postFilename), []byte(p.Content), 0644) + if err != nil { + Errorln("Error creating file %s: %s", postFilename, err) + } + Info(c, "Saved post "+postFilename) + + // Update mtime and atime on files + modTime := p.Updated.Local() + err = os.Chtimes(filepath.Join(cfg.Posts.Directory, collDir, postFilename), modTime, modTime) + if err != nil { + Errorln("Error setting time on %s: %s", postFilename, err) + } + } + + return nil +} + +// TODO: move UserConfig to its own package, and this to sync package +func syncSetUp(cfg *UserConfig) error { + // Prompt for posts directory + defaultDir, err := os.Getwd() + if err != nil { + return err + } + var dir string + fmt.Printf("Posts directory? [%s]: ", defaultDir) + fmt.Scanln(&dir) + if dir == "" { + dir = defaultDir + } + + // Create directory if needed + if !fileutils.Exists(dir) { + err = os.MkdirAll(dir, 0700) + if err != nil { + if debug { + Errorln("Error creating data directory: %s", err) + } + return err + } + fmt.Println("Created posts directory.") + } + + // Save preference + cfg.Posts.Directory = dir + err = saveConfig(cfg) + if err != nil { + if debug { + Errorln("Unable to save config: %s", err) + } + return err + } + fmt.Println("Saved config.") + + return nil +} diff --git a/cmd/writeas/userconfig.go b/cmd/writeas/userconfig.go index b8b5d64..f02fda0 100644 --- a/cmd/writeas/userconfig.go +++ b/cmd/writeas/userconfig.go @@ -18,8 +18,13 @@ type ( APIConfig struct { } + PostsConfig struct { + Directory string `ini:"directory"` + } + UserConfig struct { - API APIConfig `ini:"api"` + API APIConfig `ini:"api"` + Posts PostsConfig `ini:"posts"` } )