From 62d703f967e6bc62c0b275b85a5b452451a9eb21 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 5 Aug 2014 20:16:25 +0200 Subject: [PATCH] Show 100% complete status for nodes without any files to sync (fixes #453) --- auto/gui.files.go | 2 +- gui/app.js | 8 ++++++++ model/model.go | 16 ++++++++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/auto/gui.files.go b/auto/gui.files.go index 43569f5d..bd3839d9 100644 --- a/auto/gui.files.go +++ b/auto/gui.files.go @@ -28,7 +28,7 @@ func init() { bs, _ = ioutil.ReadAll(gr) Assets["angular.min.js"] = bs - bs, _ = hex.DecodeString("1f8b080000096e8800ffec7dff73db36b2f8effe2b107d729594c89493f43af789e3f4b54e72cfd734c9c471df9b71dd37940859ac2952e5173b9ec4fffbdb5d8024be5294e3e6ee669ea68d2562b1582c168bddc5029c4ed961b6becee3f365c9468763f678efd1b7ec1fe14536633f66f9390bd30820d2328f675599e5051b159cb372c9d9e1db371fde1ffd78f2e1edfb63b688133e0e7600dd0f49c2085dc1725ef0fc9247013b2938cb16502d2e589155f99cb3791671063fcfb34b9ea73c62b36b688cfd7cf461b728af138eb89278ced3029b0b4b3687d219678bac0292e29468787d74f8f2cdf14b6a3ed8d9993ef8bd48e2b464b33cbb82b69fb232aff804da4acb38ad78fd7b9d5405fe2f7eb30753a8799e64b33061f79fb24598140014a6e75512e6f23702ed0c2bf852002fe6e5707f67e732cc59719dcea15be9393ba86b04ab2caa123e1a3665c3093b1daec3621e26eb9ccf976550e6615a2461c98767e37d4254e5c92c04f4076c087c23fc4dfd003ab088cf478b0a1ec459ca46f79765b97e97679771c4f309bbdfe0ab9f8dd9a71d061f0d3088f822ac92b2083e16f9e23f7908cfde842b6af4bf770f8fdfbfdafd905df0141adf50f730cb2e625ed7d56a8aaa164101f0eeb80ccb78fe0a06ab789d61e32341247e80318bf8e353364c808dbbc3495350540b5110fc5e64e9909edf00d3f07f9d45659e2509201dbebce4697958e609305ee15931cfd630b0d4ad863ff43048c2a2a45ad09db44a12c1001c972c0589c25e9218b4cfb1c6d10b78be27bb4cd250cde7bc285ea508df341c856558b7879f78c146f7045ef5b142ce7dbe8acbd1f0e4e82d410dc7fb1a5443138a6f5b74b3a33521297ccef6cc5690a06091e52fc3f952112a8e0c3061f103bc2d32986149763e1a10d460c2e86f1047f5b7f21a992bbe538ff72d3c5aefac5a46851be5f7cd7edb35c7886173a7d4a984a7e7e592edb247676ded66a8ccaa40bd82b8e0e58778c5b3aa5478620d100a4f70cecb513d611fb2e194e82fbe2fe274ce0f86f0483439d6aa06523a468d9418e53ccfb37c44ff4299d2fb09fbebde9e7c70a3889b04dd286c3d656db1e814366502102177c8b824061a0e1e0def8e618ff62c8e6d494157eb56cb1dcae8b87edaad9054250edf936c1e2254cd461c6e5091972fa058289dfa2974e8ed4f9a2ec0a7b88684792916263972aac29b67ab75c2898e03f6e9665f2fc3d5c6f7fc28c51e690db6e529a7be157665e2153e3f3dd39ec362c9131b7c754d337638d49ea600ecc0b1ceb3329b67c9e112d60e302534599530395f677909ec0bedc644d93b606fccafbcb51d9d025b287d891db349add6e7392c7147e92293f5dc42f87030c5156f306ee4ad15102c28d48924169ef4bc1575d0e26c848f63920af8f38c200aa90ae1c9c387e65c44000027b8d3f84c9fefa8302ec3248e5e139a388df8c7b70ba265cc9e1fd8ab0975ab915d5ce705b0adff67390f2f0c2d6fe8939bb126a6f7b3743468268318df63c1a7813a955c4c42855fd784910a7358ecc681ce3eb14e62cf0c6dd5d99f9bc608d18493f3e88756fc1be861be1a82f9f282278a55030fa33897cf416bc7f9582d4555828538d5d4e76556cd975870b28ed07a144537261947730f11395f81bdeda4c32eaa8988b2ab34017bcd49082c743c8f8b8b861473f85a2b461d3052bb6064e71aeb5543c369fd48bc710a4b96f2d8a5ed9a2aa3e1ff4b797995e51734558763d43961321a2ec12ed59003648ba91bae585625f2c50d658a46cd07b9c26ecf087b692623b2a5d612605faf3fcdc2f94594676b18bb82ec7120e7825fcfb2308fa4b373b351d6a94368ce73a9737bf409e76524f42f94908da877475d118439876af7cc63b7986001f6864b6b3028b35e5d780dfa213942152726d417f703bc181894e57ba068d4d03656ac4c706b45534c598291f4aa20651e82ff2c9639f27aafc0e15c863917be3322635771b90ccc19410b94ca8d3788c361e423eec385252f92eec386a61a90101dbd9830b5370d67bbe4fd3d2894927f0de6fa3b4150d8139b7e27cdd8d91771212d995e14831472184ddb063aad3b006ec6d986360fb7689066fe86e63c73c607ae2d154d3be96c5d3c657b13ab042c7d5fd151fae375c98b0f5919264e80b755b901e28728825104f40d85213cd1e16e7acdee43325829d4e060acc953cdca0ddeae894dc1c9fb1fc0dc589768563a8c1f98ce470b5615e13967c28cc4456819166c06b6214b394c560eb3bac691c2148ff81cb579343131c164bf0ac1a32d3316161714e102eb23c7dfabf082b390cd97593ce701fbb122d51065e9b0a43a262aa832abce11c58a45558e44e1a2198709ba6b15b81b4546ca85978896c239a4592c44404409de9d88df71b688f3a2649771119701fbaf254f65744e60001db5c6b09f4d1006121b5c00b6ca48a9852946f472b6847f0a169e6713a44af6dec4f14705eb1d5a733b5a09ea0c22eb17a40a57806c5eadd0bf1754e1ac4fc2391f4d47df3f85ff7efb1c3cd8ffb578306e2bc1af5f0fe09fd1e96ffb670fc6c183fbe3cfbfc1bfd3091bdc7f3418db26f2bdb6b2cb20364800a2066d858301b89ee8c9816aba02dbf5211becafc28fbb204454f464efc1e36f1f3cf96e6fcf309619c750a463aa02410f15163c53b1ef3281eb01f9c47665fca0b950ddde486808ec65db938ee7b30ca6238f5ec1bf85ea2135b354d5f6a4b78d6502e841b62a60c83b8434ac24bdad53a867e9470708ca917cda11d620e639030b649f7c8fe4504488a718f13e797f84ab53968268884eb9fc3e3386a335a65a3fb4d44b93c71e0dfc68a13b955513e29458165d236946e3444865425ebf651e7a58589be837ee913dbe06df61a5b1d4cdca8200877d59a587106805c1effb2e2081dac94217eb04c9038b6d37dd3d35cc2ac17b73fdc11258630e54fa6d33adacf254e17ec78c681bc57941d8ff85a6476bfd7e8fa4d11c91340ebfb9f359a3db4c75cba7d8a0d55987949855944890f9b9e99ab5261e6d022ba5fb3b4e2c38c665862b1c4cc43985bef7dc543461a1f96a8d9b65b7e83ab20c6ba3440efea744736dd0058f9f7aa3cd4d949f3df8c18e3d3cf0720a4839f3a3456640e54777302681e82b063881a229a2f60c874b4128936ec2dab93ef18ec03f47f51e368e003af1450f1dacb80ebd15310a20d820c0cad61cd18dde1283b52384d96dc2db63603a7558b7b9226314946838d4d75946e21fd336b14f2b08d587d30e8cf5b757e93bb076785e5e43b5b14fccfde26d4b58995f7bb0d06e15385d01395840fecf2138f460ff8d608cffc61e085e1284ea4d01871c5e9c0985cc2b238754692d0b07aeb369cd4ff3b7ad81791bbf61f3b09c2fc1f1f2b1d6628a47b1d95d7000facc50fc38f72afa2dfeeda429b6b6002808d7679e897d926d6d9d6677a55f4f0435b73063280da197b200c0adf404ccc2c37adfe95e5cbc5cadcbebb7b3df81dfba633e36d480b9676533c0edd7bf8ec19203ed97b3834e08198d087ecfe274045ed0d04340bd35a5e3a2289c931c820f8a2c2f45a40dd68530e71ee4f5f613fefd395c1ba10ab4e7c1ebcbf29817c6e4131c0c604528462aaeb1233268daa4f5c7f2c3ec09a705216f157f341aeb88437a48b0564d9395a4f01b29731aaada86b8163c3291eff4511650dd3dc57acd9e296dbf6ca9078c2d5a6956b6cfbc535dd95851d209b4a96e786d8eb0abd00eae02ddd8d8c8814b9e1700be6def65354b0bf4e0b988dd6ddba0b6a9bc759b728b78db46f59d65b355999ad09188e1db9fb624438fa8cac1d4924db6140f530a0c887a8df434bfce8ec536894a81cb91c69ca26ce18c94802f33acd2882f30fe3a747bd7087191e2dedebecbd1b676aa84be8b53da3467f7b0092fe6a2ccd66b68d989b90642c7d7d102ed6f7979739884c557604d0cf2f227f025c24dc4dc8d9812ebe4de5e0fded4b4c82a50278e12ee1f1131f5862ebf4a4783fa98f6853d98d679bc0af3eb3e98e6619ade169563240c714042dff17cced312b725fe6c9978a486a96f36c983c8b3259f81f05b3b2a6eac9a34ace7b8480104782c4e91c3a54e343175012834ec9b7c258f689164a043a119b72e429304532c34d63a0c1b7d57a9f19b748bc60ac268b5b4688152897df38d27a4a00035a18c03e296dbb813d2945d0c7bee35d435a4d236ab7529b61538cf855b6689724b85fd7bf3d4562dbd186b4ffe8d8cf5eb02a41e5d984d6ca55821f053f3607cdcd5152d027a26311605d283ead265df7708859aa8f8cfea824204186e7fe9d4cbfeaefcc2370e43bd0fd052da6f47c0b0805df4fd99ec4962586b7ef1b7bd619c617989ded0ee87c11dbdbbd88315c69154475bf8d18b3829b96af522bd75b369cb4a26b0ee6bee227651e2ad13c8efc1e4f6f4b8590f3b3a2ab19dee9d7985419e9dd8280d727596a53d97e4c1c0b72237e30ccd7b2aab201d7dd425065c985951e61847fccebd686202d31b57c7cd2116fb6066b59131600a5ffa326524ed7aaa34ee64d126fef4614e6fcef0282e8f79899923859733d3299826940382397d98cf0175af5b0f53726bb596e12be53c1202bab35becccca164170f2fe651ace12caa71eb98a9bc4183c62e2c2f4f793a36e3200c0ccab947ce89b8a807b221e87b5082f7913527446344825e2a462ff387efb26c0935de979bcb8b6228e6a856c5d52bec2928e4f154fd9270c1595a000773f804c524eec7a9dc422f1784a87966e14f75ac402d659e10c994e90a00935e20a0bf43b55719b0092c2b8fe4124e2ba2b7e6c8f446f012faa1cfec9565c1cab9b8bfc527dcc9a3cff7bb570f13faa3029dc523eb1857bcc3e7fb6ba2f3edd28416227ba841b7a49d2e6c8133b5cf2f905c278b3c5b89c6f98231617f4dd67c53ae7696bbfbae7e9335ff67e57253273dd8948eaaefaad0842c5b13539bb8f3a83b12aa7eb8321ec2ac6b45a0ef531318e3712447b1b94436d30da1ef6e0a4e01f5e1f532043130059e0ef887d3c453fb7e7eec40fa044ae81e62b56eb4486a71992e47ac7d1862ef11eadabc87fd716895f6d5b12efa540df3dd9b0c7725ce641012ab31c0d27a8f8c3b5a2ac3e2a96dcc70054340617edf0bea5f4476367fcc0b9c80c30797fe00b3c927c74c43d95b307fac0ea1800e2435c26940bf8be7934f043ff984594cfd39c206394025e170703ad538e930bdba6f179962689d9710ec379224cd5e8c75731eefb5ef1d91a755e331f616ee26c54f45b3be58ce962cc2b71104ea201b30f491e5a5b3ddee96bcf521399e5afebb81d871d478ea97f052e4d761534e78f9456eaaf4633cd99459758779e701354d2bfbae8ca18bf5774fdf27942356f219e555df1ab4967d72e8a6dc17be76aff2e2a48e2149613cc6a46352d7d6fa5e37d76637a9e39f25956f218d2adb4939b9fcac9a61ef6a7eb28d4d6478c7a2a1647ffd17572460e0c4fba465be53918eab2c6fd807f84d5271a7dba99d4eeac4d0a3601ec7bf91196aa0e252fc18e79b210294d4610478be1d8fd6d09abe365bc10c90935a6e6b1968a60e041e09711e60204f74153bdcb8968cd79c621abd976075e566c476e34c6436b71f48772eaae5866574337ae30da80cc358a9f547ee169c5eb345c11fd18b5c312c023bbd06370cdd383aed175c37c7dde8ba3471bf96fb5686917d5903758e20e82b84d2b67264c4780ce195da9a78c6267abb34394f6501e2203c5a043595ddb93d39192212bb263fcbbfd22ebcd406d14f4e8ec1774d8ecb43d00b60decf0c73ba5a60ec31d622c22ca523e61f1fece9642d5842c1dbdb2a05af5e652795fea206017ec792bb244db73f39ac0761c9f57dc70823d8dcfd460bdaefa3bfcedba72dbe37d0b54526edb2af8d9709e5e9fde88c923d8a2c7ebaa588eec65d033c15da96b065cbf79d85768333c4857e3f2193bea5e8857f1f4d63bfaa9118f12ae03d49d93290603c3d43db790bcd460a3f3f286b4e7ce91da79bf10397a1c2649f738d4ea4319f576f446868a90826785fbb5fca026a85eb8cd40b4b23196d0533444baac2d1bbe903f0fd0e763cf1b61adeffdd8281df38487f9cb3a3bb7d3ac512f13d1e83cd5a956ee3822b2365af4546f4a94780caf451e831d9c5cdbc35a94b94aaaebba91bec2db46db3b45b820ab17fe6d8e6dce95ec4f63070dcbc6ce331172e4008f27aab3cefa084c0da767cf7a7d114c92ddce179135b4689bd71751ea80b8247462bc1eb34fb675ab827bf3717d99a4bea64ed3265fc2ba80cc30291da8e42631dada4ab6851320c0ed1471fca88871ffdd3a7ee4229520f18a39a5a50e5fdfaefb13e76ba8f1b09bb677611eae8ae002805dd2b7097b77f9e7cfecafb7f54351407b7a21d8ec1d7821e0b55962bf51de3f6932f514a4f7f6ced9d7ef321a2b9d7d165770adb30d06b4468e65404b044e71b1a01a33ebf4cc2ed327b06213d873b8d1f02253025d2327169751ec6e2eadb5c58168cb6d87289d1006c127a1659e4a42acfc7ec7ac93577138c9d8d7cde106c6a12f6c2340c06a1ac5eec3b0defe153887f6cd1643a13500c6ae4de5a84e10c3509ed46d2944bd6023340e3ae91c32b9e1e8698f0a3fe91ace95bc66d473a1b79d88f6ac08d61192287ff91c09f59c8b84762dcddbbbc378c14e61cce75a422cbb16ac0edf34f3aeb1986f629af28847337d1b9ba636ca6456d4484926198f3d7153818e7c3287e14c8514361c4c98679f4b8c62b726efa5b6ee2698a45fab23a4c5b16a6ab96a5f495c78f9c3bba39fe8ac7dcba7b92e2a68b33650799846d9ea98d24b464ff626ecc96305b5be98d23ef7c9fb8daba9ff961ab15f8fbb6fafc3fc1caf8fc15b56709722c1df60f3f27a45153908f5cec5664ed44250796e51b3448a2ebaf9b2dea8dbfd774518c6a0df70b18fe6cd8dafa725ed538a73600e1384ee59e374466c7bb382303852780653c4292e0f19dcc135085a57ba0e491a9d759bf766366373efa1c64eba12dc509e8b1762561fb06ff7feff77fb46599cc3729de538631e7df7e46fdf1a4b36610c5e25e179c1be01fc02d7c3b6de784c3686a3c073cc42dc7d68ad6e766312a586df8fb41fc69638817413b1e2c6c50d4b71937a8ea95fa6636206d460dae771d47d40c419521888cb6da63586db09aa37ca4ee70a469b373fc35956f91d789c9904d16beb098bde9bd7c0766f9aebc0de2d4af5ae4a583a8ed292e797408dde5db1fb8fdbff14b86e9a5602aca370c26635254a0a6c48c9a8e280559b048beeb504983901cc446389e699041fbbe44ad5c5f291acf65c56932cd851b00a3f82f05a117103afa8d76216559f3755813b0a6fc8ecf2f0260c5a75824d3ba75777eb2d82e72a029b063c919dd47829495d09c724ae93d62a11abd3bc367f25195258ea5c72bb413263566a8b8962911a1b5b2bb5b144589c2bdcac1aabbd4e84eda8b054a722d1a980953d5e61762448f284a595464c149fc7653141a0daed92970adb27be24fabd9a16fa2310b003f530167dc503d6f4259c51d363bc71a22979b4575bc7d832d36fb7001ad9aec4ac774d90a9f158b5d7129e826c61ad1d41f64cd0467f3e7f664fe43a46b9c1552936ed0778fb0bbf3aaea38f574b50fe6c24caeb08ee33065fc43c6b19226ad5c40b4a46e3a0cc2439444950e0ab31468f151d299b7e7820314810e8b9e002d8feb240b43e61d83360894653e35f6873418294d9ebec8ae787b008a0425339a65fd890cd7e57e5216df4028926fe44c154a094b614fb4aa341e8575d0695eba726ec2a6c6fe2a38b924496165d9f59887780f08ff0139f8359b65ae35502459520c47918a7cabdfa78ef73de95348ed7fbb303fd92bd06afee0911e8338dbafa2329c468779b54466d8bde0052ac3ddeb0e6b768da3757a81450efdc4117ecbeec678049ebd7a3864dc835c7350bb29cd1f5ac85b34dfc509bb6b5dc8e6afbad5e2eebf177f1bc6d15f7875a7c9206f843972d2a25cd6868c3a45b9c73dac8c2c5fb9ee4a1e1c4caa7db8e9bc1b66dd9bc81c54e19a8f9ed7d2148b39d81b43476ca8dfad202b91b364c43000df55715d42c3006898de2748d738cce783b66331583e278157fe4d1a85935b45aad4166bc45a1266816a7781eb23f3da669430f69ed69cc1f9f95bdc7bce7b70596e760a83dfe963d50ff58b150829c1e38404dd1e8c1a5c763bc2174c8fe1e6f435a1f9abe80989ffb11d349c51734ff93bb79f50c778e2f8aaae501eb0c37c9d98ae3ab9dfe85e48c0eb82b7f3ab869827e899c6d43591f92be44cc7ad1d249c417b47ef1270819389a79794b19d388771e2bf4341a2657e175f1a65acd78fe55e4db7923844a7e2f36bd0316df31b92e62d5d3b274bc20ccc9c2977ca6bcb3e9e9afd35f7f3d9b9a716e010b6e007d692cfb03f6c4c319a5f74eee0c822098622845201456bc8a7cf7f15886f2a783cd4b27d8ea686fff7b72d17b067b131309cda9c6b547679b78850932e997cd4c47f84b80b65790ff657a3ec18b707cd4441467882ff9689851385cec6c77d1a59221de4ef8940d0f95fd47d9b87cfd616b23e33b6ee649155925149a327729e5a929c07d20bf2a4ddc2868f96a8dd630003e13c28371a883011ab503969eef52f0f060a007fd4f254e7c1dc1e0f9b329d57c5ebf55a68b4d551aff51d1c695c2a42e1efd514165a02e3dff1929517a91c4e9c5d31607b16102f6f60a0cf5b2ccd18d2cf3c4144a7c16dc07692b785e04555a2ce385723a080384bf84897be39b2e06eab355567fc46b02403d56498497ff930d0ddc76020bca80b3bf20545c5e1bdc326e946d06b38d5aabdb6f4d47bcf706cbf705d06b4a6893a9606192f330babe1579e43dfae9db4c031e48228477ca1d87234d32d6f0c77078adfcb44e71a601c57067acbeb362a4bdb5f2ff845a1f369d67dd52eda6c07d903e2594dfc7d1c1f061db63c75e0628deb5af7335471046e4707641f6eaa16f62f4eaea97f2b169c459b2f9b510f8b9d31943bb3b5b2f902f87f6927592275042f88265b94aee7c0d2df1802534f11f467690780194a3209ee3e125ebf13cc90a171edae1379edfd46f66430efe2f000000ffff010000ffff6d8a42aaf1790000") + bs, _ = hex.DecodeString("1f8b080000096e8800ffec7d7b73db4692f8fffa1463febc216953a06c6753fbb32ce712d9ded3c6b15d9695bb2a45b90289a1880804183c24ab6c7df7ebee1900f3044159f1ee561d2bb1484c4f4f774f4f4f77cf03d3293bccd6d7797cbe2cd9e870cc1eef3dfa96fd23bcc866ecc72c3f67611a01445ae6f1ac2ab3bc60a38273562e393b7cfbe6c3fba31f4f3ebc7d7fcc1671c2c7c10ea0fb214918a12b58ce0b9e5ff22860270567d902aac5052bb22a9f7336cf22cee0e77976c9f394476c760d8db19f8f3eec16e575c2115712cf795a607361c9e6503ae36c915540529c120daf8f0e5fbe397e49cd073b3bd307bf17499c966c966757d0f65356e6159f405b6919a715af7faf93aac0ffc56ff6600a35cf936c1626ecfe53b608930280c2f4bc4ac25cfe46a09d61055f0a90c5bc1ceeefec5c86392baed339b0959eb383ba46b0caa22ae1a36153369cb0d3e13a2ce661b2cef97c5906651ea64512967c7836de2744559ecc42407fc0862037c2dfd40f8081457c3e5a54f020ce5236babf2ccbf5bb3cbb8c239e4fd8fd065ffd6ccc3eed30f8688041c41761959445f0b1c817ffc94378f6265c51a3ffbd7b78fcfed5ee87ec82a7d0f886ba87597611f3baae565354b5080a4076c76558c6f357d059c5eb0c1b1f0922f1038259c41f9fb2610262dc1d4e9a82a25a8882e0f7224b87f4fc068486ffeb222af32c4900e9f0e5254fcbc3324f40f08acc8a79b6868e25b61af9d0c320098b926a013b6995244200d82f590a1a855c921ab4cfb1c6d10b78be2759266da8e6735e14af52846f1a8ec232acdbc34fbc60a37b02affa5821e73e5fc5e5687872f496a086e37d0daaa109d5b72dbad9d19a90143e677b662b4850b0c8f297e17ca92815470198b0f801d916198cb0243b1f0d086a3061f43788a3fa5b798dc215df89e37d0b8fc69d55cba870a3fcbed96f5973f41836774a4c253c3d2f976c973d3a6b6b375d655605ea15c4052f3fc42b9e55a52213ab83507982735e8eea01fb900da7447ff17d11a7737e308447a2c9b1563590da316ab4c428e7799ee523fa17ca14ee27ecaf7b7bf2c18da26e1274a3b2f5d4b5c5a253d994014084dca1e0921868387834bc3b813ddab324b625055dad5b2d7718a3e3fa69b741528d387c4fb2798850b518b1bbc1445ebe80626174eaa7c0d0db9f345b804f710e09f3524c4cb2e7548337cf56eb84131d07ecd3cdbe5e86b38deff9518a1c690db6e52927de0abb32c90a9f9f9e69cf61b2e4890dbebaa6113b1c6a4f530076e058e75999cdb3e470097307b8129aae4a989cafb3bc04f1857663a2ec1d8837e657deda0ea6c0174a5f226336a9d5fa3c8729ee285d64b29e5b091f0ea638e30dc68dbeb50a8205853a90c4c4939eb7aa0e569c8df0714c5a017f9e1144214d213c79f8d01c8b0800e004771a9fe9e31d0dc66598c4d16b4213a711fff87641b48cd9f3037b3621b61addc5795e00dbf67f96f3f0c2b0f2863db9196b6a7a3f4b4783663088fe3d16721aa843c9252434f8754de8a93087c96e1ce8e213f324726658ab4e7e6e1a2744534ecea31f5af56fa087f96a08eecb0b9e285e0d3c8ce25c3e07ab1de763b5144d0916e250539f9759355f62c1c93a42ef5114dd98641ccd3d44e47c05feb6930ebba82622caaed204fc35272130d1f13c2e2e1a52ccee6bbd18b5c3c8ec82939d6ba2571d0da7f723f1c6294c59ca6397b56baa8c86ff2fe5e555965fd0501d8ed1e684c968b804bf54430e902da66eb862599528173794a91ab51ce40cbbbd20eca9999cc8965a4b817d5c7f9a85f38b28cfd6d07705f9e340ce05bf9e65611ec960e766a3ae1343e8ce7369737bf084e33212f6174ac847d4d9516704e1cea1d93df3f82d265880dc70e90d0665d68b85d7601f9223347162407d311f10c540a72cdf0345a386b6b1e26542582b9a62ca148ca4570519f310e26731cd51d47b0501e732ccb9889d1119bb8acb65608e089aa05469bc411c0e271f711f2e2c7d91741f3634d58084e8e8c584a9dc3492edd2f7f760504afe3584eb6782a090139b7e27cdc8ec8bb8909e4c2f8a410b39f4a6ed039dd60c409871b6a1cdc32d1aa491bfa139cf98f1816b5345d34e3a5b174fd9dec42a014fdf577494fe785df2e24356868913e06d556e80f8218aa017017d4361084f74b89b7d377b75c76fe6ee7f4a4100040a5ed41d86e3907c61ca6238faccec2ecd810edeaea9078293f73f8027b32ed16375f85560298e16ac2ac273ce84878af3db322cd80cdc4e9672b0031c0c468d2305eb11f1394e14d1c4c40476e42a8460b9cc58585c50f20c1c9b1c7fafc20bce42365f66f19c07ecc78aac4e94a5c392ea98a8a0caac3a47142b1655391285f3711c2618095610c91419d92d5e225aca1491d1b210011125048e2235c8d922ce8b925dc6455c06ecbf963c95893f8101ccdf1a338a364198a36c7001d82a237b19a6982cccd912fe2958789e4d902ac9bd89e38f0aa652741477b412344744d62f48154e2ed9bc5a61ea405085062509e77c341d7dff14fefbed73f060ffd7e2c1b8ad04bf7e3d807f46a7bfed9f3d18070fee8f3fff06ff4e276c70ffd1606c7bdff7daca2e5fdb2001881ab4150e0610d562900856ef0adce2876cb0bf0a3fee821251d193bd078fbf7df0e4bbbd3dc30f671cb39c0e2b00043d5444f04cc5becb04ae07146edb95f1839e48757bffa321b057d840d3079f65301c79f40afe2dd4e0ab19a5ea444253823103013d2856050c6587908603a6b7750af52cd3eb00413d924f3b3226243c67ce825c9fef911c4a36f11493e927ef8f70e2cb52500dc1942ba434d3435a63aa63455e84f4a6ecdec08f961554453521498919d7d59366a24f646b269450b03c4f8f086befffc6ddb3c7d71096ac3491ba455910e0b0afa8f4ec044d30f8dd391b09d44e11ba4427481e5862bbe9e6d4f0d884eccdf9074b608e3950e9b73dc0b2ca5345fa1d23a26d14c70561ff171a1ead1bf03d92466344d238fce6ce478dee8e350e08366831ebd012b38a9264323f375da3d6c4a30d60a5747fc78905fb183c224c224dd89cb2ea7b6e2a9a8cd37cb5c675b85bb08e22c3daa89103e1880dbae0f153afe1b989f28b073fc8d8c303afa48094333f5a1406547e74077d12085e31770a144d11b5a73b5c0642197413d68ef589b707fe39a6f7b08931303f50f4b0c14a54d2db10a302820f02a26cdd11dde92d310f3c4298dd26733e06a113c3bacf1519bda024daa1be2e3252ff9856a07d5641983e1c76e0acbfbd4adf81b7c3f3f21aaa8d7d6aee576f5bc3cafcda838516c220e209287603f27f0ecb6500fedf08faf86fec81902541a8811a48c811209a5028bc32726895d6b2880d3b9bd642407fdb1a98b7f11b360fcbf912022f9f682da1780c9bcd8203d0e786e2c7b90cd26ff26f074db1b50740f9bd3ee34c2cc16cebeb340b37fd3811d4dcc28da11d0ebd8c05006e652760141ed64b5af7e2e2e56a5d5ebf9dfd0ef2d603f3b16106cce5305b00eeb8fe750c9e1c58bf9c1d7442c84447f07b16a7238882861e02ea552f1d1725f89ce4a4dba5fe3446b429a44dffb97328f8f1e651a8b38de966dc416f91e5a52011880873ee1146bd12877f7f0ed7466a05e30f8852b33ce685d198e8f10066b062a4e21a3b2465fad0f5c78a1b6d03a1e5636f958a351aeb48c97a48b066795394344135a3a2431fe4de002dd96522dfe963dca0badb24f41aed535a89dad26e19abd5d20d6e9f794d93b2c6a4ecacd04c9311653a32d0c29ab90a74e768a3042e795e00f8b6dccb6a96d5ea2173916bdcb6416d7d7deb36e56af9b68dea8bec66ab729746c79e14df52bda5197a065876a6b6ef664bf530b5c080a8e7744ff3ebec58ac18a914b8027fdc5e952d9c991d88bd86551af105e68b87ee6c00425ca4b8ccb9ef4a0c588b76c2dec529ed1f60f7b0092fe6a2ccd66b68d989b906c240ddd1022df57965739884c557104d0cfaf227c825c2f5d4dc8d98f618ca65ce1eb2a9699155a04e1c25dcdf2362e80d5d71a08e06ed312d917b30adf37815e6d77d30cdc334bd2d2a474f18ea8084bee3f99ca7252ea3fcd93af1484dabdf6cd207b1e598621cc26fad00b9b16adab09ee3240510106139550ea73ad1c4d405a0d0b06fca9522b84592810d8566dcb6085d12dc6da289d6e1d8e8ab604d9c677899a600b45a5ed7f49b6f36fbaf4deae580a4e576ee84366517c39e6b23750d69b4cd6a5d866d05c17ee1d659a2dc3261ffde32b54d4b2fc1da837fa360fdb600a9c7906b935829b709f2d4222e9f7475438b809e418c45818cf8ba6cd9f71d4aa1eed9fc67b1a010018edb5f3aedb29f955ff8c66ea8d72d5a4afbad60181eb08bbe3f533c490c73cd2ffeb637f4334c2fd11b5aad31a4a3b38b1cac30efa5260664dc1f272557bd5ea4b76e366d45c904d67d2d5c441625de7a2ffd3d18dc1e8e9bf9b0835189ed74efccab0cf218c9466d90b3b32ced39250f06be19b9e96768de535905e9e051d718086166459963def33bf7a4897bb9deb81837bb58acdb99d54646872972e92b9491f4eba9d2b853449be4d34738bd25c3a3b83ce625ee7429bc92994ec135a13d2bb8bd11f79f40ddeb36c294d25aad65ba4d399a8580eedd38f626d3164170f2fe651ace12da5a3e7215371b79f0b48d0bd3df4f8ebac90000738ba99443dfad13b886e309588bf0923729506746834c220e2af68fe3b76f023ce4969ec78b6b2b43aa56c8d625edaf58d249b2e229fb84a9a2120ce0ee07d049da1ebc5e27b1d8833da5f35b374a782d7201ebac70a6782748d0841a71a505fa1d30b94d0249115cff241249dd95efb67ba2b78217550eff642b2e4e18cec5565bbdcf9a230ff76ae5e27f546152b8b57c622bf7987dfe6cb12f3edd28416327ba861b7649d2e6d8d776b8e4f30b84f1ee6ee372bce19eb6b8a0ef3e2fd6394e5bffd53d4e9ff90e3274552237d7bd714add05702b82d0706c4dceeea3ce64ac2ae9fa8c0cbb8a71873187fab8918f371a446b31b49ddc10b4ddedc149c13fbc3ea64486a600b2c0cf887d52473fc2e866e2073022d740f315ab6d22c3831d4972bde36843d7788fd555f4dfb926d132eb47a06bbc97027db567c39ad07199070598cc72349ca0e10fd78ab1faa878721f0330d1985cb4d3fb96d11f8d9df903e72433c0730c035fe291f4a323efa91cc3d03b56c700101fe232a1bd8bef9b47033ff48f5944fb8f9ac3748c76c3d7c5c14063ca718863db6d879ea94962761c49711e8e532dfaf1558cebd4577cb6469bd78c47189b381a15fbd60e3963b818e34a9c099468c0ed439287d6528f77f8daa3d44466c5eb3a6ec7b9cf9163e85f4148935d05cd512ca595faabd14c737cd3a5d69d87fd0495f4afaeba32c7ef555dbf7e9e50cd5ba8675557fc6adad9b58a627bf0deb1da9f4505499cc27482bbb0d14ccbd85b61bccf6a4ccfe3573ecf4a9ec8ba957572cb5339e4d5c3ff749d0adbfab4554fc3e2e01f432767e6c088a46bb4559e83a32e6bdc0ff847987da2d1a79b491dcedaa4601320be971f61aaea30f212ec98270bb105cb48e268391c9bdf96b03a5fc60bb199a2c6d43cd6b64e187810f865847b0182fb60a9dee544b4163c6397d562bb83282bb633379ae0a1b538fa433980582cb3aba11b57186d40e6eac54faabcf0e0e6751aae887eccda6109e0912cf4e85cf320a5ab77dd305f5ff6e214d646f95b2d5ad64575e40d91b893206ed7cab973a72341e7ccaed44346f1b3d5d1214a7b180fb103c5a043995ddb43e491b2a357ec8ef1aff68b5d7a066aa3a007b35fc0b0c9b4dd01b60fec88c73bb5a64ec31d622e22ca523e61f1fece964ad5a42c1d5c5950ad797399bc2f0d1090057bdc8a5daded15029ac276dc24a084e1047b1a9fa9c97addf477c4db75e596e37d0b54526efb2af8d970b5803ebc119347b105c7ebaa588eec69d033c05d5bd70cb87ee3b0afd26678f0afc6e57376d4b510afe1e96d77f4532e1e235c27a83b07530c0e86697b6ea179a92146e73d1669cf95239579bf1239380e93a4bb1f6af3a1f47adb7b23c34448c5b3d2fddafea026a95eb8dd40f4b23197d05335c4f65e5b377c297f1e60ccc79e37ca5a5f81b2513be6090ff397f56ee24eb746bd5745a3f354a75ab9ee89c8dae8d153bd2951e271bc16790c7e70726d776b51e62aa9ae9b57fa2a6f9b6def54e182bc5ef8b739663a57767f1a2b685836769ee1903d07783c599d75d647616a387df7ac3716c14db2dbc522b286966df3c6224a1d5097840ecfd77df6c9f66e5570ef7e5cdf4e525f53a7a9b23ddab88bcd70291da8e42231fadaca6e0b274080cb29e2b85411e3fabb755cca452a41e26d7b4a4b1db1be5df727ced750e361376defc23c5c15c10500bbb46f13f6eef2cf9fd95f6f1b87a282f68c42b0d93b8842206ab3d47ea3be7fd274ea2968efed83b3afcf323a2b9d3c8bdbc8d6d906075a23c772a02502a7ba58508d9b757a6697e90358f109ec31dc5878b15302432327169753ec6e2eadadc58168cbed87284c0887e093b0324f2521d6fe7ec7a893b79238c9d8d7dde106c6612f6c2740c06a16c5e661582fff0a9c43fb64c850580d80b16b53399a13c43094278b5b0ad12e388e9ae822d125644ac3c1698f0a3fe916ceb579cda8e7426f0711ed5911ac233451fef20512ea391709ed9a9ab70f87f1aea1c218cfb586587e2d781dbe61e69d6371bf89e9ca231ecdf56d7c9ada2993bba246ca6692f1d8933715e828267338ce544869c3c18479d6b9442f765bf25e66eb6e9249fa0d43425b1cb3a6b657ed2ba90b2f7f7877f413dd0dd0ca69aeab0afaac0d541ea651b63aa6ed25a3277b13f6e4b1825a9f4c699dfbe4fdc6d9d47fab8e58afc7d5b7d7617e8ed7dde0ad30b84a91e06ff079793da38a3d08f5cac56649d44a50792e94b3548a2ee6f9326ed4e5febb220c73d06fb85847f3ee8daf8725ad538a73600e1784ae9ce374466c7bb7823038b6f00ca688535c7632b8836b1b3456ac43437e66ddeebdb99bb1b902521327dd8e6e18cfc50b31aa0fd8b77bffffbb7da32cce61bace721c318fbe7bf2b76f8d299b3006af92f0bc60df007e81eb615b6f3c261fc351e0396621ae81b46637bb318952c3ef47da0f634b9c40ba895871f9e486a9b8d97a8e5bbfccc0c44ca8c1b0cfe3a8fb808833a5301097f14c6b0cb753546f969dce158c362f7e86b3acf207f0383209a2d7d21316bd376fc4ed5e34d781bd4b94eab59d30751ca525cf2f811a9d5db1fa8fcbff94b86e9a5612aca370c2663525ca16d89036a38a0356ed26580caf25c0cc09606e3496689e49f0b14baf545b2c1fc96acf653529821d05ab882308af951137f08a7a2d6651f5795315a4a3c886dc2e8f6cc2a03527d8b4737875b7de2278ae22b069c013d9498d9736a92be998c475d25a2562759ad7eeaf24432a4bbd97dc6e90dc9895da62a278a4c6c2d64a6d2c111ee70a17abc62ad789f01d1591ea54243a1530b3c72bdc1d099a3c6169a51113c5e771594c10a80ebbe4fdcaf6892f897eafa685fe0804ec403d8c455ff180357d0967d4f4186fc8684a1eedd5de31b6ccf4db388046b62b31ebac09323519abfe5ac253d02dacb523c89e09dae8cfe7cfec899cc7686f70558a45fb01de56c3af8eebece3d5128c3f1b89f23a83fb8cc11731ce5a81885a35f18292d1382833490e511214f89690d163c546caa61f1e480c120438175200df5f1688d6270c390391683435f1853616244899bdceae787e0893001a345562fa0513d9ec77551fd2c62e906ae24f544c054a694bf1af341a847dd57550b92e6bc2aec2f6e640bad849ecd2a29b440bf13a14fe117ee27370cb566bbc4aa0a81284380fe35479c5005e819d776d1ac7371db003fd52c006af1e0911e8338dbafa2329c46c77bba98cda16dc0052ac3dde30e7b768da9778a8141077eea40bb22ff90c70d3faf5a811134acd71cd822c6774536de16c133fd4a6ed2db7bdda7eaba7cbbaff5d326f5bc5f5a1169fa401fed0e5904a49d31b5a37e91ee79c16b270f2be27656804b1f2e9b6fd66886d5b316f10b153076a797bdf8dd22c67202d8d9f72a3bebf41ae860dd3104043fdad0db5088c4e62a3385de318a333de8ed14cc560385ec51f79346a660dad56eb90192f94a8099ac5299e87ec4f8fe9dad0439a7b1af7c7e765ef31eff96d81e539386a8fbf650fd43f562e9420a7070e5053357a48e9f1186f341db2bfc7db90d687a62f20e6e77ec47452f105cdffe46e5e3dc39de33bb36a7dc03ac34d7ab6e2f896ab7f213da303eeca9f0e699aa05fa267db50d687a42f51b35eb47412f105ad5ffc094a0681665ede52c734e29dc70a3d8d86c955785dbca956339e7f15fd76de08a192df4b4cef40c4774cae8b58f5b42c1d2f0873f2f0a59c69dfd9f4f4d7e9afbf9e4dcd3cb780853080be349efd017be2918cc2bd533a832008a6984a11088517af22df7d3c96a9fce960f3d409be3afadbff9e52f49ec1de24444273aa49edd1d92659e10699f4cb46a623fd2540db2bd3ff323d9fe045383e6a22ca33c4977c34cc281d2e56b6bbe852c9102f6a7cca8687cafaa36c5cbe09b2f591f1753ff3a48aac124a4d99ab94f2d414e03e905f95266e14b47cb5466f18009f09e5c13cd4c1009dda014bcf7729797830d093fea71227bebb60f0fcd9946a3eaf5fb0d325a62a8dffa868e14a1152978cfea8a03250979eff8c94285c24717af1b4c541629880bfbd0247bd2c730c23cb3c3195129f05f741db0a9e17419516cb78a19c0ec204e12f61e25ef8a68b81fa2c95d51ff15a03308f5512e1cb0ac88706693b81056520d95f102a2eaf0d691937e0369dd966add5e5b78611ef3dc7f2fd06f4c6165a642a5898e43c8cae6f451e458f7efa36d380079208e19d4ac71148938e35f231025e6b7f5aa73a538762ba3356dfb131d25ee0f97f4aad779b2eb36ead7653e03e489f12caefe3e860f8b0e5d8b196018677ed63ae9608c2883d9c5d90bd38f40d8c5eac7ea91c9b469c259b5f63819f3b1d31b4bab3f504f972684f5927790225842f5896abe4cee7d0120f584213ff61ec0e12efc27214c4733cbc643d9e2759e1c2432bfcc6f39bfa257528c1ff050000ffff010000ffff9c8eb9b5fc7a0000") gr, _ = gzip.NewReader(bytes.NewBuffer(bs)) bs, _ = ioutil.ReadAll(gr) Assets["app.js"] = bs diff --git a/gui/app.js b/gui/app.js index 53fbceea..bd7881ef 100644 --- a/gui/app.js +++ b/gui/app.js @@ -168,6 +168,9 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca OutBytesTotal: 0, Address: arg.data.addr, }; + $scope.completion[arg.data.id] = { + _total: 100, + }; } }); @@ -284,6 +287,11 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca $scope.config.Options.ListenStr = $scope.config.Options.ListenAddress.join(', '); $scope.nodes = $scope.config.Nodes; + $scope.nodes.forEach(function (nodeCfg) { + $scope.completion[nodeCfg.NodeID] = { + _total: 100, + }; + }); $scope.nodes.sort(nodeCompare); $scope.repos = repoMap($scope.config.Repositories); diff --git a/model/model.go b/model/model.go index a7ea0700..a1e38194 100644 --- a/model/model.go +++ b/model/model.go @@ -199,7 +199,15 @@ func (m *Model) ConnectionStats() map[string]ConnectionInfo { // Returns the completion status, in percent, for the given node and repo. func (m *Model) Completion(node protocol.NodeID, repo string) float64 { var tot int64 - m.repoFiles[repo].WithGlobal(func(f protocol.FileInfo) bool { + + m.rmut.RLock() + rf, ok := m.repoFiles[repo] + m.rmut.RUnlock() + if !ok { + return 0 // Repo doesn't exist, so we hardly have any of it + } + + rf.WithGlobal(func(f protocol.FileInfo) bool { if !protocol.IsDeleted(f.Flags) { var size int64 if protocol.IsDirectory(f.Flags) { @@ -212,8 +220,12 @@ func (m *Model) Completion(node protocol.NodeID, repo string) float64 { return true }) + if tot == 0 { + return 100 // Repo is empty, so we have all of it + } + var need int64 - m.repoFiles[repo].WithNeed(node, func(f protocol.FileInfo) bool { + rf.WithNeed(node, func(f protocol.FileInfo) bool { if !protocol.IsDeleted(f.Flags) { var size int64 if protocol.IsDirectory(f.Flags) {