Skip to content

Commit 05b774f

Browse files
Pennyzctlauralt
authored andcommitted
Args: Add flag --version
The --version flag is quite an universal command line argument for printing the application version number. Therefore added flag --version to both firecracker and jailer. Signed-off-by: Penny Zheng <[email protected]>
1 parent 6fd1545 commit 05b774f

File tree

4 files changed

+44
-11
lines changed

4 files changed

+44
-11
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## [0.21.1]
4+
5+
### Fixed
6+
7+
- Added `--version` flag to both Firecracker and Jailer.
8+
39
## [0.21.0]
410

511
### Added

src/firecracker/src/main.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,14 @@ fn main() {
144144
process::exit(i32::from(vmm::FC_EXIT_CODE_OK));
145145
}
146146
}
147+
148+
if let Some(version) = arg_parser.arguments().value_as_bool("version") {
149+
if version {
150+
println!("Firecracker v{}\n", FIRECRACKER_VERSION);
151+
process::exit(i32::from(vmm::FC_EXIT_CODE_OK));
152+
}
153+
}
154+
147155
arg_parser.arguments()
148156
}
149157
};

src/jailer/src/main.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,13 @@ fn main() {
326326
process::exit(0);
327327
}
328328
}
329+
330+
if let Some(version) = arg_parser.arguments().value_as_bool("version") {
331+
if version {
332+
println!("Jailer v{}\n", JAILER_VERSION);
333+
process::exit(0);
334+
}
335+
}
329336
}
330337
}
331338

src/utils/src/arg_parser.rs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub type Result<T> = result::Result<T, Error>;
1111
const ARG_PREFIX: &str = "--";
1212
const ARG_SEPARATOR: &str = "--";
1313
const HELP_ARG: &str = "--help";
14+
const VERSION_ARG: &str = "--version";
1415

1516
/// Errors associated with parsing and validating arguments.
1617
#[derive(Debug, PartialEq)]
@@ -277,6 +278,16 @@ impl<'a> Arguments<'a> {
277278
return Ok(());
278279
}
279280

281+
// If `--version` is provided as a parameter, we artificially skip the parsing of other
282+
// command line arguments by adding just the version argument to the parsed list and
283+
// returning.
284+
if args.contains(&VERSION_ARG.to_string()) {
285+
let mut version_arg = Argument::new("version").help("Print the binary version number.");
286+
version_arg.user_value = Some(Value::Bool(true));
287+
self.insert_arg(version_arg);
288+
return Ok(());
289+
}
290+
280291
// Otherwise, we continue the parsing of the other arguments.
281292
self.populate_args(args)
282293
}
@@ -465,9 +476,10 @@ mod tests {
465476
#[test]
466477
fn test_parse() {
467478
let arg_parser = build_arg_parser();
468-
let mut arguments = arg_parser.arguments().clone();
469479

470480
// Test different scenarios for the command line arguments provided by user.
481+
let mut arguments = arg_parser.arguments().clone();
482+
471483
let args = vec!["binary-name", "--exec-file", "foo", "--help"]
472484
.into_iter()
473485
.map(String::from)
@@ -476,7 +488,16 @@ mod tests {
476488
assert!(arguments.parse(&args).is_ok());
477489
assert!(arguments.args.contains_key("help"));
478490

479-
let arg_parser = build_arg_parser();
491+
arguments = arg_parser.arguments().clone();
492+
493+
let args = vec!["binary-name", "--exec-file", "foo", "--version"]
494+
.into_iter()
495+
.map(String::from)
496+
.collect::<Vec<String>>();
497+
498+
assert!(arguments.parse(&args).is_ok());
499+
assert!(arguments.args.contains_key("version"));
500+
480501
arguments = arg_parser.arguments().clone();
481502

482503
let args = vec![
@@ -496,7 +517,6 @@ mod tests {
496517
Err(Error::MissingValue("api-sock".to_string()))
497518
);
498519

499-
let arg_parser = build_arg_parser();
500520
arguments = arg_parser.arguments().clone();
501521

502522
let args = vec![
@@ -517,7 +537,6 @@ mod tests {
517537
Err(Error::DuplicateArgument("api-sock".to_string()))
518538
);
519539

520-
let arg_parser = build_arg_parser();
521540
arguments = arg_parser.arguments().clone();
522541

523542
let args = vec!["binary-name", "--api-sock", "foo"]
@@ -530,7 +549,6 @@ mod tests {
530549
Err(Error::MissingArgument("exec-file".to_string()))
531550
);
532551

533-
let arg_parser = build_arg_parser();
534552
arguments = arg_parser.arguments().clone();
535553

536554
let args = vec![
@@ -550,7 +568,6 @@ mod tests {
550568
Err(Error::UnexpectedArgument("invalid-arg".to_string()))
551569
);
552570

553-
let arg_parser = build_arg_parser();
554571
arguments = arg_parser.arguments().clone();
555572

556573
let args = vec![
@@ -572,7 +589,6 @@ mod tests {
572589
Err(Error::MissingArgument("config-file".to_string()))
573590
);
574591

575-
let arg_parser = build_arg_parser();
576592
arguments = arg_parser.arguments().clone();
577593

578594
let args = vec![
@@ -592,7 +608,6 @@ mod tests {
592608
Err(Error::MissingValue("id".to_string()))
593609
);
594610

595-
let arg_parser = build_arg_parser();
596611
arguments = arg_parser.arguments().clone();
597612

598613
let args = vec![
@@ -613,7 +628,6 @@ mod tests {
613628
Err(Error::UnexpectedArgument("foobar".to_string()))
614629
);
615630

616-
let arg_parser = build_arg_parser();
617631
arguments = arg_parser.arguments().clone();
618632

619633
let args = vec![
@@ -633,7 +647,6 @@ mod tests {
633647
Err(Error::UnexpectedArgument("foobar".to_string()))
634648
);
635649

636-
let arg_parser = build_arg_parser();
637650
arguments = arg_parser.arguments().clone();
638651

639652
let args = vec!["binary-name", "foo"]
@@ -646,7 +659,6 @@ mod tests {
646659
Err(Error::UnexpectedArgument("foo".to_string()))
647660
);
648661

649-
let arg_parser = build_arg_parser();
650662
arguments = arg_parser.arguments().clone();
651663

652664
let args = vec![

0 commit comments

Comments
 (0)