mirror of
https://github.com/kovetskiy/mark.git
synced 2025-04-24 05:42:40 +08:00
Merge pull request #16 from kovetskiy/skip-ancestry-improve-dry-run
do not require full ancestry, improve dry-run mode
This commit is contained in:
commit
fae91cec30
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
/mark
|
/mark
|
||||||
|
/docker
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
FROM golang:latest
|
FROM golang:latest
|
||||||
ENV GOPATH="/go/"
|
ENV GOPATH="/go"
|
||||||
WORKDIR /go/src/mark
|
WORKDIR /go/src/github.com/kovetskiy/mark
|
||||||
COPY / .
|
COPY / .
|
||||||
RUN make get
|
RUN make get
|
||||||
RUN make build
|
RUN make build
|
||||||
|
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
RUN apk --no-cache add ca-certificates bash
|
RUN apk --no-cache add ca-certificates bash
|
||||||
COPY --from=0 /go/src/mark/mark /bin/
|
COPY --from=0 /go/src/github.com/kovetskiy/mark/mark /bin/
|
||||||
RUN mkdir -p /docs
|
RUN mkdir -p /docs
|
||||||
WORKDIR /docs
|
WORKDIR /docs
|
||||||
ENTRYPOINT ["/bin/mark"]
|
ENTRYPOINT ["/bin/mark"]
|
||||||
|
14
Taskfile.yml
Normal file
14
Taskfile.yml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
version: '2'
|
||||||
|
|
||||||
|
vars:
|
||||||
|
pwd:
|
||||||
|
sh: pwd
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
confluence:
|
||||||
|
cmds:
|
||||||
|
- docker run -v {{ .pwd }}/docker:/var/atlassian/application-data/confluence
|
||||||
|
--name="confluence"
|
||||||
|
-p 8090:8090
|
||||||
|
-p 8091:8091
|
||||||
|
atlassian/confluence-server
|
117
main.go
117
main.go
@ -6,7 +6,6 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/kovetskiy/godocs"
|
"github.com/kovetskiy/godocs"
|
||||||
"github.com/kovetskiy/mark/pkg/confluence"
|
"github.com/kovetskiy/mark/pkg/confluence"
|
||||||
@ -123,7 +122,8 @@ Options:
|
|||||||
-f <file> Use specified markdown file for converting to html.
|
-f <file> Use specified markdown file for converting to html.
|
||||||
-k Lock page editing to current user only to prevent accidental
|
-k Lock page editing to current user only to prevent accidental
|
||||||
manual edits over Confluence Web UI.
|
manual edits over Confluence Web UI.
|
||||||
--dry-run Show resulting HTML and don't update Confluence page content.
|
--dry-run Resolve page and ancestry, show resulting HTML and exit.
|
||||||
|
--compile-only Show resulting HTML and don't update Confluence page content.
|
||||||
--debug Enable debug logs.
|
--debug Enable debug logs.
|
||||||
--trace Enable trace logs.
|
--trace Enable trace logs.
|
||||||
-h --help Show this screen and call 911.
|
-h --help Show this screen and call 911.
|
||||||
@ -139,6 +139,7 @@ func main() {
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
targetFile, _ = args["-f"].(string)
|
targetFile, _ = args["-f"].(string)
|
||||||
|
compileOnly = args["--compile-only"].(bool)
|
||||||
dryRun = args["--dry-run"].(bool)
|
dryRun = args["--dry-run"].(bool)
|
||||||
editLock = args["-k"].(bool)
|
editLock = args["-k"].(bool)
|
||||||
)
|
)
|
||||||
@ -205,6 +206,15 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if dryRun {
|
if dryRun {
|
||||||
|
compileOnly = true
|
||||||
|
|
||||||
|
_, _, err := mark.ResolvePage(dryRun, api, meta)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(err, "unable to resolve page location")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if compileOnly {
|
||||||
fmt.Println(mark.CompileMarkdown(markdown, stdlib))
|
fmt.Println(mark.CompileMarkdown(markdown, stdlib))
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
@ -229,7 +239,7 @@ func main() {
|
|||||||
var target *confluence.PageInfo
|
var target *confluence.PageInfo
|
||||||
|
|
||||||
if meta != nil {
|
if meta != nil {
|
||||||
page, err := resolvePage(api, meta)
|
parent, page, err := mark.ResolvePage(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),
|
||||||
@ -237,6 +247,17 @@ func main() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if page == nil {
|
||||||
|
page, err = api.CreatePage(meta.Space, parent, meta.Title, ``)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(
|
||||||
|
err,
|
||||||
|
"can't create page %q",
|
||||||
|
meta.Title,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
target = page
|
target = page
|
||||||
} else {
|
} else {
|
||||||
if creds.PageID == "" {
|
if creds.PageID == "" {
|
||||||
@ -307,94 +328,4 @@ func main() {
|
|||||||
"page successfully updated: %s\n",
|
"page successfully updated: %s\n",
|
||||||
creds.BaseURL+target.Links.Full,
|
creds.BaseURL+target.Links.Full,
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func resolvePage(
|
|
||||||
api *confluence.API,
|
|
||||||
meta *mark.Meta,
|
|
||||||
) (*confluence.PageInfo, error) {
|
|
||||||
page, err := api.FindPage(meta.Space, meta.Title)
|
|
||||||
if err != nil {
|
|
||||||
return nil, karma.Format(
|
|
||||||
err,
|
|
||||||
"error during finding page %q",
|
|
||||||
meta.Title,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
ancestry := meta.Parents
|
|
||||||
if page != nil {
|
|
||||||
ancestry = append(ancestry, page.Title)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(ancestry) > 0 {
|
|
||||||
page, err := mark.ValidateAncestry(
|
|
||||||
api,
|
|
||||||
meta.Space,
|
|
||||||
ancestry,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if page == nil {
|
|
||||||
log.Warningf(
|
|
||||||
nil,
|
|
||||||
"page %q is not found ",
|
|
||||||
meta.Parents[len(ancestry)-1],
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
path := meta.Parents
|
|
||||||
path = append(path, meta.Title)
|
|
||||||
|
|
||||||
log.Debugf(
|
|
||||||
nil,
|
|
||||||
"resolving page path: ??? > %s",
|
|
||||||
strings.Join(path, ` > `),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
parent, err := mark.EnsureAncestry(
|
|
||||||
api,
|
|
||||||
meta.Space,
|
|
||||||
meta.Parents,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, karma.Format(
|
|
||||||
err,
|
|
||||||
"can't create ancestry tree: %s",
|
|
||||||
strings.Join(meta.Parents, ` > `),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
titles := []string{}
|
|
||||||
for _, page := range parent.Ancestors {
|
|
||||||
titles = append(titles, page.Title)
|
|
||||||
}
|
|
||||||
|
|
||||||
titles = append(titles, parent.Title)
|
|
||||||
|
|
||||||
log.Infof(
|
|
||||||
nil,
|
|
||||||
"page will be stored under path: %s > %s",
|
|
||||||
strings.Join(titles, ` > `),
|
|
||||||
meta.Title,
|
|
||||||
)
|
|
||||||
|
|
||||||
if page == nil {
|
|
||||||
page, err := api.CreatePage(meta.Space, parent, meta.Title, ``)
|
|
||||||
if err != nil {
|
|
||||||
return nil, karma.Format(
|
|
||||||
err,
|
|
||||||
"can't create page %q",
|
|
||||||
meta.Title,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return page, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return page, nil
|
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func EnsureAncestry(
|
func EnsureAncestry(
|
||||||
|
dryRun bool,
|
||||||
api *confluence.API,
|
api *confluence.API,
|
||||||
space string,
|
space string,
|
||||||
ancestry []string,
|
ancestry []string,
|
||||||
@ -57,23 +58,33 @@ func EnsureAncestry(
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf(
|
log.Debugf(
|
||||||
nil,
|
nil,
|
||||||
"empty pages under %q to be created: %s",
|
"empty pages under %q to be created: %s",
|
||||||
parent.Title,
|
parent.Title,
|
||||||
strings.Join(rest, ` > `),
|
strings.Join(rest, ` > `),
|
||||||
)
|
)
|
||||||
|
|
||||||
for _, title := range rest {
|
if !dryRun {
|
||||||
page, err := api.CreatePage(space, parent, title, ``)
|
for _, title := range rest {
|
||||||
if err != nil {
|
page, err := api.CreatePage(space, parent, title, ``)
|
||||||
return nil, karma.Format(
|
if err != nil {
|
||||||
err,
|
return nil, karma.Format(
|
||||||
`error during creating parent page with title %q`,
|
err,
|
||||||
title,
|
`error during creating parent page with title %q`,
|
||||||
)
|
title,
|
||||||
}
|
)
|
||||||
|
}
|
||||||
|
|
||||||
parent = page
|
parent = page
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Infof(
|
||||||
|
nil,
|
||||||
|
"skipping page creation due to enabled dry-run mode, "+
|
||||||
|
"need to create %d pages: %v",
|
||||||
|
len(rest),
|
||||||
|
rest,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent, nil
|
return parent, nil
|
||||||
@ -105,16 +116,30 @@ func ValidateAncestry(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// skipping root article title
|
for _, parent := range ancestry[:len(ancestry)-1] {
|
||||||
for i, ancestor := range page.Ancestors[1:len(ancestry)] {
|
found := false
|
||||||
if ancestor.Title != ancestry[i] {
|
|
||||||
return nil, fmt.Errorf(
|
// skipping root article title
|
||||||
"broken ancestry tree; expected tree: %s; "+
|
for _, ancestor := range page.Ancestors[1:] {
|
||||||
"encountered %q at position of %q",
|
if ancestor.Title == parent {
|
||||||
strings.Join(ancestry, ` > `),
|
found = true
|
||||||
ancestor.Title,
|
break
|
||||||
ancestry[i],
|
}
|
||||||
)
|
}
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
list := []string{}
|
||||||
|
|
||||||
|
for _, ancestor := range page.Ancestors[1:] {
|
||||||
|
list = append(list, ancestor.Title)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, karma.Describe("expected parent", parent).
|
||||||
|
Describe("list", strings.Join(list, "; ")).
|
||||||
|
Format(
|
||||||
|
nil,
|
||||||
|
"unexpected ancestry tree, did not find expected parent page in the tree",
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,12 +9,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func ResolvePage(
|
func ResolvePage(
|
||||||
|
dryRun bool,
|
||||||
api *confluence.API,
|
api *confluence.API,
|
||||||
meta *Meta,
|
meta *Meta,
|
||||||
) (*confluence.PageInfo, error) {
|
) (*confluence.PageInfo, *confluence.PageInfo, error) {
|
||||||
page, err := api.FindPage(meta.Space, meta.Title)
|
page, err := api.FindPage(meta.Space, meta.Title)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, karma.Format(
|
return nil, nil, karma.Format(
|
||||||
err,
|
err,
|
||||||
"error while finding page %q",
|
"error while finding page %q",
|
||||||
meta.Title,
|
meta.Title,
|
||||||
@ -33,7 +34,7 @@ func ResolvePage(
|
|||||||
ancestry,
|
ancestry,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if page == nil {
|
if page == nil {
|
||||||
@ -55,12 +56,13 @@ func ResolvePage(
|
|||||||
}
|
}
|
||||||
|
|
||||||
parent, err := EnsureAncestry(
|
parent, err := EnsureAncestry(
|
||||||
|
dryRun,
|
||||||
api,
|
api,
|
||||||
meta.Space,
|
meta.Space,
|
||||||
meta.Parents,
|
meta.Parents,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, karma.Format(
|
return nil, nil, karma.Format(
|
||||||
err,
|
err,
|
||||||
"can't create ancestry tree: %s",
|
"can't create ancestry tree: %s",
|
||||||
strings.Join(meta.Parents, ` > `),
|
strings.Join(meta.Parents, ` > `),
|
||||||
@ -81,5 +83,5 @@ func ResolvePage(
|
|||||||
meta.Title,
|
meta.Title,
|
||||||
)
|
)
|
||||||
|
|
||||||
return page, nil
|
return parent, page, nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user