diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c51d5cf..61a503a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## Unreleased +### Added +- Add macOS binary for releases +- Add `init` command to initialize a Bender.yml file of an IP. ## 0.27.4 - 2023-11-14 ### Added diff --git a/src/cli.rs b/src/cli.rs index fd91c6f6..e7a5d079 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -76,7 +76,8 @@ pub fn main() -> Result<()> { .subcommand(cmd::script::new()) .subcommand(cmd::checkout::new()) .subcommand(cmd::vendor::new()) - .subcommand(cmd::fusesoc::new()); + .subcommand(cmd::fusesoc::new()) + .subcommand(cmd::init::new()); // Add the `--debug` option in debug builds. let app = if cfg!(debug_assertions) { @@ -100,6 +101,10 @@ pub fn main() -> Result<()> { ENABLE_DEBUG.store(true, std::sync::atomic::Ordering::Relaxed); } + if let Some(("init", matches)) = matches.subcommand() { + return cmd::init::run(matches); + } + let mut force_fetch = false; if let Some(("update", intern_matches)) = matches.subcommand() { force_fetch = intern_matches.get_flag("fetch"); diff --git a/src/cmd/init.rs b/src/cmd/init.rs new file mode 100644 index 00000000..aab7b5d0 --- /dev/null +++ b/src/cmd/init.rs @@ -0,0 +1,84 @@ +// Copyright (c) 2021 ETH Zurich +// Michael Rogenmoser + +//! The `init` subcommand. + +use std::env::current_dir; +use std::ffi::OsStr; +use std::fs::File; +use std::io::Write; +use std::path::Path; +use std::process::Command as SysCommand; + +use clap::{ArgMatches, Command}; + +use crate::error::*; + +/// Assemble the `init` subcommand. +pub fn new() -> Command { + Command::new("init").about("Initialize a Bender package") +} + +/// Execute the `init` subcommand. +pub fn run(_matches: &ArgMatches) -> Result<()> { + // Get working directory name + let binding = current_dir()?; + let cwd = binding + .as_path() + .file_name() + .unwrap_or(OsStr::new("new_package")) + .to_str() + .unwrap_or("new_package"); + + // Get author from git config + let name = String::from_utf8( + SysCommand::new("git") + .args(["config", "user.name"]) + .output()? + .stdout, + ) + .unwrap_or("Your Name".to_string()); + let name = &name + .strip_suffix("\r\n") + .unwrap_or(name.strip_suffix('\n').unwrap_or(&name)); + let email = String::from_utf8( + SysCommand::new("git") + .args(["config", "user.email"]) + .output()? + .stdout, + ) + .unwrap_or("you@example.com".to_string()); + let email = &email + .strip_suffix("\r\n") + .unwrap_or(email.strip_suffix('\n').unwrap_or(&email)); + + // Create Bender.yml + if Path::new("Bender.yml").exists() { + return Err(Error::new("Bender.yml already exists")); + } + + let mut file = File::create("Bender.yml")?; + + writeln!( + file, + "\ +# A more detailed description of the manifest format `Bender.yml` can be found here: +# https://github.com/pulp-platform/bender#manifest-format-benderyml + +package: + name: {} + authors: + - \"{} <{}>\" + +dependencies: + +sources: + # Source files grouped in levels. Files in level 0 have no dependencies on files in this + # package. Files in level 1 only depend on files in level 0, files in level 2 on files in + # levels 1 and 0, etc. Files within a level are ordered alphabetically. + # Level 0", + cwd, name, email + )?; + + Ok(()) +} diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index 740d8c1f..3c383995 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -11,6 +11,7 @@ pub mod checkout; pub mod clone; pub mod config; pub mod fusesoc; +pub mod init; pub mod packages; pub mod parents; pub mod path;