diff --git a/crates/build/src/config/dependency.rs b/crates/build/src/config/dependency.rs index 9de32e3..bd31a48 100644 --- a/crates/build/src/config/dependency.rs +++ b/crates/build/src/config/dependency.rs @@ -31,6 +31,7 @@ pub enum Dependency { pub enum GitRef { Rev(String), Tag(String), + Branch(String), } #[derive(Deserialize, Default)] @@ -51,6 +52,8 @@ struct RawDependency { rev: Option, /// The specific tag to download (only applicable if `git` is provided). tag: Option, + /// The specific branch to download (only applicable if `branch` is provided) + branch: Option, } impl DependencyConfig { @@ -144,17 +147,18 @@ impl RawDependency { (Some(_), Some(_)) => Err(DependencyValidationError::Conflicting(name.into())), (None, None) => Err(DependencyValidationError::Missing(name.into())), (Some(p), None) => { - if self.rev.is_some() || self.tag.is_some() { + if self.rev.is_some() || self.tag.is_some() || self.branch.is_some() { return Err(DependencyValidationError::PathWithGitField(name.into())); } Ok(Dependency::Path(p)) } (None, Some(url)) => { - let reference = match (self.rev, self.tag) { - (None, None) => None, - (Some(v), None) => Some(GitRef::Rev(v)), - (None, Some(t)) => Some(GitRef::Tag(t)), + let reference = match (self.rev, self.tag, self.branch) { + (None, None, None) => None, + (Some(v), None, None) => Some(GitRef::Rev(v)), + (None, Some(t), None) => Some(GitRef::Tag(t)), + (None, None, Some(b)) => Some(GitRef::Branch(b)), _ => return Err(DependencyValidationError::ConflictingGitRef(name.into())), }; diff --git a/crates/build/src/error.rs b/crates/build/src/error.rs index 8b6ce53..6080ce5 100644 --- a/crates/build/src/error.rs +++ b/crates/build/src/error.rs @@ -15,10 +15,10 @@ pub enum DependencyValidationError { #[error("Invalid dependency '{0}': cannot specify both 'path' and 'git', choose one")] Conflicting(String), - #[error("Invalid dependency '{0}': `path` cannot be combined with git-only fields (rev/tag)")] + #[error("Invalid dependency '{0}': `path` cannot be combined with git-only fields (rev/tag/branch)")] PathWithGitField(String), - #[error("Invalid dependency '{0}': only one of `rev`, `tag` may be set")] + #[error("Invalid dependency '{0}': only one of `rev`, `tag`, `branch` may be set")] ConflictingGitRef(String), } diff --git a/crates/build/src/resolver.rs b/crates/build/src/resolver.rs index b5a5c85..d39d42a 100644 --- a/crates/build/src/resolver.rs +++ b/crates/build/src/resolver.rs @@ -113,9 +113,10 @@ impl ArtifactsResolver { let repo_name = clean_url.split('/').next_back()?; let tag = match reference { - Some(GitRef::Rev(rev)) => rev.as_str(), - Some(GitRef::Tag(tag)) => tag.as_str(), - None => "HEAD", + Some(GitRef::Rev(rev)) => format!("rev={rev}"), + Some(GitRef::Tag(tag)) => format!("tag={tag}"), + Some(GitRef::Branch(branch)) => format!("branch={branch}"), + None => "HEAD".into(), }; let url = format!("{url}@{tag}"); diff --git a/crates/cli/assets/Simplex.default.toml b/crates/cli/assets/Simplex.default.toml index 5ab8f8b..a82e912 100644 --- a/crates/cli/assets/Simplex.default.toml +++ b/crates/cli/assets/Simplex.default.toml @@ -6,7 +6,7 @@ # out_dir = "./src/artifacts" # [dependencies] -# some_dep = { git = "", path = "", = "" } +# some_dep = { git = "", path = "", = "" } # [regtest] # mnemonic = "exist carry drive collect lend cereal occur much tiger just involve mean" diff --git a/crates/cli/src/commands/install.rs b/crates/cli/src/commands/install.rs index b8b0cd9..dedf7a9 100644 --- a/crates/cli/src/commands/install.rs +++ b/crates/cli/src/commands/install.rs @@ -115,6 +115,9 @@ impl Install { execute_git(&["clone", url, target_str])?; execute_git(&["-C", target_str, "checkout", rev.as_str()])?; } + Some(GitRef::Branch(branch)) => { + execute_git(&["clone", "--depth", "1", "--branch", branch.as_str(), url, target_str])?; + } None => { execute_git(&["clone", "--depth", "1", url, target_str])?; }