Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 274578
Collapse All | Expand All

(-)mairix-0.21/db.c (-3 / +74 lines)
Lines 684-690 Link Here
684
}
684
}
685
/*}}}*/
685
/*}}}*/
686
686
687
static void scan_maildir_flags(struct msgpath *m)/*{{{*/
687
void scan_maildir_flags(struct msgpath *m)/*{{{*/
688
{
688
{
689
  const char *p, *start;
689
  const char *p, *start;
690
  start = m->src.mpf.path;
690
  start = m->src.mpf.path;
Lines 854-859 Link Here
854
 return m;
854
 return m;
855
}
855
}
856
/*}}}*/
856
/*}}}*/
857
int change_new_to_cur(char *p)/*{{{*/ 
858
{
859
  /* possibly change /new/ to /cur/ in maildir paths */
860
  char *pos;
861
  int numslash;
862
  
863
  pos = p + strlen(p);
864
  numslash=0;
865
  while ((pos > p) && (numslash<2))
866
    if( *(--pos) == '/') numslash++;
867
  if ((numslash==2) && (strncmp(pos, "/new/", 5) == 0)) {
868
    strncpy(pos, "/cur/", 5);
869
    return 1;
870
  }
871
  return 0;
872
}
873
/*}}}*/
874
int looks_like_maildir(const char *p)/*{{{*/
875
{
876
  const char *s;
877
  int numdots;
878
  
879
  /* assume it's maildir if there are two dots after the last slash */
880
  s = p + strlen(p);
881
  numdots=0;
882
  while( (s > p) && (*s != '/'))
883
    if( *(s--) == '.' )
884
      numdots++;
885
  if (numdots != 2) return 0;
886
  return 1;
887
}
888
/*}}}*/
889
int lookup_msgpath_without_flags(struct msgpath *sorted_paths, int n_msgs, char *key)/*{{{*/
890
{
891
  int h, l, length=0, m=-1, r;
892
  char *colpos; 
893
  
894
  if( !looks_like_maildir(key) ) return -1;
895
  
896
  colpos = strrchr(key, ':');
897
  if(colpos) length = colpos - key;
898
  else       length = strlen(key);
899
  
900
  h = n_msgs, l = 0;
901
  while (h > l) {
902
    m = (h + l) >> 1;
903
    r = strncmp(sorted_paths[m].src.mpf.path, key, length);
904
    if (r == 0) break;
905
    if (l == m) return -1;
906
    if (r > 0) h = m;
907
    else       l = m;
908
  }     
909
  return m;
910
}
911
/*}}}*/
857
void maybe_grow_message_arrays(struct database *db)/*{{{*/
912
void maybe_grow_message_arrays(struct database *db)/*{{{*/
858
{
913
{
859
  if (db->n_msgs == db->max_msgs) {
914
  if (db->n_msgs == db->max_msgs) {
Lines 907-913 Link Here
907
  char *file_in_db, *file_in_new_list;
962
  char *file_in_db, *file_in_new_list;
908
  int matched_index;
963
  int matched_index;
909
  int i, new_entries_start_at;
964
  int i, new_entries_start_at;
910
  int any_new, n_newly_pruned, n_already_dead;
965
  int any_new, n_newly_pruned, n_already_dead, n_changed_flags;
911
  int status;
966
  int status;
912
967
913
  file_in_db = new_array(char, n_msgs);
968
  file_in_db = new_array(char, n_msgs);
Lines 917-922 Link Here
917
972
918
  n_already_dead = 0;
973
  n_already_dead = 0;
919
  n_newly_pruned = 0;
974
  n_newly_pruned = 0;
975
  n_changed_flags = 0;
920
976
921
  for (i=0; i<db->n_msgs; i++) {
977
  for (i=0; i<db->n_msgs; i++) {
922
    switch (db->type[i]) {
978
    switch (db->type[i]) {
Lines 943-948 Link Here
943
               * When that stat fails, the path won't get added to the db. */
999
               * When that stat fails, the path won't get added to the db. */
944
            }
1000
            }
945
          }
1001
          }
1002
        } else {
1003
          /* if file was in /new/ we search now in /cur/ */
1004
          change_new_to_cur(db->msgs[i].src.mpf.path);
1005
          /* check if currently unknown file only has changed flags */
1006
          matched_index = lookup_msgpath_without_flags(sorted_paths, n_msgs, db->msgs[i].src.mpf.path);
1007
          if (matched_index >= 0) {
1008
            file_in_db[matched_index] = 1;
1009
            file_in_new_list[i] = 1;
1010
            n_changed_flags++;
1011
            free(db->msgs[i].src.mpf.path);
1012
            db->msgs[i].src.mpf.path=new_string(sorted_paths[matched_index].src.mpf.path);
1013
            scan_maildir_flags(&db->msgs[i]);
1014
          }
946
        }
1015
        }
947
        break;
1016
        break;
948
      case MTY_MBOX:
1017
      case MTY_MBOX:
Lines 953-958 Link Here
953
    }
1022
    }
