summaryrefslogtreecommitdiff
path: root/.bashrc
blob: 10b264bab0d56d9f433d2dc05bf2dd204585f07e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
# --- preferences

# load standard environment variables
. $HOME/.shenv

# '>' is a nice prompt char because it need not be followed by a
# space.  It is easy to distinguish the command from the prompt
PS1='\[\e[1m\]$(exit_code=$?; test $exit_code -eq 0 || printf %s $exit_code " ")${debian_chroot:+($debian_chroot)}\u@\h:\w>\[\e[0m\]'

# if this is an xterm set its title to user@host:dir
# (this doesn't stop the likes of ncmpcpp setting a title)
case "$TERM" in
    xterm*|rxvt*)
        PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h:\w\a\]$PS1"
        ;;
    *)
        ;;
esac

# enable better completion
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

# history settings
HISTCONTROL=ignorespace:ignoredups
HISTSIZE=5000
HISTFILESIZE=5000
HISTIGNORE="ls" # colon-separated
shopt -s histappend

# make less more friendly for non-text input files; see lesspipe(1)
if [ -x /usr/bin/lesspipe ]; then
    eval "$(lesspipe)"
fi

# --- aliases

alias ls="ls --color=auto --literal --classify"
alias grep="grep --colour=auto"

alias g="git"
alias ga="git annex"
alias e="$EDITOR"
alias mrs="src-register-all && mr -m status"
alias d="emacsclient -cne '(dired \".\")' >/dev/null"
# alias m="emacsclient -c -n -e '(progn (magit-status \".\") \
#  (delete-other-windows))' >/dev/null"
alias ta="tmux new-session -A -s default"
alias rax="screen -URaAx"
alias new-login-shell="exec su -l $USER" # get new UNIX group without relog
alias whitenoise="echo -en \"\033]0;whitenoise\a\";\
      cvlc --quiet --loop ~/annex/media/sounds/R*.ogg"
# useful to check whether a rebase introduced any changes to files
alias rld="git diff @{1}..@{0}"
alias athvpn="sshuttle -r athena 0/0 --dns"
alias soffice-pdf="soffice --headless --convert-to pdf"

alias host-suite-build-deps='mk-build-deps -ir -s sudo -t \
      "apt-get --no-install-recommends"'
alias sid-build-deps='mk-build-deps -ir -s sudo -t \
      "apt-get -o Debug::pkgProblemResolver=yes -t sid --no-install-recommends"'
alias bts-policy="bts user debian-policy@packages.debian.org \
      , package debian-policy , "
alias dak-rdeps="ssh mirror.ftp-master.debian.org dak rm -Rn"
alias b="bts --mbox show"
alias afsid="apt-file --filter-suites unstable"
alias dinstall="curl https://ftp-master.debian.org/dinstall.status;echo -n 'Right now:    ';date -u '+%a %b %d %T %Z %Y (%s)'"
# use with care, in order for this to actually provide a security advantage
alias update-debian-known-hosts="scp master.debian.org:/etc/ssh/ssh_known_hosts ~/src/dotfiles/.ssh/known_hosts_debian"
alias grepcopy="grep --color=always -Eir '(copyright|©)' * | less -R"
# from dgit-user(7), this pushes a non-native package through sbuild
# without an orig.tar for the version in the first changelog entry.
# Useful for sbuilding an unreleased version of a package I maintain
# upstream
alias sbuild-prerelease="sbuild --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn'"

# alias develacc='sudo machinectl shell spw@develacc \
#       $(sudo enter-develacc /bin/sh -c "getent passwd spw | cut -d: -f7")'
# alias develaccr='sudo machinectl shell root@develacc \
#       $(sudo enter-develacc /bin/sh -c "getent passwd root | cut -d: -f7")'

# alias does not call `git develacc` because we want manual
# verification of what is to be pushed (i.e. `git diff
# master..develacc/develacc-iris` to check patch queue is sane)
alias push-develacc-dotfiles-branch="git push \
      -f origin develacc/develacc-$(hostname -s):develacc-$(hostname -s)"

alias spin-this-host-now='(cd /usr/local/propellor && sudo ./propellor)'

# --- more powerful aliases built with shell functions

package-plan-unpack () {
    package="$1"
    patches="$HOME/src/package-plan/patches/${package%-*}/${package##*-}"
    cd /tmp
    cabal unpack --pristine "$package"
    cd "$package"
    mkdir -p "$patches"
    ln -s "$patches" patches
    ls "$(readlink $patches)"
}

