From 0228faa07a195d96c71e72e71e93618265b3b334 Mon Sep 17 00:00:00 2001 From: Caleb Bartholomew Date: Thu, 30 Sep 2021 18:37:38 -0600 Subject: [PATCH 1/2] Increased the performance of GCP segment Reduced the amount of time it takes to get the Google Cloud Project by attempting to read config files directly, and falling back to gcloud only if we experience an error. --- segment-gcp.go | 111 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) diff --git a/segment-gcp.go b/segment-gcp.go index 9912e25f..08e9bac1 100644 --- a/segment-gcp.go +++ b/segment-gcp.go @@ -1,20 +1,127 @@ package main import ( + "bytes" + "fmt" "log" + "os" "os/exec" + "runtime" "strings" pwl "github.com/justjanne/powerline-go/powerline" ) -func segmentGCP(p *powerline) []pwl.Segment { +const gcloudCoreSectionHeader = "\n[core]\n" + +func getCloudConfigDir() (string, error) { + p, err := os.UserHomeDir() + if err != nil { + return "", err + } + if runtime.GOOS != "windows" { + p += "/.config" + } + p += "/gcloud" + return p, nil +} + +func getActiveGCloudConfig(configDir string) (string, error) { + activeConfigPath := configDir + "/active_config" + + stat, err := os.Stat(activeConfigPath) + if (err == nil && os.IsNotExist(err)) || (err == nil && stat.IsDir()) { + return "default", nil + } else if err != nil { + return "", err + } + + contents, err := os.ReadFile(activeConfigPath) + if err != nil { + return "", err + } + + config := strings.TrimSpace(string(contents)) + if config == "" { + config = "default" + } + + return config, nil +} + +func getGCPProjectFromGCloud() (string, error) { out, err := exec.Command("gcloud", "config", "list", "project", "--format", "value(core.project)").Output() + if err != nil { + return "", err + } + + return strings.TrimSuffix(string(out), "\n"), nil +} + +func getGCPProjectFromFile() (string, error) { + configDir, err := getCloudConfigDir() + if err != nil { + return "", err + } + + activeConfig, err := getActiveGCloudConfig(configDir) + if err != nil { + return "", err + } + + configPath := configDir + "/configurations/config_" + activeConfig + stat, err := os.Stat(configPath) + if err != nil { + return "", err + } else if stat.IsDir() { + return "", fmt.Errorf("%s is a directory", configPath) + } + + b, err := os.ReadFile(configPath) + if err != nil { + return "", err + } + b = append([]byte("\n"), b...) + + coreStart := bytes.Index(b, []byte(gcloudCoreSectionHeader)) + if coreStart == -1 { + return "", fmt.Errorf("could not find [core] section in %s", configPath) + } + b = b[coreStart+len(gcloudCoreSectionHeader):] + + coreEnd := bytes.Index(b, []byte("\n[")) + if coreEnd != -1 { + b = b[:coreEnd] + } + + lines := bytes.Split(b[coreStart+len(gcloudCoreSectionHeader):coreEnd], []byte("\n")) + for _, line := range lines { + parts := bytes.Split(line, []byte("=")) + if len(parts) == 2 { + if strings.TrimSpace(string(parts[0])) == "project" { + return strings.TrimSpace(string(parts[1])), nil + } + } + } + + return "", nil +} + +func getGCPProject() (string, error) { + if project, err := getGCPProjectFromFile(); err == nil { + return project, nil + } else { + return getGCPProjectFromGCloud() + } +} + +func segmentGCP(p *powerline) []pwl.Segment { + project, err := getGCPProject() if err != nil { log.Fatal(err) + //return []pwl.Segment{} } - project := strings.TrimSuffix(string(out), "\n") if project == "" { return []pwl.Segment{} } From 698687bfadc156c2673514231ce0213be72212ee Mon Sep 17 00:00:00 2001 From: Caleb <68619622+caleb-artifact@users.noreply.github.com> Date: Wed, 6 Oct 2021 09:02:33 -0600 Subject: [PATCH 2/2] Update segment-gcp.go Co-authored-by: Janne Mareike Koschinski --- segment-gcp.go | 1 - 1 file changed, 1 deletion(-) diff --git a/segment-gcp.go b/segment-gcp.go index 08e9bac1..bd10f15d 100644 --- a/segment-gcp.go +++ b/segment-gcp.go @@ -119,7 +119,6 @@ func segmentGCP(p *powerline) []pwl.Segment { project, err := getGCPProject() if err != nil { log.Fatal(err) - //return []pwl.Segment{} } if project == "" {