Skip to content

Commit 487f463

Browse files
authored
Run bisync post-merge for go pull (#401)
* Run bisync post-merge for go pull * Add check for merge conflicts
1 parent cb3e2cf commit 487f463

File tree

1 file changed

+32
-23
lines changed

1 file changed

+32
-23
lines changed

cmd/lekko/repo.go

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ func pullCmd() *cobra.Command {
432432
Short: "Pull remote changes and merge them with local changes.",
433433
RunE: func(cmd *cobra.Command, args []string) (err error) {
434434
defer err2.Handle(&err)
435+
ctx := cmd.Context()
435436

436437
dot := try.To1(dotlekko.ReadDotLekko(""))
437438
nativeMetadata, nativeLang := try.To2(native.DetectNativeLang(""))
@@ -475,7 +476,7 @@ func pullCmd() *cobra.Command {
475476
return fmt.Errorf("please commit or stash changes in '%s' before pulling", lekkoPath)
476477
}
477478
}
478-
try.To(gen.GenNative(cmd.Context(), nativeLang, dot.LekkoPath, repoPath, gen.GenOptions{NativeMetadata: nativeMetadata}))
479+
try.To(gen.GenNative(ctx, nativeLang, dot.LekkoPath, repoPath, gen.GenOptions{NativeMetadata: nativeMetadata}))
479480

480481
dot.LockSHA = newHead.Hash().String()
481482
if err := dot.WriteBack(); err != nil {
@@ -500,12 +501,18 @@ func pullCmd() *cobra.Command {
500501
return errors.Wrap(err, "ts pull")
501502
}
502503
case native.GO:
503-
files, err := sync.BisyncGo(cmd.Context(), lekkoPath, lekkoPath, repoPath)
504+
files, err := sync.BisyncGo(ctx, lekkoPath, lekkoPath, repoPath)
504505
if err != nil {
505506
return errors.Wrap(err, "go bisync")
506507
}
508+
hasConflicts := false
507509
for _, f := range files {
508-
try.To(mergeFile(cmd.Context(), f, dot, nativeMetadata))
510+
hasConflicts = hasConflicts && try.To1(mergeFile(ctx, f, dot, nativeMetadata))
511+
}
512+
if !hasConflicts {
513+
if _, err := sync.BisyncGo(ctx, lekkoPath, lekkoPath, repoPath); err != nil {
514+
return errors.Wrap(err, "post-merge go bisync")
515+
}
509516
}
510517
default:
511518
return fmt.Errorf("unsupported language: %s", nativeLang)
@@ -523,54 +530,54 @@ func pullCmd() *cobra.Command {
523530
return cmd
524531
}
525532

526-
func mergeFile(ctx context.Context, filename string, dot *dotlekko.DotLekko, nativeMetadata native.Metadata) (err error) {
533+
func mergeFile(ctx context.Context, filename string, dot *dotlekko.DotLekko, nativeMetadata native.Metadata) (hasConflicts bool, err error) {
527534
defer err2.Handle(&err)
528535
nativeLang, err := native.NativeLangFromExt(filename)
529536
if err != nil {
530-
return err
537+
return false, err
531538
}
532539
ns := try.To1(nativeLang.GetNamespace(filename))
533540

534541
fileBytes, err := os.ReadFile(filename)
535542
if err != nil {
536-
return errors.Wrap(err, "read file")
543+
return false, errors.Wrap(err, "read file")
537544
}
538545
if bytes.Contains(fileBytes, []byte("<<<<<<<")) {
539-
return fmt.Errorf("%s has unresolved merge conflicts", filename)
546+
return false, fmt.Errorf("%s has unresolved merge conflicts", filename)
540547
}
541548

542549
if len(dot.LockSHA) == 0 {
543-
return errors.New("no Lekko lock information found")
550+
return false, errors.New("no Lekko lock information found")
544551
}
545552

546553
repoPath, err := repo.PrepareGithubRepo()
547554
if err != nil {
548-
return err
555+
return false, err
549556
}
550557
gitRepo, err := git.PlainOpen(repoPath)
551558
if err != nil {
552-
return errors.Wrap(err, "open git repo")
559+
return false, errors.Wrap(err, "open git repo")
553560
}
554561
err = repo.ResetAndClean(gitRepo)
555562
if err != nil {
556-
return err
563+
return false, err
557564
}
558565
worktree, err := gitRepo.Worktree()
559566
if err != nil {
560-
return errors.Wrap(err, "get worktree")
567+
return false, errors.Wrap(err, "get worktree")
561568
}
562569

563570
// base
564571
err = worktree.Checkout(&git.CheckoutOptions{
565572
Hash: plumbing.NewHash(dot.LockSHA),
566573
})
567574
if err != nil {
568-
return errors.Wrap(err, fmt.Sprintf("checkout %s", dot.LockSHA))
575+
return false, errors.Wrap(err, fmt.Sprintf("checkout %s", dot.LockSHA))
569576
}
570577

571578
baseDir, err := os.MkdirTemp("", "lekko-merge-base-")
572579
if err != nil {
573-
return errors.Wrap(err, "create temp dir")
580+
return false, errors.Wrap(err, "create temp dir")
574581
}
575582
defer os.RemoveAll(baseDir)
576583
err = gen.GenNative(ctx, nativeLang, dot.LekkoPath, repoPath, gen.GenOptions{
@@ -579,7 +586,7 @@ func mergeFile(ctx context.Context, filename string, dot *dotlekko.DotLekko, nat
579586
NativeMetadata: nativeMetadata,
580587
})
581588
if err != nil {
582-
return errors.Wrap(err, "gen native")
589+
return false, errors.Wrap(err, "gen native")
583590
}
584591

585592
getCommitInfo := func() (string, error) {
@@ -598,19 +605,19 @@ func mergeFile(ctx context.Context, filename string, dot *dotlekko.DotLekko, nat
598605

599606
baseCommitInfo, err := getCommitInfo()
600607
if err != nil {
601-
return errors.Wrap(err, "get commit info")
608+
return false, errors.Wrap(err, "get commit info")
602609
}
603610

604611
// remote
605612
err = worktree.Checkout(&git.CheckoutOptions{
606613
Branch: plumbing.NewBranchReferenceName("main"),
607614
})
608615
if err != nil {
609-
return errors.Wrap(err, "checkout main")
616+
return false, errors.Wrap(err, "checkout main")
610617
}
611618
remoteDir, err := os.MkdirTemp("", "lekko-merge-remote-")
612619
if err != nil {
613-
return errors.Wrap(err, "create temp dir")
620+
return false, errors.Wrap(err, "create temp dir")
614621
}
615622
defer os.RemoveAll(remoteDir)
616623
err = gen.GenNative(ctx, nativeLang, dot.LekkoPath, repoPath, gen.GenOptions{
@@ -619,12 +626,12 @@ func mergeFile(ctx context.Context, filename string, dot *dotlekko.DotLekko, nat
619626
NativeMetadata: nativeMetadata,
620627
})
621628
if err != nil {
622-
return errors.Wrap(err, "gen native")
629+
return false, errors.Wrap(err, "gen native")
623630
}
624631

625632
remoteCommitInfo, err := getCommitInfo()
626633
if err != nil {
627-
return errors.Wrap(err, "get commit info")
634+
return false, errors.Wrap(err, "get commit info")
628635
}
629636

630637
baseFilename := filepath.Join(baseDir, filename)
@@ -644,12 +651,13 @@ func mergeFile(ctx context.Context, filename string, dot *dotlekko.DotLekko, nat
644651
// positive error code is fine, it signals number of conflicts
645652
if ok && exitErr.ExitCode() > 0 {
646653
fmt.Printf("CONFLICT (content): Merge conflict in %s\n", filename)
654+
return true, nil
647655
} else {
648-
return errors.Wrap(err, "git merge-file")
656+
return false, errors.Wrap(err, "git merge-file")
649657
}
650658
}
651659

652-
return nil
660+
return false, nil
653661
}
654662

655663
func mergeFileCmd() *cobra.Command {
@@ -664,7 +672,8 @@ func mergeFileCmd() *cobra.Command {
664672
if err != nil {
665673
return errors.Wrap(err, "open Lekko configuration file")
666674
}
667-
return mergeFile(cmd.Context(), tsFilename, dot, nil)
675+
_, err = mergeFile(cmd.Context(), tsFilename, dot, nil)
676+
return err
668677
},
669678
}
670679
cmd.Flags().StringVarP(&tsFilename, "filename", "f", "", "path to ts file to pull changes into")

0 commit comments

Comments
 (0)