git.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. var (
  23. findings []report.Finding
  24. err error
  25. )
  26. // grab source
  27. source := "."
  28. if len(args) == 1 {
  29. source = args[0]
  30. if source == "" {
  31. source = "."
  32. }
  33. }
  34. initConfig(source)
  35. // setup config (aka, the thing that defines rules)
  36. cfg := Config(cmd)
  37. // start timer
  38. start := time.Now()
  39. // grab source
  40. detector := Detector(cmd, cfg, source)
  41. // set exit code
  42. exitCode, err := cmd.Flags().GetInt("exit-code")
  43. if err != nil {
  44. log.Fatal().Err(err).Msg("could not get exit code")
  45. }
  46. var (
  47. gitCmd *sources.GitCmd
  48. logOpts string
  49. )
  50. logOpts, err = cmd.Flags().GetString("log-opts")
  51. if err != nil {
  52. log.Fatal().Err(err).Msg("could not call GetString() for log-opts")
  53. }
  54. gitCmd, err = sources.NewGitLogCmd(source, logOpts)
  55. if err != nil {
  56. log.Fatal().Err(err).Msg("could not create Git cmd")
  57. }
  58. findings, err = detector.DetectGit(gitCmd)
  59. if err != nil {
  60. // don't exit on error, just log it
  61. log.Error().Err(err).Msg("failed to scan Git repository")
  62. }
  63. findingSummaryAndExit(findings, cmd, cfg, exitCode, start, err)
  64. }