grim/convey
Clone
Summary
Browse
Changes
Graph
remove dev-convey.yml
2020-03-02, Gary Kramlich
e577abd976e0
remove dev-convey.yml
// Convey
// Copyright 2016-2018 Gary Kramlich <grim@reaperworld.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Package environment provides utilities for managing environment variables.
package
environment
import
(
"fmt"
"os"
"strings"
"sync"
)
type
EnvironmentReader
interface
{
ReadEnvironment
()
[]
string
}
type
Environment
struct
{
mutex
sync
.
Mutex
items
[]
string
expandables
[]
string
delimiter
string
}
// splitEqual takes a string like "foo=bar" and returns it as ("foo", "bar")
func
splitEqual
(
value
string
)
(
string
,
string
)
{
parts
:=
strings
.
SplitN
(
value
,
"="
,
2
)
if
len
(
parts
)
==
1
{
return
parts
[
0
],
""
}
return
parts
[
0
],
parts
[
1
]
}
func
New
(
items
...
string
)
*
Environment
{
if
items
==
nil
{
items
=
[]
string
{}
}
return
&
Environment
{
items
:
items
,
}
}
func
(
e
*
Environment
)
Copy
()
*
Environment
{
return
New
(
e
.
Items
()
...
)
}
func
NewExpandable
(
expandables
[]
string
,
delimiter
string
,
items
...
string
)
*
Environment
{
return
&
Environment
{
items
:
items
,
expandables
:
expandables
,
delimiter
:
delimiter
,
}
}
func
(
e
*
Environment
)
Items
()
[]
string
{
return
e
.
items
}
func
(
e
*
Environment
)
Set
(
name
,
value
string
)
{
if
err
:=
os
.
Setenv
(
name
,
value
);
err
!=
nil
{
fmt
.
Printf
(
"error setting environment variable '%s': %s\n"
,
name
,
err
)
}
else
{
e
.
mutex
.
Lock
()
e
.
items
=
append
(
e
.
items
,
name
)
e
.
mutex
.
Unlock
()
}
}
// Prune removes items from the environment if they don't have a value and are
// not in the OS's environment.
func
(
e
*
Environment
)
Prune
()
*
Environment
{
e
.
mutex
.
Lock
()
defer
e
.
mutex
.
Unlock
()
pruned
:=
[]
string
{}
for
_
,
val
:=
range
e
.
items
{
k
,
v
:=
splitEqual
(
val
)
if
v
==
""
&&
os
.
Getenv
(
k
)
==
""
{
continue
}
pruned
=
append
(
pruned
,
val
)
}
e
.
items
=
pruned
return
e
}
// Merge will merge another environment into the current environment
func
(
e
*
Environment
)
Merge
(
env
*
Environment
)
*
Environment
{
return
e
.
MergeSlice
(
env
.
items
)
}
func
(
e
*
Environment
)
MergeSlice
(
items
[]
string
)
*
Environment
{
e
.
items
=
Merge
(
e
.
items
,
items
)
return
e
}
func
(
e
*
Environment
)
MapSlice
(
slice
[]
string
)
([]
string
,
error
)
{
return
SliceMapper
(
slice
,
e
.
Items
())
}
func
(
e
*
Environment
)
Map
(
key
string
)
string
{
return
Map
(
key
,
e
.
Items
())
}