use crate::api;
use crate::api::client;
use crate::error::OxenError;
use crate::model::RemoteRepository;
use crate::view::{RemoteStagedStatus, RemoteStagedStatusResponse};
use std::path::Path;
pub async fn list(
remote_repo: &RemoteRepository,
workspace_id: impl AsRef<str>,
path: impl AsRef<Path>,
page: usize,
page_size: usize,
) -> Result<RemoteStagedStatus, OxenError> {
let workspace_id = workspace_id.as_ref();
let path = path.as_ref();
let path_str = path.to_str().unwrap();
let uri =
format!("/workspaces/{workspace_id}/changes/{path_str}?page={page}&page_size={page_size}");
let url = api::endpoint::url_from_repo(remote_repo, &uri)?;
log::debug!("status url: {url}");
let client = client::new_for_url(&url)?;
match client.get(&url).send().await {
Ok(res) => {
let body = client::parse_json_body(&url, res).await?;
log::debug!("status got body: {body}");
let response: Result<RemoteStagedStatusResponse, serde_json::Error> =
serde_json::from_str(&body);
match response {
Ok(val) => Ok(val.staged),
Err(err) => Err(OxenError::basic_str(format!(
"api::staging::status error parsing response from {url}\n\nErr {err:?} \n\n{body}"
))),
}
}
Err(err) => {
let err = format!("api::staging::status Request failed: {url}\nErr {err:?}");
Err(OxenError::basic_str(err))
}
}
}
pub async fn rm(
remote_repo: &RemoteRepository,
workspace_id: &str,
path: impl AsRef<Path>,
) -> Result<(), OxenError> {
let file_name = path.as_ref().to_string_lossy();
let uri = format!("/workspaces/{workspace_id}/changes/{file_name}");
let url = api::endpoint::url_from_repo(remote_repo, &uri)?;
log::debug!("rm_file {url}");
let client = client::new_for_url(&url)?;
match client.delete(&url).send().await {
Ok(res) => {
let body = client::parse_json_body(&url, res).await?;
log::debug!("rm_file got body: {body}");
Ok(())
}
Err(err) => {
let err = format!("rm_file Request failed: {url}\n\nErr {err:?}");
Err(OxenError::basic_str(err))
}
}
}
#[cfg(test)]
mod tests {
use crate::config::UserConfig;
use crate::constants::DEFAULT_BRANCH_NAME;
use crate::error::OxenError;
use crate::test;
use crate::{api, command, constants, repositories};
use std::path::Path;
#[tokio::test]
async fn test_list_empty_changes_none_pushed() -> Result<(), OxenError> {
test::run_readme_remote_repo_test(|mut local_repo, remote_repo| async move {
let branch_name = "add-images";
repositories::branches::create_checkout(&local_repo, branch_name)?;
let remote = test::repo_remote_url_from(&local_repo.dirname());
command::config::set_remote(&mut local_repo, constants::DEFAULT_REMOTE_NAME, &remote)?;
repositories::push(&local_repo).await?;
let workspace_id = UserConfig::identifier()?;
let branch = api::client::branches::create_from_branch(
&remote_repo,
branch_name,
DEFAULT_BRANCH_NAME,
)
.await?;
assert_eq!(branch.name, branch_name);
let workspace =
api::client::workspaces::create(&remote_repo, &branch_name, &workspace_id).await;
assert!(workspace.is_ok());
let page_num = constants::DEFAULT_PAGE_NUM;
let page_size = constants::DEFAULT_PAGE_SIZE;
let path = Path::new("images");
let entries = api::client::workspaces::changes::list(
&remote_repo,
&workspace_id,
path,
page_num,
page_size,
)
.await?;
assert_eq!(entries.added_files.entries.len(), 0);
assert_eq!(entries.added_files.total_entries, 0);
Ok(remote_repo)
})
.await
}
#[tokio::test]
async fn test_list_empty_changes_all_data_pushed() -> Result<(), OxenError> {
test::run_remote_repo_test_bounding_box_csv_pushed(|_local_repo, remote_repo| async move {
let branch_name = "add-images";
let branch = api::client::branches::create_from_branch(
&remote_repo,
branch_name,
DEFAULT_BRANCH_NAME,
)
.await?;
assert_eq!(branch.name, branch_name);
let workspace_id = UserConfig::identifier()?;
let workspace =
api::client::workspaces::create(&remote_repo, &branch_name, &workspace_id).await?;
assert_eq!(workspace.id, workspace_id);
let page_num = constants::DEFAULT_PAGE_NUM;
let page_size = constants::DEFAULT_PAGE_SIZE;
let path = Path::new("images");
let entries = api::client::workspaces::changes::list(
&remote_repo,
&workspace_id,
path,
page_num,
page_size,
)
.await?;
assert_eq!(entries.added_files.entries.len(), 0);
assert_eq!(entries.added_files.total_entries, 0);
Ok(remote_repo)
})
.await
}
}