Exemplo n.º 1
0
// 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
}