Skip to content

Commit

Permalink
use docopt struct instead of map since we already have a struct
Browse files Browse the repository at this point in the history
  • Loading branch information
kovetskiy committed Apr 5, 2021
1 parent e725773 commit 5fd862c
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 64 deletions.
35 changes: 18 additions & 17 deletions auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@ type Credentials struct {
}

func GetCredentials(
args map[string]interface{},
flags Flags,
config *Config,
) (*Credentials, error) {
var err error

var (
username, _ = args["-u"].(string)
password, _ = args["-p"].(string)
targetURL, _ = args["-l"].(string)
username = flags.Username
password = flags.Password
targetURL = flags.TargetURL
)

var err error

if username == "" {
username = config.Username
if username == "" {
Expand All @@ -50,14 +50,15 @@ func GetCredentials(
}

if password == "-" {
b, err := ioutil.ReadAll(os.Stdin)
stdin, err := ioutil.ReadAll(os.Stdin)
if err != nil {
return nil, karma.Format(
err,
"unable to read password from stdin",
)
}
password = string(b)

password = string(stdin)
}

url, err := url.Parse(targetURL)
Expand All @@ -71,16 +72,16 @@ func GetCredentials(
baseURL := url.Scheme + "://" + url.Host

if url.Host == "" {
var ok bool
baseURL, ok = args["--base-url"].(string)
if !ok {
baseURL = flags.BaseURL
if baseURL == "" {
baseURL = config.BaseURL
if baseURL == "" {
return nil, errors.New(
"Confluence base URL should be specified using -l " +
"flag or be stored in configuration file",
)
}
}

if baseURL == "" {
return nil, errors.New(
"Confluence base URL should be specified using -l " +
"flag or be stored in configuration file",
)
}
}

Expand Down
96 changes: 53 additions & 43 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,25 @@ import (
"github.com/reconquest/pkg/log"
)

type markFlags struct {
fileGlobPatten string
compileOnly bool
dryRun bool
editLock bool
dropH1 bool
minorEdit bool
color string
type Flags struct {
FileGlobPatten string `docopt:"-f"`
CompileOnly bool `docopt:"--compile-only"`
DryRun bool `docopt:"--dry-run"`
EditLock bool `docopt:"-k"`
DropH1 bool `docopt:"--drop-h1"`
MinorEdit bool `docopt:"--minor-edit"`
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 (
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
Expand Down Expand Up @@ -65,30 +72,26 @@ Options:
)

func main() {
args, err := docopt.ParseArgs(usage, nil, "5.6")
cmd, err := docopt.ParseArgs(usage, nil, version)
if err != nil {
panic(err)
}

flags := &markFlags{
fileGlobPatten: args["-f"].(string),
compileOnly: args["--compile-only"].(bool),
dryRun: args["--dry-run"].(bool),
editLock: args["-k"].(bool),
dropH1: args["--drop-h1"].(bool),
minorEdit: args["--minor-edit"].(bool),
color: args["--color"].(string),
var flags Flags
err = cmd.Bind(&flags)
if err != nil {
log.Fatal(err)
}

if args["--debug"].(bool) {
if flags.Debug {
log.SetLevel(lorg.LevelDebug)
}

if args["--trace"].(bool) {
if flags.Trace {
log.SetLevel(lorg.LevelTrace)
}

if flags.color == "never" {
if flags.Color == "never" {
log.GetLogger().SetFormat(
lorg.NewFormat(
`${time:2006-01-02 15:04:05.000} ${level:%s:left:true} ${prefix}%s`,
Expand All @@ -102,26 +105,26 @@ func main() {
log.Fatal(err)
}

creds, err := GetCredentials(args, config)
creds, err := GetCredentials(flags, config)
if err != nil {
log.Fatal(err)
}

api := confluence.NewAPI(creds.BaseURL, creds.Username, creds.Password)

files, err := filepath.Glob(flags.fileGlobPatten)
files, err := filepath.Glob(flags.FileGlobPatten)
if err != nil {
log.Fatal(err)
}
if len(files) == 0 {
log.Fatal("No files matched.")
log.Fatal("No files matched")
}

// Loop through files matched by glob pattern
for _, file := range files {
log.Infof(
nil,
"Processing %s...",
"processing %s",
file,
)

Expand All @@ -133,13 +136,17 @@ func main() {
creds.BaseURL+target.Links.Full,
)

fmt.Println(
"Page available at:", creds.BaseURL+target.Links.Full,
)
fmt.Println(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)
if err != nil {
log.Fatal(err)
Expand Down Expand Up @@ -194,16 +201,16 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri

markdown = mark.SubstituteLinks(markdown, links)

if flags.dryRun {
flags.compileOnly = true
if flags.DryRun {
flags.CompileOnly = true

_, _, err := mark.ResolvePage(flags.dryRun, api, meta)
_, _, err := mark.ResolvePage(flags.DryRun, api, meta)
if err != nil {
log.Fatalf(err, "unable to resolve page location")
}
}

if flags.compileOnly {
if flags.CompileOnly {
fmt.Println(mark.CompileMarkdown(markdown, stdlib))
os.Exit(0)
}
Expand All @@ -228,7 +235,7 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri
var target *confluence.PageInfo

if meta != nil {
parent, page, err := mark.ResolvePage(flags.dryRun, api, meta)
parent, page, err := mark.ResolvePage(flags.DryRun, api, meta)
if err != nil {
log.Fatalf(
karma.Describe("title", meta.Title).Reason(err),
Expand All @@ -238,7 +245,13 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri
}

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 {
log.Fatalf(
err,
Expand Down Expand Up @@ -270,9 +283,9 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri

markdown = mark.CompileAttachmentLinks(markdown, attaches)

if flags.dropH1 {
if flags.DropH1 {
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)
}
Expand Down Expand Up @@ -300,23 +313,20 @@ func processFile(file string, api *confluence.API, flags *markFlags, pageID stri
html = buffer.String()
}

err = api.UpdatePage(target, html, flags.minorEdit, meta.Labels)
err = api.UpdatePage(target, html, flags.MinorEdit, meta.Labels)
if err != nil {
log.Fatal(err)
}

if flags.editLock {
if flags.EditLock {
log.Infof(
nil,
`edit locked on page %q by user %q to prevent manual edits`,
target.Title,
username,
)

err := api.RestrictPageUpdates(
target,
username,
)
err := api.RestrictPageUpdates(target, username)
if err != nil {
log.Fatal(err)
}
Expand Down
9 changes: 6 additions & 3 deletions pkg/mark/macro/macro.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,17 @@ func ExtractMacros(

var (
expr = regexputil.Subexp(reMacroDirective, groups, "expr")
template = regexputil.Subexp(reMacroDirective, groups, "template")
config = regexputil.Subexp(reMacroDirective, groups, "config")
template = regexputil.Subexp(
reMacroDirective,
groups,
"template",
)
config = regexputil.Subexp(reMacroDirective, groups, "config")

macro Macro
)

macro.Template, err = includes.LoadTemplate(template, templates)

if err != nil {
err = karma.Format(err, "unable to load template")

Expand Down
2 changes: 1 addition & 1 deletion pkg/mark/mark.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func ResolvePage(
if meta.Type == "blogpost" {
log.Infof(
nil,
"Blog post will be stored as: %s",
"blog post will be stored as: %s",
meta.Title,
)

Expand Down

0 comments on commit 5fd862c

Please sign in to comment.