/[CvsGraph]/cvsgraph/cvsgraph.c
ViewVC logotype

Diff of /cvsgraph/cvsgraph.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.30, Sun Mar 9 22:36:50 2003 UTC revision 1.31, Mon Mar 10 22:57:21 2003 UTC
# Line 679  Line 679 
679          return dup_string();          return dup_string();
680  }  }
681    
682  int assign_tags(rcsfile_t *rcs)  static void find_merges(rcsfile_t *rcs)
683  {  {
684          int i;          int i;
         int nr;  
685          int err;          int err;
686            int rcflags = REG_EXTENDED | (conf.merge_nocase ? REG_ICASE : 0);
687          regex_t *refrom = NULL;          regex_t *refrom = NULL;
688          regex_t *reto = NULL;          regex_t *reto = NULL;
689          regmatch_t *matchfrom = NULL;          regmatch_t *matchfrom = NULL;
690    
691          if(conf.merge_from && conf.merge_from[0] && conf.merge_to && conf.merge_to[0])          if(!conf.merge_from || !conf.merge_from[0] || !conf.merge_to || !conf.merge_to[0])
692                    return;
693    
694            refrom = xmalloc(sizeof(*refrom));
695            reto = xmalloc(sizeof(*reto));
696    
697            /* Compile the 'from' regex match for merge identification */
698            err = regcomp(refrom, conf.merge_from, rcflags);
699            if(err)
700          {          {
701                  refrom = xmalloc(sizeof(*refrom));                  if(!quiet)
702                  reto = xmalloc(sizeof(*reto));                  {
703                            char *msg;
704                            i = regerror(err, refrom, NULL, 0);
705                            msg = xmalloc(i+1);
706                            regerror(err, refrom, msg, i+1);
707                            fprintf(stderr, "%s\n", msg);
708                            xfree(msg);
709                    }
710                    xfree(refrom);
711                    xfree(reto);
712                    return;
713            }
714            else
715                    matchfrom = xmalloc((refrom->re_nsub+1) * sizeof(*matchfrom));
716    
717                  /* Compile the 'from' regex match for merge identification */          for(i = 0; i < rcs->tags->ntags; i++)
718                  err = regcomp(refrom, conf.merge_from, REG_EXTENDED | (conf.merge_nocase ? REG_ICASE : 0));          {
719                  if(err)                  tag_t *t = rcs->tags->tags[i];
720                  {  
721                          if(!quiet)                  /* Must be revision tags and not detached */
722                          {                  if(t->rev->isbranch || !t->logrev)
723                                  char *msg;                          continue;
724                                  i = regerror(err, refrom, NULL, 0);  
725                                  msg = xmalloc(i+1);                  /* Try to find merge tag matches */
726                                  regerror(err, refrom, msg, i+1);                  if(!regexec(refrom, t->tag, refrom->re_nsub+1, matchfrom, 0))
727                                  fprintf(stderr, "%s\n", msg);                  {
728                                  xfree(msg);                          int n;
729                          }                          char *to;
730                          xfree(refrom);  
731                          xfree(reto);                          to = build_regex(refrom->re_nsub+1, matchfrom, t->tag);
732                          refrom = NULL;                          if(to)
733                          reto = NULL;                          {
734                                    err = regcomp(reto, to, rcflags);
735                                    if(err && !quiet)
736                                    {
737                                            char *msg;
738                                            i = regerror(err, reto, NULL, 0);
739                                            msg = xmalloc(i+1);
740                                            regerror(err, reto, msg, i+1);
741                                            fprintf(stderr, "%s\n", msg);
742                                    }
743                                    else if(!err)
744                                    {
745                                            for(n = 0; n < rcs->tags->ntags; n++)
746                                            {
747                                                    tag_t *nt = rcs->tags->tags[n];
748                                                    /* From and To never should match the same tag or belong to a branch */
749                                                    if(n == i || nt->rev->isbranch || !nt->logrev)
750                                                            continue;
751    
752                                                    if(!regexec(reto, nt->tag, 0, NULL, REG_NOSUB))
753                                                    {
754                                                            /* Tag matches */
755                                                            rcs->merges = xrealloc(rcs->merges,
756                                                                            sizeof(rcs->merges[0]) * (rcs->nmerges+1));
757                                                            rcs->merges[rcs->nmerges].to = nt;
758                                                            rcs->merges[rcs->nmerges].from = t;
759                                                            rcs->nmerges++;
760                                                            /* We cannot (should not) match multiple times */
761                                                            break;
762                                                    }
763                                            }
764                                            regfree(reto);
765                                    }
766                                    xfree(to);
767                            }
768                  }                  }
                 else  
                         matchfrom = xmalloc((refrom->re_nsub+1) * sizeof(*matchfrom));  
769          }          }
770            if(matchfrom)   xfree(matchfrom);
771            if(refrom)      { regfree(refrom); xfree(refrom); }
772            if(reto)        xfree(reto);
773    }
774    
775    static void assign_tags(rcsfile_t *rcs)
776    {
777            int i;
778            int nr;
779    
780          for(i = nr = 0; i < rcs->nbranches; i++)          for(i = nr = 0; i < rcs->nbranches; i++)
781                  nr += rcs->branches[i]->nrevs;                  nr += rcs->branches[i]->nrevs;
# Line 819  Line 881 
881                                                  rr->tags[rr->ntags] = t;                                                  rr->tags[rr->ntags] = t;
882                                          rr->ntags++;                                          rr->ntags++;
883                                  }                                  }
   
                                 /* Try to find merge tag matches */  
                                 if(refrom && !regexec(refrom, t->tag, refrom->re_nsub+1, matchfrom, 0))  
                                 {  
                                         int n;  
                                         char *to;  
   
                                         to = build_regex(refrom->re_nsub+1, matchfrom, t->tag);  
                                         if(to)  
                                         {  
                                                 err = regcomp(reto, to, REG_EXTENDED | (conf.merge_nocase ? REG_ICASE : 0));  
                                                 if(err && !quiet)  
                                                 {  
                                                         char *msg;  
                                                         i = regerror(err, reto, NULL, 0);  
                                                         msg = xmalloc(i+1);  
                                                         regerror(err, reto, msg, i+1);  
                                                         fprintf(stderr, "%s\n", msg);  
                                                 }  
                                                 else if(!err)  
                                                 {  
                                                         for(n = 0; n < rcs->tags->ntags; n++)  
                                                         {  
                                                                 /* From and To never should match the same tag */  
                                                                 if(n == i)  
                                                                         continue;  
   
                                                                 if(!regexec(reto, rcs->tags->tags[n]->tag, 0, NULL, REG_NOSUB))  
                                                                 {  
                                                                         /* Tag matches */  
                                                                         rcs->merges = xrealloc(rcs->merges,  
                                                                                         sizeof(rcs->merges[0]) * (rcs->nmerges+1));  
                                                                         rcs->merges[rcs->nmerges].to = rcs->tags->tags[n];  
                                                                         rcs->merges[rcs->nmerges].from = t;  
                                                                         rcs->nmerges++;  
                                                                         /* We cannot (should not) match multiple times */  
                                                                         n = rcs->tags->ntags;  
                                                                 }  
                                                         }  
                                                         regfree(reto);  
                                                 }  
                                                 xfree(to);  
                                         }  
                                 }  
