Code Monkey home page Code Monkey logo

gcsf's Introduction

Build Status Crates.io Docs
GitHub Issues Downloads MIT License

GCSF is a virtual filesystem that allows users to mount their Google Drive account locally and interact with it as a regular disk partition. You can find out more in this paper

Update (April 2019): I am currently still using and maintaining this project but I have very little time to dedicate to it. As such, it might take a while before I get around to fixing known bugs / implementing feature requests / responding to open issues. Thank you for understanding and for expressing sustained interest in this project!

Requirements

GCSF requires the stable branch of the Rust programming language, which can be installed following the instructions on rustup.rs. If you already have Rust installed, make sure that it is updated to the latest version (≥1.26):

$ rustup update stable

OSX

On Mac OSX, GCSF requires osxfuse and pkg-config:

$ brew update; brew install pkg-config; brew tap homebrew/cask; brew install --cask osxfuse

Ubuntu

On Ubuntu, GCSF requires libfuse-dev, libssl-dev and pkg-config:

sudo apt-get install -y libfuse-dev libssl-dev pkg-config

Arch Linux

An AUR package is maintained by axionl: gcsf-git.

SUSE

sudo zypper install -y fuse-devel fuse rust pkgconf-pkg-config

Other linux distros

Make sure you have pkg-config and the fuse library installed. These are usually found in the package repositories of major distributions.

FreeBSD

Rust can be installed via the lang/rust port. You will need to install sysutils/fusefs-libs for the cairo install command to succeed.

Windows

Unfortunately, Windows is not supported at the time being. See issue #19.

Installation

After all requirements are met, GCSF can be installed using cargo:

$ cargo install gcsf

This will generate the gcsf binary in $HOME/.cargo/bin. Make sure that this directory is in your PATH variable: export PATH=$PATH:$HOME/.cargo/bin

Alternatively, you can download a release binary for your platform.

Configuration

GCSF will attempt to create a configuration file in $XDG_CONFIG_HOME/gcsf/gcsf.toml, which is usually defined as $HOME/.config/gcsf/gcsf.toml. Credentials are stored in the same directory.

GCP

  1. Visit console.developers.google.com and create a new project
  2. Add the Google Drive API to the project
  3. Configure an OAuth consent screen. Verification should not be required. Should be external unless this project is something internal to your GSuite
  4. Configure an OAuth2.0 credential. Do not use WEB as the token type if adding gcsf to a headless server - you want to be using the urn:* URI (note: if using WEB, you'll need to set the accepted domains to include http://localhost:8081)
  5. Configure GCSF to use the new client_id, client_secret, and project_id. You should have all these values after creating the credential.
  6. Configure GCSF authorize_using_code=True if configuring for headless servers. If you do this, completing the OAuth flow in a different browser will provide you a code that you can give to GCSF.

Running gcsf login some_session_name at this point should show a URL with your client_id query parameter.

Usage

The first step is to log in to Drive and authorize the application. A name must be provided for the session:

$ gcsf login some_session_name
Please direct your browser to https://accounts.google.com/o/oauth2/[...] and follow the instructions displayed there.
Successfully logged in. Saved credentials to "$HOME/.config/gcsf/some_session_name"

You can also list all existing sessions:

$ gcsf list
Sessions:
        - personal
        - some_session_name
        - work

And then mount one (or more) of them:

$ gcsf mount /mnt/gcsf -s some_session_name
INFO  gcsf > Creating and populating file system...
INFO  gcsf > File system created.
INFO  gcsf > Mounting to /mnt/gcsf
INFO  gcsf > Mounted to /mnt/gcsf

You can now find the contents of your Drive account in /mnt/gcsf:

GCSF ls

Using Ranger:

GCSF in Ranger

Or Thunar:

GCSF in Thunar

Why GCSF?

GCSF stands for "Google Conduce Sistem de Fișiere" which translated from Romanian is "Google Drive Filesystem". However GDFS already exists so it remains GCSF.

Troubleshooting

Could not mount to $mountpoint: Operation not permitted (os error 1)

This error occurs when user_allow_other is not set in /etc/fuse.conf or the file has improper permissions. Fix by running (as root):

# echo 'user_allow_other' >> /etc/fuse.conf
# chmod 644 /etc/fuse.conf
# sudo chown root:root /etc/fuse.conf

libssl.so.1.0.0

You installed the prebuilt binaries but couldn't run it. Fix by installing rust and building from source.

Contributing

Contributions are welcome. Documentation available on docs.rs/gcsf. You can also help by reporting or fixing issues.

gcsf's People

Contributors

alexdvorak avatar cubox avatar egigoka avatar eujing avatar gkdoc avatar guppy0130 avatar harababurel avatar ignatenkobrain avatar jason-cooke avatar jonleecon avatar platinum55 avatar yurikoles avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gcsf's Issues

Failure - PayloadTooLarge

After authenticating with google I get following error.


INFO  gcsf > Creating and populating file system...
 ERROR gcsf::gcsf::file_manager > Could not populate filesystem: Failure(
    Response {
        status: PayloadTooLarge,
        headers: Headers { Content-Type: text/html; charset=UTF-8
        , Referrer-Policy: no-referrer
        , Content-Length: 2398
        , Date: Tue, 03 Jul 2018 06:40:04 GMT
        , },
        version: Http10,
        url: "https://www.googleapis.com/drive/v3/files?spaces=drive&q=%28%271
...LONG_AND_POSSIBLY_SENSITIVE_URLS_...
&alt=json",
        status_raw: RawStatus(
            413,
            "Request Entity Too Large"
        ),
        message: Http11Message {
            is_proxied: false,
            method: None,
            stream: Wrapper {
                obj: Some(
                    Reading(
                        SizedReader(remaining=0)
                    )
                )
            }
        }
    }
)
 INFO  gcsf                     > File sytem created.
 INFO  gcsf                     > Mounting to /media/user/googledrive/
 INFO  gcsf                     > Mounted to /media/user/googledrive/

Possibly related to this: when I look in to the mounted directory it seems like all files up to the "first" level are there, but files in the second subdirectories are not:

GOOGLEDRIVE/A/FILE1 is there
GOOGLEDRIVE/A/B/FILE2 is missing

Note: I have a paid Googledrive subscription of 100GB, which is almost full.

Docker and encrypted file/filename with eCryptfs error

First, thank you very much for this awesome project. I don't know if it's a Docker mounting error or a gcsf error with encrypted filenames. Don't blame me for doing crazy stuff here :D

I use a Docker container with gcsf installed and mount a host directory into the container. Then I mount the google drive folder via gcsf like described in the docs. I can create successfully an encrypted folder (e.g. ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGy83GFz4yGEAiKGAxkyBL4k--) and it is synced to Google Drive.

But I can't create an encrypted file (e.g. ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGFZOUXF5.ijMuVpWlW9cgCE--). If I use touch test.txt I get the error touch: cannot touch 'test.txt': Function not implemented. vim can't also create/write the file. Any idea if it is gcsf related or not? Maybe someone can test it without Docker?

I can't see any special in the gcsf logs:

DEBUG gcsf::gcsf::filesystem   > Could not perform sync: Not enough time has passed since last sync. Will do nothing.
 DEBUG fuse::request            > RELEASEDIR(1002) ino 0x0000000000000008, fh 0, flags 0x18800, release flags 0x0, lock owner 0
 DEBUG fuse::request            > LOOKUP(1003) parent 0x0000000000000008, name "ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGFZOUXF5.ijMuVpWlW9cgCE--"
 DEBUG fuse::request            > MKNOD(1004) parent 0x0000000000000008, name "ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGFZOUXF5.ijMuVpWlW9cgCE--", mode 0o100644, rdev 0
 DEBUG fuse::request            > LOOKUP(1005) parent 0x0000000000000008, name "ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGFZOUXF5.ijMuVpWlW9cgCE--"
 DEBUG fuse::request            > LOOKUP(1006) parent 0x0000000000000008, name "ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGFZOUXF5.ijMuVpWlW9cgCE--"
 DEBUG fuse::request            > MKNOD(1007) parent 0x0000000000000008, name "ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGFZOUXF5.ijMuVpWlW9cgCE--", mode 0o100644, rdev 0
 DEBUG fuse::request            > LOOKUP(1008) parent 0x0000000000000008, name "ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGFZOUXF5.ijMuVpWlW9cgCE--"
 DEBUG fuse::request            > LOOKUP(1009) parent 0x0000000000000008, name "ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGeE4I73bXfaSp04mOrrYE2U--"
 DEBUG fuse::request            > LOOKUP(1010) parent 0x0000000000000008, name "ECRYPTFS_FNEK_ENCRYPTED.FWajKz29vL--AkZjsw01mylGaO1nGCzLS3XGeE4I73bXfaSp04mOrrYE2U--"

Docker

The Dockerfile looks like:

FROM base/archlinux

RUN pacman -Sy --noconfirm pkg-config rust gcc fuse2 \
    && mkdir -p /opt \
    && cargo -v install --root /opt gcsf \
    && echo "user_allow_other" >> /etc/fuse.conf \
    && pacman -Rs --noconfirm rust gcc \
    && pacman -Scc --noconfirm
ENTRYPOINT ["/opt/bin/gcsf"]

The special Docker mount options is --mount=type=bind,source="$HOME/data/googledrive",target="$HOME/data/googledrive",bind-propagation=shared --device=/dev/fuse. The bind-propagation=shared option must be used, otherwise I don't see the mounted files from fuse inside the Docker container on my host system.

Resources

Report the real file size of exportable Drive documents

File size is not a well defined concept for special Drive documents (Docs, Sheets, Slides) because it depends on the export format. For such documents, GCSF should report the corresponding file size they would have when exported with the default MIME type.

One way of achieving this is by exporting each document at mount time in order to obtain its real size. This is incredibly slow. For the moment, GCSF reports the maximum file size (10 MB) for all special documents.

gocryptfs / securefs support

Hello,
I had problems with gocryptfs, the diriv files got renamed(attached number, maybe while gocryptfs tried to edit the file) and also with securefs, which is not usable at all with GCSF

Maybe there is a special GCSF config needed? Please help :)

