Merge branch 'fix-unpackfs-progress'

This is an ugly hack, using Bill Auger's support for Job weights.
The unpackfs job is arbitrarily awarded a weight of 12. That makes it
(in a Netrunner install) use progress from 12% to 40% or so, overall,
as all the files are unpacked.

Also fixes bug reported by Kevin Kofler that unpackfs was only reporting
progress when it hit an exact multiple of 100 (instead of over 100).

SEE #1176
main
Adriaan de Groot 5 years ago
commit 96946a8447

@ -37,7 +37,12 @@ macro( _find_boost_python3_int boost_version componentname found_var )
find_package( Boost ${boost_version} QUIET COMPONENTS ${_fbp_name} )
string( TOUPPER ${_fbp_name} _fbp_uc_name )
if( Boost_${_fbp_uc_name}_FOUND )
set( ${found_var} ${_fbp_uc_name} )
if( CMAKE_SYSTEM_NAME MATCHES "FreeBSD" )
# No upcasing
set( ${found_var} ${_fbp_name} )
else()
set( ${found_var} ${_fbp_uc_name} )
endif()
break()
endif()
endforeach()
@ -63,7 +68,7 @@ macro( find_boost_python3 boost_version python_version found_var )
endif()
set( ${found_var} ${_fbp_found} )
# This is superfluous, but allows proper reporting in the features list
if ( _fbp_found )
find_package( Boost ${boost_version} COMPONENTS ${_fbp_found} )

@ -96,6 +96,14 @@ public:
explicit Job( QObject* parent = nullptr );
virtual ~Job();
/** @brief The job's (relative) weight.
*
* The default implementation returns 1.0, which gives all jobs
* the same weight, so they advance the overall progress the same
* amount. This is nonsense, since some jobs take much longer than
* others; it's up to the individual jobs to say something about
* how much work is (relatively) done.
*/
virtual qreal getJobWeight() const;
virtual QString prettyName() const = 0;
virtual QString prettyDescription() const;

@ -170,7 +170,8 @@ namespace Calamares
{
PythonJob::PythonJob( const QString& scriptFile,
PythonJob::PythonJob( const QString& instance,
const QString& scriptFile,
const QString& workingPath,
const QVariantMap& moduleConfiguration,
QObject* parent )
@ -179,12 +180,18 @@ PythonJob::PythonJob( const QString& scriptFile,
, m_workingPath( workingPath )
, m_description()
, m_configurationMap( moduleConfiguration )
, m_weight( (instance == QStringLiteral( "unpackfs" )) ? 12.0 : 1.0 )
{
}
PythonJob::~PythonJob() {}
qreal
PythonJob::getJobWeight() const
{
return m_weight;
}
QString
PythonJob::prettyName() const

@ -21,6 +21,8 @@
#include "Job.h"
#include "modulesystem/InstanceKey.h"
#include <QVariant>
namespace CalamaresPython
@ -36,7 +38,8 @@ class PythonJob : public Job
{
Q_OBJECT
public:
explicit PythonJob( const QString& scriptFile,
explicit PythonJob( const QString& instance, // TODO: InstanceKey
const QString& scriptFile,
const QString& workingPath,
const QVariantMap& moduleConfiguration = QVariantMap(),
QObject* parent = nullptr );
@ -46,6 +49,8 @@ public:
QString prettyStatusMessage() const override;
JobResult exec() override;
virtual qreal getJobWeight() const override;
private:
friend class CalamaresPython::Helper;
friend class CalamaresPython::PythonJobInterface;
@ -56,6 +61,7 @@ private:
QString m_workingPath;
QString m_description;
QVariantMap m_configurationMap;
qreal m_weight;
};
} // namespace Calamares

@ -49,7 +49,7 @@ PythonJobModule::loadSelf()
return;
}
m_job = Calamares::job_ptr( new PythonJob( m_scriptFileName, m_workingPath, m_configurationMap ) );
m_job = Calamares::job_ptr( new PythonJob( name(), m_scriptFileName, m_workingPath, m_configurationMap ) );
m_loaded = true;
}

@ -132,6 +132,9 @@ def file_copy(source, entry, progress_cb):
process = subprocess.Popen(
args, env=at_env, bufsize=1, stdout=subprocess.PIPE, close_fds=ON_POSIX
)
# last_num_files_copied trails num_files_copied, and whenever at least 100 more
# files have been copied, progress is reported and last_num_files_copied is updated.
last_num_files_copied = 0
for line in iter(process.stdout.readline, b''):
# rsync outputs progress in parentheses. Each line will have an
@ -157,7 +160,8 @@ def file_copy(source, entry, progress_cb):
num_files_copied = num_files_total_local - num_files_remaining
# I guess we're updating every 100 files...
if num_files_copied % 100 == 0:
if num_files_copied - last_num_files_copied >= 100:
last_num_files_copied = num_files_copied
progress_cb(num_files_copied, num_files_total_local)
process.wait()

Loading…
Cancel
Save