mirror of
https://github.com/balena-io/etcher.git
synced 2025-07-24 11:46:31 +00:00
Allow flashing from sources for which we don't know the compressed size
* don't show any percentage or eta, show the bytes written instead
This commit is contained in:
parent
6143023502
commit
a8a75f22b2
@ -56,8 +56,6 @@ const verifyNoNilFields = (object, fields, name) => {
|
||||
* @private
|
||||
*/
|
||||
const flashStateNoNilFields = [
|
||||
'percentage',
|
||||
'eta',
|
||||
'speed',
|
||||
'totalSpeed'
|
||||
]
|
||||
@ -94,8 +92,8 @@ const DEFAULT_STATE = Immutable.fromJS({
|
||||
successful: 0,
|
||||
failed: 0,
|
||||
percentage: 0,
|
||||
speed: 0,
|
||||
totalSpeed: 0
|
||||
speed: null,
|
||||
totalSpeed: null
|
||||
}
|
||||
})
|
||||
|
||||
@ -255,18 +253,6 @@ const storeReducer = (state = DEFAULT_STATE, action) => {
|
||||
})
|
||||
}
|
||||
|
||||
if (!utils.isValidPercentage(action.data.percentage)) {
|
||||
throw errors.createError({
|
||||
title: `Invalid state percentage: ${action.data.percentage}`
|
||||
})
|
||||
}
|
||||
|
||||
if (!_.isNumber(action.data.eta)) {
|
||||
throw errors.createError({
|
||||
title: `Invalid state eta: ${action.data.eta}`
|
||||
})
|
||||
}
|
||||
|
||||
return state.set('flashState', Immutable.fromJS(action.data))
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
const settings = require('../models/settings')
|
||||
const utils = require('../../../shared/utils')
|
||||
const units = require('../../../shared/units')
|
||||
|
||||
/**
|
||||
* @summary Make the progress status subtitle string
|
||||
@ -58,7 +59,11 @@ exports.fromFlashState = (state) => {
|
||||
|
||||
return 'Finishing...'
|
||||
} else if (isFlashing) {
|
||||
return `${state.percentage}% Flashing`
|
||||
if (state.percentage != null) {
|
||||
return `${state.percentage}% Flashing`
|
||||
} else {
|
||||
return `${units.bytesToClosestUnit(state.position)} flashed`
|
||||
}
|
||||
} else if (isValidating) {
|
||||
return `${state.percentage}% Validating`
|
||||
} else if (!isFlashing && !isValidating) {
|
||||
|
@ -90,7 +90,9 @@ exports.currentWindow = electron.remote.getCurrentWindow()
|
||||
* })
|
||||
*/
|
||||
exports.set = (state) => {
|
||||
exports.currentWindow.setProgressBar(utils.percentageToFloat(state.percentage))
|
||||
if (state.percentage != null) {
|
||||
exports.currentWindow.setProgressBar(utils.percentageToFloat(state.percentage))
|
||||
}
|
||||
exports.currentWindow.setTitle(getWindowTitle(state))
|
||||
}
|
||||
|
||||
|
@ -133,9 +133,9 @@
|
||||
<span class="glyphicon glyphicon-remove-sign"></span>
|
||||
</button>
|
||||
|
||||
<p class="step-footer step-footer-split" ng-if="main.state.getFlashState().speed && main.state.getFlashState().percentage != 100">
|
||||
<p class="step-footer step-footer-split" ng-if="main.state.getFlashState().speed != null && main.state.getFlashState().percentage != 100">
|
||||
<span ng-bind="main.state.getFlashState().speed.toFixed(2) + ' MB/s'"></span>
|
||||
<span>ETA: {{ main.state.getFlashState().eta | secondsToDate | amDateFormat:'m[m]ss[s]' }}</span>
|
||||
<span ng-if="main.state.getFlashState().eta != null">ETA: {{ main.state.getFlashState().eta | secondsToDate | amDateFormat:'m[m]ss[s]' }}</span>
|
||||
</p>
|
||||
|
||||
<div class="target-status-wrap" ng-if="main.state.getFlashState().failed">
|
||||
|
@ -108,15 +108,17 @@ function pipeRegularSourceToDestination(source, destination, verify, onProgress,
|
||||
flashing: destination.destinations.length,
|
||||
verifying: 0,
|
||||
failed: 0,
|
||||
successful: 0
|
||||
successful: 0,
|
||||
type: step
|
||||
}
|
||||
function updateState() {
|
||||
state.type = step
|
||||
state.failed = errors.size
|
||||
state.active = destination.destinations.length - state.failed
|
||||
if (step === 'flashing') {
|
||||
state.flashing = state.active
|
||||
state.verifying = 0
|
||||
} else if (step === 'verifying') {
|
||||
} else if (step === 'check') {
|
||||
state.flashing = 0
|
||||
state.verifying = state.active
|
||||
} else if (step === 'finished') {
|
||||
@ -128,7 +130,7 @@ function pipeRegularSourceToDestination(source, destination, verify, onProgress,
|
||||
progressEvent.percentage = progressEvent.position / sourceMetadata.size * 100
|
||||
// NOTE: We need to guard against this becoming Infinity,
|
||||
// because that value isn't transmitted properly over IPC and becomes `null`
|
||||
progressEvent.eta = progressEvent.speed ? (sourceMetadata.size - progressEvent.position) / progressEvent.speed : 0
|
||||
progressEvent.eta = progressEvent.speed ? (sourceMetadata.size - progressEvent.position) / progressEvent.speed : null
|
||||
progressEvent.totalSpeed = progressEvent.speed * state.active
|
||||
Object.assign(progressEvent, state)
|
||||
onProgress(progressEvent)
|
||||
@ -166,8 +168,13 @@ function pipeRegularSourceToDestination(source, destination, verify, onProgress,
|
||||
})
|
||||
})
|
||||
.then(() => {
|
||||
if (sourceMetadata.size == null) {
|
||||
// This is needed for compressed sources for which we don't know the uncompressed size:
|
||||
// After writing the image, we know the size.
|
||||
sourceMetadata.size = lastPosition
|
||||
}
|
||||
if (verify) {
|
||||
step = 'verifying'
|
||||
step = 'check'
|
||||
updateState()
|
||||
const verifier = destination.createVerifier(checksum, sourceMetadata.size)
|
||||
verifier.on('progress', onProgress2)
|
||||
|
@ -29,7 +29,7 @@ const prettyBytes = require('pretty-bytes')
|
||||
* @description
|
||||
* 1 MB = 1e+6 B
|
||||
*/
|
||||
const MEGABYTE_TO_BYTE_RATIO = 1e+6
|
||||
const MEGABYTE_TO_BYTE_RATIO = 1000000
|
||||
|
||||
/**
|
||||
* @summary Milliseconds in a day
|
||||
|
Loading…
x
Reference in New Issue
Block a user