The problem with gocryptfs is described here:
rfjakob/gocryptfs#275

kind regards

cargo build fails on macOS 10.12

While installing gcsf using the cargo install gcsf command, it fails with this error:

error[E0432]: unresolved import `libc::EREMOTEIO`
 --> src/gcsf/filesystem.rs:7:29
  |
7 | use libc::{ENOENT, ENOTDIR, EREMOTEIO};
  |                             ^^^^^^^^^ no `EREMOTEIO` in the root. Did you mean to use `EREMOTE`?

I have rustc 1.27.0 and cargo 1.26.0 (installed via brew) and osxfuse 3.8.0.

If it helps, I tried to look for this EREMOTEIO constant in libc's documentation for macOS and it doesn't exist. But on Linux it does.

cargo build fails on Ubuntu 18.04

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
   --> src/gcsf/file_manager.rs:275:13
    |
275 |             FileId::Inode(inode) => self.node_ids.contains_key(&inode),
    |             ^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: `&FileId::Inode(inode)`

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
   --> src/gcsf/file_manager.rs:276:13
    |
276 |             FileId::DriveId(drive_id) => self.drive_ids.contains_key(drive_id),
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: `&FileId::DriveId(drive_id)`

Toolchain installed:

$ rustc --version
rustc 1.25.0 (84203cac6 2018-03-25)
$ cargo --version
cargo 0.26.0 (41480f5cc 2018-02-26)

gzip compression

Google suggests enabling gzip compression before transferring files over the network:

In order to receive a gzip-encoded response you must do two things: Set an Accept-Encoding header, and modify your user agent to contain the string gzip. Here is an example of properly formed HTTP headers for enabling gzip compression:

Accept-Encoding: gzip
User-Agent: my program (gzip)

Find a way to enable this option in GCSF.

GCSF's full name

Please add an explanation what "GCSF" stands for to the readme.

From Hacker News:

GCSF stands for "Google Conduce Sistem de Fișiere" -- a (bad) word-by-word Romanian translation of "Google Drive File System".

Could not mount (OSX 10.13.1)

Hi,

I'm getting this error when i'm trying to mount

andrei@local ~/Documents $ gcsf mount /Users/andrei/Documents/gcsf
 INFO  gcsf > Creating and populating file system...
Please direct your browser to <url_for_google_auth> and follow the instructions displayed there.
 INFO  gcsf > File sytem created.
 INFO  gcsf > Mounting to /Users/andrei/Documents/gcsf
fuse: attempt to remount on active mount point: /Users/andrei/Documents/gcsf ERROR gcsf > Could not mount to /Users/andrei/Documents/gcsf: Undefined error: 0 (os error 0)

fails to sync if working directory is too long

Hi @harababurel ,

I think that filesystem does not show the files, if the directory tree is too deep..

Below ls command should have to list many files and folders :)
resim

Because directories upto a range do not have any problem:
resim

What would you suggest, is there any possible fix for it?

Fine grained control for mount/unmount

