Browse Source

include expunges in progress counters

wip/maildir-path-under-inbox
Oswald Buddenhagen 3 years ago
parent
commit
edc901b7af
  1. 1
      NEWS
  2. 24
      src/main_sync.c
  3. 4
      src/mbsync.1
  4. 29
      src/sync.c
  5. 1
      src/sync.h

1
NEWS

@ -19,6 +19,7 @@ MaxMessages and MaxSize can be used together now.
The unfiltered list of mailboxes in each Store can be printed now.
A proper summary is now printed prior to exiting.
This includes expunges, which are now included in the progress as well.
Added new sync operation 'Old'.

24
src/main_sync.c

@ -9,7 +9,7 @@
#define nz(a, b) ((a) ? (a) : (b))
static int ops_any[2], trash_any[2];
static int ops_any[2], trash_any[2], expunge_any[2];
static int chans_total, chans_done;
static int boxes_total, boxes_done;
@ -20,7 +20,7 @@ static wakeup_t stats_wakeup;
static void
print_stats( void )
{
char buf[3][64];
char buf[3][80];
char *cs;
static int cols = -1;
@ -29,10 +29,11 @@ print_stats( void )
int ll = sprintf( buf[2], "C: %d/%d B: %d/%d", chans_done, chans_total, boxes_done, boxes_total );
int cls = (cols - ll - 10) / 2;
for (int t = 0; t < 2; t++) {
int l = sprintf( buf[t], "+%d/%d *%d/%d #%d/%d",
int l = sprintf( buf[t], "+%d/%d *%d/%d #%d/%d -%d/%d",
new_done[t], new_total[t],
flags_done[t], flags_total[t],
trash_done[t], trash_total[t] );
trash_done[t], trash_total[t],
expunge_done[t], expunge_total[t] );
if (l > cls)
buf[t][cls - 1] = '~';
}
@ -91,6 +92,11 @@ summary( void )
",\nwould move %d %s message(s) to trash" :
",\nmoved %d %s message(s) to trash",
trash_done[t], str_fn[t] );
if (expunge_any[t])
printf( (DFlags & DRYRUN) ?
",\nwould expunge %d message(s) from %s" :
",\nexpunged %d message(s) from %s",
expunge_done[t], str_fn[t] );
}
puts( "." );
}
@ -235,10 +241,12 @@ add_channel( chan_ent_t ***chanapp, channel_conf_t *chan, int ops[] )
}
if (chan->ops[t] & OP_MASK_TYPE)
ops_any[t] = 1;
if ((chan->ops[t] & (OP_EXPUNGE | OP_EXPUNGE_SOLO)) &&
(chan->stores[t]->trash ||
(chan->stores[t^1]->trash && chan->stores[t^1]->trash_remote_new)))
trash_any[t] = 1;
if (chan->ops[t] & (OP_EXPUNGE | OP_EXPUNGE_SOLO)) {
expunge_any[t] = 1;
if (chan->stores[t]->trash ||
(chan->stores[t^1]->trash && chan->stores[t^1]->trash_remote_new))
trash_any[t] = 1;
}
}
**chanapp = ce;

4
src/mbsync.1

@ -779,13 +779,13 @@ If \fBmbsync\fR's output is connected to a console, it will print progress
counters by default. The output will look like this:
.P
.in +4
C: 1/2 B: 3/4 F: +13/13 *23/42 #0/0 N: +0/7 *0/0 #0/0
C: 1/2 B: 3/4 F: +13/13 *23/42 #0/0 -0/0 N: +0/7 *0/0 #0/0 -0/0
.in -4
.P
This represents the cumulative progress over Channels, boxes, and messages
affected on the far and near side, respectively.
The message counts represent added messages, messages with updated flags,
and trashed messages, respectively.
trashed messages, and expunged messages, respectively.
No attempt is made to calculate the totals in advance, so they grow over
time as more information is gathered.
.P

29
src/sync.c

@ -17,6 +17,7 @@ uint BufferLimit = 10 * 1024 * 1024;
int new_total[2], new_done[2];
int flags_total[2], flags_done[2];
int trash_total[2], trash_done[2];
int expunge_total[2], expunge_done[2];
static void sync_ref( sync_vars_t *svars ) { ++svars->ref_count; }
static void sync_deref( sync_vars_t *svars );
@ -286,6 +287,10 @@ message_expunged( message_t *msg, void *aux )
msg->srec->msg[t] = NULL;
msg->srec = NULL;
}
if (msg->status & M_EXPUNGE) {
expunge_done[t]++;
stats();
}
}
static void box_confirmed( int sts, uint uidvalidity, void *aux );
@ -1771,6 +1776,25 @@ sync_close( sync_vars_t *svars, int t )
if ((svars->chan->ops[t] & (OP_EXPUNGE | OP_EXPUNGE_SOLO)) && !(DFlags & FAKEEXPUNGE)
/*&& !(svars->state[t] & ST_TRASH_BAD)*/) {
if (Verbosity >= TERSE) {
if (svars->opts[t] & OPEN_UID_EXPUNGE) {
for (message_t *tmsg = svars->msgs[t]; tmsg; tmsg = tmsg->next) {
if (tmsg->status & M_DEAD)
continue;
if (tmsg->status & M_EXPUNGE)
expunge_total[t]++;
}
} else {
for (sync_rec_t *srec = svars->srecs; srec; srec = srec->next) {
if (srec->status & S_DEAD)
continue;
if (srec->status & S_DEL(t))
expunge_total[t]++;
}
}
stats();
}
debug( "expunging %s\n", str_fn[t] );
svars->drv[t]->close_box( svars->ctx[t], box_closed, AUX );
} else {
@ -1792,9 +1816,12 @@ box_closed( int sts, int reported, void *aux )
// by a refresh, and in the extremely unlikely case of this happening
// on both sides, we'd even get a duplicate. That's why this is only
// a fallback.
if (srec->status & S_DEL(t))
if (srec->status & S_DEL(t)) {
srec->status |= S_GONE(t);
expunge_done[t]++;
}
}
stats();
}
box_closed_p2( svars, t );
}

1
src/sync.h

@ -77,6 +77,7 @@ extern uint BufferLimit;
extern int new_total[2], new_done[2];
extern int flags_total[2], flags_done[2];
extern int trash_total[2], trash_done[2];
extern int expunge_total[2], expunge_done[2];
extern const char *str_fn[2], *str_hl[2];

Loading…
Cancel
Save