-
-
Save codeaid/5a97956bb0bacd6a38d5 to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| escape() { | |
| echo -e "\033[$1" | |
| } | |
| # misc styles | |
| c_reset=`escape 0m` | |
| c_bold_on=`escape 1m` ; c_bold_off=`escape 22m` | |
| c_underline_on=`escape 4m` ; c_underline_off=`escape 24m` | |
| # foreground colors | |
| fg_default=`escape 39m` | |
| fg_black=`escape 30m` | |
| fg_red=`escape "1;31m"` | |
| fg_green=`escape 32m` | |
| fg_brown=`escape 33m` | |
| fg_blue=`escape 34m` | |
| fg_magenta=`escape 35m` | |
| fg_cyan=`escape 36m` | |
| fg_white=`escape 37m` | |
| # background colors | |
| bg_default=`escape 49m` | |
| bg_black=`escape 40m` | |
| bg_red=`escape 41m` | |
| bg_green=`escape 42m` | |
| bg_brown=`escape 43m` | |
| bg_blue=`escape 44m` | |
| bg_magenta=`escape 45m` | |
| bg_cyan=`escape 46m` | |
| bg_white=`escape 47m` | |
| me=$(basename $0) | |
| # ensure we have two arguments | |
| if [ $# -ne 2 ] | |
| then | |
| echo | |
| echo " usage: git scp <username@hostname> <target-dir>" | |
| echo | |
| exit 1 | |
| fi | |
| username=$1 | |
| # remove trailing slashes | |
| targetdir=$(echo $2 | sed 's/\/*$//g') | |
| # get list of all changed files | |
| changes=$(git status --porcelain 2>&1) | |
| # exit if git status returned an error code | |
| if [ $? -ne 0 ] | |
| then | |
| echo | |
| echo " ${fg_red}$changes${c_reset}" | |
| echo | |
| exit 1 | |
| fi | |
| # file counters | |
| num_modified=0 | |
| num_deleted=0 | |
| # file length counters | |
| maxfilelength=0 | |
| filelength=0 | |
| # extract added and modified files | |
| files_modified=$(echo "$changes" | awk '{if($1~"A|M") print $2}') | |
| # extract deleted files | |
| files_deleted=$(echo "$changes" | awk '{if($1=="D") print $2}') | |
| # print modified files (if any) | |
| if [ "$files_modified" != "" ] | |
| then | |
| echo | |
| echo " The following files will be COPIED:" | |
| for file in $files_modified; | |
| do | |
| echo " ${fg_green}$file${c_reset}" | |
| ((num_modified++)) | |
| filelength=$(echo $file | wc -c) | |
| if [ $filelength -gt $maxfilelength ] | |
| then | |
| maxfilelength=$filelength | |
| fi | |
| done | |
| echo " ${fg_cyan}Total files: $num_modified${c_reset}" | |
| fi | |
| # print deleted files (if any) | |
| if [ "$files_deleted" != "" ] | |
| then | |
| echo | |
| echo " The following files will be DELETED:" | |
| for file in $files_deleted; | |
| do | |
| echo " ${fg_red}$file${c_reset}" | |
| ((num_deleted++)) | |
| filelength=$(echo $file | wc -c) | |
| if [ $filelength -gt $maxfilelength ] | |
| then | |
| maxfilelength=$filelength | |
| fi | |
| done | |
| echo " ${fg_cyan}Total files: $num_deleted${c_reset}" | |
| fi | |
| if [ $num_modified -eq 0 ] && [ $num_deleted -eq 0 ] | |
| then | |
| echo | |
| echo "Nothing to sync" | |
| echo | |
| exit 0 | |
| fi | |
| echo | |
| echo -n 'Do you want to continue (yes/no)?: ' | |
| read answer | |
| # exit it "yes" or "y" not received | |
| if [ "$answer" != "yes" ] && [ "$answer" != "y" ] | |
| then | |
| echo | |
| exit 1 | |
| fi | |
| echo | |
| # copy files | |
| if [ "$num_modified" -gt 0 ] | |
| then | |
| echo " ${c_underline_on}Copying:${c_reset}" | |
| for file in $files_modified; | |
| do | |
| mask=$(printf '%%-%ds' $maxfilelength) | |
| printf " $mask " $file | |
| filedir=$(dirname $file) | |
| cmd="scp $file $username:$targetdir/$filedir" | |
| output=$($cmd 2>&1) | |
| if [ $? -eq 0 ] | |
| then | |
| echo "${fg_green}ok${c_reset}" | |
| else | |
| echo "${fg_red}failed${c_reset} ($output)" | |
| fi | |
| done | |
| echo | |
| fi | |
| # delete files | |
| if [ "$num_deleted" -gt 0 ] | |
| then | |
| echo " ${c_underline_on}Deleting:${c_reset}" | |
| for file in $files_deleted; | |
| do | |
| mask=$(printf '%%-%ds' $maxfilelength) | |
| printf " $mask " $file | |
| filedir=$(dirname $file) | |
| cmd="ssh $username rm -f $targetdir/$file" | |
| output=$($cmd 2>&1) | |
| if [ $? -eq 0 ] | |
| then | |
| echo "${fg_green}ok${c_reset}" | |
| else | |
| echo "${fg_red}failed${c_reset} ($output)" | |
| fi | |
| done | |
| echo | |
| fi |
Thanks! FYI, updated because of issues with file/directories with spaces: https://gist.github.com/carsonreinke/3c42730a80dba02e7940d38b193c791e
I finally just added this repo: https://github.com/carsonreinke/git-scp
@codeaid, I can transfer you ownership, you did most the work.
6 years using your script! ;-)
@kneipp Haha! You madman! I didn't know this script existed until I got the notification. Great to hear that something of what I write is/was actually useful to someone :) Obrigado!
@carsonreinke Hey! Sorry, I completely missed your comments all those years ago! I've never been good at noticing Github notifications :/ That's very kind of you but don't worry about the ownership, you did the work so it's all yours. I put it out for people to use it so if someone finds it useful, that's all I ever wanted.
Awesome! Very usefull, thank you for sharing.