]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
sfdisk: (--move-data) add simple progress bar
authorKarel Zak <kzak@redhat.com>
Fri, 6 Sep 2019 13:05:21 +0000 (15:05 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 6 Sep 2019 13:07:59 +0000 (15:07 +0200)
Addresses: https://github.com/karelzak/util-linux/issues/848
Signed-off-by: Karel Zak <kzak@redhat.com>
disk-utils/sfdisk.c

index cbae88b9a388a7195292754abb093f080aa8eec3..53ae310102867087d786d55718c6bf45df9e19bd 100644 (file)
@@ -373,7 +373,7 @@ static int move_partition_data(struct sfdisk *sf, size_t partno, struct fdisk_pa
        fdisk_sector_t nsectors, from, to, step, i;
        size_t io, ss, step_bytes, cc;
        uintmax_t src, dst;
-       int errsv;
+       int errsv, progress = 0;
 
        assert(sf->movedata);
 
@@ -452,6 +452,9 @@ static int move_partition_data(struct sfdisk *sf, size_t partno, struct fdisk_pa
                printf(_("  step size: %zu bytes\n"), step_bytes);
                putchar('\n');
                fflush(stdout);
+
+               if (isatty(fileno(stdout)))
+                       progress = 1;
        }
 
        if (sf->interactive) {
@@ -523,6 +526,14 @@ static int move_partition_data(struct sfdisk *sf, size_t partno, struct fdisk_pa
                /* write log */
                if (f)
                        fprintf(f, "%05zu: %12ju %12ju\n", cc, src, dst);
+               if (progress) {
+                       fprintf(stdout, _("Moved %ju from %ju sectors (%.3f%%)."),
+                                       i + 1, nsectors,
+                                       100.0 / ((double) nsectors/(i+1)));
+                       fflush(stdout);
+                        fputc('\r', stdout);
+               }
+
 
 #if defined(POSIX_FADV_DONTNEED) && defined(HAVE_POSIX_FADVISE)
                if (!sf->noact)
@@ -532,6 +543,12 @@ static int move_partition_data(struct sfdisk *sf, size_t partno, struct fdisk_pa
                        src += step_bytes, dst += step_bytes;
        }
 
+       if (progress) {
+               fprintf(stdout, _("Moved %ju from %ju sectors (%.3f%%)."),
+                               i, nsectors,
+                               100.0 / ((double) nsectors/(i+1)));
+               fputc('\n', stdout);
+       }
        if (f)
                fclose(f);
        free(buf);