Compare commits

...

4 commits

Author SHA1 Message Date
David O'Trakoun c3f6e20965
MIT license 2020-04-03 02:48:10 -04:00
David O'Trakoun 56675a7f7e
update with notes 2017-08-16 14:17:56 -04:00
David O'Trakoun 402c0180fb
zplug guide 2017-03-14 00:03:17 -04:00
David O'Trakoun c46dd14ac2
shellcheck fixes 2016-08-19 12:07:05 -04:00
3 changed files with 76 additions and 34 deletions

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
MIT License Copyright (c) 2020 davidosomething
Permission is hereby granted,
free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice
(including the next paragraph) shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View file

@ -1,4 +1,4 @@
# git-my v1.1.0
# git-my
Lists all of a user's branches, including local and remote, and shows:
@ -6,8 +6,8 @@ Lists all of a user's branches, including local and remote, and shows:
- if a local branch is tracked remotely
- if a local branch is up-to-date with a specified branch
| Name | Link |
| ---- | ---- |
| Name | Link |
| ------------- | -------- |
| Project Home: | [https://github.com/davidosomething/git-my](https://github.com/davidosomething/git-my)
## About
@ -21,8 +21,17 @@ Here's a screenshot:
## Installation
- Requires BASH 4+
- Add the `git-my` file somewhere in your path, e.g. `/usr/local/bin/`
### zplug installation
Super simple if you use zplug:
```sh
zplug "davidosomething/git-my", as:command
```
## Usage
From command line execute:
@ -50,5 +59,5 @@ merged into `origin/qa`.
----
Copyright (c) 2015 David O'Trakoun <me@davidosomething.com>
Copyright (c) 2017 David O'Trakoun <me@davidosomething.com>

72
git-my
View file

@ -1,31 +1,32 @@
#!/usr/bin/env bash
# git-my v1.1.0
# git-my v1.1.2
#
# Lists a user's remote branches and shows if it was merged
# and/or available locally
# and/or available locally.
#
# Copyright (c) 2015 David O'Trakoun <me@davidosomething.com>
# Copyright (c) 2017 David O'Trakoun <me@davidosomething.com>
#
# Requires:
# bash 4+ for readarray
#
# Usage:
# git my
#
set -eu
# _check_in_repository
# is_repository
#
# Exits with error if not a git repository
#
_check_in_repository() {
is_repository() {
git rev-parse --git-dir >/dev/null 2>&1
}
# _get_local_branches
# get_local_branches
#
# Proper way to get a porcelain list of local branches for shell script use
#
_get_local_branches() {
get_local_branches() {
local fmt
local cmd_get_local_branches
@ -42,13 +43,13 @@ _get_local_branches() {
eval "$cmd_get_local_branches"
}
# _get_everyones_remotes
# get_everyones_remotes
#
# Get porcelain list of all remote branches
#
# @TODO support remote_name (currently origin)
#
_get_everyones_remotes() {
get_everyones_remotes() {
local fmt
local cmd_everyones_remotes
@ -71,12 +72,12 @@ _get_everyones_remotes() {
eval "$cmd_everyones_remotes"
}
# _get_merged_remote_branches
# get_merged_remote_branches
#
# @param string optional remote to list merged branches of. Defaults to
# "origin/master"
# @output names of remote branches that are merged into given branch
_get_merged_remote_branches() {
get_merged_remote_branches() {
local remote
local remote_name
#local remote_refname
@ -103,12 +104,12 @@ _get_merged_remote_branches() {
echo "$stripped_branchnames"
}
# _filter_mine
# filter_mine
#
# @param git_user
# @param branchnames
# @output branchnames owned by current git user
_filter_mine() {
filter_mine() {
local git_user
local branchnames
git_user=$1
@ -122,13 +123,13 @@ _filter_mine() {
echo "$my_remotes" | grep -v "HEAD" | awk -F'\t' '{ print $2 }'
}
# _merge_lists
# merge_lists
#
# Convert two lists to bash arrays, merge them, sort them
#
# @param list1
# @param list2
_merge_lists() {
merge_lists() {
local l1
local l2
l1=$(echo "$1" | awk '{$1=$1};1')
@ -145,14 +146,14 @@ _merge_lists() {
echo "${intersect[@]}"
}
# _decorate_merged
# decorate_merged
#
# @param string my_branches list of remote branch names owned by me
# @param string local_branches list of local branch names
# @param string merged_remote_branches list of all remote branch names merged
# into another branch
# @output table of branch names and status
_decorate_merged() {
decorate_merged() {
local my_branches
readarray -t my_branches <<< "$(echo "$1" | tr ' ' '\n' )"
@ -201,11 +202,11 @@ _decorate_merged() {
"$is_local" "$is_tracked" "$is_merged" "$branchname")
if [ $zebra = 0 ]; then
echo -en ${normal}
echo -en "${normal}"
printf "\e[48;5;0m%s %s\n" "$decorated" "$clreol"
zebra=1
else
echo -en ${normal}
echo -en "${normal}"
printf "\e[48;5;236m%s %s" "$decorated" "$clreol"
if [[ "$i" != "$last" ]]; then printf "\n"; fi
zebra=0
@ -215,13 +216,14 @@ _decorate_merged() {
printf "\e[48;5;0m\n"
}
_main() {
main() {
local decorated
local everyones_remotes
local git_remote
local git_user
local local_branches
local merged_remote_branches
local my_branches
local my_remotes
local remote=${1:-"origin/master"}
@ -232,12 +234,22 @@ _main() {
local remote_ref=${remote#*/}
git_user=$(git config --get user.name)
if [ -z "$git_user" ]; then
echo "ERROR: user.name is not set in git config"
exit 1
fi
git_remote=$(git config --get "remote.${remote_name}.url")
everyones_remotes=$(_get_everyones_remotes "$remote_name")
my_remotes=$(_filter_mine "$git_user" "$everyones_remotes")
merged_remote_branches=$(_get_merged_remote_branches "$remote_name/$remote_ref")
local_branches=$(_get_local_branches)
my_branches=$(_merge_lists "$my_remotes" "$local_branches")
if [ -z "$git_remote" ]; then
echo "ERROR: remote.${remote_name}.url is not set"
exit 1
fi
everyones_remotes=$(get_everyones_remotes "$remote_name")
my_remotes=$(filter_mine "$git_user" "$everyones_remotes")
merged_remote_branches=$(get_merged_remote_branches "$remote_name/$remote_ref")
local_branches=$(get_local_branches)
my_branches=$(merge_lists "$my_remotes" "$local_branches")
echo
echo "branches owned by user: $git_user"
@ -245,15 +257,15 @@ _main() {
echo "in remote repository: $git_remote"
echo
_decorate_merged "$my_branches" "$local_branches" "$merged_remote_branches"
decorate_merged "$my_branches" "$local_branches" "$merged_remote_branches"
echo
}
if ! _check_in_repository ; then
if ! is_repository; then
echo "This is not a git repository."
exit 1
fi
_main "$@"
main "$@"