mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-12 23:23:20 +00:00
1eebbe57c0
It's common to create empty working-copy commits while using jj, and currently the author timestamp for a commit is only set when it is first created. If you create an empty commit, then don't work on a repo for a few days, and then start working on a new feature without abandoning the working-copy commit, the author timestamp will remain as the time the commit was created rather than being updated to the time that work began or finished. This commit changes the behavior so that discardable commits (empty commits with no description) by the current user have their author timestamps reset when they are rewritten, meaning that the author timestamp will become finalized whenever a commit is given a description or becomes non-empty.
214 lines
9.4 KiB
Rust
214 lines
9.4 KiB
Rust
// Copyright 2023 The Jujutsu Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
use crate::common::TestEnvironment;
|
|
|
|
#[test]
|
|
fn test_report_conflicts() {
|
|
let test_env = TestEnvironment::default();
|
|
test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]);
|
|
let repo_path = test_env.env_root().join("repo");
|
|
|
|
std::fs::write(repo_path.join("file"), "A\n").unwrap();
|
|
test_env.jj_cmd_ok(&repo_path, &["commit", "-m=A"]);
|
|
std::fs::write(repo_path.join("file"), "B\n").unwrap();
|
|
test_env.jj_cmd_ok(&repo_path, &["commit", "-m=B"]);
|
|
std::fs::write(repo_path.join("file"), "C\n").unwrap();
|
|
test_env.jj_cmd_ok(&repo_path, &["commit", "-m=C"]);
|
|
|
|
let (stdout, stderr) =
|
|
test_env.jj_cmd_ok(&repo_path, &["rebase", "-s=description(B)", "-d=root()"]);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Rebased 3 commits
|
|
New conflicts appeared in these commits:
|
|
kkmpptxz 64bdec0c (conflict) C
|
|
rlvkpnrz 10a5fd45 (conflict) B
|
|
To resolve the conflicts, start by updating to the first one:
|
|
jj new rlvkpnrzqnoo
|
|
Then use `jj resolve`, or edit the conflict markers in the file directly.
|
|
Once the conflicts are resolved, you may want inspect the result with `jj diff`.
|
|
Then run `jj squash` to move the resolution into the conflicted commit.
|
|
Working copy now at: zsuskuln aa73e2ae (conflict) (empty) (no description set)
|
|
Parent commit : kkmpptxz 64bdec0c (conflict) C
|
|
Added 0 files, modified 1 files, removed 0 files
|
|
There are unresolved conflicts at these paths:
|
|
file 2-sided conflict including 1 deletion
|
|
"###);
|
|
|
|
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["rebase", "-d=description(A)"]);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Rebased 3 commits
|
|
Existing conflicts were resolved or abandoned from these commits:
|
|
kkmpptxz hidden 64bdec0c (conflict) C
|
|
rlvkpnrz hidden 10a5fd45 (conflict) B
|
|
Working copy now at: zsuskuln d70c003d (empty) (no description set)
|
|
Parent commit : kkmpptxz 43e94449 C
|
|
Added 0 files, modified 1 files, removed 0 files
|
|
"###);
|
|
|
|
// Can get hint about multiple root commits
|
|
let (stdout, stderr) =
|
|
test_env.jj_cmd_ok(&repo_path, &["rebase", "-r=description(B)", "-d=root()"]);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Rebased 1 commits onto destination
|
|
Rebased 2 descendant commits
|
|
New conflicts appeared in these commits:
|
|
kkmpptxz 17c72220 (conflict) C
|
|
rlvkpnrz eb93a73d (conflict) B
|
|
To resolve the conflicts, start by updating to one of the first ones:
|
|
jj new kkmpptxzrspx
|
|
jj new rlvkpnrzqnoo
|
|
Then use `jj resolve`, or edit the conflict markers in the file directly.
|
|
Once the conflicts are resolved, you may want inspect the result with `jj diff`.
|
|
Then run `jj squash` to move the resolution into the conflicted commit.
|
|
Working copy now at: zsuskuln 99fb9018 (conflict) (empty) (no description set)
|
|
Parent commit : kkmpptxz 17c72220 (conflict) C
|
|
Added 0 files, modified 1 files, removed 0 files
|
|
There are unresolved conflicts at these paths:
|
|
file 2-sided conflict
|
|
"###);
|
|
|
|
// Resolve one of the conflicts by (mostly) following the instructions
|
|
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["new", "rlvkpnrzqnoo"]);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Working copy now at: vruxwmqv 1d87c702 (conflict) (empty) (no description set)
|
|
Parent commit : rlvkpnrz eb93a73d (conflict) B
|
|
Added 0 files, modified 1 files, removed 0 files
|
|
There are unresolved conflicts at these paths:
|
|
file 2-sided conflict including 1 deletion
|
|
"###);
|
|
std::fs::write(repo_path.join("file"), "resolved\n").unwrap();
|
|
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["squash"]);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Existing conflicts were resolved or abandoned from these commits:
|
|
rlvkpnrz hidden eb93a73d (conflict) B
|
|
Working copy now at: yostqsxw f5a0cf8c (empty) (no description set)
|
|
Parent commit : rlvkpnrz 87370844 B
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_report_conflicts_with_divergent_commits() {
|
|
let test_env = TestEnvironment::default();
|
|
test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]);
|
|
let repo_path = test_env.env_root().join("repo");
|
|
|
|
test_env.jj_cmd_ok(&repo_path, &["describe", "-m=A"]);
|
|
std::fs::write(repo_path.join("file"), "A\n").unwrap();
|
|
test_env.jj_cmd_ok(&repo_path, &["new", "-m=B"]);
|
|
std::fs::write(repo_path.join("file"), "B\n").unwrap();
|
|
test_env.jj_cmd_ok(&repo_path, &["new", "-m=C"]);
|
|
std::fs::write(repo_path.join("file"), "C\n").unwrap();
|
|
test_env.jj_cmd_ok(&repo_path, &["describe", "-m=C2"]);
|
|
test_env.jj_cmd_ok(&repo_path, &["describe", "-m=C3", "--at-op=@-"]);
|
|
|
|
let (stdout, stderr) =
|
|
test_env.jj_cmd_ok(&repo_path, &["rebase", "-s=description(B)", "-d=root()"]);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Concurrent modification detected, resolving automatically.
|
|
Rebased 3 commits
|
|
New conflicts appeared in these commits:
|
|
zsuskuln?? b535189c (conflict) C3
|
|
zsuskuln?? 97ce1783 (conflict) C2
|
|
kkmpptxz eb93a73d (conflict) B
|
|
To resolve the conflicts, start by updating to the first one:
|
|
jj new kkmpptxzrspx
|
|
Then use `jj resolve`, or edit the conflict markers in the file directly.
|
|
Once the conflicts are resolved, you may want inspect the result with `jj diff`.
|
|
Then run `jj squash` to move the resolution into the conflicted commit.
|
|
Working copy now at: zsuskuln?? 97ce1783 (conflict) C2
|
|
Parent commit : kkmpptxz eb93a73d (conflict) B
|
|
Added 0 files, modified 1 files, removed 0 files
|
|
There are unresolved conflicts at these paths:
|
|
file 2-sided conflict including 1 deletion
|
|
"###);
|
|
|
|
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["rebase", "-d=description(A)"]);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Rebased 3 commits
|
|
Existing conflicts were resolved or abandoned from these commits:
|
|
zsuskuln hidden b535189c (conflict) C3
|
|
zsuskuln hidden 97ce1783 (conflict) C2
|
|
kkmpptxz hidden eb93a73d (conflict) B
|
|
Working copy now at: zsuskuln?? f2d7a228 C2
|
|
Parent commit : kkmpptxz db069a22 B
|
|
Added 0 files, modified 1 files, removed 0 files
|
|
"###);
|
|
|
|
// Same thing when rebasing the divergent commits one at a time
|
|
let (stdout, stderr) =
|
|
test_env.jj_cmd_ok(&repo_path, &["rebase", "-s=description(C2)", "-d=root()"]);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Rebased 1 commits
|
|
New conflicts appeared in these commits:
|
|
zsuskuln?? b15416ac (conflict) C2
|
|
To resolve the conflicts, start by updating to it:
|
|
jj new zsuskulnrvyr
|
|
Then use `jj resolve`, or edit the conflict markers in the file directly.
|
|
Once the conflicts are resolved, you may want inspect the result with `jj diff`.
|
|
Then run `jj squash` to move the resolution into the conflicted commit.
|
|
Working copy now at: zsuskuln?? b15416ac (conflict) C2
|
|
Parent commit : zzzzzzzz 00000000 (empty) (no description set)
|
|
Added 0 files, modified 1 files, removed 0 files
|
|
There are unresolved conflicts at these paths:
|
|
file 2-sided conflict including 1 deletion
|
|
"###);
|
|
|
|
let (stdout, stderr) =
|
|
test_env.jj_cmd_ok(&repo_path, &["rebase", "-s=description(C3)", "-d=root()"]);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Rebased 1 commits
|
|
New conflicts appeared in these commits:
|
|
zsuskuln?? 8cc7fde6 (conflict) C3
|
|
To resolve the conflicts, start by updating to it:
|
|
jj new zsuskulnrvyr
|
|
Then use `jj resolve`, or edit the conflict markers in the file directly.
|
|
Once the conflicts are resolved, you may want inspect the result with `jj diff`.
|
|
Then run `jj squash` to move the resolution into the conflicted commit.
|
|
"###);
|
|
|
|
let (stdout, stderr) = test_env.jj_cmd_ok(
|
|
&repo_path,
|
|
&["rebase", "-s=description(C2)", "-d=description(B)"],
|
|
);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Rebased 1 commits
|
|
Existing conflicts were resolved or abandoned from these commits:
|
|
zsuskuln hidden b15416ac (conflict) C2
|
|
Working copy now at: zsuskuln?? 1f9680bd C2
|
|
Parent commit : kkmpptxz db069a22 B
|
|
Added 0 files, modified 1 files, removed 0 files
|
|
"###);
|
|
|
|
let (stdout, stderr) = test_env.jj_cmd_ok(
|
|
&repo_path,
|
|
&["rebase", "-s=description(C3)", "-d=description(B)"],
|
|
);
|
|
insta::assert_snapshot!(stdout, @"");
|
|
insta::assert_snapshot!(stderr, @r###"
|
|
Rebased 1 commits
|
|
Existing conflicts were resolved or abandoned from these commits:
|
|
zsuskuln hidden 8cc7fde6 (conflict) C3
|
|
"###);
|
|
}
|