|
| 1 | +# Arquitetura |
| 2 | + |
| 3 | +Esta página descreve a arquitetura implementada no código atual do GitDatabase. |
| 4 | + |
| 5 | +## Workspace e crates |
| 6 | + |
| 7 | +O projeto é um workspace Rust com os seguintes crates: |
| 8 | + |
| 9 | +- `gitbase-cli`: interface de linha de comando e orquestração dos fluxos |
| 10 | +- `gitbase-db`: conexão com PostgreSQL, migrações e acesso a dados |
| 11 | +- `gitbase-git`: leitura de repositórios Git com `gix` |
| 12 | +- `gitbase-loader`: pipeline de ingestão/indexação |
| 13 | +- `gitbase-uast`: parsing semântico (Go/Rust) via tree-sitter |
| 14 | +- `gitbase-pgwire`: servidor compatível com protocolo PostgreSQL |
| 15 | + |
| 16 | +## Comandos da CLI |
| 17 | + |
| 18 | +Comandos disponíveis em `gitbase-cli`: |
| 19 | + |
| 20 | +- `serve`: sobe servidor pgwire |
| 21 | +- `sync`: sincroniza metadados Git |
| 22 | +- `health`: checa conectividade e migrações |
| 23 | +- `hydrate-blobs`: hidrata conteúdo textual dos blobs |
| 24 | +- `search-index`: monta/atualiza índice de busca textual |
| 25 | +- `uast`: gera cache/projeções de UAST |
| 26 | + |
| 27 | +## Fluxo de dados |
| 28 | + |
| 29 | +```text |
| 30 | +Repositórios Git |
| 31 | + ↓ (gitbase-git) |
| 32 | +Metadados (repos/refs/commits/tree/files) |
| 33 | + ↓ (gitbase-loader + gitbase-db) |
| 34 | +PostgreSQL (schema gitbase) |
| 35 | + ↓ |
| 36 | +Blobs hidratados + índice de busca + UAST |
| 37 | + ↓ |
| 38 | +Consultas SQL / pgwire |
| 39 | +``` |
| 40 | + |
| 41 | +## Detalhes de implementação relevantes |
| 42 | + |
| 43 | +### 1) Descoberta e leitura Git (`gitbase-git`) |
| 44 | + |
| 45 | +- Usa `gix` para abrir repositórios e caminhar histórico |
| 46 | +- Suporta roots com `.git/` e repositórios bare |
| 47 | +- Gera snapshots de commit contendo: |
| 48 | + - metadados do commit |
| 49 | + - entradas de árvore |
| 50 | + - arquivos por commit |
| 51 | +- Classifica blobs binários por NUL byte e validação UTF-8 |
| 52 | + |
| 53 | +### 2) Sincronização (`gitbase-loader::sync_repositories`) |
| 54 | + |
| 55 | +- Faz upsert em: |
| 56 | + - `repositories` |
| 57 | + - `refs` |
| 58 | + - `commits` |
| 59 | + - `commit_parents` |
| 60 | + - `tree_entries` |
| 61 | + - `files` |
| 62 | +- Evita retrabalho para commits já persistidos |
| 63 | + |
| 64 | +### 3) Hidratação de blobs (`hydrate_blobs` / `hydrate_missing_blobs`) |
| 65 | + |
| 66 | +- Busca blobs faltantes no banco |
| 67 | +- Lê blob no Git de origem |
| 68 | +- Regras: |
| 69 | + - blob maior que `max_blob_bytes` → marca sem conteúdo |
| 70 | + - blob binário → marca sem conteúdo |
| 71 | + - blob textual válido → persiste `content` |
| 72 | + |
| 73 | +### 4) Indexação de busca (`index_search`) |
| 74 | + |
| 75 | +- Candidatos vêm de `files` + `blobs` |
| 76 | +- Só indexa conteúdo textual UTF-8 |
| 77 | +- Normaliza NUL (`\0`) para espaço |
| 78 | +- Persiste `tsvector` em `code_index` |
| 79 | + |
| 80 | +### 5) Indexação UAST (`index_uast`) |
| 81 | + |
| 82 | +- Suporta linguagens detectadas por extensão: |
| 83 | + - `.go` |
| 84 | + - `.rs` |
| 85 | +- Armazena documento UAST em JSONB (`uast_cache`) |
| 86 | +- Projeta funções e imports em tabelas específicas |
| 87 | + |
| 88 | +### 6) Consulta via pgwire (`gitbase-pgwire`) |
| 89 | + |
| 90 | +- Server escuta em `bind` (default `0.0.0.0:5433`) |
| 91 | +- Autenticação simples por usuário/senha configuráveis |
| 92 | +- Encaminha queries para PostgreSQL real (`sqlx`) |
| 93 | +- Em consultas `SELECT`, tenta hidratar blobs referenciados por `blob_hash` antes de executar |
| 94 | + |
| 95 | +## Variáveis de ambiente mais usadas |
| 96 | + |
| 97 | +- `DATABASE_URL` |
| 98 | +- `GITBASE_REPO_ROOTS` |
| 99 | +- `GITBASE_DB_MAX_CONNECTIONS` |
| 100 | +- `GITBASE_BLOB_MAX_BYTES` |
| 101 | +- `GITBASE_BLOB_HYDRATE_LIMIT` |
| 102 | +- `GITBASE_SEARCH_LIMIT` |
| 103 | +- `GITBASE_UAST_LIMIT` |
| 104 | +- `GITBASE_BIND_ADDR` |
| 105 | +- `GITBASE_PG_USER` |
| 106 | +- `GITBASE_PG_PASSWORD` |
0 commit comments