44package private
55
66import (
7- "bytes "
7+ "context "
88 "fmt"
99 "io"
1010 "net/http"
@@ -34,6 +34,7 @@ import (
3434 gitleaks_config "github.com/zricethezav/gitleaks/v8/config"
3535 gitleaks "github.com/zricethezav/gitleaks/v8/detect"
3636 gitleaks_log "github.com/zricethezav/gitleaks/v8/logging"
37+ "github.com/zricethezav/gitleaks/v8/report"
3738)
3839
3940type preReceiveContext struct {
@@ -569,7 +570,6 @@ func preReceiveSecrets(ctx *preReceiveContext, oldCommitID, newCommitID string,
569570 if newCommitID == ctx .Repo .GetObjectFormat ().EmptyObjectID ().String () {
570571 return
571572 }
572-
573573 var err error
574574 var detector * gitleaks.Detector
575575
@@ -592,32 +592,31 @@ func preReceiveSecrets(ctx *preReceiveContext, oldCommitID, newCommitID string,
592592 oldCommitID = ctx .Repo .GetObjectFormat ().EmptyTree ().String ()
593593 }
594594 }
595+ var findings []report.Finding
595596
596- stdout := & bytes. Buffer {}
597+ r , w , _ := os . Pipe ()
597598 err = git .NewCommand ("log" , "-U0" , "-p" ).AddDynamicArguments (oldCommitID + ".." + newCommitID ).Run (
598599 ctx ,
599600 & git.RunOpts {
600601 Dir : repo .RepoPath (),
601602 Env : ctx .env ,
602- Stdout : stdout ,
603+ Stdout : w ,
604+ PipelineFunc : func (_ context.Context , _ context.CancelFunc ) error {
605+ giteaCmd , err := newPreReceiveDiff (r )
606+ if err != nil {
607+ return err
608+ }
609+ w .Close ()
610+ findings , err = detector .DetectGit (giteaCmd , gitleaks .NewRemoteInfo (scm .GitHubPlatform , repo .Website ))
611+ return err
612+ },
603613 },
604614 )
605615 if err != nil {
606616 ctx .JSON (http .StatusTeapot , private.Response {Err : err .Error (), UserMsg : err .Error ()})
607617 return
608618 }
609619
610- giteaCmd , err := newPreReceiveDiff (stdout )
611- if err != nil {
612- ctx .JSON (http .StatusTeapot , private.Response {Err : err .Error (), UserMsg : err .Error ()})
613- return
614- }
615- findings , err := detector .DetectGit (giteaCmd , gitleaks .NewRemoteInfo (scm .GitHubPlatform , repo .Website ))
616- if err != nil {
617- ctx .JSON (http .StatusTeapot , private.Response {Err : err .Error (), UserMsg : err .Error ()})
618- return
619- }
620-
621620 if len (findings ) != 0 {
622621 msg := strings.Builder {}
623622 msg .WriteString ("This repository has secret detection enabled! Following secrets were detected:\n " )
@@ -633,15 +632,17 @@ func preReceiveSecrets(ctx *preReceiveContext, oldCommitID, newCommitID string,
633632
634633type giteacmd struct {
635634 diffCh <- chan * gitdiff.File
635+ closer io.Closer
636636}
637637
638- func newPreReceiveDiff (r io.Reader ) (* giteacmd , error ) {
638+ func newPreReceiveDiff (r io.ReadCloser ) (* giteacmd , error ) {
639639 diffCh , err := gitdiff .Parse (r )
640640 if err != nil {
641641 return nil , err
642642 }
643643 return & giteacmd {
644644 diffCh : diffCh ,
645+ closer : r ,
645646 }, nil
646647}
647648
0 commit comments