-
Notifications
You must be signed in to change notification settings - Fork 213
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Extensions: Adds extensions package (#4718)
Adds the core components for the azd management plane of azd extensions.
- Loading branch information
Showing
13 changed files
with
1,638 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// Licensed under the MIT License. | ||
|
||
package extensions | ||
|
||
// Extension represents an installed extension. | ||
type Extension struct { | ||
Id string `json:"id"` | ||
Namespace string `json:"namespace"` | ||
DisplayName string `json:"displayName"` | ||
Description string `json:"description"` | ||
Version string `json:"version"` | ||
Usage string `json:"usage"` | ||
Path string `json:"path"` | ||
Source string `json:"source"` | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// Licensed under the MIT License. | ||
|
||
package extensions | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
"path/filepath" | ||
|
||
"github.com/azure/azure-dev/cli/azd/pkg/config" | ||
) | ||
|
||
// newFileSource creates a new file base registry source. | ||
func newFileSource(name string, path string) (Source, error) { | ||
absolutePath, err := getAbsolutePath(path) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed converting path '%s' to absolute path, %w", path, err) | ||
} | ||
|
||
registryBytes, err := os.ReadFile(absolutePath) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed reading file '%s', %w", path, err) | ||
} | ||
|
||
return newJsonSource(name, string(registryBytes)) | ||
} | ||
|
||
// getAbsolutePath converts a relative path to an absolute path. | ||
func getAbsolutePath(filePath string) (string, error) { | ||
// Check if the path is absolute | ||
if filepath.IsAbs(filePath) { | ||
return filePath, nil | ||
} | ||
|
||
roots := []string{} | ||
|
||
// Get the current working directory | ||
cwd, err := os.Getwd() | ||
if err != nil { | ||
return "", err | ||
} | ||
|
||
azdConfigPath, err := config.GetUserConfigDir() | ||
if err != nil { | ||
return "", err | ||
} | ||
|
||
roots = append(roots, cwd) | ||
roots = append(roots, azdConfigPath) | ||
|
||
for _, root := range roots { | ||
// Join the root directory with the relative path | ||
absolutePath := filepath.Join(root, filePath) | ||
|
||
// Normalize the path to handle any ".." or "." segments | ||
absolutePath, err = filepath.Abs(absolutePath) | ||
if err != nil { | ||
return "", err | ||
} | ||
|
||
if _, err := os.Stat(absolutePath); err == nil { | ||
return absolutePath, nil | ||
} | ||
} | ||
|
||
return "", fmt.Errorf("file '%s' was not found, %w", filePath, os.ErrNotExist) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// Licensed under the MIT License. | ||
|
||
package extensions | ||
|
||
import ( | ||
"encoding/json" | ||
"fmt" | ||
) | ||
|
||
// newJsonSource creates a new JSON base registry source. | ||
func newJsonSource(name string, jsonRegistry string) (Source, error) { | ||
var registry *Registry | ||
err := json.Unmarshal([]byte(jsonRegistry), ®istry) | ||
if err != nil { | ||
return nil, fmt.Errorf("unable to unmarshal extensions JSON %w", err) | ||
} | ||
|
||
return newRegistrySource(name, registry) | ||
} |
Oops, something went wrong.