-
Notifications
You must be signed in to change notification settings - Fork 0
/
copy_repo_fork.go
83 lines (79 loc) · 1.98 KB
/
copy_repo_fork.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package git2
import (
"fmt"
pb "golang.conradwood.net/apis/gitserver"
"golang.conradwood.net/gitserver/db"
"golang.conradwood.net/go-easyops/authremote"
"golang.conradwood.net/go-easyops/linux"
"golang.conradwood.net/go-easyops/utils"
"strings"
)
var (
copy_triggers = make(chan *CopyTrigger)
)
type CopyTrigger struct {
source *pb.SourceRepository
dest *pb.SourceRepository
}
func init() {
go start_copy_thread()
}
func copyrepo(source, dest *pb.SourceRepository) {
ct := &CopyTrigger{
source: source,
dest: dest,
}
copy_triggers <- ct
}
func start_copy_thread() {
for {
ct := <-copy_triggers
ct.Debugf("starting copy...")
err := ct.Copy()
if err != nil {
ct.Errorf("Failed to copy (%s)", utils.ErrorString(err))
}
}
}
func (ct *CopyTrigger) Errorf(format string, args ...interface{}) {
txt := fmt.Sprintf("[copy %d->%d] ", ct.source.ID, ct.dest.ID)
fmt.Printf(txt+format+"\n", args...)
}
func (ct *CopyTrigger) Debugf(format string, args ...interface{}) {
txt := fmt.Sprintf("[copy %d->%d] ", ct.source.ID, ct.dest.ID)
fmt.Printf(txt+format+"\n", args...)
}
func (ct *CopyTrigger) Copy() error {
// refresh copy to check if it has stopped 'forking' meanwhile
ctx := authremote.Context()
fr, err := db.NewDBSourceRepository(psql).ByID(ctx, ct.dest.ID)
if err != nil {
return err
}
ct.dest = fr
if !ct.dest.Forking {
ct.Debugf("no longer forking")
return nil
}
linux.New()
src := *root_dir + "/" + strings.Trim(ct.source.FilePath, "/")
dest := *root_dir + "/" + strings.Trim(ct.dest.FilePath, "/")
ct.Debugf("Copying \"%s\" to \"%s\"...", src, dest)
err = linux.CopyDir(src, dest)
if err != nil {
return err
}
// now update database to say it is no longer forking
ctx = authremote.Context()
fr, err = db.NewDBSourceRepository(psql).ByID(ctx, ct.dest.ID)
if err != nil {
return err
}
fr.Forking = false
err = db.NewDBSourceRepository(psql).Update(ctx, fr)
if err != nil {
return err
}
ct.Debugf("Copy complete and database updated")
return nil
}