Changeset 515
- Timestamp:
- Jul 15, 2009, 3:12:24 PM (15 years ago)
- Location:
- CMT/HEAD
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
CMT/HEAD/ChangeLog
r514 r515 1 2009-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 1 23 2009-07-01 <rybkin@lal.in2p3.fr> 403 2 24 -
CMT/HEAD/source/cmt_project.cxx
r501 r515 1 1 2 //----------------------------------------------------------- 2 3 // Copyright Christian Arnault LAL-Orsay CNRS … … 543 544 parent->update_strategies_from_children (); 544 545 } 545 else 546 else if ((name != "CMTUSERCONTEXT") && (name != "CMTHOME")) 547 // else 546 548 { 547 549 // this project has no parent thus it should become the top project. … … 552 554 { 553 555 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; 555 560 if (!p->has_parents ()) 556 561 { … … 908 913 909 914 Project::ProjectVector& Projects = Project::projects (); 910 int size = Projects.size ();915 const int size = Projects.size (); 911 916 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 912 942 for (int i = 0; i < size; i++) 913 943 { 914 944 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; 917 949 p.m_visits = 0; 918 950 } 919 951 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 920 968 Project* p = get_current (); 921 969 970 // cerr << "get_current: " << p << " offset: " << offset << endl; 922 971 if (p == 0) 923 972 { 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; 930 977 931 978 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++) 940 1004 { 941 1005 Project* p = &(Projects[i]); … … 943 1007 if (-1 == j) 944 1008 { 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 /* 945 1013 if (CmtMessage::active (Verbose)) 946 1014 CmtMessage::warning ("Not ordered project " + p->get_name () + … … 948 1016 " from " + p->get_cmtpath_source ()); 949 1017 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 } 952 1061 } 953 1062 … … 972 1081 void Project::show_all () 973 1082 { 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 /* 974 1101 static Project::ProjectVector& Projects = Project::projects (); 975 1102 … … 988 1115 p = &(Projects[0]); 989 1116 } 1117 */ 990 1118 991 1119 p->show (); … … 1080 1208 else if (arguments.size () == 1 && cmt_string (arguments[0]) == "-d") 1081 1209 { 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 /* 1082 1225 VisitorForShowPaths visitor; 1083 1226 start_visit (visitor); 1227 */ 1084 1228 } 1085 1229 else … … 1098 1242 void Project::fill_selection (int depth, CmtSystem::cmt_string_vector& path_selections) 1099 1243 { 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 /* 1100 1254 static ProjectVector& Projects = projects (); 1101 1255 … … 1108 1262 const cmt_string& p_real = project.get_cmtpath_real (); 1109 1263 const cmt_string& src = project.get_cmtpath_source (); 1110 1264 */ 1111 1265 if (src != "default path") 1112 1266 { … … 1329 1483 * then the direct dependencies of the of the first dependency, of the second 1330 1484 * dependency and so on. That is first left to right, then downwards. 1485 * @param offset the offset from which to use all the projects 1331 1486 * @param order the order of the last project visited 1332 1487 * @param projs vector of projects to visit and order 1333 1488 */ 1334 void Project::visit ( int& order, ProjectPtrVector& projs)1489 void Project::visit (const int offset, int& order, ProjectPtrVector& projs) 1335 1490 { 1336 1491 int size = projs.size (); 1337 1492 if (0 == size) return; 1338 1493 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 */ 1340 1503 ProjectPtrVector children; 1341 1504 for (int j = 0; j < size; j++) 1342 1505 { 1343 1506 Project* p = projs[j]; 1507 p->m_visits++; 1344 1508 // 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) 1346 1511 continue; 1347 1512 for (int i = 0; i < p->get_children_size (); i++) … … 1349 1514 Project* child = p->get_child (i); 1350 1515 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++) 1356 1540 { 1357 1541 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)) 1361 1548 q.m_order--; 1362 1549 } 1363 1550 } 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); 1370 1570 } 1371 1571 … … 2025 2225 void Project::show () 2026 2226 { 2227 if (m_visited) return; 2228 m_visited = true; 2229 2027 2230 static int level = 0; 2028 2231 … … 2066 2269 cout << endl; 2067 2270 2271 /* 2068 2272 if (m_visited) return; 2069 2273 2070 2274 m_visited = true; 2275 */ 2071 2276 2072 2277 for (i = 0; i < m_children.size (); i++) -
CMT/HEAD/source/cmt_project.h
r482 r515 193 193 void visit (IProjectVisitor& visitor); 194 194 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); 196 196 197 197 // Use -
CMT/HEAD/source/cmt_system.cxx
r497 r515 1407 1407 1408 1408 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 } 1409 1414 } 1410 1415 } … … 1498 1503 CMTPathManager::reset (); 1499 1504 1505 CMTPathManager::add_cmt_path (cmt_user_context, "CMTUSERCONTEXT", factory); 1506 CMTPathManager::add_cmt_path (cmt_home, "CMTHOME", factory); 1507 /* 1500 1508 if (init_text != "") 1501 1509 { 1502 1510 add_cmt_paths_from_text (init_text, "initialization", factory); 1503 1511 } 1512 */ 1504 1513 1505 1514 #ifdef WIN32 … … 1603 1612 add_cmt_paths_from_file (rc_name, factory); 1604 1613 1614 /* 1605 1615 CMTPathManager::add_cmt_path (cmt_user_context, "CMTUSERCONTEXT", factory); 1606 1616 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 } 1607 1622 } 1608 1623 -
CMT/HEAD/source/cmt_use.cxx
r461 r515 2943 2943 bool Use::get_strategy (const cmt_string& name) const 2944 2944 { 2945 Project* p = Project::find_by_cmtpath (real_path);2945 const Project* p = Project::find_by_cmtpath (Project::find_in_cmt_paths (real_path)); 2946 2946 2947 2947 bool strategy; … … 2949 2949 if (p == 0) 2950 2950 { 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); 2954 2956 else 2955 2957 { 2956 p = &(projects[0]); 2958 p = Ordered[0]; 2959 //p = &(projects[0]); 2957 2960 strategy = p->get_strategy (name); 2958 2961 }
Note: See TracChangeset
for help on using the changeset viewer.