From 78fd254a7625f767ad47179744975dcd48c34373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 12:42:54 +0200 Subject: [PATCH 01/17] Remove local test files, add abilit to test offline --- .gitignore | 4 +- Makefile | 14 ++- cmd/monako/main_test.go | 64 ++++++++++++- .../only_markdown/config.markdown.yaml | 19 ---- .../only_markdown/config.menu.markdown.md | 7 -- test/configs/testgenerated/.gitkeep | 0 test/test_docs/profile.png | Bin 38049 -> 0 bytes test/test_docs/subfolder/subfolderprofile.png | Bin 12008 -> 0 bytes ...est_doc_asciidoc_include_me_subfolder.adoc | 1 - test/test_docs/test_doc_asciidoc.adoc | 86 ------------------ .../test_doc_asciidoc_include_me.adoc | 1 - test/test_docs/test_doc_markdown.md | 71 --------------- 12 files changed, 73 insertions(+), 194 deletions(-) delete mode 100644 test/configs/only_markdown/config.markdown.yaml delete mode 100644 test/configs/only_markdown/config.menu.markdown.md create mode 100644 test/configs/testgenerated/.gitkeep delete mode 100644 test/test_docs/profile.png delete mode 100644 test/test_docs/subfolder/subfolderprofile.png delete mode 100644 test/test_docs/subfolder/test_doc_asciidoc_include_me_subfolder.adoc delete mode 100644 test/test_docs/test_doc_asciidoc.adoc delete mode 100644 test/test_docs/test_doc_asciidoc_include_me.adoc delete mode 100644 test/test_docs/test_doc_markdown.md diff --git a/.gitignore b/.gitignore index 723e72a..52d05cf 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,6 @@ coverage.out.tmp # Monako bin monako -/compose \ No newline at end of file +/compose +test/configs/testgenerated/config.testgenerated.yaml +test/configs/testgenerated/menu.testgenerated.md diff --git a/Makefile b/Makefile index 7f9a15f..452659d 100644 --- a/Makefile +++ b/Makefile @@ -25,20 +25,24 @@ theme: clean ${GOPATH}/bin/go-bindata -pkg theme -o internal/theme/bindata.go tmp/... secrets: - touch config/secrets.env && source config/secrets.env + touch config/secrets.env && source config/secrets.env test: - go test -covermode=count -coverprofile=coverage.out.tmp ./... + go test -v -covermode=count -coverprofile=coverage.out.tmp ./... cat coverage.out.tmp | grep -v "/bindata.go" > coverage.out rm coverage.out.tmp -coverage: test - ${GOPATH}/bin/goveralls -coverprofile=coverage.out -service=github -repotoken ${COVERALLS_TOKEN} - test_deps: go get golang.org/x/tools/cmd/cover go get github.com/mattn/goveralls +test_data: + git clone https://github.com/snipem/monako-test.git /tmp/testdata/monako-test + +# Use this for local tests, uses the locally cloned test data from test_data step +test_local: + MONAKO_TEST_REPO="/tmp/testdata/monako-test" $(MAKE) test + run_prd: build secrets ./monako -config ~/work/mopro/architecture/documentation/conf/config.prod.yaml \ -menu-config ~/work/mopro/architecture/documentation/conf/menu.prod.md \ diff --git a/cmd/monako/main_test.go b/cmd/monako/main_test.go index a461803..e358e7a 100644 --- a/cmd/monako/main_test.go +++ b/cmd/monako/main_test.go @@ -24,12 +24,15 @@ func TestMain(t *testing.T) { targetDir := filet.TmpDir(t, "") + monakoConfig, menuConfig := writeConfig("https://github.com/snipem/monako-test.git") + os.Args = []string{ "monako", "-fail-on-error", "-working-dir", targetDir, - "-config", "../../test/configs/only_markdown/config.markdown.yaml", - "-menu-config", "../../test/configs/only_markdown/config.menu.markdown.md"} + "-config", monakoConfig, + "-menu-config", menuConfig} + t.Logf("Running Monako with %s", os.Args) main() t.Run("Check for Hugo input files", func(t *testing.T) { @@ -68,7 +71,7 @@ func TestMain(t *testing.T) { log.Fatal(err) } - // TODO For some reason imgages seem to be ignored in urls + // TODO For some reason images seem to be ignored in urls for _, url := range urls { if strings.HasPrefix(url.String(), ts.URL) { // t.Logf("Checking for local served url %s", url.String()) @@ -164,3 +167,58 @@ func getURLKeyValuesFromHTML(content string, key string, baseURL string) ([]*url } } + +// writeConfig writes a temporary config for a repo in the local test folders +// of this project and returns the path to the monakoConfig and menuConfig +// Also if the MONAKO_TEST_REPO environment variable is set, it will use this +// environment variable for the repository stored in the Monako config. +func writeConfig(repo string) (string, string) { + + var testRepo string + + if os.Getenv("MONAKO_TEST_REPO") != "" { + testRepo = os.Getenv("MONAKO_TEST_REPO") + } else { + testRepo = repo + } + + monakoConfig := fmt.Sprintf(` +--- + baseURL : "https://example.com/" + title : "Local Test Page - Only Markdown" + + whitelist: + - ".md" + - ".jpg" + - ".jpeg" + - ".svg" + - ".gif" + - ".png" + + origins: + + # Files have to be commited to appear! + - src: %s + branch: master + docdir: . + targetdir: docs/test/ +`, testRepo) + + menuConfig := fmt.Sprintf(` +--- +headless: true +--- + +- **Test docs** + - [Markdown]({{}}) +
+ `) + + pathMonakoConfig := "../../test/configs/testgenerated/config.testgenerated.yaml" + ioutil.WriteFile(pathMonakoConfig, []byte(monakoConfig), os.FileMode(0600)) + + pathMenuConfig := "../../test/configs/testgenerated/menu.testgenerated.md" + ioutil.WriteFile(pathMenuConfig, []byte(menuConfig), os.FileMode(0600)) + + return pathMonakoConfig, pathMenuConfig +} diff --git a/test/configs/only_markdown/config.markdown.yaml b/test/configs/only_markdown/config.markdown.yaml deleted file mode 100644 index 87ae11e..0000000 --- a/test/configs/only_markdown/config.markdown.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- - baseURL : "https://example.com/" - title : "Local Test Page - Only Markdown" - - whitelist: - - ".md" - - ".jpg" - - ".jpeg" - - ".svg" - - ".gif" - - ".png" - - origins: - - # Files have to be commited to appear! - - src: https://github.com/snipem/monako-test.git - branch: master - docdir: . - targetdir: docs/test/ diff --git a/test/configs/only_markdown/config.menu.markdown.md b/test/configs/only_markdown/config.menu.markdown.md deleted file mode 100644 index f9ae3d2..0000000 --- a/test/configs/only_markdown/config.menu.markdown.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -headless: true ---- - -- **Test docs** - - [Markdown]({{}}) -
\ No newline at end of file diff --git a/test/configs/testgenerated/.gitkeep b/test/configs/testgenerated/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/test_docs/profile.png b/test/test_docs/profile.png deleted file mode 100644 index fb1ac532efcaa6a44bae1b6700b9311171f391da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38049 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 Cn^l+q diff --git a/test/test_docs/subfolder/test_doc_asciidoc_include_me_subfolder.adoc b/test/test_docs/subfolder/test_doc_asciidoc_include_me_subfolder.adoc deleted file mode 100644 index 22bd9bd..0000000 --- a/test/test_docs/subfolder/test_doc_asciidoc_include_me_subfolder.adoc +++ /dev/null @@ -1 +0,0 @@ -Huhu! I'm included from a *subfolder*! \ No newline at end of file diff --git a/test/test_docs/test_doc_asciidoc.adoc b/test/test_docs/test_doc_asciidoc.adoc deleted file mode 100644 index 57685a6..0000000 --- a/test/test_docs/test_doc_asciidoc.adoc +++ /dev/null @@ -1,86 +0,0 @@ -= Asciidoc First Level -:toc: - -== Asciidoc Second Level - -Ihr naht euch wieder, schwankende Gestalten! Die früh sich einst dem trüben -Blick gezeigt. Versuch’ ich wohl euch diesmal fest zu halten? Fühl’ ich -mein Herz noch jenem Wahn geneigt? Ihr drängt euch zu! nun gut, so mögt ihr -walten. Wie ihr aus Dunst und Nebel um mich steigt. Mein Busen fühlt sich -jugendlich erschüttert. - -```go - if err != nil { - if len(files) == 0 { - t.Errorf("No files checked out") - } - } -``` - -.Picture in same folder -image:profile.png[Picture in same folder] - -Vom Zauberhauch der euren Zug umwittert. Ihr bringt mit -euch die Bilder froher Tage. Und manche liebe Schatten steigen auf Gleich einer -alten, halbverklungnen Sage. Kommt erste Lieb’ und Freundschaft mit herauf Der -Schmerz wird neu, es wiederholt die Klage. Des Lebens labyrinthisch irren Lauf, -Und nennt die Guten, die, um schöne Stunden Vom Glück getäuscht, vor mir -hinweggeschwunden. - -### Asciidoc Third Level with Includes - -// Includes are not supposed to work as of now - -// include::test_doc_asciidoc_include_me.adoc[] -// include::subfolder/test_doc_asciidoc_include_me_subfolder.adoc[] - -### Asciidoc Third Level with Ditaa Diagramm - -[ditaa] -.... - +-------------+ - | Asciidoctor |-------+ - | diagram | | - +-------------+ | PNG out - ^ | - | ditaa in | - | v - +--------+ +--------+----+ /---------------\ - | | --+ Asciidoctor +--> | | - | Text | +-------------+ | Beautiful | - |Document| | !magic! | | Output | - | {d}| | | | | - +---+----+ +-------------+ \---------------/ - : ^ - | Lots of work | - +-----------------------------------+ -.... - -Ihr naht euch wieder, schwankende Gestalten! Die früh sich einst dem trüben -Blick gezeigt. Versuch’ ich wohl euch diesmal fest zu halten? Fühl’ ich -mein Herz noch jenem Wahn geneigt? Ihr drängt euch zu! nun gut, so mögt ihr -walten. Wie ihr aus Dunst und Nebel um mich steigt. Mein Busen fühlt sich -jugendlich erschüttert. Vom Zauberhauch der euren Zug umwittert. Ihr bringt mit -euch die Bilder froher Tage. Und manche liebe Schatten steigen auf Gleich einer -alten, halbverklungnen Sage. Kommt erste Lieb’ und Freundschaft mit herauf Der -Schmerz wird neu, es wiederholt die Klage. Des Lebens labyrinthisch irren Lauf, -Und nennt die Guten, die, um schöne Stunden Vom Glück getäuscht, vor mir -hinweggeschwunden. - -.Picture in sub folder -image:subfolder/subfolderprofile.png[Picture in sub folder] - -### Mermaid Example - -{{< mermaid >}} -sequenceDiagram - Alice->>Bob: Hello Bob, how are you? - alt is sick - Bob->>Alice: Not so good :( - else is well - Bob->>Alice: Feeling fresh like a daisy - end - opt Extra response - Bob->>Alice: Thanks for asking - end -{{< /mermaid >}} diff --git a/test/test_docs/test_doc_asciidoc_include_me.adoc b/test/test_docs/test_doc_asciidoc_include_me.adoc deleted file mode 100644 index d715b97..0000000 --- a/test/test_docs/test_doc_asciidoc_include_me.adoc +++ /dev/null @@ -1 +0,0 @@ -Hey! I'm included from the *same* directory \ No newline at end of file diff --git a/test/test_docs/test_doc_markdown.md b/test/test_docs/test_doc_markdown.md deleted file mode 100644 index 95eba82..0000000 --- a/test/test_docs/test_doc_markdown.md +++ /dev/null @@ -1,71 +0,0 @@ -# Markdown Doc 1 - -Remember these docs have to be commited in order to appear! - -## Markdown Doc 2 - -[Link to Website](https://github.com/snipem/monako.git) - -Ihr naht euch wieder, schwankende Gestalten! Die früh sich einst dem trüben -Blick gezeigt. Versuch’ ich wohl euch diesmal fest zu halten? Fühl’ ich -mein Herz noch jenem Wahn geneigt? Ihr drängt euch zu! nun gut, so mögt ihr -walten. Wie ihr aus Dunst und [Nebel](https://de.wikipedia.org/wiki/Nebel) um mich steigt. Mein Busen fühlt sich -jugendlich erschüttert. Vom Zauberhauch der euren Zug umwittert. Ihr bringt mit -euch die Bilder froher Tage. Und manche liebe Schatten steigen auf Gleich einer -alten, halbverklungnen Sage. Kommt erste Lieb’ und Freundschaft mit herauf Der -Schmerz wird neu, es wiederholt die Klage. Des Lebens labyrinthisch irren Lauf, -Und nennt die Guten, die, um schöne Stunden Vom Glück getäuscht, vor mir -hinweggeschwunden. - -![Picture in same folder](profile.png) - -### Markdown Doc 3 - -Ihr naht euch wieder, schwankende Gestalten! Die früh sich einst dem trüben -Blick gezeigt. Versuch’ ich wohl euch diesmal fest zu halten? Fühl’ ich -mein Herz noch jenem Wahn geneigt? Ihr drängt euch zu! nun gut, so mögt ihr -walten. Wie ihr aus Dunst und Nebel um mich steigt. Mein Busen fühlt sich -jugendlich erschüttert. Vom Zauberhauch der euren Zug umwittert. Ihr bringt mit -euch die Bilder froher Tage. Und manche liebe Schatten steigen auf Gleich einer -alten, halbverklungnen Sage. Kommt erste Lieb’ und Freundschaft mit herauf Der -Schmerz wird neu, es wiederholt die Klage. Des Lebens labyrinthisch irren Lauf, -Und nennt die Guten, die, um schöne Stunden Vom Glück getäuscht, vor mir -hinweggeschwunden. - -#### Markdown Doc 4 - -```go - if err != nil { - if len(files) == 0 { - t.Errorf("No files checked out") - } - } -``` - -Ihr naht euch wieder, schwankende Gestalten! Die früh sich einst dem trüben -Blick gezeigt. Versuch’ ich wohl euch diesmal fest zu halten? Fühl’ ich -mein Herz noch jenem Wahn geneigt? Ihr drängt euch zu! nun gut, so mögt ihr -walten. Wie ihr aus Dunst und Nebel um mich steigt. Mein Busen fühlt sich -jugendlich erschüttert. Vom Zauberhauch der euren Zug umwittert. Ihr bringt mit -euch die Bilder froher Tage. Und manche liebe Schatten steigen auf Gleich einer -alten, halbverklungnen Sage. Kommt erste Lieb’ und Freundschaft mit herauf Der -Schmerz wird neu, es wiederholt die Klage. Des Lebens labyrinthisch irren Lauf, -Und nennt die Guten, die, um schöne Stunden Vom Glück getäuscht, vor mir -hinweggeschwunden. - -![Picture in sub folder](subfolder/subfolderprofile.png) - -### Mermaid Example - -{{< mermaid >}} -sequenceDiagram - Alice->>Bob: Hello Bob, how are you? - alt is sick - Bob->>Alice: Not so good :( - else is well - Bob->>Alice: Feeling fresh like a daisy - end - opt Extra response - Bob->>Alice: Thanks for asking - end -{{< /mermaid >}} From 24bb99af691581c0bcbadf358148123c275e2b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 12:44:25 +0200 Subject: [PATCH 02/17] Check for errors --- cmd/monako/main_test.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cmd/monako/main_test.go b/cmd/monako/main_test.go index e358e7a..24e90d3 100644 --- a/cmd/monako/main_test.go +++ b/cmd/monako/main_test.go @@ -215,10 +215,16 @@ headless: true `) pathMonakoConfig := "../../test/configs/testgenerated/config.testgenerated.yaml" - ioutil.WriteFile(pathMonakoConfig, []byte(monakoConfig), os.FileMode(0600)) + err := ioutil.WriteFile(pathMonakoConfig, []byte(monakoConfig), os.FileMode(0600)) + if err != nil { + log.Fatal(err) + } pathMenuConfig := "../../test/configs/testgenerated/menu.testgenerated.md" - ioutil.WriteFile(pathMenuConfig, []byte(menuConfig), os.FileMode(0600)) + err = ioutil.WriteFile(pathMenuConfig, []byte(menuConfig), os.FileMode(0600)) + if err != nil { + log.Fatal(err) + } return pathMonakoConfig, pathMenuConfig } From f30b4bdae4cb8972d8f4b4cd794c96277b149566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 14:24:47 +0200 Subject: [PATCH 03/17] Add logo, better comments, better print outputs --- Makefile | 4 ++-- internal/theme/theme.go | 4 ++-- pkg/compose/config.go | 1 + pkg/compose/file.go | 22 +++++++++++++++++++--- pkg/compose/file_test.go | 4 ++++ pkg/compose/origin.go | 10 ++++------ test/config.local.yaml | 39 ++++++++++++++++++++------------------- 7 files changed, 52 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 452659d..8f7760f 100644 --- a/Makefile +++ b/Makefile @@ -28,13 +28,13 @@ secrets: touch config/secrets.env && source config/secrets.env test: - go test -v -covermode=count -coverprofile=coverage.out.tmp ./... + go test -covermode=count -coverprofile=coverage.out.tmp ./... + # -coverpkg=./... also calculates the whole coverage, for example code that was involded by the main test cat coverage.out.tmp | grep -v "/bindata.go" > coverage.out rm coverage.out.tmp test_deps: go get golang.org/x/tools/cmd/cover - go get github.com/mattn/goveralls test_data: git clone https://github.com/snipem/monako-test.git /tmp/testdata/monako-test diff --git a/internal/theme/theme.go b/internal/theme/theme.go index 23ca20e..f9c18a5 100644 --- a/internal/theme/theme.go +++ b/internal/theme/theme.go @@ -64,7 +64,7 @@ startLevel = 1 [params] # See: https://github.com/snipem/monako-book#configuration for settings BookToC = true -BookLogo = 'logo.png' +BookLogo = '%s' BookMenuBundle = '/%s' BookSection = 'docs' #BookRepo = 'https://github.com/alex-shpak/hugo-book' @@ -72,7 +72,7 @@ BookSection = 'docs' BookDateFormat = 'Jan 2, 2006' BookSearch = true BookComments = true - `, composeConfig.BaseURL, composeConfig.Title, themeName, monakoMenuDirectory) + `, composeConfig.BaseURL, composeConfig.Title, themeName, composeConfig.Logo, monakoMenuDirectory) return ioutil.WriteFile(filepath.Join(composeConfig.HugoWorkingDir, "config.toml"), []byte(configContent), os.FileMode(0700)) } diff --git a/pkg/compose/config.go b/pkg/compose/config.go index 6778e14..732dae9 100644 --- a/pkg/compose/config.go +++ b/pkg/compose/config.go @@ -15,6 +15,7 @@ type Config struct { BaseURL string `yaml:"baseURL"` Title string `yaml:"title"` Origins []Origin `yaml:"origins"` + Logo string `yaml:"logo"` FileWhitelist []string `yaml:"whitelist"` // HugoWorkingDir is the working dir for the Composition diff --git a/pkg/compose/file.go b/pkg/compose/file.go index 33e78ae..a8db0ce 100644 --- a/pkg/compose/file.go +++ b/pkg/compose/file.go @@ -15,6 +15,8 @@ import ( "gopkg.in/src-d/go-git.v4/plumbing/object" ) +const standardFilemode = os.FileMode(0700) + // OriginFile represents a single file of an origin type OriginFile struct { @@ -35,6 +37,10 @@ type OriginFile struct { func (origin Origin) ComposeDir() { origin.Files = origin.getWhitelistedFiles(origin.SourceDir) + if len(origin.Files) == 0 { + fmt.Printf("Found no matching files in '%s' with branch '%s' in folder '%s'\n", origin.URL, origin.Branch, origin.SourceDir) + } + for _, file := range origin.Files { file.composeFile() } @@ -58,6 +64,8 @@ func (origin Origin) getWhitelistedFiles(startdir string) []OriginFile { for _, file := range files { // This is the path as stored in the remote repo + // This can only be gathered here, because of recursing through + // the file system remotePath := filepath.Join(startdir, file.Name()) if file.IsDir() { @@ -77,7 +85,7 @@ func (origin Origin) getWhitelistedFiles(startdir string) []OriginFile { parentOrigin: &origin, } - // Add this file to originFiles + // Add the current file to the list of files returned originFiles = append(originFiles, originFile) } @@ -103,7 +111,7 @@ func (file OriginFile) composeFile() { // createParentDir creates the parent directories for the file in the local filesystem func (file OriginFile) createParentDir() { log.Debugf("Creating local folder '%s'", filepath.Dir(file.LocalPath)) - err := os.MkdirAll(filepath.Dir(file.LocalPath), filemode) + err := os.MkdirAll(filepath.Dir(file.LocalPath), standardFilemode) if err != nil { log.Fatalf("Error when creating '%s': %s", filepath.Dir(file.LocalPath), err) } @@ -131,6 +139,8 @@ func (file OriginFile) copyRegularFile() { func (file OriginFile) copyMarkupFile() { // TODO: Only use strings not []byte + + // TODO: Add GetCommitInfo function // commitinfo, err := GetCommitInfo(g, gitFilepath) // if err != nil { // log.Fatal(err) @@ -150,13 +160,19 @@ func (file OriginFile) copyMarkupFile() { } else if contentFormat == Asciidoc { content = workarounds.AsciidocPostprocessing(dirty) } + + // TODO: Add ExpandFrontmatter function // content = []byte(ExpandFrontmatter(string(content), gitFilepath, file.Commit)) - err = ioutil.WriteFile(file.LocalPath, content, filemode) + + err = ioutil.WriteFile(file.LocalPath, content, standardFilemode) if err != nil { log.Fatalf("Error writing file %s", err) } } +// getLocalFilePath returns the desired local file path for a remote file in the local filesystem. +// It is based on the local absolute composeDir, the remoteDocDir to strip it's path from the local file, +// the target dir to generate the local path and the file name itself func getLocalFilePath(composeDir, remoteDocDir string, targetDir string, remoteFile string) string { // Since a remoteDocDir is defined, this should not be created in the local filesystem relativeFilePath := strings.TrimPrefix(remoteFile, remoteDocDir) diff --git a/pkg/compose/file_test.go b/pkg/compose/file_test.go index bda0ff4..c5eb13e 100644 --- a/pkg/compose/file_test.go +++ b/pkg/compose/file_test.go @@ -9,6 +9,7 @@ import ( "github.com/alecthomas/assert" ) +// TestLocalPath tests if the local file path calculation for remote files is correct func TestLocalPath(t *testing.T) { equalPath(t, @@ -42,6 +43,9 @@ func TestLocalPath(t *testing.T) { "Empty local target folder") } +// equalPath is like assert.Equal but with ignoring operation system specifc pathes +// This enables pathes to be compared on Unix "/" and Windows "\" systems, while being expected +// in either format. func equalPath(t *testing.T, expected string, actual string, msg string) { assert.Equal(t, diff --git a/pkg/compose/origin.go b/pkg/compose/origin.go index d9be106..e5c27cc 100644 --- a/pkg/compose/origin.go +++ b/pkg/compose/origin.go @@ -17,8 +17,6 @@ import ( "gopkg.in/src-d/go-git.v4/storage/memory" ) -var filemode = os.FileMode(0700) - // Asciidoc is a const for identifying Asciidoc Documents const Asciidoc = "ASCIIDOC" @@ -29,7 +27,7 @@ const Markdown = "MARKDOWN" // A virtual filesystem is returned containing the cloned files. func (origin *Origin) CloneDir() { - log.Printf("Cloning in to %s with branch %s", origin.URL, origin.Branch) + fmt.Printf("Cloning in to '%s' with branch '%s'\n", origin.URL, origin.Branch) origin.filesystem = memfs.New() @@ -39,7 +37,7 @@ func (origin *Origin) CloneDir() { password := os.Getenv(origin.EnvPassword) if username != "" && password != "" { - log.Printf("Using username and password") + log.Printf("Using username and password stored in env variables\n") basicauth = http.BasicAuth{ Username: username, Password: password, @@ -55,12 +53,12 @@ func (origin *Origin) CloneDir() { Auth: &basicauth, }) - origin.repo = repo - if err != nil { log.Fatal(err) } + origin.repo = repo + } // GetFormat determines the markup format of a file by it's filename. diff --git a/test/config.local.yaml b/test/config.local.yaml index 27092df..32d0bdc 100644 --- a/test/config.local.yaml +++ b/test/config.local.yaml @@ -1,20 +1,21 @@ --- - baseURL : "https://example.com/" - title : "Local Test Page" - - whitelist: - - ".md" - - ".adoc" - - ".jpg" - - ".jpeg" - - ".svg" - - ".gif" - - ".png" - - origins: - - # Files have to be commited to appear! - - src: https://github.com/snipem/monako.git - branch: develop - docdir: test/test_docs - targetdir: docs/test/ + baseURL : "https://example.com/" + title : "Local Test Page" + logo : "docs/test/profile.png" + + whitelist: + - ".md" + - ".adoc" + - ".jpg" + - ".jpeg" + - ".svg" + - ".gif" + - ".png" + + origins: + + # Files have to be commited to appear! + - src: https://github.com/snipem/monako-test.git + branch: master + docdir: . + targetdir: docs/test/ From c4a12617d65821c5fff36e3cf5ee39e6d6b90b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 15:52:14 +0200 Subject: [PATCH 04/17] Add logo --- configs/config.monako.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configs/config.monako.yaml b/configs/config.monako.yaml index 4a399e1..ec79530 100644 --- a/configs/config.monako.yaml +++ b/configs/config.monako.yaml @@ -1,6 +1,7 @@ --- baseURL : "https://example.com/" title : "My Projects" + logo : "docs/monako/profile.png" whitelist: - ".md" @@ -13,6 +14,11 @@ origins: + - src: https://github.com/snipem/monako-test + branch: master + docdir: . + targetdir: docs/monako + - src: https://github.com/snipem/commute-tube branch: master docdir: . From 612dbc5667bd92ca46c7671826b53202f405c009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 15:53:22 +0200 Subject: [PATCH 05/17] Print format --- pkg/compose/file.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/compose/file.go b/pkg/compose/file.go index a8db0ce..ff83995 100644 --- a/pkg/compose/file.go +++ b/pkg/compose/file.go @@ -104,7 +104,7 @@ func (file OriginFile) composeFile() { default: file.copyRegularFile() } - fmt.Printf("%s -> %s\n", file.RemotePath, file.LocalPath) + fmt.Printf(" %s -> %s\n", file.RemotePath, file.LocalPath) } From 53d8e1c810879d83f39c96b58fc1506701811f89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 16:47:14 +0200 Subject: [PATCH 06/17] Less errorprone hack for asciidoctor builds --- internal/workarounds/workarounds.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/workarounds/workarounds.go b/internal/workarounds/workarounds.go index 8157f28..08fbc85 100644 --- a/internal/workarounds/workarounds.go +++ b/internal/workarounds/workarounds.go @@ -64,17 +64,16 @@ func AddFakeAsciidoctorBinForDiagramsToPath(baseURL string) string { // Asciidoctor attributes: https://asciidoctor.org/docs/user-manual/#builtin-attributes + // TODO: Use variables shellscript := fmt.Sprintf(`#!/bin/bash # inspired by: https://zipproth.de/cheat-sheets/hugo-asciidoctor/#_how_to_make_hugo_use_asciidoctor_with_extensions - if [ -f /usr/local/bin/asciidoctor ]; then - ad="/usr/local/bin/asciidoctor" - else - ad="/usr/bin/asciidoctor" - fi + + # Use first non fake-binary in path as asciidoctorbin + ad=$(which -a asciidoctor | grep -v monako_asciidoctor_fake_binary | head -n 1) # Use empty css to trick asciidoctor into using none without error echo "" > empty.css - + $ad -B . \ -r asciidoctor-diagram \ -a nofooter \ @@ -86,6 +85,7 @@ func AddFakeAsciidoctorBinForDiagramsToPath(baseURL string) string { # For some reason static is not parsed with integrated Hugo mkdir -p compose/public/diagram + # Hopefully this will also be fixed by https://github.com/gohugoio/hugo/pull/6561 if ls *.svg >/dev/null 2>&1; then mv -f *.svg compose/public/diagram fi @@ -95,7 +95,7 @@ func AddFakeAsciidoctorBinForDiagramsToPath(baseURL string) string { fi `, escapedPath) - tempDir := filepath.Join(os.TempDir(), "asciidoctor_fake_binary") + tempDir := filepath.Join(os.TempDir(), "monako_asciidoctor_fake_binary") err = os.Mkdir(tempDir, os.FileMode(0700)) if err != nil && !os.IsExist(err) { log.Fatalf("Error creating asciidoctor fake dir : %s", err) From d082ba1c024f9fb57baaacb97f025b3d608559e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Mon, 30 Mar 2020 09:13:04 +0200 Subject: [PATCH 07/17] Add test for double quotes asciidoc image links --- internal/workarounds/workarounds_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/internal/workarounds/workarounds_test.go b/internal/workarounds/workarounds_test.go index a6ccfd6..d8ad72f 100644 --- a/internal/workarounds/workarounds_test.go +++ b/internal/workarounds/workarounds_test.go @@ -21,6 +21,19 @@ func TestAsciiDocImageFix(t *testing.T) { if clean != want { t.Errorf("Clean was incorrect, got: %s, want: %s.", clean, want) } + + t.Run("Doubluequotes", func(t *testing.T) { + + needToClean := "image::image2.png[image,width=634,height=346]" + + clean = string(AsciidocPostprocessing([]byte(needToClean))) + want := "image::../image2.png[image,width=634,height=346]" + + if clean != want { + t.Errorf("Clean was incorrect, got: %s, want: %s.", clean, want) + } + + }) } func TestMarkdownFix(t *testing.T) { From 8f9e984fefd0cb1352250c0f54f323067fc75a4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 19:16:24 +0200 Subject: [PATCH 08/17] Fix for double colons --- internal/workarounds/workarounds.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/workarounds/workarounds.go b/internal/workarounds/workarounds.go index 08fbc85..d281fa8 100644 --- a/internal/workarounds/workarounds.go +++ b/internal/workarounds/workarounds.go @@ -24,6 +24,10 @@ func AsciidocPostprocessing(dirty []byte) []byte { d = strings.ReplaceAll(d, "image:http", "image_______http") d = strings.ReplaceAll(d, "image:", "image:../") d = strings.ReplaceAll(d, "image_______http", "image:http") + + // Fix for colons being moved + d = strings.ReplaceAll(d, "image:../:", "image::../") + return []byte(d) } From ed117fee80a1fc2da9487c553a73b5d87bf66c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 19:22:44 +0200 Subject: [PATCH 09/17] Dont alter absolute urls --- internal/workarounds/workarounds.go | 8 ++++++++ internal/workarounds/workarounds_test.go | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/internal/workarounds/workarounds.go b/internal/workarounds/workarounds.go index d281fa8..48e46b9 100644 --- a/internal/workarounds/workarounds.go +++ b/internal/workarounds/workarounds.go @@ -21,9 +21,17 @@ func AsciidocPostprocessing(dirty []byte) []byte { var d = string(dirty) // FIXME really quick and dirty. There is a problem with Go regexp look ahead + + // Preserve + d = strings.ReplaceAll(d, "image::http", "image+______http") d = strings.ReplaceAll(d, "image:http", "image_______http") + + // Replace d = strings.ReplaceAll(d, "image:", "image:../") + + // Restore d = strings.ReplaceAll(d, "image_______http", "image:http") + d = strings.ReplaceAll(d, "image+______http", "image::http") // Fix for colons being moved d = strings.ReplaceAll(d, "image:../:", "image::../") diff --git a/internal/workarounds/workarounds_test.go b/internal/workarounds/workarounds_test.go index d8ad72f..bf52eb9 100644 --- a/internal/workarounds/workarounds_test.go +++ b/internal/workarounds/workarounds_test.go @@ -22,7 +22,7 @@ func TestAsciiDocImageFix(t *testing.T) { t.Errorf("Clean was incorrect, got: %s, want: %s.", clean, want) } - t.Run("Doubluequotes", func(t *testing.T) { + t.Run("Double colons", func(t *testing.T) { needToClean := "image::image2.png[image,width=634,height=346]" @@ -34,6 +34,19 @@ func TestAsciiDocImageFix(t *testing.T) { } }) + + t.Run("Double colons with absolute url, do nothing", func(t *testing.T) { + + needToClean := "image::http://absolute/url/image2.png[image,width=634,height=346]" + + clean = string(AsciidocPostprocessing([]byte(needToClean))) + want := "image::http://absolute/url/image2.png[image,width=634,height=346]" + + if clean != want { + t.Errorf("Clean was incorrect, got: %s, want: %s.", clean, want) + } + + }) } func TestMarkdownFix(t *testing.T) { From a65ba5602de731ad4ac5a51e5d15f8000b517f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 20:09:35 +0200 Subject: [PATCH 10/17] Use different unzip library --- go.mod | 7 ++++++- go.sum | 20 ++++++++++++++++++-- internal/theme/theme.go | 27 ++++++--------------------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 134bf4f..f16f944 100644 --- a/go.mod +++ b/go.mod @@ -5,11 +5,15 @@ go 1.12 require ( github.com/Flaque/filet v0.0.0-20190209224823-fc4d33cfcf93 github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 - github.com/artdarek/go-unzip v1.0.0 + github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 // indirect + github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c + github.com/dsnet/compress v0.0.1 // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gobuffalo/envy v1.9.0 // indirect github.com/gohugoio/hugo v0.67.0 github.com/golang/protobuf v1.3.2 // indirect + github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214 // indirect + github.com/klauspost/pgzip v1.2.3 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/mattn/go-isatty v0.0.12 // indirect github.com/mitchellh/mapstructure v1.2.2 // indirect @@ -19,6 +23,7 @@ require ( github.com/spf13/cobra v0.0.7 // indirect github.com/spf13/viper v1.6.2 // indirect github.com/stretchr/testify v1.5.1 + github.com/ulikunitz/xz v0.5.7 // indirect github.com/yuin/goldmark v1.1.25 // indirect golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 // indirect golang.org/x/net v0.0.0-20200226121028-0de0cce0169b diff --git a/go.sum b/go.sum index f1f72ff..2a706df 100644 --- a/go.sum +++ b/go.sum @@ -63,8 +63,6 @@ github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/artdarek/go-unzip v1.0.0 h1:Ja9wfhiXyl67z5JT37rWjTSb62KXDP+9jHRkdSREUvg= -github.com/artdarek/go-unzip v1.0.0/go.mod h1:KhX4LV7e4UwWCTo7orBYnJ6LJ/dZTI6jXxUg69hO/C8= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.18.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.19.16/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -80,6 +78,10 @@ github.com/bep/golibsass v0.5.0 h1:b+Uxsk826Q35OmbenSmU65P+FJJQoVs2gI2mk1ba28s= github.com/bep/golibsass v0.5.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= github.com/bep/tmc v0.5.1 h1:CsQnSC6MsomH64gw0cT5f+EwQDcvZz4AazKunFwTpuI= github.com/bep/tmc v0.5.1/go.mod h1:tGYHN8fS85aJPhDLgXETVKp+PR382OvFi2+q2GkGsq0= +github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 h1:GKTyiRCL6zVf5wWaqKnf+7Qs6GbEPfd4iMOitWzXJx8= +github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8/go.mod h1:spo1JLcs67NmW1aVLEgtA8Yy1elc+X8y5SRW1sFW4Og= +github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c h1:aprLqMn7gSPT+vdDSl+/E6NLEuArwD/J7IWd8bJt5lQ= +github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c/go.mod h1:Ie6SubJv/NTO9Q0UBH0QCl3Ve50lu9hjbi5YJUw03TE= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= @@ -111,6 +113,9 @@ github.com/disintegration/gift v1.2.1/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dU github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= +github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -202,6 +207,8 @@ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214 h1:WgfvpuKg42WVLkxNwzfFraXkTXPK36bMqXvMFN67clI= +github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214/go.mod h1:kj6hFWqfwSjFjLnYW5PK1DoxZ4O0uapwHRmd9jhln4E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -225,6 +232,12 @@ github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.1 h1:8VMb5+0wMgdBykOV96DwNwKFQ+WTI4pzYURP99CcB9E= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.3 h1:Ce2to9wvs/cuJ2b86/CKQoTYr9VHfpanYosZ0UBJqdw= +github.com/klauspost/pgzip v1.2.3/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= @@ -391,6 +404,9 @@ github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= diff --git a/internal/theme/theme.go b/internal/theme/theme.go index f9c18a5..06e8d42 100644 --- a/internal/theme/theme.go +++ b/internal/theme/theme.go @@ -1,13 +1,14 @@ package theme import ( + "bytes" "fmt" "io/ioutil" "log" "os" "path/filepath" - "github.com/artdarek/go-unzip" + "github.com/c4milo/unpackit" "github.com/snipem/monako/pkg/compose" ) @@ -81,28 +82,12 @@ func extractTheme(composeConfig compose.Config) { if err != nil { log.Fatalf("Error loading theme %s", err) } + byteReader := bytes.NewReader(themezip) - // TODO Don't use local filesystem, keep it in memory - tmpFile, err := ioutil.TempFile(os.TempDir(), "monako-theme-") + destPath, err := unpackit.Unpack(byteReader, filepath.Join(composeConfig.HugoWorkingDir, "themes")) if err != nil { - log.Fatalf("Cannot create temporary file %s", err) - } - _, err = tmpFile.Write(themezip) - if err != nil { - log.Fatalf("Error temporary theme zip file %s", err) - } - - tempfilename := tmpFile.Name() - - if err != nil { - log.Fatalf("Error writing temp theme %s", err) + log.Fatalf("Error extracting theme: %s", err) } - // TODO Don't use a library that depends on local files - uz := unzip.New(tempfilename, filepath.Join(composeConfig.HugoWorkingDir, "themes")) - err = uz.Extract() - if err != nil { - log.Fatalf("Error extracting theme: %s ", err) - } - os.RemoveAll(tempfilename) + log.Printf("Extracted %s", destPath) } From 8095bf78a2f19988c79f2dfac3b7212e8649665f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 20:19:41 +0200 Subject: [PATCH 11/17] Fail on error for compose --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8f7760f..4ba0306 100644 --- a/Makefile +++ b/Makefile @@ -58,7 +58,9 @@ run_local: build $(MAKE) serve compose: - ./monako -config configs/config.monako.yaml \ + ./monako \ + -fail-on-error \ + -config configs/config.monako.yaml \ -menu-config configs/config.menu.md serve: From 73d9328572bf541eb2f88803e26e0f55f4d72912 Mon Sep 17 00:00:00 2001 From: snipem Date: Wed, 1 Apr 2020 20:20:35 +0200 Subject: [PATCH 12/17] Add asciidoctor --- .github/workflows/main.yml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 90760b6..6a7c773 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,25 +21,34 @@ jobs: with: go-version: ${{ matrix.go-version }} - - name: setup env + - name: Setup env shell: bash run: | echo "::set-env name=GOPATH::${{ github.workspace }}/../go" echo "::add-path::${{ github.workspace }}/../go/bin" + - name: Setup Ruby for use with actions + uses: actions/setup-ruby@v1.0.0 + + - name: Install asciidoctor + run: gem install --verbose asciidoctor asciidoctor-diagram + + - name: debug + run: which asciidoctor + - name: Checkout code uses: actions/checkout@v2 - - name: dependencies + - name: Dependencies run: make --always-make deps test_deps - name: Fetch Theme run: make --always-make theme - - name: test + - name: Test run: make --always-make test - - name: build + - name: Build run: make --always-make build - name: Codecov From 107b6eafa40cb1824fd597d5ea6de1bbbc14f245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 20:24:59 +0200 Subject: [PATCH 13/17] Better structured output --- pkg/compose/file.go | 2 +- pkg/compose/origin.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/compose/file.go b/pkg/compose/file.go index ff83995..a8db0ce 100644 --- a/pkg/compose/file.go +++ b/pkg/compose/file.go @@ -104,7 +104,7 @@ func (file OriginFile) composeFile() { default: file.copyRegularFile() } - fmt.Printf(" %s -> %s\n", file.RemotePath, file.LocalPath) + fmt.Printf("%s -> %s\n", file.RemotePath, file.LocalPath) } diff --git a/pkg/compose/origin.go b/pkg/compose/origin.go index e5c27cc..edb8d3d 100644 --- a/pkg/compose/origin.go +++ b/pkg/compose/origin.go @@ -27,7 +27,7 @@ const Markdown = "MARKDOWN" // A virtual filesystem is returned containing the cloned files. func (origin *Origin) CloneDir() { - fmt.Printf("Cloning in to '%s' with branch '%s'\n", origin.URL, origin.Branch) + fmt.Printf("\nCloning in to '%s' with branch '%s' ...\n", origin.URL, origin.Branch) origin.filesystem = memfs.New() From dc59b2036c6cf0c94d6487e245988c433975aeea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 20:25:54 +0200 Subject: [PATCH 14/17] Less verbose on gem install --- .github/workflows/main.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6a7c773..4b8d36e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,11 +31,8 @@ jobs: uses: actions/setup-ruby@v1.0.0 - name: Install asciidoctor - run: gem install --verbose asciidoctor asciidoctor-diagram + run: gem install asciidoctor asciidoctor-diagram - - name: debug - run: which asciidoctor - - name: Checkout code uses: actions/checkout@v2 From 2a93e8f008a62c9bf472fee21da4409bf1965469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 20:59:08 +0200 Subject: [PATCH 15/17] Test for asciidoc --- cmd/monako/main_test.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/cmd/monako/main_test.go b/cmd/monako/main_test.go index 24e90d3..516fc77 100644 --- a/cmd/monako/main_test.go +++ b/cmd/monako/main_test.go @@ -83,7 +83,7 @@ func TestMain(t *testing.T) { }) - t.Run("Check contents of served page", func(t *testing.T) { + t.Run("Check contents of served page markdown", func(t *testing.T) { content, err := getContent(ts, "/docs/test/test_doc_markdown/index.html") assert.NoError(t, err, "HTTP Call failed") @@ -94,6 +94,17 @@ func TestMain(t *testing.T) { }) + t.Run("Check contents of served page asciidoc", func(t *testing.T) { + + content, err := getContent(ts, "/docs/test/test_doc_asciidoc/index.html") + assert.NoError(t, err, "HTTP Call failed") + + assert.Contains(t, content, "Ihr naht euch wieder, schwankende Gestalten!", "Does not contain Goethe") + assert.Contains(t, content, "Test docs", "Does not contain Menu header") + assert.Contains(t, content, "Asciidoc Second Level", "Check rendered Asciidoc") + + }) + if !t.Failed() && runtime.GOOS != "windows" { // Only clean up when not failed // and not on Windows this is because of a filet bug (https://github.com/Flaque/filet/issues/3) @@ -185,10 +196,11 @@ func writeConfig(repo string) (string, string) { monakoConfig := fmt.Sprintf(` --- baseURL : "https://example.com/" - title : "Local Test Page - Only Markdown" + title : "Local Test Page" whitelist: - ".md" + - ".adoc" - ".jpg" - ".jpeg" - ".svg" From 10b00380ccf09b1837e0514abad5d34928870282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 20:59:22 +0200 Subject: [PATCH 16/17] Move gitcommit function --- pkg/compose/origin.go | 36 ++++++++++++++++++++++++++++++++++++ pkg/compose/origin_test.go | 28 ++++++++++++++++++++++++++++ pkg/helpers/util.go | 38 -------------------------------------- pkg/helpers/util_test.go | 27 --------------------------- 4 files changed, 64 insertions(+), 65 deletions(-) diff --git a/pkg/compose/origin.go b/pkg/compose/origin.go index edb8d3d..aecc51e 100644 --- a/pkg/compose/origin.go +++ b/pkg/compose/origin.go @@ -3,6 +3,7 @@ package compose // run: make test import ( + "errors" "fmt" "os" @@ -13,6 +14,7 @@ import ( "gopkg.in/src-d/go-billy.v4/memfs" "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/plumbing" + "gopkg.in/src-d/go-git.v4/plumbing/object" "gopkg.in/src-d/go-git.v4/plumbing/transport/http" "gopkg.in/src-d/go-git.v4/storage/memory" ) @@ -89,3 +91,37 @@ type Origin struct { config *Config filesystem billy.Filesystem } + +// GetCommitInfo returns the Commit Info for a given file of the repository +// identified by it's filename +func (origin *Origin) GetCommitInfo(filename string) (*object.Commit, error) { + + r := origin.repo + // TODO what is wrong here? + cIter, err := r.Log(&git.LogOptions{ + FileName: &filename, + All: true, + }) + + if err != nil { + return nil, fmt.Errorf("Error while opening %s from git log: %s", filename, err) + } + + var returnCommit *object.Commit + + err = cIter.ForEach(func(commit *object.Commit) error { + if commit == nil { + return errors.New("Commit is nil") + } + returnCommit = commit + return nil + }, + ) + defer cIter.Close() + + if err != nil { + return nil, err + } + + return returnCommit, nil +} diff --git a/pkg/compose/origin_test.go b/pkg/compose/origin_test.go index 9a64d30..7fa0abc 100644 --- a/pkg/compose/origin_test.go +++ b/pkg/compose/origin_test.go @@ -60,3 +60,31 @@ func TestCopyDir(t *testing.T) { }) } + +func TestGitCommiter(t *testing.T) { + t.Skip("Not yet implemented") + fileName := "README.md" + + ci, err := o.GetCommitInfo(fileName) + + assert.NoError(t, err, "Could not retrieve commit info") + assert.Contains(t, ci.Committer.Email, "@") + +} + +func TestGitCommiterFileNotFound(t *testing.T) { + t.Skip("Not yet implemented") + fileName := "Not existing file...." + _, err := o.GetCommitInfo(fileName) + + assert.Error(t, err, "Expect error for non existing file") +} + +func TestGitCommiterSubfolder(t *testing.T) { + t.Skip("Not yet implemented") + fileName := "test/config.menu.local.md" + ci, err := o.GetCommitInfo(fileName) + + assert.NoError(t, err, "Could not retrieve commit info") + assert.Contains(t, ci.Committer.Email, "@") +} diff --git a/pkg/helpers/util.go b/pkg/helpers/util.go index f7023a5..c08b76e 100644 --- a/pkg/helpers/util.go +++ b/pkg/helpers/util.go @@ -1,14 +1,9 @@ package helpers import ( - "errors" - "fmt" "strings" hugo "github.com/gohugoio/hugo/commands" - - "gopkg.in/src-d/go-git.v4" - "gopkg.in/src-d/go-git.v4/plumbing/object" ) // FileIsWhitelisted returns true if the filename is in the whitelisted based on its suffix @@ -33,39 +28,6 @@ func IsAsciidoc(filename string) bool { strings.HasSuffix(strings.ToLower(filename), strings.ToLower(".asc")) } -// GetCommitInfo returns the Commit Info for a given file of the repository -// identified by it's filename -func GetCommitInfo(r *git.Repository, filename string) (*object.Commit, error) { - - // TODO what is wrong here? - cIter, err := r.Log(&git.LogOptions{ - FileName: &filename, - All: true, - }) - - if err != nil { - return nil, fmt.Errorf("Error while opening %s from git log: %s", filename, err) - } - - var returnCommit *object.Commit - - err = cIter.ForEach(func(commit *object.Commit) error { - if commit == nil { - return errors.New("Commit is nil") - } - returnCommit = commit - return nil - }, - ) - defer cIter.Close() - - if err != nil { - return nil, err - } - - return returnCommit, nil -} - // HugoRun runs Hugo like the command line interface func HugoRun(args []string) error { response := hugo.Execute(args) diff --git a/pkg/helpers/util_test.go b/pkg/helpers/util_test.go index 86d0d81..bd460e2 100644 --- a/pkg/helpers/util_test.go +++ b/pkg/helpers/util_test.go @@ -26,30 +26,3 @@ func TestIsAsciidoc(t *testing.T) { assert.True(t, IsAsciidoc("asciidoc.ADOC"), "Check should be true") assert.False(t, IsAsciidoc("somefolderwith.adoc-init/somefile.tmp"), "Asciidoc not detected correctly") } - -// TODO Use direct repository - -// func TestGitCommiter(t *testing.T) { -// fileName := "README.md" - -// ci, err := GetCommitInfo(o.repo, fileName) - -// assert.NoError(t, err, "Could not retrieve commit info") -// assert.Contains(t, ci.Committer.Email, "@") - -// } - -// func TestGitCommiterFileNotFound(t *testing.T) { -// fileName := "Not existing file...." -// _, err := GetCommitInfo(o.repo, fileName) - -// assert.Error(t, err, "Expect error for non existing file") -// } - -// func TestGitCommiterSubfolder(t *testing.T) { -// fileName := "test/config.menu.local.md" -// ci, err := GetCommitInfo(o.repo, fileName) - -// assert.NoError(t, err, "Could not retrieve commit info") -// assert.Contains(t, ci.Committer.Email, "@") -// } From 893f78736906186ec9c411bfec6e92b24b219b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BCch?= Date: Wed, 1 Apr 2020 21:23:39 +0200 Subject: [PATCH 17/17] Increase timeout --- internal/theme/theme.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/theme/theme.go b/internal/theme/theme.go index 06e8d42..ede6cc1 100644 --- a/internal/theme/theme.go +++ b/internal/theme/theme.go @@ -50,6 +50,9 @@ baseURL = '%s' title = '%s' theme = '%s' +# Because of this bug: https://github.com/gohugoio/hugo/issues/4841 +timeout = 60000 + # Book configuration disablePathToLower = true enableGitInfo = false