diff --git a/onstatic/handler.go b/onstatic/handler.go index 0092d93..313522e 100644 --- a/onstatic/handler.go +++ b/onstatic/handler.go @@ -76,9 +76,10 @@ func handlePull(res http.ResponseWriter, req *http.Request) { return } - reponame := getHashedDirectoryName( - strings.TrimSpace(req.Header.Get(repoKey)), - ) + reponame := strings.TrimSpace(req.Header.Get(repoKey)) + reponame = getHashedDirectoryName(reponame) + branchName := strings.TrimSpace(req.Header.Get(branchKey)) + repo, err := loadLocalRepository(reponame) if err != nil { zap.L().Error("failed to load repo", zap.Error(err)) @@ -86,7 +87,7 @@ func handlePull(res http.ResponseWriter, req *http.Request) { return } - if err := doGitPull(repo); err != nil { + if err := doGitPull(repo, branchName); err != nil { zap.L().Error("failed to gitpull", zap.Error(err)) res.WriteHeader(http.StatusServiceUnavailable) return @@ -185,6 +186,7 @@ func hasIgnoreSuffix(p string) bool { const ( validateKey = "X-ONSTATIC-KEY" repoKey = "X-ONSTATIC-REPONAME" + branchKey = "X-ONSTATIC-BRANCH-NAME" ) func validate(res http.ResponseWriter, req *http.Request) bool { diff --git a/onstatic/service.go b/onstatic/service.go index b1b4b51..045462d 100644 --- a/onstatic/service.go +++ b/onstatic/service.go @@ -15,6 +15,7 @@ import ( "gopkg.in/src-d/go-billy.v4/util" "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/config" + "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/plumbing/cache" "gopkg.in/src-d/go-git.v4/plumbing/transport/ssh" "gopkg.in/src-d/go-git.v4/storage/filesystem" @@ -190,13 +191,14 @@ func configureOriginRepository(repo *git.Repository, originURL string) error { Name: originName, URLs: []string{originURL}, }) + if err != nil { return failure.Wrap(err) } return nil } -func doGitPull(repo *git.Repository) error { +func doGitPull(repo *git.Repository, branchName string) error { w, err := repo.Worktree() if err != nil { return failure.Wrap(err) @@ -211,10 +213,17 @@ func doGitPull(repo *git.Repository) error { return failure.Wrap(err) } - err = w.Pull(&git.PullOptions{ + opt := &git.PullOptions{ RemoteName: originName, Auth: auth, - }) + Force: true, + } + + if branchName != "" { + opt.ReferenceName = plumbing.NewBranchReferenceName(branchName) + } + + err = w.Pull(opt) if err != nil { return failure.Wrap(err) }