Skip to content

Commit

Permalink
add option --binary-prefix to display bit size in progress bar
Browse files Browse the repository at this point in the history
  • Loading branch information
Thomas-Tsai committed Jun 14, 2024
1 parent e9f27bf commit 28c97b3
Show file tree
Hide file tree
Showing 9 changed files with 77 additions and 27 deletions.
11 changes: 8 additions & 3 deletions docs/partclone.8
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
.\" Title: PARTCLONE
.\" Author: Yu-Chin Tsai <[email protected]>
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
.\" Date: 05/25/2024
.\" Date: 06/14/2024
.\" Manual: Partclone User Manual
.\" Source: partclone
.\" Language: English
.\"
.TH "PARTCLONE" "8" "05/25/2024" "partclone" "Partclone User Manual"
.TH "PARTCLONE" "8" "06/14/2024" "partclone" "Partclone User Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
Expand All @@ -31,7 +31,7 @@
partclone \- The utility for clone and restore a partition\&.
.SH "SYNOPSIS"
.HP \w'\fBpartclone\&.[fstype]\fR\ 'u
\fBpartclone\&.[fstype]\fR {[\fB\-c\fR\ |\ \fB\-\-clone\fR]\ [\fB\-r\fR\ |\ \fB\-\-restore\fR]\ [\fB\-b\fR\ |\ \fB\-\-dev\-to\-dev\fR]} {[\fB\-s\fR\ |\ \fB\-\-source\fR]\ \fIsource\fR} {[[\fB\-o\fR\ |\ \fB\-\-output\fR]\ [\fB\-O\fR\ |\ \fB\-\-overwrite\fR]]\ \fItarget\fR} [[\fB\-dX\fR\ |\ \fB\-\-debug=X\fR]\ [\fB\-\-restore_raw_file\fR]\ [\fB\-z\fR\ |\ \fB\-\-buffer_size\fR]\ [\fB\-N\fR\ |\ \fB\-\-ncurses\fR]\ [\fB\-q\fR\ |\ \fB\-\-quiet\fR]\ [\fB\-f\fR\ |\ \fB\-\-UI\-fresh\fR]\ [\fB\-F\fR\ |\ \fB\-\-force\fR]\ [\fB\-I\fR\ |\ \fB\-\-ignore_fschk\fR]\ [\fB\-i\fR\ |\ \fB\-\-ignore_crc\fR]\ [\fB\-C\fR\ |\ \fB\-\-nocheck\fR]\ [\fB\-R\fR\ |\ \fB\-\-rescue\fR]\ [\fB\-L\fR\ |\ \fB\-\-logfile\fR]\ \fIlogfile\fR\ [\fB\-R\fR\ |\ \fB\-\-rescue\fR]\ [\fB\-L\fR\ |\ \fB\-\-logfile\fR]\ \fIlogfile\fR\ [\fB\-X\fR\ |\ \fB\-\-compresscmd\fR]\ [\fB\-D\fR\ |\ \fB\-\-domain\fR]\ [\fB\-\-offset_domain\fR]\ [\fB\-aX\fR\ |\ \fB\-\-checksum\-mode=X\fR]\ [\fB\-kX\fR\ |\ \fB\-\-blocks\-per\-checksum=X\fR]\ [\fB\-K\fR\ |\ \fB\-\-no\-reseed\fR]\ [\fB\-w\fR\ |\ \fB\-\-skip_write_error\fR]\ [\fB\-E\fR\ |\ \fB\-\-offset=X\fR]\ [\fB\-T\fR\ |\ \fB\-\-btfiles\fR]\ [\fB\-t\fR\ |\ \fB\-\-btfiles_torrent\fR]\ [\fB\-n\fR\ |\ \fB\-\-note\fR]\ [\fB\-B\fR\ |\ \fB\-\-no_block_detail\fR]\ [\fB\-\-write\-direct\-io\fR]\ [\fB\-\-read\-direct\-io\fR]]
\fBpartclone\&.[fstype]\fR {[\fB\-c\fR\ |\ \fB\-\-clone\fR]\ [\fB\-r\fR\ |\ \fB\-\-restore\fR]\ [\fB\-b\fR\ |\ \fB\-\-dev\-to\-dev\fR]} {[\fB\-s\fR\ |\ \fB\-\-source\fR]\ \fIsource\fR} {[[\fB\-o\fR\ |\ \fB\-\-output\fR]\ [\fB\-O\fR\ |\ \fB\-\-overwrite\fR]]\ \fItarget\fR} [[\fB\-dX\fR\ |\ \fB\-\-debug=X\fR]\ [\fB\-\-restore_raw_file\fR]\ [\fB\-z\fR\ |\ \fB\-\-buffer_size\fR]\ [\fB\-N\fR\ |\ \fB\-\-ncurses\fR]\ [\fB\-q\fR\ |\ \fB\-\-quiet\fR]\ [\fB\-f\fR\ |\ \fB\-\-UI\-fresh\fR]\ [\fB\-F\fR\ |\ \fB\-\-force\fR]\ [\fB\-I\fR\ |\ \fB\-\-ignore_fschk\fR]\ [\fB\-i\fR\ |\ \fB\-\-ignore_crc\fR]\ [\fB\-C\fR\ |\ \fB\-\-nocheck\fR]\ [\fB\-R\fR\ |\ \fB\-\-rescue\fR]\ [\fB\-L\fR\ |\ \fB\-\-logfile\fR]\ \fIlogfile\fR\ [\fB\-R\fR\ |\ \fB\-\-rescue\fR]\ [\fB\-L\fR\ |\ \fB\-\-logfile\fR]\ \fIlogfile\fR\ [\fB\-X\fR\ |\ \fB\-\-compresscmd\fR]\ [\fB\-D\fR\ |\ \fB\-\-domain\fR]\ [\fB\-\-offset_domain\fR]\ [\fB\-aX\fR\ |\ \fB\-\-checksum\-mode=X\fR]\ [\fB\-kX\fR\ |\ \fB\-\-blocks\-per\-checksum=X\fR]\ [\fB\-K\fR\ |\ \fB\-\-no\-reseed\fR]\ [\fB\-w\fR\ |\ \fB\-\-skip_write_error\fR]\ [\fB\-E\fR\ |\ \fB\-\-offset=X\fR]\ [\fB\-T\fR\ |\ \fB\-\-btfiles\fR]\ [\fB\-t\fR\ |\ \fB\-\-btfiles_torrent\fR]\ [\fB\-n\fR\ |\ \fB\-\-note\fR]\ [\fB\-B\fR\ |\ \fB\-\-no_block_detail\fR]\ [\fB\-\-binary\-prefix\fR]\ [\fB\-\-write\-direct\-io\fR]\ [\fB\-\-read\-direct\-io\fR]]
.SH "DESCRIPTION"
.PP
\fBpartclone\fR\&.[fstype] is a part of
Expand Down Expand Up @@ -225,6 +225,11 @@ Reading data from SOURCE partition without cache
Show progress message without block detail
.RE
.PP
\fB\-\-binary\-prefix\fR
.RS 4
Show progress with bit size
.RE
.PP
\fB\-E\fR, \fB\-\-offset=X\fR
.RS 4
Add offset X (bytes) to OUTPUT
Expand Down
8 changes: 8 additions & 0 deletions docs/partclone.xml
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,9 @@ man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
<arg choice="plain"><option>-B</option></arg>
<arg choice="plain"><option>--no_block_detail</option></arg>
</group>
<group choice="opt">
<arg choice="plain"><option>--binary-prefix</option></arg>
</group>
<group choice="opt">
<arg choice="plain"><option>--write-direct-io</option></arg>
</group>
Expand Down Expand Up @@ -490,6 +493,11 @@ man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
<listitem>
<para>Show progress message without block detail</para>
</listitem>
</varlistentry> <varlistentry>
<term><option>--binary-prefix</option></term>
<listitem>
<para>Show progress with bit size</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-E</option></term>
Expand Down
1 change: 1 addition & 0 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,7 @@ int main(int argc, char **argv) {
else
flag = IO;
progress_init(&prog, start, stop, fs_info.totalblock, flag, fs_info.block_size);
prog.binary_prefix = opt.binary_prefix;
copied = 0; /// initial number is 0

/**
Expand Down
9 changes: 8 additions & 1 deletion src/partclone.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ int log_y_line = 0;
#define OPT_OFFSET_DOMAIN 1000
#define OPT_WRITE_DIRECT_IO 1001
#define OPT_READ_DIRECT_IO 1002
#define OPT_BINARY_PREFIX 1003
//
//enum {
// OPT_OFFSET_DOMAIN = 1000
Expand Down Expand Up @@ -268,6 +269,7 @@ void usage(void) {
" -F, --force Force progress\n"
" -f, --UI-fresh Fresh times of progress\n"
" -B, --no_block_detail Show progress message without block detail\n"
" --binary-prefix Show progress with bit size(MiB, GiB...)\n"
" -z, --buffer_size SIZE Read/write buffer size (default: %d)\n"
#ifndef CHKIMG
" -q, --quiet Disable progress message\n"
Expand Down Expand Up @@ -354,6 +356,7 @@ void parse_options(int argc, char **argv, cmd_opt* opt) {
{ "force", no_argument, NULL, 'F' },
{ "no_block_detail", no_argument, NULL, 'B' },
{ "buffer_size", required_argument, NULL, 'z' },
{ "binary-prefix", no_argument, NULL, OPT_BINARY_PREFIX },
{ "write-direct-io", no_argument, NULL, OPT_WRITE_DIRECT_IO },
{ "read-direct-io", no_argument, NULL, OPT_READ_DIRECT_IO },
// not RESTORE and not CHKIMG
Expand Down Expand Up @@ -414,6 +417,7 @@ void parse_options(int argc, char **argv, cmd_opt* opt) {
opt->blockfile = 0;
opt->write_direct_io = 0;
opt->read_direct_io = 0;
opt->binary_prefix = 0;


#ifdef DD
Expand Down Expand Up @@ -444,6 +448,9 @@ void parse_options(int argc, char **argv, cmd_opt* opt) {
case 'v':
print_version();
break;
case OPT_BINARY_PREFIX:
opt->binary_prefix = 1;
break;
case OPT_WRITE_DIRECT_IO:
opt->write_direct_io = 1;
break;
Expand Down Expand Up @@ -1903,7 +1910,7 @@ void print_partclone_info(cmd_opt opt) {
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
log_mesg(0, 0, 1, debug, _("Partclone v%s http://partclone.org\n"), VERSION);
log_mesg(0, 0, 1, debug, _("Partclone v%s (%s) http://partclone.org\n"), VERSION, git_version);
if (opt.chkimg)
log_mesg(0, 0, 1, debug, _("Starting to check image (%s)\n"), opt.source);
else if (opt.clone) {
Expand Down
1 change: 1 addition & 0 deletions src/partclone.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ struct cmd_opt
int skip_write_error;
int write_direct_io;
int read_direct_io;
int binary_prefix;
unsigned int buffer_size;
off_t offset;
unsigned long fresh;
Expand Down
69 changes: 48 additions & 21 deletions src/progress.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ extern void progress_init(struct progress_bar *prog, int start, unsigned long lo
prog->start = start;
prog->stop = stop;
prog->total = total;
prog->binary_prefix = 0;

prog->unit = 100.0 / (stop - start);
prog->total_unit = 100.0 / (total - start);
Expand Down Expand Up @@ -116,10 +117,14 @@ static void calculate_speed(struct progress_bar *prog, unsigned long long copied
char Rformated[12], Eformated[12];
char speed_unit[] = " ";
struct tm *Rtm, *Etm;
uint64_t gbyte=1000000000.0;
uint64_t mbyte=1000000;
uint64_t kbyte=1000;
uint64_t gibyte = pow(2,30);
uint64_t mibyte = pow(2,20);
uint64_t kibyte = pow(2,10);
uint64_t gbyte = 1000000000.0;
uint64_t mbyte = 1000000;
uint64_t kbyte = 1000;
int spflen = 0;
int prefered_bits_size = prog->binary_prefix;

percent = prog->unit * copied;
if (percent <= 0)
Expand All @@ -134,24 +139,46 @@ static void calculate_speed(struct progress_bar *prog, unsigned long long copied
speedps = prog->block_size * copied / elapsed;
speed = speedps * 60.0;

prog_stat->percent = percent;

if (speed >= gbyte){
dspeed = (double)speed / (double)gbyte;
strncpy(speed_unit, "GB", 3);
strncpy(prog_stat->speed_unit, speed_unit, 3);
}else if (speed >= mbyte){
dspeed = (double)speed / (double)mbyte;
strncpy(speed_unit, "MB", 3);
strncpy(prog_stat->speed_unit, speed_unit, 3);
}else if (speed >= kbyte){
dspeed = (double)speed / (double)kbyte;
strncpy(speed_unit, "KB", 3);
strncpy(prog_stat->speed_unit, speed_unit, 3);
}else{
dspeed = speed;
strncpy(speed_unit, "byte", 5);
strncpy(prog_stat->speed_unit, speed_unit, 5);
prog_stat->percent = percent;
if ( prefered_bits_size ){

if (speed >= gibyte){
dspeed = (double)speed / (double)gibyte;
strncpy(speed_unit, "GiB", 3);
strncpy(prog_stat->speed_unit, speed_unit, 3);
}else if (speed >= mibyte){
dspeed = (double)speed / (double)mibyte;
strncpy(speed_unit, "MiB", 3);
strncpy(prog_stat->speed_unit, speed_unit, 3);
}else if (speed >= kbyte){
dspeed = (double)speed / (double)kibyte;
strncpy(speed_unit, "KiB", 3);
strncpy(prog_stat->speed_unit, speed_unit, 3);
}else{
dspeed = speed;
strncpy(speed_unit, "byte", 5);
strncpy(prog_stat->speed_unit, speed_unit, 5);
}

} else {

if (speed >= gbyte){
dspeed = (double)speed / (double)gbyte;
strncpy(speed_unit, "GB", 3);
strncpy(prog_stat->speed_unit, speed_unit, 3);
}else if (speed >= mbyte){
dspeed = (double)speed / (double)mbyte;
strncpy(speed_unit, "MB", 3);
strncpy(prog_stat->speed_unit, speed_unit, 3);
}else if (speed >= kbyte){
dspeed = (double)speed / (double)kbyte;
strncpy(speed_unit, "KB", 3);
strncpy(prog_stat->speed_unit, speed_unit, 3);
}else{
dspeed = speed;
strncpy(speed_unit, "byte", 5);
strncpy(prog_stat->speed_unit, speed_unit, 5);
}
}

prog_stat->total_percent = prog->total_unit * current;
Expand Down
1 change: 1 addition & 0 deletions src/progress.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ struct progress_bar {
float total_unit;
int pui;
int flag;
int binary_prefix;
};
typedef struct progress_bar progress_bar;

Expand Down
2 changes: 1 addition & 1 deletion src/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
* WHETHER THEY ARE BUILT BY OTHERS OR DURING DEVELOPMENT OR FOR THE
* OFFICIAL PARTCLONE RELEASES.
*/
#define git_version "6de74163222761ec40548b669f5b78547c7fb148"
#define git_version "e9f27bf"

2 changes: 1 addition & 1 deletion toolbox
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ cat > ${file}.tmp << EOF
* WHETHER THEY ARE BUILT BY OTHERS OR DURING DEVELOPMENT OR FOR THE
* OFFICIAL PARTCLONE RELEASES.
*/
#define git_version "$git_ver"
#define git_version "${git_ver:0:7}"
EOF
# Do not modify the version file if the content did not change
Expand Down

0 comments on commit 28c97b3

Please sign in to comment.