mirror of https://github.com/nirenjan/dotfiles.git
				
				
				
			Add 'scripts/' from commit '0e3760e65e20817dab6c03efee9ef545c80eed69'
git-subtree-dir: scripts git-subtree-mainline:master2c08462a0fgit-subtree-split:0e3760e65e
						commit
						7e4b71c044
					
				|  | @ -0,0 +1,20 @@ | |||
| Scripts | ||||
| ======= | ||||
| 
 | ||||
| Handy scripts for ease of use | ||||
| 
 | ||||
| * applygitconfig - Treat the contents of stdin as a gitconfig file and apply | ||||
|   them to the global config (~/.gitconfig) | ||||
| * backup - Folder backup utility script | ||||
| * beep - Sound a beep after executing the given command line | ||||
| * deploy - Deploy a set of files from a git repository to a destination folder | ||||
| * dircolortest - Test the contents of stdin as a .dir_colors file | ||||
| * git-branch-parent - Attempt to determine the branch root SHA | ||||
| * mkiso - Make ISO file from CD/DVD image suitable for burning | ||||
| * mkpasswd - Generate a random alphanumeric password of any length | ||||
| * mlog - Logging utility script | ||||
| * note - Note taking utility script | ||||
| * settitle - Set the terminal/tmux window title | ||||
| * smartwd - Print the current working directory for the command prompt | ||||
| * stardate - Print the current Stardate | ||||
| 
 | ||||
|  | @ -0,0 +1,27 @@ | |||
| #!/usr/bin/env perl | ||||
| # Script to apply git configuration to global gitconfig | ||||
| 
 | ||||
| my $section = 'unknown'; | ||||
| my $variable; | ||||
| my $value; | ||||
| my $command; | ||||
| 
 | ||||
| while(<>) { | ||||
|     chomp; | ||||
|     if (m/^\[(\w+)\]$/) { | ||||
|         $section = $1; | ||||
|         #print "Section: $section\n"; | ||||
|     } elsif (m/^\[(\w+) +"(\w+)"\]/) { | ||||
|         $section = "$1.$2"; | ||||
|         #print "Section: $section\n"; | ||||
|     } elsif (m/(\w+) += +(.+)$/) { | ||||
|         $variable = $1; | ||||
|         $value = $2; | ||||
| 
 | ||||
|         $value =~ s/"/\\"/g; | ||||
|         #print "\t$section.$variable = \"$value\"\n"; | ||||
|         $command = "git config --global $section.$variable \"$value\""; | ||||
|         print "$command\n"; | ||||
|         system($command); | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,202 @@ | |||
| #!/bin/bash | ||||
| # Script to backup folders to either a tarball or a Git repository | ||||
| # Script expects to run at most on a daily basis. Any faster, and you risk | ||||
| # overwriting a previous backup. | ||||
| 
 | ||||
| # Default environment variables used | ||||
| BACKUP_METHOD=git | ||||
| BACKUP_TS=$(date +%F) | ||||
| BACKUP_DEBUG=false | ||||
| BACKUP_SRC='' | ||||
| BACKUP_DST='' | ||||
| BACKUP_DB='' | ||||
| 
 | ||||
| APP=$(basename $0) | ||||
| 
 | ||||
| # Usage function will display the usage | ||||
| usage() | ||||
| { | ||||
|     local backup=$APP | ||||
|     local exit_code=$1 | ||||
| 
 | ||||
|     [[ -z $exit_code ]] && exit_code=0 | ||||
| 
 | ||||
|     echo "Usage: $backup [options] <source path>" | ||||
|     echo "Options:" | ||||
|     echo "    -s tar    Save to a tarball, format is backup-%Y-%m-%d.tar.gz" | ||||
|     echo "              This is the default." | ||||
|     echo "    -s git    Save to a git repository and tag the commit" | ||||
|     echo | ||||
|     echo "    -t <dst>  Specify the path to save the backup to. If omitted," | ||||
|     echo "              it defaults to ~/backups/\$(basename <src>)" | ||||
|     echo | ||||
|     echo "    -d <db>   Specify a MySQL database to backup in addition to" | ||||
|     echo "              the files in the source path. This requires you to" | ||||
|     echo "              save the MySQL root password in ~/.my.cnf" | ||||
|     echo | ||||
|     echo "    -h        Display this help message" | ||||
| 
 | ||||
|     exit $exit_code | ||||
| } | ||||
| 
 | ||||
| # Die function will print the error message to stderr and abort the script | ||||
| die() | ||||
| { | ||||
|     local exit_code=$1 | ||||
|     local backup=$APP | ||||
|     shift | ||||
| 
 | ||||
|     for msg in "$@" | ||||
|     do | ||||
|         echo -e "$backup: $msg" >&2 | ||||
|     done | ||||
| 
 | ||||
|     exit $exit_code | ||||
| } | ||||
| 
 | ||||
| # Sanity check | ||||
| backup_sanity() | ||||
| { | ||||
|     if [[ -z $BACKUP_SRC ]] | ||||
|     then | ||||
|         die 1 "Need to specify a source" | ||||
|     fi | ||||
| 
 | ||||
|     # Run basic sanity checks on env variables | ||||
|     if [[ -z $BACKUP_DST ]] | ||||
|     then | ||||
|         BACKUP_DST=$HOME/backups/$(basename $BACKUP_SRC) | ||||
|     fi | ||||
| 
 | ||||
|     mkdir -p $BACKUP_DST | ||||
|     if [[ $? != 0 ]] | ||||
|     then | ||||
|         die 2 "Error creating backup folder" | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| # Retrieve data using rsync | ||||
| backup_data() | ||||
| { | ||||
|     # Don't rsync if we are using tar as the backup method | ||||
|     if [[ "$BACKUP_METHOD" != "tar" ]] | ||||
|     then | ||||
|         rsync -a $BACKUP_SRC $BACKUP_DST | ||||
| 
 | ||||
|         if [[ $? != 0 ]] | ||||
|         then | ||||
|             die 2 "Error syncing data from source $BACKUP_SRC" | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| # Backup the database | ||||
| backup_db() | ||||
| { | ||||
|     if [[ ! -z $BACKUP_DB ]] | ||||
|     then | ||||
|         # Dump using mysqldump | ||||
|         mysqldump -u root $BACKUP_DB >$BACKUP_DST/$BACKUP_DB.sql 2>/dev/null | ||||
| 
 | ||||
|         if [[ $? != 0 ]] | ||||
|         then | ||||
|             die 2 "Error dumping database $BACKUP_DB" | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| # Save the files to git repo or tarball | ||||
| backup_save() | ||||
| { | ||||
|     if [[ "$BACKUP_METHOD" == "tar" ]] | ||||
|     then | ||||
|         cd $BACKUP_SRC | ||||
|         local daily=$BACKUP_DST/backup-daily-$BACKUP_TS.tar.gz | ||||
|         tar czf $daily . | ||||
| 
 | ||||
|         # Weekly tarballs every Sunday | ||||
|         if [[ $(date +%w) == "0" ]] | ||||
|         then | ||||
|             local weekly=$BACKUP_DST/backup-weekly-$(date +%Y-%U).tar.gz | ||||
|             ln $daily $weekly | ||||
|         fi | ||||
| 
 | ||||
|         # Monthly tarballs on the first of every month | ||||
|         if [[ $(date +%-d) == "1" ]] | ||||
|         then | ||||
|             local monthly=$BACKUP_DST/backup-monthly-$(date +%Y-%m).tar.gz | ||||
|             ln $daily $monthly | ||||
|         fi | ||||
|     else | ||||
|         cd $BACKUP_DST | ||||
|         git init -q | ||||
|         git config core.safecrlf false | ||||
|         git add . | ||||
|         git commit -m "Backup of $BACKUP_SRC on $BACKUP_TS" | ||||
|         git tag -am "Daily ($BACKUP_TS) backup of $BACKUP_SRC" daily-$BACKUP_TS | ||||
| 
 | ||||
|         # Weekly tags every Sunday | ||||
|         if [[ $(date +%w) == "0" ]] | ||||
|         then | ||||
|             local week=$(date +%Y-%U) | ||||
|             git tag -am "Weekly ($week) backup of $BACKUP_SRC" weekly-$week | ||||
|         fi | ||||
| 
 | ||||
|         # Monthly tags on the first of every month | ||||
|         if [[ $(date +%-d) == "1" ]] | ||||
|         then | ||||
|             local month=$(date +%Y-%m) | ||||
|             git tag -am "Monthly ($month) backup of $BACKUP_SRC" monthly-$month | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| while getopts :hs:t:d: OPTION | ||||
| do | ||||
|     case $OPTION in | ||||
|     h) | ||||
|         # Help | ||||
|         usage 0 | ||||
|         ;; | ||||
| 
 | ||||
|     s) | ||||
|         # Backup method | ||||
|         if [[ "$OPTARG" == "git" || "$OPTARG" == "tar" ]] | ||||
|         then | ||||
|             BACKUP_METHOD=$OPTARG | ||||
|         else | ||||
|             die 1 "Backup method must be one of git or tar" | ||||
|         fi | ||||
|         ;; | ||||
|     t) | ||||
|         # Target folder | ||||
|         BACKUP_DST=$OPTARG | ||||
|         ;; | ||||
| 
 | ||||
|     d) | ||||
|         # Database | ||||
|         BACKUP_DB=$OPTARG | ||||
|         ;; | ||||
| 
 | ||||
|     :) | ||||
|         # Missing required argument | ||||
|         die 1 "Missing argument for option -$OPTARG" | ||||
|         ;; | ||||
| 
 | ||||
|     \?) | ||||
|         # Invalid option | ||||
|         die 1 "Invalid option: -$OPTARG" | ||||
|         ;; | ||||
| 
 | ||||
