diff --git a/internal/config/config.go b/internal/config/config.go index 687fe95..e7bb7a1 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -9,5 +9,5 @@ type Config struct { CloneDirectory string // Repository where gir-mirror keep repository Log log.Config Interval int // Update interval in minute - RepoList []git.RepoConfig + RepoList []git.Config } diff --git a/internal/constant/constants.go b/internal/constant/constants.go new file mode 100644 index 0000000..0522e19 --- /dev/null +++ b/internal/constant/constants.go @@ -0,0 +1,7 @@ +package constant + +import "time" + +const ( + HTTPTimeout = 3 * time.Second +) diff --git a/internal/cron/start.go b/internal/cron/start.go index 5726785..5afe1be 100644 --- a/internal/cron/start.go +++ b/internal/cron/start.go @@ -18,7 +18,7 @@ func start(duration time.Duration, fn func(), name string) { } // Launch all repo update background tasks. -func Launch(duration time.Duration, config []git.RepoConfig) { +func Launch(duration time.Duration, config []git.Config) { var counter int for _, content := range config { counter++ diff --git a/internal/git/config.go b/internal/git/config.go index 0037ce2..3311511 100644 --- a/internal/git/config.go +++ b/internal/git/config.go @@ -1,6 +1,6 @@ package git -type RepoConfig struct { +type Config struct { URL string // Source url FullPath string // Full clone directory Name string // Name of clone (directory name) diff --git a/internal/git/clone.go b/internal/git/git.go similarity index 76% rename from internal/git/clone.go rename to internal/git/git.go index 8a618f4..c71e382 100644 --- a/internal/git/clone.go +++ b/internal/git/git.go @@ -8,11 +8,13 @@ import ( "git.gnous.eu/ada/spiegel/internal/utils" goGit "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing/serverinfo" "github.com/go-git/go-git/v5/plumbing/transport/ssh" + "github.com/go-git/go-git/v5/storage/filesystem" "github.com/sirupsen/logrus" ) -func StartClone(repoList []RepoConfig) { +func StartClone(repoList []Config) { logrus.Debug("Start first repository clone") for _, content := range repoList { _, err := os.Stat(content.FullPath) @@ -22,7 +24,7 @@ func StartClone(repoList []RepoConfig) { } } -func (c RepoConfig) fullClone() { +func (c Config) fullClone() { logrus.Debug("Clone ", c.Name, "...") logger := logrus.New() w := logger.Writer() @@ -66,9 +68,14 @@ func (c RepoConfig) fullClone() { if err != nil { logrus.Error(err) } + + err = c.UpdateInfo() + if err != nil { + logrus.Error(err) + } } -func (c RepoConfig) Update() { +func (c Config) Update() { repo, err := goGit.PlainOpen(c.FullPath) if err != nil { logrus.Error(err) @@ -117,4 +124,23 @@ func (c RepoConfig) Update() { logrus.Error(err) } } + + err = c.UpdateInfo() + if err != nil { + logrus.Error(err) + } +} + +func (c Config) UpdateInfo() error { + r, err := goGit.PlainOpen(c.FullPath) + if err != nil { + return err + } + + err = serverinfo.UpdateServerInfo(r.Storer, r.Storer.(*filesystem.Storage).Filesystem()) //nolint: forcetypeassert + if err != nil { + return err + } + + return nil } diff --git a/internal/router/init.go b/internal/router/init.go new file mode 100644 index 0000000..2f2fb8b --- /dev/null +++ b/internal/router/init.go @@ -0,0 +1,29 @@ +package router + +import ( + "net/http" + + "git.gnous.eu/ada/spiegel/internal/constant" + "github.com/sirupsen/logrus" +) + +type Config struct { + Listen string + Archive string +} + +func (c Config) Router() { + mux := http.NewServeMux() + fs := http.FileServer(http.Dir(c.Archive)) + mux.Handle("/git/", http.StripPrefix("/git/", fs)) + + server := &http.Server{ + Addr: c.Listen, + Handler: mux, + ReadHeaderTimeout: constant.HTTPTimeout, + } + + logrus.Info("HTTP listen on :5000") + + logrus.Fatal(server.ListenAndServe()) +} diff --git a/main.go b/main.go index 6fccab8..2c0d127 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "git.gnous.eu/ada/spiegel/internal/config" "git.gnous.eu/ada/spiegel/internal/cron" "git.gnous.eu/ada/spiegel/internal/git" + "git.gnous.eu/ada/spiegel/internal/router" "github.com/sirupsen/logrus" ) @@ -38,6 +39,9 @@ func main() { logrus.Info("Config loaded") logrus.Debug("Config: ", initConfig) + routerConfig := router.Config{Listen: ":3000", Archive: initConfig.CloneDirectory} + go routerConfig.Router() + git.StartClone(initConfig.RepoList) duration := time.Duration(initConfig.Interval) * time.Minute