Compare commits

..

No commits in common. "main" and "v0.11.5" have entirely different histories.

9 changed files with 226 additions and 765 deletions

View file

@ -1,23 +0,0 @@
This is a Go based repository buliding a command line tool that converts the status of a git working tree for a specific directory into a tmux status string the end user can add to their tmux status line. It is designed to be used with the `tmux` terminal multiplexer.
## Code Standards
### Required Before Each Commit
- Run `go test ./...` before committing any changes to ensure tests pass
- Go code should be formatted with `gofmt`
## Repository Structure
- `./`: repository root, main package, default configuration file, and main entry point
- `tmux/`: tmux formatting
- `json/`: used by gitmux -dbg to print the git working tree status as a json object, for debugging purposes
- `testdata/`: testscripts fixtures when actual gitmux output is checked against some specific conditions.
## Key Guidelines
1. Follow Go best practices and idiomatic patterns
2. Maintain existing code structure and organization
3. Write unit tests for new functionality. Use table-driven unit tests when possible.
4. Document public options
5. Keep table aligned in the README.md file, for a nice experience even when reading the file in a terminal

View file

@ -2,14 +2,6 @@
_Describe the problem or feature in addition to a link to the issues._
## Approach
_How does this Pull Request address the problem?_
_How does this change address the problem?_
## Testing
- There should be some unit tests for every behaviour change or new feature
- If you're adding a new configuration option, the default configuration file
(.gitmux.yml) should be modified with the new option
- There's a test that verifies that gitmux output always remains the same
across versions when using the default configuration. You can run it with:
`go test -run TestScriptst`
- `README.md` should always be updated.
Thank you!

View file

@ -35,3 +35,17 @@ jobs:
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
check_brew:
name: Check Brew Tap
needs: goreleaser
runs-on: macos-latest
steps:
- name: Install gitmux with brew
run: |
brew tap arl/arl
brew install gitmux
gitmux -V
- name: Check installed gitmux version
run: |
[ v$(gitmux -V) == "$GITHUB_REF_NAME" ]

View file

@ -86,6 +86,4 @@ tmux:
# Add a space between behind & ahead upstream counts.
divergence_space: false
# Show flags symbols without counts.
# When true, shows only symbols (empty symbols show nothing).
# When false (default), shows symbols with counts (empty symbols show counts only).
flags_without_count: false

View file

@ -31,3 +31,20 @@ changelog:
exclude:
- "^docs:"
- "^test:"
brews:
- name: gitmux
homepage: "https://github.com/arl/gitmux"
description: "Git in your tmux status bar."
license: "MIT"
url_template: "https://github.com/arl/gitmux/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
commit_msg_template: "Brew formula update for {{ .ProjectName }} version {{ .Tag }}"
directory: Formula
skip_upload: false
repository:
owner: arl
name: homebrew-arl
branch: main
commit_author:
name: goreleaser-bot
email: bot@goreleaser.com

View file

