myml / myml.github.io

myml的个人网站
https://myml.dev
3 stars 0 forks source link

github api create commit #35

Open myml opened 2 years ago

myml commented 2 years ago

// Deprecated
func commit(ctx context.Context, client *github.Client, owner, repo, branch, message string, files []string) (string, error) {
    currentRef, _, err := client.Git.GetRef(ctx, owner, repo, "heads/"+branch)
    if err != nil {
        return "", fmt.Errorf("get ref: %w", err)
    }
    currentTree, _, err := client.Git.GetTree(ctx, owner, repo, currentRef.GetObject().GetSHA(), false)
    if err != nil {
        return "", fmt.Errorf("get tree: %w", err)
    }
    var entrys []github.TreeEntry
    for i := range files {
        info, err := os.Stat(files[i])
        if err != nil {
            return "", fmt.Errorf("stat file: %w", err)
        }
        mode := fmt.Sprintf("100%o", info.Mode())
        content, err := os.ReadFile(files[i])
        if err != nil {
            return "", fmt.Errorf("open file: %w", err)
        }
        sha := sha1.New()
        sha.Write([]byte(fmt.Sprintf("blob %d", len(content))))
        sha.Write([]byte{0})
        sha.Write(content)
        localSHA := hex.EncodeToString(sha.Sum(nil))

        changed := true
        for _, entrie := range currentTree.Entries {
            if entrie.GetPath() != files[i] {
                continue
            }
            if entrie.GetSHA() == localSHA && entrie.GetMode() == mode {
                changed = false
            }
        }
        log.Println(files[i], changed)
        if !changed {
            continue
        }
        blob, resp, err := client.Git.GetBlob(ctx, owner, repo, localSHA)
        if err != nil {
            if resp.StatusCode != http.StatusNotFound {
                return "", fmt.Errorf("get blob: %w", err)
            }
            log.Println("create blob")
            blob, _, err = client.Git.CreateBlob(ctx, owner, repo, &github.Blob{Content: github.String(string(content))})
            if err != nil {
                return "", fmt.Errorf("create blob: %w", err)
            }
        }
        entrys = append(entrys, github.TreeEntry{
            Path: github.String(files[i]),
            Mode: github.String(mode),
            Type: github.String("blob"),
            SHA:  github.String(blob.GetSHA()),
        })
    }
    log.Println(entrys)
    if len(entrys) == 0 {
        return "", nil
    }
    tree, _, err := client.Git.CreateTree(ctx, owner, repo, currentRef.GetObject().GetSHA(), entrys)
    if err != nil {
        return "", fmt.Errorf("create tree: %w", err)
    }
    log.Println(tree)
    parent, _, err := client.Git.GetCommit(ctx, owner, repo, currentRef.GetObject().GetSHA())
    if err != nil {
        return "", fmt.Errorf("get parent commit: %w", err)
    }
    _, _, err = client.Git.CreateCommit(ctx, owner, repo,
        &github.Commit{
            Message: github.String(message),
            Tree:    tree,
            Parents: []github.Commit{*parent},
        },
    )
    if err != nil {
        return "", fmt.Errorf("create commit: %w", err)
    }
    ref := &github.Reference{
        Ref:    github.String(currentRef.GetRef()),
        Object: &github.GitObject{SHA: github.String(currentRef.GetObject().GetSHA())},
    }
    update, _, err := client.Git.UpdateRef(ctx, owner, repo, ref, false)
    if err != nil {
        return "", fmt.Errorf("update ref: %w", err)
    }
    return update.GetObject().GetSHA(), nil
}