package main import ( "bufio" "fmt" "log" "os" "os/exec" "path/filepath" "runtime" "strings" "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 hookContext(hook *Hook) { scanner := bufio.NewScanner(os.Stdin) scanner.Scan() if scanner.Text() == "" { hook.Context = "PostCommit" } else if strings.HasPrefix(scanner.Text(), "sandpoints-ext") { revs := strings.Fields(scanner.Text()) if revs[1] == "publish" { hook.Publish = true } if revs[2] == "offline" { hook.Offline = true } if revs[3] == "file" { hook.Context = "SandpointsFileProtocol" } if revs[3] == "http" { hook.Context = "SandpointsHTTPProtocol" } } else { // it only handles gitea use case if not Local or sandpoints-ext hook.Context = "PostReceive" hook.Stdinput = scanner.Text() } } func main() { startTime := time.Now() logLines := "~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n" + startTime.Format(time.RFC822) + "\n" // 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" hookContext(hook) 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 // hugo.DestinationDir = 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 // tree, err := exec.Command("/usr/bin/tree", git.TmpRepoPath).Output() // check(err) // fmt.Println(string(tree)) } hugoContext(hugo, git.RepoPath) logs := hugoRender(hugo, hook.Offline) // fmt.Println(logs) logLines += fmt.Sprintf(logs) if git.IsBare { cleanUpPublicHTML(hugo, hook) copyToPublicHTML(hugo, hook) if hook.Publish { // fmt.Println("Web site:", filepath.Join(hook.PublicHTMLPath, hugo.PublicHTMLName)) logLines += fmt.Sprintf("Web site: %s\n", filepath.Join(hook.PublicHTMLPath, hugo.PublicHTMLName)) } else { // fmt.Println("Web site:", filepath.Join(hook.PublicHTMLPath, hugo.PublicHTMLName, "_preview")) logLines += fmt.Sprintf("Web site: %s\n", filepath.Join(hook.PublicHTMLPath, hugo.PublicHTMLName, "_preview")) } } else { // fmt.Println("Web site:", hugo.DestinationDir) logLines += fmt.Sprintf("Web site: %s\n", hugo.DestinationDir) } durationMillseconds := int64(time.Since(startTime) / time.Millisecond) logLines = logLines + fmt.Sprintf("Total processing time: %d ms\n\nGit hook version: %s\n~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n", durationMillseconds, version) fmt.Println(logLines) }