diff --git a/cli/src/cli_util.rs b/cli/src/cli_util.rs index c73ac8e141f..ac1da07790f 100644 --- a/cli/src/cli_util.rs +++ b/cli/src/cli_util.rs @@ -51,9 +51,9 @@ use jj_lib::repo::{ }; use jj_lib::repo_path::{FsPathParseError, RepoPath}; use jj_lib::revset::{ - DefaultSymbolResolver, Revset, RevsetAliasesMap, RevsetEvaluationError, RevsetExpression, - RevsetIteratorExt, RevsetParseContext, RevsetParseError, RevsetParseErrorKind, - RevsetResolutionError, RevsetWorkspaceContext, + DefaultSymbolResolver, Revset, RevsetAliasesMap, RevsetCommitRef, RevsetEvaluationError, + RevsetExpression, RevsetIteratorExt, RevsetParseContext, RevsetParseError, + RevsetParseErrorKind, RevsetResolutionError, RevsetWorkspaceContext, }; use jj_lib::settings::{ConfigResultExt as _, UserSettings}; use jj_lib::transaction::Transaction; @@ -1006,6 +1006,14 @@ impl WorkspaceCommandHelper { ui: &mut Ui, ) -> Result { let revset_expression = self.parse_revset(revision_str, Some(ui))?; + let branch: Option = + if let RevsetExpression::CommitRef(RevsetCommitRef::Symbol(ref branch_name)) = + *revset_expression + { + Some(branch_name.clone()) + } else { + None + }; let revset = self.evaluate_revset(revset_expression)?; let mut iter = revset.iter().commits(self.repo().store()).fuse(); match (iter.next(), iter.next()) { @@ -1017,15 +1025,29 @@ impl WorkspaceCommandHelper { let mut iter = [commit0, commit1].into_iter().chain(iter); let commits: Vec<_> = iter.by_ref().take(5).try_collect()?; let elided = iter.next().is_some(); - let hint = format!( - r#"The revset "{revision_str}" resolved to these revisions:{eol}{commits}{ellipsis}"#, - eol = "\n", - commits = commits - .iter() - .map(|c| self.format_commit_summary(c)) - .join("\n"), - ellipsis = elided.then_some("\n...").unwrap_or_default() - ); + // Separate hint if the conflict is due to a branch conflict + let hint = if let Some(branch_name) = branch { + format!( + r#"The revset "{revision_str}" resolved to these revisions:{eol}{commits}{ellipsis} +This error is due to a conflicted branch. To resolve this, try setting to which revision the branch points to with "jj branch set {branch_name} --revision ""#, + eol = "\n", + commits = commits + .iter() + .map(|c| self.format_commit_summary(c)) + .join("\n"), + ellipsis = elided.then_some("\n...").unwrap_or_default() + ) + } else { + format!( + r#"The revset "{revision_str}" resolved to these revisions:{eol}{commits}{ellipsis}"#, + eol = "\n", + commits = commits + .iter() + .map(|c| self.format_commit_summary(c)) + .join("\n"), + ellipsis = elided.then_some("\n...").unwrap_or_default() + ) + }; Err(user_error_with_hint( format!(r#"Revset "{revision_str}" resolved to more than one revision"#), hint,