88 "github.com/jfrog/gofrog/log"
99 "github.com/jfrog/jfrog-cli-artifactory/artifactory/cli/ide"
1010 "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/ide/vscode"
11+ "github.com/jfrog/jfrog-cli-artifactory/cliutils"
1112 pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
1213 "github.com/jfrog/jfrog-cli-core/v2/plugins/components"
1314 "github.com/jfrog/jfrog-cli-core/v2/utils/config"
@@ -17,6 +18,7 @@ const (
1718 productJsonPath = "product-json-path"
1819 repoKeyFlag = "repo-key"
1920 urlSuffixFlag = "url-suffix"
21+ apiType = "vscodeextensions"
2022)
2123
2224func GetCommands () []components.Command {
@@ -57,56 +59,18 @@ func getArguments() []components.Argument {
5759 }
5860}
5961
62+ // Main command action: orchestrates argument parsing, server config, and command execution
6063func vscodeConfigCmd (c * components.Context ) error {
61- var serviceURL , repoKey string
62- var err error
63-
64- if c .GetNumberOfArgs () > 0 && isValidUrl (c .GetArgumentAt (0 )) {
65- serviceURL = c .GetArgumentAt (0 )
66- repoKey = extractRepoKeyFromServiceURL (serviceURL )
67- } else {
68- repoKey = c .GetStringFlagValue (repoKeyFlag )
69- if repoKey == "" {
70- return fmt .Errorf ("You must provide either a service URL as the first argument or --repo-key flag." )
71- }
72- // Get Artifactory URL from server details (flags or default)
73- var artDetails * config.ServerDetails
74- if ide .HasServerConfigFlags (c ) {
75- artDetails , err = pluginsCommon .CreateArtifactoryDetailsByFlags (c )
76- if err != nil {
77- return fmt .Errorf ("Failed to get Artifactory server details: %w" , err )
78- }
79- } else {
80- artDetails , err = config .GetDefaultServerConf ()
81- if err != nil {
82- return fmt .Errorf ("Failed to get default Artifactory server details: %w" , err )
83- }
84- }
85- baseUrl := strings .TrimRight (artDetails .Url , "/" )
86- urlSuffix := c .GetStringFlagValue (urlSuffixFlag )
87- if urlSuffix == "" {
88- urlSuffix = "_apis/public/gallery"
89- }
90- serviceURL = baseUrl + "/artifactory/api/vscodeextensions/" + repoKey + "/" + strings .TrimLeft (urlSuffix , "/" )
64+ serviceURL , repoKey , err := getVscodeRepoKeyAndURL (c )
65+ if err != nil {
66+ return err
9167 }
9268
9369 productPath := c .GetStringFlagValue (productJsonPath )
9470
95- // Create server details for validation
96- var rtDetails * config.ServerDetails
97- if ide .HasServerConfigFlags (c ) {
98- // Use explicit server configuration flags
99- rtDetails , err = pluginsCommon .CreateArtifactoryDetailsByFlags (c )
100- if err != nil {
101- return fmt .Errorf ("failed to create server configuration: %w" , err )
102- }
103- } else {
104- // Use default server configuration for validation when no explicit flags provided
105- rtDetails , err = config .GetDefaultServerConf ()
106- if err != nil {
107- // If no default server, that's okay - we'll just skip validation
108- log .Debug ("No default server configuration found, skipping repository validation" )
109- }
71+ rtDetails , err := getVscodeServerDetails (c )
72+ if err != nil {
73+ return err
11074 }
11175
11276 vscodeCmd := vscode .NewVscodeCommand (serviceURL , productPath , repoKey )
@@ -117,28 +81,67 @@ func vscodeConfigCmd(c *components.Context) error {
11781 return vscodeCmd .Run ()
11882}
11983
120- func isValidUrl (s string ) bool {
121- u , err := url .Parse (s )
122- return err == nil && u .Scheme != "" && u .Host != ""
123- }
124-
125- // extractRepoKeyFromServiceURL extracts the repository key from a VSCode service URL
126- // Expected format: https://<server>/artifactory/api/vscodeextensions/<repo-key>/_apis/public/gallery
127- func extractRepoKeyFromServiceURL (serviceURL string ) string {
128- if serviceURL == "" {
129- return ""
84+ // getVscodeRepoKeyAndURL determines the repo key and service URL from args/flags
85+ func getVscodeRepoKeyAndURL (c * components.Context ) (serviceURL , repoKey string , err error ) {
86+ if c .GetNumberOfArgs () > 0 && isValidUrl (c .GetArgumentAt (0 )) {
87+ serviceURL = c .GetArgumentAt (0 )
88+ repoKey , err = cliutils .ExtractRepoNameFromURL (serviceURL )
89+ if err != nil {
90+ return
91+ }
92+ return
13093 }
13194
132- parsedURL , err := url .Parse (serviceURL )
133- if err != nil {
134- return ""
95+ repoKey = c .GetStringFlagValue (repoKeyFlag )
96+ if repoKey == "" {
97+ err = fmt .Errorf ("You must provide either a service URL as the first argument or --repo-key flag." )
98+ return
99+ }
100+ // Get Artifactory URL from server details (flags or default)
101+ var artDetails * config.ServerDetails
102+ if ide .HasServerConfigFlags (c ) {
103+ artDetails , err = pluginsCommon .CreateArtifactoryDetailsByFlags (c )
104+ if err != nil {
105+ err = fmt .Errorf ("Failed to get Artifactory server details: %w" , err )
106+ return
107+ }
108+ } else {
109+ artDetails , err = config .GetDefaultServerConf ()
110+ if err != nil {
111+ err = fmt .Errorf ("Failed to get default Artifactory server details: %w" , err )
112+ return
113+ }
114+ }
115+ baseUrl := strings .TrimRight (artDetails .Url , "/" )
116+ urlSuffix := c .GetStringFlagValue (urlSuffixFlag )
117+ if urlSuffix == "" {
118+ urlSuffix = "_apis/public/gallery"
135119 }
120+ serviceURL = baseUrl + "/artifactory/api/vscodeextensions/" + repoKey + "/" + strings .TrimLeft (urlSuffix , "/" )
121+ return
122+ }
136123
137- pathParts := strings .Split (strings .TrimPrefix (parsedURL .Path , "/" ), "/" )
138- for i , part := range pathParts {
139- if part == "api" && i + 1 < len (pathParts ) && pathParts [i + 1 ] == "vscodeextensions" && i + 2 < len (pathParts ) {
140- return pathParts [i + 2 ]
124+ // getVscodeServerDetails returns server details for validation, or nil if not available
125+ func getVscodeServerDetails (c * components.Context ) (* config.ServerDetails , error ) {
126+ if ide .HasServerConfigFlags (c ) {
127+ // Use explicit server configuration flags
128+ rtDetails , err := pluginsCommon .CreateArtifactoryDetailsByFlags (c )
129+ if err != nil {
130+ return nil , fmt .Errorf ("failed to create server configuration: %w" , err )
141131 }
132+ return rtDetails , nil
133+ }
134+ // Use default server configuration for validation when no explicit flags provided
135+ rtDetails , err := config .GetDefaultServerConf ()
136+ if err != nil {
137+ // If no default server, that's okay - we'll just skip validation
138+ log .Debug ("No default server configuration found, skipping repository validation" )
139+ return nil , nil
142140 }
143- return ""
141+ return rtDetails , nil
142+ }
143+
144+ func isValidUrl (s string ) bool {
145+ u , err := url .Parse (s )
146+ return err == nil && u .Scheme != "" && u .Host != ""
144147}
0 commit comments