Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/api_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,10 @@ nest! {
struct GetRepositoryData {
repository_overview: Option<pub struct GetRepositoryPayload {
pub id: String,
}>
}>,
user: Option<pub struct GetRepositoryUser {
pub id: String,
}>,
}
}

Expand Down Expand Up @@ -327,7 +330,14 @@ impl CodSpeedAPIClient {
)
.await;
match response {
Ok(response) => Ok(response.repository_overview),
Ok(response) => {
if response.user.is_none() {
bail!(
"Your session has expired, please login again using `codspeed auth login`"
);
}
Ok(response.repository_overview)
}
Err(err) if err.contains_error_code("REPOSITORY_NOT_FOUND") => Ok(None),
Err(err) if err.contains_error_code("UNAUTHENTICATED") => {
bail!("Your session has expired, please login again using `codspeed auth login`")
Expand Down
3 changes: 3 additions & 0 deletions src/queries/GetRepository.gql
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ query Repository(
$name: String!
$provider: RepositoryProvider
) {
user {
id
}
repositoryOverview(owner: $owner, name: $name, provider: $provider) {
... on Repository {
id
Expand Down
30 changes: 29 additions & 1 deletion src/run_environment/local/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,11 @@ impl LocalProvider {
.map(|ctx| ctx.root_path.clone())
.unwrap_or_else(|| current_dir.to_string_lossy().to_string());

let resolved = Self::resolve_repository(config, api_client, git_context.as_ref()).await?;
let resolved = if !config.skip_upload {
Self::resolve_repository(config, api_client, git_context.as_ref()).await?
} else {
Self::dummy_resolved_repository(git_context.as_ref())
};

let expected_run_parts_count = config.expected_run_parts_count();

Expand All @@ -84,7 +88,31 @@ impl LocalProvider {
})
}

/// Create a dummy resolved repository, resolved offline when --skip-upload is used and we don't need to resolve the actual repository information from the API
fn dummy_resolved_repository(git_context: Option<&GitContext>) -> ResolvedRepository {
let (ref_, head_ref) = git_context
.and_then(|ctx| Self::get_git_ref_info(&ctx.root_path).ok())
.unwrap_or_else(|| (FAKE_COMMIT_REF.to_string(), None));

ResolvedRepository {
provider: RepositoryProvider::GitHub,
owner: "local".to_string(),
name: "local".to_string(),
ref_,
head_ref,
}
}

/// Resolve repository information from override, git remote, or API fallback
///
/// When there is no explicit repository override, this flow also makes sure the user is logged in with a valid token
/// 1. Repo found
/// a. Logged in: user is set, repositoryOverview is set — repo found
/// b. NOT logged in: user is null, repositoryOverview is set => bails with "session expired"
///
/// 2. REPOSITORY_NOT_FOUND => falls through to `get_or_create_project_repository`
/// a. Logged in: `get_or_create_project_repository` succeeds
/// b. NOT logged in: `get_or_create_project_repository` fails, bail with "session expired"
async fn resolve_repository(
config: &OrchestratorConfig,
api_client: &CodSpeedAPIClient,
Expand Down
Loading