From 8540e765baf5a6f3b01e69dcbeead9f6a5478094 Mon Sep 17 00:00:00 2001 From: Beren Minor Date: Sat, 14 Apr 2018 19:51:21 +0200 Subject: Add support for several cloud storage remotes using rclone rclone is an open-source command-line too to get and put files to several cloud storage services that aren't supported by rsync. git-remote-gcrypt can now push encrypted repositories to any configured rclone remote using gcrypt::rclone://: URLs. Signed-off-by: Beren Minor --- README.rst | 20 +++++++++++++------- git-remote-gcrypt | 23 ++++++++++++++++++++--- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/README.rst b/README.rst index 8bcc429..21cefc4 100644 --- a/README.rst +++ b/README.rst @@ -15,10 +15,10 @@ git-remote-gcrypt is a git remote helper to push and pull from repositories encrypted with GnuPG, using a custom format. This remote helper handles URIs prefixed with `gcrypt::`. -Supported backends are `local`, `rsync://` and `sftp://`, where the -repository is stored as a set of files, or instead any `` -where gcrypt will store the same representation in a git repository, -bridged over arbitrary git transport. See "Performance" below for +Supported backends are `local`, `rsync://` and `sftp://` (and an experimental +`rclone://` backend), where the repository is stored as a set of files, or +instead any `` where gcrypt will store the same representation in a git +repository, bridged over arbitrary git transport. See "Performance" below for backends comparison. The aim is to provide confidential, authenticated git storage and @@ -119,9 +119,9 @@ Collaboration keys of all collaborators and correct participant config. Dependencies - ``rsync`` and ``curl`` for remotes ``rsync:`` and ``sftp:`` - respectively. The main executable requires a POSIX-compliant shell - that supports ``local``. + ``rsync``, ``curl`` and ``rclone`` for remotes ``rsync:``, ``sftp:`` and + ``rclone:`` respectively. The main executable requires a POSIX-compliant + shell that supports ``local``. GNU Privacy Guard Both GPG 1.4 and 2 are supported. You need a personal GPG key. GPG @@ -149,6 +149,12 @@ rsync URIs whereas plain rsync uses either ``user@host:path`` or ``rsync://user@host/path``. +rclone URIs + The URI format for the rclone backend is the same as rclone URI, + ``rclone://``, and require to add the corresponding remote + in the rclone configuration. + Please refer to the rclone documentation for more information. + Repository format ................. diff --git a/git-remote-gcrypt b/git-remote-gcrypt index 8b66f2f..d089c57 100755 --- a/git-remote-gcrypt +++ b/git-remote-gcrypt @@ -230,6 +230,9 @@ GET() elif isurl rsync "$1" then (exec 0>&-; rsync -I -W "${1#rsync://}"/"$2" "$3" >&2) + elif isurl rclone "$1" + then + (exec 0>&-; rclone copyto "${1#rclone://}"/"$2" "$3" >&2) elif islocalrepo "$1" then cat "$1/$2" > "$3" @@ -247,6 +250,9 @@ PUT() elif isurl rsync "$1" then rsync -I -W "$3" "${1#rsync://}"/"$2" >&2 + elif isurl rclone "$1" + then + rclone copyto "$3" "${1#rclone://}"/"$2" >&2 elif islocalrepo "$1" then cat >| "$1/$2" < "$3" @@ -258,7 +264,7 @@ PUT() # Put all PUT changes for repo $1 at once PUT_FINAL() { - if isurl sftp "$1" || islocalrepo "$1" || isurl rsync "$1" + if isurl sftp "$1" || islocalrepo "$1" || isurl rsync "$1" || isurl rclone "$1" then : else @@ -275,6 +281,9 @@ PUTREPO() elif isurl rsync "$1" then rsync -q -r --exclude='*' "$Localdir/" "${1#rsync://}" >&2 + elif isurl rclone "$1" + then + rclone mkdir "${1#rclone://}" >&2 elif islocalrepo "$1" then mkdir -p "$1" @@ -295,6 +304,9 @@ REMOVE() then xfeed "$2" rsync -I -W -v -r --delete --include-from=- \ --exclude='*' "$Localdir"/ "${1#rsync://}/" >&2 + elif isurl rclone "$1" + then + xfeed "$2" rclone delete -v --include-from=/dev/stdin "${1#rclone://}/" >&2 elif islocalrepo "$1" then for fn_ in $2; do @@ -309,7 +321,7 @@ REMOVE() CLEAN_FINAL() { - if isurl sftp "$1" || islocalrepo "$1" || isurl rsync "$1" + if isurl sftp "$1" || islocalrepo "$1" || isurl rsync "$1" || isurl rclone "$1" then : else @@ -496,13 +508,18 @@ ensure_connected() echo_info "Updated URL for $r_name, gitception:// -> ()" fi + if isurl rclone "$URL"; then + echo_info "WARNING: git-remote-gcrypt's rclone support is experimental." \ + " Keep backups." + fi + # Find the URL fragment url_frag=${URL##*"#"} isnoteq "$url_frag" "$URL" || url_frag= URL=${URL%"#$url_frag"} # manifestfile -- sha224 hash if we can, else the default location - if isurl sftp "$URL" || islocalrepo "$URL" || isurl rsync "$URL" + if isurl sftp "$URL" || islocalrepo "$URL" || isurl rsync "$URL" || isurl rclone "$URL" then # not for gitception isnull "$url_frag" || -- cgit v1.2.3