diff options
author | Michael Wood <michael.g.wood@intel.com> | 2016-12-09 16:52:49 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-12-12 20:44:47 +0000 |
commit | a94ae3ad0cb07a52004143c6f86f371b9e330e9f (patch) | |
tree | 53e6fea344f4d288c25cecc06f8cb88eacdb1099 | |
parent | be1f9f48da480d813e3364815cb3e002ba70dd22 (diff) | |
download | bitbake-contrib-a94ae3ad0cb07a52004143c6f86f371b9e330e9f.tar.gz |
toaster: typeaheads Add a git revisions suggestions
When we're importing a layer it's useful to suggest available git revisions of the
layers. This uses git ls-remote to fetch the revisions and then filter on this.
Caching is added for this typeahead to avoid having to fetch this
information multiple times in a single session.
[YOCTO #8429]
Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | lib/toaster/toastergui/typeaheads.py | 29 | ||||
-rw-r--r-- | lib/toaster/toastergui/urls.py | 5 |
2 files changed, 32 insertions, 2 deletions
diff --git a/lib/toaster/toastergui/typeaheads.py b/lib/toaster/toastergui/typeaheads.py index 2c6c1454a..531600020 100644 --- a/lib/toaster/toastergui/typeaheads.py +++ b/lib/toaster/toastergui/typeaheads.py @@ -16,9 +16,12 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +import subprocess + from toastergui.widgets import ToasterTypeAhead from orm.models import Project from django.core.urlresolvers import reverse +from django.core.cache import cache class LayersTypeAhead(ToasterTypeAhead): """ Typeahead for layers available and not added in the current project's @@ -147,3 +150,29 @@ class ProjectsTypeAhead(ToasterTypeAhead): results.append(needed_fields) return results + + +class GitRevisionTypeAhead(ToasterTypeAhead): + def apply_search(self, search_term, prj, request): + results = [] + git_url = request.GET.get('git_url') + ls_remote = cache.get(git_url) + + if ls_remote is None: + ls_remote = subprocess.check_output(['git', 'ls-remote', git_url], + universal_newlines=True) + ls_remote = ls_remote.splitlines() + # Avoid fetching the list of git refs on each new input + cache.set(git_url, ls_remote, 120) + + for rev in ls_remote: + git_rev = str(rev).split("/")[-1:][0] + # "HEAD" has a special meaning in Toaster... YOCTO #9924 + if "HEAD" in git_rev: + continue + + if git_rev.startswith(search_term): + results.append({'name': git_rev, + 'detail': '[ %s ]' % str(rev)}) + + return results diff --git a/lib/toaster/toastergui/urls.py b/lib/toaster/toastergui/urls.py index 29f0d96ba..d92f190ae 100644 --- a/lib/toaster/toastergui/urls.py +++ b/lib/toaster/toastergui/urls.py @@ -182,8 +182,9 @@ urlpatterns = patterns('toastergui.views', typeaheads.RecipesTypeAhead.as_view(), name='xhr_recipestypeahead'), url(r'^xhr_typeahead/projects$', typeaheads.ProjectsTypeAhead.as_view(), name='xhr_projectstypeahead'), - - + url(r'^xhr_typeahead/gitrev$', + typeaheads.GitRevisionTypeAhead.as_view(), + name='xhr_gitrevtypeahead'), url(r'^xhr_testreleasechange/(?P<pid>\d+)$', 'xhr_testreleasechange', name='xhr_testreleasechange'), |