abraunegg / onedrive Goto Github PK
View Code? Open in Web Editor NEWOneDrive Client for Linux
Home Page: https://abraunegg.github.io
License: GNU General Public License v3.0
OneDrive Client for Linux
Home Page: https://abraunegg.github.io
License: GNU General Public License v3.0
I've successfully installed and run the onedrive
on linux.
Default ~\OneDrive
folder is syncronizing well.
But I can't set the sync dir to my preferred folder (~\library
).
Editig the file ~\onedrive\config
have no effect
Runnig onedrive -confdir "~\onedrive"
doesn't create the new config file.
Question:
How to set the sync dir to ~\library
?
I have an existing file called "HelloCOM2.rar", after moving toward this new branch the program complaining about invalid name problem.
After checking the code, I found it is rejected by COM[0-9] rule.
But I think the original rule is an exact match of COM[0-9].
( https://support.microsoft.com/en-us/help/3125202/restrictions-and-limitations-when-you-sync-files-and-folders )
So HelloCOM2.rar should be valid.
Once I update the local file and call onedrive --synchronize --local-first
, another file is created on the remote OneDrive with the host name of my PC.
Local file: L01.csv
Remote files: L01.csv
& L01-ip-172-31-41-236.csv
ip-172-31-41-236
is the hostname of my AWS EC2 instanceL01.csv
(remote) is not updated but contains the original contents when it was created.ip-172-31-41-236.csv
is updated whenever I execute the command above.Which command should I execute to update the remote file only?
(Only the local file is modified and I jsut need to get the remote file updated too)
Cheers.
Make install
target fails (make PREFIX=/usr DESTDIR=/var/www/build/onedrive-git/pkg/onedrive-git -C onedrive install
)
make: Entering directory '/var/www/build/onedrive-git/src/onedrive'
mkdir -p /var/www/build/onedrive-git/pkg/onedrive-git/var/log/onedrive
chown root.users /var/www/build/onedrive-git/pkg/onedrive-git/var/log/onedrive
chmod 0775 /var/www/build/onedrive-git/pkg/onedrive-git/var/log/onedrive
install -D onedrive /var/www/build/onedrive-git/pkg/onedrive-git/usr/bin/onedrive
install -D -m 644 logrotate/onedrive.logrotate /var/www/build/onedrive-git/pkg/onedrive-git/etc/logrotate.d/onedrive
cp -af *.service /var/www/build/onedrive-git/pkg/onedrive-git/usr/lib/systemd/user/
cp: target '/var/www/build/onedrive-git/pkg/onedrive-git/usr/lib/systemd/user/' is not a directory
make: *** [Makefile:30: install] Error 1
make: Leaving directory '/var/www/build/onedrive-git/src/onedrive'
I think there is missing a line in Makefile to create the target directory before the attempt to copy files mkdir -p $(DESTDIR)/usr/lib/systemd/user/
.
Is there a way to set the file owner (or group) of files downloaded via onedrive? At present, since onedrive is running as root, the files are downloaded with owner and group set to root. Can I change this?
Hi. When I try to authorize my account using the link given by client, response link turns out like this:
https://login.microsoftonline.com/common/oauth2/nativeclient?error=invalid_client&error_description=AADSTS65005%3a+Using+application+%27OneDrive+Free+Client%27+is+currently+not+supported+for+your+organization+ee.bilkent.edu.tr+because+it+is+in+an+unmanaged+state.+An+administrator+needs+to+claim+ownership+of+the+company+by+DNS+validation+of+ee.bilkent.edu.tr+before+the+application+OneDrive+Free+Client+can+be+provisioned.+Request+ID%3a+2eb630bd-a2b0-4e8a-9bcd-059209e32ab1%2c+Timestamp%3a+06%2f12%2f2018+21%3a12%3a27%0d%0aTrace+ID%3a+5f2cf98a-1df6-460f-97ce-c50398de2d00%0d%0aCorrelation+ID%3a+a99ac265-08e2-47fe-b171-80a332351c92%0d%0aTimestamp%3a+2018-06-12+21%3a12%3a27Z
I understand it has to do with the domain I use (which is my universities domain btw.). Yet, is there a workaround to this problem?
Describe the bug
A clear and concise description of what the bug is.
Application and Operating System Details:
uname -a
onedrive --version
To Reproduce
Steps to reproduce the behavior if not causing an application crash:
If issue is replicated by a specific 'file' or 'path' please archive the file and path tree & email to [email protected]
Complete Verbose Log Output
A clear and full log of the problem. Please use 3 ` characters to format log output to make it easier to read. See https://guides.github.com/features/mastering-markdown/ for more details.
Screenshots
If applicable, add screenshots to help explain your problem.
Additional context
Add any other context about the problem here.
The logic of --upload-only
and --local-first
is inconsistent when syncing the entire sync_dir
path vs using the --single-directory
switch
Currently, this application is logging to /var/log/onedrive/<filename for log>
and is not rotating the log or truncating it. It would be nice to rotate the log at regular intervals and delete older logs or truncate old log entries. I don't know what is a good interval, but my current log file is ~8.9M after about 7 weeks of 10-minute interval --synchronize
runs.
A "database is locked" issue keeps happening to me, which suggests that there is an external soft trying to access my database. Though no obvious browser has OneDrive online open. Even if it did, this behavior would deserve a fix as well. Could be an app on a smartphone syncing in the background, maybe.
Here is my log for the command onedrive -m --debug-https --verbose
, from the point when I add a new directory to the ~/onedrive directory (see this text file, the log is too long).
Hello. Thanks for wonderful software. However, I cannot let onedrive --monitor
run in background because it makes one CPU core 100% busy even when onedrive is idle. It is expected?
Vesrion: git master d6b4930
I'm still having issues. Sorry. Just re-installed from latest commit.
That has usually solved most things in the past! Not this time.
Here's what the log says. I'm afraid that this is no really meaning much to me.
Any chance of some help solving it?
Thanks, Jamie
Jul 13 11:44:49 jamie-samsung systemd[2570]: Stopped OneDrive Free Client.
Jul 13 11:44:49 jamie-samsung systemd[2570]: Started OneDrive Free Client.
Jul 13 11:44:49 jamie-samsung onedrive[13249]: Initializing the Synchronization Engine ...
Jul 13 11:44:51 jamie-samsung onedrive[13249]: std.net.curl.CurlException@std/net/curl.d(4332): SSL connect error on handle 12D7120
Jul 13 11:44:51 jamie-samsung onedrive[13249]: ----------------
Jul 13 11:44:51 jamie-samsung onedrive[13249]: ??:? pure @safe void std.exception.bailOut!(std.net.curl.CurlException).bailOut(immutable(char)[], ulong, const(char[])) [0x62a40a]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: ??:? pure @safe bool std.exception.enforce!(std.net.curl.CurlException).enforce!(bool).enforce(bool, lazy const(char)[], immutable(char)[], ulong) [0x62a37d]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: ??:? void std.net.curl.Curl._check(int) [0x5fcccc]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: ??:? int std.net.curl.Curl.perform(std.typecons.Flag!("throwOnError").Flag) [0x5fd100]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: ??:? int std.net.curl.HTTP.perform(std.typecons.Flag!("throwOnError").Flag) [0x5fa254]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: src/onedrive.d:427 std.json.JSONValue onedrive.OneDriveApi.perform() [0x5a499f]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: src/onedrive.d:312 std.json.JSONValue onedrive.OneDriveApi.get(const(char)[], bool) [0x5a4256]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: src/onedrive.d:254 std.json.JSONValue onedrive.OneDriveApi.requestUploadStatus(const(char)[]) [0x5a3dd4]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: src/upload.d:67 bool upload.UploadSession.restore() [0x5b4247]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: src/sync.d:176 void sync.SyncEngine.init() [0x5ade4b]
Jul 13 11:44:51 jamie-samsung onedrive[13249]: src/main.d:195 _Dmain [0x594c77]
Jul 13 11:44:51 jamie-samsung systemd[2570]: onedrive.service: Main process exited, code=exited, status=1/FAILURE
Jul 13 11:44:51 jamie-samsung systemd[2570]: onedrive.service: Unit entered failed state.
Jul 13 11:44:51 jamie-samsung systemd[2570]: onedrive.service: Failed with result 'exit-code'.
Jul 13 11:44:55 jamie-samsung systemd[2570]: onedrive.service: Service hold-off time over, scheduling restart.
I don't know for sure if this is a real thing or not but the download speed (in Linux) is significantly slower than when I use the Microsoft default app on Window (maybe 1/5 ~ 1/10).
And then I came across this article: https://www.theregister.co.uk/2017/03/23/microsoft_onedrive_linux_slow/
It suggested that microsoft is lazy in doing user agent checking and serve the worst code version to us.
Could you please check this issue (by trying to supply something like 'firefox mozilla 58/ windows 7' in user-agent string in the HTTP request and see if there is any difference?
This is purely my suggestion in case you guys are not aware of this. Sorry if this is not the case.
Best regards,
So now our team is using Teams, which in turn uses files form Sharepoint, where you can ask to share files and this would open the OneDrive Windows or Mac client. I'm wondering if/how similar funcionality could be obtained, e.g. by creating (locally) a new subdirectory with that share?
Hi. Thanks for your work. I run into an issue with a business account with Ubuntu 16.04:
$ onedrive --version
onedrive v1.1.2-3-gfa5de04
$ onedrive --synchronize --verbose
Uploading file ./MVI_0210.MOV ...
Uploading fragment: 0-10485760/287409828
Uploading fragment: 10485760-20971520/287409828
Uploading fragment: 20971520-31457280/287409828
Uploading fragment: 31457280-41943040/287409828
Uploading fragment: 41943040-52428800/287409828
Uploading fragment: 52428800-62914560/287409828
Uploading fragment: 62914560-73400320/287409828
Uploading fragment: 73400320-83886080/287409828
Uploading fragment: 83886080-94371840/287409828
Uploading fragment: 94371840-104857600/287409828
Uploading fragment: 104857600-115343360/287409828
Uploading fragment: 115343360-125829120/287409828
Uploading fragment: 125829120-136314880/287409828
Uploading fragment: 136314880-146800640/287409828
Uploading fragment: 146800640-157286400/287409828
Uploading fragment: 157286400-167772160/287409828
Uploading fragment: 167772160-178257920/287409828
Uploading fragment: 178257920-188743680/287409828
Uploading fragment: 188743680-199229440/287409828
Uploading fragment: 199229440-209715200/287409828
Uploading fragment: 209715200-220200960/287409828
Timeout was reached on handle 27F78C0
Applying changes of Path ID: XXX
sqlite.SqliteException@src/sqlite.d(147): database is locked
----------------
src/sqlite.d:22 void sqlite.Statement.Result.step() [0x5a9d05]
src/sqlite.d:117 ref sqlite.Statement.Result sqlite.Statement.Result.__ctor(etc.c.sqlite3.sqlite3_stmt*) [0x5a9bcf]
src/sqlite.d:173 sqlite.Statement.Result sqlite.Statement.exec() [0x5a9ea1]
src/itemdb.d:116 void itemdb.ItemDatabase.upsert(ref const(itemdb.Item)) [0x58df71]
src/sync.d:430 void sync.SyncEngine.applyDifference(std.json.JSONValue, immutable(char)[], bool) [0x5abd03]
src/sync.d:375 void sync.SyncEngine.applyDifferences(immutable(char)[], const(char)[]) [0x5ab88a]
src/sync.d:183 void sync.SyncEngine.applyDifferences() [0x5aad09]
src/main.d:338 void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool) [0x593962]
src/main.d:231 _Dmain [0x59334b]
If I retry:
$ onedrive --synchronize --verbose
Loading config ...
Using Config Dir: /home/XXX/.config/onedrive
Initializing the OneDrive API ...
Opening the item database ...
All operations will be performed in: /onedrive/
Initializing the Synchronization Engine ...
Account Type: business
Default Drive ID: XXX
Default Root ID: XXX
Remaining Free Space: 5478756531539
Fetching details for OneDrive Root
OneDrive Root exists in the database
Trying to restore the upload session ...
Continuing the upload session ...
Uploading fragment: 10485760-20971520/111210992
OneDrive returned a 'HTTP 5xx Server Side Error' - gracefully handling error
std.json.JSONException@std/json.d(494): Key not found: expirationDateTime
Any ideas, what could be the problem?
Thanks
Hi,
Can you please tell me if you support "Admin Consent" as described:
https://docs.microsoft.com/en-au/azure/active-directory/develop/active-directory-devhowto-multi-tenant-overview#understanding-user-and-admin-consent
The reason that I need this is that I have thousands of accounts under our OneDrive for business, so the administrator will give admin consent to a set of users
jigao@jigao-CW35S:~/onedrive$ curl -fsS https://dlang.org/install.sh | bash -s dmd
dmd-2.080.1 already installed
Using dub 1.9.0 shipped with dmd-2.080.1
Run `source ~/dlang/dmd-2.080.1/activate` in your shell to use dmd-2.080.1.
This will setup PATH, LIBRARY_PATH, LD_LIBRARY_PATH, DMD, DC, and PS1.
Run `deactivate` later on to restore your environment.
jigao@jigao-CW35S:~/onedrive$ make
dmd -g -ofonedrive -O -L-lcurl -L-lsqlite3 -L-ldl -J. src/config.d src/itemdb.d src/log.d src/main.d src/monitor.d src/onedrive.d src/qxor.d src/selective.d src/sqlite.d src/sync.d src/upload.d src/util.d
make: dmd: Command not found
Makefile:34: recipe for target 'onedrive' failed
make: *** [onedrive] Error 127
Do i forget some dependencies?
Why has the latest version got rid of the systemd user service in /usr/lib/systemd/user/
and replaced it with an [email protected]
? The previous system seemed logical, worked well and is the way user daemons are meant to work with systemd. You could run the command: systemctl --user start onedrive
as an unprivileged user.
Hi,
I have been using skilion / your onedrive tool for a long time with no issues, but i have checked my recent logs to see that it has not been working correctly.
I have cloned the latest version today, logged out and back in but the issue persists. Have not performed a resync as it is approx 400GB.. It takes a long time on my NAS.
I run using the command: /root/onedrive/onedrive --synchronize --download --confdir /root/.config/onedrive
If you need me to provide anything else please let me know.
Thanks,
The Verbose version:
Loading config ...
Using Config Dir: /root/.config/onedrive
Initializing the OneDrive API ...
Opening the item database ...
All operations will be performed in: /nas_share/Personal/_OneDrive
Initializing the Synchronization Engine ...
Account Type: personal
Default Drive ID: 34188beec92dc33c
Default Root ID: 34188BEEC92DC33C!111
Remaining Free Space: 949235315673
Fetching details for OneDrive Root
OneDrive Root does not exist in the database. We need to add it.
Added OneDrive Root to the local database
Applying changes of Path ID: 34188BEEC92DC33C!111
Key not found: fileSystemInfo
Applying changes of Path ID: 34188BEEC92DC33C!111
Key not found: fileSystemInfo
Applying changes of Path ID: 34188BEEC92DC33C!111
std.json.JSONException@std/json.d(494): Key not found: fileSystemInfo
----------------
??:? pure @safe void std.exception.bailOut!(std.json.JSONException).bailOut(immutable(char)[], ulong, const(char[])) [0x5fcf31]
??:? pure @safe inout(std.json.JSONValue)* std.exception.enforce!(std.json.JSONException, inout(std.json.JSONValue)*).enforce(inout(std.json.JSONValue)*, lazy const(char)[], immutable(char)[], ulong) [0x5fcf96]
??:? inout pure ref @safe inout(std.json.JSONValue) std.json.JSONValue.opIndex(immutable(char)[]) [0x5b17dd]
src/sync.d:48 itemdb.Item sync.makeItem(ref const(std.json.JSONValue)) [0x5822da]
src/sync.d:425 void sync.SyncEngine.applyDifference(std.json.JSONValue, immutable(char)[], bool) [0x583cfa]
src/sync.d:375 void sync.SyncEngine.applyDifferences(immutable(char)[], const(char)[]) [0x5838f5]
src/sync.d:182 void sync.SyncEngine.applyDifferences() [0x582d65]
src/main.d:338 void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool) [0x56e537]
src/main.d:231 _Dmain [0x56df88]
I couldn't find somewhere else to thank you for forking the code.
Your version contains many improvements (as far as I can see).
THANKS!!!
My usecase involves launching multiple versions of onedrive with separate settings in different dirs. Log files are completely useless for me as I constantly monitor sync processes in tmux session. It would be cool if onedrive had an option to run the process strictly in the foreground (something like apache/nginx have).
I understand that my usage pattern is quite rare, but I believe that systemd/journald will benefit from the option as well.
Thank you for resurrecting the project! Keep it up!
Firstly I really thank you for the work that you've done for this repo!
Secondly I'm facing an issue that maybe looks like another issue but as I'm not sure of this, I've created a new one.
I type onedrive --synchronize --upload-only --verbose
to upload my folder on OneDrive. Some files are uploaded fine but it bugs in a file (or folder). And if I remove this folder, it bugs in another one...
I encounter the same issue if I try onedrive --synchronize --verbose
.
See below the logs:
Uploading new items of .
OneDrive Client requested to create remote path: ./EPL-Drive/BACHELIER/Tronc commun/Q4/LFSAB1803 - Économie de l'entreprise/Examens/2016_Juin
The requested directory to create was found on OneDrive - skipping creating the directory: ./EPL-Drive/BACHELIER/Tronc commun/Q4/LFSAB1803 - Économie de l'entreprise/Examens/2016_Juin
The parent for this path is in the local database - adding requested path (./EPL-Drive/BACHELIER/Tronc commun/Q4/LFSAB1803 - Économie de l'entreprise/Examens/2016_Juin) to database
object.Exception@src/sync.d(1046): The parent item is not in the local database
----------------
??:? pure @safe void std.exception.bailOut!(Exception).bailOut(immutable(char)[], ulong, const(char[])) [0x8f48e612]
??:? pure @safe bool std.exception.enforce!().enforce!(bool).enforce(bool, lazy const(char)[], immutable(char)[], ulong) [0x8f51fe1d]
??:? void sync.SyncEngine.uploadNewFile(immutable(char)[]) [0x8f4fb549]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0x8f4facd8]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0x8f4fabcf]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0x8f4fabcf]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0x8f4fabcf]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0x8f4fabcf]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0x8f4fabcf]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0x8f4fabcf]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0x8f4fabcf]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0x8f4fabcf]
??:? void sync.SyncEngine.scanForDifferences(immutable(char)[]) [0x8f4f9bbd]
??:? void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool) [0x8f4df5d7]
??:? _Dmain [0x8f4def6b]
If you need more info, you can tell me.
If a file is locked (for example someone is editing on a Word client), and you open it and save locally, then onedrive client correctly reports locked status but eventually crashes with the error below.
What seems to happen is that until the file is open (e.g. in Libreoffice), then saved you simply get the first message (without the exception) about status code 423, then as soon as the application is closed the crash happens
Uploading file Sync test.docx ...onedrive.OneDriveException@src/onedrive.d(543): HTTP request returned status code 423 (Locked)
{
"error": {
"code": "accessDenied",
"innerError": {
"date": "2018-06-27T10:29:55",
"request-id": "de7c1d3c-d9a0-41a4-b514-a67784d0eb01"
},
"message": "The file is currently checked out or locked for editing by another user."
}
}
----------------
??:? void onedrive.OneDriveApi.checkHttpCode(ref const(std.json.JSONValue)) [0xb34e50e4]
??:? std.json.JSONValue onedrive.OneDriveApi.upload(immutable(char)[], immutable(char)[]) [0xb34e49a1]
??:? std.json.JSONValue onedrive.OneDriveApi.simpleUploadReplace(immutable(char)[], immutable(char)[], immutable(char)[], const(char)[]) [0xb34e36bb]
??:? void sync.SyncEngine.uploadFileDifferences(itemdb.Item, immutable(char)[]) [0xb34f080e]
??:? void sync.SyncEngine.uploadDifferences(itemdb.Item) [0xb34f0190]
??:? void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0xb34f034d]
??:? void sync.SyncEngine.uploadDifferences(itemdb.Item) [0xb34f015d]
??:? void sync.SyncEngine.scanForDifferences(immutable(char)[]) [0xb34effd5]
??:? void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool) [0xb34d6527]
??:? _Dmain [0xb34d603b]
Can you add checkInterval property to config file or command line arg?
Now it's hardcoded in main.d:
immutable auto checkInterval = dur!"seconds"(45);
DMD 2.081.0 generates the following compilation issue:
dmd -g -ofonedrive -O -L-lcurl -L-lsqlite3 -L-ldl -J. src/config.d src/itemdb.d src/log.d src/main.d src/monitor.d src/onedrive.d src/qxor.d src/selective.d src/sqlite.d src/sync.d src/upload.d src/util.d
src/sqlite.d(71): Error: module `stdlib` is in file 'std/c/stdlib.d' which cannot be read
import path[0] = /root/dlang/dmd-2.081.0/linux/bin64/../../src/phobos
import path[1] = /root/dlang/dmd-2.081.0/linux/bin64/../../src/druntime/import
Need to investigate if this is a regression in 'onedrive' or a regression in dmd itself
I can't use "onedrive --upload-only" in command-line, showing error =
--synchronize or --monitor missing from your command options or use --help for further assistance
No OneDrive sync will be performed without either of these two arguments being present
Then i use "onedrive -m --upload-only"
When "1.zip" was uploaded on my OneDrive account, then i delete "1.zip" in local (~/OneDrive)
But at once uploading "2.zip", even "1.zip" has gone on my OneDrive account.
I think causes i use "-m" option but i can't be performed without "-m" option
How can i use Upload-Only Option without sync remote from local ?
Hi, I was directed by you to this github repository from skillion's repository. I am trying to install your software on ubuntu 18.04. I installed all the dependent programs and downloaded the files using git but when i cd into the directory and use make i encounter the bellow response:
~/onedrive$ make
echo v1.1.2-15-g54fcb63 >version
dmd -g -ofonedrive -O -L-lcurl -L-lsqlite3 -L-ldl -J. src/config.d src/itemdb.d src/log.d src/main.d src/monitor.d src/onedrive.d src/qxor.d src/selective.d src/sqlite.d src/sync.d src/upload.d src/util.d
make: dmd: Command not found
Makefile:34: recipe for target 'onedrive' failed
make: *** [onedrive] Error 127
Do you have any advice to offer for resolving this error?
Hello, while trying to debug issue #35 I've found that uploading fails for empty files with the following error:
Uploading file <empty_file> ...
Uploading fragment: 0-0/0
OneDrive returned a 'HTTP 400 - Bad Request' - gracefully handling error
done.
std.json.JSONException@std/json.d(494): Key not found: size
----------------
??:? pure @safe void std.exception.bailOut!(std.json.JSONException).bailOut(immutable(char)[], ulong, const(char[])) [0xdeb23637]
??:? pure @safe inout(std.json.JSONValue)* std.exception.enforce!(std.json.JSONException).enforce!(inout(std.json.JSONValue)*).enforce(inout(std.json.JSONValue)*, lazy const(char)[], immutable(char)[], ulong) [0xdebc7c66]
??:? inout pure ref @safe inout(std.json.JSONValue) std.json.JSONValue.opIndex(immutable(char)[]) [0xdeb78275]
??:? void sync.SyncEngine.uploadNewFile(immutable(char)[]) [0xdeb4a73e]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xdeb49abb]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xdeb499b2]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xdeb499b2]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xdeb499b2]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xdeb499b2]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xdeb499b2]
??:? void sync.SyncEngine.scanForDifferences(immutable(char)[]) [0xdeb48b81]
??:? void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool) [0xdeb2f5a7]
??:? _Dmain [0xdeb2ef47]
I was able to install the dependencies and run the make and make install commands for this, but when I tried running 'onedrive' for the first time, the error was 'Segmentation fault (core dumped)'. What should I check first? Thanks in advance.
When I rename or move a file locally, and then onedrive --synchronize
, it interprets my action as if I've deleted the old folder and then adding all the files in the new folder. That takes a really long time if this folder is quite big.
For example, I've renamed locally CM
in CM_bis
:
Initializing the Synchronization Engine ...
Deleting item from OneDrive: EPL-Drive/DIVERS/Anciens cours/LFSAB1801 - Histec/CM
Uploading file ./EPL-Drive/DIVERS/Anciens cours/LFSAB1801 - Histec/CM_bis/notes_cours_1-6-9-11_2013.pdf ...
done.
Uploading file ./EPL-Drive/DIVERS/Anciens cours/LFSAB1801 - Histec/CM_bis/AristotlesWheel.gif ...
done.
But if I do the same process on Onedrive, the program synchronizes really fast by just renaming the folder.
For example, I've rename on OnedriveCM_bis
in CM
:
Initializing the Synchronization Engine ...
Moving EPL-Drive/DIVERS/Anciens cours/LFSAB1801 - Histec/CM_bis to EPL-Drive/DIVERS/Anciens cours/LFSAB1801 - Histec/CM
Is it possible to faster synchronize if I rename or move a folder locally, like the same fast process on Onedrive?
Thanks in advance !
When looking at the solution for #2, it has been identified that the function which generates the quickXorHash hash for comparison with what is returned by OneDrive, generates a different value to what is expected when the file size is > 64Kb.
When the file is under 64Kb, the quickXorHash that is generated matches what is returned from OneDrive.
Simply 'touching' a local file > 64Kb will trigger this hash difference:
The file last modified time has changed
file mtime = 2018-Jun-16 00:52:06Z
item mtime = 2018-Jun-16 00:51:30Z
item hash = tJIwyksN/FCJfJML1uY05oBbHXY=
file hash = tJIwyksN/FBrg2z0KRnL+6hbHXY=
The file content has changed
Uploading file hcw85prop.ax ... done.
In reality if a local file has been modified, the content 'may' have changed, thus the modified file will be uploaded as expected, however when simply 'touching' the file this should not occur (upload modified file due to contents changing - when it hasnt).
Seeking some assistance to look at qxor.d to work out where things are potentially going wrong as it is not immediately obvious.
OneDrive API developer documentation around quickXorHash is here:
https://docs.microsoft.com/en-us/onedrive/developer/code-snippets/quickxorhash
hello
thank you a lot that you are take care :)
i have:
15:50:11 mturek@5C-51-4F-7E-AF-31:~# onedrive --version
onedrive v1.1.2-30-g4e93cfa
i got this kind of error (for reproduce error, go offline, rename not empty folder and go online with your app)
Deleting item from OneDrive: products/nfv/sb
onedrive.OneDriveException@src/onedrive.d(544): HTTP request returned status code 403 (Forbidden)
{
"error": {
"code": "accessDenied",
"innerError": {
"date": "2018-07-05T05:13:31",
"request-id": "0b8f9af9-ab6c-4d88-9292-267fba7d6de2"
},
"message": "Request was cancelled by event received. If attempting to delete a non-empty folder, it's possible that it's on hold"
}
}
src/onedrive.d:33 void onedrive.OneDriveApi.checkHttpCode(ref const(std.json.JSONValue)) [0x5a17dc]
src/onedrive.d:327 void onedrive.OneDriveApi.del(const(char)[]) [0x5a0da3]
src/onedrive.d:167 void onedrive.OneDriveApi.deleteById(const(char)[], const(char)[], const(char)[]) [0x59ff3a]
src/sync.d:1212 void sync.SyncEngine.uploadDeleteItem(itemdb.Item, immutable(char)[]) [0x5aee1f]
src/sync.d:783 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5aca8c]
src/sync.d:755 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ac849]
src/sync.d:778 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5aca39]
src/sync.d:755 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ac849]
src/sync.d:778 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5aca39]
src/sync.d:755 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ac849]
src/sync.d:778 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5aca39]
src/sync.d:755 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ac849]
src/sync.d:718 void sync.SyncEngine.scanForDifferences(immutable(char)[]) [0x5ac679]
src/main.d:353 void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool) [0x592023]
src/main.d:294 _Dmain [0x591b36]
Hi,
The app works well.
However, I have a small issue. The Shared OneNote directories at the OneNote side returns some strange warnings, e.g.,
"This item type (OneNote Folder Name) is not supported" - since it is shared with others, but has nothing to do with the Ubunto folder being synced. It gives this for every OneNote folder.
Is this a bug and it is ok to just ignore the warning?
Thanks
Hi,
In sync.d the maxPathLenght is set to 256 for onedrive business. However, this was increased about a year ago to 400 charactres.
Please see the news below
https://techcommunity.microsoft.com/t5/SharePoint-Blog/New-support-for-and-in-SharePoint-Online-and-OneDrive-for/ba-p/60357
Can you change the limit please?
Thanks
Abász
I would like a feature that detects whether the local sync-root is missing (i.e. not mounted or wrongly configured) before going ahead with synch.
I have my onedrive root directory on an external drive. Sometimes I forget to mount my external drive and start onedrive by mistake. From what I have seen, onedrive will then detect that all files in the root directory are missing and will remove them from the online storage.
If I had removed everything from my storage, excluding the onedrive root dir I agree that this would be the correct way to act. However, because in my case the folder that act as the root is also missing I think it would be better to assume that something is horribly wrong and warn the user.
I've created a pull request (#51) and as an afterthought thought I'd better create a corresponding issue.
I also thought after I'd done the pull request I should have put it in a new branch rather than master - if you want me to do that let me know.
Details are on the PR description
After OneDrive user password is changed, onedrive crashes with the following:
onedrive.OneDriveException@src/onedrive.d(544): HTTP request returned status code 400 (Bad Request)
{
"correlation_id": "d09b98d5-d072-48f4-94cb-7be8df59cdee",
"error": "invalid_grant",
"error_codes": [
50173
],
"error_description": "AADSTS50173: The provided grant has expired due to it being revoked. The user might have changed or reset their password. The grant was issued on '2018-07-04T10:28:18.3020190Z' and the TokensValidFrom date for this user is '2018-07-15T00:49:41.0000000Z'\r\nTrace ID: bc332c13-489d-46ec-8b49-96606a8a1900\r\nCorrelation ID: d09b98d5-d072-48f4-94cb-7be8df59cdee\r\nTimestamp: 2018-07-15 00:50:12Z",
"timestamp": "2018-07-15 00:50:12Z",
"trace_id": "bc332c13-489d-46ec-8b49-96606a8a1900"
}
Refresh token invalid, use --logout to authorize the client again
----------------
src/onedrive.d:33 void onedrive.OneDriveApi.checkHttpCode(ref const(std.json.JSONValue)) [0x5a5390]
src/onedrive.d:363 std.json.JSONValue onedrive.OneDriveApi.post!(char).post(const(char)[], const(char)[]) [0x5a5516]
src/onedrive.d:279 void onedrive.OneDriveApi.acquireToken(const(char)[]) [0x5a45e2]
src/onedrive.d:274 void onedrive.OneDriveApi.newToken() [0x5a4597]
src/onedrive.d:291 void onedrive.OneDriveApi.checkAccessTokenExpired() [0x5a4745]
src/onedrive.d:95 std.json.JSONValue onedrive.OneDriveApi.getDefaultDrive() [0x5a33f8]
src/sync.d:160 void sync.SyncEngine.init() [0x5ae2b9]
src/main.d:195 _Dmain [0x59520f]
Handle this more gracefully without the application crashing
While syncing a directory, I get the following error.
Any idea what could be wrong?
Uploading file ******* ...onedrive.OneDriveException@src/onedrive.d(543): HTTP request returned status code 412 (Precondition Failed)
{
"error": {
"code": "notAllowed",
"innerError": {
"date": "2018-06-16T07:39:24",
"request-id": "*******"
},
"message": "ETag does not match current item's value"
}
}
----------------
src/onedrive.d:33 void onedrive.OneDriveApi.checkHttpCode(ref const(std.json.JSONValue)) [0x5a27c4]
src/onedrive.d:392 std.json.JSONValue onedrive.OneDriveApi.upload(immutable(char)[], immutable(char)[]) [0x5a2081]
src/onedrive.d:147 std.json.JSONValue onedrive.OneDriveApi.simpleUploadReplace(immutable(char)[], immutable(char)[], immutable(char)[], const(char)[]) [0x5a0de3]
src/sync.d:782 void sync.SyncEngine.uploadFileDifferences(itemdb.Item, immutable(char)[]) [0x5ada7e]
src/sync.d:712 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ad400]
src/sync.d:732 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5ad5bd]
src/sync.d:709 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ad3cd]
src/sync.d:732 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5ad5bd]
src/sync.d:709 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ad3cd]
src/sync.d:732 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5ad5bd]
src/sync.d:709 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ad3cd]
src/sync.d:732 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5ad5bd]
src/sync.d:709 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ad3cd]
src/sync.d:732 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5ad5bd]
src/sync.d:709 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ad3cd]
src/sync.d:732 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5ad5bd]
src/sync.d:709 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ad3cd]
src/sync.d:732 void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0x5ad5bd]
src/sync.d:709 void sync.SyncEngine.uploadDifferences(itemdb.Item) [0x5ad3cd]
src/sync.d:678 void sync.SyncEngine.scanForDifferences(immutable(char)[]) [0x5ad245]
src/main.d:347 void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool) [0x593c7f]
src/main.d:231 _Dmain [0x59361f]
I just tried to run version 1.1.3, and I observed that the client downloads all files but cuts the first five characters from every path for some reason. Once it got all those files, the client started to upload the files but with the cut paths. This was on a fresh install and a fresh first sync, where I started the client with "./onedrive --monitor". The cliend was compiled with the LLVM D compiler on Fedora.
I retested a fresh first sync with version 1.1.2, and the issue did not occur on that older version. I noticed from the logs that there have been some changes for OneDrive Business and this is on such an account. Note that no paths exceeded the 256 character limit. The issue may or may not be related to this.
Hi, I'm getting the below error message in the authentication URL, after authenticating to Onedrive.
This is Onedrive for Business authenticating with Multi Factor Authorization. My company is exerting some protections on the data, ie not allowing syncing from Android with official Onedrive app unless Intune Company Portal is installed, device is encrypted. Maybe it has to do with it, and it may not be a bug as such.
I've just tried the client on another business account (I have two separate businesses, the other one works fine) and I get the error
std.regex.internal.ir.RegexException@/usr/include/dmd/phobos/std/regex/internal/parser.d(1019): '*', '+', '?', '{', '}' not allowed in atom
Pattern with error: `^[^/]*+` <--HERE-- `++[^/]*$`
Pattern with error: `^[^/]*+` <--HERE-- `++[^/]*$`
----------------
/usr/include/dmd/phobos/std/regex/internal/parser.d:1019 pure @trusted void std.regex.internal.parser.Parser!(immutable(char)[], std.regex.internal.parser.CodeGen).Parser.error(immutable(char)[]) [0x542437]
/usr/include/dmd/phobos/std/regex/internal/parser.d:559 ref @trusted std.regex.internal.parser.Parser!(immutable(char)[], std.regex.internal.parser.CodeGen).Parser std.regex.internal.parser.Parser!(immutable(char)[], std.regex.internal.parser.CodeGen).Parser.__ctor!(const(char)[]).__ctor(immutable(char)[], const(char)[]) [0x542826]
/usr/include/dmd/phobos/std/regex/package.d:420 @safe std.regex.internal.ir.Regex!(char).Regex std.regex.regexImpl!(immutable(char)[]).regexImpl(immutable(char)[], const(char)[]) [0x540db2]
/usr/include/dmd/phobos/std/functional.d:1090 std.regex.internal.ir.Regex!(char).Regex std.functional.memoize!(std.regex.regexImpl!(immutable(char)[]).regexImpl(immutable(char)[], const(char)[]), 8).memoize(immutable(char)[], const(char)[]) [0x55b50e]
/usr/include/dmd/phobos/std/regex/package.d:392 @trusted std.regex.internal.ir.Regex!(char).Regex std.regex.regex!(immutable(char)[]).regex(immutable(char)[][], const(char)[]) [0x53fd98]
/usr/include/dmd/phobos/std/regex/package.d:399 @trusted std.regex.internal.ir.Regex!(char).Regex std.regex.regex!(immutable(char)[]).regex(immutable(char)[], const(char)[]) [0x53fc35]
src/util.d:104 std.regex.internal.ir.Regex!(char).Regex util.wild2regex(const(char)[]) [0x5b1ad3]
src/selective.d:27 void selective.SelectiveSync.setMask(const(char)[]) [0x5a570e]
src/main.d:187 _Dmain [0x5935de]
This happens when I paste in the response URI after I've authenticated. It used to work at some point in the past; I checked an old backup and used the refresh_token from that so I didn't need to authenticate again but the same error came up.
Any ideas? Thanks.
Hi
I get this error when running the command make in onedrive folder:
(dmd-2.081.0)Test@Ubuntu18:~/onedrive$ make
echo v1.1.2-38-gc0d2874 >version
dmd -g -ofonedrive -O -L-lcurl -L-lsqlite3 -L-ldl -J. src/config.d src/itemdb.d src/log.d src/main.d src/monitor.d src/onedrive.d src/qxor.d src/selective.d src/sqlite.d src/sync.d src/upload.d src/util.d
cc: No such file or directory
Error: linker exited with status 255
Makefile:34: recipe for target 'onedrive' failed
make: *** [onedrive] Error 1
(dmd-2.081.0)johnny@Ubuntu18:~/onedrive$
I ran the depencies and activated dmd
sudo apt install libcurl4-openssl-dev
sudo apt install libsqlite3-dev
curl -fsS https://dlang.org/install.sh | bash -s dmd
What am i doing wrong?
it works directly with Linux Mint 19
Hello, I'm trying to synchronize my documents from several projects to my OneDrive Business account. I've been able to upload most of them by using the command onedrive --synchronize --upload-only --verbose
but at some point, it fails with the following message:
The file has not changed
Processing OneDrive_lastlogon-MC0XR79C.txt
The file has not changed
Processing seguridad.zip
The file has not changed
Processing OneDrive_lastlogon-MC0XR79C-2.txt
The file has not changed
Uploading new items of .
std.json.JSONException@std/json.d(1392): Unexpected character '<'. (Line 1:1)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid URL</h2>
<hr><p>HTTP Error 400. The request URL is invalid.</p>
</BODY></HTML>
----------------
??:? pure @safe void std.json.parseJSON!(char[]).parseJSON(char[], int, std.json.JSONOptions).error(immutable(char)[]) [0xb36e9530]
??:? pure @safe void std.json.parseJSON!(char[]).parseJSON(char[], int, std.json.JSONOptions).parseValue(ref std.json.JSONValue) [0xb36ea10b]
??:? pure @safe std.json.JSONValue std.json.parseJSON!(char[]).parseJSON(char[], int, std.json.JSONOptions) [0xb36e94cd]
??:? std.json.JSONValue onedrive.OneDriveApi.perform() [0xb36e8d2a]
??:? std.json.JSONValue onedrive.OneDriveApi.get(const(char)[], bool) [0xb36e85ae]
??:? std.json.JSONValue onedrive.OneDriveApi.getPathDetails(const(immutable(char)[])) [0xb36e7af3]
??:? void sync.SyncEngine.uploadNewFile(immutable(char)[]) [0xb36f581f]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xb36f4f53]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xb36f4e4a]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xb36f4e4a]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xb36f4e4a]
??:? void sync.SyncEngine.uploadNewItems(immutable(char)[]) [0xb36f4e4a]
??:? void sync.SyncEngine.scanForDifferences(immutable(char)[]) [0xb36f4019]
??:? void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool) [0xb36da557]
??:? _Dmain [0xb36d9ef7]
How can I know which file/directory is making it fail? Is there any way that I can debug it?
It would be good to be able to follow the upload progress in normal log not just in verbose mode (e.g. logging the percentage of the fragments)
Since this morning (but the file was actually created on Friday), onedrive --monitor crashes with a series of messages like the following:
Uploading file [FILEPATH]... HTTP request returned status code 404 (Not Found)
{
"error": {
"code": "itemNotFound",
"innerError": {
"date": "2018-06-25T13:15:08",
"request-id": "b2a427bb-7028-4510-9e2e-abbb84540a33"
},
"message": "The resource could not be found."
}
}
And then:
??:? void onedrive.OneDriveApi.checkHttpCode(ref const(std.json.JSONValue)) [0xddbba4c0]
??:? std.json.JSONValue onedrive.OneDriveApi.upload(immutable(char)[], immutable(char)[]) [0xddbb9cc5]
??:? std.json.JSONValue onedrive.OneDriveApi.simpleUploadReplace(immutable(char)[], immutable(char)[], immutable(char)[], const(char)[]) [0xddbb8a16]
??:? void sync.SyncEngine.uploadFileDifferences(itemdb.Item, immutable(char)[]) [0xddbc4fa4]
??:? void sync.SyncEngine.uploadDifferences(itemdb.Item) [0xddbc490d]
??:? void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0xddbc4acd]
??:? void sync.SyncEngine.uploadDifferences(itemdb.Item) [0xddbc48da]
??:? void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0xddbc4acd]
??:? void sync.SyncEngine.uploadDifferences(itemdb.Item) [0xddbc48da]
??:? void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0xddbc4acd]
??:? void sync.SyncEngine.uploadDifferences(itemdb.Item) [0xddbc48da]
??:? void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0xddbc4acd]
??:? void sync.SyncEngine.uploadDifferences(itemdb.Item) [0xddbc48da]
??:? void sync.SyncEngine.uploadDirDifferences(itemdb.Item, immutable(char)[]) [0xddbc4acd]
??:? void sync.SyncEngine.uploadDifferences(itemdb.Item) [0xddbc48da]
??:? void sync.SyncEngine.scanForDifferences(immutable(char)[]) [0xddbc4736]
??:? void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool) [0xddbab6ab]
??:? _Dmain [0xddbab1c0]
Case I decide to Uninstall it, how can I remove or disable the key that I generated in Microsoft on the first run?
Hi,
I'm not sure if this is a bug or me being an idiot. With that out of the way, the problem is that the OneDrive web interface shows multiple versions for every file that I upload, meaning that each file consumes multiples of its own size from my storage allocation.
Some background:
onedrive --version: onedrive v1.1.2-1-ge8d3a26
OS: Debian 9.4 (Stretch)
For testing, I deleted all files from my account on the OneDrive servers, emptied the recycle bin and the second recycle bin. Storage Metrics page shows 0 bytes usage. I deleted my local items.sqlite3* files.
Command ran: onedrive --verbose --local-first --monitor --synchronize
Sequence of events:
The upshot of this is that even if my files total, say 1GB, my storage allocation is reduced by 2GB. If I manually download and check each "version", they are identical (md5sum). I suppose the intended outcome is that there is one version, which has a modification date equal to when the file was last modified, not when it was uploaded.
A short section of the log file is shown here:
Onedrive_log.txt
I have also screen-grabbed a short video showing the problem. Keep looking at the file 'duplicati-b167be4f012754240b8679b9b81a9f6fa.dblock.zip.aes' which I highlight at various points.
video_example.zip
Many thanks in advance,
James
Hi!
It's possible to convert from DMD to GDC (or LDC) for support:
Not exactly a feature request for your client, but would you be able to create a docker image for this?
There is one already for the skilion code, but that is obviously out of date so it would be good to have one based on a current client.
If you don't have the time, then perhaps I can have a crack at it - not tried doing it before, but willing to give it a go - it looks fairly trivial as I guess most of the dockerfile would be identical except for the source of the master.zip file...
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.