Archived
Merge pull request #1959 from AudriusButkevicius/lastfile
Add label next to "Last file received" (fixes #1952)
This commit is contained in:
commit
4beb42bf45
6 files changed
+107
-36
No files matched your search
+3
-1
@@ -271,10 +271,12 @@
|
||||
<th><span class="glyphicon glyphicon-share-alt"></span> <span translate>Shared With</span></th>
|
||||
<td class="text-right">{{sharesFolder(folder)}}</td>
|
||||
</tr>
|
||||
<tr ng-if="!folder.readOnly && folderStats[folder.id].lastFile">
|
||||
<tr ng-if="!folder.readOnly && folderStats[folder.id].lastFile && folderStats[folder.id].lastFile.filename">
|
||||
<th><span class="glyphicon glyphicon-transfer"></span> <span translate>Last File Received</span></th>
|
||||
<td class="text-right">
|
||||
<span title="{{folderStats[folder.id].lastFile.filename}} @ {{folderStats[folder.id].lastFile.at | date:'yyyy-MM-dd HH:mm:ss'}}">
|
||||
<span translate ng-if="!folderStats[folder.id].lastFile.deleted">Updated</span>
|
||||
<span translate ng-if="folderStats[folder.id].lastFile.deleted">Deleted</span>
|
||||
{{folderStats[folder.id].lastFile.filename | basename}}
|
||||
</span>
|
||||
</td>
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
AssetsBuildDate = "Mon, 15 Jun 2015 21:12:39 GMT"
|
||||
AssetsBuildDate = "Tue, 16 Jun 2015 10:32:45 GMT"
|
||||
)
|
||||
|
||||
func Assets() map[string][]byte {
|
||||
@@ -48,7 +48,7 @@ func Assets() map[string][]byte {
|
||||
assets["assets/lang/lang-zh-TW.json"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/8R7W3MbR3b/+36KKVWp/mSVlv/NJt4HP8QlW7ZX5dUlppWtpFSVGmIa5ETADHZmIJqrYgqUxDtBSDZBiRQtXkRSECneJEukSIKqykdJMBc8+SvknD49Mz0DkHYcO9kHLzV9uvv06XP5nXMad36jwP/OXVQM1qs6+m2mGMV8D7MUM6to6oCtaCazjf/nKHn1FlNsZtis69yHyrnGQcktTQavlvz5++7qC6960DhYbxyU3Qdj/oOR/yzdPXchXrkfZv+raSm3mWXrpgH/GlAM01F6mJIx8wXYtyfHlH7d6VMKFrutm0U7pLX5bv/zRUJurl9WvmADfE34szn6sPlwNxrsMYsODjUfLXizx9HnjINr4ID3bblRX4gGNA0/uitP3Ykl6aNyCbbPsHgsePadX9+WKT4zcxqzJIrXo97snLt6IhPhmbOc8CO++ewuEEeUH0mkFrM5f4162f2ulBpg7YZyOeWS6qicg+Fa816N1pXGzX7lomEaA3kU5A1b7WXKl6xgWo5u9H5E84aC2p479d59UAYtaNTf+zO4TFCbcJ88dZf2fjhejNcr9Kk9zNEzfObWI2+n3FwacQ8rEYWhsK8dZhlqDu8zrxqa0gf/yTFbcfpYeJWweZdy2YEh+GwqFsuboLNIkNXh+rOWmef/sgeMDNOE+EiHftUNolOcIjF+7NNFFc8fUDSuPTYwaWT13qIFu4C6q4aiG45lasUMWCfRgLbDPYIBqJoGVMCu06fb4SAcoJ/lcmSuR0eNetVdqLnHVXd4LSgNk05646WgtgV/AFf0xd0d9RbugXk36m+Exo2+9rZWUzpcdMw8mFxGKRZ6LVUjHQtGN9zJqlse9b+fDyk/LvbyMb826R5XmlM7wcZqOPbJ9RvKDUfP6X9V0cSQDD+ReCIiuKReljO5CL0n3wNT3qO1YGMqIsgxEA6YrqJmHTKq9KeI0rSZMPDm7Hj0mbSBrz812jhalQeY4VxQ+vuYoRRtkLHq0O07quWgj1SVnG7wNYPaUfD82Q/HU371bXB8AFIGcYMcg+UpEG5zdrK5tOXN3ZXWLqB1inO7z771D7bjQcNg3O0on1qWyc/ULD3z9+dTAjQLOiohKiXL2Qz4tMjvnDx1x9aCuWqwOho8q7ejNy29Vwdj4PJq9z2eMwCf+hzl318ov//d33xAxmCihwDFVoBXx9J7QCEs+0OxWGpC42DSHXsUvFrxy0egej8cR9pxieWYQxyPbTTnVuPvXIUvX+KS5aoXbD2GI/krx2kaDa5Iz+qZSIdk+hTxVTXPYhK0xtpeiuTOebKf84NKx53zKvnQ84OdSr9qONwnZOh2upTQSdOEj+KFlTt36NsgLnJHLDIIi3j3XgfrQ3SXECXhb2FkxNCjaclpEkN2vGw0oNuCB0ZaO7sPy0WjZqaIahvLY2PDezztzYJqv42J+o2cqWrKlyrJH+4oOB5vlhb96dE0Ee3i7r8iovSwcG/e1jOu8TLJp5rOI6q/XwuOd+SvUpCkweQROUkcJQVJOkoiVWL31D6GipjgxnXjOj9AdRH8Cv0zogD3QOEAwE1BtUAamnLznF74EB33zXOKGgZRMAwY0AYMNa9nYAAUocCsrGnlFTXyhhreDESSAfQNaCdiOnfC5BUaR2tuecKtrzRLj4K5Rbdcas7PgIegXUEzvOk1d3EJdqCQDR7FG5sNHj6i6QkeYK1m6RV4GCJFJ85dsDe94n+/kjyk3muYFlMAKGEQtC9AUGF4Au7AJP7c93W/uubVnoG7xr13Krj+QcmvbUuwLnZLCYf0aRhhP8Ng+Y9RSOXiX50FnOFtzHjLY/74mLfw0pt+7o5FKsmnXC9CRLtmiWv3Kg/cyqyYAk40gRjabPEji8Np8zp3uUqPDrasgjxILBq5+Jxp3kKfBreqZHjcsbsgkjMMwJ9d/IoggD1gOyxPV/prLCtxTGshAuHRvct2QkQrgAetb7FCTkU0YiIyQI+qKT0DSjdAFAAEAGhCVn+x9U7nUQMLwvCYL8C/o9V1ADC/OPu/ylYtJytYpsM9LYVHcX+Qfmj8/kyw8hCPgVFBHGwhkUFZiNggk3IIsDFgynZCf5HJFUENCLG6w28bR7MiMgzNgwF4M++C7QlIswCiufW95uJ7d2w3AmdIwA0AzLZRHwF3GA01DibQOWxPuFOzgPCClU1/7rhZGoLpbmWl+WSkcbCFmRzfEazUHZNzOPLDYTQOnXBLQBZkV1RbwLDGwVGLyxZE11WnL7na/o578jBJZScowrHPb1xWAH/2YdinoA+r2Xa/afEwhcPBRjnYGnd3RiTu2kwDE7SSUwQyLw0noQES/EmHYxlKIqnC7/6TZ8FQPZlefc4MZonA6s+s+DNRTP88Z/aAe7wUxgmRgLmLi0mfnaZTupl1W2SMEnnj+NBbKLtztdS8bkfsTsT+ZMkbngxp/shyhRgXhF8vc4/F5/AIkPyOF8bjRkxAISJNFvlCmfLlRHPuQURpQLxFd4jQA8Sah0jf8YX+8f+3OwXOhShEQARmgQ+PRqMFwjyIbxFmNPFwWCIQNtWr34aLA8SEaAE+d+hdrEvRTF4+YF+DyWmMb+1WykF93H+z7m7PeyvfAVxSOtzya8CrYHII1aa/AYwa8fEFY4UwAFGO/f47vzrnbe27lVciCFUPQuo/qVYvGvpnumVzTOQtlNzV52h19zfc4bGYjhPlMHnMMGBdC4lPpgAaeDNvIztPTLEZM2JKMG+/cgL5RnP225hM2KVfKwNJ9NnMpDUSOHcXdpMaSWSRYhFJUrGu8ALNDcoI+V2OluGIlLTFRF/r+WJeudgr1ik1q/tCcgl2rzBHBRevKteMHNnJvWF0U++Ok7WKKzxBB1dqFvDG/1JkRTK850fg3przE5B7NJfu+psRLrxSzDm6kmO3WQ4dspZRLU3pAASX6UO3jaMFkL+mW+D4TTA+Tkrq6a7ON+en3b3V4MFLcBXu1iN3+B6oSWXH25lxd+G88zgYOq1IWa6y0HxPnnoLG/HnfgkJg5iSMBiHYxSMw2lvCBRprQKyFq26avK9H6zHH9phNP/+8ukY6qrphHy+rnn3I9O/9gWfunIIZhN9y2ZbE+1rcJAUr8HYRAuv1yCGXsvyoExRpOw+mPK21uRxk8aVy4iZElT++AspzwHaXvNsZzN6eJazuQbXZukQyKkOQbWM+rZXeULBOKTDgBYGdIE4eOhngP4yVHIqFDGyK38WECBjMZ5t6FkFmMI6q3BIEGi6lK9gpgO6yRBOWGoGIXzHv3UqGdXAyVSMAISi2H2QqGRAJFkC5JGGYPznRtp8chQMr2P85zEW087JtYgMBQeRfKHmjmPlxz069DcngcZ7veK92fBfrkOSwncGFQeFb9QXRDofLoDuqLwPC0t5PZcGr0bEwAwYLeY0Dn4cjo07ckwF02X5gjPAsTFKS2NZFQywHYLTDUm6nQSR7r8C5mWPGx1T6YBT+ncP/ReHgIfgcM2lB0FtK6q9hadH3JPYLbZdCQJdB15trDQbNnJHsI2+waXB1fWwLE+vKCVEjVNFwVpUyIjfxX3IpsgtUp3MHS8Hm5Og/W7lXnN2jw5BpcHW7ftVSqdhRtKHX8eKN+vnKg3HXK+nBhLlyJgqUYhc2nMfRur8D0U9c0vpLaLmg1bbxQLOhEsryDgAnN7Mjlf5nqAAGvL7TTAmb2rULT8Kl/ry4pV0lS+oPfZG3jY3Z5Klvi9VQzPznL35mvciAk1fCklfRUlzA5SkFBPZYBsi6mCRcPqeV6kkR5WLuVxc8j6D7jKmzLepOCaTQXiCbF0ixjpgTORWFyH7Tg0rVxkTJZQmOLz1oTNoE8WM9nRo+Ugj/hLfu8GSYoOIvsJZjMSaydN2g2AzjrA7qjrjZfdh3sOzljB30p0+rr/NoQPv21E4gzu81ziEu57DLpDkCSh8SZorbUGLSVvwZo2UHf3sLRwUHGULtS0pCnXjNlRdHIG1Ep/lHgwfbQmtMpkNbhuYjUN1MDYqMjPO5imTpUm2mAUHahw+kecmp0hy/yhmDjO5cAupRMinaHybkKmN3fSqYLiKLqqkcJmhpxWtC+UKZJzolXldW83zlFWFECVS0VAzuhLBBe7B3132F7coCwQYBBfivh9uLo1hKOE5pTv83BsveQvj0aXxNHTEf3IAoVq+wD6zX2SXzeUdf/WwJbVECmyAAEOqhsE/KhCHUSHkFszIKdpxlFU1cOyOblPJIJGt8/gJWUIB3RKE6DD0GCAE0TV55j15nyo/E4fRIQkBQxiB88DVettvvNlRRIW7FE2fed9sYZbNM+tYEPUFCE3URAUvCjrPy1sYoCjzTEnn5529WNA4whCwBM8l2XosGhsxSI5lHYrFP+vsiBZf3oeQC+DWXd50dzYh5FKpgfA/nDcqR4BakGQwZLSet+hocORW/BiOKNg8CRsHROJuT3ljUYrZreN4W4C7u+zObp+OcbuBDiadlhugx+IFpjg3MCE7ocxgdrt9ZrCBApvdlt0YEaKB8KQhQpvdebC8lixxt9KCkbvNogVX+IlJiZY7veg+n5QNxlF7exn6hjZCwDrQZBUi9hly4JHrY8vsFzUSCkN+qQKwQao3dEPWVYj6A+7QgrcVZYzdBBr4KThMiAYQuV+3TMfMmLm2hRWC8s3SPAKT8gy49HZlFlwnEd2SeUJU1ePN3B7IjyHuFBFq9xtcx2MC4N1/+y2pkqyKEYFu8DKBnWp+2WbW6UevDT6Vd3oRQKKPYWb2w9QWU8Pe5MvG0Rp2SI4WAfx4Y7PoFjgCBVdAZTcJREu727xISAAhxXorVmh/AFsA0VNX4I0EAqVtV7AZpFroS8CzoAgvKBRIsNqNiUjBMntyLE9RfQD0k1CUwZywYwbS6QIM6lgDsN5/lNaTbDSOjxvvpkE6/v5843Line truncated
|
||||
assets["assets/lang/prettyprint.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1yST27qMBDG9+8UVlZBerlApUpVKKUVFUUhtGtDTGLFGUdjGwRVj9OT9GKdcaJCu2J+3zeef+QgURgJ9QqV96ceNXhxK96TbZ3cJHkwtUQtIfmf7CQJU+mlGfHuII2Cnb7SRfo6ajDhHMfWWe0agkoRzBV28bkyTKhUywAEM6iNdk3EbJ5fFJFuQHtViYWGurIdV1Zced1LGF+4bLa+KCKlQMcR9prkBw1j4h4ZkUZkagLRY4CfHbUn4YlWGbC12aIgZWFR8XLxl6saznvWvgnUL6bClpSlxaOqSRC5bbuvT8MGL3offGwI8CtreQKLji/Qc9bKjgfofZYXUUAf6qCcEmmO8qzNZHBX5R93iGX00WbFC/mF7eJ0Ih2jaPLKRXBuGNsd+GpHVQ2NPZ+nDNgOGFrCTYt0yyH93GTTJf+njYbYl4NYl5zy7doppT7yV/Dx7xsAAP//AQAA//+/aT2aYgIAAA==")
|
||||
assets["assets/lang/valid-langs.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/yTMsQrCMBSF4d2nCJm9jyBIRRwUlVhwEIe0jW1oSEuSZvDpe0+6fH8ugZN1EFk7292076M4iI9sermXrS4c+c/41pYrMp1hjAO+QJcKjQU6v7g/CwIzLIxNzDjRVXEdDt8AjHiMzHjNiSq19Vlzw0TqgWIiZiZhcRmZ/0Cn+9b6Lb+7FQAA//8BAAD//9+xfOrFAAAA")
|
||||
assets["index.html"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
assets["index.html"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
assets["modal.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3yTUW+bMBDH3/cpbjwsrVRCW/UpSzptkSZN6qRK7csejX2AV2Mj+0jHEN99h2EsrdI9JDbmfnf3/5/ZKn0AaUQIu6R2ShgohMIESOTaKvy1S9KrBGyZCiKfKkEizYV8Ut41u6TvGXUB4ROQbxE2sAokSMsVDMMr6gm73AmvIvXFOYPCnkX6fAy+fQewfZ+mvGQZ7F3TeV1WBGf7c7i+vLqBxwrhobOSKm1L+NxS5XxYx/CJeax0gAfXeonMK4SvztfAZ6HNf6IkIAfESQh9HcAV8eG7+62NEXDf5kbLKdGdlmgDXsBhDdfryzV8K0CA5JYW6v4OnkUA6wiUDuR13hIqeNZUcQDXLLTBiyndD9eCFBZcTkLzYhEEQUXUbLKsnuqvnS8zzppxvWwUlabRkNfDSZUWxpXR2vm8X01vTLnagBG+xMnMU7R0ltDS/P5URIU8fQ/CoKfpP+37caZtGIaFY7K6eQmSJoNHARwSGlbNjepil2gunfwlStM11XgCy46rjMtYY5uN4HGmvo/Zh+Ff+ay6WURkrOJtRblTXfSLvLBBmlbh2+TcbbyWycs8hXN8c44t4JkTa6CuwV0yPSxMThb4lyosRGso7kOdQPwU+MrUesnMiqNT/zHHY+0OuFjzAevQfJyoqMoIwtv92PQcsc2mfk4oXbbzZl7+AAAA//8BAAD//53P618IBAAA")
|
||||
assets["scripts/syncthing/app.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/5RXbXPUthN/f59iM8NgO9z5Lvz59yFHmNKEFNqEpFyg0ExeyLbsU5AtV5IvCUy+e1eSHxNnKB7g7NXub1e/fZCYz2FflDeSZWsN/n4ATxc7z+BsTWF1U8R6zYoMXlZ6LaQKJ/M5/sFFpmAlKhlTtE0oHAqZA8pUFV3SWIMWoBFAU5krEKn9OBZfGOcETquIs9jAHLGYFopOYRPC03ARwpsUCMQYTGtzegRXREEhNCRMacmiStMErpheowJ6TBmnUwP2SVQQkwJEpAnDn4IC0bDWutydz3PnOxQymyPmHL3Nw8lkMt++VJwVGiIprhSVu6BlhQHFotCsqGjzXfJKmb/uG7aRhe2Mi4hweLQLKeFmF6TIKk5k+40gSnDafm8IZ8kRaqlaZHAmGyJBtUTvNShhLpKKU99r17wpnE8AH69Wea8ZV2HCJDLONtS+npKMFUQzUXhTp1wSFRNeotJah1qSQnGiKa665RY+jIWk3uQiWLqYKskjgjHugSep0t7SSrOKfaBSIT4uFBXnqN2HKFKW+WmFAqPiPzL8n0qxYQmVU3jU+u9kRwLDoysqN1gNjTiArza8gX2Y0JRUXKvwWsn0NSUoe0tyG+LH2f7q3eHsTHymBYb6Ddt9IT4z2th+wxLLg2Khl9o0QFmpdW9/TZzmkVRXsugJnFCVWAamCFqjRhbc0TWP4bhZ74huJOHablr5wbl3PWt5n22cpnexvAfIUvC3uqyN+TTPIK93ArgPegvUlK/B7hlu3bN8yFsi4iqnhQ45Jt+QEkrKBUl8013BiL97kprsxt/QpFO/dQu3pqjNC84JbrqHZDgdigSMf86UjcFp3C/RsFJ0pVElPsRZo46ESYHfbQxbK2XXu9iWSlGt5saB/WdWt6B5VJU6pfBSYaKGUY22QIhgLzeEcRJx6jSU342QmqUHTQ9cvbt138PaNt6sSyThl7OTg5NdoNe4WxzX9SjjdEN5W6gKsPIFKFoSiXTgi3Xiq2AyaYs5oUa2L3JUoj6ZQtTk3BSHvikpTnISFqbVtvaw2aoCO5EVNPHg8WOoFaJRhX71GLQa5nmtHkxGCmK2s7zbkLXZi9qsrohJh+r28ObAIjcfI53dYDvbFr01f9EzX05ueyylgmNaHmKJhCyxvlny372iyQtrMubpmJQ+b7DMSMmxq7/WzcDDVMhXJO7PMdl3nJ/j0EsuzCDo2qfnPB9zeYSns5/3fXIEOK8nEnoE3wgxbDyc87477oZqfo4+g/5eeaiE1P6AvGEkfBhJQmOW48Fq2mSKp9MgnIRlTKupUVJ13xnyURX2sO4WI9QvmmjsjwPATR0TvQ5TLoT07SsXmXshkXUdBDCHdmVnEdRBG8+NeU6u/YWNEWY18nBrLsz+7nAuJSJf4R2oyHxOi/7m2NSMQux3c57hRSFeE2l8eYudp/979v8ffvzp5wWJYuysbM0uP/O8EOU/Uulqc3V98+Xlr/sHrw5/e/3m9z+Ojt+enP75bnX2/sNfHz/9PfN6+WMIuFgCw1pF9/jy5MmQNBvAkz3n/dzuUwrsZ8eOix+PzG3wrUaIKBne42awEwQXI1XuEIcsMPUqL/XNib1n+iK67NPQ9bcN2Pa9uQt2Wj10ewUb8WrOoLt1FeE2cPQZyRQvpEz3vWqWU1FpvADKTLm7Iw7WqZUrTfKySQ5qZHg3ravP9ggOVom0jt8onIYyST1AxbAQV7g+64CXg/loVZ8PwmueOkQEwqPhzH341rnbDoIa697RWx/xD8G4q19/zU4ys72xQ98umH12nPeftnYNDyEpS37jtzQaVkfuBPW6uTGjwmhIvXuAS3PNfFMAo6R3uOb/Fx1g7QV/7NWlt9KmY5Cn5SCNeArzt+IKNbZqEoe5a6Tfm7g7xHwvkd8gcbQImly6PukYvttfTffWzKPCvwAAAP//AQAA///bfbU5ag4AAA==")
|
||||
assets["scripts/syncthing/core/controllers/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
|
||||
@@ -129,6 +129,28 @@ func (n NamespacedKV) Bytes(key string) ([]byte, bool) {
|
||||
return valBs, true
|
||||
}
|
||||
|
||||
// PutBool stores a new boolean. Any existing value (even if of another type)
|
||||
// is overwritten.
|
||||
func (n *NamespacedKV) PutBool(key string, val bool) {
|
||||
keyBs := append(n.prefix, []byte(key)...)
|
||||
if val {
|
||||
n.db.Put(keyBs, []byte{0x0}, nil)
|
||||
} else {
|
||||
n.db.Put(keyBs, []byte{0x1}, nil)
|
||||
}
|
||||
}
|
||||
|
||||
// Bool returns the stored value as a boolean and a boolean that
|
||||
// is false if no value was stored at the key.
|
||||
func (n NamespacedKV) Bool(key string) (bool, bool) {
|
||||
keyBs := append(n.prefix, []byte(key)...)
|
||||
valBs, err := n.db.Get(keyBs, nil)
|
||||
if err != nil {
|
||||
return false, false
|
||||
}
|
||||
return valBs[0] == 0x0, true
|
||||
}
|
||||
|
||||
// Delete deletes the specified key. It is allowed to delete a nonexistent
|
||||
// key.
|
||||
func (n NamespacedKV) Delete(key string) {
|
||||
|
||||
@@ -1025,8 +1025,8 @@ func (m *Model) folderStatRef(folder string) *stats.FolderStatisticsReference {
|
||||
return sr
|
||||
}
|
||||
|
||||
func (m *Model) receivedFile(folder, filename string) {
|
||||
m.folderStatRef(folder).ReceivedFile(filename)
|
||||
func (m *Model) receivedFile(folder string, file protocol.FileInfo) {
|
||||
m.folderStatRef(folder).ReceivedFile(file)
|
||||
}
|
||||
|
||||
func sendIndexes(conn protocol.Connection, folder string, fs *db.FileSet, ignores *ignore.Matcher) {
|
||||
|
||||
+69
-28
@@ -54,6 +54,19 @@ var (
|
||||
errNoDevice = errors.New("no available source device")
|
||||
)
|
||||
|
||||
const (
|
||||
dbUpdateHandleDir = iota
|
||||
dbUpdateDeleteDir
|
||||
dbUpdateHandleFile
|
||||
dbUpdateDeleteFile
|
||||
dbUpdateShortcutFile
|
||||
)
|
||||
|
||||
type dbUpdateJob struct {
|
||||
file protocol.FileInfo
|
||||
jobType int
|
||||
}
|
||||
|
||||
type rwFolder struct {
|
||||
stateTracker
|
||||
|
||||
@@ -73,7 +86,7 @@ type rwFolder struct {
|
||||
|
||||
stop chan struct{}
|
||||
queue *jobQueue
|
||||
dbUpdates chan protocol.FileInfo
|
||||
dbUpdates chan dbUpdateJob
|
||||
scanTimer *time.Timer
|
||||
pullTimer *time.Timer
|
||||
delayScan chan time.Duration
|
||||
@@ -326,7 +339,7 @@ func (p *rwFolder) pullerIteration(ignores *ignore.Matcher) int {
|
||||
l.Debugln(p, "c", p.copiers, "p", p.pullers)
|
||||
}
|
||||
|
||||
p.dbUpdates = make(chan protocol.FileInfo)
|
||||
p.dbUpdates = make(chan dbUpdateJob)
|
||||
updateWg.Add(1)
|
||||
go func() {
|
||||
// dbUpdaterRoutine finishes when p.dbUpdates is closed
|
||||
@@ -583,7 +596,7 @@ func (p *rwFolder) handleDir(file protocol.FileInfo) {
|
||||
}
|
||||
|
||||
if err = osutil.InWritableDir(mkdir, realName); err == nil {
|
||||
p.dbUpdates <- file
|
||||
p.dbUpdates <- dbUpdateJob{file, dbUpdateHandleDir}
|
||||
} else {
|
||||
l.Infof("Puller (folder %q, dir %q): %v", p.folder, file.Name, err)
|
||||
}
|
||||
@@ -600,9 +613,9 @@ func (p *rwFolder) handleDir(file protocol.FileInfo) {
|
||||
// It's OK to change mode bits on stuff within non-writable directories.
|
||||
|
||||
if p.ignorePermissions(file) {
|
||||
p.dbUpdates <- file
|
||||
p.dbUpdates <- dbUpdateJob{file, dbUpdateHandleDir}
|
||||
} else if err := os.Chmod(realName, mode); err == nil {
|
||||
p.dbUpdates <- file
|
||||
p.dbUpdates <- dbUpdateJob{file, dbUpdateHandleDir}
|
||||
} else {
|
||||
l.Infof("Puller (folder %q, dir %q): %v", p.folder, file.Name, err)
|
||||
}
|
||||
@@ -642,13 +655,13 @@ func (p *rwFolder) deleteDir(file protocol.FileInfo) {
|
||||
err = osutil.InWritableDir(osutil.Remove, realName)
|
||||
if err == nil || os.IsNotExist(err) {
|
||||
// It was removed or it doesn't exist to start with
|
||||
p.dbUpdates <- file
|
||||
p.dbUpdates <- dbUpdateJob{file, dbUpdateDeleteDir}
|
||||
} else if _, serr := os.Lstat(realName); serr != nil && !os.IsPermission(serr) {
|
||||
// We get an error just looking at the directory, and it's not a
|
||||
// permission problem. Lets assume the error is in fact some variant
|
||||
// of "file does not exist" (possibly expressed as some parent being a
|
||||
// file and not a directory etc) and that the delete is handled.
|
||||
p.dbUpdates <- file
|
||||
p.dbUpdates <- dbUpdateJob{file, dbUpdateDeleteDir}
|
||||
} else {
|
||||
l.Infof("Puller (folder %q, dir %q): delete: %v", p.folder, file.Name, err)
|
||||
}
|
||||
@@ -690,13 +703,13 @@ func (p *rwFolder) deleteFile(file protocol.FileInfo) {
|
||||
|
||||
if err == nil || os.IsNotExist(err) {
|
||||
// It was removed or it doesn't exist to start with
|
||||
p.dbUpdates <- file
|
||||
p.dbUpdates <- dbUpdateJob{file, dbUpdateDeleteFile}
|
||||
} else if _, serr := os.Lstat(realName); serr != nil && !os.IsPermission(serr) {
|
||||
// We get an error just looking at the file, and it's not a permission
|
||||
// problem. Lets assume the error is in fact some variant of "file
|
||||
// does not exist" (possibly expressed as some parent being a file and
|
||||
// not a directory etc) and that the delete is handled.
|
||||
p.dbUpdates <- file
|
||||
p.dbUpdates <- dbUpdateJob{file, dbUpdateDeleteFile}
|
||||
} else {
|
||||
l.Infof("Puller (folder %q, file %q): delete: %v", p.folder, file.Name, err)
|
||||
}
|
||||
@@ -756,13 +769,15 @@ func (p *rwFolder) renameFile(source, target protocol.FileInfo) {
|
||||
// of the source and the creation of the target. Fix-up the metadata,
|
||||
// and update the local index of the target file.
|
||||
|
||||
p.dbUpdates <- source
|
||||
p.dbUpdates <- dbUpdateJob{source, dbUpdateDeleteFile}
|
||||
|
||||
err = p.shortcutFile(target)
|
||||
if err != nil {
|
||||
l.Infof("Puller (folder %q, file %q): rename from %q metadata: %v", p.folder, target.Name, source.Name, err)
|
||||
return
|
||||
}
|
||||
|
||||
p.dbUpdates <- dbUpdateJob{target, dbUpdateHandleFile}
|
||||
} else {
|
||||
// We failed the rename so we have a source file that we still need to
|
||||
// get rid of. Attempt to delete it instead so that we make *some*
|
||||
@@ -774,7 +789,7 @@ func (p *rwFolder) renameFile(source, target protocol.FileInfo) {
|
||||
return
|
||||
}
|
||||
|
||||
p.dbUpdates <- source
|
||||
p.dbUpdates <- dbUpdateJob{source, dbUpdateDeleteFile}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -848,6 +863,11 @@ func (p *rwFolder) handleFile(file protocol.FileInfo, copyChan chan<- copyBlocks
|
||||
"type": "file",
|
||||
"action": "metadata",
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
p.dbUpdates <- dbUpdateJob{file, dbUpdateShortcutFile}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -954,16 +974,13 @@ func (p *rwFolder) shortcutFile(file protocol.FileInfo) error {
|
||||
file.Version = file.Version.Merge(cur.Version)
|
||||
}
|
||||
|
||||
p.dbUpdates <- file
|
||||
return nil
|
||||
}
|
||||
|
||||
// shortcutSymlink changes the symlinks type if necessary.
|
||||
func (p *rwFolder) shortcutSymlink(file protocol.FileInfo) (err error) {
|
||||
err = symlinks.ChangeType(filepath.Join(p.dir, file.Name), file.Flags)
|
||||
if err == nil {
|
||||
p.dbUpdates <- file
|
||||
} else {
|
||||
if err != nil {
|
||||
l.Infof("Puller (folder %q, file %q): symlink shortcut: %v", p.folder, file.Name, err)
|
||||
}
|
||||
return
|
||||
@@ -1183,7 +1200,7 @@ func (p *rwFolder) performFinish(state *sharedPullerState) error {
|
||||
}
|
||||
|
||||
// Record the updated file in the index
|
||||
p.dbUpdates <- state.file
|
||||
p.dbUpdates <- dbUpdateJob{state.file, dbUpdateHandleFile}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1239,39 +1256,63 @@ func (p *rwFolder) dbUpdaterRoutine() {
|
||||
maxBatchTime = 2 * time.Second
|
||||
)
|
||||
|
||||
batch := make([]protocol.FileInfo, 0, maxBatchSize)
|
||||
batch := make([]dbUpdateJob, 0, maxBatchSize)
|
||||
files := make([]protocol.FileInfo, 0, maxBatchSize)
|
||||
tick := time.NewTicker(maxBatchTime)
|
||||
defer tick.Stop()
|
||||
|
||||
handleBatch := func() {
|
||||
found := false
|
||||
var lastFile protocol.FileInfo
|
||||
|
||||
for _, job := range batch {
|
||||
files = append(files, job.file)
|
||||
if job.file.IsInvalid() || (job.file.IsDirectory() && !job.file.IsSymlink()) {
|
||||
continue
|
||||
}
|
||||
|
||||
if job.jobType&(dbUpdateHandleFile|dbUpdateDeleteFile) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
found = true
|
||||
lastFile = job.file
|
||||
}
|
||||
|
||||
p.model.updateLocals(p.folder, files)
|
||||
|
||||
if found {
|
||||
p.model.receivedFile(p.folder, lastFile)
|
||||
}
|
||||
|
||||
batch = batch[:0]
|
||||
files = files[:0]
|
||||
}
|
||||
|
||||
loop:
|
||||
for {
|
||||
select {
|
||||
case file, ok := <-p.dbUpdates:
|
||||
case job, ok := <-p.dbUpdates:
|
||||
if !ok {
|
||||
break loop
|
||||
}
|
||||
|
||||
file.LocalVersion = 0
|
||||
batch = append(batch, file)
|
||||
job.file.LocalVersion = 0
|
||||
batch = append(batch, job)
|
||||
|
||||
if len(batch) == maxBatchSize {
|
||||
p.model.updateLocals(p.folder, batch)
|
||||
p.model.receivedFile(p.folder, batch[len(batch)-1].Name)
|
||||
batch = batch[:0]
|
||||
handleBatch()
|
||||
}
|
||||
|
||||
case <-tick.C:
|
||||
if len(batch) > 0 {
|
||||
p.model.updateLocals(p.folder, batch)
|
||||
p.model.receivedFile(p.folder, batch[len(batch)-1].Name)
|
||||
batch = batch[:0]
|
||||
handleBatch()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if len(batch) > 0 {
|
||||
p.model.updateLocals(p.folder, batch)
|
||||
p.model.receivedFile(p.folder, batch[len(batch)-1].Name)
|
||||
handleBatch()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@ package stats
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/syncthing/protocol"
|
||||
|
||||
"github.com/syncthing/syncthing/internal/db"
|
||||
"github.com/syndtr/goleveldb/leveldb"
|
||||
)
|
||||
@@ -25,6 +27,7 @@ type FolderStatisticsReference struct {
|
||||
type LastFile struct {
|
||||
At time.Time `json:"at"`
|
||||
Filename string `json:"filename"`
|
||||
Deleted bool `json:"deleted"`
|
||||
}
|
||||
|
||||
func NewFolderStatisticsReference(ldb *leveldb.DB, folder string) *FolderStatisticsReference {
|
||||
@@ -44,18 +47,21 @@ func (s *FolderStatisticsReference) GetLastFile() LastFile {
|
||||
if !ok {
|
||||
return LastFile{}
|
||||
}
|
||||
deleted, ok := s.ns.Bool("lastFileDeleted")
|
||||
return LastFile{
|
||||
At: at,
|
||||
Filename: file,
|
||||
Deleted: deleted,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *FolderStatisticsReference) ReceivedFile(filename string) {
|
||||
func (s *FolderStatisticsReference) ReceivedFile(file protocol.FileInfo) {
|
||||
if debug {
|
||||
l.Debugln("stats.FolderStatisticsReference.ReceivedFile:", s.folder, filename)
|
||||
l.Debugln("stats.FolderStatisticsReference.ReceivedFile:", s.folder, file)
|
||||
}
|
||||
s.ns.PutTime("lastFileAt", time.Now())
|
||||
s.ns.PutString("lastFileName", filename)
|
||||
s.ns.PutString("lastFileName", file.Name)
|
||||
s.ns.PutBool("lastFileDeleted", file.IsDeleted())
|
||||
}
|
||||
|
||||
func (s *FolderStatisticsReference) GetStatistics() FolderStatistics {
|
||||
|
||||
Reference in new issue
Block a user