884                          }                          }
885                  }                  }
886          }          }
# Line 879  Line 897 
897                  *b = rcs->branches[0];                  *b = rcs->branches[0];
898                  rcs->branches[0] = t;                  rcs->branches[0] = t;
899          }          }
         if(matchfrom)   xfree(matchfrom);  
         if(refrom)      { regfree(refrom); xfree(refrom); }  
         if(reto)        xfree(reto);  
         return 1;  
900  }  }
901    
902  /*  /*
# Line 1565  Line 1579 
1579          }          }
1580  }  }
1581    
1582  static void draw_merges(gdImagePtr im, rcsfile_t *rcs)  static void draw_merges(gdImagePtr im, rcsfile_t *rcs, int dot)
1583  {  {
1584          int i;          int i;
1585          for(i = 0; i < rcs->nmerges; i++)          for(i = 0; i < rcs->nmerges; i++)
# Line 1573  Line 1587 
1587                  revision_t *fr = rcs->merges[i].from->logrev;                  revision_t *fr = rcs->merges[i].from->logrev;
1588                  revision_t *tr = rcs->merges[i].to->logrev;                  revision_t *tr = rcs->merges[i].to->logrev;
1589                  int x1, x2, y1, y2;                  int x1, x2, y1, y2;
1590                  if(!fr || !tr)                  if(!fr || !tr || fr == tr)
1591                          continue;       /* This can happen with detached tags */                          continue;       /* This can happen with detached tags and self-references */
1592                  if(conf.left_right)                  if(conf.left_right)
1593                  {                  {
1594                          if(fr->y < tr->y)                          if(fr->y < tr->y)
# Line 1602  Line 1616 
1616                                  x1 = fr->cx - fr->w/2;                                  x1 = fr->cx - fr->w/2;
1617                                  x2 = tr->cx + tr->w/2;                                  x2 = tr->cx + tr->w/2;
1618                          }                          }
1619                          y1 = fr->y + fr->h/2;                          y1 = fr->y + rcs->merges[i].from->yofs;
1620                          y2 = tr->y + tr->h/2;                          y2 = tr->y + rcs->merges[i].to->yofs;
1621                  }                  }
1622                  gdImageArc(im, x2, y2, 8, 8, 0, 360, conf.merge_color.id);                  if(dot)
                 gdImageFillToBorder(im, x2, y2, conf.merge_color.id, conf.merge_color.id);  
                 if(conf.left_right)  
