mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-20 03:20:08 +00:00
cli: branch: restore is_fast_forward() function
This basically backs out 8706fadca1
"cli: inline check for
non-fast-forwardable branch move." I'm going to add another subcommand that
moves existing branches.
This commit is contained in:
parent
3b447703e5
commit
b52b0646c2
1 changed files with 14 additions and 8 deletions
|
@ -18,6 +18,7 @@ use std::io::Write as _;
|
||||||
|
|
||||||
use clap::builder::NonEmptyStringValueParser;
|
use clap::builder::NonEmptyStringValueParser;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
use jj_lib::backend::CommitId;
|
||||||
use jj_lib::git;
|
use jj_lib::git;
|
||||||
use jj_lib::object_id::ObjectId;
|
use jj_lib::object_id::ObjectId;
|
||||||
use jj_lib::op_store::{RefTarget, RemoteRef};
|
use jj_lib::op_store::{RefTarget, RemoteRef};
|
||||||
|
@ -349,13 +350,6 @@ fn cmd_branch_set(
|
||||||
let target_commit =
|
let target_commit =
|
||||||
workspace_command.resolve_single_rev(args.revision.as_ref().unwrap_or(&RevisionArg::AT))?;
|
workspace_command.resolve_single_rev(args.revision.as_ref().unwrap_or(&RevisionArg::AT))?;
|
||||||
let repo = workspace_command.repo().as_ref();
|
let repo = workspace_command.repo().as_ref();
|
||||||
let is_fast_forward = |old_target: &RefTarget| {
|
|
||||||
// Strictly speaking, "all" old targets should be ancestors, but we allow
|
|
||||||
// conflict resolution by setting branch to "any" of the old target descendants.
|
|
||||||
old_target
|
|
||||||
.added_ids()
|
|
||||||
.any(|old| repo.index().is_ancestor(old, target_commit.id()))
|
|
||||||
};
|
|
||||||
let branch_names = &args.names;
|
let branch_names = &args.names;
|
||||||
for name in branch_names {
|
for name in branch_names {
|
||||||
let old_target = repo.view().get_local_branch(name);
|
let old_target = repo.view().get_local_branch(name);
|
||||||
|
@ -365,7 +359,7 @@ fn cmd_branch_set(
|
||||||
"Use `jj branch create` to create it.",
|
"Use `jj branch create` to create it.",
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if !args.allow_backwards && !is_fast_forward(old_target) {
|
if !args.allow_backwards && !is_fast_forward(repo, old_target, target_commit.id()) {
|
||||||
return Err(user_error_with_hint(
|
return Err(user_error_with_hint(
|
||||||
format!("Refusing to move branch backwards or sideways: {name}"),
|
format!("Refusing to move branch backwards or sideways: {name}"),
|
||||||
"Use --allow-backwards to allow it.",
|
"Use --allow-backwards to allow it.",
|
||||||
|
@ -783,3 +777,15 @@ fn cmd_branch_list(
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_fast_forward(repo: &dyn Repo, old_target: &RefTarget, new_target_id: &CommitId) -> bool {
|
||||||
|
if old_target.is_present() {
|
||||||
|
// Strictly speaking, "all" old targets should be ancestors, but we allow
|
||||||
|
// conflict resolution by setting branch to "any" of the old target descendants.
|
||||||
|
old_target
|
||||||
|
.added_ids()
|
||||||
|
.any(|old| repo.index().is_ancestor(old, new_target_id))
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue