summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Borg <jakob@nym.se>2014-03-28 14:36:57 +0100
committerJakob Borg <jakob@nym.se>2014-03-29 13:47:21 +0100
commitf87b1520e892c22da184f16e16fa95684b711e8d (patch)
tree93b179582683d852f0781cd192e9f7ce8f543070
parent3700eb1e61166eb9f95d1a2a6c7d606be5cbb614 (diff)
The Great Rewrite (fixes #36, #61, #94, #101)
Rewrite of the file model and pulling mechanism. Needs lots of cleanup and bugfixes, now...
-rw-r--r--.gitignore2
-rw-r--r--auto/gui.files.go4
-rwxr-xr-xbuild.sh14
-rw-r--r--cid/cid.go47
-rw-r--r--cid/cid_test.go27
-rw-r--r--cmd/.gitignore1
-rw-r--r--cmd/stcli/logger.go72
-rw-r--r--cmd/stcli/main.go137
-rw-r--r--cmd/stcli/tls.go71
-rw-r--r--cmd/syncthing/blockqueue.go94
-rw-r--r--cmd/syncthing/config.go1
-rw-r--r--cmd/syncthing/config_test.go2
-rw-r--r--cmd/syncthing/filemonitor.go173
-rw-r--r--cmd/syncthing/filequeue.go241
-rw-r--r--cmd/syncthing/filequeue_test.go297
-rw-r--r--cmd/syncthing/main.go101
-rw-r--r--cmd/syncthing/model.go666
-rw-r--r--cmd/syncthing/model_test.go363
-rw-r--r--cmd/syncthing/normalize.go11
-rw-r--r--cmd/syncthing/normalize_darwin.go11
-rw-r--r--cmd/syncthing/puller.go477
-rwxr-xr-xcmd/syncthing/syncthingbin0 -> 12565676 bytes
-rw-r--r--cmd/syncthing/tempname.go13
-rw-r--r--cmd/syncthing/tls.go8
-rw-r--r--cmd/syncthing/util.go16
-rw-r--r--files/debug.go12
-rw-r--r--files/set.go324
-rw-r--r--files/set_test.go321
-rw-r--r--gui/app.js1
-rw-r--r--gui/index.html2
-rw-r--r--integration/genfiles.go6
-rw-r--r--integration/h1/config.xml6
-rw-r--r--integration/h2/config.xml6
-rw-r--r--integration/h3/config.xml6
-rwxr-xr-xintegration/test.sh8
-rw-r--r--lamport/clock.go24
-rw-r--r--protocol/PROTOCOL.md63
-rw-r--r--protocol/message_types.go2
-rw-r--r--protocol/message_xdr.go4
-rw-r--r--protocol/nativemodel_darwin.go34
-rw-r--r--protocol/nativemodel_unix.go25
-rw-r--r--protocol/nativemodel_windows.go34
-rw-r--r--protocol/protocol.go112
-rw-r--r--protocol/protocol_test.go122
-rw-r--r--protocol/wireformat.go35
-rw-r--r--scanner/file.go4
-rw-r--r--scanner/walk.go31
47 files changed, 2133 insertions, 1898 deletions
diff --git a/.gitignore b/.gitignore
index 64cac32906..5b1c7081c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,7 @@
syncthing
syncthing.exe
+stcli
+stcli.exe
*.tar.gz
*.zip
*.asc
diff --git a/auto/gui.files.go b/auto/gui.files.go
index 83ba928b18..88199350d6 100644
--- a/auto/gui.files.go
+++ b/auto/gui.files.go
@@ -18,7 +18,7 @@ func init() {
bs, _ = ioutil.ReadAll(gr)
Assets["angular.min.js"] = bs
- bs, _ = hex.DecodeString("1f8b080000096e8800ffd41b6b6fdb38f27b7e05b7db83e4c6b5ddc5e170489a026dfa40ae8f2c9ade7e09f281b6689b8d4cea483a8911f8bfdf90a26452a26429b96e6f0d6cd62687f3e2705e64c7cfbecb943285a682df4a228e90126b324433ce14656b52fcced2b5d4ffe5bfd1b3f1c1f8d922e5539ca2a747688e530940982dd62916f6b7063a88d6f0452a41672a3a3e38b8c102c90d9ba925650b7452ac18ad78b24e491c9573d1105d5e0d60453932d22c099ea644c4d145317aaa440ab0f335fca69ca1f8a99cf10c7879ba542a1ba0fb03041f4d3613e4e62d5604a84e8666547f8030493f1075fe11c6b56840528fe768344d460c6609f3f7dbe3cae49c2eeae3abcdd95b188d226f9401258de4f22a80e48c69894a169c7922041781759210f64ecf594a666e3c4617a06bb690684ae65c1034e53c9528e5fc1a469422c2c7a1940106eca546ee697284a24f542ac200192817f89ec1a61aa5a3df05577cc6539443a0d7492288944402a0da6460309122770a7ec1b0c242e516b31d56087cf8f7995dea5080c10ade9e583fe3bb0bc2928fd3cc457bbe560bae0deeabdeff4f7445158a3fbec9e460879ead575322f612f80a28313b63a0c91b9c5e3844f219544ca1f841d8adc18509d8c9c7d1f81d0b0c8728fd4afeb30640574fa03d04ba82d52c31eada81f4a301884e9770b64965233481f73425289fcdf7a3f34ed494859373966e3c15e104d9318b4d1f80bdfcbe4e537efb96a44411079b1945e5701f84efb95e7bb159816fbd7635904f2067a60fda0fc6e3be66ec1dc3d39424eed1c99d31cc71f0857df9fdc4670d78cdcc43d15ee8b9377964711d891e46bb7117a5c571653d5ae9d80b477db19ecd0849481217ce5d7fe81cc5bfec7cb93b65fc5d1cfdca88bae5e2daf8cc68a0230e4ee3684913120d8e3de8404c28a6b607f9df306fef31d8769db107f0753fc5b3eb44f00cd4020a5674066aba269b29c722b1f175dbc6b681d8c7b70e49a77c956141623c44d32ae378f4052074303b3971835b550c41d45a30f4fc4595608168da0f51239e92a197a840d98b173b59a27955a2397615647287d182a8381a6b031fdf10214161b03d529b9f94f12ee148b0c22e13563cbb04b6420358f476c76af8e50662deaa0ffa7c8587dd99b519889e33df8f77beb3463b4f403ad1762894b98f4fbf06313acf4cf6342a130a74d20a61e3fee83b04ec188c5e1f4e0fbdcee58a5cca47f495645c52c50525f27272657656fabc998523c9858a1de31f04052888301f8d7bec1a9439d649ebc3345a268266efdcb13a07db819fac0a32072696faf497043dd37984d9ed37bd56bd18dfd49790591434b140307019c993e638ac05777de1b0bbef6e510d74962537d75b1043171f6054b7f160e841e88f4a0020d670cfcb426580c6e8c56432a943d3a472269cda067004ad993248c574ed139ce56b554e7bf35044a0982688321492ce70a363af31d72596e7b70c2a848c08b581658310bcfe14e5e5716d765bd78dd83460d1442f6972550af719abe56885efe2c910fd133dcb77c4409cb1371b45e437ae209b791e28ef6a505afd2a19d439f428978a6b260d197517da1e5823f12d9a61355ba29834a9b6a6944957110280f5ddf0cce9f0a442ae8ec1373077413ee4afd8367846a708efe17518f8865e07950e11c3ab8a55e647c0e80751c83c8ca9a7842dd412060e0f431ba1b1a042568844f07324b3946ad6aae9e66e33ae46174b084d5ff2c51ac7a5fe638981e9bcb86a539761ccc4b69da4d5b4aef8e4d9d48e9c4ea8ca5f4da615c8adc29c8428bcea41a113010b5bb1da6a565c047330857ec693375efac6acb25d13a6b4f523b64e2da018526be9056d939acc172e096d9dfa1c78494fe93fec029bcb3a46a237410356b92dc6473a0382fad664aa909b43bc096d8d557574c6904e45a28aca11d1edbee6657a8dee27c4113a4455b28728fadba08ad1c9ddabc97bf4964a2b3b9cee46b59ecd4cf2fd17502abfeeab4f9be8f551da0aa2ad6cd6d6698ae55fc406ed71ecabb34cd015169b3e3aa36cce9b55a60b953f59639631a3345b27b554b951bc66d7900e42bd9bc30e5af6dfd9829f2652c529446db2358bf207d9bb2d9a199fd38e8d09bfb60ff1f723d59352c2d41fcdb46bfb6ef96cd9779b6a74d75620765bb22e480b77be0a20b84ea5123a69fe4738444a7c432e76f7140d956db084aef4c03a741df6f4262e9428b2b8a16ed5e1cc490aee80a142c8bb91027703756520c5c8b8acf65e86e85f17e75f46d25cddd0f926f698180cd1fd92e00436f308dd47a7503a811d3cffb6c9487484229c014750140013e3ef92b368ebd18ca35f8b6b9e6fbab70b7ccf789ae24c12bffbb9ad36134c63774f33c115c6ae70d3db7d775c159a24a14adbc53e8b2cd0ae85004dd81516ae465c2305e9dfddc116e6978e7e4bb78e6c54de69e5edaac264cb61af39e56aba10e0417ddc8a32c069d774b15709f7f9b1026a40c7150346920d1413c0c0b6838aaa47e77f2c5b62ee545ac5337d1372fba5bc351d22eab631431cd5baf9a635111632ecc58e43f940b50074fb836d85a0a6eec29a4a300f37bfecc28d6b78e196b6fe14aa18656bb9ac621d74486aaa4d4d8bafc93d067ba9deba9ecef74ff67d8128b2dfdcf2733e440967a4626e9d64ec6493960a0a19400d6ae773427ee881f1a824a2e5ac8bf103cc5d67577ee00fd9786571c8a75738f73d79f1990a82af3b1c89bc7109981a6a79b63b7045100afa070fbce56ea1db0973b1d5ee6d7eda01e26a4944c162fb112addf510b1e3c77b5156d10958c671cdee58c0b186f27883d0d9d616cf597c73f25619548d5a52b9d7b7fc1465ec296a1ce92e596367711bccd4749b4b27c5ad42d7de2e95a21b95d4c4cfe1dbe43758773ac81704954046dfa8e93a56df4b85b460091b9ba8de06b6d844be2c6814b39460f1ae90bf3583735f72f97285d462bac046b620dd39b81396a49bfa510507e1126fd986bd56688a5c3784856d519aec19fe423191a57846e259e9ff87d52a54cf0d062d8523e06928544c33acb8c48362a7781e15fb1043739b36013813044bcd246446571002411b299cd2f5ca7d3598d00555523f5d9915de585b977e7ca54f97d7a9f21bd23640e4088a0ba279cab988cdd7942ff22f786a480ff49d4f39f36252284353aedc2f018f600639660b6569e76c6edd6793739a2afd64926180c0fe63c9827bbb7a374159b65643d0404a938088667aa4f87b7a4792b854a0b76a1747b6fe3bce82a12965ba21d79d9f6a53c20c9a6d58b384cc292349436f229aa060376987e51518c76f7f47cfdcffd5121c03393e09801e87a8b66be937d8f04314a10fb40f6b5d787a04339fbb31d3cac523c87f0c93b738cc11101c36bbb007bd26da67672ba29f1fff1fd9d9646236aafc5f8b36aba08fb1b33e9c7561e93166d6899756261e41fdfa071899d4379b0fb4318ff96043b481284e6ff1467e29decbfe78fb9eb428ce6069e238a142f7c06f481c71d3527d97e8d2a78d69573ff93f20807ae5341a3ac326a9b0ff42a11c560233394bd7496dc664034715c96c7314709fd8af0e09e741ab222b20a7f43bd597b9c2f4abd59327fa59fa13c416cfcd9ba293277ee3f8d2e21cd1e4eac9ab9763b3f295a560d5f45f000000ffff010000ffff7432b7e783310000")
+ bs, _ = hex.DecodeString("1f8b080000096e8800ffd45bdd6fe336127fcf5fc16e7b90bcf1dadee2703824cd026df603b9fd48b1deeb4b9007daa26d6e64524752498cc0fffb0d294a26254a9693dbeed540b336399c8f1f8733c3913a7efe55a694293413fc4e12718294c8c910cd395394e5a4fc9da5b9d4ff15bfd1f3f1d1f8f932e5339ca29f4ed002a71288305be62916f6b7263a8a72f82295a073159d1e1ddd6281e486cdd58ab2253a2b578cd63cc9531247d55c344457d70358518d8cb44a82a7291171342d47cf9548817691c36fca198a7f92739e812e3fad94ca06e8e108c1478bcd04b97d8d1501a993a119d51f104cd277445dbe87716d1a88d4e3051b2d9311c359c2fcc3f6b436b9a0cbe6f87a73f11a46a3c81b65204933b9ba0e30b960daa24a05679e08c145609d2484bdd1735692991b8fd114b0664b896664c1054133ce538952ce6f604429227c1e4a1962e05e21f2409313147da0521106cc005cd07b0e9b6a4047bf0baef89ca7a8a040bf268920521209846a9381c3448adc2bf805c30a0b5578cc765813f0eedf1776a92301066b7c0fe4fa11df4f094bdecf3297ed65ae965c3bdc67bdff1fe89a2a14bfff2d93831d7b96af6744ec15f019586276c100c95b9c4e1d21c50c2aa750fc28eed6e1c202ece4d364fc8e058643947e26ffc981d0c509d0438015ac6689816b4772980c6074be82b34d6a1ba105bca52941c56cb11fbd77a201164e2e59baf120c209b263969b3e007bf57d0b6185df4d376b088537aec2c50472660e61fbce04c85f197bc3f02c2589ebe945ec84390ea18b1cc8f8039fb7f035338f653bd573bf1589c03df77a18edc65d9696c7b50d40551c2ee3ea349fcf0949481297b1587fe802c53fec42af3b65c2531cfdc888bae3e2c684b868a013044ee3684513120d4e3dea40082fa7b647c5dfb06e6f31b86253b147e8f530c3f39b44f00c600180159d034c376433e35824361d6ebbd43614fbf4d619e49caf332c488c876856571c8f3e0185ce3d67676e2eaa9b2188ca05432f5ed605968c6687316ae55329f40b2a591ea48b9dacd8bcaad89cba0099543f5a12154763ede0e35b22240006db23b5fb4919efea83042bec2a61cdb34b602b3481656f77acc15f6e2045ad0f615facf0b83bb3b660d073e6fbe92ed4356417f5422fd98e84aa54f1e5372846979929764655fe47679d14364d8fbe427e8dc1e9f5e1f4d8ebd2ab2c7d7c469f49c625555c5022af26d76667a5af9b5938925ca8d871fe41d0805208f3d9b8c7ae05ccb1ae311f876855b799bd73c79a1a6c077e6d29c8029458e9d35f09f45ce7096eb7dff53a7131b1e950416651d0c502c9c055a4a871e3300aeefa3260f7dfddb278ef6d4be1ae776086be2b8053ddc583a147a13f2a018258d3bda8ee150334462f279349939a26b533e15c458047d09b2983ca495f5582b33c57d5b4370f353f8a6982284321eb8c363af71a775d617979c7a0a0cf88501b583608d1eb4f791b3c6dcc6e9bd8884d0b172df48a26d795711fb15a8dd6f83e9e0cd13fd1f362470cc505fb6da388fcc21554332f02b7b10695865f2583a6869ee40ab876d15000f791ed91b50adfa23956f3158a491bb40d50267d4d08103677c373a7e3b39ab82607dfc1dc05c590bf62db12199d3bf3015187416c38e8a0d22162785df3cae208187c1085cac3b87a4ad852ad60e0f838b4119a0b2a6d854c043f47324ba956ad5e6eee36e37a345d416afa542cd63caef41f2b0c5ce7e575175c463193db7696d6cbbaf25354533b71baa0aa7eb5b956a0b60a6b1292f0ea0009bd0458da9ad7d6abe23299832b1ce63c459fe4d09c557557c292b67ec6d6a5055c86542ebda46d4a93c5d215a1bd539f03afe8a9e2875d606b59c749f42668c2bab6e5f8485740293162756d0ef926b43516eae882215d8a4435c811d1ddb9f6657a8dbefec7113a4675b1c728fadba0ced1a9ddebc57bf49a4a6b3b9cee56582fe6a6f8fe0b80ca6f0ec5d3167a8780b6866c2bdbd13a4fb1fc8bf8a03d8e87629609bac662730866942d783b64faa2f22723661533a0d97b52c72d378a737603e520dc770bda41c7fe3b5bf0dd4caa0585a8cbb67653fe207bb7452be36bdab331e1dfed43fa7d4b78524a98faa35d7663dfad9e1dfb6e4b8dfe680572b715eb927468e74300c9752695d045f33fc22952e25b32dd3d5668b9d906afd0b51e588faec39edec45489b28a1bea561dce9ca2e01e142a8dbc1f29083770af0c94181997f5decb10fd6b7af96924cd9316bad8c49e1283217a58119cc0669ea087e81cae4ee0072fbe6c32129da00867a0115c0a4089f157c959b4f564c6d18fe553992fbab70b7acf799ae24c12bffbb9ad37134c63774f33c135c6ae70cbdb7d8fa46a32494295f68b7d1e59b2cd850024ec0a4bd710ae9982f56fee610b8b67847e4bb7c96c543d822ada55a5cb56c35e73ca45ba34e0517ddc1a1810b41b58ec05e1a13856200de4b866c048b281cb0428b0ed0151fde8fc8f6d4b08c479d2699ee99b90bb4fd543ce21a26e1b33a451a39b6f5a136123c351ec34540fd42f806e7fb0eb22a8a5bbb4e62658a49b1f76e9c675bc704b5b7f4a2846592e5775ae831e454dbda969f9b585c7602fd55b7760f0fd93635f208bec77b7e29c0f51c219a9b95b2f1b7bf9a49582420ed0a0dac59c501c7a643eaa84683b9b667c0377d7d5959ff8433e5e5b1c8ae935cdfd485e7e6682e09b1e47a2685c02a796bb3cdb1db8320905e38347def16ca1df0973b9359edb7cb703c4d58a8852c5ee235485eb2162a74f8fa2ac860978c669c3ef5820b086ea78c3d0d9d68ec8597e73ea56198446ada8dc1b5bbe0b187b2e358e7557acb5b3b80d566abacda58be24ea31baf1a55a61b481ae617f45df61bae3b0c8a054110c8e80b355dc7faeb4d2114ac60e313f5a7811d3e512c0b3ac53c2558bc29edeface0dc17af7cbb42b0982eb0b12d287701e18425e9a679542140b8c23bb661af179a4bae9bc2c2be284df50c7fe13291a5784ee27915ff87f55ba89e1b0c3a2e8ec0a7e5a2629a61e5433cb8ec946f33c53ec5d03c4d9b009d498215320999d335a440402385539aafdd97fc12baa44aea5757e66534d6dea5df95d2a7cbeb54f90d699b200a06e503a245cab988cdd7942f8b2f7866440ff4339f6ae6e5a404434bae3d5f021dc10d0ace96caca2ed4dcba6f392e68aaf41b8e0c0305f6df6d2cb5b7ab77139465b91a0202294d02269ae991e26fe93d49e20a406fd52e8f6cfdd72e4b856694e9865c7f7dea4d093368b62167095950469296de443441c16ed28ecb2b708e9fff8e9ebbff340a1c43393e0b909e86a476a3f4336cf8318ad03b7a886a7d747a82321ffb29d3a9c513c4bf0f8bb73ccc11101c36bbf407bd26dae7676ba2df16fe3ff2b3c9c46c54f54f079a75d2a7f8d9219af551e9296ed64b974e259e20fde61b3899d44f361fe9639ef2c186688b509cdee18dfc54bedefaedfd7bd2019ce1d2a6714285ee81df9238e2a6a5fa26d1579f2ea55d7c8af7fde1be721e0d9d615354d8ffa1a01a560233394ff3a43163aa81939a65b6390abccfec574784f342ab226b10a7f47baabf1480e9b756cf9ee9b7c89f21b67c61de293a7be6378eaf2ccf114dae9fbdfa656c56beb2122c4cff050000ffff010000ffffe4f29e3132310000")
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
Assets["app.js"] = bs
@@ -63,7 +63,7 @@ func init() {
bs, _ = ioutil.ReadAll(gr)
Assets["favicon.png"] = bs
- bs, _ = hex.DecodeString("1f8b080000096e8800ffec1b6b93dbb6f1bb7f05cc4e62bb35a5b39d57654933ce9d33bd36b13d3ebb6da6930f100991c88100038077a75ef4dfbb0b901429917ae5ce6d66ea199f0802d805f6bdc072fcf0ecede9871fdfbd26a9cdc4f4c1187f88a03299044c06442621cdf349601632b22997498063188de12763969228a5da303b090a3b0fbf09aad7a9b579c87e29f8d524f867f8f15578aab29c5a3e132c20919296499873fe7ac2e284d5b324cdd824b8e2ec3a57da36065ef3d8a693985df18885aef19470c92da7223411156cf26c70b206266626d23cb75cc906a4b541b4b0a9d26bfd82cb4ba299806d43a78d0a4b78845052cde693604eafb039c81d351e8c2db7824d6b0a8d87fe4509c7cf9929658dd5341f46c60cebd620e372006f82129d5d086652c62c2ec3b5885de4b04ecb6e2c4e458433152fc8ed0302ff721ac78032b42a1f91af4ff29b97add73365adcaaa9ee58307038413664a2a93d3889550e6b0f9704e332e16235277961328b02c84edc64c1a164fad63bed55364c1662faeadbf770efbeeefad21c75b2177f6d690e3724f33a563a63d61a4927e370e05b19ad8b41ce6e841054fe4884420004cfb6d0b95a872484675c2a1fba445dbbaed30845fd6a45786a3c88d90a320f0571ef378e8b8095c1d7aed7930766c0426a1e8692504d393e0a212a253ab05ca40ccaf4824a8319340d2ab19d5c4ff84737ec362dc5ef52266735a08141c5c46732222a05c325df6b97eda061bce349571301df32ca97a900601313a42c10cb1153e7bfe8d137be2153278f11c9482f124b5ee794a2e565a401bd87035b0550e9af0109633e7c9b9c4a18d15b97173a5b3b585b957e5b3464c6b73dcbc5901822e4b5df18da08233b392c0ff30d71c58b970362d123cba9c049a194bb57dfc2498bef78fe48dba1e0f3d84b5b50d71256beff2b5c5a238ad2df643ca88df72a1294a0649a92133c624da4e99b098003a90514b6804f2422d8b072b3a92ac3096940b0561ab07810c3322d9751bf8603ccc1b741f02e14b81f08fe5cf836df2d1ecd3ea3a58e3633d4b84590c12b1cec306af99d64a7fcf0d507820984c40eda6e4a4e60cd86dd893fb1b5e532dbd7bd9606e8ee034cb19b50e24587ed2800c426b322ac4f4f616de0e3ef08c915f490c241a05693acab291310303a673b91c811abaa1e4f676ae3993b158bc51e0281ee3ccd708f3c972d922e1de62961742789e934ae2aa3d35242e128c6a87c8e0cadffead47d89a84c629a0eeb0cf153bd738dc3b39a79209e2fe865cce55177dd7878768a11c2fc6e98b768ff36cc1f4548050320db6ec45d7a21c5467a2abd9beb166b53bd6e2673a53dfddf7300c49b6304ccc4918f6cdd7355ae7ed0ad0a8a0294312587e3a4f508e40c70c4a0032a3139a87181367becb4064f4ecf9675b86bb29e042656d48e98c6150057fd7ccf4de2012b1c8538c3a48fd14aa4b14091c35251f601f04f7b57d557e74ff4687363e840c270791a11d7b04a0afb8e03710873d2e39e294ef4e97f81c97787b7bc5b401eb88e00f9bfe254c7f6c2be23e3970fa9f3f0b5a9beff35fcd7fb7b75cce7203260cc254cda3e5125a871219459e74c94c94b22b0dbfb1ba96b5f4dc15b18fdbae2aecfdefb7c8ef7cb75f1fb1db6e0fb2720f2ce6d699a34a2136a298d27eb8e71b83be6f8795c8998cb858598ad780a2dbe9ec470be8d15b8c337857a22034d14e61cc562bdd6d92dd6cef957718e5234db0b73ba7d8d1303c7761913de473786c01ae48efbb2f2cb54513f3fd9aecff39035d82fd3bd32da8fbcd7a15c7074d3b5c43e96c06f921c63993e0f6165829598491b5f957897680b2797ef6d3e05c7ebbb0cc7c50960a305f332e21bd582ebf45c26d9bd761df215b02b407b3ea9399f97ba4e2dbc21e47c62ebf715f74bc1bf7f17f6fd122c8163ea1c2ef3609bf9b1177c4f9edcc6d08068de32aa9d9cd71c8e556fc06fb7a4fec1ef6a475d0816961675adbd16c26bc071d547cd5754e71af59f27be60e03955e6c4d943700239dfa72e3bccabd49796a6320aac880d762900835a3e23b2e181a452aaee9c2bc29b219d3cb2599e3eba76b639ddd6d9adc6e9cddf612f2a23fb5c19d31c1d0906e208f5d07d12c523a364f4a5973c72c7dbbfc5e45e00d744d41776856a113d8b9df46ddd03bdba78376cc363770f59ee4f4358f10e8d222b817b78fbc6c99228a98318ff09c1f7724198b3d7926930939794aca71e56169c7b88738ae2b5a3e4243f0943305ffcaffed0e2fef4e4d9a83b54a347337275d43fb868733aa03a2150630d53bf78a6a4ec32b2a0a26d5f524f8eaa4f92ae37212b4dfd09b49f0ece424d86aef5b8c6aac601f7e3587a3f1eae7d9d625b4725bd01f5833f9630989bbc37a0f6b48ba4c88744a307abe5c7ef67267c67f18e8a696ad309d00a62d0eaa53867675b9836693225bd72988c7d6d337d0ac2d0bf6ed678356501a26e8b79b85df91271cd3f21a34c073791a5a9524286cb0204173c3aad754277895fc07b3001797a17dc05fbc4ada691a788c97d46e5a7b09150e5223dbc366ec32305e5c2041f12807f0d3642e79ffea073c090177019e0225a11ce7deb54672490ac37aaf1cd6114579f18e69bca9ecd00c6a0b4dc5e819a806397df7b18137511ad2252ebba475d5d77ff1d143f84fe1c5fefbc2c82c5027311f304c05992c9bfb4b656bfea7124e776deadd173eeeca371af0717898804ce4ad4b93721b28b0d58ef639326bdc0696d30698d480fb228f30c87a447efd956cf47823ff680f040e893fdd8385e36143058cc778f6b66abb7a103c3272a3f784cc658ed51ff106e016b5ca2bfca0ccd75643b18d838102ce17b8cbd6394f066f737fa8b182f91326610edd1e54ed77621bc4afd42d65d1e54cdd04bddc9829250ea3f87e63f1df0617b651d613b1b5e0bb249e5bffbe42b007a5770ce9aa1bd863eaa6c663894bab866363ca3e8706266b9e1d340f0d0cbd629571c393830b68ef7116e02fd47b93a75357e36088a5978cb0f99c45965ca74c56250d6852ead2a9419d3379a8f7e68cb65443b4cb6caa339656d58d2fabdab7d2a6ab4664ed4eb259b25188c6f80a6fe3b1ebf8682cf874a3a207abcfaa92352cc733a3e130e1362d6683486543c864b37458937ea8217ba5868151ff1e821663c97bffc2fb394070e718aff9250fa6672a2a328867ca0cf0be9071630adcdcb745e5baef010b288d2a203a23a760af36b18c878568b6f27e6144bb2899bd56fad2558bd47a0c969082aba331eb903fd719c69c0a95f4e4007e4859eeb825f6f2e3309882d8b259a813a33e7799a171fa457b72196fed3e6ce93a966437d09939a1080d4f76dc629cd6f704c491abc33aa45f6c350eddfbef89b2c61d71f2aa62cb3096192cd59a318217304f89c28a43a619e1865002193b448219b90639220b1018728e8587c06eb2baef186c2078cfac5e00fccf532604cf5f76ec31ff2df60f45aeba51385cdc886f88bb94bb432bfd22a1eaf03de626e335c0f24426e571cc2438285dc07e3eb73c63e665bf8feb9368bc14216f9c8adfa954ed17b3f7c4ea5b5c74233c76f7d367c114574fcecf76c6416598960b1ab15489188b547ffcf8dd5fdf7e3c7bf7f6fde90faf0683810b2280de98df94320462fafa861bebaadf9c2df378b745cdce2f3683bd426b90155c6979e7b74790b7f2b6a02579388374fbd2d7604abf631281dd01c59cab42c6be028c11905f834a5a368357714cbc1a94c2ad7cc7aab0617068aefcdb394733103dbc8c3f8a697f511923174c43d4517204e11dcd0fb79823b971918251045a1b8bd5d86a4e4a61acc81f95371cc6154a7c7a4ad338c603558c165e558f47d13c5e009179b4a61f9b728de957b640f540c6acd01fcb9d7ad517561fcda5d7d2df326519058f96538d4759dbeb45783ec2ef36aabbc47a23a85a5b279684aa2682ebcc9976d69016106943141081269a4881f42e5062504c4af007cb475f42561d55f803e087eb66ac1bc73f3095f15f048067c7726cb40e4fc9256339ca73c6c1cad8945a3266d9b42e241c0fa1e54bbb676e2740da968d311c54c22a352068bb2a05713b2f41402c31ea39c6d60cd20b1428975b68764cb25453a4e5b97a73d0632bf031e9acaeaab7279c875c8977c700d3538c0f7663a88ad7d7fdd876cc2e2c26ae0a5cb0792bb3f61783d536fdfd61df4706fb466cfedb26ff7506a02e04d5ee63a29ffd65beeb9db687fdfc4b01ea133e1f9c0c5eec1abbfa5ee9e7f5cf95b6cca279bede3df4b7fe1029b9efcbfe030000ffff010000ffff297e4ed370360000")
+ bs, _ = hex.DecodeString("1f8b080000096e8800ffec3b6d73db36d2dffd2b103e933a791a4a4ed2b75325cda4763ae7bb36c9c4c9dd756efa012221113508b000685ba7eabfdf2e4052a444eaad76ee3a7399894510c02eb0ef0b2c878f2ede9e7ff8e9dd6b92d8548c4f86f8430495b351c06440e42ca459360acc5c4636e17216e0184663f84999a5244aa836cc8e82dc4ec36f82f275626d16b25f737e330afe117e7c159eab34a3964f040b48a4a46512e65cbe1eb178c6aa5992a66c14dc70769b296d6b036f796c9351cc6e78c442d77846b8e49653119a880a367ade3b5b03133313699e59ae640dd2da209adb44e9b57ec1e535d14cc0b6a1d346b9253c42288966d35130a537d8ec658e1a2743cbad60e38a42c3be7f51c0f173264a596335cdfa9131fdaad54bb9ecc19ba04067e7829984318bcb702d62e719acd3b23b8b5311e144c573b23821f02fa3710c2843abb201f9fa2cbbfbb6f17aa2ac5569d9b33c39e9219c305552998c46ac803285cd87539a72311f90aab398408165216c3766d2b0786c1df3ad1e230b367b716dddbd53d877776f0539de0ab9b5b7821c177b9a281d33ed092395f4bb712888d5c426c530470f2af84c0e480402c0b4dfb65033550c49a99e71e83e6bd0b66a3b0ce19715e995e1287203e42808fc8dc73cec3b6e0257fb5e7b4e868e8dc024143dad84607a145c9542746eb5401988f90d8904356614487a33a19af89f70caef588cdb2b5fc46c4a73818283cba84f4404944ba68b3ed74f9b60c389a6320ec6439ececa1ea441408c8e5030436c85cf5f7ce3c49e78850c5ebe00a5607c9658f73c26572b2da0356cb81ad82a074d7804cb99f2d9a5c4a1b515b97153a5d3b585b957c5b3464c6b73dcbc490e822e0b5df18da08433b192c0ff30d31c583977362d123cba1e059a194bb57df23418bff78fe48dba1df63d84b5b5f571256befb2b5c5a238ad2df643c288df72ae294a0649a82113c624da4e396331017420a396d008e4855a16f7567424696e2c29160ac2560d02196644b2db26f0deb09fd5e8de07c21702e11f8b9f936df251efd3ea3658e363354b84690c12b1cec31aaf99d64affc00d50b827989c81da8dc959c519b0dbb027f737bca55a7af7b2c1dc0cc16996316a1d48b0fca4061984d6a45488f162016f7b1f78cac86f2406120d822419a4e9c0989e01d3b95c0e400ddd50b2584c35673216f3370a1cc5139cf91a613e5d2e1b24dc5bccb25c08cf73524a5cb9a79ac4458251ed10195cf9dbbf76085b9dd03805d41df6b962e71a873b2767543241dcdf90cba96aa3effaf0102d94e3c53079d9ec719e2d189f0b104aa6c196bd6c5b9483ea4c7439db37d6ac76cb5afc4c67eadbfb1e852149e786892909c3aef9ba42ebbc5d0e1a15d4654802cbcfa7339423d031831280cc6885e621c6c499ef2210193c7ff178cb7037055ca8ac0c299d300caae0ef9a99de1bc44cccb304a30e523d85ea1a4502478dc907d807c17d6d5f951fddbdd1be8d0f21c3d9416468c61e01e82b2ef80dc4614f0a8e38e5bbd725bec0252e16374c1bb08e08feb0e95fc2f427b624eed303a7ffe971d0d87c97ffaaff5b2cb89c64064c1884a99a47cb25b40e25328a3c6993992861371a7e63752b2be9b92f621fb75d95db87df6f9eddfb6ebf3e62b7ed1e64e51e58ccad3347a5426c443185fd70cf77067ddf0e2b91311971b1b214af0145bbd3d98f16d0a3b71867f0ae444168a29dc298ad56badd24bbd9de2bef30ca479a606f77ceb1a36678eec3227bc897f0d8005c92de775f596af33ae68735d9ff7506ba00fb37a61b50f79bf52a8e0f9a76b886d2c904f2438c7346c16201ac942cc2c8dafcb340db43d9bcbcf8b97729bf9b5b663e284b0598af0997905e2c97df21e1b6cd6bb1ef902d01da8359f5c9ccfc0352f16d6e8f23639bdf78283ade8ffbf89fb76810640b9f50e1779b843fcc887be2fc76e6d60483c67199d4ece638e4722b7e837d7d2076f73bd23ae8c0b4b035ad6d69d613de830e2abe6a3ba778d02cf93d7387814acfb726ca1b80914e5db97156e6dea438b5311055a4c06bd19b0935a1e27b2e181a452a6ee9dcbcc9d309d3cb2599e2eb676b639dddad9bdc769cedf612f2a2cf9be02e986068483790c7ae836816291d9ba785acb96396ae5dfea022f006baa2a03b342bd109ecdc6fa36ee8bdedd3413b669b1bb83a4f72ba9a4708746111dc8bc5a9972d93471133e614cff9714792b1d89367341a91b367a418571c96b68c7b84e3daa2e52334044f3913f0affc5feef0f2fed4a43e58ab9966eee6a46d68d7f070427540b4c200a67ce75e51cd69784345cea4ba1d055f9dd55fa55c8e82e61b7a370a9e9f9d055bed7d8351b515ecc3affa70345edd3cdbb58422bd5df8fc963c816593ff2f8071775eefc1f5c98615794a3e27a78f4f7765518bc50130d7340c9ad23d0cce96cbc75b9c53abfcecea7287cc264196ae530f8facc76fa0595915ecdbcffeaca0d4cccfef37097f202f38a4c515688067f234b46a3643298305099a1956bea67a86d7c8ff67e6e0de52b40df88bd7483bcd028ff182da4d6b2ea1c4412a647bd88b5dc6c58b0b24271e650f7eeacc25ef5ffd88a720e02ac04ba02414e3dcbbc6482e496e58e775c33aa228cbdf318db7942d9a416daea9183c07d520e7ef3ed6f0ce94865489cb36695df5755f7a7410fe5378b0ffbc30320bd499990f18a2824c16cdfda5b231ff5309a7bb32f5ae0b1f77e51a35f8383c9c814c648d0b93621b28b0e58ef6392eabdd0416d37a98d080eb22a718609d92df7e231b3ddec89fee81c021f1277bb0703c682881f118cfdd566d570b82c7456ef49e90b9ccb0f223de00dca056717d1f14b9da6a28b6713050c0f90277d13ae5b3dedbcc1f68ac60fe8c099843b70755bb9dd806f14b754b58743d5177412737264a89c328bedf58fcb7c1856d94f5446c2cf83e89e7d6bfaf10ec41e91d43da6a06f698baa9f158ded2a8dfd898b2cf818149ebe706f50303436f5869dcf0d4e00ada7b9c03f8cbf4cec4e9dcd5371862e935236c3a659125b709936539039a94aa6caa57e54b1eea8339a32d9510cd129bf27ca55171e34baaf6adb269ab0f59bb8fac976be4a236bec45b7b6c3b3a1a0a3edea8e6c1cab3b25c0d4bf1cca0df9f719be4935ea4d23e64b169d2af48dfd790b952c3c0a8ff00418bb1e4bd7fe1fd1c20b8778cb7fc9a07e30b15e529c43345f6f750c8b831396eeebbbc74dd0f80059446e5109d9173b0579b5886fd5cd45b59b730a25d94ccde2a7ded2a452a3d064b48c1d5d198b5c89feb0c634e859a75e4007e4851eab825f6f2e3309882d8b25ea413a33eb799a161f2457372116fed3e68693b926477d0993aa1080d9fedb8c138afee088823578b7548bed86a1cdaf7df11650d5be2e455b596612c3558a63561042f5f9e1185d5864c33c20da104b275880453720b7244e62030e4128b0e81dd6475d7d1db40f09e593d07f89f254c089e7ddbb2c7ecf7d83f14b9f236e1707123be21ee53ee0eadf28b84aac2f7989b9457008bd39884c73193e0a0740efbf9ccf294996fbb7d5c9744e3850879e354fc5ea56abf98bd2356dfe2a26be1b1bb9bbe08c6b87a7279b1330e2ac2b44cd088254ac458a0fad3c7effff2f6e3c5bbb7efcf7f7cd5ebf55c1001f4c6fca6902110d3d777dc5857f9e66c99c7bb2d6a767eb11eece55a83ace04a8bfbbe3d82bc95b7052dc9c209a4dbd7befe52fa1d9308ec0e28e654e532f6d55f8c80fc1a54d2a219bc8a63e2d5a0106ee53b56450dbd4373e5dfcf399a82e8e145fc514cfbb34a19b9621aa28e822308ef687eb8c51cc98dab048c22d0da58acc4565352086349fea8b8dd30ae48e2d3539ac6311ea662b4f0aa7c3c8ae6f11c88cca335fdd8946b4cbfd239aa07326685fe58ee54abbeb2fa682ebd96fe86294d2978b48c6a3ccada5e2bc2b3017eb351de23561b41d5da3ab1205439115c67c6b4b3863487481ba2800834d1440aa4778e12836252803f583eba12b2f2a8c21f003f5a3763ed38fe8ea98cff1a003c3b9662a3757846ae19cb509e530e56c626d492214bc75511e1b00f2d5fd63d713b01d2366c8ce1a01256a91e41db552a88db790102628941c731b666905ea040b9dc42b36392a58a220dcfd599831e5b7d8f4967794dbd3de13ce43abc3d06189f637cb01b4359b8beeec7b6637661317115e0824d1b99b5bf142cb7e9ef0ebb3e30d83762f3df35f92f3300752ea8761f12fde22ff25defb839ec975f73509ff045efacf772d7d8d5b74abfac7faab46516cdb2f5eebebff18748c97d5bf66f000000ffff010000ffff12f6eb7e6c360000")
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
Assets["index.html"] = bs
diff --git a/build.sh b/build.sh
index 09ef2aa455..cac937b1c9 100755
--- a/build.sh
+++ b/build.sh
@@ -3,7 +3,7 @@
export COPYFILE_DISABLE=true
distFiles=(README.md LICENSE) # apart from the binary itself
-version=$(git describe --always)
+version=$(git describe --always --dirty)
build() {
if command -v godep >/dev/null ; then
@@ -15,6 +15,7 @@ build() {
godep=
fi
${godep} go build -ldflags "-w -X main.Version $version" ./cmd/syncthing
+ ${godep} go build -ldflags "-w -X main.Version $version" ./cmd/stcli
}
prepare() {
@@ -26,9 +27,12 @@ test() {
}
sign() {
- id=BCE524C7
- if gpg --list-keys "$id" >/dev/null 2>&1 ; then
- gpg -ab -u "$id" "$1"
+ if git describe --exact-match 2>/dev/null >/dev/null ; then
+ # HEAD is a tag
+ id=BCE524C7
+ if gpg --list-keys "$id" >/dev/null 2>&1 ; then
+ gpg -ab -u "$id" "$1"
+ fi
fi
}
@@ -79,7 +83,7 @@ case "$1" in
test || exit 1
export GOARM=7
- for os in darwin-amd64 linux-amd64 linux-arm freebsd-amd64 ; do
+ for os in darwin-amd64 linux-amd64 linux-arm freebsd-amd64 windows-amd64 ; do
export GOOS=${os%-*}
export GOARCH=${os#*-}
diff --git a/cid/cid.go b/cid/cid.go
index 3a3727dc5f..8295a81ed1 100644
--- a/cid/cid.go
+++ b/cid/cid.go
@@ -1,18 +1,30 @@
// Package cid provides a manager for mappings between node ID:s and connection ID:s.
package cid
+import "sync"
+
type Map struct {
- toCid map[string]int
+ sync.Mutex
+ toCid map[string]uint
toName []string
}
+var (
+ LocalName = "<local>"
+ LocalID uint = 0
+)
+
func NewMap() *Map {
return &Map{
- toCid: make(map[string]int),
+ toCid: map[string]uint{"<local>": 0},
+ toName: []string{"<local>"},
}
}
-func (m *Map) Get(name string) int {
+func (m *Map) Get(name string) uint {
+ m.Lock()
+ defer m.Unlock()
+
cid, ok := m.toCid[name]
if ok {
return cid
@@ -22,22 +34,45 @@ func (m *Map) Get(name string) int {
for i, n := range m.toName {
if n == "" {
m.toName[i] = name
- m.toCid[name] = i
- return i
+ m.toCid[name] = uint(i)
+ return uint(i)
}
}
// Add it to the end since we didn't find a free slot
m.toName = append(m.toName, name)
- cid = len(m.toName) - 1
+ cid = uint(len(m.toName) - 1)
m.toCid[name] = cid
return cid
}
+func (m *Map) Name(cid uint) string {
+ m.Lock()
+ defer m.Unlock()
+
+ return m.toName[cid]
+}
+
+func (m *Map) Names() []string {
+ m.Lock()
+
+ var names []string
+ for _, name := range m.toName {
+ if name != "" {
+ names = append(names, name)
+ }
+ }
+
+ m.Unlock()
+ return names
+}
+
func (m *Map) Clear(name string) {
+ m.Lock()
cid, ok := m.toCid[name]
if ok {
m.toName[cid] = ""
delete(m.toCid, name)
}
+ m.Unlock()
}
diff --git a/cid/cid_test.go b/cid/cid_test.go
new file mode 100644
index 0000000000..37f64716d5
--- /dev/null
+++ b/cid/cid_test.go
@@ -0,0 +1,27 @@
+package cid
+
+import "testing"
+
+func TestGet(t *testing.T) {
+ m := NewMap()
+
+ if i := m.Get("foo"); i != 1 {
+ t.Errorf("Unexpected id %d != 1", i)
+ }
+ if i := m.Get("bar"); i != 2 {
+ t.Errorf("Unexpected id %d != 2", i)
+ }
+ if i := m.Get("foo"); i != 1 {
+ t.Errorf("Unexpected id %d != 1", i)
+ }
+ if i := m.Get("bar"); i != 2 {
+ t.Errorf("Unexpected id %d != 2", i)
+ }
+
+ if LocalID != 0 {
+ t.Error("LocalID should be 0")
+ }
+ if i := m.Get(LocalName); i != LocalID {
+ t.Errorf("Unexpected id %d != %c", i, LocalID)
+ }
+}
diff --git a/cmd/.gitignore b/cmd/.gitignore
index 3e1db14fd3..f80161a20f 100644
--- a/cmd/.gitignore
+++ b/cmd/.gitignore
@@ -1 +1,2 @@
!syncthing
+!stcli
diff --git a/cmd/stcli/logger.go b/cmd/stcli/logger.go
new file mode 100644
index 0000000000..a7883e866a
--- /dev/null
+++ b/cmd/stcli/logger.go
@@ -0,0 +1,72 @@
+package main
+
+import (
+ "fmt"
+ "log"
+ "os"
+)
+
+var logger *log.Logger
+
+func init() {
+ log.SetOutput(os.Stderr)
+ logger = log.New(os.Stderr, "", log.Flags())
+}
+
+func debugln(vals ...interface{}) {
+ s := fmt.Sprintln(vals...)
+ logger.Output(2, "DEBUG: "+s)
+}
+
+func debugf(format string, vals ...interface{}) {
+ s := fmt.Sprintf(format, vals...)
+ logger.Output(2, "DEBUG: "+s)
+}
+
+func infoln(vals ...interface{}) {
+ s := fmt.Sprintln(vals...)
+ logger.Output(2, "INFO: "+s)
+}
+
+func infof(format string, vals ...interface{}) {
+ s := fmt.Sprintf(format, vals...)
+ logger.Output(2, "INFO: "+s)
+}
+
+func okln(vals ...interface{}) {
+ s := fmt.Sprintln(vals...)
+ logger.Output(2, "OK: "+s)
+}
+
+func okf(format string, vals ...interface{}) {
+ s := fmt.Sprintf(format, vals...)
+ logger.Output(2, "OK: "+s)
+}
+
+func warnln(vals ...interface{}) {
+ s := fmt.Sprintln(vals...)
+ logger.Output(2, "WARNING: "+s)
+}
+
+func warnf(format string, vals ...interface{}) {
+ s := fmt.Sprintf(format, vals...)
+ logger.Output(2, "WARNING: "+s)
+}
+
+func fatalln(vals ...interface{}) {
+ s := fmt.Sprintln(vals...)
+ logger.Output(2, "FATAL: "+s)
+ os.Exit(3)
+}
+
+func fatalf(format string, vals ...interface{}) {
+ s := fmt.Sprintf(format, vals...)
+ logger.Output(2, "FATAL: "+s)
+ os.Exit(3)
+}