954
  }
1023
  }
955
1024
1025
  if(verbose) fprintf(stderr,"%d maildir message files with changed flags\n", n_changed_flags);
1026
956
  /* Add new entries to database */
1027
  /* Add new entries to database */
957
  new_entries_start_at = db->n_msgs;
1028
  new_entries_start_at = db->n_msgs;
958
1029
Lines 1026-1032 Link Here
1026
  free(file_in_db);
1097
  free(file_in_db);
1027
  free(file_in_new_list);
1098
  free(file_in_new_list);
1028
1099
1029
  return any_new || (n_newly_pruned > 0);
1100
  return any_new || (n_newly_pruned > 0) || (n_changed_flags > 0);
1030
}
1101
}
1031
/*}}}*/
1102
/*}}}*/
1032
static void recode_encoding(struct matches *m, int *new_idx)/*{{{*/
1103
static void recode_encoding(struct matches *m, int *new_idx)/*{{{*/
(-)mairix-0.21/mairix.c (-1 / +5 lines)
Lines 410-415 Link Here
410
         "-t           : include all messages in same threads as matching messages\n"
410
         "-t           : include all messages in same threads as matching messages\n"
411
         "-o <mfolder> : override setting of mfolder from mairixrc file\n"
411
         "-o <mfolder> : override setting of mfolder from mairixrc file\n"
412
         "-r           : force raw output regardless of mformat setting in mairixrc file\n"
412
         "-r           : force raw output regardless of mformat setting in mairixrc file\n"
413
         "-c           : try file name completion if maildir flags have changed\n"
413
         "expr_i       : search expression (all expr's AND'ed together):\n"
414
         "expr_i       : search expression (all expr's AND'ed together):\n"
414
         "    word          : match word in message body and major headers\n"
415
         "    word          : match word in message body and major headers\n"
415
         "    t:word        : match word in To: header\n"
416
         "    t:word        : match word in To: header\n"
Lines 483-488 Link Here
483
  int do_integrity_checks = 1;
484
  int do_integrity_checks = 1;
484
  int do_forced_unlock = 0;
485
  int do_forced_unlock = 0;
485
  int do_fast_index = 0;
486
  int do_fast_index = 0;
487
  int do_md_completion = 0;
486
488
487
  struct globber_array *omit_globs;
489
  struct globber_array *omit_globs;
488
490
Lines 515-520 Link Here
515
      do_excerpt_output = 1;
517
      do_excerpt_output = 1;
516
    } else if (!strcmp(*argv, "-Q") || !strcmp(*argv, "--no-integrity-checks")) {
518
    } else if (!strcmp(*argv, "-Q") || !strcmp(*argv, "--no-integrity-checks")) {
517
      do_integrity_checks = 0;
519
      do_integrity_checks = 0;
520
    } else if (!strcmp(*argv, "-c") || !strcmp(*argv, "--maildir-completion")) {
521
      do_md_completion = 1;
518
    } else if (!strcmp(*argv, "--unlock")) {
522
    } else if (!strcmp(*argv, "--unlock")) {
519
      do_forced_unlock = 1;
523
      do_forced_unlock = 1;
520
    } else if (!strcmp(*argv, "-F") ||
524
    } else if (!strcmp(*argv, "-F") ||
Lines 677-683 Link Here
677
          database_path);
681
          database_path);
678
      unlock_and_exit(3);
682
      unlock_and_exit(3);
679
    }
683
    }
680
    result = search_top(do_threads, do_augment, database_path, complete_mfolder, argv, output_folder_type, verbose);
684
    result = search_top(do_threads, do_augment, database_path, complete_mfolder, argv, output_folder_type, verbose, do_md_completion);
