kubesphere / ksbuilder

A CLI tool helps you to manage the development of kubesphere extensions
MIT License
10 stars 19 forks source link

Add a parser package to parse the metadata of an extension #31

Closed iawia002 closed 1 year ago

iawia002 commented 1 year ago

Usage example:

func main() {
    file, _ := os.ReadFile("test-0.1.0.tgz")
    extension, err := parser.ParseExtension("test", file, parser.WithLanguage("zh"))
    if err != nil {
        panic(err)
    }
    data, _ := json.Marshal(extension)
    fmt.Println(string(data))
}

ref https://github.com/kubesphere/issues/issues/1097 https://github.com/kubesphere/issues/issues/1024

stoneshi-yunify commented 1 year ago

/lgtm

iawia002 commented 1 year ago

/cc @wansir

wansir commented 1 year ago

LGTM

stoneshi-yunify commented 1 year ago

just one comment, the targz file ([]byte) is not needed to save as file, can be directly parsed using the tar module. e.g.

func (u *S3Service) UploadFilesInTgz(ctx context.Context, tgz io.Reader, prefix string, parent string, acl string) error {
    if u.err != nil {
        return u.err
    }
    uncompressedStream, err := gzip.NewReader(tgz)
    if err != nil {
        return err
    }
    tarReader := tar.NewReader(uncompressedStream)
    var header *tar.Header
    for header, err = tarReader.Next(); err == nil; header, err = tarReader.Next() {
        if header.Typeflag == tar.TypeReg && strings.HasPrefix(header.Name, prefix) && header.Size > 0 {
            var buf []byte
            var size int64
            buffer := bytes.NewBuffer(buf)
            size, err = io.Copy(buffer, tarReader)
            if err != nil && err != io.EOF {
                return err
            }
            if size != header.Size {
                return io.ErrUnexpectedEOF
            }
            err = u.Upload(ctx, header.Name, buffer, parent, acl)
            if err != nil {
                return err
            }
        }
    }
    if err != nil && err != io.EOF {
        return err
    }
    return nil
}