Skip to content

Commit e2eaab6

Browse files
committed
clone new repos from be
1 parent afbbfd0 commit e2eaab6

File tree

1 file changed

+107
-16
lines changed

1 file changed

+107
-16
lines changed

pkg/cmd/updatemodel/updatemodel.go

Lines changed: 107 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"os"
55
"path/filepath"
66

7+
"github.com/hashicorp/go-multierror"
78
"github.com/samber/lo"
89
"github.com/spf13/cobra"
910

@@ -34,31 +35,95 @@ func NewCmdupdatemodel(t *terminal.Terminal, store updatemodelStore) *cobra.Comm
3435
Short: short,
3536
Long: long,
3637
Example: example,
37-
RunE: func(cmd *cobra.Command, args []string) error {
38-
err := updateModel{
39-
t: t,
40-
args: args,
41-
store: store,
42-
directory: directory,
43-
}.Run()
44-
if err != nil {
45-
return breverrors.WrapAndTrace(err)
46-
}
47-
return nil
48-
},
38+
RunE: updateModel{
39+
t: t,
40+
store: store,
41+
directory: directory,
42+
}.RunE,
4943
}
5044
cmd.Flags().StringVarP(&directory, "directory", "d", ".", "Directory to run command in")
5145
return cmd
5246
}
5347

5448
type updateModel struct {
5549
t *terminal.Terminal
56-
args []string
5750
store updatemodelStore
5851
directory string
5952
}
6053

61-
func (u updateModel) Run() error {
54+
func (u updateModel) RunE(_ *cobra.Command, _ []string) error {
55+
// this could be done in one go but this way is easier to reason about
56+
err := u.updateBE()
57+
if err != nil {
58+
return breverrors.WrapAndTrace(err)
59+
}
60+
61+
return nil
62+
}
63+
64+
func (u updateModel) updateENV() error {
65+
remotes, err := u.remotes()
66+
if err != nil {
67+
return breverrors.WrapAndTrace(err)
68+
}
69+
workspaceID, err := u.store.GetCurrentWorkspaceID()
70+
if err != nil {
71+
return breverrors.WrapAndTrace(err)
72+
}
73+
74+
workspace, err := u.store.GetWorkspace(workspaceID)
75+
if err != nil {
76+
return breverrors.WrapAndTrace(err)
77+
}
78+
79+
reposv1FromBE := workspace.ReposV1
80+
reposv1FromENV := lo.Reduce(
81+
remotes,
82+
func(acc *entity.ReposV1, remote *git.Remote, _ int) *entity.ReposV1 {
83+
name := remote.Config().Name
84+
url := remote.Config().URLs[0]
85+
a := *acc
86+
a[entity.RepoName(name)] = entity.RepoV1{
87+
Type: entity.GitRepoType,
88+
GitRepo: entity.GitRepo{
89+
Repository: url,
90+
},
91+
}
92+
return &a
93+
},
94+
&entity.ReposV1{},
95+
)
96+
97+
envLocalRepoMerger := &repoMerger{
98+
acc: reposv1FromENV,
99+
repos: []*entity.ReposV1{reposv1FromBE},
100+
}
101+
102+
errors := lo.Map(
103+
envLocalRepoMerger.ReposToClone(),
104+
func(repo *entity.RepoV1, _ int) error {
105+
return nil
106+
},
107+
)
108+
109+
return breverrors.WrapAndTrace(
110+
lo.Reduce(
111+
errors,
112+
func(acc error, err error, _ int) error {
113+
if acc != nil && err != nil {
114+
return multierror.Append(acc, err)
115+
}
116+
if acc == nil && err != nil {
117+
return err
118+
}
119+
return acc
120+
},
121+
nil,
122+
),
123+
)
124+
}
125+
126+
func (u updateModel) updateBE() error {
62127
remotes, err := u.remotes()
63128
if err != nil {
64129
return breverrors.WrapAndTrace(err)
@@ -99,7 +164,7 @@ func (u updateModel) Run() error {
99164
_, err = u.store.ModifyWorkspace(
100165
workspaceID,
101166
&store.ModifyWorkspaceRequest{
102-
ReposV1: beLocalRepoMerger.Merge(),
167+
ReposV1: beLocalRepoMerger.MergeBE(),
103168
},
104169
)
105170
if err != nil {
@@ -113,7 +178,7 @@ type repoMerger struct {
113178
repos []*entity.ReposV1
114179
}
115180

116-
func (r *repoMerger) Merge() *entity.ReposV1 {
181+
func (r *repoMerger) MergeBE() *entity.ReposV1 {
117182
for _, repo := range r.repos {
118183
for k, v := range *repo {
119184
if _, ok := (*r.acc)[k]; ok {
@@ -134,6 +199,32 @@ func (r *repoMerger) Merge() *entity.ReposV1 {
134199
return r.acc
135200
}
136201

202+
func (r *repoMerger) ReposToClone() []*entity.RepoV1 {
203+
// repos present in the BE but not in the ENV
204+
return lo.Filter(
205+
r.accValues(),
206+
func(repo *entity.RepoV1, _ int) bool {
207+
_, valueInENV := lo.Find(
208+
r.reposValues(),
209+
func(repo *entity.RepoV1) bool {
210+
return repo.GitRepo.Repository == repo.GitRepo.Repository
211+
},
212+
)
213+
return !valueInENV
214+
},
215+
)
216+
}
217+
218+
func (r repoMerger) reposValues() []*entity.RepoV1 {
219+
values := []*entity.RepoV1{}
220+
for _, repo := range r.repos {
221+
for _, v := range *repo {
222+
values = append(values, &v)
223+
}
224+
}
225+
return values
226+
}
227+
137228
func (r repoMerger) accValues() []*entity.RepoV1 {
138229
values := []*entity.RepoV1{}
139230
for _, v := range *r.acc {

0 commit comments

Comments
 (0)