Ignore:
Timestamp:
Mar 26, 2010, 11:56:50 AM (14 years ago)
Author:
rybkin
Message:

See C.L. 422

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CMT/HEAD/source/cmt_project.cxx

    r528 r535  
    247247            }
    248248 
     249          bool updated (false);
    249250          if (parent != 0)
    250251            {
     252              if (!p.has_parent (parent) || !parent->has_child (&p))
     253                {
    251254              p.add_parent (parent);
    252255              parent->add_child (&p);
     
    255258
    256259              parent->update_strategies_from_children ();
     260              updated = true;
     261                }
     262
    257263            }
    258264
    259265          CmtSystem::cd (here);
     266          if (updated) Project::order_all ();
    260267          return (&p);
    261268        }
     
    278285
    279286  // In case there are symlinks
    280   cmt_string here_real, pwd_real;
     287
     288  //  cmt_string here_real, pwd_real;
    281289  //cerr << "realpath_: create_project" << endl;
     290  /*
    282291  if (CmtSystem::realpath_ (here, here_real) && CmtSystem::realpath_ (pwd, pwd_real))
    283292    {
    284293      if (here_real.find (pwd_real) == 0) is_current = true;
     294    }
     295  */
     296  cmt_string pwd_real;
     297  if (CmtSystem::realpath_ (pwd, pwd_real))
     298    {
     299      if (Cmt::get_current_dir_real ().find (pwd_real) == 0) is_current = true;
    285300    }
    286301
     
    544559      parent->update_strategies_from_children ();
    545560    }
     561  /*
    546562  else if ((name != "CMTUSERCONTEXT") && (name != "CMTHOME"))
    547563    //  else
     
    569585      project->update_strategies_from_children ();
    570586    }
    571 
     587  */
    572588  if (source == "default path")
    573589    {
     
    581597  project->set_cmtpath_source (source);
    582598
     599  project->set_is_current (is_current);
     600
    583601  if (is_current)
    584602    {
     603      //      cerr << "current: " << project->get_name () << endl;
    585604      //
    586605      // The current project defines a tag with its name
     
    594613
    595614
     615  //  Project::order_all ();
    596616
    597617  if (text != "")
     
    649669
    650670  CmtSystem::cd (here);
     671  Project::order_all ();
    651672
    652673  return (project);
     
    820841Project* Project::get_current ()
    821842{
     843  /*
    822844  cmt_string here = CmtSystem::pwd ();
    823845
     
    825847  cmt_string here_real;
    826848  CmtSystem::realpath_ (here, here_real);
    827 
     849  */
    828850  static ProjectVector& Projects = projects ();
    829851
     
    840862
    841863//      if (here.find (p.m_cmtpath) == 0)
    842       if (here_real.find (p.m_cmtpath_real) == 0)
     864      if (p.is_current ())
     865        //      if (here_real.find (p.m_cmtpath_real) == 0)
    843866        {
    844867          result = &p;
     
    907930
    908931//----------------------------------------------------------
    909 Project::ProjectPtrVector Project::ordered_projects ()
    910 {
    911   static ProjectPtrVector OrderedProjects;
     932Project::ProjectPtrVector& Project::ordered_projects ()
     933{
     934  static Database& db = Database::instance ();
     935  static ProjectPtrVector& Projects = db.ordered_projects ();
     936
     937  return (Projects);
     938}
     939
     940//----------------------------------------------------------
     941void Project::order_all ()
     942//Project::ProjectPtrVector Project::ordered_projects ()
     943{
     944  ProjectPtrVector OrderedProjects;
     945  //  static ProjectPtrVector OrderedProjects;
     946  static Project::ProjectPtrVector& orderedProjects = Project::ordered_projects ();
    912947
    913948  static Project::ProjectVector& Projects = Project::projects ();
     
    956991          OrderedProjects[i] = p;
    957992        }
     993      /*
    958994      if (2 == offset)
    959995        {
     
    962998          OrderedProjects[0]->update_strategies_from_children ();
    963999        }
    964       return OrderedProjects;
     1000      */
     1001      for (int i = OrderedProjects.size () - 2; i >= 0; i--)
     1002        {
     1003          if (!OrderedProjects[i]->has_parents () &&
     1004              OrderedProjects[i]->get_children_size () == 0)
     1005            {
     1006              OrderedProjects[i]->add_child (OrderedProjects[i + 1]);
     1007              OrderedProjects[i]->update_strategies_from_children ();
     1008              OrderedProjects[i]->erase_child (OrderedProjects[i + 1]);
     1009            }
     1010        }
     1011
     1012      orderedProjects = OrderedProjects;
     1013      //      return OrderedProjects;
     1014      return;
    9651015    }
    9661016
     
    9681018
    9691019  //  cerr << "get_current: " << p << " offset: " << offset << endl;
     1020  /*
    9701021  if (p == 0)
    9711022    {
     
    9731024      //      p = &(Projects[0]);
    9741025    }
     1026  */
    9751027  //  cerr << "p: " << p << " offset: " << offset << " name: " << p->get_name () << endl;
    9761028
    9771029  int order (-1);
    978 
     1030  /*
    9791031  if ((p->get_name () != "CMTUSERCONTEXT") && (p->get_name () != "CMTHOME"))
    9801032    {
     
    9891041  //  cerr << "order: " << order << endl;
    9901042  //  int unordered = size - offset - (order + 1);
     1043  */
     1044  ProjectPtrVector projs;
     1045
     1046  if (p != 0 && (p->get_name () != "CMTUSERCONTEXT") && (p->get_name () != "CMTHOME"))
     1047    {
     1048      p->m_order = ++order;
     1049      projs.push_back (p);
     1050    }
     1051
     1052  if (p == 0 ||
     1053      (!p->has_parents () && p->get_children_size () == 0)
     1054      // comes from CMTPATH entry
     1055      )
     1056    {
     1057      for (int i = offset; i < size; i++)
     1058        {
     1059          Project* q = &(Projects[i]);
     1060          if (q != p && !q->has_parents ())
     1061            {
     1062              q->m_order = ++order;
     1063              projs.push_back (q);
     1064            }
     1065        }
     1066    }
     1067
     1068  visit (offset, order, projs);
    9911069
    9921070  int beg (0);
     
    10171095          */
    10181096        }
     1097      else if (-2 != j)
     1098        {
     1099          OrderedProjects[beg + j] = p;
     1100        }
     1101      /*
    10191102      else if  (-2 == j)
    10201103        {
     
    10261109          //      cerr << "OrderedProjects[" << beg + j << "]: " << (OrderedProjects[beg + j])->get_name () << endl;
    10271110        }
    1028     }
    1029 
     1111      */
     1112    }
     1113
     1114  if (p != 0)
     1115    {
     1116      for (int i = 0; i < noorder; i++)
     1117        OrderedProjects.pop_back ();
     1118    }
    10301119  if  (-1 != ihome)
    10311120    {
    1032       OrderedProjects[size - 1] = &(Projects[ihome]);
    1033     }
    1034 
     1121      OrderedProjects[OrderedProjects.size () - 1] = &(Projects[ihome]);
     1122    }
     1123  /*
     1124  if (p)
     1125    {
     1126      if  (-1 != ihome)
     1127        {
     1128          OrderedProjects[beg + order + 1] = &(Projects[ihome]);
     1129        }
     1130      for (int i = 0; i < noorder; i++)
     1131        OrderedProjects.pop_back ();
     1132    }
     1133  else
     1134    {
     1135      if  (-1 != ihome)
     1136        {
     1137          OrderedProjects[size - 1] = &(Projects[ihome]);
     1138        }
     1139    }
     1140  */
     1141      /*
    10351142  if  (-1 != iuser)
    10361143    {
     
    10391146      OrderedProjects[0]->update_strategies_from_children ();
    10401147    }
    1041 
    1042   if  (-1 != ihome)
    1043     {
     1148      */
     1149
     1150//   if  (-1 != ihome)
     1151//     {
    10441152      /*
    10451153      cerr << "beg: " << beg << " order: " << order << endl;
    10461154      cerr << "noorder: " << noorder << " size - offset: " << size - offset << endl;
    10471155      */
     1156      /*
    10481157      if (noorder != size - offset)
    10491158        {  // the last ordered project
     
    10581167          OrderedProjects[size - 2]->update_strategies_from_children ();
    10591168        }
    1060     }
    1061 
    1062   return OrderedProjects;
     1169      */
     1170//     }
     1171
     1172  for (int i = OrderedProjects.size () - 2; i >= 0; i--)
     1173    {
     1174      if (!OrderedProjects[i]->has_parents () &&
     1175          OrderedProjects[i]->get_children_size () == 0)
     1176        {
     1177          OrderedProjects[i]->add_child (OrderedProjects[i + 1]);
     1178          OrderedProjects[i]->update_strategies_from_children ();
     1179          OrderedProjects[i]->erase_child (OrderedProjects[i + 1]);
     1180        }
     1181    }
     1182
     1183  orderedProjects = OrderedProjects;
     1184  //  return OrderedProjects;
     1185  return;
    10631186}
    10641187
     
    10801203void Project::show_all ()
    10811204{
    1082   const Project::ProjectPtrVector& Ordered = Project::ordered_projects ();
    1083   //  static const Project::ProjectPtrVector Ordered = Project::ordered_projects ();
    1084  
    1085   for (int i = 0; i < Ordered.size (); i++)
    1086     {
    1087       Project* p = Ordered[i];
    1088       p->m_visited = false;
    1089     }
    1090 
    1091   Project* p = get_current ();
    1092 
    1093   if (p == 0)
    1094     {
    1095       if (Ordered.size () == 0) return;
    1096 
    1097       p = Ordered[0];
    1098     }
    1099   /*
     1205  static const Project::ProjectPtrVector& Ordered = Project::ordered_projects ();
    11001206  static Project::ProjectVector& Projects = Project::projects ();
    11011207 
     
    11061212    }
    11071213
     1214  for (int i = 0; i < Ordered.size (); i++)
     1215    Ordered[i]->show ();
     1216
     1217  for (int i = 0; i < Projects.size (); i++)
     1218    Projects[i].show ();
     1219
     1220  /*
    11081221  Project* p = get_current ();
    11091222
    11101223  if (p == 0)
    11111224    {
    1112       if (Projects.size () == 0) return;
    1113 
    1114       p = &(Projects[0]);
     1225      if (Ordered.size () == 0) return;
     1226
     1227      p = Ordered[0];
    11151228    }
    11161229  */
    1117 
    1118   p->show ();
     1230  //  p->show ();
    11191231}
    11201232
     
    13031415void Project::fill_selection (int depth, CmtSystem::cmt_string_vector& path_selections)
    13041416{
    1305   static ProjectPtrVector Ordered = Project::ordered_projects ();
     1417  static ProjectPtrVector& Ordered = Project::ordered_projects ();
    13061418  for (int i = 0; i < Ordered.size (); i++)
    13071419    {
     
    13521464void Project::broadcast (IProjectAction& action)
    13531465{
    1354   static ProjectPtrVector Projects = Project::ordered_projects ();
     1466  //  const ProjectPtrVector Projects = Project::ordered_projects ();
     1467  static ProjectPtrVector& Projects = Project::ordered_projects ();
    13551468
    13561469  for (int i = 0; i < Projects.size (); i++)
     
    13751488void Project::reverse_broadcast (IProjectAction& action)
    13761489{
    1377   static ProjectPtrVector Projects = Project::ordered_projects ();
     1490  //  const ProjectPtrVector Projects = Project::ordered_projects ();
     1491  static ProjectPtrVector& Projects = Project::ordered_projects ();
    13781492
    13791493  for (int i = (Projects.size () - 1); i >= 0; i--)
     
    15561670{
    15571671  int size = projs.size ();
     1672  //  cerr << "visit: " << offset << " " << order << " " << size << endl;
    15581673  if (0 == size) return;
    15591674  static ProjectVector& all = Project::projects ();
     
    15911706              child->m_order = ++order;
    15921707            }
    1593           else if (0 == chorder)
     1708          else if (child->is_current ())
     1709            //    else if (0 == chorder)
    15941710            { // the project we started with, i. e. the current project:
    15951711              //     o circular dependency
     
    16011717                                     + " " + child->get_cmtpath ());
    16021718            }
    1603           else if ((0 < chorder) && (chorder < porder))
     1719          else if ((0 <= chorder) && (chorder < porder))
     1720            //    else if ((0 < chorder) && (chorder < porder))
    16041721            { // ordered already, want to put it after the parent in the order
    16051722              for (int k = offset; k < all.size (); k++)
     
    16091726                    {// the child we are putting after the parent in the order
    16101727                      q.m_order = porder;
    1611                       //     cerr << "Moved back: " << q.get_name () << " order: " << q.m_order << endl;
     1728                      //              cerr << "Moved back: " << q.get_name () << " order: " << q.m_order << endl;
    16121729                    }
    16131730                  else if ((chorder < q.m_order) && (q.m_order <= porder))
     
    16151732                }
    16161733            }
    1617           //      cerr << child->get_name () << " out: " << child->m_order << endl;
     1734          //  cerr << child->get_name () << " out: " << child->m_order << endl;
    16181735          //      child->m_visits++;
    16191736          bool unknown (true);
     
    17481865  start_visit (visitor);
    17491866  */
    1750   const ProjectPtrVector Ordered = Project::ordered_projects ();
     1867  const ProjectPtrVector& Ordered = Project::ordered_projects ();
    17511868
    17521869  buffer = "path CMTPATH \"\" \n";
     
    19092026
    19102027//----------------------------------------------------------
     2028void Project::set_is_current (bool is_current)
     2029{
     2030  m_is_current = is_current;
     2031}
     2032
     2033//----------------------------------------------------------
     2034bool Project::is_current () const
     2035{
     2036  return m_is_current;
     2037}
     2038
     2039//----------------------------------------------------------
    19112040void Project::clear ()
    19122041{
     
    19252054
    19262055  m_strategies.clear ();
     2056  m_is_current = false;
    19272057}
    19282058
     
    20192149
    20202150  m_children.push_back (p);
     2151}
     2152
     2153//----------------------------------------------------------
     2154void Project::erase_child (Project* p)
     2155{
     2156  if (p == 0) return;
     2157  if (p == this) return;
     2158
     2159  if (!has_child (p)) return;
     2160
     2161  const cmt_string& name = p->get_name ();
     2162
     2163  for (int i = 0; i < m_children.size (); i++)
     2164    {
     2165      const Project* child = m_children[i];
     2166      if (child == 0) continue;
     2167
     2168      if (child->get_name () == name)
     2169        {
     2170          // registered as a child
     2171          m_children.erase (i);
     2172          break;
     2173        }
     2174    }
    20212175}
    20222176
     
    20882242      use->set (name, version, path);
    20892243      use->get_package ()->remove_use (use);
     2244      CmtSystem::cd (m_cmtpath_pwd);
    20902245      if (use->move_to ())
    20912246        {
     
    21032258            {
    21042259              use->~Use ();
     2260            }
     2261          else if (!CmtSystem::absolute_path (use->real_path))
     2262            {
     2263              use->change_path (m_cmtpath_pwd);
    21052264            }
    21062265        }
     
    23822541  static int level = 0;
    23832542
    2384   bool is_current = false;
     2543  //  bool is_current = false;
    23852544
    23862545  //  cmt_string here = CmtSystem::pwd ();
    23872546  // In case there are symlinks
     2547  /*
    23882548  cmt_string here_real;
    23892549  CmtSystem::realpath_ (CmtSystem::pwd (), here_real);
     
    23972557        }
    23982558    }
    2399 
     2559  */
    24002560  for (int tab = 0; tab < level; tab++) cout << "  ";
    24012561  cout << m_name << " " << (m_name != "CMTUSERCONTEXT" && m_name != "CMTHOME" ? m_release : "v0") << " (in " << m_cmtpath << ")";
    24022562  //  cout << m_name << " " << m_release << " (in " << m_cmtpath << ")";
    24032563
    2404   if (is_current) cout << " (current)";
     2564  if (m_is_current) cout << " (current)";
     2565  //  if (is_current) cout << " (current)";
    24052566
    24062567  int i;
Note: See TracChangeset for help on using the changeset viewer.