Skip to content
Jan 24, 2017

@odeke-em odeke-em released this Jan 7, 2017 · 49 commits to master since this release

This is the first release for 2017, following the last release ~4 months ago.

Lots of bug fixes and updates to this release:

  • fixed a progress bar overflow: This bug was reported in duplicate issues:

  • fixed up spurious pagination that resulted from asynchronous pagination before children were produced.
    This issue was reported by @bjohas in #724.
    It was fixed by PR #768.

  • unshare no matches found bug when no --type was specified.
    This issue was reported by @bjohas in issue #747.
    The problem was that if a user made a request such as:

    $ drive unshare -emails -id some_id

    without having specified the --type, no default accountType was set, hence the
    user would get back an non-intuitive/cryptic error

    no matches found!

    The change in PR #771 fixed it; it adds User
    as the defaultType.

  • fixed a regression in which emails were no longer being set. This issue was noticed in #762. It was fixed by PR #763.

  • fixed a bug in which local and remote dirTypes differed. There was a long standing TODO in code
    to fix this issue and it was high time that the chickens had come home to roost. This issue was fixed
    by PR #770.
    The result of the fix is that if the types differ, we now get an informative error

$ drive new --mime-key docs share_test
$ mkdir -p share_test
$ drive pull share_test; echo $?
/share_test: local is a directory while remote is a file
  • fixed up a README inconsistency in the documentation of the various options. This issue was reported by
    @jean-christophe-manciot in issue #772. The issue involved
    contributions from @sselph and @shaggytwodope. The cause of confusion is that Go's flag package
    accepts both -flag and --flag indiscriminately. For folks used to *NIX CLI options get confused
    because they are accustomed to -s and --short instead where:
    +-s is the short option
    +--short is the long option
    The issue was fixed by @shaggytwodope with PR #779.

  • added the ability to structure .driverc files. This feature was requested by @jean-christophe-manciot in
    issue #778. The need for this feature is that using a single global
    configuration for every option is very limiting, because one will want --depth=1 for list and --depth=-1
    for push, of which the old style of a single configuration style couldn't accomodate.
    The solution was implemented by PR #813 and
    The new style .driverc file allows for structure e.g


where a section is a command's verb that can be run on the commandline e.g push, pull, list, delete, trash etc, as well as special global which indicates the fallback/general-purpose section.
The rules of resolution are:
a) If an option is specified in a section that isn't [global], it has precedence over the
[global] or default options e.g


no-clobber=true wins
b) for options in the same section, the later the option the higher the overriding precedence e.g


In this case long=true was declared later so long=true wins

c) multiple sections can be specified in a section, but separated by "/":


will make depth=-1, no-clobber=true for push, pull and list.

  • fixed an off by one traversal depth bug for md5sum and stat. This bug was reported by
    @jean-christophe-manciot in #783. The problem was that at
    the entry of the recursive function, we'd asap check if depth=0 and exist. However, if we are traversing
    a directory/folder, in order to stop recursion on every step we'll decrement the depth by 1. By the time we
    hit a non-directory after starting from a directory, we'd not stat/md5sum it. The fix was to first perform
    the desired operations and then only check that condition at the end. It was fixed by PR

  • Updated the README documentation to describe how to use --notify for file sharing. This issue was reported by @bjohas in issue #791. It was also fixed by @bjohas
    with PR #791.

  • fixed an illogical return status code on stat failure. This bug was reported by @aueuaio in issue #801. The problem was that the stat error was getting shadowed and also it was being logged to stdout instead of being recomposed and propagated on exit. It was fixed by PR #804.

  • added a new mode to fix clashes with option --fix-mode. This feature was designed and implemented by @iblis17 in PR #810. The feature is a new policy that allows you:

    • trash clashing files.
      The default behavior is to rename them.
      We can now do
    $ drive clashes --fix --fix-mode trash

    In that PR, also @jpambrun gave an alternate view and caution on user expectations.
    This is pretty cool, it was @iblis17's first Go code and they knocked it out of the park!!
    Congrats @iblis17, we are lucky to have you in the drive community and also in the Go community!

  • fixed spurious rename error for non-existent-to-begin-with-file. This error was reported in issue #826. The problem and use case was that I was manipulating
    files that only exist on the cloud and not on my local disk because I have no local disk space. However,
    on performing a rename of a file that only exists remotely, I'd get a spurious error such as

$  drive rename WINTER2017/h1.s binary.s
rename /Users/emmanuelodeke/ /Users/emmanuelodeke/ no such file or directory

