Changeset 515 for CMT/HEAD


Ignore:
Timestamp:
Jul 15, 2009, 3:12:24 PM (15 years ago)
Author:
rybkin
Message:

See C.L. 404

Location:
CMT/HEAD
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • CMT/HEAD/ChangeLog

    r514 r515  
     12009-07-15    <rybkin@lal.in2p3.fr> 404
     2
     3        * source/cmt_system.cxx: In function CMTPathManager::do_add_cmt_path, ensure
     4        that CMTUSERCONTEXT or CMTHOME is not set as parent project for other
     5        projects. In function CmtSystem::get_cmt_paths, create CMTUSERCONTEXT and/or
     6        CMTHOME projects before projects from CMTPATH so that their source does not
     7        change after sourcing a setup script
     8        * source/cmt_project.h: In function Project::visit, add offset parameter
     9        * source/cmt_project.cxx: In function ProjectFactory::create_project, do not
     10        make CMTUSERCONTEXT or CMTHOME project top project because it has no parent,
     11        or add it as child to the top project. In function
     12        Project::ordered_projects, make CMTUSERCONTEXT first and CMTHOME last
     13        project, if existent, with the child - the next, and the parent - last but
     14        one project in order respectively. In functions Project::fill_selection,
     15        Project::show_all make use of Project::ordered_projects. In function,
     16        Project::visit, make use offset parameter, when reordering projects, put the
     17        child project right after the parent project. In function Project::show,
     18        ensure the project is shown once
     19        * source/cmt_use.cxx: In function Use::get_strategy, fix the search of the
     20        project for a use (in case the use has an offset), make use of function
     21        Project::ordered_projects instead of Project::projects function
     22       
    1232009-07-01    <rybkin@lal.in2p3.fr> 403
    224       
  • CMT/HEAD/source/cmt_project.cxx

    r501 r515  
     1
    12//-----------------------------------------------------------
    23// Copyright Christian Arnault LAL-Orsay CNRS
     
    543544      parent->update_strategies_from_children ();
    544545    }
    545   else
     546  else if ((name != "CMTUSERCONTEXT") && (name != "CMTHOME"))
     547    //  else
    546548    {
    547549      // this project has no parent thus it should become the top project.
     
    552554        {
    553555          Project* p = &(Projects[i]);
    554           if (p->get_name () == name) continue;
     556          const cmt_string& n = p->get_name ();
     557          if (n == name) continue;
     558          //      if (p->get_name () == name) continue;
     559          if ((n == "CMTUSERCONTEXT") || (n == "CMTHOME")) continue;
    555560          if (!p->has_parents ())
    556561            {
     
    908913
    909914  Project::ProjectVector& Projects = Project::projects ();
    910   int size = Projects.size ();
     915  const int size = Projects.size ();
    911916 
     917  int offset (0);
     918  int iuser (-1);
     919  int ihome (-1);
     920  for (int i = 0; i < 2; i++)
     921    {
     922      if (offset < size)
     923        {
     924          const cmt_string& name = Projects[offset].get_name ();
     925          if (name == "CMTUSERCONTEXT")
     926            {
     927              iuser = offset;
     928              ++offset;
     929            }
     930          else if (name == "CMTHOME")
     931            {
     932              ihome = offset;
     933              ++offset;
     934            }
     935          else
     936            break;
     937        }
     938    }
     939
     940  OrderedProjects.resize (size);
     941
    912942  for (int i = 0; i < size; i++)
    913943    {
    914944      Project& p = Projects[i];
    915       //    p.m_visited = false;
    916       p.m_order = -1;
     945      if (i >= offset)
     946        p.m_order = -1;
     947      else
     948        p.m_order = -2;
    917949      p.m_visits = 0;
    918950    }
    919951
     952  if (size == offset)
     953    {
     954      for (int i = 0; i < offset; i++)
     955        {
     956          Project* p = &(Projects[i]);
     957          OrderedProjects[i] = p;
     958        }
     959      if (2 == offset)
     960        {
     961          OrderedProjects[0]->add_child (OrderedProjects[1]);
     962          OrderedProjects[1]->add_parent (OrderedProjects[0]);
     963          OrderedProjects[0]->update_strategies_from_children ();
     964        }
     965      return OrderedProjects;
     966    }
     967
    920968  Project* p = get_current ();
    921969
     970  //  cerr << "get_current: " << p << " offset: " << offset << endl;
    922971  if (p == 0)
    923972    {
    924       if (0 == size) return OrderedProjects;
    925 
    926       p = &(Projects[0]);
    927     }
    928 
    929   ProjectPtrVector projs;
     973      p = &(Projects[offset]);
     974      //      p = &(Projects[0]);
     975    }
     976  //  cerr << "p: " << p << " offset: " << offset << " name: " << p->get_name () << endl;
    930977
    931978  int order (-1);
    932   p->m_order = ++order;
    933   p->m_visits++;
    934   projs.push_back (p);
    935 
    936   visit (order, projs);
    937 
    938   OrderedProjects.resize (order + 1);
    939   for (int i = 0; i < size; i++)
     979
     980  if ((p->get_name () != "CMTUSERCONTEXT") && (p->get_name () != "CMTHOME"))
     981    {
     982      ProjectPtrVector projs;
     983      p->m_order = ++order;
     984      //      p->m_visits++;
     985      projs.push_back (p);
     986     
     987      visit (offset, order, projs);
     988      //  visit (order, projs);
     989    }
     990  //  cerr << "order: " << order << endl;
     991  //  int unordered = size - offset - (order + 1);
     992
     993  int beg (0);
     994  if  (-1 != iuser)
     995    {
     996      OrderedProjects[0] = &(Projects[iuser]);
     997      //      cerr << "OrderedProjects[0]: " << (OrderedProjects[0])->get_name () << endl;
     998      ++beg;
     999    }
     1000
     1001  int noorder (0);
     1002  for (int i = offset; i < size; i++)
     1003    //  for (int i = 0; i < size; i++)
    9401004    {
    9411005      Project* p = &(Projects[i]);
     
    9431007      if (-1 == j)
    9441008        {
     1009          OrderedProjects[beg + order + 1 + noorder++] = p;
     1010          //      cerr << "no: OrderedProjects[" << beg + order + noorder << "]: " << (OrderedProjects[beg + order + noorder])->get_name () << endl;
     1011          //      OrderedProjects[order + 1 + noorder++] = p;
     1012          /*
    9451013          if (CmtMessage::active (Verbose))
    9461014            CmtMessage::warning ("Not ordered project " + p->get_name () +
     
    9481016                                 " from " + p->get_cmtpath_source ());
    9491017          continue;
    950         }
    951       OrderedProjects[j] = p;
     1018          */
     1019        }
     1020      else if  (-2 == j)
     1021        {
     1022        }
     1023      else
     1024        {
     1025          OrderedProjects[beg + j] = p;
     1026      //      OrderedProjects[j] = p;
     1027          //      cerr << "OrderedProjects[" << beg + j << "]: " << (OrderedProjects[beg + j])->get_name () << endl;
     1028        }
     1029    }
     1030
     1031  if  (-1 != ihome)
     1032    {
     1033      OrderedProjects[size - 1] = &(Projects[ihome]);
     1034    }
     1035
     1036  if  (-1 != iuser)
     1037    {
     1038      OrderedProjects[0]->add_child (OrderedProjects[1]);
     1039      OrderedProjects[1]->add_parent (OrderedProjects[0]);
     1040      OrderedProjects[0]->update_strategies_from_children ();
     1041    }
     1042
     1043  if  (-1 != ihome)
     1044    {
     1045      /*
     1046      cerr << "beg: " << beg << " order: " << order << endl;
     1047      cerr << "noorder: " << noorder << " size - offset: " << size - offset << endl;
     1048      */
     1049      if (noorder != size - offset)
     1050        {  // the last ordered project
     1051          OrderedProjects[beg + order]->add_child (OrderedProjects[size - 1]);
     1052          OrderedProjects[size - 1]->add_parent (OrderedProjects[beg + order]);
     1053          OrderedProjects[beg + order]->update_strategies_from_children ();
     1054        }
     1055      else
     1056        {
     1057          OrderedProjects[size - 2]->add_child (OrderedProjects[size - 1]);
     1058          OrderedProjects[size - 1]->add_parent (OrderedProjects[size - 2]);
     1059          OrderedProjects[size - 2]->update_strategies_from_children ();
     1060        }
    9521061    }
    9531062
     
    9721081void Project::show_all ()
    9731082{
     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
     1092  Project* p = get_current ();
     1093
     1094  if (p == 0)
     1095    {
     1096      if (Ordered.size () == 0) return;
     1097
     1098      p = Ordered[0];
     1099    }
     1100  /*
    9741101  static Project::ProjectVector& Projects = Project::projects ();
    9751102 
     
    9881115      p = &(Projects[0]);
    9891116    }
     1117  */
    9901118
    9911119  p->show ();
     
    10801208  else if (arguments.size () == 1 && cmt_string (arguments[0]) == "-d")
    10811209    {
     1210      const ProjectVector& Projects = projects ();
     1211      for (int i = 0; i < Projects.size (); i++)
     1212        {
     1213          Project& p = Projects[i];
     1214          const cmt_string& w = p.get_cmtpath_pwd ();
     1215          const cmt_string& s = p.get_cmtpath_source ();
     1216         
     1217          if (s == "default path") continue;
     1218         
     1219          if (CmtSystem::test_directory (w))
     1220            {
     1221              cout << "# Create path " << w << " from " << s << endl;
     1222            }
     1223        }
     1224      /*
    10821225      VisitorForShowPaths visitor;
    10831226      start_visit (visitor);
     1227      */
    10841228    }
    10851229  else
     
    10981242void Project::fill_selection (int depth, CmtSystem::cmt_string_vector& path_selections)
    10991243{
     1244  static ProjectPtrVector Ordered = Project::ordered_projects ();
     1245  for (int i = 0; i < Ordered.size (); i++)
     1246    {
     1247      const Project* project = Ordered[i];
     1248
     1249      const cmt_string& p = project->get_cmtpath ();
     1250      const cmt_string& pwd = project->get_cmtpath_pwd ();
     1251      const cmt_string& p_real = project->get_cmtpath_real ();
     1252      const cmt_string& src = project->get_cmtpath_source ();
     1253      /*
    11001254  static ProjectVector& Projects = projects ();
    11011255
     
    11081262      const cmt_string& p_real = project.get_cmtpath_real ();
    11091263      const cmt_string& src = project.get_cmtpath_source ();
    1110 
     1264      */
    11111265      if (src != "default path")
    11121266        {
     
    13291483 *  then the direct dependencies of the of the first dependency, of the second
    13301484 *  dependency and so on. That is first left to right, then downwards.
     1485 *  @param offset the offset from which to use all the projects
    13311486 *  @param order the order of the last project visited
    13321487 *  @param projs vector of projects to visit and order
    13331488 */
    1334 void Project::visit (int& order, ProjectPtrVector& projs)
     1489void Project::visit (const int offset, int& order, ProjectPtrVector& projs)
    13351490{
    13361491  int size = projs.size ();
    13371492  if (0 == size) return;
    13381493  static ProjectVector& all = Project::projects ();
    1339 
     1494  /*
     1495  cerr << "@ visit: " << order;
     1496  for (int j = 0; j < size; j++)
     1497    {
     1498      Project* p = projs[j];
     1499      cerr << " " << p->get_name ();
     1500    }
     1501  cerr << " @" << endl;
     1502  */
    13401503  ProjectPtrVector children;
    13411504  for (int j = 0; j < size; j++)
    13421505    {
    13431506      Project* p = projs[j];
     1507      p->m_visits++;
    13441508      // Avoid looping in case of circular project dependencies
    1345       if (100 <= p->m_visits)
     1509      if (500 <= p->m_visits)
     1510        //      if (100 <= p->m_visits)
    13461511        continue;
    13471512      for (int i = 0; i < p->get_children_size (); i++)
     
    13491514          Project* child = p->get_child (i);
    13501515          const int chorder = child->m_order;
    1351           if (-1 == chorder) // not ordered yet, i.e. visited for the first time
    1352             child->m_order = ++order;
    1353           else
    1354             { // ordered already, want to put it last in the order
    1355               for (int k = 0; k < all.size (); k++)
     1516          const int porder = p->m_order;
     1517          /*
     1518          cerr << ">>> " << p->get_name () << " child: " << i << endl;
     1519          cerr << child->get_name () << " in: " << chorder << endl;
     1520          */
     1521          if (-2 == chorder)
     1522            continue;
     1523          else if (-1 == chorder)
     1524            { // not ordered yet, i.e. visited for the first time
     1525              child->m_order = ++order;
     1526            }
     1527          else if (0 == chorder)
     1528            { // the project we started with, i. e. the current project:
     1529              //     o circular dependency
     1530              //     o do want to keep it first no matter what
     1531              if (CmtMessage::active (Verbose))
     1532                CmtMessage::warning ("Circular dependency on project: "
     1533                                     + child->get_name ()
     1534                                     + " " + child->get_release ()
     1535                                     + " " + child->get_cmtpath ());
     1536            }
     1537          else if ((0 < chorder) && (chorder < porder))
     1538            { // ordered already, want to put it after the parent in the order
     1539              for (int k = offset; k < all.size (); k++)
    13561540                {
    13571541                  Project& q = all[k];
    1358                   if (q.m_order == chorder)
    1359                     q.m_order = order;
    1360                   else if (q.m_order > chorder)
     1542                  if (&q == child)
     1543                    {// the child we are putting after the parent in the order
     1544                      q.m_order = porder;
     1545                      //     cerr << "Moved back: " << q.get_name () << " order: " << q.m_order << endl;
     1546                    }
     1547                  else if ((chorder < q.m_order) && (q.m_order <= porder))
    13611548                    q.m_order--;
    13621549                }
    13631550            }
    1364           child->m_visits++;
    1365           children.push_back (child);
    1366         }
    1367     }
    1368 
    1369   visit (order, children);
     1551          //      cerr << child->get_name () << " out: " << child->m_order << endl;
     1552          //      child->m_visits++;
     1553          bool unknown (true);
     1554          for (int j = 0; j < children.size (); j++)
     1555            {
     1556              if (children[j] == child)
     1557                {
     1558                  unknown = false;
     1559                  break;
     1560                }
     1561            }
     1562          if (unknown)
     1563            {
     1564              children.push_back (child);
     1565            }
     1566        }
     1567    }
     1568
     1569  visit (offset, order, children);
    13701570}
    13711571
     
    20252225void Project::show ()
    20262226{
     2227  if (m_visited) return;
     2228  m_visited = true;
     2229
    20272230  static int level = 0;
    20282231
     
    20662269  cout << endl;
    20672270
     2271/*
    20682272  if (m_visited) return;
    20692273
    20702274  m_visited = true;
     2275*/
    20712276
    20722277  for (i = 0; i < m_children.size (); i++)
  • CMT/HEAD/source/cmt_project.h

    r482 r515  
    193193  void   visit (IProjectVisitor& visitor);
    194194  static  void   visit (IProjectVisitor& visitor, ProjectPtrVector& projects);
    195   static  void   visit (int& order, ProjectPtrVector& projects);
     195  static  void   visit (const int offset, int& order, ProjectPtrVector& projects);
    196196 
    197197  // Use
  • CMT/HEAD/source/cmt_system.cxx

    r497 r515  
    14071407
    14081408        m_project = factory.create_project (project_name, npath, path_source, m_project);
     1409        if ((path_source == "CMTUSERCONTEXT") ||
     1410            (path_source == "CMTHOME"))
     1411          {
     1412            m_project = 0;
     1413          }
    14091414      }
    14101415  }
     
    14981503  CMTPathManager::reset ();
    14991504
     1505  CMTPathManager::add_cmt_path (cmt_user_context, "CMTUSERCONTEXT", factory);
     1506  CMTPathManager::add_cmt_path (cmt_home, "CMTHOME", factory);
     1507  /*
    15001508  if (init_text != "")
    15011509    {
    15021510      add_cmt_paths_from_text (init_text, "initialization", factory);
    15031511    }
     1512  */
    15041513
    15051514#ifdef WIN32
     
    16031612  add_cmt_paths_from_file (rc_name, factory);
    16041613
     1614  /*
    16051615  CMTPathManager::add_cmt_path (cmt_user_context, "CMTUSERCONTEXT", factory);
    16061616  CMTPathManager::add_cmt_path (cmt_home, "CMTHOME", factory);
     1617  */
     1618  if (init_text != "")
     1619    {
     1620      add_cmt_paths_from_text (init_text, "initialization", factory);
     1621    }
    16071622}
    16081623
  • CMT/HEAD/source/cmt_use.cxx

    r461 r515  
    29432943bool Use::get_strategy (const cmt_string& name) const
    29442944{
    2945   Project* p = Project::find_by_cmtpath (real_path);
     2945  const Project* p = Project::find_by_cmtpath (Project::find_in_cmt_paths (real_path));
    29462946
    29472947  bool strategy;
     
    29492949  if (p == 0)
    29502950    {
    2951       static const Project::ProjectVector& projects = Project::projects ();
    2952 
    2953       if (projects.size () == 0) strategy = StrategyMgr::get_default_strategy (name);
     2951      static const Project::ProjectPtrVector Ordered = Project::ordered_projects ();
     2952      //static const Project::ProjectVector& projects = Project::projects ();
     2953
     2954      if (Ordered.size () == 0) strategy = StrategyMgr::get_default_strategy (name);
     2955      //if (projects.size () == 0) strategy = StrategyMgr::get_default_strategy (name);
    29542956      else
    29552957        {
    2956           p = &(projects[0]);
     2958          p = Ordered[0];
     2959          //p = &(projects[0]);
    29572960          strategy = p->get_strategy (name);
    29582961        }
Note: See TracChangeset for help on using the changeset viewer.