ok/jj
1
0
Fork 0
forked from mirrors/jj

refs: error out push if non-tracking remote branches exist

We can provide more actionable error message than "not fast-forwardable". If
the push was fast-forwardable, "jj branch track" should be able to merge the
remote branch without conflicts, so the added step would be minimal.
This commit is contained in:
Yuya Nishihara 2023-10-16 02:43:45 +09:00
parent 089503abfb
commit 9e0b9e6dc8
4 changed files with 17 additions and 11 deletions

View file

@ -38,6 +38,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
See [automatic local branch creation](docs/config.md#automatic-local-branch-creation)
for details.
* It's not allowed to push branches if non-tracking remote branches of the same
name exist.
* Pushing deleted/moved branches no longer abandons the local commits referenced
by the remote branches.

View file

@ -1018,6 +1018,9 @@ fn classify_branch_update(
BranchPushAction::RemoteConflicted => {
Err(format!("Branch {branch_name}@{remote_name} is conflicted"))
}
BranchPushAction::RemoteUntracked => Err(format!(
"Non-tracking remote branch {branch_name}@{remote_name} exists"
)),
BranchPushAction::Update(update) => Ok(Some(update)),
}
}

View file

@ -741,8 +741,8 @@ fn test_git_push_moved_forward_untracked() {
test_env.jj_cmd_ok(&workspace_root, &["branch", "untrack", "branch1@origin"]);
let (_stdout, stderr) = test_env.jj_cmd_ok(&workspace_root, &["git", "push"]);
insta::assert_snapshot!(stderr, @r###"
Branch changes to push to origin:
Add branch branch1 to a25f24af0d0e
Non-tracking remote branch branch1@origin exists
Nothing changed.
"###);
}
@ -756,12 +756,10 @@ fn test_git_push_moved_sideways_untracked() {
&["branch", "set", "--allow-backwards", "branch1"],
);
test_env.jj_cmd_ok(&workspace_root, &["branch", "untrack", "branch1@origin"]);
let stderr = test_env.jj_cmd_failure(&workspace_root, &["git", "push"]);
let (_stdout, stderr) = test_env.jj_cmd_ok(&workspace_root, &["git", "push"]);
insta::assert_snapshot!(stderr, @r###"
Branch changes to push to origin:
Add branch branch1 to cfbae7608334
Error: The push conflicts with changes made on the remote (it is not fast-forwardable).
Hint: Try fetching from the remote, then make the branch point to where you want it to be, and push again.
Non-tracking remote branch branch1@origin exists
Nothing changed.
"###);
}

View file

@ -132,6 +132,7 @@ pub enum BranchPushAction {
AlreadyMatches,
LocalConflicted,
RemoteConflicted,
RemoteUntracked,
}
/// Figure out what changes (if any) need to be made to the remote when pushing
@ -145,6 +146,8 @@ pub fn classify_branch_push_action(targets: TrackingRefPair) -> BranchPushAction
BranchPushAction::LocalConflicted
} else if remote_target.has_conflict() {
BranchPushAction::RemoteConflicted
} else if targets.remote_ref.is_present() && !targets.remote_ref.is_tracking() {
BranchPushAction::RemoteUntracked
} else {
BranchPushAction::Update(BranchPushUpdate {
old_target: remote_target.as_normal().cloned(),
@ -237,6 +240,8 @@ mod tests {
#[test]
fn test_classify_branch_push_action_removed_untracked() {
// This is not RemoteUntracked error since non-tracking remote branches
// have no relation to local branches, and there's nothing to push.
let commit_id1 = CommitId::from_hex("11");
let targets = TrackingRefPair {
local_target: RefTarget::absent_ref(),
@ -258,10 +263,7 @@ mod tests {
};
assert_eq!(
classify_branch_push_action(targets),
BranchPushAction::Update(BranchPushUpdate {
old_target: None,
new_target: Some(commit_id2),
})
BranchPushAction::RemoteUntracked
);
}