git.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package cmd
  2. import (
  3. "time"
  4. "github.com/rs/zerolog/log"
  5. "github.com/spf13/cobra"
  6. "github.com/zricethezav/gitleaks/v8/report"
  7. "github.com/zricethezav/gitleaks/v8/sources"
  8. )
  9. func init() {
  10. rootCmd.AddCommand(gitCmd)
  11. gitCmd.Flags().Bool("staged", false, "scan staged commits (good for pre-commit)")
  12. gitCmd.Flags().Bool("pre-commit", false, "scan using git diff")
  13. gitCmd.Flags().String("log-opts", "", "git log options")
  14. }
  15. var gitCmd = &cobra.Command{
  16. Use: "git [flags] [repo]",
  17. Short: "scan git repositories for secrets",
  18. Args: cobra.MaximumNArgs(1),
  19. Run: runGit,
  20. }
  21. func runGit(cmd *cobra.Command, args []string) {
  22. initConfig()
  23. var (
  24. findings []report.Finding
  25. err error
  26. )
  27. // setup config (aka, the thing that defines rules)
  28. cfg := Config(cmd)
  29. // start timer
  30. start := time.Now()
  31. // grab source
  32. source, err := cmd.Flags().GetString("source")
  33. if err != nil {
  34. log.Fatal().Err(err).Msg("could not get source")
  35. }
  36. detector := Detector(cmd, cfg, source)
  37. // set exit code
  38. exitCode, err := cmd.Flags().GetInt("exit-code")
  39. if err != nil {
  40. log.Fatal().Err(err).Msg("could not get exit code")
  41. }
  42. var (
  43. gitCmd *sources.GitCmd
  44. logOpts string
  45. )
  46. logOpts, err = cmd.Flags().GetString("log-opts")
  47. if err != nil {
  48. log.Fatal().Err(err).Msg("could not call GetString() for log-opts")
  49. }
  50. gitCmd, err = sources.NewGitLogCmd(source, logOpts)
  51. if err != nil {
  52. log.Fatal().Err(err).Msg("could not create Git cmd")
  53. }
  54. findings, err = detector.DetectGit(gitCmd)
  55. if err != nil {
  56. // don't exit on error, just log it
  57. log.Error().Err(err).Msg("failed to scan Git repository")
  58. }
  59. findingSummaryAndExit(findings, cmd, cfg, exitCode, start, err)
  60. }