mirror of
https://code.blicky.net/yorhel/ncdu.git
synced 2026-01-15 02:08:40 -09:00
* Calculate both apparent size and disk usage
* Removed apparent sizes option * Combined "files" and "dirs" to "items" in the dir structure * Updated TODO git-svn-id: svn://blicky.net/ncdu/trunk@18 ce56bc8d-f834-0410-b703-f827bd498a76
This commit is contained in:
parent
4859bc8810
commit
fa0aa6b53b
6 changed files with 42 additions and 57 deletions
4
TODO
4
TODO
|
|
@ -13,3 +13,7 @@ Small list of planned features/changes, suggestions are always welcome.
|
||||||
- Improve browser interface
|
- Improve browser interface
|
||||||
* Mutt-like status bar?
|
* Mutt-like status bar?
|
||||||
* Browser always on background, even on startup
|
* Browser always on background, even on startup
|
||||||
|
|
||||||
|
- Remove...
|
||||||
|
* Switching to powers of 1000 (is there *anyone* who actually uses that
|
||||||
|
feature?)
|
||||||
|
|
|
||||||
|
|
@ -143,11 +143,11 @@ void drawBrowser(int change) {
|
||||||
mvhline(0, 0, ' ', wincols);
|
mvhline(0, 0, ' ', wincols);
|
||||||
mvhline(winrows-1, 0, ' ', wincols);
|
mvhline(winrows-1, 0, ' ', wincols);
|
||||||
mvprintw(0,0,"%s %s ~ Use the arrow keys to navigate, press ? for help", PACKAGE_NAME, PACKAGE_VERSION);
|
mvprintw(0,0,"%s %s ~ Use the arrow keys to navigate, press ? for help", PACKAGE_NAME, PACKAGE_VERSION);
|
||||||
|
|
||||||
mvprintw(winrows-1, 0, " Total size: %s Files: %-6d Dirs: %-6d",
|
|
||||||
cropsize(bcur->parent->size), bcur->parent->files, bcur->parent->dirs);
|
|
||||||
attroff(A_REVERSE);
|
|
||||||
|
|
||||||
|
mvprintw(winrows-1, 0, " Total disk usage: %s Apparent size: %s Items: %d",
|
||||||
|
cropsize(bcur->parent->size), cropsize(bcur->parent->asize), bcur->parent->items);
|
||||||
|
attroff(A_REVERSE);
|
||||||
|
|
||||||
mvhline(1, 0, '-', wincols);
|
mvhline(1, 0, '-', wincols);
|
||||||
mvaddstr(1, 3, cropdir(getpath(bcur, tmp), wincols-5));
|
mvaddstr(1, 3, cropdir(getpath(bcur, tmp), wincols-5));
|
||||||
|
|
||||||
|
|
@ -370,8 +370,7 @@ void showBrowser(void) {
|
||||||
|
|
||||||
/* update parent dir */
|
/* update parent dir */
|
||||||
bcur->sub = n->sub;
|
bcur->sub = n->sub;
|
||||||
bcur->files = n->files;
|
bcur->items = n->items;
|
||||||
bcur->dirs = n->dirs;
|
|
||||||
bcur->size = n->size;
|
bcur->size = n->size;
|
||||||
for(t = bcur->sub; t != NULL; t = t->next)
|
for(t = bcur->sub; t != NULL; t = t->next)
|
||||||
t->parent = bcur;
|
t->parent = bcur;
|
||||||
|
|
@ -379,8 +378,7 @@ void showBrowser(void) {
|
||||||
/* update sizes of parent dirs */
|
/* update sizes of parent dirs */
|
||||||
for(t = bcur; (t = t->parent) != NULL; ) {
|
for(t = bcur; (t = t->parent) != NULL; ) {
|
||||||
t->size += bcur->size;
|
t->size += bcur->size;
|
||||||
t->files += bcur->files;
|
t->items += bcur->items;
|
||||||
t->dirs += bcur->dirs+1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add reference to parent dir */
|
/* add reference to parent dir */
|
||||||
|
|
|
||||||
32
src/calc.c
32
src/calc.c
|
|
@ -145,8 +145,8 @@ static void drawProgress(char *cdir) {
|
||||||
mvwaddstr(prg, 0, 4, dat == NULL ? "Calculating..." : "Recalculating...");
|
mvwaddstr(prg, 0, 4, dat == NULL ? "Calculating..." : "Recalculating...");
|
||||||
wattroff(prg, A_BOLD);
|
wattroff(prg, A_BOLD);
|
||||||
|
|
||||||
mvwprintw(prg, 2, 2, "Total files: %-8d dirs: %-8d size: %s",
|
mvwprintw(prg, 2, 2, "Total items: %-8d size: %s",
|
||||||
parent->files, parent->dirs, cropsize(parent->size));
|
parent->items, cropsize(parent->size));
|
||||||
mvwprintw(prg, 3, 2, "Current dir: %s", cropdir(cdir, 43));
|
mvwprintw(prg, 3, 2, "Current dir: %s", cropdir(cdir, 43));
|
||||||
mvwaddstr(prg, 8, 43, "Press q to quit");
|
mvwaddstr(prg, 8, 43, "Press q to quit");
|
||||||
|
|
||||||
|
|
@ -302,24 +302,25 @@ int calcDir(struct dir *dest, char *path) {
|
||||||
if(sflags & SF_SMFS && curdev != fs.st_dev)
|
if(sflags & SF_SMFS && curdev != fs.st_dev)
|
||||||
d->flags |= FF_OTHFS;
|
d->flags |= FF_OTHFS;
|
||||||
|
|
||||||
/* determine type of this item and update parent dirs */
|
/* determine type of this item */
|
||||||
if(S_ISREG(fs.st_mode)) {
|
if(S_ISREG(fs.st_mode))
|
||||||
d->flags |= FF_FILE;
|
d->flags |= FF_FILE;
|
||||||
if(!(d->flags & FF_EXL))
|
else if(S_ISDIR(fs.st_mode))
|
||||||
for(t = dest; t != NULL; t = t->parent)
|
|
||||||
t->files++;
|
|
||||||
} else if(S_ISDIR(fs.st_mode)) {
|
|
||||||
d->flags |= FF_DIR;
|
d->flags |= FF_DIR;
|
||||||
if(!(d->flags & FF_EXL))
|
|
||||||
for(t = dest; t != NULL; t = t->parent)
|
/* update parent dirs */
|
||||||
t->dirs++;
|
if(!(d->flags & FF_EXL))
|
||||||
}
|
for(t = dest; t != NULL; t = t->parent)
|
||||||
|
t->items++;
|
||||||
|
|
||||||
/* count the size */
|
/* count the size */
|
||||||
if(!(d->flags & FF_EXL || d->flags & FF_OTHFS)) {
|
if(!(d->flags & FF_EXL || d->flags & FF_OTHFS)) {
|
||||||
d->size = sflags & SF_AS ? fs.st_size : fs.st_blocks * 512;
|
d->size = fs.st_blocks * 512;
|
||||||
for(t = dest; t != NULL; t = t->parent)
|
d->asize = fs.st_size;
|
||||||
|
for(t = dest; t != NULL; t = t->parent) {
|
||||||
t->size += d->size;
|
t->size += d->size;
|
||||||
|
t->asize += d->asize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* show status */
|
/* show status */
|
||||||
|
|
@ -383,7 +384,8 @@ struct dir *showCalc(char *path) {
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
parent = calloc(sizeof(struct dir), 1);
|
parent = calloc(sizeof(struct dir), 1);
|
||||||
parent->size = sflags & SF_AS ? fs.st_size : fs.st_blocks * 512;
|
parent->size = fs.st_blocks * 512;
|
||||||
|
parent->asize = fs.st_size;
|
||||||
parent->flags |= FF_DIR;
|
parent->flags |= FF_DIR;
|
||||||
curdev = fs.st_dev;
|
curdev = fs.st_dev;
|
||||||
parent->name = malloc(strlen(tmp)+1);
|
parent->name = malloc(strlen(tmp)+1);
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,6 @@
|
||||||
|
|
||||||
/* Settings Flags (int sflags) */
|
/* Settings Flags (int sflags) */
|
||||||
#define SF_SMFS 1 /* same filesystem */
|
#define SF_SMFS 1 /* same filesystem */
|
||||||
#define SF_AS 2 /* apparent sizes */
|
|
||||||
#define SF_SI 4 /* use powers of 1000 instead of 1024 */
|
#define SF_SI 4 /* use powers of 1000 instead of 1024 */
|
||||||
#define SF_IGNS 8 /* ignore too small terminal sizes */
|
#define SF_IGNS 8 /* ignore too small terminal sizes */
|
||||||
#define SF_NOCFM 16 /* don't confirm file deletion */
|
#define SF_NOCFM 16 /* don't confirm file deletion */
|
||||||
|
|
@ -112,10 +111,10 @@
|
||||||
struct dir {
|
struct dir {
|
||||||
struct dir *parent, *next, *sub;
|
struct dir *parent, *next, *sub;
|
||||||
char *name;
|
char *name;
|
||||||
off_t size;
|
off_t size, asize;
|
||||||
unsigned int files, dirs;
|
unsigned int items;
|
||||||
unsigned short flags;
|
unsigned char flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -55,13 +55,11 @@ int settingsCli(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
for(j=1; j < strlen(argv[i]); j++)
|
for(j=1; j < strlen(argv[i]); j++)
|
||||||
switch(argv[i][j]) {
|
switch(argv[i][j]) {
|
||||||
case 'a': sflags |= SF_AS; break;
|
|
||||||
case 'x': sflags |= SF_SMFS; break;
|
case 'x': sflags |= SF_SMFS; break;
|
||||||
case 'q': sdelay = 2000; break;
|
case 'q': sdelay = 2000; break;
|
||||||
case '?':
|
case '?':
|
||||||
case 'h':
|
case 'h':
|
||||||
printf("ncdu [-ahvx] [dir]\n\n");
|
printf("ncdu [-ahvx] [dir]\n\n");
|
||||||
printf(" -a Apparent sizes\n");
|
|
||||||
printf(" -h This help message\n");
|
printf(" -h This help message\n");
|
||||||
printf(" -q x Set the refresh interval in seconds\n");
|
printf(" -q x Set the refresh interval in seconds\n");
|
||||||
printf(" -v Print version\n");
|
printf(" -v Print version\n");
|
||||||
|
|
@ -97,12 +95,9 @@ int settingsGet(void) {
|
||||||
fields[2] = new_field(1, 16, 1, 11, 0, 0);
|
fields[2] = new_field(1, 16, 1, 11, 0, 0);
|
||||||
fields[3] = new_field(1, 1, 1, 27, 0, 0);
|
fields[3] = new_field(1, 1, 1, 27, 0, 0);
|
||||||
fields[4] = new_field(1, 1, 1, 28, 0, 0);
|
fields[4] = new_field(1, 1, 1, 28, 0, 0);
|
||||||
fields[5] = new_field(1, 16, 2, 12, 0, 0);
|
fields[5] = new_field(1, 6, 3, 11, 0, 0);
|
||||||
fields[6] = new_field(1, 1, 2, 27, 0, 0);
|
fields[6] = new_field(1, 9, 3, 19, 0, 0);
|
||||||
fields[7] = new_field(1, 1, 2, 28, 0, 0);
|
fields[7] = NULL;
|
||||||
fields[8] = new_field(1, 6, 3, 11, 0, 0);
|
|
||||||
fields[9] = new_field(1, 9, 3, 19, 0, 0);
|
|
||||||
fields[10] = NULL;
|
|
||||||
|
|
||||||
/* Directory */
|
/* Directory */
|
||||||
field_opts_off(fields[0], O_ACTIVE);
|
field_opts_off(fields[0], O_ACTIVE);
|
||||||
|
|
@ -120,17 +115,9 @@ int settingsGet(void) {
|
||||||
set_field_buffer(fields[3], 0, sflags & SF_SMFS ? "X" : " ");
|
set_field_buffer(fields[3], 0, sflags & SF_SMFS ? "X" : " ");
|
||||||
field_opts_off(fields[4], O_ACTIVE);
|
field_opts_off(fields[4], O_ACTIVE);
|
||||||
set_field_buffer(fields[4], 0, "]");
|
set_field_buffer(fields[4], 0, "]");
|
||||||
/* Apparent sizes */
|
|
||||||
field_opts_off(fields[5], O_ACTIVE);
|
|
||||||
set_field_buffer(fields[5], 0, "Apparent size [");
|
|
||||||
field_opts_off(fields[6], O_AUTOSKIP);
|
|
||||||
set_field_back(fields[6], A_UNDERLINE);
|
|
||||||
set_field_buffer(fields[6], 0, sflags & SF_AS ? "X" : " ");
|
|
||||||
field_opts_off(fields[7], O_ACTIVE);
|
|
||||||
set_field_buffer(fields[7], 0, "]");
|
|
||||||
/* buttons */
|
/* buttons */
|
||||||
set_field_buffer(fields[8], 0, "[OK]");
|
set_field_buffer(fields[5], 0, "[OK]");
|
||||||
set_field_buffer(fields[9], 0, "[CLOSE]");
|
set_field_buffer(fields[6], 0, "[CLOSE]");
|
||||||
|
|
||||||
setf = new_form(fields);
|
setf = new_form(fields);
|
||||||
h=8;w=60;
|
h=8;w=60;
|
||||||
|
|
@ -184,16 +171,16 @@ int settingsGet(void) {
|
||||||
case '\t': form_driver(setf, REQ_NEXT_FIELD); break;
|
case '\t': form_driver(setf, REQ_NEXT_FIELD); break;
|
||||||
case KEY_RESIZE: rst = 1; goto setend; break;
|
case KEY_RESIZE: rst = 1; goto setend; break;
|
||||||
default:
|
default:
|
||||||
if(i == 9) {
|
if(i == 6) {
|
||||||
rst = 2;
|
rst = 2;
|
||||||
goto setend;
|
goto setend;
|
||||||
}
|
}
|
||||||
if(i == 8 || ch == '\n')
|
if(i == 5 || ch == '\n')
|
||||||
goto setend;
|
goto setend;
|
||||||
if(i == 3 || i == 6)
|
if(i == 3)
|
||||||
set_field_buffer(fields[i], 0, buf[0] == ' ' ? "X" : " ");
|
set_field_buffer(fields[i], 0, buf[0] == ' ' ? "X" : " ");
|
||||||
else if(!isprint(ch)) break;
|
else if(!isprint(ch)) break;
|
||||||
else if(i == 9) {
|
else if(i == 6) {
|
||||||
if(!isdigit(ch)) strcpy(tmp, " 0");
|
if(!isdigit(ch)) strcpy(tmp, " 0");
|
||||||
else if(buf[0] != ' ' || buf[1] == ' ' || buf[1] == '0') sprintf(tmp, " %c", ch);
|
else if(buf[0] != ' ' || buf[1] == ' ' || buf[1] == '0') sprintf(tmp, " %c", ch);
|
||||||
else sprintf(tmp, "%c%c", buf[1], ch);
|
else sprintf(tmp, "%c%c", buf[1], ch);
|
||||||
|
|
@ -221,11 +208,9 @@ int settingsGet(void) {
|
||||||
sflags = sflags & SF_IGNS;
|
sflags = sflags & SF_IGNS;
|
||||||
buf = field_buffer(fields[3], 0);
|
buf = field_buffer(fields[3], 0);
|
||||||
if(buf[0] != ' ') sflags |= SF_SMFS;
|
if(buf[0] != ' ') sflags |= SF_SMFS;
|
||||||
buf = field_buffer(fields[6], 0);
|
|
||||||
if(buf[0] != ' ') sflags |= SF_AS;
|
|
||||||
|
|
||||||
unpost_form(setf);
|
unpost_form(setf);
|
||||||
for(i=10;--i>=0;)
|
for(i=7;--i>=0;)
|
||||||
free_field(fields[i]);
|
free_field(fields[i]);
|
||||||
werase(set);
|
werase(set);
|
||||||
delwin(set);
|
delwin(set);
|
||||||
|
|
|
||||||
|
|
@ -112,12 +112,9 @@ struct dir *freedir(struct dir *dr) {
|
||||||
|
|
||||||
/* update sizes of parent directories */
|
/* update sizes of parent directories */
|
||||||
tmp = dr;
|
tmp = dr;
|
||||||
if(dr->flags & FF_FILE) dr->files++;
|
|
||||||
if(dr->flags & FF_DIR) dr->dirs++;
|
|
||||||
while((tmp = tmp->parent) != NULL) {
|
while((tmp = tmp->parent) != NULL) {
|
||||||
tmp->size -= dr->size;
|
tmp->size -= dr->size;
|
||||||
tmp->files -= dr->files;
|
tmp->items -= dr->items+1;
|
||||||
tmp->dirs -= dr->dirs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free dr->sub recursive */
|
/* free dr->sub recursive */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue