From dca11dad5bfefeb05b0d3ea2a88bc4f9b159a2b7 Mon Sep 17 00:00:00 2001 From: Matej Vasek Date: Thu, 25 Aug 2022 15:20:19 +0200 Subject: [PATCH] fix: performance of template loading (#1189) If repo is non-bare git repo treat is as plain FS template, i.e. do not load it from ".git" date. Signed-off-by: Matej Vasek Signed-off-by: Matej Vasek --- repository.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/repository.go b/repository.go index 409070706..f818b870d 100644 --- a/repository.go +++ b/repository.go @@ -184,6 +184,10 @@ func filesystemFromURI(uri string) (f Filesystem, err error) { return EmbeddedTemplatesFS, nil } + if isNonBareGitRepo(uri) { + return filesystemFromPath(uri) + } + // Attempt to get a filesystem from the uri as a remote repo. f, err = filesystemFromRepo(uri) if f != nil || err != nil { @@ -194,6 +198,22 @@ func filesystemFromURI(uri string) (f Filesystem, err error) { return filesystemFromPath(uri) } +func isNonBareGitRepo(uri string) bool { + parsed, err := url.Parse(uri) + if err != nil { + return false + } + if parsed.Scheme != "file" { + return false + } + p := filepath.Join(filepath.FromSlash(uri[7:]), ".git") + fi, err := os.Stat(p) + if err != nil { + return false + } + return fi.IsDir() +} + // filesystemFromRepo attempts to fetch a filesystem from a git repository // indicated by the given URI. Returns nil if there is not a repo at the URI. func filesystemFromRepo(uri string) (Filesystem, error) {