diff options
author | Bob Van Landuyt <bob@vanlanduyt.co> | 2019-03-07 10:58:37 +0100 |
---|---|---|
committer | Bob Van Landuyt <bob@vanlanduyt.co> | 2019-03-14 12:18:07 +0100 |
commit | 53511f3655a5eed9976164fbd88d14df3490000c (patch) | |
tree | b46d8d7ccee0d21f9d5e8df3af02b6f37db5852d /go/internal/command/discover/discover.go | |
parent | 049beb74303a03d9fa598d23b150e0ccea3cd60d (diff) | |
download | gitlab-shell-53511f3655a5eed9976164fbd88d14df3490000c.tar.gz |
Detect user based on key, username or id
This allows gitlab-shell to be called with an argument of the format
`key-123` or `username-name`.
When called in this way, `gitlab-shell` will call the GitLab internal
API. If the API responds with user information, it will print a
welcome message including the username.
If the API responds with a successful but empty response, gitlab-shell
will print a welcome message for an anonymous user.
If the API response includes an error message in JSON, this message
will be printed to stderr.
If the API call fails, an error message including the status code will
be printed to stderr.
Diffstat (limited to 'go/internal/command/discover/discover.go')
-rw-r--r-- | go/internal/command/discover/discover.go | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/go/internal/command/discover/discover.go b/go/internal/command/discover/discover.go index 63a7a32..ab04cbd 100644 --- a/go/internal/command/discover/discover.go +++ b/go/internal/command/discover/discover.go @@ -2,9 +2,12 @@ package discover import ( "fmt" + "io" + "os" "gitlab.com/gitlab-org/gitlab-shell/go/internal/command/commandargs" "gitlab.com/gitlab-org/gitlab-shell/go/internal/config" + "gitlab.com/gitlab-org/gitlab-shell/go/internal/gitlabnet/discover" ) type Command struct { @@ -12,6 +15,38 @@ type Command struct { Args *commandargs.CommandArgs } +var ( + output io.Writer = os.Stdout +) + func (c *Command) Execute() error { - return fmt.Errorf("No feature is implemented yet") + response, err := c.getUserInfo() + if err != nil { + return fmt.Errorf("Failed to get username: %v", err) + } + + if response.IsAnonymous() { + fmt.Fprintf(output, "Welcome to GitLab, Anonymous!\n") + } else { + fmt.Fprintf(output, "Welcome to GitLab, @%s!\n", response.Username) + } + + return nil +} + +func (c *Command) getUserInfo() (*discover.Response, error) { + client, err := discover.NewClient(c.Config) + if err != nil { + return nil, err + } + + if c.Args.GitlabKeyId != "" { + return client.GetByKeyId(c.Args.GitlabKeyId) + } else if c.Args.GitlabUsername != "" { + return client.GetByUsername(c.Args.GitlabUsername) + } else { + // There was no 'who' information, this matches the ruby error + // message. + return nil, fmt.Errorf("who='' is invalid") + } } |