gitch

Форк
0
/
syncer.go 
73 строки · 1.4 Кб
1
package syncer
2

3
import (
4
	"errors"
5
	"fmt"
6
	"os"
7

8
	ss "golang.org/x/crypto/ssh"
9

10
	"github.com/go-git/go-git/v5"
11
	"github.com/go-git/go-git/v5/config"
12
	"github.com/go-git/go-git/v5/plumbing/transport/ssh"
13
	"github.com/go-git/go-git/v5/storage/memory"
14
)
15

16
type Syncer struct {
17
	key  string
18
	from string
19
	to   string
20
}
21

22
func New(from, to, key string) *Syncer {
23
	return &Syncer{
24
		key:  key,
25
		from: from,
26
		to:   to,
27
	}
28
}
29

30
func (s *Syncer) Sync() error {
31
	keys, err := ssh.NewPublicKeys("git", []byte(s.key), "")
32
	if err != nil {
33
		return fmt.Errorf("error on create key: %w", err)
34
	}
35

36
	// https://github.com/src-d/go-git/issues/637
37
	keys.HostKeyCallbackHelper = ssh.HostKeyCallbackHelper{
38
		HostKeyCallback: ss.InsecureIgnoreHostKey(),
39
	}
40

41
	r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
42
		Auth:     keys,
43
		URL:      s.from,
44
		Progress: os.Stdout,
45
		Mirror:   true,
46
		Tags:     git.AllTags,
47
	})
48

49
	if err != nil {
50
		return fmt.Errorf("error on clone: %w", err)
51
	}
52

53
	remote, err := r.CreateRemote(&config.RemoteConfig{
54
		Name:   "sync",
55
		URLs:   []string{s.to},
56
		Mirror: true,
57
	})
58
	if err != nil {
59
		return fmt.Errorf("error on create remote: %w", err)
60
	}
61

62
	if err := remote.Push(&git.PushOptions{
63
		FollowTags: true,
64
		Auth:       keys,
65
		RemoteName: "sync",
66
		Force:      true,
67
		Progress:   os.Stdout,
68
	}); err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) {
69
		return fmt.Errorf("error on push: %w", err)
70
	}
71

72
	return nil
73
}
74

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.