1package leaf
2
3import (
4	"context"
5	"fmt"
6
7	"github.com/gopasspw/gopass/internal/backend"
8	"github.com/gopasspw/gopass/internal/out"
9	"github.com/gopasspw/gopass/internal/store"
10	"github.com/gopasspw/gopass/pkg/debug"
11	"github.com/gopasspw/gopass/pkg/gopass"
12	"github.com/gopasspw/gopass/pkg/gopass/secrets/secparse"
13)
14
15// GitInit initializes the git storage
16func (s *Store) GitInit(ctx context.Context) error {
17	storage, err := backend.InitStorage(ctx, backend.GetStorageBackend(ctx), s.path)
18	if err != nil {
19		return err
20	}
21	s.storage = storage
22	return nil
23}
24
25// ListRevisions will list all revisions for a secret
26func (s *Store) ListRevisions(ctx context.Context, name string) ([]backend.Revision, error) {
27	p := s.passfile(name)
28	return s.storage.Revisions(ctx, p)
29}
30
31// GetRevision will retrieve a single revision from the backend
32func (s *Store) GetRevision(ctx context.Context, name, revision string) (gopass.Secret, error) {
33	p := s.passfile(name)
34	ciphertext, err := s.storage.GetRevision(ctx, p, revision)
35	if err != nil {
36		return nil, fmt.Errorf("failed to get ciphertext of %q@%q: %w", name, revision, err)
37	}
38
39	content, err := s.crypto.Decrypt(ctx, ciphertext)
40	if err != nil {
41		debug.Log("Decryption failed: %s", err)
42		return nil, store.ErrDecrypt
43	}
44
45	sec, err := secparse.Parse(content)
46	if err != nil {
47		debug.Log("Failed to parse YAML: %s", err)
48	}
49	return sec, nil
50}
51
52// GitStatus shows the git status output
53func (s *Store) GitStatus(ctx context.Context, _ string) error {
54	buf, err := s.storage.Status(ctx)
55	if err != nil {
56		return err
57	}
58	out.Printf(ctx, string(buf))
59	return nil
60}
61