mirror of
https://github.com/browseros-ai/BrowserOS.git
synced 2026-05-18 11:06:19 +00:00
115 lines
2.5 KiB
Go
115 lines
2.5 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"bdev/internal/config"
|
|
"bdev/internal/git"
|
|
"bdev/internal/patch"
|
|
"bdev/internal/ui"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var diffCmd = &cobra.Command{
|
|
Use: "diff",
|
|
Short: "Preview what push or pull would do",
|
|
RunE: runDiff,
|
|
}
|
|
|
|
var diffDirection string
|
|
|
|
func init() {
|
|
diffCmd.Flags().StringVar(&diffDirection, "direction", "push", "\"push\" or \"pull\"")
|
|
rootCmd.AddCommand(diffCmd)
|
|
}
|
|
|
|
func runDiff(cmd *cobra.Command, args []string) error {
|
|
ctx, err := config.LoadContext()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
switch diffDirection {
|
|
case "push":
|
|
return diffPush(ctx)
|
|
case "pull":
|
|
return diffPull(ctx)
|
|
default:
|
|
return fmt.Errorf("invalid direction %q — use \"push\" or \"pull\"", diffDirection)
|
|
}
|
|
}
|
|
|
|
func diffPush(ctx *config.Context) error {
|
|
nameStatus, err := git.DiffNameStatus(ctx.ChromiumDir, ctx.BaseCommit)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(nameStatus) == 0 {
|
|
fmt.Println(ui.MutedStyle.Render("No local changes to push."))
|
|
return nil
|
|
}
|
|
|
|
fmt.Println(ui.TitleStyle.Render("bdev diff --direction push"))
|
|
fmt.Println()
|
|
|
|
for path, op := range nameStatus {
|
|
prefix := ui.ModifiedPrefix
|
|
switch op {
|
|
case patch.OpAdded:
|
|
prefix = ui.AddedPrefix
|
|
case patch.OpDeleted:
|
|
prefix = ui.DeletedPrefix
|
|
}
|
|
fmt.Printf(" %s %s\n", prefix, path)
|
|
}
|
|
fmt.Println()
|
|
fmt.Println(ui.MutedStyle.Render(fmt.Sprintf("%d files would be pushed", len(nameStatus))))
|
|
|
|
return nil
|
|
}
|
|
|
|
func diffPull(ctx *config.Context) error {
|
|
repoPatchSet, err := patch.ReadPatchSet(ctx.PatchesDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
diffOutput, err := git.DiffFull(ctx.ChromiumDir, ctx.BaseCommit)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
localPatchSet, err := patch.ParseUnifiedDiff(diffOutput)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
delta := patch.Compare(localPatchSet, repoPatchSet)
|
|
|
|
total := len(delta.NeedsUpdate) + len(delta.NeedsApply)
|
|
if total == 0 && len(delta.Deleted) == 0 {
|
|
fmt.Println(ui.MutedStyle.Render("Already up to date."))
|
|
return nil
|
|
}
|
|
|
|
fmt.Println(ui.TitleStyle.Render("bdev diff --direction pull"))
|
|
fmt.Println()
|
|
|
|
for _, f := range delta.NeedsUpdate {
|
|
fmt.Printf(" %s %s %s\n", ui.ModifiedPrefix, f, ui.MutedStyle.Render("(update)"))
|
|
}
|
|
for _, f := range delta.NeedsApply {
|
|
fmt.Printf(" %s %s %s\n", ui.AddedPrefix, f, ui.MutedStyle.Render("(new)"))
|
|
}
|
|
for _, f := range delta.Deleted {
|
|
fmt.Printf(" %s %s %s\n", ui.DeletedPrefix, f, ui.MutedStyle.Render("(delete)"))
|
|
}
|
|
|
|
fmt.Println()
|
|
fmt.Println(ui.MutedStyle.Render(fmt.Sprintf("%d files would be changed", total+len(delta.Deleted))))
|
|
|
|
return nil
|
|
}
|