Skip to content

Commit 198ab02

Browse files
committed
wip: add 'directory' to packages
1 parent 94fc6c4 commit 198ab02

File tree

13 files changed

+262
-15
lines changed

13 files changed

+262
-15
lines changed

registry/proto/package.proto

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ message Package {
1313
buffrs.package.Type type = 1;
1414
string name = 2;
1515
string version = 3;
16+
optional string directory = 4;
1617
}
1718

1819
message Compressed {

registry/src/api/grpc.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use crate::{
2626
types::PackageVersion,
2727
};
2828
use async_trait::async_trait;
29+
use buffrs::package::PackageDirectory;
2930
use buffrs::{manifest::PackageManifest, package::PackageName, package::PackageType};
3031
use semver::{Version, VersionReq};
3132
use tonic::{Code, Request, Response, Status};
@@ -69,6 +70,14 @@ impl Registry for Context {
6970
let package_name = PackageName::from_str(metadata.name.as_str()).map_err(|error| {
7071
Status::invalid_argument(format!("Package name isn't correct, {:?}", error))
7172
})?;
73+
let package_directory = metadata
74+
.directory
75+
.as_deref()
76+
.map(PackageDirectory::from_str)
77+
.transpose()
78+
.map_err(|error| {
79+
Status::invalid_argument(format!("Package directory isn't correct, {:?}", error))
80+
})?;
7281

7382
let version = Version::from_str(metadata.version.as_str())
7483
.map_err(|_| Status::invalid_argument("version isn't correct"))?;
@@ -115,7 +124,8 @@ impl Registry for Context {
115124

116125
let package_manifest = PackageManifest {
117126
kind: package_type as PackageType,
118-
name: package_name.clone(),
127+
name: package_name,
128+
directory: package_directory,
119129
version: version.clone(),
120130
description: None,
121131
};

registry/src/metadata/memory.rs

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ impl FetchMatching<InMemoryMetadataStorage> for PackageManifest {
8686
.map(|(_version, manifest)| buffrs::manifest::PackageManifest {
8787
kind: manifest.kind,
8888
name: manifest.name.clone(),
89+
directory: manifest.directory.clone(),
8990
version: manifest.version.clone(),
9091
description: manifest.description.clone(),
9192
})

registry/src/metadata/postgresql.rs

+20-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
use super::*;
1616

17-
use buffrs::package::PackageType;
17+
use buffrs::package::{PackageDirectory, PackageType};
1818
use semver::Version;
1919
use serde::{Deserialize, Serialize};
2020
use sha3::{Digest, Sha3_256};
@@ -108,6 +108,7 @@ impl Publish<PgsqlMetadataStorage> for PackageManifest {
108108
let db_package = sqlx::query_as::<_, PgPackage>(SELECT_OR_INSERT_PACKAGE_QUERY)
109109
.bind(package.name.to_string())
110110
.bind(package_lib)
111+
.bind(package.directory.as_ref().map(|d| d.to_string()))
111112
.fetch_one(&mut *tx)
112113
.await
113114
.map_err(|_| MetadataStorageError::Internal)?;
@@ -190,8 +191,8 @@ struct PgPackage {
190191

191192
const SELECT_OR_INSERT_PACKAGE_QUERY: &str = r#"
192193
WITH ins AS (
193-
INSERT INTO packages (name, type, created_at, updated_at)
194-
SELECT $1, $2, NOW(), NOW()
194+
INSERT INTO packages (name, type, directory, created_at, updated_at)
195+
SELECT $1, $2, $3, NOW(), NOW()
195196
WHERE NOT EXISTS (SELECT 1 FROM packages WHERE name = $1)
196197
RETURNING *
197198
)
@@ -207,18 +208,19 @@ struct PgPackageVersionQuery {
207208
name: String,
208209
#[sqlx(rename = "type")]
209210
kind: PgPackageType,
211+
directory: Option<String>,
210212
version: String,
211213
}
212214

213215
const SELECT_VERSION_QUERY: &str = r#"
214-
SELECT p.id, p.name, p.type, v.version
216+
SELECT p.id, p.name, p.type, p.directory, v.version
215217
FROM versions v
216218
INNER JOIN packages p ON v.package_id = p.id
217219
WHERE p.name = $1 and v.version = $2;
218220
"#;
219221

220222
const SELECT_VERSION_COLLATE: &str = r#"
221-
SELECT p.id, p.name, p.type, v.version
223+
SELECT p.id, p.name, p.type, p.directory, v.version
222224
FROM versions v
223225
INNER JOIN packages p ON v.package_id = p.id
224226
WHERE p.name = $1
@@ -288,6 +290,19 @@ impl TryFrom<PgPackageVersionQuery> for PackageManifest {
288290
);
289291
MetadataStorageError::Internal
290292
})?,
293+
directory: value
294+
.directory
295+
.as_deref()
296+
.map(|dir| {
297+
PackageDirectory::from_str(dir).map_err(|x| {
298+
error!(
299+
"Error: {}, packageDirectory: {} couldn't be mapped to a PackageDirectory",
300+
x, dir
301+
);
302+
MetadataStorageError::Internal
303+
})
304+
})
305+
.transpose()?,
291306
version: Version::from_str(&value.version).map_err(|x| {
292307
error!(
293308
"Error: {}, version {} couldn't be mapped to a semver::Version",

registry/tests/api/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub fn create_publish_request_sample(version: Option<String>) -> PublishRequest
3838
name: "testing".to_string(),
3939
version: version.unwrap_or("1.0.0".to_string()),
4040
r#type: 0,
41+
directory: None,
4142
}),
4243
tgz: vec![0, 0, 0],
4344
}),

src/command.rs

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ pub async fn init(kind: Option<PackageType>, name: Option<PackageName>) -> miett
6060
Ok(PackageManifest {
6161
kind,
6262
name,
63+
directory: None,
6364
version: INITIAL_VERSION,
6465
description: None,
6566
})

src/lock.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use url::Url;
2323

2424
use crate::{
2525
errors::{DeserializationError, FileExistsError, FileNotFound, SerializationError, WriteError},
26-
package::{Package, PackageName},
26+
package::{Package, PackageDirectory, PackageName},
2727
registry::RegistryUri,
2828
ManagedFile,
2929
};
@@ -41,6 +41,8 @@ pub const LOCKFILE: &str = "Proto.lock";
4141
pub struct LockedPackage {
4242
/// The name of the package
4343
pub name: PackageName,
44+
/// Directory where the package's contents are stored
45+
pub directory: Option<PackageDirectory>,
4446
/// The cryptographic digest of the package contents
4547
pub digest: Digest,
4648
/// The URI of the registry that contains the package
@@ -67,6 +69,7 @@ impl LockedPackage {
6769
) -> Self {
6870
Self {
6971
name: package.name().to_owned(),
72+
directory: package.directory().cloned(),
7073
registry,
7174
repository,
7275
digest: DigestAlgorithm::SHA256.digest(&package.tgz),

src/manifest.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use tokio::fs;
2525

2626
use crate::{
2727
errors::{DeserializationError, FileExistsError, SerializationError, WriteError},
28-
package::{PackageName, PackageType},
28+
package::{PackageDirectory, PackageName, PackageType},
2929
registry::RegistryUri,
3030
ManagedFile,
3131
};
@@ -377,12 +377,23 @@ pub struct PackageManifest {
377377
pub kind: PackageType,
378378
/// Name of the package
379379
pub name: PackageName,
380+
/// Directory in which to put the cache. If unset, defaults to the package name
381+
pub directory: Option<PackageDirectory>,
380382
/// Version of the package
381383
pub version: Version,
382384
/// Description of the api package
383385
pub description: Option<String>,
384386
}
385387

388+
impl PackageManifest {
389+
/// Get the directory where the package contents will be stored.
390+
///
391+
/// This fallbacks to `name` if `directory` is unset.
392+
pub fn directory(&self) -> &str {
393+
self.directory.as_deref().unwrap_or(self.name.as_ref())
394+
}
395+
}
396+
386397
/// Represents a single project dependency
387398
#[derive(Clone, Debug, Hash, Serialize, Deserialize, PartialEq, Eq)]
388399
pub struct Dependency {

src/package/compressed.rs

+27
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ use crate::{
3232
ManagedFile,
3333
};
3434

35+
use super::PackageDirectory;
36+
3537
/// An in memory representation of a `buffrs` package
3638
#[derive(Clone, Debug, PartialEq, Eq)]
3739
pub struct Package {
@@ -208,6 +210,31 @@ impl Package {
208210
.name
209211
}
210212

213+
/// The directory of this package
214+
#[inline]
215+
pub fn directory(&self) -> Option<&PackageDirectory> {
216+
assert!(self.manifest.package.is_some());
217+
218+
self.manifest
219+
.package
220+
.as_ref()
221+
.expect("compressed package contains invalid manifest (package section missing)")
222+
.directory
223+
.as_ref()
224+
}
225+
226+
/// Directory for this oackage
227+
#[inline]
228+
pub fn directory_str(&self) -> &str {
229+
assert!(self.manifest.package.is_some());
230+
231+
self.manifest
232+
.package
233+
.as_ref()
234+
.expect("compressed package contains invalid manifest (package section missing)")
235+
.directory()
236+
}
237+
211238
/// The version of this package
212239
#[inline]
213240
pub fn version(&self) -> &Version {

0 commit comments

Comments
 (0)