Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cargo-shuttle/src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,9 @@ pub struct RunArgs {
/// Don't display timestamps and log origin tags
#[arg(long)]
pub raw: bool,
/// Suppress non-error output
#[arg(long, short = 'q')]
pub quiet: bool,

#[command(flatten)]
pub secret_args: SecretsArgs,
Expand Down
84 changes: 52 additions & 32 deletions cargo-shuttle/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1404,24 +1404,24 @@ impl Shuttle {
fs::write(path, archive).context("writing archive")?;
Ok(())
} else if build_args.inner.docker {
self.local_docker_build(project_args, &build_args.inner)
self.local_docker_build(project_args, &build_args.inner, false)
.await
} else {
self.local_build(&build_args.inner).await.map(|_| ())
self.local_build(&build_args.inner, false).await.map(|_| ())
}
}

async fn local_build(&self, build_args: &BuildArgsShared) -> Result<BuiltService> {
async fn local_build(&self, build_args: &BuildArgsShared, quiet: bool) -> Result<BuiltService> {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Missing function documentation explaining the purpose of the new quiet parameter

Suggested change
async fn local_build(&self, build_args: &BuildArgsShared, quiet: bool) -> Result<BuiltService> {
/// Builds the project locally, optionally suppressing non-error output
async fn local_build(&self, build_args: &BuildArgsShared, quiet: bool) -> Result<BuiltService> {

Context Used: Context from dashboard - Include comments explaining the purpose of functions, especially for new or complex functionality. (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: cargo-shuttle/src/lib.rs
Line: 1414:1414

Comment:
**style:** Missing function documentation explaining the purpose of the new `quiet` parameter

```suggestion
    /// Builds the project locally, optionally suppressing non-error output
    async fn local_build(&self, build_args: &BuildArgsShared, quiet: bool) -> Result<BuiltService> {
```

**Context Used:** Context from `dashboard` - Include comments explaining the purpose of functions, especially for new or complex functionality. ([source](https://app.greptile.com/review/custom-context?memory=fe8549ea-5239-4b00-a674-867d405455c8))

How can I resolve this? If you propose a fix, please make it concise.

let project_directory = self.ctx.project_directory();

cargo_green_eprintln("Building", project_directory.display());
if !quiet {
cargo_green_eprintln("Building", project_directory.display());
}

// TODO: hook up -q/--quiet flag
let quiet = false;
cargo_build(project_directory.to_owned(), build_args.release, quiet).await
}

fn find_available_port(run_args: &mut RunArgs) {
fn find_available_port(run_args: &mut RunArgs, quiet: bool) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Missing function documentation explaining the purpose of the new quiet parameter

Suggested change
fn find_available_port(run_args: &mut RunArgs, quiet: bool) {
/// Finds an available port for the service, optionally suppressing port change messages
fn find_available_port(run_args: &mut RunArgs, quiet: bool) {

Context Used: Context from dashboard - Include comments explaining the purpose of functions, especially for new or complex functionality. (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: cargo-shuttle/src/lib.rs
Line: 1424:1424

Comment:
**style:** Missing function documentation explaining the purpose of the new `quiet` parameter

```suggestion
    /// Finds an available port for the service, optionally suppressing port change messages
    fn find_available_port(run_args: &mut RunArgs, quiet: bool) {
```

**Context Used:** Context from `dashboard` - Include comments explaining the purpose of functions, especially for new or complex functionality. ([source](https://app.greptile.com/review/custom-context?memory=fe8549ea-5239-4b00-a674-867d405455c8))

How can I resolve this? If you propose a fix, please make it concise.

let original_port = run_args.port;
for port in (run_args.port..=u16::MAX).step_by(10) {
if !portpicker::is_free_tcp(port) {
Expand All @@ -1431,7 +1431,7 @@ impl Shuttle {
break;
}

if run_args.port != original_port {
if run_args.port != original_port && !quiet {
eprintln!(
"Port {} is already in use. Using port {}.",
original_port, run_args.port,
Expand All @@ -1452,33 +1452,41 @@ impl Shuttle {

// Handle bacon mode
if run_args.build_args.bacon {
cargo_green_eprintln(
"Starting",
format!("{} in watch mode using bacon", project_name),
);
eprintln!();
if !run_args.quiet {
cargo_green_eprintln(
"Starting",
format!("{} in watch mode using bacon", project_name),
);
eprintln!();
}
return bacon::run_bacon(project_directory).await;
}

if run_args.build_args.docker {
if run_args.build_args.docker && !run_args.quiet {
eprintln!("WARN: Local run with --docker is EXPERIMENTAL. Please submit feedback on GitHub or Discord if you encounter issues.");
}

let secrets = Shuttle::get_secrets(&run_args.secret_args, project_directory, true)?
.unwrap_or_default();
Shuttle::find_available_port(&mut run_args);

let quiet = run_args.quiet;
Shuttle::find_available_port(&mut run_args, quiet);

let s_re = if !run_args.build_args.docker {
let service = self.local_build(&run_args.build_args).await?;
let service = self
.local_build(&run_args.build_args, run_args.quiet)
.await?;
trace!(path = ?service.executable_path, "runtime executable");
if let Some(warning) = check_and_warn_runtime_version(&service.executable_path).await? {
eprint!("{}", warning);
if !run_args.quiet {
eprint!("{}", warning);
}
}
let runtime_executable = service.executable_path.clone();

Some((service, runtime_executable))
} else {
self.local_docker_build(project_args, &run_args.build_args)
self.local_docker_build(project_args, &run_args.build_args, run_args.quiet)
.await?;
None
};
Expand Down Expand Up @@ -1510,6 +1518,9 @@ impl Shuttle {
("SHUTTLE_HEALTHZ_PORT", healthz_port.to_string()),
("SHUTTLE_API", format!("http://127.0.0.1:{}", api_port)),
];
if run_args.quiet {
envs.push(("SHUTTLE_QUIET", "true".to_owned()));
}
// Use a nice debugging tracing level if user does not provide their own
if debug && std::env::var("RUST_LOG").is_err() {
envs.push(("RUST_LOG", "info,shuttle=trace,reqwest=debug".to_owned()));
Expand All @@ -1521,12 +1532,14 @@ impl Shuttle {
let name = format!("shuttle-run-{project_name}");
let mut child = if run_args.build_args.docker {
let image = format!("shuttle-build-{project_name}");
eprintln!();
cargo_green_eprintln(
"Starting",
format!("{} on http://{}:{}", image, ip, run_args.port),
);
eprintln!();
if !run_args.quiet {
eprintln!();
cargo_green_eprintln(
"Starting",
format!("{} on http://{}:{}", image, ip, run_args.port),
);
eprintln!();
}
info!(image, "Spawning 'docker run' process");
let mut docker = tokio::process::Command::new("docker");
docker
Expand All @@ -1551,12 +1564,14 @@ impl Shuttle {
.context("spawning 'docker run' process")?
} else {
let (service, runtime_executable) = s_re.context("developer skill issue")?;
eprintln!();
cargo_green_eprintln(
"Starting",
format!("{} on http://{}:{}", service.target_name, ip, run_args.port),
);
eprintln!();
if !run_args.quiet {
eprintln!();
cargo_green_eprintln(
"Starting",
format!("{} on http://{}:{}", service.target_name, ip, run_args.port),
);
eprintln!();
}
info!(
path = %runtime_executable.display(),
"Spawning runtime process",
Expand Down Expand Up @@ -1723,14 +1738,17 @@ impl Shuttle {
&self,
project_args: &ProjectArgs,
build_args: &BuildArgsShared,
quiet: bool,
) -> Result<()> {
let project_name = project_args.local_project_name()?;
let project_directory = self.ctx.project_directory();

let metadata = cargo_metadata(project_directory)?;
let rust_build_args = gather_rust_build_args(&metadata)?;

cargo_green_eprintln("Building", format!("{} with docker", project_name));
if !quiet {
cargo_green_eprintln("Building", format!("{} with docker", project_name));
}

let tempdir = tempfile::Builder::new()
.prefix("shuttle-build-")
Expand Down Expand Up @@ -1785,7 +1803,9 @@ impl Shuttle {
bail!("Docker build error");
}

cargo_green_eprintln("Finished", "building with docker");
if !quiet {
cargo_green_eprintln("Finished", "building with docker");
}

Ok(())
}
Expand Down
31 changes: 19 additions & 12 deletions runtime/src/start.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,15 @@ pub async fn start(
return;
}

println!(
"{} starting: {} {}",
crate::VERSION_STRING,
crate_name,
package_version
);
let quiet = std::env::var("SHUTTLE_QUIET").is_ok();
if !quiet {
println!(
"{} starting: {} {}",
crate::VERSION_STRING,
crate_name,
package_version
);
}

if let Err(e) = initial_args_and_env_check() {
eprintln!("ERROR: Runtime failed to parse args: {e}");
Expand All @@ -58,17 +61,21 @@ pub async fn start(
}),
)
.init();
tracing::warn!(
"Default tracing subscriber initialized (https://docs.shuttle.dev/docs/logs)"
);
if !quiet {
tracing::warn!(
"Default tracing subscriber initialized (https://docs.shuttle.dev/docs/logs)"
);
}
}

#[cfg(feature = "setup-otel-exporter")]
let _guard = {
let guard = crate::telemetry::init_tracing_subscriber(crate_name, package_version);
tracing::warn!(
"Default tracing subscriber with otel exporter initialized (https://docs.shuttle.dev/docs/telemetry)"
);
if !quiet {
tracing::warn!(
"Default tracing subscriber with otel exporter initialized (https://docs.shuttle.dev/docs/telemetry)"
);
}
guard
};

Expand Down