1623                  {                  {
1624                          if(y1 > y2)                          int o = conf.left_right ? 1 : 0;
1625                          {                          gdImageArc(im, x2, y2+o, 8, 8, 0, 360, conf.merge_color.id);
1626                                  gdImageLine(im, x1, y1, x1, y1-3, conf.merge_color.id);                          gdImageFillToBorder(im, x2+1, y2+o+1, conf.merge_color.id, conf.merge_color.id);
                                 gdImageLine(im, x2, y2+1, x2, y2+3+1, conf.merge_color.id);  
                                 gdImageLine(im, x1, y1-3, x2, y2+3+1, conf.merge_color.id);  
                         }  
                         else  
                         {  
                                 gdImageLine(im, x1, y1+1, x1, y1+3+1, conf.merge_color.id);  
                                 gdImageLine(im, x2, y2, x2, y2-3, conf.merge_color.id);  
                                 gdImageLine(im, x1, y1+3+1, x2, y2-3, conf.merge_color.id);  
                         }  
1627                  }                  }
1628                  else                  else
1629                  {                  {
1630                          if(x1 > x2)                          if(conf.left_right)
1631                          {                          {
1632                                  gdImageLine(im, x1, y1, x1-3, y1, conf.merge_color.id);                                  if(y1 > y2)
1633                                  gdImageLine(im, x2, y2, x2+3, y2, conf.merge_color.id);                                  {
1634                                  gdImageLine(im, x1-3, y1, x2+3, y2, conf.merge_color.id);                                          gdImageLine(im, x1, y1, x1, y1-3, conf.merge_color.id);
1635                                            gdImageLine(im, x2, y2+1, x2, y2+3+1, conf.merge_color.id);
1636                                            gdImageLine(im, x1, y1-3, x2, y2+3+1, conf.merge_color.id);
1637                                    }
1638                                    else
1639                                    {
1640                                            gdImageLine(im, x1, y1+1, x1, y1+3+1, conf.merge_color.id);
1641                                            gdImageLine(im, x2, y2, x2, y2-3, conf.merge_color.id);
1642                                            gdImageLine(im, x1, y1+3+1, x2, y2-3, conf.merge_color.id);
1643                                    }
1644                          }                          }
1645                          else                          else
1646                          {                          {
1647                                  gdImageLine(im, x1, y1, x1+3, y1, conf.merge_color.id);                                  if(x1 > x2)
1648                                  gdImageLine(im, x2, y2, x2-3, y2, conf.merge_color.id);                                  {
1649                                  gdImageLine(im, x1+3, y1, x2-3, y2, conf.merge_color.id);                                          gdImageLine(im, x1, y1, x1-3, y1, conf.merge_color.id);
1650                                            gdImageLine(im, x2, y2, x2+3, y2, conf.merge_color.id);
1651                                            gdImageLine(im, x1-3, y1, x2+3, y2, conf.merge_color.id);
1652                                    }
1653                                    else
1654                                    {
1655                                            gdImageLine(im, x1, y1, x1+3, y1, conf.merge_color.id);
1656                                            gdImageLine(im, x2, y2, x2-3, y2, conf.merge_color.id);
1657                                            gdImageLine(im, x1+3, y1, x2-3, y2, conf.merge_color.id);
1658                                    }
1659                          }                          }
1660                  }                  }
1661          }          }
# Line 1673  Line 1694 
1694                  gdImageColorTransparent(im, conf.color_bg.id);                  gdImageColorTransparent(im, conf.color_bg.id);
1695    
1696          if(!conf.merge_front)          if(!conf.merge_front)
1697                  draw_merges(im, rcs);                  draw_merges(im, rcs, 0);
1698    
1699          for(i = 0; i < rcs->nbranches; i++)          for(i = 0; i < rcs->nbranches; i++)
1700                  draw_branch(im, rcs->branches[i]);                  draw_branch(im, rcs->branches[i]);
1701    
1702            draw_merges(im, rcs, 1);        /* The dots of the merge dest */
1703    
1704          for(i = 0; i < rcs->nbranches; i++)          for(i = 0; i < rcs->nbranches; i++)
1705          {          {
1706                  if(rcs->branches[i]->branchpoint)                  if(rcs->branches[i]->branchpoint)
# Line 1686  Line 1710 
1710          xfree(cptr);          xfree(cptr);
1711    
1712          if(conf.merge_front)          if(conf.merge_front)
1713                  draw_merges(im, rcs);                  draw_merges(im, rcs, 0);
1714    
1715          return im;          return im;
1716  }  }
# Line 2329  Line 2353 
2353                  for(j = 0; j < rp->ntags; j++)                  for(j = 0; j < rp->ntags; j++)
2354                  {                  {
2355                          int ww = get_swidth(rp->tags[j]->tag, &conf.tag_font);                          int ww = get_swidth(rp->tags[j]->tag, &conf.tag_font);
2356                            int th;
2357                          if(ww > w) w = ww;                          if(ww > w) w = ww;
2358                          h += get_sheight(rp->tags[j]->tag, &conf.tag_font) + conf.rev_separator;                          th = get_sheight(rp->tags[j]->tag, &conf.tag_font) + conf.rev_separator;
2359                            rp->tags[j]->yofs = h + th/2 + conf.rev_tspace;
2360                            h += th;
2361                  }                  }
2362                  rp->w = w + conf.rev_lspace + conf.rev_rspace;                  rp->w = w + conf.rev_lspace + conf.rev_rspace;
2363                  rp->h = h + conf.rev_tspace + conf.rev_bspace;                  rp->h = h + conf.rev_tspace + conf.rev_bspace;
# Line 2953  Line 2980 
2980          if(!reorganise_branches(rcs))          if(!reorganise_branches(rcs))
2981                  return 1;                  return 1;
2982    
2983          if(!assign_tags(rcs))          assign_tags(rcs);
2984                  return 1;          find_merges(rcs);
2985    
2986          if(outfile)          if(outfile)
2987          {          {

Legend:
Removed from v.1.30  
changed lines
  Added in v.1.31

  ViewVC Help
Powered by ViewVC 1.1.0 with CvsGraph 1.7.0