Merge branch 'main' into soph/loosen-repo-list-enums · Entire
Merge branch 'main' into soph/loosen-repo-list-enums
746ac22→main·
gtrrz-victor·1w ago·7 files·+1,148 added/-25 removed
Changes
7
cmd/entire/cli
checkpoint
Amigrate.go+325
Amigrate_test.go+484
Mdoctor.go+1
Adoctor_migrate.go+120
Adoctor_migrate_test.go+37
strategy
Mmanual_commit_push.go+71/-25
package checkpoint
import (
"context"
"encoding/json"
"errors"
"fmt"
"strings"
git "github.com/go-git/go-git/v6"
"github.com/go-git/go-git/v6/plumbing"
"github.com/go-git/go-git/v6/plumbing/filemode"
"github.com/go-git/go-git/v6/plumbing/object"
"github.com/entireio/cli/cmd/entire/cli/checkpoint/id"
"github.com/entireio/cli/cmd/entire/cli/jsonutil"
"github.com/entireio/cli/cmd/entire/cli/paths"
)
// MigrateResult summarizes a git-branch → git-refs checkpoint migration.
type MigrateResult struct {
// Total is the number of checkpoints found on the v1 branch.
Total int
// Migrated lists the checkpoints whose ref was newly written or advanced.
Migrated []id.CheckpointID
// Skipped counts checkpoints already up to date (idempotent no-ops).
Skipped int
}
// MigrateBranchToRefs converts every checkpoint stored on the git-branch v1
// branch (entire/checkpoints/v1) into a per-checkpoint ref under
// refs/entire/checkpoints/<shard>/<id> — the layout the git-refs store uses.
func MigrateBranchToRefs(ctx context.Context, repo *git.Repository, dryRun bool) (MigrateResult, error) {
var result MigrateResult
branch := NewGitStore(repo, DefaultV1Refs())
tree, err := branch.getSessionsBranchTree()
if err != nil {
if errors.Is(err, plumbing.ErrReferenceNotFound) {
// No v1 branch locally or on origin → nothing to migrate.
return result, nil
}
return result, fmt.Errorf("read v1 checkpoint branch: %w", err)
}
refsStore := newGitRefsStore(repo)
authorName, authorEmail := GetGitAuthorFromRepo(repo)
queue, err := PushQueueForRepo(ctx, repo)
if err != nil {
return result, fmt.Errorf("resolve push queue: %w", err)
}
walkErr := WalkCheckpointShards(ctx, repo, tree, func(cid id.CheckpointID, cpTreeHash plumbing.Hash) error {
if err := ctx.Err(); err != nil {
return err //nolint:wrapcheck // propagate context cancellation
}
result.Total++
...
})
if walkErr != nil {
return result, fmt.Errorf("walk v1 checkpoints: %w", walkErr)
}
return result, nil
}
// ...
// The rest of the implementation followed by functions related to checkpoint handling.
Acmd/entire/cli/checkpoint/migrate.go+325
// Implementation tests
// TestMigrateBranchToRefs is the test for migrating checkpoints to refs.
func TestMigrateBranchToRefs(t *testing.T) {
t.Parallel()
repo, _ := setupBranchTestRepo(t)
ctx := context.Background()
branch := NewGitStore(repo, DefaultV1Refs())
cid1 := id.MustCheckpointID("a1b2c3d4e5f6")
cid2 := id.MustCheckpointID("b2c3d4e5f6a1")
seedBranchCheckpoint(t, branch, cid1, "s1")
seedBranchCheckpoint(t, branch, cid2, "s2")
// Simulate updates and perform migration
mutateBranchCheckpointMetadata(t, repo, cid1, ...)
result, err := MigrateBranchToRefs(ctx, repo, false)
require.NoError(t, err)
...
}
}