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

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)
    ...
}

}