From 1de296978ede8d92666779a263748c94bf2f9df0 Mon Sep 17 00:00:00 2001 From: Austin Seipp Date: Sat, 29 Jun 2024 18:44:09 -0500 Subject: [PATCH] git: add `git.colocate` to colocate repos by default Closes #2507. Signed-off-by: Austin Seipp --- CHANGELOG.md | 6 ++++++ cli/src/commands/git/clone.rs | 13 +++++++++++-- cli/src/commands/git/init.rs | 18 +++++++++++------- cli/src/config-schema.json | 5 +++++ cli/tests/cli-reference@.md.snap | 2 ++ docs/config.md | 13 +++++++++++++ lib/src/settings.rs | 3 +++ 7 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b28c2fffe1..d23cf32a53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 commits with no description) if authored by the current user. [#2000](https://github.com/martinvonz/jj/issues/2000) +* The new configuration option `git.colocate=boolean` controls whether or not + Git repositories are colocated by default. + +* Both `jj git clone` and `jj git init` now take a `--no-colocate` flag to + disable colocation (in case `git.colocate` is set to `true`.) + ### Fixed bugs * `jj git push` now ignores immutable commits when checking whether a diff --git a/cli/src/commands/git/clone.rs b/cli/src/commands/git/clone.rs index edef604b5c..d321f9eb14 100644 --- a/cli/src/commands/git/clone.rs +++ b/cli/src/commands/git/clone.rs @@ -41,6 +41,9 @@ pub struct GitCloneArgs { /// Whether or not to colocate the Jujutsu repo with the git repo #[arg(long)] colocate: bool, + /// Disable colocation of the Jujutsu repo with the git repo + #[arg(long, conflicts_with = "colocate")] + no_colocate: bool, } fn absolute_git_source(cwd: &Path, source: &str) -> String { @@ -105,6 +108,12 @@ pub fn cmd_git_clone( )); } + let colocate = if command.settings().git_settings().colocate { + !args.no_colocate + } else { + args.colocate + }; + // Canonicalize because fs::remove_dir_all() doesn't seem to like e.g. // `/some/path/.` let canonical_wc_path: PathBuf = wc_path @@ -113,7 +122,7 @@ pub fn cmd_git_clone( let clone_result = do_git_clone( ui, command, - args.colocate, + colocate, remote_name, &source, &canonical_wc_path, @@ -121,7 +130,7 @@ pub fn cmd_git_clone( if clone_result.is_err() { let clean_up_dirs = || -> io::Result<()> { fs::remove_dir_all(canonical_wc_path.join(".jj"))?; - if args.colocate { + if colocate { fs::remove_dir_all(canonical_wc_path.join(".git"))?; } if !wc_path_existed { diff --git a/cli/src/commands/git/init.rs b/cli/src/commands/git/init.rs index 2d0257e1b3..ef900b3269 100644 --- a/cli/src/commands/git/init.rs +++ b/cli/src/commands/git/init.rs @@ -51,6 +51,10 @@ pub struct GitInitArgs { #[arg(long, conflicts_with = "git_repo")] colocate: bool, + /// Disable colocation of the Jujutsu repo with the git repo + #[arg(long, conflicts_with = "colocate")] + no_colocate: bool, + /// Specifies a path to an **existing** git repository to be /// used as the backing git repo for the newly created `jj` repo. /// @@ -75,13 +79,13 @@ pub fn cmd_git_init( .and_then(|_| wc_path.canonicalize()) .map_err(|e| user_error_with_message("Failed to create workspace", e))?; - do_init( - ui, - command, - &wc_path, - args.colocate, - args.git_repo.as_deref(), - )?; + let colocate = if command.settings().git_settings().colocate { + !args.no_colocate + } else { + args.colocate + }; + + do_init(ui, command, &wc_path, colocate, args.git_repo.as_deref())?; let relative_wc_path = file_util::relative_path(cwd, &wc_path); writeln!( diff --git a/cli/src/config-schema.json b/cli/src/config-schema.json index 5fb08e129f..ffddb77689 100644 --- a/cli/src/config-schema.json +++ b/cli/src/config-schema.json @@ -314,6 +314,11 @@ "type": "string", "description": "The remote to which commits are pushed", "default": "origin" + }, + "colocate": { + "type": "boolean", + "description": "Whether to colocate the working copy with the git repository", + "default": false } } }, diff --git a/cli/tests/cli-reference@.md.snap b/cli/tests/cli-reference@.md.snap index 516da42ffa..bc8cbc79ee 100644 --- a/cli/tests/cli-reference@.md.snap +++ b/cli/tests/cli-reference@.md.snap @@ -838,6 +838,7 @@ The Git repo will be a bare git repo stored inside the `.jj/` directory. ###### **Options:** * `--colocate` — Whether or not to colocate the Jujutsu repo with the git repo +* `--no-colocate` — Disable colocation of the Jujutsu repo with the git repo @@ -900,6 +901,7 @@ Create a new Git backed repo This is done by placing the backing git repo into a `.git` directory in the root of the `jj` repo along with the `.jj` directory. If the `.git` directory already exists, all the existing commits will be imported. This option is mutually exclusive with `--git-repo`. +* `--no-colocate` — Disable colocation of the Jujutsu repo with the git repo * `--git-repo ` — Specifies a path to an **existing** git repository to be used as the backing git repo for the newly created `jj` repo. If the specified `--git-repo` path happens to be the same as the `jj` repo path (both .jj and .git directories are in the same working directory), then both `jj` and `git` commands will work on the same repo. This is called a co-located repo. diff --git a/docs/config.md b/docs/config.md index 72411f0d0e..cf74339710 100644 --- a/docs/config.md +++ b/docs/config.md @@ -720,6 +720,19 @@ signing.backends.ssh.allowed-signers = "/path/to/allowed-signers" ## Git settings +### Default colocation + +When creating a git-backed Jujutsu repository, you can enable "colocation" which +places the `.git` directory next to the `.jj` directory, allowing some amount of +two-way interoperability. + +The setting `git.colocate` is a boolean option that controls whether or not the +`jj git init` and `jj git clone` commands should create colocated repositories +by default. By default, `git.colocate` is set to `false`. + +See [Co-located Jujutsu/Git repos](./ +git-compatibility.md#co-located-jujutsugit-repos) for more information. + ### Default remotes for `jj git fetch` and `jj git push` By default, if a single remote exists it is used for `jj git fetch` and `jj git diff --git a/lib/src/settings.rs b/lib/src/settings.rs index c0a17ef3b2..3d70cefbf5 100644 --- a/lib/src/settings.rs +++ b/lib/src/settings.rs @@ -42,6 +42,7 @@ pub struct RepoSettings { pub struct GitSettings { pub auto_local_branch: bool, pub abandon_unreachable_commits: bool, + pub colocate: bool, } impl GitSettings { @@ -51,6 +52,7 @@ impl GitSettings { abandon_unreachable_commits: config .get_bool("git.abandon-unreachable-commits") .unwrap_or(true), + colocate: config.get_bool("git.colocate").unwrap_or(false), } } } @@ -60,6 +62,7 @@ impl Default for GitSettings { GitSettings { auto_local_branch: false, abandon_unreachable_commits: true, + colocate: false, } } }