lib/update.utils
author Tero Marttila <terom@paivola.fi>
Fri, 23 Mar 2012 15:10:23 +0200
changeset 69 88a7683efc54
parent 66 482d06935d96
child 82 26a307558602
permissions -rw-r--r--
update: list_files to copy all DHCP_CONFS..
60
b65ce9123039 lib/update: add shebangs to make sloccount work
Tero Marttila <terom@paivola.fi>
parents: 58
diff changeset
     1
#!/bin/bash
52
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
# vim: set ft=sh :
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
#
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
# Utility functions
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
### Command execution
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
## Execute command, possibly logging its execution.
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
#
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
#   cmd     $cmd...
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
#
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
# Fails if the command returns an error exit code.
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
function cmd {
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
    log_cmd "$@"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
    "$@" || die "Failed"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
66
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    19
### Command execution
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    20
## Execute command as a test, logging its execution at log_cmd
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    21
#
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    22
#   cmd_test $cmd... && ... || ...
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    23
#
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    24
# Fails if the command returns an error exit code.
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    25
function cmd_test {
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    26
    log_cmd "$@"
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    27
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    28
    "$@"
482d06935d96 update: cmd_test; check_dhcp_hosts after do_reload_zones; reload_dhcp
Tero Marttila <terom@paivola.fi>
parents: 60
diff changeset
    29
}
55
a2d87cfd77e4 update: LOG_DIFF to fix -q
Tero Marttila <terom@paivola.fi>
parents: 52
diff changeset
    30
## Execute command, prefixing its output on stdout with given indent prefix.
a2d87cfd77e4 update: LOG_DIFF to fix -q
Tero Marttila <terom@paivola.fi>
parents: 52
diff changeset
    31
#
a2d87cfd77e4 update: LOG_DIFF to fix -q
Tero Marttila <terom@paivola.fi>
parents: 52
diff changeset
    32
#   indent  "    " $cmd...
a2d87cfd77e4 update: LOG_DIFF to fix -q
Tero Marttila <terom@paivola.fi>
parents: 52
diff changeset
    33
#
a2d87cfd77e4 update: LOG_DIFF to fix -q
Tero Marttila <terom@paivola.fi>
parents: 52
diff changeset
    34
# Output is kept on stdout, exit status is that of the given command.
a2d87cfd77e4 update: LOG_DIFF to fix -q
Tero Marttila <terom@paivola.fi>
parents: 52
diff changeset
    35
# Also logs the executed command at log_cmd level..
52
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
function indent () {
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    local indent=$1; shift
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    log_cmd "$@"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    "$@" | sed "s/^/$indent/"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
    return ${PIPESTATUS[0]}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
### FS utils
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
# Create dir in $ROOT if not exists.
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
function ensure_dir {
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
    local dir=$1
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    if [ ! -d $ROOT/$dir ]; then
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
        log_warn "Creating output dir: $dir"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
        cmd mkdir $ROOT/$dir
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    fi
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
## Output absolute path from $ROOT:
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
#
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
#   abspath $path
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
#
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
function abspath () {
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
    local path=$1
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    echo "$ROOT/$path"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
69
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    68
## List names of files in dir:
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    69
#
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    70
#   list_files $dir $glob
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    71
#
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    72
function list_files {
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    73
    local dir=$1
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    74
    local glob=$2
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    75
    local name=
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    76
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    77
    for file in $dir/$glob; do
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    78
        # strip prefix
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    79
        name=${file#$dir/}
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    80
        name=${name%$glob}
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    81
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    82
        echo -n "$name "
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    83
    done
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    84
}
88a7683efc54 update: list_files to copy all DHCP_CONFS..
Tero Marttila <terom@paivola.fi>
parents: 66
diff changeset
    85
52
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
### HG wrappers
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
# Run `hg ...` within $REPO.
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
function hg {
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
    local repo=$REPO
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
58
6292cb597954 update: hg trust root
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    91
    cmd $HG -R $ROOT/$repo "${HG_ARGS[@]}" "$@"
52
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
# Does the repo have local modifications?
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
function hg_modified {
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
    hg id | grep -q '+'
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
# Output possible -u flag for commit.
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
function hg_user {
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
    if [ ${SUDO_USER:-} ]; then
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
        echo '-u' "$SUDO_USER"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
    elif [ $HOME ] && [ -e $HOME/.hgrc ]; then
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
        debug "using .hgrc user"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        echo ''
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
    else
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
        echo '-u' "$USER"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
    fi
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
# Show changes in repo
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
function hg_diff {
57
d83a5e9be193 update: use hg diff --stat for .serials
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   115
    # just stat hidden files, but show the rest
d83a5e9be193 update: use hg diff --stat for .serials
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   116
    hg diff --stat -I "$REPO/$REPO_HIDE"
52
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
    hg diff -X "$REPO/$REPO_HIDE"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
## Commit changes in repo, with given message:
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
#
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
#   hg_commit   $msg
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
#
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
function hg_commit {
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
    local msg=$1
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
    local user_opt=$(hg_user)
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
    
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
    debug "$user_opt: $msg"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
    hg commit $user_opt -m "$msg"
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
}
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
b68b8615c512 update: split out code into lib/update.foo
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132