Do not read or write git reference files directly (#18079)
Git will and can pack references into packfiles and therefore if you write/read the files directly you will get false results. Instead you should use update-ref and show-ref. To that end I have created three new functions in git/repo_commit.go that will do this correctly. Related #17191 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
parent
e0cf3d86c4
commit
ffc08c1914
6 changed files with 32 additions and 45 deletions
|
@ -11,7 +11,6 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
|
@ -275,25 +274,6 @@ func (repo *Repository) GetDiffFromMergeBase(base, head string, w io.Writer) err
|
|||
return err
|
||||
}
|
||||
|
||||
// ReadPullHead will fetch a pull ref if possible or return an error
|
||||
func (repo *Repository) ReadPullHead(prID int64) (commitSHA string, err error) {
|
||||
headPath := fmt.Sprintf("refs/pull/%d/head", prID)
|
||||
fullHeadPath := filepath.Join(repo.Path, headPath)
|
||||
loadHead, err := os.Open(fullHeadPath)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer loadHead.Close()
|
||||
// Read only the first line of the patch - usually it contains the first commit made in patch
|
||||
scanner := bufio.NewScanner(loadHead)
|
||||
scanner.Scan()
|
||||
commitHead := scanner.Text()
|
||||
if len(commitHead) != 40 {
|
||||
return "", errors.New("head file doesn't contain valid commit ID")
|
||||
}
|
||||
return commitHead, nil
|
||||
}
|
||||
|
||||
// ReadPatchCommit will check if a diff patch exists and return stats
|
||||
func (repo *Repository) ReadPatchCommit(prID int64) (commitSHA string, err error) {
|
||||
// Migrated repositories download patches to "pulls" location
|
||||
|
@ -315,16 +295,3 @@ func (repo *Repository) ReadPatchCommit(prID int64) (commitSHA string, err error
|
|||
}
|
||||
return commitSHA, nil
|
||||
}
|
||||
|
||||
// WritePullHead will populate a PR head retrieved from patch file
|
||||
func (repo *Repository) WritePullHead(prID int64, commitSHA string) error {
|
||||
headPath := fmt.Sprintf("refs/pull/%d", prID)
|
||||
fullHeadPath := filepath.Join(repo.Path, headPath)
|
||||
// Create missing directory just in case
|
||||
if err := os.MkdirAll(fullHeadPath, os.ModePerm); err != nil {
|
||||
return err
|
||||
}
|
||||
commitBytes := []byte(commitSHA)
|
||||
pullPath := filepath.Join(fullHeadPath, "head")
|
||||
return ioutil.WriteFile(pullPath, commitBytes, os.ModePerm)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue