Tuesday, 3 September 2013

RSync for Google Drive is here...

I have been working on an implementation of RSync specifically for Google Drive.  I now have it synchronizing between client and server using many of the basic rsync options.  I am limited on the time I have with which to develop it and test it, so am looking to find volunteers willing to use the software and identify issues.  The project is hosted on git hub here:

GSync on Github

Update:  I have published the GSync application to pypi.python.org.

https://pypi.python.org/pypi/gsync/0.1.0

To install using pypi, you just need to execute the following command:

    $ sudo pypi-install gsync

It will autoresolve dependencies and install require packages.  To install the pypi-install utility on debian, execute the following command:

    $ sudo apt-get install python-stdeb

Thanks.

59 comments:

  1. Craig,

    hear you need testers ... i am a bit of a noob, but as fedora user would like to help. hangout me if my services are required.

    +hexi dizmal

    ReplyDelete
  2. Hi,

    You just need to install the GSync app and use to to synchronise documents with your drive account. Everything is local, i.e. your credentials, done through Google API's, so if you want to clear authority from your computer at any time, just remove the ~/.gsync directory. If you don't want to sync things remotely, you can sync between two local directories as well.

    I just need people to use it as they would if using rsync to synchronise their documents. Any bugs found I aim to get fixed ASAP and hopefully get to a BETA release state.

    Thanks
    Craig

    ReplyDelete
  3. I am getting this..

    Traceback (most recent call last):
    File "/bin/gsync", line 131, in
    args = docopt(doc, version = version, options_first = True)
    TypeError: docopt() got an unexpected keyword argument 'options_first'

    On Fedora 19, Thanks

    ReplyDelete
    Replies
    1. I'll log it on github and see if I can see what's causing that. Any idea what version of docopt it is that you have?

      Delete
    2. Hi, I have updated the README with installation instructions. You can now install GSync using pypi-install, which will download and install directly from pypi.python.org and resolve any dependencies.

      Delete
  4. Okay got it to work by updating docopt to the latest version however now I am getting..

    DEBUG: 'Exception': File "/usr/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 360, in walk
    names = self.listdir(top)
    File "/usr/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 569, in listdir
    ent = self.stat(path)
    File "/usr/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 480, in stat
    ents = self._query(parentId = parentId)
    File "/usr/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 722, in _query
    service = self.service()
    File "/usr/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 193, in service
    credentials = self._obtainCredentials()
    File "/usr/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 345, in _obtainCredentials
    credentials = flow.step2_exchange(code)
    File "/usr/lib/python2.7/site-packages/google_api_python_client-1.2-py2.7.egg/oauth2client/util.py", line 132, in positional_wrapper
    return wrapped(*args, **kwargs)
    File "/usr/lib/python2.7/site-packages/google_api_python_client-1.2-py2.7.egg/oauth2client/client.py", line 1283, in step2_exchange
    headers=headers)
    File "/usr/lib/python2.7/site-packages/httplib2-0.8-py2.7.egg/httplib2/__init__.py", line 1570, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
    File "/usr/lib/python2.7/site-packages/httplib2-0.8-py2.7.egg/httplib2/__init__.py", line 1317, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
    File "/usr/lib/python2.7/site-packages/httplib2-0.8-py2.7.egg/httplib2/__init__.py", line 1252, in _conn_request
    conn.connect()
    File "/usr/lib/python2.7/site-packages/httplib2-0.8-py2.7.egg/httplib2/__init__.py", line 1021, in connect
    self.disable_ssl_certificate_validation, self.ca_certs)
    File "/usr/lib/python2.7/site-packages/httplib2-0.8-py2.7.egg/httplib2/__init__.py", line 80, in _ssl_wrap_socket
    cert_reqs=cert_reqs, ca_certs=ca_certs)
    File "/usr/lib64/python2.7/ssl.py", line 387, in wrap_socket
    ciphers=ciphers)
    File "/usr/lib64/python2.7/ssl.py", line 141, in __init__
    ciphers)

    DEBUG: /usr/lib/python2.7/site-packages/libgsync/drive/__init__.py:363:walk(): Exception: [Errno 185090050] _ssl.c:340: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib
    sent 0 bytes received 0 bytes 0.00 bytes/sec
    DEBUG: /usr/bin/gsync:171:(): Crawlers finished, exiting
    close failed in file object destructor:
    sys.excepthook is missing
    lost sys.stderr

    ReplyDelete
  5. hi, how did you update the docopt lib?
    i'm kind of a python noob, so some basic install document would be very helpful. It took me a few minutes to figure out I had to pass the build and install commands to the setup.py ;)
    so now I have the same error as Unknown

    ReplyDelete
  6. apparently, i'm even missing the lib:

    Traceback (most recent call last):
    File "/usr/local/bin/gsync", line 7, in
    from docopt import docopt
    ImportError: No module named docopt

    I thought the setup.py would take care of that..?

    ReplyDelete
    Replies
    1. I have the same prob. Did you figure it out?

      Delete
    2. actually, now that I have python-docopt installed(oops)....

      I get this:
      gsync
      Traceback (most recent call last):
      File "/usr/bin/gsync", line 131, in
      args = docopt(doc, version = version, options_first = True)
      TypeError: docopt() got an unexpected keyword argument 'options_first'

      Delete
  7. After install all libs by hand... a bit of hacking here and there (I was trying it on a QNAP NAS, an ARM apliance...) I got to the point of login in an pasting the key provided, but I get the error
    ./gsync -r ./test drive://test
    Error: String or Integer object expected for key, unicode found

    ReplyDelete
  8. Debug info
    DEBUG: /opt/local/lib/python2.7/site-packages/libgsync/drive/__init__.py:285:_getCredentialStorage(): Loading storage
    DEBUG: /opt/local/lib/python2.7/site-packages/libgsync/drive/__init__.py:195:service(): Authenticating
    DEBUG: /opt/local/lib/python2.7/site-packages/libgsync/drive/__init__.py:205:service(): Loading Google Drive service from config
    DEBUG: /opt/local/lib/python2.7/site-packages/libgsync/drive/__init__.py:216:service(): API has expired
    DEBUG: /opt/local/lib/python2.7/site-packages/libgsync/drive/__init__.py:219:service(): Downloading API service
    DEBUG: TypeError('String or Integer object expected for key, unicode found',): File "/opt/local/lib/python2.7/site-packages/libgsync/crawler.py", line 98, in run
    self._walk(srcpath, self._walkCallback, self._dev)
    File "/opt/local/lib/python2.7/site-packages/libgsync/crawler.py", line 61, in _walk
    self._sync(d)
    File "/opt/local/lib/python2.7/site-packages/libgsync/sync/__init__.py", line 30, in __call__
    changes = self._sync(path)
    File "/opt/local/lib/python2.7/site-packages/libgsync/sync/__init__.py", line 49, in _sync
    dstFile = self.dst.getInfo(relPath)
    File "/opt/local/lib/python2.7/site-packages/libgsync/sync/file/remote/__init__.py", line 58, in getInfo
    info = drive.stat(path)
    File "/opt/local/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 480, in stat
    ents = self._query(parentId = parentId)
    File "/opt/local/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 722, in _query
    service = self.service()
    File "/opt/local/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 231, in service
    api.update(json.loads(apistr))
    File "/opt/lib/python2.7/UserDict.py", line 157, in update
    self[k] = v
    File "/opt/lib/python2.7/shelve.py", line 133, in __setitem__
    self.dict[key] = f.getvalue()
    File "/opt/lib/python2.7/bsddb/__init__.py", line 279, in __setitem__
    _DeadlockWrap(wrapF) # self.db[key] = value
    File "/opt/lib/python2.7/bsddb/dbutils.py", line 68, in DeadlockWrap
    return function(*_args, **_kwargs)
    File "/opt/lib/python2.7/bsddb/__init__.py", line 278, in wrapF
    self.db[key] = value

    Error: String or Integer object expected for key, unicode found
    DEBUG: ./gsync:171:(): Crawlers finished, exiting
    close failed in file object destructor:
    sys.excepthook is missing
    lost sys.stderr

    ReplyDelete
  9. Hi, didn't see these comments on here. Would you mind raising some tickets on github for these issues? I have made changes recently, are you all still suffering from these issues?

    ReplyDelete
  10. I'm opening the issue, I get the error with the latest version (as of 9/19/2013)

    ReplyDelete
  11. Check the README for updated installation instructions using PyPi. I have registered GSync with PyPi now, so it should sort out many of the issues related to incompatible library versions and missing dependencies. Thanks. Remember to raise any issues on git hub!

    ReplyDelete
  12. The packages listed appear to me as Debian-specific...Any idea's on getting this on Fedora?

    ReplyDelete
    Replies
    1. Did you use pypi-install to install it?

      Delete
    2. On fedora, I believe you need to install the python-fedora package:

      yum install python-fedora

      Once installed, you should be able to install using pypi-install or pip command:

      pip install gsync

      Delete
  13. how do you launch the auth process?
    I get this output:

    gsync -r test drive://
    Traceback (most recent call last):
    File "/home/user/.virtualenvs/bin/gsync", line 146, in
    from libgsync.crawler import Crawler
    File "/home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/crawler.py", line 4, in
    from libgsync.sync import Sync
    File "/home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/sync/__init__.py", line 5, in
    from libgsync.drive.mimetypes import MimeTypes
    File "/home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 19, in
    gflags.FLAGS['positional_parameters_enforcement'].value = 'IGNORE'
    File "/home/user/.virtualenvs/lib/python2.7/site-packages/gflags.py", line 1053, in __getitem__
    return self.FlagDict()[name]
    KeyError: 'positional_parameters_enforcement'

    ReplyDelete
    Replies
    1. Someone else reported a similar issue. I'll look into this. Are you compiling from source or installing from pypi.python.org?

      Delete
    2. Installed from pypi-install in debian and installed from pip in archlinux...
      same issue

      Delete
    3. I'll submit a fix to the current 0.1.0 branch and regenerate the package. There must be a module dependency missing or something. We will find out soon enough...

      Delete
    4. I have made a change to the source on github, you can try installing from there. Or you could look at the change I just made and manually modify your installed version?

      See: https://github.com/iwonbigbro/gsync/commit/4652a102e983474b6427547fe7d890d1b41e760e

      Delete
    5. How do you generate auth file .gsync???


      gsync --debug /home/user/test drive://
      DEBUG: /home/user/.virtualenvs/bin/gsync:152:(): {'--8-bit-output': False,

      '--timeout': None,
      '--times': False,
      '--update': False,
      '--verbose': False,
      '--version': False,
      '-F': False,
      '-P': False}
      DEBUG: /home/user/.virtualenvs/bin/gsync:159:(): Creating crawler for: /home/user/test
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py:175:__init__(): Initialising drive
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py:191:__init__(): Initialisation complete
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/crawler.py:85:run(): Source srcpath: /home/user/test
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/crawler.py:86:run(): Source basepath: /home/user
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/crawler.py:87:run(): Source path: test
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/sync/file/factory.py:10:create(): SyncFileFactory.create(/home/user)
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/sync/file/factory.py:25:create(): Creating SyncFileLocal(/home/user)
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/sync/file/factory.py:10:create(): SyncFileFactory.create(drive:///)
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/sync/file/factory.py:17:create(): Creating SyncFileRemote(drive://)
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/crawler.py:95:run(): Enumerating: /home/user/test
      DEBUG: /home/user/.virtualenvs/bin/gsync:171:(): Crawlers finished, exiting
      close failed in file object destructor:
      sys.excepthook is missing
      lost sys.stderr

      Delete
    6. Authentication occurs just once, the first time a connection is established with your drive. To establish a connection, just specify a drive source or destination file like:

      gsync drive://somepath/in/your/drive ~/some/local/path

      It will provide a URL for which you can obtain a GUID from Google that you paste into the command line prompt. Once authenticated, it caches the GUID in your ~/.gsync directory. To force authentication, just remove this directory.

      Delete
    7. There may be a bug in which empty directories are not being transferred. Ensure you have a file present in your source directory to upload.

      Delete
    8. more problems...
      rm -rf .gsync
      gsync -v --debug drive://a3 ./a3
      [...]
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py:469:stat(): Searching for a3 in path drive://
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py:474:stat(): Checking pcache for path: drive://a3
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py:477:stat(): * nothing found
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py:713:_query(): Checking gcache for parentId: root
      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py:283:_getCredentialStorage(): Loading storage
      DEBUG: 'Exception': File "/home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 358, in walk
      names = self.listdir(top)
      File "/home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 567, in listdir
      ent = self.stat(path)
      File "/home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 478, in stat
      ents = self._query(parentId = parentId)
      File "/home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 721, in _query
      service = self.service()
      File "/home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 204, in service
      credentials = self._obtainCredentials()
      File "/home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py", line 322, in _obtainCredentials
      raise EFileNotFound('data/client.json')

      DEBUG: /home/user/.virtualenvs/lib/python2.7/site-packages/libgsync/drive/__init__.py:361:walk(): Exception: File not found: data/client.json
      sent 0 bytes received 0 bytes 0.00 bytes/sec
      DEBUG: /home/user/.virtualenvs/bin/gsync:171:(): Crawlers finished, exiting
      close failed in file object destructor:
      sys.excepthook is missing
      lost sys.stderr

      Delete
    9. Wow, not seen that in a while. There should be a directory in the install path somewhere that contains data/client.json. Try searching for it under /usr/local or /usr/lib. There is a hash of known paths I use, since pypi is not consistent with where it installs these to. I will need to update the map.

      Delete
    10. These are the paths I currently search.

      # Locate the client.json file.
      client_json_locations = [
      '/usr/local/libgsync/data/client.json',
      '/usr/share/libgsync/data/client.json',
      '/usr/local/share/libgsync/data/client.json',
      '/usr/lib/libgsync/data/client.json',
      '/usr/libgsync/data/client.json',
      os.path.join(os.path.dirname(__file__), 'data', 'client.json'),
      ]

      Delete
    11. this credentials doen't belong to me...
      find . | grep client.json
      ./libgsync/data/client.json
      (.virtualenvs)[user@virtualarch .virtualenvs]$ cat ./libgsync/data/client.json
      {
      "installed": {
      "client_id": "542942405111.apps.googleusercontent.com",
      "client_secret": "Y4iSAluo7pCY57m8HFOfv2W_",
      "redirect_uris": [ "http://localhost", "urn:ietf:oauth:2.0:oob" ],
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://accounts.google.com/o/oauth2/token"
      }
      }

      Delete
    12. These aren't credentials, these are the identification tokens for the GSync client, to present to your Google account services. When you authenticate and navigate to the URL, Google ask you if you want to grant permission to the GSync app to access your Google Drive. This only permits the app to access your drive if the app provides the key that Google will return to you once you permit it. It is this key that you paste into GSync. This key is then stored in your ~/.gsync directory. You can change this in your Google account settings at any time. It's a fundamental mechanism for how Google provide authentication. It's the same mechanism used by Android apps on your phone. Each app will have it's own client.json file. The client.json file is generated especially for GSync.

      Delete
    13. The app never authenticate or ask to navigate to the url...
      even when I remove .gsync

      Delete
    14. When authenticating, your should see this message:

      Authorization is required to access your Google Drive.
      Navigate to the following URL:
      Type in the received code:

      It is the unique code you receive that when combined with the client.json secret (which is actually not very secret), create the authentication request for the client to access your drive.

      See: https://developers.google.com/accounts/docs/OAuth2

      Delete
    15. That is odd. The only way for it to not prompt you is if it doesn't get to the client.json step. But you already provided debug that suggested it was looking for the client.json file, so I don't understand. Is it now finding the client.json file or still erroring with the EFIleNotFound exception?

      Delete
    16. These client tokens do have a life span unless it is a refresh token. Refresh tokens allow the client to dynamically generate a new token, for which it will require you to authenticate. I assume this only happens when a refresh token has expired and a new one is required. I don't currently use refresh tokens, and this token doesn't seem to have expired yet, so I am not sure what else could be wrong.

      Delete
    17. I've change path to client.json....
      gsync find it and ask for URL authorize but ... I get this

      http://pastebin.com/RpGhKNUG

      Delete
    18. Ah yes, I was looking at this issue last night. There was an issue I thought I fixed, relating to specifying files as opposed to directories. It thinks that Copy.pdf should be a directory and tries to traverse it, but in reality it should come back as a file and get copied. The only test case I found where this didn't happen was if the remote file didn't exist. I presume the file does exist and therefore this issue hasn't been fixed?

      https://github.com/iwonbigbro/gsync/commit/12b29b177e072fd24e87b23945641e73f2f67978

      Delete
    19. Looking more closely at your debug, it does find Copy.pdf, but it doesn't identify that it is a file and tries to look for more files that have a parent with the ID of that file. I should be able to fix this over the weekend.

      What path did you add to the client.json map in the end? I will also add this change so I you don't get a repeat when you install the new version.

      Delete
    20. not working in upload either...

      http://pastebin.com/ZNx2kWFf

      Delete
    21. the path for client.json depends on my virtualenv for python2.7 in archlinux,

      ~/.virtualenvs/libgsync/data/client.json

      can you send me your email? hate captcha from blogger

      Delete
  14. It would be nice to make it possible to run on Funplud for DLINK NAS devices (backup po Gdrive and docs on DNS NAS)

    http://nas-tweaks.net/371/hdd-installation-of-the-fun_plug-0-7-on-nas-devices/

    ReplyDelete
    Replies
    1. You only need python and prerequisite libraries. It sounds like getting Linux onto the NAS is your first port of call. I had a Buffalo NAS I flashed with Debian once upon a time. Now I have an MK802 with a USB HDD running Debian armhf.

      Delete
  15. Hi Craig!
    I have also found the bug described by Ruben Ochoa.
    Have you looked toward fixing it? I'm very keen on using your helpful tool.

    I do:
    gsync --debug -v /home/entropy/log.log drive://log.log
    My debug is here: http://pastebin.com/20TxSGGN
    Thanks!

    ReplyDelete
    Replies
    1. Hi. I thought I had fixed it. Are you using the latest version from pypi?

      Delete
  16. Hi Craig!
    I'm trying to run the script from OS X 10.6.8. Python and tools were installed via brew, and gsync was installed using pip. I was able to authenticate the first time, but after that I get this each time:

    DEBUG: TypeError('__init__() keywords must be strings',): File "/usr/local/bin/gsync", line 55, in
    crawler = Crawler(p, dest)
    File "/Library/Python/2.6/site-packages/libgsync/crawler.py", line 34, in __init__
    info = self._drive.stat(self._src)
    File "/Library/Python/2.6/site-packages/libgsync/drive/__init__.py", line 525, in stat
    df = DriveFile(path = _Drive.unicode(path), **ent)

    Error: __init__() keywords must be strings

    I ran it like this:
    $ gsync -riv drive://somefolder /path/to/mylocalfolder

    Thanks!

    ReplyDelete
    Replies
    1. What version of python are you using? This is a known python bug with version 2.6. It's fixed in python 2.7

      Delete
    2. Ah, it's 2.6.1! Hopefully, I can update to 2.7 via brew. Thank you!

      Delete
  17. This comment has been removed by the author.

    ReplyDelete
  18. First of all thanks for this tool, make my live more easy.

    I using in my nas (QNAP, with python 2.7) and work right, the only problem is the ~/.gsync, in the nas the space of home folder is very small and cleared in any restart. I solved moving and linking in a script. It's possible to add a option to select a different path to the configuration directory?
    Other enhancement, it's possible to add a log file?

    ReplyDelete
  19. Hi Craig, I am very interested in trying this.I currently back up my whole Fedora 20 box using rsync on a nightly basis. The problem is that this is done to a second drive in the same machine. A good backup if the drive fails, but not so good if there is a fire or theft type problem.

    I was hoping to be able to rsync to Google Drive so your tool might be just what I am looking for. Looking at your README however I don't see all the options listed that I currently use.

    The rsync command I use is:
    rsync -ash --delete --exclude=/lots/of/unnecessary/directories / /the/place/where/my/second/drive/is/mounted --log-file=/the/same/place/rsync_log.log

    I could live without the --log-file, but can you tell me if the other parameters (-ash --delete --exclude) are supported?

    Thanks!

    ReplyDelete
  20. p.s. Forgot to add the "Notify me" flag to the above post so just doing that here...

    ReplyDelete
    Replies
    1. Hi. Not currently, but I will be implementing those as soon as I can find time to. The project had stalled just recently because I'm struggling to find time, but that should change very soon.

      Delete
  21. This comment has been removed by the author.

    ReplyDelete
  22. Right, got gsync on my nas (zyxel nsa325) and authenticated.

    When I enter gsync --debug -v drive://testt /mnt/HD_a2/public/googletest/docs_pics

    I get

    http://pastebin.com/P7feic7A

    Any pointers as to what try next?

    ReplyDelete
  23. Nice work Craig, seems to be working well for me.

    Ubuntu 12.04 on an HP Microserver:

    sudo apt-get python-pip
    sudo pip install gsync

    For me, gsync --authenticate didn't do anything, but just specifying source and destination worked:

    gsync localtest/ drive://remotetest/

    Copy the URL and authorise in your browser, copy the code back to SSH, and it seems to be happily uploading. I've yet to try a proper sync to see how it behaves with existing files.

    ReplyDelete
  24. Ok, there was something wrong in my input. The command does seem to work. One issue is that i have to authenticate each time i reboot the device.

    ReplyDelete
    Replies
    1. ... and only directories are created on drive, no files uploaded. Verbose output does iterate through all the files, but none are uploaded.

      Delete
  25. After some initial success I now have the same issue as Bobby Zw. Running with --debug, relevant output below:

    DEBUG: drive/:445:_findEntity(): Iterating 4 entities to find '_IMG_3847.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_3717.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Zebra Proxima__MG_4718.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Juvenile Swallow-tailed Bee-Eater__MG_2708.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_5462.jpg'
    DEBUG: sync/file/remote/:63:getInfo(): File not found: 'drive://_IMG_3847.jpg'


    DEBUG: drive/:509:stat(): Got 4 entities back
    DEBUG: drive/:445:_findEntity(): Iterating 4 entities to find '_IMG_3847.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_3717.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Zebra Proxima__MG_4718.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Juvenile Swallow-tailed Bee-Eater__MG_2708.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_5462.jpg'
    DEBUG: drive/:665:create(): Creation failed:
    DEBUG: sync/file/remote/:88:_createFile(): Creation failed
    DEBUG: sync/file/remote/:91:_updateFile(): Updating remote file: 'drive://_IMG_3847.jpg'
    DEBUG: sync/file/local/:30:getInfo(): Fetching local file metadata: '_IMG_3847.jpg'

    DEBUG: drive/:509:stat(): Got 4 entities back
    DEBUG: drive/:445:_findEntity(): Iterating 4 entities to find '_IMG_3847.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_3717.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Zebra Proxima__MG_4718.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Juvenile Swallow-tailed Bee-Eater__MG_2708.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_5462.jpg'
    DEBUG: drive/:678:update(): No such file: 'drive://_IMG_3847.jpg'
    DEBUG: sync/file/remote/:116:_updateFile(): Update failed

    DEBUG: drive/:509:stat(): Got 4 entities back
    DEBUG: drive/:445:_findEntity(): Iterating 4 entities to find '_IMG_3847.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_3717.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Zebra Proxima__MG_4718.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Juvenile Swallow-tailed Bee-Eater__MG_2708.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_5462.jpg'
    DEBUG: sync/file/remote/:63:getInfo(): File not found: 'drive://_IMG_3847.jpg'

    ReplyDelete
  26. Also:

    DEBUG: drive/:445:_findEntity(): Iterating 4 entities to find '_IMG_3847.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_3717.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Zebra Proxima__MG_4718.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'Juvenile Swallow-tailed Bee-Eater__MG_2708.jpg'
    DEBUG: drive/:450:_findEntity(): comparing u'_IMG_3847.jpg' to u'_IMG_5462.jpg'
    DEBUG: drive/:665:create(): Creation failed:
    DEBUG: sync/file/remote/:88:_createFile(): Creation failed

    ReplyDelete