Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 184983
Collapse All | Expand All

(-)bin/emerge (-16 / +48 lines)
Lines 1083-1088 Link Here
1083
		self.pkg_node_map = {}
1083
		self.pkg_node_map = {}
1084
		# Maps slot atom to digraph node for all nodes added to the graph.
1084
		# Maps slot atom to digraph node for all nodes added to the graph.
1085
		self._slot_node_map = {}
1085
		self._slot_node_map = {}
1086
		# Maps nodes to the reasons they were selected for reinstallation.
1087
		self._reinstall_nodes = {}
1086
		self.mydbapi = {}
1088
		self.mydbapi = {}
1087
		self._mydbapi_keys = ["SLOT", "DEPEND", "RDEPEND", "PDEPEND",
1089
		self._mydbapi_keys = ["SLOT", "DEPEND", "RDEPEND", "PDEPEND",
1088
			"USE", "IUSE", "PROVIDE", "RESTRICT"]
1090
			"USE", "IUSE", "PROVIDE", "RESTRICT"]
Lines 1204-1221 Link Here
1204
1206
1205
	def _reinstall_for_flags(self, forced_flags,
1207
	def _reinstall_for_flags(self, forced_flags,
1206
		orig_use, orig_iuse, cur_use, cur_iuse):
1208
		orig_use, orig_iuse, cur_use, cur_iuse):
1209
		"""Return a set of flags that trigger reinstallation, or None if there
1210
		are no such flags."""
1207
		if "--newuse" in self.myopts:
1211
		if "--newuse" in self.myopts:
1208
			if orig_iuse.symmetric_difference(
1212
			flags = orig_iuse.symmetric_difference(
1209
				cur_iuse).difference(forced_flags):
1213
				cur_iuse).difference(forced_flags)
1210
				return True
1214
			if flags:
1211
			elif orig_iuse.intersection(orig_use) != \
1215
				return flags
1212
				cur_iuse.intersection(cur_use):
1216
			flags = orig_iuse.intersection(orig_use).symmetric_difference(
1213
				return True
1217
				cur_iuse.intersection(cur_use))
1218
			if flags:
1219
				return flags
1214
		elif "changed-use" == self.myopts.get("--reinstall"):
1220
		elif "changed-use" == self.myopts.get("--reinstall"):
1215
			if orig_iuse.intersection(orig_use) != \
1221
			flags = orig_iuse.intersection(orig_use).symmetric_difference(
1216
				cur_iuse.intersection(cur_use):
1222
				cur_iuse.intersection(cur_use))
1217
				return True
1223
			if flags:
1218
		return False
1224
				return flags
1225
		return None
1219
1226
1220
	def create(self, mybigkey, myparent=None, addme=1, myuse=None,
1227
	def create(self, mybigkey, myparent=None, addme=1, myuse=None,
1221
		priority=DepPriority(), rev_dep=False, arg=None):
1228
		priority=DepPriority(), rev_dep=False, arg=None):
Lines 1286-1291 Link Here
1286
					return 0
1293
					return 0
1287
				del e
1294
				del e
1288
1295
1296
		reinstall_for_flags = None
1289
		merging=1
1297
		merging=1
1290
		if mytype == "installed":
1298
		if mytype == "installed":
1291
			merging = 0
1299
			merging = 0
Lines 1299-1304 Link Here
1299
			    If the package has new iuse flags or different use flags then if
1307
			    If the package has new iuse flags or different use flags then if
1300
			    --newuse is specified, we need to merge the package. """
1308
			    --newuse is specified, we need to merge the package. """
1301
			if merging == 0 and \
1309
			if merging == 0 and \
1310
				myroot == self.target_root and \
1302
				("--newuse" in self.myopts or
1311
				("--newuse" in self.myopts or
1303
				"--reinstall" in self.myopts) and \
1312
				"--reinstall" in self.myopts) and \
1304
				vardbapi.cpv_exists(mykey):
1313
				vardbapi.cpv_exists(mykey):
Lines 1310-1317 Link Here
1310
				iuses = set(filter_iuse_defaults(metadata["IUSE"].split()))
1319
				iuses = set(filter_iuse_defaults(metadata["IUSE"].split()))
