|
1 | 1 | package git |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "encoding/json" |
4 | 5 | "fmt" |
5 | 6 | "os" |
6 | 7 | "os/exec" |
7 | 8 | "path/filepath" |
8 | 9 | "runtime" |
| 10 | + "slices" |
9 | 11 | "strings" |
10 | 12 | "testing" |
11 | 13 |
|
@@ -1429,6 +1431,9 @@ func TestIntegration_WorktreeRerereAutoContinuesMultipleCommits(t *testing.T) { |
1429 | 1431 | original := gitExec(t, path, "rev-parse", "HEAD") |
1430 | 1432 | mainHead := gitExec(t, dir, "rev-parse", "HEAD") |
1431 | 1433 | require.NoError(t, linked.EnableRerere()) |
| 1434 | + gitExec(t, dir, "config", "maintenance.auto", "true") |
| 1435 | + tracePath := filepath.Join(t.TempDir(), "rebase-trace") |
| 1436 | + t.Setenv("GIT_TRACE2_EVENT", tracePath) |
1432 | 1437 | t.Setenv("GIT_EDITOR", "false") |
1433 | 1438 | restore := forbidGlobalWorktreeQueries(t) |
1434 | 1439 | defer restore() |
@@ -1465,6 +1470,31 @@ func TestIntegration_WorktreeRerereAutoContinuesMultipleCommits(t *testing.T) { |
1465 | 1470 | require.NoError(t, err) |
1466 | 1471 | assert.Contains(t, string(data), "resolved") |
1467 | 1472 | } |
| 1473 | + trace, err := os.ReadFile(tracePath) |
| 1474 | + require.NoError(t, err) |
| 1475 | + var rebaseSessions []string |
| 1476 | + for _, line := range strings.Split(strings.TrimSpace(string(trace)), "\n") { |
| 1477 | + var event struct { |
| 1478 | + Event string `json:"event"` |
| 1479 | + SID string `json:"sid"` |
| 1480 | + Argv []string `json:"argv"` |
| 1481 | + } |
| 1482 | + require.NoError(t, json.Unmarshal([]byte(line), &event)) |
| 1483 | + if event.Event == "start" && slices.Contains(event.Argv, "rebase") { |
| 1484 | + rebaseSessions = append(rebaseSessions, event.SID) |
| 1485 | + } |
| 1486 | + if event.Event != "child_start" || len(event.Argv) < 3 || |
| 1487 | + event.Argv[1] != "maintenance" || event.Argv[2] != "run" || !slices.Contains(event.Argv, "--auto") { |
| 1488 | + continue |
| 1489 | + } |
| 1490 | + for _, sid := range rebaseSessions { |
| 1491 | + assert.False(t, event.SID == sid || strings.HasPrefix(event.SID, sid+"/"), |
| 1492 | + "automatic maintenance can race the next commit's rerere lock: %v", event.Argv) |
| 1493 | + } |
| 1494 | + } |
| 1495 | + assert.NotEmpty(t, rebaseSessions) |
| 1496 | + assert.Equal(t, "true", gitExec(t, dir, "config", "--local", "--get", "maintenance.auto"), |
| 1497 | + "the rebase must not change the repository's maintenance configuration") |
1468 | 1498 | } |
1469 | 1499 |
|
1470 | 1500 | func TestIntegration_WorktreeRebaseContinueStopsWhenNoProgress(t *testing.T) { |
|
0 commit comments