re-initialize repo without old history :(
This commit is contained in:
@@ -0,0 +1,440 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Charles Danesi, 2022.
|
||||
# parts taken from https://gist.github.com/loudambiance/a41b42a4295bce6e7304
|
||||
|
||||
# TODO git merge status
|
||||
# TODO git isLocalOnly to check if there are remotes or if this is only a local repo)
|
||||
# TODO number of pushes pending
|
||||
# TODO display number of modified files (maybe number of untracked as well)
|
||||
# TODO display current tag
|
||||
# TODO display that files are staged
|
||||
# TODO display a 'ready to commit' status
|
||||
# TODO display file deleted
|
||||
# TODO status to display detached HEAD
|
||||
# TODO status icon to indicate stash
|
||||
|
||||
#=========================================================
|
||||
#Terminal Color Codes
|
||||
#=========================================================
|
||||
WHITE='\[\033[1;37m\]'
|
||||
LIGHTGRAY='\[\033[0;37m\]'
|
||||
GRAY='\[\033[1;49;90m\]'
|
||||
BLACK='\[\033[0;30m\]'
|
||||
RED='\[\033[0;31m\]'
|
||||
LIGHTRED='\[\033[1;31m\]'
|
||||
GREEN='\[\033[0;32m\]'
|
||||
LIGHTGREEN='\[\033[1;32m\]'
|
||||
ORANGE='\[\033[0;33m\]'
|
||||
YELLOW='\[\033[1;33m\]'
|
||||
BLUE="\[\033[0;34m\]"
|
||||
LIGHTBLUE='\[\033[1;34m\]'
|
||||
PURPLE='\[\033[0;35m\]'
|
||||
PINK='\[\033[1;35m\]'
|
||||
CYAN='\[\033[0;36m\]'
|
||||
LIGHTCYAN='\[\033[1;36m\]'
|
||||
DEFAULT='\[\033[0m\]'
|
||||
CDNET1="\[\e[38;5;27m\]"
|
||||
CDNET2="\[\e[38;5;32m\]"
|
||||
DARKGRAY="\[\e[38;5;237m\]"
|
||||
DARKGRAY2="\[\e[90m\]"
|
||||
|
||||
#=========================================================
|
||||
# User Configuration
|
||||
#=========================================================
|
||||
# TODO refactor colors and config options.
|
||||
# Configuration
|
||||
#todoDir = "$HOME/code/todo.txt/" # This MUST be set for todo.txt to work!
|
||||
|
||||
# Colors
|
||||
clrLines=$GRAY # Lines and Arrow
|
||||
clrBrackets=$GRAY # Brackets around each data item
|
||||
clrError=$RED # Error displays when previous command did not return 0
|
||||
clrClock=$DARKGRAY # The current time
|
||||
clrScreenLabel=$CYAN # Color for terminal multiplexer label
|
||||
cMPX1=$YELLOW # Color for terminal multiplexer threshold 1
|
||||
cMPX2=$RED # Color for terminal multiplexer threshold 2
|
||||
cBGJ=$PURPLE # Color for background job label
|
||||
cBGJ1=$YELLOW # Color for background job threshold 1
|
||||
cBGJ2=$RED # Color for background job threshold 2
|
||||
cSTJ=$RED # Color for stopped job label
|
||||
cSTJ1=$YELLOW # Color for background job threshold 1
|
||||
cSTJ2=$RED # Color for background job threshold 2
|
||||
clrTaskLabel=$PURPLE # Color for todo.txt tasks label
|
||||
clrTasks=$YELLOW # Color for the number of todo.txt tasks
|
||||
clrSSH=$PINK # Color for brackets if session is an SSH session
|
||||
clrUsername=$CDNET2 # Color of user
|
||||
clrHostname=$CDNET2 # Color of hostname
|
||||
clrWarnAsRoot=$RED # Color of root warning
|
||||
clrWorkingDirectory=$CDNET1 # Color of current directory
|
||||
clrCommand=$DEFAULT # Color of the command you type
|
||||
clrSeparator=$WHITE # Color for separator for screen/jobs
|
||||
clrUserSeperator=$GRAY # Color of the user and hostname separator, probably '@'
|
||||
clrDefaultLines=$clrLines # default color
|
||||
clrDefaultBrackets=$clrBrackets # default color
|
||||
clrGitBranch=$LIGHTGREEN
|
||||
clrGitHash=$CDNET1
|
||||
clrCmdRunTime=$CYAN
|
||||
GITBG1="\[\e[47m\]"
|
||||
GITBG2="\[\e[100m\]"
|
||||
|
||||
# Features
|
||||
fBlankLine=1 # Have a newline between previous command output and new prompt
|
||||
fGitRepo=1 # Show git status
|
||||
fGitStatusBar=1 # Show the git status bar above the main prompt (3 lines) NOTE: currently unused
|
||||
fGitAfterCWD=1 # Show git status on 2-line prompt NOTE: currently unused
|
||||
fReturnErrors=1 # Previous command return status tracker
|
||||
fWindowTitle=1 # show uptime/load in titlebar
|
||||
fClock=1
|
||||
fShowHostname=1
|
||||
fScreenTracker=1 # Terminal multiplexer tracker enabled
|
||||
fSSHSession=0 # Track if session is SSH
|
||||
fBackgroundJobTracker=1 # Track background jobs
|
||||
fStoppedJobsTracker=1 # Track stopped jobs
|
||||
fShowUserHost=1 # Show user and host #### NOTE: CURRENTLY UNUSED ####
|
||||
fWorkingDirectory=1 # Show current directory
|
||||
fPathShortening=1 # Enable directory shortening (configurable)
|
||||
fLastCmdRunTime=1 # Display last cmd wall time
|
||||
|
||||
fShowTaskCount=1 # Show task count from todo.txt, if installed
|
||||
|
||||
# Settings
|
||||
# TODO: add thresholds for cmd wall time
|
||||
# TODO: add settings for customizing todo.txt (project/context/priority display only)
|
||||
shortDirectoryThreshold="2" # How many folders deep before we start trimming the path
|
||||
mpxThresholdMid="0" # Terminal multiplexer threshold 1 value
|
||||
mpxThresholdHigh="2" # Terminal multiplexer threshold 2 value
|
||||
bgJobThresholdMid="0" # Background job threshold 1 value
|
||||
bgJobThresholdHigh="2" # Background job threshold 2 value
|
||||
stoppedJobThresholdMid="0" # Stopped job threshold 1 value
|
||||
stoppedJobThresholdHigh="2" # Stopped job threshold 2 value
|
||||
|
||||
# Symbols/Indicators
|
||||
userHostSeparator="@"
|
||||
symScreen="s"
|
||||
gitBranch="" #
|
||||
gitUntrackedFiles="?"
|
||||
gitFilesAdded="A"
|
||||
gitFilesRemoved="D"
|
||||
gitFilesModified="M"
|
||||
gitStagedChanges=""
|
||||
gitUnstagedChanges="Δ"
|
||||
gitStashedChanges="*" #
|
||||
gitMerging="‼" #
|
||||
gitUncommittedChanges="✘" # staged, but not committed
|
||||
gitClean="✓"
|
||||
gitDirty="✘"
|
||||
gitPushReady="" #
|
||||
gitBehindRemote=""
|
||||
gitLocalOnly=""
|
||||
gitLocalRemote=""
|
||||
taskLabel="☑"
|
||||
|
||||
# if user-specific config exists, override default values
|
||||
if [ -f $HOME/.cdprc ]; then
|
||||
. $HOME/.cdprc
|
||||
fi
|
||||
|
||||
function promptcmd() {
|
||||
prevReturnCode=$?
|
||||
timer_stop
|
||||
|
||||
# check if we're in an SSH session
|
||||
if [[ $SSH_CLIENT ]] || [[ $SSH2_CLIENT ]]; then
|
||||
lSSH_FLAG=1
|
||||
else
|
||||
lSSH_FLAG=0
|
||||
fi
|
||||
|
||||
# insert newline to clear space from previous cmd
|
||||
if [ $fBlankLine -eq 1 ]; then
|
||||
PS1="\n"
|
||||
else
|
||||
PS1=
|
||||
fi
|
||||
|
||||
# previous command error
|
||||
if [ $fReturnErrors -eq 1 ]; then
|
||||
if [ $prevReturnCode -ne 0 ]; then
|
||||
clrLines=$clrError
|
||||
clrBrackets=$clrError
|
||||
else
|
||||
clrLines=$clrDefaultLines
|
||||
clrBrackets=$clrDefaultBrackets
|
||||
fi
|
||||
fi
|
||||
|
||||
# set window title
|
||||
if [ $fWindowTitle -eq 1 ]; then
|
||||
if [ "$STY" != "" ]; then
|
||||
PS1="\[\e]0;(`echo $STY|cut -d . -f 2`)`uptime`\a\]${PS1}"
|
||||
else
|
||||
PS1="\[\e]0;`uptime -p`, `uptime | cut -d " " -f 12-`\a\]${PS1}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# beginning of first line (if in a git repo)
|
||||
# if [ $fGitRepo -eq 1 ] && [ "$(is_git_repo)" == "true" ]; then
|
||||
# PS1="${PS1} ${WHITE} ${clrGitBranch}$(git_branch)$(git_hash) $(git_untracked)\n"
|
||||
# fi
|
||||
|
||||
# first line if not in a git repo
|
||||
PS1="${PS1}${debian_chroot:+($debian_chroot)}${clrLines}\342\224\214\342\224\200"
|
||||
|
||||
# last cmd runtime
|
||||
if [ $fLastCmdRunTime -eq 1 ]; then
|
||||
PS1="${PS1}${clrBrackets}[${clrCmdRunTime}$timer_show${clrBrackets}]${clrLines}\342\224\200"
|
||||
fi
|
||||
|
||||
# current time
|
||||
if [ $fClock -eq 1 ] ; then
|
||||
PS1="${PS1}${clrBrackets}[${clrClock}\t${clrBrackets}]${clrLines}\342\224\200"
|
||||
fi
|
||||
|
||||
# detached screen sessions
|
||||
if [ $fScreenTracker -eq 1 ] ; then
|
||||
hTMUX=0
|
||||
hSCREEN=0
|
||||
mpxCounter=0
|
||||
hash tmux --help 2>/dev/null || hTMUX=1
|
||||
hash screen --version 2>/dev/null || hSCREEN=1
|
||||
if [ $hTMUX -eq 1 ] && [ $hSCREEN -eq 1 ]; then
|
||||
mpxCounter=$(echo "$(screen -ls|grep -c -i detach) + $(tmux ls 2> /dev/null | grep -c -i -v attach)" | bc)
|
||||
elif [ $hTMUX -eq 0 ] && [ $hSCREEN -eq 1 ] ; then
|
||||
mpxCounter=$(tmux ls 2>/dev/null | grep -c -i -v attach)
|
||||
elif [ $hTMUX -eq 1 ] && [ $hSCREEN -eq 0 ] ; then
|
||||
mpxCounter=$(screen -ls | grep -c -i detach)
|
||||
fi
|
||||
if [[ $mpxCounter -gt $mpxThresholdHigh ]] ; then
|
||||
PS1="${PS1}${clrBrackets}[${clrScreenLabel}${symScreen}${clrSeparator}:${cMPX2}${mpxCounter}${clrBrackets}]${clrLines}\342\224\200"
|
||||
elif [[ $mpxCounter -gt $mpxThresholdMid ]] ; then
|
||||
PS1="${PS1}${clrBrackets}[${clrScreenLabel}${symScreen}${clrSeparator}:${cMPX1}${mpxCounter}${clrBrackets}]${clrLines}\342\224\200"
|
||||
fi
|
||||
fi
|
||||
|
||||
# background tasks
|
||||
if [ $fBackgroundJobTracker -eq 1 ] ; then
|
||||
BGJC=$(jobs -r|wc -l)
|
||||
if [ $BGJC -gt $bgJobThresholdHigh ] ; then
|
||||
PS1="${PS1}${clrBrackets}[${cBGJ2}&${clrSeparator}:${cBGJ2}${BGJC}${clrBrackets}]${clrLines}\342\224\200"
|
||||
elif [ $BGJC -gt $bgJobThresholdMid ] ; then
|
||||
PS1="${PS1}${clrBrackets}[${cBGJ1}&${clrSeparator}:${cBGJ2}${BGJC}${clrBrackets}]${clrLines}\342\224\200"
|
||||
fi
|
||||
fi
|
||||
|
||||
# stopped jobs
|
||||
if [ $fStoppedJobsTracker -eq 1 ] ; then
|
||||
STJC=$(jobs -s | wc -l )
|
||||
if [ $STJC -gt $stoppedJobThresholdHigh ] ; then
|
||||
PS1="${PS1}${clrBrackets}[${cSTJ2}\342\234\227${clrSeparator}:${cSTJ2}${STJC}${clrBrackets}]${clrLines}\342\224\200"
|
||||
elif [ $STJC -gt $stoppedJobThresholdMid ] ; then
|
||||
PS1="${PS1}${clrBrackets}[${cSTJ1}\342\234\227${clrSeparator}:${cSTJ1}${STJC}${clrBrackets}]${clrLines}\342\224\200"
|
||||
fi
|
||||
fi
|
||||
|
||||
# todo.txt task count
|
||||
if [ $fShowTaskCount -eq 1 ] ; then
|
||||
PS1="${PS1}${clrTaskLabel}"
|
||||
fi
|
||||
|
||||
# user@host
|
||||
# set bracket color if in ssh session
|
||||
if [ $fSSHSession -eq 1 ] && [ $lSSH_FLAG -eq 1 ]; then
|
||||
clrSes="$clrSSH"
|
||||
else
|
||||
clrSes="$clrBrackets"
|
||||
fi
|
||||
|
||||
# don't display user if root
|
||||
if [ $EUID -eq 0 ]; then
|
||||
PS1="${PS1}${clrSes}[${clrWarnAsRoot}!"
|
||||
else
|
||||
PS1="${PS1}${clrSes}[${clrUsername}\u"
|
||||
fi
|
||||
|
||||
# Host Section
|
||||
if [ $fShowHostname -eq 1 ] || [ $lSSH_FLAG -eq 1 ] ; then # Host is optional only without SSH
|
||||
PS1="${PS1}${clrUserSeperator}${userHostSeparator}${clrHostname}\h${clrSes}]${clrLines}\342\224\200"
|
||||
else
|
||||
PS1="${PS1}${clrSes}]${clrLines}\342\224\200"
|
||||
fi
|
||||
#PS1="${PS1}${userHostSeparator}${LIGHTGREEN}\h${clrSes}]${GRAY}\342\224\200"
|
||||
|
||||
# current directory
|
||||
if [ $fWorkingDirectory -eq 1 ]; then
|
||||
PS1="${PS1}[${clrWorkingDirectory}\w"
|
||||
if [ $fGitRepo -eq 1 ] && [ "$(is_git_repo)" == "true" ]; then
|
||||
PS1="${PS1}${clrBrackets}]${clrLines}\342\224\200${clrBrackets}[${WHITE}${gitBranch} ${clrGitBranch}$(git_branch)$(git_hash) $(git_untracked)${clrBrackets}]"
|
||||
else
|
||||
PS1="${PS1}${clrBrackets}]"
|
||||
fi
|
||||
fi
|
||||
|
||||
# prompt
|
||||
PS1="${PS1}\n${clrLines}\342\224\224\342\224\200\342\224\200> ${clrCommand}"
|
||||
}
|
||||
|
||||
function timer_now {
|
||||
date +%s%3N
|
||||
}
|
||||
|
||||
function timer_start {
|
||||
timer=${timer:-$(timer_now)}
|
||||
}
|
||||
|
||||
function timer_stop {
|
||||
local d_ms=$(($(timer_now) - $timer))
|
||||
local d_s=$((d_ms / 1000))
|
||||
local ms=$((d_ms % 1000))
|
||||
local s=$((d_s % 60))
|
||||
local m=$(((d_s / 60) % 60))
|
||||
local h=$((d_s / 3600))
|
||||
if ((h > 0)); then timer_show=${h}h${m}m
|
||||
elif ((m > 0)); then timer_show=${m}m${s}s
|
||||
elif ((s >= 10)); then timer_show=${s}.$((ms / 100))s
|
||||
elif ((s > 0)); then timer_show=${s}.$((ms / 10))s
|
||||
else timer_show=${ms}ms
|
||||
fi
|
||||
unset timer
|
||||
}
|
||||
|
||||
function is_git_repo {
|
||||
# TODO: can do this without saving as a variable
|
||||
local isREPO="$(git rev-parse --is-inside-work-tree 2>/dev/null)"
|
||||
#if [ ! $(git remote 2>/dev/null) ]; then echo "no remote"; else echo "remote available";fi
|
||||
echo -e $isREPO
|
||||
}
|
||||
|
||||
function git_hash {
|
||||
local current_hash="$(git log --oneline --max-count=1 2>/dev/null|cut -b -7)"
|
||||
if [ "$current_hash" != "" ]; then
|
||||
# TODO: change these to configurable variable
|
||||
echo -e "${YELLOW}@${clrGitHash}$current_hash"
|
||||
fi
|
||||
}
|
||||
|
||||
# might be able to include untracked/unmerged/unstaged in one function
|
||||
function git_untracked {
|
||||
local git_icons=""
|
||||
local git_status="$(git status 2>/dev/null)"
|
||||
local git_shortStatus="$(git status --porcelain|cut -b 1-2 2>/dev/null)"
|
||||
# local git_stash="$(git stash list 2>/dev/null)"
|
||||
# M modified
|
||||
# A added
|
||||
# D deleted
|
||||
# R renamed
|
||||
# C copied
|
||||
# byte 1 is staged, byte 2 unstaged
|
||||
# ↑1 ↓10
|
||||
|
||||
# has stash present
|
||||
# NOTE: IDK why this only works with the first '!'
|
||||
if ! git stash list &>/dev/null != ""; then
|
||||
git_icons="${git_icons}${LIGHTBLUE}${gitStashedChanges}"
|
||||
fi
|
||||
|
||||
# untracked files
|
||||
# if git status --porcelain|cut -b 1-2|grep "??" &>/dev/null ; then
|
||||
# NOTE: this is probably the better way to chain these...
|
||||
if [[ $git_shortStatus =~ "??" ]]; then
|
||||
git_icons="${git_icons}${RED}${gitUntrackedFiles}"
|
||||
fi
|
||||
# added files
|
||||
if [[ $git_shortStatus =~ "A" ]]; then
|
||||
git_icons="${git_icons}${DEFAULT}${gitFilesAdded}"
|
||||
fi
|
||||
# deleted files
|
||||
if [[ $git_shortStatus =~ "D" ]]; then
|
||||
git_icons="${git_icons}${DEFAULT}${gitFilesRemoved}"
|
||||
fi
|
||||
|
||||
# modified/renamed/copied files
|
||||
for i in $git_shortStatus; do
|
||||
case $i in
|
||||
R)
|
||||
;&
|
||||
C)
|
||||
;&
|
||||
M)
|
||||
#echo -n "${RED}${gitFilesModified}"
|
||||
git_icons="${git_icons}${DEFAULT}${gitFilesModified}"
|
||||
break;
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# unmerged ( ‼ )
|
||||
|
||||
# FIXME: should not include this all in the same function
|
||||
|
||||
# unstaged changes
|
||||
if git status --porcelain|cut -b 2|grep 'M\|A\|D\|R\|C' &>/dev/null; then
|
||||
git_icons="${git_icons}${LIGHTBLUE}${gitUnstagedChanges}"
|
||||
fi
|
||||
|
||||
if [ "$git_icons" != "" ]; then
|
||||
git_icons="${git_icons} "
|
||||
fi
|
||||
# if git status --porcelain|cut -b 1|grep 'M\|A\|D\|R\|C' &>/dev/null; then
|
||||
# git_icons="${git_icons} ${YELLOW}✘"
|
||||
# if [[ !$git_status =~ "working tree clean" ]] ; then
|
||||
# git_icons="${git_icons}${RED}✘"
|
||||
if [[ $git_status =~ "Changes to be committed" ]]; then
|
||||
git_icons="${git_icons}${GREEN}✘" # NOTE: staged but not committed
|
||||
elif [[ $git_status =~ "Changes not staged" ]]; then
|
||||
git_icons="${git_icons}${LIGHTBLUE}✘"
|
||||
elif [[ $git_status =~ "branch is ahead" ]]; then
|
||||
git_icons="${git_icons}${YELLOW}✘" #NOTE: ahead of origin
|
||||
elif [[ $git_status =~ "nothing to commit" ]]; then
|
||||
git_icons="${git_icons}${LIGHTGREEN}${gitClean}" #NOTE: working
|
||||
else
|
||||
git_icons="${git_icons}${RED}${gitDirty}" # NOTE: working
|
||||
fi
|
||||
|
||||
# if [ "$git_icons" != "" ]; then
|
||||
# echo -e " ${git_icons}"
|
||||
# fi
|
||||
echo -e $git_icons
|
||||
}
|
||||
|
||||
function git_branch {
|
||||
local git_status="$(git status 2>/dev/null)"
|
||||
local on_branch="On branch ([^${IFS}]*)"
|
||||
local on_commit="HEAD detached at ([^${IFS}]*)"
|
||||
|
||||
if [[ $git_status =~ $on_branch ]]; then
|
||||
local branch=${BASH_REMATCH[1]}
|
||||
echo "$branch"
|
||||
elif [[ $git_status =~ $on_commit ]]; then
|
||||
local commit=${BASH_REMATCH[1]}
|
||||
echo "($commit)"
|
||||
fi
|
||||
}
|
||||
|
||||
function load_prompt() {
|
||||
# Get PIDs
|
||||
local parent_process=$(tr -d '\0' < /proc/$PPID/cmdline | cut -d \. -f 1)
|
||||
local my_process=$(tr -d '\0' < /proc/$$/cmdline | cut -d \. -f 1)
|
||||
|
||||
if [[ $parent_process == script* ]]; then
|
||||
PROMPT_COMMAND=""
|
||||
PS1="\t - \# - \u@\H { \w }\$ "
|
||||
elif [[ $parent_process == emacs* || $parent_process == xemacs* ]]; then
|
||||
PROMPT_COMMAND=""
|
||||
PS1="\u@\h { \w }\$ "
|
||||
else
|
||||
export DAY=$(date +%A)
|
||||
PROMPT_COMMAND="promptcmd"
|
||||
fi
|
||||
|
||||
if [ $fPathShortening -eq 1 ]; then
|
||||
export PROMPT_DIRTRIM=$shortDirectoryThreshold
|
||||
else
|
||||
export PROMPT_DIRTRIM=
|
||||
fi
|
||||
|
||||
trap 'timer_start' DEBUG
|
||||
export PS1 PROMPT_COMMAND
|
||||
}
|
||||
|
||||
load_prompt
|
||||
Reference in New Issue
Block a user