Git hook triggered via local commit or Gitea's one. It runs Hugo against its dedicated repository with Markdown files and related assets.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

136 lines
3.4 KiB

package main
import (
"bufio"
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"runtime"
"time"
"git.sandpoints.org/Drawwell/SandpointsGitHook/giq"
)
var (
version = "21.03.04"
logLines = ""
)
func check(e error) {
if e != nil {
logLines += fmt.Sprintf("\nGit hook version: %s\n~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n", version)
log.Fatal(e)
panic(e)
}
}
type Hugo struct {
CatalogName string
CatalogPrefix string
SourceDir string
DestinationDir string
PublicHTMLName string
}
type Hook struct {
Context string
Publish bool
Offline bool
Gogit bool
Stdinput string
ExecutablePath string
PublicHTMLPath string
}
func gitExePath(hook *Hook) string {
gexe := "git"
if runtime.GOOS == "windows" {
gexe = "git.exe"
}
gpath, err := exec.LookPath(gexe)
check(err)
if gpath != "" {
hook.Gogit = false
return gpath
} else {
hook.Gogit = true
return ""
}
}
func main() {
startTime := time.Now()
logLines := fmt.Sprintf("~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\nSANDPOINTS GITHOOK (%s)\n\n", version)
// init global struct/variables
var hook *Hook
var hugo *Hugo
var git giq.Git
var giqi giq.Giqi
hook = new(Hook)
hugo = new(Hugo)
hook.Publish = false
hook.Gogit = true
hook.PublicHTMLPath = filepath.Join("/var", "www", "html", "sandpoints")
hookExe, err := os.Executable()
check(err)
hook.ExecutablePath = filepath.Dir(hookExe)
// hook.ExecutablePath = "/home/m/Downloads/SimpleSandpoints/.git/hooks"
// hook.ExecutablePath = "/home/m/gitea-repositories/sandpoints/dev.git/hooks/post-receive.d"
// hook.ExecutablePath = "/home/m/gitea-repositories/sandpoints/simplesandpoints.git/hooks/post-receive.d"
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
scannerTxt := scanner.Text()
hookContext(hook, scannerTxt)
gitPath := gitExePath(hook)
giqi = &giq.Gogit{}
// enforce go-git if mocking hook.ExecutablePath
// if hook.Gogit {
// DEFAULT but enforce sysgit if mocking hook.ExecutablePath
if !hook.Gogit {
giqi = &giq.Sysgit{}
}
git = giqi.GitStruct(hook.ExecutablePath, hook.Context, hook.Stdinput, gitPath)
hook.Publish = git.Publish
hugo.SourceDir = git.RepoPath
if git.IsBare {
giqi.AddBareWorktree(git.RepoPath, git.IndexPath, git.Worktree, gitPath)
defer giqi.RemoveBareWorktree(git.RepoPath, git.IndexPath, git.Worktree, gitPath)
hugo.SourceDir = git.TmpRepoPath
}
hugoContext(hugo, git.RepoPath)
logs := hugoRender(hugo, hook.Offline)
logLines += fmt.Sprintf(logs)
if git.IsBare {
cleanUpPublicHTML(hugo, hook)
copyToPublicHTML(hugo, hook)
logLines += fmt.Sprintln("~~~~~~~~~~~~~~~~~~~~~~~~~~~")
if hook.Publish {
logLines += fmt.Sprintf("Web site path:\n%s", filepath.Join(hook.PublicHTMLPath, hugo.PublicHTMLName))
} else {
logLines += fmt.Sprintf("Web site path:\n%s", filepath.Join(hook.PublicHTMLPath, hugo.PublicHTMLName, "_preview"))
}
} else {
logLines += fmt.Sprintf("Web site path:\n%s", hugo.DestinationDir)
}
durationMillseconds := int64(time.Since(startTime) / time.Millisecond)
logLines = logLines + fmt.Sprintf("\n~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\nTotal githook time: %d ms\n~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n", durationMillseconds)
logLines = logLines + startTime.Format(time.RFC822) + "\n~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n"
logLines = logLines + "\n####################################\n"
logLines = logLines + fmt.Sprintf("%#v", hugo)
logLines = logLines + fmt.Sprintf("%#v", hook)
writeLastCommitLog(logLines, git.IsBare, hugo, hook)
fmt.Println(logLines)
}