mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-18 18:27:38 +00:00
revset: allow checking out git-tracking (@git
) branches
This commit is contained in:
parent
d5e8896d1b
commit
a483252cf2
4 changed files with 61 additions and 2 deletions
|
@ -102,8 +102,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
setting the `revsets.short-prefixes` config to a different revset.
|
setting the `revsets.short-prefixes` config to a different revset.
|
||||||
|
|
||||||
* The last seen state of branches in the underlying git repo is now presented by
|
* The last seen state of branches in the underlying git repo is now presented by
|
||||||
`jj branch list` as a remote called `git` (e.g. `main@git`). Such branches
|
`jj branch list` as a remote called `git` (e.g. `main@git`). They can also be
|
||||||
exist in colocated repos or if you use `jj git export`.
|
referenced in revsets. Such branches exist in colocated repos or if you use
|
||||||
|
`jj git export`.
|
||||||
|
|
||||||
### Fixed bugs
|
### Fixed bugs
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,10 @@ pub fn git_tracking_branches(view: &View) -> impl Iterator<Item = (&str, &RefTar
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_git_tracking_branch<'a>(view: &'a View, branch: &str) -> Option<&'a RefTarget> {
|
||||||
|
view.git_refs().get(&local_branch_name_to_ref_name(branch))
|
||||||
|
}
|
||||||
|
|
||||||
fn prevent_gc(git_repo: &git2::Repository, id: &CommitId) -> Result<(), git2::Error> {
|
fn prevent_gc(git_repo: &git2::Repository, id: &CommitId) -> Result<(), git2::Error> {
|
||||||
// If multiple processes do git::import_refs() in parallel, this can fail to
|
// If multiple processes do git::import_refs() in parallel, this can fail to
|
||||||
// acquire a lock file even with force=true.
|
// acquire a lock file even with force=true.
|
||||||
|
|
|
@ -31,6 +31,7 @@ use thiserror::Error;
|
||||||
|
|
||||||
use crate::backend::{BackendError, BackendResult, ChangeId, CommitId, ObjectId};
|
use crate::backend::{BackendError, BackendResult, ChangeId, CommitId, ObjectId};
|
||||||
use crate::commit::Commit;
|
use crate::commit::Commit;
|
||||||
|
use crate::git::get_git_tracking_branch;
|
||||||
use crate::hex_util::to_forward_hex;
|
use crate::hex_util::to_forward_hex;
|
||||||
use crate::index::{HexPrefix, PrefixResolution};
|
use crate::index::{HexPrefix, PrefixResolution};
|
||||||
use crate::op_store::WorkspaceId;
|
use crate::op_store::WorkspaceId;
|
||||||
|
@ -1640,6 +1641,12 @@ fn resolve_branch(repo: &dyn Repo, symbol: &str) -> Option<Vec<CommitId>> {
|
||||||
return Some(target.adds());
|
return Some(target.adds());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// A remote with name "git" will shadow local-git tracking branches
|
||||||
|
if remote_name == "git" {
|
||||||
|
if let Some(target) = get_git_tracking_branch(repo.view(), name) {
|
||||||
|
return Some(target.adds());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,53 @@ use crate::common::{get_stderr_string, TestEnvironment};
|
||||||
|
|
||||||
pub mod common;
|
pub mod common;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_resolution_of_git_tracking_branches() {
|
||||||
|
let test_env = TestEnvironment::default();
|
||||||
|
test_env.jj_cmd_success(test_env.env_root(), &["init", "repo", "--git"]);
|
||||||
|
let repo_path = test_env.env_root().join("repo");
|
||||||
|
test_env.jj_cmd_success(&repo_path, &["branch", "create", "main"]);
|
||||||
|
test_env.jj_cmd_success(&repo_path, &["describe", "-r", "main", "-m", "old_message"]);
|
||||||
|
|
||||||
|
// Create local-git tracking branch
|
||||||
|
let stdout = test_env.jj_cmd_success(&repo_path, &["git", "export"]);
|
||||||
|
insta::assert_snapshot!(stdout, @"");
|
||||||
|
// Move the local branch somewhere else
|
||||||
|
test_env.jj_cmd_success(&repo_path, &["describe", "-r", "main", "-m", "new_message"]);
|
||||||
|
insta::assert_snapshot!(get_branch_output(&test_env, &repo_path), @r###"
|
||||||
|
main: 3af370264cdc new_message
|
||||||
|
@git (ahead by 1 commits, behind by 1 commits): 16d541ca40f4 old_message
|
||||||
|
"###);
|
||||||
|
|
||||||
|
// Test that we can address both revisions
|
||||||
|
let stdout = test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&[
|
||||||
|
"log",
|
||||||
|
"-r=main",
|
||||||
|
"-T",
|
||||||
|
r#"commit_id ++ " " ++ description"#,
|
||||||
|
"--no-graph",
|
||||||
|
],
|
||||||
|
);
|
||||||
|
insta::assert_snapshot!(stdout, @r###"
|
||||||
|
3af370264cdcbba791762f8ef6bc79b456dcbf3b new_message
|
||||||
|
"###);
|
||||||
|
let stdout = test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&[
|
||||||
|
"log",
|
||||||
|
"-r=main@git",
|
||||||
|
"-T",
|
||||||
|
r#"commit_id ++ " " ++ description"#,
|
||||||
|
"--no-graph",
|
||||||
|
],
|
||||||
|
);
|
||||||
|
insta::assert_snapshot!(stdout, @r###"
|
||||||
|
16d541ca40f42baf2dea41aa61a0b5f1cbf1f91b old_message
|
||||||
|
"###);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_git_export_conflicting_git_refs() {
|
fn test_git_export_conflicting_git_refs() {
|
||||||
let test_env = TestEnvironment::default();
|
let test_env = TestEnvironment::default();
|
||||||
|
|
Loading…
Reference in a new issue