switch glide to govendor (#43)
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
This commit is contained in:
		
							
								
								
									
										23
									
								
								vendor/github.com/joho/godotenv/LICENCE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/joho/godotenv/LICENCE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| Copyright (c) 2013 John Barton | ||||
|  | ||||
| MIT License | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining | ||||
| a copy of this software and associated documentation files (the | ||||
| "Software"), to deal in the Software without restriction, including | ||||
| without limitation the rights to use, copy, modify, merge, publish, | ||||
| distribute, sublicense, and/or sell copies of the Software, and to | ||||
| permit persons to whom the Software is furnished to do so, subject to | ||||
| the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be | ||||
| included in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | ||||
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||||
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||||
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  | ||||
							
								
								
									
										127
									
								
								vendor/github.com/joho/godotenv/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								vendor/github.com/joho/godotenv/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| # GoDotEnv [](https://travis-ci.org/joho/godotenv) [](https://ci.appveyor.com/project/joho/godotenv) | ||||
|  | ||||
| A Go (golang) port of the Ruby dotenv project (which loads env vars from a .env file) | ||||
|  | ||||
| From the original Library: | ||||
|  | ||||
| > Storing configuration in the environment is one of the tenets of a twelve-factor app. Anything that is likely to change between deployment environments–such as resource handles for databases or credentials for external services–should be extracted from the code into environment variables. | ||||
| > | ||||
| > But it is not always practical to set environment variables on development machines or continuous integration servers where multiple projects are run. Dotenv load variables from a .env file into ENV when the environment is bootstrapped. | ||||
|  | ||||
| It can be used as a library (for loading in env for your own daemons etc) or as a bin command. | ||||
|  | ||||
| There is test coverage and CI for both linuxish and windows environments, but I make no guarantees about the bin version working on windows. | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
| As a library | ||||
|  | ||||
| ```shell | ||||
| go get github.com/joho/godotenv | ||||
| ``` | ||||
|  | ||||
| or if you want to use it as a bin command | ||||
| ```shell | ||||
| go get github.com/joho/godotenv/cmd/godotenv | ||||
| ``` | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| Add your application configuration to your `.env` file in the root of your project: | ||||
|  | ||||
| ```shell | ||||
| S3_BUCKET=YOURS3BUCKET | ||||
| SECRET_KEY=YOURSECRETKEYGOESHERE | ||||
| ``` | ||||
|  | ||||
| Then in your Go app you can do something like | ||||
|  | ||||
| ```go | ||||
| package main | ||||
|  | ||||
| import ( | ||||
|     "github.com/joho/godotenv" | ||||
|     "log" | ||||
|     "os" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
|   err := godotenv.Load() | ||||
|   if err != nil { | ||||
|     log.Fatal("Error loading .env file") | ||||
|   } | ||||
|  | ||||
|   s3Bucket := os.Getenv("S3_BUCKET") | ||||
|   secretKey := os.Getenv("SECRET_KEY") | ||||
|  | ||||
|   // now do something with s3 or whatever | ||||
| } | ||||
| ``` | ||||
|  | ||||
| If you're even lazier than that, you can just take advantage of the autoload package which will read in `.env` on import | ||||
|  | ||||
| ```go | ||||
| import _ "github.com/joho/godotenv/autoload" | ||||
| ``` | ||||
|  | ||||
| While `.env` in the project root is the default, you don't have to be constrained, both examples below are 100% legit | ||||
|  | ||||
| ```go | ||||
| _ = godotenv.Load("somerandomfile") | ||||
| _ = godotenv.Load("filenumberone.env", "filenumbertwo.env") | ||||
| ``` | ||||
|  | ||||
| If you want to be really fancy with your env file you can do comments and exports (below is a valid env file) | ||||
|  | ||||
| ```shell | ||||
| # I am a comment and that is OK | ||||
| SOME_VAR=someval | ||||
| FOO=BAR # comments at line end are OK too | ||||
| export BAR=BAZ | ||||
| ``` | ||||
|  | ||||
| Or finally you can do YAML(ish) style | ||||
|  | ||||
| ```yaml | ||||
| FOO: bar | ||||
| BAR: baz | ||||
| ``` | ||||
|  | ||||
| as a final aside, if you don't want godotenv munging your env you can just get a map back instead | ||||
|  | ||||
| ```go | ||||
| var myEnv map[string]string | ||||
| myEnv, err := godotenv.Read() | ||||
|  | ||||
| s3Bucket := myEnv["S3_BUCKET"] | ||||
| ``` | ||||
|  | ||||
| ### Command Mode | ||||
|  | ||||
| Assuming you've installed the command as above and you've got `$GOPATH/bin` in your `$PATH` | ||||
|  | ||||
| ``` | ||||
| godotenv -f /some/path/to/.env some_command with some args | ||||
| ``` | ||||
|  | ||||
| If you don't specify `-f` it will fall back on the default of loading `.env` in `PWD` | ||||
|  | ||||
| ## Contributing | ||||
|  | ||||
| Contributions are most welcome! The parser itself is pretty stupidly naive and I wouldn't be surprised if it breaks with edge cases. | ||||
|  | ||||
| *code changes without tests will not be accepted* | ||||
|  | ||||
| 1. Fork it | ||||
| 2. Create your feature branch (`git checkout -b my-new-feature`) | ||||
| 3. Commit your changes (`git commit -am 'Added some feature'`) | ||||
| 4. Push to the branch (`git push origin my-new-feature`) | ||||
| 5. Create new Pull Request | ||||
|  | ||||
| ## CI | ||||
|  | ||||
| Linux: [](https://app.wercker.com/project/bykey/507594c2ec7e60f19403a568dfea0f78) Windows: [](https://ci.appveyor.com/project/joho/godotenv) | ||||
|  | ||||
| ## Who? | ||||
|  | ||||
| The original library [dotenv](https://github.com/bkeepers/dotenv) was written by [Brandon Keepers](http://opensoul.org/), and this port was done by [John Barton](http://whoisjohnbarton.com) based off the tests/fixtures in the original library. | ||||
							
								
								
									
										15
									
								
								vendor/github.com/joho/godotenv/autoload/autoload.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/joho/godotenv/autoload/autoload.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| package autoload | ||||
|  | ||||
| /* | ||||
| 	You can just read the .env file on import just by doing | ||||
|  | ||||
| 		import _ "github.com/joho/godotenv/autoload" | ||||
|  | ||||
| 	And bob's your mother's brother | ||||
| */ | ||||
|  | ||||
| import "github.com/joho/godotenv" | ||||
|  | ||||
| func init() { | ||||
| 	godotenv.Load() | ||||
| } | ||||
							
								
								
									
										247
									
								
								vendor/github.com/joho/godotenv/godotenv.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								vendor/github.com/joho/godotenv/godotenv.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,247 @@ | ||||
| // Package godotenv is a go port of the ruby dotenv library (https://github.com/bkeepers/dotenv) | ||||
| // | ||||
| // Examples/readme can be found on the github page at https://github.com/joho/godotenv | ||||
| // | ||||
| // The TL;DR is that you make a .env file that looks something like | ||||
| // | ||||
| // 		SOME_ENV_VAR=somevalue | ||||
| // | ||||
| // and then in your go code you can call | ||||
| // | ||||
| // 		godotenv.Load() | ||||
| // | ||||
| // and all the env vars declared in .env will be avaiable through os.Getenv("SOME_ENV_VAR") | ||||
| package godotenv | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"errors" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // Load will read your env file(s) and load them into ENV for this process. | ||||
| // | ||||
| // Call this function as close as possible to the start of your program (ideally in main) | ||||
| // | ||||
| // If you call Load without any args it will default to loading .env in the current path | ||||
| // | ||||
| // You can otherwise tell it which files to load (there can be more than one) like | ||||
| // | ||||
| //		godotenv.Load("fileone", "filetwo") | ||||
| // | ||||
| // It's important to note that it WILL NOT OVERRIDE an env variable that already exists - consider the .env file to set dev vars or sensible defaults | ||||
| func Load(filenames ...string) (err error) { | ||||
| 	filenames = filenamesOrDefault(filenames) | ||||
|  | ||||
| 	for _, filename := range filenames { | ||||
| 		err = loadFile(filename, false) | ||||
| 		if err != nil { | ||||
| 			return // return early on a spazout | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Overload will read your env file(s) and load them into ENV for this process. | ||||
| // | ||||
| // Call this function as close as possible to the start of your program (ideally in main) | ||||
| // | ||||
| // If you call Overload without any args it will default to loading .env in the current path | ||||
| // | ||||
| // You can otherwise tell it which files to load (there can be more than one) like | ||||
| // | ||||
| //		godotenv.Overload("fileone", "filetwo") | ||||
| // | ||||
| // It's important to note this WILL OVERRIDE an env variable that already exists - consider the .env file to forcefilly set all vars. | ||||
| func Overload(filenames ...string) (err error) { | ||||
| 	filenames = filenamesOrDefault(filenames) | ||||
|  | ||||
| 	for _, filename := range filenames { | ||||
| 		err = loadFile(filename, true) | ||||
| 		if err != nil { | ||||
| 			return // return early on a spazout | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Read all env (with same file loading semantics as Load) but return values as | ||||
| // a map rather than automatically writing values into env | ||||
| func Read(filenames ...string) (envMap map[string]string, err error) { | ||||
| 	filenames = filenamesOrDefault(filenames) | ||||
| 	envMap = make(map[string]string) | ||||
|  | ||||
| 	for _, filename := range filenames { | ||||
| 		individualEnvMap, individualErr := readFile(filename) | ||||
|  | ||||
| 		if individualErr != nil { | ||||
| 			err = individualErr | ||||
| 			return // return early on a spazout | ||||
| 		} | ||||
|  | ||||
| 		for key, value := range individualEnvMap { | ||||
| 			envMap[key] = value | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Exec loads env vars from the specified filenames (empty map falls back to default) | ||||
| // then executes the cmd specified. | ||||
| // | ||||
| // Simply hooks up os.Stdin/err/out to the command and calls Run() | ||||
| // | ||||
| // If you want more fine grained control over your command it's recommended | ||||
| // that you use `Load()` or `Read()` and the `os/exec` package yourself. | ||||
| func Exec(filenames []string, cmd string, cmdArgs []string) error { | ||||
| 	Load(filenames...) | ||||
|  | ||||
| 	command := exec.Command(cmd, cmdArgs...) | ||||
| 	command.Stdin = os.Stdin | ||||
| 	command.Stdout = os.Stdout | ||||
| 	command.Stderr = os.Stderr | ||||
| 	return command.Run() | ||||
| } | ||||
|  | ||||
| func filenamesOrDefault(filenames []string) []string { | ||||
| 	if len(filenames) == 0 { | ||||
| 		return []string{".env"} | ||||
| 	} | ||||
| 	return filenames | ||||
| } | ||||
|  | ||||
| func loadFile(filename string, overload bool) error { | ||||
| 	envMap, err := readFile(filename) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	currentEnv := map[string]bool{} | ||||
| 	rawEnv := os.Environ() | ||||
| 	for _, rawEnvLine := range rawEnv { | ||||
| 		key := strings.Split(rawEnvLine, "=")[0] | ||||
| 		currentEnv[key] = true | ||||
| 	} | ||||
|  | ||||
| 	for key, value := range envMap { | ||||
| 		if !currentEnv[key] || overload { | ||||
| 			os.Setenv(key, value) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func readFile(filename string) (envMap map[string]string, err error) { | ||||
| 	file, err := os.Open(filename) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	defer file.Close() | ||||
|  | ||||
| 	envMap = make(map[string]string) | ||||
|  | ||||
| 	var lines []string | ||||
| 	scanner := bufio.NewScanner(file) | ||||
| 	for scanner.Scan() { | ||||
| 		lines = append(lines, scanner.Text()) | ||||
| 	} | ||||
|  | ||||
| 	if err = scanner.Err(); err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	for _, fullLine := range lines { | ||||
| 		if !isIgnoredLine(fullLine) { | ||||
| 			var key, value string | ||||
| 			key, value, err = parseLine(fullLine) | ||||
|  | ||||
| 			if err != nil { | ||||
| 				return | ||||
| 			} | ||||
| 			envMap[key] = value | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func parseLine(line string) (key string, value string, err error) { | ||||
| 	if len(line) == 0 { | ||||
| 		err = errors.New("zero length string") | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// ditch the comments (but keep quoted hashes) | ||||
| 	if strings.Contains(line, "#") { | ||||
| 		segmentsBetweenHashes := strings.Split(line, "#") | ||||
| 		quotesAreOpen := false | ||||
| 		var segmentsToKeep []string | ||||
| 		for _, segment := range segmentsBetweenHashes { | ||||
| 			if strings.Count(segment, "\"") == 1 || strings.Count(segment, "'") == 1 { | ||||
| 				if quotesAreOpen { | ||||
| 					quotesAreOpen = false | ||||
| 					segmentsToKeep = append(segmentsToKeep, segment) | ||||
| 				} else { | ||||
| 					quotesAreOpen = true | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if len(segmentsToKeep) == 0 || quotesAreOpen { | ||||
| 				segmentsToKeep = append(segmentsToKeep, segment) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		line = strings.Join(segmentsToKeep, "#") | ||||
| 	} | ||||
|  | ||||
| 	// now split key from value | ||||
| 	splitString := strings.SplitN(line, "=", 2) | ||||
|  | ||||
| 	if len(splitString) != 2 { | ||||
| 		// try yaml mode! | ||||
| 		splitString = strings.SplitN(line, ":", 2) | ||||
| 	} | ||||
|  | ||||
| 	if len(splitString) != 2 { | ||||
| 		err = errors.New("Can't separate key from value") | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Parse the key | ||||
| 	key = splitString[0] | ||||
| 	if strings.HasPrefix(key, "export") { | ||||
| 		key = strings.TrimPrefix(key, "export") | ||||
| 	} | ||||
| 	key = strings.Trim(key, " ") | ||||
|  | ||||
| 	// Parse the value | ||||
| 	value = splitString[1] | ||||
|  | ||||
| 	// trim | ||||
| 	value = strings.Trim(value, " ") | ||||
|  | ||||
| 	// check if we've got quoted values | ||||
| 	if value != "" { | ||||
| 		first := string(value[0:1]) | ||||
| 		last := string(value[len(value)-1:]) | ||||
| 		if first == last && strings.ContainsAny(first, `"'`) { | ||||
| 			// pull the quotes off the edges | ||||
| 			value = strings.Trim(value, `"'`) | ||||
|  | ||||
| 			// expand quotes | ||||
| 			value = strings.Replace(value, `\"`, `"`, -1) | ||||
| 			// expand newlines | ||||
| 			value = strings.Replace(value, `\n`, "\n", -1) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func isIgnoredLine(line string) bool { | ||||
| 	trimmedLine := strings.Trim(line, " \n\t") | ||||
| 	return len(trimmedLine) == 0 || strings.HasPrefix(trimmedLine, "#") | ||||
| } | ||||
		Reference in New Issue
	
	Block a user