aboutsummaryrefslogtreecommitdiff
path: root/metadot
blob: 47af6ac572ee9e5250a93c0242b0a5cf82968cd6 (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
#!/bin/bash
#
# metadot: a dotfile management system
#

# Parameters
OPT="$1"
DATE="`date +%Y%m%d%I%M%S`"
BASENAME="`basename $0`"
DOT="$HOME/.dotfiles"
MODULES="$DOT/modules"
BACKUPS="$HOME/.backups/$DATE"

# Backup a file
function metadot_backup {
  local file="$HOME/$1"
  
  if [ -e "$file" ] || [ -h "$file" ]; then
    local folder="$BACKUPS/`dirname $1`"

    #echo "Backing up `basename $1`..."
    mkdir -p $folder
    mv $file $folder
  fi
}

# Find contents of a module
function metadot_find {
  local module="$1"
  ( cd $MODULES/$module && find -name '*.link' -or -name '*.dot.link' ) | sed -e 's|./||'
}

# Load a module
function metadot_load {
  local module="$1"
  local destname
  local dirname

  if [ -d "$MODULES/$module" ]; then

    echo "Loading module $module..."

    for file in `metadot_find $module`; do
      echo "Processing $file..."

      # Get the dirname, replacing string.dot with .string
      dirname="`echo $file | sed -e 's|\([^/]*\).dot/|.\1/|g'`"
      dirname="`dirname $dirname`"

      if echo $file | grep -q '.dot.link'; then
        destname=".`basename $file .dot.link`"
      else
        destname="`basename $file .link`"
      fi

      if [ "$dirname" != "." ]; then
        #echo "Creating $HOME/$dirname..."
        mkdir -p $HOME/$dirname
      else
        dirname=""
      fi

      metadot_backup "$dirname/$destname"

      #echo "Installing symlink $dirname/$destname..."
      ln -s $MODULES/$module/$file $HOME/$dirname/$destname

    done
  else
    echo "No such module $module"
  fi
}

# Parsing.
if [ -z "$OPT" ]; then
  echo "usage: $BASENAME <option> [arguments]"
  exit 1
elif [ "$OPT" == "ls" ]; then
  ls -1 $MODULES
elif [ "$OPT" == "version" ]; then
  ( cd $DOT && git log -n 1 )
elif [ "$OPT" == "update" ]; then
  if [ -d "$DOT/.git" ]; then
    ( cd $DOT && git pull origin master && git submodule update --init )
  fi
elif [ "$OPT" == "backup" ]; then
  shift
  metadot_backup $1
elif [ "$OPT" == "load" ]; then
  shift

  if [ -z "$1" ]; then
    echo "usage: $BASENAME load [module(s)|--all]"
  fi

  if [ "$1" == "--all" ]; then
    modules="`ls $MODULES`"
  else
    modules="$*"
  fi

  for module in $modules; do
    metadot_load $module
  done
  echo "Backups saved at $BACKUPS."
fi