Assign repository URI to source control in `OpenWorkspaceFolder` events

finchie
Dec 22, 2025, 7:54 AM
MGJ23FHFUNT4RSJP3AW5ZALGEDTNZPR4PLHLPOCFNEBIX2WHV2JAC

Dependencies

  • [2] WFWTKCJN Create initial Visual Studio Code extension
  • [3] 72K45XKD Refactor inline credit to improve hover messages
  • [4] 3YGYMEXV Create `event_loop` module
  • [5] TDTLSDFG Create macro for defining `ThreadsafeFunction`s
  • [6] NB2MF3MY Add `OpenWorkspaceFolder` event

Change contents

  • replacement in extensions/vscode/src/vscode_sys/threadsafe_function.rs at line 4
    [6.24][6.24:41]()
    "scm": scm {
    [6.24]
    [6.41]
    scm ("scm": napi::bindgen_prelude::Object) {
  • edit in extensions/vscode/src/vscode_sys/threadsafe_function.rs at line 13
    [6.289]
    threadsafe_function! {
    uri ("Uri": napi::bindgen_prelude::Function<napi::Unknown, napi::Unknown>) {
    "file":
    file(
    String
    ) -> crate::vscode_sys::reference::UriRef;
    }
    }
  • replacement in extensions/vscode/src/vscode_sys/macros/threadsafe_function.rs at line 3
    [5.208][5.208:265]()
    $js_namespace_name:literal: $module_name:ident {
    [5.208]
    [5.265]
    $module_name:ident ($js_parent_name:literal: $js_parent_type:ty){
  • replacement in extensions/vscode/src/vscode_sys/macros/threadsafe_function.rs at line 31
    [5.1161][5.1161:1463]()
    pub fn get(env: &napi::Env) -> Result<Prototype, napi::Error> {
    let vscode_object = crate::vscode_sys::VscodeContext::vscode(env)?;
    let namespace: napi::bindgen_prelude::Object = vscode_object.get_named_property($js_namespace_name)?;
    [5.1161]
    [5.1463]
    pub fn get(vscode_object: &napi::bindgen_prelude::Object) -> Result<Prototype, napi::Error> {
    let parent: $js_parent_type = vscode_object.get_named_property($js_parent_name)?;
  • replacement in extensions/vscode/src/vscode_sys/macros/threadsafe_function.rs at line 34
    [5.1464][5.1464:1536]()
    namespace.get_named_property($function_js_name)
    [5.1464]
    [5.1536]
    parent.get_named_property($function_js_name)
  • replacement in extensions/vscode/src/lib.rs at line 393
    [2.118517][6.528:557]()
    event_loop::start(env)?;
    [2.118517]
    [4.114]
    event_loop::start(&vscode_object)?;
  • replacement in extensions/vscode/src/event_loop/threadsafe_function.rs at line 1
    [6.772][6.773:808]()
    use napi::bindgen_prelude::FnArgs;
    [6.772]
    [6.808]
    use napi::bindgen_prelude::{FnArgs, Object};
  • edit in extensions/vscode/src/event_loop/threadsafe_function.rs at line 7
    [6.965]
    [6.965]
    uri_file: vscode_sys::threadsafe_function::uri::file::Prototype,
  • replacement in extensions/vscode/src/event_loop/threadsafe_function.rs at line 11
    [6.995][6.995:1058]()
    pub fn get(env: &napi::Env) -> Result<Self, napi::Error> {
    [6.995]
    [6.1058]
    pub fn get(vscode_object: &Object) -> Result<Self, napi::Error> {
  • replacement in extensions/vscode/src/event_loop/threadsafe_function.rs at line 14
    [6.1111][6.1111:1199]()
    vscode_sys::threadsafe_function::scm::create_source_control::get(env)?,
    [6.1111]
    [6.1199]
    vscode_sys::threadsafe_function::scm::create_source_control::get(vscode_object)?,
    uri_file: vscode_sys::threadsafe_function::uri::file::get(vscode_object)?,
  • replacement in extensions/vscode/src/event_loop/threadsafe_function.rs at line 23
    [6.1314][6.1314:1333]()
    uri: &str,
    [6.1314]
    [6.1333]
    uri: crate::vscode_sys::reference::UriRef,
  • replacement in extensions/vscode/src/event_loop/threadsafe_function.rs at line 25
    [6.1405][6.1405:1461]()
    let arguments = FnArgs::from((id, name, None));
    [6.1405]
    [6.1461]
    let arguments = FnArgs::from((id, name, Some(uri)));
  • edit in extensions/vscode/src/event_loop/threadsafe_function.rs at line 28
    [6.1525]
    [6.1525]
    }
    pub async fn uri_file(
    &self,
    path: String,
    ) -> Result<vscode_sys::reference::UriRef, napi::Error> {
    let arguments = FnArgs::from((path,));
    self.uri_file.call_async(arguments).await
  • edit in extensions/vscode/src/event_loop/mod.rs at line 3
    [4.198]
    [4.198]
    use camino::Utf8PathBuf;
    use iri_string::types::UriAbsoluteStr;
  • replacement in extensions/vscode/src/event_loop/mod.rs at line 38
    [6.1823][6.1823:2001]()
    Event::OpenWorkspaceFolder { uri } => {
    // TODO: handle multiple repositories per workspace
    // TODO: properly handle URIs
    [6.1823]
    [6.2001]
    Event::OpenWorkspaceFolder { uri: raw_uri } => {
    let uri = match UriAbsoluteStr::new(raw_uri) {
    Ok(valid_uri) => valid_uri,
    Err(error) => {
    tracing::error!(message = "Invalid URI", ?raw_uri, ?error);
    continue;
    }
    };
    // TODO: handle different schemes using `vscode.workspace.fs`
    if uri.scheme_str() != "file" {
    tracing::info!(message = "Skipping unhandled URI scheme", ?uri);
    continue;
    }
    let workspace_path = Utf8PathBuf::from(uri.path_str());
    // TODO: multiple repositories per workspace
    let repository_path = workspace_path.clone();
    let repository_uri_ref = match threadsafe_functions
    .uri_file(repository_path.to_string())
    .await
    {
    Ok(repository_uri_ref) => repository_uri_ref,
    Err(error) => {
    tracing::error!(
    message = "Failed to parse URI",
    ?repository_path,
    ?error
    );
    continue;
    }
    };
  • replacement in extensions/vscode/src/event_loop/mod.rs at line 74
    [6.2073][6.2073:2171]()
    .create_source_control(String::from("pijul"), String::from("Pijul"), uri)
    [6.2073]
    [6.2171]
    .create_source_control(
    String::from("pijul"),
    String::from("Pijul"),
    repository_uri_ref,
    )
  • edit in extensions/vscode/src/event_loop/mod.rs at line 87
    [6.2519]
    [6.2519]
    tracing::info!(message = "Opened workspace folder", ?workspace_path);
  • replacement in extensions/vscode/src/event_loop/mod.rs at line 100
    [6.2595][6.2595:2738]()
    pub fn start(env: &napi::Env) -> Result<(), napi::Error> {
    let threadsafe_functions = threadsafe_function::ThreadsafeFunctions::get(env)?;
    [6.2595]
    [6.2738]
    pub fn start(vscode_object: &napi::bindgen_prelude::Object) -> Result<(), napi::Error> {
    let threadsafe_functions = threadsafe_function::ThreadsafeFunctions::get(vscode_object)?;
  • edit in extensions/vscode/Cargo.toml at line 27
    [3.12215]
    [2.175873]
    iri-string.workspace = true
  • edit in Cargo.toml at line 34
    [3.12435]
    [2.176878]
    iri-string = "0.7"
  • edit in Cargo.lock at line 1754
    [2.217324]
    [2.217324]
    name = "iri-string"
    version = "0.7.9"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397"
    dependencies = [
    "memchr",
    "serde",
    ]
    [[package]]
  • edit in Cargo.lock at line 2597
    [3.16635]
    [2.235760]
    "iri-string",