diff --git a/cmd/wf/.gitignore b/cmd/wf/.gitignore new file mode 100644 index 0000000..89b7a51 --- /dev/null +++ b/cmd/wf/.gitignore @@ -0,0 +1 @@ +wf \ No newline at end of file diff --git a/cmd/wf/config_nix.go b/cmd/wf/config_nix.go new file mode 100644 index 0000000..4abd334 --- /dev/null +++ b/cmd/wf/config_nix.go @@ -0,0 +1,7 @@ +// +build !windows + +package main + +var appInfo = map[string]string{ + "configDir": ".writefreely", +} diff --git a/cmd/wf/config_win.go b/cmd/wf/config_win.go new file mode 100644 index 0000000..e44b45b --- /dev/null +++ b/cmd/wf/config_win.go @@ -0,0 +1,7 @@ +// +build windows + +package main + +var appInfo = map[string]string{ + "configDir": "WriteFreely", +} diff --git a/cmd/wf/flags.go b/cmd/wf/flags.go new file mode 100644 index 0000000..03ed17c --- /dev/null +++ b/cmd/wf/flags.go @@ -0,0 +1,30 @@ +package main + +import ( + "gopkg.in/urfave/cli.v1" +) + +var globalFlags = []cli.Flag{ + cli.BoolFlag{ + Name: "tor, t", + Usage: "Perform action on Tor hidden service", + }, + cli.IntFlag{ + Name: "tor-port", + Usage: "Use a different port to connect to Tor", + Value: 9150, + }, + cli.BoolFlag{ + Name: "verbose, v", + Usage: "Make the operation more talkative", + }, + cli.StringFlag{ + Name: "user-agent", + Usage: "Sets the User-Agent for API requests", + Value: "", + }, + cli.StringFlag{ + Name: "host, H", + Usage: "Operate against a custom hostname", + }, +} diff --git a/cmd/wf/main.go b/cmd/wf/main.go new file mode 100644 index 0000000..8b78771 --- /dev/null +++ b/cmd/wf/main.go @@ -0,0 +1,266 @@ +package main + +import ( + "os" + + "github.com/writeas/writeas-cli/api" + "github.com/writeas/writeas-cli/commands" + "github.com/writeas/writeas-cli/config" + "github.com/writeas/writeas-cli/log" + cli "gopkg.in/urfave/cli.v1" +) + +func main() { + initialize(appInfo["configDir"]) + cli.VersionFlag = cli.BoolFlag{ + Name: "version, V", + Usage: "print the version", + } + + // Run the app + app := cli.NewApp() + app.Name = "wf" + app.Version = config.Version + app.Usage = "Publish text quickly" + // TODO: who is the author? the contributors? link to GH? + app.Authors = []cli.Author{ + { + Name: "Write.as", + Email: "hello@write.as", + }, + } + app.ExtraInfo = func() map[string]string { + return appInfo + } + app.Action = commands.CmdPost + app.Flags = globalFlags + app.Commands = []cli.Command{ + { + Name: "post", + Usage: "Alias for default action: create post from stdin", + Action: commands.CmdPost, + Flags: config.PostFlags, + Description: `Create a new post on Write.as from stdin. + + Use the --code flag to indicate that the post should use syntax + highlighting. Or use the --font [value] argument to set the post's + appearance, where [value] is mono, monospace (default), wrap (monospace + font with word wrapping), serif, or sans.`, + }, + { + Name: "new", + Usage: "Compose a new post from the command-line and publish", + Description: `An alternative to piping data to the program. + + On Windows, this will use 'copy con' to start reading what you input from the + prompt. Press F6 or Ctrl-Z then Enter to end input. + On *nix, this will use the best available text editor, starting with the + value set to the WRITEAS_EDITOR or EDITOR environment variable, or vim, or + finally nano. + + Use the --code flag to indicate that the post should use syntax + highlighting. Or use the --font [value] argument to set the post's + appearance, where [value] is mono, monospace (default), wrap (monospace + font with word wrapping), serif, or sans. + + If posting fails for any reason, 'writeas' will show you the temporary file + location and how to pipe it to 'writeas' to retry.`, + Action: commands.CmdNew, + Flags: config.PostFlags, + }, + { + Name: "publish", + Usage: "Publish a file to Write.as", + Action: commands.CmdPublish, + Flags: config.PostFlags, + }, + { + Name: "delete", + Usage: "Delete a post", + Action: commands.CmdDelete, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "tor, t", + Usage: "Delete via Tor hidden service", + }, + cli.IntFlag{ + Name: "tor-port", + Usage: "Use a different port to connect to Tor", + Value: 9150, + }, + cli.BoolFlag{ + Name: "verbose, v", + Usage: "Make the operation more talkative", + }, + }, + }, + { + Name: "update", + Usage: "Update (overwrite) a post", + Action: commands.CmdUpdate, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "tor, t", + Usage: "Update via Tor hidden service", + }, + cli.IntFlag{ + Name: "tor-port", + Usage: "Use a different port to connect to Tor", + Value: 9150, + }, + cli.BoolFlag{ + Name: "code", + Usage: "Specifies this post is code", + }, + cli.StringFlag{ + Name: "font", + Usage: "Sets post font to given value", + }, + cli.BoolFlag{ + Name: "verbose, v", + Usage: "Make the operation more talkative", + }, + }, + }, + { + Name: "get", + Usage: "Read a raw post", + Action: commands.CmdGet, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "tor, t", + Usage: "Get from Tor hidden service", + }, + cli.IntFlag{ + Name: "tor-port", + Usage: "Use a different port to connect to Tor", + Value: 9150, + }, + cli.BoolFlag{ + Name: "verbose, v", + Usage: "Make the operation more talkative", + }, + }, + }, + { + Name: "add", + Usage: "Add an existing post locally", + Description: `A way to add an existing post to your local store for easy editing later. + + This requires a post ID (from https://write.as/[ID]) and an Edit Token + (exported from another Write.as client, such as the Android app). +`, + Action: commands.CmdAdd, + }, + { + Name: "posts", + Usage: "List all of your posts", + Description: "This will list only local posts when not currently authenticated. To list remote posts as well, first run: writeas auth .", + Action: commands.CmdListPosts, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "id", + Usage: "Show list with post IDs (default)", + }, + cli.BoolFlag{ + Name: "md", + Usage: "Use with --url to return URLs with Markdown enabled", + }, + cli.BoolFlag{ + Name: "url", + Usage: "Show list with URLs", + }, + }, + }, + { + Name: "fetch", + Usage: "Fetch authenticated user's Write.as posts", + Action: api.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, + }, + cli.BoolFlag{ + Name: "verbose, v", + Usage: "Make the operation more talkative", + }, + }, + }, + { + Name: "auth", + Usage: "Authenticate with Write.as", + Action: commands.CmdAuth, + 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, + }, + cli.BoolFlag{ + Name: "verbose, v", + Usage: "Make the operation more talkative", + }, + }, + }, + { + Name: "logout", + Usage: "Log out of Write.as", + Action: commands.CmdLogOut, + 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, + }, + cli.BoolFlag{ + Name: "verbose, v", + Usage: "Make the operation more talkative", + }, + }, + }, + } + + cli.CommandHelpTemplate = `NAME: + {{.Name}} - {{.Usage}} + +USAGE: + writeas {{.Name}}{{if .Flags}} [command options]{{end}} [arguments...]{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if .Flags}} + +OPTIONS: + {{range .Flags}}{{.}} + {{end}}{{ end }} +` + app.Run(os.Args) +} + +func initialize(dataDirName string) { + // Ensure we have a data directory to use + if !config.DataDirExists(dataDirName) { + err := config.CreateDataDir(dataDirName) + if err != nil { + if config.Debug() { + panic(err) + } else { + log.Errorln("Error creating data directory: %s", err) + return + } + } + } +}