I have several directories in my Google Drive, and I would like to mount just few of them.
Can I do this? If not, I would be interested in implementing it. (I desperately need this feature)

Folder/File Permissions hardcoded

hello friend,

the config option for default_permissions seems to have no effect because chmod 755 is hardcoded in at least two files:

src/gcsf/file_manager.rs
src/gcsf/file.rs

Would be nice if we can handle this only via the config file :)

thanks

Dynamic Proxy Support

Hi,
Can there be a dynamic proxy support for GCSF? I'm roaming between proxy limited and open networks (ie work & office). When in office, use of proxy is mandatory, no direct access to Google Drive.
But if GCSF supports proxy, could it be intelligent enough to try to direct as well when it can't reach the proxy, and vice versa.
If proxy is set, try proxy, if can't connect, try direct. After given period ie 1 minute, if direct connection times out and is not possible (ie I went to work), then try to connect through proxy. If connected, use it until it times out again (ie I went home), then try direct.

Automounting

Currently, I have to open up a terminal and start gcsf which stays in the foreground. I thought that I could write a script to test if there was internet connectivity and if so, automount the google drive. That does not work, and I am still forces to manually start an instance.

Am I doing something wrong with my script (I have also tried to use .zprofile as well, and it doesn't work either) or is this an issue native to using fuse?

Improve mounting time

GCSF populates the file tree at mount time, making O(tree depth) requests to Drive (one request for each level). This can be reduced to O(1) but requires a better strategy for constructing the tree internally.

Implement Trash directory

Intended behavior:

  • The Trash directory should show all files with trashed = true on Drive.
  • Removing a file (unlink) from any directory mark it as trashed.
  • Moving a file (rename) from any directory to Trash should mark it as trashed (f273d25).
  • Removing a file (unlink) from Trash should delete it permanently (bd528c3, 11ebeb6)
  • Moving a file (rename) from Trash to anywhere else should mark the file as not trashed and possibly update its parent.
  • Recursively removing a directory (rm -r) should preserve the hierarchy of its content even when moved to Trash

cargo install gcsf

Fails on my Linux machine:

error: failed to run custom build command for fuse v0.3.1
process didn't exit successfully: /tmp/user/1000/cargo-installMwV918/release/build/fuse-f0fb0e86cb51e215/build-script-build (exit code: 101)
--- stderr
thread 'main' panicked at 'called Result::unwrap() on an Err value: Failure { command: ""pkg-config" "--libs" "--cflags" "fuse >= 2.6.0"", output: Output { status: ExitStatus(ExitStatus(256)), stdout: "", stderr: "Package fuse was not found in the pkg-config search path.\nPerhaps you should add the directory containing fuse.pc\'\nto the PKG_CONFIG_PATH environment variable\nNo package \'fuse\' found\n" } }', libcore/result.rs:945:5 note: Run with RUST_BACKTRACE=1` for a backtrace.

warning: build failed, waiting for other jobs to finish...

Ubuntu 18.04 - Fuse error while building

Hi!

I'm running Ubuntu 18.04 and got that error after

~$ cargo install gcsf

Compiling thread_local v0.3.5
error: failed to run custom build command for `fuse v0.3.1`
process didn't exit successfully: `/tmp/cargo-installb4gh87/release/build/fuse-516b54e73b854707/build-script-build` (exit code: 101)
--- stderr
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Command { command: "\"pkg-config\" \"--libs\" \"--cflags\" \"fuse >= 2.6.0\"", cause: Os { code: 2, kind: NotFound, message: "No such file or directory" } }', libcore/result.rs:945:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.

warning: build failed, waiting for other jobs to finish...
error: failed to compile `gcsf v0.1.7`, intermediate artifacts can be found at `/tmp/cargo-installb4gh87`

Caused by:
  build failed

Any ideas? Thanks in advance

non-reference pattern used to match a reference (see issue #42640)

Hello there,
I'm having issues trying to install gcsf on Ubuntu 18.04. Some minutes after run cargo install gcsf I'm getting error messages likes these:

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:302:13
|
302 | FileId::Inode(inode) => Some(*inode),
| ^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::Inode(inode)

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:303:13
|
303 | FileId::DriveId(drive_id) => self.drive_ids.get(drive_id).cloned(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::DriveId(drive_id)

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:304:13
|
304 | FileId::NodeId(node_id) => self.tree
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::NodeId(node_id)

error[E0658]: non-reference pattern used to match a reference (see issue #42640)

cargo -V cargo 0.26.0
rustc -V rustc 1.25.0

Thanks in advance!

cargo build fails

"cargo install gcsf" fails on Ubuntu 16.04 LTS:

error: failed to run custom build command for `fuse v0.3.1`
process didn't exit successfully: `/home/vizzy/tmp/kate/cargo-install.RjKoRWxyF4Kh/release/build/fuse-04be8b764fc091f0/build-script-build` (exit code: 101)
--- stderr
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Failure { command: "\"pkg-config\" \"--libs\" \"--cflags\" \"fuse >= 2.6.0\"", output: Output { status: ExitStatus(ExitStatus(256)), stdout: "", stderr: "Package fuse was not found in the pkg-config search path.\nPerhaps you should add the directory containing `fuse.pc\'\nto the PKG_CONFIG_PATH environment variable\nNo package \'fuse\' found\n" } }', src/libcore/result.rs:916:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.

dpkg -l *fuse*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                  Version                 Architecture            Description
+++-=====================================-=======================-=======================-================================================================================
ii  exfat-fuse                            1.2.3-1                 amd64                   read and write exFAT driver for FUSE
ii  fuse                                  2.9.4-1ubuntu3.1        amd64                   Filesystem in Userspace
un  fuse-module                           <none>                  <none>                  (no description available)
ii  ifuse                                 1.1.2-0.1build3         amd64                   FUSE module for iPhone and iPod Touch devices
ii  libfuse2:amd64                        2.9.4-1ubuntu3.1        amd64                   Filesystem in Userspace (library)
un  python-llfuse-doc                     <none>                  <none>                  (no description available)
ii  python3-llfuse                        0.41.1+dfsg-4build1     amd64                   Python 3 bindings for the low-level FUSE API
un  python3.5-llfuse                      <none>                  <none>                  (no description available)

Any ideas?

GCSF is exporting library interface

I don't think that anybody should use gcsf as a library (correct me if I'm wrong).

Can you please make sure that it is not treated as a lib? (probably by removing lib.rs)

Fail early if file system cannot be mounted due to network connectivity.

If there is no internet connection, GCSF fails to populate the file system which results in the mountpoint containing nothing but an empty "Shared with me" directory.

