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

// `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)
}