diff --git a/Cargo.lock b/Cargo.lock index 60dc51e..d725164 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -301,7 +301,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "gcsf" -version = "0.1.15" +version = "0.1.17" dependencies = [ "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 214b46e..ea2f4f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gcsf" description = "Filesystem based on Google Drive" -version = "0.1.16" +version = "0.1.17" repository = "https://github.com/harababurel/gcsf" authors = ["Sergiu Puscas "] license = "MIT" diff --git a/src/cli.yml b/src/cli.yml index e4924dd..84d462a 100644 --- a/src/cli.yml +++ b/src/cli.yml @@ -1,5 +1,5 @@ name: GCSF -version: "0.1.16" +version: "0.1.17" author: Sergiu Puscas about: File system based on Google Drive subcommands: diff --git a/src/gcsf/drive_facade.rs b/src/gcsf/drive_facade.rs index fbed5ce..516e176 100644 --- a/src/gcsf/drive_facade.rs +++ b/src/gcsf/drive_facade.rs @@ -320,6 +320,7 @@ impl DriveFacade { ) -> Result, Error> { let mut all_files = Vec::new(); let mut page_token: Option = None; + let mut current_page = 1; loop { let mut request = self.hub.files() .list() @@ -353,10 +354,18 @@ impl DriveFacade { .map_err(|e| err_msg(format!("{:#?}", e)))?; match filelist.files { - Some(files) => all_files.extend(files), + Some(files) => { + info!( + "Received page {} containing {} files", + current_page, + files.len() + ); + all_files.extend(files); + } _ => warn!("Filelist does not contain any files!"), }; + current_page += 1; page_token = filelist.next_page_token; if page_token.is_none() { break; diff --git a/src/gcsf/file_manager.rs b/src/gcsf/file_manager.rs index 2e5f962..8a4cab1 100644 --- a/src/gcsf/file_manager.rs +++ b/src/gcsf/file_manager.rs @@ -18,6 +18,7 @@ pub type DriveId = String; const ROOT_INODE: Inode = 1; const TRASH_INODE: Inode = 2; +const SHARED_INODE: Inode = 3; macro_rules! unwrap_or_continue { ($res:expr) => { @@ -152,40 +153,31 @@ impl FileManager { Ok(()) } - /// Retrieves all files and directories shown in "My Drive" and adds them locally. + /// Retrieves all files and directories shown in "My Drive" and "Shared with me" and adds them locally. fn populate(&mut self) -> Result<(), Error> { let root = self.new_root_file()?; self.add_file_locally(root, None)?; - let mut queue: LinkedList = LinkedList::new(); - queue.push_back(self.df.root_id().unwrap_or(&"root".to_string()).to_string()); + let shared = self.new_special_dir("Shared with me", Some(SHARED_INODE)); + self.add_file_locally(shared, Some(FileId::Inode(ROOT_INODE)))?; - while !queue.is_empty() { - let mut parents = Vec::new(); - while !queue.is_empty() { - parents.push(queue.pop_front().unwrap()); - } - - for drive_file in self.df.get_all_files(Some(parents), Some(false))? { - let mut file = File::from_drive_file(self.next_available_inode(), drive_file); + for drive_file in self.df.get_all_files(None, Some(false))? { + let mut file = File::from_drive_file(self.next_available_inode(), drive_file); + self.add_file_locally(file, Some(FileId::Inode(3)))?; + } - if file.kind() == FileType::Directory { - queue.push_back(file.drive_id().unwrap()); + let mut moves: LinkedList<(FileId, FileId)> = LinkedList::new(); + for (inode, file) in &self.files { + if let Some(parent) = file.drive_parent() { + if self.contains(&FileId::DriveId(parent.clone())) { + moves.push_back((FileId::Inode(*inode), FileId::DriveId(parent))); } + } + } - // TODO: this makes everything slow; find a better solution - // if file.is_drive_document() { - // let size = drive_facade - // .get_file_size(file.drive_id().as_ref().unwrap(), file.mime_type()); - // file.attr.size = size; - // } - - let file_parent = file.drive_parent().unwrap(); - if self.contains(&FileId::DriveId(file_parent.clone())) { - self.add_file_locally(file, Some(FileId::DriveId(file_parent.clone())))?; - } else { - self.add_file_locally(file, None)?; - } + for (inode, parent) in &moves { + if let Err(e) = self.move_locally(inode, parent) { + error!("{}", e); } }