1311
				old_iuse = set(filter_iuse_defaults(
1320
				old_iuse = set(filter_iuse_defaults(
1312
					vardbapi.aux_get(mykey, ["IUSE"])[0].split()))
1321
					vardbapi.aux_get(mykey, ["IUSE"])[0].split()))
1313
				if self._reinstall_for_flags(
1322
				reinstall_for_flags = self._reinstall_for_flags(
1314
					forced_flags, old_use, old_iuse, myuse, iuses):
1323
					forced_flags, old_use, old_iuse, myuse, iuses)
1324
				if reinstall_for_flags:
1315
					merging = 1
1325
					merging = 1
1316
1326
1317
		if addme and merging == 1:
1327
		if addme and merging == 1:
Lines 1379-1384 Link Here
1379
				self._slot_node_map[myroot][slot_atom] = jbigkey
1389
				self._slot_node_map[myroot][slot_atom] = jbigkey
1380
				self.pkg_node_map[myroot][mykey] = jbigkey
1390
				self.pkg_node_map[myroot][mykey] = jbigkey
1381
				self.useFlags[myroot][mykey] = myuse
1391
				self.useFlags[myroot][mykey] = myuse
1392
				if reinstall_for_flags:
1393
					self._reinstall_nodes[jbigkey] = reinstall_for_flags
1382
1394
1383
			if rev_dep and myparent:
1395
			if rev_dep and myparent:
1384
				self.digraph.addnode(myparent, jbigkey,
1396
				self.digraph.addnode(myparent, jbigkey,
Lines 2874-2880 Link Here
2874
					use_expand_hidden = \
2886
					use_expand_hidden = \
2875
						pkgsettings["USE_EXPAND_HIDDEN"].lower().split()
2887
						pkgsettings["USE_EXPAND_HIDDEN"].lower().split()
2876
2888
2877
					def map_to_use_expand(myvals, forcedFlags=False):
2889
					def map_to_use_expand(myvals, forcedFlags=False,
2890
						removeHidden=True):
2878
						ret = {}
2891
						ret = {}
2879
						forced = {}
2892
						forced = {}
2880
						for exp in use_expand:
2893
						for exp in use_expand:
Lines 2889-2901 Link Here
2889
						ret["USE"] = myvals
2902
						ret["USE"] = myvals
2890
						forced["USE"] = [val for val in myvals \
2903
						forced["USE"] = [val for val in myvals \
2891
							if val in forced_flags]
2904
							if val in forced_flags]
2892
						for exp in use_expand_hidden:
2905
						if removeHidden:
2893
							if exp in ret:
2906
							for exp in use_expand_hidden:
2894
								del ret[exp]
2907
								ret.pop(exp, None)
2895
						if forcedFlags:
2908
						if forcedFlags:
2896
							return ret, forced
2909
							return ret, forced
2897
						return ret
2910
						return ret
2898
2911
2912
					# Prevent USE_EXPAND_HIDDEN flags from being hidden if they
2913
					# are the only thing that triggered reinstallation.
2914
					reinst_flags_map = None
2915
					reinstall_for_flags = self._reinstall_nodes.get(pkg_node)
2916
					if reinstall_for_flags:
2917
						reinst_flags_map = map_to_use_expand(
2918
							list(reinstall_for_flags), removeHidden=False)
2919
						if reinst_flags_map["USE"]:
2920
							reinst_flags_map = None
2921
						else:
2922
							for k in reinst_flags_map.keys():
2923
								if not reinst_flags_map[k]:
2924
									del reinst_flags_map[k]
2925
					if reinst_flags_map and \
2926
						not set(reinst_flags_map).difference(
2927
						use_expand_hidden):
2928
						use_expand_hidden = set(use_expand_hidden).difference(
2929
							reinst_flags_map)
2930
2899
					cur_iuse_map, iuse_forced = \
2931
					cur_iuse_map, iuse_forced = \
2900
						map_to_use_expand(cur_iuse, forcedFlags=True)
2932
						map_to_use_expand(cur_iuse, forcedFlags=True)
2901
					cur_use_map = map_to_use_expand(cur_use)
2933
					cur_use_map = map_to_use_expand(cur_use)

Return to bug 184983