681
685
682
  } else {
686
  } else {
683
    enum filetype ftype;
687
    enum filetype ftype;
(-)mairix-0.21/mairix.h (-1 / +4 lines)
Lines 354-359 Link Here
354
int update_database(struct database *db, struct msgpath *sorted_paths, int n_paths, int do_fast_index);
354
int update_database(struct database *db, struct msgpath *sorted_paths, int n_paths, int do_fast_index);
355
void check_database_integrity(struct database *db);
355
void check_database_integrity(struct database *db);
356
int cull_dead_messages(struct database *db, int do_integrity_checks);
356
int cull_dead_messages(struct database *db, int do_integrity_checks);
357
int looks_like_maildir(const char *p);
358
int change_new_to_cur(char *p);
359
void scan_maildir_flags(struct msgpath *m);
357
360
358
/* In mbox.c */
361
/* In mbox.c */
359
void build_mbox_lists(struct database *db, const char *folder_base,
362
void build_mbox_lists(struct database *db, const char *folder_base,
Lines 377-383 Link Here
377
void write_database(struct database *db, char *filename, int do_integrity_checks);
380
void write_database(struct database *db, char *filename, int do_integrity_checks);
378
381
379
/* In search.c */
382
/* In search.c */
380
int search_top(int do_threads, int do_augment, char *database_path, char *complete_mfolder, char **argv, enum folder_type ft, int verbose);
383
int search_top(int do_threads, int do_augment, char *database_path, char *complete_mfolder, char **argv, enum folder_type ft, int verbose, int do_md_completion);
381
384
382
/* In stats.c */
385
/* In stats.c */
383
void get_db_stats(struct database *db);
386
void get_db_stats(struct database *db);
(-)mairix-0.21/search.c (-5 / +73 lines)
Lines 32-37 Link Here
32
#include <assert.h>
32
#include <assert.h>
33
#include <dirent.h>
33
#include <dirent.h>
34
#include <errno.h>
34
#include <errno.h>
35
#include <glob.h>
35
36
36
/* Lame fix for systems where NAME_MAX isn't defined after including the above
37
/* Lame fix for systems where NAME_MAX isn't defined after including the above
37
 * set of .h files (Solaris, FreeBSD so far).  Probably grossly oversized but
38
 * set of .h files (Solaris, FreeBSD so far).  Probably grossly oversized but
Lines 654-659 Link Here
654
  }
655
  }
655
}
656
}
656
/*}}}*/
657
/*}}}*/
658
char *find_new_link_target(char *link_target)/*{{{*/
659
{
660
  int ret, colon_pos;
661
  char *target_glob,*pos,*new_target=NULL;
662
  glob_t pglob;
663
  
664
  /* create search pattern */
665
  pos = strrchr( link_target, ':');
666
  if( pos ) colon_pos = pos - link_target;
667
  else colon_pos = strlen(link_target);
668
  target_glob = Malloc( colon_pos + 2);
669
  strncpy( target_glob, link_target, colon_pos);
670
  target_glob[colon_pos] = '*';
671
  target_glob[colon_pos+1] = '\0';
672
  
673
  ret = glob( target_glob, GLOB_NOSORT, NULL, &pglob );
674
  
675
  /* if we found nothing yet, possibly replace /new/ with /cur/
676
     and search again */
677
  if( (ret == GLOB_NOMATCH) && change_new_to_cur(target_glob) )
678
    ret = glob( target_glob, GLOB_NOSORT, NULL, &pglob );
679
  
680
  switch(ret) {
681
  case 0: 
682
    if( pglob.gl_pathc > 1) 
683
      fprintf(stderr, "Matched more than one file for %s.\n", target_glob);
684
    else {
685
      if(verbose) fprintf(stderr, "Using completion %s.\n", target_glob);
686
      new_target=new_string(pglob.gl_pathv[0]);
687
    } 
688
    break;
689
  case GLOB_NOMATCH:
690
    if (verbose) fprintf(stderr, "Found no completions for %s\n", target_glob);
691
    break;
692
  default:
693
    fprintf(stderr, "Error while running glob on %s\n", target_glob);
694
  }
695
  
696
  free(target_glob);     
697
  globfree(&pglob);     
698
  
699
  return new_target;
700
}
701
/*}}}*/
657
static void create_symlink(char *link_target, char *new_link)/*{{{*/
702
static void create_symlink(char *link_target, char *new_link)/*{{{*/
658
{
703
{
659
  if (symlink(link_target, new_link) < 0) {
704
  if (symlink(link_target, new_link) < 0) {
Lines 776-782 Link Here
776
  *is_flagged = (db->msg_type_and_flags[idx] & FLAG_FLAGGED) ? 1 : 0;
821
  *is_flagged = (db->msg_type_and_flags[idx] & FLAG_FLAGGED) ? 1 : 0;
777
}
822
}
778
823
779
static int do_search(struct read_db *db, char **args, char *output_path, int show_threads, enum folder_type ft, int verbose)/*{{{*/
824
static int do_search(struct read_db *db, char **args, char *output_path, int show_threads, enum folder_type ft, 
825
		     int verbose, int do_md_completion)/*{{{*/
780
{
826
{
781
  char *colon, *start_words;
827
  char *colon, *start_words;
782
  int do_body, do_subject, do_from, do_to, do_cc, do_date, do_size;
828
  int do_body, do_subject, do_from, do_to, do_cc, do_date, do_size;
Lines 1037-1049 Link Here
1037
          switch (rd_msg_type(db, i)) {
1083
          switch (rd_msg_type(db, i)) {
1038
            case DB_MSG_FILE:
1084
            case DB_MSG_FILE:
1039
              {
1085
              {
1040
                char *target_path;
1086
              char *target_path, *new_target=NULL;
1041
                char *message_path;
1087
                char *message_path;
1042
                int is_in_new;
1088
                int is_in_new;
1089
              struct msgpath mgp;
1043
                message_path = db->data + db->path_offsets[i];
1090
                message_path = db->data + db->path_offsets[i];
1091
              if (do_md_completion && access(message_path, F_OK))
1092
                /* if target does not exist anymore, try file completion */
1093
                new_target = find_new_link_target(message_path);
1094
              if(new_target) {
1095
                mgp.src.mpf.path = new_target;
1096
                scan_maildir_flags(&mgp);
1097
                target_path = mk_maildir_path(i, output_path, 0, mgp.seen, mgp.replied, mgp.flagged);
1098
                create_symlink(new_target, target_path);
1099
                free(new_target);
1100
              } else {
1044
                is_in_new = looks_like_maildir_new_p(message_path);
1101
                is_in_new = looks_like_maildir_new_p(message_path);
1045
                target_path = mk_maildir_path(i, output_path, is_in_new, is_seen, is_replied, is_flagged);
1102
                target_path = mk_maildir_path(i, output_path, is_in_new, is_seen, is_replied, is_flagged);
1046
                create_symlink(message_path, target_path);
1103
                create_symlink(message_path, target_path);
1104
              }
1047
                free(target_path);
1105
                free(target_path);
1048
                ++n_hits;
1106
                ++n_hits;
1049
              }
1107
              }
Lines 1069-1076 Link Here
1069
          switch (rd_msg_type(db, i)) {
1127
          switch (rd_msg_type(db, i)) {
1070
            case DB_MSG_FILE:
1128
            case DB_MSG_FILE:
1071
              {
1129
              {
1130
               char *message_path, *new_target=NULL;
1072
                char *target_path = mk_mh_path(i, output_path);
1131
                char *target_path = mk_mh_path(i, output_path);
1073
                create_symlink(db->data + db->path_offsets[i], target_path);
1132
               message_path = db->data + db->path_offsets[i];
1133
               if (do_md_completion && access(message_path, F_OK))
1134
                 /* if target does not exist anymore, try file completion */
1135
                 new_target = find_new_link_target(message_path);
1136
               if(new_target) {
1137
                 create_symlink(new_target, target_path);
1138
                 free(new_target);
1139
               } else
1140
                 create_symlink(message_path, target_path);
1074
                free(target_path);
1141
                free(target_path);
1075
                ++n_hits;
1142
                ++n_hits;
1076
              }
1143
              }
Lines 1382-1388 Link Here
1382
}
1449
}
1383
/*}}}*/
1450
/*}}}*/
1384
1451
1385
int search_top(int do_threads, int do_augment, char *database_path, char *complete_mfolder, char **argv, enum folder_type ft, int verbose)/*{{{*/
1452
int search_top(int do_threads, int do_augment, char *database_path, char *complete_mfolder, 
1453
	       char **argv, enum folder_type ft, int verbose, int do_md_completion)/*{{{*/
1386
{
1454
{
1387
  struct read_db *db;
1455
  struct read_db *db;
1388
  int result;
1456
  int result;
Lines 1428-1434 Link Here
1428
    }
1496
    }
1429
  }
1497
  }
1430
1498
1431
  result = do_search(db, argv, complete_mfolder, do_threads, ft, verbose);
1499
  result = do_search(db, argv, complete_mfolder, do_threads, ft, verbose, do_md_completion);
1432
  free(complete_mfolder);
1500
  free(complete_mfolder);
1433
  close_db(db);
1501
  close_db(db);
1434
  return result;
1502
  return result;
(-)mairix-0.21/version.txt (-1 / +1 lines)
Line 1 Link Here
1
0.21
1
0.21 maildirpatch

Return to bug 274578