diff --git a/public/electron.js b/public/electron.js index f431e9c..d27c027 100644 --- a/public/electron.js +++ b/public/electron.js @@ -71,6 +71,17 @@ function setWindowVisibility(show) { } } +const unmountAllDrives = () => { + // Unmount all items + for (const i in mountedLocations) { + const data = mountedData[mountedLocations[i]]; + helpers.stopMountProcessSync(data.Version, data.Provider); + } + + mountedLocations = []; + mountedData = {}; +}; + function createWindow() { loadUiSettings(); @@ -123,14 +134,7 @@ function createWindow() { // when you should delete the corresponding element. mainWindow = null; - // Unmount all items - for (const i in mountedLocations) { - const data = mountedData[mountedLocations[i]]; - helpers.stopMountProcessSync(data.Version, data.Provider); - } - - mountedLocations = []; - mountedData = {}; + unmountAllDrives(); }); const appPath = (os.platform() === 'win32') ? path.resolve(path.join(app.getAppPath(), '..\\..\\repertory-ui.exe')) : @@ -717,6 +721,8 @@ ipcMain.on(Constants.IPC_Install_Dependency, (event, data) => { ipcMain.on(Constants.IPC_Install_Upgrade, (event, data) => { let allowSkipVerification = true; + unmountAllDrives(); + let tempSig; let tempPub; const cleanupFiles = () => { diff --git a/releases.json b/releases.json index 6f1f2ed..ee55a2d 100644 --- a/releases.json +++ b/releases.json @@ -1,220 +1,172 @@ { "Locations": { "arch": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "centos7": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "darwin": { - "1.0.4": { - "sha256": "4c33ba2a0dae3604e10e0078bdca27abc1dad7dec5132746f47e151c9d1c9f75", - "sig": "BX3momrq4XzMZEIv+U2qllLiQ1HOzDOeosly/BqjGfsCQKBsoORXAfUDqJakTXgEE1R5BrqAIx83KY8bIDDQ7L+9IqJNZWu7H3KkBEPaC5OBtxNSOPNJ8/Xe8CJDyTnp4acAgIfXK3WTYLp5RAKzPJ4QZneJzqIbx+bTLQcE+BukkWL1nLlZifvbVjz3PC1G2ZZ2B3WKR3Z4th1oQnYS4xgMQdEpbtxjXCPMy1fd1Ipnp14p9s2GWfrQaVLQIvJcEeBkRdLlI6dwvsmRlRPy13dBdPqd6buLjBA+RCgvKygqUiFAUXRaePCmx3DY5KvPYJF75JvhhvTrjf9/AYh336Llmofl8WJM6N5KByzOL2XFOLgUG3xgThRmAi4p39ec/pO1XYbGzGUneTDKAMyv5TZk+gDIQDMqoY0ssRLxMl0eEd9lkJYIKhUXB9gltkBsuPjVmU/fKyXprEXedUTWzu3ip6/9NRIF31XQPROFUne67csIh2GjYOnElDnSfoPVAoy2U6drVgL/wnooyJzNRSxokgxoiLRt7Y13xrN3GoLZrOtM3lAH1aVD6C+aYacSrGLpTzRroRfzAm2Xehs5E0Y9UI7O77zqEAJUeLJ1SSiGCIrQeSL3abjfWwo3i6ma2fy8TpgpiMn74l9KHT3sUYgUFkISjOgeyqX6cH2PdFO3zhL5AndSGUOKf21TrGPlqNfANuNP+rZ3e4WkXE4yiD1kw+BEC5muW7CxYW4ocxDL9P947FET5RQT8t/YaL5nJNMJ/K7jq8TMeQ9WrsMZUYa5Tr8U8IxhXOHm9tsYFFF004eU0nd8duWljc+YG1PdwTxD+eAby0qPxQe1HirBXKB5ltvXFwjVXc+HiPxmzam241fupt3KlwW6FSTFrk+D2a0yK3RCw3Rihub3J2mvoPEAos/GTdC9M4IKTWz8iYUNcBE+XkI6S0o+/xVWobdQ5slGnQFMacEzoTaALQYtXFguiaIe5u2UI5PFm1EtTJqQq9qiYQB84NOMGdu6SPLPuifuGmBkAJpQadVXQ9HTFO1npTPF7jO2xqxGAc22xbV/oLKJCXViJSK1DHRYg+BFCAqxXqWrjEQaBmdrw2+fUmcQTc+DatpsDaFY6eTY+ee6FYosQdNCMmwnTju35AzFK77F338ZIePulu7cfgzdLn7TMsiX9QrRn9tAtfRnrcyehVxRpHWIxa70rKvBNuri/w9HZFG64Z3cdWOZk/kXn4RPdvUxb+RpZKtMQ6QaHhqpPbTCLLZmv7bFbexPEjJZFUbCbMDRwHrimI5zXXFc8Jr+iaHVKolbEOosdnFprD4+26R7HMCk24jFOkIovTzg6Q9NAlduScUbXXJ9HV7SOLc=", - "urls": [ - "https://pixeldrain.com/api/file/uKrr0H5r", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_mac.dmg" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "debian9": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "debian10": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "fedora28": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "fedora29": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "fedora30": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "opensuse15": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "opensuse15.1": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "solus": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "tumbleweed": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "ubuntu18.04": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "ubuntu18.10": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "ubuntu19.04": { - "1.0.4": { - "sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", - "sig": "B8p6M1ks8Z48QGJPQzhqNWK4uU8LyCM381/HJUz663f0LBe9YPqDSDRZUmake0QmYK5/97K7lEwq7w3h/NBKF7YzbGbiSddJN7oqBsJ3cmHo/8YtXXVgHVaxiQdcyv0w7KTNK9FTaz2TZfGGodIWX6fb6FyV1md97pSKnRp5IAk6FhWtXh1sKP1kb62VkRG0Dh4lC5mIgPTdCZb4i0PD9bNwNQKlLqkSzNrfECydwE5QLVIp5QKY2A2U0N1kccVQPXFvlLi6vKJWHruXEt+kn9+gsJVA43lLKwcKIQrgCIKQLzaXUsruglGMxSIOZt018T06vHuqdjISXSYHPEKB1lgNS42W0B9Cy2NSS8lDO4KaWKA+n3A1H5HB4A8KPxRMVgSYhyYgnInhJtLrgEypm6mfLWyoDENsxEFRNaDgQ5EoY1gtXrdEqlPpMA3/RVzs5KWGePQuZ8UGhUmGHd5g0m+bgleRhhI8AoYcoRt3aQ/dBAFyb/co5Y0deyz6HrDtxr61IVmKagIZviVtr7xATT9+ZtkeqQ9TcYkXnIHZdqzV4C61UMPBD8XhRY6D+z5+PNXoLde+FE9WiHMQD+t+Sm4aJla/P+YrZUlrgVqPeA1CE1vfJg1GQauU5rAdoM44wYJ/GN6SEqG4LrrGY0UADvG2X76ob4mda3l9dQO8OBRMg0ZPXb+i7PSRn50wEnvqFzlyna6Z0hZ4U3euMZ9A7HY2AoKZ3wLRpn2j6bxV83m4D7tqFkVzbB/jUpUDNpVxGM/IoF4lbEyr55CdZKynBvR7XbeZeYfViU18ga99eoBsqlHOIUA9BVWU+snVg/V7QCv+uBszAlCJnFnkUe9pEJS1UlbpgNhSWLnkPkT8mY3Du/cPY2R2t6fBKjyb1VP8Gk9YrZATQLNsCRBk/VcegWRo5WtJwGAgQcMdNan8SqYfhQA6nMk7Dzlg155AE1uKioY8Wj+kWp51vd+MvhSIwQ+iOwl+LNMl2jsKjVNpiIV+UqrH9wqM5nlPwyYBzIXSBN+uY1NOCw/HtYniZ/4vjiVQGIuSGzNR9yOv/YIknr91R3Sa/twlO3/wD4WDtf+VNIz/R/9x8FuenRVcc+6kc9wF/baNAYJDV3eMci+9mBqjetl91faSmCdh1qx1+f3R82VEmnMwuJr1PPddWCfeg1mSl4sULDmRYtfD5iQbwBf2MT/8MOgSwJts2s5ZAF/kxZNdpEvXu1EcWHIxQdJUG29KJd7g/GPTC7eK9W/hzNJ4aNwEdTL0mjFQA174OiqXz2+4uDoIaEYDdQmgB3xuZv+HfoVLGFpngp/Lr057pDquweEzJ0fDGks5VZHa7XSiheRhO531tQjF0bXC/G9LlYI=", - "urls": [ - "https://pixeldrain.com/api/file/jVeUr8Zq", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } }, "win32": { - "1.0.4": { - "sha256": "e669f54fb80ef84cba36dc031904ae76e4dcd93ef760fa432670c6ffcb597886", - "sig": "BuPXPWPoiQLbs5pznIRaAp8fnSw02EUeN1Az0J5K6YE+IRUq93GR1e7q5FktL6qLgWbvkVRx4GAz1hC1OcDuG+0dGeqQMlGwxxVmlv/q9T+Q1wMScLlfYDTPbZxTiexhiuSx8dMqWbUuXTQMJM7XHp3rPl8UFo95aa2JWApP++pL73pYVrN4ovyCgyZ/mlPT8Dpukenz5dmo3ZxBcBJbzkHbbgn0yira3gs+Qgm2VZDF4UOQuMnM8N3kBnw8KWY/X4/WZnOe5ejQ5R37kKq4K9+LUElbZSCOZSLnj/RqniO7aQ8Hc4vGIyxak9haKk80i4siwHpHOivdKAr+RBU83XeZ3J7KEfEPq884MIoCS9umYSdCcTGd+p+1OBALyfAEv79BVAR/w/GeNoQUmY0QqKlrSMODiLtw8dolU+K3VJ1+W0Xybl0ETMh83hCoi5hIVfRvIV48FF7/zR3mwmcFrkk6FFBU3yx8vx4qvZDFNItTNoeLp0xJXl4tFBrKlLj/wWP01pHuFCe/ZLgaCcACuz9pR1/r4DjE0MmG6IZ36J7RMICnD3sO0lTg8LJ6qJKIsOfIdkLlOK81HFAHcd7loN+qN9Kv3yPAWgZINL+K2XgJ6+Z+lmOIrGUy7F6jCSz9NUS2FTLZMGG00jJe2CsPJ8z+viRF5KBe4KUjrLbhaIwIMUTTW4je82jt6jfSNFjaJ5l9yMC4LkgJQiJTqGTJfH4dXM3MwA76vo6VmmXRZBTCMQbnYAP1paH/VshzNxEAON3hwbcRmKz8jJZ2mFaLEt4WGJ3Vrcn4W+2Z9jkcYWc1lC9auSGocxHszzCavkVFtjXxDhbtRI2h9g+iykU/5CvKNzhQld1ehQob+xVLpL0f5DlT8rZamIMnpYVOBHVeSz0dhsK7WQlRQi5e7VAiZD7yZIcQVTk2v6TVxZmm8felLy/WNV77ILju6leJ7r7SlRbFORfiAydKjSR+lsZDwliEn1rTqwARwo9zwrIwwUuajmoHrUD+ikDT0v92JSad+3yFHB3pU5qDshA3uH9BjFwcZMVRV1M/ETZNp5/guDvLri8IZHvCb5q5VtsHHJZtvcFngW9IKY4zTGJ3xURyapu3NbnLrvHkotgtppnjR/LaOf+yDkRNPQVObtdJG1qcFYIz/g5OaABijzQVRImkieqw9ge/aNvWmvmPVZrN5w7LfnKisZ0LBfzwIa6ApVnbahFVY/AICybthySyvr+MKtheb38WNGBVmxeAqRTeDwn8jUMjYaD/Jcfz7MWyZlDiTqsX5P3dZot/WdG/p5FwR6s5c5hHrPvU24tVgTrHc4MIY/KBZhbk9wm/QMLxvwzgEJ3iKPq1JKNvVK/vbHdr0yk=", - "urls": [ - "https://pixeldrain.com/api/file/PlUcsmJN", - "https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_win.exe" - ] + "1.0.5": { + "sha256": "", + "sig": "", + "urls": [] } } }, "Versions": { "arch": [ - "1.0.4" + "1.0.5" ], "centos7": [ - "1.0.4" + "1.0.5" ], "darwin": [ - "1.0.4" + "1.0.5" ], "debian9": [ - "1.0.4" + "1.0.5" ], "debian10": [ - "1.0.4" + "1.0.5" ], "fedora28": [ - "1.0.4" + "1.0.5" ], "fedora29": [ - "1.0.4" + "1.0.5" ], "fedora30": [ - "1.0.4" + "1.0.5" ], "linux": [ "unavailable" ], "opensuse15": [ - "1.0.4" + "1.0.5" ], "opensuse15.1": [ - "1.0.4" + "1.0.5" ], "solus": [ - "1.0.4" + "1.0.5" ], "tumbleweed": [ - "1.0.4" + "1.0.5" ], "ubuntu18.04": [ - "1.0.4" + "1.0.5" ], "ubuntu18.10": [ - "1.0.4" + "1.0.5" ], "ubuntu19.04": [ - "1.0.4" + "1.0.5" ], "unknown": [ "unavailable" ], "win32": [ - "1.0.4" + "1.0.5" ] } } diff --git a/src/App.js b/src/App.js index 3e5b75f..0a06dc2 100644 --- a/src/App.js +++ b/src/App.js @@ -5,81 +5,51 @@ import Configuration from './containers/Configuration/Configuration'; import {connect} from 'react-redux'; import DependencyList from './components/DependencyList/DependencyList'; import DownloadProgress from './components/DownloadProgress/DownloadProgress'; -import {extractFileNameFromURL} from './utils'; import ErrorDetails from './components/ErrorDetails/ErrorDetails'; import Grid from './components/UI/Grid/Grid'; import IPCContainer from './containers/IPCContainer/IPCContainer'; import Loading from './components/UI/Loading/Loading'; import Modal from './components/UI/Modal/Modal'; import MountItems from './containers/MountItems/MountItems'; -import {notifyError} from './redux/actions/error_actions'; import ReleaseVersionDisplay from './components/ReleaseVersionDisplay/ReleaseVersionDisplay'; -import {setProviderState} from './redux/actions/mount_actions'; import Text from './components/UI/Text/Text'; import UpgradeIcon from './components/UpgradeIcon/UpgradeIcon'; import UpgradeUI from './components/UpgradeUI/UpgradeUI'; +import {checkVersionInstalled} from './redux/actions/install_actions'; import { - downloadItem, - setAllowDownload -} from './redux/actions/download_actions'; -import { - checkInstalled, - installDependency, - installRelease, - installUpgrade -} from './redux/actions/install_actions'; -import { - detectUIUpgrade, loadReleases, - setActiveRelease, - setDismissUIUpgrade, - setInstalledVersion, - setReleaseUpgradeAvailable + setDismissUIUpgrade } from './redux/actions/release_version_actions'; +import {saveState} from './redux/actions/common_actions'; const Constants = require('./constants'); const Scheduler = require('node-schedule'); class App extends IPCContainer { - checkVersionInstalled = () => { - this.props.setAllowDownload(false); - const selectedVersion = this.getSelectedVersion(); - if (selectedVersion !== 'unavailable') { - let dependencies = []; - if (this.props.LocationsLookup[selectedVersion] && this.props.LocationsLookup[selectedVersion].dependencies) { - dependencies = this.props.LocationsLookup[selectedVersion].dependencies; - } - - this.props.checkInstalled(dependencies, selectedVersion); - } else { - this.props.setInstalledVersion('none'); - this.props.setAllowDownload(true); - } - }; - - _isMounted = false; - componentDidMount() { - this._isMounted = true; - this.scheduledUpdateJob = Scheduler.scheduleJob('23 11 * * *', this.updateCheckScheduledJob); - this.detectUpgrades(); + const detectUpgrades = () => { + if (this.props.AppPlatform !== 'unknown') { + this.props.loadReleases(); + } + }; + this.scheduledUpdateJob = Scheduler.scheduleJob('23 11 * * *', detectUpgrades); + detectUpgrades(); } componentDidUpdate(prevProps) { if ((prevProps.Release !== this.props.Release) || (prevProps.ReleaseVersion !== this.props.ReleaseVersion) || (prevProps.VersionLookup !== this.props.VersionLookup)) { - this.saveState(); - this.checkVersionInstalled(); + this.props.saveState(); + this.props.checkVersionInstalled(); } else if (Object.keys(this.props.ProviderState).filter(k=> { return this.props.ProviderState[k] !== prevProps.ProviderState[k]; }).length > 0) { - this.saveState(); + this.props.saveState(); } } componentWillUnmount() { - this._isMounted = false; Scheduler.cancelJob(this.scheduledUpdateJob); super.componentWillUnmount(); } @@ -89,129 +59,12 @@ class App extends IPCContainer { return condition ? ({jsx}) : null; }; - detectUpgrades = () => { - if (this.props.AppPlatform !== 'unknown') { - this.props.loadReleases(); - this.props.detectUIUpgrade(); - } - }; - getSelectedVersion = () => { return (this.props.ReleaseVersion === -1) ? 'unavailable' : this.props.VersionLookup[Constants.RELEASE_TYPES[this.props.Release]][this.props.ReleaseVersion]; }; - handleDownloadDependency = url => { - this.props.downloadItem(extractFileNameFromURL(url), Constants.INSTALL_TYPES.Dependency, url, this.onDownloadFileComplete); - }; - - handleDownloadRelease = () => { - const selectedVersion = this.getSelectedVersion(); - const fileName = selectedVersion + '.zip'; - this.props.downloadItem(fileName, Constants.INSTALL_TYPES.Release, this.props.LocationsLookup[selectedVersion].urls, this.onDownloadFileComplete); - }; - - handleDownloadUpgrade = () => { - const name = (this.props.Platform === 'win32') ? - 'upgrade.exe' : - (this.props.Platform === 'darwin') ? - 'upgrade.dmg' : - 'repertory-ui_' + this.props.UpgradeVersion + '_linux_x86_64.AppImage'; - this.props.downloadItem(name, Constants.INSTALL_TYPES.Upgrade, this.props.UpgradeData.urls, this.onDownloadFileComplete); - }; - - installDependency = result => { - if (result.Success) { - this.props.installDependency(result.Destination, result.URL, this.onInstallDependencyComplete); - } - }; - - installRelease = result => { - if (result.Success) { - const selectedVersion = this.getSelectedVersion(); - this.props.installRelease(result.Destination, selectedVersion, () => { - if (this._isMounted) { - this.checkVersionInstalled(); - } - }); - } - }; - - installUpgrade = result => { - if (result.Success) { - //const info = this.props.LocationsLookup[this.props.AppPlatform][this.props.VersionLookup[this.props.AppPlatform][0]]; - const sha256 = null;//info.sha256; - const signature = null;//info.sig; - this.props.installUpgrade(result.Destination, sha256, signature, !!result.SkipVerification, this.onInstallUpgradeComplete); - } - }; - - onDownloadFileComplete = (name, type, url, result) => { - if (this._isMounted) { - switch (type) { - case Constants.INSTALL_TYPES.Dependency: - this.installDependency(result); - break; - case Constants.INSTALL_TYPES.Release: - this.installRelease(result); - break; - case Constants.INSTALL_TYPES.Upgrade: - this.installUpgrade(result); - break; - default: - this.props.notifyError('Unknown download type: ' + type); - break; - } - } - }; - - onInstallDependencyComplete = () => { - if (this._isMounted) { - this.checkVersionInstalled(); - } - }; - - onInstallUpgradeComplete = (source, result) => { - if (this._isMounted && !result.Success) { - this.props.notifyError(result.Error, false,() => { - if (this._isMounted) { - // TODO Prompt to verify - if (result.AllowSkipVerification) { - this.installUpgrade({ - SkipVerification: true, - Source: source, - Success: true, - }); - } - } - }, false); - } - }; - - saveState = () => { - if (this.props.AppReady) { - let state = { - Release: this.props.Release, - Version: this.props.ReleaseVersion, - }; - - for (const provider of Constants.PROVIDER_LIST) { - state[provider] = this.props.ProviderState[provider]; - } - - this.sendRequest(Constants.IPC_Save_State, { - State: state - }); - } - }; - - updateCheckScheduledJob = () => { - if (this.props.AppPlatform !== 'unknown') { - this.detectUpgrades(); - } - }; - render() { const selectedVersion = this.getSelectedVersion(); @@ -251,10 +104,10 @@ class App extends IPCContainer { !this.props.DownloadActive; const configDisplay = this.createModalConditionally(showConfig, ); - const dependencyDisplay = this.createModalConditionally(showDependencies, ); + const dependencyDisplay = this.createModalConditionally(showDependencies, ); const downloadDisplay = this.createModalConditionally(this.props.DownloadActive, ); const errorDisplay = this.createModalConditionally(this.props.DisplayError, , true); - const upgradeDisplay = this.createModalConditionally(showUpgrade, ); + const upgradeDisplay = this.createModalConditionally(showUpgrade, ); let mainContent = []; if (this.props.AppReady) { @@ -262,8 +115,8 @@ class App extends IPCContainer { mainContent.push(( - + )); @@ -327,21 +180,16 @@ const mapStateToProps = state => { DisplayConfiguration: state.mounts.DisplayConfiguration, DisplayError: state.error.DisplayError, DownloadActive: state.download.DownloadActive, - DownloadType: state.download.DownloadType, InstallActive: state.install.InstallActive, - InstallType: state.install.InstallType, InstalledVersion: state.relver.InstalledVersion, LocationsLookup: state.relver.LocationsLookup, MissingDependencies: state.install.MissingDependencies, MountsBusy: state.mounts.MountsBusy, - Platform: state.common.Platform, ProviderState: state.mounts.ProviderState, Release: state.relver.Release, ReleaseVersion: state.relver.Version, UpgradeAvailable: state.relver.UpgradeAvailable, - UpgradeData: state.relver.UpgradeData, UpgradeDismissed: state.relver.UpgradeDismissed, - UpgradeVersion: state.relver.UpgradeVersion, Version: state.common.Version, VersionLookup: state.relver.VersionLookup, }; @@ -349,20 +197,10 @@ const mapStateToProps = state => { const mapDispatchToProps = dispatch => { return { - checkInstalled: (dependencies, version) => dispatch(checkInstalled(dependencies, version)), - detectUIUpgrade: () => dispatch(detectUIUpgrade()), - downloadItem: (name, type, url, completedCallback) => dispatch(downloadItem(name, type, url, completedCallback)), - installDependency: (source, url, completedCallback) => dispatch(installDependency(source, url, completedCallback)), - installRelease: (source, version, completedCallback) => dispatch(installRelease(source, version, completedCallback)), - installUpgrade: (source, sha256, signature, skipVerification, completedCallback) => dispatch(installUpgrade(source, sha256, signature, skipVerification, completedCallback)), + checkVersionInstalled: () => dispatch(checkVersionInstalled()), loadReleases: ()=> dispatch(loadReleases()), - notifyError: (msg, critical, callback) => dispatch(notifyError(msg, critical, callback)), - setActiveRelease: (release, version) => dispatch(setActiveRelease(release, version)), - setAllowDownload: allow => dispatch(setAllowDownload(allow)), + saveState: () => dispatch(saveState()), setDismissUIUpgrade: dismiss => dispatch(setDismissUIUpgrade(dismiss)), - setInstalledVersion: version => dispatch(setInstalledVersion(version)), - setProviderState: (provider, state) => dispatch(setProviderState(provider, state)), - setReleaseUpgradeAvailable: available => dispatch(setReleaseUpgradeAvailable(available)), }; }; diff --git a/src/components/DependencyList/Dependency/Dependency.js b/src/components/DependencyList/Dependency/Dependency.js index 7600be7..e979f10 100644 --- a/src/components/DependencyList/Dependency/Dependency.js +++ b/src/components/DependencyList/Dependency/Dependency.js @@ -25,7 +25,7 @@ export default connect(mapStateToProps)(props => { {props.onDownload(props.download); return false;}}>Install : + onClick={()=>{props.onDownload(); return false;}}>Install : 'Installing...'} diff --git a/src/components/DependencyList/DependencyList.js b/src/components/DependencyList/DependencyList.js index 4032cfe..a1a9a9b 100644 --- a/src/components/DependencyList/DependencyList.js +++ b/src/components/DependencyList/DependencyList.js @@ -1,8 +1,11 @@ import React from 'react'; import './DependencyList.css'; import {connect} from 'react-redux'; +import * as Constants from '../../constants'; import Dependency from './Dependency/Dependency'; import Box from '../UI/Box/Box'; +import {downloadItem} from '../../redux/actions/download_actions'; +import {extractFileNameFromURL} from '../../utils'; const mapStateToProps = state => { return { @@ -10,13 +13,18 @@ const mapStateToProps = state => { }; }; -export default connect(mapStateToProps)(props => { +const mapDispatchToProps = (dispatch) => { + return { + downloadItem: (name, type, url) => dispatch(downloadItem(name, type, url)) + }; +}; + +export default connect(mapStateToProps, mapDispatchToProps)(props => { const items = props.MissingDependencies.map((k, i)=> { return ( - + onDownload={()=>props.downloadItem(extractFileNameFromURL(k.download), Constants.INSTALL_TYPES.Dependency, k.download)}/> ); }); diff --git a/src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.js b/src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.js index c658984..26eb7d0 100644 --- a/src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.js +++ b/src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.js @@ -8,6 +8,7 @@ import Text from '../UI/Text/Text'; import Button from '../UI/Button/Button'; import UpgradeIcon from '../UpgradeIcon/UpgradeIcon'; import {setActiveRelease} from "../../redux/actions/release_version_actions"; +import {downloadItem} from '../../redux/actions/download_actions'; const mapStateToProps = state => { return { @@ -16,6 +17,7 @@ const mapStateToProps = state => { InstallActive: state.install.InstallActive, InstallType: state.install.InstallType, InstalledVersion: state.relver.InstalledVersion, + LocationsLookup: state.relver.LocationsLookup, MountsBusy: state.mounts.MountsBusy, Release: state.relver.Release, ReleaseUpgradeAvailable: state.relver.ReleaseUpgradeAvailable, @@ -26,11 +28,17 @@ const mapStateToProps = state => { const mapDispatchToProps = dispatch => { return { + downloadItem: (name, type, urls) => dispatch(downloadItem(name, type, urls)), setActiveRelease: (release, version) => dispatch(setActiveRelease(release, version)), } }; export default connect(mapStateToProps, mapDispatchToProps)(props => { + const handleDownloadRelease = () => { + const fileName = props.version + '.zip'; + props.downloadItem(fileName, Constants.INSTALL_TYPES.Release, props.LocationsLookup[props.version].urls); + }; + const handleReleaseChanged = e => { const release = parseInt(e.target.value, 10); const releaseVersion = props.VersionLookup[Constants.RELEASE_TYPES[release]].length - 1; @@ -88,7 +96,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => { )); } else { optionsDisplay.push(( - (dimensions.columns / 3) * 2} colSpan={20} key={key++} diff --git a/src/components/UpgradeUI/UpgradeUI.js b/src/components/UpgradeUI/UpgradeUI.js index f6b0325..9f5745c 100644 --- a/src/components/UpgradeUI/UpgradeUI.js +++ b/src/components/UpgradeUI/UpgradeUI.js @@ -1,17 +1,37 @@ import {connect} from 'react-redux'; import Button from '../UI/Button/Button'; import Box from '../UI/Box/Box'; +import * as Constants from '../../constants'; import React from 'react'; import './UpgradeUI.css'; import {setDismissUIUpgrade} from '../../redux/actions/release_version_actions'; +import {downloadItem} from '../../redux/actions/download_actions'; + +const mapStateToProps = state => { + return { + Platform: state.common.Platform, + UpgradeData: state.relver.UpgradeData, + UpgradeVersion: state.relver.UpgradeVersion, + } +}; const mapDispatchToProps = dispatch => { return { + downloadItem: (name, type, urls) => dispatch(downloadItem(name, type, urls)), setDismissUIUpgrade: dismiss => dispatch(setDismissUIUpgrade(dismiss)), }; }; -export default connect(null, mapDispatchToProps)(props => { +export default connect(mapStateToProps, mapDispatchToProps)(props => { + const handleDownload = () => { + const name = (props.Platform === 'win32') ? + 'upgrade.exe' : + (props.Platform === 'darwin') ? + 'upgrade.dmg' : + 'repertory-ui_' + props.UpgradeVersion + '_linux_x86_64.AppImage'; + props.downloadItem(name, Constants.INSTALL_TYPES.Upgrade, props.UpgradeData.urls); + }; + return ( @@ -22,7 +42,7 @@ export default connect(null, mapDispatchToProps)(props => { Install + clicked={handleDownload}>Install { ipcRenderer.send(Constants.IPC_Shutdown); } }; +}; + +export const saveState = () => { + return (dispatch, getState) => { + const state = getState(); + if (state.common.AppReady) { + let currentState = { + Release: state.relver.Release, + Version: state.relver.Version, + }; + + for (const provider of Constants.PROVIDER_LIST) { + currentState[provider] = currentState.mounts.ProviderState[provider]; + } + + if (ipcRenderer) { + ipcRenderer.send(Constants.IPC_Save_State, { + State: currentState + }); + } + } + }; }; \ No newline at end of file diff --git a/src/redux/actions/download_actions.js b/src/redux/actions/download_actions.js index 2649740..5c1d36d 100644 --- a/src/redux/actions/download_actions.js +++ b/src/redux/actions/download_actions.js @@ -1,6 +1,12 @@ import * as Constants from '../../constants'; import {createAction} from 'redux-starter-kit'; import {getIPCRenderer} from '../../utils'; +import {notifyError} from './error_actions'; +import { + installDependency, + installRelease, + installUpgrade +} from './install_actions'; export const setAllowDownload = createAction('download/setAllowDownload'); @@ -19,12 +25,36 @@ export const setDownloadBegin = (name, type, url) => { export const setDownloadEnd = createAction('download/setDownloadEnd'); export const setDownloadProgress = createAction('download/setDownloadProgress'); -export const downloadItem = (name, type, urls, completedCallback) => { +export const downloadItem = (name, type, urls) => { return (dispatch, getState) => { if (!Array.isArray(urls)) { urls = [urls]; } + const downloadComplete = result => { + if (result.Success) { + switch (type) { + case Constants.INSTALL_TYPES.Dependency: + dispatch(installDependency(result.Destination, result.URL)); + break; + case Constants.INSTALL_TYPES.Release: + dispatch(installRelease(result.Destination)); + break; + case Constants.INSTALL_TYPES.Upgrade: + //const info = this.props.LocationsLookup[this.props.AppPlatform][this.props.VersionLookup[this.props.AppPlatform][0]]; + const sha256 = null;//info.sha256; + const signature = null;//info.sig; + dispatch(installUpgrade(result.Destination, sha256, signature, !!result.SkipVerification)); + break; + default: + dispatch(notifyError('Unknown download type: ' + type)); + break; + } + } else { + dispatch(notifyError(result.Error)); + } + }; + const downloadAtIndex = index => { const url = urls[index]; const state = getState(); @@ -42,7 +72,7 @@ export const downloadItem = (name, type, urls, completedCallback) => { if (!arg.data.Success && (++index < urls.length)) { downloadAtIndex(index); } else { - completedCallback(name, type, url, arg.data); + downloadComplete(arg.data); dispatch(setDownloadEnd(arg.data)); } }; diff --git a/src/redux/actions/install_actions.js b/src/redux/actions/install_actions.js index ed3d53a..c3672e7 100644 --- a/src/redux/actions/install_actions.js +++ b/src/redux/actions/install_actions.js @@ -1,6 +1,9 @@ import * as Constants from '../../constants'; import {createAction} from 'redux-starter-kit'; -import {getIPCRenderer} from '../../utils'; +import { + getIPCRenderer, + getSelectedVersionFromState +} from '../../utils'; import {notifyError} from './error_actions'; import {setAllowDownload} from './download_actions'; import { @@ -55,7 +58,26 @@ export const checkInstalled = (dependencies, version) => { }; }; -export const installDependency = (source, url, completedCallback) => { +export const checkVersionInstalled = () => { + return (dispatch, getState) => { + const state = getState(); + + dispatch(setAllowDownload(false)); + const selectedVersion = getSelectedVersionFromState(state); + if (selectedVersion && (selectedVersion !== 'unavailable')) { + let dependencies = []; + if (state.relver.LocationsLookup[selectedVersion] && state.relver.LocationsLookup[selectedVersion].dependencies) { + dependencies = state.relver.LocationsLookup[selectedVersion].dependencies; + } + dispatch(checkInstalled(dependencies, selectedVersion)); + } else { + dispatch(setInstalledVersion('none')); + dispatch(setAllowDownload(true)); + } + }; +}; + +export const installDependency = (source, url) => { return (dispatch, getState) => { if (ipcRenderer && !getState().install.InstallActive) { dispatch(setInstallActive(Constants.INSTALL_TYPES.Dependency)); @@ -67,7 +89,7 @@ export const installDependency = (source, url, completedCallback) => { FilePath: source, }); dispatch(setInstallComplete(result)); - completedCallback(source, url, result); + dispatch(checkVersionInstalled()); }; if (result.Success && source.toLowerCase().endsWith('.dmg')) { @@ -100,18 +122,19 @@ export const installDependency = (source, url, completedCallback) => { }; }; -export const installRelease = (source, version, completedCallback) => { +export const installRelease = source => { return (dispatch, getState) => { if (ipcRenderer && !getState().install.InstallActive) { dispatch(setInstallActive(Constants.INSTALL_TYPES.Release)); + const version = getSelectedVersionFromState(getState()); const extractReleaseComplete = (event, arg) => { ipcRenderer.send(Constants.IPC_Delete_File, { FilePath: source, }); dispatch(setInstallComplete(arg.data)); - completedCallback(source, version, arg.data); + dispatch(checkVersionInstalled()); }; ipcRenderer.once(Constants.IPC_Extract_Release_Complete, extractReleaseComplete); @@ -123,19 +146,25 @@ export const installRelease = (source, version, completedCallback) => { }; }; -export const installUpgrade = (source, sha256, signature, skipVerification, completedCallback) => { +export const installUpgrade = (source, sha256, signature, skipVerification) => { return (dispatch, getState) => { if (ipcRenderer && !getState().install.InstallActive) { dispatch(setInstallActive(Constants.INSTALL_TYPES.Upgrade)); dispatch(setApplicationReady(false)); const installUpgradeComplete = (event, arg) => { - if (arg.data.Success) { + const result = arg.data; + if (result.Success) { dispatch(shutdownApplication()); } else { dispatch(setApplicationReady(true)); - dispatch(setInstallComplete(arg.data)); - completedCallback(source, arg.data); + dispatch(setInstallComplete(result)); + dispatch(notifyError(result.Error, false, () => { + // TODO Prompt to verify + if (result.AllowSkipVerification) { + dispatch(installUpgrade(source, sha256, signature, true)); + } + }, false)); } }; diff --git a/src/redux/actions/release_version_actions.js b/src/redux/actions/release_version_actions.js index 0a131de..4c8fc3b 100644 --- a/src/redux/actions/release_version_actions.js +++ b/src/redux/actions/release_version_actions.js @@ -53,6 +53,7 @@ export const loadReleases = () => { } dispatch(setReleaseUpgradeAvailable((version !== latestVersion))); dispatch(setApplicationReady(true)); + dispatch(detectUIUpgrade()); }; axios diff --git a/src/redux/reducers/release_version_reducer.js b/src/redux/reducers/release_version_reducer.js index a41d231..d0e3e4d 100644 --- a/src/redux/reducers/release_version_reducer.js +++ b/src/redux/reducers/release_version_reducer.js @@ -16,7 +16,7 @@ const versionLookup = Constants.RELEASE_TYPES.map(k=> { export const releaseVersionReducer = createReducer({ InstalledVersion: 'none', LocationsLookup: {}, - Release: 1, + Release: 0, ReleaseUpgradeAvailable: false, UpgradeAvailable: false, UpgradeData: null, diff --git a/src/utils.js b/src/utils.js index 6d99055..6d91104 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,3 +1,5 @@ +import * as Constants from './constants'; + const ipcRenderer = (!process.versions.hasOwnProperty('electron') && window && window.require) ? window.require('electron').ipcRenderer : null; @@ -11,3 +13,9 @@ export const getIPCRenderer = () => { return ipcRenderer; }; +export const getSelectedVersionFromState = state => { + return (state.relver.Version === -1) ? + 'unavailable' : + state.relver.VersionLookup[Constants.RELEASE_TYPES[state.relver.Release]][state.relver.Version]; +}; +