@ -21,22 +21,21 @@
![demo](https://raw.githubusercontent.com/arl/gitmux/readme-images/demo-small.gif)
- **easy**: install and forget
- **minimal**: shows what you need, when you need it
- **discrete**: shows nothing when you're not in a git-managed directory
- **shell-agnostic**: doesn't rely on any shell-specific features, so will work with all of them
- **customizable**: colors, symbols and layout are all configurable
- **easy**. Install and forget about it
- **minimal**. Just shows what you need, when you need it
- **discrete**. Get out of your way if current directory is not in a Git tree
- **shell-agnostic**. Does not rely on shell-features so works with all of them
- **customizable**. Colors, symbols and layout are configurable
---
- [Prerequisites](#prerequisites)
- [Installing](#installing)
- [Binary release](#binary-release)
- [Homebrew (macOS and linux) (amd64 and arm64)](#homebrew-macos-and-linux-amd64-and-arm64)
- [Homebrew tap (macOS and linux) (amd64 and arm64)](#homebrew-tap-macos-and-linux-amd64-and-arm64)
- [AUR](#aur)
- [From source](#from-source)
- [Getting started](#getting-started)
- [Command line interface](#command-line-interface)
- [Customizing](#customizing)
- [Symbols](#symbols)
- [Styles](#styles)
@ -91,29 +90,6 @@ you run or when you switch windows, however it won't refresh automatically, nor
Note that `tmux v2.1` was released in 2015 so you're probably better off updating to a more recent version anyway 🙂.
### Command line interface
`gitmux` is not meant to be call directly but it still has a command line interface
that can be used to create the default configuration, troubleshoot your installation or during development:
```
$ gitmux -h
gitmux v0.11.5
Usage: gitmux [options] [dir]
gitmux prints the status of a Git working tree as a tmux format string.
If directory is not given, it default to the working directory.
Options:
-cfg FILE read gitmux config from FILE.
-printcfg prints default configuration file.
-dbg outputs Git status as JSON and print errors.
-timeout DUR exits if still running after given duration (ex: 2s, 500ms).
-V prints gitmux version and exits.
```
## Customizing
`gitmux` output can be customized via a configuration file in YAML format.
@ -296,9 +272,7 @@ This is the list of additional configuration `options`:
| `hide_clean` | Hides the clean flag entirely | `false` |
| `swap_divergence` | Swaps order of behind & ahead upstream counts | `false` |
| `divergence_space` | Add a space between behind & ahead upstream counts | `false` |
| `flags_without_count`| Show flags symbols without counts* | `false` |
*When `flags_without_count` is true, shows only symbols (empty symbols show nothing). When false (default), shows symbols with counts (empty symbols show counts only).
| `flags_without_count`| Show flags symbols without counts | `false` |
## Troubleshooting

View file

@ -1,64 +0,0 @@
#!/bin/sh
_have() { type "$1" >/dev/null 2>&1; }
help() {
cat <<EOF
Usage: ${0##*/} [options] [version]
Options:
-h, --help Show this help message and exit.
Arguments:
version Specify the version of gitmux to install. If not provided, the latest version will be installed.
Environment Variables:
INSTALL_PATH Specify the directory where gitmux should be installed. Required
Description:
This script installs the gitmux tool, which provides Git status information in the tmux status line.
It automatically detects the system architecture and downloads the appropriate version of gitmux.
Examples:
INSTALL_PATH=/usr/local/bin ${0##*/} Install the latest version of gitmux to /usr/local/bin.
INSTALL_PATH=/usr/local/bin ${0##*/} v0.7.0 Install version 0.7.0 of gitmux to /usr/local/bin.
EOF
}
gh_install() {
ver="$1"
repo='arl/gitmux'
[ -z "$ver" ] && {
latest="https://api.github.com/repos/$repo/releases/latest"
ver=$(curl -sS "$latest" | grep tarball_url | sed 's>.*: "\(.*\)".*>\1>') && test -n "$ver"
ver=${ver##*/}
}
tarname=''
archi=$(uname -sm)
case "$archi" in
Darwin\ arm64) tarname="gitmux_${ver}_macOS_arm64.tar.gz" ;;
Darwin\ x86_64) tarname="gitmux_${ver}_macOS_amd64.tar.gz" ;;
Linux\ aarch64*) tarname="gitmux_${ver}_linux_arm64.tar.gz" ;;
Linux\ *64) tarname="gitmux_${ver}_linux_amd64.tar.gz" ;;
*) echo "Unsupported architecture" && return 1 ;;
esac
tmpdir="$(mktemp -d)"
cd "$tmpdir" || :
curl -sSLO "https://github.com/$repo/releases/download/$ver/$tarname"
tar -xf gitmux*.tar.gz &&
mv gitmux "${INSTALL_PATH}"
[ -d "$tmpdir" ] && rm -rf "$tmpdir"
}
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then help && exit 0; fi
! _have curl && echo "This script depends on curl" && exit 1
[ -z "$INSTALL_PATH" ] && echo "Please set the INSTALL_PATH envvar to specify installation directory" && exit 1
echo "Installing gitmux..."
if gh_install "$@"; then
echo "Successfully installed gitmux"
else
echo "Could not install gitmux" && exit 1
fi

View file

@ -295,32 +295,22 @@ func (f *Formater) currentRef() string {
return fmt.Sprintf("%s%s%s", f.Styles.Clear, f.Styles.Branch, branch)
}
// appendFlag appends a flag to the flags slice based on configuration options
func (f *Formater) appendFlag(flags []string, style, symbol string, count int) []string {
if count == 0 {
return flags
}
// formatFlag formats a flag with or without count based on the flags_without_count option
func (f *Formater) formatFlag(style, symbol string, count int) string {
if f.Options.FlagsWithoutCount {
// When flags_without_count is true, show symbol only (empty string if symbol is empty)
if symbol == "" {
return flags
}
return append(flags, fmt.Sprintf("%s%s", style, symbol))
return fmt.Sprintf("%s%s", style, symbol)
}
// When flags_without_count is false, show symbol + count, or just count if symbol is empty
return append(flags, fmt.Sprintf("%s%s%d", style, symbol, count))
return fmt.Sprintf("%s%s%d", style, symbol, count)
}
func (f *Formater) flags() string {
var flags []string
if f.st.IsClean {
// For stashed in clean state, handle empty symbols properly
flags = f.appendFlag(flags, f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed)
if f.st.NumStashed != 0 {
flags = append(flags, f.formatFlag(f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed))
}
// Clean flag only shows if symbol is not empty and hide_clean is false
if !f.Options.HideClean && f.Symbols.Clean != "" {
if !f.Options.HideClean {
flags = append(flags, fmt.Sprintf("%s%s", f.Styles.Clean, f.Symbols.Clean))
}
@ -329,12 +319,25 @@ func (f *Formater) flags() string {
}
}
// For all other flags, handle empty symbols properly
flags = f.appendFlag(flags, f.Styles.Staged, f.Symbols.Staged, f.st.NumStaged)
flags = f.appendFlag(flags, f.Styles.Conflict, f.Symbols.Conflict, f.st.NumConflicts)
flags = f.appendFlag(flags, f.Styles.Modified, f.Symbols.Modified, f.st.NumModified)
flags = f.appendFlag(flags, f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed)
flags = f.appendFlag(flags, f.Styles.Untracked, f.Symbols.Untracked, f.st.NumUntracked)
if f.st.NumStaged != 0 {
flags = append(flags, f.formatFlag(f.Styles.Staged, f.Symbols.Staged, f.st.NumStaged))
}
if f.st.NumConflicts != 0 {
flags = append(flags, f.formatFlag(f.Styles.Conflict, f.Symbols.Conflict, f.st.NumConflicts))
}
if f.st.NumModified != 0 {
flags = append(flags, f.formatFlag(f.Styles.Modified, f.Symbols.Modified, f.st.NumModified))
}
if f.st.NumStashed != 0 {
flags = append(flags, f.formatFlag(f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed))
}
if f.st.NumUntracked != 0 {
flags = append(flags, f.formatFlag(f.Styles.Untracked, f.Symbols.Untracked, f.st.NumUntracked))
}
if len(flags) > 0 {
return f.Styles.Clear + strings.Join(flags, " ")

File diff suppressed because it is too large Load diff