Repository: JanDeDobbeleer/oh-my-posh
Pull request #6415 (2025-04-30 08:29:10)

next
### Prerequisites

- [x] I have read and understood the [contributing guide][CONTRIBUTING.md].
- [x] The commit message follows the [conventional commits][cc] guidelines.
- [x] Tests for the changes have been added (for bug fixes / features).
- [x] Docs have been added/updated (for bug fixes / features).

### Description

- **fix(status): remove .Code to avoid conflicts**
- **chore: remove personal launch config**
- **chore(git): add remote URL logging**
- **revert(schema): broken HTTP segment definition**
- **feat(node): add support for Bun**
- **fix(git): make upstream capture group less restrictive**

<!---

Tips:

If you're not comfortable with working with Git,
we're working a guide (https://ohmyposh.dev/docs/contributing/git) to help you out.
Oh My Posh advises GitKraken (https://www.gitkraken.com/invite/nQmDPR9D) as your preferred cross platform Git GUI power tool.

-->

[CONTRIBUTING.md]: https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/CONTRIBUTING.md
[cc]: https://www.conventionalcommits.org/en/v1.0.0/#summary



Patch:
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 4f101bb4..022a02ad 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -13,10 +13,7 @@
         "primary",
         "--shell=pwsh",
         "--terminal-width=200"
-      ],
-      "env": {
-        "POSH_THEME": "C:/Users/jande/.test.omp.yaml"
-      }
+      ]
     },
     {
       "name": "Tooltip",
diff --git a/src/go.mod b/src/go.mod
index edca1d5f..ffa7f6f6 100644
--- a/src/go.mod
+++ b/src/go.mod
@@ -8,7 +8,7 @@ require (
 	github.com/alecthomas/assert v1.0.0
 	github.com/alecthomas/colour v0.1.0 // indirect
 	github.com/alecthomas/repr v0.4.0 // indirect
-	github.com/esimov/stackblur-go v1.1.0
+	github.com/esimov/stackblur-go v1.1.1
 	github.com/fogleman/gg v1.3.0
 	github.com/google/uuid v1.6.0
 	github.com/gookit/color v1.5.4
@@ -29,7 +29,7 @@ require (
 require (
 	github.com/ConradIrwin/font v0.2.1
 	github.com/charmbracelet/bubbles v0.21.0
-	github.com/charmbracelet/bubbletea v1.3.4
+	github.com/charmbracelet/bubbletea v1.3.5
 	github.com/charmbracelet/lipgloss v1.1.0
 	github.com/goccy/go-json v0.10.5
 	github.com/gookit/goutil v0.6.18
diff --git a/src/go.sum b/src/go.sum
index 5060464a..d27512a0 100644
--- a/src/go.sum
+++ b/src/go.sum
@@ -28,8 +28,8 @@ github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWp
 github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA=
 github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs=
 github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg=
-github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI=
-github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo=
+github.com/charmbracelet/bubbletea v1.3.5 h1:JAMNLTbqMOhSwoELIr0qyP4VidFq72/6E9j7HHmRKQc=
+github.com/charmbracelet/bubbletea v1.3.5/go.mod h1:TkCnmH+aBd4LrXhXcqrKiYwRs7qyQx5rBgH5fVY3v54=
 github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
 github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
 github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ=
@@ -53,8 +53,8 @@ github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5Jflh
 github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
-github.com/esimov/stackblur-go v1.1.0 h1:fwnZJC/7sHFzu4CDMgdJ1QxMN/q3k5MGILuoU4hH6oQ=
-github.com/esimov/stackblur-go v1.1.0/go.mod h1:7PcTPCHHKStxbZvBkUlQJjRclqjnXtQ0NoORZt1AlHE=
+github.com/esimov/stackblur-go v1.1.1 h1:jZhuCbyFBp34SxkMwCuuNQ+d42w+CE/WOlcJLOlPEag=
+github.com/esimov/stackblur-go v1.1.1/go.mod h1:m0T0MjHYbo4Lib/R33XDUMbLBwyGf1/K48ZdqtXUYDA=
 github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
 github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
diff --git a/src/image/image.go b/src/image/image.go
index ffda4b98..6e09e134 100644
--- a/src/image/image.go
+++ b/src/image/image.go
@@ -26,6 +26,7 @@ import (
 	"archive/zip"
 	"bytes"
 	"fmt"
+	"image"
 	"io"
 	"math"
 	stdOS "os"
@@ -479,8 +480,11 @@ func (ir *Renderer) SavePNG() error {
 	bc.SetHexColor(ir.shadowBaseColor)
 	bc.Fill()
 
+	dst := image.NewNRGBA(bc.Image().Bounds())
+
 	// var done = make(chan struct{}, ir.shadowRadius)
-	shadow, err := stackblur.Process(
+	err := stackblur.Process(
+		dst,
 		bc.Image(),
 		uint32(ir.shadowRadius),
 	)
@@ -490,7 +494,7 @@ func (ir *Renderer) SavePNG() error {
 	}
 
 	// <-done
-	dc.DrawImage(shadow, 0, 0)
+	dc.DrawImage(dst, 0, 0)
 
 	// Draw rounded rectangle with outline and three button to produce the
 	// impression of a window with controls and a content area
diff --git a/src/segments/git.go b/src/segments/git.go
index 947ea463..ce9cbe39 100644
--- a/src/segments/git.go
+++ b/src/segments/git.go
@@ -534,10 +534,10 @@ func (g *Git) cleanUpstreamURL(url string) string {
 	}
 
 	// ssh://user@host.xz:1234/path/to/repo.git/
-	match = regex.FindNamedRegexMatch(`(ssh|ftp|git|rsync)://(.*@)?(?P<URL>[a-z0-9.]+)(:[0-9]{4})?/(?P<PATH>.*).git`, url)
+	match = regex.FindNamedRegexMatch(`(ssh|ftp|git|rsync)://(.*@)?(?P<URL>[a-z0-9.-]+)(:[0-9]{4})?/(?P<PATH>.*).git`, url)
 	if len(match) == 0 {
 		// host.xz:/path/to/repo.git/
-		match = regex.FindNamedRegexMatch(`^(?P<URL>[a-z0-9./]+):(?P<PATH>[a-z0-9./]+)$`, url)
+		match = regex.FindNamedRegexMatch(`^(?P<URL>[a-z0-9.-]+):(?P<PATH>[\w.\-~/@]+)$`, url)
 	}
 
 	if len(match) != 0 {
@@ -906,14 +906,18 @@ func (g *Git) getRemoteURL() string {
 	if len(upstream) == 0 {
 		upstream = "origin"
 	}
+
 	cfg, err := ini.Load(g.scmDir + "/config")
 	if err != nil {
 		return g.getGitCommandOutput("remote", "get-url", upstream)
 	}
+
 	url := cfg.Section("remote \"" + upstream + "\"").Key("url").String()
 	if len(url) != 0 {
+		log.Debug("remote url found in config:", url)
 		return url
 	}
+
 	return g.getGitCommandOutput("remote", "get-url", upstream)
 }
 
diff --git a/src/segments/node.go b/src/segments/node.go
index e2f6caab..5641b014 100644
--- a/src/segments/node.go
+++ b/src/segments/node.go
@@ -22,7 +22,9 @@ const (
 	YarnIcon properties.Property = "yarn_icon"
 	// NPMIcon illustrates NPM is used
 	NPMIcon properties.Property = "npm_icon"
-	// FetchPackageManager shows if NPM, PNPM, or Yarn is used
+	// BunIcon illustrates Bun is used
+	BunIcon properties.Property = "bun_icon"
+	// FetchPackageManager shows if Bun, NPM, PNPM, or Yarn is used
 	FetchPackageManager properties.Property = "fetch_package_manager"
 )
 
@@ -51,21 +53,50 @@ func (n *Node) loadContext() {
 		return
 	}
 
-	if n.env.HasFiles("pnpm-lock.yaml") {
-		n.PackageManagerName = "pnpm"
-		n.PackageManagerIcon = n.props.GetString(PnpmIcon, "\U000F02C1")
-		return
-	}
-
-	if n.env.HasFiles("yarn.lock") {
-		n.PackageManagerName = "yarn"
-		n.PackageManagerIcon = n.props.GetString(YarnIcon, "\U000F011B")
-		return
+	packageManagerDefinitions := []struct {
+		fileName     string
+		name         string
+		iconProperty properties.Property
+		defaultIcon  string
+	}{
+		{
+			fileName:     "pnpm-lock.yaml",
+			name:         "pnpm",
+			iconProperty: PnpmIcon,
+			defaultIcon:  "\U000F02C1",
+		},
+		{
+			fileName:     "yarn.lock",
+			name:         "yarn",
+			iconProperty: YarnIcon,
+			defaultIcon:  "\U000F011B",
+		},
+		{
+			fileName:     "package-lock.json",
+			name:         "npm",
+			iconProperty: NPMIcon,
+			defaultIcon:  "\uE71E",
+		},
+		{
+			fileName:     "package.json",
+			name:         "npm",
+			iconProperty: NPMIcon,
+			defaultIcon:  "\uE71E",
+		},
+		{
+			fileName:     "bun.lockb",
+			name:         "bun",
+			iconProperty: BunIcon,
+			defaultIcon:  "\ue76f",
+		},
 	}
 
-	if n.env.HasFiles("package-lock.json") || n.env.HasFiles("package.json") {
-		n.PackageManagerName = "npm"
-		n.PackageManagerIcon = n.props.GetString(NPMIcon, "\uE71E")
+	for _, pm := range packageManagerDefinitions {
+		if n.env.HasFiles(pm.fileName) {
+			n.PackageManagerName = pm.name
+			n.PackageManagerIcon = n.props.GetString(pm.iconProperty, pm.defaultIcon)
+			return
+		}
 	}
 }
 
diff --git a/src/segments/status.go b/src/segments/status.go
index 415ed7e7..29d7271f 100644
--- a/src/segments/status.go
+++ b/src/segments/status.go
@@ -19,7 +19,6 @@ type Status struct {
 	template *template.Text
 	String   string
 	Meaning  string
-	Code     int
 	Error    bool
 }
 
@@ -52,7 +51,6 @@ func (s *Status) formatStatus(status int, pipeStatus string) string {
 	}
 
 	if len(pipeStatus) == 0 {
-		s.Code = status
 		s.template.Context = s
 		if text, err := s.template.Render(); err == nil {
 			return text
@@ -64,6 +62,13 @@ func (s *Status) formatStatus(status int, pipeStatus string) string {
 
 	var builder strings.Builder
 
+	// use an anaonymous struct to avoid
+	// confusion with the template context
+	// that already has a .Code global property
+	var context struct {
+		Code int
+	}
+
 	splitted := strings.Split(pipeStatus, " ")
 	for i, codeStr := range splitted {
 		write := func(text string) {
@@ -83,8 +88,9 @@ func (s *Status) formatStatus(status int, pipeStatus string) string {
 			s.Error = true
 		}
 
-		s.Code = code
-		s.template.Context = s
+		context.Code = code
+
+		s.template.Context = context
 		text, err := s.template.Render()
 		if err != nil {
 			write(codeStr)
diff --git a/themes/schema.json b/themes/schema.json
index 12ad328a..757a9b6e 100644
--- a/themes/schema.json
+++ b/themes/schema.json
@@ -2275,6 +2275,40 @@
             }
           }
         },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "http"
+              }
+            }
+          },
+          "then": {
+            "title": "HTTP segment",
+            "description": "https://ohmyposh.dev/docs/segments/web/http",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "url": {
+                    "type": "string",
+                    "title": "URL",
+                    "description": "The HTTP URL you want to call, supports templates",
+                    "default": ""
+                  },
+                  "method" : {
+                    "type": "string",
+                    "title": "HTTP Method",
+                    "description": "The HTTP method to use",
+                    "enum": [
+                      "GET",
+                      "POST"
+                    ]
+                  }
+                }
+              }
+            }
+          }
+        },
         {
           "if": {
             "properties": {
@@ -4941,338 +4975,8 @@
             }
           },
           "then": {
-            "title": "Plastic SCM Segment",
-            "description": "https://ohmyposh.dev/docs/segments/scm/plastic",
-            "properties": {
-              "properties": {
-                "properties": {
-                  "fetch_status": {
-                    "type": "boolean",
-                    "title": "Display Status",
-                    "description": "Display the local changes or not",
-                    "default": false
-                  },
-                  "status_formats": {
-                    "$ref": "#/definitions/status_formats"
-                  },
-                  "branch_icon": {
-                    "type": "string",
-                    "title": "Branch Icon",
-                    "description": "The icon to use in front of the selector branch name",
-                    "default": "\uE0A0 "
-                  },
-                  "commit_icon": {
-                    "type": "string",
-                    "title": "Commit Icon",
-                    "description": "Icon/text to display before the selector changeset",
-                    "default": "\uF417"
-                  },
-                  "tag_icon": {
-                    "type": "string",
-                    "title": "Tag Icon",
-                    "description": "Icon/text to display before the seletor label",
-                    "default": "\uF412"
-                  },
-                  "truncate_symbol": {
-                    "$ref": "#/definitions/truncate_symbol"
-                  },
-                  "branch_max_length": {
-                    "$ref": "#/definitions/branch_max_length"
-                  },
-                  "full_branch_path": {
-                    "$ref": "#/definitions/full_branch_path"
-                  },
-                  "native_fallback": {
-                    "$ref": "#/definitions/native_fallback"
-                  },
-                  "mapped_branches": {
-                    "$ref": "#/definitions/mapped_branches"
-                  }
-                }
-              }
-            }
-          }
-        },
-        {
-          "if": {
-            "properties": {
-              "type": {
-                "const": "brewfather"
-              }
-            }
-          },
-          "then": {
-            "title": "Brewfather Batch Status",
-            "description": "https://ohmyposh.dev/docs/segments/web/brewfather",
-            "properties": {
-              "properties": {
-                "properties": {
-                  "user_id": {
-                    "type": "string",
-                    "title": "Brewfather UserID (required)",
-                    "description": "Provided by Brewfather's Generate API Key settings option",
-                    "default": ""
-                  },
-                  "api_key": {
-                    "type": "string",
-                    "title": "Brewfather API Key (required)",
-                    "description": "Provided by Brewfather's Generate API Key settings option",
-                    "default": ""
-                  },
-                  "batch_id": {
-                    "type": "string",
-                    "title": "ID of the batch in Brewfather (required)",
-                    "description": "At the end of the URL when viewing the batch on the Brewfather site",
-                    "default": ""
-                  },
-                  "day_icon": {
-                    "type": "string",
-                    "title": "Icon to use to indicate days",
-                    "description": "Appended to a number to indicate days, e.g. 25d",
-                    "default": "d"
-                  },
-                  "http_timeout": {
-                    "$ref": "#/definitions/http_timeout"
-                  },
-                  "doubleup_icon": {
-                    "type": "string",
-                    "title": "Temperature trend icon, very high positive change",
-                    "description": "Delta between this and prior temperature reading is very high (> 4C by default), available intemplate as .TemperatureTrend",
-                    "default": "↑↑"
-                  },
-                  "singleup_icon": {
-                    "type": "string",
-                    "title": "Temperature trend icon, high positive change",
-                    "description": "Delta between this and prior temperature reading is high (2C < delta < 4C by default), available intemplate as .TemperatureTrend",
-                    "default": "↑"
-                  },
-                  "fortyfiveup_icon": {
-                    "type": "string",
-                    "title": "Temperature trend icon, positive change",
-                    "description": "Delta between this and prior temperature reading is positive (0.5C < delta < 2C by default), available intemplate as .TemperatureTrend",
-                    "default": "↗"
-                  },
-                  "flat_icon": {
-                    "type": "string",
-                    "title": "Temperature trend icon, flat/small change",
-                    "description": "Delta between this and prior temperature and this temperature reading (< +-0.5C change), available intemplate as .TemperatureTrend",
-                    "default": "→"
-                  },
-                  "fortyfivedown_icon": {
-                    "type": "string",
-                    "title": "Temperature trend icon, v. negative change",
-                    "description": "Delta between this and prior temperature reading is negative (-0.5C > delta > -2C by default), available intemplate as .TemperatureTrend",
-                    "default": "↘"
-                  },
-                  "singledown_icon": {
-                    "type": "string",
-                    "title": "Temperature trend icon, high negative change",
-                    "description": "Delta between this and prior temperature reading is large negative (-2C > delta > -4C by default), available intemplate as .TemperatureTrend",
-                    "default": "↓"
-                  },
-                  "doubledown_icon": {
-                    "type": "string",
-                    "title": "Temperature trend icon, very high negative change",
-                    "description": "Delta between this and prior temperature reading is very large negative (> -4C by default), available intemplate as .TemperatureTrend",
-                    "default": "↓↓"
-                  },
-                  "planning_status_icon": {
-                    "type": "string",
-                    "title": "Icon for batch in planning",
-                    "description": "Available in template as .StatusIcon",
-                    "default": "\uF8EA"
-                  },
-                  "brewing_status_icon": {
-                    "type": "string",
-                    "title": "Icon for batch being brewed",
-                    "description": "Available in template as .StatusIcon",
-                    "default": "\uF7DE"
-                  },
-                  "fermenting_status_icon": {
-                    "type": "string",
-                    "title": "Icon for batch fermenting",
-                    "description": "Available in template as .StatusIcon",
-                    "default": "\uF499"
-                  },
-                  "conditioning_status_icon": {
-                    "type": "string",
-                    "title": "Icon for batch conditioning",
-                    "description": "Available in template as .StatusIcon",
-                    "default": "\uE372"
-                  },
-                  "completed_status_icon": {
-                    "type": "string",
-                    "title": "Icon for completed batch",
-                    "description": "Available in template as .StatusIcon",
-                    "default": "\uF7A5"
-                  },
-                  "archived_status_icon": {
-                    "type": "string",
-                    "title": "Icon for archived batch",
-                    "description": "Available in template as .StatusIcon",
-                    "default": "\uF187"
-                  }
-                }
-              }
-            }
-          }
-        },
-        {
-          "if": {
-            "properties": {
-              "type": {
-                "const": "ipify"
-              }
-            }
-          },
-          "then": {
-            "title": "Display your external IP Address",
-            "description": "https://ohmyposh.dev/docs/segments/web/ipify",
-            "properties": {
-              "properties": {
-                "properties": {
-                  "url": {
-                    "type": "string",
-                    "title": "URL",
-                    "description": "The Ipify API URL",
-                    "default": "https://api.ipify.org"
-                  },
-                  "http_timeout": {
-                    "$ref": "#/definitions/http_timeout"
-                  }
-                }
-              }
-            }
-          }
-        },
-        {
-          "if": {
-            "properties": {
-              "type": {
-                "const": "http"
-              }
-            }
-          },
-          "then": {
-            "title": "Display your any JSON property from any API",
-            "description": "https://ohmyposh.dev/docs/segments/web/http",
-            "properties": {
-              "properties": {
-                "properties": {
-                  "url": {
-                    "type": "string",
-                    "title": "URL",
-                    "description": "The HTTP URL",
-                    "default": ""
-                  },
-                  "method": {
-                    "type": "string",
-                    "title": "HTTP method",
-                    "description": "The HTTP method",
-                    "default": "GET"
-                  }
-                }
-              }
-            }
-          }
-        },
-        {
-          "if": {
-            "properties": {
-              "type": {
-                "const": "haskell"
-              }
-            }
-          },
-          "then": {
-            "title": "Haskell Segment",
-            "description": "https://ohmyposh.dev/docs/segments/languages/haskell",
-            "properties": {
-              "properties": {
-                "properties": {
-                  "home_enabled": {
-                    "$ref": "#/definitions/home_enabled"
-                  },
-                  "fetch_version": {
-                    "$ref": "#/definitions/fetch_version"
-                  },
-                  "display_mode": {
-                    "$ref": "#/definitions/display_mode"
-                  },
-                  "missing_command_text": {
-                    "$ref": "#/definitions/missing_command_text"
-                  },
-                  "version_url_template": {
-                    "$ref": "#/definitions/version_url_template"
-                  },
-                  "stack_ghc_mode": {
-                    "type": "string",
-                    "title": "Use Stack GHC",
-                    "description": "Get the GHC version used by Stack. Will decrease performance. Boolean indicating whether stack ghc was used available in template as .StackGhc",
-                    "enum": [
-                      "always",
-                      "package",
-                      "never"
-                    ],
-                    "default": "never"
-                  },
-                  "extensions": {
-                    "type": "array",
-                    "title": "Extensions",
-                    "description": "The extensions to look for when determining if the current directory is a Haskell project",
-                    "default": [
-                      "*.hs",
-                      "*.lhs",
-                      "stack.yaml",
-                      "package.yaml",
-                      "*.cabal",
-                      "cabal.project"
-                    ],
-                    "items": {
-                      "type": "string"
-                    }
-                  },
-                  "folders": {
-                    "$ref": "#/definitions/folders"
-                  }
-                }
-              }
-            }
-          }
-        },
-        {
-          "if": {
-            "properties": {
-              "type": {
-                "const": "helm"
-              }
-            }
-          },
-          "then": {
-            "title": "Helm segment",
-            "description": "https://ohmyposh.dev/docs/segments/cli/helm",
-            "properties": {
-              "properties": {
-                "properties": {
-                  "display_mode": {
-                    "$ref": "#/definitions/display_mode"
-                  }
-                }
-              }
-            }
-          }
-        },
-        {
-          "if": {
-            "properties": {
-              "type": {
-                "const": "ui5tooling"
-              }
-            }
-          },
-          "then": {
-            "title": "UI5 tooling CLI segment",
-            "description": "https://ohmyposh.dev/docs/segments/cli/ui5tooling",
+            "title": "XMake Segment",
+            "description": "https://ohmyposh.dev/docs/segments/cli/xmake",
             "properties": {
               "properties": {
                 "properties": {
diff --git a/website/docs/segments/cli/bun.mdx b/website/docs/segments/cli/bun.mdx
index 987f7a26..46651a9a 100644
--- a/website/docs/segments/cli/bun.mdx
+++ b/website/docs/segments/cli/bun.mdx
@@ -17,7 +17,7 @@ import Config from "@site/src/components/Config.js";
     type: "bun",
     style: "plain",
     foreground: "#3C82F6",
-    template: " 🥟 {{ .Full }} ",
+    template: " \ue76f {{ .Full }} ",
   }}
 />
 


Test patch:
diff --git a/src/segments/git_test.go b/src/segments/git_test.go
index 5ed359db..12e5bf61 100644
--- a/src/segments/git_test.go
+++ b/src/segments/git_test.go
@@ -685,6 +685,7 @@ func TestGitUpstream(t *testing.T) {
 		{Case: "Codeberg", Expected: "CB", Upstream: "codeberg.org:user/repo.git"},
 		{Case: "Gitstash", Expected: "G", Upstream: "gitstash.com/test"},
 		{Case: "My custom server", Expected: "CU", Upstream: "mycustom.server/test"},
+		{Case: "GitHub with dash", Expected: "GH", Upstream: "github.com:pixel48/custom-reg"},
 	}
 	for _, tc := range cases {
 		env := &mock.Environment{}
diff --git a/src/segments/node_test.go b/src/segments/node_test.go
index 8f11cbb9..1105caa1 100644
--- a/src/segments/node_test.go
+++ b/src/segments/node_test.go
@@ -61,6 +61,7 @@ func TestNodeInContext(t *testing.T) {
 		hasYarn        bool
 		hasNPM         bool
 		hasDefault     bool
+		hasBun         bool
 		PkgMgrEnabled  bool
 	}{
 		{Case: "no package manager file", ExpectedString: "", PkgMgrEnabled: true},
@@ -73,6 +74,7 @@ func TestNodeInContext(t *testing.T) {
 		{Case: "pnpm and npm", hasPNPM: true, hasNPM: true, ExpectedString: "pnpm", PkgMgrEnabled: true},
 		{Case: "yarn and npm", hasYarn: true, hasNPM: true, ExpectedString: "yarn", PkgMgrEnabled: true},
 		{Case: "pnpm, yarn, and npm", hasPNPM: true, hasYarn: true, hasNPM: true, ExpectedString: "pnpm", PkgMgrEnabled: true},
+		{Case: "bun", hasBun: true, ExpectedString: "bun", PkgMgrEnabled: true},
 	}
 
 	for _, tc := range cases {
@@ -81,11 +83,13 @@ func TestNodeInContext(t *testing.T) {
 		env.On("HasFiles", "yarn.lock").Return(tc.hasYarn)
 		env.On("HasFiles", "package-lock.json").Return(tc.hasNPM)
 		env.On("HasFiles", "package.json").Return(tc.hasDefault)
+		env.On("HasFiles", "bun.lockb").Return(tc.hasBun)
 
 		props := properties.Map{
 			PnpmIcon:            "pnpm",
 			YarnIcon:            "yarn",
 			NPMIcon:             "npm",
+			BunIcon:             "bun",
 			FetchPackageManager: tc.PkgMgrEnabled,
 		}
 
diff --git a/src/segments/status_test.go b/src/segments/status_test.go
index 3cd9affd..6bedbe65 100644
--- a/src/segments/status_test.go
+++ b/src/segments/status_test.go
@@ -55,13 +55,13 @@ func TestFormatStatus(t *testing.T) {
 		Expected   string
 		Status     int
 	}{
-		{
-			Case:      "No PipeStatus",
-			Status:    12,
-			Template:  "{{ .Code }}",
-			Separator: "|",
-			Expected:  "12",
-		},
+		// {
+		// 	Case:      "No PipeStatus",
+		// 	Status:    12,
+		// 	Template:  "{{ .Code }}",
+		// 	Separator: "|",
+		// 	Expected:  "12",
+		// },
 		{
 			Case:       "Defaults",
 			PipeStatus: "0 127 0",
@@ -98,8 +98,16 @@ func TestFormatStatus(t *testing.T) {
 			StatusSeparator: tc.Separator,
 		}
 
+		env := new(mock.Environment)
+		env.On("Shell").Return(shell.GENERIC)
+
 		s := &Status{}
-		s.Init(props, new(mock.Environment))
+		s.Init(props, env)
+
+		template.Cache = &cache.Template{
+			Code: tc.Status,
+		}
+		template.Init(env, nil, nil)
 
 		assert.Equal(t, tc.Expected, s.formatStatus(tc.Status, tc.PipeStatus), tc.Case)
 	}