From 95f50c1a3416f5e7beeb29b17cbac3e9c183163f Mon Sep 17 00:00:00 2001 From: Egor Kovetskiy Date: Fri, 3 Jan 2020 23:05:14 +0300 Subject: [PATCH 1/3] do not require full ancestry, improve dry-run mode --- .gitignore | 1 + Taskfile.yml | 14 ++++++ main.go | 117 +++++++++---------------------------------- pkg/mark/ancestry.go | 67 +++++++++++++++++-------- pkg/mark/mark.go | 12 +++-- 5 files changed, 92 insertions(+), 119 deletions(-) create mode 100644 Taskfile.yml diff --git a/.gitignore b/.gitignore index 13c9cd3..1dc3039 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /mark +/docker diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..61a3f5c --- /dev/null +++ b/Taskfile.yml @@ -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 diff --git a/main.go b/main.go index c343ab9..06c22b8 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,6 @@ import ( "io/ioutil" "os" "path/filepath" - "strings" "github.com/kovetskiy/godocs" "github.com/kovetskiy/mark/pkg/confluence" @@ -123,7 +122,8 @@ Options: -f Use specified markdown file for converting to html. -k Lock page editing to current user only to prevent accidental 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. --trace Enable trace logs. -h --help Show this screen and call 911. @@ -139,6 +139,7 @@ func main() { var ( targetFile, _ = args["-f"].(string) + compileOnly = args["--compile-only"].(bool) dryRun = args["--dry-run"].(bool) editLock = args["-k"].(bool) ) @@ -205,6 +206,15 @@ func main() { } 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)) os.Exit(0) } @@ -229,7 +239,7 @@ func main() { var target *confluence.PageInfo if meta != nil { - page, err := resolvePage(api, meta) + parent, page, err := mark.ResolvePage(dryRun, api, meta) if err != nil { log.Fatalf( 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 } else { if creds.PageID == "" { @@ -307,94 +328,4 @@ func main() { "page successfully updated: %s\n", 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 } diff --git a/pkg/mark/ancestry.go b/pkg/mark/ancestry.go index 3b01bae..abb1dd4 100644 --- a/pkg/mark/ancestry.go +++ b/pkg/mark/ancestry.go @@ -10,6 +10,7 @@ import ( ) func EnsureAncestry( + dryRun bool, api *confluence.API, space string, ancestry []string, @@ -57,23 +58,33 @@ func EnsureAncestry( } log.Debugf( - nil, + nil, "empty pages under %q to be created: %s", parent.Title, strings.Join(rest, ` > `), ) - for _, title := range rest { - page, err := api.CreatePage(space, parent, title, ``) - if err != nil { - return nil, karma.Format( - err, - `error during creating parent page with title %q`, - title, - ) - } + if !dryRun { + for _, title := range rest { + page, err := api.CreatePage(space, parent, title, ``) + if err != nil { + return nil, karma.Format( + err, + `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 @@ -105,16 +116,30 @@ func ValidateAncestry( ) } - // skipping root article title - for i, ancestor := range page.Ancestors[1:len(ancestry)] { - if ancestor.Title != ancestry[i] { - return nil, fmt.Errorf( - "broken ancestry tree; expected tree: %s; "+ - "encountered %q at position of %q", - strings.Join(ancestry, ` > `), - ancestor.Title, - ancestry[i], - ) + for _, parent := range ancestry[:len(ancestry)-1] { + found := false + + // skipping root article title + for _, ancestor := range page.Ancestors[1:] { + if ancestor.Title == parent { + found = true + break + } + } + + 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", + ) } } diff --git a/pkg/mark/mark.go b/pkg/mark/mark.go index 92e7171..85af81c 100644 --- a/pkg/mark/mark.go +++ b/pkg/mark/mark.go @@ -9,12 +9,13 @@ import ( ) func ResolvePage( + dryRun bool, api *confluence.API, meta *Meta, -) (*confluence.PageInfo, error) { +) (*confluence.PageInfo, *confluence.PageInfo, error) { page, err := api.FindPage(meta.Space, meta.Title) if err != nil { - return nil, karma.Format( + return nil, nil, karma.Format( err, "error while finding page %q", meta.Title, @@ -33,7 +34,7 @@ func ResolvePage( ancestry, ) if err != nil { - return nil, err + return nil, nil, err } if page == nil { @@ -55,12 +56,13 @@ func ResolvePage( } parent, err := EnsureAncestry( + dryRun, api, meta.Space, meta.Parents, ) if err != nil { - return nil, karma.Format( + return nil, nil, karma.Format( err, "can't create ancestry tree: %s", strings.Join(meta.Parents, ` > `), @@ -81,5 +83,5 @@ func ResolvePage( meta.Title, ) - return page, nil + return parent, page, nil } From f52b060b64cfc37f8fa3575021447bb2be50a141 Mon Sep 17 00:00:00 2001 From: Egor Kovetskiy Date: Mon, 6 Jan 2020 11:33:19 +0300 Subject: [PATCH 2/3] docker: fix workdir --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 34f1338..9953445 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM golang:latest -ENV GOPATH="/go/" -WORKDIR /go/src/mark +ENV GOPATH="/go" +WORKDIR /go/src/github.com/kovetskiy/mark COPY / . RUN make get RUN make build From 6a66bd353a79a1d6e402f60cb38b3ff548c96e28 Mon Sep 17 00:00:00 2001 From: Egor Kovetskiy Date: Tue, 7 Jan 2020 16:06:32 +0300 Subject: [PATCH 3/3] fix passing bin from previous image --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9953445..96dce66 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ RUN make build FROM alpine:latest 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 WORKDIR /docs ENTRYPOINT ["/bin/mark"]