This issue was fixed by PR #827.

  • introduced a debug print mode.
    This feature was implemented in PR #830.
    Using environment flag DRIVE_DEBUG=true (carefully chosen to avoid clashing with
    other programs that might rely on DEBUG), one can get debug information dumped to standard output.
    The main purpose of this feature is to aid in easy debugging and particularly to alleviate
    #829 in which the reporter could have been informed ASAP
    that their directory had a .gd directory instead of them having to use their mental microscope
    to figure out what went wrong.

    Typical output will look like

    $ DEBUG=true drive list share-testing/
    contextPath: /Users/emmanuelodeke/
    driveRoot: "/Users/emmanuelodeke/" relToRoot: ""
    RCPath: /Users/emmanuelodeke/
    parsedContent from
    "global": {
      "depth": -1
    [Commands.List] #0 "/share-testing"
    -- owner       175.00B    0Bwu8laYc9RTPa28zVk9Td2hTVWc    2016-06-30
    15:32:25 +0000 UTC  /share-testing/SciqPCKrhi.go
    -- owner       309.00B    0Bwu8laYc9RTPTXRYblNqQXBSQzQ    2016-02-03
    08:12:15 +0000 UTC  /share-testing/outf.go
    -s owner       39.70KB    0Bwu8laYc9RTPOVNSeElpdFBpS2M    2012-02-02
    12:00:00 +0000 UTC  /share-testing/ComedyPunchlineDrumSound.mp3


$ make
CGO_ENABLED=0 GOOS=linux GOARM=5 GOARCH=arm go build -o ./bin/drive_armv5 ./cmd/drive
CGO_ENABLED=0 GOOS=linux GOARM=6 GOARCH=arm go build -o ./bin/drive_armv6 ./cmd/drive
CGO_ENABLED=0 GOOS=linux GOARM=7 GOARCH=arm go build -o ./bin/drive_armv7 ./cmd/drive
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o ./bin/drive_armv8 ./cmd/drive
CGO_ENABLED=0 GOOS=darwin go build -o ./bin/drive_darwin ./cmd/drive
CGO_ENABLED=0 GOOS=linux go build -o ./bin/drive_linux ./cmd/drive
rm -f ./bin/md5Sums.txt
find ./bin -type f -name "drive_*" -exec md5 {} >> ./bin/md5Sums.txt \;
cat ./bin/md5Sums.txt
MD5 (./bin/drive_armv5) = 990d899bdff2e54cd401ece624a4f8be
MD5 (./bin/drive_armv6) = 812689b6bb2113948c8394854bbde47f
MD5 (./bin/drive_armv7) = 222be8926c35353f81baba014d926c71
MD5 (./bin/drive_armv8) = ecc56e8df5af018eab40097d261e862d
MD5 (./bin/drive_darwin) = 4b2528c13a5fb955bf28f48beec197ca
MD5 (./bin/drive_linux) = a192d38419377aa27a45d90055c56a14

This release as mentioned is the first of a new year 2017! Hoping for brighter days and more stability, and more user engagement. Our customers, the drive community deserve to have the best commandline client
for Google Drive and that's a constant that we all strive for!
Thank you very much everyone for your patience, contributions, analysis, encouragement, critic, ideas etc.

In particular, I'd like to give a shout to @jean-christophe-manciot for finding many bugs and for all the feedback!

This is a dawn of a new era, let's go for it!! Happy New Year!

Assets 9
Dec 26, 2016
Release v0.3.9rc1

@odeke-em odeke-em released this Sep 18, 2016 · 87 commits to master since this release

This release is the end of the summer 2016 release -- a return from a 3 month hiatus, in which a whole lot of bugs were fixed.

It features:

  • Travis install fix. After adding a Makefile, the build was broken. PR #666 by @sselph fixed this bug
  • share, --with-link to avoid public file indexing, but only those with a link can access it.
    This feature was requested for in #568 by @RickCogley and the fix was guided by @thebaddie. The problem was that doing
$ drive pub afile

would make Google publicly index the shared file, of which for private files shouldn't be indexed. The fix for it involved ensuring that property WithLink. It was implemented in PR #674, thus you can now do

$ drive share --with-link release-videos/stewie_dez_nuts.mp4 
Provide access for accountType(s)

For roles(s)

    + Anyone with the link

File(s) to share:
    + stewie_dez_nuts.mp4

Proceed with the changes? [Y/n]:y
successful share for stewie_dez_nuts.mp4 with email "", role "reader" accountType "anyone"
$ drive url release-videos/stewie_dez_nuts.mp4 
  • Fixed a spurious error when parsing .driverc files, that was caused by function signatures getting changed but variable reuse meant an old error was used. This bug was reported by @dconathan in #677, then duplicate reported by @staltux in #679. It was fixed by PR #678.
  • Added the ability to type select during pull/push ie folders only, files only etc. This feature was requested by @brandoncurtis in #670. It was fixed by #673.
    You can now do
$ drive push --directories a1/m1
$ drive pull --files tf1/tf2
  • Fixed a nil/uninitialized filter dereference. This bug was caused by PR #632. It was reported by @Sjlver in #681. It was fixed by #682.
  • Encryption and decryption key variables can now be recognized in the .driverc configuration file. This bug was reported by @quisar in #683. The bug was that the variables for encryption-key and decryption-key were not recognized. It was fixed by #684
$ cat .driverc
$ drive push test.mp4 # Should be encrypted at rest
$ drive pull --piped test.mp4 > outf && diff outf test.mp4 # Should be decrypted properly
  • Fixed up --no-clobber description for push. This bug was reported by @kcwu in #685. It was fixed by #688.
  • Updated the QR code dispensing drive-server to write a png image using the response writer's .Write method instead of going first through fmt.Fprintf(res, "%s", pngImage), the code is clearer and faster. This update was made in #689.
  • pull/export can now export to the same directory and level. This feature was requested by @AtcR in #660. The use case is to avoid creating too many exports' directories and to allow your exported files to be placed in one place. It was added in #696.
$ drive pull --explicitly-export --exports-dir ~/Desktop/exp --export pdf,txt,odt --same-exports-dir
+ /test-exports/
+ /test-exports/few
+ /test-exports/influx
Addition count 3
Proceed with the changes? [Y/n]:y
Exported '/Users/emmanuelodeke/' to '/Users/emmanuelodeke/Desktop/exp/influx.pdf'
Exported '/Users/emmanuelodeke/' to '/Users/emmanuelodeke/Desktop/exp/influx.txt'
Exported '/Users/emmanuelodeke/' to '/Users/emmanuelodeke/Desktop/exp/few.pdf'
Exported '/Users/emmanuelodeke/' to '/Users/emmanuelodeke/Desktop/exp/'
Exported '/Users/emmanuelodeke/' to '/Users/emmanuelodeke/Desktop/exp/'
Exported '/Users/emmanuelodeke/' to '/Users/emmanuelodeke/Desktop/exp/'
  • Disable the automatic creation of *.desktop files on Linux. This feature was requested by @chevillet in #697. It was added in #698 and now you can do
$ drive pull --desktop-links=false

and you could keep this behavior turned on in your .driverc by

$ cat << ! >> .driverc
> desktop-links=false
> !
  • list --trashed now returns all items in the same current working directory. This bug was reported by @njbbaer in #695. It was also fixed by @njbbaer in #700. The diagnosis of the bug was two fold which you can find by reading #700 (comment).
  • --ignore-checksum documentation was made more coherent. This was made by @gjalsem in #703.
  • audited open file descriptors to ensure that they closed to avoid running out of open files ie descriptor leakage. This issue was reported in #711 by a quick audit
$ git grep -E 'os.Open\(' src/* config/* drive-gen/*.go
src/misc.go:    f, fErr := os.Open(p)
src/remote.go:          file, err := os.Open(fsAbsPath)
src/types.go:   fh, err := os.Open(f.BlobAt)

in which I noticed some opens but no accompanying closes.
Alas there was a call site that leaked its descriptors ie during file upload. This behavior was fixed by #712. The fix involved avoiding unnecessary opens but also attaching a file.Close handler to clean up after the caller returned. That change results in better performance and less resource exhaustion.

  • Fixed push mounted(push -m) that always unloaded entries in the root as reported in #641.
    This bug was a regression from #616. It was fixed by #713. The fix also ensured that we caught erraneous proceedings after push mounted had returned due to a failure to return when done.
  • list --sort now accepts multiple sort properties. This bug was reported in #714. It was fixed by #715 that ensures that sorters can be passed in delimited by comma. It also updated the doc on list sorting. So now we can perform composite sorts for example by name in descending order, then modification time in ascending:
$ drive list -sort name_r,modtime
  • Fedora package for drive. This was contributed by @agrez in #717. Please see for how to get drive on Fedora.
  • return a non-zero error after fixing clashes so that scripts can refresh and then re-pull. This was reported by @yottabit42 in #720. Given that a call for fixing clashes during pull or push stops the operation, it is necessary that the outside world be relayed to, that the operation can be retried, e.g by a shell script. This behavior was fixed by @sselph in #722.
  • touch now allows custom times to be set. This feature was requested by @bjohas in #726. It was implemented in #729.
    Now you can set the desired times on your remote files instead of them just always being at the time that drive touch was performed on the remote server. You can do pass in custom times, and custom time formats for example:
$ drive touch --time 20120202120000 ComedyPunchlineDrumSound.mp3
/share-testing/ComedyPunchlineDrumSound.mp3: 2012-02-02 12:00:00 +0000 UTC
$ drive touch --format "2006-01-02-15:04:05.0000Z" --time "2016-02-03-08:12:15.0070Z" outf.go
/share-testing/outf.go: 2016-02-03 08:12:15 +0000 UTC
$ drive touch --duration -30h ComedyPunchlineDrumSound.mp3 outf.go
/share-testing/outf.go: 2016-09-10 08:06:39 +0000 UTC
/share-testing/ComedyPunchlineDrumSound.mp3: 2016-09-10 08:06:39 +0000 UTC
  • Fixed pulling from a deprecated Google Web Hosting URL. This bug was a notice from Google Drive However it was reported by @dermesser in #734 (comment) and revealed by @cdown's bug report in #734. It was fixed by @dermesser in #735. It was then updated by #736.
  • Fixed unrelayed errors on pulls. This bug was reported by @cdown in #734. It was fixed by #737.
  • Documented lone modification time change handling during checksum verification. This request for clarity was made by @tkeith in #690. It was fixed by #742.
  • Propagating and handling errors from remote file resolution/pagination. This bug was catastrophic and had plagued drive for a full year and more. The problem was in the design of the pagination where the paginator asynchronously retrieved files and only returned a channel of files. The problem was that during resolving files, we would encounter a remote Google Drive error e.g from its servers crashing, or from quota/rate-limit exhaustion. Not propagating the encountered error meant that during a pull or push, the remote side would be reported to not have files which would cause a full upload/deletion. This bug was reported in very many places; to name a few:
  • @CountryBumkin reported #480. #480 is probably the most commented on issue in drive because a rate limiting bug on Google Drive's backend(which may still exist as of writing) on drive's globally used quota caused spurious deletions and reuploads for users all around the world.
  • @brandoncurtis reported #668 in which intermittent 503 errors from Google Drive permitted pushes(because the 503 was never propagated to the caller) and then caused spurious conflicts so the user would be stuck in a state of limbo.
  • @jimr6007 reported #728 in which duplicate files were being pushed upstream because a previous 500 intermittent error on Google Drive would cause the remote files to be reported as non-existent.
  • @creighto reported #738 in which the opposite of @jimr6007's case ie a pull instead of a push, caused a spurious need for deletions.


$ make
CGO_ENABLED=0 GOOS=linux GOARM=5 GOARCH=arm go build -o ./bin/drive_armv5 ./cmd/drive
CGO_ENABLED=0 GOOS=linux GOARM=6 GOARCH=arm go build -o ./bin/drive_armv6 ./cmd/drive
CGO_ENABLED=0 GOOS=linux GOARM=7 GOARCH=arm go build -o ./bin/drive_armv7 ./cmd/drive
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o ./bin/drive_armv8 ./cmd/drive
CGO_ENABLED=0 GOOS=darwin go build -o ./bin/drive_darwin ./cmd/drive
CGO_ENABLED=0 GOOS=linux go build -o ./bin/drive_linux ./cmd/drive
rm -f ./bin/md5Sums.txt
find ./bin -type f -name "drive_*" -exec md5 {} >> ./bin/md5Sums.txt \;
cat ./bin/md5Sums.txt
MD5 (./bin/drive_armv5) = 56521b19ec572f27b4fc434e987e1c10
MD5 (./bin/drive_armv6) = 2dfba2e2f4d40fe4987f0f641ddaaccb
MD5 (./bin/drive_armv7) = 831790fc2e66a033cee20b5bd6b03695
MD5 (./bin/drive_armv8) = 894901be67472b1fe49c4acc962cdc8b
MD5 (./bin/drive_darwin) = 6e9968de26e93448eedc9835b66ef5fb
MD5 (./bin/drive_linux) = e175943bc56a8f01b7c7574ddf383986

This release is very interesting because it is a deal breaker for a lot of reliability and trust that users can now get in drive. My biggest apologies to all the users that were affected by lack of error propagation during remote resolution/pagination. Unfortunately I hadn't had much time to work on it, but this afternoon felt right.

This was the end of the summer release and reflecting back on the lessons learned while working on drive in my spare time, getting help from numerous volunteers and well wishers, interacting with the users both on the issue tracker and via email; I have to say this is a great experience. Fighting these fires has given me wisdom and experience to keep working on other things.

With this release, I hope this takes us to new frontiers establishing drive as a product that users can rely on with reliability, speed, performance and ease of use with all the features contained in here.

I am looking forward to the next release!

The Summer has ended but have a great Fall season and keep filing those bugs, tell your friends about drive and enjoy!



Assets 9

This is a special release so that the End-to-End Encryption features are on the top most release. This makes it easier for those that rely on binaries and the most recent release to always have these features. A big shoutout to @sselph for all the work in implementing a library with PRs:

A sample demo of the feature is here

  • Cross compilation of binaries for releases added with PR #665 which updates issue #662.
    screen shot 2016-06-11 at 1 19 28 am


$ make
CGO_ENABLED=0 GOOS=linux GOARM=5 GOARCH=arm go build -o ./bin/drive_armv5 ./cmd/drive
CGO_ENABLED=0 GOOS=linux GOARM=6 GOARCH=arm go build -o ./bin/drive_armv6 ./cmd/drive
CGO_ENABLED=0 GOOS=linux GOARM=7 GOARCH=arm go build -o ./bin/drive_armv7 ./cmd/drive
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o ./bin/drive_armv8 ./cmd/drive
CGO_ENABLED=0 GOOS=darwin go build -o ./bin/drive_darwin ./cmd/drive
CGO_ENABLED=0 GOOS=linux go build -o ./bin/drive_linux ./cmd/drive
rm -f ./bin/md5Sums.txt
find ./bin -type f -name "drive_*" -exec md5 {} >> ./bin/md5Sums.txt \;
cat ./bin/md5Sums.txt
MD5 (./bin/drive_armv5) = 966d98c643564b8c493d3676fccdfad9
MD5 (./bin/drive_armv6) = 23384c0573c529514dde90f2beb41b4b
MD5 (./bin/drive_armv7) = ed335b1fb75bdb9274e63aaa74b75ec5
MD5 (./bin/drive_armv8) = 36ac305fea084f47bff11afdc46769a5
MD5 (./bin/drive_darwin) = 0e09fff26c1daaf93ca2049610e2e1df
MD5 (./bin/drive_linux) = c71bae6edbfa96dddd5bc853f27bef31
$ go version
go version devel +1f7a0d4 Thu May 19 04:37:45 2016 +0000 darwin/amd64
$ date
Sat 11 Jun 2016 01:19:10 PDT

drive-v0 3 7

Assets 8

@odeke-em odeke-em released this May 18, 2016 · 132 commits to master since this release

This release features the following:

  • Added a retry count flag for pull/push failures.
    This feature was requested by @canpolat in issue #529. It was addressed by PR #634 and updated by PR #635
$ drive pull --retry-count 14 documents/2016/March videos/2013/September
$ drive push --retry-count 4 a/bc/def terms
  • Fixed edit description to have proper error handling. This issue was diagnosed and fixed by @thiell in PR #605 by ensuring any thrown errors are recomposed and combined to be returned later on.
  • Returning error levels/codes to shell on error.
    This issue was requested by @pageauc in issue #479. It was addressed by PR #608.
$ drive pull nonExistant
$ echo $?
$ mkfifo pxm
$ drive push pxm
/pxm (/Users/emmanuelodeke/emm.odeke/pxm) is a named pipe, yet
not reading from it
$ echo $?

Sample status codes taken from the commit that fixed the issue. Please see
screen shot 2016-05-18 at 1 39 32 am

  • Fixed OAuth2.0 Invalid Scope bug. This issue was reported by @Guymer in issue #609. It was fixed by PR #610. This issue was a regression from PR #608.
  • Added a flag to specify an exact destination not in the current working directory. This feature was requested in the form of a question by @kevjonesin in issue #612. It was addressed by PR #616.

For example:

  • To push the content of music/Travi$+Future, integrals/complex/compilations directly to a1/b2/c3:
$ drive push --destination a1/b2/c3 music/Travi$+Future integrals/complex/compilations

where the sources exist on disk.

  • Do not show the progress bar if --quiet is set. This issue was identified by @chevillet in issue #636. It was addressed by PR #642.
  • Bumped up the minimum go version in the README from Go1.3 to Go1.5. This issue was reported by @ManuCart in issue #627. It was addressed by PR #633. This issue manifested because while using below Go1.5 yet pulling the latest from auxilliary dependencies e.g requires net/Context would give an error
go get -u
../.bin/go/src/ req.Cancel undefined (type *http.Request has no field or method Cancel)
  • Fixed up a data race with appending to a shared(highly contentious between multiple goroutines) internal change list tracker. This issue was reported by @sselph in issue #613. It was also addressed by @sselph in PR #639. The diagnosis of this issue was pretty interesting aside from using the race detector because @sselph noticed this problem only manifested that when the requested number of max goroutines running was 1, the problem disappeared, whereas if it were set above that, all hell broke loose. This observation led him to turn on the race detector and alas the problem was identified!
  • Rename now also renames the local file/directory, not just the remote one. This feature was requested by @smblott-github in issue #459. It was fixed by PR #632. Sample usage:
  • To turn off local renaming
$ drive rename --local=false a/b/c/d pam
  • To turn off remote renaming
$ drive rename --remote=false bcd tkf

It should warn you too if you turn off both local and remote renaming

$ drive rename --local=false --remote=false 5 6
no rename mode set, set either `local` or `remote` mode
$ echo $?


$ md5  drive_*
MD5 (drive_armv5-cbd052777d5c4fbfb16500606b6f423b) = cbd052777d5c4fbfb16500606b6f423b
MD5 (drive_armv6-a2f6f9d6c1e511766b898efa15ab69c6) = a2f6f9d6c1e511766b898efa15ab69c6
MD5 (drive_armv7-f21ff1ac5ca5f7c0aba980b2594e4a84) = f21ff1ac5ca5f7c0aba980b2594e4a84
MD5 (drive_darwin-48b0c8a426f4e470d9526dbefba78d0c) = 48b0c8a426f4e470d9526dbefba78d0c
MD5 (drive_linux-6cf9c721576fcb777bfd70da766b3729) = 6cf9c721576fcb777bfd70da766b3729

screen shot 2016-05-18 at 2 37 26 am


This release has been at a better pace than the last 2 or 3. More features added, more lessons learned, more bugs fixed. Let's keep this train steam rolling. This release was actually made in anticaption of an upcoming feature that will provide end to end encryption for files, built by @sselph (peek at it here #645), using drive. I can't wait for this 🔥🔥🔥 in the next release.

Assets 7

@odeke-em odeke-em released this Apr 24, 2016 · 155 commits to master since this release

The latest release features:

  • A command to handle clashes, list and fix them. This was requested in issue #447 and was fixed by PR #532. Now allows for:
Listing clashes
$ drive clashes dup-tests/a/b/c/d/e
These paths clash
X /dup-tests/a/b/c/d/e/f 0By5qQkvRAeV2Wk9FaEN4ZzNock0
X /dup-tests/a/b/c/d/e/f/g 0By5qQkvRAeV2amN5aFgzc1htVXM
X /dup-tests/a/b/c/d/e/f/g 0By5qQkvRAeV2N21ETkVCTHpkcEE
X /dup-tests/a/b/c/d/e/f/g/h/i 0By5qQkvRAeV2TWdVb29DRlVXR1k
X /dup-tests/a/b/c/d/e/f/g/h/i 0By5qQkvRAeV2Vk9lY3Y2SjFDYlE
X /dup-tests/a/b/c/d/e/f 0By5qQkvRAeV2TzE3LXNWVFNoaHM
X /dup-tests/a/b/c/d/e/f 0By5qQkvRAeV2NmEwUmFQOEZ0dE0
X /dup-tests/a/b/c/d/e/f 0By5qQkvRAeV2bm5ZRVpELXRHTWM
Fixing clashes
$ drive clashes --fix [paths...]
$ drive clashes  --fix dup-tests/a/b/c/d/e
Some clashes found, we can fix them by following renames:
/dup-tests/a/b/c/d/e/f 0By5qQkvRAeV2TzE3LXNWVFNoaHM -> f_0
/dup-tests/a/b/c/d/e/f 0By5qQkvRAeV2NmEwUmFQOEZ0dE0 -> f_1
/dup-tests/a/b/c/d/e/f 0By5qQkvRAeV2bm5ZRVpELXRHTWM -> f_2
/dup-tests/a/b/c/d/e/f/g 0By5qQkvRAeV2N21ETkVCTHpkcEE -> g_0
/dup-tests/a/b/c/d/e/f/g/h/i 0By5qQkvRAeV2Vk9lY3Y2SjFDYlE -> i_0
Proceed with the changes [Y/N] ? 
  • Fixed an extra space from drive list output. This bug was reported by @darthcoli in issue #557. It was addressed by PR #578.
  • Typo fix in code by @eduardofv. This was done in PR #545. Thanks for the good eye.
  • A refactor of the code that handles multi job rationing to a common base. This work was done in PR #527.
  • Added a command for getting just fileId as requested in issue #533. This command was motivated by e.g @canpolat's comment in #530 (comment) in which he highlighted some difficulty in getting the fileId of a file while resolving a user's issue. It was fixed by PR #534.
$ drive file-id --depth 2 dup-tests bug-reproductions
FileId                                           Relative Path
"0By5qKlgRJeV2NB1OTlpmSkg8TFU"                   "/dup-tests"
"0Bz5wQlgRJeP2QkRSenBTaUowU3c"                   "/dup-tests/influx_0"
"0Cu5wQlgRJeV2d2VmY29HV217TFE"                   "/dup-tests/a"
"0Cy5wQlgRJeX2WXVFMnQyQ2NDRTQ"                   "/dup-tests/influx"
"0Cy5wQlgRJeP2YGMiOC15OEpUZnM"                   "/bug-reproductions"
"0Cy5wQlgRJeV2MzFtTm50NVV5NW8"                   "/bug-reproductions/drive-406"
"1xmXPziMPEgq2dK-JqaUytKz_By8S_7_RVY79ceRoZwv"   "info-bulletins"
  • Added an include/exclude mechanism in .drive_rc files for ignoring/including files. This feature was requested by @memeplex in issue #535. It was added as a result of the lack of a negative lookahead/double negation/ ignore all but in Go's regex stdlib implemented, at least at "1451307614.785091" and also "1461500703.126929" when this release summary was made.
    The utility for it is say you want to ignore all *_rc files except your drive_rc file, or all your mp4s except for mixtape.mp4, you'll write
# Inside my .drive_rc file

This feature was added in PR #541.

  • Fixed up a regression resulted from PR #528. This issue was reported by @memeplex in comment #535 (comment). It was fixed by PR #537.
  • Issue filing directly from your terminal. This feature was added in PR #542 and allows both piping of text or sending it inline e.g
$ cat bugReport | drive report-issue --title "Crash on pushing"
$ drive report-issue --title "Crash on pushing" --body "Similar to #5 but here always crashes only after a timeout"
  • Fixed a bug with exporting native Google Presentations to ppt and pptx. This bug was reported by @mirohe in issue #551. It was fixed by PR #559 and then updated by PR #588. The bug was that there was a regex ambiguity between ppt and pptx that is
"ppt": "application/",
"pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",

meant that the first match for pptx could either be the mimeType for ppt or the right one, undeterministically worsened by the fact that the regexes are in a map and keys don't have a deterministic sorting.

This release is the sum of sparse work on drive.

This release caught me on the move travelling between countries and places, couple of hours after my birthday and also quite heavy during my day job so I didn't have time to make a detailed summary. I finally got the free time today Sun 24 Apr 2016 05:58:15 PDT to write up a summary of changes.
Aside from that, thank you to all the users and all the contributors. Particularly, I'd like to give a shoutout to @canpolat who has been helping answer questions and matching patches. Enjoy v0.3.5!

Assets 2

@odeke-em odeke-em released this Dec 21, 2015 · 181 commits to master since this release

This release includes a bunch of bug fixes:

  • fixed CSV and TSV mime types: This was a remnant of the mitigation #357 to try to fix issue #232. Since as of "Sun 20 Dec 2015 21:31:08 MST", --convert doesn't work on Google Drive's remote backend(Please see, @canpolat fixed this up with PR #485.
  • fixed up rc-file entries --exclude-ops and --export: They were mistakenly entered as needing string array conversion yet the front end takes them as csv and splits them. This issue was reported in #488 and addressed by PR #489.
  • added unified diff: This feature was requested by @monojp in issue #494. This is useful in cases where you'd like to apply patches to files. It was added in PR #495.
$ drive diff -u [paths...]
  • added diff basing: This feature was requested by @monojp as a followup of issue #494. It was raised in issue #506. It allows you to set which is the base. It was added in, in PR #507.
$ drive diff --base-local=false ls.txt 
$ drive diff --base-local ls.txt
  • allow pulling of exportable documents without a change in checksum, or modified time: This issue was reported by @antton, and advocated by @xezpeleta and @bellera. The problem was that to register a need to download, a checksum difference, modTime difference, size differences have to be reported. However, exportable files such as Google Docs + Sheets cannot be downloaded raw but exported so therefore their checksums are always empty, size always 0 (zero) and in case of no modTime, there was no way to request a download. This was fixed by PR #509.
  • fixed --match-mime for pull: This issue was reported by @xezpeleta in #498. It was the result of a mis-spelling in code. It was fixed by PR #499.
  • fixed a docs and docx ambiguity resulting from a duplicate character in their different regexes: This issue was reported in #500 and addressed by PR #501.
  • fixed up --quiet to log nothing but errors: This was reported by @chevillet in issue #502. Some code hadn't been touched in a while and this had ignored the fact that when --quiet was passed in, stdout would have to not be used. It was addressed by PR #522.
  • fixed up unshare, when no emails were passed in, e.g revoking access to all users: This issue was noticed by @bdlow and then raised in #503. It was addressed by PR #504.
  • fixed up the behavior of pull --starred to differentiate trashed from untrashed: This issue was noticed by @ManuCart in #515. It was fixed by PR #517.
  • fixed up a regression where if nil options where passed in e.g during a drive init, a panic resulted. This issue was noticed by @Eyjafjallajokull in #524, and advocated by @aerth. It was addressed by PR #525.


$ shasum -a 256 drive-arm*
1b7809bc559ce751d81a9325f508fe6392994ae9d6b5cf5fbe5a0af8e83d52e1  drive-armv5
6c5ce70b12422a02f51ce3c859b985722aa1770649adeb9397b4a61de33d24b8  drive-armv6
298c56d7f1a2407b518218dee920b0f4053c575581e4c92bf8b5e9bafe98a4b9  drive-armv7

This release is close to the checkmark of 365 days as drive was handed over to me on "Thursday, 1st January 2015". It feels so nice to have come this far and along the way lots of lessons have been learnt, lots of interactions, lots of learning. Reflecting on this journey, I'd say it has been 200%+ worth it working on drive. Closer to the holidays, cheers to everyone and thank you all!


Assets 5

@odeke-em odeke-em released this Nov 21, 2015 · 196 commits to master since this release

This release contains a bunch of features and bug fixes:

  • pulling starred files: This issue/feature was requested in issue #431 by @ManuCart. The need for pulling starred files was addressed by PRs #476 and #467.
$ drive pull --starred --all
$ drive pull --starred --matches influx png dogm
  • return an error code to the env if the user rejects/cancels an operation: This was reported by @smblott-github in issue #460. It was addressed in PR #466.
$ echo "n" | drive push information && echo "done" || echo "never went through"
never went through
  • fixed up unequal traversal depths for local and remote traversals. This issue was reported by @csaleman in issue #462. What was happening was that because a decremented traversal depth assignment after getting remote children passed to the local traversal meant that local files would not be found. This issue was fixed by PR #465.
  • star + unstar files implemented: This feature was a spin off after the realization from #431 that there wasn't a utility to manage starred files. This feature was added in PR #470.
$ drive star highlights/game10 "Vic Mensa-U-Mad.mp3" Fall2015/ECE_487/assignments
$ drive unstar oldContent influx/p1/p2A
  • no need to retry operations on permanently mutable root file: This bug was noticed by @colinkeenan in issue #472. Previously the retry mechanism for errors was relying on unknown errors' error codes, however any mutation on '/' (root) is forbidden.
    This made the need to actually catch immutable error reports. This was addressed by PR #473.
    Along the way, @colinkeenan figured out how to make proper locales and terminal encoding for Linux and gave me an education, and gave a potential solution to #406 and @colinkeenan then made a wiki entry at
  • ensuring that in trash, users can get a preview of the operations to be performed: This was added in, in #474.
  • learnt that any mod inside a directory modifies its modTime and causes spurious changes with drive. This behaviour was firstly noticed by issue #463 and then made apparent by ensuring that even dirModTimes were reported in #464. This behaviour spread over and was also noticed by @cdown in issue #471. It was then fixed in PR #478.
  • touch can now take --depth and --verbose: This allows better control for touch. It was requested in issue #481 and addressed by PR #482.
$ drive touch --depth 3 Fall2015 Photos/shared
$ drive touch --verbose --depth -1
  • better unshare + share: Previously unsharing only involved --role yet sharing involves roles, emails and accountTypes. This awkwardness was reported by @bdlow in issue #484. Also only one role, and one accountType could be applied during share/unshare. This called for a revisit of share/unshare and was addressed by PR #486
$ drive share --emails, --role reader,commenter --verbose kevin-hart-roasts.mp4 statistics
$ drive unsahre --emails --role commenter --verbose lattices intro/term1/locks

This release has been a great one, lots of interactions with users and lots of bugs fixed, lots of learning and new engagement. drive continues to mature and this is good news for everyone.

Thank you every one for using drive and for all the issues, bug reports, contributions etc.


Assets 2
You can’t perform that action at this time.