GCSF should fail early in this case, to make it clear that mounting failed. This will also help systemd detect the process death and restart it accordingly.

Please publish version without extra files

Current gcsf tarball on crates.io contains a lot of useless files like:

-rw-r--r-- 1000/100        336 2018-05-24 21:24 gcsf-0.1.15/.idea/gcsf.iml
-rw-r--r-- 1000/100        409 2018-05-24 21:27 gcsf-0.1.15/.idea/misc.xml
-rw-r--r-- 1000/100        260 2018-05-24 21:24 gcsf-0.1.15/.idea/modules.xml
-rw-r--r-- 1000/100        167 2018-05-24 21:24 gcsf-0.1.15/.idea/vcs.xml
-rw-r--r-- 1000/100      16099 2018-06-26 13:47 gcsf-0.1.15/.idea/workspace.xml
-rw-r--r-- 1000/100          0 2018-06-12 17:56 gcsf-0.1.15/cargo-count.dot
-rw-r--r-- 1000/100     228314 2018-06-12 18:06 gcsf-0.1.15/class_diagram.png
-rw-r--r-- 1000/100        434 2018-03-28 20:25 gcsf-0.1.15/client_secret.json
-rw-r--r-- 1000/100      82233 2018-06-21 17:22 gcsf-0.1.15/gcsf_class_diagram.mdj
-rw-r--r-- 1000/100    1202126 2018-06-12 17:55 gcsf-0.1.15/rainbow-graph.png
-rwxr-xr-x 1000/100        365 2018-06-05 11:22 gcsf-0.1.15/run
-rwxr-xr-x 1000/100        219 2018-05-31 12:33 gcsf-0.1.15/run_release
-rwxr-xr-x 1000/100         49 2018-06-14 13:09 gcsf-0.1.15/timer

Please republish new version without them. Also you would probably want to change your client-secret ;)

Bad request when authenticating

When running gcsf mount /mnt/drive-personal I get the output below. The account is a G Suite account, maybe that matters. This is from the master branch installed via the AUR package.

After clicking the link it also took about 10+ seconds before I got the output. It would be nice if I got some confirmation that the authorisation was completed.

Note: I've redacted the huge URL in the response just in case.

 INFO  gcsf > Creating and populating file system...
Please direct your browser to https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/drive&redirect_uri=http://localhost:8081&response_type=code&client_id=726003905312-e2mq9mesjc5llclmvc04ef1k7qopv9tu.apps.googleusercontent.com and follow the instructions displayed there.
 ERROR gcsf::gcsf::file_manager > Could not populate filesystem: Failure(
    Response {
        status: BadRequest,
        headers: Headers { Date: Mon, 02 Jul 2018 22:41:49 GMT
        , Content-Type: text/html; charset=UTF-8
        , Alt-Svc: quic=":443"; ma=2592000; v="43,42,41,39,35"
        , Transfer-Encoding: chunked
        , },
        version: Http11,
        url: "https://www.googleapis.com/drive/v3/files?redacted",
        status_raw: RawStatus(
            400,
            "Bad Request"
        ),
        message: Http11Message {
            is_proxied: false,
            method: None,
            stream: Wrapper {
                obj: Some(
                    Reading(
                        ChunkedReader(chunk_remaining=0)
                    )
                )
            }
        }
    }
)
 INFO  gcsf                     > File sytem created.
 INFO  gcsf                     > Mounting to /mnt/drive-personal
 INFO  gcsf                     > Mounted to /mnt/drive-personal
^C INFO  gcsf                     > Ctrl-C detected

Improve handling of large amount of data on drives

I now have >100GB on my Google drive and gcsf is not able to handle such large drives in a practical manner.
It seems that gcsf is indexing the whole drive on startup, which takes quite some time for me.
google-drive-ocamlfuse does a on-needed based lookup of the files.
It would be great if gcsf could also handle such large drives in the future.

$ gcsf mount /mymountpoint/ -s mysession
 INFO  gcsf > Creating and populating file system...
 INFO  gcsf::gcsf::drive_facade > Received page 1 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 2 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 3 containing 460 files
 ... about 10 minutes later ..
 INFO  gcsf::gcsf::drive_facade > Received page 219 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 220 containing 125 file
 INFO  gcsf::gcsf::drive_facade > Received page 1 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 2 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 3 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 4 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 5 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 6 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 7 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 8 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 9 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 10 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 11 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 12 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 13 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 14 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 15 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 16 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 17 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 18 containing 460 files
 INFO  gcsf::gcsf::drive_facade > Received page 19 containing 258 files
 INFO  gcsf                     > File sytem created.
 INFO  gcsf                     > Mounting to /mymountpoint/
 INFO  gcsf                     > Mounted to /mymountpoint/
 INFO  gcsf::gcsf::file_manager > Checking for changes and possibly applying them.
...another 30 minutes or so later ...

INFO  gcsf::gcsf::file_manager > Checking for changes and possibly applying them.
 ERROR gcsf::gcsf::drive_facade > Got error: ErrorMessage { msg: "BadRequest(\n    ErrorResponse {\n        error: ServerError {\n            errors: [\n                ServerMessage {\n                    domain: \"global\",\n                    reason: \"fileNotDownloadable\",\n                    message: \"Only files with binary content can be downloaded. Use Export with Google Docs files.\",\n                    location_type: Some(\n                        \"parameter\"\n                    ),\n                    location: Some(\n                        \"alt\"\n                    )\n                }\n            ],\n            code: 403,\n            message: \"Only files with binary content can be downloaded. Use Export with Google Docs files.\"\n        }\n    }\n)" }

At this point I can finally see my files in the mount location.
This long start up duration is not practical for me and I hope that you find the time to improve the situation in the future.

Thanks for your efforts.

Local vs. Cloud Storage?

Out of curiosity, does this take up local storage when mounted? If it does, is there a way to have some type of selective directories?

BadRequest on Google Doc files

I get following error once my (bigger than 100GB) drive is mounted.
From the error message I gather that gcsf is trying to download a Google Docs file,
which seems to be not supported by the Google Drive API (?).

ERROR gcsf::gcsf::drive_facade > Got error: ErrorMessage { msg: "BadRequest(\n    ErrorResponse {\n        error: ServerError {\n            errors: [\n                ServerMessage {\n                    domain: \"global\",\n                    reason: \"fileNotDownloadable\",\n                    message: \"Only files with binary content can be downloaded. Use Export with Google Docs files.\",\n                    location_type: Some(\n                        \"parameter\"\n                    ),\n                    location: Some(\n                        \"alt\"\n                    )\n                }\n            ],\n            code: 403,\n            message: \"Only files with binary content can be downloaded. Use Export with Google Docs files.\"\n        }\n    }\n)" }

