github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/internal/build/env.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2016 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package build
    26  
    27  import (
    28  	"flag"
    29  	"fmt"
    30  	"os"
    31  	"strings"
    32  )
    33  
    34  var (
    35  //这些标志覆盖build env中的值。
    36  	GitCommitFlag   = flag.String("git-commit", "", `Overrides git commit hash embedded into executables`)
    37  	GitBranchFlag   = flag.String("git-branch", "", `Overrides git branch being built`)
    38  	GitTagFlag      = flag.String("git-tag", "", `Overrides git tag being built`)
    39  	BuildnumFlag    = flag.String("buildnum", "", `Overrides CI build number`)
    40  	PullRequestFlag = flag.Bool("pull-request", false, `Overrides pull request status of the build`)
    41  	CronJobFlag     = flag.Bool("cron-job", false, `Overrides cron job status of the build`)
    42  )
    43  
    44  //环境包含由生成环境提供的元数据。
    45  type Environment struct {
    46  Name                string //环境名称
    47  Repo                string //Github回购的名称
    48  Commit, Branch, Tag string //GIT信息
    49  	Buildnum            string
    50  	IsPullRequest       bool
    51  	IsCronJob           bool
    52  }
    53  
    54  func (env Environment) String() string {
    55  	return fmt.Sprintf("%s env (commit:%s branch:%s tag:%s buildnum:%s pr:%t)",
    56  		env.Name, env.Commit, env.Branch, env.Tag, env.Buildnum, env.IsPullRequest)
    57  }
    58  
    59  //env返回有关当前CI环境的元数据,返回到localenv
    60  //如果不在CI上运行。
    61  func Env() Environment {
    62  	switch {
    63  	case os.Getenv("CI") == "true" && os.Getenv("TRAVIS") == "true":
    64  		return Environment{
    65  			Name:          "travis",
    66  			Repo:          os.Getenv("TRAVIS_REPO_SLUG"),
    67  			Commit:        os.Getenv("TRAVIS_COMMIT"),
    68  			Branch:        os.Getenv("TRAVIS_BRANCH"),
    69  			Tag:           os.Getenv("TRAVIS_TAG"),
    70  			Buildnum:      os.Getenv("TRAVIS_BUILD_NUMBER"),
    71  			IsPullRequest: os.Getenv("TRAVIS_PULL_REQUEST") != "false",
    72  			IsCronJob:     os.Getenv("TRAVIS_EVENT_TYPE") == "cron",
    73  		}
    74  	case os.Getenv("CI") == "True" && os.Getenv("APPVEYOR") == "True":
    75  		return Environment{
    76  			Name:          "appveyor",
    77  			Repo:          os.Getenv("APPVEYOR_REPO_NAME"),
    78  			Commit:        os.Getenv("APPVEYOR_REPO_COMMIT"),
    79  			Branch:        os.Getenv("APPVEYOR_REPO_BRANCH"),
    80  			Tag:           os.Getenv("APPVEYOR_REPO_TAG_NAME"),
    81  			Buildnum:      os.Getenv("APPVEYOR_BUILD_NUMBER"),
    82  			IsPullRequest: os.Getenv("APPVEYOR_PULL_REQUEST_NUMBER") != "",
    83  			IsCronJob:     os.Getenv("APPVEYOR_SCHEDULED_BUILD") == "True",
    84  		}
    85  	default:
    86  		return LocalEnv()
    87  	}
    88  }
    89  
    90  //localenv返回从git收集的生成环境元数据。
    91  func LocalEnv() Environment {
    92  	env := applyEnvFlags(Environment{Name: "local", Repo: "ethereum/go-ethereum"})
    93  
    94  	head := readGitFile("HEAD")
    95  	if splits := strings.Split(head, " "); len(splits) == 2 {
    96  		head = splits[1]
    97  	} else {
    98  		return env
    99  	}
   100  	if env.Commit == "" {
   101  		env.Commit = readGitFile(head)
   102  	}
   103  	if env.Branch == "" {
   104  		if head != "HEAD" {
   105  			env.Branch = strings.TrimPrefix(head, "refs/heads/")
   106  		}
   107  	}
   108  	if info, err := os.Stat(".git/objects"); err == nil && info.IsDir() && env.Tag == "" {
   109  		env.Tag = firstLine(RunGit("tag", "-l", "--points-at", "HEAD"))
   110  	}
   111  	return env
   112  }
   113  
   114  func firstLine(s string) string {
   115  	return strings.Split(s, "\n")[0]
   116  }
   117  
   118  func applyEnvFlags(env Environment) Environment {
   119  	if !flag.Parsed() {
   120  		panic("you need to call flag.Parse before Env or LocalEnv")
   121  	}
   122  	if *GitCommitFlag != "" {
   123  		env.Commit = *GitCommitFlag
   124  	}
   125  	if *GitBranchFlag != "" {
   126  		env.Branch = *GitBranchFlag
   127  	}
   128  	if *GitTagFlag != "" {
   129  		env.Tag = *GitTagFlag
   130  	}
   131  	if *BuildnumFlag != "" {
   132  		env.Buildnum = *BuildnumFlag
   133  	}
   134  	if *PullRequestFlag {
   135  		env.IsPullRequest = true
   136  	}
   137  	if *CronJobFlag {
   138  		env.IsCronJob = true
   139  	}
   140  	return env
   141  }