use docopt struct instead of map since we already have a struct

This commit is contained in:
Egor Kovetskiy 2021-04-05 07:56:25 +03:00
parent e72577327c
commit 5fd862c450
4 changed files with 79 additions and 65 deletions

37
auth.go
View File

@ -18,17 +18,17 @@ type Credentials struct {
} }
func GetCredentials( func GetCredentials(
args map[string]interface{}, flags Flags,
config *Config, config *Config,
) (*Credentials, error) { ) (*Credentials, error) {
var (
username, _ = args["-u"].(string)
password, _ = args["-p"].(string)
targetURL, _ = args["-l"].(string)
)
var err error var err error
var (
username = flags.Username
password = flags.Password
targetURL = flags.TargetURL
)
if username == "" { if username == "" {
username = config.Username username = config.Username
if username == "" { if username == "" {
@ -50,14 +50,15 @@ func GetCredentials(
} }
if password == "-" { if password == "-" {
b, err := ioutil.ReadAll(os.Stdin) stdin, err := ioutil.ReadAll(os.Stdin)
if err != nil { if err != nil {
return nil, karma.Format( return nil, karma.Format(
err, err,
"unable to read password from stdin", "unable to read password from stdin",
) )
} }
password = string(b)
password = string(stdin)
} }
url, err := url.Parse(targetURL) url, err := url.Parse(targetURL)
@ -71,16 +72,16 @@ func GetCredentials(
baseURL := url.Scheme + "://" + url.Host baseURL := url.Scheme + "://" + url.Host
if url.Host == "" { if url.Host == "" {
var ok bool baseURL = flags.BaseURL
baseURL, ok = args["--base-url"].(string) if baseURL == "" {
if !ok {
baseURL = config.BaseURL baseURL = config.BaseURL
if baseURL == "" { }
return nil, errors.New(
"Confluence base URL should be specified using -l " + if baseURL == "" {
"flag or be stored in configuration file", return nil, errors.New(
) "Confluence base URL should be specified using -l " +
} "flag or be stored in configuration file",
)
} }
} }

96
main.go
View File

@ -18,18 +18,25 @@ import (
"github.com/reconquest/pkg/log" "github.com/reconquest/pkg/log"
) )
type markFlags struct { type Flags struct {
fileGlobPatten string FileGlobPatten string `docopt:"-f"`
compileOnly bool CompileOnly bool `docopt:"--compile-only"`
dryRun bool DryRun bool `docopt:"--dry-run"`
editLock bool EditLock bool `docopt:"-k"`
dropH1 bool DropH1 bool `docopt:"--drop-h1"`
minorEdit bool MinorEdit bool `docopt:"--minor-edit"`
color string Color string `docopt:"--color"`
Debug bool `docopt:"--debug"`
Trace bool `docopt:"--trace"`
Username string `docopt:"-u"`
Password string `docopt:"-p"`
TargetURL string `docopt:"-l"`
BaseURL string `docopt:"--base-url"`
} }
const ( const (
usage = `mark - a tool for updating Atlassian Confluence pages from markdown. version = "5.6"
usage = `mark - a tool for updating Atlassian Confluence pages from markdown.
Docs: https://github.com/kovetskiy/mark Docs: https://github.com/kovetskiy/mark
@ -65,30 +72,26 @@ Options:
) )
func main() { func main() {
args, err := docopt.ParseArgs(usage, nil, "5.6") cmd, err := docopt.ParseArgs(usage, nil, version)
if err != nil { if err != nil {
panic(err) panic(err)
} }
flags := &markFlags{ var flags Flags
fileGlobPatten: args["-f"].(string), err = cmd.Bind(&flags)
compileOnly: args["--compile-only"].(bool), if err != nil {
dryRun: args["--dry-run"].(bool), log.Fatal(err)
editLock: args["-k"].(bool),
dropH1: args["--drop-h1"].(bool),
minorEdit: args["--minor-edit"].(bool),
color: args["--color"].(string),
} }
if args["--debug"].(bool) { if flags.Debug {
log.SetLevel(lorg.LevelDebug) log.SetLevel(lorg.LevelDebug)
} }
if args["--trace"].(bool) { if flags.Trace {
log.SetLevel(lorg.LevelTrace) log.SetLevel(lorg.LevelTrace)
} }
if flags.color == "never" { if flags.Color == "never" {
log.GetLogger().SetFormat( log.GetLogger().SetFormat(
lorg.NewFormat( lorg.NewFormat(
`${time:2006-01-02 15:04:05.000} ${level:%s:left:true} ${prefix}%s`, `${time:2006-01-02 15:04:05.000} ${level:%s:left:true} ${prefix}%s`,
@ -102,26 +105,26 @@ func main() {
log.Fatal(err) log.Fatal(err)
} }
creds, err := GetCredentials(args, config) creds, err := GetCredentials(flags, config)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
api := confluence.NewAPI(creds.BaseURL, creds.Username, creds.Password) api := confluence.NewAPI(creds.BaseURL, creds.Username, creds.Password)
files, err := filepath.Glob(flags.fileGlobPatten) files, err := filepath.Glob(flags.FileGlobPatten)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
if len(files) == 0 { if len(files) == 0 {
log.Fatal("No files matched.") log.Fatal("No files matched")
} }
// Loop through files matched by glob pattern // Loop through files matched by glob pattern
for _, file := range files { for _, file := range files {
log.Infof( log.Infof(
nil, nil,
"Processing %s...", "processing %s",
file, file,
) )
@ -133,13 +136,17 @@ func main() {
creds.BaseURL+target.Links.Full, creds.BaseURL+target.Links.Full,
) )
fmt.Println( fmt.Println(creds.BaseURL + target.Links.Full)
"Page available at:", creds.BaseURL+target.Links.Full,
)
} }
} }
func processFile(file string, api *confluence.API, flags *markFlags, pageID string, username string) *confluence.PageInfo { func processFile(
file string,
api *confluence.API,
flags Flags,
pageID string,
username string,
) *confluence.PageInfo {
markdown, err := ioutil.ReadFile(file) markdown, err := ioutil.ReadFile(file)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@ -194,16 +201,16 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri
markdown = mark.SubstituteLinks(markdown, links) markdown = mark.SubstituteLinks(markdown, links)
if flags.dryRun { if flags.DryRun {
flags.compileOnly = true flags.CompileOnly = true
_, _, err := mark.ResolvePage(flags.dryRun, api, meta) _, _, err := mark.ResolvePage(flags.DryRun, api, meta)
if err != nil { if err != nil {
log.Fatalf(err, "unable to resolve page location") log.Fatalf(err, "unable to resolve page location")
} }
} }
if flags.compileOnly { if flags.CompileOnly {
fmt.Println(mark.CompileMarkdown(markdown, stdlib)) fmt.Println(mark.CompileMarkdown(markdown, stdlib))
os.Exit(0) os.Exit(0)
} }
@ -228,7 +235,7 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri
var target *confluence.PageInfo var target *confluence.PageInfo
if meta != nil { if meta != nil {
parent, page, err := mark.ResolvePage(flags.dryRun, api, meta) parent, page, err := mark.ResolvePage(flags.DryRun, api, meta)
if err != nil { if err != nil {
log.Fatalf( log.Fatalf(
karma.Describe("title", meta.Title).Reason(err), karma.Describe("title", meta.Title).Reason(err),
@ -238,7 +245,13 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri
} }
if page == nil { if page == nil {
page, err = api.CreatePage(meta.Space, meta.Type, parent, meta.Title, ``) page, err = api.CreatePage(
meta.Space,
meta.Type,
parent,
meta.Title,
``,
)
if err != nil { if err != nil {
log.Fatalf( log.Fatalf(
err, err,
@ -270,9 +283,9 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri
markdown = mark.CompileAttachmentLinks(markdown, attaches) markdown = mark.CompileAttachmentLinks(markdown, attaches)
if flags.dropH1 { if flags.DropH1 {
log.Info( log.Info(
"Leading H1 heading will be excluded from the Confluence output", "the leading H1 heading will be excluded from the Confluence output",
) )
markdown = mark.DropDocumentLeadingH1(markdown) markdown = mark.DropDocumentLeadingH1(markdown)
} }
@ -300,12 +313,12 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri
html = buffer.String() html = buffer.String()
} }
err = api.UpdatePage(target, html, flags.minorEdit, meta.Labels) err = api.UpdatePage(target, html, flags.MinorEdit, meta.Labels)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
if flags.editLock { if flags.EditLock {
log.Infof( log.Infof(
nil, nil,
`edit locked on page %q by user %q to prevent manual edits`, `edit locked on page %q by user %q to prevent manual edits`,
@ -313,10 +326,7 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri
username, username,
) )
err := api.RestrictPageUpdates( err := api.RestrictPageUpdates(target, username)
target,
username,
)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }

View File

@ -123,14 +123,17 @@ func ExtractMacros(
var ( var (
expr = regexputil.Subexp(reMacroDirective, groups, "expr") expr = regexputil.Subexp(reMacroDirective, groups, "expr")
template = regexputil.Subexp(reMacroDirective, groups, "template") template = regexputil.Subexp(
config = regexputil.Subexp(reMacroDirective, groups, "config") reMacroDirective,
groups,
"template",
)
config = regexputil.Subexp(reMacroDirective, groups, "config")
macro Macro macro Macro
) )
macro.Template, err = includes.LoadTemplate(template, templates) macro.Template, err = includes.LoadTemplate(template, templates)
if err != nil { if err != nil {
err = karma.Format(err, "unable to load template") err = karma.Format(err, "unable to load template")

View File

@ -25,7 +25,7 @@ func ResolvePage(
if meta.Type == "blogpost" { if meta.Type == "blogpost" {
log.Infof( log.Infof(
nil, nil,
"Blog post will be stored as: %s", "blog post will be stored as: %s",
meta.Title, meta.Title,
) )