-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #12928 from n1hility/win-env
Implement env parsing on Windows
- Loading branch information
Showing
3 changed files
with
26 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
// +build linux darwin | ||
// +build !windows | ||
|
||
package env | ||
|
||
|
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package env | ||
|
||
// ParseSlice parses the specified slice and transforms it into an environment | ||
// map. | ||
func ParseSlice(s []string) (map[string]string, error) { | ||
env := make(map[string]string, len(s)) | ||
for _, e := range s { | ||
if len(e) > 0 && e[0] == '=' { | ||
// The legacy Windows CMD command interpreter uses a hack, where to emulate | ||
// DOS semantics, it uses an illegal (by windows definition) env name for | ||
// state storage to avoid conlficting with user defined env names. This is | ||
// used to preserve drive letter paths. E.g., typing c: from another drive | ||
// will remember the last CWD because CMD stores it in an env named "=C:". | ||
// Since these are illegal, they are filtered from standard user access but | ||
// are still available in the underlying win32 API calls. Since they have | ||
// zero value to a container, we filter as well. | ||
continue | ||
} | ||
|
||
if err := parseEnv(env, e); err != nil { | ||
return nil, err | ||
} | ||
} | ||
return env, nil | ||
} |