Subject: pkg/30551: human readable format for pkgsrc/misc/colorls
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: Holger Weiss <holger@jhweiss.de>
List: pkgsrc-bugs
Date: 06/18/2005 21:15:01
>Number: 30551
>Category: pkg
>Synopsis: human readable format for pkgsrc/misc/colorls
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: pkg-manager
>State: open
>Class: change-request
>Submitter-Id: net
>Arrival-Date: Sat Jun 18 21:15:00 +0000 2005
>Originator: Holger Weiss
>Release: NetBSD 2.0_STABLE
>Organization:
Individual Network Berlin e.V.
>Environment:
System: NetBSD pandora.jhweiss.de 2.0_STABLE NetBSD 2.0_STABLE (PANDORA) #0: Fri Jun 3 18:25:06 CEST 2005 holger@pandora.jhweiss.de:/usr/build/obj/sys/arch/i386/compile/PANDORA i386
Architecture: i386
Machine: i386
>Description:
pkgsrc/misc/colorls doesn't provide an "human readable" size format option.
>How-To-Repeat:
$ colorls -h
>Fix:
The following patch adds "-h" from base ls to colorls on NetBSD >= 2.0.
Index: Makefile
===================================================================
RCS file: /cvsroot/pkgsrc/misc/colorls/Makefile,v
retrieving revision 1.18
diff -u -r1.18 Makefile
--- Makefile 24 Mar 2005 21:12:57 -0000 1.18
+++ Makefile 11 Jun 2005 00:36:40 -0000
@@ -2,6 +2,7 @@
DISTNAME= ls
PKGNAME= colorls-2.2
+PKGREVISION= 1
CATEGORIES= misc
MASTER_SITES= ${MASTER_SITE_LOCAL}
Index: distinfo
===================================================================
RCS file: /cvsroot/pkgsrc/misc/colorls/distinfo,v
retrieving revision 1.4
diff -u -r1.4 distinfo
--- distinfo 24 Feb 2005 11:02:51 -0000 1.4
+++ distinfo 11 Jun 2005 00:36:40 -0000
@@ -4,7 +4,8 @@
RMD160 (ls.tar.gz) = 7b607b7ab953ad0dc603c269fa03648cd54ac04f
Size (ls.tar.gz) = 11768 bytes
SHA1 (patch-aa) = 831f286605126a136b540b4456916db8cc8ff7e4
-SHA1 (patch-ab) = 8f26c3e16bb85371bbb16c5f77a667b3a456af68
-SHA1 (patch-ac) = 89f775c18318c4ca8a7dbebc2daba7c52ae0878f
-SHA1 (patch-ad) = d502e96261a950c5307794f01422147430c76aba
-SHA1 (patch-ae) = 9b15ef9f8ab3e77b34a0f7ee401fbe8dcae4a854
+SHA1 (patch-ab) = 181bfcbfbaa095fa82492594ccd8831cc81c3e72
+SHA1 (patch-ac) = fec6cb91aaeb8a9fb2aa557eb827845ca35cd198
+SHA1 (patch-ad) = 645f950f48f945493bf2b8792ad1da9b93f952bd
+SHA1 (patch-ae) = 771f4ceb50656481050a3a017abb02862cc24f34
+SHA1 (patch-af) = 3d758fe9ef977751a1b6da13ce74d8b4c72e33b1
Index: patches/patch-ab
===================================================================
RCS file: /cvsroot/pkgsrc/misc/colorls/patches/patch-ab,v
retrieving revision 1.7
diff -u -r1.7 patch-ab
--- patches/patch-ab 13 Oct 2004 18:50:13 -0000 1.7
+++ patches/patch-ab 11 Jun 2005 00:36:40 -0000
@@ -2,8 +2,7 @@
--- colorls.1.orig Wed Oct 13 14:49:05 2004
+++ colorls.1
-@@ -37,14 +37,22 @@
- .\"
+@@ -38,12 +38,20 @@
.Dd July 29, 1994
-.Dt LS 1
+.Dt COLORLS 1
@@ -29,9 +28,7 @@
+is for color display.)
+.Pp
For each operand that names a
- .Ar file
-@@ -88,4 +96,10 @@ a percent sign (%) after each whiteout,
- and a vertical bar (|) after each that is a
+@@ -89,2 +97,8 @@ and a vertical bar (|) after each that i
.Tn FIFO .
+.It Fl G
+Use ANSI color sequences to distinguish file types. (See
@@ -40,9 +37,20 @@
+.Fl F ,
+some extra attributes (setuid bit set, etc.) are also displayed.
.It Fl L
- If argument is a symbolic link, list the file or directory the link references
-@@ -319,4 +333,72 @@ See
- .Xr environ 7
+@@ -109,2 +123,12 @@ symbolic links in the argument list are
+ Output is not sorted.
++.It Fl h
++Modifies the
++.Fl s
++and
++.Fl l
++options, causing the sizes to be reported in bytes displayed in a human
++readable format.
++Overrides
++.Fl k .
++This option is not available on all systems.
+ .It Fl i
+@@ -320,2 +344,70 @@ See
for more information.
+.It LSCOLORS
+The value of this variable describes what color to use for which
@@ -113,4 +121,3 @@
+default background for regular directories, black foreground and red
+background for setuid executables, etc.
.El
- .Sh COMPATIBILITY
Index: patches/patch-ac
===================================================================
RCS file: /cvsroot/pkgsrc/misc/colorls/patches/patch-ac,v
retrieving revision 1.3
diff -u -r1.3 patch-ac
--- patches/patch-ac 28 Dec 1998 22:13:05 -0000 1.3
+++ patches/patch-ac 11 Jun 2005 00:36:40 -0000
@@ -1,8 +1,8 @@
$NetBSD: patch-ac,v 1.3 1998/12/28 22:13:05 marc Exp $
--- ls.c.orig Sat Dec 21 18:40:58 1996
-+++ ls.c Mon Dec 28 17:10:04 1998
-@@ -59,6 +59,8 @@
++++ ls.c
+@@ -59,6 +59,8 @@ static char const sccsid[] = "@(#)ls.c 8
#include <string.h>
#include <unistd.h>
#include <locale.h>
@@ -11,7 +11,17 @@
#include "ls.h"
#include "extern.h"
-@@ -94,6 +96,7 @@
+@@ -77,6 +79,9 @@ int termwidth = 80; /* default terminal
+ int f_accesstime; /* use time of last access */
+ int f_column; /* columnated format */
+ int f_flags; /* show flags associated with a file */
++#if HAVE_HUMANIZE_NUMBER
++int f_humanize; /* humanize the size field */
++#endif
+ int f_inode; /* print inode */
+ int f_kblocks; /* print size in kilobytes */
+ int f_listdir; /* list actual directory, not contents */
+@@ -94,6 +99,7 @@ int f_statustime; /* use time of last m
int f_dirname; /* if precede with directory name */
int f_timesort; /* sort by time vice name */
int f_type; /* add type character for non-regular files */
@@ -19,19 +29,25 @@
#ifndef BSD4_4_LITE
int f_whiteout; /* show whiteout entries */
#endif
-@@ -135,9 +138,9 @@
+@@ -134,10 +140,14 @@ main(argc, argv)
+ f_listdot = 1;
fts_options = FTS_PHYSICAL;
- #ifdef BSD4_4_LITE
+-#ifdef BSD4_4_LITE
- while ((ch = getopt(argc, argv, "1ACFLRTacdfgikloqrstu")) != EOF) {
++#if defined(BSD4_4_LITE) && HAVE_HUMANIZE_NUMBER
++ while ((ch = getopt(argc, argv, "1ACFGLRTacdfghikloqrstu")) != EOF) {
++#elif defined(BSD4_4_LITE)
+ while ((ch = getopt(argc, argv, "1ACFGLRTacdfgikloqrstu")) != EOF) {
++#elif HAVE_HUMANIZE_NUMBER
++ while ((ch = getopt(argc, argv, "1ACFGLRTWacdfghikloqrstu")) != EOF) {
#else
- while ((ch = getopt(argc, argv, "1ACFLRTWacdfgikloqrstu")) != EOF) {
+ while ((ch = getopt(argc, argv, "1ACFGLRTWacdfgikloqrstu")) != EOF) {
#endif
switch (ch) {
/*
-@@ -168,6 +171,10 @@
+@@ -168,6 +178,10 @@ main(argc, argv)
case 'F':
f_type = 1;
break;
@@ -42,7 +58,23 @@
case 'L':
fts_options &= ~FTS_PHYSICAL;
fts_options |= FTS_LOGICAL;
-@@ -228,18 +235,21 @@
+@@ -191,6 +205,15 @@ main(argc, argv)
+ break;
+ case 'g': /* Compatibility with 4.3BSD. */
+ break;
++#if HAVE_HUMANIZE_NUMBER
++ /*
++ * The -h option forces all sizes to be measured in bytes.
++ * It also makes -l suppress -s.
++ */
++ case 'h':
++ f_humanize = 1;
++ break;
++#endif
+ case 'i':
+ f_inode = 1;
+ break;
+@@ -228,18 +251,21 @@ main(argc, argv)
argc -= optind;
argv += optind;
@@ -66,8 +98,13 @@
fts_options |= FTS_COMFOLLOW;
#ifndef BSD4_4_LITE
-@@ -384,7 +394,8 @@
+@@ -382,9 +408,13 @@ display(p, list)
+ NAMES *np;
+ u_quad_t maxsize;
u_long btotal, maxblock, maxinode, maxlen, maxnlink;
++#if HAVE_HUMANIZE_NUMBER
++ u_long stotal;
++#endif
int bcfile, flen, glen, ulen, maxflags, maxgroup, maxuser;
int entries, needstats;
- char *user, *group, *flags, buf[20]; /* 32 bits == 10 digits */
@@ -76,3 +113,62 @@
/*
* If list is NULL there are two possibilities: that the parent
+@@ -399,6 +429,9 @@ display(p, list)
+ needstats = f_inode || f_longform || f_size;
+ flen = 0;
+ btotal = maxblock = maxinode = maxlen = maxnlink = 0;
++#if HAVE_HUMANIZE_NUMBER
++ stotal = 0;
++#endif
+ bcfile = 0;
+ maxuser = maxgroup = maxflags = 0;
+ flags = NULL;
+@@ -445,6 +478,9 @@ display(p, list)
+ maxsize = sp->st_size;
+
+ btotal += sp->st_blocks;
++#if HAVE_HUMANIZE_NUMBER
++ stotal += sp->st_size;
++#endif
+ if (f_longform) {
+ user = user_from_uid(sp->st_uid, 0);
+ if ((ulen = strlen(user)) > maxuser)
+@@ -492,16 +528,34 @@ display(p, list)
+ if (needstats) {
+ d.bcfile = bcfile;
+ d.btotal = btotal;
+- (void)snprintf(buf, sizeof(buf), "%lu", maxblock);
+- d.s_block = strlen(buf);
++#if HAVE_HUMANIZE_NUMBER
++ d.stotal = stotal;
++ if (f_humanize) {
++ d.s_block = 4; /* min buf length for humanize_number */
++ } else {
++#endif
++ (void)snprintf(buf, sizeof(buf), "%lu", maxblock);
++ d.s_block = strlen(buf);
++#if HAVE_HUMANIZE_NUMBER
++ }
++#endif
+ d.s_flags = maxflags;
+ d.s_group = maxgroup;
+ (void)snprintf(buf, sizeof(buf), "%lu", maxinode);
+ d.s_inode = strlen(buf);
+ (void)snprintf(buf, sizeof(buf), "%lu", maxnlink);
+ d.s_nlink = strlen(buf);
+- (void)snprintf(buf, sizeof(buf), "%qu", maxsize);
+- d.s_size = strlen(buf);
++#if HAVE_HUMANIZE_NUMBER
++ d.stotal = stotal;
++ if (f_humanize) {
++ d.s_size = 4; /* min buf length for humanize_number */
++ } else {
++#endif
++ (void)snprintf(buf, sizeof(buf), "%qu", maxsize);
++ d.s_size = strlen(buf);
++#if HAVE_HUMANIZE_NUMBER
++ }
++#endif
+ d.s_user = maxuser;
+ }
+
Index: patches/patch-ad
===================================================================
RCS file: /cvsroot/pkgsrc/misc/colorls/patches/patch-ad,v
retrieving revision 1.2
diff -u -r1.2 patch-ad
--- patches/patch-ad 7 Aug 1998 11:10:12 -0000 1.2
+++ patches/patch-ad 11 Jun 2005 00:36:40 -0000
@@ -1,12 +1,43 @@
$NetBSD: patch-ad,v 1.2 1998/08/07 11:10:12 agc Exp $
--- ls.h.orig Sun Dec 22 00:40:58 1996
-+++ ls.h Thu May 21 15:42:08 1998
-@@ -54,6 +54,7 @@
- extern int f_size; /* list size in short listing */
++++ ls.h
+@@ -38,4 +38,6 @@
+ */
+
++#include <sys/param.h>
++
+ #define NO_PRINT 1
+ /*
+@@ -44,4 +46,10 @@
+ */
+ #define BSD4_4_LITE
++/*
++ * humanize_number(3) is needed for human-readable format.
++ */
++#if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 200000000
++#define HAVE_HUMANIZE_NUMBER 1
++#endif
+
+ extern long blocksize; /* block size units */
+@@ -49,4 +57,7 @@ extern long blocksize; /* block size un
+ extern int f_accesstime; /* use time of last access */
+ extern int f_flags; /* show flags associated with a file */
++#if HAVE_HUMANIZE_NUMBER
++extern int f_humanize; /* humanize size field */
++#endif
+ extern int f_inode; /* print inode */
+ extern int f_longform; /* long listing format */
+@@ -55,8 +66,12 @@ extern int f_size; /* list size in shor
extern int f_statustime; /* use time of last mode change */
extern int f_type; /* add type character for non-regular files */
+extern int f_color; /* add type in color for non-regular files */
typedef struct {
FTSENT *list;
+ u_long btotal;
++#if HAVE_HUMANIZE_NUMBER
++ u_long stotal;
++#endif
+ int bcfile;
+ int entries;
Index: patches/patch-ae
===================================================================
RCS file: /cvsroot/pkgsrc/misc/colorls/patches/patch-ae,v
retrieving revision 1.2
diff -u -r1.2 patch-ae
--- patches/patch-ae 7 Aug 1998 11:10:13 -0000 1.2
+++ patches/patch-ae 11 Jun 2005 00:36:41 -0000
@@ -1,11 +1,27 @@
$NetBSD: patch-ae,v 1.2 1998/08/07 11:10:13 agc Exp $
--- print.c.orig Sun Dec 22 00:40:58 1996
-+++ print.c Thu May 21 15:42:08 1998
-@@ -64,6 +64,26 @@
++++ print.c
+@@ -57,12 +57,41 @@ static char const sccsid[] = "@(#)print.
+ #include "ls.h"
+ #include "extern.h"
- #define IS_NOPRINT(p) ((p)->fts_number == NO_PRINT)
++#if HAVE_HUMANIZE_NUMBER
++#include <util.h>
++#endif
++
+ static int printaname __P((FTSENT *, u_long, u_long));
+ static void printlink __P((FTSENT *));
+ static void printtime __P((time_t));
+ static int printtype __P((u_int));
+ #define IS_NOPRINT(p) ((p)->fts_number == NO_PRINT)
++#if HAVE_HUMANIZE_NUMBER
++#define HUMANIZE_NUMBER(buf, len, num) humanize_number(buf, len, num, "", \
++ HN_AUTOSCALE, \
++ (HN_DECIMAL | HN_B | HN_NOSPACE))
++#endif
++
+/* Most of these are taken from <sys/stat.h> */
+typedef enum Colors {
+ C_DIR, /* directory */
@@ -25,11 +41,80 @@
+char *defcolors = "4x5x2x3x1x464301060203";
+
+static int colors[C_NUMCOLORS][2];
-+
+
void
printscol(dp)
- DISPLAY *dp;
-@@ -124,10 +144,14 @@
+@@ -86,9 +115,21 @@ printlong(dp)
+ FTSENT *p;
+ NAMES *np;
+ char buf[20];
++#if HAVE_HUMANIZE_NUMBER
++ char szbuf[5];
++#endif
+
+- if (dp->list->fts_level != FTS_ROOTLEVEL && (f_longform || f_size))
+- (void)printf("total %lu\n", howmany(dp->btotal, blocksize));
++ if (dp->list->fts_level != FTS_ROOTLEVEL && (f_longform || f_size)) {
++#if HAVE_HUMANIZE_NUMBER
++ if (f_humanize) {
++ if (HUMANIZE_NUMBER(szbuf, sizeof(szbuf), dp->stotal)
++ == -1)
++ err(1, "humanize_number");
++ (void)printf("total %s\n", szbuf);
++ } else
++#endif
++ (void)printf("total %lu\n", howmany(dp->btotal, blocksize));
++ }
+
+ for (p = dp->list; p; p = p->fts_link) {
+ if (IS_NOPRINT(p))
+@@ -96,7 +137,11 @@ printlong(dp)
+ sp = p->fts_statp;
+ if (f_inode)
+ (void)printf("%*lu ", dp->s_inode, (u_long)sp->st_ino);
++#if HAVE_HUMANIZE_NUMBER
++ if (f_size && !f_humanize)
++#else
+ if (f_size)
++#endif
+ (void)printf("%*qd ",
+ dp->s_block, howmany(sp->st_blocks, blocksize));
+ (void)strmode(sp->st_mode, buf);
+@@ -106,28 +151,42 @@ printlong(dp)
+ np->group);
+ if (f_flags)
+ (void)printf("%-*s ", dp->s_flags, np->flags);
+- if (S_ISCHR(sp->st_mode) || S_ISBLK(sp->st_mode))
+- if (minor(sp->st_rdev) > 255)
++ if (S_ISCHR(sp->st_mode) || S_ISBLK(sp->st_mode)) {
++ if (minor(sp->st_rdev) > 255) {
+ (void)printf("%3d, 0x%08x ",
+ major(sp->st_rdev), minor(sp->st_rdev));
+- else
++ } else {
+ (void)printf("%3d, %3d ",
+ major(sp->st_rdev), minor(sp->st_rdev));
+- else if (dp->bcfile)
++ }
++ } else if (dp->bcfile) {
+ (void)printf("%*s%*qd ",
+ 8 - dp->s_size, "", dp->s_size, sp->st_size);
+- else
+- (void)printf("%*qd ", dp->s_size, sp->st_size);
++ } else {
++#if HAVE_HUMANIZE_NUMBER
++ if (f_humanize) {
++ if (HUMANIZE_NUMBER(szbuf, sizeof(szbuf),
++ sp->st_size) == -1)
++ err(1, "humanize_number");
++ (void)printf("%*s ", dp->s_size, szbuf);
++ } else
++#endif
++ (void)printf("%*qd ", dp->s_size, sp->st_size);
++ }
+ if (f_accesstime)
+ printtime(sp->st_atime);
+ else if (f_statustime)
printtime(sp->st_ctime);
else
printtime(sp->st_mtime);
@@ -45,8 +130,61 @@
printlink(p);
(void)putchar('\n');
}
-@@ -190,10 +214,22 @@
+@@ -145,6 +204,9 @@ printcol(dp)
+ FTSENT *p;
+ int base, chcnt, cnt, col, colwidth, num;
+ int endcol, numcols, numrows, row;
++#if HAVE_HUMANIZE_NUMBER
++ char szbuf[5];
++#endif
+
+ /*
+ * Have to do random access in the linked list -- build a table
+@@ -165,8 +227,14 @@ printcol(dp)
+ colwidth = dp->maxlen;
+ if (f_inode)
+ colwidth += dp->s_inode + 1;
+- if (f_size)
+- colwidth += dp->s_block + 1;
++ if (f_size) {
++#if HAVE_HUMANIZE_NUMBER
++ if (f_humanize)
++ colwidth += dp->s_size + 1;
++ else
++#endif
++ colwidth += dp->s_block + 1;
++ }
+ if (f_type)
+ colwidth += 1;
+
+@@ -181,19 +249,46 @@ printcol(dp)
+ if (num % numcols)
+ ++numrows;
+
+- if (dp->list->fts_level != FTS_ROOTLEVEL && (f_longform || f_size))
+- (void)printf("total %lu\n", howmany(dp->btotal, blocksize));
++ if (dp->list->fts_level != FTS_ROOTLEVEL && (f_longform || f_size)) {
++#if HAVE_HUMANIZE_NUMBER
++ if (f_humanize) {
++ if (HUMANIZE_NUMBER(szbuf, sizeof(szbuf), dp->stotal) ==
++ -1)
++ err(1, "humanize_number");
++ (void)printf("total %s\n", szbuf);
++ } else
++#endif
++ (void)printf("total %lu\n", howmany(dp->btotal,
++ blocksize));
++ }
+ for (row = 0; row < numrows; ++row) {
+ endcol = colwidth;
+ for (base = row, chcnt = col = 0; col < numcols; ++col) {
++#if HAVE_HUMANIZE_NUMBER
++ chcnt += printaname(array[base], dp->s_inode,
++ f_humanize ? dp->s_size : dp->s_block);
++#else
+ chcnt += printaname(array[base], dp->s_inode,
dp->s_block);
++#endif
if ((base += numrows) >= num)
break;
- while ((cnt = ((chcnt + TAB) & ~(TAB - 1))) <= endcol){
@@ -72,10 +210,33 @@
endcol += colwidth;
}
(void)putchar('\n');
-@@ -219,9 +255,13 @@
- if (f_size)
- chcnt += printf("%*qd ",
- (int)sizefield, howmany(sp->st_blocks, blocksize));
+@@ -211,17 +306,33 @@ printaname(p, inodefield, sizefield)
+ {
+ struct stat *sp;
+ int chcnt;
++#if HAVE_HUMANIZE_NUMBER
++ char szbuf[5];
++#endif
+
+ sp = p->fts_statp;
+ chcnt = 0;
+ if (f_inode)
+ chcnt += printf("%*lu ", (int)inodefield, (u_long)sp->st_ino);
+- if (f_size)
+- chcnt += printf("%*qd ",
+- (int)sizefield, howmany(sp->st_blocks, blocksize));
++ if (f_size) {
++#if HAVE_HUMANIZE_NUMBER
++ if (f_humanize) {
++ if (HUMANIZE_NUMBER(szbuf, sizeof(szbuf), sp->st_size)
++ == -1)
++ err(1, "humanize_number");
++ chcnt += printf("%*s ", sizefield, szbuf);
++ } else
++#endif
++ chcnt += printf("%*qd ",
++ (int)sizefield, howmany(sp->st_blocks, blocksize));
++ }
+ if (f_color)
+ (void)colortype(sp->st_mode);
chcnt += printf("%s", p->fts_name);
@@ -86,7 +247,7 @@
return (chcnt);
}
-@@ -281,6 +321,95 @@
+@@ -281,6 +392,95 @@ printtype(mode)
return (0);
}
Index: patches/patch-af
===================================================================
RCS file: patches/patch-af
diff -N patches/patch-af
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-af 11 Jun 2005 00:36:41 -0000
@@ -0,0 +1,18 @@
+$NetBSD$
+
+--- util.c.orig 1996-12-22 00:40:58.000000000 +0100
++++ util.c
+@@ -68,8 +68,12 @@ prcopy(src, dest, len)
+ void
+ usage()
+ {
+-#ifdef BSD4_4_LITE
++#if defined(BSD4_4_LITE) && HAVE_HUMANIZE_NUMBER
++ (void)fprintf(stderr, "usage: ls [-1ACFLRTacdfhiklqrstu] [file ...]\n");
++#elif defined(BSD4_4_LITE)
+ (void)fprintf(stderr, "usage: ls [-1ACFLRTacdfiklqrstu] [file ...]\n");
++#elif HAVE_HUMANIZE_NUMBER
++ (void)fprintf(stderr, "usage: ls [-1ACFLRTWacdfhiklqrstu] [file ...]\n");
+ #else
+ (void)fprintf(stderr, "usage: ls [-1ACFLRTWacdfiklqrstu] [file ...]\n");
+ #endif