mirror of https://github.com/restic/restic.git
54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
|
package archiver
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"time"
|
||
|
|
||
|
"github.com/restic/restic/internal/debug"
|
||
|
"github.com/restic/restic/internal/repository"
|
||
|
"github.com/restic/restic/internal/restic"
|
||
|
)
|
||
|
|
||
|
// IndexUploader polls the repo for full indexes and uploads them.
|
||
|
type IndexUploader struct {
|
||
|
restic.Repository
|
||
|
|
||
|
// Start is called when an index is to be uploaded.
|
||
|
Start func()
|
||
|
|
||
|
// Complete is called when uploading an index has finished.
|
||
|
Complete func(id restic.ID)
|
||
|
}
|
||
|
|
||
|
// Upload periodically uploads full indexes to the repo. When shutdown is
|
||
|
// cancelled, the last index upload will finish and then Upload returns.
|
||
|
func (u IndexUploader) Upload(ctx, shutdown context.Context, interval time.Duration) error {
|
||
|
ticker := time.NewTicker(interval)
|
||
|
defer ticker.Stop()
|
||
|
|
||
|
for {
|
||
|
select {
|
||
|
case <-ctx.Done():
|
||
|
return nil
|
||
|
case <-shutdown.Done():
|
||
|
return nil
|
||
|
case <-ticker.C:
|
||
|
full := u.Repository.Index().(*repository.MasterIndex).FullIndexes()
|
||
|
for _, idx := range full {
|
||
|
if u.Start != nil {
|
||
|
u.Start()
|
||
|
}
|
||
|
|
||
|
id, err := repository.SaveIndex(ctx, u.Repository, idx)
|
||
|
if err != nil {
|
||
|
debug.Log("save indexes returned an error: %v", err)
|
||
|
return err
|
||
|
}
|
||
|
if u.Complete != nil {
|
||
|
u.Complete(id)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|