diff --git a/src/main.rs b/src/main.rs index d127b09a84b9573056d2a02156bdb8f3155c48b3..3ca6696b248f62b38a65c30df2c6506c2f2209ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -200,9 +200,15 @@ impl<'repo> Internals<'repo> { for prefix in [SERIES_PREFIX, STAGED_PREFIX, WORKING_PREFIX].iter() { let prefixed_source = format!("{}{}", prefix, source); if let Some(r) = notfound_to_none(repo.find_reference(&prefixed_source))? { - let oid = r.target().ok_or(format!("Internal error: \"{}\" is a symbolic reference", prefixed_source))?; + let oid = r.target() + .ok_or(format!("Internal error: \"{}\" is a symbolic reference", prefixed_source))?; let prefixed_dest = format!("{}{}", prefix, dest); - repo.reference(&prefixed_dest, oid, false, &format!("copied from {}", prefixed_source))?; + repo.reference( + &prefixed_dest, + oid, + false, + &format!("copied from {}", prefixed_source), + )?; copied_any = true; } } @@ -258,7 +264,14 @@ impl<'repo> Internals<'repo> { let parents_ref: Vec<&_> = parents.iter().collect(); let commit_id = repo.commit(None, &author, &committer, &refname, &tree, &parents_ref)?; repo.reference_ensure_log(&refname)?; - reference_matching_opt(repo, &refname, commit_id, true, old_commit_id, &format!("commit: {}", refname))?; + reference_matching_opt( + repo, + &refname, + commit_id, + true, + old_commit_id, + &format!("commit: {}", refname), + )?; Ok(()) }; maybe_commit(STAGED_PREFIX, &self.staged)?; @@ -275,7 +288,9 @@ fn add(repo: &Repository, m: &ArgMatches) -> Result<()> { let mut internals = Internals::read(repo)?; for file in m.values_of_os("change").unwrap() { match internals.working.get(file)? { - Some(entry) => { internals.staged.insert(file, entry.id(), entry.filemode())?; } + Some(entry) => { + internals.staged.insert(file, entry.id(), entry.filemode())?; + } None => { if internals.staged.get(file)?.is_some() { internals.staged.remove(file)?; @@ -303,7 +318,9 @@ fn unadd(repo: &Repository, m: &ArgMatches) -> Result<()> { Some(entry) => { internals.staged.insert(file, entry.id(), entry.filemode())?; } - None => { internals.staged.remove(file)?; } + None => { + internals.staged.remove(file)?; + } } } } else { @@ -372,13 +389,23 @@ fn start(repo: &Repository, m: &ArgMatches) -> Result<()> { return Err(format!("Series {} already exists.\nUse checkout to resume working on an existing patch series.", name).into()); } let prefixed_name = &[SERIES_PREFIX, name].concat(); - repo.reference_symbolic(SHEAD_REF, &prefixed_name, true, &format!("git series start {}", name))?; + repo.reference_symbolic( + SHEAD_REF, + &prefixed_name, + true, + &format!("git series start {}", name), + )?; let internals = Internals::read(repo)?; internals.write(repo)?; // git status parses this reflog string; the prefix must remain "checkout: moving from ". - repo.reference("HEAD", head_id, true, &format!("checkout: moving from {} to {} (git series start {})", head_id, head_id, name))?; + repo.reference( + "HEAD", + head_id, + true, + &format!("checkout: moving from {} to {} (git series start {})", head_id, head_id, name), + )?; println!("HEAD is now detached at {}", commit_summarize(&repo, head_id)?); Ok(()) } @@ -432,7 +459,7 @@ fn checkout_tree(repo: &Repository, treeish: &Object) -> Result<()> { fn checkout(repo: &Repository, m: &ArgMatches) -> Result<()> { match repo.state() { git2::RepositoryState::Clean => (), - s => { return Err(format!("{:?} in progress; cannot checkout patch series", s).into()); } + s => return Err(format!("{:?} in progress; cannot checkout patch series", s).into()), } let name = m.value_of("name").unwrap(); if !Internals::exists(repo, name)? { @@ -440,7 +467,9 @@ fn checkout(repo: &Repository, m: &ArgMatches) -> Result<()> { } let internals = Internals::read_series(repo, name)?; - let new_head_id = internals.working.get("series")?.ok_or(format!("Could not find \"series\" in \"{}\"", name))?.id(); + let new_head_id = internals.working.get("series")? + .ok_or(format!("Could not find \"series\" in \"{}\"", name))? + .id(); let new_head = repo.find_commit(new_head_id)?.into_object(); checkout_tree(repo, &new_head)?; @@ -451,11 +480,21 @@ fn checkout(repo: &Repository, m: &ArgMatches) -> Result<()> { println!("Previous HEAD position was {}", commit_summarize(&repo, head_id)?); let prefixed_name = &[SERIES_PREFIX, name].concat(); - repo.reference_symbolic(SHEAD_REF, &prefixed_name, true, &format!("git series checkout {}", name))?; + repo.reference_symbolic( + SHEAD_REF, + &prefixed_name, + true, + &format!("git series checkout {}", name), + )?; internals.write(repo)?; // git status parses this reflog string; the prefix must remain "checkout: moving from ". - repo.reference("HEAD", new_head_id, true, &format!("checkout: moving from {} to {} (git series checkout {})", head_id, new_head_id, name))?; + repo.reference( + "HEAD", + new_head_id, + true, + &format!("checkout: moving from {} to {} (git series checkout {})", head_id, new_head_id, name), + )?; println!("HEAD is now detached at {}", commit_summarize(&repo, new_head_id)?); Ok(()) @@ -485,9 +524,16 @@ fn base(repo: &Repository, m: &ArgMatches) -> Result<()> { let base_object = repo.revparse_single(base)?; let base_commit = base_object.peel(ObjectType::Commit)?; let base_id = base_commit.id(); - let s_working_series = internals.working.get("series")?.ok_or("Could not find entry \"series\" in working vesion of current series")?; - if base_id != s_working_series.id() && !repo.graph_descendant_of(s_working_series.id(), base_id)? { - return Err(format!("Cannot set base to {}: not an ancestor of the patch series {}", base, s_working_series.id()).into()); + let s_working_series = internals.working.get("series")? + .ok_or("Could not find entry \"series\" in working vesion of current series")?; + if base_id != s_working_series.id() + && !repo.graph_descendant_of(s_working_series.id(), base_id)? + { + return Err(format!( + "Cannot set base to {}: not an ancestor of the patch series {}", + base, + s_working_series.id(), + ).into()); } base_id }; @@ -517,7 +563,7 @@ fn base(repo: &Repository, m: &ArgMatches) -> Result<()> { fn detach(repo: &Repository) -> Result<()> { match repo.find_reference(SHEAD_REF) { Ok(mut r) => r.delete()?, - Err(_) => { return Err("No current patch series to detach from.".into()); } + Err(_) => return Err("No current patch series to detach from.".into()), } Ok(()) } @@ -527,7 +573,10 @@ fn delete(repo: &Repository, m: &ArgMatches) -> Result<()> { if let Ok(shead) = repo.find_reference(SHEAD_REF) { let shead_target = shead_series_name(&shead)?; if shead_target == name { - return Err(format!("Cannot delete the current series \"{}\"; detach first.", name).into()); + return Err(format!( + "Cannot delete the current series \"{}\"; detach first.", + name, + ).into()); } } if Internals::delete(repo, name)? == false { @@ -593,18 +642,17 @@ fn get_pager(config: &Config, for_cmd: &str, default: bool) -> Option if !cmd_want_pager { return None; } - let pager = - if let Some(e) = env::var_os("GIT_PAGER") { - Some(e) - } else if let Some(p) = cmd_pager { - Some(p.into()) - } else if let Ok(e) = config.get_path("core.pager") { - Some(e.into()) - } else if let Some(e) = env::var_os("PAGER") { - Some(e) - } else { - Some("less".into()) - }; + let pager = if let Some(e) = env::var_os("GIT_PAGER") { + Some(e) + } else if let Some(p) = cmd_pager { + Some(p.into()) + } else if let Ok(e) = config.get_path("core.pager") { + Some(e.into()) + } else if let Some(e) = env::var_os("PAGER") { + Some(e) + } else { + Some("less".into()) + }; pager.and_then(|p| if p.is_empty() || p == "cat" { None } else { Some(p) }) } @@ -668,7 +716,13 @@ impl Output { // command: the git command to act like. // slot: the color "slot" of that git command to act like. // default: the color to use if not configured. - fn get_color(&self, config: &Config, command: &str, slot: &str, default: &str) -> Result