summaryrefslogtreecommitdiff
path: root/buildstream/data/ostree-pull-ssh
blob: 1424f7c96cf585c18cad18353be7bc90925f3323 (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
#!/bin/bash -e

# ostree-pull-ssh.sh - Pull OSTree commits from a remote repo using sshfs
# Copyright (C) 2016  Dan Nicholson <nicholson@endlessm.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

ARGS=$(getopt -n "$0" \
              -o uvh \
              -l repo:,update,gpg-sign:,gpg-homedir:,verbose,debug,help \
              -- "$@")
eval set -- "$ARGS"

usage() {
    cat <<EOF
Usage: $0 [OPTION]... REMOTE [REF]...
Push OSTree REFs to REMOTE

  --repo=PATH			path to OSTree repository
  -u, --update			update the summary file
  --gpg-sign=KEY-ID		GPG key ID to sign the summary with
  --gpg-homedir=HOMEDIR		GPG homedir for finding keys
  -v, --verbose			print verbose information
  --debug			print debug information
  -h, --help			display this help and exit
EOF
}

PULL_ARGS=()
SUMMARY_ARGS=()
UPDATE=false
while true; do
    case "$1" in
        --repo)
            OSTREE_REPO=$2
            shift 2
            ;;
        -u|--update)
            UPDATE=true
            SUMMARY_ARGS+=("$1")
            shift
            ;;
        --gpg-sign|--gpg-homedir)
            SUMMARY_ARGS+=("$1=$2")
            shift 2
            ;;
        -v|--verbose)
            PULL_ARGS+=("$1")
            SUMMARY_ARGS+=("$1")
            shift
            ;;
        --debug)
            set -x
            shift
            ;;
        -h|--help)
            usage
            exit 0
            ;;
        --)
            shift
            break
            ;;
    esac
done

if [ $# -lt 1 ]; then
    echo "No remote specified" >&2
    exit 1
fi

REMOTE=$1
shift

# Figure out the local repo. This emulates ostree_repo_new_default().
if [ -z "$OSTREE_REPO" ]; then
    if [ -e objects ] && [ -e config ]; then
        OSTREE_REPO=.
    else
        OSTREE_REPO=/ostree/repo
    fi
fi

# Exit handler
cleanup() {
    if [ -n "$remote_repo" ]; then
        fusermount -u "$remote_repo"
        rm -rf "$remote_repo"
    fi
}
trap cleanup EXIT

# Mount the remote repo
remote_repo=$(mktemp -d ostree-push.XXXXXXXXXX)
sshfs "$remote_repo" "$REMOTE"

# Use pull-local to emulate pushing
ostree pull-local --repo="$OSTREE_REPO" "${PULL_ARGS[@]}" "$remote_repo" "$@"

# Update the local summary if asked
if $UPDATE; then
    ostree summary --repo="$OSTREE_REPO" "${SUMMARY_ARGS[@]}"
fi