diff --git a/.gitignore b/.gitignore index bc9f4600..8edeaa45 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /testdata .idea/ /mark.test +.vscode/* diff --git a/main.go b/main.go old mode 100644 new mode 100755 index d7e84522..c5d83bb3 --- a/main.go +++ b/main.go @@ -33,6 +33,7 @@ type Flags struct { Username string `docopt:"-u"` Password string `docopt:"-p"` TargetURL string `docopt:"-l"` + FilesList []string `docopt:"-L"` BaseURL string `docopt:"--base-url"` Config string `docopt:"--config"` Ci bool `docopt:"--ci"` @@ -48,6 +49,7 @@ Docs: https://github.com/kovetskiy/mark Usage: mark [options] [-u ] [-p ] [-k] [-l ] -f mark [options] [-u ] [-p ] [-k] [-b ] -f + mark [options] [-u ] [-p ] [-k] [-b ] [-L ...] mark -v | --version mark -h | --help @@ -60,6 +62,7 @@ Options: -l Edit specified Confluence page. If -l is not specified, file should contain metadata (see above). + -L List of files. Use this option multiple times to pass files to Confluence. -b --base-url Base URL for Confluence. Alternative option for base_url config field. -f Use specified markdown file(s) for converting to html. @@ -87,6 +90,12 @@ Options: ) func main() { + // args := []string{"-u","", + // "-p", "", + // "-k", + // "-b", "", + // "-L", "/home/xxxxx/file", + // "-L", "/home/xxxxx/file"} cmd, err := docopt.ParseArgs(os.ExpandEnv(usage), nil, version) if err != nil { panic(err) @@ -127,7 +136,14 @@ func main() { api := confluence.NewAPI(creds.BaseURL, creds.Username, creds.Password) - files, err := filepath.Glob(flags.FileGlobPatten) + var files []string + if len(flags.FilesList) != 0 { + files = flags.FilesList + err = nil + } else { + files, err = filepath.Glob(flags.FileGlobPatten) + } + if err != nil { log.Fatal(err) } @@ -141,6 +157,7 @@ func main() { } // Loop through files matched by glob pattern + var fails []string for _, file := range files { log.Infof( nil, @@ -148,7 +165,8 @@ func main() { file, ) - target := processFile(file, api, flags, creds.PageID, creds.Username) + target, relative_falis := processFile(file, api, flags, creds.PageID, creds.Username) + fails = append(fails, relative_falis...) log.Infof( nil, @@ -158,6 +176,27 @@ func main() { fmt.Println(creds.BaseURL + target.Links.Full) } + + // Try again with relative resolved fails + if len(fails) > 0 { + for _, file := range fails { + log.Infof( + nil, + "try again to resolve relative links of %s", + file, + ) + target, _ := processFile(file, api, flags, creds.PageID, creds.Username) + + log.Infof( + nil, + "done retry relative resolve for: %s", + creds.BaseURL+target.Links.Full, + ) + + fmt.Println(creds.BaseURL + target.Links.Full) + + } + } } func processFile( @@ -166,7 +205,8 @@ func processFile( flags Flags, pageID string, username string, -) *confluence.PageInfo { +) (*confluence.PageInfo, []string) { + var rfails []string markdown, err := ioutil.ReadFile(file) if err != nil { log.Fatal(err) @@ -258,9 +298,11 @@ func processFile( } } - links, err := mark.ResolveRelativeLinks(api, meta, markdown, ".") + base, _ := filepath.Split(file) + links, err := mark.ResolveRelativeLinks(api, meta, markdown, base) if err != nil { - log.Fatalf(err, "unable to resolve relative links") + log.Warningf(err, "unable to resolve relative links in %s", file) + rfails = append(rfails, file) } markdown = mark.SubstituteLinks(markdown, links) @@ -390,5 +432,5 @@ func processFile( } } - return target + return target, rfails } diff --git a/pkg/mark/link.go b/pkg/mark/link.go index 243fed74..c9e2c3b8 100644 --- a/pkg/mark/link.go +++ b/pkg/mark/link.go @@ -4,10 +4,10 @@ import ( "bytes" "fmt" "io/ioutil" - "net/url" "os" "path/filepath" "regexp" + "errors" "github.com/kovetskiy/mark/pkg/confluence" "github.com/reconquest/karma-go" @@ -34,6 +34,7 @@ func ResolveRelativeLinks( matches := parseLinks(string(markdown)) links := []LinkSubstitution{} + var partial_fail error = nil for _, match := range matches { log.Tracef( nil, @@ -49,6 +50,7 @@ func ResolveRelativeLinks( } if resolved == "" { + partial_fail = errors.New("resolved relative link partial fails") continue } @@ -58,7 +60,7 @@ func ResolveRelativeLinks( }) } - return links, nil + return links, partial_fail } func resolveLink( @@ -171,12 +173,13 @@ func getConfluenceLink( api *confluence.API, space, title string, ) (string, error) { - link := fmt.Sprintf( - "%s/display/%s/%s", - api.BaseURL, - space, - url.QueryEscape(title), - ) + // link := fmt.Sprintf( + // "%s/display/%s/%s", + // api.BaseURL, + // space, + // url.QueryEscape(title), + // ) + var link string page, err := api.FindPage(space, title, "page") if err != nil { @@ -187,6 +190,8 @@ func getConfluenceLink( // Needs baseURL, as REST api response URL doesn't contain subpath ir // confluence is server from that link = api.BaseURL + page.Links.Full + } else { + link = "" } return link, nil