コード例 #1
0
ファイル: cpv_expand.py プロジェクト: skyter10086/portage
def cpv_expand(mycpv, mydb=None, use_cache=1, settings=None):
	"""Given a string (packagename or virtual) expand it into a valid
	cat/package string. Virtuals use the mydb to determine which provided
	virtual is a valid choice and defaults to the first element when there
	are no installed/available candidates."""
	myslash=mycpv.split("/")
	mysplit = _pkgsplit(myslash[-1])
	if settings is None:
		try:
			settings = mydb.settings
		except AttributeError:
			settings = portage.settings
	if len(myslash)>2:
		# this is illegal case.
		mysplit=[]
		mykey=mycpv
	elif len(myslash)==2:
		if mysplit:
			mykey=myslash[0]+"/"+mysplit[0]
		else:
			mykey=mycpv

		# Since Gentoo stopped using old-style virtuals in
		# 2011, typically it's possible to avoid getvirtuals()
		# calls entirely. Therefore, only call getvirtuals()
		# if the atom category is "virtual" and cp_list()
		# returns nothing.
		if mykey.startswith("virtual/") and \
			hasattr(mydb, "cp_list") and \
			not mydb.cp_list(mykey, use_cache=use_cache):
				if hasattr(mydb, "vartree"):
					settings._populate_treeVirtuals_if_needed(mydb.vartree)
				virts = settings.getvirtuals().get(mykey)
				if virts:
					mykey_orig = mykey
					for vkey in virts:
						# The virtuals file can contain a versioned atom, so
						# it may be necessary to remove the operator and
						# version from the atom before it is passed into
						# dbapi.cp_list().
						if mydb.cp_list(vkey.cp):
							mykey = str(vkey)
							break
					if mykey == mykey_orig:
						mykey = str(virts[0])
			#we only perform virtual expansion if we are passed a dbapi
	else:
		#specific cpv, no category, ie. "foo-1.0"
		if mysplit:
			myp=mysplit[0]
		else:
			# "foo" ?
			myp=mycpv
		mykey=None
		matches=[]
		if mydb and hasattr(mydb, "categories"):
			for x in mydb.categories:
				if mydb.cp_list(x+"/"+myp,use_cache=use_cache):
					matches.append(x+"/"+myp)
		if len(matches) > 1:
			virtual_name_collision = False
			if len(matches) > 1:
				for x in matches:
					if not x.startswith(("acct-group/", "acct-user/", "virtual/")):
						# Assume that the non-virtual is desired.  This helps
						# avoid the ValueError for invalid deps that come from
						# installed packages (during reverse blocker detection,
						# for example).
						mykey = x
					else:
						virtual_name_collision = True
			if not virtual_name_collision:
				# AmbiguousPackageName inherits from ValueError,
				# for backward compatibility with calling code
				# that already handles ValueError.
				raise AmbiguousPackageName(matches)
		elif matches:
			mykey=matches[0]

		if not mykey and not isinstance(mydb, list):
			if hasattr(mydb, "vartree"):
				settings._populate_treeVirtuals_if_needed(mydb.vartree)
			virts_p = settings.get_virts_p().get(myp)
			if virts_p:
				mykey = virts_p[0]
			#again, we only perform virtual expansion if we have a dbapi (not a list)
		if not mykey:
			mykey="null/"+myp
	if mysplit:
		if mysplit[2]=="r0":
			return mykey+"-"+mysplit[1]
		else:
			return mykey+"-"+mysplit[1]+"-"+mysplit[2]
	else:
		return mykey
コード例 #2
0
def cpv_expand(mycpv, mydb=None, use_cache=1, settings=None):
    """Given a string (packagename or virtual) expand it into a valid
	cat/package string. Virtuals use the mydb to determine which provided
	virtual is a valid choice and defaults to the first element when there
	are no installed/available candidates."""
    myslash = mycpv.split("/")
    mysplit = _pkgsplit(myslash[-1])
    if settings is None:
        settings = globals()["settings"]
    virts = settings.getvirtuals()
    virts_p = settings.get_virts_p()
    if len(myslash) > 2:
        # this is illegal case.
        mysplit = []
        mykey = mycpv
    elif len(myslash) == 2:
        if mysplit:
            mykey = myslash[0] + "/" + mysplit[0]
        else:
            mykey = mycpv
        if mydb and virts and mykey in virts:
            writemsg("mydb.__class__: %s\n" % (mydb.__class__), 1)
            if hasattr(mydb, "cp_list"):
                if not mydb.cp_list(mykey, use_cache=use_cache):
                    writemsg("virts[%s]: %s\n" % (str(mykey), virts[mykey]), 1)
                    mykey_orig = mykey[:]
                    for vkey in virts[mykey]:
                        # The virtuals file can contain a versioned atom, so
                        # it may be necessary to remove the operator and
                        # version from the atom before it is passed into
                        # dbapi.cp_list().
                        if mydb.cp_list(vkey.cp):
                            mykey = str(vkey)
                            writemsg(_("virts chosen: %s\n") % (mykey), 1)
                            break
                    if mykey == mykey_orig:
                        mykey = str(virts[mykey][0])
                        writemsg(_("virts defaulted: %s\n") % (mykey), 1)
            #we only perform virtual expansion if we are passed a dbapi
    else:
        #specific cpv, no category, ie. "foo-1.0"
        if mysplit:
            myp = mysplit[0]
        else:
            # "foo" ?
            myp = mycpv
        mykey = None
        matches = []
        if mydb and hasattr(mydb, "categories"):
            for x in mydb.categories:
                if mydb.cp_list(x + "/" + myp, use_cache=use_cache):
                    matches.append(x + "/" + myp)
        if len(matches) > 1:
            virtual_name_collision = False
            if len(matches) == 2:
                for x in matches:
                    if not x.startswith("virtual/"):
                        # Assume that the non-virtual is desired.  This helps
                        # avoid the ValueError for invalid deps that come from
                        # installed packages (during reverse blocker detection,
                        # for example).
                        mykey = x
                    else:
                        virtual_name_collision = True
            if not virtual_name_collision:
                # AmbiguousPackageName inherits from ValueError,
                # for backward compatibility with calling code
                # that already handles ValueError.
                raise AmbiguousPackageName(matches)
        elif matches:
            mykey = matches[0]

        if not mykey and not isinstance(mydb, list):
            if myp in virts_p:
                mykey = virts_p[myp][0]
            #again, we only perform virtual expansion if we have a dbapi (not a list)
        if not mykey:
            mykey = "null/" + myp
    if mysplit:
        if mysplit[2] == "r0":
            return mykey + "-" + mysplit[1]
        else:
            return mykey + "-" + mysplit[1] + "-" + mysplit[2]
    else:
        return mykey