Commit graph

429 commits

Author SHA1 Message Date
Ilya Grigoriev
3967f637dc cli rebase: do not allow -r --skip-empty to drop emptied descendants
This follows up on @matts1 's #2609.

We still allow the `-r` commit to become empty. I would be more comfortable if
there was a test for that, but I haven't done that (yet?) and it seems pretty
safe. If that's a problem, I'm happy to forbid `-r --skip-empty` entirely,
since it is far less useful than `-s --skip-empty` or `-b --skip-empty`.

I think it is undesired to abandon emptied descendants. As far as descendants
of `A` are concerned, `jj rebase -r A` should be equivalent to `jj abandon A`,
and `jj abandon` does not remove emptied commits. It also doesn't seem very
useful to do that, since I think descendant commits of an abandoned (or moved
with `-r`) commit only become empty in pathological cases.

Additionally, if we did want -r to empty descendants of `A`, we'd have to add
thorough tests and possibly improve the algorithm. I want to refactor `rebase
-r` and add features to it, and having to consider cases of commits becoming
abandoned makes everything harder.

For example, if we have

```
root -> A -> B -> C
```

and `jj rebase -r A -d C` empties commit `B` (or `C`), I do not know whether
the current algorithm will work correctly. It seems possible that it would, but
that depends on the fact that empty merge commits are not abandoned for
descendants. That seems dangerous to rely on without tests.

