diff options
| -rw-r--r-- | meta/lib/oe/recipeutils.py | 96 | 
1 files changed, 96 insertions, 0 deletions
| diff --git a/meta/lib/oe/recipeutils.py b/meta/lib/oe/recipeutils.py index f05b6c06ba..37efefb093 100644 --- a/meta/lib/oe/recipeutils.py +++ b/meta/lib/oe/recipeutils.py | |||
| @@ -626,3 +626,99 @@ def replace_dir_vars(path, d): | |||
| 626 | path = path.replace(dirpath, '${%s}' % dirvars[dirpath]) | 626 | path = path.replace(dirpath, '${%s}' % dirvars[dirpath]) | 
| 627 | return path | 627 | return path | 
| 628 | 628 | ||
| 629 | def get_recipe_pv_without_srcpv(rd, uri_type): | ||
| 630 | """ | ||
| 631 | Get PV without SRCPV common in SCM's for now only | ||
| 632 | support git. | ||
| 633 | |||
| 634 | Returns tuple with pv, prefix and suffix. | ||
| 635 | """ | ||
| 636 | pv = '' | ||
| 637 | pfx = '' | ||
| 638 | sfx = '' | ||
| 639 | |||
| 640 | if uri_type == 'git': | ||
| 641 | rd_tmp = rd.createCopy() | ||
| 642 | |||
| 643 | rd_tmp.setVar('SRCPV', '') | ||
| 644 | pv = rd_tmp.getVar('PV', True) | ||
| 645 | |||
| 646 | git_regex = re.compile("(?P<pfx>(v|))(?P<ver>((\d+[\.\-_]*)+))(?P<sfx>(\+|)(git|)(r|)(AUTOINC|)(\+|))(?P<rev>.*)") | ||
| 647 | m = git_regex.match(pv) | ||
| 648 | |||
| 649 | if m: | ||
| 650 | pv = m.group('ver') | ||
| 651 | pfx = m.group('pfx') | ||
| 652 | sfx = m.group('sfx') | ||
| 653 | else: | ||
| 654 | pv = rd.getVar('PV', True) | ||
| 655 | |||
| 656 | return (pv, pfx, sfx) | ||
| 657 | |||
| 658 | def get_recipe_upstream_version(rd): | ||
| 659 | """ | ||
| 660 | Get upstream version of recipe using bb.fetch2 methods with support for | ||
| 661 | http, https, ftp and git. | ||
| 662 | |||
| 663 | bb.fetch2 exceptions can be raised, | ||
| 664 | FetchError when don't have network access or upstream site don't response. | ||
| 665 | NoMethodError when uri latest_versionstring method isn't implemented. | ||
| 666 | |||
| 667 | Returns a dictonary with version, type and datetime. | ||
| 668 | Type can be A for Automatic, M for Manual and U for Unknown. | ||
| 669 | """ | ||
| 670 | from bb.fetch2 import decodeurl | ||
| 671 | from datetime import datetime | ||
| 672 | |||
| 673 | ru = {} | ||
| 674 | ru['version'] = '' | ||
| 675 | ru['type'] = 'U' | ||
| 676 | ru['datetime'] = '' | ||
| 677 | |||
| 678 | # XXX: we suppose that the first entry points to the upstream sources | ||
| 679 | src_uri = rd.getVar('SRC_URI', True).split()[0] | ||
| 680 | uri_type, _, _, _, _, _ = decodeurl(src_uri) | ||
| 681 | |||
| 682 | pv = rd.getVar('PV', True) | ||
| 683 | |||
| 684 | manual_upstream_version = rd.getVar("RECIPE_UPSTREAM_VERSION", True) | ||
| 685 | if manual_upstream_version: | ||
| 686 | # manual tracking of upstream version. | ||
| 687 | ru['version'] = manual_upstream_version | ||
| 688 | ru['type'] = 'M' | ||
| 689 | |||
| 690 | manual_upstream_date = rd.getVar("CHECK_DATE", True) | ||
| 691 | if manual_upstream_date: | ||
| 692 | date = datetime.strptime(manual_upstream_date, "%b %d, %Y") | ||
| 693 | else: | ||
| 694 | date = datetime.now() | ||
| 695 | ru['datetime'] = date | ||
| 696 | |||
| 697 | elif uri_type == "file": | ||
| 698 | # files are always up-to-date | ||
| 699 | ru['version'] = pv | ||
| 700 | ru['type'] = 'A' | ||
| 701 | ru['datetime'] = datetime.now() | ||
| 702 | else: | ||
| 703 | ud = bb.fetch2.FetchData(src_uri, rd) | ||
| 704 | pupver = ud.method.latest_versionstring(ud, rd) | ||
| 705 | |||
| 706 | if uri_type == 'git': | ||
| 707 | (pv, pfx, sfx) = get_recipe_pv_without_srcpv(rd, uri_type) | ||
| 708 | |||
| 709 | latest_revision = ud.method.latest_revision(ud, rd, ud.names[0]) | ||
| 710 | |||
| 711 | # if contains revision but not pupver use current pv | ||
| 712 | if pupver == '' and latest_revision: | ||
| 713 | pupver = pv | ||
| 714 | |||
| 715 | if pupver != '': | ||
| 716 | pupver = pfx + pupver + sfx + latest_revision[:10] | ||
| 717 | |||
| 718 | if pupver != '': | ||
| 719 | ru['version'] = pupver | ||
| 720 | ru['type'] = 'A' | ||
| 721 | |||
| 722 | ru['datetime'] = datetime.now() | ||
| 723 | |||
| 724 | return ru | ||
