aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fischer <martin@push-f.com>2026-01-17 19:33:43 +0100
committerMartin Fischer <martin@push-f.com>2026-01-17 19:40:55 +0100
commitb89125bf417a00985f37f45f1d190b8c92225eaf (patch)
tree9a8c1574f4fd30f3fa63218bf5f76fa7284d805b
parent6bff1a8e74e4eba3fae3ac3d0d6a3bd28a00ef3c (diff)
feat: allow controlling whether exported in repo configsHEADmaster
-rw-r--r--main.go23
-rw-r--r--main_test.go2
-rw-r--r--service.nix6
3 files changed, 23 insertions, 8 deletions
diff --git a/main.go b/main.go
index 66a4b2c..9b64787 100644
--- a/main.go
+++ b/main.go
@@ -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;
};