fixed bug on absolute vs relative path

KCaverly created

Change summary

crates/vector_store/src/vector_store.rs | 39 ++++++++++++++++++---------
1 file changed, 26 insertions(+), 13 deletions(-)

Detailed changes

crates/vector_store/src/vector_store.rs 🔗

@@ -144,12 +144,19 @@ impl ProjectState {
     fn update_pending_files(&mut self, pending_file: PendingFile, indexing_time: SystemTime) {
         // If Pending File Already Exists, Replace it with the new one
         // but keep the old indexing time
-        if let Some(old_file) = self.pending_files.remove(&pending_file.path.clone()) {
-            self.pending_files
-                .insert(pending_file.path.clone(), (pending_file, old_file.1));
+        if let Some(old_file) = self
+            .pending_files
+            .remove(&pending_file.relative_path.clone())
+        {
+            self.pending_files.insert(
+                pending_file.relative_path.clone(),
+                (pending_file, old_file.1),
+            );
         } else {
-            self.pending_files
-                .insert(pending_file.path.clone(), (pending_file, indexing_time));
+            self.pending_files.insert(
+                pending_file.relative_path.clone(),
+                (pending_file, indexing_time),
+            );
         };
     }
 
@@ -177,7 +184,8 @@ impl ProjectState {
 #[derive(Clone, Debug)]
 struct PendingFile {
     worktree_db_id: i64,
-    path: PathBuf,
+    relative_path: PathBuf,
+    absolute_path: PathBuf,
     language: Arc<Language>,
     modified_time: SystemTime,
 }
@@ -348,13 +356,14 @@ impl VectorStore {
                     let mut parser = Parser::new();
                     let mut cursor = QueryCursor::new();
                     while let Ok(pending_file) = parsing_files_rx.recv().await {
-                        log::info!("Parsing File: {:?}", &pending_file.path);
+                        log::info!("Parsing File: {:?}", &pending_file.relative_path);
                         if let Some((indexed_file, document_spans)) = Self::index_file(
                             &mut cursor,
                             &mut parser,
                             &fs,
                             pending_file.language,
-                            pending_file.path.clone(),
+                            pending_file.relative_path.clone(),
+                            pending_file.absolute_path.clone(),
                             pending_file.modified_time,
                         )
                         .await
@@ -393,7 +402,8 @@ impl VectorStore {
         parser: &mut Parser,
         fs: &Arc<dyn Fs>,
         language: Arc<Language>,
-        file_path: PathBuf,
+        relative_file_path: PathBuf,
+        absolute_file_path: PathBuf,
         mtime: SystemTime,
     ) -> Result<(IndexedFile, Vec<String>)> {
         let grammar = language.grammar().ok_or_else(|| anyhow!("no grammar"))?;
@@ -402,7 +412,7 @@ impl VectorStore {
             .as_ref()
             .ok_or_else(|| anyhow!("no outline query"))?;
 
-        let content = fs.load(&file_path).await?;
+        let content = fs.load(&absolute_file_path).await?;
 
         parser.set_language(grammar.ts_language).unwrap();
         let tree = parser
@@ -455,7 +465,7 @@ impl VectorStore {
 
         return Ok((
             IndexedFile {
-                path: file_path,
+                path: relative_file_path,
                 mtime,
                 documents,
             },
@@ -577,7 +587,8 @@ impl VectorStore {
                                             .try_send(PendingFile {
                                                 worktree_db_id: db_ids_by_worktree_id
                                                     [&worktree.id()],
-                                                path: path_buf,
+                                                relative_path: path_buf,
+                                                absolute_path,
                                                 language,
                                                 modified_time: file.mtime,
                                             })
@@ -666,6 +677,7 @@ impl VectorStore {
                             smol::block_on(async move {
                                 for change in changes.into_iter() {
                                     let change_path = change.0.clone();
+                                    let absolute_path = worktree.read(cx).absolutize(&change_path);
                                     // Skip if git ignored or symlink
                                     if let Some(entry) = worktree.read(cx).entry_for_id(change.1) {
                                         if entry.is_ignored || entry.is_symlink {
@@ -716,7 +728,8 @@ impl VectorStore {
                                             if !already_stored {
                                                 project_state.update_pending_files(
                                                     PendingFile {
-                                                        path: change_path.to_path_buf(),
+                                                        relative_path: change_path.to_path_buf(),
+                                                        absolute_path,
                                                         modified_time,
                                                         worktree_db_id,
                                                         language: language.clone(),