diff options
author | Ulf Magnusson <ulfalizer@gmail.com> | 2016-09-13 00:40:37 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-09-15 12:15:07 +0100 |
commit | c3f630df52c3a278316fba89c92f90b5426c36d8 (patch) | |
tree | c69462547569615a52d5b6eba9a2a5b1a4f730de /bitbake | |
parent | d5698c0afca89f81d95a4850dcffec56de9bbe3e (diff) | |
download | poky-c3f630df52c3a278316fba89c92f90b5426c36d8.tar.gz |
bitbake: bitbake: fetch2: Make SRCREV_FORMAT name substitution safer
The implementation of SRCREV_FORMAT has at least two issues:
1. Given two names "foo" and "foobar" and SRCREV_FORMAT = "foo_foobar",
"foo" might currently get substituted twice, and "foobar" not at
all.
2. If the revision substitued for some name happens to contain another
name as a substring, then that substring might incorrectly get
replaced.
Fix both issues by sorting the names with the longest ones first and
replacing all names at once with a regular expression. This was inspired
by
http://stackoverflow.com/questions/6116978/python-replace-multiple-strings.
(Bitbake rev: 8e6a893cb7f13ea14051fc40c6c9baf41aa47fee)
Signed-off-by: Ulf Magnusson <ulfalizer@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/bb/fetch2/__init__.py | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py index 11c75cc723..06f1eb4e81 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py | |||
@@ -761,6 +761,7 @@ def get_srcrev(d, method_name='sortable_revision'): | |||
761 | if not format: | 761 | if not format: |
762 | raise FetchError("The SRCREV_FORMAT variable must be set when multiple SCMs are used.") | 762 | raise FetchError("The SRCREV_FORMAT variable must be set when multiple SCMs are used.") |
763 | 763 | ||
764 | name_to_rev = {} | ||
764 | seenautoinc = False | 765 | seenautoinc = False |
765 | for scm in scms: | 766 | for scm in scms: |
766 | ud = urldata[scm] | 767 | ud = urldata[scm] |
@@ -769,7 +770,16 @@ def get_srcrev(d, method_name='sortable_revision'): | |||
769 | seenautoinc = seenautoinc or autoinc | 770 | seenautoinc = seenautoinc or autoinc |
770 | if len(rev) > 10: | 771 | if len(rev) > 10: |
771 | rev = rev[:10] | 772 | rev = rev[:10] |
772 | format = format.replace(name, rev) | 773 | name_to_rev[name] = rev |
774 | # Replace names by revisions in the SRCREV_FORMAT string. The approach used | ||
775 | # here can handle names being prefixes of other names and names appearing | ||
776 | # as substrings in revisions (in which case the name should not be | ||
777 | # expanded). The '|' regular expression operator tries matches from left to | ||
778 | # right, so we need to sort the names with the longest ones first. | ||
779 | names_descending_len = sorted(name_to_rev, key=len, reverse=True) | ||
780 | name_to_rev_re = "|".join(re.escape(name) for name in names_descending_len) | ||
781 | format = re.sub(name_to_rev_re, lambda match: name_to_rev[match.group(0)], format) | ||
782 | |||
773 | if seenautoinc: | 783 | if seenautoinc: |
774 | format = "AUTOINC+" + format | 784 | format = "AUTOINC+" + format |
775 | 785 | ||