git.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. preCommit bool
  50. staged bool
  51. )
  52. logOpts, err = cmd.Flags().GetString("log-opts")
  53. if err != nil {
  54. log.Fatal().Err(err).Msg("could not call GetString() for log-opts")
  55. }
  56. staged, err = cmd.Flags().GetBool("staged")
  57. if err != nil {
  58. log.Fatal().Err(err).Msg("could not call GetBool() for staged")
  59. }
  60. preCommit, err = cmd.Flags().GetBool("pre-commit")
  61. if err != nil {
  62. log.Fatal().Err(err).Msg("could not call GetBool() for pre-commit")
  63. }
  64. if preCommit || staged {
  65. gitCmd, err = sources.NewGitDiffCmd(source, staged)
  66. if err != nil {
  67. log.Fatal().Err(err).Msg("could not create Git diff cmd")
  68. }
  69. } else {
  70. gitCmd, err = sources.NewGitLogCmd(source, logOpts)
  71. if err != nil {
  72. log.Fatal().Err(err).Msg("could not create Git log cmd")
  73. }
  74. }
  75. findings, err = detector.DetectGit(gitCmd)
  76. if err != nil {
  77. // don't exit on error, just log it
  78. log.Error().Err(err).Msg("failed to scan Git repository")
  79. }
  80. findingSummaryAndExit(findings, cmd, cfg, exitCode, start, err)
  81. }