in commands/token/create/create.go [139:265]
func createTokenRun(opts *CreateOptions) error {
httpClient, err := opts.HTTPClient()
if err != nil {
return err
}
var outputToken any
var outputTokenValue string
expirationDate := gitlab.ISOTime(opts.ExpireAt)
if opts.User != "" {
user, err := api.UserByName(httpClient, opts.User)
if err != nil {
return err
}
options := &gitlab.ListPersonalAccessTokensOptions{
ListOptions: gitlab.ListOptions{PerPage: 100},
UserID: &user.ID,
}
tokens, err := api.ListPersonalAccessTokens(httpClient, options)
if err != nil {
return err
}
tokens = filter.Filter(tokens, func(t *gitlab.PersonalAccessToken) bool {
return t.Active && t.Name == opts.Name
})
if len(tokens) > 0 {
return cmdutils.FlagError{Err: fmt.Errorf("a personal access token with the name %s already exists.", opts.Name)}
}
if opts.User == "@me" {
token, err := api.CreatePersonalAccessTokenForCurrentUser(httpClient, opts.Name, opts.Scopes, time.Time(expirationDate))
if err != nil {
return err
}
outputToken = token
outputTokenValue = token.Token
} else {
createOptions := &gitlab.CreatePersonalAccessTokenOptions{
Name: &opts.Name,
Description: &opts.Description,
ExpiresAt: &expirationDate,
Scopes: &opts.Scopes,
}
token, err := api.CreatePersonalAccessToken(httpClient, user.ID, createOptions)
if err != nil {
return err
}
outputToken = token
outputTokenValue = token.Token
}
} else {
if opts.Group != "" {
listOptions := &gitlab.ListGroupAccessTokensOptions{PerPage: 100}
tokens, err := api.ListGroupAccessTokens(httpClient, opts.Group, listOptions)
if err != nil {
return err
}
tokens = filter.Filter(tokens, func(t *gitlab.GroupAccessToken) bool {
return t.Active && t.Name == opts.Name
})
if len(tokens) > 0 {
return cmdutils.FlagError{Err: fmt.Errorf("a group access token with the name %s already exists.", opts.Name)}
}
options := gitlab.CreateGroupAccessTokenOptions{
Name: &opts.Name,
Description: &opts.Description,
Scopes: &opts.Scopes,
AccessLevel: &opts.AccessLevel.Value,
ExpiresAt: &expirationDate,
}
token, err := api.CreateGroupAccessToken(httpClient, opts.Group, &options)
if err != nil {
return err
}
outputToken = token
outputTokenValue = token.Token
} else {
repo, err := opts.BaseRepo()
if err != nil {
return err
}
listOptions := &gitlab.ListProjectAccessTokensOptions{ListOptions: gitlab.ListOptions{PerPage: 100}}
tokens, err := api.ListProjectAccessTokens(httpClient, repo.FullName(), listOptions)
if err != nil {
return err
}
tokens = filter.Filter(tokens, func(t *gitlab.ProjectAccessToken) bool {
return t.Active && t.Name == opts.Name
})
if len(tokens) > 0 {
return cmdutils.FlagError{Err: fmt.Errorf("a project access token with name %s already exists.", opts.Name)}
}
options := gitlab.CreateProjectAccessTokenOptions{
Name: &opts.Name,
Description: &opts.Description,
Scopes: &opts.Scopes,
AccessLevel: &opts.AccessLevel.Value,
ExpiresAt: &expirationDate,
}
token, err := api.CreateProjectAccessToken(httpClient, repo.FullName(), &options)
if err != nil {
return err
}
outputToken = token
outputTokenValue = token.Token
}
}
if opts.OutputFormat == "json" {
encoder := json.NewEncoder(opts.IO.StdOut)
encoder.SetIndent(" ", " ")
if err := encoder.Encode(outputToken); err != nil {
return err
}
} else {
if _, err := fmt.Fprintf(opts.IO.StdOut, "%s\n", outputTokenValue); err != nil {
return err
}
}
return nil
}