pijul: Start of push/pull work This change includes one API endpoint, .pijul. It allows for getting a channels remote ID. A lot of plumbing around repositories is added too, from init to opening pristine and actions like it.

zj
Sep 13, 2021, 1:58 PM
FS2NWBVN2SZB2FFPB3JSYT5URTVZEAZWMQ7QW4JUYPNJVDVAJTTQC

Dependencies

  • [2] BAWJ3BJ5 nix: Do not start PG if running In a nix hook the PG server is started when `nix-shell` is invoked. This created extra output when nix-shell was invoked on an extra shell as it tried to start a new PG server again while it was already running. This change updates the behaviour to not do this, and verify with pg_ctl if PG is already running.
  • [3] ESKQM7MA nix: Darwin SDK packages added While some Darwin packages were already added through SystemConfiguration, the CoreServices and SystemConfiguration were both missing. This change adds these to ensure compilation on Darwin systems.
  • [4] TWIZ7QV4 db: Add interface to add a project Right now a project has a name, and an owner which is hardcoded to 1. This is because basically I'm speedrunning to implement push/pull of Pijul and then revisit to add depth to features and tests. Model code is now split into files properly too.
  • [5] 5UNA2DEA routes: Register and authenticate users Allow users to sign up, and sign in/sign out. The routes are added, though the design of the pages is very bare bones still, it's hard to go through the full flow to demo. On the server side: Passwords are stored encrypted in the database with salts. This uses the PG encrypt tooling to prevent against bugs and maintainance costs on this project. When a user is signed in, the user ID is set in a private cookie. Rocket has Guards for routes, which has not been implemented yet for this project.
  • [6] W3M3C7CC Initial commit This change includes a very small hello world application server written in Rust using Rocket.rs. Managing dependencies is done with Nix as that works well between Linux and Mac for me.
  • [7] K4JNAJOF database: Connect to postgres on Rocket boot As database I've chosen PostgreSQL, as my personal experience has been good with it. This change allows Rocket to connect to the database on booting the server. It depends on the DATABASE_URL being set, and for now circumvents the Rocket config helpers as it seemed faster to be up and running this way.
  • [8] KFVJ3KMW frontend: Introduce navigation bar Minor changes to the front-end mostly, to allow users to register, sign in, and sign out. The sign out route is changed to a GET endpoint, as links in HTML cannot DELETE.
  • [9] IWM4EE63 database: Add migration support Fairly minor change codewise; add support for creating migrations and run them at the start of the runtime. In this case not a lot of changes happen, only the migrations tracking table is added. The sqlx command line tool is used to manage migrations; invoke `cargo sqlx --help` for more info.
  • [*] T7TT5B4G models: Put User model in their own file Before adding a next model, let's start organizing the code a little, to make extending easier.
  • [*] EIIUUAKG nix: Install and initialize a Postgres DB For a persistance layer, this change introduces postgresql as dependency. The daemon is started when `nix-shell` is invoked. `pg_ctl stop` is not invoked, and this has to be done by a developer. Data is persisted in a tmp directory, which is added to the ignore file.

