This repository has no description
1package spindle
2
3import (
4 "context"
5 "errors"
6 "fmt"
7
8 "tangled.org/core/spindle/secrets"
9)
10
11func copyRepoSecrets(ctx context.Context, mgr secrets.Manager, src, dst secrets.RepoIdentifier) (int, error) {
12 cur, err := mgr.GetSecretsUnlocked(ctx, src)
13 if err != nil {
14 return 0, fmt.Errorf("get %s: %w", src, err)
15 }
16 var step func(remaining []secrets.UnlockedSecret, copied int) (int, error)
17 step = func(remaining []secrets.UnlockedSecret, copied int) (int, error) {
18 if len(remaining) == 0 {
19 return copied, nil
20 }
21 s := remaining[0]
22 addErr := mgr.AddSecret(ctx, secrets.UnlockedSecret{
23 Repo: dst,
24 Key: s.Key,
25 Value: s.Value,
26 CreatedAt: s.CreatedAt,
27 CreatedBy: s.CreatedBy,
28 })
29 switch {
30 case addErr == nil:
31 return step(remaining[1:], copied+1)
32 case errors.Is(addErr, secrets.ErrKeyAlreadyPresent):
33 return step(remaining[1:], copied)
34 default:
35 return copied, fmt.Errorf("add %s/%s: %w", dst, s.Key, addErr)
36 }
37 }
38 return step(cur, 0)
39}