diff options
| author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-01-25 21:37:05 +0000 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-07-12 22:50:45 +0100 |
| commit | 95be16f428ae4cf4254da0b814a327459a983ef5 (patch) | |
| tree | ebfa5c64156aa776c5c1255bc9ad7dbac1079a58 /bitbake/lib/bb/data_smart.py | |
| parent | 7fc6f6c98d4479a8ae81e0961a7dd93d436e804e (diff) | |
| download | poky-95be16f428ae4cf4254da0b814a327459a983ef5.tar.gz | |
bitbake: data_smart: Move override handling to getVar
Compeltely remove the replaces functionality and move all overrides
handling to getVar time. We can move the cookie cache into a hidden
flag within the variables themselves.
This removes the need for any of the internal_finalize steps.
This obsolete the need for the _seen_overrides COW cache.
(Bitbake rev: 2a0b73110bede91777ada54d1d89b45fb6034b6c)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/data_smart.py')
| -rw-r--r-- | bitbake/lib/bb/data_smart.py | 131 |
1 files changed, 61 insertions, 70 deletions
diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index 884ca190a6..28ea2aef63 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py | |||
| @@ -296,24 +296,18 @@ class VariableHistory(object): | |||
| 296 | self.variables[var] = [] | 296 | self.variables[var] = [] |
| 297 | 297 | ||
| 298 | class DataSmart(MutableMapping): | 298 | class DataSmart(MutableMapping): |
| 299 | def __init__(self, seen = None): | 299 | def __init__(self): |
| 300 | self.dict = {} | 300 | self.dict = {} |
| 301 | 301 | ||
| 302 | if seen is None: | ||
| 303 | seen = COWDictBase.copy() | ||
| 304 | |||
| 305 | self.inchistory = IncludeHistory() | 302 | self.inchistory = IncludeHistory() |
| 306 | self.varhistory = VariableHistory(self) | 303 | self.varhistory = VariableHistory(self) |
| 307 | self._tracking = False | 304 | self._tracking = False |
| 308 | 305 | ||
| 309 | # cookie monster tribute | ||
| 310 | self._seen_overrides = seen | ||
| 311 | |||
| 312 | self.expand_cache = {} | 306 | self.expand_cache = {} |
| 313 | 307 | ||
| 308 | # cookie monster tribute | ||
| 314 | self.overrides = [] | 309 | self.overrides = [] |
| 315 | self.overridevars = set(["OVERRIDES", "FILE"]) | 310 | self.overridevars = set(["OVERRIDES", "FILE"]) |
| 316 | self.replaces = {} | ||
| 317 | 311 | ||
| 318 | def enableTracking(self): | 312 | def enableTracking(self): |
| 319 | self._tracking = True | 313 | self._tracking = True |
| @@ -363,49 +357,6 @@ class DataSmart(MutableMapping): | |||
| 363 | 357 | ||
| 364 | self.overrides = (self.getVar("OVERRIDES", True) or "").split(":") or [] | 358 | self.overrides = (self.getVar("OVERRIDES", True) or "").split(":") or [] |
| 365 | 359 | ||
| 366 | # | ||
| 367 | # Well let us see what breaks here. We used to iterate | ||
| 368 | # over each variable and apply the override and then | ||
| 369 | # do the line expanding. | ||
| 370 | # If we have bad luck - which we will have - the keys | ||
| 371 | # where in some order that is so important for this | ||
| 372 | # method which we don't have anymore. | ||
| 373 | # Anyway we will fix that and write test cases this | ||
| 374 | # time. | ||
| 375 | |||
| 376 | # | ||
| 377 | # First we apply all overrides | ||
| 378 | # Then we will handle _append and _prepend and store the _remove | ||
| 379 | # information for later. | ||
| 380 | # | ||
| 381 | |||
| 382 | self.replaces = {} | ||
| 383 | |||
| 384 | for o in self.overrides: | ||
| 385 | # calculate '_'+override | ||
| 386 | l = len(o) + 1 | ||
| 387 | |||
| 388 | # see if one should even try | ||
| 389 | if o not in self._seen_overrides: | ||
| 390 | continue | ||
| 391 | |||
| 392 | vars = self._seen_overrides[o].copy() | ||
| 393 | for var in vars: | ||
| 394 | name = var[:-l] | ||
| 395 | self.replaces[name] = var | ||
| 396 | |||
| 397 | def internal_finalize2(self, var, o): | ||
| 398 | """Performs final steps upon the datastore, including application of overrides""" | ||
| 399 | |||
| 400 | l = len(o) + 1 | ||
| 401 | name = var[:-l] | ||
| 402 | |||
| 403 | if name in self.replaces: | ||
| 404 | del self.replaces[name] | ||
| 405 | for o in self.overrides: | ||
| 406 | if o in self._seen_overrides and name + "_" + o in self._seen_overrides[o]: | ||
| 407 | self.replaces[name] = name + "_" + o | ||
| 408 | |||
| 409 | def initVar(self, var): | 360 | def initVar(self, var): |
| 410 | self.expand_cache = {} | 361 | self.expand_cache = {} |
| 411 | if not var in self.dict: | 362 | if not var in self.dict: |
| @@ -457,6 +408,11 @@ class DataSmart(MutableMapping): | |||
| 457 | # todo make sure keyword is not __doc__ or __module__ | 408 | # todo make sure keyword is not __doc__ or __module__ |
| 458 | # pay the cookie monster | 409 | # pay the cookie monster |
| 459 | 410 | ||
| 411 | # more cookies for the cookie monster | ||
| 412 | if '_' in var: | ||
| 413 | self._setvar_update_overrides(base, **loginfo) | ||
| 414 | |||
| 415 | |||
| 460 | if base in self.overridevars: | 416 | if base in self.overridevars: |
| 461 | self.overridevars.update(self.expandWithRefs(value, var).references) | 417 | self.overridevars.update(self.expandWithRefs(value, var).references) |
| 462 | self.internal_finalize(True) | 418 | self.internal_finalize(True) |
| @@ -469,16 +425,12 @@ class DataSmart(MutableMapping): | |||
| 469 | del self.dict[var]["_append"] | 425 | del self.dict[var]["_append"] |
| 470 | if "_prepend" in self.dict[var]: | 426 | if "_prepend" in self.dict[var]: |
| 471 | del self.dict[var]["_prepend"] | 427 | del self.dict[var]["_prepend"] |
| 472 | 428 | if "_overrides" in self.dict[var]: | |
| 473 | if var in self.replaces: | 429 | del self.dict[var]["_overrides"] |
| 474 | del self.replaces[var] | ||
| 475 | for o in self.overrides: | ||
| 476 | if o in self._seen_overrides and var + "_" + o in self._seen_overrides[o]: | ||
| 477 | self.delVar(var + "_" + o) | ||
| 478 | 430 | ||
| 479 | # more cookies for the cookie monster | 431 | # more cookies for the cookie monster |
| 480 | if '_' in var: | 432 | if '_' in var: |
| 481 | self._setvar_update_overrides(var) | 433 | self._setvar_update_overrides(var, **loginfo) |
| 482 | 434 | ||
| 483 | # setting var | 435 | # setting var |
| 484 | self.dict[var]["_content"] = value | 436 | self.dict[var]["_content"] = value |
| @@ -488,19 +440,29 @@ class DataSmart(MutableMapping): | |||
| 488 | self.overridevars.update(self.expandWithRefs(value, var).references) | 440 | self.overridevars.update(self.expandWithRefs(value, var).references) |
| 489 | self.internal_finalize(True) | 441 | self.internal_finalize(True) |
| 490 | 442 | ||
| 491 | def _setvar_update_overrides(self, var): | 443 | def _setvar_update_overrides(self, var, **loginfo): |
| 492 | # aka pay the cookie monster | 444 | # aka pay the cookie monster |
| 493 | override = var[var.rfind('_')+1:] | 445 | override = var[var.rfind('_')+1:] |
| 494 | shortvar = var[:var.rfind('_')] | 446 | shortvar = var[:var.rfind('_')] |
| 495 | while override: | 447 | while override: |
| 496 | if override not in self._seen_overrides: | 448 | l = self.getVarFlag(shortvar, "_overrides") or [] |
| 497 | self._seen_overrides[override] = set() | 449 | if [var, override] not in l: |
| 498 | self._seen_overrides[override].add( var ) | 450 | l.append([var, override]) |
| 499 | self.internal_finalize2(var, override) | 451 | self.setVarFlag(shortvar, "_overrides", l, ignore=True) |
| 452 | for event in self.varhistory.variable(var): | ||
| 453 | if 'flag' in loginfo and not loginfo['flag'].startswith("_"): | ||
| 454 | continue | ||
| 455 | loginfo = event.copy() | ||
| 456 | loginfo['variable'] = shortvar | ||
| 457 | loginfo['op'] = 'override[%s]:%s' % (override, loginfo['op']) | ||
| 458 | self.varhistory.record(**loginfo) | ||
| 459 | |||
| 500 | override = None | 460 | override = None |
| 501 | if "_" in shortvar: | 461 | if "_" in shortvar: |
| 502 | override = var[shortvar.rfind('_')+1:] | 462 | override = var[shortvar.rfind('_')+1:] |
| 503 | shortvar = var[:shortvar.rfind('_')] | 463 | shortvar = var[:shortvar.rfind('_')] |
| 464 | if len(shortvar) == 0: | ||
| 465 | override = None | ||
| 504 | 466 | ||
| 505 | def getVar(self, var, expand=False, noweakdefault=False): | 467 | def getVar(self, var, expand=False, noweakdefault=False): |
| 506 | return self.getVarFlag(var, "_content", expand, noweakdefault) | 468 | return self.getVarFlag(var, "_content", expand, noweakdefault) |
| @@ -526,6 +488,9 @@ class DataSmart(MutableMapping): | |||
| 526 | dest.extend(src) | 488 | dest.extend(src) |
| 527 | self.setVarFlag(newkey, i, dest, ignore=True) | 489 | self.setVarFlag(newkey, i, dest, ignore=True) |
| 528 | 490 | ||
| 491 | if '_' in newkey and val is None: | ||
| 492 | self._setvar_update_overrides(newkey, **loginfo) | ||
| 493 | |||
| 529 | loginfo['variable'] = key | 494 | loginfo['variable'] = key |
| 530 | loginfo['op'] = 'rename (to)' | 495 | loginfo['op'] = 'rename (to)' |
| 531 | loginfo['detail'] = newkey | 496 | loginfo['detail'] = newkey |
| @@ -552,9 +517,13 @@ class DataSmart(MutableMapping): | |||
| 552 | self.dict[var] = {} | 517 | self.dict[var] = {} |
| 553 | if '_' in var: | 518 | if '_' in var: |
| 554 | override = var[var.rfind('_')+1:] | 519 | override = var[var.rfind('_')+1:] |
| 555 | if override and override in self._seen_overrides and var in self._seen_overrides[override]: | 520 | shortvar = var[:var.rfind('_')] |
| 556 | self._seen_overrides[override].remove(var) | 521 | l = self.getVarFlag(shortvar, "_overrides") or [] |
| 557 | self.internal_finalize2(var, override) | 522 | try: |
| 523 | l.remove([var, override]) | ||
| 524 | except ValueError as e: | ||
| 525 | pass | ||
| 526 | self.setVarFlag(shortvar, "_overrides", l, ignore=True) | ||
| 558 | 527 | ||
| 559 | def setVarFlag(self, var, flag, value, **loginfo): | 528 | def setVarFlag(self, var, flag, value, **loginfo): |
| 560 | self.expand_cache = {} | 529 | self.expand_cache = {} |
| @@ -567,7 +536,7 @@ class DataSmart(MutableMapping): | |||
| 567 | self.dict[var][flag] = value | 536 | self.dict[var][flag] = value |
| 568 | 537 | ||
| 569 | if flag == "_defaultval" and '_' in var: | 538 | if flag == "_defaultval" and '_' in var: |
| 570 | self._setvar_update_overrides(var) | 539 | self._setvar_update_overrides(var, **loginfo) |
| 571 | 540 | ||
| 572 | if flag == "unexport" or flag == "export": | 541 | if flag == "unexport" or flag == "export": |
| 573 | if not "__exportlist" in self.dict: | 542 | if not "__exportlist" in self.dict: |
| @@ -580,8 +549,30 @@ class DataSmart(MutableMapping): | |||
| 580 | local_var = self._findVar(var) | 549 | local_var = self._findVar(var) |
| 581 | value = None | 550 | value = None |
| 582 | 551 | ||
| 583 | if flag == "_content" and var in self.replaces: | 552 | if flag == "_content" and local_var is not None and "_overrides" in local_var: |
| 584 | value = self.getVar(self.replaces[var]) | 553 | match = False |
| 554 | active = {} | ||
| 555 | for (r, o) in local_var["_overrides"]: | ||
| 556 | # What about double overrides both with "_" in the name? | ||
| 557 | if o in self.overrides: | ||
| 558 | active[o] = r | ||
| 559 | elif set(o.split("_")).issubset(set(self.overrides)): | ||
| 560 | active[o] = r | ||
| 561 | mod = True | ||
| 562 | while mod: | ||
| 563 | mod = False | ||
| 564 | for o in self.overrides: | ||
| 565 | for a in active.copy(): | ||
| 566 | if a.endswith("_" + o): | ||
| 567 | t = active[a] | ||
| 568 | del active[a] | ||
| 569 | active[a.replace("_" + o, "")] = t | ||
| 570 | mod = True | ||
| 571 | elif a == o: | ||
| 572 | match = active[a] | ||
| 573 | del active[a] | ||
| 574 | if match: | ||
| 575 | value = self.getVar(match) | ||
| 585 | 576 | ||
| 586 | if local_var is not None and value is None: | 577 | if local_var is not None and value is None: |
| 587 | if flag in local_var: | 578 | if flag in local_var: |
| @@ -726,7 +717,7 @@ class DataSmart(MutableMapping): | |||
| 726 | Create a copy of self by setting _data to self | 717 | Create a copy of self by setting _data to self |
| 727 | """ | 718 | """ |
| 728 | # we really want this to be a DataSmart... | 719 | # we really want this to be a DataSmart... |
| 729 | data = DataSmart(seen=self._seen_overrides.copy()) | 720 | data = DataSmart() |
| 730 | data.dict["_data"] = self.dict | 721 | data.dict["_data"] = self.dict |
| 731 | data.varhistory = self.varhistory.copy() | 722 | data.varhistory = self.varhistory.copy() |
| 732 | data.varhistory.datasmart = data | 723 | data.varhistory.datasmart = data |