As the error message does not mention which file it can not download I am unsure what it tried to get from the server.
it might be some saved google Maps, which google-drive-ocamlfuse seems to create a .desktop file form (on Ubuntu).
E.g. following file was created for me from some saved routes on my google drive:

Travel.desktop

[Desktop Entry]
Type=Link
Name=Route to XXX
URL=https://www.google.com/maps/d/drive?state=%7B%22ids%22:%5B%221lmT28FWMBaCOobleYNrbGMYtTZ0%22%5D,%22action%22:%22open%22,%22userId%22:someNumbersWhichMightBeMyUserId%22%7D

Thank you for your work.

Streaming

Could this be used as a source for streaming software like Plex like similar projects; plexdrive,rclone,ocaml-fuse etc? Where file chunks are important to only caching/downloading the necessary pieces?

user_allow_other in /etc/fuse.conf

What permissions are required that necessitate adding this option to /etc/fuse.conf?

Is this because allow_root is a default mount option?

google-drive3-fork

Hey,

where could I find sources for this? Also any reason not to send patch to upstream?

Update gcsf

How can we update our current gcsf?

I see many new commits in this repo.

Should we compile it all over again to have the recent improvements?

Sorry I am noob btw

BUG: Not all files/folders shown / Randomly missing files/folders

I have ~7200 files in my drive and noticed that with GCSF mount, there are less shown. When looking further I noticed, that every mount the file count changes - even if my gdrive didnt change:

INFO gcsf > Creating and populating file system...
DEBUG gcsf::gcsf::drive_facade > DriveFacade::new()
INFO gcsf::gcsf::drive_facade > Received page 1 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 2 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 3 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 4 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 5 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 6 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 7 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 8 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 9 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 10 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 11 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 12 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 13 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 14 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 15 containing 460 files
INFO gcsf::gcsf::drive_facade > Received page 16 containing 224 files
INFO gcsf::gcsf::drive_facade > Received page 1 containing 5 files
INFO gcsf > File sytem created.
INFO gcsf > Mounting to /home/ttl/gdrive
INFO fuse::session > Mounting /home/ttl/gdrive

The mounting procedure every times shows the correct file count, when summarizing the reported file counts per page- Directly after each mounting I checked file/folder count:

find /home/ttl/gdrive | wc -l
5827

find /home/ttl/gdrive | wc -l
6099

find /home/ttl/gdrive | wc -l
6225

find /home/ttl/gdrive | wc -l
6136

there dont seem to be a fixed limit or something, because the shown file-count changes on every mount.

I looked into the code to find out whats happening and just added a counter in the populate() function - which is reporting the correct file count. The problem must be deeper inside, where my experience is too low

please help :)

Cargo install fails compile

When running cargo install gcsf --verbose I get the following output:

   Compiling gcsf v0.1.7
     Running `rustc --crate-name gcsf .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/lib.rs --crate-type lib --emit=dep-info,link -C opt-level=3 -C metadata=506a9cd05f9eeacf -C extra-filename=-506a9cd05f9eeacf --out-dir /tmp/cargo-install.xyB2tnEem7E9/release/deps -L dependency=/tmp/cargo-install.xyB2tnEem7E9/release/deps --extern serde=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libserde-83d40da977452be1.rlib --extern id_tree=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libid_tree-5ab22dd4b3935017.rlib --extern serde_json=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libserde_json-c936d07379aa12ec.rlib --extern time=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libtime-d9cf4d14b5820b98.rlib --extern mime_sniffer=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libmime_sniffer-9ea93df407c81500.rlib --extern fuse=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libfuse-1892d0144fb018f4.rlib --extern failure=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libfailure-896e078218a313fd.rlib --extern hyper=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libhyper-186a78270cfba44e.rlib --extern clap=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libclap-c9a69a594362058f.rlib --extern config=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libconfig-231b35fd41c6fd48.rlib --extern xdg=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libxdg-588509338b04a846.rlib --extern serde_derive=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libserde_derive-2a7ccfd3e3c86dec.so --extern pretty_env_logger=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libpretty_env_logger-0adc6736911f4a1a.rlib --extern google_drive3_fork=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libgoogle_drive3_fork-26d8a8c503eec870.rlib --extern chrono=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libchrono-b5aff87669060bcc.rlib --extern lazy_static=/tmp/cargo-install.xyB2tnEem7E9/release/deps/liblazy_static-f82cd9b68e35bbb3.rlib --extern yup_oauth2=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libyup_oauth2-0b4a5f1929aa14f4.rlib --extern libc=/tmp/cargo-install.xyB2tnEem7E9/release/deps/liblibc-c0d6e05fb4949aeb.rlib --extern hyper_rustls=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libhyper_rustls-0fa211422f23d1d3.rlib --extern ctrlc=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libctrlc-ae00b40c060a0aa1.rlib --extern rand=/tmp/cargo-install.xyB2tnEem7E9/release/deps/librand-41f56cbf7866346e.rlib --extern itertools=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libitertools-cd00ad4eef8a6d6f.rlib --extern lru_time_cache=/tmp/cargo-install.xyB2tnEem7E9/release/deps/liblru_time_cache-85e1b495d45f512e.rlib --extern log=/tmp/cargo-install.xyB2tnEem7E9/release/deps/liblog-224aa7d8aa66a0d7.rlib --extern maplit=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libmaplit-618d65aa33f6dc96.rlib --cap-lints allow -L native=/tmp/cargo-install.xyB2tnEem7E9/release/build/backtrace-sys-904198f40ce3ddd5/out -L native=/usr/lib/x86_64-linux-gnu -L native=/tmp/cargo-install.xyB2tnEem7E9/release/build/ring-d64e300e6cf95def/out`
error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:275:13
    |
275 |             FileId::Inode(inode) => self.node_ids.contains_key(&inode),
    |             ^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:276:13
    |
276 |             FileId::DriveId(drive_id) => self.drive_ids.contains_key(drive_id),
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:277:13
    |
277 |             FileId::NodeId(node_id) => self.tree.get(&node_id).is_ok(),
    |             ^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:278:18
    |
278 |             pn @ FileId::ParentAndName { .. } => self.get_file(&pn).is_some(),
    |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:276:70
    |
276 |             FileId::DriveId(drive_id) => self.drive_ids.contains_key(drive_id),
    |                                                                      ^^^^^^^^ expected reference, found struct `std::string::String`
    |
    = note: expected type `&_`
               found type `std::string::String`
    = help: try with `&drive_id`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:284:13
    |
