mirror of
https://github.com/zhaofengli/attic.git
synced 2024-12-14 11:57:30 +00:00
Merge pull request #182 from zhaofengli/push-stdin-fixes
client/push: Misc fixes
This commit is contained in:
commit
1b29816235
2 changed files with 42 additions and 2 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
use std::io::IsTerminal;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
@ -57,6 +58,16 @@ struct PushContext {
|
||||||
|
|
||||||
impl PushContext {
|
impl PushContext {
|
||||||
async fn push_static(self, paths: Vec<PathBuf>) -> Result<()> {
|
async fn push_static(self, paths: Vec<PathBuf>) -> Result<()> {
|
||||||
|
if paths.is_empty() {
|
||||||
|
eprintln!("🤷 Nothing specified.");
|
||||||
|
if !std::io::stdin().is_terminal() {
|
||||||
|
eprintln!(
|
||||||
|
"Hint: Pass --stdin to read the list of store paths from standard input."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
let roots = paths
|
let roots = paths
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|p| self.store.follow_store_path(p))
|
.map(|p| self.store.follow_store_path(p))
|
||||||
|
@ -108,6 +119,10 @@ impl PushContext {
|
||||||
let stdin = BufReader::new(io::stdin());
|
let stdin = BufReader::new(io::stdin());
|
||||||
let mut lines = stdin.lines();
|
let mut lines = stdin.lines();
|
||||||
while let Some(line) = lines.next_line().await? {
|
while let Some(line) = lines.next_line().await? {
|
||||||
|
if line.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let path = self.store.follow_store_path(line)?;
|
let path = self.store.follow_store_path(line)?;
|
||||||
session.queue_many(vec![path])?;
|
session.queue_many(vec![path])?;
|
||||||
}
|
}
|
||||||
|
@ -167,6 +182,12 @@ pub async fn run(opts: Opts) -> Result<()> {
|
||||||
};
|
};
|
||||||
|
|
||||||
if sub.stdin {
|
if sub.stdin {
|
||||||
|
if !sub.paths.is_empty() {
|
||||||
|
return Err(anyhow!(
|
||||||
|
"No paths can be specified on the command line with --stdin"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
push_ctx.push_stdin().await?;
|
push_ctx.push_stdin().await?;
|
||||||
} else {
|
} else {
|
||||||
push_ctx.push_static(sub.paths.clone()).await?;
|
push_ctx.push_static(sub.paths.clone()).await?;
|
||||||
|
|
|
@ -203,12 +203,12 @@ in {
|
||||||
|
|
||||||
with subtest("Check that we can push a path"):
|
with subtest("Check that we can push a path"):
|
||||||
client.succeed("${makeTestDerivation} test.nix")
|
client.succeed("${makeTestDerivation} test.nix")
|
||||||
test_file = client.succeed("nix-build --no-out-link test.nix")
|
test_file = client.succeed("nix-build --no-out-link test.nix").strip()
|
||||||
test_file_hash = test_file.removeprefix("/nix/store/")[:32]
|
test_file_hash = test_file.removeprefix("/nix/store/")[:32]
|
||||||
|
|
||||||
client.succeed(f"attic push test {test_file}")
|
client.succeed(f"attic push test {test_file}")
|
||||||
client.succeed(f"nix-store --delete {test_file}")
|
client.succeed(f"nix-store --delete {test_file}")
|
||||||
client.fail(f"grep hello {test_file}")
|
client.fail(f"ls {test_file}")
|
||||||
|
|
||||||
with subtest("Check that we can pull a path"):
|
with subtest("Check that we can pull a path"):
|
||||||
client.succeed("attic use readonly:test")
|
client.succeed("attic use readonly:test")
|
||||||
|
@ -219,6 +219,25 @@ in {
|
||||||
client.fail(f"attic push readonly:test {test_file}")
|
client.fail(f"attic push readonly:test {test_file}")
|
||||||
client.fail(f"attic push anon:test {test_file} 2>&1")
|
client.fail(f"attic push anon:test {test_file} 2>&1")
|
||||||
|
|
||||||
|
with subtest("Check that we can push a list of paths from stdin"):
|
||||||
|
paths = []
|
||||||
|
for i in range(10):
|
||||||
|
client.succeed(f"${makeTestDerivation} seq{i}.nix")
|
||||||
|
path = client.succeed(f"nix-build --no-out-link seq{i}.nix").strip()
|
||||||
|
client.succeed(f"echo {path} >>paths.txt")
|
||||||
|
paths.append(path)
|
||||||
|
|
||||||
|
client.succeed("attic push test --stdin <paths.txt 2>&1")
|
||||||
|
|
||||||
|
for path in paths:
|
||||||
|
client.succeed(f"nix-store --delete {path}")
|
||||||
|
|
||||||
|
with subtest("Check that we can pull the paths back"):
|
||||||
|
for path in paths:
|
||||||
|
client.fail(f"ls {path}")
|
||||||
|
client.succeed(f"nix-store -r {path}")
|
||||||
|
client.succeed(f"grep hello {path}")
|
||||||
|
|
||||||
with subtest("Check that we can make the cache public"):
|
with subtest("Check that we can make the cache public"):
|
||||||
client.fail("curl -sL --fail-with-body http://server:8080/test/nix-cache-info")
|
client.fail("curl -sL --fail-with-body http://server:8080/test/nix-cache-info")
|
||||||
client.fail(f"curl -sL --fail-with-body http://server:8080/test/{test_file_hash}.narinfo")
|
client.fail(f"curl -sL --fail-with-body http://server:8080/test/{test_file_hash}.narinfo")
|
||||||
|
|
Loading…
Reference in a new issue