From adace9c3ffffa847be1fdbe83a15aca7dfb97046 Mon Sep 17 00:00:00 2001 From: Jannik ZANDER Date: Fri, 20 Oct 2017 09:55:01 +0200 Subject: [PATCH] Old work PC --- .Xresources | 240 +- .bash_profile | 2 +- .config/bash/aliases | 2 +- .config/bash/completion | 30 +- .config/bash/functions | 160 +- .config/bash/options | 40 +- .config/bash/prompt.bash | 406 +-- .config/bash/solarized | 46 +- .config/git/config | 28 +- .config/git/ignore | 128 +- .config/git/templates/config | 18 +- .config/git/templates/hooks/cscope | 20 +- .config/git/templates/hooks/ctags | 16 +- .config/git/templates/hooks/gtags | 18 +- .config/git/templates/hooks/post-applypatch | 14 +- .config/git/templates/hooks/post-checkout | 8 +- .config/git/templates/hooks/post-commit | 8 +- .config/git/templates/hooks/post-merge | 8 +- .config/git/templates/hooks/post-rewrite | 8 +- .config/profile/environ.sh | 4 +- .config/profile/install.sh | 26 +- .config/profile/paths.sh | 82 +- .config/user-dirs.dirs | 30 +- .cshrc | 24 +- .dir_colors | 850 +++--- .gitignore | 2 +- .inputrc | 124 +- .profile | 34 +- .screenrc | 16 +- .ssh/config | 42 - .tmux.conf | 204 +- .vimrc | 111 +- .../usdanish.bundle/Contents/Info.plist | 38 +- .../Contents/Resources/U.S.Denmark.keylayout | 2286 ++++++++-------- .../usdanish.bundle/Contents/version.plist | 24 +- README.md | 22 +- bin/build-akmod.sh | 10 +- bin/build-luajit.sh | 6 +- bin/colortest | 730 ++--- bin/genilog.cmd | 3 +- bin/git-diffall.sh | 552 ++-- bin/git-difftool.sh | 6 +- bin/git-editor.sh | 8 +- bin/git-mergetool.sh | 8 +- bin/git-review | 2438 ++++++++--------- 45 files changed, 4445 insertions(+), 4435 deletions(-) delete mode 100644 .ssh/config diff --git a/.Xresources b/.Xresources index bcc4a32..da2bd02 100644 --- a/.Xresources +++ b/.Xresources @@ -1,120 +1,120 @@ -!!SOLARIZED HEX 16/8 TERMCOL XTERM/HEX L*A*B RGB HSB -!!--------- ------- ---- ------- ----------- ---------- ----------- ----------- -!!base03 #002b36 8/4 brblack 234 #1c1c1c 15 -12 -12 0 43 54 193 100 21 -!!base02 #073642 0/4 black 235 #262626 20 -12 -12 7 54 66 192 90 26 -!!base01 #586e75 10/7 brgreen 240 #585858 45 -07 -07 88 110 117 194 25 46 -!!base00 #657b83 11/7 bryellow 241 #626262 50 -07 -07 101 123 131 195 23 51 -!!base0 #839496 12/6 brblue 244 #808080 60 -06 -03 131 148 150 186 13 59 -!!base1 #93a1a1 14/4 brcyan 245 #8a8a8a 65 -05 -02 147 161 161 180 9 63 -!!base2 #eee8d5 7/7 white 254 #e4e4e4 92 -00 10 238 232 213 44 11 93 -!!base3 #fdf6e3 15/7 brwhite 230 #ffffd7 97 00 10 253 246 227 44 10 99 -!!yellow #b58900 3/3 yellow 136 #af8700 60 10 65 181 137 0 45 100 71 -!!orange #cb4b16 9/3 brred 166 #d75f00 50 50 55 203 75 22 18 89 80 -!!red #dc322f 1/1 red 160 #d70000 50 65 45 220 50 47 1 79 86 -!!magenta #d33682 5/5 magenta 125 #af005f 50 65 -05 211 54 130 331 74 83 -!!violet #6c71c4 13/5 brmagenta 61 #5f5faf 50 15 -45 108 113 196 237 45 77 -!!blue #268bd2 4/4 blue 33 #0087ff 55 -10 -45 38 139 210 205 82 82 -!!cyan #2aa198 6/6 cyan 37 #00afaf 60 -35 -05 42 161 152 175 74 63 -!!green #859900 2/2 green 64 #5f8700 60 -20 65 133 153 0 68 100 60 - -#define SOLARIZED_DARK -#ifdef SOLARIZED_DARK -#define S_base03 #002b36 -#define S_base02 #073642 -#define S_base01 #586e75 -#define S_base00 #657b83 -#define S_base0 #839496 -#define S_base1 #93a1a1 -#define S_base2 #eee8d5 -#define S_base3 #fdf6e3 -#endif - -#ifdef SOLARIZED_LIGHT -#define S_base3 #002b36 -#define S_base2 #073642 -#define S_base1 #586e75 -#define S_base0 #657b83 -#define S_base00 #839496 -#define S_base01 #93a1a1 -#define S_base02 #eee8d5 -#define S_base03 #fdf6e3 -#endif - -#define S_yellow #b58900 -#define S_orange #cb4b16 -#define S_red #dc322f -#define S_magenta #d33682 -#define S_violet #6c71c4 -#define S_blue #268bd2 -#define S_cyan #2aa198 -#define S_green #859900 - - -*background: S_base03 -*foreground: S_base00 -*fading: 40 -*fadeColor: S_base03 -*cursorColor: S_base1 -*pointerColorBackground:S_base01 -*pointerColorForeground:S_base1 - -!! black dark/light -*color0: S_base02 -*color8: S_base03 - -!! red dark/light -*color1: S_red -*color9: S_orange - -!! green dark/light -*color2: S_green -*color10: S_base01 - -!! yellow dark/light -*color3: S_yellow -*color11: S_base00 - -!! blue dark/light -*color4: S_blue -*color12: S_base0 - -!! magenta dark/light -*color5: S_magenta -*color13: S_violet - -!! cyan dark/light -*color6: S_cyan -*color14: S_base1 - -!! white dark/light -*color7: S_base2 -*color15: S_base3 - -!! xterm -XTerm*termName: xterm-256color -!XTerm*faceName: Mono -!XTerm*faceSize: 11 -XTerm*metaSendsEscape: true -XTerm*vt100.translations: #override \n\ - Ctrl ~Shift Tab: string(0x1b) string("[34~") \n -XTerm*toolBar: off -XTerm*scrollBar: true -XTerm*rightScrollBar: true - -!! better font rendering -Xft.dpi: 96 -Xft.antialias: true -Xft.rgba: rgb -Xft.hinting: false -Xft.hintstyle: hintnone -Xft.lcdfilter: lcddefault - -*reverseWrap: true -*scrollKey: true -*saveLines: 10000 -*scrollBar: true -*scrollTtyOutput: false -*cutToBeginningOfLine: true - - -dt.obsolete: true +!!SOLARIZED HEX 16/8 TERMCOL XTERM/HEX L*A*B RGB HSB +!!--------- ------- ---- ------- ----------- ---------- ----------- ----------- +!!base03 #002b36 8/4 brblack 234 #1c1c1c 15 -12 -12 0 43 54 193 100 21 +!!base02 #073642 0/4 black 235 #262626 20 -12 -12 7 54 66 192 90 26 +!!base01 #586e75 10/7 brgreen 240 #585858 45 -07 -07 88 110 117 194 25 46 +!!base00 #657b83 11/7 bryellow 241 #626262 50 -07 -07 101 123 131 195 23 51 +!!base0 #839496 12/6 brblue 244 #808080 60 -06 -03 131 148 150 186 13 59 +!!base1 #93a1a1 14/4 brcyan 245 #8a8a8a 65 -05 -02 147 161 161 180 9 63 +!!base2 #eee8d5 7/7 white 254 #e4e4e4 92 -00 10 238 232 213 44 11 93 +!!base3 #fdf6e3 15/7 brwhite 230 #ffffd7 97 00 10 253 246 227 44 10 99 +!!yellow #b58900 3/3 yellow 136 #af8700 60 10 65 181 137 0 45 100 71 +!!orange #cb4b16 9/3 brred 166 #d75f00 50 50 55 203 75 22 18 89 80 +!!red #dc322f 1/1 red 160 #d70000 50 65 45 220 50 47 1 79 86 +!!magenta #d33682 5/5 magenta 125 #af005f 50 65 -05 211 54 130 331 74 83 +!!violet #6c71c4 13/5 brmagenta 61 #5f5faf 50 15 -45 108 113 196 237 45 77 +!!blue #268bd2 4/4 blue 33 #0087ff 55 -10 -45 38 139 210 205 82 82 +!!cyan #2aa198 6/6 cyan 37 #00afaf 60 -35 -05 42 161 152 175 74 63 +!!green #859900 2/2 green 64 #5f8700 60 -20 65 133 153 0 68 100 60 + +#define SOLARIZED_DARK +#ifdef SOLARIZED_DARK +#define S_base03 #002b36 +#define S_base02 #073642 +#define S_base01 #586e75 +#define S_base00 #657b83 +#define S_base0 #839496 +#define S_base1 #93a1a1 +#define S_base2 #eee8d5 +#define S_base3 #fdf6e3 +#endif + +#ifdef SOLARIZED_LIGHT +#define S_base3 #002b36 +#define S_base2 #073642 +#define S_base1 #586e75 +#define S_base0 #657b83 +#define S_base00 #839496 +#define S_base01 #93a1a1 +#define S_base02 #eee8d5 +#define S_base03 #fdf6e3 +#endif + +#define S_yellow #b58900 +#define S_orange #cb4b16 +#define S_red #dc322f +#define S_magenta #d33682 +#define S_violet #6c71c4 +#define S_blue #268bd2 +#define S_cyan #2aa198 +#define S_green #859900 + + +*background: S_base03 +*foreground: S_base00 +*fading: 40 +*fadeColor: S_base03 +*cursorColor: S_base1 +*pointerColorBackground:S_base01 +*pointerColorForeground:S_base1 + +!! black dark/light +*color0: S_base02 +*color8: S_base03 + +!! red dark/light +*color1: S_red +*color9: S_orange + +!! green dark/light +*color2: S_green +*color10: S_base01 + +!! yellow dark/light +*color3: S_yellow +*color11: S_base00 + +!! blue dark/light +*color4: S_blue +*color12: S_base0 + +!! magenta dark/light +*color5: S_magenta +*color13: S_violet + +!! cyan dark/light +*color6: S_cyan +*color14: S_base1 + +!! white dark/light +*color7: S_base2 +*color15: S_base3 + +!! xterm +XTerm*termName: xterm-256color +!XTerm*faceName: Mono +!XTerm*faceSize: 11 +XTerm*metaSendsEscape: true +XTerm*vt100.translations: #override \n\ + Ctrl ~Shift Tab: string(0x1b) string("[34~") \n +XTerm*toolBar: off +XTerm*scrollBar: true +XTerm*rightScrollBar: true + +!! better font rendering +Xft.dpi: 96 +Xft.antialias: true +Xft.rgba: rgb +Xft.hinting: false +Xft.hintstyle: hintnone +Xft.lcdfilter: lcddefault + +*reverseWrap: true +*scrollKey: true +*saveLines: 10000 +*scrollBar: true +*scrollTtyOutput: false +*cutToBeginningOfLine: true + + +dt.obsolete: true diff --git a/.bash_profile b/.bash_profile index f8f9564..e8e53b6 100644 --- a/.bash_profile +++ b/.bash_profile @@ -1 +1 @@ -[ -f ~/.profile ] && source ~/.profile +[ -f ~/.profile ] && source ~/.profile diff --git a/.config/bash/aliases b/.config/bash/aliases index bf0c21b..9a8c67c 100644 --- a/.config/bash/aliases +++ b/.config/bash/aliases @@ -87,4 +87,4 @@ alias startxwin='run /usr/bin/bash.exe -l -c "/usr/bin/startxwin -- -nolock -uni alias startvnc='vncserver -geometry 1870x980 -depth 24' alias startvnc4='vnc4server -geometry 1870x980 -depth 24' alias dot='git --git-dir=$HOME/.dotfiles --work-tree=$HOME' -alias genilog='$HOME/repos/genilog/genilog.py' +alias genilog='/c/projects/genilog/genilog.py' diff --git a/.config/bash/completion b/.config/bash/completion index b1460ac..e23497e 100644 --- a/.config/bash/completion +++ b/.config/bash/completion @@ -1,15 +1,15 @@ -# Add tab completion for many Bash commands - -[ -f /etc/bash_completion ] && . /etc/bash_completion - -[ -f "${HOME}/.cache/bash/git-completion.bash" ] && . "${HOME}/.cache/bash/git-completion.bash" - -# Enable tab completion for `g` by marking it as an alias for `git` -if type _git &> /dev/null; then - complete -o default -o nospace -F _git g; -fi; - -# Add tab completion for SSH hostnames based on ~/.ssh/config, ignoring wildcards -if [ -e "$HOME/.ssh/config" ]; then - complete -o "default" -o "nospace" -W "$(grep "^Host" ~/.ssh/config | grep -v "[?*]" | cut -d " " -f2 | tr ' ' '\n')" scp sftp ssh; -fi; +# Add tab completion for many Bash commands + +[ -f /etc/bash_completion ] && . /etc/bash_completion + +[ -f "${HOME}/.cache/bash/git-completion.bash" ] && . "${HOME}/.cache/bash/git-completion.bash" + +# Enable tab completion for `g` by marking it as an alias for `git` +if type _git &> /dev/null; then + complete -o default -o nospace -F _git g; +fi; + +# Add tab completion for SSH hostnames based on ~/.ssh/config, ignoring wildcards +if [ -e "$HOME/.ssh/config" ]; then + complete -o "default" -o "nospace" -W "$(grep "^Host" ~/.ssh/config | grep -v "[?*]" | cut -d " " -f2 | tr ' ' '\n')" scp sftp ssh; +fi; diff --git a/.config/bash/functions b/.config/bash/functions index cabbbc0..2aab04b 100644 --- a/.config/bash/functions +++ b/.config/bash/functions @@ -1,80 +1,80 @@ -# Create a new directory and enter it -function mkd() { - mkdir -p "$@" && cd "$@"; -} - -# `v` with no arguments opens the current directory in Vim, otherwise opens the -# given location -function v() { - if [ $# -eq 0 ]; then - vim .; - else - vim "$@"; - fi; -} - -# `o` with no arguments opens the current directory, otherwise opens the given -# location -function o() { - if [ $# -eq 0 ]; then - open .; - else - open "$@"; - fi; -} - -# This function defines a 'cd' replacement function capable of keeping, -# displaying and accessing history of visited directories, up to 10 entries. -# To use it, uncomment it, source this file and try 'cd --'. - -cd_func() -{ - local x2 the_new_dir adir index - local -i cnt - - if [[ $1 == "--" ]]; then - dirs -v - return 0 - fi - - the_new_dir=$1 - [[ -z $1 ]] && the_new_dir=$HOME - - if [[ ${the_new_dir:0:1} == '-' ]]; then - # - # Extract dir N from dirs - index=${the_new_dir:1} - [[ -z $index ]] && index=1 - adir=$(dirs +$index) - [[ -z $adir ]] && return 1 - the_new_dir=$adir - fi - - # - # '~' has to be substituted by ${HOME} - [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}" - - # - # Now change to the new dir and add to the top of the stack - pushd "${the_new_dir}" > /dev/null - [[ $? -ne 0 ]] && return 1 - the_new_dir=$(pwd) - - # - # Trim down everything beyond 11th entry - popd -n +11 2>/dev/null 1>/dev/null - - # - # Remove any other occurence of this dir, skipping the top of the stack - for ((cnt=1; cnt <= 10; cnt++)); do - x2=$(dirs +${cnt} 2>/dev/null) - [[ $? -ne 0 ]] && return 0 - [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}" - if [[ "${x2}" == "${the_new_dir}" ]]; then - popd -n +$cnt 2>/dev/null 1>/dev/null - cnt=cnt-1 - fi - done - - return 0 -} +# Create a new directory and enter it +function mkd() { + mkdir -p "$@" && cd "$@"; +} + +# `v` with no arguments opens the current directory in Vim, otherwise opens the +# given location +function v() { + if [ $# -eq 0 ]; then + vim .; + else + vim "$@"; + fi; +} + +# `o` with no arguments opens the current directory, otherwise opens the given +# location +function o() { + if [ $# -eq 0 ]; then + open .; + else + open "$@"; + fi; +} + +# This function defines a 'cd' replacement function capable of keeping, +# displaying and accessing history of visited directories, up to 10 entries. +# To use it, uncomment it, source this file and try 'cd --'. + +cd_func() +{ + local x2 the_new_dir adir index + local -i cnt + + if [[ $1 == "--" ]]; then + dirs -v + return 0 + fi + + the_new_dir=$1 + [[ -z $1 ]] && the_new_dir=$HOME + + if [[ ${the_new_dir:0:1} == '-' ]]; then + # + # Extract dir N from dirs + index=${the_new_dir:1} + [[ -z $index ]] && index=1 + adir=$(dirs +$index) + [[ -z $adir ]] && return 1 + the_new_dir=$adir + fi + + # + # '~' has to be substituted by ${HOME} + [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}" + + # + # Now change to the new dir and add to the top of the stack + pushd "${the_new_dir}" > /dev/null + [[ $? -ne 0 ]] && return 1 + the_new_dir=$(pwd) + + # + # Trim down everything beyond 11th entry + popd -n +11 2>/dev/null 1>/dev/null + + # + # Remove any other occurence of this dir, skipping the top of the stack + for ((cnt=1; cnt <= 10; cnt++)); do + x2=$(dirs +${cnt} 2>/dev/null) + [[ $? -ne 0 ]] && return 0 + [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}" + if [[ "${x2}" == "${the_new_dir}" ]]; then + popd -n +$cnt 2>/dev/null 1>/dev/null + cnt=cnt-1 + fi + done + + return 0 +} diff --git a/.config/bash/options b/.config/bash/options index 3081bae..b49294b 100644 --- a/.config/bash/options +++ b/.config/bash/options @@ -1,20 +1,20 @@ -# Case-insensitive globbing (used in pathname expansion) -shopt -s nocaseglob; - -# Append to the Bash history file, rather than overwriting it -#shopt -s histappend; - -# Autocorrect typos in path names when using `cd` -shopt -s cdspell; - -# Enable some Bash 4 features when possible: -# * `autocd`, e.g. `**/qux` will enter `./foo/bar/baz/qux` -# * Recursive globbing, e.g. `echo **/*.txt` -for option in autocd globstar; do - shopt -s "$option" 2> /dev/null; -done; - -# Don't use ^D to exit -set -o ignoreeof -set -o vi - +# Case-insensitive globbing (used in pathname expansion) +shopt -s nocaseglob; + +# Append to the Bash history file, rather than overwriting it +#shopt -s histappend; + +# Autocorrect typos in path names when using `cd` +shopt -s cdspell; + +# Enable some Bash 4 features when possible: +# * `autocd`, e.g. `**/qux` will enter `./foo/bar/baz/qux` +# * Recursive globbing, e.g. `echo **/*.txt` +for option in autocd globstar; do + shopt -s "$option" 2> /dev/null; +done; + +# Don't use ^D to exit +set -o ignoreeof +set -o vi + diff --git a/.config/bash/prompt.bash b/.config/bash/prompt.bash index ffdbf57..fba6244 100644 --- a/.config/bash/prompt.bash +++ b/.config/bash/prompt.bash @@ -1,203 +1,203 @@ -#!/bin/bash - -# bash_prompt - -# iTerm2 prefs: import Solarized theme (disable bright colors for bold text) -# Color ref: http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim -# More tips: http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html - -if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then - export TERM='gnome-256color'; -elif infocmp xterm-256color >/dev/null 2>&1; then - export TERM='xterm-256color'; -fi; - -if [ -f "${HOME}/.cache/bash/git-prompt.sh" ]; then - . "${HOME}/.cache/bash/git-prompt.sh" - - # Enabling any of these options will slow down the prompt - export GIT_PS1_SHOWDIRTYSTATE='y' - export GIT_PS1_SHOWSTASHSTATE='y' - export GIT_PS1_SHOWUNTRACKEDFILES='y' - export GIT_PS1_DESCRIBE_STYLE='contains' - export GIT_PS1_SHOWUPSTREAM='auto' -fi - -# Solarized colors -# (https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized#the-values) -set_prompts() -{ -# GREEN="\[$(tput setaf 2)\]" -# RESET="\[$(tput sgr0)\]" -# -## Reset -#Color_Off="\[\033[0m\]" # Text Reset -# -## Regular Colors -#Black="\[\033[0;30m\]" # Black -#Red="\[\033[0;31m\]" # Red -#Green="\[\033[0;32m\]" # Green -#Yellow="\[\033[0;33m\]" # Yellow -#Blue="\[\033[0;34m\]" # Blue -#Purple="\[\033[0;35m\]" # Purple -#Cyan="\[\033[0;36m\]" # Cyan -#White="\[\033[0;37m\]" # White -# -## Bold -#BBlack="\[\033[1;30m\]" # Black -#BRed="\[\033[1;31m\]" # Red -#BGreen="\[\033[1;32m\]" # Green -#BYellow="\[\033[1;33m\]" # Yellow -#BBlue="\[\033[1;34m\]" # Blue -#BPurple="\[\033[1;35m\]" # Purple -#BCyan="\[\033[1;36m\]" # Cyan -#BWhite="\[\033[1;37m\]" # White -# -## Underline -#UBlack="\[\033[4;30m\]" # Black -#URed="\[\033[4;31m\]" # Red -#UGreen="\[\033[4;32m\]" # Green -#UYellow="\[\033[4;33m\]" # Yellow -#UBlue="\[\033[4;34m\]" # Blue -#UPurple="\[\033[4;35m\]" # Purple -#UCyan="\[\033[4;36m\]" # Cyan -#UWhite="\[\033[4;37m\]" # White -# -## Background -#On_Black="\[\033[40m\]" # Black -#On_Red="\[\033[41m\]" # Red -#On_Green="\[\033[42m\]" # Green -#On_Yellow="\[\033[43m\]" # Yellow -#On_Blue="\[\033[44m\]" # Blue -#On_Purple="\[\033[45m\]" # Purple -#On_Cyan="\[\033[46m\]" # Cyan -#On_White="\[\033[47m\]" # White -# -## High Intensty -#IBlack="\[\033[0;90m\]" # Black -#IRed="\[\033[0;91m\]" # Red -#IGreen="\[\033[0;92m\]" # Green -#IYellow="\[\033[0;93m\]" # Yellow -#IBlue="\[\033[0;94m\]" # Blue -#IPurple="\[\033[0;95m\]" # Purple -#ICyan="\[\033[0;96m\]" # Cyan -#IWhite="\[\033[0;97m\]" # White -# -## Bold High Intensty -#BIBlack="\[\033[1;90m\]" # Black -#BIRed="\[\033[1;91m\]" # Red -#BIGreen="\[\033[1;92m\]" # Green -#BIYellow="\[\033[1;93m\]" # Yellow -#BIBlue="\[\033[1;94m\]" # Blue -#BIPurple="\[\033[1;95m\]" # Purple -#BICyan="\[\033[1;96m\]" # Cyan -#BIWhite="\[\033[1;97m\]" # White -# -## High Intensty backgrounds -#On_IBlack="\[\033[0;100m\]" # Black -#On_IRed="\[\033[0;101m\]" # Red -#On_IGreen="\[\033[0;102m\]" # Green -#On_IYellow="\[\033[0;103m\]" # Yellow -#On_IBlue="\[\033[0;104m\]" # Blue -#On_IPurple="\[\033[10;95m\]" # Purple -#On_ICyan="\[\033[0;106m\]" # Cyan -#On_IWhite="\[\033[0;107m\]" # White -# -## Various variables you might want for your PS1 prompt instead -#Time12h="\T" -#Time12a="\@" -#PathShort="\w" -#PathFull="\W" -#NewLine="\n" -#Jobs="\j" -#export PS1="${GREEN}my prompt${RESET}> " - - if [ -x /usr/bin/tput ] && tput setaf 1 >& /dev/null; then - bold=$(tput bold) - reset=$(tput sgr0) - - black=$(tput setaf 0) - blue=$(tput setaf 33) - cyan=$(tput setaf 37) - green=$(tput setaf 64) - orange=$(tput setaf 166) - purple=$(tput setaf 125) - red=$(tput setaf 124) - violet=$(tput setaf 61) - white=$(tput setaf 15) - yellow=$(tput setaf 136) - else - bold="" - reset="\e[0m" - - black="\e[1;30m" - blue="\e[1;34m" - cyan="\e[1;36m" - green="\e[1;32m" - orange="\e[1;33m" - purple="\e[1;35m" - red="\e[1;31m" - violet="\e[1;35m" - white="\e[1;37m" - yellow="\e[1;33m" - fi - - # build the prompt - fg="$white" - - # logged in as root - if [[ "$USER" == "root" ]]; then - userStyle="$bold$red" - else - userStyle="$orange" - fi - - # connected via ssh - if [[ "$SSH_TTY" ]]; then - hostStyle="$bold$red" - else - hostStyle="$yellow" - fi - - # Set the terminal title to the current working directory. - PS1="\[\033]0;\w\007\]" - - if [[ "$TERM" == *color ]]; then -# PS1+=$'\r' # carriage return - PS1+="\[$userStyle\]\u" # username - PS1+="\[$reset$fg\] at " - PS1+="\[$hostStyle\]\h" # host - PS1+="\[$reset$fg\] in " - PS1+="\[$green\]\w" # working directory - # PS1+="\$(prompt_git \"$white on $cyan\")" # git repository details - PS1+="\$(__git_ps1 '\[${fg}\] on \[${cyan}\]%s')"; # on branch - PS1+=$'\n' # newline - PS1+="\[$reset$fg\]\$ \[$reset\]" # $ (and reset color) - - PS2="\[${yellow}\]-> " - PS2+="\[${reset}\]" # reset color - else # no colors - PS1+=$'\r' # carriage return - PS1+="\u at \h in \w on \$(__git_ps1 %s)" - PS1+=$'\n''\$ ' # newline and $ - - PS2="-> " - fi - - export PS1 PS2 -} - - -set_prompts -unset set_prompts - -# When the shell exits, append to the history file instead of overwriting it -shopt -s histappend -# Larger bash history -export HISTFILESIZE=10000; -export HISTSIZE=5000; -export HISTCONTROL=ignoreboth:erasedups -export HISTIGNORE="ll:ls:cd:cd -:pwd:exit:date:* --help"; -# Whenever displaying the prompt, write the previous line to disk -export PROMPT_COMMAND="history -a" - +#!/bin/bash + +# bash_prompt + +# iTerm2 prefs: import Solarized theme (disable bright colors for bold text) +# Color ref: http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim +# More tips: http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html + +if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then + export TERM='gnome-256color'; +elif infocmp xterm-256color >/dev/null 2>&1; then + export TERM='xterm-256color'; +fi; + +if [ -f "${HOME}/.cache/bash/git-prompt.sh" ]; then + . "${HOME}/.cache/bash/git-prompt.sh" + + # Enabling any of these options will slow down the prompt + export GIT_PS1_SHOWDIRTYSTATE='y' + export GIT_PS1_SHOWSTASHSTATE='y' + export GIT_PS1_SHOWUNTRACKEDFILES='y' + export GIT_PS1_DESCRIBE_STYLE='contains' + export GIT_PS1_SHOWUPSTREAM='auto' +fi + +# Solarized colors +# (https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized#the-values) +set_prompts() +{ +# GREEN="\[$(tput setaf 2)\]" +# RESET="\[$(tput sgr0)\]" +# +## Reset +#Color_Off="\[\033[0m\]" # Text Reset +# +## Regular Colors +#Black="\[\033[0;30m\]" # Black +#Red="\[\033[0;31m\]" # Red +#Green="\[\033[0;32m\]" # Green +#Yellow="\[\033[0;33m\]" # Yellow +#Blue="\[\033[0;34m\]" # Blue +#Purple="\[\033[0;35m\]" # Purple +#Cyan="\[\033[0;36m\]" # Cyan +#White="\[\033[0;37m\]" # White +# +## Bold +#BBlack="\[\033[1;30m\]" # Black +#BRed="\[\033[1;31m\]" # Red +#BGreen="\[\033[1;32m\]" # Green +#BYellow="\[\033[1;33m\]" # Yellow +#BBlue="\[\033[1;34m\]" # Blue +#BPurple="\[\033[1;35m\]" # Purple +#BCyan="\[\033[1;36m\]" # Cyan +#BWhite="\[\033[1;37m\]" # White +# +## Underline +#UBlack="\[\033[4;30m\]" # Black +#URed="\[\033[4;31m\]" # Red +#UGreen="\[\033[4;32m\]" # Green +#UYellow="\[\033[4;33m\]" # Yellow +#UBlue="\[\033[4;34m\]" # Blue +#UPurple="\[\033[4;35m\]" # Purple +#UCyan="\[\033[4;36m\]" # Cyan +#UWhite="\[\033[4;37m\]" # White +# +## Background +#On_Black="\[\033[40m\]" # Black +#On_Red="\[\033[41m\]" # Red +#On_Green="\[\033[42m\]" # Green +#On_Yellow="\[\033[43m\]" # Yellow +#On_Blue="\[\033[44m\]" # Blue +#On_Purple="\[\033[45m\]" # Purple +#On_Cyan="\[\033[46m\]" # Cyan +#On_White="\[\033[47m\]" # White +# +## High Intensty +#IBlack="\[\033[0;90m\]" # Black +#IRed="\[\033[0;91m\]" # Red +#IGreen="\[\033[0;92m\]" # Green +#IYellow="\[\033[0;93m\]" # Yellow +#IBlue="\[\033[0;94m\]" # Blue +#IPurple="\[\033[0;95m\]" # Purple +#ICyan="\[\033[0;96m\]" # Cyan +#IWhite="\[\033[0;97m\]" # White +# +## Bold High Intensty +#BIBlack="\[\033[1;90m\]" # Black +#BIRed="\[\033[1;91m\]" # Red +#BIGreen="\[\033[1;92m\]" # Green +#BIYellow="\[\033[1;93m\]" # Yellow +#BIBlue="\[\033[1;94m\]" # Blue +#BIPurple="\[\033[1;95m\]" # Purple +#BICyan="\[\033[1;96m\]" # Cyan +#BIWhite="\[\033[1;97m\]" # White +# +## High Intensty backgrounds +#On_IBlack="\[\033[0;100m\]" # Black +#On_IRed="\[\033[0;101m\]" # Red +#On_IGreen="\[\033[0;102m\]" # Green +#On_IYellow="\[\033[0;103m\]" # Yellow +#On_IBlue="\[\033[0;104m\]" # Blue +#On_IPurple="\[\033[10;95m\]" # Purple +#On_ICyan="\[\033[0;106m\]" # Cyan +#On_IWhite="\[\033[0;107m\]" # White +# +## Various variables you might want for your PS1 prompt instead +#Time12h="\T" +#Time12a="\@" +#PathShort="\w" +#PathFull="\W" +#NewLine="\n" +#Jobs="\j" +#export PS1="${GREEN}my prompt${RESET}> " + + if [ -x /usr/bin/tput ] && tput setaf 1 >& /dev/null; then + bold=$(tput bold) + reset=$(tput sgr0) + + black=$(tput setaf 0) + blue=$(tput setaf 33) + cyan=$(tput setaf 37) + green=$(tput setaf 64) + orange=$(tput setaf 166) + purple=$(tput setaf 125) + red=$(tput setaf 124) + violet=$(tput setaf 61) + white=$(tput setaf 15) + yellow=$(tput setaf 136) + else + bold="" + reset="\e[0m" + + black="\e[1;30m" + blue="\e[1;34m" + cyan="\e[1;36m" + green="\e[1;32m" + orange="\e[1;33m" + purple="\e[1;35m" + red="\e[1;31m" + violet="\e[1;35m" + white="\e[1;37m" + yellow="\e[1;33m" + fi + + # build the prompt + fg="$white" + + # logged in as root + if [[ "$USER" == "root" ]]; then + userStyle="$bold$red" + else + userStyle="$orange" + fi + + # connected via ssh + if [[ "$SSH_TTY" ]]; then + hostStyle="$bold$red" + else + hostStyle="$yellow" + fi + + # Set the terminal title to the current working directory. + PS1="\[\033]0;\w\007\]" + + if [[ "$TERM" == *color ]]; then +# PS1+=$'\r' # carriage return + PS1+="\[$userStyle\]\u" # username + PS1+="\[$reset$fg\] at " + PS1+="\[$hostStyle\]\h" # host + PS1+="\[$reset$fg\] in " + PS1+="\[$green\]\w" # working directory + # PS1+="\$(prompt_git \"$white on $cyan\")" # git repository details + PS1+="\$(__git_ps1 '\[${fg}\] on \[${cyan}\]%s')"; # on branch + PS1+=$'\n' # newline + PS1+="\[$reset$fg\]\$ \[$reset\]" # $ (and reset color) + + PS2="\[${yellow}\]-> " + PS2+="\[${reset}\]" # reset color + else # no colors + PS1+=$'\r' # carriage return + PS1+="\u at \h in \w on \$(__git_ps1 %s)" + PS1+=$'\n''\$ ' # newline and $ + + PS2="-> " + fi + + export PS1 PS2 +} + + +set_prompts +unset set_prompts + +# When the shell exits, append to the history file instead of overwriting it +shopt -s histappend +# Larger bash history +export HISTFILESIZE=10000; +export HISTSIZE=5000; +export HISTCONTROL=ignoreboth:erasedups +export HISTIGNORE="ll:ls:cd:cd -:pwd:exit:date:* --help"; +# Whenever displaying the prompt, write the previous line to disk +export PROMPT_COMMAND="history -a" + diff --git a/.config/bash/solarized b/.config/bash/solarized index 180196d..cdb1920 100644 --- a/.config/bash/solarized +++ b/.config/bash/solarized @@ -1,23 +1,23 @@ -[[ "$OSTYPE" == *darwin* ]] && return; - -echo -ne '\eP\e]10;#839496\a' # Foreground -> base0 -echo -ne '\eP\e]11;#002B36\a' # Background -> base03 - -echo -ne '\eP\e]12;#DC322F\a' # Cursor -> red - -echo -ne '\eP\e]4;0;#073642\a' # black -> Base02 -echo -ne '\eP\e]4;8;#002B36\a' # bold black -> Base03 -echo -ne '\eP\e]4;1;#DC322F\a' # red -> red -echo -ne '\eP\e]4;9;#CB4B16\a' # bold red -> orange -echo -ne '\eP\e]4;2;#859900\a' # green -> green -echo -ne '\eP\e]4;10;#586E75\a' # bold green -> base01 * -echo -ne '\eP\e]4;3;#B58900\a' # yellow -> yellow -echo -ne '\eP\e]4;11;#657B83\a' # bold yellow -> base00 * -echo -ne '\eP\e]4;4;#268BD2\a' # blue -> blue -echo -ne '\eP\e]4;12;#839496\a' # bold blue -> base0 * -echo -ne '\eP\e]4;5;#D33682\a' # magenta -> magenta -echo -ne '\eP\e]4;13;#6C71C4\a' # bold magenta -> violet -echo -ne '\eP\e]4;6;#2AA198\a' # cyan -> cyan -echo -ne '\eP\e]4;14;#93A1A1\a' # bold cyan -> base1 * -echo -ne '\eP\e]4;7;#EEE8D5\a' # white -> Base2 -echo -ne '\eP\e]4;15;#FDF6E3\a' # bold white -> Base3 +[[ "$OSTYPE" == *darwin* ]] && return; + +echo -ne '\eP\e]10;#839496\a' # Foreground -> base0 +echo -ne '\eP\e]11;#002B36\a' # Background -> base03 + +echo -ne '\eP\e]12;#DC322F\a' # Cursor -> red + +echo -ne '\eP\e]4;0;#073642\a' # black -> Base02 +echo -ne '\eP\e]4;8;#002B36\a' # bold black -> Base03 +echo -ne '\eP\e]4;1;#DC322F\a' # red -> red +echo -ne '\eP\e]4;9;#CB4B16\a' # bold red -> orange +echo -ne '\eP\e]4;2;#859900\a' # green -> green +echo -ne '\eP\e]4;10;#586E75\a' # bold green -> base01 * +echo -ne '\eP\e]4;3;#B58900\a' # yellow -> yellow +echo -ne '\eP\e]4;11;#657B83\a' # bold yellow -> base00 * +echo -ne '\eP\e]4;4;#268BD2\a' # blue -> blue +echo -ne '\eP\e]4;12;#839496\a' # bold blue -> base0 * +echo -ne '\eP\e]4;5;#D33682\a' # magenta -> magenta +echo -ne '\eP\e]4;13;#6C71C4\a' # bold magenta -> violet +echo -ne '\eP\e]4;6;#2AA198\a' # cyan -> cyan +echo -ne '\eP\e]4;14;#93A1A1\a' # bold cyan -> base1 * +echo -ne '\eP\e]4;7;#EEE8D5\a' # white -> Base2 +echo -ne '\eP\e]4;15;#FDF6E3\a' # bold white -> Base3 diff --git a/.config/git/config b/.config/git/config index e817487..1c5fc15 100644 --- a/.config/git/config +++ b/.config/git/config @@ -1,4 +1,7 @@ -# ~/.config/git/config +[filter "lfs"] + clean = git-lfs clean %f + smudge = git-lfs smudge %f + required = true [github] user = jannikz [alias] @@ -31,6 +34,7 @@ ec = config --global -e l = log --oneline --decorate lg = log --pretty=format:"%C(yellow)%h\\ %C(green)%ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short --graph + lol = log --oneline --decorate --graph --all --first-parent last = log -1 HEAD ls = ls-files lt = tag -l @@ -40,12 +44,12 @@ remotes = remote -v root = rev-parse --show-toplevel cl = clone --recursive - + # Show the diff between the latest commit and the current state d = !"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat" # `git di $number` shows the diff between the state `$number` revisions ago and the current state di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d" - + # Find branches containing commit fb = "!f() { git branch -a --contains $1; }; f" # Find tags containing commit @@ -54,15 +58,15 @@ fc = "!f() { git log --pretty=format:'%C(yellow)%h %Cblue%ad %Creset%s%Cgreen [%cn] %Cred%d' --decorate --date=short -S$1; }; f" # Find commits by commit message fm = "!f() { git log --pretty=format:'%C(yellow)%h %Cblue%ad %Creset%s%Cgreen [%cn] %Cred%d' --decorate --date=short --grep=$1; }; f" - + #Credit an author on the latest commit credit = "!f() { git commit --amend --author \"$1 <$2>\" -C HEAD; }; f" # List contributors with number of commits contributors = shortlog --summary --numbered - + k = !gitk visual = !gitk - + ctags = "!sh -c '[ -f .git/hooks/ctags ] || git init; .git/hooks/ctags' git-ctags" gtags = "!sh -c '[ -f .git/hooks/gtags ] || git init; .git/hooks/gtags' git-gtags" cscope = "!sh -c '[ -f .git/hooks/cscope ] || git init; .git/hooks/cscope' git-cscope" @@ -91,13 +95,17 @@ [init] templatedir = ~/.config/git/templates [core] - excludesfile = ~/.config/git/ignore + excludesfile = attributesFile = ~/.config/git/attributes editor = vim - eol = native +# eol = native + autocrlf = false +[include] + path = ~/.config/git/config_local [filter "lfs"] clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f + process = git-lfs filter-process required = true -[include] - path = ~/.config/git/config_local +[gui] + recentrepo = C:/Projects/repos/grundfos/jaz/genilog diff --git a/.config/git/ignore b/.config/git/ignore index 5221ad5..0d306af 100644 --- a/.config/git/ignore +++ b/.config/git/ignore @@ -1,64 +1,64 @@ -# Ignore tags created by etags, ctags, gtags (GNU global) and cscope -TAGS -.TAGS -!TAGS/ -tags -.tags -!tags/ -gtags.files -GTAGS -GRTAGS -GPATH -cscope.files -cscope.out -cscope.in.out -cscope.po.out - -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk - - -# OSX -*.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -__pycache__ +# Ignore tags created by etags, ctags, gtags (GNU global) and cscope +TAGS +.TAGS +!TAGS/ +tags +.tags +!tags/ +gtags.files +GTAGS +GRTAGS +GPATH +cscope.files +cscope.out +cscope.in.out +cscope.po.out + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +# OSX +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +__pycache__ diff --git a/.config/git/templates/config b/.config/git/templates/config index f8767a9..2dc4a39 100644 --- a/.config/git/templates/config +++ b/.config/git/templates/config @@ -1,9 +1,9 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true -[branch "master"] - remote = origin - merge = refs/heads/master - rebase = true +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[branch "master"] + remote = origin + merge = refs/heads/master + rebase = true diff --git a/.config/git/templates/hooks/cscope b/.config/git/templates/hooks/cscope index 42f9522..d625a41 100755 --- a/.config/git/templates/hooks/cscope +++ b/.config/git/templates/hooks/cscope @@ -1,10 +1,10 @@ -#!/bin/sh -set -e -PATH="/usr/local/bin:$PATH" -dir="`git rev-parse --git-dir`" -trap 'rm -f "$dir/$$.cscope.out"' EXIT INT TERM -git ls-files |\ - grep -E '\.(c(pp)?|h)$' |\ - awk '{print "\""$0"\""}' |\ - cscope -R -b -i - -f "$dir/$$.cscope.out" -mv "$dir/$$.cscope.out" "$dir/cscope.out" +#!/bin/sh +set -e +PATH="/usr/local/bin:$PATH" +dir="`git rev-parse --git-dir`" +trap 'rm -f "$dir/$$.cscope.out"' EXIT INT TERM +git ls-files |\ + grep -E '\.(c(pp)?|h)$' |\ + awk '{print "\""$0"\""}' |\ + cscope -R -b -i - -f "$dir/$$.cscope.out" +mv "$dir/$$.cscope.out" "$dir/cscope.out" diff --git a/.config/git/templates/hooks/ctags b/.config/git/templates/hooks/ctags index d51e9af..774d101 100755 --- a/.config/git/templates/hooks/ctags +++ b/.config/git/templates/hooks/ctags @@ -1,8 +1,8 @@ -#!/bin/sh -set -e -PATH="/usr/local/bin:$PATH" -dir="`git rev-parse --git-dir`" -trap 'rm -f "$dir/$$.tags"' EXIT INT TERM -git ls-files | \ - ctags --tag-relative -L - -f"$dir/$$.tags" --languages=-javascript,sql -mv "$dir/$$.tags" "$dir/tags" +#!/bin/sh +set -e +PATH="/usr/local/bin:$PATH" +dir="`git rev-parse --git-dir`" +trap 'rm -f "$dir/$$.tags"' EXIT INT TERM +git ls-files | \ + ctags --tag-relative -L - -f"$dir/$$.tags" --languages=-javascript,sql +mv "$dir/$$.tags" "$dir/tags" diff --git a/.config/git/templates/hooks/gtags b/.config/git/templates/hooks/gtags index d30547d..3e8e848 100755 --- a/.config/git/templates/hooks/gtags +++ b/.config/git/templates/hooks/gtags @@ -1,9 +1,9 @@ -#! /bin/sh -set -e -PATH="/usr/local/bin:$PATH" -dir="`git rev-parse --git-dir`" -trap 'rm -rf "$dir/$$.gtags/"' EXIT INT TERM -mkdir "$dir/$$.gtags" -git ls-files | \ - gtags --file=- --skip-unreadable "$dir/$$.gtags" -mv "$dir/$$.gtags"/* "$dir/.." +#! /bin/sh +set -e +PATH="/usr/local/bin:$PATH" +dir="`git rev-parse --git-dir`" +trap 'rm -rf "$dir/$$.gtags/"' EXIT INT TERM +mkdir "$dir/$$.gtags" +git ls-files | \ + gtags --file=- --skip-unreadable "$dir/$$.gtags" +mv "$dir/$$.gtags"/* "$dir/.." diff --git a/.config/git/templates/hooks/post-applypatch b/.config/git/templates/hooks/post-applypatch index dbe2120..be09ac7 100755 --- a/.config/git/templates/hooks/post-applypatch +++ b/.config/git/templates/hooks/post-applypatch @@ -1,7 +1,7 @@ -#!/bin/sh -.git/hooks/ctags >/dev/null 2>&1 & -.git/hooks/gtags >/dev/null 2>&1 & -.git/hooks/cscope >/dev/null 2>&1 & - - - +#!/bin/sh +.git/hooks/ctags >/dev/null 2>&1 & +.git/hooks/gtags >/dev/null 2>&1 & +.git/hooks/cscope >/dev/null 2>&1 & + + + diff --git a/.config/git/templates/hooks/post-checkout b/.config/git/templates/hooks/post-checkout index f6c2774..ca24a88 100755 --- a/.config/git/templates/hooks/post-checkout +++ b/.config/git/templates/hooks/post-checkout @@ -1,4 +1,4 @@ -#!/bin/sh -.git/hooks/ctags >/dev/null 2>&1 & -.git/hooks/gtags >/dev/null 2>&1 & -.git/hooks/cscope >/dev/null 2>&1 & +#!/bin/sh +.git/hooks/ctags >/dev/null 2>&1 & +.git/hooks/gtags >/dev/null 2>&1 & +.git/hooks/cscope >/dev/null 2>&1 & diff --git a/.config/git/templates/hooks/post-commit b/.config/git/templates/hooks/post-commit index f6c2774..ca24a88 100755 --- a/.config/git/templates/hooks/post-commit +++ b/.config/git/templates/hooks/post-commit @@ -1,4 +1,4 @@ -#!/bin/sh -.git/hooks/ctags >/dev/null 2>&1 & -.git/hooks/gtags >/dev/null 2>&1 & -.git/hooks/cscope >/dev/null 2>&1 & +#!/bin/sh +.git/hooks/ctags >/dev/null 2>&1 & +.git/hooks/gtags >/dev/null 2>&1 & +.git/hooks/cscope >/dev/null 2>&1 & diff --git a/.config/git/templates/hooks/post-merge b/.config/git/templates/hooks/post-merge index f6c2774..ca24a88 100644 --- a/.config/git/templates/hooks/post-merge +++ b/.config/git/templates/hooks/post-merge @@ -1,4 +1,4 @@ -#!/bin/sh -.git/hooks/ctags >/dev/null 2>&1 & -.git/hooks/gtags >/dev/null 2>&1 & -.git/hooks/cscope >/dev/null 2>&1 & +#!/bin/sh +.git/hooks/ctags >/dev/null 2>&1 & +.git/hooks/gtags >/dev/null 2>&1 & +.git/hooks/cscope >/dev/null 2>&1 & diff --git a/.config/git/templates/hooks/post-rewrite b/.config/git/templates/hooks/post-rewrite index fe8972d..aed59b9 100755 --- a/.config/git/templates/hooks/post-rewrite +++ b/.config/git/templates/hooks/post-rewrite @@ -1,4 +1,4 @@ -#!/bin/sh -case "$1" in - rebase) exec .git/hooks/post-merge ;; -esac +#!/bin/sh +case "$1" in + rebase) exec .git/hooks/post-merge ;; +esac diff --git a/.config/profile/environ.sh b/.config/profile/environ.sh index 6ffcf4a..1561265 100644 --- a/.config/profile/environ.sh +++ b/.config/profile/environ.sh @@ -34,8 +34,10 @@ export LESS=-eFRX #export GTEST_DIR='c:/googletest-release-1.7.0' #export GTEST_DIR='c:/googletest-release-1.8.0' -export CPPUNITDIR='c:/cppunit-1.12.1' +#export CPPUNITDIR='c:/cppunit-1.12.1' #export CPPUNITDIR='c:/cppunit-1.13.2' +export CPPUNITDIR_2013='c:/programs/cppunit_2013' + export VIRTUALENVWRAPPER_PYTHON=/mingw64/bin/python3 #export XDG_CONFIG_HOME = ~/.config/ diff --git a/.config/profile/install.sh b/.config/profile/install.sh index 5bdc46b..9e55a9c 100644 --- a/.config/profile/install.sh +++ b/.config/profile/install.sh @@ -1,13 +1,13 @@ -# Install git completion -if [ ! -f "${HOME}/.cache/bash/git-completion.bash" ]; then - URL="https://raw.githubusercontent.com/git/git/master/contrib/completion" - mkdir -p ${HOME}/.cache/bash > /dev/null 2>&1 - curl "${URL}/git-completion.bash" -L -s -o "${HOME}/.cache/bash/git-completion.bash" - curl "${URL}/git-prompt.sh" -L -s -o "${HOME}/.cache/bash/git-prompt.sh" -fi - -# Install fzf -if [ ! -f "${HOME}/.cache/fzf/install" ]; then - git clone --depth 1 https://github.com/junegunn/fzf.git $HOME/.cache/fzf - $HOME/.cache/fzf/install -fi +# Install git completion +if [ ! -f "${HOME}/.cache/bash/git-completion.bash" ]; then + URL="https://raw.githubusercontent.com/git/git/master/contrib/completion" + mkdir -p ${HOME}/.cache/bash > /dev/null 2>&1 + curl "${URL}/git-completion.bash" -L -s -o "${HOME}/.cache/bash/git-completion.bash" + curl "${URL}/git-prompt.sh" -L -s -o "${HOME}/.cache/bash/git-prompt.sh" +fi + +# Install fzf +if [ ! -f "${HOME}/.cache/fzf/install" ]; then + git clone --depth 1 https://github.com/junegunn/fzf.git $HOME/.cache/fzf + $HOME/.cache/fzf/install +fi diff --git a/.config/profile/paths.sh b/.config/profile/paths.sh index 2863285..b2f1c9d 100644 --- a/.config/profile/paths.sh +++ b/.config/profile/paths.sh @@ -1,40 +1,42 @@ -# Set XDG directory defaults -#export XDG_DATA_DIRS=/usr/share/ -#export XDG_CONFIG_DIRS=/etc/xdg/ - -PATH=.:${HOME}/bin:${PATH} - -# Set PATH so it includes user's private bin if it exists -if [ -d "${HOME}/.local/bin" ] ; then - PATH=${HOME}/.local/bin:${PATH} -fi - -# Set MANPATH so it includes users' private man if it exists -if [ -d "${HOME}/.local/share/man" ]; then - MANPATH="${HOME}/.local/share/man:${MANPATH}" -fi - -# Set INFOPATH so it includes users' private info if it exists -if [ -d "${HOME}/.local/share/info" ]; then - INFOPATH="${HOME}/.local/share/info:${INFOPATH}" -fi - -# Set PATH to temporary folders -export TMPDIR="${HOME}/.tmp" -export TEMPDIR="$TMPDIR" -export TEMP="$TMPDIR" -export TMP="$TMPDIR" -mkdir -m700 "$TMPDIR" > /dev/null 2>&1 - -# Set PATH to PREFIX folders -export PREFIX="${HOME}/.local/" - -# Add local libraries to libpath -# LD_LIBRARY_PATH="${PREFIX}/lib:${LD_LIBRARY_PATH}" - -# Setup some the location environment variable. -#export MYVIMRC="$HOME/.config/vim/vimrc" -export INPUTRC="$HOME/.inputrc" -export HISTFILE="$HOME/.local/share/bash/history"; - - +# Set XDG directory defaults +#export XDG_DATA_DIRS=/usr/share/ +#export XDG_CONFIG_DIRS=/etc/xdg/ + +PATH=.:${HOME}/bin:${PATH} +#PATH=/c/ProgramData/chocolatey/bin:${PATH} +PATH=${HOME}/.gem/ruby/2.3.0/gems/asciidoctor-1.5.6.1/bin:${PATH} + +# Set PATH so it includes user's private bin if it exists +if [ -d "${HOME}/.local/bin" ] ; then + PATH=${HOME}/.local/bin:${PATH} +fi + +# Set MANPATH so it includes users' private man if it exists +if [ -d "${HOME}/.local/share/man" ]; then + MANPATH="${HOME}/.local/share/man:${MANPATH}" +fi + +# Set INFOPATH so it includes users' private info if it exists +if [ -d "${HOME}/.local/share/info" ]; then + INFOPATH="${HOME}/.local/share/info:${INFOPATH}" +fi + +# Set PATH to temporary folders +export TMPDIR="${HOME}/.tmp" +export TEMPDIR="$TMPDIR" +export TEMP="$TMPDIR" +export TMP="$TMPDIR" +mkdir -m700 "$TMPDIR" > /dev/null 2>&1 + +# Set PATH to PREFIX folders +export PREFIX="${HOME}/.local/" + +# Add local libraries to libpath +# LD_LIBRARY_PATH="${PREFIX}/lib:${LD_LIBRARY_PATH}" + +# Setup some the location environment variable. +#export MYVIMRC="$HOME/.config/vim/vimrc" +export INPUTRC="$HOME/.inputrc" +export HISTFILE="$HOME/.local/share/bash/history"; + + diff --git a/.config/user-dirs.dirs b/.config/user-dirs.dirs index 0d19da4..09593a6 100644 --- a/.config/user-dirs.dirs +++ b/.config/user-dirs.dirs @@ -1,15 +1,15 @@ -# This file is written by xdg-user-dirs-update -# If you want to change or add directories, just edit the line you're -# interested in. All local changes will be retained on the next run -# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped -# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an -# absolute path. No other format is supported. -# -XDG_DESKTOP_DIR="$HOME/Desktop" -XDG_DOWNLOAD_DIR="$HOME/Downloads" -XDG_TEMPLATES_DIR="$HOME/Templates" -XDG_PUBLICSHARE_DIR="$HOME/Public" -XDG_DOCUMENTS_DIR="$HOME/Documents" -XDG_MUSIC_DIR="$HOME/Music" -XDG_PICTURES_DIR="$HOME/Pictures" -XDG_VIDEOS_DIR="$HOME/Videos" +# This file is written by xdg-user-dirs-update +# If you want to change or add directories, just edit the line you're +# interested in. All local changes will be retained on the next run +# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped +# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an +# absolute path. No other format is supported. +# +XDG_DESKTOP_DIR="$HOME/Desktop" +XDG_DOWNLOAD_DIR="$HOME/Downloads" +XDG_TEMPLATES_DIR="$HOME/Templates" +XDG_PUBLICSHARE_DIR="$HOME/Public" +XDG_DOCUMENTS_DIR="$HOME/Documents" +XDG_MUSIC_DIR="$HOME/Music" +XDG_PICTURES_DIR="$HOME/Pictures" +XDG_VIDEOS_DIR="$HOME/Videos" diff --git a/.cshrc b/.cshrc index 9a21b6d..d62cb82 100644 --- a/.cshrc +++ b/.cshrc @@ -1,12 +1,12 @@ -# .cshrc: executed by C shells on startup - -# If this is login or command shell then change to a sane shell -if ($SHELL != /bin/bash) then - setenv SHELL /bin/bash - if ($?command) then - exec /bin/bash -c "$command" - else - exec /bin/bash - endif -endif - +# .cshrc: executed by C shells on startup + +# If this is login or command shell then change to a sane shell +if ($SHELL != /bin/bash) then + setenv SHELL /bin/bash + if ($?command) then + exec /bin/bash -c "$command" + else + exec /bin/bash + endif +endif + diff --git a/.dir_colors b/.dir_colors index f32324a..ed06760 100644 --- a/.dir_colors +++ b/.dir_colors @@ -1,425 +1,425 @@ -# Exact Solarized Dark color theme for the color GNU ls utility. -# Designed for dircolors (GNU coreutils) 5.97 -# -# This simple theme was simultaneously designed for these terminal color schemes: -# - Solarized dark (best) -# - Solarized light -# - default dark -# - default light -# with a slight optimization for Solarized Dark. -# -# How the colors were selected: -# - Terminal emulators often have an option typically enabled by default that makes -# bold a different color. It is important to leave this option enabled so that -# you can access the entire 16-color Solarized palette, and not just 8 colors. -# - We favor universality over a greater number of colors. So we limit the number -# of colors so that this theme will work out of the box in all terminals, -# Solarized or not, dark or light. -# - We choose to have the following category of files: -# NORMAL & FILE, DIR, LINK, EXEC and -# editable text including source, unimportant text, binary docs & multimedia source -# files, viewable multimedia, archived/compressed, and unimportant non-text -# - For uniqueness, we stay away from the Solarized foreground colors are -- either -# base00 (brightyellow) or base0 (brighblue). However, they can be used if -# you know what the bg/fg colors of your terminal are, in order to optimize the display. -# - 3 different options are provided: universal, solarized dark, and solarized light. -# The only difference between the universal scheme and one that's optimized for -# dark/light is the color of "unimportant" files, which should blend more with the -# background -# - We note that blue is the hardest color to see on dark bg and yellow is the hardest -# color to see on light bg (with blue being particularly bad). So we choose yellow -# for multimedia files which are usually accessed in a GUI folder browser anyway. -# And blue is kept for custom use of this scheme's user. -# - See table below to see the assignments. - - -# Insatllation instructions: -# This file goes in the /etc directory, and must be world readable. -# You can copy this file to .dir_colors in your $HOME directory to override -# the system defaults. - -# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not -# pipes. 'all' adds color characters to all output. 'none' shuts colorization -# off. -COLOR tty - -# Below, there should be one TERM entry for each termtype that is colorizable -TERM ansi -TERM color_xterm -TERM color-xterm -TERM con132x25 -TERM con132x30 -TERM con132x43 -TERM con132x60 -TERM con80x25 -TERM con80x28 -TERM con80x30 -TERM con80x43 -TERM con80x50 -TERM con80x60 -TERM cons25 -TERM console -TERM cygwin -TERM dtterm -TERM Eterm -TERM eterm-color -TERM gnome -TERM gnome-256color -TERM jfbterm -TERM konsole -TERM kterm -TERM linux -TERM linux-c -TERM mach-color -TERM mlterm -TERM nxterm -TERM putty -TERM rxvt -TERM rxvt-256color -TERM rxvt-cygwin -TERM rxvt-cygwin-native -TERM rxvt-unicode -TERM rxvt-unicode256 -TERM rxvt-unicode-256color -TERM screen -TERM screen-256color -TERM screen-256color-bce -TERM screen-bce -TERM screen.linux -TERM screen-w -TERM vt100 -TERM xterm -TERM xterm-16color -TERM xterm-256color -TERM xterm-88color -TERM xterm-color -TERM xterm-debian - -# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output) -EIGHTBIT 1 - -############################################################################# -# Below are the color init strings for the basic file types. A color init -# string consists of one or more of the following numeric codes: -# -# Attribute codes: -# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed -# Text color codes: -# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white -# Background color codes: -# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white -# -# NOTES: -# - See http://www.oreilly.com/catalog/wdnut/excerpt/color_names.html -# - Color combinations -# ANSI Color code Solarized Notes Universal SolDark SolLight -# ~~~~~~~~~~~~~~~ ~~~~~~~~~ ~~~~~ ~~~~~~~~~ ~~~~~~~ ~~~~~~~~ -# 00 none NORMAL, FILE -# 30 black base02 -# 01;30 bright black base03 bg of SolDark -# 31 red red docs & mm src -# 01;31 bright red orange EXEC -# 32 green green editable text -# 01;32 bright green base01 unimportant text -# 33 yellow yellow unclear in light bg multimedia -# 01;33 bright yellow base00 fg of SolLight unimportant non-text -# 34 blue blue unclear in dark bg user customized -# 01;34 bright blue base0 fg in SolDark unimportant text -# 35 magenta magenta LINK -# 01;35 bright magenta violet archive/compressed -# 36 cyan cyan DIR -# 01;36 bright cyan base1 unimportant non-text -# 37 white base2 -# 01;37 bright white base3 bg in SolLight -# 05;37;41 unclear in Putty dark - - -### By file type - -# global default -NORMAL 00 -# normal file -FILE 00 -# directory -DIR 36 -# symbolic link -LINK 35 - -# pipe, socket, block device, character device (blue bg) -FIFO 30;44 -SOCK 35;44 -DOOR 35;44 # Solaris 2.5 and later -BLK 33;44 -CHR 37;44 - - -############################################################################# -### By file attributes - -# Orphaned symlinks (blinking white on red) -# Blink may or may not work (works on iTerm dark or light, and Putty dark) -ORPHAN 05;37;41 -# ... and the files that orphaned symlinks point to (blinking white on red) -MISSING 05;37;41 - -# files with execute permission -EXEC 01;31 # Unix -.cmd 01;31 # Win -.exe 01;31 # Win -.com 01;31 # Win -.bat 01;31 # Win -.reg 01;31 # Win -.app 01;31 # OSX - -############################################################################# -### By extension - -# List any file extensions like '.gz' or '.tar' that you would like ls -# to colorize below. Put the extension, a space, and the color init string. -# (and any comments you want to add after a '#') - -### Text formats - -# Text that we can edit with a regular editor -.txt 32 -.org 32 -.md 32 -.mkd 32 - -# Source text -.h 32 -.c 32 -.C 32 -.cc 32 -.cxx 32 -.objc 32 -.sh 32 -.csh 32 -.zsh 32 -.el 32 -.vim 32 -.java 32 -.pl 32 -.pm 32 -.py 32 -.rb 32 -.hs 32 -.php 32 -.htm 32 -.html 32 -.shtml 32 -.xml 32 -.rdf 32 -.css 32 -.js 32 -.man 32 -.0 32 -.1 32 -.2 32 -.3 32 -.4 32 -.5 32 -.6 32 -.7 32 -.8 32 -.9 32 -.l 32 -.n 32 -.p 32 -.pod 32 -.tex 32 - -### Multimedia formats - -# Image -.bmp 33 -.cgm 33 -.dl 33 -.dvi 33 -.emf 33 -.eps 33 -.gif 33 -.jpeg 33 -.jpg 33 -.JPG 33 -.mng 33 -.pbm 33 -.pcx 33 -.pdf 33 -.pgm 33 -.png 33 -.ppm 33 -.pps 33 -.ppsx 33 -.ps 33 -.svg 33 -.svgz 33 -.tga 33 -.tif 33 -.tiff 33 -.xbm 33 -.xcf 33 -.xpm 33 -.xwd 33 -.xwd 33 -.yuv 33 - -# Audio -.aac 33 -.au 33 -.flac 33 -.mid 33 -.midi 33 -.mka 33 -.mp3 33 -.mpa 33 -.mpeg 33 -.mpg 33 -.ogg 33 -.ra 33 -.wav 33 - -# Video -.anx 33 -.asf 33 -.avi 33 -.axv 33 -.flc 33 -.fli 33 -.flv 33 -.gl 33 -.m2v 33 -.m4v 33 -.mkv 33 -.mov 33 -.mp4 33 -.mp4v 33 -.mpeg 33 -.mpg 33 -.nuv 33 -.ogm 33 -.ogv 33 -.ogx 33 -.qt 33 -.rm 33 -.rmvb 33 -.swf 33 -.vob 33 -.wmv 33 - -### Misc - -# Binary document formats and multimedia source -.doc 31 -.docx 31 -.rtf 31 -.dot 31 -.dotx 31 -.xls 31 -.xlsx 31 -.ppt 31 -.pptx 31 -.fla 31 -.psd 31 - -# Archives, compressed -.7z 1;35 -.apk 1;35 -.arj 1;35 -.bin 1;35 -.bz 1;35 -.bz2 1;35 -.cab 1;35 # Win -.deb 1;35 -.dmg 1;35 # OSX -.gem 1;35 -.gz 1;35 -.iso 1;35 -.jar 1;35 -.msi 1;35 # Win -.rar 1;35 -.rpm 1;35 -.tar 1;35 -.tbz 1;35 -.tbz2 1;35 -.tgz 1;35 -.tx 1;35 -.war 1;35 -.xpi 1;35 -.xz 1;35 -.z 1;35 -.Z 1;35 -.zip 1;35 - -# For testing -.ANSI-30-black 30 -.ANSI-01;30-brblack 01;30 -.ANSI-31-red 31 -.ANSI-01;31-brred 01;31 -.ANSI-32-green 32 -.ANSI-01;32-brgreen 01;32 -.ANSI-33-yellow 33 -.ANSI-01;33-bryellow 01;33 -.ANSI-34-blue 34 -.ANSI-01;34-brblue 01;34 -.ANSI-35-magenta 35 -.ANSI-01;35-brmagenta 01;35 -.ANSI-36-cyan 36 -.ANSI-01;36-brcyan 01;36 -.ANSI-37-white 37 -.ANSI-01;37-brwhite 01;37 - -############################################################################# -# Your customizations - -# Unimportant text files -# For universal scheme, use brightgreen 01;32 -# For optimal on light bg (but too prominent on dark bg), use white 01;34 -.log 01;32 -*~ 01;32 -*# 01;32 -#.log 01;34 -#*~ 01;34 -#*# 01;34 - -# Unimportant non-text files -# For universal scheme, use brightcyan 01;36 -# For optimal on dark bg (but too prominent on light bg), change to 01;33 -#.bak 01;36 -#.BAK 01;36 -#.old 01;36 -#.OLD 01;36 -#.org_archive 01;36 -#.off 01;36 -#.OFF 01;36 -#.dist 01;36 -#.DIST 01;36 -#.orig 01;36 -#.ORIG 01;36 -#.swp 01;36 -#.swo 01;36 -#*,v 01;36 -.bak 01;33 -.BAK 01;33 -.old 01;33 -.OLD 01;33 -.org_archive 01;33 -.off 01;33 -.OFF 01;33 -.dist 01;33 -.DIST 01;33 -.orig 01;33 -.ORIG 01;33 -.swp 01;33 -.swo 01;33 -*,v 01;33 - -# The brightmagenta (Solarized: purple) color is free for you to use for your -# custom file type -.gpg 34 -.gpg 34 -.pgp 34 -.asc 34 -.3des 34 -.aes 34 -.enc 34 +# Exact Solarized Dark color theme for the color GNU ls utility. +# Designed for dircolors (GNU coreutils) 5.97 +# +# This simple theme was simultaneously designed for these terminal color schemes: +# - Solarized dark (best) +# - Solarized light +# - default dark +# - default light +# with a slight optimization for Solarized Dark. +# +# How the colors were selected: +# - Terminal emulators often have an option typically enabled by default that makes +# bold a different color. It is important to leave this option enabled so that +# you can access the entire 16-color Solarized palette, and not just 8 colors. +# - We favor universality over a greater number of colors. So we limit the number +# of colors so that this theme will work out of the box in all terminals, +# Solarized or not, dark or light. +# - We choose to have the following category of files: +# NORMAL & FILE, DIR, LINK, EXEC and +# editable text including source, unimportant text, binary docs & multimedia source +# files, viewable multimedia, archived/compressed, and unimportant non-text +# - For uniqueness, we stay away from the Solarized foreground colors are -- either +# base00 (brightyellow) or base0 (brighblue). However, they can be used if +# you know what the bg/fg colors of your terminal are, in order to optimize the display. +# - 3 different options are provided: universal, solarized dark, and solarized light. +# The only difference between the universal scheme and one that's optimized for +# dark/light is the color of "unimportant" files, which should blend more with the +# background +# - We note that blue is the hardest color to see on dark bg and yellow is the hardest +# color to see on light bg (with blue being particularly bad). So we choose yellow +# for multimedia files which are usually accessed in a GUI folder browser anyway. +# And blue is kept for custom use of this scheme's user. +# - See table below to see the assignments. + + +# Insatllation instructions: +# This file goes in the /etc directory, and must be world readable. +# You can copy this file to .dir_colors in your $HOME directory to override +# the system defaults. + +# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not +# pipes. 'all' adds color characters to all output. 'none' shuts colorization +# off. +COLOR tty + +# Below, there should be one TERM entry for each termtype that is colorizable +TERM ansi +TERM color_xterm +TERM color-xterm +TERM con132x25 +TERM con132x30 +TERM con132x43 +TERM con132x60 +TERM con80x25 +TERM con80x28 +TERM con80x30 +TERM con80x43 +TERM con80x50 +TERM con80x60 +TERM cons25 +TERM console +TERM cygwin +TERM dtterm +TERM Eterm +TERM eterm-color +TERM gnome +TERM gnome-256color +TERM jfbterm +TERM konsole +TERM kterm +TERM linux +TERM linux-c +TERM mach-color +TERM mlterm +TERM nxterm +TERM putty +TERM rxvt +TERM rxvt-256color +TERM rxvt-cygwin +TERM rxvt-cygwin-native +TERM rxvt-unicode +TERM rxvt-unicode256 +TERM rxvt-unicode-256color +TERM screen +TERM screen-256color +TERM screen-256color-bce +TERM screen-bce +TERM screen.linux +TERM screen-w +TERM vt100 +TERM xterm +TERM xterm-16color +TERM xterm-256color +TERM xterm-88color +TERM xterm-color +TERM xterm-debian + +# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output) +EIGHTBIT 1 + +############################################################################# +# Below are the color init strings for the basic file types. A color init +# string consists of one or more of the following numeric codes: +# +# Attribute codes: +# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed +# Text color codes: +# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white +# Background color codes: +# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white +# +# NOTES: +# - See http://www.oreilly.com/catalog/wdnut/excerpt/color_names.html +# - Color combinations +# ANSI Color code Solarized Notes Universal SolDark SolLight +# ~~~~~~~~~~~~~~~ ~~~~~~~~~ ~~~~~ ~~~~~~~~~ ~~~~~~~ ~~~~~~~~ +# 00 none NORMAL, FILE +# 30 black base02 +# 01;30 bright black base03 bg of SolDark +# 31 red red docs & mm src +# 01;31 bright red orange EXEC +# 32 green green editable text +# 01;32 bright green base01 unimportant text +# 33 yellow yellow unclear in light bg multimedia +# 01;33 bright yellow base00 fg of SolLight unimportant non-text +# 34 blue blue unclear in dark bg user customized +# 01;34 bright blue base0 fg in SolDark unimportant text +# 35 magenta magenta LINK +# 01;35 bright magenta violet archive/compressed +# 36 cyan cyan DIR +# 01;36 bright cyan base1 unimportant non-text +# 37 white base2 +# 01;37 bright white base3 bg in SolLight +# 05;37;41 unclear in Putty dark + + +### By file type + +# global default +NORMAL 00 +# normal file +FILE 00 +# directory +DIR 36 +# symbolic link +LINK 35 + +# pipe, socket, block device, character device (blue bg) +FIFO 30;44 +SOCK 35;44 +DOOR 35;44 # Solaris 2.5 and later +BLK 33;44 +CHR 37;44 + + +############################################################################# +### By file attributes + +# Orphaned symlinks (blinking white on red) +# Blink may or may not work (works on iTerm dark or light, and Putty dark) +ORPHAN 05;37;41 +# ... and the files that orphaned symlinks point to (blinking white on red) +MISSING 05;37;41 + +# files with execute permission +EXEC 01;31 # Unix +.cmd 01;31 # Win +.exe 01;31 # Win +.com 01;31 # Win +.bat 01;31 # Win +.reg 01;31 # Win +.app 01;31 # OSX + +############################################################################# +### By extension + +# List any file extensions like '.gz' or '.tar' that you would like ls +# to colorize below. Put the extension, a space, and the color init string. +# (and any comments you want to add after a '#') + +### Text formats + +# Text that we can edit with a regular editor +.txt 32 +.org 32 +.md 32 +.mkd 32 + +# Source text +.h 32 +.c 32 +.C 32 +.cc 32 +.cxx 32 +.objc 32 +.sh 32 +.csh 32 +.zsh 32 +.el 32 +.vim 32 +.java 32 +.pl 32 +.pm 32 +.py 32 +.rb 32 +.hs 32 +.php 32 +.htm 32 +.html 32 +.shtml 32 +.xml 32 +.rdf 32 +.css 32 +.js 32 +.man 32 +.0 32 +.1 32 +.2 32 +.3 32 +.4 32 +.5 32 +.6 32 +.7 32 +.8 32 +.9 32 +.l 32 +.n 32 +.p 32 +.pod 32 +.tex 32 + +### Multimedia formats + +# Image +.bmp 33 +.cgm 33 +.dl 33 +.dvi 33 +.emf 33 +.eps 33 +.gif 33 +.jpeg 33 +.jpg 33 +.JPG 33 +.mng 33 +.pbm 33 +.pcx 33 +.pdf 33 +.pgm 33 +.png 33 +.ppm 33 +.pps 33 +.ppsx 33 +.ps 33 +.svg 33 +.svgz 33 +.tga 33 +.tif 33 +.tiff 33 +.xbm 33 +.xcf 33 +.xpm 33 +.xwd 33 +.xwd 33 +.yuv 33 + +# Audio +.aac 33 +.au 33 +.flac 33 +.mid 33 +.midi 33 +.mka 33 +.mp3 33 +.mpa 33 +.mpeg 33 +.mpg 33 +.ogg 33 +.ra 33 +.wav 33 + +# Video +.anx 33 +.asf 33 +.avi 33 +.axv 33 +.flc 33 +.fli 33 +.flv 33 +.gl 33 +.m2v 33 +.m4v 33 +.mkv 33 +.mov 33 +.mp4 33 +.mp4v 33 +.mpeg 33 +.mpg 33 +.nuv 33 +.ogm 33 +.ogv 33 +.ogx 33 +.qt 33 +.rm 33 +.rmvb 33 +.swf 33 +.vob 33 +.wmv 33 + +### Misc + +# Binary document formats and multimedia source +.doc 31 +.docx 31 +.rtf 31 +.dot 31 +.dotx 31 +.xls 31 +.xlsx 31 +.ppt 31 +.pptx 31 +.fla 31 +.psd 31 + +# Archives, compressed +.7z 1;35 +.apk 1;35 +.arj 1;35 +.bin 1;35 +.bz 1;35 +.bz2 1;35 +.cab 1;35 # Win +.deb 1;35 +.dmg 1;35 # OSX +.gem 1;35 +.gz 1;35 +.iso 1;35 +.jar 1;35 +.msi 1;35 # Win +.rar 1;35 +.rpm 1;35 +.tar 1;35 +.tbz 1;35 +.tbz2 1;35 +.tgz 1;35 +.tx 1;35 +.war 1;35 +.xpi 1;35 +.xz 1;35 +.z 1;35 +.Z 1;35 +.zip 1;35 + +# For testing +.ANSI-30-black 30 +.ANSI-01;30-brblack 01;30 +.ANSI-31-red 31 +.ANSI-01;31-brred 01;31 +.ANSI-32-green 32 +.ANSI-01;32-brgreen 01;32 +.ANSI-33-yellow 33 +.ANSI-01;33-bryellow 01;33 +.ANSI-34-blue 34 +.ANSI-01;34-brblue 01;34 +.ANSI-35-magenta 35 +.ANSI-01;35-brmagenta 01;35 +.ANSI-36-cyan 36 +.ANSI-01;36-brcyan 01;36 +.ANSI-37-white 37 +.ANSI-01;37-brwhite 01;37 + +############################################################################# +# Your customizations + +# Unimportant text files +# For universal scheme, use brightgreen 01;32 +# For optimal on light bg (but too prominent on dark bg), use white 01;34 +.log 01;32 +*~ 01;32 +*# 01;32 +#.log 01;34 +#*~ 01;34 +#*# 01;34 + +# Unimportant non-text files +# For universal scheme, use brightcyan 01;36 +# For optimal on dark bg (but too prominent on light bg), change to 01;33 +#.bak 01;36 +#.BAK 01;36 +#.old 01;36 +#.OLD 01;36 +#.org_archive 01;36 +#.off 01;36 +#.OFF 01;36 +#.dist 01;36 +#.DIST 01;36 +#.orig 01;36 +#.ORIG 01;36 +#.swp 01;36 +#.swo 01;36 +#*,v 01;36 +.bak 01;33 +.BAK 01;33 +.old 01;33 +.OLD 01;33 +.org_archive 01;33 +.off 01;33 +.OFF 01;33 +.dist 01;33 +.DIST 01;33 +.orig 01;33 +.ORIG 01;33 +.swp 01;33 +.swo 01;33 +*,v 01;33 + +# The brightmagenta (Solarized: purple) color is free for you to use for your +# custom file type +.gpg 34 +.gpg 34 +.pgp 34 +.asc 34 +.3des 34 +.aes 34 +.enc 34 diff --git a/.gitignore b/.gitignore index a7db3a3..3ec65ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -.dotfiles +.dotfiles diff --git a/.inputrc b/.inputrc index 630cf3c..bba392d 100644 --- a/.inputrc +++ b/.inputrc @@ -1,62 +1,62 @@ -# Use vi keybindings for everything that uses readline. - -# Adds punctuation as word delimiters -set bind-tty-special-chars off - -# Completion Options -set completion-ignore-case on -set show-all-if-ambiguous on -set show-all-if-unmodified on -set mark-symlinked-directories on -set match-hidden-files off -set page-completions on -set completion-query-items 200 -set visible-stats on -set skip-completed-text on - -set editing-mode vi -set keymap vi -$if mode=vi - # Prompt will be prefixed with a `+` while in insert mode and a `:` when in command mode - #set show-mode-in-prompt on - set keymap vi-command - "gg": beginning-of-history - "G": end-of-history - "k": history-search-backward - "j": history-search-forward - - set keymap vi-insert - "jj": vi-movement-mode - "\C-l": clear-screen - "\C-w": backward-kill-word - "\C-k": history-search-backward - "\C-j": history-search-forward -$endif - -$if Bash - # do history expansion when space entered - Space: magic-space -$endif - -$if Python -$endif - -$if Gdb - "\e[15~": "continue\n" - "\e[21~": "next\n" - "\e[23~": "step\n" - "\eOQ": "nexti\n" - "\eOR": "stepi\n" -$endif - -"\es": menu-complete - -# Useful stuff for UTF-8 -set meta-flag on -set input-meta on -set output-meta on -set convert-meta off - -# Include system wide settings which is ignored -# by default if one has own .inputrc -$include ~/inputrc_local +# Use vi keybindings for everything that uses readline. + +# Adds punctuation as word delimiters +set bind-tty-special-chars off + +# Completion Options +set completion-ignore-case on +set show-all-if-ambiguous on +set show-all-if-unmodified on +set mark-symlinked-directories on +set match-hidden-files off +set page-completions on +set completion-query-items 200 +set visible-stats on +set skip-completed-text on + +set editing-mode vi +set keymap vi +$if mode=vi + # Prompt will be prefixed with a `+` while in insert mode and a `:` when in command mode + #set show-mode-in-prompt on + set keymap vi-command + "gg": beginning-of-history + "G": end-of-history + "k": history-search-backward + "j": history-search-forward + + set keymap vi-insert + "jj": vi-movement-mode + "\C-l": clear-screen + "\C-w": backward-kill-word + "\C-k": history-search-backward + "\C-j": history-search-forward +$endif + +$if Bash + # do history expansion when space entered + Space: magic-space +$endif + +$if Python +$endif + +$if Gdb + "\e[15~": "continue\n" + "\e[21~": "next\n" + "\e[23~": "step\n" + "\eOQ": "nexti\n" + "\eOR": "stepi\n" +$endif + +"\es": menu-complete + +# Useful stuff for UTF-8 +set meta-flag on +set input-meta on +set output-meta on +set convert-meta off + +# Include system wide settings which is ignored +# by default if one has own .inputrc +$include ~/inputrc_local diff --git a/.profile b/.profile index ac752e1..f6bcf3c 100644 --- a/.profile +++ b/.profile @@ -1,17 +1,17 @@ -# User dependent .profile file - -# This file is not read by bash(1) if ~/.bash_profile or ~/.bash_login -# exists. - -# the default umask is set in /etc/profile; -umask 022 - -# if running bash -if [ -n "${BASH_VERSION}" ]; then - [ -f "${HOME}/.bashrc" ] && . "${HOME}/.bashrc" -fi - -# set path, environment, prompt etc -for file in ${HOME}/.config/profile/*.sh; do - [ -f "$file" ] && . "$file"; -done; +# User dependent .profile file + +# This file is not read by bash(1) if ~/.bash_profile or ~/.bash_login +# exists. + +# the default umask is set in /etc/profile; +umask 022 + +# if running bash +if [ -n "${BASH_VERSION}" ]; then + [ -f "${HOME}/.bashrc" ] && . "${HOME}/.bashrc" +fi + +# set path, environment, prompt etc +for file in ${HOME}/.config/profile/*.sh; do + [ -f "$file" ] && . "$file"; +done; diff --git a/.screenrc b/.screenrc index a4a33ba..5b9d007 100644 --- a/.screenrc +++ b/.screenrc @@ -1,8 +1,8 @@ -# Disable the startup message -startup_message off - -# Set a large scrollback buffer -defscrollback 32000 - -# Always start `screen` with UTF-8 enabled (`screen -U`) -defutf8 on +# Disable the startup message +startup_message off + +# Set a large scrollback buffer +defscrollback 32000 + +# Always start `screen` with UTF-8 enabled (`screen -U`) +defutf8 on diff --git a/.ssh/config b/.ssh/config deleted file mode 100644 index b9f8297..0000000 --- a/.ssh/config +++ /dev/null @@ -1,42 +0,0 @@ -Host R renly renly.jannikz router - HostName renly.jannikz - -Host N balon balon.jannikz nas - HostName balon.jannikz - -Host A aegon aegon.jannikz macbook - HostName aegon.jannikz - ForwardX11 yes - -Host D walder walder.jannikz desktop - HostName walder.jannikz - ForwardX11 yes - -Host L loras loras.jannikz laptop - HostName loras.jannikz - ForwardX11 yes - -Host T tyrion tyrion.jannikz htpc - HostName tyrion.jannikz - ForwardX11 yes - -Host tywin - HostName tywin.jannikz - -Host V varys varys.jannikz.net roxy jannikz.net tpo.pe - HostName varys.jannikz.net - -Host home.jannikz.info - CheckHostIP no - HostKeyAlias renly.jannikz - -Host *.jannikz.us *.jannikz - ProxyCommand ssh -qax home.jannikz.info nc `echo %h|cut -d. -f1` %p - -Host *.* localhost - ProxyCommand none - -Host * - User jannikz - ForwardAgent yes - ProxyCommand sh -c '$HOME/.local/bin/jannikz host tunnel %h %p'j diff --git a/.tmux.conf b/.tmux.conf index 4c56589..ecbbbdc 100644 --- a/.tmux.conf +++ b/.tmux.conf @@ -1,102 +1,102 @@ -# Setting the prefix from C-b to C-a -set -g prefix C-a -# Free the original Ctrl-b prefix keybinding -unbind C-b -#setting the delay between prefix and command -set -sg escape-time 1 -# Ensure that we can send Ctrl-A to other apps -bind C-a send-prefix -# Set the base index for windows to 1 instead of 0 -set -g base-index 1 -# Set the base index for panes to 1 instead of 0 -setw -g pane-base-index 1 - -# Set the default terminal mode to 256color mode -set -g default-terminal "screen-256color" -# enable activity alerts -setw -g monitor-activity on -set -g visual-activity on -# set the status line's colors -set -g status-fg white -set -g status-bg black -# set the color of the window list -setw -g window-status-fg cyan -setw -g window-status-bg default -setw -g window-status-attr dim -# set colors for the active window -setw -g window-status-current-fg white -setw -g window-status-current-bg red -setw -g window-status-current-attr bright -# pane colors -set -g pane-border-fg green -set -g pane-border-bg black -set -g pane-active-border-fg white -set -g pane-active-border-bg yellow -# Command / message line -set -g message-fg white -set -g message-bg black -set -g message-attr bright -# Status line left side -set -g status-left-length 40 -set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P" -set -g status-utf8 on -# Status line right side -# 15% | 28 Nov 18:15 -set -g status-right "#(~/battery Discharging) | #[fg=cyan]%d %b %R" -# Update the status bar every sixty seconds -set -g status-interval 60 -# Center the window list -set -g status-justify centre -set -g detach-on-destroy off -# Increase history-limit for scrolling (default is 2000) -set-option -g history-limit 15000 -# mouse support - set to on if you want to use the mouse -#setw -g mode-mouse on -#set -g mouse-select-pane on -#set -g mouse-resize-pane on -#set -g mouse-select-window on -#set -g mouse-utf8 on -# enable vi keys. -setw -g mode-keys vi -# Reload the file with Prefix r -bind r source-file ~/.tmux.conf \; display "Reloaded!" -# splitting panes -bind c neww -c "#{pane_current_path}" -bind | split-window -h -c "#{pane_current_path}" -bind - split-window -v -c "#{pane_current_path}" -# moving between panes -bind h select-pane -L -bind j select-pane -D -bind k select-pane -U -bind l select-pane -R -# Quick pane selection -bind -r C-h select-window -t :- -bind -r C-l select-window -t :+ -# Pane resizing -bind -r H resize-pane -L 5 -bind -r J resize-pane -D 5 -bind -r K resize-pane -U 5 -bind -r L resize-pane -R 5 -# Open panes in the same directory using the tmux-panes script -unbind v -unbind n -bind v send-keys " ~/tmux-panes -h" C-m -bind n send-keys " ~/tmux-panes -v" C-m -# Maximize and restore a pane -unbind Up -bind Up new-window -d -n tmp \; swap-pane -s tmp.1 \; select-window -t tmp -unbind Down -bind Down last-window \; swap-pane -s tmp.1 \; kill-window -t tmp -# Log output to a text file on demand -bind P pipe-pane -o "cat >>~/#W.log" \; display "Toggled logging to ~/#W.log" -# better binding for copy mode -bind v copy-mode -# Select/yank like vim -bind -t vi-copy 'v' begin-selection -bind -t vi-copy 'y' copy-selection -# open tree instead of session list -bind s run 'tmuxer choose-session' -bind-key -t vi-choice h tree-collapse -bind-key -t vi-choice l tree-expand -# local/private settings -source-file ~/.tmux_local.conf +# Setting the prefix from C-b to C-a +set -g prefix C-a +# Free the original Ctrl-b prefix keybinding +unbind C-b +#setting the delay between prefix and command +set -sg escape-time 1 +# Ensure that we can send Ctrl-A to other apps +bind C-a send-prefix +# Set the base index for windows to 1 instead of 0 +set -g base-index 1 +# Set the base index for panes to 1 instead of 0 +setw -g pane-base-index 1 + +# Set the default terminal mode to 256color mode +set -g default-terminal "screen-256color" +# enable activity alerts +setw -g monitor-activity on +set -g visual-activity on +# set the status line's colors +set -g status-fg white +set -g status-bg black +# set the color of the window list +setw -g window-status-fg cyan +setw -g window-status-bg default +setw -g window-status-attr dim +# set colors for the active window +setw -g window-status-current-fg white +setw -g window-status-current-bg red +setw -g window-status-current-attr bright +# pane colors +set -g pane-border-fg green +set -g pane-border-bg black +set -g pane-active-border-fg white +set -g pane-active-border-bg yellow +# Command / message line +set -g message-fg white +set -g message-bg black +set -g message-attr bright +# Status line left side +set -g status-left-length 40 +set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P" +set -g status-utf8 on +# Status line right side +# 15% | 28 Nov 18:15 +set -g status-right "#(~/battery Discharging) | #[fg=cyan]%d %b %R" +# Update the status bar every sixty seconds +set -g status-interval 60 +# Center the window list +set -g status-justify centre +set -g detach-on-destroy off +# Increase history-limit for scrolling (default is 2000) +set-option -g history-limit 15000 +# mouse support - set to on if you want to use the mouse +#setw -g mode-mouse on +#set -g mouse-select-pane on +#set -g mouse-resize-pane on +#set -g mouse-select-window on +#set -g mouse-utf8 on +# enable vi keys. +setw -g mode-keys vi +# Reload the file with Prefix r +bind r source-file ~/.tmux.conf \; display "Reloaded!" +# splitting panes +bind c neww -c "#{pane_current_path}" +bind | split-window -h -c "#{pane_current_path}" +bind - split-window -v -c "#{pane_current_path}" +# moving between panes +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R +# Quick pane selection +bind -r C-h select-window -t :- +bind -r C-l select-window -t :+ +# Pane resizing +bind -r H resize-pane -L 5 +bind -r J resize-pane -D 5 +bind -r K resize-pane -U 5 +bind -r L resize-pane -R 5 +# Open panes in the same directory using the tmux-panes script +unbind v +unbind n +bind v send-keys " ~/tmux-panes -h" C-m +bind n send-keys " ~/tmux-panes -v" C-m +# Maximize and restore a pane +unbind Up +bind Up new-window -d -n tmp \; swap-pane -s tmp.1 \; select-window -t tmp +unbind Down +bind Down last-window \; swap-pane -s tmp.1 \; kill-window -t tmp +# Log output to a text file on demand +bind P pipe-pane -o "cat >>~/#W.log" \; display "Toggled logging to ~/#W.log" +# better binding for copy mode +bind v copy-mode +# Select/yank like vim +bind -t vi-copy 'v' begin-selection +bind -t vi-copy 'y' copy-selection +# open tree instead of session list +bind s run 'tmuxer choose-session' +bind-key -t vi-choice h tree-collapse +bind-key -t vi-choice l tree-expand +# local/private settings +source-file ~/.tmux_local.conf diff --git a/.vimrc b/.vimrc index ef01a5a..27a3137 100644 --- a/.vimrc +++ b/.vimrc @@ -22,21 +22,31 @@ set runtimepath+=~/.cache/vim " --------------------- silent call plug#begin('~/.cache/vim/bundle') Plug 'tpope/vim-repeat' -Plug 'tpope/vim-surround' Plug 'tpope/vim-fugitive' +Plug 'tpope/vim-surround' Plug 'tpope/vim-commentary' +Plug 'tpope/vim-unimpaired' Plug 'tpope/vim-dispatch' "Plug 'tpope/vim-vinager' Plug 'scrooloose/syntastic' +"Plug 'vim-airline/vim-airline' +Plug 'airblade/vim-gitgutter' +Plug 'majutsushi/tagbar' +Plug 'fholgado/minibufexpl.vim' +Plug 'brookhong/cscope.vim' Plug 'ctrlpvim/ctrlp.vim' Plug 'brandonbloom/csearch.vim' -Plug 'chazy/cscope_maps' +Plug 'mileszs/ack.vim' +Plug 'jeetsukumaran/vim-filesearch' +Plug 'haya14busa/incsearch.vim' Plug 'altercation/vim-colors-solarized' -"Plug 'editorconfig/editorconfig-vim' -Plug 'fholgado/minibufexpl.vim' -Plug 'a.vim' -Plug 'heaths/vim-msbuild' -Plug 'klen/python-mode' +Plug 'editorconfig/editorconfig-vim' +Plug 'johnsyweb/vim-makeshift' +Plug 'tfnico/vim-gradle' +"Plug 'a.vim' +"Plug 'heaths/vim-msbuild' +"Plug 'hdima/python-syntax' +"Plug 'klen/python-mode' "Plug 'jalcine/cmake.vim' call plug#end() @@ -61,9 +71,9 @@ set clipboard=unnamed "set clipboard=unnamedplus "endif set fileformats=unix,dos,mac -"set foldmethod=indent -"set foldlevel=99 -"set foldmethod=marker +"set foldmethod=syntax +"set foldlevel=1 +"set foldclose=all "set foldopen+=jump set guioptions+=a set history=200 @@ -75,7 +85,7 @@ set mouse=nvi set mousemodel=popup set number "set pastetoggle= -set path=** +set path=.,,**,C:\programs\IAR\\\ System\EWB_V850_V360\common\bin set printoptions=paper:letter set scrolloff=1 set shiftround @@ -92,6 +102,7 @@ if exists('+undofile') set undofile endif set virtualedit=block +set updatetime=250 set wildmenu set wildmode=longest:full,full set wildignore+=tags,.*.un~,*.pyc @@ -100,12 +111,23 @@ set winaltkeys=no "if !has("gui_running") && $display == '' || !has("gui") " set mouse= "endif - -set makeprg=cmake\ --build\ . +" +"set makeprg=cmake\ --build\ . " Visual studio 2013 "set errorformat=\ %#%f(%l):\ %m " Visual studio 2008 -set errorformat=%.%#>\ %#%f(%l)\ :\ %m +"set errorformat=%.%#>\ %#%f(%l)\ :\ %m +" +" IAR compiler +set makeprg=vim-iarbuild.cmd +set errorformat=%f(%l)\ :\ %m + +"syn match pythonDefStatement /^\s*\%(def\|class\)/ +" \ nextgroup=pythonFunction skipwhite +"syn region pythonFunctionFold start="^\z(\s*\)\%(def\|class\)\>" +" \ end="\ze\%(\s*\n\)\+\%(\z1\s\)\@!." fold transparent + +"hi link pythonDefStatement Statement let g:syntastic_quiet_messages = { "type": "style" } @@ -143,6 +165,7 @@ let &t_SI.="\e[5 q" let &t_EI.="\e[1 q" let &t_te.="\e[0 q" +let python_folding = 1 " }}}2 " section: commands {{{1 "----------------------- @@ -182,6 +205,7 @@ endif" " let mapleader = "," + " Quickly edit/reload the vimrc file nmap ev :e $MYVIMRC nmap sv :so $MYVIMRC @@ -190,6 +214,9 @@ nmap sv :so $MYVIMRC nnoremap b :MBEToggle "let g:miniBufExplMapWindowNavVim = 1 "let g:miniBufExplMapCTabSwitchBufs = 1 +" +" Tagbar +nnoremap t :TagbarToggle " copy/paste from system clipboard if has("win32") @@ -197,6 +224,7 @@ vnoremap y "*y vnoremap d "*d nnoremap p "*p nnoremap P "*P + vnoremap p "*p vnoremap P "*P else @@ -211,27 +239,39 @@ else endif if has("cscope") - cnoreabbrev csa - \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs add' : 'csa') - cnoreabbrev csf - \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs find' : 'csf') - cnoreabbrev csk - \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs kill' : 'csk') - cnoreabbrev csr - \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs reset' : 'csr') - cnoreabbrev css - \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs show' : 'css') - cnoreabbrev csh - \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs help' : 'csh') - - nnoremap fs :cscope find s =expand(""):botright cwindow - nnoremap fg :cscope find g =expand(""):botright cwindow - nnoremap fc :cscope find c =expand(""):botright cwindow - nnoremap ft :cscope find t =expand(""):botright cwindow - nnoremap fe :cscope find e =expand(""):botright cwindow - nnoremap ff :cscope find f =expand(""):botright cwindow - nnoremap fd :cscope find d =expand(""):botright cwindow - nnoremap fi :cscope find i ^=expand("")$:botright cwindow +" cnoreabbrev csa +" \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs add' : 'csa') +" cnoreabbrev csf +" \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs find' : 'csf') +" cnoreabbrev csk +" \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs kill' : 'csk') +" cnoreabbrev csr +" \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs reset' : 'csr') +" cnoreabbrev css +" \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs show' : 'css') +" cnoreabbrev csh +" \ ((getcmdtype() == ':' && getcmdpos() <= 4)? 'cs help' : 'csh') + + nnoremap fa :call CscopeFindInteractive(expand('')) + nnoremap l :call ToggleLocationList() + + " s: Find this C symbol + nnoremap fs :call CscopeFind('s', expand('')) + " g: Find this definition + nnoremap fg :call CscopeFind('g', expand('')) + " d: Find functions called by this function + nnoremap fd :call CscopeFind('d', expand('')) + " c: Find functions calling this function + nnoremap fc :call CscopeFind('c', expand('')) + " t: Find this text string + nnoremap ft :call CscopeFind('t', expand('')) + " e: Find this egrep pattern + nnoremap fe :call CscopeFind('e', expand('')) + " f: Find this file + nnoremap ff :call CscopeFind('f', expand('')) + " i: Find files #including this file + nnoremap fi :call CscopeFind('i', expand('')) + "todo: figure out how to get cstag output in quickfix or a popup menu. map :cstag =expand("") endif @@ -301,3 +341,4 @@ endif if filereadable(expand('~/.vimrc_local')) source ~/.vimrc_local endif + diff --git a/Library/Keyboard Layouts/usdanish.bundle/Contents/Info.plist b/Library/Keyboard Layouts/usdanish.bundle/Contents/Info.plist index 0343df9..edeb5af 100644 --- a/Library/Keyboard Layouts/usdanish.bundle/Contents/Info.plist +++ b/Library/Keyboard Layouts/usdanish.bundle/Contents/Info.plist @@ -1,19 +1,19 @@ - - - - - CFBundleIdentifier - org.sil.ukelele.keyboardlayout.usdanish - CFBundleName - usdanish - CFBundleVersion - - KLInfo_U.S.Denmark - - TISInputSourceID - org.sil.ukelele.keyboardlayout.usdanish.u.s.denmark - TISIntendedLanguage - en-DK - - - + + + + + CFBundleIdentifier + org.sil.ukelele.keyboardlayout.usdanish + CFBundleName + usdanish + CFBundleVersion + + KLInfo_U.S.Denmark + + TISInputSourceID + org.sil.ukelele.keyboardlayout.usdanish.u.s.denmark + TISIntendedLanguage + en-DK + + + diff --git a/Library/Keyboard Layouts/usdanish.bundle/Contents/Resources/U.S.Denmark.keylayout b/Library/Keyboard Layouts/usdanish.bundle/Contents/Resources/U.S.Denmark.keylayout index 0baef47..ae0a6a5 100644 --- a/Library/Keyboard Layouts/usdanish.bundle/Contents/Resources/U.S.Denmark.keylayout +++ b/Library/Keyboard Layouts/usdanish.bundle/Contents/Resources/U.S.Denmark.keylayout @@ -1,1143 +1,1143 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Library/Keyboard Layouts/usdanish.bundle/Contents/version.plist b/Library/Keyboard Layouts/usdanish.bundle/Contents/version.plist index 94c4f1e..72f1092 100644 --- a/Library/Keyboard Layouts/usdanish.bundle/Contents/version.plist +++ b/Library/Keyboard Layouts/usdanish.bundle/Contents/version.plist @@ -1,12 +1,12 @@ - - - - - BuildVersion - - ProjectName - usdanish - SourceVersion - - - + + + + + BuildVersion + + ProjectName + usdanish + SourceVersion + + + diff --git a/README.md b/README.md index d19f5f5..22a4f38 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# dotfiles - -What you need to do on the new box is this: - - $ cd $HOME - $ git init --bare $HOME/.dotfiles - $ alias dotfiles='git --git-dir=$HOME/.dotfiles --work-tree=$HOME' - $ dotfiles config --local status.showUntrackedFiles no - $ dotfiles remote add origin git@bitbucket.org:jannikz/dotfiles.git - $ dotfiles fetch - $ dotfiles reset --hard origin/master +# dotfiles + +What you need to do on the new box is this: + + $ cd $HOME + $ git init --bare $HOME/.dotfiles + $ alias dotfiles='git --git-dir=$HOME/.dotfiles --work-tree=$HOME' + $ dotfiles config --local status.showUntrackedFiles no + $ dotfiles remote add origin git@bitbucket.org:jannikz/dotfiles.git + $ dotfiles fetch + $ dotfiles reset --hard origin/master $ dotfiles branch -u origin/master \ No newline at end of file diff --git a/bin/build-akmod.sh b/bin/build-akmod.sh index ddcec7d..c451db7 100644 --- a/bin/build-akmod.sh +++ b/bin/build-akmod.sh @@ -1,5 +1,5 @@ -#!/bin/sh - -sudo dnf install kernel-$1 -sudo dnf install akmod-wl "kernel-devel-uname-r == $(uname -r)" -sudo akmods +#!/bin/sh + +sudo dnf install kernel-$1 +sudo dnf install akmod-wl "kernel-devel-uname-r == $(uname -r)" +sudo akmods diff --git a/bin/build-luajit.sh b/bin/build-luajit.sh index 5d635d9..2989278 100644 --- a/bin/build-luajit.sh +++ b/bin/build-luajit.sh @@ -1,3 +1,3 @@ -#!/bin/sh -make PREFIX=$PREFIX MULTILIB=lib -make install PREFIX=$PREFIX/apps/luajit MULTILIB=lib +#!/bin/sh +make PREFIX=$PREFIX MULTILIB=lib +make install PREFIX=$PREFIX/apps/luajit MULTILIB=lib diff --git a/bin/colortest b/bin/colortest index e708d54..97e817d 100644 --- a/bin/colortest +++ b/bin/colortest @@ -1,365 +1,365 @@ -#!/usr/bin/env perl - -# by entheon, do whatever the hell you want with this file - -print "\n"; -print "**************************\n"; -print "*XTERM 256Color Test Chart\n"; -print "**************************\n"; -print "* 16 = black\n"; -print "* 255 = white\n"; -print "*\n"; -print "* Usage:\n"; -print "* colortest -w\n"; -print "* wide display\n"; -print "*\n"; -print "* colortest -w -r\n"; -print "* wide display reversed\n"; -print "*\n"; -print "* colortest -w -s\n"; -print "* extra spaces padding\n"; -print "*\n"; -print "* colortest -w -r -s\n"; -print "* available combination\n"; -print "*\n"; -print "**************************\n"; - -if( $ARGV[0] eq "-w" || $ARGV[1] eq "-w" || $ARGV[2] eq "-w" ) { - push(@arr, [( " 16: 00/00/00", " 17: 00/00/5f", " 18: 00/00/87", " 19: 00/00/af", " 20: 00/00/d7", " 21: 00/00/ff")] ); - push(@arr, [( " 22: 00/5f/00", " 23: 00/5f/5f", " 24: 00/5f/87", " 25: 00/5f/af", " 26: 00/5f/d7", " 27: 00/5f/ff")] ); - push(@arr, [( " 28: 00/87/00", " 29: 00/87/5f", " 30: 00/87/87", " 31: 00/87/af", " 32: 00/87/d7", " 33: 00/87/ff")] ); - push(@arr, [( " 34: 00/af/00", " 35: 00/af/5f", " 36: 00/af/87", " 37: 00/af/af", " 38: 00/af/d7", " 39: 00/af/ff")] ); - push(@arr, [( " 40: 00/d7/00", " 41: 00/d7/5f", " 42: 00/d7/87", " 43: 00/d7/af", " 44: 00/d7/d7", " 45: 00/d7/ff")] ); - push(@arr, [( " 46: 00/ff/00", " 47: 00/ff/5f", " 48: 00/ff/87", " 49: 00/ff/af", " 50: 00/ff/d7", " 51: 00/ff/ff")] ); - push(@arr, [( " 52: 5f/00/00", " 53: 5f/00/5f", " 54: 5f/00/87", " 55: 5f/00/af", " 56: 5f/00/d7", " 57: 5f/00/ff")] ); - push(@arr, [( " 58: 5f/5f/00", " 59: 5f/5f/5f", " 60: 5f/5f/87", " 61: 5f/5f/af", " 62: 5f/5f/d7", " 63: 5f/5f/ff")] ); - push(@arr, [( " 64: 5f/87/00", " 65: 5f/87/5f", " 66: 5f/87/87", " 67: 5f/87/af", " 68: 5f/87/d7", " 69: 5f/87/ff")] ); - push(@arr, [( " 70: 5f/af/00", " 71: 5f/af/5f", " 72: 5f/af/87", " 73: 5f/af/af", " 74: 5f/af/d7", " 75: 5f/af/ff")] ); - push(@arr, [( " 76: 5f/d7/00", " 77: 5f/d7/5f", " 78: 5f/d7/87", " 79: 5f/d7/af", " 80: 5f/d7/d7", " 81: 5f/d7/ff")] ); - push(@arr, [( " 82: 5f/ff/00", " 83: 5f/ff/5f", " 84: 5f/ff/87", " 85: 5f/ff/af", " 86: 5f/ff/d7", " 87: 5f/ff/ff")] ); - push(@arr, [( " 88: 87/00/00", " 89: 87/00/5f", " 90: 87/00/87", " 91: 87/00/af", " 92: 87/00/d7", " 93: 87/00/ff")] ); - push(@arr, [( " 94: 87/5f/00", " 95: 87/5f/5f", " 96: 87/5f/87", " 97: 87/5f/af", " 98: 87/5f/d7", " 99: 87/5f/ff")] ); - push(@arr, [( " 100: 87/87/00", " 101: 87/87/5f", " 102: 87/87/87", " 103: 87/87/af", " 104: 87/87/d7", " 105: 87/87/ff")] ); - push(@arr, [( " 106: 87/af/00", " 107: 87/af/5f", " 108: 87/af/87", " 109: 87/af/af", " 110: 87/af/d7", " 111: 87/af/ff")] ); - push(@arr, [( " 112: 87/d7/00", " 113: 87/d7/5f", " 114: 87/d7/87", " 115: 87/d7/af", " 116: 87/d7/d7", " 117: 87/d7/ff")] ); - push(@arr, [( " 118: 87/ff/00", " 119: 87/ff/5f", " 120: 87/ff/87", " 121: 87/ff/af", " 122: 87/ff/d7", " 123: 87/ff/ff")] ); - push(@arr, [( " 124: af/00/00", " 125: af/00/5f", " 126: af/00/87", " 127: af/00/af", " 128: af/00/d7", " 129: af/00/ff")] ); - push(@arr, [( " 130: af/5f/00", " 131: af/5f/5f", " 132: af/5f/87", " 133: af/5f/af", " 134: af/5f/d7", " 135: af/5f/ff")] ); - push(@arr, [( " 136: af/87/00", " 137: af/87/5f", " 138: af/87/87", " 139: af/87/af", " 140: af/87/d7", " 141: af/87/ff")] ); - push(@arr, [( " 142: af/af/00", " 143: af/af/5f", " 144: af/af/87", " 145: af/af/af", " 146: af/af/d7", " 147: af/af/ff")] ); - push(@arr, [( " 148: af/d7/00", " 149: af/d7/5f", " 150: af/d7/87", " 151: af/d7/af", " 152: af/d7/d7", " 153: af/d7/ff")] ); - push(@arr, [( " 154: af/ff/00", " 155: af/ff/5f", " 156: af/ff/87", " 157: af/ff/af", " 158: af/ff/d7", " 159: af/ff/ff")] ); - push(@arr, [( " 160: d7/00/00", " 161: d7/00/5f", " 162: d7/00/87", " 163: d7/00/af", " 164: d7/00/d7", " 165: d7/00/ff")] ); - push(@arr, [( " 166: d7/5f/00", " 167: d7/5f/5f", " 168: d7/5f/87", " 169: d7/5f/af", " 170: d7/5f/d7", " 171: d7/5f/ff")] ); - push(@arr, [( " 172: d7/87/00", " 173: d7/87/5f", " 174: d7/87/87", " 175: d7/87/af", " 176: d7/87/d7", " 177: d7/87/ff")] ); - push(@arr, [( " 178: d7/af/00", " 179: d7/af/5f", " 180: d7/af/87", " 181: d7/af/af", " 182: d7/af/d7", " 183: d7/af/ff")] ); - push(@arr, [( " 184: d7/d7/00", " 185: d7/d7/5f", " 186: d7/d7/87", " 187: d7/d7/af", " 188: d7/d7/d7", " 189: d7/d7/ff")] ); - push(@arr, [( " 190: d7/ff/00", " 191: d7/ff/5f", " 192: d7/ff/87", " 193: d7/ff/af", " 194: d7/ff/d7", " 195: d7/ff/ff")] ); - push(@arr, [( " 196: ff/00/00", " 197: ff/00/5f", " 198: ff/00/87", " 199: ff/00/af", " 200: ff/00/d7", " 201: ff/00/ff")] ); - push(@arr, [( " 202: ff/5f/00", " 203: ff/5f/5f", " 204: ff/5f/87", " 205: ff/5f/af", " 206: ff/5f/d7", " 207: ff/5f/ff")] ); - push(@arr, [( " 208: ff/87/00", " 209: ff/87/5f", " 210: ff/87/87", " 211: ff/87/af", " 212: ff/87/d7", " 213: ff/87/ff")] ); - push(@arr, [( " 214: ff/af/00", " 215: ff/af/5f", " 216: ff/af/87", " 217: ff/af/af", " 218: ff/af/d7", " 219: ff/af/ff")] ); - push(@arr, [( " 220: ff/d7/00", " 221: ff/d7/5f", " 222: ff/d7/87", " 223: ff/d7/af", " 224: ff/d7/d7", " 225: ff/d7/ff")] ); - push(@arr, [( " 226: ff/ff/00", " 227: ff/ff/5f", " 228: ff/ff/87", " 229: ff/ff/af", " 230: ff/ff/d7", " 231: ff/ff/ff")] ); - push(@arr, [( " 232: 08/08/08", " 233: 12/12/12", " 234: 1c/1c/1c", " 235: 26/26/26", " 236: 30/30/30", " 237: 3a/3a/3a")] ); - push(@arr, [( " 238: 44/44/44", " 239: 4e/4e/4e", " 240: 58/58/58", " 241: 62/62/62", " 242: 6c/6c/6c", " 243: 76/76/76")] ); - push(@arr, [( " 244: 80/80/80", " 245: 8a/8a/8a", " 246: 94/94/94", " 247: 9e/9e/9e", " 248: a8/a8/a8", " 249: b2/b2/b2")] ); - push(@arr, [( " 250: bc/bc/bc", " 251: c6/c6/c6", " 252: d0/d0/d0", " 253: da/da/da", " 254: e4/e4/e4", " 255: ee/ee/ee")] ); - - if( $ARGV[0] eq "-s" || $ARGV[1] eq "-s" || $ARGV[2] eq "-s" ){ - $padding = " "; - } - else { - - } - - # display in reverse order - if( $ARGV[0] eq "-r" || $ARGV[1] eq "-r" || $ARGV[2] eq "-r" ){ - for( $dimone = 0; $dimone < scalar @arr; $dimone++ ) { - - $seed = ($dimone % 6) * -1; - for( $dimtwo = 0; $dimtwo < 6; $dimtwo++ ) { - - $movone = $seed; - $movtwo = $seed * -1; - - print $arr[$dimone][$dimtwo] . $padding; - - $seed = $seed+1; - } - - print "\n"; - } - } - else { - for( $dimone = 0; $dimone < scalar @arr; $dimone++ ) { - - $seed = ($dimone % 6) * -1; - for( $dimtwo = 0; $dimtwo < 6; $dimtwo++ ) { - - $movone = $seed; - $movtwo = $seed * -1; - - $newone = $dimone+$movone; - $newtwo = $dimtwo+$movtwo; - - if( $newone < scalar @arr ){ - print $arr[$newone][$newtwo] . $padding; - } - - $seed = $seed+1; - } - - print "\n"; - } - } - print "\n"; - print "\n"; - -} -else { - print " 16: 00/00/00\n"; - print " 17: 00/00/5f\n"; - print " 18: 00/00/87\n"; - print " 19: 00/00/af\n"; - print " 20: 00/00/d7\n"; - print " 21: 00/00/ff\n"; - print " 22: 00/5f/00\n"; - print " 23: 00/5f/5f\n"; - print " 24: 00/5f/87\n"; - print " 25: 00/5f/af\n"; - print " 26: 00/5f/d7\n"; - print " 27: 00/5f/ff\n"; - print " 28: 00/87/00\n"; - print " 29: 00/87/5f\n"; - print " 30: 00/87/87\n"; - print " 31: 00/87/af\n"; - print " 32: 00/87/d7\n"; - print " 33: 00/87/ff\n"; - print " 34: 00/af/00\n"; - print " 35: 00/af/5f\n"; - print " 36: 00/af/87\n"; - print " 37: 00/af/af\n"; - print " 38: 00/af/d7\n"; - print " 39: 00/af/ff\n"; - print " 40: 00/d7/00\n"; - print " 41: 00/d7/5f\n"; - print " 42: 00/d7/87\n"; - print " 43: 00/d7/af\n"; - print " 44: 00/d7/d7\n"; - print " 45: 00/d7/ff\n"; - print " 46: 00/ff/00\n"; - print " 47: 00/ff/5f\n"; - print " 48: 00/ff/87\n"; - print " 49: 00/ff/af\n"; - print " 50: 00/ff/d7\n"; - print " 51: 00/ff/ff\n"; - print " 52: 5f/00/00\n"; - print " 53: 5f/00/5f\n"; - print " 54: 5f/00/87\n"; - print " 55: 5f/00/af\n"; - print " 56: 5f/00/d7\n"; - print " 57: 5f/00/ff\n"; - print " 58: 5f/5f/00\n"; - print " 59: 5f/5f/5f\n"; - print " 60: 5f/5f/87\n"; - print " 61: 5f/5f/af\n"; - print " 62: 5f/5f/d7\n"; - print " 63: 5f/5f/ff\n"; - print " 64: 5f/87/00\n"; - print " 65: 5f/87/5f\n"; - print " 66: 5f/87/87\n"; - print " 67: 5f/87/af\n"; - print " 68: 5f/87/d7\n"; - print " 69: 5f/87/ff\n"; - print " 70: 5f/af/00\n"; - print " 71: 5f/af/5f\n"; - print " 72: 5f/af/87\n"; - print " 73: 5f/af/af\n"; - print " 74: 5f/af/d7\n"; - print " 75: 5f/af/ff\n"; - print " 76: 5f/d7/00\n"; - print " 77: 5f/d7/5f\n"; - print " 78: 5f/d7/87\n"; - print " 79: 5f/d7/af\n"; - print " 80: 5f/d7/d7\n"; - print " 81: 5f/d7/ff\n"; - print " 82: 5f/ff/00\n"; - print " 83: 5f/ff/5f\n"; - print " 84: 5f/ff/87\n"; - print " 85: 5f/ff/af\n"; - print " 86: 5f/ff/d7\n"; - print " 87: 5f/ff/ff\n"; - print " 88: 87/00/00\n"; - print " 89: 87/00/5f\n"; - print " 90: 87/00/87\n"; - print " 91: 87/00/af\n"; - print " 92: 87/00/d7\n"; - print " 93: 87/00/ff\n"; - print " 94: 87/5f/00\n"; - print " 95: 87/5f/5f\n"; - print " 96: 87/5f/87\n"; - print " 97: 87/5f/af\n"; - print " 98: 87/5f/d7\n"; - print " 99: 87/5f/ff\n"; - print " 100 :87/87/00\n"; - print " 101 :87/87/5f\n"; - print " 102 :87/87/87\n"; - print " 103 :87/87/af\n"; - print " 104 :87/87/d7\n"; - print " 105 :87/87/ff\n"; - print " 106 :87/af/00\n"; - print " 107 :87/af/5f\n"; - print " 108 :87/af/87\n"; - print " 109 :87/af/af\n"; - print " 110 :87/af/d7\n"; - print " 111 :87/af/ff\n"; - print " 112 :87/d7/00\n"; - print " 113 :87/d7/5f\n"; - print " 114 :87/d7/87\n"; - print " 115 :87/d7/af\n"; - print " 116 :87/d7/d7\n"; - print " 117 :87/d7/ff\n"; - print " 118 :87/ff/00\n"; - print " 119 :87/ff/5f\n"; - print " 120 :87/ff/87\n"; - print " 121 :87/ff/af\n"; - print " 122 :87/ff/d7\n"; - print " 123 :87/ff/ff\n"; - print " 124 :af/00/00\n"; - print " 125 :af/00/5f\n"; - print " 126 :af/00/87\n"; - print " 127 :af/00/af\n"; - print " 128 :af/00/d7\n"; - print " 129 :af/00/ff\n"; - print " 130 :af/5f/00\n"; - print " 131 :af/5f/5f\n"; - print " 132 :af/5f/87\n"; - print " 133 :af/5f/af\n"; - print " 134 :af/5f/d7\n"; - print " 135 :af/5f/ff\n"; - print " 136 :af/87/00\n"; - print " 137 :af/87/5f\n"; - print " 138 :af/87/87\n"; - print " 139 :af/87/af\n"; - print " 140 :af/87/d7\n"; - print " 141 :af/87/ff\n"; - print " 142 :af/af/00\n"; - print " 143 :af/af/5f\n"; - print " 144 :af/af/87\n"; - print " 145 :af/af/af\n"; - print " 146 :af/af/d7\n"; - print " 147 :af/af/ff\n"; - print " 148 :af/d7/00\n"; - print " 149 :af/d7/5f\n"; - print " 150 :af/d7/87\n"; - print " 151 :af/d7/af\n"; - print " 152 :af/d7/d7\n"; - print " 153 :af/d7/ff\n"; - print " 154 :af/ff/00\n"; - print " 155 :af/ff/5f\n"; - print " 156 :af/ff/87\n"; - print " 157 :af/ff/af\n"; - print " 158 :af/ff/d7\n"; - print " 159 :af/ff/ff\n"; - print " 160 :d7/00/00\n"; - print " 161 :d7/00/5f\n"; - print " 162 :d7/00/87\n"; - print " 163 :d7/00/af\n"; - print " 164 :d7/00/d7\n"; - print " 165 :d7/00/ff\n"; - print " 166 :d7/5f/00\n"; - print " 167 :d7/5f/5f\n"; - print " 168 :d7/5f/87\n"; - print " 169 :d7/5f/af\n"; - print " 170 :d7/5f/d7\n"; - print " 171 :d7/5f/ff\n"; - print " 172 :d7/87/00\n"; - print " 173 :d7/87/5f\n"; - print " 174 :d7/87/87\n"; - print " 175 :d7/87/af\n"; - print " 176 :d7/87/d7\n"; - print " 177 :d7/87/ff\n"; - print " 178 :d7/af/00\n"; - print " 179 :d7/af/5f\n"; - print " 180 :d7/af/87\n"; - print " 181 :d7/af/af\n"; - print " 182 :d7/af/d7\n"; - print " 183 :d7/af/ff\n"; - print " 184 :d7/d7/00\n"; - print " 185 :d7/d7/5f\n"; - print " 186 :d7/d7/87\n"; - print " 187 :d7/d7/af\n"; - print " 188 :d7/d7/d7\n"; - print " 189 :d7/d7/ff\n"; - print " 190 :d7/ff/00\n"; - print " 191 :d7/ff/5f\n"; - print " 192 :d7/ff/87\n"; - print " 193 :d7/ff/af\n"; - print " 194 :d7/ff/d7\n"; - print " 195 :d7/ff/ff\n"; - print " 196 :ff/00/00\n"; - print " 197 :ff/00/5f\n"; - print " 198 :ff/00/87\n"; - print " 199 :ff/00/af\n"; - print " 200 :ff/00/d7\n"; - print " 201 :ff/00/ff\n"; - print " 202 :ff/5f/00\n"; - print " 203 :ff/5f/5f\n"; - print " 204 :ff/5f/87\n"; - print " 205 :ff/5f/af\n"; - print " 206 :ff/5f/d7\n"; - print " 207 :ff/5f/ff\n"; - print " 208 :ff/87/00\n"; - print " 209 :ff/87/5f\n"; - print " 210 :ff/87/87\n"; - print " 211 :ff/87/af\n"; - print " 212 :ff/87/d7\n"; - print " 213 :ff/87/ff\n"; - print " 214 :ff/af/00\n"; - print " 215 :ff/af/5f\n"; - print " 216 :ff/af/87\n"; - print " 217 :ff/af/af\n"; - print " 218 :ff/af/d7\n"; - print " 219 :ff/af/ff\n"; - print " 220 :ff/d7/00\n"; - print " 221 :ff/d7/5f\n"; - print " 222 :ff/d7/87\n"; - print " 223 :ff/d7/af\n"; - print " 224 :ff/d7/d7\n"; - print " 225 :ff/d7/ff\n"; - print " 226 :ff/ff/00\n"; - print " 227 :ff/ff/5f\n"; - print " 228 :ff/ff/87\n"; - print " 229 :ff/ff/af\n"; - print " 230 :ff/ff/d7\n"; - print " 231 :ff/ff/ff\n"; - print " 232 :08/08/08\n"; - print " 233 :12/12/12\n"; - print " 234 :1c/1c/1c\n"; - print " 235 :26/26/26\n"; - print " 236 :30/30/30\n"; - print " 237 :3a/3a/3a\n"; - print " 238 :44/44/44\n"; - print " 239 :4e/4e/4e\n"; - print " 240 :58/58/58\n"; - print " 241 :62/62/62\n"; - print " 242 :6c/6c/6c\n"; - print " 243 :76/76/76\n"; - print " 244 :80/80/80\n"; - print " 245 :8a/8a/8a\n"; - print " 246 :94/94/94\n"; - print " 247 :9e/9e/9e\n"; - print " 248 :a8/a8/a8\n"; - print " 249 :b2/b2/b2\n"; - print " 250 :bc/bc/bc\n"; - print " 251 :c6/c6/c6\n"; - print " 252 :d0/d0/d0\n"; - print " 253 :da/da/da\n"; - print " 254 :e4/e4/e4\n"; - print " 255 :ee/ee/ee\n"; - print "\n"; - print "\n"; -} -print "0m"; -exit; +#!/usr/bin/env perl + +# by entheon, do whatever the hell you want with this file + +print "\n"; +print "**************************\n"; +print "*XTERM 256Color Test Chart\n"; +print "**************************\n"; +print "* 16 = black\n"; +print "* 255 = white\n"; +print "*\n"; +print "* Usage:\n"; +print "* colortest -w\n"; +print "* wide display\n"; +print "*\n"; +print "* colortest -w -r\n"; +print "* wide display reversed\n"; +print "*\n"; +print "* colortest -w -s\n"; +print "* extra spaces padding\n"; +print "*\n"; +print "* colortest -w -r -s\n"; +print "* available combination\n"; +print "*\n"; +print "**************************\n"; + +if( $ARGV[0] eq "-w" || $ARGV[1] eq "-w" || $ARGV[2] eq "-w" ) { + push(@arr, [( " 16: 00/00/00", " 17: 00/00/5f", " 18: 00/00/87", " 19: 00/00/af", " 20: 00/00/d7", " 21: 00/00/ff")] ); + push(@arr, [( " 22: 00/5f/00", " 23: 00/5f/5f", " 24: 00/5f/87", " 25: 00/5f/af", " 26: 00/5f/d7", " 27: 00/5f/ff")] ); + push(@arr, [( " 28: 00/87/00", " 29: 00/87/5f", " 30: 00/87/87", " 31: 00/87/af", " 32: 00/87/d7", " 33: 00/87/ff")] ); + push(@arr, [( " 34: 00/af/00", " 35: 00/af/5f", " 36: 00/af/87", " 37: 00/af/af", " 38: 00/af/d7", " 39: 00/af/ff")] ); + push(@arr, [( " 40: 00/d7/00", " 41: 00/d7/5f", " 42: 00/d7/87", " 43: 00/d7/af", " 44: 00/d7/d7", " 45: 00/d7/ff")] ); + push(@arr, [( " 46: 00/ff/00", " 47: 00/ff/5f", " 48: 00/ff/87", " 49: 00/ff/af", " 50: 00/ff/d7", " 51: 00/ff/ff")] ); + push(@arr, [( " 52: 5f/00/00", " 53: 5f/00/5f", " 54: 5f/00/87", " 55: 5f/00/af", " 56: 5f/00/d7", " 57: 5f/00/ff")] ); + push(@arr, [( " 58: 5f/5f/00", " 59: 5f/5f/5f", " 60: 5f/5f/87", " 61: 5f/5f/af", " 62: 5f/5f/d7", " 63: 5f/5f/ff")] ); + push(@arr, [( " 64: 5f/87/00", " 65: 5f/87/5f", " 66: 5f/87/87", " 67: 5f/87/af", " 68: 5f/87/d7", " 69: 5f/87/ff")] ); + push(@arr, [( " 70: 5f/af/00", " 71: 5f/af/5f", " 72: 5f/af/87", " 73: 5f/af/af", " 74: 5f/af/d7", " 75: 5f/af/ff")] ); + push(@arr, [( " 76: 5f/d7/00", " 77: 5f/d7/5f", " 78: 5f/d7/87", " 79: 5f/d7/af", " 80: 5f/d7/d7", " 81: 5f/d7/ff")] ); + push(@arr, [( " 82: 5f/ff/00", " 83: 5f/ff/5f", " 84: 5f/ff/87", " 85: 5f/ff/af", " 86: 5f/ff/d7", " 87: 5f/ff/ff")] ); + push(@arr, [( " 88: 87/00/00", " 89: 87/00/5f", " 90: 87/00/87", " 91: 87/00/af", " 92: 87/00/d7", " 93: 87/00/ff")] ); + push(@arr, [( " 94: 87/5f/00", " 95: 87/5f/5f", " 96: 87/5f/87", " 97: 87/5f/af", " 98: 87/5f/d7", " 99: 87/5f/ff")] ); + push(@arr, [( " 100: 87/87/00", " 101: 87/87/5f", " 102: 87/87/87", " 103: 87/87/af", " 104: 87/87/d7", " 105: 87/87/ff")] ); + push(@arr, [( " 106: 87/af/00", " 107: 87/af/5f", " 108: 87/af/87", " 109: 87/af/af", " 110: 87/af/d7", " 111: 87/af/ff")] ); + push(@arr, [( " 112: 87/d7/00", " 113: 87/d7/5f", " 114: 87/d7/87", " 115: 87/d7/af", " 116: 87/d7/d7", " 117: 87/d7/ff")] ); + push(@arr, [( " 118: 87/ff/00", " 119: 87/ff/5f", " 120: 87/ff/87", " 121: 87/ff/af", " 122: 87/ff/d7", " 123: 87/ff/ff")] ); + push(@arr, [( " 124: af/00/00", " 125: af/00/5f", " 126: af/00/87", " 127: af/00/af", " 128: af/00/d7", " 129: af/00/ff")] ); + push(@arr, [( " 130: af/5f/00", " 131: af/5f/5f", " 132: af/5f/87", " 133: af/5f/af", " 134: af/5f/d7", " 135: af/5f/ff")] ); + push(@arr, [( " 136: af/87/00", " 137: af/87/5f", " 138: af/87/87", " 139: af/87/af", " 140: af/87/d7", " 141: af/87/ff")] ); + push(@arr, [( " 142: af/af/00", " 143: af/af/5f", " 144: af/af/87", " 145: af/af/af", " 146: af/af/d7", " 147: af/af/ff")] ); + push(@arr, [( " 148: af/d7/00", " 149: af/d7/5f", " 150: af/d7/87", " 151: af/d7/af", " 152: af/d7/d7", " 153: af/d7/ff")] ); + push(@arr, [( " 154: af/ff/00", " 155: af/ff/5f", " 156: af/ff/87", " 157: af/ff/af", " 158: af/ff/d7", " 159: af/ff/ff")] ); + push(@arr, [( " 160: d7/00/00", " 161: d7/00/5f", " 162: d7/00/87", " 163: d7/00/af", " 164: d7/00/d7", " 165: d7/00/ff")] ); + push(@arr, [( " 166: d7/5f/00", " 167: d7/5f/5f", " 168: d7/5f/87", " 169: d7/5f/af", " 170: d7/5f/d7", " 171: d7/5f/ff")] ); + push(@arr, [( " 172: d7/87/00", " 173: d7/87/5f", " 174: d7/87/87", " 175: d7/87/af", " 176: d7/87/d7", " 177: d7/87/ff")] ); + push(@arr, [( " 178: d7/af/00", " 179: d7/af/5f", " 180: d7/af/87", " 181: d7/af/af", " 182: d7/af/d7", " 183: d7/af/ff")] ); + push(@arr, [( " 184: d7/d7/00", " 185: d7/d7/5f", " 186: d7/d7/87", " 187: d7/d7/af", " 188: d7/d7/d7", " 189: d7/d7/ff")] ); + push(@arr, [( " 190: d7/ff/00", " 191: d7/ff/5f", " 192: d7/ff/87", " 193: d7/ff/af", " 194: d7/ff/d7", " 195: d7/ff/ff")] ); + push(@arr, [( " 196: ff/00/00", " 197: ff/00/5f", " 198: ff/00/87", " 199: ff/00/af", " 200: ff/00/d7", " 201: ff/00/ff")] ); + push(@arr, [( " 202: ff/5f/00", " 203: ff/5f/5f", " 204: ff/5f/87", " 205: ff/5f/af", " 206: ff/5f/d7", " 207: ff/5f/ff")] ); + push(@arr, [( " 208: ff/87/00", " 209: ff/87/5f", " 210: ff/87/87", " 211: ff/87/af", " 212: ff/87/d7", " 213: ff/87/ff")] ); + push(@arr, [( " 214: ff/af/00", " 215: ff/af/5f", " 216: ff/af/87", " 217: ff/af/af", " 218: ff/af/d7", " 219: ff/af/ff")] ); + push(@arr, [( " 220: ff/d7/00", " 221: ff/d7/5f", " 222: ff/d7/87", " 223: ff/d7/af", " 224: ff/d7/d7", " 225: ff/d7/ff")] ); + push(@arr, [( " 226: ff/ff/00", " 227: ff/ff/5f", " 228: ff/ff/87", " 229: ff/ff/af", " 230: ff/ff/d7", " 231: ff/ff/ff")] ); + push(@arr, [( " 232: 08/08/08", " 233: 12/12/12", " 234: 1c/1c/1c", " 235: 26/26/26", " 236: 30/30/30", " 237: 3a/3a/3a")] ); + push(@arr, [( " 238: 44/44/44", " 239: 4e/4e/4e", " 240: 58/58/58", " 241: 62/62/62", " 242: 6c/6c/6c", " 243: 76/76/76")] ); + push(@arr, [( " 244: 80/80/80", " 245: 8a/8a/8a", " 246: 94/94/94", " 247: 9e/9e/9e", " 248: a8/a8/a8", " 249: b2/b2/b2")] ); + push(@arr, [( " 250: bc/bc/bc", " 251: c6/c6/c6", " 252: d0/d0/d0", " 253: da/da/da", " 254: e4/e4/e4", " 255: ee/ee/ee")] ); + + if( $ARGV[0] eq "-s" || $ARGV[1] eq "-s" || $ARGV[2] eq "-s" ){ + $padding = " "; + } + else { + + } + + # display in reverse order + if( $ARGV[0] eq "-r" || $ARGV[1] eq "-r" || $ARGV[2] eq "-r" ){ + for( $dimone = 0; $dimone < scalar @arr; $dimone++ ) { + + $seed = ($dimone % 6) * -1; + for( $dimtwo = 0; $dimtwo < 6; $dimtwo++ ) { + + $movone = $seed; + $movtwo = $seed * -1; + + print $arr[$dimone][$dimtwo] . $padding; + + $seed = $seed+1; + } + + print "\n"; + } + } + else { + for( $dimone = 0; $dimone < scalar @arr; $dimone++ ) { + + $seed = ($dimone % 6) * -1; + for( $dimtwo = 0; $dimtwo < 6; $dimtwo++ ) { + + $movone = $seed; + $movtwo = $seed * -1; + + $newone = $dimone+$movone; + $newtwo = $dimtwo+$movtwo; + + if( $newone < scalar @arr ){ + print $arr[$newone][$newtwo] . $padding; + } + + $seed = $seed+1; + } + + print "\n"; + } + } + print "\n"; + print "\n"; + +} +else { + print " 16: 00/00/00\n"; + print " 17: 00/00/5f\n"; + print " 18: 00/00/87\n"; + print " 19: 00/00/af\n"; + print " 20: 00/00/d7\n"; + print " 21: 00/00/ff\n"; + print " 22: 00/5f/00\n"; + print " 23: 00/5f/5f\n"; + print " 24: 00/5f/87\n"; + print " 25: 00/5f/af\n"; + print " 26: 00/5f/d7\n"; + print " 27: 00/5f/ff\n"; + print " 28: 00/87/00\n"; + print " 29: 00/87/5f\n"; + print " 30: 00/87/87\n"; + print " 31: 00/87/af\n"; + print " 32: 00/87/d7\n"; + print " 33: 00/87/ff\n"; + print " 34: 00/af/00\n"; + print " 35: 00/af/5f\n"; + print " 36: 00/af/87\n"; + print " 37: 00/af/af\n"; + print " 38: 00/af/d7\n"; + print " 39: 00/af/ff\n"; + print " 40: 00/d7/00\n"; + print " 41: 00/d7/5f\n"; + print " 42: 00/d7/87\n"; + print " 43: 00/d7/af\n"; + print " 44: 00/d7/d7\n"; + print " 45: 00/d7/ff\n"; + print " 46: 00/ff/00\n"; + print " 47: 00/ff/5f\n"; + print " 48: 00/ff/87\n"; + print " 49: 00/ff/af\n"; + print " 50: 00/ff/d7\n"; + print " 51: 00/ff/ff\n"; + print " 52: 5f/00/00\n"; + print " 53: 5f/00/5f\n"; + print " 54: 5f/00/87\n"; + print " 55: 5f/00/af\n"; + print " 56: 5f/00/d7\n"; + print " 57: 5f/00/ff\n"; + print " 58: 5f/5f/00\n"; + print " 59: 5f/5f/5f\n"; + print " 60: 5f/5f/87\n"; + print " 61: 5f/5f/af\n"; + print " 62: 5f/5f/d7\n"; + print " 63: 5f/5f/ff\n"; + print " 64: 5f/87/00\n"; + print " 65: 5f/87/5f\n"; + print " 66: 5f/87/87\n"; + print " 67: 5f/87/af\n"; + print " 68: 5f/87/d7\n"; + print " 69: 5f/87/ff\n"; + print " 70: 5f/af/00\n"; + print " 71: 5f/af/5f\n"; + print " 72: 5f/af/87\n"; + print " 73: 5f/af/af\n"; + print " 74: 5f/af/d7\n"; + print " 75: 5f/af/ff\n"; + print " 76: 5f/d7/00\n"; + print " 77: 5f/d7/5f\n"; + print " 78: 5f/d7/87\n"; + print " 79: 5f/d7/af\n"; + print " 80: 5f/d7/d7\n"; + print " 81: 5f/d7/ff\n"; + print " 82: 5f/ff/00\n"; + print " 83: 5f/ff/5f\n"; + print " 84: 5f/ff/87\n"; + print " 85: 5f/ff/af\n"; + print " 86: 5f/ff/d7\n"; + print " 87: 5f/ff/ff\n"; + print " 88: 87/00/00\n"; + print " 89: 87/00/5f\n"; + print " 90: 87/00/87\n"; + print " 91: 87/00/af\n"; + print " 92: 87/00/d7\n"; + print " 93: 87/00/ff\n"; + print " 94: 87/5f/00\n"; + print " 95: 87/5f/5f\n"; + print " 96: 87/5f/87\n"; + print " 97: 87/5f/af\n"; + print " 98: 87/5f/d7\n"; + print " 99: 87/5f/ff\n"; + print " 100 :87/87/00\n"; + print " 101 :87/87/5f\n"; + print " 102 :87/87/87\n"; + print " 103 :87/87/af\n"; + print " 104 :87/87/d7\n"; + print " 105 :87/87/ff\n"; + print " 106 :87/af/00\n"; + print " 107 :87/af/5f\n"; + print " 108 :87/af/87\n"; + print " 109 :87/af/af\n"; + print " 110 :87/af/d7\n"; + print " 111 :87/af/ff\n"; + print " 112 :87/d7/00\n"; + print " 113 :87/d7/5f\n"; + print " 114 :87/d7/87\n"; + print " 115 :87/d7/af\n"; + print " 116 :87/d7/d7\n"; + print " 117 :87/d7/ff\n"; + print " 118 :87/ff/00\n"; + print " 119 :87/ff/5f\n"; + print " 120 :87/ff/87\n"; + print " 121 :87/ff/af\n"; + print " 122 :87/ff/d7\n"; + print " 123 :87/ff/ff\n"; + print " 124 :af/00/00\n"; + print " 125 :af/00/5f\n"; + print " 126 :af/00/87\n"; + print " 127 :af/00/af\n"; + print " 128 :af/00/d7\n"; + print " 129 :af/00/ff\n"; + print " 130 :af/5f/00\n"; + print " 131 :af/5f/5f\n"; + print " 132 :af/5f/87\n"; + print " 133 :af/5f/af\n"; + print " 134 :af/5f/d7\n"; + print " 135 :af/5f/ff\n"; + print " 136 :af/87/00\n"; + print " 137 :af/87/5f\n"; + print " 138 :af/87/87\n"; + print " 139 :af/87/af\n"; + print " 140 :af/87/d7\n"; + print " 141 :af/87/ff\n"; + print " 142 :af/af/00\n"; + print " 143 :af/af/5f\n"; + print " 144 :af/af/87\n"; + print " 145 :af/af/af\n"; + print " 146 :af/af/d7\n"; + print " 147 :af/af/ff\n"; + print " 148 :af/d7/00\n"; + print " 149 :af/d7/5f\n"; + print " 150 :af/d7/87\n"; + print " 151 :af/d7/af\n"; + print " 152 :af/d7/d7\n"; + print " 153 :af/d7/ff\n"; + print " 154 :af/ff/00\n"; + print " 155 :af/ff/5f\n"; + print " 156 :af/ff/87\n"; + print " 157 :af/ff/af\n"; + print " 158 :af/ff/d7\n"; + print " 159 :af/ff/ff\n"; + print " 160 :d7/00/00\n"; + print " 161 :d7/00/5f\n"; + print " 162 :d7/00/87\n"; + print " 163 :d7/00/af\n"; + print " 164 :d7/00/d7\n"; + print " 165 :d7/00/ff\n"; + print " 166 :d7/5f/00\n"; + print " 167 :d7/5f/5f\n"; + print " 168 :d7/5f/87\n"; + print " 169 :d7/5f/af\n"; + print " 170 :d7/5f/d7\n"; + print " 171 :d7/5f/ff\n"; + print " 172 :d7/87/00\n"; + print " 173 :d7/87/5f\n"; + print " 174 :d7/87/87\n"; + print " 175 :d7/87/af\n"; + print " 176 :d7/87/d7\n"; + print " 177 :d7/87/ff\n"; + print " 178 :d7/af/00\n"; + print " 179 :d7/af/5f\n"; + print " 180 :d7/af/87\n"; + print " 181 :d7/af/af\n"; + print " 182 :d7/af/d7\n"; + print " 183 :d7/af/ff\n"; + print " 184 :d7/d7/00\n"; + print " 185 :d7/d7/5f\n"; + print " 186 :d7/d7/87\n"; + print " 187 :d7/d7/af\n"; + print " 188 :d7/d7/d7\n"; + print " 189 :d7/d7/ff\n"; + print " 190 :d7/ff/00\n"; + print " 191 :d7/ff/5f\n"; + print " 192 :d7/ff/87\n"; + print " 193 :d7/ff/af\n"; + print " 194 :d7/ff/d7\n"; + print " 195 :d7/ff/ff\n"; + print " 196 :ff/00/00\n"; + print " 197 :ff/00/5f\n"; + print " 198 :ff/00/87\n"; + print " 199 :ff/00/af\n"; + print " 200 :ff/00/d7\n"; + print " 201 :ff/00/ff\n"; + print " 202 :ff/5f/00\n"; + print " 203 :ff/5f/5f\n"; + print " 204 :ff/5f/87\n"; + print " 205 :ff/5f/af\n"; + print " 206 :ff/5f/d7\n"; + print " 207 :ff/5f/ff\n"; + print " 208 :ff/87/00\n"; + print " 209 :ff/87/5f\n"; + print " 210 :ff/87/87\n"; + print " 211 :ff/87/af\n"; + print " 212 :ff/87/d7\n"; + print " 213 :ff/87/ff\n"; + print " 214 :ff/af/00\n"; + print " 215 :ff/af/5f\n"; + print " 216 :ff/af/87\n"; + print " 217 :ff/af/af\n"; + print " 218 :ff/af/d7\n"; + print " 219 :ff/af/ff\n"; + print " 220 :ff/d7/00\n"; + print " 221 :ff/d7/5f\n"; + print " 222 :ff/d7/87\n"; + print " 223 :ff/d7/af\n"; + print " 224 :ff/d7/d7\n"; + print " 225 :ff/d7/ff\n"; + print " 226 :ff/ff/00\n"; + print " 227 :ff/ff/5f\n"; + print " 228 :ff/ff/87\n"; + print " 229 :ff/ff/af\n"; + print " 230 :ff/ff/d7\n"; + print " 231 :ff/ff/ff\n"; + print " 232 :08/08/08\n"; + print " 233 :12/12/12\n"; + print " 234 :1c/1c/1c\n"; + print " 235 :26/26/26\n"; + print " 236 :30/30/30\n"; + print " 237 :3a/3a/3a\n"; + print " 238 :44/44/44\n"; + print " 239 :4e/4e/4e\n"; + print " 240 :58/58/58\n"; + print " 241 :62/62/62\n"; + print " 242 :6c/6c/6c\n"; + print " 243 :76/76/76\n"; + print " 244 :80/80/80\n"; + print " 245 :8a/8a/8a\n"; + print " 246 :94/94/94\n"; + print " 247 :9e/9e/9e\n"; + print " 248 :a8/a8/a8\n"; + print " 249 :b2/b2/b2\n"; + print " 250 :bc/bc/bc\n"; + print " 251 :c6/c6/c6\n"; + print " 252 :d0/d0/d0\n"; + print " 253 :da/da/da\n"; + print " 254 :e4/e4/e4\n"; + print " 255 :ee/ee/ee\n"; + print "\n"; + print "\n"; +} +print "0m"; +exit; diff --git a/bin/genilog.cmd b/bin/genilog.cmd index b015974..740bdf7 100644 --- a/bin/genilog.cmd +++ b/bin/genilog.cmd @@ -1,2 +1 @@ -:@call python %~dp0\genilog.py %* -@call "c:\program files (x86)\python35-32\python.exe" c:\users\59698\repos\genilog\genilog.py %* +@call "c:\program files (x86)\python35-32\python.exe" C:\Projects\repos\grundfos\jaz\genilog\genilog.py %* diff --git a/bin/git-diffall.sh b/bin/git-diffall.sh index 2ae11ea..25fdda9 100644 --- a/bin/git-diffall.sh +++ b/bin/git-diffall.sh @@ -1,277 +1,277 @@ -#!/bin/sh -# Copyright 2010 - 2012, Tim Henigan -# -# 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 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. - - -# Perform a directory diff between commits in the repository using -# the external diff or merge tool specified in the user's config. - -USAGE='[--cached] [--copy-back] [-x|--extcmd=] {0,2} [-- *] - - --cached Compare to the index rather than the working tree. - - --copy-back Copy files back to the working tree when the diff - tool exits (in case they were modified by the - user). This option is only valid if the diff - compared with the working tree. - - -x= - --extcmd= Specify a custom command for viewing diffs. - git-diffall ignores the configured defaults and - runs $command $LOCAL $REMOTE when this option is - specified. Additionally, $BASE is set in the - environment. -' - -SUBDIRECTORY_OK=1 -. "$(git --exec-path)/git-sh-setup" - -TOOL_MODE=diff -. "$(git --exec-path)/git-mergetool--lib" - -merge_tool="$(get_merge_tool)" -if test -z "$merge_tool" -then - echo "Error: Either the 'diff.tool' or 'merge.tool' option must be set." - usage -fi - -start_dir=$(pwd) - -# All the file paths returned by the diff command are relative to the root -# of the working copy. So if the script is called from a subdirectory, it -# must switch to the root of working copy before trying to use those paths. -cdup=$(git rev-parse --show-cdup) && -cd "$cdup" || { - echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree" - exit 1 -} - -# set up temp dir -tmp=$(perl -e 'use File::Temp qw(tempdir); - $t=tempdir("/tmp/git-diffall.XXXXX") or exit(1); - print $t') || exit 1 -#trap 'rm -rf "$tmp"' EXIT - -left= -right= -paths= -dashdash_seen= -compare_staged= -merge_base= -left_dir= -right_dir= -diff_tool= -copy_back= - -while test $# != 0 -do - case "$1" in - -h|--h|--he|--hel|--help) - usage - ;; - --cached) - compare_staged=1 - ;; - --copy-back) - copy_back=1 - ;; - -x|--e|--ex|--ext|--extc|--extcm|--extcmd) - if test $# = 1 - then - echo You must specify the tool for use with --extcmd - usage - else - diff_tool=$2 - shift - fi - ;; - --) - dashdash_seen=1 - ;; - -*) - echo Invalid option: "$1" - usage - ;; - *) - # could be commit, commit range or path limiter - case "$1" in - *...*) - left=${1%...*} - right=${1#*...} - merge_base=1 - ;; - *..*) - left=${1%..*} - right=${1#*..} - ;; - *) - if test -n "$dashdash_seen" - then - paths="$paths$1 " - elif test -z "$left" - then - left=$1 - elif test -z "$right" - then - right=$1 - else - paths="$paths$1 " - fi - ;; - esac - ;; - esac - shift -done - -# Determine the set of files which changed -if test -n "$left" && test -n "$right" -then - left_dir="cmt-$(git rev-parse --short $left)" - right_dir="cmt-$(git rev-parse --short $right)" - - if test -n "$compare_staged" - then - usage - elif test -n "$merge_base" - then - git diff --name-only "$left"..."$right" -- $paths >"$tmp/filelist" - else - git diff --name-only "$left" "$right" -- $paths >"$tmp/filelist" - fi -elif test -n "$left" -then - left_dir="cmt-$(git rev-parse --short $left)" - - if test -n "$compare_staged" - then - right_dir="staged" - git diff --name-only --cached "$left" -- $paths >"$tmp/filelist" - else - right_dir="working_tree" - git diff --name-only "$left" -- $paths >"$tmp/filelist" - fi -else - left_dir="HEAD" - - if test -n "$compare_staged" - then - right_dir="staged" - git diff --name-only --cached -- $paths >"$tmp/filelist" - else - right_dir="working_tree" - git diff --name-only -- $paths >"$tmp/filelist" - fi -fi - -# Exit immediately if there are no diffs -if test ! -s "$tmp/filelist" -then - exit 0 -fi - -if test -n "$copy_back" && test "$right_dir" != "working_tree" -then - echo "--copy-back is only valid when diff includes the working tree." - exit 1 -fi - -# Create the named tmp directories that will hold the files to be compared -mkdir -p "$tmp/$left_dir" "$tmp/$right_dir" - -# Populate the tmp/right_dir directory with the files to be compared -while read name -do - if test -n "$right" - then - ls_list=$(git ls-tree $right "$name") - if test -n "$ls_list" - then - mkdir -p "$tmp/$right_dir/$(dirname "$name")" - git show "$right":"$name" >"$tmp/$right_dir/$name" || true - fi - elif test -n "$compare_staged" - then - ls_list=$(git ls-files -- "$name") - if test -n "$ls_list" - then - mkdir -p "$tmp/$right_dir/$(dirname "$name")" - git show :"$name" >"$tmp/$right_dir/$name" - fi - else - if test -e "$name" - then - mkdir -p "$tmp/$right_dir/$(dirname "$name")" - cp "$name" "$tmp/$right_dir/$name" - fi - fi -done < "$tmp/filelist" - -# Populate the tmp/left_dir directory with the files to be compared -while read name -do - if test -n "$left" - then - ls_list=$(git ls-tree $left "$name") - if test -n "$ls_list" - then - mkdir -p "$tmp/$left_dir/$(dirname "$name")" - git show "$left":"$name" >"$tmp/$left_dir/$name" || true - fi - else - if test -n "$compare_staged" - then - ls_list=$(git ls-tree HEAD "$name") - if test -n "$ls_list" - then - mkdir -p "$tmp/$left_dir/$(dirname "$name")" - git show HEAD:"$name" >"$tmp/$left_dir/$name" - fi - else - mkdir -p "$tmp/$left_dir/$(dirname "$name")" - git show :"$name" >"$tmp/$left_dir/$name" - fi - fi -done < "$tmp/filelist" - -LOCAL="$tmp/$left_dir" -REMOTE="$tmp/$right_dir" - -if test -n "$diff_tool" -then - export BASE - eval $diff_tool '"$LOCAL"' '"$REMOTE"' -else - run_merge_tool "$merge_tool" false -fi - -# Copy files back to the working dir, if requested -if test -n "$copy_back" && test "$right_dir" = "working_tree" -then - cd "$start_dir" - git_top_dir=$(git rev-parse --show-toplevel) - find "$tmp/$right_dir" -type f | - while read file - do - cp "$file" "$git_top_dir/${file#$tmp/$right_dir/}" - done +#!/bin/sh +# Copyright 2010 - 2012, Tim Henigan +# +# 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 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. + + +# Perform a directory diff between commits in the repository using +# the external diff or merge tool specified in the user's config. + +USAGE='[--cached] [--copy-back] [-x|--extcmd=] {0,2} [-- *] + + --cached Compare to the index rather than the working tree. + + --copy-back Copy files back to the working tree when the diff + tool exits (in case they were modified by the + user). This option is only valid if the diff + compared with the working tree. + + -x= + --extcmd= Specify a custom command for viewing diffs. + git-diffall ignores the configured defaults and + runs $command $LOCAL $REMOTE when this option is + specified. Additionally, $BASE is set in the + environment. +' + +SUBDIRECTORY_OK=1 +. "$(git --exec-path)/git-sh-setup" + +TOOL_MODE=diff +. "$(git --exec-path)/git-mergetool--lib" + +merge_tool="$(get_merge_tool)" +if test -z "$merge_tool" +then + echo "Error: Either the 'diff.tool' or 'merge.tool' option must be set." + usage +fi + +start_dir=$(pwd) + +# All the file paths returned by the diff command are relative to the root +# of the working copy. So if the script is called from a subdirectory, it +# must switch to the root of working copy before trying to use those paths. +cdup=$(git rev-parse --show-cdup) && +cd "$cdup" || { + echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree" + exit 1 +} + +# set up temp dir +tmp=$(perl -e 'use File::Temp qw(tempdir); + $t=tempdir("/tmp/git-diffall.XXXXX") or exit(1); + print $t') || exit 1 +#trap 'rm -rf "$tmp"' EXIT + +left= +right= +paths= +dashdash_seen= +compare_staged= +merge_base= +left_dir= +right_dir= +diff_tool= +copy_back= + +while test $# != 0 +do + case "$1" in + -h|--h|--he|--hel|--help) + usage + ;; + --cached) + compare_staged=1 + ;; + --copy-back) + copy_back=1 + ;; + -x|--e|--ex|--ext|--extc|--extcm|--extcmd) + if test $# = 1 + then + echo You must specify the tool for use with --extcmd + usage + else + diff_tool=$2 + shift + fi + ;; + --) + dashdash_seen=1 + ;; + -*) + echo Invalid option: "$1" + usage + ;; + *) + # could be commit, commit range or path limiter + case "$1" in + *...*) + left=${1%...*} + right=${1#*...} + merge_base=1 + ;; + *..*) + left=${1%..*} + right=${1#*..} + ;; + *) + if test -n "$dashdash_seen" + then + paths="$paths$1 " + elif test -z "$left" + then + left=$1 + elif test -z "$right" + then + right=$1 + else + paths="$paths$1 " + fi + ;; + esac + ;; + esac + shift +done + +# Determine the set of files which changed +if test -n "$left" && test -n "$right" +then + left_dir="cmt-$(git rev-parse --short $left)" + right_dir="cmt-$(git rev-parse --short $right)" + + if test -n "$compare_staged" + then + usage + elif test -n "$merge_base" + then + git diff --name-only "$left"..."$right" -- $paths >"$tmp/filelist" + else + git diff --name-only "$left" "$right" -- $paths >"$tmp/filelist" + fi +elif test -n "$left" +then + left_dir="cmt-$(git rev-parse --short $left)" + + if test -n "$compare_staged" + then + right_dir="staged" + git diff --name-only --cached "$left" -- $paths >"$tmp/filelist" + else + right_dir="working_tree" + git diff --name-only "$left" -- $paths >"$tmp/filelist" + fi +else + left_dir="HEAD" + + if test -n "$compare_staged" + then + right_dir="staged" + git diff --name-only --cached -- $paths >"$tmp/filelist" + else + right_dir="working_tree" + git diff --name-only -- $paths >"$tmp/filelist" + fi +fi + +# Exit immediately if there are no diffs +if test ! -s "$tmp/filelist" +then + exit 0 +fi + +if test -n "$copy_back" && test "$right_dir" != "working_tree" +then + echo "--copy-back is only valid when diff includes the working tree." + exit 1 +fi + +# Create the named tmp directories that will hold the files to be compared +mkdir -p "$tmp/$left_dir" "$tmp/$right_dir" + +# Populate the tmp/right_dir directory with the files to be compared +while read name +do + if test -n "$right" + then + ls_list=$(git ls-tree $right "$name") + if test -n "$ls_list" + then + mkdir -p "$tmp/$right_dir/$(dirname "$name")" + git show "$right":"$name" >"$tmp/$right_dir/$name" || true + fi + elif test -n "$compare_staged" + then + ls_list=$(git ls-files -- "$name") + if test -n "$ls_list" + then + mkdir -p "$tmp/$right_dir/$(dirname "$name")" + git show :"$name" >"$tmp/$right_dir/$name" + fi + else + if test -e "$name" + then + mkdir -p "$tmp/$right_dir/$(dirname "$name")" + cp "$name" "$tmp/$right_dir/$name" + fi + fi +done < "$tmp/filelist" + +# Populate the tmp/left_dir directory with the files to be compared +while read name +do + if test -n "$left" + then + ls_list=$(git ls-tree $left "$name") + if test -n "$ls_list" + then + mkdir -p "$tmp/$left_dir/$(dirname "$name")" + git show "$left":"$name" >"$tmp/$left_dir/$name" || true + fi + else + if test -n "$compare_staged" + then + ls_list=$(git ls-tree HEAD "$name") + if test -n "$ls_list" + then + mkdir -p "$tmp/$left_dir/$(dirname "$name")" + git show HEAD:"$name" >"$tmp/$left_dir/$name" + fi + else + mkdir -p "$tmp/$left_dir/$(dirname "$name")" + git show :"$name" >"$tmp/$left_dir/$name" + fi + fi +done < "$tmp/filelist" + +LOCAL="$tmp/$left_dir" +REMOTE="$tmp/$right_dir" + +if test -n "$diff_tool" +then + export BASE + eval $diff_tool '"$LOCAL"' '"$REMOTE"' +else + run_merge_tool "$merge_tool" false +fi + +# Copy files back to the working dir, if requested +if test -n "$copy_back" && test "$right_dir" = "working_tree" +then + cd "$start_dir" + git_top_dir=$(git rev-parse --show-toplevel) + find "$tmp/$right_dir" -type f | + while read file + do + cp "$file" "$git_top_dir/${file#$tmp/$right_dir/}" + done fi \ No newline at end of file diff --git a/bin/git-difftool.sh b/bin/git-difftool.sh index 19fdcd5..6260e94 100644 --- a/bin/git-difftool.sh +++ b/bin/git-difftool.sh @@ -1,3 +1,3 @@ -TOOL=vimdiff -ARG=$@ -$TOOL $ARG +TOOL=vimdiff +ARG=$@ +$TOOL $ARG diff --git a/bin/git-editor.sh b/bin/git-editor.sh index 0e904c2..10932c4 100644 --- a/bin/git-editor.sh +++ b/bin/git-editor.sh @@ -1,4 +1,4 @@ -#!/bin/bash -TOOL=vim -ARG=$@ -$TOOL $ARG +#!/bin/bash +TOOL=vim +ARG=$@ +$TOOL $ARG diff --git a/bin/git-mergetool.sh b/bin/git-mergetool.sh index 3c1e79e..5837b55 100644 --- a/bin/git-mergetool.sh +++ b/bin/git-mergetool.sh @@ -1,4 +1,4 @@ -#! /bin/bash -TOOL=vimdiff -ARG=$@ -$TOOL $ARG +#! /bin/bash +TOOL=vimdiff +ARG=$@ +$TOOL $ARG diff --git a/bin/git-review b/bin/git-review index 9c1ba04..0a9a580 100644 --- a/bin/git-review +++ b/bin/git-review @@ -1,1219 +1,1219 @@ -#!/usr/bin/env python -from __future__ import print_function - -COPYRIGHT = """\ -Copyright (C) 2011-2012 OpenStack LLC. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -implied. - -See the License for the specific language governing permissions and -limitations under the License.""" - -import datetime -import json -import os -import re -import shlex -import subprocess -import sys -import time - -if sys.version < '3': - import ConfigParser - import urllib - import urlparse - urlopen = urllib.urlopen - urlparse = urlparse.urlparse - do_input = raw_input -else: - import configparser as ConfigParser - import urllib.parse - import urllib.request - urlopen = urllib.request.urlopen - urlparse = urllib.parse.urlparse - do_input = input - -from distutils import version as du_version - -version = "1.22" - -VERBOSE = False -UPDATE = False -CONFIGDIR = os.path.expanduser("~/.config/git-review") -GLOBAL_CONFIG = "/etc/git-review/git-review.conf" -USER_CONFIG = os.path.join(CONFIGDIR, "git-review.conf") -PYPI_URL = "http://pypi.python.org/pypi/git-review/json" -PYPI_CACHE_TIME = 60 * 60 * 24 # 24 hours -DEFAULTS = dict(hostname='gerrit.lud.stericsson.com', port='29418', project=False, - defaultbranch='master', defaultremote="gerrit", - defaultrebase="0") - -_branch_name = None -_has_color = None -_no_color_support = False - - -class colors: - yellow = '\033[33m' - green = '\033[92m' - reset = '\033[0m' - - -class GitReviewException(Exception): - pass - - -class CommandFailed(GitReviewException): - - def __init__(self, *args): - Exception.__init__(self, *args) - (self.rc, self.output, self.argv, self.envp) = args - self.quickmsg = dict([ - ("argv", " ".join(self.argv)), - ("rc", self.rc), - ("output", self.output)]) - - def __str__(self): - return self.__doc__ + """ -The following command failed with exit code %(rc)d - "%(argv)s" ------------------------ -%(output)s ------------------------""" % self.quickmsg - - -class ChangeSetException(GitReviewException): - - def __init__(self, e): - GitReviewException.__init__(self) - self.e = str(e) - - def __str__(self): - return self.__doc__ % self.e - - -def parse_review_number(review): - parts = review.split(',') - if len(parts) < 2: - parts.append(None) - return parts - - -def build_review_number(review, patchset): - if patchset is not None: - return '%s,%s' % (review, patchset) - return review - - -def run_command_status(*argv, **env): - if VERBOSE: - print(datetime.datetime.now(), "Running:", " ".join(argv)) - if len(argv) == 1: - argv = shlex.split(str(argv[0])) - newenv = os.environ - newenv.update(env) - p = subprocess.Popen(argv, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, env=newenv) - (out, nothing) = p.communicate() - out = out.decode('utf-8') - return (p.returncode, out.strip()) - - -def run_command(*argv, **env): - (rc, output) = run_command_status(*argv, **env) - return output - - -def run_command_exc(klazz, *argv, **env): - """Run command *argv, on failure raise 'klazz - - klass should be derived from CommandFailed - """ - (rc, output) = run_command_status(*argv, **env) - if rc != 0: - raise klazz(rc, output, argv, env) - return output - - -def update_latest_version(version_file_path): - """Cache the latest version of git-review for the upgrade check.""" - - if not os.path.exists(CONFIGDIR): - os.makedirs(CONFIGDIR) - - if os.path.exists(version_file_path) and not UPDATE: - if (time.time() - os.path.getmtime(version_file_path)) < 28800: - return - - latest_version = version - try: - latest_version = json.load(urlopen(PYPI_URL))['info']['version'] - except Exception: - pass - - with open(version_file_path, "w") as version_file: - version_file.write(latest_version) - - -def latest_is_newer(): - """Check if there is a new version of git-review.""" - - # Skip version check if distro package turns it off - if os.path.exists(GLOBAL_CONFIG): - config = dict(check=False) - configParser = ConfigParser.ConfigParser(config) - configParser.read(GLOBAL_CONFIG) - if not configParser.getboolean("updates", "check"): - return False - - version_file_path = os.path.join(CONFIGDIR, "latest-version") - update_latest_version(version_file_path) - - latest_version = None - with open(version_file_path, "r") as version_file: - latest_version = du_version.StrictVersion(version_file.read()) - if latest_version > du_version.StrictVersion(version): - return True - return False - - -def git_directories(): - """Determine (absolute git work directory path, .git subdirectory path).""" - cmd = ("git", "rev-parse", "--show-toplevel", "--git-dir") - out = run_command_exc(GitDirectoriesException, *cmd) - try: - return out.split() - except ValueError: - raise GitDirectoriesException(0, out, cmd, {}) - - -class GitDirectoriesException(CommandFailed): - "Cannot determine where .git directory is." - EXIT_CODE = 70 - - -class CustomScriptException(CommandFailed): - """Custom script execution failed.""" - EXIT_CODE = 71 - - -def run_custom_script(action): - """Get status and output of .git/hooks/$action-review or/and - ~/.config/hooks/$action-review if existing. - """ - returns = [] - script_file = "%s-review" % (action) - (top_dir, git_dir) = git_directories() - paths = [os.path.join(CONFIGDIR, "hooks", script_file), - os.path.join(git_dir, "hooks", script_file)] - for fpath in paths: - if os.path.isfile(fpath) and os.access(fpath, os.X_OK): - status, output = run_command_status(fpath) - returns.append((status, output, fpath)) - - for (status, output, path) in returns: - if status is not None and status != 0: - raise CustomScriptException(status, output, [path], {}) - elif output and VERBOSE: - print("script %s output is:" % (path)) - print(output) - - -def git_config_get_value(section, option, default=None): - try: - return run_command_exc(GitConfigException, - "git", "config", - "--get", - "%s.%s" % (section, option)).strip() - except GitConfigException as exc: - if exc.rc == 1: - return default - raise - - -class GitConfigException(CommandFailed): - """Git config value retrieval failed.""" - EXIT_CODE = 128 - - -class CannotInstallHook(CommandFailed): - "Problems encountered installing commit-msg hook" - EXIT_CODE = 2 - - -def set_hooks_commit_msg(remote, target_file): - """Install the commit message hook if needed.""" - - # Create the hooks directory if it's not there already - hooks_dir = os.path.dirname(target_file) - if not os.path.isdir(hooks_dir): - os.mkdir(hooks_dir) - - (hostname, username, port, project_name) = \ - parse_git_show(remote, "Push") - - if not os.path.exists(target_file) or UPDATE: - if VERBOSE: - print("Fetching commit hook from: scp://%s:%s" % (hostname, port)) - if port is not None: - port = "-P %s" % port - else: - port = "" - if username is None: - userhost = hostname - else: - userhost = "%s@%s" % (username, hostname) - run_command_exc( - CannotInstallHook, - "scp", port, - userhost + ":hooks/commit-msg", - target_file) - - if not os.access(target_file, os.X_OK): - os.chmod(target_file, os.path.stat.S_IREAD | os.path.stat.S_IEXEC) - - -def test_remote(username, hostname, port, project): - """Tests that a possible gerrit remote works.""" - - if port is not None: - port = "-p %s" % port - else: - port = "" - if username is None: - userhost = hostname - else: - userhost = "%s@%s" % (username, hostname) - - (status, ssh_output) = run_command_status( - "ssh", "-x", port, userhost, - "gerrit", "ls-projects") - - if status == 0: - if VERBOSE: - print("%s@%s:%s worked." % (username, hostname, port)) - return True - else: - if VERBOSE: - print("%s@%s:%s did not work." % (username, hostname, port)) - return False - - -def make_remote_url(username, hostname, port, project): - """Builds a gerrit remote URL.""" - if username is None: - return "ssh://%s:%s/%s" % (hostname, port, project) - else: - return "ssh://%s@%s:%s/%s" % (username, hostname, port, project) - - -def add_remote(hostname, port, project, remote): - """Adds a gerrit remote.""" - asked_for_username = False - - username = os.getenv("USERNAME") - if not username: - username = git_config_get_value("gitreview", "username") - if not username: - username = os.getenv("USER") - if port is None: - port = 29418 - - remote_url = make_remote_url(username, hostname, port, project) - if VERBOSE: - print("No remote set, testing %s" % remote_url) - if not test_remote(username, hostname, port, project): - print("Could not connect to gerrit.") - username = do_input("Enter your gerrit username: ") - remote_url = make_remote_url(username, hostname, port, project) - print("Trying again with %s" % remote_url) - if not test_remote(username, hostname, port, project): - raise Exception("Could not connect to gerrit at %s" % remote_url) - asked_for_username = True - - print("Creating a git remote called \"%s\" that maps to:" % remote) - print("\t%s" % remote_url) - cmd = "git remote add -f %s %s" % (remote, remote_url) - (status, remote_output) = run_command_status(cmd) - - if status != 0: - raise Exception("Error running %s" % cmd) - - if asked_for_username: - print() - print("This repository is now set up for use with git-review.") - print("You can set the default username for future repositories with:") - print(' git config --global --add gitreview.username "%s"' % username) - print() - - -def parse_git_show(remote, verb): - fetch_url = "" - for line in run_command("git remote show -n %s" % remote).split("\n"): - if line.strip().startswith("%s" % verb): - fetch_url = line.split()[2] - - parsed_url = urlparse(fetch_url) - project_name = parsed_url.path.lstrip("/") - if project_name.endswith(".git"): - project_name = project_name[:-4] - - hostname = parsed_url.netloc - username = None - port = parsed_url.port - - if VERBOSE: - print("Found origin %s URL:" % verb, fetch_url) - - # Workaround bug in urlparse on OSX - if parsed_url.scheme == "ssh" and parsed_url.path[:2] == "//": - hostname = parsed_url.path[2:].split("/")[0] - - if "@" in hostname: - (username, hostname) = hostname.split("@") - if ":" in hostname: - (hostname, port) = hostname.split(":") - - # Is origin an ssh location? Let's pull more info - if parsed_url.scheme == "ssh" and port is None: - port = 22 - - return (hostname, username, str(port), project_name) - - -def check_color_support(): - global _has_color - global _no_color_support - if _has_color is None: - test_command = "git log --color=never --oneline HEAD^1..HEAD" - (status, output) = run_command_status(test_command) - if status == 0: - _has_color = True - else: - _has_color = False - - if _no_color_support: - _has_color = False - - return _has_color - - -def get_config(config_file=None): - """Generate the configuration map by starting with some built-in defaults - and then loading GLOBAL_CONFIG, USER_CONFIG, and a repository-specific - .gitreview file, if they exist. In case of conflict, the configuration file - with the narrowest scope wins. - """ - config = DEFAULTS.copy() - for filename in (GLOBAL_CONFIG, USER_CONFIG, config_file): - if filename is not None and os.path.exists(filename): - config.update(load_config_file(filename)) - return config - - -def load_config_file(config_file): - """Load configuration options from a file.""" - configParser = ConfigParser.ConfigParser() - configParser.read(config_file) - options = { - 'hostname': 'host', - 'port': 'port', - 'project': 'project', - 'defaultbranch': 'defaultbranch', - 'defaultremote': 'defaultremote', - 'defaultrebase': 'defaultrebase', - } - config = {} - for config_key, option_name in options.items(): - if configParser.has_option('gerrit', option_name): - config[config_key] = configParser.get('gerrit', option_name) - return config - - -def update_remote(remote): - cmd = "git remote update %s" % remote - (status, output) = run_command_status(cmd) - if VERBOSE: - print(output) - if status != 0: - print("Problem running '%s'" % cmd) - if not VERBOSE: - print(output) - return False - return True - - -def check_remote(branch, remote, hostname, port, project): - """Check that a Gerrit Git remote repo exists, if not, set one.""" - - has_color = check_color_support() - if has_color: - color_never = "--color=never" - else: - color_never = "" - - if remote in run_command("git remote").split("\n"): - - remotes = run_command("git branch -a %s" % color_never).split("\n") - for current_remote in remotes: - if (current_remote.strip() == "remotes/%s/%s" % (remote, branch) - and not UPDATE): - return - # We have the remote, but aren't set up to fetch. Fix it - if VERBOSE: - print("Setting up gerrit branch tracking for better rebasing") - update_remote(remote) - return - - if hostname is False or port is False or project is False: - # This means there was no .gitreview file - print("No '.gitreview' file found in this repository.") - print("We don't know where your gerrit is. Please manually create ") - print("a remote named \"%s\" and try again." % remote) - sys.exit(1) - - # Gerrit remote not present, try to add it - try: - add_remote(hostname, port, project, remote) - except Exception: - print(sys.exc_info()[2]) - print("We don't know where your gerrit is. Please manually create ") - print("a remote named \"%s\" and try again." % remote) - raise - - -def rebase_changes(branch, remote, interactive=True): - - remote_branch = "remotes/%s/%s" % (remote, branch) - - if not update_remote(remote): - return False - - if interactive: - cmd = "git rebase -i %s" % remote_branch - else: - cmd = "git rebase %s" % remote_branch - - (status, output) = run_command_status(cmd, GIT_EDITOR='true') - if status != 0: - print("Errors running %s" % cmd) - if interactive: - print(output) - return False - return True - - -def undo_rebase(): - cmd = "git reset --hard ORIG_HEAD" - (status, output) = run_command_status(cmd) - if status != 0: - print("Errors running %s" % cmd) - print(output) - return False - return True - - -def get_branch_name(target_branch): - global _branch_name - if _branch_name is not None: - return _branch_name - _branch_name = None - has_color = check_color_support() - if has_color: - color_never = "--color=never" - else: - color_never = "" - for branch in run_command("git branch %s" % color_never).split("\n"): - if branch.startswith('*'): - _branch_name = branch.split()[1].strip() - if _branch_name == "(no": - _branch_name = target_branch - return _branch_name - - -def assert_one_change(remote, branch, yes, have_hook): - has_color = check_color_support() - if has_color: - color = git_config_get_value("color", "ui") - if color is None: - color = "auto" - else: - color = color.lower() - if (color == "" or color == "true"): - color = "auto" - elif color == "false": - color = "never" - elif color == "auto": - # Python is not a tty, we have to force colors - color = "always" - use_color = "--color=%s" % color - else: - use_color = "" - cmd = "git log %s --decorate --oneline HEAD --not remotes/%s/%s --" % ( - use_color, remote, branch) - (status, output) = run_command_status(cmd) - if status != 0: - print("Had trouble running %s" % cmd) - print(output) - sys.exit(1) - output_lines = len(output.split("\n")) - if output_lines == 1 and not have_hook: - print("Your change was committed before the commit hook was installed") - print("Amending the commit to add a gerrit change id") - run_command("git commit --amend", GIT_EDITOR='true') - elif output_lines == 0: - print("No changes between HEAD and %s/%s." % (remote, branch)) - print("Submitting for review would be pointless.") - sys.exit(1) - elif output_lines > 1: - if not yes: - print("You have more than one commit" - " that you are about to submit.") - print("The outstanding commits are:\n\n%s\n" % output) - print("Is this really what you meant to do?") - yes_no = do_input("Type 'yes' to confirm: ") - if yes_no.lower().strip() != "yes": - print("Aborting.") - print("Please rebase/squash your changes and try again") - sys.exit(1) - - -def use_topic(why, topic): - """Inform the user about why a particular topic has been selected.""" - if VERBOSE: - print(why % ('"%s"' % topic,)) - return topic - - -def get_topic(target_branch): - - branch_name = get_branch_name(target_branch) - - branch_parts = branch_name.split("/") - if len(branch_parts) >= 3 and branch_parts[0] == "review": - return use_topic("Using change number %s " - "for the topic of the change submitted", - "/".join(branch_parts[2:])) - - log_output = run_command("git log HEAD^1..HEAD") - bug_re = r'\b([Bb]ug|[Ll][Pp])\s*[#:]?\s*(\d+)' - - match = re.search(bug_re, log_output) - if match is not None: - return use_topic("Using bug number %s " - "for the topic of the change submitted", - "bug/%s" % match.group(2)) - - bp_re = r'\b([Bb]lue[Pp]rint|[Bb][Pp])\s*[#:]?\s*([0-9a-zA-Z-_]+)' - match = re.search(bp_re, log_output) - if match is not None: - return use_topic("Using blueprint number %s " - "for the topic of the change submitted", - "bp/%s" % match.group(2)) - - return use_topic("Using local branch name %s " - "for the topic of the change submitted", - branch_name) - - -class CannotQueryOpenChangesets(CommandFailed): - "Cannot fetch review information from gerrit" - EXIT_CODE = 32 - - -class CannotParseOpenChangesets(ChangeSetException): - "Cannot parse JSON review information from gerrit" - EXIT_CODE = 33 - - -def list_reviews(remote): - - (hostname, username, port, project_name) = \ - parse_git_show(remote, "Push") - - if port is not None: - port = "-p %s" % port - else: - port = "" - if username is None: - userhost = hostname - else: - userhost = "%s@%s" % (username, hostname) - - review_info = None - output = run_command_exc( - CannotQueryOpenChangesets, - "ssh", "-x", port, userhost, - "gerrit", "query", - "--current-patch-set --format=JSON project:%s status:open reviewer:self" % project_name) - - review_list = [] - review_field_width = {} - REVIEW_FIELDS = ('number', 'currentPatchSet', 'branch', 'subject') - FIELDS = range(0, len(REVIEW_FIELDS)) - if check_color_support(): - review_field_color = (colors.yellow, colors.yellow, colors.green, "") - color_reset = colors.reset - else: - review_field_color = ("", "", "", "") - color_reset = "" - review_field_width = [0, 0, 0, 0] - review_field_format = ["%*s", "%*s", "%*s", "%*s"] - review_field_justify = [+1, +1, +1, -1] # -1 is justify to right - - for line in output.split("\n"): - # Warnings from ssh wind up in this output - if line[0] != "{": - print(line) - continue - try: - review_info = json.loads(line) - except Exception: - if VERBOSE: - print(output) - raise(CannotParseOpenChangesets, sys.exc_info()[1]) - - if 'type' in review_info: - break - - tempPS = review_info['currentPatchSet'] - appPS = tempPS['approvals'] - appValue = '-'; - for appLine in appPS: - appBy = appLine['by'] - appUser = appBy['username'] - if appUser == username: - appValue = appLine['value'] - review_info['currentPatchSet'] = tempPS['number'] + ' ' + appValue - - review_list.append([review_info[f] for f in REVIEW_FIELDS]) - for i in FIELDS: - review_field_width[i] = max( - review_field_width[i], - len(review_info[REVIEW_FIELDS[i]]) - ) - - review_field_format = " ".join([ - review_field_color[i] + - review_field_format[i] + - color_reset - for i in FIELDS]) - - review_field_width = [ - review_field_width[i] * review_field_justify[i] - for i in FIELDS] - for review_value in review_list: - # At this point we have review_field_format - # like "%*s %*s %*s" and we need to supply - # (width1, value1, width2, value2, ...) tuple to print - # It's easy to zip() widths with actual values, - # but we need to flatten the resulting - # ((width1, value1), (width2, value2), ...) map. - formatted_fields = [] - for (width, value) in zip(review_field_width, review_value): - formatted_fields.extend([width, value]) - print(review_field_format % tuple(formatted_fields)) - print("Found %d items for review" % review_info['rowCount']) - - return 0 - - -class CannotQueryPatchSet(CommandFailed): - "Cannot query patchset information" - EXIT_CODE = 34 - - -class ReviewInformationNotFound(ChangeSetException): - "Could not fetch review information for change %s" - EXIT_CODE = 35 - - -class ReviewNotFound(ChangeSetException): - "Gerrit review %s not found" - EXIT_CODE = 36 - - -class PatchSetGitFetchFailed(CommandFailed): - """Cannot fetch patchset contents - -Does specified change number belong to this project? -""" - EXIT_CODE = 37 - - -class PatchSetNotFound(ChangeSetException): - "Review patchset %s not found" - EXIT_CODE = 38 - - -class CheckoutNewBranchFailed(CommandFailed): - "Cannot checkout to new branch" - EXIT_CODE = 64 - - -class CheckoutExistingBranchFailed(CommandFailed): - "Cannot checkout existing branch" - EXIT_CODE = 65 - - -class ResetHardFailed(CommandFailed): - "Failed to hard reset downloaded branch" - EXIT_CODE = 66 - - -def fetch_review(review, masterbranch, remote): - - (hostname, username, port, project_name) = \ - parse_git_show(remote, "Push") - - if port is not None: - port = "-p %s" % port - else: - port = "" - if username is None: - userhost = hostname - else: - userhost = "%s@%s" % (username, hostname) - - review_arg = review - patchset_opt = '--current-patch-set' - - review, patchset_number = parse_review_number(review) - if patchset_number is not None: - patchset_opt = '--patch-sets' - - review_info = None - output = run_command_exc( - CannotQueryPatchSet, - "ssh", "-x", port, userhost, - "gerrit", "query", - "--format=JSON %s change:%s" % (patchset_opt, review)) - - review_jsons = output.split("\n") - found_review = False - for review_json in review_jsons: - try: - review_info = json.loads(review_json) - found_review = True - except Exception: - pass - if found_review: - break - if not found_review: - if VERBOSE: - print(output) - raise ReviewInformationNotFound(review) - - try: - if patchset_number is None: - refspec = review_info['currentPatchSet']['ref'] - else: - refspec = [ps for ps - in review_info['patchSets'] - if ps['number'] == patchset_number][0]['ref'] - except IndexError: - raise PatchSetNotFound(review_arg) - except KeyError: - raise ReviewNotFound(review) - - try: - topic = review_info['topic'] - if topic == masterbranch: - topic = review - except KeyError: - topic = review - try: - author = re.sub('\W+', '_', review_info['owner']['name']).lower() - except KeyError: - author = 'unknown' - - if patchset_number is None: - branch_name = "review/%s/%s" % (author, topic) - else: - branch_name = "review/%s/%s-patch%s" % (author, topic, patchset_number) - - print("Downloading %s from gerrit" % refspec) - run_command_exc(PatchSetGitFetchFailed, - "git", "fetch", remote, refspec) - return branch_name - - -def checkout_review(branch_name): - """Checkout a newly fetched (FETCH_HEAD) change - into a branch - """ - - try: - run_command_exc(CheckoutNewBranchFailed, - "git", "checkout", "-b", - branch_name, "FETCH_HEAD") - - except CheckoutNewBranchFailed as e: - if re.search("already exists\.?", e.output): - print("Branch already exists - reusing") - run_command_exc(CheckoutExistingBranchFailed, - "git", "checkout", branch_name) - run_command_exc(ResetHardFailed, - "git", "reset", "--hard", "FETCH_HEAD") - else: - raise - - print("Switched to branch \"%s\"" % branch_name) - - -class PatchSetGitCherrypickFailed(CommandFailed): - "There was a problem applying changeset contents to the current branch." - EXIT_CODE = 69 - - -def cherrypick_review(option=None): - cmd = ["git", "cherry-pick"] - if option: - cmd.append(option) - cmd.append("FETCH_HEAD") - print(run_command_exc(PatchSetGitCherrypickFailed, *cmd)) - - -class CheckoutBackExistingBranchFailed(CommandFailed): - "Cannot switch back to existing branch" - EXIT_CODE = 67 - - -class DeleteBranchFailed(CommandFailed): - "Failed to delete branch" - EXIT_CODE = 68 - - -class InvalidPatchsetsToCompare(GitReviewException): - def __init__(self, patchsetA, patchsetB): - Exception.__init__( - self, - "Invalid patchsets for comparison specified (old=%s,new=%s)" % ( - patchsetA, - patchsetB)) - EXIT_CODE = 39 - - -def compare_review(review_spec, branch, remote, rebase=False): - new_ps = None # none means latest - - if '-' in review_spec: - review_spec, new_ps = review_spec.split('-') - review, old_ps = parse_review_number(review_spec) - - if old_ps is None or old_ps == new_ps: - raise InvalidPatchsetsToCompare(old_ps, new_ps) - - old_review = build_review_number(review, old_ps) - new_review = build_review_number(review, new_ps) - - old_branch = fetch_review(old_review, branch, remote) - checkout_review(old_branch) - - if rebase: - print('Rebasing %s' % old_branch) - rebase = rebase_changes(branch, remote, False) - if not rebase: - print('Skipping rebase because of conflicts') - run_command_exc(CommandFailed, 'git', 'rebase', '--abort') - - new_branch = fetch_review(new_review, branch, remote) - checkout_review(new_branch) - - if rebase: - print('Rebasing also %s' % new_branch) - if not rebase_changes(branch, remote, False): - print("Rebasing of the new branch failed, " - "diff can be messed up (use -R to not rebase at all)!") - run_command_exc(CommandFailed, 'git', 'rebase', '--abort') - - subprocess.check_call(['git', 'difftool', old_branch]) - - -def finish_branch(target_branch): - local_branch = get_branch_name(target_branch) - if VERBOSE: - print("Switching back to '%s' and deleting '%s'" % (target_branch, - local_branch)) - run_command_exc(CheckoutBackExistingBranchFailed, - "git", "checkout", target_branch) - print("Switched to branch '%s'" % target_branch) - - run_command_exc(DeleteBranchFailed, - "git", "branch", "-D", local_branch) - print("Deleted branch '%s'" % local_branch) - - -def convert_bool(one_or_zero): - "Return a bool on a one or zero string." - return one_or_zero in ["1", "true", "True"] - - -def print_exit_message(status, needs_update): - - if needs_update: - print(""" -*********************************************************** -A new version of git-review is available on PyPI. Please -update your copy with: - - pip install -U git-review - -to ensure proper behavior with gerrit. Thanks! -*********************************************************** -""") - sys.exit(status) - - -def main(): - global _no_color_support - usage = "git review [OPTIONS] ... [BRANCH]" - - import argparse - - class DownloadFlag(argparse.Action): - """Additional option parsing: store value in 'dest', but - at the same time set one of the flag options to True - """ - def __call__(self, parser, namespace, values, option_string=None): - setattr(namespace, self.dest, values) - setattr(namespace, self.const, True) - - parser = argparse.ArgumentParser(usage=usage, description=COPYRIGHT) - - parser.add_argument("-t", "--topic", dest="topic", - help="Topic to submit branch to") - parser.add_argument("-D", "--draft", dest="draft", action="store_true", - help="Submit review as a draft") - parser.add_argument("-c", "--compatible", dest="compatible", - action="store_true", - help="Push change to refs/for/* for compatibility " - "with Gerrit versions < 2.3. Ignored if " - "-D/--draft is used.") - parser.add_argument("-n", "--dry-run", dest="dry", action="store_true", - help="Don't actually submit the branch for review") - parser.add_argument("-i", "--new-changeid", dest="regenerate", - action="store_true", - help="Regenerate Change-id before submitting") - parser.add_argument("-r", "--remote", dest="remote", - help="git remote to use for gerrit") - parser.add_argument("-R", "--no-rebase", dest="rebase", - action="store_false", - help="Don't rebase changes before submitting.") - parser.add_argument("-F", "--force-rebase", dest="force_rebase", - action="store_true", - help="Force rebase even when not needed.") - parser.add_argument("-B", "--no-color", dest="no_color_support", - action="store_true", - help="No color support.") - - - fetch = parser.add_mutually_exclusive_group() - fetch.set_defaults(download=False, compare=False, cherrypickcommit=False, - cherrypickindicate=False, cherrypickonly=False) - fetch.add_argument("-d", "--download", dest="changeidentifier", - action=DownloadFlag, metavar="CHANGE", - const="download", - help="Download the contents of an existing gerrit " - "review into a branch") - fetch.add_argument("-x", "--cherrypick", dest="changeidentifier", - action=DownloadFlag, metavar="CHANGE", - const="cherrypickcommit", - help="Apply the contents of an existing gerrit " - "review onto the current branch and commit " - "(cherry pick; not recommended in most " - "situations)") - fetch.add_argument("-X", "--cherrypickindicate", dest="changeidentifier", - action=DownloadFlag, metavar="CHANGE", - const="cherrypickindicate", - help="Apply the contents of an existing gerrit " - "review onto the current branch and commit, " - "indicating its origin") - fetch.add_argument("-N", "--cherrypickonly", dest="changeidentifier", - action=DownloadFlag, metavar="CHANGE", - const="cherrypickonly", - help="Apply the contents of an existing gerrit " - "review to the working directory and prepare " - "for commit") - fetch.add_argument("-m", "--compare", dest="changeidentifier", - action=DownloadFlag, metavar="CHANGE,PS[-NEW_PS]", - const="compare", - help="Download specified and latest (or NEW_PS) " - "patchsets of an existing gerrit review into " - "a branches, rebase on master " - "(skipped on conflicts or when -R is specified) " - "and show their differences") - - parser.add_argument("-u", "--update", dest="update", action="store_true", - help="Force updates from remote locations") - parser.add_argument("-s", "--setup", dest="setup", action="store_true", - help="Just run the repo setup commands but don't " - "submit anything") - parser.add_argument("-f", "--finish", dest="finish", action="store_true", - help="Close down this branch and switch back to " - "master on successful submission") - parser.add_argument("-l", "--list", dest="list", action="store_true", - help="List available reviews for the current project") - parser.add_argument("-y", "--yes", dest="yes", action="store_true", - help="Indicate that you do, in fact, understand if " - "you are submitting more than one patch") - parser.add_argument("-v", "--verbose", dest="verbose", action="store_true", - help="Output more information about what's going on") - parser.add_argument("--no-custom-script", dest="custom_script", - action="store_false", default=True, - help="Do not run custom scripts.") - parser.add_argument("--license", dest="license", action="store_true", - help="Print the license and exit") - parser.add_argument("--version", action="version", - version='%s version %s' % - (os.path.split(sys.argv[0])[-1], version)) - parser.add_argument("branch", nargs="?") - - try: - (top_dir, git_dir) = git_directories() - except GitDirectoriesException: - if sys.argv[1:] in ([], ['-h'], ['--help']): - parser.print_help() - sys.exit(1) - raise - -# config = get_config(os.path.join(top_dir, ".gitreview")) - config = DEFAULTS.copy() - cur_proj = run_command("git remote -v") - import re - m = re.search('(?<=29418\/)(\S+)', cur_proj) - config['project'] = m.group(0) - - - defaultrebase = convert_bool( - git_config_get_value("gitreview", "rebase", - default=str(config['defaultrebase']))) - parser.set_defaults(dry=False, - draft=False, - rebase=defaultrebase, - verbose=False, - update=False, - setup=False, - list=False, - yes=False, - branch=config['defaultbranch'], - remote=config['defaultremote']) - options = parser.parse_args() - - if options.license: - print(COPYRIGHT) - sys.exit(0) - - branch = options.branch - global VERBOSE - global UPDATE - VERBOSE = options.verbose - UPDATE = options.update - remote = options.remote - yes = options.yes - status = 0 - - needs_update = latest_is_newer() - check_remote(branch, remote, - config['hostname'], config['port'], config['project']) - - if options.no_color_support: - _no_color_support = True - - if options.changeidentifier: - if options.compare: - compare_review(options.changeidentifier, - branch, remote, options.rebase) - return - local_branch = fetch_review(options.changeidentifier, branch, remote) - if options.download: - checkout_review(local_branch) - else: - if options.cherrypickcommit: - cherrypick_review() - elif options.cherrypickonly: - cherrypick_review("-n") - if options.cherrypickindicate: - cherrypick_review("-x") - return - elif options.list: - list_reviews(remote) - return - - if options.custom_script: - run_custom_script("pre") - - hook_file = os.path.join(git_dir, "hooks", "commit-msg") - have_hook = os.path.exists(hook_file) and os.access(hook_file, os.X_OK) - - if not have_hook: - set_hooks_commit_msg(remote, hook_file) - - if options.setup: - if options.finish and not options.dry: - finish_branch(branch) - return - - if options.rebase: - if not rebase_changes(branch, remote): - print_exit_message(1, needs_update) - if not options.force_rebase and not undo_rebase(): - print_exit_message(1, needs_update) - assert_one_change(remote, branch, yes, have_hook) - - ref = "publish" - - if options.draft: - ref = "drafts" - if options.custom_script: - run_custom_script("draft") - elif options.compatible: - ref = "for" - - cmd = "git push %s HEAD:refs/%s/%s" % (remote, ref, branch) - topic = options.topic or get_topic(branch) - if topic != branch: - cmd += "/%s" % topic - if options.regenerate: - print("Amending the commit to regenerate the change id\n") - regenerate_cmd = "git commit --amend" - if options.dry: - print("\tGIT_EDITOR=\"sed -i -e '/^Change-Id:/d'\" %s\n" % - regenerate_cmd) - else: - run_command(regenerate_cmd, - GIT_EDITOR="sed -i -e " - "'/^Change-Id:/d'") - - if options.dry: - print("Please use the following command " - "to send your commits to review:\n") - print("\t%s\n" % cmd) - else: - (status, output) = run_command_status(cmd) - print(output) - - if options.finish and not options.dry and status == 0: - finish_branch(branch) - return - - if options.custom_script: - run_custom_script("post") - print_exit_message(status, needs_update) - - -if __name__ == "__main__": - try: - main() - except GitReviewException as e: - print(e) - sys.exit(e.EXIT_CODE) +#!/usr/bin/env python +from __future__ import print_function + +COPYRIGHT = """\ +Copyright (C) 2011-2012 OpenStack LLC. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. + +See the License for the specific language governing permissions and +limitations under the License.""" + +import datetime +import json +import os +import re +import shlex +import subprocess +import sys +import time + +if sys.version < '3': + import ConfigParser + import urllib + import urlparse + urlopen = urllib.urlopen + urlparse = urlparse.urlparse + do_input = raw_input +else: + import configparser as ConfigParser + import urllib.parse + import urllib.request + urlopen = urllib.request.urlopen + urlparse = urllib.parse.urlparse + do_input = input + +from distutils import version as du_version + +version = "1.22" + +VERBOSE = False +UPDATE = False +CONFIGDIR = os.path.expanduser("~/.config/git-review") +GLOBAL_CONFIG = "/etc/git-review/git-review.conf" +USER_CONFIG = os.path.join(CONFIGDIR, "git-review.conf") +PYPI_URL = "http://pypi.python.org/pypi/git-review/json" +PYPI_CACHE_TIME = 60 * 60 * 24 # 24 hours +DEFAULTS = dict(hostname='gerrit.lud.stericsson.com', port='29418', project=False, + defaultbranch='master', defaultremote="gerrit", + defaultrebase="0") + +_branch_name = None +_has_color = None +_no_color_support = False + + +class colors: + yellow = '\033[33m' + green = '\033[92m' + reset = '\033[0m' + + +class GitReviewException(Exception): + pass + + +class CommandFailed(GitReviewException): + + def __init__(self, *args): + Exception.__init__(self, *args) + (self.rc, self.output, self.argv, self.envp) = args + self.quickmsg = dict([ + ("argv", " ".join(self.argv)), + ("rc", self.rc), + ("output", self.output)]) + + def __str__(self): + return self.__doc__ + """ +The following command failed with exit code %(rc)d + "%(argv)s" +----------------------- +%(output)s +-----------------------""" % self.quickmsg + + +class ChangeSetException(GitReviewException): + + def __init__(self, e): + GitReviewException.__init__(self) + self.e = str(e) + + def __str__(self): + return self.__doc__ % self.e + + +def parse_review_number(review): + parts = review.split(',') + if len(parts) < 2: + parts.append(None) + return parts + + +def build_review_number(review, patchset): + if patchset is not None: + return '%s,%s' % (review, patchset) + return review + + +def run_command_status(*argv, **env): + if VERBOSE: + print(datetime.datetime.now(), "Running:", " ".join(argv)) + if len(argv) == 1: + argv = shlex.split(str(argv[0])) + newenv = os.environ + newenv.update(env) + p = subprocess.Popen(argv, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, env=newenv) + (out, nothing) = p.communicate() + out = out.decode('utf-8') + return (p.returncode, out.strip()) + + +def run_command(*argv, **env): + (rc, output) = run_command_status(*argv, **env) + return output + + +def run_command_exc(klazz, *argv, **env): + """Run command *argv, on failure raise 'klazz + + klass should be derived from CommandFailed + """ + (rc, output) = run_command_status(*argv, **env) + if rc != 0: + raise klazz(rc, output, argv, env) + return output + + +def update_latest_version(version_file_path): + """Cache the latest version of git-review for the upgrade check.""" + + if not os.path.exists(CONFIGDIR): + os.makedirs(CONFIGDIR) + + if os.path.exists(version_file_path) and not UPDATE: + if (time.time() - os.path.getmtime(version_file_path)) < 28800: + return + + latest_version = version + try: + latest_version = json.load(urlopen(PYPI_URL))['info']['version'] + except Exception: + pass + + with open(version_file_path, "w") as version_file: + version_file.write(latest_version) + + +def latest_is_newer(): + """Check if there is a new version of git-review.""" + + # Skip version check if distro package turns it off + if os.path.exists(GLOBAL_CONFIG): + config = dict(check=False) + configParser = ConfigParser.ConfigParser(config) + configParser.read(GLOBAL_CONFIG) + if not configParser.getboolean("updates", "check"): + return False + + version_file_path = os.path.join(CONFIGDIR, "latest-version") + update_latest_version(version_file_path) + + latest_version = None + with open(version_file_path, "r") as version_file: + latest_version = du_version.StrictVersion(version_file.read()) + if latest_version > du_version.StrictVersion(version): + return True + return False + + +def git_directories(): + """Determine (absolute git work directory path, .git subdirectory path).""" + cmd = ("git", "rev-parse", "--show-toplevel", "--git-dir") + out = run_command_exc(GitDirectoriesException, *cmd) + try: + return out.split() + except ValueError: + raise GitDirectoriesException(0, out, cmd, {}) + + +class GitDirectoriesException(CommandFailed): + "Cannot determine where .git directory is." + EXIT_CODE = 70 + + +class CustomScriptException(CommandFailed): + """Custom script execution failed.""" + EXIT_CODE = 71 + + +def run_custom_script(action): + """Get status and output of .git/hooks/$action-review or/and + ~/.config/hooks/$action-review if existing. + """ + returns = [] + script_file = "%s-review" % (action) + (top_dir, git_dir) = git_directories() + paths = [os.path.join(CONFIGDIR, "hooks", script_file), + os.path.join(git_dir, "hooks", script_file)] + for fpath in paths: + if os.path.isfile(fpath) and os.access(fpath, os.X_OK): + status, output = run_command_status(fpath) + returns.append((status, output, fpath)) + + for (status, output, path) in returns: + if status is not None and status != 0: + raise CustomScriptException(status, output, [path], {}) + elif output and VERBOSE: + print("script %s output is:" % (path)) + print(output) + + +def git_config_get_value(section, option, default=None): + try: + return run_command_exc(GitConfigException, + "git", "config", + "--get", + "%s.%s" % (section, option)).strip() + except GitConfigException as exc: + if exc.rc == 1: + return default + raise + + +class GitConfigException(CommandFailed): + """Git config value retrieval failed.""" + EXIT_CODE = 128 + + +class CannotInstallHook(CommandFailed): + "Problems encountered installing commit-msg hook" + EXIT_CODE = 2 + + +def set_hooks_commit_msg(remote, target_file): + """Install the commit message hook if needed.""" + + # Create the hooks directory if it's not there already + hooks_dir = os.path.dirname(target_file) + if not os.path.isdir(hooks_dir): + os.mkdir(hooks_dir) + + (hostname, username, port, project_name) = \ + parse_git_show(remote, "Push") + + if not os.path.exists(target_file) or UPDATE: + if VERBOSE: + print("Fetching commit hook from: scp://%s:%s" % (hostname, port)) + if port is not None: + port = "-P %s" % port + else: + port = "" + if username is None: + userhost = hostname + else: + userhost = "%s@%s" % (username, hostname) + run_command_exc( + CannotInstallHook, + "scp", port, + userhost + ":hooks/commit-msg", + target_file) + + if not os.access(target_file, os.X_OK): + os.chmod(target_file, os.path.stat.S_IREAD | os.path.stat.S_IEXEC) + + +def test_remote(username, hostname, port, project): + """Tests that a possible gerrit remote works.""" + + if port is not None: + port = "-p %s" % port + else: + port = "" + if username is None: + userhost = hostname + else: + userhost = "%s@%s" % (username, hostname) + + (status, ssh_output) = run_command_status( + "ssh", "-x", port, userhost, + "gerrit", "ls-projects") + + if status == 0: + if VERBOSE: + print("%s@%s:%s worked." % (username, hostname, port)) + return True + else: + if VERBOSE: + print("%s@%s:%s did not work." % (username, hostname, port)) + return False + + +def make_remote_url(username, hostname, port, project): + """Builds a gerrit remote URL.""" + if username is None: + return "ssh://%s:%s/%s" % (hostname, port, project) + else: + return "ssh://%s@%s:%s/%s" % (username, hostname, port, project) + + +def add_remote(hostname, port, project, remote): + """Adds a gerrit remote.""" + asked_for_username = False + + username = os.getenv("USERNAME") + if not username: + username = git_config_get_value("gitreview", "username") + if not username: + username = os.getenv("USER") + if port is None: + port = 29418 + + remote_url = make_remote_url(username, hostname, port, project) + if VERBOSE: + print("No remote set, testing %s" % remote_url) + if not test_remote(username, hostname, port, project): + print("Could not connect to gerrit.") + username = do_input("Enter your gerrit username: ") + remote_url = make_remote_url(username, hostname, port, project) + print("Trying again with %s" % remote_url) + if not test_remote(username, hostname, port, project): + raise Exception("Could not connect to gerrit at %s" % remote_url) + asked_for_username = True + + print("Creating a git remote called \"%s\" that maps to:" % remote) + print("\t%s" % remote_url) + cmd = "git remote add -f %s %s" % (remote, remote_url) + (status, remote_output) = run_command_status(cmd) + + if status != 0: + raise Exception("Error running %s" % cmd) + + if asked_for_username: + print() + print("This repository is now set up for use with git-review.") + print("You can set the default username for future repositories with:") + print(' git config --global --add gitreview.username "%s"' % username) + print() + + +def parse_git_show(remote, verb): + fetch_url = "" + for line in run_command("git remote show -n %s" % remote).split("\n"): + if line.strip().startswith("%s" % verb): + fetch_url = line.split()[2] + + parsed_url = urlparse(fetch_url) + project_name = parsed_url.path.lstrip("/") + if project_name.endswith(".git"): + project_name = project_name[:-4] + + hostname = parsed_url.netloc + username = None + port = parsed_url.port + + if VERBOSE: + print("Found origin %s URL:" % verb, fetch_url) + + # Workaround bug in urlparse on OSX + if parsed_url.scheme == "ssh" and parsed_url.path[:2] == "//": + hostname = parsed_url.path[2:].split("/")[0] + + if "@" in hostname: + (username, hostname) = hostname.split("@") + if ":" in hostname: + (hostname, port) = hostname.split(":") + + # Is origin an ssh location? Let's pull more info + if parsed_url.scheme == "ssh" and port is None: + port = 22 + + return (hostname, username, str(port), project_name) + + +def check_color_support(): + global _has_color + global _no_color_support + if _has_color is None: + test_command = "git log --color=never --oneline HEAD^1..HEAD" + (status, output) = run_command_status(test_command) + if status == 0: + _has_color = True + else: + _has_color = False + + if _no_color_support: + _has_color = False + + return _has_color + + +def get_config(config_file=None): + """Generate the configuration map by starting with some built-in defaults + and then loading GLOBAL_CONFIG, USER_CONFIG, and a repository-specific + .gitreview file, if they exist. In case of conflict, the configuration file + with the narrowest scope wins. + """ + config = DEFAULTS.copy() + for filename in (GLOBAL_CONFIG, USER_CONFIG, config_file): + if filename is not None and os.path.exists(filename): + config.update(load_config_file(filename)) + return config + + +def load_config_file(config_file): + """Load configuration options from a file.""" + configParser = ConfigParser.ConfigParser() + configParser.read(config_file) + options = { + 'hostname': 'host', + 'port': 'port', + 'project': 'project', + 'defaultbranch': 'defaultbranch', + 'defaultremote': 'defaultremote', + 'defaultrebase': 'defaultrebase', + } + config = {} + for config_key, option_name in options.items(): + if configParser.has_option('gerrit', option_name): + config[config_key] = configParser.get('gerrit', option_name) + return config + + +def update_remote(remote): + cmd = "git remote update %s" % remote + (status, output) = run_command_status(cmd) + if VERBOSE: + print(output) + if status != 0: + print("Problem running '%s'" % cmd) + if not VERBOSE: + print(output) + return False + return True + + +def check_remote(branch, remote, hostname, port, project): + """Check that a Gerrit Git remote repo exists, if not, set one.""" + + has_color = check_color_support() + if has_color: + color_never = "--color=never" + else: + color_never = "" + + if remote in run_command("git remote").split("\n"): + + remotes = run_command("git branch -a %s" % color_never).split("\n") + for current_remote in remotes: + if (current_remote.strip() == "remotes/%s/%s" % (remote, branch) + and not UPDATE): + return + # We have the remote, but aren't set up to fetch. Fix it + if VERBOSE: + print("Setting up gerrit branch tracking for better rebasing") + update_remote(remote) + return + + if hostname is False or port is False or project is False: + # This means there was no .gitreview file + print("No '.gitreview' file found in this repository.") + print("We don't know where your gerrit is. Please manually create ") + print("a remote named \"%s\" and try again." % remote) + sys.exit(1) + + # Gerrit remote not present, try to add it + try: + add_remote(hostname, port, project, remote) + except Exception: + print(sys.exc_info()[2]) + print("We don't know where your gerrit is. Please manually create ") + print("a remote named \"%s\" and try again." % remote) + raise + + +def rebase_changes(branch, remote, interactive=True): + + remote_branch = "remotes/%s/%s" % (remote, branch) + + if not update_remote(remote): + return False + + if interactive: + cmd = "git rebase -i %s" % remote_branch + else: + cmd = "git rebase %s" % remote_branch + + (status, output) = run_command_status(cmd, GIT_EDITOR='true') + if status != 0: + print("Errors running %s" % cmd) + if interactive: + print(output) + return False + return True + + +def undo_rebase(): + cmd = "git reset --hard ORIG_HEAD" + (status, output) = run_command_status(cmd) + if status != 0: + print("Errors running %s" % cmd) + print(output) + return False + return True + + +def get_branch_name(target_branch): + global _branch_name + if _branch_name is not None: + return _branch_name + _branch_name = None + has_color = check_color_support() + if has_color: + color_never = "--color=never" + else: + color_never = "" + for branch in run_command("git branch %s" % color_never).split("\n"): + if branch.startswith('*'): + _branch_name = branch.split()[1].strip() + if _branch_name == "(no": + _branch_name = target_branch + return _branch_name + + +def assert_one_change(remote, branch, yes, have_hook): + has_color = check_color_support() + if has_color: + color = git_config_get_value("color", "ui") + if color is None: + color = "auto" + else: + color = color.lower() + if (color == "" or color == "true"): + color = "auto" + elif color == "false": + color = "never" + elif color == "auto": + # Python is not a tty, we have to force colors + color = "always" + use_color = "--color=%s" % color + else: + use_color = "" + cmd = "git log %s --decorate --oneline HEAD --not remotes/%s/%s --" % ( + use_color, remote, branch) + (status, output) = run_command_status(cmd) + if status != 0: + print("Had trouble running %s" % cmd) + print(output) + sys.exit(1) + output_lines = len(output.split("\n")) + if output_lines == 1 and not have_hook: + print("Your change was committed before the commit hook was installed") + print("Amending the commit to add a gerrit change id") + run_command("git commit --amend", GIT_EDITOR='true') + elif output_lines == 0: + print("No changes between HEAD and %s/%s." % (remote, branch)) + print("Submitting for review would be pointless.") + sys.exit(1) + elif output_lines > 1: + if not yes: + print("You have more than one commit" + " that you are about to submit.") + print("The outstanding commits are:\n\n%s\n" % output) + print("Is this really what you meant to do?") + yes_no = do_input("Type 'yes' to confirm: ") + if yes_no.lower().strip() != "yes": + print("Aborting.") + print("Please rebase/squash your changes and try again") + sys.exit(1) + + +def use_topic(why, topic): + """Inform the user about why a particular topic has been selected.""" + if VERBOSE: + print(why % ('"%s"' % topic,)) + return topic + + +def get_topic(target_branch): + + branch_name = get_branch_name(target_branch) + + branch_parts = branch_name.split("/") + if len(branch_parts) >= 3 and branch_parts[0] == "review": + return use_topic("Using change number %s " + "for the topic of the change submitted", + "/".join(branch_parts[2:])) + + log_output = run_command("git log HEAD^1..HEAD") + bug_re = r'\b([Bb]ug|[Ll][Pp])\s*[#:]?\s*(\d+)' + + match = re.search(bug_re, log_output) + if match is not None: + return use_topic("Using bug number %s " + "for the topic of the change submitted", + "bug/%s" % match.group(2)) + + bp_re = r'\b([Bb]lue[Pp]rint|[Bb][Pp])\s*[#:]?\s*([0-9a-zA-Z-_]+)' + match = re.search(bp_re, log_output) + if match is not None: + return use_topic("Using blueprint number %s " + "for the topic of the change submitted", + "bp/%s" % match.group(2)) + + return use_topic("Using local branch name %s " + "for the topic of the change submitted", + branch_name) + + +class CannotQueryOpenChangesets(CommandFailed): + "Cannot fetch review information from gerrit" + EXIT_CODE = 32 + + +class CannotParseOpenChangesets(ChangeSetException): + "Cannot parse JSON review information from gerrit" + EXIT_CODE = 33 + + +def list_reviews(remote): + + (hostname, username, port, project_name) = \ + parse_git_show(remote, "Push") + + if port is not None: + port = "-p %s" % port + else: + port = "" + if username is None: + userhost = hostname + else: + userhost = "%s@%s" % (username, hostname) + + review_info = None + output = run_command_exc( + CannotQueryOpenChangesets, + "ssh", "-x", port, userhost, + "gerrit", "query", + "--current-patch-set --format=JSON project:%s status:open reviewer:self" % project_name) + + review_list = [] + review_field_width = {} + REVIEW_FIELDS = ('number', 'currentPatchSet', 'branch', 'subject') + FIELDS = range(0, len(REVIEW_FIELDS)) + if check_color_support(): + review_field_color = (colors.yellow, colors.yellow, colors.green, "") + color_reset = colors.reset + else: + review_field_color = ("", "", "", "") + color_reset = "" + review_field_width = [0, 0, 0, 0] + review_field_format = ["%*s", "%*s", "%*s", "%*s"] + review_field_justify = [+1, +1, +1, -1] # -1 is justify to right + + for line in output.split("\n"): + # Warnings from ssh wind up in this output + if line[0] != "{": + print(line) + continue + try: + review_info = json.loads(line) + except Exception: + if VERBOSE: + print(output) + raise(CannotParseOpenChangesets, sys.exc_info()[1]) + + if 'type' in review_info: + break + + tempPS = review_info['currentPatchSet'] + appPS = tempPS['approvals'] + appValue = '-'; + for appLine in appPS: + appBy = appLine['by'] + appUser = appBy['username'] + if appUser == username: + appValue = appLine['value'] + review_info['currentPatchSet'] = tempPS['number'] + ' ' + appValue + + review_list.append([review_info[f] for f in REVIEW_FIELDS]) + for i in FIELDS: + review_field_width[i] = max( + review_field_width[i], + len(review_info[REVIEW_FIELDS[i]]) + ) + + review_field_format = " ".join([ + review_field_color[i] + + review_field_format[i] + + color_reset + for i in FIELDS]) + + review_field_width = [ + review_field_width[i] * review_field_justify[i] + for i in FIELDS] + for review_value in review_list: + # At this point we have review_field_format + # like "%*s %*s %*s" and we need to supply + # (width1, value1, width2, value2, ...) tuple to print + # It's easy to zip() widths with actual values, + # but we need to flatten the resulting + # ((width1, value1), (width2, value2), ...) map. + formatted_fields = [] + for (width, value) in zip(review_field_width, review_value): + formatted_fields.extend([width, value]) + print(review_field_format % tuple(formatted_fields)) + print("Found %d items for review" % review_info['rowCount']) + + return 0 + + +class CannotQueryPatchSet(CommandFailed): + "Cannot query patchset information" + EXIT_CODE = 34 + + +class ReviewInformationNotFound(ChangeSetException): + "Could not fetch review information for change %s" + EXIT_CODE = 35 + + +class ReviewNotFound(ChangeSetException): + "Gerrit review %s not found" + EXIT_CODE = 36 + + +class PatchSetGitFetchFailed(CommandFailed): + """Cannot fetch patchset contents + +Does specified change number belong to this project? +""" + EXIT_CODE = 37 + + +class PatchSetNotFound(ChangeSetException): + "Review patchset %s not found" + EXIT_CODE = 38 + + +class CheckoutNewBranchFailed(CommandFailed): + "Cannot checkout to new branch" + EXIT_CODE = 64 + + +class CheckoutExistingBranchFailed(CommandFailed): + "Cannot checkout existing branch" + EXIT_CODE = 65 + + +class ResetHardFailed(CommandFailed): + "Failed to hard reset downloaded branch" + EXIT_CODE = 66 + + +def fetch_review(review, masterbranch, remote): + + (hostname, username, port, project_name) = \ + parse_git_show(remote, "Push") + + if port is not None: + port = "-p %s" % port + else: + port = "" + if username is None: + userhost = hostname + else: + userhost = "%s@%s" % (username, hostname) + + review_arg = review + patchset_opt = '--current-patch-set' + + review, patchset_number = parse_review_number(review) + if patchset_number is not None: + patchset_opt = '--patch-sets' + + review_info = None + output = run_command_exc( + CannotQueryPatchSet, + "ssh", "-x", port, userhost, + "gerrit", "query", + "--format=JSON %s change:%s" % (patchset_opt, review)) + + review_jsons = output.split("\n") + found_review = False + for review_json in review_jsons: + try: + review_info = json.loads(review_json) + found_review = True + except Exception: + pass + if found_review: + break + if not found_review: + if VERBOSE: + print(output) + raise ReviewInformationNotFound(review) + + try: + if patchset_number is None: + refspec = review_info['currentPatchSet']['ref'] + else: + refspec = [ps for ps + in review_info['patchSets'] + if ps['number'] == patchset_number][0]['ref'] + except IndexError: + raise PatchSetNotFound(review_arg) + except KeyError: + raise ReviewNotFound(review) + + try: + topic = review_info['topic'] + if topic == masterbranch: + topic = review + except KeyError: + topic = review + try: + author = re.sub('\W+', '_', review_info['owner']['name']).lower() + except KeyError: + author = 'unknown' + + if patchset_number is None: + branch_name = "review/%s/%s" % (author, topic) + else: + branch_name = "review/%s/%s-patch%s" % (author, topic, patchset_number) + + print("Downloading %s from gerrit" % refspec) + run_command_exc(PatchSetGitFetchFailed, + "git", "fetch", remote, refspec) + return branch_name + + +def checkout_review(branch_name): + """Checkout a newly fetched (FETCH_HEAD) change + into a branch + """ + + try: + run_command_exc(CheckoutNewBranchFailed, + "git", "checkout", "-b", + branch_name, "FETCH_HEAD") + + except CheckoutNewBranchFailed as e: + if re.search("already exists\.?", e.output): + print("Branch already exists - reusing") + run_command_exc(CheckoutExistingBranchFailed, + "git", "checkout", branch_name) + run_command_exc(ResetHardFailed, + "git", "reset", "--hard", "FETCH_HEAD") + else: + raise + + print("Switched to branch \"%s\"" % branch_name) + + +class PatchSetGitCherrypickFailed(CommandFailed): + "There was a problem applying changeset contents to the current branch." + EXIT_CODE = 69 + + +def cherrypick_review(option=None): + cmd = ["git", "cherry-pick"] + if option: + cmd.append(option) + cmd.append("FETCH_HEAD") + print(run_command_exc(PatchSetGitCherrypickFailed, *cmd)) + + +class CheckoutBackExistingBranchFailed(CommandFailed): + "Cannot switch back to existing branch" + EXIT_CODE = 67 + + +class DeleteBranchFailed(CommandFailed): + "Failed to delete branch" + EXIT_CODE = 68 + + +class InvalidPatchsetsToCompare(GitReviewException): + def __init__(self, patchsetA, patchsetB): + Exception.__init__( + self, + "Invalid patchsets for comparison specified (old=%s,new=%s)" % ( + patchsetA, + patchsetB)) + EXIT_CODE = 39 + + +def compare_review(review_spec, branch, remote, rebase=False): + new_ps = None # none means latest + + if '-' in review_spec: + review_spec, new_ps = review_spec.split('-') + review, old_ps = parse_review_number(review_spec) + + if old_ps is None or old_ps == new_ps: + raise InvalidPatchsetsToCompare(old_ps, new_ps) + + old_review = build_review_number(review, old_ps) + new_review = build_review_number(review, new_ps) + + old_branch = fetch_review(old_review, branch, remote) + checkout_review(old_branch) + + if rebase: + print('Rebasing %s' % old_branch) + rebase = rebase_changes(branch, remote, False) + if not rebase: + print('Skipping rebase because of conflicts') + run_command_exc(CommandFailed, 'git', 'rebase', '--abort') + + new_branch = fetch_review(new_review, branch, remote) + checkout_review(new_branch) + + if rebase: + print('Rebasing also %s' % new_branch) + if not rebase_changes(branch, remote, False): + print("Rebasing of the new branch failed, " + "diff can be messed up (use -R to not rebase at all)!") + run_command_exc(CommandFailed, 'git', 'rebase', '--abort') + + subprocess.check_call(['git', 'difftool', old_branch]) + + +def finish_branch(target_branch): + local_branch = get_branch_name(target_branch) + if VERBOSE: + print("Switching back to '%s' and deleting '%s'" % (target_branch, + local_branch)) + run_command_exc(CheckoutBackExistingBranchFailed, + "git", "checkout", target_branch) + print("Switched to branch '%s'" % target_branch) + + run_command_exc(DeleteBranchFailed, + "git", "branch", "-D", local_branch) + print("Deleted branch '%s'" % local_branch) + + +def convert_bool(one_or_zero): + "Return a bool on a one or zero string." + return one_or_zero in ["1", "true", "True"] + + +def print_exit_message(status, needs_update): + + if needs_update: + print(""" +*********************************************************** +A new version of git-review is available on PyPI. Please +update your copy with: + + pip install -U git-review + +to ensure proper behavior with gerrit. Thanks! +*********************************************************** +""") + sys.exit(status) + + +def main(): + global _no_color_support + usage = "git review [OPTIONS] ... [BRANCH]" + + import argparse + + class DownloadFlag(argparse.Action): + """Additional option parsing: store value in 'dest', but + at the same time set one of the flag options to True + """ + def __call__(self, parser, namespace, values, option_string=None): + setattr(namespace, self.dest, values) + setattr(namespace, self.const, True) + + parser = argparse.ArgumentParser(usage=usage, description=COPYRIGHT) + + parser.add_argument("-t", "--topic", dest="topic", + help="Topic to submit branch to") + parser.add_argument("-D", "--draft", dest="draft", action="store_true", + help="Submit review as a draft") + parser.add_argument("-c", "--compatible", dest="compatible", + action="store_true", + help="Push change to refs/for/* for compatibility " + "with Gerrit versions < 2.3. Ignored if " + "-D/--draft is used.") + parser.add_argument("-n", "--dry-run", dest="dry", action="store_true", + help="Don't actually submit the branch for review") + parser.add_argument("-i", "--new-changeid", dest="regenerate", + action="store_true", + help="Regenerate Change-id before submitting") + parser.add_argument("-r", "--remote", dest="remote", + help="git remote to use for gerrit") + parser.add_argument("-R", "--no-rebase", dest="rebase", + action="store_false", + help="Don't rebase changes before submitting.") + parser.add_argument("-F", "--force-rebase", dest="force_rebase", + action="store_true", + help="Force rebase even when not needed.") + parser.add_argument("-B", "--no-color", dest="no_color_support", + action="store_true", + help="No color support.") + + + fetch = parser.add_mutually_exclusive_group() + fetch.set_defaults(download=False, compare=False, cherrypickcommit=False, + cherrypickindicate=False, cherrypickonly=False) + fetch.add_argument("-d", "--download", dest="changeidentifier", + action=DownloadFlag, metavar="CHANGE", + const="download", + help="Download the contents of an existing gerrit " + "review into a branch") + fetch.add_argument("-x", "--cherrypick", dest="changeidentifier", + action=DownloadFlag, metavar="CHANGE", + const="cherrypickcommit", + help="Apply the contents of an existing gerrit " + "review onto the current branch and commit " + "(cherry pick; not recommended in most " + "situations)") + fetch.add_argument("-X", "--cherrypickindicate", dest="changeidentifier", + action=DownloadFlag, metavar="CHANGE", + const="cherrypickindicate", + help="Apply the contents of an existing gerrit " + "review onto the current branch and commit, " + "indicating its origin") + fetch.add_argument("-N", "--cherrypickonly", dest="changeidentifier", + action=DownloadFlag, metavar="CHANGE", + const="cherrypickonly", + help="Apply the contents of an existing gerrit " + "review to the working directory and prepare " + "for commit") + fetch.add_argument("-m", "--compare", dest="changeidentifier", + action=DownloadFlag, metavar="CHANGE,PS[-NEW_PS]", + const="compare", + help="Download specified and latest (or NEW_PS) " + "patchsets of an existing gerrit review into " + "a branches, rebase on master " + "(skipped on conflicts or when -R is specified) " + "and show their differences") + + parser.add_argument("-u", "--update", dest="update", action="store_true", + help="Force updates from remote locations") + parser.add_argument("-s", "--setup", dest="setup", action="store_true", + help="Just run the repo setup commands but don't " + "submit anything") + parser.add_argument("-f", "--finish", dest="finish", action="store_true", + help="Close down this branch and switch back to " + "master on successful submission") + parser.add_argument("-l", "--list", dest="list", action="store_true", + help="List available reviews for the current project") + parser.add_argument("-y", "--yes", dest="yes", action="store_true", + help="Indicate that you do, in fact, understand if " + "you are submitting more than one patch") + parser.add_argument("-v", "--verbose", dest="verbose", action="store_true", + help="Output more information about what's going on") + parser.add_argument("--no-custom-script", dest="custom_script", + action="store_false", default=True, + help="Do not run custom scripts.") + parser.add_argument("--license", dest="license", action="store_true", + help="Print the license and exit") + parser.add_argument("--version", action="version", + version='%s version %s' % + (os.path.split(sys.argv[0])[-1], version)) + parser.add_argument("branch", nargs="?") + + try: + (top_dir, git_dir) = git_directories() + except GitDirectoriesException: + if sys.argv[1:] in ([], ['-h'], ['--help']): + parser.print_help() + sys.exit(1) + raise + +# config = get_config(os.path.join(top_dir, ".gitreview")) + config = DEFAULTS.copy() + cur_proj = run_command("git remote -v") + import re + m = re.search('(?<=29418\/)(\S+)', cur_proj) + config['project'] = m.group(0) + + + defaultrebase = convert_bool( + git_config_get_value("gitreview", "rebase", + default=str(config['defaultrebase']))) + parser.set_defaults(dry=False, + draft=False, + rebase=defaultrebase, + verbose=False, + update=False, + setup=False, + list=False, + yes=False, + branch=config['defaultbranch'], + remote=config['defaultremote']) + options = parser.parse_args() + + if options.license: + print(COPYRIGHT) + sys.exit(0) + + branch = options.branch + global VERBOSE + global UPDATE + VERBOSE = options.verbose + UPDATE = options.update + remote = options.remote + yes = options.yes + status = 0 + + needs_update = latest_is_newer() + check_remote(branch, remote, + config['hostname'], config['port'], config['project']) + + if options.no_color_support: + _no_color_support = True + + if options.changeidentifier: + if options.compare: + compare_review(options.changeidentifier, + branch, remote, options.rebase) + return + local_branch = fetch_review(options.changeidentifier, branch, remote) + if options.download: + checkout_review(local_branch) + else: + if options.cherrypickcommit: + cherrypick_review() + elif options.cherrypickonly: + cherrypick_review("-n") + if options.cherrypickindicate: + cherrypick_review("-x") + return + elif options.list: + list_reviews(remote) + return + + if options.custom_script: + run_custom_script("pre") + + hook_file = os.path.join(git_dir, "hooks", "commit-msg") + have_hook = os.path.exists(hook_file) and os.access(hook_file, os.X_OK) + + if not have_hook: + set_hooks_commit_msg(remote, hook_file) + + if options.setup: + if options.finish and not options.dry: + finish_branch(branch) + return + + if options.rebase: + if not rebase_changes(branch, remote): + print_exit_message(1, needs_update) + if not options.force_rebase and not undo_rebase(): + print_exit_message(1, needs_update) + assert_one_change(remote, branch, yes, have_hook) + + ref = "publish" + + if options.draft: + ref = "drafts" + if options.custom_script: + run_custom_script("draft") + elif options.compatible: + ref = "for" + + cmd = "git push %s HEAD:refs/%s/%s" % (remote, ref, branch) + topic = options.topic or get_topic(branch) + if topic != branch: + cmd += "/%s" % topic + if options.regenerate: + print("Amending the commit to regenerate the change id\n") + regenerate_cmd = "git commit --amend" + if options.dry: + print("\tGIT_EDITOR=\"sed -i -e '/^Change-Id:/d'\" %s\n" % + regenerate_cmd) + else: + run_command(regenerate_cmd, + GIT_EDITOR="sed -i -e " + "'/^Change-Id:/d'") + + if options.dry: + print("Please use the following command " + "to send your commits to review:\n") + print("\t%s\n" % cmd) + else: + (status, output) = run_command_status(cmd) + print(output) + + if options.finish and not options.dry and status == 0: + finish_branch(branch) + return + + if options.custom_script: + run_custom_script("post") + print_exit_message(status, needs_update) + + +if __name__ == "__main__": + try: + main() + except GitReviewException as e: + print(e) + sys.exit(e.EXIT_CODE) -- 2.43.0