284 |             FileId::Inode(inode) => self.node_ids.get(&inode).cloned(),
    |             ^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:285:13
    |
285 |             FileId::DriveId(drive_id) => self.get_node_id(&FileId::Inode(self.get_inode(
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:288:13
    |
288 |             FileId::NodeId(node_id) => Some(node_id.clone()),
    |             ^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:289:22
    |
289 |             ref pn @ FileId::ParentAndName { .. } => {
    |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:302:13
    |
302 |             FileId::Inode(inode) => Some(*inode),
    |             ^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:303:13
    |
303 |             FileId::DriveId(drive_id) => self.drive_ids.get(drive_id).cloned(),
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:304:13
    |
304 |             FileId::NodeId(node_id) => self.tree
    |             ^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:309:13
    |
309 | /             FileId::ParentAndName {
310 | |                 ref parent,
311 | |                 ref name,
312 | |             } => self.get_children(&FileId::Inode(*parent))?
    | |_____________^ expected reference, found enum `gcsf::file::FileId`
    |
    = note: expected type `&gcsf::file::FileId`
               found type `gcsf::file::FileId`

error[E0614]: type `u64` cannot be dereferenced
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:302:42
    |
302 |             FileId::Inode(inode) => Some(*inode),
    |                                          ^^^^^^

error[E0308]: mismatched types
   --> .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/gcsf/file_manager.rs:303:61
    |
303 |             FileId::DriveId(drive_id) => self.drive_ids.get(drive_id).cloned(),
    |                                                             ^^^^^^^^ expected reference, found struct `std::string::String`
    |
    = note: expected type `&_`
               found type `std::string::String`
    = help: try with `&drive_id`

error: aborting due to 15 previous errors

error: failed to compile `gcsf v0.1.7`, intermediate artifacts can be found at `/tmp/cargo-install.xyB2tnEem7E9`

Caused by:
  Could not compile `gcsf`.

Caused by:
  process didn't exit successfully: `rustc --crate-name gcsf .cargo/registry/src/github.com-1ecc6299db9ec823/gcsf-0.1.7/src/lib.rs --crate-type lib --emit=dep-info,link -C opt-level=3 -C metadata=506a9cd05f9eeacf -C extra-filename=-506a9cd05f9eeacf --out-dir /tmp/cargo-install.xyB2tnEem7E9/release/deps -L dependency=/tmp/cargo-install.xyB2tnEem7E9/release/deps --extern serde=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libserde-83d40da977452be1.rlib --extern id_tree=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libid_tree-5ab22dd4b3935017.rlib --extern serde_json=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libserde_json-c936d07379aa12ec.rlib --extern time=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libtime-d9cf4d14b5820b98.rlib --extern mime_sniffer=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libmime_sniffer-9ea93df407c81500.rlib --extern fuse=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libfuse-1892d0144fb018f4.rlib --extern failure=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libfailure-896e078218a313fd.rlib --extern hyper=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libhyper-186a78270cfba44e.rlib --extern clap=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libclap-c9a69a594362058f.rlib --extern config=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libconfig-231b35fd41c6fd48.rlib --extern xdg=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libxdg-588509338b04a846.rlib --extern serde_derive=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libserde_derive-2a7ccfd3e3c86dec.so --extern pretty_env_logger=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libpretty_env_logger-0adc6736911f4a1a.rlib --extern google_drive3_fork=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libgoogle_drive3_fork-26d8a8c503eec870.rlib --extern chrono=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libchrono-b5aff87669060bcc.rlib --extern lazy_static=/tmp/cargo-install.xyB2tnEem7E9/release/deps/liblazy_static-f82cd9b68e35bbb3.rlib --extern yup_oauth2=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libyup_oauth2-0b4a5f1929aa14f4.rlib --extern libc=/tmp/cargo-install.xyB2tnEem7E9/release/deps/liblibc-c0d6e05fb4949aeb.rlib --extern hyper_rustls=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libhyper_rustls-0fa211422f23d1d3.rlib --extern ctrlc=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libctrlc-ae00b40c060a0aa1.rlib --extern rand=/tmp/cargo-install.xyB2tnEem7E9/release/deps/librand-41f56cbf7866346e.rlib --extern itertools=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libitertools-cd00ad4eef8a6d6f.rlib --extern lru_time_cache=/tmp/cargo-install.xyB2tnEem7E9/release/deps/liblru_time_cache-85e1b495d45f512e.rlib --extern log=/tmp/cargo-install.xyB2tnEem7E9/release/deps/liblog-224aa7d8aa66a0d7.rlib --extern maplit=/tmp/cargo-install.xyB2tnEem7E9/release/deps/libmaplit-618d65aa33f6dc96.rlib --cap-lints allow -L native=/tmp/cargo-install.xyB2tnEem7E9/release/build/backtrace-sys-904198f40ce3ddd5/out -L native=/usr/lib/x86_64-linux-gnu -L native=/tmp/cargo-install.xyB2tnEem7E9/release/build/ring-d64e300e6cf95def/out` (exit code: 101)

This is on an Ubuntu 18.04 machine with cargo 0.23.0 (61fa02415 2017-11-22).

gcsf login doesn't save credentials

Hi, I'm using gcsf latest release (0.1.21) build from AUR on Arch, and when executing:

gcsf login <my_session_name>

And get authenticated by google, I don't get the expected:

~/.config/gcsf/<my_session_name>

And besides:

gcsf list

Returns:

No sessions found.

After authenticating through google I get on the browser:

You may now close this window.

Enforce file permissions

chmod does not work because the setattr method defined in the fuse crate does not allow setting file permissions (AFAICT).

Find a way to add support for setting file attributes. Alternatively, look into the default_permissions mount options.

Authenticate on server with only Terminal

I can't access a brower on the server I'm trying to authenticate.
Hence I have tried to copypaste the link:
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/drive&redirect_uri=http://localhost:8081&response_type=code&clien...
to my desktop and pasting the answer starting with:
code=4/yADuHTvSsLq2f_W_...
In to a textfile as described: "$HOME/.config/gcsf/some_session_name"
However Mounting fails with:
INFO gcsf > Creating and populating file system... thread 'main' panicked at 'calledResult::unwrap()on anErrvalue: Custom { kind: InvalidData, error: Error("expected value", line: 1, column: 1) }', libcore/result.rs:1009:5 note: Run withRUST_BACKTRACE=1 for a backtrace.

How do you authenticate on a server that you don't have browser access to?
Else please give me an example file how the session name file should look like.
Thanks!

Could not compile gcsf

Hi,
I was trying to build gcsf and ran into the following error:

cargo install gcsf

Updating registry `https://github.com/rust-lang/crates.io-index`

Downloading gcsf v0.1.7
Installing gcsf v0.1.7
Downloading id_tree v1.3.0
Downloading serde_json v1.0.22
Downloading rand v0.4.2
Downloading google-drive3-fork v1.0.10
Downloading mime-sniffer v0.1.2
Downloading itertools v0.7.8
Downloading ctrlc v3.1.1
Downloading hyper-rustls v0.6.1
Downloading failure v0.1.1
Downloading serde v1.0.69
Downloading fuse v0.3.1
Downloading pretty_env_logger v0.2.3
Downloading maplit v1.0.1
Downloading log v0.4.3
Downloading config v0.8.0
Downloading lazy_static v1.0.1
Downloading yup-oauth2 v1.0.7
Downloading libc v0.2.42
Downloading clap v2.32.0
Downloading hyper v0.10.13
Downloading time v0.1.40
Downloading xdg v2.1.0
Downloading lru_time_cache v0.8.0
Downloading chrono v0.4.4
Downloading serde_derive v1.0.69
Downloading snowflake v1.3.0
Downloading itoa v0.4.1
Downloading dtoa v0.4.2
Downloading url v0.5.10
Downloading mime v0.2.6
Downloading quote v0.6.3
Downloading syn v0.14.4
Downloading proc-macro2 v0.4.6
Downloading unicode-xid v0.1.0
Downloading log v0.3.9
Downloading language-tags v0.2.2
Downloading base64 v0.6.0
Downloading unicase v1.4.2
Downloading url v1.7.0
Downloading traitobject v0.1.0
Downloading num_cpus v1.8.0
Downloading typeable v0.1.2
Downloading httparse v1.3.2
Downloading cfg-if v0.1.4
Downloading safemem v0.2.0
Downloading byteorder v1.2.3
Downloading version_check v0.1.3
Downloading idna v0.1.4
Downloading matches v0.1.6
Downloading percent-encoding v1.0.1
Downloading unicode-bidi v0.3.4
Downloading unicode-normalization v0.1.7
Downloading unicode-bidi v0.2.6
Downloading uuid v0.2.3
Downloading rustc-serialize v0.3.24
Downloading rand v0.3.22
Downloading rustls v0.9.0
Downloading itertools v0.4.19
Downloading base64 v0.5.2
Downloading chrono v0.2.25
Downloading ring v0.11.0
Downloading untrusted v0.5.1
Downloading webpki v0.14.0
Downloading rayon v0.7.1
Downloading gcc v0.3.54
Downloading rayon-core v1.4.0
Downloading crossbeam-deque v0.2.0
Downloading crossbeam-utils v0.2.2
Downloading crossbeam-epoch v0.3.1
Downloading scopeguard v0.3.3
Downloading nodrop v0.1.12
Downloading memoffset v0.2.1
Downloading arrayvec v0.4.7
Downloading webpki-roots v0.11.0
Downloading num v0.1.42
Downloading num-integer v0.1.39
Downloading num-traits v0.2.5
Downloading num-iter v0.1.37
Downloading mime v0.3.8
Downloading unicase v2.1.0
Downloading either v1.5.0
Downloading backtrace v0.3.9
Downloading failure_derive v0.1.1
Downloading rustc-demangle v0.1.8
Downloading synstructure v0.6.1
Downloading quote v0.3.15
Downloading syn v0.11.11
Downloading synom v0.11.3
Downloading unicode-xid v0.0.4
Downloading thread-scoped v1.0.2
Downloading pkg-config v0.3.11
Downloading env_logger v0.5.10
Downloading ansi_term v0.11.0
Downloading termcolor v0.3.6
Downloading humantime v1.1.1
Downloading atty v0.2.10
Downloading regex v1.0.1
Downloading quick-error v1.2.2
Downloading memchr v2.0.1
Downloading aho-corasick v0.6.5
Downloading utf8-ranges v1.0.0
Downloading regex-syntax v0.6.1
Downloading thread_local v0.3.5
Downloading ucd-util v0.1.1
Downloading unreachable v1.0.0
Downloading void v1.0.2
Downloading toml v0.4.6
Downloading serde-hjson v0.8.1
Downloading nom v3.2.1
Downloading yaml-rust v0.4.0
Downloading num-traits v0.1.43
Downloading linked-hash-map v0.3.0
Downloading regex v0.1.80
Downloading serde v0.8.23
Downloading lazy_static v0.2.11
Downloading serde_test v0.8.23
Downloading thread_local v0.2.7
Downloading regex-syntax v0.3.9
Downloading aho-corasick v0.5.3
Downloading utf8-ranges v0.1.3
Downloading memchr v0.1.11
Downloading thread-id v2.0.0
Downloading kernel32-sys v0.2.2
Downloading winapi v0.2.8
Downloading winapi-build v0.1.1
Downloading memchr v1.0.2
Downloading linked-hash-map v0.5.1
Downloading unicode-width v0.1.5
Downloading bitflags v1.0.3
Downloading yaml-rust v0.3.5
Downloading vec_map v0.8.1
Downloading strsim v0.7.0
Downloading textwrap v0.10.0
Downloading nix v0.11.0
Downloading backtrace-sys v0.1.23
Downloading cc v1.0.17
Compiling num-integer v0.1.39
Compiling utf8-ranges v0.1.3
Compiling untrusted v0.5.1
Compiling quick-error v1.2.2
Compiling lru_time_cache v0.8.0
Compiling regex-syntax v0.3.9
Compiling byteorder v1.2.3
Compiling matches v0.1.6
Compiling quote v0.3.15
Compiling cc v1.0.17
Compiling nodrop v0.1.12
Compiling unicode-xid v0.1.0
Compiling serde v0.8.23
Compiling memoffset v0.2.1
Compiling unicode-xid v0.0.4
Compiling vec_map v0.8.1
Compiling itoa v0.4.1
Compiling cfg-if v0.1.4
Compiling rustc-serialize v0.3.24
Compiling winapi v0.2.8
Compiling safemem v0.2.0
Compiling strsim v0.7.0
Compiling rayon-core v1.4.0
Compiling either v1.5.0
Compiling itertools v0.4.19
Compiling regex v1.0.1
Compiling thread-scoped v1.0.2
Compiling unicode-normalization v0.1.7
Compiling winapi-build v0.1.1
Compiling libc v0.2.42
Compiling scopeguard v0.3.3
Compiling xdg v2.1.0
Compiling maplit v1.0.1
Compiling lazy_static v0.2.11
Compiling version_check v0.1.3
Compiling void v1.0.2
Compiling gcc v0.3.54
Compiling typeable v0.1.2
Compiling unicode-width v0.1.5
Compiling bitflags v1.0.3
Compiling yaml-rust v0.3.5
Compiling linked-hash-map v0.5.1
Compiling nix v0.11.0
Compiling num-traits v0.2.5
Compiling pkg-config v0.3.11
Compiling dtoa v0.4.2
Compiling utf8-ranges v1.0.0
Compiling num-iter v0.1.37
Compiling ansi_term v0.11.0
Compiling language-tags v0.2.2
Compiling snowflake v1.3.0
Compiling rustc-demangle v0.1.8
Compiling lazy_static v1.0.1
Compiling serde v1.0.69
Compiling percent-encoding v1.0.1
Compiling httparse v1.3.2
Compiling ucd-util v0.1.1
Compiling traitobject v0.1.0
Compiling termcolor v0.3.6
Compiling humantime v1.1.1
Compiling unicode-bidi v0.2.6
Compiling unicode-bidi v0.3.4
Compiling base64 v0.5.2
Compiling arrayvec v0.4.7
Compiling proc-macro2 v0.4.6
Compiling serde_test v0.8.23
Compiling synom v0.11.3
Compiling backtrace-sys v0.1.23
Compiling log v0.4.3
Compiling crossbeam-utils v0.2.2
Compiling base64 v0.6.0
Compiling itertools v0.7.8
Compiling kernel32-sys v0.2.2
Compiling memchr v2.0.1
Compiling rand v0.4.2
Compiling memchr v0.1.11
Compiling time v0.1.40
Compiling atty v0.2.10
Compiling num_cpus v1.8.0
Compiling memchr v1.0.2
Compiling unreachable v1.0.0
Compiling unicase v2.1.0
Compiling unicase v1.4.2
Compiling textwrap v0.10.0
Compiling yaml-rust v0.4.0
Compiling fuse v0.3.1
Compiling id_tree v1.3.0
Compiling regex-syntax v0.6.1
Compiling linked-hash-map v0.3.0
Compiling idna v0.1.4
Compiling syn v0.11.11
Compiling log v0.3.9
Compiling quote v0.6.3
Compiling crossbeam-epoch v0.3.1
Compiling aho-corasick v0.5.3
Compiling aho-corasick v0.6.5
Compiling nom v3.2.1
Compiling rand v0.3.22
Compiling thread_local v0.3.5
Compiling clap v2.32.0
Compiling mime v0.2.6
Compiling syn v0.14.4
Compiling crossbeam-deque v0.2.0
Compiling synstructure v0.6.1
Compiling uuid v0.2.3
Compiling num-traits v0.1.43
Compiling ctrlc v3.1.1
Compiling serde_json v1.0.22
Compiling toml v0.4.6
Compiling url v1.7.0
Compiling backtrace v0.3.9
Compiling thread-id v2.0.0
Compiling url v0.5.10
Compiling mime v0.3.8
Compiling failure_derive v0.1.1
Compiling serde_derive v1.0.69
Compiling chrono v0.4.4
Compiling env_logger v0.5.10
Compiling thread_local v0.2.7
Compiling rayon v0.7.1
Compiling hyper v0.10.13
Compiling mime-sniffer v0.1.2
Compiling failure v0.1.1
Compiling num v0.1.42
Compiling regex v0.1.80
Compiling ring v0.11.0
Compiling pretty_env_logger v0.2.3
Compiling chrono v0.2.25
Compiling serde-hjson v0.8.1
Compiling config v0.8.0
Compiling webpki v0.14.0
Compiling webpki-roots v0.11.0
Compiling rustls v0.9.0
Compiling hyper-rustls v0.6.1
Compiling yup-oauth2 v1.0.7
Compiling google-drive3-fork v1.0.10
Compiling gcsf v0.1.7
error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:275:13
|
275 | FileId::Inode(inode) => self.node_ids.contains_key(&inode),
| ^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::Inode(inode)
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:276:13
|
276 | FileId::DriveId(drive_id) => self.drive_ids.contains_key(drive_id),
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::DriveId(drive_id)
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:277:13
|
277 | FileId::NodeId(node_id) => self.tree.get(&node_id).is_ok(),
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::NodeId(node_id)
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:278:18
|
278 | pn @ FileId::ParentAndName { .. } => self.get_file(&pn).is_some(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::ParentAndName { .. }
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:284:13
|
284 | FileId::Inode(inode) => self.node_ids.get(&inode).cloned(),
| ^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::Inode(inode)
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:285:13
|
285 | FileId::DriveId(drive_id) => self.get_node_id(&FileId::Inode(self.get_inode(
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::DriveId(drive_id)
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:288:13
|
288 | FileId::NodeId(node_id) => Some(node_id.clone()),
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::NodeId(node_id)
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:289:22
|
289 | ref pn @ FileId::ParentAndName { .. } => {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::ParentAndName { .. }
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:302:13
|
302 | FileId::Inode(inode) => Some(*inode),
| ^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::Inode(inode)
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:303:13
|
303 | FileId::DriveId(drive_id) => self.drive_ids.get(drive_id).cloned(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::DriveId(drive_id)
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:304:13
|
304 | FileId::NodeId(node_id) => self.tree
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a reference: &FileId::NodeId(node_id)
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable

error[E0658]: non-reference pattern used to match a reference (see issue #42640)
--> src/gcsf/file_manager.rs:309:13
|
309 | / FileId::ParentAndName {
310 | | ref parent,
311 | | ref name,
312 | | } => self.get_children(&FileId::Inode(*parent))?
| |_____________^
|
= help: add #![feature(match_default_bindings)] to the crate attributes to enable
help: consider using a reference
|
309 | &FileId::ParentAndName {
310 | ref parent,
311 | ref name,
312 | } => self.get_children(&FileId::Inode(*parent))?
|

error: aborting due to 12 previous errors

error: failed to compile gcsf v0.1.7, intermediate artifacts can be found at /tmp/cargo-install.KtxsptlZHLVq

Caused by:
Could not compile gcsf.

To learn more, run the command again with --verbose.

What logs/information could I provide to sort this out...really want to get this working. Thanks.

Can't create new session if using different dns

First time user here and pretty cool app.
I had problems creating a new session because I had to use default settings in my laptop's connection to create this session. I just using cloudflare's dns - 1.1.1.1 and 1.0.0.1.
Is this happening because of google of the application?

Wrong disc usage

On a mounted gcsf du shows wrong datasizes, this is due to the filesystem reporting 512 Bytes disc usages for every file (compare ls -ls).
For du this can be passed by with --apparent-size, but other programs rely on this information.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.