Ejemplo n.º 1
0
bool deps_resolver_t::try_roll_forward(const deps_entry_t& entry,
    const pal::string_t& probe_dir,
    bool patch_roll_fwd,
    bool prerelease_roll_fwd,
    pal::string_t* candidate)
{
    trace::verbose(_X("Attempting a roll forward for [%s/%s/%s] in [%s]"), entry.library_name.c_str(), entry.library_version.c_str(), entry.relative_path.c_str(), probe_dir.c_str());

    const pal::string_t& lib_ver = entry.library_version;

    fx_ver_t cur_ver(-1, -1, -1);
    if (!fx_ver_t::parse(lib_ver, &cur_ver, false))
    {
        trace::verbose(_X("No roll forward as specified version [%s] could not be parsed"), lib_ver.c_str());
        return false;
    }
    pal::string_t path = probe_dir;
    append_path(&path, entry.library_name.c_str());
    pal::string_t max_str = lib_ver;
    if (cur_ver.is_prerelease() && prerelease_roll_fwd)
    {
        pal::string_t maj_min_pat_star = cur_ver.prerelease_glob();

        pal::string_t cache_key = path;
        append_path(&cache_key, maj_min_pat_star.c_str());

        if (m_prerelease_roll_forward_cache.count(cache_key))
        {
            max_str = m_prerelease_roll_forward_cache[cache_key];
            trace::verbose(_X("Found cached roll forward version [%s] -> [%s]"), lib_ver.c_str(), max_str.c_str());
        }
        else
        {
            try_prerelease_roll_forward_in_dir(path, cur_ver, &max_str);
            m_prerelease_roll_forward_cache[cache_key] = max_str;
        }
    }
    if (!cur_ver.is_prerelease() && patch_roll_fwd)
    {
        // Extract glob string of the form: 1.0.* from the version 1.0.0-prerelease-00001.
        pal::string_t maj_min_star = cur_ver.patch_glob();

        pal::string_t cache_key = path;
        append_path(&cache_key, maj_min_star.c_str());

        if (m_patch_roll_forward_cache.count(cache_key))
        {
            max_str = m_patch_roll_forward_cache[cache_key];
            trace::verbose(_X("Found cached roll forward version [%s] -> [%s]"), lib_ver.c_str(), max_str.c_str());
        }
        else
        {
            try_patch_roll_forward_in_dir(path, cur_ver, &max_str);
            m_patch_roll_forward_cache[cache_key] = max_str;
        }
    }
    append_path(&path, max_str.c_str());

    return entry.to_rel_path(path, candidate);
}
Ejemplo n.º 2
0
map<tstring,tstring>	 CVersionInfo::GetUpdateList(vector<tstring>& m_services)
{
	map<tstring,tstring> updatelist;
	//check the remote version file in update folder

	file<> fdoc(m_update_ver_path.c_str());

	//TiXmlDocument ver;

	//TiXmlDocument remote_ver;
	if (fdoc.size() > 0)
	{
		//TiXmlNode* root = remote_ver.RootElement();
		//TiXmlElement* pver_elem = root->FirstChildElement();
		xml_document<> xdoc;
		xdoc.parse<0>(fdoc.data());
		xml_node<>* pver_elem = xdoc.first_node();
		while (pver_elem)
		{
			//get ver id which > cur version
			//tstring cur_ver_str = pver_elem->Attribute("no");
			tstring cur_ver_str = pver_elem->first_attribute("no")->value();
			DWORD marj,subj,ssubj,sssubj;
			marj=subj=ssubj=sssubj=0;
			sscanf(cur_ver_str.c_str(),"%d.%d.%d.%d",&marj,&subj,&ssubj,&sssubj);
			CVersion cur_ver(marj,subj,ssubj,sssubj);

			if(cur_ver > m_local)
			{
				//TiXmlElement* pitem = pver_elem->FirstChildElement();
				xml_node<>* pitem = pver_elem->first_node();
				while (pitem)
				{
					tstring filepath = pitem->first_attribute("path")->value();
					tstring filename = pitem->first_attribute("name")->value();
					//res.push_back(filepath);
					updatelist[filename] = filepath;
					const char* pservice = pitem->first_attribute("service")->value();
					if(pservice)
					{
						m_services.push_back(filename);
					}
					pitem = pitem->next_sibling();
				}
				
			}
			pver_elem = pver_elem->next_sibling();
		}
	}
	return updatelist;
}