Refactoring

This commit is contained in:
Scott E. Graves
2019-07-15 14:54:28 -05:00
parent d7759402f6
commit f006beb8d9
14 changed files with 261 additions and 355 deletions

View File

@@ -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() { function createWindow() {
loadUiSettings(); loadUiSettings();
@@ -123,14 +134,7 @@ function createWindow() {
// when you should delete the corresponding element. // when you should delete the corresponding element.
mainWindow = null; mainWindow = null;
// Unmount all items unmountAllDrives();
for (const i in mountedLocations) {
const data = mountedData[mountedLocations[i]];
helpers.stopMountProcessSync(data.Version, data.Provider);
}
mountedLocations = [];
mountedData = {};
}); });
const appPath = (os.platform() === 'win32') ? path.resolve(path.join(app.getAppPath(), '..\\..\\repertory-ui.exe')) : 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) => { ipcMain.on(Constants.IPC_Install_Upgrade, (event, data) => {
let allowSkipVerification = true; let allowSkipVerification = true;
unmountAllDrives();
let tempSig; let tempSig;
let tempPub; let tempPub;
const cleanupFiles = () => { const cleanupFiles = () => {

View File

@@ -1,220 +1,172 @@
{ {
"Locations": { "Locations": {
"arch": { "arch": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"centos7": { "centos7": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"darwin": { "darwin": {
"1.0.4": { "1.0.5": {
"sha256": "4c33ba2a0dae3604e10e0078bdca27abc1dad7dec5132746f47e151c9d1c9f75", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/uKrr0H5r",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_mac.dmg"
]
} }
}, },
"debian9": { "debian9": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"debian10": { "debian10": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"fedora28": { "fedora28": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"fedora29": { "fedora29": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"fedora30": { "fedora30": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"opensuse15": { "opensuse15": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"opensuse15.1": { "opensuse15.1": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"solus": { "solus": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"tumbleweed": { "tumbleweed": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"ubuntu18.04": { "ubuntu18.04": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"ubuntu18.10": { "ubuntu18.10": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"ubuntu19.04": { "ubuntu19.04": {
"1.0.4": { "1.0.5": {
"sha256": "09b9faaba24a8c199a2b104a9be3395c2ef8c6e25a934c34b1c617529d252ae0", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/jVeUr8Zq",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_linux_x86_64.AppImage"
]
} }
}, },
"win32": { "win32": {
"1.0.4": { "1.0.5": {
"sha256": "e669f54fb80ef84cba36dc031904ae76e4dcd93ef760fa432670c6ffcb597886", "sha256": "",
"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=", "sig": "",
"urls": [ "urls": []
"https://pixeldrain.com/api/file/PlUcsmJN",
"https://bitbucket.org/blockstorage/repertory-ui/downloads/repertory-ui_1.0.4_win.exe"
]
} }
} }
}, },
"Versions": { "Versions": {
"arch": [ "arch": [
"1.0.4" "1.0.5"
], ],
"centos7": [ "centos7": [
"1.0.4" "1.0.5"
], ],
"darwin": [ "darwin": [
"1.0.4" "1.0.5"
], ],
"debian9": [ "debian9": [
"1.0.4" "1.0.5"
], ],
"debian10": [ "debian10": [
"1.0.4" "1.0.5"
], ],
"fedora28": [ "fedora28": [
"1.0.4" "1.0.5"
], ],
"fedora29": [ "fedora29": [
"1.0.4" "1.0.5"
], ],
"fedora30": [ "fedora30": [
"1.0.4" "1.0.5"
], ],
"linux": [ "linux": [
"unavailable" "unavailable"
], ],
"opensuse15": [ "opensuse15": [
"1.0.4" "1.0.5"
], ],
"opensuse15.1": [ "opensuse15.1": [
"1.0.4" "1.0.5"
], ],
"solus": [ "solus": [
"1.0.4" "1.0.5"
], ],
"tumbleweed": [ "tumbleweed": [
"1.0.4" "1.0.5"
], ],
"ubuntu18.04": [ "ubuntu18.04": [
"1.0.4" "1.0.5"
], ],
"ubuntu18.10": [ "ubuntu18.10": [
"1.0.4" "1.0.5"
], ],
"ubuntu19.04": [ "ubuntu19.04": [
"1.0.4" "1.0.5"
], ],
"unknown": [ "unknown": [
"unavailable" "unavailable"
], ],
"win32": [ "win32": [
"1.0.4" "1.0.5"
] ]
} }
} }

View File

@@ -5,81 +5,51 @@ import Configuration from './containers/Configuration/Configuration';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import DependencyList from './components/DependencyList/DependencyList'; import DependencyList from './components/DependencyList/DependencyList';
import DownloadProgress from './components/DownloadProgress/DownloadProgress'; import DownloadProgress from './components/DownloadProgress/DownloadProgress';
import {extractFileNameFromURL} from './utils';
import ErrorDetails from './components/ErrorDetails/ErrorDetails'; import ErrorDetails from './components/ErrorDetails/ErrorDetails';
import Grid from './components/UI/Grid/Grid'; import Grid from './components/UI/Grid/Grid';
import IPCContainer from './containers/IPCContainer/IPCContainer'; import IPCContainer from './containers/IPCContainer/IPCContainer';
import Loading from './components/UI/Loading/Loading'; import Loading from './components/UI/Loading/Loading';
import Modal from './components/UI/Modal/Modal'; import Modal from './components/UI/Modal/Modal';
import MountItems from './containers/MountItems/MountItems'; import MountItems from './containers/MountItems/MountItems';
import {notifyError} from './redux/actions/error_actions';
import ReleaseVersionDisplay from './components/ReleaseVersionDisplay/ReleaseVersionDisplay'; import ReleaseVersionDisplay from './components/ReleaseVersionDisplay/ReleaseVersionDisplay';
import {setProviderState} from './redux/actions/mount_actions';
import Text from './components/UI/Text/Text'; import Text from './components/UI/Text/Text';
import UpgradeIcon from './components/UpgradeIcon/UpgradeIcon'; import UpgradeIcon from './components/UpgradeIcon/UpgradeIcon';
import UpgradeUI from './components/UpgradeUI/UpgradeUI'; import UpgradeUI from './components/UpgradeUI/UpgradeUI';
import {checkVersionInstalled} from './redux/actions/install_actions';
import { import {
downloadItem,
setAllowDownload
} from './redux/actions/download_actions';
import {
checkInstalled,
installDependency,
installRelease,
installUpgrade
} from './redux/actions/install_actions';
import {
detectUIUpgrade,
loadReleases, loadReleases,
setActiveRelease, setDismissUIUpgrade
setDismissUIUpgrade,
setInstalledVersion,
setReleaseUpgradeAvailable
} from './redux/actions/release_version_actions'; } from './redux/actions/release_version_actions';
import {saveState} from './redux/actions/common_actions';
const Constants = require('./constants'); const Constants = require('./constants');
const Scheduler = require('node-schedule'); const Scheduler = require('node-schedule');
class App extends IPCContainer { 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() { componentDidMount() {
this._isMounted = true; const detectUpgrades = () => {
this.scheduledUpdateJob = Scheduler.scheduleJob('23 11 * * *', this.updateCheckScheduledJob); if (this.props.AppPlatform !== 'unknown') {
this.detectUpgrades(); this.props.loadReleases();
}
};
this.scheduledUpdateJob = Scheduler.scheduleJob('23 11 * * *', detectUpgrades);
detectUpgrades();
} }
componentDidUpdate(prevProps) { componentDidUpdate(prevProps) {
if ((prevProps.Release !== this.props.Release) || if ((prevProps.Release !== this.props.Release) ||
(prevProps.ReleaseVersion !== this.props.ReleaseVersion) || (prevProps.ReleaseVersion !== this.props.ReleaseVersion) ||
(prevProps.VersionLookup !== this.props.VersionLookup)) { (prevProps.VersionLookup !== this.props.VersionLookup)) {
this.saveState(); this.props.saveState();
this.checkVersionInstalled(); this.props.checkVersionInstalled();
} else if (Object.keys(this.props.ProviderState).filter(k=> { } else if (Object.keys(this.props.ProviderState).filter(k=> {
return this.props.ProviderState[k] !== prevProps.ProviderState[k]; return this.props.ProviderState[k] !== prevProps.ProviderState[k];
}).length > 0) { }).length > 0) {
this.saveState(); this.props.saveState();
} }
} }
componentWillUnmount() { componentWillUnmount() {
this._isMounted = false;
Scheduler.cancelJob(this.scheduledUpdateJob); Scheduler.cancelJob(this.scheduledUpdateJob);
super.componentWillUnmount(); super.componentWillUnmount();
} }
@@ -89,129 +59,12 @@ class App extends IPCContainer {
return condition ? (<Modal {...modalProps}>{jsx}</Modal>) : null; return condition ? (<Modal {...modalProps}>{jsx}</Modal>) : null;
}; };
detectUpgrades = () => {
if (this.props.AppPlatform !== 'unknown') {
this.props.loadReleases();
this.props.detectUIUpgrade();
}
};
getSelectedVersion = () => { getSelectedVersion = () => {
return (this.props.ReleaseVersion === -1) ? return (this.props.ReleaseVersion === -1) ?
'unavailable' : 'unavailable' :
this.props.VersionLookup[Constants.RELEASE_TYPES[this.props.Release]][this.props.ReleaseVersion]; 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() { render() {
const selectedVersion = this.getSelectedVersion(); const selectedVersion = this.getSelectedVersion();
@@ -251,10 +104,10 @@ class App extends IPCContainer {
!this.props.DownloadActive; !this.props.DownloadActive;
const configDisplay = this.createModalConditionally(showConfig, <Configuration version={selectedVersion} />); const configDisplay = this.createModalConditionally(showConfig, <Configuration version={selectedVersion} />);
const dependencyDisplay = this.createModalConditionally(showDependencies, <DependencyList onDownload={this.handleDownloadDependency}/>); const dependencyDisplay = this.createModalConditionally(showDependencies, <DependencyList/>);
const downloadDisplay = this.createModalConditionally(this.props.DownloadActive, <DownloadProgress/>); const downloadDisplay = this.createModalConditionally(this.props.DownloadActive, <DownloadProgress/>);
const errorDisplay = this.createModalConditionally(this.props.DisplayError, <ErrorDetails/>, true); const errorDisplay = this.createModalConditionally(this.props.DisplayError, <ErrorDetails/>, true);
const upgradeDisplay = this.createModalConditionally(showUpgrade, <UpgradeUI upgrade={this.handleDownloadUpgrade}/>); const upgradeDisplay = this.createModalConditionally(showUpgrade, <UpgradeUI/>);
let mainContent = []; let mainContent = [];
if (this.props.AppReady) { if (this.props.AppReady) {
@@ -262,8 +115,8 @@ class App extends IPCContainer {
mainContent.push(( mainContent.push((
<div key={'rvd_' + key++} <div key={'rvd_' + key++}
style={{height: '32%'}}> style={{height: '32%'}}>
<ReleaseVersionDisplay downloadClicked={this.handleDownloadRelease} <ReleaseVersionDisplay downloadDisabled={!downloadEnabled}
downloadDisabled={!downloadEnabled}/> version={selectedVersion}/>
</div> </div>
)); ));
@@ -327,21 +180,16 @@ const mapStateToProps = state => {
DisplayConfiguration: state.mounts.DisplayConfiguration, DisplayConfiguration: state.mounts.DisplayConfiguration,
DisplayError: state.error.DisplayError, DisplayError: state.error.DisplayError,
DownloadActive: state.download.DownloadActive, DownloadActive: state.download.DownloadActive,
DownloadType: state.download.DownloadType,
InstallActive: state.install.InstallActive, InstallActive: state.install.InstallActive,
InstallType: state.install.InstallType,
InstalledVersion: state.relver.InstalledVersion, InstalledVersion: state.relver.InstalledVersion,
LocationsLookup: state.relver.LocationsLookup, LocationsLookup: state.relver.LocationsLookup,
MissingDependencies: state.install.MissingDependencies, MissingDependencies: state.install.MissingDependencies,
MountsBusy: state.mounts.MountsBusy, MountsBusy: state.mounts.MountsBusy,
Platform: state.common.Platform,
ProviderState: state.mounts.ProviderState, ProviderState: state.mounts.ProviderState,
Release: state.relver.Release, Release: state.relver.Release,
ReleaseVersion: state.relver.Version, ReleaseVersion: state.relver.Version,
UpgradeAvailable: state.relver.UpgradeAvailable, UpgradeAvailable: state.relver.UpgradeAvailable,
UpgradeData: state.relver.UpgradeData,
UpgradeDismissed: state.relver.UpgradeDismissed, UpgradeDismissed: state.relver.UpgradeDismissed,
UpgradeVersion: state.relver.UpgradeVersion,
Version: state.common.Version, Version: state.common.Version,
VersionLookup: state.relver.VersionLookup, VersionLookup: state.relver.VersionLookup,
}; };
@@ -349,20 +197,10 @@ const mapStateToProps = state => {
const mapDispatchToProps = dispatch => { const mapDispatchToProps = dispatch => {
return { return {
checkInstalled: (dependencies, version) => dispatch(checkInstalled(dependencies, version)), checkVersionInstalled: () => dispatch(checkVersionInstalled()),
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)),
loadReleases: ()=> dispatch(loadReleases()), loadReleases: ()=> dispatch(loadReleases()),
notifyError: (msg, critical, callback) => dispatch(notifyError(msg, critical, callback)), saveState: () => dispatch(saveState()),
setActiveRelease: (release, version) => dispatch(setActiveRelease(release, version)),
setAllowDownload: allow => dispatch(setAllowDownload(allow)),
setDismissUIUpgrade: dismiss => dispatch(setDismissUIUpgrade(dismiss)), setDismissUIUpgrade: dismiss => dispatch(setDismissUIUpgrade(dismiss)),
setInstalledVersion: version => dispatch(setInstalledVersion(version)),
setProviderState: (provider, state) => dispatch(setProviderState(provider, state)),
setReleaseUpgradeAvailable: available => dispatch(setReleaseUpgradeAvailable(available)),
}; };
}; };

View File

@@ -25,7 +25,7 @@ export default connect(mapStateToProps)(props => {
<a <a
href={void(0)} href={void(0)}
className={'DependencyLink'} className={'DependencyLink'}
onClick={()=>{props.onDownload(props.download); return false;}}><u>Install</u></a> : onClick={()=>{props.onDownload(); return false;}}><u>Install</u></a> :
'Installing...'} 'Installing...'}
</td> </td>
</tr> </tr>

View File

@@ -1,8 +1,11 @@
import React from 'react'; import React from 'react';
import './DependencyList.css'; import './DependencyList.css';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import * as Constants from '../../constants';
import Dependency from './Dependency/Dependency'; import Dependency from './Dependency/Dependency';
import Box from '../UI/Box/Box'; import Box from '../UI/Box/Box';
import {downloadItem} from '../../redux/actions/download_actions';
import {extractFileNameFromURL} from '../../utils';
const mapStateToProps = state => { const mapStateToProps = state => {
return { 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)=> { const items = props.MissingDependencies.map((k, i)=> {
return ( return (
<Dependency download={k.download} <Dependency key={i}
key={i}
name={k.display} name={k.display}
onDownload={props.onDownload}/> onDownload={()=>props.downloadItem(extractFileNameFromURL(k.download), Constants.INSTALL_TYPES.Dependency, k.download)}/>
); );
}); });

View File

@@ -8,6 +8,7 @@ import Text from '../UI/Text/Text';
import Button from '../UI/Button/Button'; import Button from '../UI/Button/Button';
import UpgradeIcon from '../UpgradeIcon/UpgradeIcon'; import UpgradeIcon from '../UpgradeIcon/UpgradeIcon';
import {setActiveRelease} from "../../redux/actions/release_version_actions"; import {setActiveRelease} from "../../redux/actions/release_version_actions";
import {downloadItem} from '../../redux/actions/download_actions';
const mapStateToProps = state => { const mapStateToProps = state => {
return { return {
@@ -16,6 +17,7 @@ const mapStateToProps = state => {
InstallActive: state.install.InstallActive, InstallActive: state.install.InstallActive,
InstallType: state.install.InstallType, InstallType: state.install.InstallType,
InstalledVersion: state.relver.InstalledVersion, InstalledVersion: state.relver.InstalledVersion,
LocationsLookup: state.relver.LocationsLookup,
MountsBusy: state.mounts.MountsBusy, MountsBusy: state.mounts.MountsBusy,
Release: state.relver.Release, Release: state.relver.Release,
ReleaseUpgradeAvailable: state.relver.ReleaseUpgradeAvailable, ReleaseUpgradeAvailable: state.relver.ReleaseUpgradeAvailable,
@@ -26,11 +28,17 @@ const mapStateToProps = state => {
const mapDispatchToProps = dispatch => { const mapDispatchToProps = dispatch => {
return { return {
downloadItem: (name, type, urls) => dispatch(downloadItem(name, type, urls)),
setActiveRelease: (release, version) => dispatch(setActiveRelease(release, version)), setActiveRelease: (release, version) => dispatch(setActiveRelease(release, version)),
} }
}; };
export default connect(mapStateToProps, mapDispatchToProps)(props => { 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 handleReleaseChanged = e => {
const release = parseInt(e.target.value, 10); const release = parseInt(e.target.value, 10);
const releaseVersion = props.VersionLookup[Constants.RELEASE_TYPES[release]].length - 1; const releaseVersion = props.VersionLookup[Constants.RELEASE_TYPES[release]].length - 1;
@@ -88,7 +96,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
)); ));
} else { } else {
optionsDisplay.push(( optionsDisplay.push((
<Button clicked={props.downloadClicked} <Button clicked={handleDownloadRelease}
col={dimensions => (dimensions.columns / 3) * 2} col={dimensions => (dimensions.columns / 3) * 2}
colSpan={20} colSpan={20}
key={key++} key={key++}

View File

@@ -1,17 +1,37 @@
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import Button from '../UI/Button/Button'; import Button from '../UI/Button/Button';
import Box from '../UI/Box/Box'; import Box from '../UI/Box/Box';
import * as Constants from '../../constants';
import React from 'react'; import React from 'react';
import './UpgradeUI.css'; import './UpgradeUI.css';
import {setDismissUIUpgrade} from '../../redux/actions/release_version_actions'; 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 => { const mapDispatchToProps = dispatch => {
return { return {
downloadItem: (name, type, urls) => dispatch(downloadItem(name, type, urls)),
setDismissUIUpgrade: dismiss => dispatch(setDismissUIUpgrade(dismiss)), 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 ( return (
<Box dxStyle={{width: '180px', height: 'auto', padding: '5px'}}> <Box dxStyle={{width: '180px', height: 'auto', padding: '5px'}}>
<div style={{width: '100%', height: 'auto'}}> <div style={{width: '100%', height: 'auto'}}>
@@ -22,7 +42,7 @@ export default connect(null, mapDispatchToProps)(props => {
<tr> <tr>
<td width="50%"> <td width="50%">
<Button buttonStyles={{width: '100%'}} <Button buttonStyles={{width: '100%'}}
clicked={props.upgrade}>Install</Button> clicked={handleDownload}>Install</Button>
</td> </td>
<td width="50%"> <td width="50%">
<Button buttonStyles={{width: '100%'}} <Button buttonStyles={{width: '100%'}}

View File

@@ -27,37 +27,21 @@ exports.DEV_PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----\n' +
'9wIDAQAB\n' + '9wIDAQAB\n' +
'-----END PUBLIC KEY-----'; '-----END PUBLIC KEY-----';
exports.RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory/raw/master/releases.json'; exports.RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory/raw/1.0.0-release_branch/releases.json';
exports.UI_RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory-ui/raw/master/releases.json'; exports.UI_RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory-ui/raw/1.0.5_branch/releases.json';
exports.DATA_LOCATIONS = { exports.DATA_LOCATIONS = {
arch: '~/.local/repertory/ui',
centos7: '~/.local/repertory/ui',
debian9: '~/.local/repertory/ui',
debian10: '~/.local/repertory/ui',
fedora28: '~/.local/repertory/ui',
fedora29: '~/.local/repertory/ui',
fedora30: '~/.local/repertory/ui',
linux: '~/.local/repertory/ui', linux: '~/.local/repertory/ui',
opensuse15: '~/.local/repertory/ui',
'opensuse15.1': '~/.local/repertory/ui',
solus: '~/.local/repertory/ui',
tumbleweed: '~/.local/repertory/ui',
'ubuntu18.04': '~/.local/repertory/ui',
'ubuntu18.10': '~/.local/repertory/ui',
'ubuntu19.04': '~/.local/repertory/ui',
darwin: '~/Library/Application Support/repertory/ui', darwin: '~/Library/Application Support/repertory/ui',
win32: '%LOCALAPPDATA%\\repertory\\ui' win32: '%LOCALAPPDATA%\\repertory\\ui'
}; };
exports.PROVIDER_LIST = [ exports.PROVIDER_LIST = [
//'Hyperspace',
'Sia', 'Sia',
'SiaPrime' 'SiaPrime'
]; ];
exports.PROVIDER_ARG = { exports.PROVIDER_ARG = {
//hyperspace: '-hs',
sia: '', sia: '',
siaprime: '-sp' siaprime: '-sp'
}; };

View File

@@ -21,4 +21,26 @@ export const shutdownApplication = () => {
ipcRenderer.send(Constants.IPC_Shutdown); 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
});
}
}
};
}; };

View File

@@ -1,6 +1,12 @@
import * as Constants from '../../constants'; import * as Constants from '../../constants';
import {createAction} from 'redux-starter-kit'; import {createAction} from 'redux-starter-kit';
import {getIPCRenderer} from '../../utils'; import {getIPCRenderer} from '../../utils';
import {notifyError} from './error_actions';
import {
installDependency,
installRelease,
installUpgrade
} from './install_actions';
export const setAllowDownload = createAction('download/setAllowDownload'); export const setAllowDownload = createAction('download/setAllowDownload');
@@ -19,12 +25,36 @@ export const setDownloadBegin = (name, type, url) => {
export const setDownloadEnd = createAction('download/setDownloadEnd'); export const setDownloadEnd = createAction('download/setDownloadEnd');
export const setDownloadProgress = createAction('download/setDownloadProgress'); export const setDownloadProgress = createAction('download/setDownloadProgress');
export const downloadItem = (name, type, urls, completedCallback) => { export const downloadItem = (name, type, urls) => {
return (dispatch, getState) => { return (dispatch, getState) => {
if (!Array.isArray(urls)) { if (!Array.isArray(urls)) {
urls = [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 downloadAtIndex = index => {
const url = urls[index]; const url = urls[index];
const state = getState(); const state = getState();
@@ -42,7 +72,7 @@ export const downloadItem = (name, type, urls, completedCallback) => {
if (!arg.data.Success && (++index < urls.length)) { if (!arg.data.Success && (++index < urls.length)) {
downloadAtIndex(index); downloadAtIndex(index);
} else { } else {
completedCallback(name, type, url, arg.data); downloadComplete(arg.data);
dispatch(setDownloadEnd(arg.data)); dispatch(setDownloadEnd(arg.data));
} }
}; };

View File

@@ -1,6 +1,9 @@
import * as Constants from '../../constants'; import * as Constants from '../../constants';
import {createAction} from 'redux-starter-kit'; import {createAction} from 'redux-starter-kit';
import {getIPCRenderer} from '../../utils'; import {
getIPCRenderer,
getSelectedVersionFromState
} from '../../utils';
import {notifyError} from './error_actions'; import {notifyError} from './error_actions';
import {setAllowDownload} from './download_actions'; import {setAllowDownload} from './download_actions';
import { 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) => { return (dispatch, getState) => {
if (ipcRenderer && !getState().install.InstallActive) { if (ipcRenderer && !getState().install.InstallActive) {
dispatch(setInstallActive(Constants.INSTALL_TYPES.Dependency)); dispatch(setInstallActive(Constants.INSTALL_TYPES.Dependency));
@@ -67,7 +89,7 @@ export const installDependency = (source, url, completedCallback) => {
FilePath: source, FilePath: source,
}); });
dispatch(setInstallComplete(result)); dispatch(setInstallComplete(result));
completedCallback(source, url, result); dispatch(checkVersionInstalled());
}; };
if (result.Success && source.toLowerCase().endsWith('.dmg')) { 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) => { return (dispatch, getState) => {
if (ipcRenderer && !getState().install.InstallActive) { if (ipcRenderer && !getState().install.InstallActive) {
dispatch(setInstallActive(Constants.INSTALL_TYPES.Release)); dispatch(setInstallActive(Constants.INSTALL_TYPES.Release));
const version = getSelectedVersionFromState(getState());
const extractReleaseComplete = (event, arg) => { const extractReleaseComplete = (event, arg) => {
ipcRenderer.send(Constants.IPC_Delete_File, { ipcRenderer.send(Constants.IPC_Delete_File, {
FilePath: source, FilePath: source,
}); });
dispatch(setInstallComplete(arg.data)); dispatch(setInstallComplete(arg.data));
completedCallback(source, version, arg.data); dispatch(checkVersionInstalled());
}; };
ipcRenderer.once(Constants.IPC_Extract_Release_Complete, extractReleaseComplete); 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) => { return (dispatch, getState) => {
if (ipcRenderer && !getState().install.InstallActive) { if (ipcRenderer && !getState().install.InstallActive) {
dispatch(setInstallActive(Constants.INSTALL_TYPES.Upgrade)); dispatch(setInstallActive(Constants.INSTALL_TYPES.Upgrade));
dispatch(setApplicationReady(false)); dispatch(setApplicationReady(false));
const installUpgradeComplete = (event, arg) => { const installUpgradeComplete = (event, arg) => {
if (arg.data.Success) { const result = arg.data;
if (result.Success) {
dispatch(shutdownApplication()); dispatch(shutdownApplication());
} else { } else {
dispatch(setApplicationReady(true)); dispatch(setApplicationReady(true));
dispatch(setInstallComplete(arg.data)); dispatch(setInstallComplete(result));
completedCallback(source, arg.data); dispatch(notifyError(result.Error, false, () => {
// TODO Prompt to verify
if (result.AllowSkipVerification) {
dispatch(installUpgrade(source, sha256, signature, true));
}
}, false));
} }
}; };

View File

@@ -53,6 +53,7 @@ export const loadReleases = () => {
} }
dispatch(setReleaseUpgradeAvailable((version !== latestVersion))); dispatch(setReleaseUpgradeAvailable((version !== latestVersion)));
dispatch(setApplicationReady(true)); dispatch(setApplicationReady(true));
dispatch(detectUIUpgrade());
}; };
axios axios

View File

@@ -16,7 +16,7 @@ const versionLookup = Constants.RELEASE_TYPES.map(k=> {
export const releaseVersionReducer = createReducer({ export const releaseVersionReducer = createReducer({
InstalledVersion: 'none', InstalledVersion: 'none',
LocationsLookup: {}, LocationsLookup: {},
Release: 1, Release: 0,
ReleaseUpgradeAvailable: false, ReleaseUpgradeAvailable: false,
UpgradeAvailable: false, UpgradeAvailable: false,
UpgradeData: null, UpgradeData: null,

View File

@@ -1,3 +1,5 @@
import * as Constants from './constants';
const ipcRenderer = (!process.versions.hasOwnProperty('electron') && window && window.require) ? const ipcRenderer = (!process.versions.hasOwnProperty('electron') && window && window.require) ?
window.require('electron').ipcRenderer : window.require('electron').ipcRenderer :
null; null;
@@ -11,3 +13,9 @@ export const getIPCRenderer = () => {
return ipcRenderer; return ipcRenderer;
}; };
export const getSelectedVersionFromState = state => {
return (state.relver.Version === -1) ?
'unavailable' :
state.relver.VersionLookup[Constants.RELEASE_TYPES[state.relver.Release]][state.relver.Version];
};