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
5448type 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+
137228func (r repoMerger ) accValues () []* entity.RepoV1 {
138229 values := []* entity.RepoV1 {}
139230 for _ , v := range * r .acc {
0 commit comments