Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
5304f430
Commit
5304f430
authored
Apr 08, 2015
by
Bas van Kervel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add path expansion support for command line arguments, closes 567
parent
50aa1f17
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
164 additions
and
3 deletions
+164
-3
customflags.go
cmd/utils/customflags.go
+133
-0
customflags_test.go
cmd/utils/customflags_test.go
+28
-0
flags.go
cmd/utils/flags.go
+3
-3
No files found.
cmd/utils/customflags.go
0 → 100644
View file @
5304f430
package
utils
import
(
"path/filepath"
"os"
"strings"
"os/user"
"github.com/codegangsta/cli"
"flag"
"fmt"
)
// Custom type which is registered in the flags library which cli uses for
// argument parsing. This allows us to expand Value to an absolute path when
// the argument is parsed
type
DirectoryString
struct
{
Value
string
}
func
(
self
DirectoryString
)
String
()
string
{
return
self
.
Value
}
func
(
self
DirectoryString
)
Set
(
value
string
)
error
{
self
.
Value
=
expandPath
(
value
)
return
nil
}
// Custom cli.Flag type which expand the received string to an absolute path.
// e.g. ~/.ethereum -> /home/username/.ethereum
type
DirectoryFlag
struct
{
cli
.
GenericFlag
Name
string
Value
DirectoryString
Usage
string
EnvVar
string
}
func
(
self
DirectoryFlag
)
String
()
string
{
var
fmtString
string
fmtString
=
"%s %v
\t
%v"
if
len
(
self
.
Value
.
Value
)
>
0
{
fmtString
=
"%s
\"
%v
\"\t
%v"
}
else
{
fmtString
=
"%s %v
\t
%v"
}
return
withEnvHint
(
self
.
EnvVar
,
fmt
.
Sprintf
(
fmtString
,
prefixedNames
(
self
.
Name
),
self
.
Value
.
Value
,
self
.
Usage
))
}
func
eachName
(
longName
string
,
fn
func
(
string
))
{
parts
:=
strings
.
Split
(
longName
,
","
)
for
_
,
name
:=
range
parts
{
name
=
strings
.
Trim
(
name
,
" "
)
fn
(
name
)
}
}
// called by cli library, grabs variable from environment (if in env)
// and adds variable to flag set for parsing.
func
(
self
DirectoryFlag
)
Apply
(
set
*
flag
.
FlagSet
)
{
if
self
.
EnvVar
!=
""
{
for
_
,
envVar
:=
range
strings
.
Split
(
self
.
EnvVar
,
","
)
{
envVar
=
strings
.
TrimSpace
(
envVar
)
if
envVal
:=
os
.
Getenv
(
envVar
);
envVal
!=
""
{
self
.
Value
.
Value
=
envVal
break
}
}
}
eachName
(
self
.
Name
,
func
(
name
string
)
{
set
.
Var
(
self
.
Value
,
self
.
Name
,
"a: "
+
self
.
Usage
)
})
}
func
prefixFor
(
name
string
)
(
prefix
string
)
{
if
len
(
name
)
==
1
{
prefix
=
"-"
}
else
{
prefix
=
"--"
}
return
}
func
prefixedNames
(
fullName
string
)
(
prefixed
string
)
{
parts
:=
strings
.
Split
(
fullName
,
","
)
for
i
,
name
:=
range
parts
{
name
=
strings
.
Trim
(
name
,
" "
)
prefixed
+=
prefixFor
(
name
)
+
name
if
i
<
len
(
parts
)
-
1
{
prefixed
+=
", "
}
}
return
}
func
withEnvHint
(
envVar
,
str
string
)
string
{
envText
:=
""
if
envVar
!=
""
{
envText
=
fmt
.
Sprintf
(
" [$%s]"
,
strings
.
Join
(
strings
.
Split
(
envVar
,
","
),
", $"
))
}
return
str
+
envText
}
func
(
self
DirectoryFlag
)
getName
()
string
{
return
self
.
Name
}
func
(
self
*
DirectoryFlag
)
Set
(
value
string
)
{
self
.
Value
.
Value
=
value
}
// Expands a file path
// 1. replace tilde with users home dir
// 2. expands embedded environment variables
// 3. cleans the path, e.g. /a/b/../c -> /a/c
// Note, it has limitations, e.g. ~someuser/tmp will not be expanded
func
expandPath
(
p
string
)
string
{
if
strings
.
HasPrefix
(
p
,
"~/"
)
||
strings
.
HasPrefix
(
p
,
"~
\\
"
)
{
if
user
,
err
:=
user
.
Current
();
err
==
nil
{
if
err
==
nil
{
p
=
strings
.
Replace
(
p
,
"~"
,
user
.
HomeDir
,
1
)
}
}
}
return
filepath
.
Clean
(
os
.
ExpandEnv
(
p
))
}
cmd/utils/customflags_test.go
0 → 100644
View file @
5304f430
package
utils
import
(
"testing"
"os"
"os/user"
)
func
TestPathExpansion
(
t
*
testing
.
T
)
{
user
,
_
:=
user
.
Current
()
tests
:=
map
[
string
]
string
{
"/home/someuser/tmp"
:
"/home/someuser/tmp"
,
"~/tmp"
:
user
.
HomeDir
+
"/tmp"
,
"$DDDXXX/a/b"
:
"/tmp/a/b"
,
"/a/b/"
:
"/a/b"
,
}
os
.
Setenv
(
"DDDXXX"
,
"/tmp"
)
for
test
,
expected
:=
range
tests
{
got
:=
expandPath
(
test
)
if
got
!=
expected
{
t
.
Errorf
(
"test %s, got %s, expected %s
\n
"
,
test
,
got
,
expected
)
}
}
}
cmd/utils/flags.go
View file @
5304f430
...
...
@@ -68,10 +68,10 @@ func NewApp(version, usage string) *cli.App {
var
(
// General settings
DataDirFlag
=
cli
.
String
Flag
{
Name
:
"datadir"
,
DataDirFlag
=
Directory
Flag
{
Name
:
"datadir"
,
Usage
:
"Data directory to be used"
,
Value
:
common
.
DefaultDataDir
()
,
Value
:
DirectoryString
{
common
.
DefaultDataDir
()}
,
}
ProtocolVersionFlag
=
cli
.
IntFlag
{
Name
:
"protocolversion"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment