Как закрыть и восстановить память при клонировании репозитория github в память - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть этот кусок кода, который вызывается много раз, и в конце концов через несколько дней я получаю сообщение об ошибке нехватки памяти. Включение и выключение приложения всегда освобождает память и заставляет ее работать. Я занимался исследованиями, но не могу найти что-то, чтобы помочь мне. Я думаю, что у меня утечка памяти при выполнении клонирования в памяти репозитория github. Я делаю это, чтобы получить последний идентификатор фиксации для ветви. Я пытался выяснить, как освободить эту память после получения идентификатора коммита. Может быть, кто-нибудь знает лучший способ получить последний github-репо из репозитория?

с помощью gopkg.in/src-d/go-git.v4


import (
    "gopkg.in/src-d/go-git.v4"
    "gopkg.in/src-d/go-git.v4/plumbing"
    "gopkg.in/src-d/go-git.v4/plumbing/object"
    "gopkg.in/src-d/go-git.v4/storage/memory"
    "github.com/gorilla/mux"
    "fmt"
    "bufio"
    "encoding/json"
    "net/http"
    "os"
    "strings"
)

func GetLastCommit(repo string, branch string, comments bool) string {
    var username string
    var password string
    var giturl string
    var counter int
    var s string
    var c2 int
    var cID string
    var cDev string
    var cComment string
    var returnString string

    username = os.Getenv("gituser")
    password = os.Getenv("gitkey")
    giturl = os.Getenv("giturl")

    giturl = fmt.Sprintf("https://%s:%s@%s%s", username, password, giturl, repo)

    counter = 0

    res, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
        URL:           giturl,
        ReferenceName: plumbing.ReferenceName(fmt.Sprintf("refs/heads/%s", branch)),
        SingleBranch:  true,
    })

    if err != nil {
        fmt.Printf("Error cloning branch: ", err)
    } else {
        // retrieve the branch pointed by HEAD
        ref, err := res.Head()
        if err != nil {
            fmt.Printf("error in retrieve branch: ", err)
        } else {
            // retrieve the commit history
            cIter, err := res.Log(&git.LogOptions{From: ref.Hash()})
            if err != nil {
                fmt.Printf("error in retrieve commit history from branch: ", err)
            } else {
                // iterate over the commits, printing it
                err = cIter.ForEach(func(c *object.Commit) error {
                    if counter < 1 {
                        //fmt.Println(c)
                        s = fmt.Sprintf("%s", c)
                        c2 = 0
                        for _, line := range strings.Split(strings.TrimSuffix(s, "\n"), "\n") {
                            if c2 == 0 {
                                // This is the commit ID
                                subStr := strings.Split(line, " ")
                                fmt.Printf("Commit ID: %s\n", strings.TrimSpace(subStr[1]))
                                cID = strings.TrimSpace(subStr[1])
                            } else if c2 == 1 {
                                // This is the developer's ID
                                subStr := strings.Split(line, ":")
                                fmt.Printf("Dev: %s\n", strings.TrimSpace(subStr[1]))
                                cDev = strings.TrimSpace(subStr[1])
                            } else if c2 == 4 {
                                // This is the commit comments
                                fmt.Printf("Comment: %s\n", strings.TrimSpace(line))
                                cComment = strings.TrimSpace(line)
                            }
                            c2 = c2 + 1
                        }
                    }
                    counter = counter + 1
                    return nil
                })
            }
        }
    }
    if comments {
        returnString = fmt.Sprintf("Most recent commit %s by %s.  Comments: %s", cID, cDev, cComment)
    } else {
        returnString = fmt.Sprintf("%s", cID)
    }

    return(returnString)
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...