# tidy up if I deleted files from stowed repos without properly
# restowing
kill-broken-stowed-symlinks () {
    find "$HOME" -xtype l | while read -r link; do
        if readlink "$link" | grep --quiet "^[../]*/.STOW/"; then
            rm "$link"
        fi
    done
}

# install package(s) and immediately mark as auto installed, so it
# will get cleaned up by the next autoclean.
# --no-install-recommends is needed as otherwise packages are manually
# installed beyond those specified on the command line
install-as-auto () {
    if [[ $EUID -ne 0 ]]; then
        sudo apt-get --no-install-recommends install "$@"
        sudo apt-mark auto "$@"
    else
        apt-get --no-install-recommends install "$@"
        apt-mark auto "$@"
    fi
}

# PDF word count
pdfwords () {
    pdftotext "$1" - | wc -w
}

# also see soffice-pdf alias above
soffice-pdf-all () {
    for f in *.doc *.docx; do
        soffice --headless --convert-to pdf "$f"
    done
}

# Debian archive processing logs
alias tail-dak="ssh ftp-master.debian.org tail -F \
      /srv/ftp-master.debian.org/log/current"
alias tail-queued="ssh ssh.upload.debian.org tail -F \
      /srv/upload.debian.org/queued/run/log"
grep-dak () {
    ssh ftp-master.debian.org grep "$@" /srv/ftp-master.debian.org/log/current
}
grep-queued () {
    ssh ssh.upload.debian.org grep "$@" /srv/upload.debian.org/queued/run/log
}

secs () {
    for i in $(seq $1 -1 1); do
        echo $i
        sleep 1
    done
    echo 0
}

# sometimes a remote SSH session cannot get at my forwarded SSH agent
# because an unwanted instance of gpg-agent running on the remote host
# gets in the way.  this is a way to kill off that unwanted agent.  we
# also need to restart the multiplexed SSH connection to get agent
# forwarding working again.  I think this problem is mostly caused by
# the fact that I use gnupg as my SSH agent
kill-remote-gpg () {
    ssh "$1" 'rm -f $XDG_RUNTIME_DIR/gnupg/*'
    ssh -O exit "$1"
}

# build debs from a Linux kernel source tree *without* calling `make clean`.
#
# The -dbg deb takes some time to build.  To get rid of it when it's
# not needed: scripts/config --disable DEBUG_INFO
bindeb-pkg () {
    ver="$(make kernelversion)"
    date="$(date +%Y%m%d+%H%M)"
    arch="$(dpkg --print-architecture)"
    make -j$((2 * $(nproc))) bindeb-pkg \
      LOCALVERSION=-spw \
      KDEB_PKGVERSION=$ver-$date \
      "$@"
    echo "sudo apt-get install \
../linux-{image,headers}-$ver-spw_$ver-${date}_$arch.deb"
}

# --- host-specific aliases/functions

# ftp-master.debian.org

if [ -d "/srv/ftp-master.debian.org" ]; then
    alias newlocks="cd /srv/ftp-master.debian.org/lock/new/ && ls -l"
    newlock () {
        touch /srv/ftp-master.debian.org/lock/new/"$1"
    }

    newunlock () {
        rm /srv/ftp-master.debian.org/lock/new/"$1"
    }

    pn () {
        cd /srv/ftp-master.debian.org/queue/new
        # we need VISUAL=emacsclient because dak's utils.call_editor
        # fails when VISUAL contains both the editor's name and some
        # arguments to it, as mine does
        if [[ $1 ]]; then
            VISUAL=emacsclient dak process-new "$1"*changes
        else
            VISUAL=emacsclient dak process-new -b
        fi
    }
fi

# not ftp-master.debian.org

# this is useful for processing removal requests
# (credits to Mark Wooding)
#
# alternative, by me, but involves spawning another process or two:
#
# command -v dak >/dev/null \
#     || alias dak="perl -MString::ShellQuote \
#         -we'system qw(ssh -t ftp-master.debian.org dak), shell_quote @ARGV'"
if ! command -v dak >/dev/null; then
    dak () {
        local i
        local c=
        for i; do               # implicit "in $@"
            c="$c '${i/\'/\'\\\'\'}'"
        done
        ssh -t ftp-master.debian.org dak "$c"
    }
fi