SCRIPTS_FETCH_DIR := ./research/fetch_data
LIST_FULL := ./research/list_of_repositories.csv
LIST_SMALL := ./research/list_of_repositories_100.csv
LIST_TINY := ./research/list_of_repositories_tiny.csv
MODE ?= tiny
LIST := $(if $(filter tiny,$(MODE)),$(LIST_TINY),$(if $(filter small,$(MODE)),$(LIST_SMALL),$(LIST_FULL)))
REPOSITORIES_DIR := /var/tmp/research/$(MODE)/repositories/
RESEARCH_DIR := /var/tmp/research/$(MODE)/
clean: clean-db
rm -rf $(REPOSITORIES_DIR)
clean-db:
rm -rf $(RESEARCH_DIR)/stats.sqlite
test:
cargo test
build: test
cargo build --release
hermetic-benchmark:
cargo bench --bench diff_code_benchmark
hermetic-benchmark-update-baseline:
cargo bench --bench diff_code_benchmark -- --save-baseline baseline
benchmark-sampled:
@echo "Running benchmarks for all languages (Rust, Python, Go, Kotlin)..."
@echo "Results will be written to research/results/"
cd research && ./measure/benchmark_all.sh --language all --repos-dir /var/tmp/research/small/repositories/ --bin-dir ../target/release
@echo ""
@echo "Running analysis..."
cd research && uv run ./analysis/benchmark_report.py
benchmark-sampled-extended:
@echo "Running extended benchmarks for all supported languages..."
@echo "Results will be written to research/results/"
@echo "Using 20000 node limit, max 100 commits per repo"
cd research && ./measure/benchmark_all_extended.sh \
--language all \
--repos-dir /var/tmp/research/small/repositories/ \
--bin-dir ../target/release \
--limit 20000 \
--max-commits 100 \
--timeout-min 120 \
--continue-on-error
@echo ""
@echo "Running analysis..."
cd research && uv run ./analysis/benchmark_report.py
fetch: $(LIST) $(SCRIPTS_FETCH_DIR)/dataset.sh
$(SCRIPTS_FETCH_DIR)/dataset.sh update --root $(REPOSITORIES_DIR) --list $(LIST)
file-stats: build
./target/release/file_stats --path $(REPOSITORIES_DIR) --db $(RESEARCH_DIR)/stats.sqlite
(cd research && uv run ./analysis/file_stats.py $(RESEARCH_DIR)/stats.sqlite)
commit-stats: build
./target/release/commit_stats --path $(REPOSITORIES_DIR) --db $(RESEARCH_DIR)/stats.sqlite
sample-pairs: build
./target/release/sample_code_pairs --path $(REPOSITORIES_DIR) --output research/sampled_code_pairs.csv
benchmark-pairs: build
./target/release/benchmark_diff_pairs --csv research/sampled_code_pairs.csv --repo-root $(REPOSITORIES_DIR) --output research/diff_pairs_benchmark.csv
sample-pairs-rust: build
./target/release/sample_code_pairs --path $(REPOSITORIES_DIR) --output research/sampled_code_pairs_rust.csv --language Rust
benchmark-pairs-rust: build
./target/release/benchmark_diff_pairs --csv research/sampled_code_pairs_rust.csv --repo-root $(REPOSITORIES_DIR) --output research/diff_pairs_benchmark_rust.csv
sample-pairs-java: build
./target/release/sample_code_pairs --path $(REPOSITORIES_DIR) --output research/sampled_code_pairs_java.csv --language Java --count 1000 --max-commits-per-repo 100
benchmark-pairs-java: build
./target/release/benchmark_diff_pairs --csv research/sampled_code_pairs_java.csv --repo-root $(REPOSITORIES_DIR) --output research/benchmark_java.csv --max-combined-nodes 20000
sample-pairs-javascript: build
./target/release/sample_code_pairs --path $(REPOSITORIES_DIR) --output research/sampled_code_pairs_javascript.csv --language JavaScript --count 1000 --max-commits-per-repo 100
benchmark-pairs-javascript: build
./target/release/benchmark_diff_pairs --csv research/sampled_code_pairs_javascript.csv --repo-root $(REPOSITORIES_DIR) --output research/benchmark_javascript.csv --max-combined-nodes 20000
sample-pairs-typescript: build
./target/release/sample_code_pairs --path $(REPOSITORIES_DIR) --output research/sampled_code_pairs_typescript.csv --language TypeScript --count 1000 --max-commits-per-repo 100
benchmark-pairs-typescript: build
./target/release/benchmark_diff_pairs --csv research/sampled_code_pairs_typescript.csv --repo-root $(REPOSITORIES_DIR) --output research/benchmark_typescript.csv --max-combined-nodes 20000
analyze: file-stats
tiny: override MODE=tiny
tiny: analyze
small: override MODE=small
small: analyze
full: override MODE=full
full: analyze