- Timestamp:
- Apr 15, 2011, 5:01:46 PM (13 years ago)
- Location:
- CMT/HEAD
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
CMT/HEAD/ChangeLog
r565 r566 1 2011-04-15 <rybkin@lal.in2p3.fr> 449 2 3 * source/cmt_use.h: In class Use, introduce functions find_valid, 4 is_head_version, members m_head_version, alternate_is_head_versions 5 * source/cmt_use.cxx: Implement functions find_valid, is_head_version. 6 Make use of find_valid in functions set_auto_imports_state, 7 set_auto_imports to ensure valid uses are followed. Make use of 8 is_head_version, in functions reach_package, add, of 9 alternate_is_head_versions, in function select_alternate to ensure 10 head version satisfies any request and takes priority 11 1 12 2011-04-12 <rybkin@lal.in2p3.fr> 448 2 13 -
CMT/HEAD/source/cmt_use.cxx
r564 r566 939 939 { 940 940 cout << "about to add " << package << endl; 941 show_packages ();941 //show_packages (); 942 942 } 943 943 … … 954 954 << "> auto_imports=" << new_use->auto_imports << endl; 955 955 956 show_packages ();956 //show_packages (); 957 957 } 958 958 /* … … 1220 1220 } 1221 1221 1222 //---------------------------------------------------------- 1223 /** 1224 * Find by @package@ Use-object that is 1225 * o not discarded 1226 * o in ordereded Uses list (i.e., has non-negative m_index) 1227 */ 1228 //---------------------------------------------------------- 1229 Use* Use::find_valid (const cmt_string& package) 1230 { 1231 Package* p = Package::find (package); 1232 if (p == 0) return (0); 1233 1234 UsePtrVector& uses = p->get_uses (); 1235 1236 for (int use_index = 0; use_index < uses.size (); use_index++) 1237 { 1238 Use* use = uses[use_index]; 1239 1240 if (use->discarded) continue; 1241 if (use->m_index < 0) continue; 1242 // take the first not discarded and ordered 1243 // there should not be more than one 1244 return use; 1245 } 1246 1247 return (0); 1248 } 1249 1250 //---------------------------------------------------------- 1222 1251 void Use::set_auto_imports_state (const Use::UsePtrVector& uses, 1223 1252 cmt_vector<bool>& auto_imports_states, … … 1254 1283 for (int i = 0; i < use->sub_uses.size (); i++) 1255 1284 { 1256 if (use->sub_uses[i]->m_index >= 0 )1285 if (use->sub_uses[i]->m_index >= 0 && !use->sub_uses[i]->discarded) 1257 1286 { 1258 1287 if (use->sub_use_auto_imports[i] != Off) … … 1267 1296 else 1268 1297 { 1269 visited.add (use->sub_uses[i], yes);1270 1298 if (Cmt::get_debug ()) 1271 1299 { 1272 1300 cout << "Use::set_auto_imports_state> " << use->get_package_name () 1273 << ": sub_use " << use->sub_uses[i]->get_package_name () << "[" 1274 << use->sub_uses[i] << "] invalid" << endl; 1301 << " -> sub_use " << use->sub_uses[i]->get_package_name () 1302 << "[" << use->sub_uses[i] << ", discarded=" 1303 << use->sub_uses[i]->discarded << ", m_index=" 1304 << use->sub_uses[i]->m_index << " : invalid]" << endl; 1305 } 1306 Use* au (find_valid (use->sub_uses[i]->get_package_name ())); 1307 if (au) 1308 { 1309 if (Cmt::get_debug ()) 1310 { 1311 cout << "Use::set_auto_imports_state> " << use->get_package_name () 1312 << " -> sub_use " << au->get_package_name () 1313 << "[" << au << ", discarded=" 1314 << au->discarded << ", m_index=" 1315 << au->m_index << " : valid]" << endl; 1316 } 1317 if (use->sub_use_auto_imports[i] != Off) 1318 { 1319 subuses.push_back (au); 1320 } 1321 else 1322 { 1323 visited.add (au, yes); 1324 } 1325 } 1326 else 1327 { 1328 visited.add (use->sub_uses[i], yes); 1275 1329 } 1276 1330 } … … 1898 1952 break; 1899 1953 case IncompatibleMajorIds: 1900 return (0); 1954 if (!is_head_version (v)) 1955 return (0); 1956 break; 1901 1957 } 1902 1958 version = v; … … 2002 2058 This check is not sufficient !! We need to check in addition 2003 2059 that the selected directory is really the start of a true CMT 2004 package (ie with either /mgr/requirements or /cmt/requirements below)2060 package (ie with either cmt/requirements or mgr/requirements below) 2005 2061 */ 2006 2062 … … 2009 2065 req = name; 2010 2066 req += CmtSystem::file_separator (); 2011 req += " mgr";2067 req += "cmt"; 2012 2068 req += CmtSystem::file_separator (); 2013 2069 req += "requirements"; … … 2017 2073 req = name; 2018 2074 req += CmtSystem::file_separator (); 2019 req += " cmt";2075 req += "mgr"; 2020 2076 req += CmtSystem::file_separator (); 2021 2077 req += "requirements"; … … 2028 2084 cmt_string& new_p = alternate_paths.add (); 2029 2085 new_p = from_path; 2086 bool& new_i = alternate_is_head_versions.add (); 2087 new_i = is_head_version (name); 2030 2088 2031 2089 found = true; … … 2067 2125 2068 2126 // Now we have met the exact specified version! 2069 if (!CmtSystem::test_file ("cmt/requirements")) 2070 { 2071 if (!CmtSystem::test_file ("mgr/requirements")) 2072 { 2073 return (0); 2074 } 2075 else 2076 { 2077 CmtSystem::cd ("mgr"); 2078 style = mgr_style; 2079 structuring_style = with_version_directory; 2080 } 2081 } 2082 else 2127 if (CmtSystem::test_file ("cmt/requirements")) 2083 2128 { 2084 2129 CmtSystem::cd ("cmt"); 2085 2130 style = cmt_style; 2086 2131 structuring_style = with_version_directory; 2132 } 2133 else if (CmtSystem::test_file ("mgr/requirements")) 2134 { 2135 CmtSystem::cd ("mgr"); 2136 style = mgr_style; 2137 structuring_style = with_version_directory; 2138 } 2139 else 2140 { 2141 return (0); 2087 2142 } 2088 2143 … … 2281 2336 else 2282 2337 { 2338 if (alternate_is_head_versions[selected_index] && 2339 alternate_is_head_versions[i]) 2340 { 2341 if (strcmp(name.c_str (), alternate_versions[selected_index].c_str ()) > 0) 2342 { 2343 selected_index = i; 2344 } 2345 continue; 2346 } 2347 else if (alternate_is_head_versions[selected_index]) 2348 { 2349 continue; 2350 } 2351 else if (alternate_is_head_versions[i]) 2352 { 2353 selected_index = i; 2354 continue; 2355 } 2356 2283 2357 CmtSystem::is_version_directory (name, v, r, p); 2284 2358 … … 2908 2982 // thus we have to choose 2909 2983 // 2910 static BestFitSelector selector; 2911 Use* selected_use = selector.operate (old_use, use); 2984 bool old_use_is_head_version (use->is_head_version (old_use->version)); 2985 bool use_is_head_version (use->is_head_version (use->version)); 2986 Use* selected_use (old_use); 2987 if (old_use_is_head_version && use_is_head_version) 2988 { 2989 if (strcmp(use->version.c_str (), old_use->version.c_str ()) > 0) 2990 { 2991 selected_use = use; 2992 if (Cmt::get_debug ()) 2993 { 2994 cout << "add> new head version " << use->version 2995 << " wins old head version " << old_use->version 2996 << endl; 2997 } 2998 } 2999 } 3000 else if (old_use_is_head_version) 3001 { 3002 } 3003 else if (use_is_head_version) 3004 { 3005 selected_use = use; 3006 if (Cmt::get_debug ()) 3007 { 3008 cout << "add> new head version " << use->version 3009 << " wins old version " << old_use->version 3010 << endl; 3011 } 3012 } 3013 else 3014 { 3015 static BestFitSelector selector; 3016 selected_use = selector.operate (old_use, use); 3017 if (Cmt::get_debug ()) 3018 { 3019 cout << "add> operate on old version " << old_use->version 3020 << " and new version " << use->version 3021 << endl; 3022 } 3023 } 2912 3024 2913 3025 if (Cmt::get_debug ()) 2914 3026 { 2915 cout << "a fter operate old=" << old_use << "(" << old_use->m_index << ")"2916 << " use=" << use << "(" << use->m_index << ")"3027 cout << "add> old=" << old_use << "i=" << old_use->m_index 3028 << " new=" << use << "i=" << use->m_index 2917 3029 << " => selected=" << selected_use 2918 3030 << endl; … … 3051 3163 { 3052 3164 cout << "add> registering completed" << endl; 3053 show_packages ();3165 //show_packages (); 3054 3166 } 3055 3167 } … … 3826 3938 } 3827 3939 3940 //---------------------------------------------------------- 3828 3941 void Use::set_auto_imports (State context_state, State specified_state, 3829 3942 cmt_map <Use*, bool>& visited) … … 3906 4019 else 3907 4020 { 3908 visited.add (sub_uses[i], yes);3909 4021 if (Cmt::get_debug ()) 3910 4022 { 3911 4023 char num[32]; sprintf (num, "%#x", sub_uses[i]); 4024 char index[32]; sprintf (index, "%d", sub_uses[i]->m_index); 3912 4025 s += "["; 3913 4026 s += num; 3914 4027 s += ", discarded="; 3915 4028 s += (sub_uses[i]->discarded ? "1" : "0"); 3916 s += "] invalid"; 4029 s += ", m_index="; 4030 s += index; 4031 s += " : invalid]"; 4032 } 4033 Use* au (find_valid (sub_uses[i]->get_package_name ())); 4034 if (au) 4035 { 4036 if (Cmt::get_debug ()) 4037 { 4038 char num[32]; sprintf (num, "%#x", au); 4039 char index[32]; sprintf (index, "%d", au->m_index); 4040 s += "["; 4041 s += num; 4042 s += ", discarded="; 4043 s += (au->discarded ? "1" : "0"); 4044 s += ", m_index="; 4045 s += index; 4046 s += " : valid]"; 4047 } 4048 au->set_auto_imports (context_state, state, visited); 4049 } 4050 else 4051 { 4052 visited.add (sub_uses[i], yes); 3917 4053 } 3918 4054 } … … 3983 4119 } 3984 4120 */ 4121 4122 //---------------------------------------------------------- 3985 4123 void Use::set_native_version (bool state) 3986 4124 { … … 5127 5265 // return get_package_name () + " " + version + (path != "" ? " " + path : "") ; 5128 5266 } 5267 5268 //---------------------------------------------------------- 5269 /** 5270 * Check whether @version@ 5271 * is head version as specified by CMTHEADVERSION symbol/environment variable 5272 * or equals HEAD|head 5273 */ 5274 //---------------------------------------------------------- 5275 bool Use::is_head_version (const cmt_string& version) 5276 { 5277 if (!m_head_version.is_valid ()) 5278 { 5279 cmt_string s (Symbol::get_env_value ("CMTHEADVERSION")); 5280 static const cmt_string package_template = "<package>"; 5281 s.replace_all (package_template, get_package_name ()); 5282 static const cmt_string PACKAGE_template = "<PACKAGE>"; 5283 s.replace_all (PACKAGE_template, prefix); 5284 static const cmt_string revision_template = "<revision>"; 5285 s.replace_all (revision_template.c_str (), "[0-9]*"); 5286 if (0 != s.size ()) 5287 { 5288 if ('^' != s[0]) s = "^" + s; 5289 if ('$' != s[s.size () - 1]) s = s + "$"; 5290 } 5291 else 5292 { 5293 s = "^(HEAD|head)$"; 5294 } 5295 m_head_version.set (s); 5296 if (!m_head_version.is_valid ()) 5297 { 5298 CmtMessage::warning 5299 (CmtError::get_error_name (CmtError::configuration_error) 5300 + ": CMTHEADVERSION regular expression invalid `" + s + "'"); 5301 } 5302 } 5303 5304 return m_head_version.match (version); 5305 } -
CMT/HEAD/source/cmt_use.h
r563 r566 32 32 const cmt_string& version, 33 33 const cmt_string& path); 34 static Use* find_valid (const cmt_string& package); 34 35 //static void set_auto_imports_state (int use_index, 35 36 //cmt_vector<bool>& auto_imports_states); … … 147 148 Project* get_project (); 148 149 cmt_string get_info () const; 150 bool is_head_version (const cmt_string& version); 149 151 // Public attributes 150 152 public: … … 228 230 CmtSystem::cmt_string_vector alternate_versions; 229 231 CmtSystem::cmt_string_vector alternate_paths; 232 cmt_vector<bool> alternate_is_head_versions; 230 233 231 234 CmtSystem::cmt_string_vector requests; 232 235 233 236 cmt_regexp m_head_version; 234 237 235 238 friend class UseProjectAction;
Note: See TracChangeset
for help on using the changeset viewer.