Skip to main content

relay_knowledge/application/code_repository/indexing/
preview.rs

1//! Read-only effective repository indexing-scope preview.
2
3use crate::{
4    api::{
5        ApiError, ApiMetadata, CodeRepositoryScopeMetadata, CodeRepositoryScopePreviewResponse,
6        RequestContext,
7    },
8    application::service::RelayKnowledgeService,
9    code::preview_repository_scope,
10    domain::CodeIndexRequest,
11};
12
13use super::super::{
14    blocking::run_blocking_code,
15    errors::storage_api_error,
16    repository::{registration_from_status, required_code_repository},
17    scope::merged_filters,
18};
19
20impl RelayKnowledgeService {
21    /// Previews the effective code repository indexing scope without writing rows.
22    pub async fn preview_code_repository_scope(
23        &self,
24        request: CodeIndexRequest,
25        context: RequestContext,
26    ) -> Result<CodeRepositoryScopePreviewResponse, ApiError> {
27        let store = self.store().await.map_err(storage_api_error)?;
28        let status =
29            required_code_repository(store.as_ref(), &request.repository.repository).await?;
30        let registration = registration_from_status(&status);
31        let selector = request.repository.clone();
32        let preview =
33            run_blocking_code(move || preview_repository_scope(&registration, &selector)).await?;
34        let path_filters = merged_filters(&status.path_filters, &request.repository.path_filters);
35        let language_filters = merged_filters(
36            &status.language_filters,
37            &request.repository.language_filters,
38        );
39        let scope_id = crate::domain::code_snapshot_scope_id_with_workspace_detection(
40            &preview.repository_id,
41            &preview.tree_hash,
42            &path_filters,
43            &language_filters,
44            &request.workspace_detection,
45        );
46        let graph_version = store
47            .current_graph_version()
48            .await
49            .map_err(storage_api_error)?;
50        Ok(CodeRepositoryScopePreviewResponse {
51            metadata: ApiMetadata::graph_only(&context, graph_version),
52            scope: CodeRepositoryScopeMetadata {
53                scope_id: scope_id.clone(),
54                repository_id: preview.repository_id.clone(),
55                alias: preview.alias.clone(),
56                requested_ref: request.repository.ref_selector,
57                resolved_commit_sha: preview.resolved_commit_sha.clone(),
58                tree_hash: preview.tree_hash.clone(),
59                path_filters,
60                language_filters,
61                indexed_file_count: preview.selected_file_count,
62                index_versions: vec![format!("code:{scope_id}:{}", preview.tree_hash)],
63                stale: true,
64            },
65            preview,
66        })
67    }
68}