I hope (but can't promise) that in the near future, making DescendantRebaser
return more information  should help make it possible to create such
functionality in a more robust way. I am likely to attempt this as part of
implementing `-r --after`.
2023-11-26 10:56:58 -08:00
Philip Metzger
c78425cf65 run: Fix up various things.
Adress the post-merge comments from #2486, which found a doc comment
inaccurate and to not blindly ignore `-j 0` which would've worked until now.
I've also reduced the default `jobs` size to one, as it's user-visible configuration
which determines how many processes should run.

Thanks to @necauqua the controversial `unsafe` usage was already removed.

I've omitted to change `revisions` from an Vec to a RevisonArg for the moment, 
as I will keep working on the file anyway.
2023-11-26 15:13:41 +01:00
Yuya Nishihara
4f2503cbce cli: show hint of non-tracking remote branches on "jj init --git-repo"
If the existing git repo contains local and remote branches of the same name,
one of the remote branches is probably a tracking remote branch. Let's show
a hint how to set up tracking branches. The tracking state could be derived
from .git/config, but doing that automatically might cause another issue like
#1862, which could have been mitigated by git.auto-local-branch = false.
2023-11-25 16:46:10 +09:00
Martin von Zweigbergk
550164209c revset: add a RevsetExpression::evaluate_programmatic()
We often resolve a programmatic revset and then immediately evaluate
it. This patch adds a convenience method for those two steps.
2023-11-24 21:13:58 -10:00
Martin von Zweigbergk
f2602f78cf revset: make resolve_programmatic() not return a Result
I think it's always a programming error if `resolve_programmatic()`
returns a `Result`, so it shouldn't have to return a `Result`.
2023-11-24 21:13:58 -10:00
Martin von Zweigbergk
f27f52984e revset: rename resolve() to resolve_programmatic()
`RevsetExpression::resolve()` is meant for programmatically created
expressions. In particular, it may not contain symbols. Let's try to
clarify that by renaming the function and documenting it.
2023-11-24 21:13:58 -10:00
Matt Stark
e79c8b6f62 cli: Add a --skip-empty flag to rebase 2023-11-24 14:48:06 +11:00
Matt Stark
0a95e20ebe lib: Implement skipping of empty commits 2023-11-24 14:48:06 +11:00
Ilya Grigoriev
811ac5ff23 cli new: have --no-edit print description of the new commit 2023-11-23 11:15:38 -08:00
Ilya Grigoriev
e33f57a0f5 cli new: add --no-edit option
This allows, for example, creating a merge commit with `jj new a b --no-edit -m Merge`, without
affecting the working copy.
2023-11-23 11:15:38 -08:00
Ilya Grigoriev
aa08de30c7 cli new: Make -r, --before, and --after repeatable
Repeating these is a no-op. This allows:

```shell
jj new -r a -r b # Equivalent to jj new a b
jj new --before a --before b  # Equivalent to jj new a b --before
```

I keep typing the latter and getting an annoying error.
2023-11-23 11:15:38 -08:00
Ilya Grigoriev
ea22f90018 cli editor and pager: Add a comment
Follows up on 13c93d5270.

The information I added is explained in that commit's description, but
I feel like it could reduce confusion for future readers of the code.
2023-11-22 23:36:16 -08:00
Yuya Nishihara
13c93d5270 cli: show executable name in error message, include underlying error details
Since this is the error to spawn (or wait) process, command arguments aren't
important. Let's make that clear by not showing full command string.

#2614
2023-11-23 10:05:45 +09:00
Yuya Nishihara
31def4b131 cleanup: don't use debug format to print source errors 2023-11-23 10:05:37 +09:00
Ilya Grigoriev
d8df36b9a2 cli diff help: add detailed explanation of -r merge_commit 2023-11-20 20:40:01 -08:00
Ilya Grigoriev
e3852ffd55 cli diff: add short description to jj help and jj diff -h 2023-11-20 20:40:01 -08:00
Łukasz Kurowski
e21ffb0139 merge_tools: use left_file_mode in make_diff_files
The `scm-record` library comments say that the `file_mode` is:
> The Unix file mode of the file (before any changes), if available.

This reverts commit ffd6884 and fixes #2591 and #2548.
2023-11-19 22:41:23 +01:00
Ilya Grigoriev
0357915778 cli: move make_branch_term out of commands/mod.rs
It is now out of place in mod.rs. It is only used in two places, so
I copied it to each of them.

Follows up on @AntoineCezar 's work.
2023-11-18 12:21:36 -08:00
Ilya Grigoriev
af81cbd942 cli: make dummy revert command accept any arguments
Before, `jj revert qq` would say that `qq` is an extraneous argument.
Now, it says "Error: No such subcommand: revert".
2023-11-18 10:25:53 -08:00
Ilya Grigoriev
1c5d0e0d63 cli: adjust error message for dummy revert command 2023-11-18 10:25:53 -08:00
Benjamin Saunders
2526620f82 cli: Suggest jj backout or jj restore in place of jj revert 2023-11-14 15:35:13 -08:00
Yuya Nishihara
6c98dfcdcb git: have import_refs() obtain git2::Repository instance from store
This helps gitoxide migration. It's theoretically possible to import Git refs
from non-Git backend, but I don't think such API flexibility is needed.
2023-11-14 17:35:27 +09:00
Yuya Nishihara
8e143541a5 operation: propagate OpStoreError from parents()
We need to .collect_vec() the parents iterator to temporary buffer since the
borrowed iterator can't be returned back to the dag_walk functions. Another
option is to clone op_store and parent ids to remove &self lifetime from the
iterator, but that also means a temporary Vec is created.
2023-11-14 07:16:39 +09:00
Yuya Nishihara
3f5e5994eb cli: use op.parent_ids() where operation object isn't needed 2023-11-14 07:16:39 +09:00
Łukasz Kurowski
ffd688472e merge_tools: use right_file_mode in make_diff_files
See the issue #2548 for more context.
2023-11-12 00:36:34 +01:00
Yuya Nishihara
0251c9fe51 cli: propagate read_operation() errors
This is easy one. op.parents() can still panic, which would be a bit more
involved to fix.

#2549
2023-11-11 22:35:40 +09:00
Yuya Nishihara
4ab8a1ae6e cli: flatten check_stale_working_copy() result
I'll make it propagate OpStoreError, but OpStoreError is quite different
from the existing StaleWorkingCopyError. I think this error isn't actually
an "error" but a description of the working copy state.
2023-11-11 22:35:40 +09:00
Yuya Nishihara
6125fb160e op_store: embed details in operation/view not found error
This is basically a copy of BackendError::ObjectNotFound. The failed id may
be either view or operation id.
2023-11-11 22:35:40 +09:00
Yuya Nishihara
9533177422 cli: include branch name in non-fast-forwardable error
Just like the other errors.
2023-11-11 07:03:31 +09:00
Yuya Nishihara
8706fadca1 cli: inline check for non-fast-forwardable branch move
The caller knows whether the branch is present or not.
2023-11-11 07:03:31 +09:00
Yuya Nishihara
0d21578846 cli: disallow to create new branch by "jj branch set"
Per discussion in https://github.com/martinvonz/jj/discussions/2555. I'm
okay with either way, but it's confusing if we had "branch create" and
"branch set" and both of these could create a new branch.
2023-11-11 07:03:31 +09:00
Martin von Zweigbergk
bf36933d9d diff_utils: return &str from basic_diff_file_type()
We don't currently need an owned `String`.
2023-11-10 11:08:43 -08:00
Martin von Zweigbergk
ffbfd74108 cli: pass MaterializedTreeValue into diff_content()
Another little preparation for reading the materialized values
concurrently.
2023-11-10 04:54:47 -08:00
Martin von Zweigbergk
120115a20d cli: pass MaterializedTreeValue into git_diff_part()
Just a little preparation for reading the materialized values
concurrently.
2023-11-10 04:54:47 -08:00
Łukasz Kurowski
57d7aeab5e cli: generate commit template after selecting changes
Renamed `description_template_for_commit` to
`description_template_for_describe` since it's only used in
`cmd_describe`.

Renamed `description_template_for_cmd_split` to
`description_template_for_commit` and modified to accomodate empty
`intro` argument.

Fixes #2439.
2023-11-09 15:10:25 +01:00
Yuya Nishihara
e2fd309d28 cli: reorder check of branch create/set arguments so they look similar
I think it's better to not emit "multiple branches" warning if we refuse to
move branches.
2023-11-09 15:38:22 +09:00
Yuya Nishihara
e880976deb cli: simplify check for conflicting branch name to create
There's no need to collect args.names into new Vec.
2023-11-09 15:38:22 +09:00
Yuya Nishihara
70479a712b cli: include branch names in bulk branch creation/update warning
This will probably help notice missing -r flag. Maybe we can also warn if
one of the branch names looks like a revset.

https://github.com/martinvonz/jj/discussions/2555
2023-11-09 15:38:22 +09:00
Martin von Zweigbergk
b11f7eee1b diff_utils: pass tree value into diff_content() by value
Avoids a few calls to `.clone()`.
2023-11-08 21:21:38 -08:00
Martin von Zweigbergk
9b24d24612 conflicts: add another helper for materializing a tree value
We have a few places where we have a `MergedTreeValue` and need to
read the data associated with it so we can write to the working copy
or include it in a diff. Let's extract some of that shared logic to a
function so we can reuse it. I plan to use it for reading file
contents in advance while streaming a diff in `local_working_copy`
soon (and probably in `jj diff` thereafter), but I think it seems like
an improvement on its own.
2023-11-08 21:21:38 -08:00
Anton Bulakh
d27351b978 misc: drop a few low-hanging unsafes
Remove a couple of unnecessary unsafes:
- The NonZeroUsize is a constant where the unwrap will optimize away
anyway and we don't have an unsafe without any good reason there :)
- The other two were simply not needed, lifetimes worked fine, maybe
Rust became better since that code was written? NLL? Anyway, they're
gone now
2023-11-08 02:16:08 +02:00
Yuya Nishihara
dd26b7be40 merge: add Merge constructor that accepts interleaved values
Also migrated some callers of 3-way merge, where [left, base, right] order
looks okay.
2023-11-07 17:10:12 +09:00
Yuya Nishihara
e4b0e629c9 merge_tools: borrow file contents without consuming Merge object 2023-11-07 06:52:35 +09:00
Yuya Nishihara
895bbce8c0 files: use borrowed Merge iterator in merge()
Since the underlying Merge data type is no longer (Vec<T>, Vec<T>), it doesn't
make sense to build removes/adds Vecs and concatenate them.
2023-11-07 06:52:35 +09:00
Antoine Cezar
afc2382833 cli: move description utils to description_util.rs 2023-11-06 17:49:02 +01:00
Yuya Nishihara
d8a7822c38 merge_tools: do not follow or change permission of symlinks
Fixes #2525.
2023-11-06 07:20:52 +09:00
Martin von Zweigbergk
7c923514ee git: add config to disable abandoning of unreachable commits
Some users prefer to have commits not get abandoned when importing
refs. This adds a config option for that.

Closes #2504.
2023-11-05 06:10:54 -08:00
Yuya Nishihara
d9fbf21794 merge: have Merge::adds()/removes() return iterator
The Merge type will be changed to store interleaved values internally.
2023-11-05 16:43:06 +09:00
Martin von Zweigbergk
5b02987012 merge tools: use MergedTree::diff_stream() 2023-11-04 21:07:49 -07:00
Yuya Nishihara
602b44258e workspace: add function that initializes colocated git repository
One less git2 API use in CLI.

The function name GitBackend::init_colocated() is a bit odd, but we need to
specify the work-tree path, not the ".git" repo path. So we can't eliminate
the notion of the working copy path anyway.
2023-11-05 08:48:35 +09:00
Philip Metzger
8e4b6dfeaa run: Teach run to resolve revsets and about jobs.
This also adds `jobs`, the argument reading the thread count to use and `shell_command`.
While we're at it, make `execute` a no-op and teach `run` to resolve the passed revsets. 
I also fixed my misunderstanding of `Clap` which makes 
`jj run 'echo hello world' -r 'mine() & ~origin@remote' --jobs 4` parse correctly. 

Also contains a small fix in the `pre-commit` example for it.
2023-11-04 16:29:06 +01:00
Austin Seipp
17bcac6838 cli: move resolve_destination_revs to cli_utils and rename
Summary: This is currently used by `new.rs`, `workspace.rs`, and `rebase.rs`,
and may be useful for other commands and custom CLIs. So just go ahead and move
it into the parent module hierarchy.

Also rename the function to `resolve_all_revs`, as it isn't actually specific to
rebase at all.

Signed-off-by: Austin Seipp <aseipp@pobox.com>
Change-Id: I0ea12afd8107f95a37a91340820221a0
2023-11-04 10:26:08 -05:00
Austin Seipp
e1193db4cf cli: support multiple --revision arguments to workspace add
Summary: A natural extension of the existing support, as suggested by Scott
Olson. Closes #2496.

Signed-off-by: Austin Seipp <aseipp@pobox.com>
Change-Id: I91c9c8c377ad67ccde7945ed41af6c79
2023-11-04 10:26:08 -05:00
Antoine Cezar
5973ab47b9 commands: move rebase_to_dest_parent to jj_lib::rewrite
What make rebase_to_dest_parent a good candidate for jj_lib::rewrite module:

- It is used both in obslog and interdiff. It's a sign that it may be moved to a lower layer
- CommandError is returned by converting from TreeMergeError. Not explicitly.
- It only use jj_lib::rewrite fonctions.
2023-11-03 20:48:00 +01:00
Martin von Zweigbergk
72245cfac5 merged_tree: add Stream-based version of diff(), delegating for now
I'm going to implement a `Stream`-based version optimized for
high-latency (RPC-based) commit backends. So far, that implementation
is about 20% slower in the Linux repo when running `jj diff
--ignore-working-copy -s --from v5.0 --to v6.0`. I think that's almost
only because the algorithm is different, not because it's async per
se.

This commit adds a `Stream`-based version of `MergedTree::diff()` that
just wraps the regular iterator in stream. I updated `jj diff` to use
it. I couldn't measure any difference on the command above in the
Linux repo. I think that means we can safely use the same
`Stream`-based interface regardless of backend, even if we end up
needing two different implementations of the `Stream`. We would then
be using the wrapped iterator from this commit for local backends, and
the new implementation for remote backends. But ideally we can make
the remote-friendly implementation fast enough that we don't need two
implementations.
2023-11-03 08:15:10 -07:00
Martin von Zweigbergk
24b706641f async: switch to pollster's block_on()
During the transition to using more async code, I keep running into
https://github.com/rust-lang/futures-rs/issues/2090. Right now, I want
to convert `MergedTree::diff()` into a `Stream`. I don't want to
update all call sites at once, so instead I'm adding a
`MergedTree::diff_stream()` method, which just wraps
`MergedTree::diff()` in a `Stream. However, since the iterator is
synchronous, it needs to block on the async `Backend::read_tree()`
calls. If we then also block on the `Stream` in the CLI, we run into
the panic.
2023-11-03 08:15:10 -07:00
Antoine Cezar
b7c480a575 commands: move show_predecessor_patch code to obslog.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
5d45bd194a commands: move workspace code to workspace.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
9e462509f8 commands: move version code to version.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
04eddc666c commands: move untrack code to untrack.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
9d72fa2a51 commands: move unsquash code to unsquash.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
8bb0383ad5 commands: move util code to util.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
abe658d966 commands: move status code to status.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
116214a79d commands: move squash code to squash.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
38898336a0 commands: move split code to split.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
6d0633443b commands: move sparse code to sparse.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
8f09fcc434 commands: move show code to show.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
6ae2e4c54f commands: move run code to run.rs 2023-11-03 04:45:55 +01:00
Antoine Cezar
e2336728da commands: move restore code to restore.rs 2023-11-03 04:45:55 +01:00
Martin von Zweigbergk
3a378dc234 cli: add a function for restoring part of a tree from another tree
We had similar code in two places for restoring paths from one tree to
another. Let's reuse it instead.

I put the new function in the `rewrite` module. I'm not sure if that's
right place. Maybe it belongs in `tree`?
2023-11-02 06:07:45 -07:00
Yuya Nishihara
162dcd49b4 cli: rewrite base GitIgnoreFile lookup to use gitoxide instead of libgit2
Since gix::Repository::config_snapshot() borrows the repo instance, it has to
be allocated in caller's stack. That's why GitBackend::git_config() is removed.
2023-11-02 19:33:06 +09:00
Martin von Zweigbergk
46a8afe144 formatter: reset colors on early drop
If we create a `ColorFormatter`, add some labels to it, print
something using the configured style, and then return early because of
an error, we would leave the terminal in a bad state. I think many
shells reset color codes after a command returns, but let's still do
our best.
2023-11-01 21:41:25 -07:00
Yuya Nishihara
f89f2f9e7d cli: add "branch list [NAMES]..." filter
Like "jj log PATHS...", unmatched name isn't an error. I don't think
"jj branch list glob:'push-*'" should fail just because there are no in-flight
PR branches.
2023-11-01 08:38:55 -07:00
Ilya Grigoriev
d2c2c270f8 cli rebase: Move misplaced paragraph, fixup to 8bc3f5fd67 2023-10-31 18:57:02 -07:00
Ilya Grigoriev
8bc3f5fd67 cli rebase: Allow jj rebase -r to rebase a commit onto a descendant
#1188

There are some additional test changes because children and descendants are now
rebased before the commit itself.
2023-10-30 10:56:27 -07:00
Antoine Cezar
1d6b883406 commands: move obslog code to obslog.rs 2023-10-30 18:35:08 +01:00
Antoine Cezar
b24a85f879 commands: move prev code to prev.rs 2023-10-30 18:35:08 +01:00
Antoine Cezar
d1135917b0 commands: move next code to next.rs 2023-10-30 18:35:08 +01:00
Martin von Zweigbergk
23a0baba14 cli: make jj workspace add preserve all parents of current workspace 2023-10-29 21:53:29 -07:00
Ilya Grigoriev
b482898924 immutable commits: remove the hint if trying to edit the root commit
The hint is a bit misleading in this case. I also changed the message slightly.
2023-10-29 21:13:39 -07:00
Ilya Grigoriev
ebb6b942ac cli new: have --before/--after respect immutable commits
I wasn't very careful to make the function
pretty; I'm planning to refactor it anyway as
part of implementing `rebase --before` and
`rebase --after`.
2023-10-29 21:13:39 -07:00
Ilya Grigoriev
62e0729f41 debug.rs: make one of the imports optional
This removes a warning rust-analyzer otherwise shows me.
2023-10-29 20:19:44 -07:00
Ilya Grigoriev
2571169251 clippy: run cargo clippy --fix --workspace with recent nightly 2023-10-29 20:19:44 -07:00
Ilya Grigoriev
1d918dff08 commands: move rebase code to rebase.rs 2023-10-29 18:19:06 -07:00
Ilya Grigoriev
887e5665d5 commands: move resolve code to resolve.rs
The print_conflicted_paths function could belong either
to `resolve.rs` or `status.rs`; I put it into the former for now.

Cc #2465, #2457
2023-10-29 18:19:06 -07:00
Antoine Cezar
19a658e757 commands: move merge code to merge.rs 2023-10-29 23:28:51 +01:00
Antoine Cezar
92739ebf11 commands: move move code to move.rs 2023-10-29 23:28:51 +01:00
Antoine Cezar
6af13ea89b commands: move new code to new.rs 2023-10-29 23:28:51 +01:00
Antoine Cezar
e43b544a06 commands: move log code to log.rs 2023-10-29 23:28:51 +01:00
Antoine Cezar
e9d7a22fc0 commands: move interdiff code to interdiff.rs 2023-10-29 23:28:51 +01:00
Antoine Cezar
60433583b6 commands: move init code to init.rs 2023-10-29 23:28:51 +01:00
Antoine Cezar
42795898de commands: move files code to files.rs 2023-10-28 19:02:54 +02:00
Antoine Cezar
4257341dbe commands: move edit code to edit.rs 2023-10-28 18:44:35 +02:00
Antoine Cezar
061dc81c22 commands: move duplicate code to duplicate.rs 2023-10-28 17:45:19 +02:00
Antoine Cezar
e4a1af1dda commands: move diffedit code to diffedit.rs 2023-10-28 15:59:08 +02:00
Antoine Cezar
b5e4e67090 commands: move diff code to diff.rs 2023-10-28 15:59:08 +02:00
Antoine Cezar
bc3443291e commands: move describe code to describe.rs 2023-10-28 15:59:08 +02:00
Antoine Cezar
8624d39a6b commands: move config code to config.rs 2023-10-28 15:59:08 +02:00
Antoine Cezar
4d63e0bfa7 commands: move commit code to commit.rs 2023-10-28 15:59:08 +02:00
Antoine Cezar
6badf159fa commands: move chmod code to chmod.rs 2023-10-28 15:59:08 +02:00