Changeset 566 for CMT/HEAD


Ignore:
Timestamp:
Apr 15, 2011, 5:01:46 PM (13 years ago)
Author:
rybkin
Message:

See C.L. 449

Location:
CMT/HEAD
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • CMT/HEAD/ChangeLog

    r565 r566  
     12011-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       
    1122011-04-12    <rybkin@lal.in2p3.fr> 448
    213
  • CMT/HEAD/source/cmt_use.cxx

    r564 r566  
    939939      {
    940940        cout << "about to add " << package << endl;
    941         show_packages ();
     941        //show_packages ();
    942942      }
    943943
     
    954954                     << "> auto_imports=" << new_use->auto_imports << endl;
    955955
    956                 show_packages ();
     956                //show_packages ();
    957957              }
    958958            /*
     
    12201220}
    12211221
     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//----------------------------------------------------------
     1229Use* 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//----------------------------------------------------------
    12221251void Use::set_auto_imports_state (const Use::UsePtrVector& uses,
    12231252                                  cmt_vector<bool>& auto_imports_states,
     
    12541283      for (int i = 0; i < use->sub_uses.size (); i++)
    12551284        {
    1256           if (use->sub_uses[i]->m_index >= 0)
     1285          if (use->sub_uses[i]->m_index >= 0 && !use->sub_uses[i]->discarded)
    12571286            {
    12581287              if (use->sub_use_auto_imports[i] != Off)
     
    12671296          else
    12681297            {
    1269               visited.add (use->sub_uses[i], yes);
    12701298              if (Cmt::get_debug ())
    12711299                {
    12721300                  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);
    12751329                }
    12761330            }
     
    18981952              break;
    18991953            case IncompatibleMajorIds:
    1900               return (0);
     1954              if (!is_head_version (v))
     1955                return (0);
     1956              break;
    19011957            }
    19021958          version = v;
     
    20022058                    This check is not sufficient !! We need to check in addition
    20032059                    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)
    20052061                  */
    20062062
     
    20092065                  req = name;
    20102066                  req += CmtSystem::file_separator ();
    2011                   req += "mgr";
     2067                  req += "cmt";
    20122068                  req += CmtSystem::file_separator ();
    20132069                  req += "requirements";
     
    20172073                      req = name;
    20182074                      req += CmtSystem::file_separator ();
    2019                       req += "cmt";
     2075                      req += "mgr";
    20202076                      req += CmtSystem::file_separator ();
    20212077                      req += "requirements";
     
    20282084                  cmt_string& new_p = alternate_paths.add ();
    20292085                  new_p = from_path;
     2086                  bool& new_i = alternate_is_head_versions.add ();
     2087                  new_i = is_head_version (name);
    20302088
    20312089                  found = true;
     
    20672125
    20682126  // 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"))
    20832128    {
    20842129      CmtSystem::cd ("cmt");
    20852130      style = cmt_style;
    20862131      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);
    20872142    }
    20882143
     
    22812336      else
    22822337        {
     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
    22832357          CmtSystem::is_version_directory (name, v, r, p);
    22842358
     
    29082982          // thus we have to choose
    29092983          //
    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            }
    29123024
    29133025          if (Cmt::get_debug ())
    29143026            {
    2915               cout << "after 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
    29173029                   << " => selected=" << selected_use
    29183030                   << endl;
     
    30513163            {
    30523164              cout << "add> registering completed" << endl;
    3053               show_packages ();
     3165              //show_packages ();
    30543166            }
    30553167        }
     
    38263938}
    38273939
     3940//----------------------------------------------------------
    38283941void Use::set_auto_imports (State context_state, State specified_state,
    38293942                            cmt_map <Use*, bool>& visited)
     
    39064019      else
    39074020        {
    3908           visited.add (sub_uses[i], yes);
    39094021          if (Cmt::get_debug ())
    39104022            {
    39114023              char num[32]; sprintf (num, "%#x", sub_uses[i]);
     4024              char index[32]; sprintf (index, "%d", sub_uses[i]->m_index);
    39124025              s += "[";
    39134026              s += num;
    39144027              s += ", discarded=";
    39154028              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);
    39174053            }
    39184054        }
     
    39834119}
    39844120*/
     4121
     4122//----------------------------------------------------------
    39854123void Use::set_native_version (bool state)
    39864124{
     
    51275265  //  return get_package_name () + " " + version + (path != "" ? " " + path : "") ;
    51285266}
     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//----------------------------------------------------------
     5275bool 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  
    3232                         const cmt_string& version,
    3333                         const cmt_string& path);
     34  static Use* find_valid (const cmt_string& package);
    3435  //static void set_auto_imports_state (int use_index,
    3536  //cmt_vector<bool>& auto_imports_states);
     
    147148  Project* get_project ();
    148149  cmt_string get_info () const;
     150  bool is_head_version (const cmt_string& version);
    149151// Public attributes
    150152public:
     
    228230  CmtSystem::cmt_string_vector alternate_versions;
    229231  CmtSystem::cmt_string_vector alternate_paths;
     232  cmt_vector<bool> alternate_is_head_versions;
    230233
    231234  CmtSystem::cmt_string_vector requests;
    232235
    233  
     236  cmt_regexp m_head_version;
    234237
    235238  friend class UseProjectAction;
Note: See TracChangeset for help on using the changeset viewer.