Add `RequestTrackedContents` event

finchie
Jan 2, 2026, 4:24 AM
QJ6EZNXEJE4N5NPDFPXNVDUSR5QZSSIMC3FLQ4XFMDOF2J7M62CAC

Dependencies

  • [2] WFWTKCJN Create initial Visual Studio Code extension
  • [3] TWPZLEGD Return correct file contents for quick diff
  • [4] NB2MF3MY Add `OpenWorkspaceFolder` event
  • [5] 2ZAM5V35 Move event handling into modules
  • [6] IDY5SNLO Update source control resource states in event loop
  • [7] D3V6U7N6 Use untyped promises as return value for `FileDecorationProvider`
  • [8] 3RNQI5RX Refactor `provide_file_decoration` to return a `Promise` resolved by `event_loop`
  • [9] M5RW5PN4 Add `OpenTextEditor` event
  • [10] POA32CUW Add `uri` module
  • [11] NEAR63OC Implement base64 URI encoding/decoding for Pijul URIs
  • [12] M2NAH3DC Store modified time of `FileContents` as `jiff::Timestamp`
  • [*] 3YGYMEXV Create `event_loop` module

Change contents

  • replacement in editors/vscode/src/vscode_sys/mod.rs at line 327
    [2.65559][7.619:652]()
    ) -> Option<String>;
    [2.65559]
    [2.65584]
    ) -> bindgen_prelude::Object<'function_context>;
  • replacement in editors/vscode/src/vscode_sys/mod.rs at line 336
    [2.65855][7.653:686]()
    ) -> Option<String>;
    [2.65855]
    [2.65880]
    ) -> bindgen_prelude::Object<'function_context>;
  • replacement in editors/vscode/src/vscode_sys/mod.rs at line 338
    [2.65881][7.687:771]()
    Option<String> = |returned_result: Option<String>| Ok(returned_result);
    [2.65881]
    [2.65957]
    bindgen_prelude::ObjectRef = |returned_result: bindgen_prelude::Object| returned_result.create_ref();
  • edit in editors/vscode/src/lib.rs at line 59
    [8.135][8.135:204]()
    let (deferred_promise, promise_object) = env.create_deferred()?;
  • edit in editors/vscode/src/lib.rs at line 61
    [10.608]
    [8.365]
    let (deferred_promise, promise_object) = env.create_deferred()?;
  • replacement in editors/vscode/src/lib.rs at line 71
    [11.2039][2.112031:112086](),[2.112031][2.112031:112086]()
    fn provide_text_document_content(
    env: &napi::Env,
    [11.2039]
    [11.2040]
    fn provide_text_document_content<'env>(
    env: &'env napi::Env,
  • replacement in editors/vscode/src/lib.rs at line 75
    [2.112168][2.112168:112260]()
    ) -> Result<Option<String>, napi::Error> {
    let program_state = ExtensionState::get()?;
    [2.112168]
    [11.2075]
    ) -> Result<bindgen_prelude::Object<'env>, napi::Error> {
  • edit in editors/vscode/src/lib.rs at line 78
    [11.2202][11.2202:2252]()
    let uri = uri::to_vscode(env, &decoded_uri)?;
  • replacement in editors/vscode/src/lib.rs at line 79
    [2.112379][2.112379:112927](),[2.112927][3.157:242](),[3.242][2.112998:113183](),[2.112998][2.112998:113183]()
    if let Some((workspace_path, workspace)) =
    program_state.repositories.get_open_repository(env, &uri)?
    {
    let absolute_path = Utf8PathBuf::from(uri.get_fs_path()?);
    let relative_path = absolute_path
    .strip_prefix(&workspace_path)
    .map_err(|error| {
    napi::Error::from_reason(format!(
    "Failed to strip prefix {workspace_path} from {absolute_path}: {error}"
    ))
    })?;
    match workspace.repository.get_open_file(relative_path) {
    Some(open_file) => Ok(open_file.tracked_contents().map(str::to_string)),
    None => {
    tracing::error!(
    message = "No tracked file state for {relative_path}",
    ?workspace_path
    );
    [2.112379]
    [2.113183]
    let (deferred_promise, promise_object) = env.create_deferred()?;
    event_loop::send(Event::RequestTrackedContents {
    uri: decoded_uri,
    deferred_promise,
    });
  • replacement in editors/vscode/src/lib.rs at line 85
    [2.113184][2.113184:113246](),[2.113246][2.113246:113321](),[2.113321][2.113321:113345]()
    Ok(None)
    }
    }
    } else {
    tracing::debug!(message = "Ignoring URI", uri = uri.to_string()?);
    Ok(None)
    }
    [2.113184]
    [2.113345]
    Ok(promise_object)
  • edit in editors/vscode/src/lib.rs at line 98
    [2.113765][11.2537:2609]()
    // TODO: only return `Some()` when the uri exists in the repository
  • edit in editors/vscode/src/event_loop/mod.rs at line 130
    [4.2537]
    [8.1314]
    Event::RequestTrackedContents {
    uri,
    deferred_promise,
    } => {
    event::request_tracked_contents::handle(uri, deferred_promise, &extension_state)
    .await
    }
  • file addition: request_tracked_contents.rs (----------)
    [5.332]
    use iri_string::types::{UriAbsoluteStr, UriAbsoluteString};
    use crate::event_loop::ExtensionState;
    pub type DeferredPromise = napi::JsDeferred<
    Option<String>,
    Box<dyn FnOnce(napi::Env) -> Result<Option<String>, napi::Error>>,
    >;
    #[tracing::instrument(skip(deferred_promise, extension_state))]
    pub async fn handle(
    uri: UriAbsoluteString,
    deferred_promise: DeferredPromise,
    extension_state: &ExtensionState,
    ) {
    let tracked_contents = get_tracked_contents(&uri, extension_state);
    tracing::info!(
    message = "Providing tracked contents",
    length = ?tracked_contents.as_ref().map(|contents| contents.len())
    );
    deferred_promise.resolve(Box::new(move |_env| Ok(tracked_contents)));
    }
    #[tracing::instrument(skip(extension_state))]
    fn get_tracked_contents(uri: &UriAbsoluteStr, extension_state: &ExtensionState) -> Option<String> {
    let Some((repository_path, relative_path, repository)) = extension_state.get_repository(uri)
    else {
    tracing::info!(message = "No matching repository for path", ?uri);
    return None;
    };
    let Some(open_file) = repository.repository.get_open_file(relative_path) else {
    tracing::info!(
    message = "No open file found in repository",
    ?repository_path,
    ?relative_path
    );
    return None;
    };
    let Some(tracked_contents) = open_file.tracked_contents() else {
    tracing::info!(
    message = "No tracked contents for file",
    ?repository_path,
    ?relative_path
    );
    return None;
    };
    Some(tracked_contents.to_string())
    }
  • edit in editors/vscode/src/event_loop/event/request_file_decoration.rs at line 24
    [8.2645]
    [8.2645]
    tracing::debug!(message = "Providing file decoration", ?optional_path_state);
  • edit in editors/vscode/src/event_loop/event/request_file_decoration.rs at line 54
    [8.3863]
    [8.3863]
    #[tracing::instrument(skip(extension_state))]
  • edit in editors/vscode/src/event_loop/event/request_file_decoration.rs at line 56
    [8.3960][8.3960:4024]()
    if uri.scheme_str() != "file" {
    return None;
    }
  • replacement in editors/vscode/src/event_loop/event/request_file_decoration.rs at line 58
    [9.3958][8.4114:4189](),[8.4114][8.4114:4189]()
    tracing::info!(message = "No matching repository for path", ?uri);
    [9.3958]
    [8.4189]
    tracing::info!(message = "No matching repository for path");
  • edit in editors/vscode/src/event_loop/event/mod.rs at line 10
    [8.5006]
    [6.5707]
    pub mod request_tracked_contents;
  • edit in editors/vscode/src/event_loop/event/mod.rs at line 32
    [9.6059]
    [8.5061]
    RequestTrackedContents {
    uri: UriAbsoluteString,
    deferred_promise: request_tracked_contents::DeferredPromise,
    },