Change contents

  • file addition: repoman (d--r------)
    [5.179]
  • file addition: mod.rs (----------)
    [0.19]
    use std::path::PathBuf;
    pub struct RepoMan {
    pub storage_root: PathBuf,
    }
    pub fn new(root: String) -> RepoMan {
    RepoMan {
    storage_root: PathBuf::from(root),
    }
    }
  • edit in src/projects.rs at line 2
    [4.629][4.629:667]()
    use crate::models::projects::Project;
  • edit in src/projects.rs at line 35
    [4.1409]
    [4.1409]
    use crate::models::projects;
  • replacement in src/projects.rs at line 43
    [4.1565][4.1565:1736]()
    let proj = Project {
    id: -1,
    owner_id: 1, // TODO replace this with user
    name: project.name.clone(),
    };
    match proj.create(db).await {
    [4.1565]
    [4.1736]
    // TODO replace this with user
    match projects::create(db, 1, project.name.clone()).await {
  • file addition: pijul.rs (----------)
    [5.179]
    use crate::database::Database;
    use crate::models::projects;
    use crate::repoman::RepoMan;
    use rocket::{Route, State};
    #[derive(FromForm)]
    struct ChangelistReq {
    channel: String, // TODO check if this breaks non-UTF-8 channels
    id: Option<String>,
    }
    // TODO is this for push and/or pull???
    #[get("/<org_path>/<proj_path>/.pijul?<cl_req..>")]
    async fn changelist(
    db: &State<Database>,
    repoman: &State<RepoMan>,
    org_path: String,
    proj_path: String,
    cl_req: ChangelistReq,
    ) -> Option<String> {
    let p = match projects::find(db, org_path, proj_path).await {
    Some(p) => p,
    None => return None,
    };
    match p.repository(&repoman.storage_root) {
    Ok(r) => r.channel_remote_id(cl_req.channel),
    Err(e) => {
    println!("{}", e);
    None
    }
    }
    // - Reverse engineer the rest of Push
    }
    pub fn routes() -> Vec<Route> {
    routes![changelist]
    }
  • replacement in src/models/projects.rs at line 4
    [4.3512][4.3512:3529]()
    use sqlx::query;
    [4.3512]
    [4.3529]
    use sqlx::query_as;
  • edit in src/models/projects.rs at line 12
    [4.3710]
    [4.3710]
    repository_uuid: uuid::Uuid, // Used for the repository path
  • edit in src/models/projects.rs at line 14
    [4.3712]
    [4.3712]
    pub async fn find(db: &State<Database>, org_path: String, proj_path: String) -> Option<Project> {
    let result = sqlx::query_as!(Project,
    "SELECT * FROM projects WHERE name = $1 AND owner_id = (SELECT id FROM users WHERE name = $2)",
    proj_path, org_path).fetch_optional(&**db)
    .await.ok()?;
    result
    }
    pub async fn create(
    db: &State<Database>,
    owner_id: i32,
    name: String,
    ) -> Result<Project, sqlx::Error> {
    let result = query_as!(
    Project,
    "INSERT INTO projects (owner_id, name) VALUES ($1, $2) RETURNING *",
    owner_id,
    name.to_lowercase(),
    )
    .fetch_one(&**db)
    .await?;
  • edit in src/models/projects.rs at line 38
    [4.3713]
    [4.3713]
    Ok(result)
    }
    use crate::models::pijul::repositories::Repository;
    use anyhow::Result;
    use std::path::PathBuf;
  • replacement in src/models/projects.rs at line 46
    [4.3728][4.3728:4042]()
    pub async fn create(&self, db: &State<Database>) -> Result<i32, sqlx::Error> {
    let result = query!(
    "INSERT INTO projects (owner_id, name) VALUES ($1, $2) RETURNING id",
    &self.owner_id,
    &self.name.to_lowercase(),
    )
    .fetch_one(&**db)
    .await?;
    [4.3728]
    [4.4042]
    pub fn repository(&self, root: &PathBuf) -> Result<Repository> {
    Ok(Repository::init_or_open(root, self.repo_path())?)
    }
  • replacement in src/models/projects.rs at line 50
    [4.4043][4.4043:4065]()
    Ok(result.id)
    [4.4043]
    [4.4065]
    fn repo_path(&self) -> std::path::PathBuf {
    self.repository_uuid
    .to_hyphenated()
    .to_string()
    .split("-")
    .collect()
  • file addition: pijul (d--r------)
    [5.6633]
  • file addition: repositories.rs (----------)
    [0.2530]
    use std::path::PathBuf;
    use libpijul::pristine::sanakirja::Pristine;
    use libpijul::MutTxnT;
    use libpijul::TxnT;
    use anyhow::bail;
    pub struct Repository {
    /// full_path is the fully qualified path on disk
    full_path: PathBuf,
    }
    const DEFAULT_CHANNEL: &str = "main";
    const PRISTINE_DIR: &str = "pristine";
    impl Repository {
    fn pristine_dir(&self) -> PathBuf {
    self.full_path.join(PRISTINE_DIR)
    }
    fn pristine(&self) -> Result<Pristine, anyhow::Error> {
    // TODO error should be logged, or handled somehow, not like this
    match Pristine::new(self.pristine_dir().join("db")) {
    Ok(p) => Ok(p),
    Err(e) => bail!("Failed to open pristine: {}", e),
    }
    }
    fn new(full_path: PathBuf) -> Repository {
    Repository {
    full_path: full_path,
    }
    }
    // init returns an error if there's already something on disk
    fn init(&self) -> Result<(), anyhow::Error> {
    if std::fs::metadata(self.pristine_dir()).is_err() {
    std::fs::create_dir_all(self.pristine_dir())?;
    } else {
    bail!("Already a repository on disk")
    }
    // TODO why the f does libpijul do this? It's properly weird even small
    // actions can just create their own txn
    let mut txn = self.pristine()?.mut_txn_begin()?;
    txn.open_or_create_channel(DEFAULT_CHANNEL)?;
    txn.set_current_channel(DEFAULT_CHANNEL)?;
    txn.commit()?;
    Ok(())
    }
    pub fn init_or_open(root: &PathBuf, repo_path: PathBuf) -> Result<Self, anyhow::Error> {
    let repo = Self::new(root.join(repo_path));
    // If the pristine can't be construsted, assume nothing is on disk
    // TODO make a proper is_valid();
    match repo.pristine() {
    Ok(_) => Ok(repo),
    Err(e) => {
    println!("{}", e);
    repo.init()?;
    Ok(repo)
    }
    }
    }
    pub fn channel_remote_id(&self, channel: String) -> Option<String> {
    let txn = match self.pristine().ok()?.mut_txn_begin() {
    Err(_) => return None,
    Ok(txn) => txn,
    };
    // TODO validate the txn needs closing?
    //
    // Or does the drop function do that?
    //
    let chan = match txn.load_channel(&channel) {
    Ok(c) => c,
    Err(_) => None,
    };
    match chan {
    Some(c) => Some(c.read().id.to_string()),
    None => {
    println!("No chan found");
    None
    }
    }
    }
    }
  • file addition: mod.rs (----------)
    [0.2530]
    pub mod repositories;
  • edit in src/models/mod.rs at line 3
    [11.223]
    pub mod pijul;
  • edit in src/main.rs at line 1
    [5.212]
    [5.213]
    use std::env;
  • edit in src/main.rs at line 4
    [5.253]
    [5.760]
    use rocket_dyn_templates::Template;
  • edit in src/main.rs at line 6
    [5.761][5.8002:8016](),[5.771][5.253:254](),[5.8016][5.253:254](),[5.253][5.253:254]()
    mod database;
  • replacement in src/main.rs at line 9
    [5.8018][5.8018:8054]()
    use rocket_dyn_templates::Template;
    [5.8018]
    [5.8054]
    mod database;
    mod repoman;
  • edit in src/main.rs at line 13
    [5.8067]
    [4.4093]
    mod pijul;
  • edit in src/main.rs at line 20
    [5.318]
    [5.772]
    let repo_storage_root =
    env::var("REPOSITORY_ROOT").expect("No REPOSITORY_ROOT env var exposed");
  • edit in src/main.rs at line 26
    [5.8151]
    [5.8151]
    .manage(repoman::new(repo_storage_root))
  • edit in src/main.rs at line 38
    [4.4156]
    [5.2743]
    .mount("/", pijul::routes())
  • edit in shell.nix at line 20
    [5.1210]
    [3.0]
    # LibPijul dependencies
    pkgs.buildPackages.xxHash
    pkgs.buildPackages.zstd
  • edit in shell.nix at line 48
    [2.134]
    [12.571]
    export REPOSITORY_ROOT="$PWD/tmp/repositories"
    if [ ! -d $REPOSITORY_ROOT ]; then
    mkdir $REPOSITORY_ROOT
    fi
  • file addition: 20210910105518_add_uuid_project_repo_path.up.sql (----------)
    [5.199]
    CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
    ALTER TABLE projects ADD repository_uuid uuid NOT NULL DEFAULT uuid_generate_v4();
  • file addition: 20210910105518_add_uuid_project_repo_path.down.sql (----------)
    [5.199]
    ALTER TABLE projects DROP COLUMN repository_uuid;
    DROP EXTENSION IF EXISTS "uuid-ossp";
  • replacement in migrations/20210907120846_projects_table.up.sql at line 4
    [4.4313][4.4313:4349]()
    owner_id integer REFERENCES users,
    [4.4313]
    [4.4349]
    owner_id integer REFERENCES users NOT NULL,
  • edit in README.md at line 9
    [5.9908]
    [5.1150]
    - `REPOSITORY_ROOT` will be used as storage root for repositories, and must be supplied
  • edit in Cargo.toml at line 9
    [5.1431]
    [4.4577]
    anyhow = "1.0"
  • edit in Cargo.toml at line 12
    [4.4611]
    [5.9909]
    uuid = { version = "0.8", features = ["serde", "v4"] }
    libpijul = "1.0.0-alpha.47"
  • replacement in Cargo.toml at line 23
    [5.1853][5.9979:10067]()
    features = [ "runtime-tokio-rustls", "postgres", "macros", "migrate", "time", "chrono"]
    [5.1853]
    [5.10067]
    features = [ "runtime-tokio-rustls", "postgres", "macros", "migrate", "time", "chrono", "uuid"]
  • edit in Cargo.lock at line 4
    [5.1593]
    [5.1915]
    [[package]]
    name = "adler32"
    version = "1.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
  • replacement in Cargo.lock at line 28
    [5.10708][5.10708:10719]()
    "cipher",
    [5.10708]
    [5.10719]
    "cipher 0.2.5",
    ]
    [[package]]
    name = "aes"
    version = "0.7.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8"
    dependencies = [
    "cfg-if 1.0.0",
    "cipher 0.3.0",
    "cpufeatures 0.2.1",
    "ctr 0.8.0",
    "opaque-debug 0.3.0",
  • replacement in Cargo.lock at line 51
    [5.10938][5.10938:10965]()
    "aes",
    "cipher",
    "ctr",
    [5.10938]
    [5.10965]
    "aes 0.6.0",
    "cipher 0.2.5",
    "ctr 0.6.0",
  • replacement in Cargo.lock at line 64
    [5.11197][5.11197:11208]()
    "cipher",
    [5.11197]
    [5.11208]
    "cipher 0.2.5",
  • replacement in Cargo.lock at line 74
    [5.11440][5.11440:11451]()
    "cipher",
    [5.11440]
    [5.11451]
    "cipher 0.2.5",
  • replacement in Cargo.lock at line 84
    [5.2121][5.2121:2135]()
    "getrandom",
    [5.2121]
    [5.2135]
    "getrandom 0.2.3",
  • edit in Cargo.lock at line 99
    [5.2409]
    [5.2409]
    name = "anyhow"
    version = "1.0.43"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "28ae2b3dec75a406790005a200b1bd89785afc02517a00ca99ecfe093ee9e6cf"
    [[package]]
    name = "arrayref"
    version = "0.3.6"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
    [[package]]
  • edit in Cargo.lock at line 117
    [5.1606]
    [5.1606]
    name = "arrayvec"
    version = "0.7.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd"
    [[package]]
  • edit in Cargo.lock at line 208
    [5.3400]
    [5.3400]
    name = "bincode"
    version = "1.3.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
    dependencies = [
    "serde",
    ]
    [[package]]
  • edit in Cargo.lock at line 232
    [5.3249]
    [5.11508]
    ]
    [[package]]
    name = "blake3"
    version = "1.0.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "dcd555c66291d5f836dbb6883b48660ece810fe25a31f3bdfb911945dff2691f"
    dependencies = [
    "arrayref",
    "arrayvec 0.7.1",
    "cc",
    "cfg-if 1.0.0",
    "constant_time_eq",
    "digest 0.9.0",
  • edit in Cargo.lock at line 279
    [5.12067]
    [5.12067]
    name = "bs58"
    version = "0.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3"
    [[package]]
  • edit in Cargo.lock at line 324
    [5.3972]
    [5.3972]
    name = "canonical-path"
    version = "2.0.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e6e9e01327e6c86e92ec72b1c798d4a94810f147209bbe3ffab6a86954937a6f"
    [[package]]
  • edit in Cargo.lock at line 356
    [5.12907]
    [5.12907]
    "serde",
    "time 0.1.43",
  • edit in Cargo.lock at line 381
    [5.13403]
    [5.4349]
    name = "cipher"
    version = "0.3.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7"
    dependencies = [
    "generic-array 0.14.4",
    ]
    [[package]]
  • edit in Cargo.lock at line 394
    [5.4528]
    [5.4528]
    [[package]]
    name = "constant_time_eq"
    version = "0.1.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
  • replacement in Cargo.lock at line 417
    [5.4953][5.13437:13446]()
    "rand",
    [5.4953]
    [5.13446]
    "rand 0.8.4",
  • replacement in Cargo.lock at line 420
    [5.13466][5.4953:4962](),[5.4953][5.4953:4962]()
    "time",
    [5.13466]
    [5.4962]
    "time 0.2.27",
  • edit in Cargo.lock at line 429
    [5.4071]
    [5.4071]
    dependencies = [
    "libc",
    ]
    [[package]]
    name = "cpufeatures"
    version = "0.2.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469"
  • edit in Cargo.lock at line 458
    [5.4320]
    [5.4320]
    name = "crc32fast"
    version = "1.2.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
    dependencies = [
    "cfg-if 1.0.0",
    ]
    [[package]]
  • edit in Cargo.lock at line 474
    [5.4556]
    [5.4556]
    ]
    [[package]]
    name = "crossbeam-deque"
    version = "0.8.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
    dependencies = [
    "cfg-if 1.0.0",
    "crossbeam-epoch",
    "crossbeam-utils",
    ]
    [[package]]
    name = "crossbeam-epoch"
    version = "0.9.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd"
    dependencies = [
    "cfg-if 1.0.0",
    "crossbeam-utils",
    "lazy_static",
    "memoffset",
    "scopeguard",
  • edit in Cargo.lock at line 525
    [5.5247]
    [5.5247]
    dependencies = [
    "generic-array 0.14.4",
    "subtle",
    ]
    [[package]]
    name = "crypto-mac"
    version = "0.11.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714"
  • replacement in Cargo.lock at line 546
    [5.13948][5.13948:13959]()
    "cipher",
    [5.13948]
    [5.5293]
    "cipher 0.2.5",
    ]
    [[package]]
    name = "ctr"
    version = "0.8.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea"
    dependencies = [
    "cipher 0.3.0",
  • edit in Cargo.lock at line 559
    [5.5308]
    [5.4995]
    name = "curve25519-dalek"
    version = "3.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61"
    dependencies = [
    "byteorder",
    "digest 0.9.0",
    "rand_core 0.5.1",
    "serde",
    "subtle",
    "zeroize",
    ]
    [[package]]
    name = "data-encoding"
    version = "2.3.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57"
    [[package]]
  • edit in Cargo.lock at line 629
    [5.14156]
    [5.14156]
    [[package]]
    name = "diffs"
    version = "0.4.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a8117b4111dc8d9e88d92ec2ee1cda48318af35c3e6b4f8599add5048189971d"
  • edit in Cargo.lock at line 687
    [5.6195]
    [5.6253]
    name = "ed25519"
    version = "1.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "4620d40f6d2601794401d6dd95a5cf69b6c157852539470eeda433a99b3c0efc"
    dependencies = [
    "serde",
    "signature",
    ]
    [[package]]
    name = "ed25519-dalek"
    version = "1.0.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
    dependencies = [
    "curve25519-dalek",
    "ed25519",
    "rand 0.7.3",
    "serde",
    "serde_bytes",
    "sha2",
    "zeroize",
    ]
    [[package]]
  • edit in Cargo.lock at line 781
    [5.15135]
    [5.15135]
    name = "fs2"
    version = "0.4.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
    dependencies = [
    "libc",
    "winapi 0.3.9",
    ]
    [[package]]
  • edit in Cargo.lock at line 959
    [5.9775]
    [5.9775]
    version = "0.1.16"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
    dependencies = [
    "cfg-if 1.0.0",
    "libc",
    "wasi 0.9.0+wasi-snapshot-preview1",
    ]
    [[package]]
    name = "getrandom"
  • replacement in Cargo.lock at line 976
    [5.9973][5.9973:9982]()
    "wasi",
    [5.9973]
    [5.9982]
    "wasi 0.10.2+wasi-snapshot-preview1",
  • replacement in Cargo.lock at line 1087
    [5.17268][5.17268:17277]()
    "hmac",
    [5.17268]
    [5.17277]
    "hmac 0.10.1",
  • replacement in Cargo.lock at line 1096
    [5.7752][5.7752:7767]()
    "crypto-mac",
    [5.7752]
    [5.17293]
    "crypto-mac 0.10.0",
    "digest 0.9.0",
    ]
    [[package]]
    name = "hmac"
    version = "0.11.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b"
    dependencies = [
    "crypto-mac 0.11.1",
  • replacement in Cargo.lock at line 1301
    [5.8498][5.8498:8511]()
    "arrayvec",
    [5.8498]
    [5.8511]
    "arrayvec 0.5.2",
  • replacement in Cargo.lock at line 1310
    [5.13302][5.13302:13321]()
    version = "0.2.98"
    [5.13302]
    [5.13321]
    version = "0.2.101"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21"
    [[package]]
    name = "libpijul"
    version = "1.0.0-alpha.48"
  • replacement in Cargo.lock at line 1318
    [5.13386][5.13386:13464]()
    checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790"
    [5.13386]
    [5.13464]
    checksum = "ffbd6c9d230f5db81cadc7cbfd824bdd594a864df8fb173487717dc4a6d0c6cb"
    dependencies = [
    "adler32",
    "aes 0.7.5",
    "bincode",
    "bitflags",
    "blake3",
    "bs58",
    "byteorder",
    "canonical-path",
    "cfg-if 1.0.0",
    "chrono",
    "crossbeam-deque",
    "crossbeam-utils",
    "curve25519-dalek",
    "data-encoding",
    "diffs",
    "ed25519-dalek",
    "encoding_rs",
    "generic-array 0.14.4",
    "hmac 0.11.0",
    "ignore",
    "lazy_static",
    "log",
    "lru-cache",
    "memchr",
    "parking_lot",
    "path-slash",
    "pbkdf2",
    "pijul-macros",
    "rand 0.7.3",
    "rand_core 0.6.3",
    "regex",
    "sanakirja",
    "serde",
    "serde_derive",
    "serde_json",
    "sha2",
    "tempfile",
    "thiserror",
    "tokio",
    "toml",
    "twox-hash",
    "zstd-seekable",
    ]
    [[package]]
    name = "linked-hash-map"
    version = "0.5.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
  • edit in Cargo.lock at line 1402
    [5.8583]
    [5.8583]
    name = "lru-cache"
    version = "0.1.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c"
    dependencies = [
    "linked-hash-map",
    ]
    [[package]]
  • edit in Cargo.lock at line 1440
    [5.14383]
    [5.14383]
    name = "memmap"
    version = "0.7.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
    dependencies = [
    "libc",
    "winapi 0.3.9",
    ]
    [[package]]
    name = "memoffset"
    version = "0.6.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
    dependencies = [
    "autocfg",
    ]
    [[package]]
  • edit in Cargo.lock at line 1565
    [5.15467]
    [4.4612]
    "anyhow",
  • edit in Cargo.lock at line 1567
    [4.4628]
    [4.4628]
    "libpijul",
  • edit in Cargo.lock at line 1573
    [5.9227]
    [5.9227]
    "uuid",
  • edit in Cargo.lock at line 1707
    [5.16695]
    [5.16695]
    name = "path-slash"
    version = "0.1.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3cacbb3c4ff353b534a67fb8d7524d00229da4cb1dc8c79f4db96e375ab5b619"
    [[package]]
    name = "pbkdf2"
    version = "0.8.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa"
    dependencies = [
    "crypto-mac 0.11.1",
    ]
    [[package]]
  • edit in Cargo.lock at line 1812
    [5.22868]
    [5.17647]
    name = "pijul-macros"
    version = "0.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e64c9817419a65e59c4de1d74a0b1ab551839807fd20260c252d8b03a4e65714"
    dependencies = [
    "proc-macro2",
    "quote",
    "regex",
    "syn",
    ]
    [[package]]
  • edit in Cargo.lock at line 1836
    [5.22882]
    [5.22882]
    name = "pkg-config"
    version = "0.3.19"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
    [[package]]
  • replacement in Cargo.lock at line 1876
    [5.23692][5.23692:23701]()
    "hmac",
    [5.23692]
    [5.23701]
    "hmac 0.10.1",
  • replacement in Cargo.lock at line 1879
    [5.23721][5.23721:23730]()
    "rand",
    [5.23721]
    [5.23730]
    "rand 0.8.4",
  • edit in Cargo.lock at line 1973
    [5.19393]
    [5.19393]
    version = "0.7.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
    dependencies = [
    "getrandom 0.1.16",
    "libc",
    "rand_chacha 0.2.2",
    "rand_core 0.5.1",
    "rand_hc 0.2.0",
    ]
    [[package]]
    name = "rand"
  • replacement in Cargo.lock at line 1991
    [5.19580][5.19580:19622]()
    "rand_chacha",
    "rand_core",
    "rand_hc",
    [5.19580]
    [5.19622]
    "rand_chacha 0.3.1",
    "rand_core 0.6.3",
    "rand_hc 0.3.1",
    ]
    [[package]]
    name = "rand_chacha"
    version = "0.2.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
    dependencies = [
    "ppv-lite86",
    "rand_core 0.5.1",
  • replacement in Cargo.lock at line 2013
    [5.19851][5.19851:19865]()
    "rand_core",
    [5.19851]
    [5.19865]
    "rand_core 0.6.3",
    ]
    [[package]]
    name = "rand_core"
    version = "0.5.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
    dependencies = [
    "getrandom 0.1.16",
  • replacement in Cargo.lock at line 2031
    [5.20077][5.20077:20091]()
    "getrandom",
    [5.20077]
    [5.20091]
    "getrandom 0.2.3",
    ]
    [[package]]
    name = "rand_hc"
    version = "0.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
    dependencies = [
    "rand_core 0.5.1",
  • replacement in Cargo.lock at line 2049
    [5.20301][5.20301:20315]()
    "rand_core",
    [5.20301]
    [5.20315]
    "rand_core 0.6.3",
  • replacement in Cargo.lock at line 2067
    [5.10315][5.10315:10329]()
    "getrandom",
    [5.10315]
    [5.10329]
    "getrandom 0.2.3",
  • replacement in Cargo.lock at line 2154
    [5.21669][5.21669:21678]()
    "rand",
    [5.21669]
    [5.21678]
    "rand 0.8.4",
  • replacement in Cargo.lock at line 2161
    [5.21759][5.21759:21768]()
    "time",
    [5.21759]
    [5.21768]
    "time 0.2.27",
  • replacement in Cargo.lock at line 2224
    [5.22602][5.22602:22611]()
    "time",
    [5.22602]
    [5.22611]
    "time 0.2.27",
  • edit in Cargo.lock at line 2304
    [5.25697]
    [5.25697]
    ]
    [[package]]
    name = "sanakirja"
    version = "1.2.11"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "be030ebfecb0589e7c83817620ee833b98c3de089b1a9393b195dfc04b7fc9fe"
    dependencies = [
    "crc32fast",
    "fs2",
    "lazy_static",
    "log",
    "memmap",
    "parking_lot",
    "sanakirja-core",
    "thiserror",
    ]
    [[package]]
    name = "sanakirja-core"
    version = "1.2.13"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9828a6c9219969d6b19cfb0b53a8aed96e29983d0944a67db0a8c44db20ebe00"
    dependencies = [
    "crc32fast",
  • edit in Cargo.lock at line 2405
    [5.25003]
    [5.25003]
    name = "serde_bytes"
    version = "0.11.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9"
    dependencies = [
    "serde",
    ]
    [[package]]
  • replacement in Cargo.lock at line 2455
    [5.26267][5.11815:11831](),[5.11815][5.11815:11831]()
    "cpufeatures",
    [5.26267]
    [5.26268]
    "cpufeatures 0.1.5",
  • replacement in Cargo.lock at line 2474
    [5.26349][5.12108:12124](),[5.12108][5.12108:12124]()
    "cpufeatures",
    [5.26349]
    [5.26350]
    "cpufeatures 0.1.5",
  • edit in Cargo.lock at line 2487
    [5.25902]
    [5.25902]
    [[package]]
    name = "signature"
    version = "1.3.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335"
  • replacement in Cargo.lock at line 2590
    [5.13303][5.13303:13312]()
    "hmac",
    [5.13303]
    [5.13312]
    "hmac 0.10.1",
  • replacement in Cargo.lock at line 2599
    [5.13409][5.13409:13418]()
    "rand",
    [5.13409]
    [5.13418]
    "rand 0.8.4",
  • replacement in Cargo.lock at line 2610
    [5.13541][5.26854:26863]()
    "time",
    [5.13541]
    [5.13541]
    "time 0.2.27",
  • edit in Cargo.lock at line 2613
    [5.13566]
    [5.13566]
    "uuid",
  • edit in Cargo.lock at line 2760
    [5.28779]
    [5.14856]
    name = "synstructure"
    version = "0.12.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "474aaa926faa1603c40b7885a9eaea29b444d1cb2850cb7c0e37bb1a4182f4fa"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    "unicode-xid",
    ]
    [[package]]
  • replacement in Cargo.lock at line 2785
    [5.28995][5.28995:29004]()
    "rand",
    [5.28995]
    [5.29004]
    "rand 0.8.4",
  • replacement in Cargo.lock at line 2805
    [5.27221][5.27221:27230]()
    "rand",
    [5.27221]
    [5.27230]
    "rand 0.8.4",
  • edit in Cargo.lock at line 2843
    [5.27521]
    [5.29067]
    name = "threadpool"
    version = "1.8.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa"
    dependencies = [
    "num_cpus",
    ]
    [[package]]
  • edit in Cargo.lock at line 2853
    [5.29081]
    [5.29081]
    version = "0.1.43"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
    dependencies = [
    "libc",
    "winapi 0.3.9",
    ]
    [[package]]
    name = "time"
  • edit in Cargo.lock at line 3055
    [5.32414]
    [5.16208]
    name = "twox-hash"
    version = "1.6.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "1f559b464de2e2bdabcac6a210d12e9b5a5973c251e102c44c585c71d51bd78e"
    dependencies = [
    "cfg-if 1.0.0",
    "rand 0.8.4",
    "static_assertions",
    ]
    [[package]]
  • edit in Cargo.lock at line 3214
    [5.17732]
    [5.17732]
    ]
    [[package]]
    name = "uuid"
    version = "0.8.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
    dependencies = [
    "getrandom 0.2.3",
    "serde",
  • edit in Cargo.lock at line 3252
    [5.33869]
    [5.33869]
    [[package]]
    name = "wasi"
    version = "0.9.0+wasi-snapshot-preview1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
  • edit in Cargo.lock at line 3422
    [5.36313]
    [[package]]
    name = "zeroize"
    version = "1.4.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "377db0846015f7ae377174787dd452e1c5f5a9050bc6f954911d01f116daa0cd"
    dependencies = [
    "zeroize_derive",
    ]
    [[package]]
    name = "zeroize_derive"
    version = "1.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a2c1e130bebaeab2f23886bf9acbaca14b092408c452543c857f66399cd6dab1"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    "synstructure",
    ]
    [[package]]
    name = "zstd-seekable"
    version = "0.1.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3e3b99cee88f0309ca765c6aa8c284a00394c35ef8ca012e2409485fc369bf2f"
    dependencies = [
    "cc",
    "libc",
    "pkg-config",
    "thiserror",
    "threadpool",
    ]