Use a trie to keep track of path states

finchie
Dec 15, 2025, 2:26 PM
TRJASCAZILSAO7KSMCOYZEQPPPPG4YHLMVMFN4AYLY7W7ULHGYOAC

Dependencies

  • [2] WFWTKCJN Create initial Visual Studio Code extension
  • [3] LQJG2LGQ Refactor `PathState` handling to be updated incrementally

Change contents

  • edit in pijul-extension/src/path_state.rs at line 12
    [3.269]
    [2.7154]
    use patricia_tree::GenericPatriciaMap;
  • replacement in pijul-extension/src/path_state.rs at line 83
    [3.2418][3.2418:2491]()
    // TODO: use a trie
    pub states: HashMap<Utf8PathBuf, PathState>,
    [3.2418]
    [3.2491]
    states: GenericPatriciaMap<String, PathState>,
  • replacement in pijul-extension/src/path_state.rs at line 128
    [3.3962][3.3962:4013]()
    let mut untracked_states = HashMap::new();
    [3.3962]
    [3.4013]
    let mut untracked_states = GenericPatriciaMap::new();
  • replacement in pijul-extension/src/path_state.rs at line 152
    [3.4873][3.4873:4947]()
    untracked_states.insert(utf8_path, PathState::Untracked);
    [3.4873]
    [2.8929]
    untracked_states.insert(utf8_path.into_string(), PathState::Untracked);
  • edit in pijul-extension/src/path_state.rs at line 186
    [3.5910]
    [3.5910]
    let mut updated_states = HashMap::new();
  • replacement in pijul-extension/src/path_state.rs at line 192
    [3.6032][3.6032:6118]()
    let entry = self.states.entry(Utf8PathBuf::from(globalized_hunk.path()));
    [3.6032]
    [3.6118]
    let entry = updated_states.entry(globalized_hunk.path().to_string());
  • edit in pijul-extension/src/path_state.rs at line 210
    [3.6791]
    [3.6791]
    // Overwrite the previous path states that were affected, and clear any previous paths
    // that no longer have an active state
    let mut paths_to_remove = Vec::new();
    for (path, existing_state) in self.states.iter_prefix_mut(prefix) {
    match updated_states.remove(&path) {
    Some(updated_state) => {
    // Update an existing state
    *existing_state = updated_state;
    }
    None => {
    // There is currently no state attached to this path, so remove it
    paths_to_remove.push(path);
    }
    }
    }
    // Actually clear the paths that no longer have an active state (and aren't untracked)
    let read_transaction = transaction.read();
    for outdated_path in paths_to_remove {
    if read_transaction.is_tracked(&outdated_path)? {
    self.states.remove(outdated_path);
    } else {
    self.states.insert(outdated_path, PathState::Untracked);
    }
    }
    // Insert any new paths that remain
    for (path, updated_state) in updated_states {
    self.states.insert(path, updated_state);
    }
  • replacement in pijul-extension/src/path_state.rs at line 245
    [3.6880][3.6880:6919]()
    self.states.get(path).copied()
    [3.6880]
    [3.6919]
    self.states.get(path.as_str()).copied()
    }
    pub fn iter_path_states(&self) -> impl Iterator<Item = (Utf8PathBuf, PathState)> {
    self.states
    .iter()
    .map(|(path, state)| (Utf8PathBuf::from(path), *state))
  • replacement in pijul-extension/src/path_state.rs at line 278
    [3.7693][3.7693:7753]()
    self.states.insert(path, PathState::Untracked);
    [3.7693]
    [3.7753]
    self.states.insert(path.into_string(), PathState::Untracked);
  • replacement in pijul-extension/src/lib.rs at line 376
    [2.16224][3.8641:8850]()
    pub fn iter_path_states(&self) -> impl Iterator<Item = (&Utf8Path, PathState)> {
    self.path_states
    .states
    .iter()
    .map(|(path, state)| (path.as_path(), *state))
    [2.16224]
    [2.16320]
    pub fn iter_path_states(&self) -> impl Iterator<Item = (Utf8PathBuf, PathState)> {
    self.path_states.iter_path_states()
  • edit in pijul-extension/Cargo.toml at line 12
    [2.53590]
    [2.53590]
    patricia_tree.workspace = true
  • edit in Cargo.toml at line 44
    [2.177125]
    [2.177125]
    patricia_tree = "0.10"
  • edit in Cargo.lock at line 2442
    [2.233718]
    [2.233718]
    name = "patricia_tree"
    version = "0.10.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "4df0e43512f12f23a6b08c7b893192b7d6ec937b95ee03af040847907fe5cef7"
    [[package]]
  • edit in Cargo.lock at line 2511
    [2.234996]
    [2.234996]
    "patricia_tree",