File: parallel-rsync-repos

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (54 lines) | stat: -rwxr-xr-x 1,224 bytes parent folder | download
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
#!/usr/bin/env bash
# this script should run as the 'git' user, not root, because 'root' should not
# own intermediate directories created by rsync.
#
# Example invocation:
# find /var/opt/gitlab/git-data/repositories -maxdepth 2 | \
#   parallel-rsync-repos transfer-success.log /var/opt/gitlab/git-data/repositories /mnt/gitlab/repositories
#
# You can also rsync to a remote destination.
#
# parallel-rsync-repos transfer-success.log /var/opt/gitlab/git-data/repositories user@host:/mnt/gitlab/repositories
#
# If you need to pass extra options to rsync, set the RSYNC variable
#
# env RSYNC='rsync --rsh="foo bar"' parallel-rsync-repos transfer-success.log /src dest
#

LOGFILE=$1
SRC=$2
DEST=$3

if [ -z "$LOGFILE" ] || [ -z "$SRC" ] || [ -z "$DEST" ] ; then
  echo "Usage: $0 LOGFILE SRC DEST"
  exit 1
fi

if [ -z "$JOBS" ] ; then
  JOBS=10
fi

if [ -z "$RSYNC" ] ; then
  RSYNC=rsync
fi

if ! cd $SRC ; then
  echo "cd $SRC failed"
  exit 1
fi

rsyncjob() {
  relative_dir="./${1#$SRC}"

  if ! $RSYNC --delete --relative -a "$relative_dir" "$DEST" ; then
    echo "rsync $1 failed"
    return 1
  fi

  echo "$1" >> $LOGFILE
}

export LOGFILE SRC DEST RSYNC
export -f rsyncjob

parallel -j$JOBS --progress rsyncjob