mirror of
https://github.com/kovetskiy/mark.git
synced 2025-06-08 15:32:40 +08:00
use docopt struct instead of map since we already have a struct
This commit is contained in:
parent
e72577327c
commit
5fd862c450
37
auth.go
37
auth.go
@ -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
96
main.go
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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")
|
||||||
|
|
||||||
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user