Merge pull request #1719 from entireio/fix/1374-enable-fetch-checkpoint-remote · Entire
Merge pull request #1719 from entireio/fix/1374-enable-fetch-checkpoint-remote
df765ab→main·
suhaanthayyil·yesterday·5 files·+955 added/-25 removed
fix(enable): fetch existing checkpoint_remote branch instead of orphan
Changes
5
cmd/entire/cli
Msetup.go+22/-2
- Asetup_enable_heal_test.go+143
strategy
Mcheckpoint_remote.go+51/-1
- Mcheckpoint_remote_test.go+455
- Mcommon.go+284/-22
// `entire enable` is an explicit, user-initiated recovery point. A repo
// enabled before the checkpoint_remote bootstrap existed may still carry a
// local orphan disjoint from the checkpoint remote (#1374); EnsureSetup with
// the bootstrap flag heals it via EnsurePrimaryRef. This is the only path to
// the heal for a bare `entire enable` (which otherwise short-circuits on the
// already-enabled branch below). EnsureSetup is idempotent and silent on a
// healthy repo (hooks stay installed, gitignore/vercel config already present),
// so this adds only the heal to the already-configured path.
if err := strategy.EnsureSetup(strategy.WithCheckpointRemoteBootstrap(ctx)); err != nil {
return fmt.Errorf("failed to setup strategy: %w", err)
}
// Resolve the target scope first, then decide whether there is anything to
// do. Enable writes to the scope resolved by settingsTargetFile, which is
// also what strategy/checkpoint-backend updates above use. Without this, a
return fmt.Errorf("failed to save settings: %w", err)
}
if err := strategy.EnsureSetup(ctx); err != nil {
// Explicit, user-initiated setup: allow EnsurePrimaryRef to fetch a
// missing primary metadata ref from a configured checkpoint_remote
// (bootstrapPrimaryFromCheckpointRemote is otherwise a no-op — see
// strategy.WithCheckpointRemoteBootstrap).
if err := strategy.EnsureSetup(strategy.WithCheckpointRemoteBootstrap(ctx)); err != nil {
return fmt.Errorf("failed to setup strategy: %w", err)
}
}
TestEnableCmd_BareEnableHealsEmptyOrphanFromCheckpointRemote
func TestEnableCmd_BareEnableHealsEmptyOrphanFromCheckpointRemote(t *testing.T) {
// Checkpoint remote (device A): holds a real entire/checkpoints/v1 branch.
remoteDir := t.TempDir()
testutil.InitRepo(t, remoteDir)
testutil.WriteFile(t, remoteDir, "f.txt", "init")
testutil.GitAdd(t, remoteDir, "f.txt")
testutil.GitCommit(t, remoteDir, "init")
remoteDefault := healTestCurrentBranch(t, remoteDir)
healTestGit(t, remoteDir, "checkout", "--orphan", paths.MetadataBranchName)
healTestGit(t, remoteDir, "rm", "-rf", ".")
healTestWriteCheckpoint(t, remoteDir, "aaaaaaaaaaaa")
healTestGit(t, remoteDir, "checkout", remoteDefault)
remoteTip := healTestRevParse(t, remoteDir, paths.MetadataBranchName)
// Local repo (device B): configured + enabled with a checkpoint_remote, but
// carrying the pre-#1374 empty orphan. setupTestRepo inits the repo and chdirs
// into it.
setupTestRepo(t)
localDir, err := os.Getwd()
require.NoError(t, err)
testutil.WriteFile(t, localDir, "f.txt", "init")
testutil.GitAdd(t, localDir, "f.txt")
testutil.GitCommit(t, localDir, "init")
localDefault := healTestCurrentBranch(t, localDir)
// SSH origin so remote.FetchURL derives the github checkpoint URL.
healTestGit(t, localDir, "remote", "add", "origin", "git@github.com:org/main-repo.git")
healTestGit(t, localDir, "checkout", "--orphan", paths.MetadataBranchName)
healTestGit(t, localDir, "rm", "-rf", ".")
healTestGit(t, localDir, "commit", "--allow-empty", "-m", "Initialize metadata ref")
healTestGit(t, localDir, "checkout", localDefault)
writeSettings(t, `{"enabled": true, "strategy_options": {"checkpoint_remote": {"provider": "github", "repo": "org/checkpoints"}}}`)
writeClaudeHooksFixture(t)
// Redirect the derived checkpoint URL to the local checkpoint remote so the
// real fetch path runs hermetically.
healTestRedirectURL(t, localDir, "git@github.com:org/checkpoints.git", "file://"+remoteDir)
paths.ClearWorktreeRootCache()
orphanTip := healTestRevParse(t, localDir, paths.MetadataBranchName)
require.NotEqual(t, remoteTip, orphanTip, "test setup: local orphan must differ from the checkpoint remote tip")
cmd := newEnableCmd()
cmd.SetOut(&strings.Builder{})
cmd.SetErr(&strings.Builder{})
cmd.SetArgs([]string{})
require.NoError(t, cmd.Execute(), "bare enable should succeed")
healedTip := healTestRevParse(t, localDir, paths.MetadataBranchName)
assert.Equal(t, remoteTip, healedTip,
"a bare `entire enable` must heal the empty orphan from the checkpoint remote")
files := healTestMetadataFiles(t, localDir)
assert.Contains(t, files, "aa/aaaaaaaaaa/"+paths.MetadataFileName,
"the healed branch should contain the checkpoint remote data")
}
Additional Functions
func healTestGit(t *testing.T, dir string, args ...string) {
t.Helper()
cmd := exec.CommandContext(context.Background(), "git", args...)
cmd.Dir = dir
cmd.Env = testutil.GitIsolatedEnv()
out, err := cmd.CombinedOutput()
require.NoError(t, err, "git %v in %s failed: %s", args, dir, out)
}