func (cmd CmdOptimize) Execute(args []string) error { if len(args) != 0 { return errors.New("optimize has no arguments") } repo, err := cmd.global.OpenRepository() if err != nil { return err } cmd.global.Verbosef("Create exclusive lock for repository\n") lock, err := lockRepoExclusive(repo) defer unlockRepo(lock) if err != nil { return err } chkr := checker.New(repo) cmd.global.Verbosef("Load indexes\n") _, errs := chkr.LoadIndex() if len(errs) > 0 { for _, err := range errs { cmd.global.Warnf("error: %v\n", err) } return fmt.Errorf("LoadIndex returned errors") } done := make(chan struct{}) errChan := make(chan error) go chkr.Structure(errChan, done) for err := range errChan { if e, ok := err.(checker.TreeError); ok { cmd.global.Warnf("error for tree %v:\n", e.ID.Str()) for _, treeErr := range e.Errors { cmd.global.Warnf(" %v\n", treeErr) } } else { cmd.global.Warnf("error: %v\n", err) } } unusedBlobs := backend.NewIDSet(chkr.UnusedBlobs()...) cmd.global.Verbosef("%d unused blobs found, repacking...\n", len(unusedBlobs)) repacker := checker.NewRepacker(repo, unusedBlobs) err = repacker.Repack() if err != nil { return err } cmd.global.Verbosef("repacking done\n") return nil }
func TestRepacker(t *testing.T) { WithTestEnvironment(t, checkerTestData, func(repodir string) { repo := OpenLocalRepo(t, repodir) OK(t, repo.LoadIndex()) repo.Backend().Remove(backend.Snapshot, "c2b53c5e6a16db92fbb9aa08bd2794c58b379d8724d661ee30d20898bdfdff22") unusedBlobs := backend.IDSet{ ParseID("5714f7274a8aa69b1692916739dc3835d09aac5395946b8ec4f58e563947199a"): struct{}{}, ParseID("08d0444e9987fa6e35ce4232b2b71473e1a8f66b2f9664cc44dc57aad3c5a63a"): struct{}{}, ParseID("356493f0b00a614d36c698591bbb2b1d801932d85328c1f508019550034549fc"): struct{}{}, ParseID("b8a6bcdddef5c0f542b4648b2ef79bc0ed4377d4109755d2fb78aff11e042663"): struct{}{}, } chkr := checker.New(repo) _, errs := chkr.LoadIndex() OKs(t, errs) errs = checkStruct(chkr) OKs(t, errs) list := backend.NewIDSet(chkr.UnusedBlobs()...) if !unusedBlobs.Equals(list) { t.Fatalf("expected unused blobs:\n %v\ngot:\n %v", unusedBlobs, list) } repacker := checker.NewRepacker(repo, unusedBlobs) OK(t, repacker.Repack()) chkr = checker.New(repo) _, errs = chkr.LoadIndex() OKs(t, errs) OKs(t, checkPacks(chkr)) OKs(t, checkStruct(chkr)) blobs := chkr.UnusedBlobs() Assert(t, len(blobs) == 0, "expected zero unused blobs, got %v", blobs) }) }