|     esac | ||||
| done | ||||
| 
 | ||||
| # Shift away the options | ||||
| shift $(($OPTIND - 1)) | ||||
| 
 | ||||
| BACKUP_SRC=$1 | ||||
| backup_sanity | ||||
| backup_data | ||||
| backup_db | ||||
| backup_save | ||||
| 
 | ||||
|  | @ -0,0 +1,8 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| if [[ $# -gt 0 ]] | ||||
| then | ||||
|     eval "$@" | ||||
| fi | ||||
| 
 | ||||
| echo -e "\007" | ||||
|  | @ -0,0 +1,195 @@ | |||
| #!/bin/bash | ||||
| # Script to copy files from a Git repository to a destination | ||||
| # Reads deployment instructions from a file and acts accordingly | ||||
| # | ||||
| # File Format | ||||
| # =========== | ||||
| # | ||||
| # Comments begin with a # character and terminate at the end of the line. | ||||
| # | ||||
| # The keyword 'repo' specifies the path to the repository. The repository must | ||||
| # be accessible locally without having to resort to ssh, https or git protocols. | ||||
| # Usage: repo <path to repo> | ||||
| # | ||||
| # The keyword 'target' specifies the location to which to deploy. If omitted, it | ||||
| # defaults to the current folder. Folders can be specified relative to the | ||||
| # current folder, relative to the home directory, or relative to the root, using | ||||
| # ./ or ../, ~/ and / as prefixes respectively. The parameter must be a valid | ||||
| # directory. | ||||
| # Usage: target <path to install to> | ||||
| # | ||||
| # The keyword 'file' specifies the file location relative to the root of the | ||||
| # Git repository, along with the version to install and an optional rename | ||||
| # argument which allows you to rename the destination file. If the version is | ||||
| # omitted, it defaults to HEAD. If the rename-to parameter is omitted, the | ||||
| # filename is the same as the name within the repository. | ||||
| # Usage: file <path to file within repo> [version [rename-to]] | ||||
| 
 | ||||
| # Default environment variables used | ||||
| DEPLOY_GIT='' | ||||
| DEPLOY_TGT=$(pwd) | ||||
| DEPLOY_SRC='' | ||||
| DEPLOY_LST='' | ||||
| DEPLOY_DEBUG=false | ||||
| 
 | ||||
| # Usage function will display the usage | ||||
| usage() | ||||
| { | ||||
|     local deploy=$(basename $0) | ||||
|     echo "Usage: $deploy <deploy-file1> <deploy-file2> ..." | ||||
|     exit 0 | ||||
| } | ||||
| 
 | ||||
| # Die function will print the error message to stderr and abort the script | ||||
| die() | ||||
| { | ||||
|     local exit_code=$1 | ||||
|     local deploy=$(basename $0) | ||||
|     shift | ||||
| 
 | ||||
|     for msg in "$@" | ||||
|     do | ||||
|         echo -e "$deploy: $msg" >&2 | ||||
|     done | ||||
| 
 | ||||
|     if [[ $exit_code != 128 && $exit_code != 0 ]] | ||||
|     then | ||||
|         echo -e "\tError in file $DEPLOY_SRC line ${BASH_LINENO[1]}" >&2 | ||||
|     fi | ||||
| 
 | ||||
|     exit $exit_code | ||||
| } | ||||
| 
 | ||||
| # Debug function will display all data, but only if debugs are enabled | ||||
| debug() | ||||
| { | ||||
|     $DEPLOY_DEBUG && echo "$@" | ||||
| } | ||||
| 
 | ||||
| # Repo function checks if it is a valid Git repo and sets the DEPLOY_GIT | ||||
| repo() | ||||
| { | ||||
|     if [[ $# != 1 ]] | ||||
|     then | ||||
|         die 4 "Invalid usage of repo command" "Usage: repo <path to Git repo>" | ||||
|     fi | ||||
| 
 | ||||
|     if [[ -d "$1" ]] | ||||
|     then | ||||
|         cd "$1" | ||||
|         local gtl=$(git rev-parse --show-toplevel 2>/dev/null) | ||||
| 
 | ||||
|         if [[ -z $gtl ]] | ||||
|         then | ||||
|             die 3 "Path $1 is not a valid Git repository!" | ||||
|         else | ||||
|             debug "Using repository $gtl" | ||||
|             DEPLOY_GIT="$gtl" | ||||
|         fi | ||||
|     else | ||||
|         die 1 "Path $1 does not exist!" | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| # Target function checks if it is a valid directory and sets the DEPLOY_TGT | ||||
| target() | ||||
| { | ||||
|     if [[ $# != 1 ]] | ||||
|     then | ||||
|         die 4 "Invalid usage of target command" "Usage: target <path>" | ||||
|     fi | ||||
| 
 | ||||
|     if [[ -d "$1" ]] | ||||
|     then | ||||
|         debug "Target folder $1" | ||||
|         DEPLOY_TGT="$1" | ||||
|     else | ||||
|         die 1 "Path $1 does not exist!" | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| # File command selects a file to deploy | ||||
| file() | ||||
| { | ||||
|     if [[ $# == 0 || $# > 3 ]] | ||||
|     then | ||||
|         die 4 "Invalid usage of file command" \ | ||||
|               "Usage: file <path from root of repo> [<version> [<rename-to>] ]" | ||||
|     fi | ||||
| 
 | ||||
|     if [[ -z $DEPLOY_GIT ]] | ||||
|     then | ||||
|         die 2 "Must specify repo before file!" | ||||
|     fi | ||||
| 
 | ||||
|     if [[ -z $DEPLOY_TGT ]] | ||||
|     then | ||||
|         die 2 "Must specify target before file!" | ||||
|     fi | ||||
| 
 | ||||
|     local file=$1 | ||||
|     local ver=$2 | ||||
|     local rename=$3 | ||||
| 
 | ||||
|     debug "file $@" | ||||
| 
 | ||||
|     # Sanity check on ver | ||||
|     [[ -z $ver ]] && ver=HEAD | ||||
| 
 | ||||
|     # Sanity check on rename | ||||
|     [[ -z $rename ]] && rename=$(basename $file) | ||||
| 
 | ||||
|     cd $DEPLOY_GIT | ||||
| 
 | ||||
|     # Check to make sure that version is a sane version | ||||
|     git rev-parse $ver &>/dev/null | ||||
| 
 | ||||
|     if [[ $? != 0 ]] | ||||
|     then | ||||
|         die 3 "Version $ver does not exist in the repository $DEPLOY_GIT" | ||||
|     fi | ||||
| 
 | ||||
|     local vercheck=$(git rev-parse $ver 2>/dev/null) | ||||
|     debug "Using version $vercheck" | ||||
| 
 | ||||
|     # Check to make sure that the file is valid in the specified version | ||||
|     git show $vercheck:$file &>/dev/null | ||||
| 
 | ||||
|     if [[ $? != 0 ]] | ||||
|     then | ||||
|         die 3 "File $file does not exist in version $ver of the repo $DEPLOY_GIT" | ||||
|     else | ||||
|         debug "Using file $file" | ||||
|         # Build the commands to extract the file and set the | ||||
|         # executable permissions bit in the deployed file. | ||||
|         local cmd="cd $DEPLOY_GIT" | ||||
|         cmd="$cmd; git show $vercheck:$file > $DEPLOY_TGT/$rename" | ||||
|         cmd="$cmd; chmod +x $DEPLOY_TGT/$rename;" | ||||
|         DEPLOY_LST="$DEPLOY_LST $cmd" | ||||
|     fi | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| if [[ $# == 0 ]] | ||||
| then | ||||
|     usage | ||||
| else | ||||
|     for i in "$@" | ||||
|     do | ||||
|         if [[ -f $i && -r $i ]] | ||||
|         then | ||||
|             DEPLOY_SRC=$i | ||||
|             source $i | ||||
|         else | ||||
|             die 128 "Deploy file $i does not exist or is not readable!" | ||||
|         fi | ||||
|     done | ||||
| fi | ||||
| 
 | ||||
| if [[ ! -z $DEPLOY_LST ]] | ||||
| then | ||||
|     eval $DEPLOY_LST | ||||
| else | ||||
|     die 0 "No files to deploy!" | ||||
| fi | ||||
| 
 | ||||
|  | @ -0,0 +1,56 @@ | |||
| #!/usr/bin/perl | ||||
| # A utility script to test out dircolors settings without reloading | ||||
| # Usage: dircolortest <dircolors file> | ||||
| 
 | ||||
| if ($#ARGV < 0) { | ||||
|     die "Usage: $0 <dircolors file>\n"; | ||||
| } | ||||
| 
 | ||||
| if ($#ARGV > 0) { | ||||
|     warn "Ignoring additional command line arguments\n"; | ||||
| } | ||||
| 
 | ||||
| # Open the file and get the handle | ||||
| open DCFILE, $ARGV[0] or | ||||
|     die "Cannot open dircolors file $ARGV[0]! $!\n"; | ||||
| 
 | ||||
| $line_counter = 0; | ||||
| 
 | ||||
| while ($line = <DCFILE>) { | ||||
|     chomp $line; | ||||
| 
 | ||||
|     # Strip off any comments | ||||
|     $line =~ s/#.*$//; | ||||
| 
 | ||||
|     # Strip off leading and trailing whitespace | ||||
|     $line =~ s/^\s*//; | ||||
|     $line =~ s/\s*$//; | ||||
| 
 | ||||
|     if ($line ne '') { | ||||
|         ($type, $format) = split /\s+/, $line; | ||||
| 
 | ||||
|         # Ignore the following lines, we don't care about them here | ||||
|         next if (($type eq 'TERM') || ($type eq 'COLOR') || | ||||
|                  ($type eq 'OPTIONS') || ($type eq 'EIGHTBIT')); | ||||
| 
 | ||||
|         # Just a little enhancement, if the type begins with a . | ||||
|         if ($type =~ m/^\./) { | ||||
|             $type = "*$type"; | ||||
|         } | ||||
| 
 | ||||
|         print "\033[${format}m$type\033[m"; | ||||
| 
 | ||||
|         $line_counter = $line_counter + 1; | ||||
| 
 | ||||
|         if ($line_counter == 8) { | ||||
|             print "\n"; | ||||
|             $line_counter = 0; | ||||
|         } else { | ||||
|             print "\t"; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| print "\n" if ($line_counter != 0); | ||||
| 
 | ||||
| close DCFILE; | ||||
|  | @ -0,0 +1,28 @@ | |||
| #!/bin/bash | ||||
| # | ||||
| # Support script to find the commit from which the given branch was spawned. | ||||
| # Takes one or two arguments, the first argument is mandatory and specifies | ||||
| # the child branch while the second argument is optional and specifies the | ||||
| # parent branch. If omitted, the parent branch defaults to 'master' | ||||
| 
 | ||||
| CHILD=$1 | ||||
| PARENT=$2 | ||||
| 
 | ||||
| USAGE="Usage: $0 <child branch> <parent branch>" | ||||
| 
 | ||||
| if [ "$CHILD" == "" ] | ||||
| then | ||||
|     echo $USAGE | ||||
|     exit | ||||
| fi | ||||
| 
 | ||||
| if [ "$PARENT" == "" ] | ||||
| then | ||||
|     PARENT="master" | ||||
| fi | ||||
| 
 | ||||
| PCOMMIT=`diff -u <(git rev-list --first-parent $CHILD) \ | ||||
|     <(git rev-list --first-parent $PARENT) | sed -ne 's/^ //p' | head -1` | ||||
| 
 | ||||
| git show --pretty="%H %an | %s" $PCOMMIT | head -1 | ||||
| 
 | ||||
|  | @ -0,0 +1,207 @@ | |||
| #!/bin/bash | ||||
| # Script to create cscope.out file for any workspace | ||||
| # Script expects to see a .mkcscope.conf file in either the current working | ||||
| # directory or in your $HOME. The format of the file is as follows: | ||||
| # | ||||
| # This is essentially a Bash script, using a structured language as follows: | ||||
| # target foo bar | ||||
| #   desc Description for foo | ||||
| #   files <relative path to directory> <file patterns> | ||||
| # | ||||
| # The above segment shows a sample target 'foo', which depends on a different | ||||
| # target 'bar'. The desc line is a description for use in the help, while the | ||||
| # files command specifies a directory relative to the current directory and | ||||
| # the file patterns to search for and add to the cscope file list. The script | ||||
| # expects to run from the base folder for the project workspace, and the | ||||
| # directories in the files command are relative to this base folder. | ||||
| # | ||||
| # Example: | ||||
| # -------- | ||||
| # target tmux ncurses | ||||
| #   desc tmux Source code | ||||
| #   files tmux *.[ch] *.[cpp] | ||||
| # | ||||
| # target ncurses | ||||
| #   desc ncurses source code | ||||
| #   files ncurses *.[ch] | ||||
| 
 | ||||
| APP=$(basename $0) | ||||
| VERSION='1.0.1' | ||||
| MAKEFILE=/dev/null | ||||
| CONFFILE='.mkcscope.conf' | ||||
| 
 | ||||
| declare -a TARGETS=() | ||||
| 
 | ||||
| usage() | ||||
| { | ||||
|     echo "$APP v$VERSION" | ||||
|     echo "Usage: $APP [options] <targets>" | ||||
|     echo | ||||
|     echo "Options:" | ||||
|     echo "--------" | ||||
|     echo "      -h      Show this help screen" | ||||
|     echo "      -l      List targets" | ||||
|     echo "      -r      Rebuild cscope DB without regenerating files" | ||||
|     echo "      -c      Create a blank config file in the current directory" | ||||
|     echo | ||||
| } | ||||
| 
 | ||||
| files() | ||||
| { | ||||
|     local dir=$1 | ||||
|     shift | ||||
|     for patt in "$@" | ||||
|     do | ||||
|         echo -e "\t@find $PWD/$dir -name \"$patt\" -print >> $CSCOPE_FILES" >> $MAKEFILE | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| desc() | ||||
| { | ||||
|     echo -e "\t@echo $@" >> $MAKEFILE | ||||
| } | ||||
| 
 | ||||
| target() | ||||
| { | ||||
|     local tgt=$1 | ||||
|     shift | ||||
| 
 | ||||
|     echo "$tgt: $@" >> $MAKEFILE | ||||
| 
 | ||||
|     TARGETS=(${TARGETS[@]} $tgt) | ||||
| } | ||||
| 
 | ||||
| list_targets() | ||||
| { | ||||
|     echo "Supported targets:" | ||||
|     echo "------------------" | ||||
|     for tgt in ${TARGETS[@]} | ||||
|     do | ||||
|         echo " - $tgt" | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| gen_makefile() | ||||
| { | ||||
|     MAKEFILE=$(mktemp --tmpdir cscope-$USER-XXXXXXXX.mk) | ||||
|     CSCOPE_FILES=$PWD/cscope.files | ||||
| } | ||||
| 
 | ||||
| gen_cscope() | ||||
| { | ||||
|     cscope -bqv | ||||
| } | ||||
| 
 | ||||
| gen_targets() | ||||
| { | ||||
|     set -f | ||||
| 
 | ||||
|     if [[ -r "$PWD/$CONFFILE" ]] | ||||
|     then | ||||
|         source "$PWD/$CONFFILE" | ||||
|     elif [[ -r "$HOME/$CONFFILE" ]] | ||||
|     then | ||||
|         source "$HOME/$CONFFILE" | ||||
|     else | ||||
|         echo "Unable to find a configuration file!" >&2 | ||||
|         echo "Expect to find a $CONFFILE in either of:" >&2 | ||||
|         echo "    $PWD" >&2 | ||||
|         echo "    $HOME" >&2 | ||||
|         exit 1 | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| gen_config() | ||||
| { | ||||
|     (cat <<-EOM | ||||
| # Configuration for mkcscope | ||||
| # This is essentially a Bash script, using a structured language as follows: | ||||
| # target foo bar | ||||
| #   desc Description for foo | ||||
| #   files <relative path to directory> <file patterns> | ||||
| # | ||||
| # The above segment shows a sample target 'foo', which depends on a different | ||||
| # target 'bar'. The desc line is a description for use in the help, while the | ||||
| # files command specifies a directory relative to the current directory and | ||||
| # the file patterns to search for and add to the cscope file list. The script | ||||
| # expects to run from the base folder for the project workspace, and the | ||||
| # directories in the files command are relative to this base folder. | ||||
| 
 | ||||
| # Sample configuration | ||||
| # target foo bar | ||||
| #     desc Target 'foo' depends on 'bar' | ||||
| #     # Files are in the folder foo relative to \$PWD | ||||
| #     files foo *.[ch] *.cpp | ||||
| # | ||||
| # target bar baz | ||||
| #     desc Target 'bar' depends on 'baz' | ||||
| #     # Multiple files | ||||
| #     files bar/folder1 *.s | ||||
| #     files bar/folder2 *.h | ||||
| # | ||||
| # target baz | ||||
| #     desc Target 'baz' does not depend on anything | ||||
| #     files baz/*.c | ||||
| 
 | ||||
| EOM | ||||
|     ) > "$PWD/$CONFFILE" | ||||
| } | ||||
| 
 | ||||
| cleanup() | ||||
| { | ||||
|     rm $MAKEFILE | ||||
| } | ||||
| 
 | ||||
| trap cleanup "EXIT" | ||||
| 
 | ||||
| gen_makefile | ||||
| gen_targets | ||||
| 
 | ||||
| while getopts "hlrc" OPTION | ||||
| do | ||||
|     case $OPTION in | ||||
|     h) | ||||
|         usage | ||||
|         exit 0 | ||||
|         ;; | ||||
| 
 | ||||
|     l) | ||||
|         list_targets | ||||
|         exit 0 | ||||
|         ;; | ||||
| 
 | ||||
|     r) | ||||
|         echo "Rebuilding existing cscope database" | ||||
|         gen_cscope | ||||
|         exit 0 | ||||
|         ;; | ||||
| 
 | ||||
|     c) | ||||
|         echo "Creating blank configuration" | ||||
|         gen_config | ||||
|         exit 0 | ||||
|         ;; | ||||
| 
 | ||||
|     \?) | ||||
|         echo "Invalid option -$OPTARG" | ||||
|         exit 1 | ||||
|         ;; | ||||
|     esac | ||||
| done | ||||
| 
 | ||||
| shift $(($OPTIND - 1)) | ||||
| 
 | ||||
| if [[ -n "$1" ]] | ||||
| then | ||||
|     rm -f $CSCOPE_FILES | ||||
|     make -f $MAKEFILE "$@" | ||||
| 
 | ||||
|     if [[ ! -s $CSCOPE_FILES ]] | ||||
|     then | ||||
|         echo "$APP: Must specify targets to generate file list!" >&2 | ||||
|         exit 1 | ||||
|     fi | ||||
| 
 | ||||
|     gen_cscope | ||||
| fi | ||||
| 
 | ||||
|  | @ -0,0 +1,72 @@ | |||
| #!/bin/bash | ||||
| # Make an ISO/Joliet compatible image from a CDR image on OS X | ||||
| # Developed based on http://forums.macrumors.com/showthread.php?t=220740 | ||||
| 
 | ||||
| APP=$(echo $0 | sed 's#^.*/##') | ||||
| 
 | ||||
| usage() | ||||
| { | ||||
|     echo " | ||||
| $APP converts an image into ISO/Joliet compatible format suitable for | ||||
| burning onto a CD/DVD and having it cross-compatible with Win32/OSX/*NIX | ||||
| 
 | ||||
| Usage: $APP [-o <output file>] <input file> | ||||
| " | ||||
| } | ||||
| 
 | ||||
| while getopts :ho: OPTION | ||||
| do | ||||
|     case $OPTION in | ||||
|     h) | ||||
|         # Help | ||||
|         usage | ||||
|         exit 0 | ||||
|         ;; | ||||
| 
 | ||||
|     o) | ||||
|         # Output file | ||||
|         OUTFILE=$OPTARG | ||||
|         ;; | ||||
| 
 | ||||
|     :) | ||||
|         # Missing required argument | ||||
|         echo "$APP: Missing argument for option -$OPTARG" >&2 | ||||
|         exit 1 | ||||
|         ;; | ||||
| 
 | ||||
|     \?) | ||||
|         # Invalid option | ||||
|         echo "$APP: Invalid option: -$OPTARG" >&2 | ||||
|         exit 1 | ||||
|         ;; | ||||
|     esac | ||||
| done | ||||
| 
 | ||||
| # Shift away the options | ||||
| shift $(($OPTIND - 1)) | ||||
| 
 | ||||
| INFILE=$1 | ||||
| 
 | ||||
| if [[ -z $INFILE ]] | ||||
| then | ||||
|     usage | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| if [[ ! -r $INFILE ]] | ||||
| then | ||||
|     echo "$APP: Unable to read input file $INFILE" >&2 | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| if [[ -z $OUTFILE ]] | ||||
| then | ||||
|     OUTFILE=$(echo $INFILE | sed -E 's#\.[^\.]+$#\.iso#') | ||||
| fi | ||||
| 
 | ||||
| echo "Input file = $INFILE" | ||||
| echo "Output file = $OUTFILE" | ||||
| 
 | ||||
| hdiutil makehybrid -iso -joliet -o "$OUTFILE" "$INFILE" | ||||
| 
 | ||||
| exit $? | ||||
|  | @ -0,0 +1,5 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| len=$1 | ||||
| [[ "$len" == "" ]] && len=16 | ||||
| LC_CTYPE=C tr -dc "[:alnum:]" < /dev/urandom | head -c ${len} | xargs | ||||
|  | @ -0,0 +1,52 @@ | |||
| #!/bin/bash | ||||
| # Monthly logging script | ||||
| # Call mlog and it will update a log file | ||||
| 
 | ||||
| # Set the default mlog folder | ||||
| [[ -z $MLOG_FOLDER ]] && MLOG_FOLDER="$HOME/mlog" | ||||
| 
 | ||||
| # Make sure that the folder exists | ||||
| [[ ! -d $MLOG_FOLDER ]] && mkdir -pv $MLOG_FOLDER | ||||
| 
 | ||||
| # Make sure that we have a valid TMPDIR | ||||
| [[ -z $TMPDIR ]] && TMPDIR='/tmp' | ||||
| 
 | ||||
| # Make sure that we have a valid EDITOR | ||||
| [[ -z $EDITOR ]] && EDITOR=vim | ||||
| 
 | ||||
| MLOG_HDR='' | ||||
| MLOG_TS="[$(date)]" | ||||
| MLOG_LOG="$MLOG_FOLDER/$(date +%Y-%m)" | ||||
| MLOG_FILE="$TMPDIR/mlog-tmp-$$" | ||||
| 
 | ||||
| if [[ -x $HOME/bin/stardate ]] | ||||
| then | ||||
|     [[ -z $MLOG_RANK ]] && MLOG_RANK='Chief Engineer' | ||||
| 
 | ||||
|     MLOG_HDR=`echo "$MLOG_RANK's log, Stardate $($HOME/bin/stardate)" | sed 's/.$//'` | ||||
| 
 | ||||
|     if [[ -e $MLOG_LOG ]] | ||||
|     then | ||||
|         MLOG_LAST=$(grep Stardate $MLOG_LOG | tail -1) | ||||
| 
 | ||||
|         if [[ "$MLOG_LAST" == "$MLOG_HDR" ]] | ||||
|         then | ||||
|             MLOG_HDR="$MLOG_RANK's log, supplemental" | ||||
|         fi | ||||
|     fi | ||||
| fi | ||||
| 
 | ||||
| $EDITOR $MLOG_FILE | ||||
| 
 | ||||
| [[ ! -s $MLOG_FILE ]] && rm -f $MLOG_FILE && exit 0 | ||||
| 
 | ||||
| 
 | ||||
| echo "$MLOG_HDR" >> $MLOG_LOG | ||||
| echo "$MLOG_TS"  >> $MLOG_LOG | ||||
| echo             >> $MLOG_LOG   # Empty line | ||||
| cat $MLOG_FILE >> $MLOG_LOG | ||||
| echo -en "\n----------------------------------------" >> $MLOG_LOG | ||||
| echo -e "----------------------------------------\n" >> $MLOG_LOG | ||||
| 
 | ||||
| rm -f $MLOG_FILE | ||||
| 
 | ||||
|  | @ -0,0 +1,140 @@ | |||
| #!/bin/bash | ||||
| # Script to create a new shell script and open it for editing | ||||
| 
 | ||||
| APP=$(basename $0) | ||||
| 
 | ||||
| ####################################################################### | ||||
| # Set default options | ||||
| ####################################################################### | ||||
| NEWSH_SCRIPT_TYPE=bash | ||||
| NEWSH_USE_ABS_PATH=0 | ||||
| NEWSH_NO_EXEC_FLAG=0 | ||||
| NEWSH_TRUNC_SCRIPT=0 | ||||
| NEWSH_SCRIPT_FILE= | ||||
| 
 | ||||
| ####################################################################### | ||||
| # Usage information | ||||
| ####################################################################### | ||||
| usage() | ||||
| { | ||||
|     cat <<-EOM | ||||
| Usage: $APP OPTIONS <new-shell-script-filename> | ||||
| 
 | ||||
| OPTIONS | ||||
|     -t <type>       Type of script to create (bash/python/ruby/expect) | ||||
|     -a              Use absolute path to binary instead of the env wrapper | ||||
|     -x              Don't make the file executable | ||||
|     -f              Overwrite the script file if it already exists | ||||
|     -h              Display this help message | ||||
| 
 | ||||
| $APP will abort if the specified filename already exists | ||||
| EOM | ||||
| } | ||||
| 
 | ||||
| ####################################################################### | ||||
| # Get path to binary | ||||
| ####################################################################### | ||||
| get_binary_path() | ||||
| { | ||||
|     local binary=$1 | ||||
|     local env_path=$(which env) | ||||
|     local bin_path=$(which $binary) | ||||
| 
 | ||||
|     if [[ -z "$bin_path" ]] | ||||
|     then | ||||
|         echo "$APP: fatal: Cannot find $binary" >&2 | ||||
|         exit 1 | ||||
|     fi | ||||
| 
 | ||||
|     case "$NEWSH_USE_ABS_PATH" in | ||||
|     0) | ||||
|         # Use env as the path specifier | ||||
|         NEWSH_BINARY_PATH="$env_path $binary" | ||||
|         ;; | ||||
| 
 | ||||
|     1) | ||||
|         # Use absolute path to the binary as the path specifier | ||||
|         NEWSH_BINARY_PATH="$bin_path" | ||||
|         ;; | ||||
| 
 | ||||
|     *) | ||||
|         echo "$APP: fatal: Corrupted internal state!" >&2 | ||||
|         echo "$APP: USE_ABS_PATH=$NEWSH_USE_ABS_PATH" >&2 | ||||
|         exit 2 | ||||
|         ;; | ||||
|     esac | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ####################################################################### | ||||
| # Verify command line switches | ||||
| ####################################################################### | ||||
| while getopts "t:axfh" OPTION | ||||
| do | ||||
|     case "$OPTION" in | ||||
|     h) | ||||
|         usage | ||||
|         exit 0 | ||||
|         ;; | ||||
| 
 | ||||
|     t) | ||||
|         NEWSH_SCRIPT_TYPE=$OPTARG | ||||
|         ;; | ||||
| 
 | ||||
|     a) | ||||
|         NEWSH_USE_ABS_PATH=1 | ||||
|         ;; | ||||
| 
 | ||||
|     x) | ||||
|         NEWSH_NO_EXEC_FLAG=1 | ||||
|         ;; | ||||
| 
 | ||||
|     f) | ||||
|         NEWSH_TRUNC_SCRIPT=1 | ||||
|         ;; | ||||
| 
 | ||||
|     \?) | ||||
|         exit 1 | ||||
|         ;; | ||||
| 
 | ||||
|     :) | ||||
|         echo "$APP: Option -$OPTARG requires an argument" >&2 | ||||
|         exit 1 | ||||
|         ;; | ||||
|     esac | ||||
| done | ||||
| 
 | ||||
| shift $((OPTIND - 1)) | ||||
| NEWSH_SCRIPT_FILE=$1 | ||||
| 
 | ||||
| if [[ -z "$NEWSH_SCRIPT_FILE" ]] | ||||
| then | ||||
|     echo "$APP: fatal: Missing script file!" >&2 | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| if [[ -e "$NEWSH_SCRIPT_FILE" ]] | ||||
| then | ||||
|     if [[ "$NEWSH_TRUNC_SCRIPT" == "0" ]] | ||||
|     then | ||||
|         echo "$APP: fatal: Existing script file $NEWSH_SCRIPT_FILE" >&2 | ||||
|         exit 1 | ||||
|     elif [[ "$NEWSH_TRUNC_SCRIPT" == "1" ]] | ||||
|     then | ||||
|         echo "$APP: overwriting existing script file $NEWSH_SCRIPT_FILE" >&2 | ||||
|     fi | ||||
| fi | ||||
| 
 | ||||
| get_binary_path $NEWSH_SCRIPT_TYPE | ||||
| (cat <<-EOF | ||||
| #!$NEWSH_BINARY_PATH | ||||
| # Autogenerated by $APP on $(date +%F) at $(date +%T%z) | ||||
| 
 | ||||
| EOF | ||||
| ) > "$NEWSH_SCRIPT_FILE" | ||||
| 
 | ||||
| # Check and make file executable | ||||
| if [[ "$NEWSH_NO_EXEC_FLAG" == "0" ]] | ||||
| then | ||||
|     chmod +x "$NEWSH_SCRIPT_FILE" | ||||
| fi | ||||
|  | @ -0,0 +1,330 @@ | |||
| #!/bin/bash | ||||
| # Notes manager for the command line | ||||
| 
 | ||||
| NOTES_VER="0.1a" | ||||
| NOTES_DIR="$HOME/.notes" | ||||
| 
 | ||||
| # Initialize with the default editor | ||||
| [ -z "$EDITOR" ] && EDITOR="/usr/bin/vim" | ||||
| 
 | ||||
| dprint() { | ||||
|     if [ ! -z $NOTES_DEBUG ]; then | ||||
|         echo $* | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| notes_init() { | ||||
|     # Check if the notes folder exists, if not, create it | ||||
|     if [ ! -d $NOTES_DIR ] | ||||
|     then | ||||
|         echo -n "Creating notes folder..." | ||||
|         mkdir -p $NOTES_DIR | ||||
|         cd $NOTES_DIR | ||||
|         echo "done." | ||||
| 
 | ||||
|         git init . | ||||
|     else | ||||
|         echo "Notes has already been initialized." | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| make_title() { | ||||
|     echo "$*" | sed 's/[^A-Za-z0-9_]\+/-/g' | \ | ||||
|     sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' | ||||
| } | ||||
| 
 | ||||
| title_to_name() { | ||||
|     note_file=$NOTES_DIR/$(make_title $note_arg) | ||||
| } | ||||
| 
 | ||||
| check_arg() { | ||||
|     if [ -z "$note_arg" ] | ||||
|     then | ||||
|         echo "Must specify a note title!" | ||||
|         exit | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| note_exists() { | ||||
|     [[ -f "$note_file" ]] | ||||
| } | ||||
| 
 | ||||
| check_md5() { | ||||
|     if [[ "$note_old_md5" == "$note_new_md5" ]] | ||||
|     then | ||||
|         echo "No changes to '$note_arg'" | ||||
| 
 | ||||
|         if [[ ! -z "$1" ]] | ||||
|         then | ||||
|             rm -f $1 | ||||
|         fi | ||||
| 
 | ||||
|         exit | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| check_empty() { | ||||
|     if [[ ! -s "$note_file" ]] | ||||
|     then | ||||
|         if [[ "$1" == "restore" ]] | ||||
|         then | ||||
|             cd "$NOTES_DIR" | ||||
|             gitfile=$(basename "$note_file") | ||||
|             git checkout $gitfile | ||||
|             echo "Restored empty note '$note_arg'" | ||||
|         elif [[ "$1" == "delete" ]] | ||||
|         then | ||||
|             rm -f $note_file | ||||
|             echo "Deleted empty note '$note_arg'" | ||||
|         fi | ||||
| 
 | ||||
|         exit | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| check_dir() { | ||||
|     if [[ ! -d "$NOTES_DIR" ]] | ||||
|     then | ||||
|         echo "Notes not initialized. Run init first!" | ||||
|         exit | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| md5_sum() { | ||||
|     openssl dgst -md5 $* | ||||
| } | ||||
| 
 | ||||
| help_cmd() { | ||||
|     echo ' | ||||
| Notes Manager for the Command Line | ||||
| ================================== | ||||
| 
 | ||||
| This is a bash script that lets you take notes which are maintained in a | ||||
| Git repository. You can run this script by typing the following command | ||||
| at the command line: | ||||
| 
 | ||||
| Usage: note <command> <arguments> | ||||
| 
 | ||||
| Commands | ||||
| -------- | ||||
| You can use the first letter of each command as a shortcut key. | ||||
| 
 | ||||
|     Command     Usage | ||||
|     -------     ----- | ||||
|     new         Follow this with the note name to create a new note | ||||
|     edit        Follow this with the note name to edit an existing note | ||||
|     show        Follow this with the note name to display an existing note | ||||
|     delete      Follow this with the note name to delete a note | ||||
|     find        Prints the list of available notes | ||||
|     log         Displays the note history | ||||
|     grep        Finds all notes with the specified keyword in the text | ||||
|     init        Run this the very first time to set up the folders | ||||
|     help        Prints this help message | ||||
|     version     Prints the version information | ||||
| ' | ||||
| } | ||||
| 
 | ||||
| version_info() { | ||||
|     echo "Notes Manager version $NOTES_VER" | ||||
| } | ||||
| 
 | ||||
| note_new() { | ||||
|     check_dir | ||||
|     check_arg | ||||
|     title_to_name | ||||
| 
 | ||||
|     if note_exists | ||||
|     then | ||||
|         echo "Note '$note_arg' already exists! Use edit instead." | ||||
|         exit | ||||
|     fi | ||||
| 
 | ||||
|     echo "$note_arg" > $note_file | ||||
|     note_old_md5=$(md5_sum $note_file) | ||||
| 
 | ||||
|     $EDITOR $note_file | ||||
| 
 | ||||
|     note_new_title=$(head -1 $note_file) | ||||
|     note_new_md5=$(md5_sum $note_file) | ||||
|     note_new_file=$NOTES_DIR/$(make_title $note_new_title) | ||||
|     check_md5 $note_file | ||||
|     check_empty delete | ||||
| 
 | ||||
|     dprint "Original filename = " $note_file | ||||
|     dprint "New filename = " $note_new_file | ||||
| 
 | ||||
|     # Check for a title rename | ||||
|     if [[ "$note_file" != "$note_new_file" ]] | ||||
|     then | ||||
|         mv -f $note_file $note_new_file | ||||
|     fi | ||||
| 
 | ||||
|     cd $NOTES_DIR | ||||
|     gitfile=$(basename $note_new_file) | ||||
| 
 | ||||
|     git add $gitfile | ||||
|     git commit -m "Create note '$note_new_title'" | ||||
|     echo "Created note '$note_new_title'" | ||||
| } | ||||
| 
 | ||||
| note_edit() { | ||||
|     check_dir | ||||
|     check_arg | ||||
|     title_to_name | ||||
|     if ! note_exists | ||||
|     then | ||||
|         echo "Cannot find note '$note_arg'!" | ||||
|         exit | ||||
|     fi | ||||
| 
 | ||||
|     note_old_title=$(head -1 $note_file) | ||||
|     note_old_md5=$(md5_sum $note_file) | ||||
| 
 | ||||
|     $EDITOR $note_file | ||||
| 
 | ||||
|     note_new_title=$(head -1 $note_file) | ||||
|     note_new_md5=$(md5_sum $note_file) | ||||
| 
 | ||||
|     check_md5 | ||||
|     check_empty restore | ||||
| 
 | ||||
|     cd $NOTES_DIR | ||||
|     gitfile=$(basename $note_file) | ||||
|     commit_msg="Update note '$note_new_title'" | ||||
|     if [[ "$note_old_title" != "$note_new_title" ]] | ||||
|     then | ||||
|         note_new_file=$(make_title $note_new_title) | ||||
|          | ||||
|         git mv $gitfile $note_new_file | ||||
|         git add $note_new_file | ||||
|         commit_msg="$commit_msg. Rename from '$note_old_title'" | ||||
|     else | ||||
|         git add $gitfile | ||||
|     fi | ||||
| 
 | ||||
|     git commit -m "$commit_msg" | ||||
|     echo "Updated note '$note_new_title'" | ||||
| } | ||||
| 
 | ||||
| note_show() { | ||||
|     check_dir | ||||
|     check_arg | ||||
|     title_to_name | ||||
|     if ! note_exists | ||||
|     then | ||||
|         echo "Cannot find note '$note_arg'!" | ||||
|         exit | ||||
|     fi | ||||
| 
 | ||||
|     less -R $note_file | ||||
| } | ||||
| 
 | ||||
| note_delete() { | ||||
|     check_dir | ||||
|     check_arg | ||||
|     title_to_name | ||||
|     if ! note_exists | ||||
|     then | ||||
|         echo "Cannot find note '$note_arg'!" | ||||
|         exit | ||||
|     fi | ||||
| 
 | ||||
|     cd $NOTES_DIR | ||||
|     gitfile=$(basename $note_file) | ||||
|     git rm $gitfile | ||||
|     git commit -m "Delete note '$note_arg'" | ||||
|     echo "Deleted note '$note_arg'" | ||||
| } | ||||
| 
 | ||||
| note_history() { | ||||
|     check_dir | ||||
|     cd $NOTES_DIR | ||||
|     git log --pretty=format:'%ai - %s' -- $note_arg | ||||
| } | ||||
| 
 | ||||
| note_list() { | ||||
|     check_dir | ||||
|     cd $NOTES_DIR | ||||
|     if [[ -z "$1" ]] | ||||
|     then | ||||
|         ls -1 | ||||
|     else | ||||
|         ls -1 | grep -i $1 | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| note_search() { | ||||
|     check_dir | ||||
|      | ||||
|     if [[ -z "$1" ]]; then | ||||
|         echo "Must specify a pattern to search titles!" | ||||
|         exit | ||||
|     fi | ||||
| 
 | ||||
|     cd $NOTES_DIR | ||||
|     for file in * | ||||
|     do | ||||
|         grep --color=always -il "$1" $file | ||||
|         grep --color=always -inhT -m2 -C1 "$1" $file | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| parse_args() { | ||||
|     note_cmd=$1 | ||||
|     shift | ||||
|     note_arg="$*" | ||||
| 
 | ||||
|     case "$note_cmd" in | ||||
|     "h" | "help") | ||||
|         help_cmd | ||||
|         ;; | ||||
| 
 | ||||
|     "n" | "new") | ||||
|         note_new | ||||
|         ;; | ||||
| 
 | ||||
|     "e" | "edit") | ||||
|         note_edit | ||||
|         ;; | ||||
| 
 | ||||
|     "s" | "show") | ||||
|         note_show | ||||
|         ;; | ||||
| 
 | ||||
|     "d" | "delete") | ||||
|         note_delete | ||||
|         ;; | ||||
| 
 | ||||
|     "l" | "log") | ||||
|         note_history | ||||
|         ;; | ||||
|      | ||||
|     "i" | "init") | ||||
|         notes_init | ||||
|         ;; | ||||
|      | ||||
|     "f" | "find") | ||||
|         note_list $1 | ||||
|         ;; | ||||
|      | ||||
|     "g" | "grep") | ||||
|         note_search $1 | ||||
|         ;; | ||||
| 
 | ||||
|     "v" | "version") | ||||
|         version_info | ||||
|         ;; | ||||
| 
 | ||||
|     *) | ||||
|         echo "Unrecognized command '$note_cmd'. Use help." | ||||
|         ;; | ||||
|     esac | ||||
| } | ||||
| 
 | ||||
| if [[ $# -lt 1 ]] | ||||
| then | ||||
|     echo "Usage: note <command> <arguments>" | ||||
|     echo "Type 'note help' for detailed help" | ||||
| else | ||||
|     parse_args $* | ||||
| fi | ||||
|  | @ -0,0 +1,10 @@ | |||
| #!/bin/bash | ||||
| # Set the Xterm/Tmux pane title | ||||
| 
 | ||||
| if [[ -z $TMUX ]] | ||||
| then | ||||
|     echo -e "\033]0;$*\007" | ||||
| else | ||||
|     echo -e "\033k$*\033\\" | ||||
| fi | ||||
| 
 | ||||
|  | @ -0,0 +1,57 @@ | |||
| #!/usr/bin/env python | ||||
| # Script to smartly chop off portions of the current working directory for | ||||
| # use in the shell prompt | ||||
| 
 | ||||
| import os | ||||
| 
 | ||||
| # Constants used to decide when to start chopping | ||||
| DIRLIM = 5 | ||||
| DIR_L = 3 | ||||
| DIR_R = 2 | ||||
| PWDLEN = 14 | ||||
| 
 | ||||
| def smartwd(): | ||||
|     username = os.environ['USER'] | ||||
|     homedir = os.environ['HOME'] | ||||
|     pwd = os.environ['PWD'] | ||||
| 
 | ||||
|     path = pwd.split('/') | ||||
| 
 | ||||
|     # Ignore the root path | ||||
|     if len(path) == 1: | ||||
|         return pwd | ||||
| 
 | ||||
|     try: | ||||
|         username_index = path.index(username) | ||||
|     except ValueError: | ||||
|         username_index = None | ||||
| 
 | ||||
|     if username_index is not None: | ||||
|         prefix = '/'.join(path[:username_index+1]) | ||||
| 
 | ||||
|         if prefix == homedir : | ||||
|             pre_path = '~' | ||||
|         else: | ||||
|             # The first element is always the empty string. | ||||
|             # We want the first 4 characters of the second element | ||||
|             pre_path = path[1][:4] + '~' | ||||
| 
 | ||||
|         del path[:username_index] | ||||
|         path[0] = pre_path | ||||
| 
 | ||||
|         pwd = '/'.join(path) | ||||
| 
 | ||||
|         # If we exceed the dirlimit and the length of the joined pwd, | ||||
|         # replace the pwd with left and right elements, with ellipses | ||||
|         # in between to simulate a long path. | ||||
|         if len(path) > DIRLIM and len(pwd) > PWDLEN: | ||||
|             newpwd = '/'.join(path[:DIR_L] + ['...'] + path[-DIR_R:]) | ||||
| 
 | ||||
|             if len(newpwd) < len(pwd): | ||||
|                 pwd = newpwd | ||||
| 
 | ||||
|     return pwd | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     print smartwd() | ||||
| 
 | ||||
|  | @ -0,0 +1,16 @@ | |||
| #!/usr/bin/env python | ||||
| """ Calculate the Julian Date """ | ||||
| 
 | ||||
| import time | ||||
| import math | ||||
| 
 | ||||
| t = time.time() | ||||
| 
 | ||||
| """ Technically, we should be adding 2440587.5, | ||||
|     however, since we are trying to stick to the stardate | ||||
|     concept, we add only 40587.5""" | ||||
| jd = (t / 86400.0 + 40587.5) | ||||
| 
 | ||||
| # Use the idea that 1 Julian day is equal to 1 stardate | ||||
| print ("%05.9f" % jd)[:-7] | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue