diff options
| author | Martin Fischer <martin@push-f.com> | 2026-01-17 19:33:43 +0100 |
|---|---|---|
| committer | Martin Fischer <martin@push-f.com> | 2026-01-17 19:40:55 +0100 |
| commit | b89125bf417a00985f37f45f1d190b8c92225eaf (patch) | |
| tree | 9a8c1574f4fd30f3fa63218bf5f76fa7284d805b | |
| parent | 6bff1a8e74e4eba3fae3ac3d0d6a3bd28a00ef3c (diff) | |
| -rw-r--r-- | main.go | 23 | ||||
| -rw-r--r-- | main_test.go | 2 | ||||
| -rw-r--r-- | service.nix | 6 |
3 files changed, 23 insertions, 8 deletions
@@ -21,9 +21,10 @@ import ( ) type Args struct { - Port int `help:"Port to listen on" short:"p" default:"8888" env:"PORT"` - ReposDir string `required:"" help:"Directory containing repositories to be grepped" env:"REPOS_DIR"` - Patterns StringMap `placeholder:"{\"name\": \"regex\", ...}" required:"" help:"Patterns to be grepped for" env:"PATTERNS"` + Port int `help:"Port to listen on" short:"p" default:"8888" env:"PORT"` + ReposDir string `required:"" help:"Directory containing repositories to be grepped" env:"REPOS_DIR"` + OnlyExported bool `help:"Only grep repositories that contain git-grep-exporter.export=1 in their config" env:"ONLY_EXPORTED"` + Patterns StringMap `placeholder:"{\"name\": \"regex\", ...}" required:"" help:"Patterns to be grepped for" env:"PATTERNS"` } type StringMap map[string]string @@ -45,7 +46,7 @@ func main() { "Only the HEAD of the repositories will be grepped.", )) - te, err := newGitGrepExporter(args.ReposDir, args.Patterns, prometheus.DefaultRegisterer) + te, err := newGitGrepExporter(args.ReposDir, args.OnlyExported, args.Patterns, prometheus.DefaultRegisterer) ctx.FatalIfErrorf(err) prometheus.MustRegister(te) @@ -58,12 +59,13 @@ func main() { type GitGrepExporter struct { reposDir string + onlyExported bool descs map[string]*prometheus.Desc regexes map[string]*regexp.Regexp combinedPattern string } -func newGitGrepExporter(reposDir string, patterns map[string]string, reg prometheus.Registerer) (*GitGrepExporter, error) { +func newGitGrepExporter(reposDir string, onlyExported bool, patterns map[string]string, reg prometheus.Registerer) (*GitGrepExporter, error) { if len(patterns) == 0 { return nil, fmt.Errorf("no patterns specified") } @@ -81,7 +83,7 @@ func newGitGrepExporter(reposDir string, patterns map[string]string, reg prometh regexes[name] = regexp.MustCompile(pattern) } - return &GitGrepExporter{reposDir, descs, regexes, strings.Join(slices.Collect(maps.Values(patterns)), "|")}, nil + return &GitGrepExporter{reposDir, onlyExported, descs, regexes, strings.Join(slices.Collect(maps.Values(patterns)), "|")}, nil } func (e *GitGrepExporter) Describe(ch chan<- *prometheus.Desc) { @@ -91,7 +93,7 @@ func (e *GitGrepExporter) Describe(ch chan<- *prometheus.Desc) { } func (g *GitGrepExporter) Collect(ch chan<- prometheus.Metric) { - slog.Info("listing directory", "path", g.reposDir) + slog.Info("listing directory", "path", g.reposDir, "onlyExported", g.onlyExported) entries, err := os.ReadDir(g.reposDir) if err != nil { slog.Error("failed to read repos directory", "path", g.reposDir, "error", err) @@ -108,6 +110,13 @@ func (g *GitGrepExporter) Collect(ch chan<- prometheus.Metric) { repoPath := path.Join(g.reposDir, entry.Name()) logger := slog.With("path", repoPath) + if g.onlyExported { + _, err := run("git", "-C", repoPath, "config", "get", "--value", "^1$", "git-grep-exporter.export") + if err != nil { + continue + } + } + logger.Info("starting grep") g.collectCountsForRepo(entry.Name(), repoPath, ch) if err != nil { diff --git a/main_test.go b/main_test.go index 45a3ba5..a83c91b 100644 --- a/main_test.go +++ b/main_test.go @@ -21,7 +21,7 @@ func TestGrepRepo(t *testing.T) { patterns := map[string]string{"match": "\\bMATCH\\b", "match_start": "^MATCH"} reg := prometheus.NewRegistry() - te, err := newGitGrepExporter(reposDir, patterns, reg) + te, err := newGitGrepExporter(reposDir, false, patterns, reg) if err != nil { t.Fatal(err) } diff --git a/service.nix b/service.nix index ba53972..337d8b6 100644 --- a/service.nix +++ b/service.nix @@ -20,6 +20,11 @@ in type = lib.types.str; }; + onlyExported = lib.mkOption { + type = lib.types.bool; + default = false; + }; + extraGroups = lib.mkOption { type = lib.types.listOf lib.types.str; default = []; @@ -36,6 +41,7 @@ in environment = { PORT = toString cfg.port; REPOS_DIR = cfg.reposDir; + ONLY_EXPORTED = toString cfg.onlyExported; PATTERNS = builtins.toJSON cfg.patterns; }; |
