2019-05-11 18:29:17 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
"fmt"
"os"
"strings"
2020-09-07 06:53:42 +03:00
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2020-09-07 06:53:42 +03:00
"code.gitea.io/gitea/modules/setting"
2019-05-11 18:29:17 +03:00
)
2020-02-03 11:47:04 +03:00
// env keys for git hooks need
const (
EnvRepoName = "GITEA_REPO_NAME"
EnvRepoUsername = "GITEA_REPO_USER_NAME"
2020-08-30 10:24:39 +03:00
EnvRepoID = "GITEA_REPO_ID"
2020-02-03 11:47:04 +03:00
EnvRepoIsWiki = "GITEA_REPO_IS_WIKI"
EnvPusherName = "GITEA_PUSHER_NAME"
EnvPusherEmail = "GITEA_PUSHER_EMAIL"
EnvPusherID = "GITEA_PUSHER_ID"
2022-03-22 12:29:07 +03:00
EnvKeyID = "GITEA_KEY_ID" // public key ID
EnvDeployKeyID = "GITEA_DEPLOY_KEY_ID"
2020-08-30 10:24:39 +03:00
EnvPRID = "GITEA_PR_ID"
2020-02-03 11:47:04 +03:00
EnvIsInternal = "GITEA_INTERNAL_PUSH"
2020-09-07 06:53:42 +03:00
EnvAppURL = "GITEA_ROOT_URL"
2020-02-03 11:47:04 +03:00
)
2019-12-28 00:15:04 +03:00
// InternalPushingEnvironment returns an os environment to switch off hooks on push
// It is recommended to avoid using this unless you are pushing within a transaction
// or if you absolutely are sure that post-receive and pre-receive will do nothing
// We provide the full pushing-environment for other hook providers
2021-12-10 04:27:50 +03:00
func InternalPushingEnvironment ( doer * user_model . User , repo * repo_model . Repository ) [ ] string {
2019-12-28 00:15:04 +03:00
return append ( PushingEnvironment ( doer , repo ) ,
EnvIsInternal + "=true" ,
)
}
2019-05-11 18:29:17 +03:00
// PushingEnvironment returns an os environment to allow hooks to work on push
2021-12-10 04:27:50 +03:00
func PushingEnvironment ( doer * user_model . User , repo * repo_model . Repository ) [ ] string {
2019-07-26 00:50:20 +03:00
return FullPushingEnvironment ( doer , doer , repo , repo . Name , 0 )
2019-07-01 04:18:13 +03:00
}
// FullPushingEnvironment returns an os environment to allow hooks to work on push
2021-12-10 04:27:50 +03:00
func FullPushingEnvironment ( author , committer * user_model . User , repo * repo_model . Repository , repoName string , prID int64 ) [ ] string {
2019-05-11 18:29:17 +03:00
isWiki := "false"
2019-07-26 00:50:20 +03:00
if strings . HasSuffix ( repoName , ".wiki" ) {
2019-05-11 18:29:17 +03:00
isWiki = "true"
}
2019-07-01 04:18:13 +03:00
authorSig := author . NewGitSig ( )
committerSig := committer . NewGitSig ( )
2019-05-11 18:29:17 +03:00
2020-08-30 10:24:39 +03:00
environ := append ( os . Environ ( ) ,
2019-07-01 04:18:13 +03:00
"GIT_AUTHOR_NAME=" + authorSig . Name ,
"GIT_AUTHOR_EMAIL=" + authorSig . Email ,
"GIT_COMMITTER_NAME=" + committerSig . Name ,
"GIT_COMMITTER_EMAIL=" + committerSig . Email ,
2019-07-26 00:50:20 +03:00
EnvRepoName + "=" + repoName ,
2020-01-12 12:36:21 +03:00
EnvRepoUsername + "=" + repo . OwnerName ,
2019-05-11 18:29:17 +03:00
EnvRepoIsWiki + "=" + isWiki ,
2019-07-01 04:18:13 +03:00
EnvPusherName + "=" + committer . Name ,
EnvPusherID + "=" + fmt . Sprintf ( "%d" , committer . ID ) ,
2020-08-30 10:24:39 +03:00
EnvRepoID + "=" + fmt . Sprintf ( "%d" , repo . ID ) ,
EnvPRID + "=" + fmt . Sprintf ( "%d" , prID ) ,
2020-09-07 06:53:42 +03:00
EnvAppURL + "=" + setting . AppURL ,
2019-07-01 04:18:13 +03:00
"SSH_ORIGINAL_COMMAND=gitea-internal" ,
2019-05-11 18:29:17 +03:00
)
2020-08-30 10:24:39 +03:00
if ! committer . KeepEmailPrivate {
environ = append ( environ , EnvPusherEmail + "=" + committer . Email )
}
return environ
2019-05-11 18:29:17 +03:00
}