diff --git a/admin/sync/importer_gitbin.go b/admin/sync/importer_gitbin.go index eb83c2e0..f2062c63 100644 --- a/admin/sync/importer_gitbin.go +++ b/admin/sync/importer_gitbin.go @@ -5,9 +5,12 @@ package sync import ( "bytes" + "errors" "fmt" "log" + "os" "os/exec" + "path" "strings" ) @@ -77,20 +80,68 @@ func (i GitImporter) Init() error { func (i GitImporter) Sync() error { log.Println("Synchronizing local git repository...") - cmdremote := exec.Command("git", "-C", i.li.Base, "pull", "--rebase", "--force", "-X", "theirs", "--recurse-submodules=yes", "origin") - stdout, err := cmdremote.CombinedOutput() + cmdfetch := exec.Command("git", "-C", i.li.Base, "fetch", "origin") + stdout, err := cmdfetch.CombinedOutput() if err != nil { - log.Printf("Local git repository synchronization failed: %s\n%s", err, stdout) + log.Printf("Git repository fetch failed: %s\n%s", err, stdout) return fmt.Errorf("%w:\n%s", err, stdout) } - cmdsubmodule := exec.Command("git", "-C", i.li.Base, "submodule", "foreach", "--recursive", "git", "lfs", "pull") - stdout, err = cmdsubmodule.CombinedOutput() + cmdclean := exec.Command("git", "-C", i.li.Base, "clean", "-xfde", "*_MERGED") + stdout, err = cmdclean.CombinedOutput() if err != nil { - log.Printf("Local LFS synchronization failed: %s\n%s", err, stdout) + log.Printf("Local git repository clean failed: %s\n%s", err, stdout) return fmt.Errorf("%w:\n%s", err, stdout) } + if _, err := os.Stat(path.Join(i.li.Base, ".gitmodules")); !errors.Is(err, os.ErrNotExist) { + // We have submodules, clean it + cmdsubclean := exec.Command("git", "-C", i.li.Base, "submodule", "foreach", "--recursive", "git", "clean", "-xfde", "*_MERGED") + stdout, err = cmdsubclean.CombinedOutput() + if err != nil { + log.Printf("Local git repository submodules clean failed: %s\n%s", err, stdout) + return fmt.Errorf("%w:\n%s", err, stdout) + } + } + + cmdreset := exec.Command("git", "-C", i.li.Base, "reset", "--hard", "origin/master") + stdout, err = cmdreset.CombinedOutput() + if err != nil { + log.Printf("Local git repository reset failed: %s\n%s", err, stdout) + return fmt.Errorf("%w:\n%s", err, stdout) + } + + if _, err := os.Stat(path.Join(i.li.Base, ".gitmodules")); !errors.Is(err, os.ErrNotExist) { + // Treat submodules + cmdsubreset := exec.Command("git", "-C", i.li.Base, "submodule", "foreach", "--recursive", "git", "reset", "--hard") + stdout, err = cmdsubreset.CombinedOutput() + if err != nil { + log.Printf("Local git repository submodule reset failed: %s\n%s", err, stdout) + return fmt.Errorf("%w:\n%s", err, stdout) + } + + cmdsubupdate := exec.Command("git", "-C", i.li.Base, "submodule", "update", "--init", "--recursive") + stdout, err = cmdsubupdate.CombinedOutput() + if err != nil { + log.Printf("Local git repository submodule update failed: %s\n%s", err, stdout) + return fmt.Errorf("%w:\n%s", err, stdout) + } + + cmdsublfs := exec.Command("git", "-C", i.li.Base, "submodule", "foreach", "--recursive", "git", "lfs", "pull") + stdout, err = cmdsublfs.CombinedOutput() + if err != nil { + log.Printf("Local LFS synchronization failed: %s\n%s", err, stdout) + return fmt.Errorf("%w:\n%s", err, stdout) + } + } else { + cmdlfs := exec.Command("git", "-C", i.li.Base, "lfs", "pull") + stdout, err = cmdlfs.CombinedOutput() + if err != nil { + log.Printf("Local LFS synchronization failed: %s\n%s", err, stdout) + return fmt.Errorf("%w:\n%s", err, stdout) + } + } + log.Println("Local git repository synchronized successfully") return nil }