oc-local/cmd/buildutils.go

220 lines
4.9 KiB
Go
Raw Normal View History

2024-09-27 16:10:15 +02:00
package cmd
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"os/exec"
"strings"
)
func isRepoValid(name string, exclude []string) bool {
for _, str := range exclude {
if strings.Contains(name, str) {
return false
}
}
return true
}
func deleteFolderIfExists(path string) error {
// Check if the path exists
if _, err := os.Stat(path); os.IsNotExist(err) {
// Path does not exist, nothing to do
return nil
}
// Path exists, attempt to delete it
err := os.RemoveAll(path)
if err != nil {
return fmt.Errorf("failed to delete repository: %w", err)
}
return nil
}
type Repository struct {
Name string `json:"name"`
CloneURL string `json:"clone_url"`
}
func getRepositories(server, username string) ([]Repository, error) {
url := fmt.Sprintf("https://%s/api/v1/users/%s/repos", server, username)
// Create a new request using http
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
// Send the request via a client
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
// Read the response body
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
// Check if the response code is OK (200)
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("failed to retrieve repositories: %s", resp.Status)
}
// Unmarshal the JSON response into a slice of Repository structs
var repos []Repository
err = json.Unmarshal(body, &repos)
if err != nil {
return nil, err
}
return repos, nil
}
func fileExists(filename string) bool {
info, err := os.Stat(filename)
if os.IsNotExist(err) {
return false
}
return !info.IsDir()
}
// runCommand runs a given command with arguments and streams stdout and stderr in real time.
func runCommand(cmdName string, args ...string) error {
cmd := exec.Command(cmdName, args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
// processFolder takes a folder path, changes to that directory, runs a series of commands, and returns to the initial directory.
func processFolder(folder string, commands [][]string) error {
// Store the initial directory
initialDir, err := os.Getwd()
if err != nil {
return fmt.Errorf("failed to get current directory: %w", err)
}
// Change to the target directory
err = os.Chdir(folder)
if err != nil {
return fmt.Errorf("failed to change directory to %s: %w", folder, err)
}
// Run the specified commands in the folder
for _, command := range commands {
if len(command) == 0 {
continue
}
cmdName := command[0]
cmdArgs := command[1:]
fmt.Printf("Running command: %s %v in folder %s\n", cmdName, cmdArgs, folder)
if err := runCommand(cmdName, cmdArgs...); err != nil {
fmt.Printf("Command %s failed with error: %v\n", cmdName, err)
}
}
// Change back to the initial directory
err = os.Chdir(initialDir)
if err != nil {
return fmt.Errorf("failed to return to initial directory %s: %w", initialDir, err)
}
return nil
}
func updatePortInJSONFile(inputFile string, outputFile string, newPort int) (bool, error) {
// Read the JSON file
file, err := os.ReadFile(inputFile)
if err != nil {
return false, err
}
// Unmarshal the JSON into a map[string]interface{}
var data map[string]interface{}
err = json.Unmarshal(file, &data)
if err != nil {
return false, err
}
// Check if the "port" key exists
if _, exists := data["port"]; exists {
// Update the "port" key with the new value
data["port"] = newPort
// Marshal the updated map back to JSON
updatedJSON, err := json.MarshalIndent(data, "", " ")
if err != nil {
return false, err
}
// Write the updated JSON back to the file
err = os.WriteFile(outputFile, updatedJSON, os.ModePerm)
if err != nil {
return false, err
}
// Return true indicating the "port" key was found and updated
return true, nil
}
// Return false if the "port" key was not found
return false, nil
}
func writeCaddyfile(routes map[string]int, filename string) error {
// Create or open the file
file, err := os.Create(filename)
if err != nil {
return fmt.Errorf("failed to create or open file: %w", err)
}
defer file.Close()
// Write the global options or any other required headers
_, err = file.WriteString(`{
# Global options
auto_https off
}
:8080 {
root * ./web
file_server
route {
`)
if err != nil {
return fmt.Errorf("failed to write to file: %w", err)
}
// Iterate over the map and generate the routes
for path, port := range routes {
routeConfig := fmt.Sprintf(`
handle_path /%s/* {
rewrite * /oc{path}
reverse_proxy localhost:%d
}
`, path, port)
_, err = file.WriteString(routeConfig)
if err != nil {
return fmt.Errorf("failed to write route to file: %w", err)
}
}
// Write the closing braces
_, err = file.WriteString(`
}
}
`)
if err != nil {
return fmt.Errorf("failed to write closing braces to file: %w", err)
}
return nil
}