diff --git a/cmd/wf/config_nix.go b/cmd/wf/config_nix.go index 4abd334..ddc1bff 100644 --- a/cmd/wf/config_nix.go +++ b/cmd/wf/config_nix.go @@ -1,7 +1,5 @@ // +build !windows package main -var appInfo = map[string]string{ - "configDir": ".writefreely", -} +const configDir = ".writefreely" diff --git a/cmd/wf/config_win.go b/cmd/wf/config_win.go index e44b45b..1673fa1 100644 --- a/cmd/wf/config_win.go +++ b/cmd/wf/config_win.go @@ -1,7 +1,5 @@ // +build windows package main -var appInfo = map[string]string{ - "configDir": "WriteFreely", -} +const configDir = "WriteFreely" diff --git a/cmd/wf/flags.go b/cmd/wf/flags.go index 854b1f8..5245bb7 100644 --- a/cmd/wf/flags.go +++ b/cmd/wf/flags.go @@ -1,25 +1,16 @@ 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, - }, +var flags = []cli.Flag{ cli.StringFlag{ Name: "host, H", Usage: "Operate against a custom hostname", }, cli.StringFlag{ Name: "user, u", Usage: "Use authenticated user, other than default", }, } diff --git a/cmd/wf/main.go b/cmd/wf/main.go index 3ede8a6..31fc450 100644 --- a/cmd/wf/main.go +++ b/cmd/wf/main.go @@ -1,249 +1,253 @@ package main import ( "os" "github.com/writeas/writeas-cli/commands" "github.com/writeas/writeas-cli/config" cli "gopkg.in/urfave/cli.v1" ) func main() { + appInfo := map[string]string{ + "configDir": configDir, + "version": "1.0", + } config.DirMustExist(config.UserDataDir(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.Version = appInfo["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.Flags = append(config.PostFlags, flags...) 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: "blogs", Usage: "List blogs", Action: commands.CmdCollections, Flags: []cli.Flag{ cli.BoolFlag{ Name: "url", Usage: "Show list with URLs", }, }, }, { Name: "claim", Usage: "Claim local unsynced posts", Action: commands.CmdClaim, Description: "This will claim any unsynced posts local to this machine. To see which posts these are run: writeas posts.", Flags: []cli.Flag{ 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) } diff --git a/cmd/writeas/config_nix.go b/cmd/writeas/config_nix.go index 6b3cb86..6c0ed02 100644 --- a/cmd/writeas/config_nix.go +++ b/cmd/writeas/config_nix.go @@ -1,7 +1,5 @@ // +build !windows package main -var appInfo = map[string]string{ - "configDir": ".writeas", -} +const configDir = ".writeas" diff --git a/cmd/writeas/config_win.go b/cmd/writeas/config_win.go index 9a7eea1..43d2bca 100644 --- a/cmd/writeas/config_win.go +++ b/cmd/writeas/config_win.go @@ -1,7 +1,5 @@ // +build windows package main -var appInfo = map[string]string{ - "configDir": "Write.as", -} +const configDir = "Write.as" diff --git a/cmd/writeas/flags.go b/cmd/writeas/flags.go index f19f830..5fdaf8a 100644 --- a/cmd/writeas/flags.go +++ b/cmd/writeas/flags.go @@ -1,22 +1,13 @@ 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, - }, +var flags = []cli.Flag{ cli.StringFlag{ Name: "user, u", Hidden: true, Value: "user", }, } diff --git a/cmd/writeas/main.go b/cmd/writeas/main.go index 10750b4..d94dfca 100644 --- a/cmd/writeas/main.go +++ b/cmd/writeas/main.go @@ -1,249 +1,253 @@ package main import ( "os" "github.com/writeas/writeas-cli/commands" "github.com/writeas/writeas-cli/config" cli "gopkg.in/urfave/cli.v1" ) func main() { + appInfo := map[string]string{ + "configDir": configDir, + "version": "2.0", + } config.DirMustExist(config.UserDataDir(appInfo["configDir"])) cli.VersionFlag = cli.BoolFlag{ Name: "version, V", Usage: "print the version", } // Run the app app := cli.NewApp() app.Name = "writeas" - app.Version = config.Version + app.Version = appInfo["version"] app.Usage = "Publish text quickly" 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.Flags = append(config.PostFlags, flags...) 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: "blogs", Usage: "List blogs", Action: commands.CmdCollections, Flags: []cli.Flag{ cli.BoolFlag{ Name: "url", Usage: "Show list with URLs", }, }, }, { Name: "claim", Usage: "Claim local unsynced posts", Action: commands.CmdClaim, Description: "This will claim any unsynced posts local to this machine. To see which posts these are run: writeas posts.", Flags: []cli.Flag{ 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) } diff --git a/config/options.go b/config/options.go index 78d3335..5bd0a18 100644 --- a/config/options.go +++ b/config/options.go @@ -1,81 +1,80 @@ package config import ( "net/url" "github.com/cloudfoundry/jibber_jabber" "github.com/writeas/writeas-cli/log" cli "gopkg.in/urfave/cli.v1" ) // Application constants. const ( - Version = "2.0" - defaultUserAgent = "writeas-cli v" + Version + defaultUserAgent = "writeas-cli v" // Defaults for posts on Write.as. DefaultFont = PostFontMono WriteasBaseURL = "https://write.as" DevBaseURL = "https://development.write.as" TorBaseURL = "http://writeas7pm7rcdqg.onion" ) func UserAgent(c *cli.Context) string { ua := c.String("user-agent") if ua == "" { - return defaultUserAgent + return defaultUserAgent + c.App.ExtraInfo()["version"] } - return ua + " (" + defaultUserAgent + ")" + return ua + " (" + defaultUserAgent + c.App.ExtraInfo()["version"] + ")" } func IsTor(c *cli.Context) bool { return c.Bool("tor") || c.Bool("t") } func Language(c *cli.Context, auto bool) string { if l := c.String("lang"); l != "" { return l } if !auto { return "" } // Automatically detect language l, err := jibber_jabber.DetectLanguage() if err != nil { log.Info(c, "Language detection failed: %s", err) return "" } return l } func Collection(c *cli.Context) string { if coll := c.String("c"); coll != "" { return coll } if coll := c.String("b"); coll != "" { return coll } return "" } // HostDirectory returns the sub directory string for the host. Order of // precedence is a host flag if any, then the configured default, if any func HostDirectory(c *cli.Context) (string, error) { cfg, err := LoadConfig(UserDataDir(c.App.ExtraInfo()["configDir"])) if err != nil { return "", err } // flag takes precedence over defaults if hostFlag := c.GlobalString("host"); hostFlag != "" { u, err := url.Parse(hostFlag) if err != nil { return "", err } return u.Hostname(), nil } u, err := url.Parse(cfg.Default.Host) if err != nil { return "", err } return u.Hostname(), nil }