// NewGit returns the handler to be used for the Git server func NewGit(s3Client *s3.Client, bucketName, tmpDir string) http.Handler { hdl := githttp.New(tmpDir) // hdl.UploadPack = false hdl.FillRepo = func(repoDir string) error { if !strings.HasPrefix(repoDir, tmpDir) { return fmt.Errorf("invalid repoDir in FillRepo (%s)", repoDir) } packageName := repoDir[len(tmpDir)+1:] if err := os.MkdirAll(repoDir, os.ModePerm); err != nil { log.Printf("error creating %s (%s)", repoDir, err) return fmt.Errorf("error creating %s (%s)", repoDir, err) } objInfo, err := storage.PackageExists(s3Client, bucketName, packageName) needsDownload := true if err != nil { if err := gitClone(packageName, repoDir); err != nil { log.Printf("Error git cloning %s (%s)", packageName, err) return err } if err := storage.UploadPackage(s3Client, bucketName, packageName, repoDir); err != nil { log.Printf("Error uploading package %s from %s (%s)", packageName, repoDir, err) } needsDownload = false } if needsDownload { obj, err := s3Client.GetObject(bucketName, objInfo.Key) if err != nil { log.Printf("Error downloading %s from bucket %s (%s)", objInfo.Key, bucketName, err) return err } if err := storage.UntarToDisk(obj, repoDir); err != nil { log.Printf("Error untarring %s to %s (%s)", objInfo.Key, repoDir, err) return err } } return nil } return hdl }