Skip to content

Commit ece12fd

Browse files
committed
Merge branch 'jk/mailsplit-maildir-muttsort' into maint
Sort filenames read from the maildir/ in a way that is more likely to sort messages in the order the writing MUA meant to, by sorting numeric segment in numeric order and non-numeric segment in alphabetical order. * jk/mailsplit-maildir-muttsort: mailsplit: sort maildir filenames more cleverly
2 parents 7d2726c + 18505c3 commit ece12fd

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

builtin/mailsplit.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,27 @@ static int populate_maildir_list(struct string_list *list, const char *path)
130130
return 0;
131131
}
132132

133+
static int maildir_filename_cmp(const char *a, const char *b)
134+
{
135+
while (*a && *b) {
136+
if (isdigit(*a) && isdigit(*b)) {
137+
long int na, nb;
138+
na = strtol(a, (char **)&a, 10);
139+
nb = strtol(b, (char **)&b, 10);
140+
if (na != nb)
141+
return na - nb;
142+
/* strtol advanced our pointers */
143+
}
144+
else {
145+
if (*a != *b)
146+
return (unsigned char)*a - (unsigned char)*b;
147+
a++;
148+
b++;
149+
}
150+
}
151+
return (unsigned char)*a - (unsigned char)*b;
152+
}
153+
133154
static int split_maildir(const char *maildir, const char *dir,
134155
int nr_prec, int skip)
135156
{
@@ -139,6 +160,8 @@ static int split_maildir(const char *maildir, const char *dir,
139160
int i;
140161
struct string_list list = STRING_LIST_INIT_DUP;
141162

163+
list.cmp = maildir_filename_cmp;
164+
142165
if (populate_maildir_list(&list, maildir) < 0)
143166
goto out;
144167

0 commit comments

Comments
 (0)