mirror of
https://github.com/astral-sh/uv.git
synced 2025-08-04 19:08:04 +00:00
Move reference check into uv-git
(#3961)
This commit is contained in:
parent
c04a95e037
commit
a70e33d947
2 changed files with 41 additions and 43 deletions
|
@ -2,12 +2,12 @@ use std::path::PathBuf;
|
|||
use std::sync::Arc;
|
||||
|
||||
use anyhow::Result;
|
||||
use dashmap::mapref::one::Ref;
|
||||
use dashmap::DashMap;
|
||||
use fs_err::tokio as fs;
|
||||
use tracing::debug;
|
||||
|
||||
use cache_key::RepositoryUrl;
|
||||
use dashmap::mapref::one::Ref;
|
||||
use dashmap::DashMap;
|
||||
use fs_err::tokio as fs;
|
||||
use uv_fs::LockedFile;
|
||||
|
||||
use crate::{Fetch, GitReference, GitSha, GitSource, GitUrl, Reporter};
|
||||
|
@ -36,16 +36,16 @@ impl GitResolver {
|
|||
))
|
||||
}
|
||||
|
||||
/// Returns the [`GitSha`] for the given [`RepositoryReference`], if it exists.
|
||||
pub fn get(&self, reference: &RepositoryReference) -> Option<Ref<RepositoryReference, GitSha>> {
|
||||
self.0.get(reference)
|
||||
}
|
||||
|
||||
/// Inserts a new [`GitSha`] for the given [`RepositoryReference`].
|
||||
pub fn insert(&self, reference: RepositoryReference, sha: GitSha) {
|
||||
self.0.insert(reference, sha);
|
||||
}
|
||||
|
||||
/// Returns the [`GitSha`] for the given [`RepositoryReference`], if it exists.
|
||||
fn get(&self, reference: &RepositoryReference) -> Option<Ref<RepositoryReference, GitSha>> {
|
||||
self.0.get(reference)
|
||||
}
|
||||
|
||||
/// Download a source distribution from a Git repository.
|
||||
///
|
||||
/// Assumes that the URL is a precise Git URL, with a full commit hash.
|
||||
|
@ -143,6 +143,36 @@ impl GitResolver {
|
|||
let precise = self.get(&reference)?;
|
||||
Some(url.with_precise(*precise))
|
||||
}
|
||||
|
||||
/// Returns `true` if the two Git URLs refer to the same precise commit.
|
||||
pub fn same_ref(&self, a: &GitUrl, b: &GitUrl) -> bool {
|
||||
// Convert `a` to a repository URL.
|
||||
let a_ref = RepositoryReference::from(a);
|
||||
|
||||
// Convert `b` to a repository URL.
|
||||
let b_ref = RepositoryReference::from(b);
|
||||
|
||||
// The URLs must refer to the same repository.
|
||||
if a_ref.url != b_ref.url {
|
||||
return false;
|
||||
}
|
||||
|
||||
// If the URLs have the same tag, they refer to the same commit.
|
||||
if a_ref.reference == b_ref.reference {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Otherwise, the URLs must resolve to the same precise commit.
|
||||
let Some(a_precise) = a.precise().or_else(|| self.get(&a_ref).map(|sha| *sha)) else {
|
||||
return false;
|
||||
};
|
||||
|
||||
let Some(b_precise) = b.precise().or_else(|| self.get(&b_ref).map(|sha| *sha)) else {
|
||||
return false;
|
||||
};
|
||||
|
||||
a_precise == b_precise
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue