mirror of
https://github.com/thomiceli/opengist.git
synced 2025-07-09 09:28:03 +02:00
Move Git hook logic to Opengist (#213)
This commit is contained in:
43
internal/hooks/post-receive.go
Normal file
43
internal/hooks/post-receive.go
Normal file
@ -0,0 +1,43 @@
|
||||
package hooks
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func PostReceive(in io.Reader, out, er io.Writer) error {
|
||||
scanner := bufio.NewScanner(in)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
parts := strings.Fields(line)
|
||||
if len(parts) != 3 {
|
||||
_, _ = fmt.Fprintln(er, "Invalid input")
|
||||
return fmt.Errorf("invalid input")
|
||||
}
|
||||
oldrev, _, refname := parts[0], parts[1], parts[2]
|
||||
|
||||
if err := verifyHEAD(); err != nil {
|
||||
setSymbolicRef(refname)
|
||||
}
|
||||
|
||||
if oldrev == BaseHash {
|
||||
_, _ = fmt.Fprintf(out, "\nYour new repository has been created here: %s\n\n", os.Getenv("OPENGIST_REPOSITORY_URL_INTERNAL"))
|
||||
_, _ = fmt.Fprintln(out, "If you want to keep working with your gist, you could set the remote URL via:")
|
||||
_, _ = fmt.Fprintf(out, "git remote set-url origin %s\n\n", os.Getenv("OPENGIST_REPOSITORY_URL_INTERNAL"))
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func verifyHEAD() error {
|
||||
return exec.Command("git", "rev-parse", "--verify", "--quiet", "HEAD").Run()
|
||||
}
|
||||
|
||||
func setSymbolicRef(refname string) {
|
||||
_ = exec.Command("git", "symbolic-ref", "HEAD", refname).Run()
|
||||
}
|
80
internal/hooks/pre-receive.go
Normal file
80
internal/hooks/pre-receive.go
Normal file
@ -0,0 +1,80 @@
|
||||
package hooks
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const BaseHash = "0000000000000000000000000000000000000000"
|
||||
|
||||
func PreReceive(in io.Reader, out, er io.Writer) error {
|
||||
var err error
|
||||
var disallowedFiles []string
|
||||
var disallowedCommits []string
|
||||
|
||||
scanner := bufio.NewScanner(in)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
parts := strings.Split(line, " ")
|
||||
if len(parts) < 3 {
|
||||
_, _ = fmt.Fprintln(er, "Invalid input")
|
||||
return fmt.Errorf("invalid input")
|
||||
}
|
||||
|
||||
oldRev, newRev := parts[0], parts[1]
|
||||
|
||||
var changedFiles string
|
||||
if oldRev == BaseHash {
|
||||
// First commit
|
||||
if changedFiles, err = getChangedFiles(newRev); err != nil {
|
||||
_, _ = fmt.Fprintln(er, "Failed to get changed files")
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if changedFiles, err = getChangedFiles(fmt.Sprintf("%s..%s", oldRev, newRev)); err != nil {
|
||||
_, _ = fmt.Fprintln(er, "Failed to get changed files")
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
var currentCommit string
|
||||
for _, file := range strings.Fields(changedFiles) {
|
||||
if strings.HasPrefix(file, "/") {
|
||||
currentCommit = file[1:]
|
||||
}
|
||||
|
||||
if strings.Contains(file[1:], "/") {
|
||||
disallowedFiles = append(disallowedFiles, file)
|
||||
disallowedCommits = append(disallowedCommits, currentCommit[0:7])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if len(disallowedFiles) > 0 {
|
||||
_, _ = fmt.Fprintln(out, "\nPushing files in directories is not allowed:")
|
||||
for i := range disallowedFiles {
|
||||
_, _ = fmt.Fprintf(out, " %s (%s)\n", disallowedFiles[i], disallowedCommits[i])
|
||||
}
|
||||
_, _ = fmt.Fprintln(out)
|
||||
return fmt.Errorf("pushing files in directories is not allowed: %s", disallowedFiles)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func getChangedFiles(rev string) (string, error) {
|
||||
cmd := exec.Command("git", "log", "--name-only", "--format=/%H", "--diff-filter=AM", rev)
|
||||
|
||||
var out bytes.Buffer
|
||||
cmd.Stdout = &out
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out.String(), nil
|
||||
}
|
Reference in New Issue
Block a user