use native external subcommand support instead of hand-rolled one

[?]
Nov 30, 2020, 9:46 AM
SNZ3OAMCPUGFYON5SZHQQQK46ZZMVMJECJYEUCMG657UVLY2PNBQC

Dependencies

  • [2] BQDE4VH6 Fixing the "empty subcommand" case
  • [3] NV6OSWDH Fixing external subcommands
  • [4] WXAFKN6J Do not call an external subcommand when the parsing of an existing subcommand fails
  • [5] SFY4U6XE remove redundant conditional compilation
  • [6] GURIBVW6 Fixing the pager
  • [7] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [8] RJMQSZER External commands
  • [*] L4JXJHWX pijul/*: reorganize imports and remove extern crate

Change contents

  • edit in pijul/src/main.rs at line 6
    [10.577]
    [4.84279]
    use std::ffi::OsString;
  • edit in pijul/src/main.rs at line 107
    [4.85867]
    [4.85867]
    #[clap(external_subcommand)]
    ExternalSubcommand(Vec<OsString>),
  • replacement in pijul/src/main.rs at line 183
    [4.88177][4.0:519](),[4.519][4.190:200](),[4.190][4.190:200](),[4.419][4.88349:88355](),[4.88349][4.88349:88355](),[4.88355][4.0:27](),[4.27][4.420:422]()
    match external_command() {
    Ok(false) => {
    let opts = Opts::parse();
    if let Err(e) = run(opts).await {
    writeln!(std::io::stderr(), "Error: {}", e).unwrap_or(());
    std::process::exit(1);
    }
    }
    Ok(true) => (),
    Err((cmd, e)) => {
    writeln!(
    std::io::stderr(),
    "Error while trying to run {:?}: {}",
    cmd,
    e
    )
    .unwrap_or(());
    }
    }
    std::process::exit(0);
    }
    [4.88177]
    [4.422]
    let opts = Opts::parse();
  • replacement in pijul/src/main.rs at line 186
    [4.423][4.520:586](),[4.586][4.487:551](),[4.487][4.487:551](),[4.551][4.587:642](),[4.642][4.551:621](),[4.551][4.551:621](),[4.621][3.0:231](),[3.231][4.792:854](),[4.792][4.792:854](),[4.854][4.621:748](),[4.621][4.621:748](),[4.748][2.0:56](),[2.56][4.748:826](),[4.748][4.748:826]()
    fn external_command() -> Result<bool, (String, std::io::Error)> {
    let mut cmd = String::new();
    let mut args = Vec::new();
    use clap::IntoApp;
    let app = Opts::into_app();
    for arg in std::env::args().skip(1) {
    if cmd.is_empty() {
    if arg == "help"
    || arg.starts_with("--")
    || app
    .get_subcommands()
    .any(|sub| sub.get_name() == arg || sub.get_all_aliases().any(|al| al == arg))
    {
    return Ok(false);
    }
    cmd.push_str("pijul-");
    cmd.push_str(&arg)
    } else {
    args.push(arg)
    }
    }
    if cmd.is_empty() {
    return Ok(false);
    }
    if let Err(e) = run_external_command(&cmd, &args) {
    Err((cmd, e))
    [4.423]
    [4.826]
    if let Err(e) = run(opts).await {
    writeln!(std::io::stderr(), "Error: {}", e).unwrap_or(());
    std::process::exit(1);
  • replacement in pijul/src/main.rs at line 190
    [4.839][4.855:872]()
    Ok(true)
    [4.839]
    [4.854]
    std::process::exit(0);
  • replacement in pijul/src/main.rs at line 195
    [4.876][4.876:960]()
    fn run_external_command(cmd: &str, args: &[String]) -> Result<(), std::io::Error> {
    [4.876]
    [4.960]
    fn run_external_command(mut command: Vec<OsString>) -> Result<(), std::io::Error> {
    let args = command.split_off(1);
    let cmd = &command[0];
  • replacement in pijul/src/main.rs at line 204
    [4.1082][4.1082:1166]()
    fn run_external_command(cmd: &str, args: &[String]) -> Result<(), std::io::Error> {
    [4.1082]
    [4.1166]
    fn run_external_command(mut command: Vec<OsString>) -> Result<(), std::io::Error> {
    let args = command.split_off(1);
    let cmd = &command[0];
  • edit in pijul/src/main.rs at line 241
    [4.89705]
    [4.89705]
    SubCommand::ExternalSubcommand(command) => Ok(run_external_command(command)?),