|  | // Copyright 2015 Google Inc. All rights reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | // env implements the environment JSON file handling for the soong_env command line tool run before | 
|  | // the builder and for the env writer in the builder. | 
|  | package env | 
|  |  | 
|  | import ( | 
|  | "encoding/json" | 
|  | "fmt" | 
|  | "io/ioutil" | 
|  | "os" | 
|  | "sort" | 
|  | ) | 
|  |  | 
|  | type envFileEntry struct{ Key, Value string } | 
|  | type envFileData []envFileEntry | 
|  |  | 
|  | func EnvFileContents(envDeps map[string]string) ([]byte, error) { | 
|  | contents := make(envFileData, 0, len(envDeps)) | 
|  | for key, value := range envDeps { | 
|  | contents = append(contents, envFileEntry{key, value}) | 
|  | } | 
|  |  | 
|  | sort.Sort(contents) | 
|  |  | 
|  | data, err := json.MarshalIndent(contents, "", "    ") | 
|  | if err != nil { | 
|  | return nil, err | 
|  | } | 
|  |  | 
|  | data = append(data, '\n') | 
|  |  | 
|  | return data, nil | 
|  | } | 
|  |  | 
|  | func StaleEnvFile(filename string) (bool, error) { | 
|  | data, err := ioutil.ReadFile(filename) | 
|  | if err != nil { | 
|  | return true, err | 
|  | } | 
|  |  | 
|  | var contents envFileData | 
|  |  | 
|  | err = json.Unmarshal(data, &contents) | 
|  | if err != nil { | 
|  | return true, err | 
|  | } | 
|  |  | 
|  | var changed []string | 
|  | for _, entry := range contents { | 
|  | key := entry.Key | 
|  | old := entry.Value | 
|  | cur := os.Getenv(key) | 
|  | if old != cur { | 
|  | changed = append(changed, fmt.Sprintf("%s (%q -> %q)", key, old, cur)) | 
|  | } | 
|  | } | 
|  |  | 
|  | if len(changed) > 0 { | 
|  | fmt.Printf("environment variables changed value:\n") | 
|  | for _, s := range changed { | 
|  | fmt.Printf("   %s\n", s) | 
|  | } | 
|  | return true, nil | 
|  | } | 
|  |  | 
|  | return false, nil | 
|  | } | 
|  |  | 
|  | func (e envFileData) Len() int { | 
|  | return len(e) | 
|  | } | 
|  |  | 
|  | func (e envFileData) Less(i, j int) bool { | 
|  | return e[i].Key < e[j].Key | 
|  | } | 
|  |  | 
|  | func (e envFileData) Swap(i, j int) { | 
|  | e[i], e[j] = e[j], e[i] | 
|  | } |