From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 6861966532913659904 X-Received: by 2002:a1f:206:: with SMTP id 6mr8876563vkc.79.1597680043902; Mon, 17 Aug 2020 09:00:43 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:ab0:6008:: with SMTP id j8ls1121639ual.11.gmail; Mon, 17 Aug 2020 09:00:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyaIajo9Z4wcVtBFCfFaSPQdeHCL2Z1tcX5Trf+ecSMRXeWSnnF8PqHBvvwB0i5TyukKMYP X-Received: by 2002:a9f:3806:: with SMTP id p6mr8237042uad.101.1597680042150; Mon, 17 Aug 2020 09:00:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597680042; cv=none; d=google.com; s=arc-20160816; b=QzhAkXR0w3oBZ9PDByzpUJi2RYnSn2E5CbM/YqSVGmMhyCMVwBuZDdIh2tB2P7gdJo aYshwtjk/d5eqYRVhN2dmoH+M490/gdKw+CWMNaVW/rbwPZ+gzoCHUk9N+0FY4Ixe8oS d9nPMhBl9QtxbA9hGpP9kjxgQLZEo5DIhvRir9Essl3T66wOP8obfZ9eY1N8zBTKeSXI 5hfnaa+5Tv8/VZ3bCv8xJGQ5yvFjwteYcd/wObwH2JWgawbfZq3DRlryGZHtcHpp1vuB +Eo3m1S2VGYgoqbtgJM80bVvx8FKd1iMlChXJ2S28ytZv1icI/4x53++8w6rNCeCJG9l 95rw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:ironport-sdr:ironport-sdr; bh=SFz6AOStARh1VH1t9M2eitTEkfCNiS+yVq2vnjqaTvE=; b=cEZ825G5ywHR+w4e8T+l2pxCUAF7DB2BllZ77lYNqbuNwn6A+NT2U0pZq6bvqknvhv anu0pUF1l+iU6QerB28dHIncMjeJeCafAwGe197W8TAPr6Qd7o8mo2/cIuJ35O64Wl34 PEnCQtjymNWG+Msjv78kmUCbVJE8jWR8Pf3mlhP/kXv4cCp571atg4r69sGHaffKJYnF LSEGBQVoWZhQZ2m8hV4CTzVd718m41jSV7EPUGTHhCEwwgi0bsNTG86SZ0NIwz/1Wqst 2OtAUyNSRWf1CLWyYOdGknPoxBU9nlM2XXRio6XwEiTmzzJeqtWb489ijYwLT+tDX8hx +aeA== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of vijaikumar_kanagarajan@mentor.com designates 68.232.141.98 as permitted sender) smtp.mailfrom=Vijaikumar_Kanagarajan@mentor.com Return-Path: Received: from esa2.mentor.iphmx.com (esa2.mentor.iphmx.com. [68.232.141.98]) by gmr-mx.google.com with ESMTPS id q1si1298323ual.0.2020.08.17.09.00.38 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Aug 2020 09:00:41 -0700 (PDT) Received-SPF: pass (google.com: domain of vijaikumar_kanagarajan@mentor.com designates 68.232.141.98 as permitted sender) client-ip=68.232.141.98; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of vijaikumar_kanagarajan@mentor.com designates 68.232.141.98 as permitted sender) smtp.mailfrom=Vijaikumar_Kanagarajan@mentor.com IronPort-SDR: e48xqmNFnf4/2CnSH2GMrVS+P2Kw344YcYJf0f/JI8YrAx8+gYopLLLeYsliAAcvrsktLREn1u LeeVanRczYyHrE/bnYvUj5jOQYkcWEirvra546e/5vfuMZy3eow3h3frB4RITyTbkxgmLdY+Ke xZoOhbH6ZreklRdUnaN2dJAMav5mC0YxHxbOegHYRKUHq3g1MQeOj94FARK17qGOP/5+r39PCh AsQpyhB61qhmjHedRIfhNcpf9119Xnu+fzUaSjVDLBvbwfK1C222Lp5fBNceO40c4racJ5Rjkp /Ck= X-IronPort-AV: E=Sophos;i="5.76,324,1592899200"; d="scan'208";a="52007197" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa2.mentor.iphmx.com with ESMTP; 17 Aug 2020 08:00:35 -0800 IronPort-SDR: 7RLy1S012SJZuoOsf2/RDa7ZDUqFDEXZgBXS/+EYxsp4JpX9wADYZSYM5UhvTHc2e4Az9+JRNj oUdZty0bYu9GjFKnAlGRRwu99H8IOyTL8KKYHlcNU6urDBIRCTa5SNelN3o+vN7KsX+eZK14Sb 4Rm/VV7NKBX28TotKPr9WpliOD4M96YSHnjgK6gccngT6KM3mKz6voNKP+TyI0Il4U0YwBC9K7 smB+YWSKVMx+CuD8QUnHuO+RprlVXFtxu2SsTWxG2JzBFZSlR7izHqX8xhVJYfDmjHfZrit3D7 foI= From: Vijai Kumar K To: CC: Vijai Kumar K Subject: [PATCH v2] bitbake: Update to 1.46.2 release Date: Mon, 17 Aug 2020 21:30:09 +0530 Message-ID: <20200817160009.16462-1-Vijaikumar_Kanagarajan@mentor.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Return-Path: Vijaikumar_Kanagarajan@mentor.com X-ClientProxiedBy: svr-orw-mbx-02.mgc.mentorg.com (147.34.90.202) To svr-orw-mbx-01.mgc.mentorg.com (147.34.90.201) X-TUID: 5Y6SmtE6YS50 Update bitbake to the latest 1.46.2 release. This release is tagged to the below upstream commit ID: cc11dfa4eb3616547a8a3909f89da0cc4f35dc57 The version in bin/bitbake is not updated to 1.46.2 and still shows 1.46.0. Please use the above commit ID to validate it is indeed 1.46.2 release. Signed-off-by: Vijai Kumar K --- bitbake/bin/bitbake | 2 +- bitbake/bin/bitbake-layers | 4 +- bitbake/bin/bitbake-worker | 11 +- bitbake/bin/toaster | 19 +- bitbake/classes/base.bbclass | 26 +- bitbake/conf/bitbake.conf | 3 - bitbake/contrib/autobuilderlog.json | 13 + bitbake/contrib/vim/indent/bitbake.vim | 343 +++ .../bitbake-user-manual-execution.xml | 109 +- .../bitbake-user-manual-fetching.xml | 2 +- .../bitbake-user-manual-hello.xml | 14 +- .../bitbake-user-manual-intro.xml | 27 +- .../bitbake-user-manual-metadata.xml | 44 +- .../bitbake-user-manual-ref-variables.xml | 13 +- bitbake/lib/bb/COW.py | 1 - bitbake/lib/bb/__init__.py | 14 +- bitbake/lib/bb/build.py | 28 +- bitbake/lib/bb/cache.py | 29 +- bitbake/lib/bb/checksum.py | 6 +- bitbake/lib/bb/codeparser.py | 26 +- bitbake/lib/bb/command.py | 102 +- bitbake/lib/bb/cooker.py | 50 +- bitbake/lib/bb/data.py | 6 +- bitbake/lib/bb/data_smart.py | 63 +- bitbake/lib/bb/event.py | 7 +- bitbake/lib/bb/fetch2/__init__.py | 276 +- bitbake/lib/bb/fetch2/bzr.py | 2 - bitbake/lib/bb/fetch2/clearcase.py | 9 +- bitbake/lib/bb/fetch2/cvs.py | 1 - bitbake/lib/bb/fetch2/git.py | 31 +- bitbake/lib/bb/fetch2/gitannex.py | 2 - bitbake/lib/bb/fetch2/gitsm.py | 22 +- bitbake/lib/bb/fetch2/hg.py | 29 +- bitbake/lib/bb/fetch2/npm.py | 539 ++-- bitbake/lib/bb/fetch2/npmsw.py | 255 ++ bitbake/lib/bb/fetch2/osc.py | 4 +- bitbake/lib/bb/fetch2/perforce.py | 3 +- bitbake/lib/bb/fetch2/ssh.py | 4 +- bitbake/lib/bb/fetch2/svn.py | 22 +- bitbake/lib/bb/fetch2/wget.py | 11 +- bitbake/lib/bb/monitordisk.py | 2 +- bitbake/lib/bb/msg.py | 184 +- bitbake/lib/bb/parse/ast.py | 24 +- bitbake/lib/bb/parse/parse_py/BBHandler.py | 2 - bitbake/lib/bb/parse/parse_py/ConfHandler.py | 46 +- bitbake/lib/bb/persist_data.py | 3 + bitbake/lib/bb/progress.py | 1 - bitbake/lib/bb/providers.py | 6 +- bitbake/lib/bb/pysh/pyshyacc.py | 1 + bitbake/lib/bb/remotedata.py | 49 +- bitbake/lib/bb/runqueue.py | 206 +- bitbake/lib/bb/server/process.py | 25 +- bitbake/lib/bb/server/xmlrpcclient.py | 3 - bitbake/lib/bb/server/xmlrpcserver.py | 3 - bitbake/lib/bb/siggen.py | 194 +- bitbake/lib/bb/taskdata.py | 2 +- bitbake/lib/bb/tests/cooker.py | 1 - bitbake/lib/bb/tests/cow.py | 2 +- bitbake/lib/bb/tests/data.py | 141 +- .../tests/fetch-testdata/apple/cups/releases | 2400 +++++++++++++++++ .../debian/pool/main/d/db5.3/index.html | 509 ++++ .../downloads/enchant/1.6.0/index.html | 15 + .../fetch-testdata/files/v2.8/index.html | 774 ++++++ .../fetch-testdata/files/v3.0/index.html | 209 ++ .../fetch-testdata/files/v3.1/index.html | 156 ++ .../fetch-testdata/files/v3.10/index.html | 131 + .../fetch-testdata/files/v3.11/index.html | 131 + .../fetch-testdata/files/v3.12/index.html | 118 + .../fetch-testdata/files/v3.13/index.html | 131 + .../fetch-testdata/files/v3.14/index.html | 170 ++ .../fetch-testdata/files/v3.15/index.html | 157 ++ .../fetch-testdata/files/v3.16/index.html | 86 + .../fetch-testdata/files/v3.2/index.html | 132 + .../fetch-testdata/files/v3.3/index.html | 163 ++ .../fetch-testdata/files/v3.4/index.html | 127 + .../fetch-testdata/files/v3.5/index.html | 111 + .../fetch-testdata/files/v3.6/index.html | 159 ++ .../fetch-testdata/files/v3.7/index.html | 92 + .../fetch-testdata/files/v3.8/index.html | 105 + .../fetch-testdata/files/v3.9/index.html | 183 ++ .../linux/utils/util-linux/v2.23/index.html | 45 + .../linux/utils/util-linux/v2.24/index.html | 43 + .../linux/utils/util-linux/v2.25/index.html | 46 + .../linux/utils/util-linux/v2.26/index.html | 42 + .../linux/utils/util-linux/v2.27/index.html | 35 + .../linux/utils/util-linux/v2.28/index.html | 42 + .../linux/utils/util-linux/v2.29/index.html | 42 + .../linux/utils/util-linux/v2.30/index.html | 42 + .../linux/utils/util-linux/v2.31/index.html | 35 + .../linux/utils/util-linux/v2.32/index.html | 35 + .../linux/utils/util-linux/v2.33/index.html | 42 + .../linux/utils/util-linux/v2.34/index.html | 28 + .../linux/utils/util-linux/v2.35/index.html | 18 + .../fetch-testdata/releases/eglibc/index.html | 21 + .../releases/gnu-config/index.html | 9 + .../releases/individual/xserver/index.html | 609 +++++ .../software/pulseaudio/releases/index.html | 383 +++ bitbake/lib/bb/tests/fetch.py | 571 +++- bitbake/lib/bb/tests/runqueue.py | 3 +- bitbake/lib/bb/tests/support/httpserver.py | 65 + bitbake/lib/bb/tests/utils.py | 70 + bitbake/lib/bb/tinfoil.py | 183 +- bitbake/lib/bb/ui/buildinfohelper.py | 8 +- bitbake/lib/bb/ui/knotty.py | 252 +- bitbake/lib/bb/ui/ncurses.py | 5 +- bitbake/lib/bb/ui/taskexp.py | 17 +- bitbake/lib/bb/ui/teamcity.py | 396 +++ bitbake/lib/bb/ui/toasterui.py | 2 +- bitbake/lib/bb/ui/uievent.py | 2 +- bitbake/lib/bb/ui/uihelper.py | 39 +- bitbake/lib/bb/utils.py | 121 +- bitbake/lib/bblayers/common.py | 2 +- bitbake/lib/bblayers/layerindex.py | 17 +- bitbake/lib/bblayers/query.py | 20 +- bitbake/lib/bs4/__init__.py | 2 +- bitbake/lib/bs4/builder/_html5lib.py | 3 +- bitbake/lib/bs4/dammit.py | 8 - bitbake/lib/bs4/element.py | 1 - bitbake/lib/bs4/testing.py | 1 - bitbake/lib/bs4/tests/test_docs.py | 4 - bitbake/lib/bs4/tests/test_htmlparser.py | 1 - bitbake/lib/bs4/tests/test_lxml.py | 8 +- bitbake/lib/bs4/tests/test_soup.py | 6 +- bitbake/lib/bs4/tests/test_tree.py | 11 +- bitbake/lib/hashserv/__init__.py | 22 + bitbake/lib/hashserv/client.py | 52 +- bitbake/lib/hashserv/server.py | 137 +- bitbake/lib/hashserv/tests.py | 23 + bitbake/lib/layerindexlib/cooker.py | 5 +- bitbake/lib/layerindexlib/plugin.py | 3 - bitbake/lib/layerindexlib/tests/cooker.py | 3 - .../lib/layerindexlib/tests/layerindexobj.py | 6 - bitbake/lib/layerindexlib/tests/restapi.py | 3 - bitbake/lib/ply/yacc.py | 6 +- bitbake/lib/prserv/db.py | 14 +- bitbake/lib/prserv/serv.py | 38 +- bitbake/lib/pyinotify.py | 4 +- bitbake/lib/toaster/bldcollector/urls.py | 2 +- bitbake/lib/toaster/bldcollector/views.py | 10 +- bitbake/lib/toaster/bldcontrol/admin.py | 1 - .../lib/toaster/bldcontrol/bbcontroller.py | 4 +- .../bldcontrol/localhostbecontroller.py | 11 +- .../management/commands/checksettings.py | 6 +- .../management/commands/runbuilds.py | 6 +- .../bldcontrol/migrations/0001_initial.py | 18 +- bitbake/lib/toaster/bldcontrol/models.py | 21 +- bitbake/lib/toaster/orm/fixtures/oe-core.xml | 12 +- bitbake/lib/toaster/orm/fixtures/poky.xml | 18 +- .../orm/management/commands/lsupdates.py | 2 +- .../toaster/orm/migrations/0001_initial.py | 100 +- .../orm/migrations/0002_customimagerecipe.py | 6 +- .../orm/migrations/0003_customimagepackage.py | 2 +- .../toaster/orm/migrations/0004_provides.py | 4 +- .../0008_refactor_artifact_models.py | 4 +- .../orm/migrations/0011_delete_layersource.py | 2 +- .../0012_use_release_instead_of_up_branch.py | 2 +- .../orm/migrations/0017_distro_clone.py | 2 +- .../toaster/orm/migrations/0019_django_2_2.py | 23 + bitbake/lib/toaster/orm/models.py | 102 +- .../tests/browser/selenium_helpers_base.py | 1 - .../tests/browser/test_all_builds_page.py | 2 +- .../tests/browser/test_all_projects_page.py | 2 +- .../tests/browser/test_builddashboard_page.py | 2 +- .../test_builddashboard_page_artifacts.py | 2 +- .../test_builddashboard_page_recipes.py | 2 +- .../browser/test_builddashboard_page_tasks.py | 2 +- .../tests/browser/test_js_unit_tests.py | 2 +- .../tests/browser/test_landing_page.py | 2 +- .../tests/browser/test_layerdetails_page.py | 2 +- .../browser/test_most_recent_builds_states.py | 2 +- .../browser/test_new_custom_image_page.py | 2 +- .../tests/browser/test_new_project_page.py | 2 +- .../tests/browser/test_project_builds_page.py | 2 +- .../tests/browser/test_project_config_page.py | 8 +- .../tests/browser/test_project_page.py | 2 +- .../lib/toaster/tests/browser/test_sample.py | 2 +- .../toaster/tests/browser/test_task_page.py | 2 +- .../tests/browser/test_toastertable_ui.py | 2 +- .../tests/functional/test_functional_basic.py | 1 - bitbake/lib/toaster/tests/views/test_views.py | 2 +- bitbake/lib/toaster/toastergui/api.py | 5 +- bitbake/lib/toaster/toastergui/tables.py | 9 +- .../objects_to_dictionaries_filter.py | 1 - .../templatetags/project_url_tag.py | 2 +- .../toastergui/templatetags/projecttags.py | 10 +- bitbake/lib/toaster/toastergui/typeaheads.py | 2 +- bitbake/lib/toaster/toastergui/urls.py | 5 +- bitbake/lib/toaster/toastergui/views.py | 45 +- bitbake/lib/toaster/toastergui/widgets.py | 2 +- .../management/commands/builddelete.py | 4 +- .../management/commands/buildimport.py | 22 +- .../management/commands/buildslist.py | 3 +- bitbake/lib/toaster/toastermain/settings.py | 17 +- bitbake/lib/toaster/toastermain/urls.py | 4 +- bitbake/toaster-requirements.txt | 2 +- 195 files changed, 11522 insertions(+), 1792 deletions(-) create mode 100644 bitbake/contrib/autobuilderlog.json create mode 100644 bitbake/contrib/vim/indent/bitbake.vim create mode 100644 bitbake/lib/bb/fetch2/npmsw.py create mode 100644 bitbake/lib/bb/tests/fetch-testdata/apple/cups/releases create mode 100644 bitbake/lib/bb/tests/fetch-testdata/debian/pool/main/d/= db5.3/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/downloads/enchant/1= .6.0/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v2.8/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.0/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.1/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.10/index.h= tml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.11/index.h= tml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.12/index.h= tml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.13/index.h= tml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.14/index.h= tml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.15/index.h= tml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.16/index.h= tml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.2/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.3/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.4/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.5/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.6/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.7/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.8/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.9/index.ht= ml create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.23/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.24/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.25/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.26/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.27/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.28/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.29/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.30/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.31/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.32/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.33/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.34/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.35/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/releases/eglibc/ind= ex.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/releases/gnu-config= /index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/releases/individual= /xserver/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/software/pulseaudio= /releases/index.html create mode 100644 bitbake/lib/bb/tests/support/httpserver.py create mode 100644 bitbake/lib/bb/ui/teamcity.py create mode 100644 bitbake/lib/toaster/orm/migrations/0019_django_2_2.py diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake index 66d08f8..6c73710 100755 --- a/bitbake/bin/bitbake +++ b/bitbake/bin/bitbake @@ -26,7 +26,7 @@ from bb.main import bitbake_main, BitBakeConfigParameters= , BBMainException if sys.getfilesystemencoding() !=3D "utf-8": sys.exit("Please use a locale setting which supports UTF-8 (such as LA= NG=3Den_US.UTF-8).\nPython can't change the filesystem locale after loading= so we need a UTF-8 when Python starts or things won't work.") =20 -__version__ =3D "1.44.0" +__version__ =3D "1.46.0" =20 if __name__ =3D=3D "__main__": if __version__ !=3D bb.__version__: diff --git a/bitbake/bin/bitbake-layers b/bitbake/bin/bitbake-layers index a884dc1..149f1b1 100755 --- a/bitbake/bin/bitbake-layers +++ b/bitbake/bin/bitbake-layers @@ -52,7 +52,9 @@ def main(): =20 # Need to re-run logger_create with color argument # (will be the same logger since it has the same name) - bb.msg.logger_create('bitbake-layers', output=3Dsys.stdout, color=3Dgl= obal_args.color) + bb.msg.logger_create('bitbake-layers', output=3Dsys.stdout, + color=3Dglobal_args.color, + level=3Dlogger.getEffectiveLevel()) =20 plugins =3D [] tinfoil =3D bb.tinfoil.Tinfoil(tracking=3DTrue) diff --git a/bitbake/bin/bitbake-worker b/bitbake/bin/bitbake-worker index 6776cad..97cc0fd 100755 --- a/bitbake/bin/bitbake-worker +++ b/bitbake/bin/bitbake-worker @@ -65,7 +65,6 @@ if 0: format_str =3D "%(levelname)s: %(message)s" conlogformat =3D bb.msg.BBLogFormatter(format_str) consolelog =3D logging.FileHandler(logfilename) - bb.msg.addDefaultlogFilter(consolelog) consolelog.setFormatter(conlogformat) logger.addHandler(consolelog) =20 @@ -195,9 +194,6 @@ def fork_off_task(cfg, data, databuilder, workerdata, f= n, task, taskname, taskha global worker_pipe_lock pipein.close() =20 - signal.signal(signal.SIGTERM, sigterm_handler) - # Let SIGHUP exit as SIGTERM - signal.signal(signal.SIGHUP, sigterm_handler) bb.utils.signal_on_parent_exit("SIGTERM") =20 # Save out the PID so that the event can include it the @@ -212,6 +208,11 @@ def fork_off_task(cfg, data, databuilder, workerdata, = fn, task, taskname, taskha # This ensures signals sent to the controlling terminal like C= trl+C # don't stop the child processes. os.setsid() + + signal.signal(signal.SIGTERM, sigterm_handler) + # Let SIGHUP exit as SIGTERM + signal.signal(signal.SIGHUP, sigterm_handler) + # No stdin newsi =3D os.open(os.devnull, os.O_RDWR) os.dup2(newsi, sys.stdin.fileno()) @@ -412,7 +413,7 @@ class BitbakeWorker(object): =20 def handle_workerdata(self, data): self.workerdata =3D pickle.loads(data) - bb.msg.loggerDefaultDebugLevel =3D self.workerdata["logdefaultdebu= g"] + bb.msg.loggerDefaultLogLevel =3D self.workerdata["logdefaultlevel"= ] bb.msg.loggerDefaultVerbose =3D self.workerdata["logdefaultverbose= "] bb.msg.loggerVerboseLogs =3D self.workerdata["logdefaultverboselog= s"] bb.msg.loggerDefaultDomains =3D self.workerdata["logdefaultdomain"= ] diff --git a/bitbake/bin/toaster b/bitbake/bin/toaster index c3472df..6b90ee1 100755 --- a/bitbake/bin/toaster +++ b/bitbake/bin/toaster @@ -8,12 +8,13 @@ # =20 HELP=3D" -Usage: source toaster start|stop [webport=3D] [noweb] [nobui= ld] [toasterdir] +Usage 1: source toaster start|stop [webport=3D] [noweb] [nob= uild] [toasterdir] Optional arguments: [nobuild] Setup the environment for capturing builds with toaster = but disable managed builds [noweb] Setup the environment for capturing builds with toaster bu= t don't start the web server [webport] Set the development server (default: localhost:8000) [toasterdir] Set absolute path to be used as TOASTER_DIR (default:= BUILDDIR/../) +Usage 2: source toaster manage [createsuperuser|lsupdates|migrate|makemigr= ations|checksettings|collectstatic|...] " =20 custom_extention() @@ -208,13 +209,21 @@ for param in $*; do toasterdir=3D*) TOASTERDIR=3D"${param#*=3D}" ;; + manage ) + CMD=3D$param + manage_cmd=3D"" + ;; --help) echo "$HELP" return 0 ;; *) - echo "$HELP" - return 1 + if [ "manage" =3D=3D "$CMD" ] ; then + manage_cmd=3D"$manage_cmd $param" + else + echo "$HELP" + exit 1 + fi ;; =20 esac @@ -306,6 +315,10 @@ case $CMD in stop_system echo "Successful ${CMD}." ;; + manage ) + cd $BBBASEDIR/lib/toaster + $MANAGE $manage_cmd + ;; esac custom_extention toaster_postpend $CMD $ADDR_PORT =20 diff --git a/bitbake/classes/base.bbclass b/bitbake/classes/base.bbclass index 08441fe..1809396 100644 --- a/bitbake/classes/base.bbclass +++ b/bitbake/classes/base.bbclass @@ -38,30 +38,30 @@ bbfatal() { addtask showdata do_showdata[nostamp] =3D "1" python do_showdata() { - import sys - # emit variables and shell functions - bb.data.emit_env(sys.__stdout__, d, True) - # emit the metadata which isnt valid shell - for e in bb.data.keys(d): - if d.getVarFlag(e, 'python', False): - bb.plain("\npython %s () {\n%s}" % (e, d.getVar(e))) + import sys + # emit variables and shell functions + bb.data.emit_env(sys.__stdout__, d, True) + # emit the metadata which isn't valid shell + for e in bb.data.keys(d): + if d.getVarFlag(e, 'python', False): + bb.plain("\npython %s () {\n%s}" % (e, d.getVar(e))) } =20 addtask listtasks do_listtasks[nostamp] =3D "1" python do_listtasks() { - import sys - for e in bb.data.keys(d): - if d.getVarFlag(e, 'task', False): - bb.plain("%s" % e) + import sys + for e in bb.data.keys(d): + if d.getVarFlag(e, 'task', False): + bb.plain("%s" % e) } =20 addtask build do_build[dirs] =3D "${TOPDIR}" do_build[nostamp] =3D "1" python base_do_build () { - bb.note("The included, default BB base.bbclass does not define a useful d= efault task.") - bb.note("Try running the 'listtasks' task against a .bb to see what tasks= are defined.") + bb.note("The included, default BB base.bbclass does not define a usefu= l default task.") + bb.note("Try running the 'listtasks' task against a .bb to see what ta= sks are defined.") } =20 EXPORT_FUNCTIONS do_clean do_mrproper do_build diff --git a/bitbake/conf/bitbake.conf b/bitbake/conf/bitbake.conf index a460df4..b3d5fab 100644 --- a/bitbake/conf/bitbake.conf +++ b/bitbake/conf/bitbake.conf @@ -19,14 +19,12 @@ # OTHER DEALINGS IN THE SOFTWARE. =20 B =3D "${S}" -CVSDIR =3D "${DL_DIR}/cvs" DEPENDS =3D "" DEPLOY_DIR =3D "${TMPDIR}/deploy" DEPLOY_DIR_IMAGE =3D "${DEPLOY_DIR}/images" DL_DIR =3D "${TMPDIR}/downloads" FILESPATH =3D "${FILE_DIRNAME}/${PF}:${FILE_DIRNAME}/${P}:${FILE_DIRNAME}/= ${PN}:${FILE_DIRNAME}/files:${FILE_DIRNAME}" FILE_DIRNAME =3D "${@os.path.dirname(d.getVar('FILE', False))}" -GITDIR =3D "${DL_DIR}/git" IMAGE_CMD =3D "_NO_DEFINED_IMAGE_TYPES_" IMAGE_ROOTFS =3D "${TMPDIR}/rootfs" OVERRIDES =3D "local:${MACHINE}:${TARGET_OS}:${TARGET_ARCH}" @@ -40,7 +38,6 @@ PV =3D "${@bb.parse.BBHandler.vars_from_file(d.getVar('FI= LE', False),d)[1] or '1.0 S =3D "${WORKDIR}/${P}" SRC_URI =3D "file://${FILE}" STAMP =3D "${TMPDIR}/stamps/${PF}" -SVNDIR =3D "${DL_DIR}/svn" T =3D "${WORKDIR}/temp" TARGET_ARCH =3D "${BUILD_ARCH}" TMPDIR =3D "${TOPDIR}/tmp" diff --git a/bitbake/contrib/autobuilderlog.json b/bitbake/contrib/autobuil= derlog.json new file mode 100644 index 0000000..193a675 --- /dev/null +++ b/bitbake/contrib/autobuilderlog.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "loggers": { + "BitBake.SigGen.HashEquiv": { + "level": "VERBOSE", + "handlers": ["BitBake.verbconsole"] + }, + "BitBake.RunQueue.HashEquiv": { + "level": "VERBOSE", + "handlers": ["BitBake.verbconsole"] + } + } +} diff --git a/bitbake/contrib/vim/indent/bitbake.vim b/bitbake/contrib/vim/i= ndent/bitbake.vim new file mode 100644 index 0000000..1381034 --- /dev/null +++ b/bitbake/contrib/vim/indent/bitbake.vim @@ -0,0 +1,343 @@ +" Vim indent file +" Language: BitBake +" Copyright: Copyright (C) 2019 Agilent Technologies, Inc. +" Maintainer: Chris Laplante +" License: You may redistribute this under the same terms as = Vim itself + + +if exists("b:did_indent") + finish +endif + +if exists("*BitbakeIndent") + finish +endif + +runtime! indent/sh.vim +unlet b:did_indent + +setlocal indentexpr=3DBitbakeIndent(v:lnum) +setlocal autoindent nolisp + +function s:is_bb_python_func_def(lnum) + let stack =3D synstack(a:lnum, 1) + if len(stack) =3D=3D 0 + return 0 + endif + + let top =3D synIDattr(stack[0], "name") + echo top + + return synIDattr(stack[0], "name") =3D=3D "bbPyFuncDef" +endfunction + +"""" begin modified from indent/python.vim, upstream commit 7a9bd7c1e0ce1b= af5a02daf36eeae3638aa315c7 +"""" This copied code is licensed the same as Vim itself. +setlocal indentkeys+=3D<:>,=3Delif,=3Dexcept + +let s:keepcpo=3D &cpo +set cpo&vim + +let s:maxoff =3D 50 " maximum number of lines to look backwards for () + +function GetPythonIndent(lnum) + + " If this line is explicitly joined: If the previous line was also joine= d, + " line it up with that one, otherwise add two 'shiftwidth' + if getline(a:lnum - 1) =3D~ '\\$' + if a:lnum > 1 && getline(a:lnum - 2) =3D~ '\\$' + return indent(a:lnum - 1) + endif + return indent(a:lnum - 1) + (exists("g:pyindent_continue") ? eval(g:py= indent_continue) : (shiftwidth() * 2)) + endif + + " If the start of the line is in a string don't change the indent. + if has('syntax_items') + \ && synIDattr(synID(a:lnum, 1, 1), "name") =3D~ "String$" + return -1 + endif + + " Search backwards for the previous non-empty line. + let plnum =3D prevnonblank(v:lnum - 1) + + if plnum =3D=3D 0 + " This is the first non-empty line, use zero indent. + return 0 + endif + + call cursor(plnum, 1) + + " Identing inside parentheses can be very slow, regardless of the search= pair() + " timeout, so let the user disable this feature if he doesn't need it + let disable_parentheses_indenting =3D get(g:, "pyindent_disable_parenthe= ses_indenting", 0) + + if disable_parentheses_indenting =3D=3D 1 + let plindent =3D indent(plnum) + let plnumstart =3D plnum + else + " searchpair() can be slow sometimes, limit the time to 150 msec or wh= at is + " put in g:pyindent_searchpair_timeout + let searchpair_stopline =3D 0 + let searchpair_timeout =3D get(g:, 'pyindent_searchpair_timeout', 150) + + " If the previous line is inside parenthesis, use the indent of the st= arting + " line. + " Trick: use the non-existing "dummy" variable to break out of the loo= p when + " going too far back. + let parlnum =3D searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', + \ "line('.') < " . (plnum - s:maxoff) . " ? dummy :" + \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" + \ . " =3D~ '\\(Comment\\|Todo\\|String\\)$'", + \ searchpair_stopline, searchpair_timeout) + if parlnum > 0 + " We may have found the opening brace of a BitBake Python task, e.g.= 'python do_task {' + " If so, ignore it here - it will be handled later. + if s:is_bb_python_func_def(parlnum) + let parlnum =3D 0 + let plindent =3D indent(plnum) + let plnumstart =3D plnum + else + let plindent =3D indent(parlnum) + let plnumstart =3D parlnum + endif + else + let plindent =3D indent(plnum) + let plnumstart =3D plnum + endif + + " When inside parenthesis: If at the first line below the parenthesis = add + " two 'shiftwidth', otherwise same as previous line. + " i =3D (a + " + b + " + c) + call cursor(a:lnum, 1) + let p =3D searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', + \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" + \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" + \ . " =3D~ '\\(Comment\\|Todo\\|String\\)$'", + \ searchpair_stopline, searchpair_timeout) + if p > 0 + if s:is_bb_python_func_def(p) + " Handle first non-empty line inside a BB Python task + if p =3D=3D plnum + return shiftwidth() + endif + + " Handle the user actually trying to close a BitBake Python task + let line =3D getline(a:lnum) + if line =3D~ '^\s*}' + return -2 + endif + + " Otherwise ignore the brace + let p =3D 0 + else + if p =3D=3D plnum + " When the start is inside parenthesis, only indent one 'shift= width'. + let pp =3D searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', + \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" + \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" + \ . " =3D~ '\\(Comment\\|Todo\\|String\\)$'", + \ searchpair_stopline, searchpair_timeout) + if pp > 0 + return indent(plnum) + (exists("g:pyindent_nested_paren") ? = eval(g:pyindent_nested_paren) : shiftwidth()) + endif + return indent(plnum) + (exists("g:pyindent_open_paren") ? eval= (g:pyindent_open_paren) : (shiftwidth() * 2)) + endif + if plnumstart =3D=3D p + return indent(plnum) + endif + return plindent + endif + endif + + endif + + + " Get the line and remove a trailing comment. + " Use syntax highlighting attributes when possible. + let pline =3D getline(plnum) + let pline_len =3D strlen(pline) + if has('syntax_items') + " If the last character in the line is a comment, do a binary search f= or + " the start of the comment. synID() is slow, a linear search would ta= ke + " too long on a long line. + if synIDattr(synID(plnum, pline_len, 1), "name") =3D~ "\\(Comment\\|To= do\\)$" + let min =3D 1 + let max =3D pline_len + while min < max + let col =3D (min + max) / 2 + if synIDattr(synID(plnum, col, 1), "name") =3D~ "\\(Comment\\|Todo\\)$" + let max =3D col + else + let min =3D col + 1 + endif + endwhile + let pline =3D strpart(pline, 0, min - 1) + endif + else + let col =3D 0 + while col < pline_len + if pline[col] =3D=3D '#' + let pline =3D strpart(pline, 0, col) + break + endif + let col =3D col + 1 + endwhile + endif + + " If the previous line ended with a colon, indent this line + if pline =3D~ ':\s*$' + return plindent + shiftwidth() + endif + + " If the previous line was a stop-execution statement... + " TODO: utilize this logic to deindent when ending a bbPyDefRegion + if getline(plnum) =3D~ '^\s*\(break\|continue\|raise\|return\|pass\|bb\.= fatal\)\>' + " See if the user has already dedented + if indent(a:lnum) > indent(plnum) - shiftwidth() + " If not, recommend one dedent + return indent(plnum) - shiftwidth() + endif + " Otherwise, trust the user + return -1 + endif + + " If the current line begins with a keyword that lines up with "try" + if getline(a:lnum) =3D~ '^\s*\(except\|finally\)\>' + let lnum =3D a:lnum - 1 + while lnum >=3D 1 + if getline(lnum) =3D~ '^\s*\(try\|except\)\>' + let ind =3D indent(lnum) + if ind >=3D indent(a:lnum) + return -1 " indent is already less than this + endif + return ind " line up with previous try or except + endif + let lnum =3D lnum - 1 + endwhile + return -1 " no matching "try"! + endif + + " If the current line begins with a header keyword, dedent + if getline(a:lnum) =3D~ '^\s*\(elif\|else\)\>' + + " Unless the previous line was a one-liner + if getline(plnumstart) =3D~ '^\s*\(for\|if\|try\)\>' + return plindent + endif + + " Or the user has already dedented + if indent(a:lnum) <=3D plindent - shiftwidth() + return -1 + endif + + return plindent - shiftwidth() + endif + + " When after a () construct we probably want to go back to the start lin= e. + " a =3D (b + " + c) + " here + if parlnum > 0 + return plindent + endif + + return -1 + +endfunction + +let &cpo =3D s:keepcpo +unlet s:keepcpo + +""" end of stuff from indent/python.vim + + +let b:did_indent =3D 1 +setlocal indentkeys+=3D0\" + + +function BitbakeIndent(lnum) + if !has('syntax_items') + return -1 + endif + + let stack =3D synstack(a:lnum, 1) + if len(stack) =3D=3D 0 + return -1 + endif + + let name =3D synIDattr(stack[0], "name") + + " TODO: support different styles of indentation for assignments. For n= ow, + " we only support like this: + " VAR =3D " \ + " value1 \ + " value2 \ + " " + " + " i.e. each value indented by shiftwidth(), with the final quote " com= pletely unindented. + if name =3D=3D "bbVarValue" + " Quote handling is tricky. kernel.bbclass has this line for insta= nce: + " EXTRA_OEMAKE =3D " HOSTCC=3D"${BUILD_CC} ${BUILD_CFLAGS} ${B= UILD_LDFLAGS}" " HOSTCPP=3D"${BUILD_CPP}"" + " Instead of trying to handle crazy cases like that, just assume t= hat a + " double-quote on a line by itself (following an assignment) means= the + " user is closing the assignment, and de-dent. + if getline(a:lnum) =3D~ '^\s*"$' + return 0 + endif + + let prevstack =3D synstack(a:lnum - 1, 1) + if len(prevstack) =3D=3D 0 + return -1 + endif + + let prevname =3D synIDattr(prevstack[0], "name") + + " Only indent if there was actually a continuation character on + " the previous line, to avoid misleading indentation. + let prevlinelastchar =3D synIDattr(synID(a:lnum - 1, col([a:lnum -= 1, "$"]) - 1, 1), "name") + let prev_continued =3D prevlinelastchar =3D=3D "bbContinue" + + " Did the previous line introduce an assignment? + if index(["bbVarDef", "bbVarFlagDef"], prevname) !=3D -1 + if prev_continued + return shiftwidth() + endif + endif + + if !prev_continued + return 0 + endif + + " Autoindent can take it from here + return -1 + endif + + if index(["bbPyDefRegion", "bbPyFuncRegion"], name) !=3D -1 + let ret =3D GetPythonIndent(a:lnum) + " Should normally always be indented by at least one shiftwidth; b= ut allow + " return of -1 (defer to autoindent) or -2 (force indent to 0) + if ret =3D=3D 0 + return shiftwidth() + elseif ret =3D=3D -2 + return 0 + endif + return ret + endif + + " TODO: GetShIndent doesn't detect tasks prepended with 'fakeroot' + " Need to submit a patch upstream to Vim to provide an extension point= . + " Unlike the Python indenter, the Sh indenter is way too large to copy= and + " modify here. + if name =3D=3D "bbShFuncRegion" + return GetShIndent() + endif + + " TODO: + " + heuristics for de-denting out of a bbPyDefRegion? e.g. when the = user + " types an obvious BB keyword like addhandler or addtask, or sta= rts + " writing a shell task. Maybe too hard to implement... + + return -1 +endfunction diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-execution.= xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-execution.xml index 46dafee..e4251df 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-execution.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-execution.xml @@ -113,7 +113,7 @@ =20 - Prior to parsing configuration files, Bitbake looks + Prior to parsing configuration files, BitBake looks at certain variables, including: @@ -339,7 +339,7 @@ BB_= HASHCONFIG_WHITELIST) and then checking if the checksum matches. If that checksum matches what is in the cache and the recipe - and class files have not changed, Bitbake is able to use + and class files have not changed, BitBake is able to use the cache. BitBake then reloads the cached information about the recipe instead of reparsing it from scratch. @@ -429,7 +429,7 @@ The default PREFERRE= D_PROVIDER is the provider with the same name as the target. - Bitbake iterates through each target it needs to build and + BitBake iterates through each target it needs to build and resolves them and their dependencies using this process. =20 @@ -618,12 +618,12 @@ Tasks can be either a shell task or a Python task. For shell tasks, BitBake writes a shell script to - ${T<= /filename>}/run.do_taskname.pid + ${T<= /filename>}/run.do_taskname.pid= and then executes the script. The generated shell script contains all the exported variables= , and the shell functions with all variables expanded. Output from the shell script goes to the file - ${T}/log.do_taskname.pid. + ${T}/log.do_taskname.pid<= /filename>. Looking at the expanded shell functions in the run file and the output in the log files is a useful debugging technique. @@ -821,7 +821,7 @@ =20 It is worth noting that BitBake's "-S" option lets you - debug Bitbake's processing of signatures. + debug BitBake's processing of signatures. The options passed to -S allow different debugging modes to be used, either using BitBake's own debug functions or possibly those defined in the metadata/signature handler @@ -929,4 +929,101 @@ section. + +
+ Logging + + In addition to the standard command line option to control how + verbose builds are when execute, bitbake also supports user de= fined + configuration of the + = Python logging + facilities through the + BB_LOGCONFIG + variable. This variable defines a json or yaml + logging configuration + that will be intelligently merged into the default configurati= on. + The logging configuration is merged using the following rules: + + + The user defined configuration will completely replace= the default + configuration if top level key + bitbake_merge is set to the value + False. In this case, all other ru= les + are ignored. + + + The user configuration must have a top level + version which must match the valu= e of + the default configuration. + + + Any keys defined in the handlers, + formatters, or filters<= /filename>, + will be merged into the same section in the default + configuration, with the user specified keys taking + replacing a default one if there is a conflict. In + practice, this means that if both the default configur= ation + and user configuration specify a handler named + myhandler, the user defined one w= ill + replace the default. To prevent the user from inadvert= ently + replacing a default handler, formatter, or filter, all= of + the default ones are named with a prefix of + "BitBake." + + + If a logger is defined by the user with the key + bitbake_merge set to + False, that logger will be comple= tely + replaced by user configuration. In this case, no other + rules will apply to that logger. + + + All user defined filter and + handlers properties for a given l= ogger + will be merged with corresponding properties from the + default logger. For example, if the user configuration= adds + a filter called myFilter to the + BitBake.SigGen, and the default + configuration adds a filter called + BitBake.defaultFilter, both filte= rs + will be applied to the logger + + + + + + As an example, consider the following user logging configurati= on + file which logs all Hash Equivalence related messages of VERBO= SE or + higher to a file called hashequiv.log + + { + "version": 1, + "handlers": { + "autobuilderlog": { + "class": "logging.FileHandler", + "formatter": "logfileFormatter", + "level": "DEBUG", + "filename": "hashequiv.log", + "mode": "w" + } + }, + "formatters": { + "logfileFormatter": { + "format": "%(name)s: %(levelname)s: %(message)s" + } + }, + "loggers": { + "BitBake.SigGen.HashEquiv": { + "level": "VERBOSE", + "handlers": ["autobuilderlog"] + }, + "BitBake.RunQueue.HashEquiv": { + "level": "VERBOSE", + "handlers": ["autobuilderlog"] + } + } + } + + +
diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-fetching.x= ml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-fetching.xml index 6840408..d1bfc23 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-fetching.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-fetching.xml @@ -139,7 +139,7 @@
=20 - Since network accesses are slow, Bitbake maintains a + Since network accesses are slow, BitBake maintains a cache of files downloaded from the network. Any source files that are not local (i.e. downloaded from the Internet) are placed into the download diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-hello.xml = b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-hello.xml index 39066e4..11eb36a 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-hello.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-hello.xml @@ -166,7 +166,7 @@ Having a project directory is a good way to isolate your project. - Run Bitbake: + Run BitBake: At this point, you have nothing but a project directory. Run the bitbake command and see what it does: @@ -197,7 +197,7 @@ BBPATH variable is what tells BitBake where to look for those fil= es. BBPATH is not set and you need to set= it. - Without BBPATH, Bitbake cannot + Without BBPATH, BitBake cannot find any configuration files (.conf) or recipe files (.bb) at all. BitBake also cannot find the bitbake.conf @@ -225,7 +225,7 @@ as the shell would. - Run Bitbake: + Run BitBake: Now that you have BBPATH defined, run the bitbake command again: @@ -313,7 +313,7 @@ example, click on the links to take you to the definitions= in the glossary. - Run Bitbake: + Run BitBake: After making sure that the conf/bitbake.conf file exists, you can run the bitbake command again: @@ -364,7 +364,7 @@ more depending on which build environments BitBake is supporting. - Run Bitbake: + Run BitBake: After making sure that the classes/base.bbclass<= /filename> file exists, you can run the bitbake command again: @@ -434,7 +434,7 @@ For more information on these variables, follow the links to the glossary. - Run Bitbake With a Target: + Run BitBake With a Target: Now that a BitBake target exists, run the command and prov= ide that target: @@ -468,7 +468,7 @@ You need to provide your own information for you in the file. - Run Bitbake With a Target: + Run BitBake With a Target: Now that you have supplied the bblayers.conf file, run the bitbake command and pro= vide the target: diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml = b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml index 8f2a960..995c2fa 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-intro.xml @@ -127,7 +127,7 @@ (e.g. Cygwin, the BSDs, and so forth). - Be self contained, rather than tightly + Be self-contained, rather than tightly integrated into the build machine's root filesystem. @@ -221,6 +221,8 @@ them How to configure and compile the source code + How to assemble the generated artifact= s into + one or more installable packages Where on the target machine to install= the package or packages created @@ -229,7 +231,7 @@ Within the context of BitBake, or any project utilizing Bi= tBake as its build system, files with the .bb - extension are referred to as recipes. + extension are referred to as recipes. The term "package" is also commonly used to describe r= ecipes. However, since the same word is used to describe packa= ged @@ -252,9 +254,9 @@ various configuration variables that govern the project's = build process. These files fall into several areas that define - machine configuration options, distribution configuration - options, compiler tuning options, general common - configuration options, and user configuration options. + machine configuration, distribution configuration, + possible compiler tuning, general common + configuration, and user configuration. The main configuration file is the sample bitbake.conf file, which is located within the BitBake source tree @@ -292,7 +294,7 @@ Layers allow you to isolate different types of customizations from each other. While you might find it tempting to keep everything in one= layer - when working on a single project, the more modular you org= anize + when working on a single project, the more modular your metadata, the easier it is to cope with future change= s. =20 @@ -300,8 +302,8 @@ To illustrate how you can use layers to keep things modula= r, consider customizations you might make to support a specif= ic target machine. These types of customizations typically reside in a specia= l layer, - rather than a general layer, called a Board Support Packag= e (BSP) - Layer. + rather than a general layer, called a Board Sup= port Package (BSP) + layer. Furthermore, the machine customizations should be isolated= from recipes and metadata that support a new GUI environment, f= or example. @@ -448,7 +450,7 @@ Using the BitBake that Comes Wit= h Your Build Checkout: A final possibility for getting a copy of BitBake is t= hat it - already comes with your checkout of a larger Bitbake-b= ased build + already comes with your checkout of a larger BitBake-b= ased build system, such as Poky. Rather than manually checking out individual layers an= d gluing them together yourself, you can check @@ -692,14 +694,9 @@ =20 - When you generate a dependency graph, BitBake writes t= hree files + When you generate a dependency graph, BitBake writes t= wo files to the current working directory: - - recipe-depends.dot: - Shows dependencies between recipes (i.e. a col= lapsed version of - task-depends.dot). - task-depends.dot: Shows dependencies between tasks. diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.x= ml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml index 421364c..0ca5321 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml @@ -5,7 +5,7 @@ Syntax and Operators =20 - Bitbake files have their own syntax. + BitBake files have their own syntax. The syntax has similarities to several other languages but also has some unique features. This section describes the available syntax and operators @@ -294,17 +294,20 @@ rather than when the variable is actually used: T =3D "123" - A :=3D "${B} ${A} test ${T}" + A :=3D "test ${T}" T =3D "456" - B =3D "${T} bval" + B :=3D "${T} ${C}" C =3D "cval" C :=3D "${C}append" In this example, A contains - "test 123" because ${B} and - ${A} at the time of parsing are undef= ined, - which leaves "test 123". - And, the variable C + "test 123", even though the final value of T + is "456". + The variable B will end up containing= "456 cvalappend". + This is because references to undefined variables are pres= erved as is + during (immediate)expansion. This is in contrast to GNU Ma= ke, where undefined + variables expand to nothing. + The variable C contains "cvalappend" since ${C} imme= diately expands to "cval". @@ -429,7 +432,7 @@ The variable FOO becomes "  789 123456    " and FOO2 becomes - "     jkl  abcdef =      ". + "     abcdef   &nb= sp;  ". =20 @@ -1414,7 +1417,7 @@ =20
- Bitbake-Style Python Functions Versus Python Functions<= /title> + <title>BitBake-Style Python Functions Versus Python Functions<= /title> =20 <para> Following are some important differences between @@ -1864,7 +1867,7 @@ accessing your <filename>$HOME/.ccache</filename> directory. The following command "whitelists" the environment= variable - <filename>CCACHE_DIR</filename> causing BitBack to= allow that + <filename>CCACHE_DIR</filename> causing BitBake to= allow that variable into the datastore: <literallayout class=3D'monospaced'> export BB_ENV_EXTRAWHITE=3D"$BB_ENV_EXTRAWHITE CCACHE_DIR" @@ -1895,7 +1898,7 @@ <para> Sometimes, it is useful to be able to obtain information from the original execution environment. - Bitbake saves a copy of the original environment into + BitBake saves a copy of the original environment into a special variable named <link linkend=3D'var-bb-BB_ORIGENV'><filename>BB_ORIGENV</= filename></link>. </para> @@ -2523,6 +2526,9 @@ In the previous example, the <filename>do_packagedata</fil= ename> task of each item in <filename>RDEPENDS</filename> must ha= ve completed before <filename>do_package_qa</filename> can ex= ecute. + Although <filename>RDEPENDS</filename> contains entries fr= om the + runtime dependency namespace, BitBake knows how to map the= m back + to the build-time dependency namespace, in which the tasks= are defined. </para> </section> =20 @@ -2559,15 +2565,17 @@ </para> =20 <para> - You might want to not only have BitBake look for - dependencies of those tasks, but also have BitBake look - for build-time and runtime dependencies of the dependent - tasks as well. - If that is the case, you need to reference the task name - itself in the task list: + BitBake allows a task to recursively depend on itself by + referencing itself in the task list: <literallayout class=3D'monospaced'> do_a[recrdeptask] =3D "do_a do_b" </literallayout> + In the same way as before, this means that the <filename>d= o_a</filename> + and <filename>do_b</filename> tasks of the current recipe = and all + recipes reachable (by way of dependencies) from the recipe + must run before the <filename>do_a</filename> task can run= . In this + case BitBake will ignore the current recipe's <filename>do= _a</filename> + task circular dependency on itself. </para> </section> =20 @@ -2616,7 +2624,7 @@ <para> It is often necessary to access variables in the BitBake datastore using Python functions. - The Bitbake datastore has an API that allows you this + The BitBake datastore has an API that allows you this access. Here is a list of available operations: </para> diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variab= les.xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables= .xml index aca6741..c4bd1f2 100644 --- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml +++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml @@ -539,6 +539,17 @@ </glossdef> </glossentry> =20 + <glossentry id=3D'var-bb-BB_LOGCONFIG'><glossterm>BB_LOGCONFIG</gl= ossterm> + <glossdef> + <para> + Specifies the name of a config file that contains the = user + logging configuration. See + <link linkend=3D"logging">Logging</link> for additiona= l + information + </para> + </glossdef> + </glossentry> + <glossentry id=3D'var-bb-BB_LOGFMT'><glossterm>BB_LOGFMT</glosster= m> <glossdef> <para> @@ -1780,7 +1791,7 @@ </para> =20 <para> - Bitbake normally issues a warning when building two + BitBake normally issues a warning when building two different recipes where each provides the same output. This scenario is usually something the user does not want. diff --git a/bitbake/lib/bb/COW.py b/bitbake/lib/bb/COW.py index d26e981..bc20ce3 100644 --- a/bitbake/lib/bb/COW.py +++ b/bitbake/lib/bb/COW.py @@ -10,7 +10,6 @@ =20 =20 import copy -import types ImmutableTypes =3D ( bool, complex, diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index c144311..b96466e 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py @@ -9,11 +9,11 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -__version__ =3D "1.44.0" +__version__ =3D "1.46.0" =20 import sys -if sys.version_info < (3, 4, 0): - raise RuntimeError("Sorry, python 3.4.0 or later is required for this = version of bitbake") +if sys.version_info < (3, 5, 0): + raise RuntimeError("Sorry, python 3.5.0 or later is required for this = version of bitbake") =20 =20 class BBHandledException(Exception): @@ -43,7 +43,13 @@ class BBLogger(Logger): Logger.__init__(self, name) =20 def bbdebug(self, level, msg, *args, **kwargs): - return self.log(logging.DEBUG - level + 1, msg, *args, **kwargs) + loglevel =3D logging.DEBUG - level + 1 + if not bb.event.worker_pid: + if self.name in bb.msg.loggerDefaultDomains and loglevel > (bb= .msg.loggerDefaultDomains[self.name]): + return + if loglevel > bb.msg.loggerDefaultLogLevel: + return + return self.log(loglevel, msg, *args, **kwargs) =20 def plain(self, msg, *args, **kwargs): return self.log(logging.INFO + 1, msg, *args, **kwargs) diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py index 30a2ba2..23b6ee4 100644 --- a/bitbake/lib/bb/build.py +++ b/bitbake/lib/bb/build.py @@ -15,7 +15,6 @@ import os import sys import logging -import shlex import glob import time import stat @@ -57,14 +56,17 @@ builtins['os'] =3D os class TaskBase(event.Event): """Base class for task events""" =20 - def __init__(self, t, logfile, d): + def __init__(self, t, fn, logfile, d): self._task =3D t + self._fn =3D fn self._package =3D d.getVar("PF") self._mc =3D d.getVar("BB_CURRENT_MC") self.taskfile =3D d.getVar("FILE") self.taskname =3D self._task self.logfile =3D logfile self.time =3D time.time() + self.pn =3D d.getVar("PN") + self.pv =3D d.getVar("PV") event.Event.__init__(self) self._message =3D "recipe %s: task %s: %s" % (d.getVar("PF"), t, s= elf.getDisplayName()) =20 @@ -81,8 +83,8 @@ class TaskBase(event.Event): =20 class TaskStarted(TaskBase): """Task execution started""" - def __init__(self, t, logfile, taskflags, d): - super(TaskStarted, self).__init__(t, logfile, d) + def __init__(self, t, fn, logfile, taskflags, d): + super(TaskStarted, self).__init__(t, fn, logfile, d) self.taskflags =3D taskflags =20 class TaskSucceeded(TaskBase): @@ -91,9 +93,9 @@ class TaskSucceeded(TaskBase): class TaskFailed(TaskBase): """Task execution failed""" =20 - def __init__(self, task, logfile, metadata, errprinted =3D False): + def __init__(self, task, fn, logfile, metadata, errprinted =3D False): self.errprinted =3D errprinted - super(TaskFailed, self).__init__(task, logfile, metadata) + super(TaskFailed, self).__init__(task, fn, logfile, metadata) =20 class TaskFailedSilent(TaskBase): """Task execution failed (silently)""" @@ -103,8 +105,8 @@ class TaskFailedSilent(TaskBase): =20 class TaskInvalid(TaskBase): =20 - def __init__(self, task, metadata): - super(TaskInvalid, self).__init__(task, None, metadata) + def __init__(self, task, fn, metadata): + super(TaskInvalid, self).__init__(task, fn, None, metadata) self._message =3D "No such task '%s'" % task =20 class TaskProgress(event.Event): @@ -572,7 +574,7 @@ def _exec_task(fn, task, d, quieterr): =20 try: try: - event.fire(TaskStarted(task, logfn, flags, localdata), localda= ta) + event.fire(TaskStarted(task, fn, logfn, flags, localdata), loc= aldata) except (bb.BBHandledException, SystemExit): return 1 =20 @@ -583,15 +585,15 @@ def _exec_task(fn, task, d, quieterr): for func in (postfuncs or '').split(): exec_func(func, localdata) except bb.BBHandledException: - event.fire(TaskFailed(task, logfn, localdata, True), localdata= ) + event.fire(TaskFailed(task, fn, logfn, localdata, True), local= data) return 1 except Exception as exc: if quieterr: - event.fire(TaskFailedSilent(task, logfn, localdata), local= data) + event.fire(TaskFailedSilent(task, fn, logfn, localdata), l= ocaldata) else: errprinted =3D errchk.triggered logger.error(str(exc)) - event.fire(TaskFailed(task, logfn, localdata, errprinted),= localdata) + event.fire(TaskFailed(task, fn, logfn, localdata, errprint= ed), localdata) return 1 finally: sys.stdout.flush() @@ -614,7 +616,7 @@ def _exec_task(fn, task, d, quieterr): logger.debug(2, "Zero size logfn %s, removing", logfn) bb.utils.remove(logfn) bb.utils.remove(loglink) - event.fire(TaskSucceeded(task, logfn, localdata), localdata) + event.fire(TaskSucceeded(task, fn, logfn, localdata), localdata) =20 if not localdata.getVarFlag(task, 'nostamp', False) and not localdata.= getVarFlag(task, 'selfstamp', False): make_stamp(task, localdata) diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py index b6f7da5..d1be836 100644 --- a/bitbake/lib/bb/cache.py +++ b/bitbake/lib/bb/cache.py @@ -17,11 +17,11 @@ # =20 import os -import sys import logging import pickle from collections import defaultdict import bb.utils +import re =20 logger =3D logging.getLogger("BitBake.Cache") =20 @@ -208,10 +208,10 @@ class CoreRecipeInfo(RecipeInfoCommon): =20 # Collect files we may need for possible world-dep # calculations - if self.not_world: - logger.debug(1, "EXCLUDE FROM WORLD: %s", fn) - else: + if not self.not_world: cachedata.possible_world.append(fn) + #else: + # logger.debug(2, "EXCLUDE FROM WORLD: %s", fn) =20 # create a collection of all targets for sanity checking # tasks, such as upstream versions, license, and tools for @@ -370,6 +370,7 @@ class Cache(NoCache): self.data_fn =3D None self.cacheclean =3D True self.data_hash =3D data_hash + self.filelist_regex =3D re.compile(r'(?:(?<=3D:True)|(?<=3D:False)= )\s+') =20 if self.cachedir in [None, '']: self.has_cache =3D False @@ -608,20 +609,12 @@ class Cache(NoCache): if hasattr(info_array[0], 'file_checksums'): for _, fl in info_array[0].file_checksums.items(): fl =3D fl.strip() - while fl: - # A .split() would be simpler but means spaces or colo= ns in filenames would break - a =3D fl.find(":True") - b =3D fl.find(":False") - if ((a < 0) and b) or ((b > 0) and (b < a)): - f =3D fl[:b+6] - fl =3D fl[b+7:] - elif ((b < 0) and a) or ((a > 0) and (a < b)): - f =3D fl[:a+5] - fl =3D fl[a+6:] - else: - break - fl =3D fl.strip() - if "*" in f: + if not fl: + continue + # Have to be careful about spaces and colons in filenames + flist =3D self.filelist_regex.split(fl) + for f in flist: + if not f or "*" in f: continue f, exist =3D f.split(":") if (exist =3D=3D "True" and not os.path.exists(f)) or = (exist =3D=3D "False" and os.path.exists(f)): diff --git a/bitbake/lib/bb/checksum.py b/bitbake/lib/bb/checksum.py index 5bc8a8f..1d50a26 100644 --- a/bitbake/lib/bb/checksum.py +++ b/bitbake/lib/bb/checksum.py @@ -9,7 +9,6 @@ import glob import operator import os import stat -import pickle import bb.utils import logging from bb.cache import MultiProcessCache @@ -74,7 +73,7 @@ class FileChecksumCache(MultiProcessCache): else: dest[0][h] =3D source[0][h] =20 - def get_checksums(self, filelist, pn): + def get_checksums(self, filelist, pn, localdirsexclude): """Get checksums for a list of files""" =20 def checksum_file(f): @@ -90,7 +89,8 @@ class FileChecksumCache(MultiProcessCache): if pth =3D=3D "/": bb.fatal("Refusing to checksum /") dirchecksums =3D [] - for root, dirs, files in os.walk(pth): + for root, dirs, files in os.walk(pth, topdown=3DTrue): + [dirs.remove(d) for d in list(dirs) if d in localdirsexclu= de] for name in files: fullpth =3D os.path.join(root, name) checksum =3D checksum_file(fullpth) diff --git a/bitbake/lib/bb/codeparser.py b/bitbake/lib/bb/codeparser.py index fd2c473..25a7ac6 100644 --- a/bitbake/lib/bb/codeparser.py +++ b/bitbake/lib/bb/codeparser.py @@ -25,13 +25,11 @@ import ast import sys import codegen import logging -import pickle import bb.pysh as pysh -import os.path import bb.utils, bb.data import hashlib from itertools import chain -from bb.pysh import pyshyacc, pyshlex, sherrors +from bb.pysh import pyshyacc, pyshlex from bb.cache import MultiProcessCache =20 logger =3D logging.getLogger('BitBake.CodeParser') @@ -58,30 +56,10 @@ def check_indent(codestr): =20 return codestr =20 - -# Basically pickle, in python 2.7.3 at least, does badly with data duplica= tion=20 -# upon pickling and unpickling. Combine this with duplicate objects and th= ings -# are a mess. -# -# When the sets are originally created, python calls intern() on the set k= eys -# which significantly improves memory usage. Sadly the pickle/unpickle pro= cess -# doesn't call intern() on the keys and results in the same strings being = duplicated -# in memory. This also means pickle will save the same string multiple tim= es in -# the cache file. -# -# By having shell and python cacheline objects with setstate/getstate, we = force -# the object creation through our own routine where we can call intern (vi= a internSet). -# -# We also use hashable frozensets and ensure we use references to these so= that -# duplicates can be removed, both in memory and in the resulting pickled d= ata. -# -# By playing these games, the size of the cache file shrinks dramatically -# meaning faster load times and the reloaded cache files also consume much= less -# memory. Smaller cache files, faster load times and lower memory usage is= good. -# # A custom getstate/setstate using tuples is actually worth 15% cachesize = by # avoiding duplication of the attribute names! =20 + class SetCache(object): def __init__(self): self.setcache =3D {} diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py index 378f389..6abf386 100644 --- a/bitbake/lib/bb/command.py +++ b/bitbake/lib/bb/command.py @@ -65,7 +65,7 @@ class Command: # Can run synchronous commands straight away command_method =3D getattr(self.cmds_sync, command) if ro_only: - if not hasattr(command_method, 'readonly') or False =3D=3D= getattr(command_method, 'readonly'): + if not hasattr(command_method, 'readonly') or not getattr(= command_method, 'readonly'): return None, "Not able to execute not readonly command= s in readonly mode" try: self.cooker.process_inotify_updates() @@ -414,7 +414,11 @@ class CommandsSync: getAllAppends.readonly =3D True =20 def findProviders(self, command, params): - return command.cooker.findProviders() + try: + mc =3D params[0] + except IndexError: + mc =3D '' + return command.cooker.findProviders(mc) findProviders.readonly =3D True =20 def findBestProvider(self, command, params): @@ -446,54 +450,38 @@ class CommandsSync: return all_p, best getRuntimeProviders.readonly =3D True =20 - def dataStoreConnectorFindVar(self, command, params): + def dataStoreConnectorCmd(self, command, params): dsindex =3D params[0] - name =3D params[1] - datastore =3D command.remotedatastores[dsindex] - value, overridedata =3D datastore._findVar(name) - - if value: - content =3D value.get('_content', None) - if isinstance(content, bb.data_smart.DataSmart): - # Value is a datastore (e.g. BB_ORIGENV) - need to handle = this carefully - idx =3D command.remotedatastores.check_store(content, True= ) - return {'_content': DataStoreConnectionHandle(idx), - '_connector_origtype': 'DataStoreConnectionHandle'= , - '_connector_overrides': overridedata} - elif isinstance(content, set): - return {'_content': list(content), - '_connector_origtype': 'set', - '_connector_overrides': overridedata} - else: - value['_connector_overrides'] =3D overridedata - else: - value =3D {} - value['_connector_overrides'] =3D overridedata - return value - dataStoreConnectorFindVar.readonly =3D True + method =3D params[1] + args =3D params[2] + kwargs =3D params[3] =20 - def dataStoreConnectorGetKeys(self, command, params): - dsindex =3D params[0] - datastore =3D command.remotedatastores[dsindex] - return list(datastore.keys()) - dataStoreConnectorGetKeys.readonly =3D True + d =3D command.remotedatastores[dsindex] + ret =3D getattr(d, method)(*args, **kwargs) + + if isinstance(ret, bb.data_smart.DataSmart): + idx =3D command.remotedatastores.store(ret) + return DataStoreConnectionHandle(idx) + + return ret =20 - def dataStoreConnectorGetVarHistory(self, command, params): + def dataStoreConnectorVarHistCmd(self, command, params): dsindex =3D params[0] - name =3D params[1] - datastore =3D command.remotedatastores[dsindex] - return datastore.varhistory.variable(name) - dataStoreConnectorGetVarHistory.readonly =3D True + method =3D params[1] + args =3D params[2] + kwargs =3D params[3] =20 - def dataStoreConnectorExpandPythonRef(self, command, params): - config_data_dict =3D params[0] - varname =3D params[1] - expr =3D params[2] + d =3D command.remotedatastores[dsindex].varhistory + return getattr(d, method)(*args, **kwargs) =20 - config_data =3D command.remotedatastores.receive_datastore(config_= data_dict) + def dataStoreConnectorIncHistCmd(self, command, params): + dsindex =3D params[0] + method =3D params[1] + args =3D params[2] + kwargs =3D params[3] =20 - varparse =3D bb.data_smart.VariableParse(varname, config_data) - return varparse.python_sub(expr) + d =3D command.remotedatastores[dsindex].inchistory + return getattr(d, method)(*args, **kwargs) =20 def dataStoreConnectorRelease(self, command, params): dsindex =3D params[0] @@ -501,31 +489,6 @@ class CommandsSync: raise CommandError('dataStoreConnectorRelease: invalid index %= d' % dsindex) command.remotedatastores.release(dsindex) =20 - def dataStoreConnectorSetVarFlag(self, command, params): - dsindex =3D params[0] - name =3D params[1] - flag =3D params[2] - value =3D params[3] - datastore =3D command.remotedatastores[dsindex] - datastore.setVarFlag(name, flag, value) - - def dataStoreConnectorDelVar(self, command, params): - dsindex =3D params[0] - name =3D params[1] - datastore =3D command.remotedatastores[dsindex] - if len(params) > 2: - flag =3D params[2] - datastore.delVarFlag(name, flag) - else: - datastore.delVar(name) - - def dataStoreConnectorRenameVar(self, command, params): - dsindex =3D params[0] - name =3D params[1] - newname =3D params[2] - datastore =3D command.remotedatastores[dsindex] - datastore.renameVar(name, newname) - def parseRecipeFile(self, command, params): """ Parse the specified recipe file (with or without bbappends) @@ -536,8 +499,7 @@ class CommandsSync: appends =3D params[1] appendlist =3D params[2] if len(params) > 3: - config_data_dict =3D params[3] - config_data =3D command.remotedatastores.receive_datastore(con= fig_data_dict) + config_data =3D command.remotedatastores[params[3]] else: config_data =3D None =20 diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 20ef04d..d90bd39 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -10,7 +10,6 @@ # =20 import sys, os, glob, os.path, re, time -import atexit import itertools import logging import multiprocessing @@ -18,14 +17,11 @@ import sre_constants import threading from io import StringIO, UnsupportedOperation from contextlib import closing -from functools import wraps from collections import defaultdict, namedtuple import bb, bb.exceptions, bb.command from bb import utils, data, parse, event, cache, providers, taskdata, runq= ueue, build import queue import signal -import subprocess -import errno import prserv.serv import pyinotify import json @@ -169,8 +165,8 @@ class BBCooker: bb.debug(1, "BBCooker pyinotify1 %s" % time.time()) sys.stdout.flush() =20 - self.configwatcher.bbseen =3D [] - self.configwatcher.bbwatchedfiles =3D [] + self.configwatcher.bbseen =3D set() + self.configwatcher.bbwatchedfiles =3D set() self.confignotifier =3D pyinotify.Notifier(self.configwatcher, sel= f.config_notifications) bb.debug(1, "BBCooker pyinotify2 %s" % time.time()) sys.stdout.flush() @@ -180,8 +176,8 @@ class BBCooker: self.watcher =3D pyinotify.WatchManager() bb.debug(1, "BBCooker pyinotify3 %s" % time.time()) sys.stdout.flush() - self.watcher.bbseen =3D [] - self.watcher.bbwatchedfiles =3D [] + self.watcher.bbseen =3D set() + self.watcher.bbwatchedfiles =3D set() self.notifier =3D pyinotify.Notifier(self.watcher, self.notificati= ons) =20 bb.debug(1, "BBCooker pyinotify complete %s" % time.time()) @@ -278,14 +274,14 @@ class BBCooker: if not watcher: watcher =3D self.watcher for i in deps: - watcher.bbwatchedfiles.append(i[0]) + watcher.bbwatchedfiles.add(i[0]) if dirs: f =3D i[0] else: f =3D os.path.dirname(i[0]) if f in watcher.bbseen: continue - watcher.bbseen.append(f) + watcher.bbseen.add(f) watchtarget =3D None while True: # We try and add watches for files that don't exist but if= they did, would influence @@ -294,7 +290,7 @@ class BBCooker: try: watcher.add_watch(f, self.watchmask, quiet=3DFalse) if watchtarget: - watcher.bbwatchedfiles.append(watchtarget) + watcher.bbwatchedfiles.add(watchtarget) break except pyinotify.WatchManagerError as e: if 'ENOENT' in str(e): @@ -302,7 +298,7 @@ class BBCooker: f =3D os.path.dirname(f) if f in watcher.bbseen: break - watcher.bbseen.append(f) + watcher.bbseen.add(f) continue if 'ENOSPC' in str(e): providerlog.error("No space left on device or exce= eds fs.inotify.max_user_watches?") @@ -371,10 +367,6 @@ class BBCooker: =20 self.data.setVar('BB_CMDLINE', self.ui_cmdline) =20 - # - # Copy of the data store which has been expanded. - # Used for firing events and accessing variables where expansion n= eeds to be accounted for - # if CookerFeatures.BASEDATASTORE_TRACKING in self.featureset: self.disableDataTracking() =20 @@ -1031,16 +1023,16 @@ class BBCooker: bb.event.fire(bb.event.FilesMatchingFound(filepattern, matches= ), self.data) =20 def findProviders(self, mc=3D''): - return bb.providers.findProviders(self.data, self.recipecaches[mc]= , self.recipecaches[mc].pkg_pn) + return bb.providers.findProviders(self.databuilder.mcdata[mc], sel= f.recipecaches[mc], self.recipecaches[mc].pkg_pn) =20 def findBestProvider(self, pn, mc=3D''): if pn in self.recipecaches[mc].providers: filenames =3D self.recipecaches[mc].providers[pn] - eligible, foundUnique =3D bb.providers.filterProviders(filenam= es, pn, self.data, self.recipecaches[mc]) + eligible, foundUnique =3D bb.providers.filterProviders(filenam= es, pn, self.databuilder.mcdata[mc], self.recipecaches[mc]) filename =3D eligible[0] return None, None, None, filename elif pn in self.recipecaches[mc].pkg_pn: - return bb.providers.findBestProvider(pn, self.data, self.recip= ecaches[mc], self.recipecaches[mc].pkg_pn) + return bb.providers.findBestProvider(pn, self.databuilder.mcda= ta[mc], self.recipecaches[mc], self.recipecaches[mc].pkg_pn) else: return None, None, None, None =20 @@ -1212,7 +1204,7 @@ class BBCooker: for c in collection_list: calc_layer_priority(c) regex =3D self.data.getVar("BBFILE_PATTERN_%s" % c) - if regex =3D=3D None: + if regex is None: parselog.error("BBFILE_PATTERN_%s not defined" % c) errors =3D True continue @@ -1318,7 +1310,7 @@ class BBCooker: self.parseConfiguration() =20 # If we are told to do the None task then query the default task - if (task =3D=3D None): + if task is None: task =3D self.configuration.cmd if not task.startswith("do_"): task =3D "do_%s" % task @@ -1462,7 +1454,7 @@ class BBCooker: self.buildSetVars() =20 # If we are told to do the None task then query the default task - if (task =3D=3D None): + if task is None: task =3D self.configuration.cmd =20 if not task.startswith("do_"): @@ -1600,7 +1592,7 @@ class BBCooker: raise NothingToBuild =20 ignore =3D (self.data.getVar("ASSUME_PROVIDED") or "").split() - for pkg in pkgs_to_build: + for pkg in pkgs_to_build.copy(): if pkg in ignore: parselog.warning("Explicit target \"%s\" is in ASSUME_PROV= IDED, ignoring" % pkg) if pkg.startswith("multiconfig:"): @@ -1673,6 +1665,8 @@ class BBCooker: self.command.reset() self.databuilder.reset() self.data =3D self.databuilder.data + self.parsecache_valid =3D False + self.baseconfig_valid =3D False =20 =20 class CookerExit(bb.event.Event): @@ -1695,7 +1689,7 @@ class CookerCollectFiles(object): def calc_bbfile_priority( self, filename, matched =3D None ): for _, _, regex, pri in self.bbfile_config_priorities: if regex.match(filename): - if matched !=3D None: + if matched is not None: if not regex in matched: matched.add(regex) return pri @@ -1792,7 +1786,7 @@ class CookerCollectFiles(object): # When constructing an older style single regex, it's poss= ible for BBMASK # to end up beginning with '|', which matches and masks _e= verything_. if mask.startswith("|"): - collectlog.warn("BBMASK contains regular expression be= ginning with '|', fixing: %s" % mask) + collectlog.warning("BBMASK contains regular expression= beginning with '|', fixing: %s" % mask) mask =3D mask[1:] try: re.compile(mask) @@ -1948,7 +1942,8 @@ class Parser(multiprocessing.Process): except IndexError: break result =3D self.parse(*job) - + # Clear the siggen cache after parsing to control memory u= sage, its huge + bb.parse.siggen.postparsing_clean_cache() try: self.results.put(result, timeout=3D0.25) except queue.Full: @@ -1956,6 +1951,7 @@ class Parser(multiprocessing.Process): =20 def parse(self, filename, appends): try: + origfilter =3D bb.event.LogHandler.filter # Record the filename we're parsing into any events generated def parse_filter(self, record): record.taskpid =3D bb.event.worker_pid @@ -1978,6 +1974,8 @@ class Parser(multiprocessing.Process): # a SystemExit event for example. except BaseException as exc: return True, ParsingFailure(exc, filename) + finally: + bb.event.LogHandler.filter =3D origfilter =20 class CookerParser(object): def __init__(self, cooker, filelist, masked): diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py index 0d75d0c..b0683c5 100644 --- a/bitbake/lib/bb/data.py +++ b/bitbake/lib/bb/data.py @@ -79,7 +79,7 @@ def expand(s, d, varname =3D None): return d.expand(s, varname) =20 def expandKeys(alterdata, readdata =3D None): - if readdata =3D=3D None: + if readdata is None: readdata =3D alterdata =20 todolist =3D {} @@ -365,7 +365,7 @@ def build_dependencies(key, keys, shelldeps, varflagsex= cl, d): #bb.note("Variable %s references %s and calls %s" % (key, str(deps), s= tr(execs))) #d.setVarFlag(key, "vardeps", deps) =20 -def generate_dependencies(d): +def generate_dependencies(d, whitelist): =20 keys =3D set(key for key in d if not key.startswith("__")) shelldeps =3D set(key for key in d.getVar("__exportlist", False) if d.= getVarFlag(key, "export", False) and not d.getVarFlag(key, "unexport", Fals= e)) @@ -380,7 +380,7 @@ def generate_dependencies(d): newdeps =3D deps[task] seen =3D set() while newdeps: - nextdeps =3D newdeps + nextdeps =3D newdeps - whitelist seen |=3D nextdeps newdeps =3D set() for dep in nextdeps: diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index dd5c618..7f1b6dc 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py @@ -107,10 +107,6 @@ class VariableParse: else: code =3D match.group()[3:-1] =20 - if "_remote_data" in self.d: - connector =3D self.d["_remote_data"] - return connector.expandPythonRef(self.varname, code, self.= d) - if self.varname: varname =3D 'Var <%s>' % self.varname else: @@ -268,12 +264,7 @@ class VariableHistory(object): self.variables[newvar].append(i.copy()) =20 def variable(self, var): - remote_connector =3D self.dataroot.getVar('_remote_data', False) - if remote_connector: - varhistory =3D remote_connector.getVarHistory(var) - else: - varhistory =3D [] - + varhistory =3D [] if var in self.variables: varhistory.extend(self.variables[var]) return varhistory @@ -338,11 +329,12 @@ class VariableHistory(object): lines.append(line) return lines =20 - def get_variable_items_files(self, var, d): + def get_variable_items_files(self, var): """ Use variable history to map items added to a list variable and the files in which they were added. """ + d =3D self.dataroot history =3D self.variable(var) finalitems =3D (d.getVar(var) or '').split() filemap =3D {} @@ -470,10 +462,6 @@ class DataSmart(MutableMapping): if var in dest: return dest[var], self.overridedata.get(var, None) =20 - if "_remote_data" in dest: - connector =3D dest["_remote_data"]["_content"] - return connector.getVar(var) - if "_data" not in dest: break dest =3D dest["_data"] @@ -498,12 +486,6 @@ class DataSmart(MutableMapping): if 'parsing' in loginfo: parsing=3DTrue =20 - if '_remote_data' in self.dict: - connector =3D self.dict["_remote_data"]["_content"] - res =3D connector.setVar(var, value) - if not res: - return - if 'op' not in loginfo: loginfo['op'] =3D "set" =20 @@ -607,11 +589,9 @@ class DataSmart(MutableMapping): """ Rename the variable key to newkey """ - if '_remote_data' in self.dict: - connector =3D self.dict["_remote_data"]["_content"] - res =3D connector.renameVar(key, newkey) - if not res: - return + if key =3D=3D newkey: + bb.warn("Calling renameVar with equivalent keys (%s) is invali= d" % key) + return =20 val =3D self.getVar(key, 0, parsing=3DTrue) if val is not None: @@ -658,11 +638,6 @@ class DataSmart(MutableMapping): =20 def delVar(self, var, **loginfo): self.expand_cache =3D {} - if '_remote_data' in self.dict: - connector =3D self.dict["_remote_data"]["_content"] - res =3D connector.delVar(var) - if not res: - return =20 loginfo['detail'] =3D "" loginfo['op'] =3D 'del' @@ -690,11 +665,6 @@ class DataSmart(MutableMapping): =20 def setVarFlag(self, var, flag, value, **loginfo): self.expand_cache =3D {} - if '_remote_data' in self.dict: - connector =3D self.dict["_remote_data"]["_content"] - res =3D connector.setVarFlag(var, flag, value) - if not res: - return =20 if 'op' not in loginfo: loginfo['op'] =3D "set" @@ -845,11 +815,6 @@ class DataSmart(MutableMapping): =20 def delVarFlag(self, var, flag, **loginfo): self.expand_cache =3D {} - if '_remote_data' in self.dict: - connector =3D self.dict["_remote_data"]["_content"] - res =3D connector.delVarFlag(var, flag) - if not res: - return =20 local_var, _ =3D self._findVar(var) if not local_var: @@ -967,7 +932,7 @@ class DataSmart(MutableMapping): =20 def localkeys(self): for key in self.dict: - if key not in ['_data', '_remote_data']: + if key not in ['_data']: yield key =20 def __iter__(self): @@ -976,7 +941,7 @@ class DataSmart(MutableMapping): def keylist(d): =20 klist =3D set() for key in d: - if key in ["_data", "_remote_data"]: + if key in ["_data"]: continue if key in deleted: continue @@ -990,13 +955,6 @@ class DataSmart(MutableMapping): if "_data" in d: klist |=3D keylist(d["_data"]) =20 - if "_remote_data" in d: - connector =3D d["_remote_data"]["_content"] - for key in connector.getKeys(): - if key in deleted: - continue - klist.add(key) - return klist =20 self.need_overrides() @@ -1042,7 +1000,10 @@ class DataSmart(MutableMapping): continue =20 value =3D d.getVar(key, False) or "" - data.update({key:value}) + if type(value) is type(self): + data.update({key:value.get_hash()}) + else: + data.update({key:value}) =20 varflags =3D d.getVarFlags(key, internalflags =3D True) if not varflags: diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index d44621e..d1359f0 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py @@ -10,8 +10,7 @@ BitBake build tools. # SPDX-License-Identifier: GPL-2.0-only # =20 -import os, sys -import warnings +import sys import pickle import logging import atexit @@ -347,7 +346,7 @@ def set_UIHmask(handlerNum, level, debug_domains, mask)= : =20 def getName(e): """Returns the name of a class or class instance""" - if getattr(e, "__name__", None) =3D=3D None: + if getattr(e, "__name__", None) is None: return e.__class__.__name__ else: return e.__name__ @@ -509,7 +508,7 @@ class NoProvider(Event): extra =3D '' if not self._reasons: if self._close_matches: - extra =3D ". Close matches:\n %s" % '\n '.join(self._clo= se_matches) + extra =3D ". Close matches:\n %s" % '\n '.join(sorted(se= t(self._close_matches))) =20 if self._dependees: msg =3D "Nothing %sPROVIDES '%s' (but %s %sDEPENDS on or other= wise requires it)%s" % (r, self._item, ", ".join(self._dependees), r, extra= ) diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__in= it__.py index 1f5f8f1..eb112f0 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py @@ -33,6 +33,9 @@ _checksum_cache =3D bb.checksum.FileChecksumCache() =20 logger =3D logging.getLogger("BitBake.Fetcher") =20 +CHECKSUM_LIST =3D [ "md5", "sha256", "sha1", "sha384", "sha512" ] +SHOWN_CHECKSUM_LIST =3D ["sha256"] + class BBFetchException(Exception): """Class all fetch exceptions inherit from""" def __init__(self, message): @@ -131,10 +134,9 @@ class NonLocalMethod(Exception): Exception.__init__(self) =20 class MissingChecksumEvent(bb.event.Event): - def __init__(self, url, md5sum, sha256sum): + def __init__(self, url, **checksums): self.url =3D url - self.checksums =3D {'md5sum': md5sum, - 'sha256sum': sha256sum} + self.checksums =3D checksums bb.event.Event.__init__(self) =20 =20 @@ -484,17 +486,22 @@ def fetcher_init(d): Called to initialize the fetchers once the configuration data is known= . Calls before this must not hit the cache. """ + + revs =3D bb.persist_data.persist('BB_URI_HEADREVS', d) + try: + # fetcher_init is called multiple times, so make sure we only save= the + # revs the first time it is called. + if not bb.fetch2.saved_headrevs: + bb.fetch2.saved_headrevs =3D dict(revs) + except: + pass + # When to drop SCM head revisions controlled by user policy srcrev_policy =3D d.getVar('BB_SRCREV_POLICY') or "clear" if srcrev_policy =3D=3D "cache": logger.debug(1, "Keeping SRCREV cache due to cache policy of: %s",= srcrev_policy) elif srcrev_policy =3D=3D "clear": logger.debug(1, "Clearing SRCREV cache due to cache policy of: %s"= , srcrev_policy) - revs =3D bb.persist_data.persist('BB_URI_HEADREVS', d) - try: - bb.fetch2.saved_headrevs =3D revs.items() - except: - pass revs.clear() else: raise FetchError("Invalid SRCREV cache policy of: %s" % srcrev_pol= icy) @@ -513,22 +520,12 @@ def fetcher_parse_done(): =20 def fetcher_compare_revisions(d): """ - Compare the revisions in the persistant cache with current values and - return true/false on whether they've changed. + Compare the revisions in the persistent cache with the saved values fr= om + when bitbake was started and return true if they have changed. """ =20 - data =3D bb.persist_data.persist('BB_URI_HEADREVS', d).items() - data2 =3D bb.fetch2.saved_headrevs - - changed =3D False - for key in data: - if key not in data2 or data2[key] !=3D data[key]: - logger.debug(1, "%s changed", key) - changed =3D True - return True - else: - logger.debug(2, "%s did not change", key) - return False + headrevs =3D dict(bb.persist_data.persist('BB_URI_HEADREVS', d)) + return headrevs !=3D bb.fetch2.saved_headrevs =20 def mirror_from_string(data): mirrors =3D (data or "").replace('\\n',' ').split() @@ -552,71 +549,84 @@ def verify_checksum(ud, d, precomputed=3D{}): downloading. See https://bugzilla.yoctoproject.org/show_bug.cgi?id=3D5= 571. """ =20 - _MD5_KEY =3D "md5" - _SHA256_KEY =3D "sha256" - if ud.ignore_checksums or not ud.method.supports_checksum(ud): return {} =20 - if _MD5_KEY in precomputed: - md5data =3D precomputed[_MD5_KEY] - else: - md5data =3D bb.utils.md5_file(ud.localpath) + def compute_checksum_info(checksum_id): + checksum_name =3D getattr(ud, "%s_name" % checksum_id) =20 - if _SHA256_KEY in precomputed: - sha256data =3D precomputed[_SHA256_KEY] - else: - sha256data =3D bb.utils.sha256_file(ud.localpath) + if checksum_id in precomputed: + checksum_data =3D precomputed[checksum_id] + else: + checksum_data =3D getattr(bb.utils, "%s_file" % checksum_id)(u= d.localpath) =20 - if ud.method.recommends_checksum(ud) and not ud.md5_expected and not u= d.sha256_expected: - # If strict checking enabled and neither sum defined, raise error + checksum_expected =3D getattr(ud, "%s_expected" % checksum_id) + + return { + "id": checksum_id, + "name": checksum_name, + "data": checksum_data, + "expected": checksum_expected + } + + checksum_infos =3D [] + for checksum_id in CHECKSUM_LIST: + checksum_infos.append(compute_checksum_info(checksum_id)) + + checksum_dict =3D {ci["id"] : ci["data"] for ci in checksum_infos} + checksum_event =3D {"%ssum" % ci["id"] : ci["data"] for ci in checksum= _infos} + + for ci in checksum_infos: + if ci["id"] in SHOWN_CHECKSUM_LIST: + checksum_lines =3D ["SRC_URI[%s] =3D \"%s\"" % (ci["name"], ci= ["data"])] + + # If no checksum has been provided + if ud.method.recommends_checksum(ud) and all(ci["expected"] is None fo= r ci in checksum_infos): + messages =3D [] strict =3D d.getVar("BB_STRICT_CHECKSUM") or "0" + + # If strict checking enabled and neither sum defined, raise error if strict =3D=3D "1": - logger.error('No checksum specified for %s, please add at leas= t one to the recipe:\n' - 'SRC_URI[%s] =3D "%s"\nSRC_URI[%s] =3D "%s"' = % - (ud.localpath, ud.md5_name, md5data, - ud.sha256_name, sha256data)) - raise NoChecksumError('Missing SRC_URI checksum', ud.url) + messages.append("No checksum specified for '%s', please add at= " \ + "least one to the recipe:" % ud.localpath) + messages.extend(checksum_lines) + logger.error("\n".join(messages)) + raise NoChecksumError("Missing SRC_URI checksum", ud.url) =20 - bb.event.fire(MissingChecksumEvent(ud.url, md5data, sha256data), d= ) + bb.event.fire(MissingChecksumEvent(ud.url, **checksum_event), d) =20 if strict =3D=3D "ignore": - return { - _MD5_KEY: md5data, - _SHA256_KEY: sha256data - } + return checksum_dict =20 # Log missing sums so user can more easily add them - logger.warning('Missing md5 SRC_URI checksum for %s, consider addi= ng to the recipe:\n' - 'SRC_URI[%s] =3D "%s"', - ud.localpath, ud.md5_name, md5data) - logger.warning('Missing sha256 SRC_URI checksum for %s, consider a= dding to the recipe:\n' - 'SRC_URI[%s] =3D "%s"', - ud.localpath, ud.sha256_name, sha256data) + messages.append("Missing checksum for '%s', consider adding at " \ + "least one to the recipe:" % ud.localpath) + messages.extend(checksum_lines) + logger.warning("\n".join(messages)) =20 # We want to alert the user if a checksum is defined in the recipe but # it does not match. - msg =3D "" - mismatch =3D False - if ud.md5_expected and ud.md5_expected !=3D md5data: - msg =3D msg + "\nFile: '%s' has %s checksum %s when %s was expecte= d" % (ud.localpath, 'md5', md5data, ud.md5_expected) - mismatch =3D True; - - if ud.sha256_expected and ud.sha256_expected !=3D sha256data: - msg =3D msg + "\nFile: '%s' has %s checksum %s when %s was expecte= d" % (ud.localpath, 'sha256', sha256data, ud.sha256_expected) - mismatch =3D True; - - if mismatch: - msg =3D msg + '\nIf this change is expected (e.g. you have upgrade= d to a new version without updating the checksums) then you can use these l= ines within the recipe:\nSRC_URI[%s] =3D "%s"\nSRC_URI[%s] =3D "%s"\nOtherw= ise you should retry the download and/or check with upstream to determine i= f the file has become corrupted or otherwise unexpectedly modified.\n' % (u= d.md5_name, md5data, ud.sha256_name, sha256data) - - if len(msg): - raise ChecksumError('Checksum mismatch!%s' % msg, ud.url, md5data) - - return { - _MD5_KEY: md5data, - _SHA256_KEY: sha256data - } - + messages =3D [] + messages.append("Checksum mismatch!") + bad_checksum =3D None + + for ci in checksum_infos: + if ci["expected"] and ci["expected"] !=3D ci["data"]: + messages.append("File: '%s' has %s checksum %s when %s was " \ + "expected" % (ud.localpath, ci["id"], ci["data= "], ci["expected"])) + bad_checksum =3D ci["data"] + + if bad_checksum: + messages.append("If this change is expected (e.g. you have upgrade= d " \ + "to a new version without updating the checksums) = " \ + "then you can use these lines within the recipe:") + messages.extend(checksum_lines) + messages.append("Otherwise you should retry the download and/or " = \ + "check with upstream to determine if the file has = " \ + "become corrupted or otherwise unexpectedly modifi= ed.") + raise ChecksumError("\n".join(messages), ud.url, bad_checksum) + + return checksum_dict =20 def verify_donestamp(ud, d, origud=3DNone): """ @@ -1081,7 +1091,7 @@ def try_mirrors(fetch, d, origud, mirrors, check =3D = False): =20 for index, uri in enumerate(uris): ret =3D try_mirror_url(fetch, origud, uds[index], ld, check) - if ret !=3D False: + if ret: return ret return None =20 @@ -1197,14 +1207,14 @@ def get_checksum_file_list(d): =20 return " ".join(filelist) =20 -def get_file_checksums(filelist, pn): +def get_file_checksums(filelist, pn, localdirsexclude): """Get a list of the checksums for a list of local files =20 Returns the checksums for a list of local files, caching the results a= s it proceeds =20 """ - return _checksum_cache.get_checksums(filelist, pn) + return _checksum_cache.get_checksums(filelist, pn, localdirsexclude) =20 =20 class FetchData(object): @@ -1230,24 +1240,26 @@ class FetchData(object): self.pswd =3D self.parm["pswd"] self.setup =3D False =20 - if "name" in self.parm: - self.md5_name =3D "%s.md5sum" % self.parm["name"] - self.sha256_name =3D "%s.sha256sum" % self.parm["name"] - else: - self.md5_name =3D "md5sum" - self.sha256_name =3D "sha256sum" - if self.md5_name in self.parm: - self.md5_expected =3D self.parm[self.md5_name] - elif self.type not in ["http", "https", "ftp", "ftps", "sftp", "s3= "]: - self.md5_expected =3D None - else: - self.md5_expected =3D d.getVarFlag("SRC_URI", self.md5_name) - if self.sha256_name in self.parm: - self.sha256_expected =3D self.parm[self.sha256_name] - elif self.type not in ["http", "https", "ftp", "ftps", "sftp", "s3= "]: - self.sha256_expected =3D None - else: - self.sha256_expected =3D d.getVarFlag("SRC_URI", self.sha256_n= ame) + def configure_checksum(checksum_id): + if "name" in self.parm: + checksum_name =3D "%s.%ssum" % (self.parm["name"], checksu= m_id) + else: + checksum_name =3D "%ssum" % checksum_id + + setattr(self, "%s_name" % checksum_id, checksum_name) + + if checksum_name in self.parm: + checksum_expected =3D self.parm[checksum_name] + elif self.type not in ["http", "https", "ftp", "ftps", "sftp",= "s3"]: + checksum_expected =3D None + else: + checksum_expected =3D d.getVarFlag("SRC_URI", checksum_nam= e) + + setattr(self, "%s_expected" % checksum_id, checksum_expected) + + for checksum_id in CHECKSUM_LIST: + configure_checksum(checksum_id) + self.ignore_checksums =3D False =20 self.names =3D self.parm.get("name",'default').split(',') @@ -1351,7 +1363,7 @@ class FetchMethod(object): """ =20 # We cannot compute checksums for directories - if os.path.isdir(urldata.localpath) =3D=3D True: + if os.path.isdir(urldata.localpath): return False if urldata.localpath.find("*") !=3D -1: return False @@ -1365,6 +1377,18 @@ class FetchMethod(object): """ return False =20 + def verify_donestamp(self, ud, d): + """ + Verify the donestamp file + """ + return verify_donestamp(ud, d) + + def update_donestamp(self, ud, d): + """ + Update the donestamp file + """ + update_stamp(ud, d) + def _strip_leading_slashes(self, relpath): """ Remove leading slash as os.path.join can't cope @@ -1539,6 +1563,12 @@ class FetchMethod(object): """ return True =20 + def try_mirrors(self, fetch, urldata, d, mirrors, check=3DFalse): + """ + Try to use a mirror + """ + return bool(try_mirrors(fetch, d, urldata, mirrors, check)) + def checkstatus(self, fetch, urldata, d): """ Check the status of a URL @@ -1567,8 +1597,7 @@ class FetchMethod(object): return True, str(latest_rev) =20 def generate_revision_key(self, ud, d, name): - key =3D self._revision_key(ud, d, name) - return "%s-%s" % (key, d.getVar("PN") or "") + return self._revision_key(ud, d, name) =20 def latest_versionstring(self, ud, d): """ @@ -1578,6 +1607,16 @@ class FetchMethod(object): """ return ('', '') =20 + def done(self, ud, d): + """ + Is the download done ? + """ + if os.path.exists(ud.localpath): + return True + if ud.localpath.find("*") !=3D -1: + return True + return False + class Fetch(object): def __init__(self, urls, d, cache =3D True, localonly =3D False, conne= ction_cache =3D None): if localonly and cache: @@ -1592,8 +1631,11 @@ class Fetch(object): =20 fn =3D d.getVar('FILE') mc =3D d.getVar('__BBMULTICONFIG') or "" - if cache and fn and mc + fn in urldata_cache: - self.ud =3D urldata_cache[mc + fn] + key =3D None + if cache and fn: + key =3D mc + fn + str(id(d)) + if key in urldata_cache: + self.ud =3D urldata_cache[key] =20 for url in urls: if url not in self.ud: @@ -1604,8 +1646,8 @@ class Fetch(object): self.ud[url] =3D None pass =20 - if fn and cache: - urldata_cache[mc + fn] =3D self.ud + if key: + urldata_cache[key] =3D self.ud =20 def localpath(self, url): if url not in self.urls: @@ -1641,7 +1683,7 @@ class Fetch(object): ud =3D self.ud[u] ud.setup_localpath(self.d) m =3D ud.method - localpath =3D "" + done =3D False =20 if ud.lockfile: lf =3D bb.utils.lockfile(ud.lockfile) @@ -1649,28 +1691,28 @@ class Fetch(object): try: self.d.setVar("BB_NO_NETWORK", network) =20 - if verify_donestamp(ud, self.d) and not m.need_update(ud, = self.d): - localpath =3D ud.localpath + if m.verify_donestamp(ud, self.d) and not m.need_update(ud= , self.d): + done =3D True elif m.try_premirror(ud, self.d): logger.debug(1, "Trying PREMIRRORS") mirrors =3D mirror_from_string(self.d.getVar('PREMIRRO= RS')) - localpath =3D try_mirrors(self, self.d, ud, mirrors, F= alse) - if localpath: + done =3D m.try_mirrors(self, ud, self.d, mirrors) + if done: try: # early checksum verification so that if the c= hecksum of the premirror # contents mismatch the fetcher can still try = upstream and mirrors - update_stamp(ud, self.d) + m.update_donestamp(ud, self.d) except ChecksumError as e: logger.warning("Checksum failure encountered w= ith premirror download of %s - will attempt other sources." % u) logger.debug(1, str(e)) - localpath =3D "" + done =3D False =20 if premirroronly: self.d.setVar("BB_NO_NETWORK", "1") =20 firsterr =3D None - verified_stamp =3D verify_donestamp(ud, self.d) - if not localpath and (not verified_stamp or m.need_update(= ud, self.d)): + verified_stamp =3D m.verify_donestamp(ud, self.d) + if not done and (not verified_stamp or m.need_update(ud, s= elf.d)): try: if not trusted_network(self.d, ud.url): raise UntrustedUrl(ud.url) @@ -1678,10 +1720,10 @@ class Fetch(object): m.download(ud, self.d) if hasattr(m, "build_mirror_data"): m.build_mirror_data(ud, self.d) - localpath =3D ud.localpath + done =3D True # early checksum verify, so that if checksum misma= tched, # fetcher still have chance to fetch from mirror - update_stamp(ud, self.d) + m.update_donestamp(ud, self.d) =20 except bb.fetch2.NetworkAccess: raise @@ -1703,14 +1745,14 @@ class Fetch(object): m.clean(ud, self.d) logger.debug(1, "Trying MIRRORS") mirrors =3D mirror_from_string(self.d.getVar('MIRR= ORS')) - localpath =3D try_mirrors(self, self.d, ud, mirror= s) + done =3D m.try_mirrors(self, ud, self.d, mirrors) =20 - if not localpath or ((not os.path.exists(localpath)) and l= ocalpath.find("*") =3D=3D -1): + if not done or not m.done(ud, self.d): if firsterr: logger.error(str(firsterr)) raise FetchError("Unable to fetch URL from any source.= ", u) =20 - update_stamp(ud, self.d) + m.update_donestamp(ud, self.d) =20 except IOError as e: if e.errno in [errno.ESTALE]: @@ -1741,14 +1783,14 @@ class Fetch(object): logger.debug(1, "Testing URL %s", u) # First try checking uri, u, from PREMIRRORS mirrors =3D mirror_from_string(self.d.getVar('PREMIRRORS')) - ret =3D try_mirrors(self, self.d, ud, mirrors, True) + ret =3D m.try_mirrors(self, ud, self.d, mirrors, True) if not ret: # Next try checking from the original uri, u ret =3D m.checkstatus(self, ud, self.d) if not ret: # Finally, try checking uri, u, from MIRRORS mirrors =3D mirror_from_string(self.d.getVar('MIRRORS'= )) - ret =3D try_mirrors(self, self.d, ud, mirrors, True) + ret =3D m.try_mirrors(self, ud, self.d, mirrors, True) =20 if not ret: raise FetchError("URL %s doesn't work" % u, u) @@ -1853,6 +1895,7 @@ from . import osc from . import repo from . import clearcase from . import npm +from . import npmsw =20 methods.append(local.Local()) methods.append(wget.Wget()) @@ -1871,3 +1914,4 @@ methods.append(osc.Osc()) methods.append(repo.Repo()) methods.append(clearcase.ClearCase()) methods.append(npm.Npm()) +methods.append(npmsw.NpmShrinkWrap()) diff --git a/bitbake/lib/bb/fetch2/bzr.py b/bitbake/lib/bb/fetch2/bzr.py index c56d875..566ace9 100644 --- a/bitbake/lib/bb/fetch2/bzr.py +++ b/bitbake/lib/bb/fetch2/bzr.py @@ -14,8 +14,6 @@ BitBake 'Fetch' implementation for bzr. # =20 import os -import sys -import logging import bb from bb.fetch2 import FetchMethod from bb.fetch2 import FetchError diff --git a/bitbake/lib/bb/fetch2/clearcase.py b/bitbake/lib/bb/fetch2/cle= arcase.py index 3dd93ad..49d7ae1 100644 --- a/bitbake/lib/bb/fetch2/clearcase.py +++ b/bitbake/lib/bb/fetch2/clearcase.py @@ -49,7 +49,6 @@ User credentials: # =20 import os -import sys import shutil import bb from bb.fetch2 import FetchMethod @@ -145,18 +144,18 @@ class ClearCase(FetchMethod): =20 basecmd =3D "%s %s" % (ud.basecmd, command) =20 - if command is 'mkview': + if command =3D=3D 'mkview': if not "rcleartool" in ud.basecmd: # Cleartool needs a -snapshot view options.append("-snapshot") options.append("-tag %s" % ud.viewname) options.append(ud.viewdir) =20 - elif command is 'rmview': + elif command =3D=3D 'rmview': options.append("-force") options.append("%s" % ud.viewdir) =20 - elif command is 'setcs': + elif command =3D=3D 'setcs': options.append("-overwrite") options.append(ud.configspecfile) =20 @@ -238,7 +237,7 @@ class ClearCase(FetchMethod): =20 # Clean clearcase meta-data before tar =20 - runfetchcmd('tar -czf "%s" .' % (ud.localpath), d, cleanup =3D [ud= .localpath]) + runfetchcmd('tar -czf "%s" .' % (ud.localpath), d, cleanup =3D [ud= .localpath], workdir =3D ud.viewdir) =20 # Clean up so we can create a new view next time self.clean(ud, d); diff --git a/bitbake/lib/bb/fetch2/cvs.py b/bitbake/lib/bb/fetch2/cvs.py index 1b35ba4..29123a4 100644 --- a/bitbake/lib/bb/fetch2/cvs.py +++ b/bitbake/lib/bb/fetch2/cvs.py @@ -14,7 +14,6 @@ BitBake build tools. # =20 import os -import logging import bb from bb.fetch2 import FetchMethod, FetchError, MissingParameterError, logg= er from bb.fetch2 import runfetchcmd diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py index 2d1d2ca..2ce9395 100644 --- a/bitbake/lib/bb/fetch2/git.py +++ b/bitbake/lib/bb/fetch2/git.py @@ -292,11 +292,21 @@ class Git(FetchMethod): def clonedir_need_update(self, ud, d): if not os.path.exists(ud.clonedir): return True + if ud.shallow and ud.write_shallow_tarballs and self.clonedir_need= _shallow_revs(ud, d): + return True for name in ud.names: if not self._contains_ref(ud, d, name, ud.clonedir): return True return False =20 + def clonedir_need_shallow_revs(self, ud, d): + for rev in ud.shallow_revs: + try: + runfetchcmd('%s rev-parse -q --verify %s' % (ud.basecmd, r= ev), d, quiet=3DTrue, workdir=3Dud.clonedir) + except bb.fetch2.FetchError: + return rev + return None + def shallow_tarball_need_update(self, ud): return ud.shallow and ud.write_shallow_tarballs and not os.path.ex= ists(ud.fullshallow) =20 @@ -339,19 +349,13 @@ class Git(FetchMethod): runfetchcmd(clone_cmd, d, log=3Dprogresshandler) =20 # Update the checkout if needed - needupdate =3D False - for name in ud.names: - if not self._contains_ref(ud, d, name, ud.clonedir): - needupdate =3D True - break - - if needupdate: + if self.clonedir_need_update(ud, d): output =3D runfetchcmd("%s remote" % ud.basecmd, d, quiet=3DTr= ue, workdir=3Dud.clonedir) if "origin" in output: runfetchcmd("%s remote rm origin" % ud.basecmd, d, workdir= =3Dud.clonedir) =20 runfetchcmd("%s remote add --mirror=3Dfetch origin %s" % (ud.b= asecmd, repourl), d, workdir=3Dud.clonedir) - fetch_cmd =3D "LANG=3DC %s fetch -f --prune --progress %s refs= /*:refs/*" % (ud.basecmd, repourl) + fetch_cmd =3D "LANG=3DC %s fetch -f --progress %s refs/*:refs/= *" % (ud.basecmd, repourl) if ud.proto.lower() !=3D 'file': bb.fetch2.check_network_access(d, fetch_cmd, ud.url) progresshandler =3D GitProgressHandler(d) @@ -369,6 +373,11 @@ class Git(FetchMethod): if not self._contains_ref(ud, d, name, ud.clonedir): raise bb.fetch2.FetchError("Unable to find revision %s in = branch %s even from upstream" % (ud.revisions[name], ud.branches[name])) =20 + if ud.shallow and ud.write_shallow_tarballs: + missing_rev =3D self.clonedir_need_shallow_revs(ud, d) + if missing_rev: + raise bb.fetch2.FetchError("Unable to find revision %s eve= n from upstream" % missing_rev) + def build_mirror_data(self, ud, d): if ud.shallow and ud.write_shallow_tarballs: if not os.path.exists(ud.fullshallow): @@ -585,7 +594,9 @@ class Git(FetchMethod): """ Return a unique key for the url """ - return "git:" + ud.host + ud.path.replace('/', '.') + ud.unresolve= drev[name] + # Collapse adjacent slashes + slash_re =3D re.compile(r"/+") + return "git:" + ud.host + slash_re.sub(".", ud.path) + ud.unresolv= edrev[name] =20 def _lsremote(self, ud, d, search): """ @@ -662,7 +673,7 @@ class Git(FetchMethod): =20 # search for version in the line tag =3D tagregex.search(tag_head) - if tag =3D=3D None: + if tag is None: continue =20 tag =3D tag.group('pver') diff --git a/bitbake/lib/bb/fetch2/gitannex.py b/bitbake/lib/bb/fetch2/gita= nnex.py index 1d497dc..80a808d 100644 --- a/bitbake/lib/bb/fetch2/gitannex.py +++ b/bitbake/lib/bb/fetch2/gitannex.py @@ -8,11 +8,9 @@ BitBake 'Fetch' git annex implementation # SPDX-License-Identifier: GPL-2.0-only # =20 -import os import bb from bb.fetch2.git import Git from bb.fetch2 import runfetchcmd -from bb.fetch2 import logger =20 class GitANNEX(Git): def supports(self, ud, d): diff --git a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.p= y index c622771..e708300 100644 --- a/bitbake/lib/bb/fetch2/gitsm.py +++ b/bitbake/lib/bb/fetch2/gitsm.py @@ -20,11 +20,12 @@ NOTE: Switching a SRC_URI from "git://" to "gitsm://" r= equires a clean of your r import os import bb import copy +import shutil +import tempfile from bb.fetch2.git import Git from bb.fetch2 import runfetchcmd from bb.fetch2 import logger from bb.fetch2 import Fetch -from bb.fetch2 import BBFetchException =20 class GitSM(Git): def supports(self, ud, d): @@ -131,7 +132,7 @@ class GitSM(Git): ld.setVar('SRCPV', d.getVar('SRCPV')) ld.setVar('SRCREV_FORMAT', module) =20 - function(ud, url, module, paths[module], ld) + function(ud, url, module, paths[module], workdir, ld) =20 return submodules !=3D [] =20 @@ -153,7 +154,7 @@ class GitSM(Git): return False =20 def download(self, ud, d): - def download_submodule(ud, url, module, modpath, d): + def download_submodule(ud, url, module, modpath, workdir, d): url +=3D ";bareclone=3D1;nobranch=3D1" =20 # Is the following still needed? @@ -164,16 +165,25 @@ class GitSM(Git): newfetch.download() # Drop a nugget to add each of the srcrevs we've fetched (= used by need_update) runfetchcmd("%s config --add bitbake.srcrev %s" % \ - (ud.basecmd, ud.revisions[ud.names[0]]), d, wo= rkdir=3Dud.clonedir) + (ud.basecmd, ud.revisions[ud.names[0]]), d, wo= rkdir=3Dworkdir) except Exception as e: logger.error('gitsm: submodule download failed: %s %s' % (= type(e).__name__, str(e))) raise =20 Git.download(self, ud, d) - self.process_submodules(ud, ud.clonedir, download_submodule, d) + + # If we're using a shallow mirror tarball it needs to be unpacked + # temporarily so that we can examine the .gitmodules file + if ud.shallow and os.path.exists(ud.fullshallow) and self.need_upd= ate(ud, d): + tmpdir =3D tempfile.mkdtemp(dir=3Dd.getVar("DL_DIR")) + runfetchcmd("tar -xzf %s" % ud.fullshallow, d, workdir=3Dtmpdi= r) + self.process_submodules(ud, tmpdir, download_submodule, d) + shutil.rmtree(tmpdir) + else: + self.process_submodules(ud, ud.clonedir, download_submodule, d= ) =20 def unpack(self, ud, destdir, d): - def unpack_submodules(ud, url, module, modpath, d): + def unpack_submodules(ud, url, module, modpath, workdir, d): url +=3D ";bareclone=3D1;nobranch=3D1" =20 # Figure out where we clone over the bare submodules... diff --git a/bitbake/lib/bb/fetch2/hg.py b/bitbake/lib/bb/fetch2/hg.py index 15d729e..8f50370 100644 --- a/bitbake/lib/bb/fetch2/hg.py +++ b/bitbake/lib/bb/fetch2/hg.py @@ -13,8 +13,6 @@ BitBake 'Fetch' implementation for mercurial DRCS (hg). # =20 import os -import sys -import logging import bb import errno from bb.fetch2 import FetchMethod @@ -54,13 +52,6 @@ class Hg(FetchMethod): else: ud.proto =3D "hg" =20 - ud.setup_revisions(d) - - if 'rev' in ud.parm: - ud.revision =3D ud.parm['rev'] - elif not ud.revision: - ud.revision =3D self.latest_revision(ud, d) - # Create paths to mercurial checkouts hgsrcname =3D '%s_%s_%s' % (ud.module.replace('/', '.'), \ ud.host, ud.path.replace('/', '.')) @@ -74,6 +65,13 @@ class Hg(FetchMethod): ud.localfile =3D ud.moddir ud.basecmd =3D d.getVar("FETCHCMD_hg") or "/usr/bin/env hg" =20 + ud.setup_revisions(d) + + if 'rev' in ud.parm: + ud.revision =3D ud.parm['rev'] + elif not ud.revision: + ud.revision =3D self.latest_revision(ud, d) + ud.write_tarballs =3D d.getVar("BB_GENERATE_MIRROR_TARBALLS") =20 def need_update(self, ud, d): @@ -139,7 +137,7 @@ class Hg(FetchMethod): cmd =3D "%s --config auth.default.prefix=3D* --config auth= .default.username=3D%s --config auth.default.password=3D%s --config \"auth.= default.schemes=3D%s\" pull" % (ud.basecmd, ud.user, ud.pswd, proto) else: cmd =3D "%s pull" % (ud.basecmd) - elif command =3D=3D "update": + elif command =3D=3D "update" or command =3D=3D "up": if ud.user and ud.pswd: cmd =3D "%s --config auth.default.prefix=3D* --config auth= .default.username=3D%s --config auth.default.password=3D%s --config \"auth.= default.schemes=3D%s\" update -C %s" % (ud.basecmd, ud.user, ud.pswd, proto= , " ".join(options)) else: @@ -247,12 +245,19 @@ class Hg(FetchMethod): =20 scmdata =3D ud.parm.get("scmdata", "") if scmdata !=3D "nokeep": + proto =3D ud.parm.get('protocol', 'http') if not os.access(os.path.join(codir, '.hg'), os.R_OK): logger.debug(2, "Unpack: creating new hg repository in '" = + codir + "'") runfetchcmd("%s init %s" % (ud.basecmd, codir), d) logger.debug(2, "Unpack: updating source in '" + codir + "'") - runfetchcmd("%s pull %s" % (ud.basecmd, ud.moddir), d, workdir= =3Dcodir) - runfetchcmd("%s up -C %s" % (ud.basecmd, revflag), d, workdir= =3Dcodir) + if ud.user and ud.pswd: + runfetchcmd("%s --config auth.default.prefix=3D* --config = auth.default.username=3D%s --config auth.default.password=3D%s --config \"a= uth.default.schemes=3D%s\" pull %s" % (ud.basecmd, ud.user, ud.pswd, proto,= ud.moddir), d, workdir=3Dcodir) + else: + runfetchcmd("%s pull %s" % (ud.basecmd, ud.moddir), d, wor= kdir=3Dcodir) + if ud.user and ud.pswd: + runfetchcmd("%s --config auth.default.prefix=3D* --config = auth.default.username=3D%s --config auth.default.password=3D%s --config \"a= uth.default.schemes=3D%s\" up -C %s" % (ud.basecmd, ud.user, ud.pswd, proto= , revflag), d, workdir=3Dcodir) + else: + runfetchcmd("%s up -C %s" % (ud.basecmd, revflag), d, work= dir=3Dcodir) else: logger.debug(2, "Unpack: extracting source to '" + codir + "'"= ) runfetchcmd("%s archive -t files %s %s" % (ud.basecmd, revflag= , codir), d, workdir=3Dud.moddir) diff --git a/bitbake/lib/bb/fetch2/npm.py b/bitbake/lib/bb/fetch2/npm.py index 9700e61..4789850 100644 --- a/bitbake/lib/bb/fetch2/npm.py +++ b/bitbake/lib/bb/fetch2/npm.py @@ -1,301 +1,296 @@ +# Copyright (C) 2020 Savoir-Faire Linux # # SPDX-License-Identifier: GPL-2.0-only # """ -BitBake 'Fetch' NPM implementation +BitBake 'Fetch' npm implementation =20 -The NPM fetcher is used to retrieve files from the npmjs repository +npm fetcher support the SRC_URI with format of: +SRC_URI =3D "npm://some.registry.url;OptionA=3Dxxx;OptionB=3Dxxx;..." =20 -Usage in the recipe: +Supported SRC_URI options are: =20 - SRC_URI =3D "npm://registry.npmjs.org/;name=3D${PN};version=3D${PV}" - Suported SRC_URI options are: +- package + The npm package name. This is a mandatory parameter. =20 - - name - - version +- version + The npm package version. This is a mandatory parameter. =20 - npm://registry.npmjs.org/${PN}/-/${PN}-${PV}.tgz would become npm://r= egistry.npmjs.org;name=3D${PN};version=3D${PV} - The fetcher all triggers off the existence of ud.localpath. If that ex= ists and has the ".done" stamp, its assumed the fetch is good/done +- downloadfilename + Specifies the filename used when storing the downloaded file. =20 +- destsuffix + Specifies the directory to use to unpack the package (default: npm). """ =20 -import os -import sys -import urllib.request, urllib.parse, urllib.error +import base64 import json -import subprocess -import signal +import os +import re +import shlex +import tempfile import bb -from bb.fetch2 import FetchMethod -from bb.fetch2 import FetchError -from bb.fetch2 import ChecksumError -from bb.fetch2 import runfetchcmd -from bb.fetch2 import logger -from bb.fetch2 import UnpackError -from bb.fetch2 import ParameterError - -def subprocess_setup(): - # Python installs a SIGPIPE handler by default. This is usually not wh= at - # non-Python subprocesses expect. - # SIGPIPE errors are known issues with gzip/bash - signal.signal(signal.SIGPIPE, signal.SIG_DFL) +from bb.fetch2 import Fetch +from bb.fetch2 import FetchError +from bb.fetch2 import FetchMethod +from bb.fetch2 import MissingParameterError +from bb.fetch2 import ParameterError +from bb.fetch2 import URI +from bb.fetch2 import check_network_access +from bb.fetch2 import runfetchcmd +from bb.utils import is_semver + +def npm_package(package): + """Convert the npm package name to remove unsupported character""" + # Scoped package names (with the @) use the same naming convention + # as the 'npm pack' command. + if package.startswith("@"): + return re.sub("/", "-", package[1:]) + return package + +def npm_filename(package, version): + """Get the filename of a npm package""" + return npm_package(package) + "-" + version + ".tgz" + +def npm_localfile(package, version): + """Get the local filename of a npm package""" + return os.path.join("npm2", npm_filename(package, version)) + +def npm_integrity(integrity): + """ + Get the checksum name and expected value from the subresource integrit= y + https://www.w3.org/TR/SRI/ + """ + algo, value =3D integrity.split("-", maxsplit=3D1) + return "%ssum" % algo, base64.b64decode(value).hex() + +def npm_unpack(tarball, destdir, d): + """Unpack a npm tarball""" + bb.utils.mkdirhier(destdir) + cmd =3D "tar --extract --gzip --file=3D%s" % shlex.quote(tarball) + cmd +=3D " --no-same-owner" + cmd +=3D " --strip-components=3D1" + runfetchcmd(cmd, d, workdir=3Ddestdir) + +class NpmEnvironment(object): + """ + Using a npm config file seems more reliable than using cli arguments. + This class allows to create a controlled environment for npm commands. + """ + def __init__(self, d, configs=3DNone): + self.d =3D d + self.configs =3D configs + + def run(self, cmd, args=3DNone, configs=3DNone, workdir=3DNone): + """Run npm command in a controlled environment""" + with tempfile.TemporaryDirectory() as tmpdir: + d =3D bb.data.createCopy(self.d) + d.setVar("HOME", tmpdir) + + cfgfile =3D os.path.join(tmpdir, "npmrc") + + if not workdir: + workdir =3D tmpdir + + def _run(cmd): + cmd =3D "NPM_CONFIG_USERCONFIG=3D%s " % cfgfile + cmd + cmd =3D "NPM_CONFIG_GLOBALCONFIG=3D%s " % cfgfile + cmd + return runfetchcmd(cmd, d, workdir=3Dworkdir) + + if self.configs: + for key, value in self.configs: + _run("npm config set %s %s" % (key, shlex.quote(value)= )) + + if configs: + for key, value in configs: + _run("npm config set %s %s" % (key, shlex.quote(value)= )) + + if args: + for key, value in args: + cmd +=3D " --%s=3D%s" % (key, shlex.quote(value)) + + return _run(cmd) =20 class Npm(FetchMethod): - - """Class to fetch urls via 'npm'""" - def init(self, d): - pass + """Class to fetch a package from a npm registry""" =20 def supports(self, ud, d): - """ - Check to see if a given url can be fetched with npm - """ - return ud.type in ['npm'] + """Check if a given url can be fetched with npm""" + return ud.type in ["npm"] + + def urldata_init(self, ud, d): + """Init npm specific variables within url data""" + ud.package =3D None + ud.version =3D None + ud.registry =3D None =20 - def debug(self, msg): - logger.debug(1, "NpmFetch: %s", msg) + # Get the 'package' parameter + if "package" in ud.parm: + ud.package =3D ud.parm.get("package") =20 - def clean(self, ud, d): - logger.debug(2, "Calling cleanup %s" % ud.pkgname) - bb.utils.remove(ud.localpath, False) - bb.utils.remove(ud.pkgdatadir, True) - bb.utils.remove(ud.fullmirror, False) + if not ud.package: + raise MissingParameterError("Parameter 'package' required", ud= .url) + + # Get the 'version' parameter + if "version" in ud.parm: + ud.version =3D ud.parm.get("version") =20 - def urldata_init(self, ud, d): - """ - init NPM specific variable within url data - """ - if 'downloadfilename' in ud.parm: - ud.basename =3D ud.parm['downloadfilename'] - else: - ud.basename =3D os.path.basename(ud.path) - - # can't call it ud.name otherwise fetcher base class will start do= ing sha1stuff - # TODO: find a way to get an sha1/sha256 manifest of pkg & all dep= s - ud.pkgname =3D ud.parm.get("name", None) - if not ud.pkgname: - raise ParameterError("NPM fetcher requires a name parameter", = ud.url) - ud.version =3D ud.parm.get("version", None) if not ud.version: - raise ParameterError("NPM fetcher requires a version parameter= ", ud.url) - ud.bbnpmmanifest =3D "%s-%s.deps.json" % (ud.pkgname, ud.version) - ud.bbnpmmanifest =3D ud.bbnpmmanifest.replace('/', '-') - ud.registry =3D "http://%s" % (ud.url.replace('npm://', '', 1).spl= it(';'))[0] - prefixdir =3D "npm/%s" % ud.pkgname - ud.pkgdatadir =3D d.expand("${DL_DIR}/%s" % prefixdir) - if not os.path.exists(ud.pkgdatadir): - bb.utils.mkdirhier(ud.pkgdatadir) - ud.localpath =3D d.expand("${DL_DIR}/npm/%s" % ud.bbnpmmanifest) - - self.basecmd =3D d.getVar("FETCHCMD_wget") or "/usr/bin/env wget -= O -t 2 -T 30 -nv --passive-ftp --no-check-certificate " - ud.prefixdir =3D prefixdir - - ud.write_tarballs =3D ((d.getVar("BB_GENERATE_MIRROR_TARBALLS") or= "0") !=3D "0") - mirrortarball =3D 'npm_%s-%s.tar.xz' % (ud.pkgname, ud.version) - mirrortarball =3D mirrortarball.replace('/', '-') - ud.fullmirror =3D os.path.join(d.getVar("DL_DIR"), mirrortarball) - ud.mirrortarballs =3D [mirrortarball] + raise MissingParameterError("Parameter 'version' required", ud= .url) =20 - def need_update(self, ud, d): - if os.path.exists(ud.localpath): - return False - return True - - def _runpack(self, ud, d, pkgfullname: str, quiet=3DFalse) -> str: - """ - Runs npm pack on a full package name. - Returns the filename of the downloaded package - """ - bb.fetch2.check_network_access(d, pkgfullname, ud.registry) - dldir =3D d.getVar("DL_DIR") - dldir =3D os.path.join(dldir, ud.prefixdir) - - command =3D "npm pack {} --registry {}".format(pkgfullname, ud.reg= istry) - logger.debug(2, "Fetching {} using command '{}' in {}".format(pkgf= ullname, command, dldir)) - filename =3D runfetchcmd(command, d, quiet, workdir=3Ddldir) - return filename.rstrip() - - def _unpackdep(self, ud, pkg, data, destdir, dldir, d): - file =3D data[pkg]['tgz'] - logger.debug(2, "file to extract is %s" % file) - if file.endswith('.tgz') or file.endswith('.tar.gz') or file.endsw= ith('.tar.Z'): - cmd =3D 'tar xz --strip 1 --no-same-owner --warning=3Dno-unkno= wn-keyword -f %s/%s' % (dldir, file) - else: - bb.fatal("NPM package %s downloaded not a tarball!" % file) - - # Change to subdir before executing command - if not os.path.exists(destdir): - os.makedirs(destdir) - path =3D d.getVar('PATH') - if path: - cmd =3D "PATH=3D\"%s\" %s" % (path, cmd) - bb.note("Unpacking %s to %s/" % (file, destdir)) - ret =3D subprocess.call(cmd, preexec_fn=3Dsubprocess_setup, shell= =3DTrue, cwd=3Ddestdir) - - if ret !=3D 0: - raise UnpackError("Unpack command %s failed with return value = %s" % (cmd, ret), ud.url) - - if 'deps' not in data[pkg]: - return - for dep in data[pkg]['deps']: - self._unpackdep(ud, dep, data[pkg]['deps'], "%s/node_modules/%= s" % (destdir, dep), dldir, d) - - - def unpack(self, ud, destdir, d): - dldir =3D d.getVar("DL_DIR") - with open("%s/npm/%s" % (dldir, ud.bbnpmmanifest)) as datafile: - workobj =3D json.load(datafile) - dldir =3D "%s/%s" % (os.path.dirname(ud.localpath), ud.pkgname) - - if 'subdir' in ud.parm: - unpackdir =3D '%s/%s' % (destdir, ud.parm.get('subdir')) + if not is_semver(ud.version) and not ud.version =3D=3D "latest": + raise ParameterError("Invalid 'version' parameter", ud.url) + + # Extract the 'registry' part of the url + ud.registry =3D re.sub(r"^npm://", "http://", ud.url.split(";")[0]= ) + + # Using the 'downloadfilename' parameter as local filename + # or the npm package name. + if "downloadfilename" in ud.parm: + ud.localfile =3D d.expand(ud.parm["downloadfilename"]) else: - unpackdir =3D '%s/npmpkg' % destdir - - self._unpackdep(ud, ud.pkgname, workobj, unpackdir, dldir, d) - - def _parse_view(self, output): - ''' - Parse the output of npm view --json; the last JSON result - is assumed to be the one that we're interested in. - ''' - pdata =3D json.loads(output); - try: - return pdata[-1] - except: - return pdata - - def _getdependencies(self, pkg, data, version, d, ud, optional=3DFalse= , fetchedlist=3DNone): - if fetchedlist is None: - fetchedlist =3D [] - pkgfullname =3D pkg - if version !=3D '*' and not '/' in version: - pkgfullname +=3D "@'%s'" % version - if pkgfullname in fetchedlist: - return - - logger.debug(2, "Calling getdeps on %s" % pkg) - fetchcmd =3D "npm view %s --json --registry %s" % (pkgfullname, ud= .registry) - output =3D runfetchcmd(fetchcmd, d, True) - pdata =3D self._parse_view(output) - if not pdata: - raise FetchError("The command '%s' returned no output" % fetch= cmd) - if optional: - pkg_os =3D pdata.get('os', None) - if pkg_os: - if not isinstance(pkg_os, list): - pkg_os =3D [pkg_os] - blacklist =3D False - for item in pkg_os: - if item.startswith('!'): - blacklist =3D True - break - if (not blacklist and 'linux' not in pkg_os) or '!linux' i= n pkg_os: - logger.debug(2, "Skipping %s since it's incompatible w= ith Linux" % pkg) - return - filename =3D self._runpack(ud, d, pkgfullname) - data[pkg] =3D {} - data[pkg]['tgz'] =3D filename - fetchedlist.append(pkgfullname) - - dependencies =3D pdata.get('dependencies', {}) - optionalDependencies =3D pdata.get('optionalDependencies', {}) - dependencies.update(optionalDependencies) - depsfound =3D {} - optdepsfound =3D {} - data[pkg]['deps'] =3D {} - for dep in dependencies: - if dep in optionalDependencies: - optdepsfound[dep] =3D dependencies[dep] + ud.localfile =3D npm_localfile(ud.package, ud.version) + + # Get the base 'npm' command + ud.basecmd =3D d.getVar("FETCHCMD_npm") or "npm" + + # This fetcher resolves a URI from a npm package name and version = and + # then forwards it to a proxy fetcher. A resolve file containing t= he + # resolved URI is created to avoid unwanted network access (if the= file + # already exists). The management of the donestamp file, the lockf= ile + # and the checksums are forwarded to the proxy fetcher. + ud.proxy =3D None + ud.needdonestamp =3D False + ud.resolvefile =3D self.localpath(ud, d) + ".resolved" + + def _resolve_proxy_url(self, ud, d): + def _npm_view(): + configs =3D [] + configs.append(("json", "true")) + configs.append(("registry", ud.registry)) + pkgver =3D shlex.quote(ud.package + "@" + ud.version) + cmd =3D ud.basecmd + " view %s" % pkgver + env =3D NpmEnvironment(d) + check_network_access(d, cmd, ud.registry) + view_string =3D env.run(cmd, configs=3Dconfigs) + + if not view_string: + raise FetchError("Unavailable package %s" % pkgver, ud.url= ) + + try: + view =3D json.loads(view_string) + + error =3D view.get("error") + if error is not None: + raise FetchError(error.get("summary"), ud.url) + + if ud.version =3D=3D "latest": + bb.warn("The npm package %s is using the latest " \ + "version available. This could lead to " \ + "non-reproducible builds." % pkgver) + elif ud.version !=3D view.get("version"): + raise ParameterError("Invalid 'version' parameter", ud= .url) + + return view + + except Exception as e: + raise FetchError("Invalid view from npm: %s" % str(e), ud.= url) + + def _get_url(view): + tarball_url =3D view.get("dist", {}).get("tarball") + + if tarball_url is None: + raise FetchError("Invalid 'dist.tarball' in view", ud.url) + + uri =3D URI(tarball_url) + uri.params["downloadfilename"] =3D ud.localfile + + integrity =3D view.get("dist", {}).get("integrity") + shasum =3D view.get("dist", {}).get("shasum") + + if integrity is not None: + checksum_name, checksum_expected =3D npm_integrity(integri= ty) + uri.params[checksum_name] =3D checksum_expected + elif shasum is not None: + uri.params["sha1sum"] =3D shasum else: - depsfound[dep] =3D dependencies[dep] - for dep, version in optdepsfound.items(): - self._getdependencies(dep, data[pkg]['deps'], version, d, ud, = optional=3DTrue, fetchedlist=3Dfetchedlist) - for dep, version in depsfound.items(): - self._getdependencies(dep, data[pkg]['deps'], version, d, ud, = fetchedlist=3Dfetchedlist) - - def _getshrinkeddependencies(self, pkg, data, version, d, ud, lockdown= , manifest, toplevel=3DTrue): - logger.debug(2, "NPM shrinkwrap file is %s" % data) - if toplevel: - name =3D data.get('name', None) - if name and name !=3D pkg: - for obj in data.get('dependencies', []): - if obj =3D=3D pkg: - self._getshrinkeddependencies(obj, data['dependenc= ies'][obj], data['dependencies'][obj]['version'], d, ud, lockdown, manifest= , False) - return - - pkgnameWithVersion =3D "{}@{}".format(pkg, version) - logger.debug(2, "Get dependencies for {}".format(pkgnameWithVersio= n)) - filename =3D self._runpack(ud, d, pkgnameWithVersion) - manifest[pkg] =3D {} - manifest[pkg]['tgz'] =3D filename - manifest[pkg]['deps'] =3D {} - - if pkg in lockdown: - sha1_expected =3D lockdown[pkg][version] - sha1_data =3D bb.utils.sha1_file("npm/%s/%s" % (ud.pkgname, ma= nifest[pkg]['tgz'])) - if sha1_expected !=3D sha1_data: - msg =3D "\nFile: '%s' has %s checksum %s when %s was expec= ted" % (manifest[pkg]['tgz'], 'sha1', sha1_data, sha1_expected) - raise ChecksumError('Checksum mismatch!%s' % msg) - else: - logger.debug(2, "No lockdown data for %s@%s" % (pkg, version)) + raise FetchError("Invalid 'dist.integrity' in view", ud.ur= l) =20 - if 'dependencies' in data: - for obj in data['dependencies']: - logger.debug(2, "Found dep is %s" % str(obj)) - self._getshrinkeddependencies(obj, data['dependencies'][ob= j], data['dependencies'][obj]['version'], d, ud, lockdown, manifest[pkg]['d= eps'], False) + return str(uri) + + url =3D _get_url(_npm_view()) + + bb.utils.mkdirhier(os.path.dirname(ud.resolvefile)) + with open(ud.resolvefile, "w") as f: + f.write(url) + + def _setup_proxy(self, ud, d): + if ud.proxy is None: + if not os.path.exists(ud.resolvefile): + self._resolve_proxy_url(ud, d) + + with open(ud.resolvefile, "r") as f: + url =3D f.read() + + # Avoid conflicts between the environment data and: + # - the proxy url checksum + data =3D bb.data.createCopy(d) + data.delVarFlags("SRC_URI") + ud.proxy =3D Fetch([url], data) + + def _get_proxy_method(self, ud, d): + self._setup_proxy(ud, d) + proxy_url =3D ud.proxy.urls[0] + proxy_ud =3D ud.proxy.ud[proxy_url] + proxy_d =3D ud.proxy.d + proxy_ud.setup_localpath(proxy_d) + return proxy_ud.method, proxy_ud, proxy_d + + def verify_donestamp(self, ud, d): + """Verify the donestamp file""" + proxy_m, proxy_ud, proxy_d =3D self._get_proxy_method(ud, d) + return proxy_m.verify_donestamp(proxy_ud, proxy_d) + + def update_donestamp(self, ud, d): + """Update the donestamp file""" + proxy_m, proxy_ud, proxy_d =3D self._get_proxy_method(ud, d) + proxy_m.update_donestamp(proxy_ud, proxy_d) + + def need_update(self, ud, d): + """Force a fetch, even if localpath exists ?""" + if not os.path.exists(ud.resolvefile): + return True + if ud.version =3D=3D "latest": + return True + proxy_m, proxy_ud, proxy_d =3D self._get_proxy_method(ud, d) + return proxy_m.need_update(proxy_ud, proxy_d) + + def try_mirrors(self, fetch, ud, d, mirrors): + """Try to use a mirror""" + proxy_m, proxy_ud, proxy_d =3D self._get_proxy_method(ud, d) + return proxy_m.try_mirrors(fetch, proxy_ud, proxy_d, mirrors) =20 def download(self, ud, d): """Fetch url""" - jsondepobj =3D {} - shrinkobj =3D {} - lockdown =3D {} - - if not os.listdir(ud.pkgdatadir) and os.path.exists(ud.fullmirror)= : - dest =3D d.getVar("DL_DIR") - bb.utils.mkdirhier(dest) - runfetchcmd("tar -xJf %s" % (ud.fullmirror), d, workdir=3Ddest= ) - return - - if ud.parm.get("noverify", None) !=3D '1': - shwrf =3D d.getVar('NPM_SHRINKWRAP') - logger.debug(2, "NPM shrinkwrap file is %s" % shwrf) - if shwrf: - try: - with open(shwrf) as datafile: - shrinkobj =3D json.load(datafile) - except Exception as e: - raise FetchError('Error loading NPM_SHRINKWRAP file "%= s" for %s: %s' % (shwrf, ud.pkgname, str(e))) - elif not ud.ignore_checksums: - logger.warning('Missing shrinkwrap file in NPM_SHRINKWRAP = for %s, this will lead to unreliable builds!' % ud.pkgname) - lckdf =3D d.getVar('NPM_LOCKDOWN') - logger.debug(2, "NPM lockdown file is %s" % lckdf) - if lckdf: - try: - with open(lckdf) as datafile: - lockdown =3D json.load(datafile) - except Exception as e: - raise FetchError('Error loading NPM_LOCKDOWN file "%s"= for %s: %s' % (lckdf, ud.pkgname, str(e))) - elif not ud.ignore_checksums: - logger.warning('Missing lockdown file in NPM_LOCKDOWN for = %s, this will lead to unreproducible builds!' % ud.pkgname) - - if ('name' not in shrinkobj): - self._getdependencies(ud.pkgname, jsondepobj, ud.version, d, u= d) - else: - self._getshrinkeddependencies(ud.pkgname, shrinkobj, ud.versio= n, d, ud, lockdown, jsondepobj) - - with open(ud.localpath, 'w') as outfile: - json.dump(jsondepobj, outfile) - - def build_mirror_data(self, ud, d): - # Generate a mirror tarball if needed - if ud.write_tarballs and not os.path.exists(ud.fullmirror): - # it's possible that this symlink points to read-only filesyst= em with PREMIRROR - if os.path.islink(ud.fullmirror): - os.unlink(ud.fullmirror) - - dldir =3D d.getVar("DL_DIR") - logger.info("Creating tarball of npm data") - runfetchcmd("tar -cJf %s npm/%s npm/%s" % (ud.fullmirror, ud.b= bnpmmanifest, ud.pkgname), d, - workdir=3Ddldir) - runfetchcmd("touch %s.done" % (ud.fullmirror), d, workdir=3Ddl= dir) + self._setup_proxy(ud, d) + ud.proxy.download() + + def unpack(self, ud, rootdir, d): + """Unpack the downloaded archive""" + destsuffix =3D ud.parm.get("destsuffix", "npm") + destdir =3D os.path.join(rootdir, destsuffix) + npm_unpack(ud.localpath, destdir, d) + + def clean(self, ud, d): + """Clean any existing full or partial download""" + if os.path.exists(ud.resolvefile): + self._setup_proxy(ud, d) + ud.proxy.clean() + bb.utils.remove(ud.resolvefile) + + def done(self, ud, d): + """Is the download done ?""" + if not os.path.exists(ud.resolvefile): + return False + proxy_m, proxy_ud, proxy_d =3D self._get_proxy_method(ud, d) + return proxy_m.done(proxy_ud, proxy_d) diff --git a/bitbake/lib/bb/fetch2/npmsw.py b/bitbake/lib/bb/fetch2/npmsw.p= y new file mode 100644 index 0000000..0c3511d --- /dev/null +++ b/bitbake/lib/bb/fetch2/npmsw.py @@ -0,0 +1,255 @@ +# Copyright (C) 2020 Savoir-Faire Linux +# +# SPDX-License-Identifier: GPL-2.0-only +# +""" +BitBake 'Fetch' npm shrinkwrap implementation + +npm fetcher support the SRC_URI with format of: +SRC_URI =3D "npmsw://some.registry.url;OptionA=3Dxxx;OptionB=3Dxxx;..." + +Supported SRC_URI options are: + +- dev + Set to 1 to also install devDependencies. + +- destsuffix + Specifies the directory to use to unpack the dependencies (default: ${= S}). +""" + +import json +import os +import re +import bb +from bb.fetch2 import Fetch +from bb.fetch2 import FetchMethod +from bb.fetch2 import ParameterError +from bb.fetch2 import URI +from bb.fetch2.npm import npm_integrity +from bb.fetch2.npm import npm_localfile +from bb.fetch2.npm import npm_unpack +from bb.utils import is_semver + +def foreach_dependencies(shrinkwrap, callback=3DNone, dev=3DFalse): + """ + Run a callback for each dependencies of a shrinkwrap file. + The callback is using the format: + callback(name, params, deptree) + with: + name =3D the package name (string) + params =3D the package parameters (dictionary) + deptree =3D the package dependency tree (array of strings) + """ + def _walk_deps(deps, deptree): + for name in deps: + subtree =3D [*deptree, name] + _walk_deps(deps[name].get("dependencies", {}), subtree) + if callback is not None: + if deps[name].get("dev", False) and not dev: + continue + elif deps[name].get("bundled", False): + continue + callback(name, deps[name], subtree) + + _walk_deps(shrinkwrap.get("dependencies", {}), []) + +class NpmShrinkWrap(FetchMethod): + """Class to fetch all package from a shrinkwrap file""" + + def supports(self, ud, d): + """Check if a given url can be fetched with npmsw""" + return ud.type in ["npmsw"] + + def urldata_init(self, ud, d): + """Init npmsw specific variables within url data""" + + # Get the 'shrinkwrap' parameter + ud.shrinkwrap_file =3D re.sub(r"^npmsw://", "", ud.url.split(";")[= 0]) + + # Get the 'dev' parameter + ud.dev =3D bb.utils.to_boolean(ud.parm.get("dev"), False) + + # Resolve the dependencies + ud.deps =3D [] + + def _resolve_dependency(name, params, deptree): + url =3D None + localpath =3D None + extrapaths =3D [] + destsubdirs =3D [os.path.join("node_modules", dep) for dep in = deptree] + destsuffix =3D os.path.join(*destsubdirs) + + integrity =3D params.get("integrity", None) + resolved =3D params.get("resolved", None) + version =3D params.get("version", None) + + # Handle registry sources + if is_semver(version) and resolved and integrity: + localfile =3D npm_localfile(name, version) + + uri =3D URI(resolved) + uri.params["downloadfilename"] =3D localfile + + checksum_name, checksum_expected =3D npm_integrity(integri= ty) + uri.params[checksum_name] =3D checksum_expected + + url =3D str(uri) + + localpath =3D os.path.join(d.getVar("DL_DIR"), localfile) + + # Create a resolve file to mimic the npm fetcher and allow + # re-usability of the downloaded file. + resolvefile =3D localpath + ".resolved" + + bb.utils.mkdirhier(os.path.dirname(resolvefile)) + with open(resolvefile, "w") as f: + f.write(url) + + extrapaths.append(resolvefile) + + # Handle http tarball sources + elif version.startswith("http") and integrity: + localfile =3D os.path.join("npm2", os.path.basename(versio= n)) + + uri =3D URI(version) + uri.params["downloadfilename"] =3D localfile + + checksum_name, checksum_expected =3D npm_integrity(integri= ty) + uri.params[checksum_name] =3D checksum_expected + + url =3D str(uri) + + localpath =3D os.path.join(d.getVar("DL_DIR"), localfile) + + # Handle git sources + elif version.startswith("git"): + regex =3D re.compile(r""" + ^ + git\+ + (?P<protocol>[a-z]+) + :// + (?P<url>[^#]+) + \# + (?P<rev>[0-9a-f]+) + $ + """, re.VERBOSE) + + match =3D regex.match(version) + + if not match: + raise ParameterError("Invalid git url: %s" % version, = ud.url) + + groups =3D match.groupdict() + + uri =3D URI("git://" + str(groups["url"])) + uri.params["protocol"] =3D str(groups["protocol"]) + uri.params["rev"] =3D str(groups["rev"]) + uri.params["destsuffix"] =3D destsuffix + + url =3D str(uri) + + # local tarball sources and local link sources are unsupported + else: + raise ParameterError("Unsupported dependency: %s" % name, = ud.url) + + ud.deps.append({ + "url": url, + "localpath": localpath, + "extrapaths": extrapaths, + "destsuffix": destsuffix, + }) + + try: + with open(ud.shrinkwrap_file, "r") as f: + shrinkwrap =3D json.load(f) + except Exception as e: + raise ParameterError("Invalid shrinkwrap file: %s" % str(e), u= d.url) + + foreach_dependencies(shrinkwrap, _resolve_dependency, ud.dev) + + # Avoid conflicts between the environment data and: + # - the proxy url revision + # - the proxy url checksum + data =3D bb.data.createCopy(d) + data.delVar("SRCREV") + data.delVarFlags("SRC_URI") + + # This fetcher resolves multiple URIs from a shrinkwrap file and t= hen + # forwards it to a proxy fetcher. The management of the donestamp = file, + # the lockfile and the checksums are forwarded to the proxy fetche= r. + ud.proxy =3D Fetch([dep["url"] for dep in ud.deps], data) + ud.needdonestamp =3D False + + @staticmethod + def _foreach_proxy_method(ud, handle): + returns =3D [] + for proxy_url in ud.proxy.urls: + proxy_ud =3D ud.proxy.ud[proxy_url] + proxy_d =3D ud.proxy.d + proxy_ud.setup_localpath(proxy_d) + returns.append(handle(proxy_ud.method, proxy_ud, proxy_d)) + return returns + + def verify_donestamp(self, ud, d): + """Verify the donestamp file""" + def _handle(m, ud, d): + return m.verify_donestamp(ud, d) + return all(self._foreach_proxy_method(ud, _handle)) + + def update_donestamp(self, ud, d): + """Update the donestamp file""" + def _handle(m, ud, d): + m.update_donestamp(ud, d) + self._foreach_proxy_method(ud, _handle) + + def need_update(self, ud, d): + """Force a fetch, even if localpath exists ?""" + def _handle(m, ud, d): + return m.need_update(ud, d) + return all(self._foreach_proxy_method(ud, _handle)) + + def try_mirrors(self, fetch, ud, d, mirrors): + """Try to use a mirror""" + def _handle(m, ud, d): + return m.try_mirrors(fetch, ud, d, mirrors) + return all(self._foreach_proxy_method(ud, _handle)) + + def download(self, ud, d): + """Fetch url""" + ud.proxy.download() + + def unpack(self, ud, rootdir, d): + """Unpack the downloaded dependencies""" + destdir =3D d.getVar("S") + destsuffix =3D ud.parm.get("destsuffix") + if destsuffix: + destdir =3D os.path.join(rootdir, destsuffix) + + bb.utils.mkdirhier(destdir) + bb.utils.copyfile(ud.shrinkwrap_file, + os.path.join(destdir, "npm-shrinkwrap.json")) + + auto =3D [dep["url"] for dep in ud.deps if not dep["localpath"]] + manual =3D [dep for dep in ud.deps if dep["localpath"]] + + if auto: + ud.proxy.unpack(destdir, auto) + + for dep in manual: + depdestdir =3D os.path.join(destdir, dep["destsuffix"]) + npm_unpack(dep["localpath"], depdestdir, d) + + def clean(self, ud, d): + """Clean any existing full or partial download""" + ud.proxy.clean() + + # Clean extra files + for dep in ud.deps: + for path in dep["extrapaths"]: + bb.utils.remove(path) + + def done(self, ud, d): + """Is the download done ?""" + def _handle(m, ud, d): + return m.done(ud, d) + return all(self._foreach_proxy_method(ud, _handle)) diff --git a/bitbake/lib/bb/fetch2/osc.py b/bitbake/lib/bb/fetch2/osc.py index 3e56715..8f091ef 100644 --- a/bitbake/lib/bb/fetch2/osc.py +++ b/bitbake/lib/bb/fetch2/osc.py @@ -7,8 +7,6 @@ Based on the svn "Fetch" implementation. =20 """ =20 -import os -import sys import logging import bb from bb.fetch2 import FetchMethod @@ -43,7 +41,7 @@ class Osc(FetchMethod): else: pv =3D d.getVar("PV", False) rev =3D bb.fetch2.srcrev_internal_helper(ud, d) - if rev and rev !=3D True: + if rev: ud.revision =3D rev else: ud.revision =3D "" diff --git a/bitbake/lib/bb/fetch2/perforce.py b/bitbake/lib/bb/fetch2/perf= orce.py index 54d001e..f57c2a4 100644 --- a/bitbake/lib/bb/fetch2/perforce.py +++ b/bitbake/lib/bb/fetch2/perforce.py @@ -11,7 +11,6 @@ BitBake 'Fetch' implementation for perforce # Based on functions from the base bb module, Copyright 2003 Holger Schuri= g =20 import os -import logging import bb from bb.fetch2 import FetchMethod from bb.fetch2 import FetchError @@ -105,7 +104,7 @@ class Perforce(FetchMethod): if command =3D=3D 'changes': p4cmd =3D '%s%s changes -m 1 //%s' % (ud.basecmd, p4opt, pathn= rev) elif command =3D=3D 'print': - if depot_filename !=3D None: + if depot_filename is not None: p4cmd =3D '%s%s print -o "p4/%s" "%s"' % (ud.basecmd, p4op= t, filename, depot_filename) else: raise FetchError('No depot file name provided to p4 %s' % = command, ud.url) diff --git a/bitbake/lib/bb/fetch2/ssh.py b/bitbake/lib/bb/fetch2/ssh.py index f5be060..5e982ec 100644 --- a/bitbake/lib/bb/fetch2/ssh.py +++ b/bitbake/lib/bb/fetch2/ssh.py @@ -32,8 +32,6 @@ IETF secsh internet draft: =20 import re, os from bb.fetch2 import FetchMethod -from bb.fetch2 import FetchError -from bb.fetch2 import logger from bb.fetch2 import runfetchcmd =20 =20 @@ -60,7 +58,7 @@ class SSH(FetchMethod): '''Class to fetch a module or modules via Secure Shell''' =20 def supports(self, urldata, d): - return __pattern__.match(urldata.url) !=3D None + return __pattern__.match(urldata.url) is not None =20 def supports_checksum(self, urldata): return False diff --git a/bitbake/lib/bb/fetch2/svn.py b/bitbake/lib/bb/fetch2/svn.py index 96d666b..971a5ad 100644 --- a/bitbake/lib/bb/fetch2/svn.py +++ b/bitbake/lib/bb/fetch2/svn.py @@ -11,8 +11,6 @@ BitBake 'Fetch' implementation for svn. # Based on functions from the base bb module, Copyright 2003 Holger Schuri= g =20 import os -import sys -import logging import bb import re from bb.fetch2 import FetchMethod @@ -49,7 +47,7 @@ class Svn(FetchMethod): svndir =3D d.getVar("SVNDIR") or (d.getVar("DL_DIR") + "/svn") relpath =3D self._strip_leading_slashes(ud.path) ud.pkgdir =3D os.path.join(svndir, ud.host, relpath) - ud.moddir =3D os.path.join(ud.pkgdir, ud.module) + ud.moddir =3D os.path.join(ud.pkgdir, ud.path_spec) # Protects the repository from concurrent updates, e.g. from two # recipes fetching different revisions at the same time ud.svnlock =3D os.path.join(ud.pkgdir, "svn.lock") @@ -124,30 +122,30 @@ class Svn(FetchMethod): =20 try: if os.access(os.path.join(ud.moddir, '.svn'), os.R_OK): - svnupdatecmd =3D self._buildsvncommand(ud, d, "update") + svncmd =3D self._buildsvncommand(ud, d, "update") logger.info("Update " + ud.url) # We need to attempt to run svn upgrade first in case its = an older working format try: runfetchcmd(ud.basecmd + " upgrade", d, workdir=3Dud.m= oddir) except FetchError: pass - logger.debug(1, "Running %s", svnupdatecmd) - bb.fetch2.check_network_access(d, svnupdatecmd, ud.url) - runfetchcmd(svnupdatecmd, d, workdir=3Dud.moddir) + logger.debug(1, "Running %s", svncmd) + bb.fetch2.check_network_access(d, svncmd, ud.url) + runfetchcmd(svncmd, d, workdir=3Dud.moddir) else: - svnfetchcmd =3D self._buildsvncommand(ud, d, "fetch") + svncmd =3D self._buildsvncommand(ud, d, "fetch") logger.info("Fetch " + ud.url) # check out sources there bb.utils.mkdirhier(ud.pkgdir) - logger.debug(1, "Running %s", svnfetchcmd) - bb.fetch2.check_network_access(d, svnfetchcmd, ud.url) - runfetchcmd(svnfetchcmd, d, workdir=3Dud.pkgdir) + logger.debug(1, "Running %s", svncmd) + bb.fetch2.check_network_access(d, svncmd, ud.url) + runfetchcmd(svncmd, d, workdir=3Dud.pkgdir) =20 if not ("externals" in ud.parm and ud.parm["externals"] =3D=3D= "nowarn"): # Warn the user if this had externals (won't catch them al= l) output =3D runfetchcmd("svn propget svn:externals || true"= , d, workdir=3Dud.moddir) if output: - if "--ignore-externals" in svnfetchcmd.split(): + if "--ignore-externals" in svncmd.split(): bb.warn("%s contains svn:externals." % ud.url) bb.warn("These should be added to the recipe SRC_U= RI as necessary.") bb.warn("svn fetch has ignored externals:\n%s" % o= utput) diff --git a/bitbake/lib/bb/fetch2/wget.py b/bitbake/lib/bb/fetch2/wget.py index 725586d..f7d1de2 100644 --- a/bitbake/lib/bb/fetch2/wget.py +++ b/bitbake/lib/bb/fetch2/wget.py @@ -12,11 +12,10 @@ BitBake build tools. # # Based on functions from the base bb module, Copyright 2003 Holger Schuri= g =20 +import shlex import re import tempfile -import subprocess import os -import logging import errno import bb import bb.progress @@ -27,7 +26,6 @@ from bb.fetch2 import FetchMethod from bb.fetch2 import FetchError from bb.fetch2 import logger from bb.fetch2 import runfetchcmd -from bb.fetch2 import FetchConnectionCache from bb.utils import export_proxies from bs4 import BeautifulSoup from bs4 import SoupStrainer @@ -94,9 +92,9 @@ class Wget(FetchMethod): fetchcmd =3D self.basecmd =20 if 'downloadfilename' in ud.parm: - dldir =3D d.getVar("DL_DIR") - bb.utils.mkdirhier(os.path.dirname(dldir + os.sep + ud.localfi= le)) - fetchcmd +=3D " -O " + dldir + os.sep + ud.localfile + localpath =3D os.path.join(d.getVar("DL_DIR"), ud.localfile) + bb.utils.mkdirhier(os.path.dirname(localpath)) + fetchcmd +=3D " -O %s" % shlex.quote(localpath) =20 if ud.user and ud.pswd: fetchcmd +=3D " --user=3D%s --password=3D%s --auth-no-challeng= e" % (ud.user, ud.pswd) @@ -302,6 +300,7 @@ class Wget(FetchMethod): # Some servers (FusionForge, as used on Alioth) require that t= he # optional Accept header is set. r.add_header("Accept", "*/*") + r.add_header("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; e= n-US; rv:1.9.2.12) Gecko/20101027 Ubuntu/9.10 (karmic) Firefox/3.6.12") def add_basic_auth(login_str, request): '''Adds Basic auth to http request, pass in login:password= as string''' import base64 diff --git a/bitbake/lib/bb/monitordisk.py b/bitbake/lib/bb/monitordisk.py index 1a25b00..e7c0726 100644 --- a/bitbake/lib/bb/monitordisk.py +++ b/bitbake/lib/bb/monitordisk.py @@ -4,7 +4,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -import os, logging, re, sys +import os, logging, re import bb logger =3D logging.getLogger("BitBake.Monitor") =20 diff --git a/bitbake/lib/bb/msg.py b/bitbake/lib/bb/msg.py index 6216eb3..2d88c4e 100644 --- a/bitbake/lib/bb/msg.py +++ b/bitbake/lib/bb/msg.py @@ -13,9 +13,8 @@ Message handling infrastructure for bitbake import sys import copy import logging -import collections +import logging.config from itertools import groupby -import warnings import bb import bb.event =20 @@ -100,6 +99,9 @@ class BBLogFormatter(logging.Formatter): def enable_color(self): self.color_enabled =3D True =20 + def __repr__(self): + return "%s fmt=3D'%s' color=3D%s" % (self.__class__.__name__, self= ._fmt, "True" if self.color_enabled else "False") + class BBLogFilter(object): def __init__(self, handler, level, debug_domains): self.stdlevel =3D level @@ -118,60 +120,59 @@ class BBLogFilter(object): return True return False =20 -class BBLogFilterStdErr(BBLogFilter): +class LogFilterGEQLevel(logging.Filter): + def __init__(self, level): + self.strlevel =3D str(level) + self.level =3D stringToLevel(level) + + def __repr__(self): + return "%s level >=3D %s (%d)" % (self.__class__.__name__, self.st= rlevel, self.level) + def filter(self, record): - if not BBLogFilter.filter(self, record): - return False - if record.levelno >=3D logging.ERROR: - return True - return False + return (record.levelno >=3D self.level) + +class LogFilterLTLevel(logging.Filter): + def __init__(self, level): + self.strlevel =3D str(level) + self.level =3D stringToLevel(level) + + def __repr__(self): + return "%s level < %s (%d)" % (self.__class__.__name__, self.strle= vel, self.level) =20 -class BBLogFilterStdOut(BBLogFilter): def filter(self, record): - if not BBLogFilter.filter(self, record): - return False - if record.levelno < logging.ERROR: - return True - return False + return (record.levelno < self.level) =20 # Message control functions # =20 -loggerDefaultDebugLevel =3D 0 +loggerDefaultLogLevel =3D BBLogFormatter.NOTE loggerDefaultVerbose =3D False loggerVerboseLogs =3D False -loggerDefaultDomains =3D [] +loggerDefaultDomains =3D {} =20 def init_msgconfig(verbose, debug, debug_domains=3DNone): """ Set default verbosity and debug levels config the logger """ - bb.msg.loggerDefaultDebugLevel =3D debug bb.msg.loggerDefaultVerbose =3D verbose if verbose: bb.msg.loggerVerboseLogs =3D True - if debug_domains: - bb.msg.loggerDefaultDomains =3D debug_domains - else: - bb.msg.loggerDefaultDomains =3D [] - -def constructLogOptions(): - debug =3D loggerDefaultDebugLevel - verbose =3D loggerDefaultVerbose - domains =3D loggerDefaultDomains =20 if debug: - level =3D BBLogFormatter.DEBUG - debug + 1 + bb.msg.loggerDefaultLogLevel =3D BBLogFormatter.DEBUG - debug + 1 elif verbose: - level =3D BBLogFormatter.VERBOSE + bb.msg.loggerDefaultLogLevel =3D BBLogFormatter.VERBOSE else: - level =3D BBLogFormatter.NOTE + bb.msg.loggerDefaultLogLevel =3D BBLogFormatter.NOTE =20 - debug_domains =3D {} - for (domainarg, iterator) in groupby(domains): - dlevel =3D len(tuple(iterator)) - debug_domains["BitBake.%s" % domainarg] =3D logging.DEBUG - dlevel= + 1 - return level, debug_domains + bb.msg.loggerDefaultDomains =3D {} + if debug_domains: + for (domainarg, iterator) in groupby(debug_domains): + dlevel =3D len(tuple(iterator)) + bb.msg.loggerDefaultDomains["BitBake.%s" % domainarg] =3D logg= ing.DEBUG - dlevel + 1 + +def constructLogOptions(): + return loggerDefaultLogLevel, loggerDefaultDomains =20 def addDefaultlogFilter(handler, cls =3D BBLogFilter, forcelevel=3DNone): level, debug_domains =3D constructLogOptions() @@ -181,6 +182,19 @@ def addDefaultlogFilter(handler, cls =3D BBLogFilter, = forcelevel=3DNone): =20 cls(handler, level, debug_domains) =20 +def stringToLevel(level): + try: + return int(level) + except ValueError: + pass + + try: + return getattr(logging, level) + except AttributeError: + pass + + return getattr(BBLogFormatter, level) + # # Message handling functions # @@ -214,3 +228,105 @@ def has_console_handler(logger): if handler.stream in [sys.stderr, sys.stdout]: return True return False + +def mergeLoggingConfig(logconfig, userconfig): + logconfig =3D copy.deepcopy(logconfig) + userconfig =3D copy.deepcopy(userconfig) + + # Merge config with the default config + if userconfig.get('version') !=3D logconfig['version']: + raise BaseException("Bad user configuration version. Expected %r, = got %r" % (logconfig['version'], userconfig.get('version'))) + + # Set some defaults to make merging easier + userconfig.setdefault("loggers", {}) + + # If a handler, formatter, or filter is defined in the user + # config, it will replace an existing one in the default config + for k in ("handlers", "formatters", "filters"): + logconfig.setdefault(k, {}).update(userconfig.get(k, {})) + + seen_loggers =3D set() + for name, l in logconfig["loggers"].items(): + # If the merge option is set, merge the handlers and + # filters. Otherwise, if it is False, this logger won't get + # add to the set of seen loggers and will replace the + # existing one + if l.get('bitbake_merge', True): + ulogger =3D userconfig["loggers"].setdefault(name, {}) + ulogger.setdefault("handlers", []) + ulogger.setdefault("filters", []) + + # Merge lists + l.setdefault("handlers", []).extend(ulogger["handlers"]) + l.setdefault("filters", []).extend(ulogger["filters"]) + + # Replace other properties if present + if "level" in ulogger: + l["level"] =3D ulogger["level"] + + if "propagate" in ulogger: + l["propagate"] =3D ulogger["propagate"] + + seen_loggers.add(name) + + # Add all loggers present in the user config, but not any that + # have already been processed + for name in set(userconfig["loggers"].keys()) - seen_loggers: + logconfig["loggers"][name] =3D userconfig["loggers"][name] + + return logconfig + +def setLoggingConfig(defaultconfig, userconfigfile=3DNone): + logconfig =3D copy.deepcopy(defaultconfig) + + if userconfigfile: + with open(os.path.normpath(userconfigfile), 'r') as f: + if userconfigfile.endswith('.yml') or userconfigfile.endswith(= '.yaml'): + import yaml + userconfig =3D yaml.load(f) + elif userconfigfile.endswith('.json') or userconfigfile.endswi= th('.cfg'): + import json + userconfig =3D json.load(f) + else: + raise BaseException("Unrecognized file format: %s" % userc= onfigfile) + + if userconfig.get('bitbake_merge', True): + logconfig =3D mergeLoggingConfig(logconfig, userconfig) + else: + # Replace the entire default config + logconfig =3D userconfig + + # Convert all level parameters to integers in case users want to use t= he + # bitbake defined level names + for h in logconfig["handlers"].values(): + if "level" in h: + h["level"] =3D bb.msg.stringToLevel(h["level"]) + + for l in logconfig["loggers"].values(): + if "level" in l: + l["level"] =3D bb.msg.stringToLevel(l["level"]) + + conf =3D logging.config.dictConfigClass(logconfig) + conf.configure() + + # The user may have specified logging domains they want at a higher de= bug + # level than the standard. + for name, l in logconfig["loggers"].items(): + if not name.startswith("BitBake."): + continue + + if not "level" in l: + continue + + curlevel =3D bb.msg.loggerDefaultDomains.get(name) + # Note: level parameter should already be a int because of convers= ion + # above + newlevel =3D int(l["level"]) + if curlevel is None or newlevel < curlevel: + bb.msg.loggerDefaultDomains[name] =3D newlevel + + # TODO: I don't think that setting the global log level should be = necessary + #if newlevel < bb.msg.loggerDefaultLogLevel: + # bb.msg.loggerDefaultLogLevel =3D newlevel + + return conf diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index f0911e6..eb8cfa2 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py @@ -9,11 +9,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -import re -import string -import logging import bb -import itertools from bb import methodpool from bb.parse import logger =20 @@ -93,7 +89,7 @@ class DataNode(AstNode): self.groupd =3D groupd =20 def getFunc(self, key, data): - if 'flag' in self.groupd and self.groupd['flag'] !=3D None: + if 'flag' in self.groupd and self.groupd['flag'] is not None: return data.getVarFlag(key, self.groupd['flag'], expand=3DFals= e, noweakdefault=3DTrue) else: return data.getVar(key, False, noweakdefault=3DTrue, parsing= =3DTrue) @@ -106,36 +102,36 @@ class DataNode(AstNode): 'file': self.filename, 'line': self.lineno, } - if "exp" in groupd and groupd["exp"] !=3D None: + if "exp" in groupd and groupd["exp"] is not None: data.setVarFlag(key, "export", 1, op =3D 'exported', **loginfo= ) =20 op =3D "set" - if "ques" in groupd and groupd["ques"] !=3D None: + if "ques" in groupd and groupd["ques"] is not None: val =3D self.getFunc(key, data) op =3D "set?" - if val =3D=3D None: + if val is None: val =3D groupd["value"] - elif "colon" in groupd and groupd["colon"] !=3D None: + elif "colon" in groupd and groupd["colon"] is not None: e =3D data.createCopy() op =3D "immediate" val =3D e.expand(groupd["value"], key + "[:=3D]") - elif "append" in groupd and groupd["append"] !=3D None: + elif "append" in groupd and groupd["append"] is not None: op =3D "append" val =3D "%s %s" % ((self.getFunc(key, data) or ""), groupd["va= lue"]) - elif "prepend" in groupd and groupd["prepend"] !=3D None: + elif "prepend" in groupd and groupd["prepend"] is not None: op =3D "prepend" val =3D "%s %s" % (groupd["value"], (self.getFunc(key, data) o= r "")) - elif "postdot" in groupd and groupd["postdot"] !=3D None: + elif "postdot" in groupd and groupd["postdot"] is not None: op =3D "postdot" val =3D "%s%s" % ((self.getFunc(key, data) or ""), groupd["val= ue"]) - elif "predot" in groupd and groupd["predot"] !=3D None: + elif "predot" in groupd and groupd["predot"] is not None: op =3D "predot" val =3D "%s%s" % (groupd["value"], (self.getFunc(key, data) or= "")) else: val =3D groupd["value"] =20 flag =3D None - if 'flag' in groupd and groupd['flag'] !=3D None: + if 'flag' in groupd and groupd['flag'] is not None: flag =3D groupd['flag'] elif groupd["lazyques"]: flag =3D "_defaultval" diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/pa= rse/parse_py/BBHandler.py index 6f7cf82..6e216ef 100644 --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py @@ -13,9 +13,7 @@ # =20 import re, bb, os -import logging import bb.build, bb.utils -from bb import data =20 from . import ConfHandler from .. import resolve_file, ast, logger, ParseError diff --git a/bitbake/lib/bb/parse/parse_py/ConfHandler.py b/bitbake/lib/bb/= parse/parse_py/ConfHandler.py index 2e84b91..af64d34 100644 --- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py +++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py @@ -119,30 +119,30 @@ def handle(fn, data, include): oldfile =3D data.getVar('FILE', False) =20 abs_fn =3D resolve_file(fn, data) - f =3D open(abs_fn, 'r') - - statements =3D ast.StatementGroup() - lineno =3D 0 - while True: - lineno =3D lineno + 1 - s =3D f.readline() - if not s: - break - w =3D s.strip() - # skip empty lines - if not w: - continue - s =3D s.rstrip() - while s[-1] =3D=3D '\\': - s2 =3D f.readline().rstrip() + with open(abs_fn, 'r') as f: + + statements =3D ast.StatementGroup() + lineno =3D 0 + while True: lineno =3D lineno + 1 - if (not s2 or s2 and s2[0] !=3D "#") and s[0] =3D=3D "#" : - bb.fatal("There is a confusing multiline, partially commen= ted expression on line %s of file %s (%s).\nPlease clarify whether this is = all a comment or should be parsed." % (lineno, fn, s)) - s =3D s[:-1] + s2 - # skip comments - if s[0] =3D=3D '#': - continue - feeder(lineno, s, abs_fn, statements) + s =3D f.readline() + if not s: + break + w =3D s.strip() + # skip empty lines + if not w: + continue + s =3D s.rstrip() + while s[-1] =3D=3D '\\': + s2 =3D f.readline().rstrip() + lineno =3D lineno + 1 + if (not s2 or s2 and s2[0] !=3D "#") and s[0] =3D=3D "#" : + bb.fatal("There is a confusing multiline, partially co= mmented expression on line %s of file %s (%s).\nPlease clarify whether this= is all a comment or should be parsed." % (lineno, fn, s)) + s =3D s[:-1] + s2 + # skip comments + if s[0] =3D=3D '#': + continue + feeder(lineno, s, abs_fn, statements) =20 # DONE WITH PARSING... time to evaluate data.setVar('FILE', abs_fn) diff --git a/bitbake/lib/bb/persist_data.py b/bitbake/lib/bb/persist_data.p= y index de8f87a..7357ab2 100644 --- a/bitbake/lib/bb/persist_data.py +++ b/bitbake/lib/bb/persist_data.py @@ -179,6 +179,9 @@ class SQLTable(collections.MutableMapping): elif not isinstance(value, str): raise TypeError('Only string values are supported') =20 + # Ensure the entire transaction (including SELECT) executes under = write lock + cursor.execute("BEGIN EXCLUSIVE") + cursor.execute("SELECT * from %s where key=3D?;" % self.table, [ke= y]) row =3D cursor.fetchone() if row is not None: diff --git a/bitbake/lib/bb/progress.py b/bitbake/lib/bb/progress.py index 4022caa..9c755b7 100644 --- a/bitbake/lib/bb/progress.py +++ b/bitbake/lib/bb/progress.py @@ -7,7 +7,6 @@ BitBake progress handling code # SPDX-License-Identifier: GPL-2.0-only # =20 -import sys import re import time import inspect diff --git a/bitbake/lib/bb/providers.py b/bitbake/lib/bb/providers.py index f80963c..81459c3 100644 --- a/bitbake/lib/bb/providers.py +++ b/bitbake/lib/bb/providers.py @@ -92,11 +92,11 @@ def preferredVersionMatch(pe, pv, pr, preferred_e, pref= erred_v, preferred_r): Check if the version pe,pv,pr is the preferred one. If there is preferred version defined and ends with '%', then pv has t= o start with that version after removing the '%' """ - if (pr =3D=3D preferred_r or preferred_r =3D=3D None): - if (pe =3D=3D preferred_e or preferred_e =3D=3D None): + if pr =3D=3D preferred_r or preferred_r is None: + if pe =3D=3D preferred_e or preferred_e is None: if preferred_v =3D=3D pv: return True - if preferred_v !=3D None and preferred_v.endswith('%') and pv.= startswith(preferred_v[:len(preferred_v)-1]): + if preferred_v is not None and preferred_v.endswith('%') and p= v.startswith(preferred_v[:len(preferred_v)-1]): return True return False =20 diff --git a/bitbake/lib/bb/pysh/pyshyacc.py b/bitbake/lib/bb/pysh/pyshyacc= .py index de565dc..924860a 100644 --- a/bitbake/lib/bb/pysh/pyshyacc.py +++ b/bitbake/lib/bb/pysh/pyshyacc.py @@ -570,6 +570,7 @@ def p_linebreak(p): =20 def p_separator_op(p): =20 """separator_op : COMMA + | COMMA COMMA | AMP""" p[0] =3D p[1] =20 diff --git a/bitbake/lib/bb/remotedata.py b/bitbake/lib/bb/remotedata.py index 7391e1b..6c9864d 100644 --- a/bitbake/lib/bb/remotedata.py +++ b/bitbake/lib/bb/remotedata.py @@ -17,16 +17,16 @@ class RemoteDatastores: self.cooker =3D cooker self.datastores =3D {} self.locked =3D [] + self.datastores[0] =3D self.cooker.data self.nextindex =3D 1 =20 def __len__(self): return len(self.datastores) =20 def __getitem__(self, key): - if key is None: - return self.cooker.data - else: - return self.datastores[key] + # Cooker could have changed its datastore from under us + self.datastores[0] =3D self.cooker.data + return self.datastores[key] =20 def items(self): return self.datastores.items() @@ -63,44 +63,3 @@ class RemoteDatastores: raise Exception('Tried to release locked datastore %d' % idx) del self.datastores[idx] =20 - def receive_datastore(self, remote_data): - """Receive a datastore object sent from the client (as prepared by= transmit_datastore())""" - dct =3D dict(remote_data) - d =3D bb.data_smart.DataSmart() - d.dict =3D dct - while True: - if '_remote_data' in dct: - dsindex =3D dct['_remote_data']['_content'] - del dct['_remote_data'] - if dsindex is None: - dct['_data'] =3D self.cooker.data.dict - else: - dct['_data'] =3D self.datastores[dsindex].dict - break - elif '_data' in dct: - idct =3D dict(dct['_data']) - dct['_data'] =3D idct - dct =3D idct - else: - break - return d - - @staticmethod - def transmit_datastore(d): - """Prepare a datastore object for sending over IPC from the client= end""" - # FIXME content might be a dict, need to turn that into a list as = well - def copy_dicts(dct): - if '_remote_data' in dct: - dsindex =3D dct['_remote_data']['_content'].dsindex - newdct =3D dct.copy() - newdct['_remote_data'] =3D {'_content': dsindex} - return list(newdct.items()) - elif '_data' in dct: - newdct =3D dct.copy() - newdata =3D copy_dicts(dct['_data']) - if newdata: - newdct['_data'] =3D newdata - return list(newdct.items()) - return None - main_dict =3D copy_dicts(d.dict) - return main_dict diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 1804943..30cab53 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py @@ -12,14 +12,12 @@ Handles preparation and execution of a queue of tasks import copy import os import sys -import signal import stat -import fcntl import errno import logging import re import bb -from bb import msg, data, event +from bb import msg, event from bb import monitordisk import subprocess import pickle @@ -29,6 +27,7 @@ import pprint =20 bblogger =3D logging.getLogger("BitBake") logger =3D logging.getLogger("BitBake.RunQueue") +hashequiv_logger =3D logging.getLogger("BitBake.RunQueue.HashEquiv") =20 __find_sha256__ =3D re.compile( r'(?i)(?<![a-z0-9])[a-f0-9]{64}(?![a-z0-9]= )' ) =20 @@ -148,8 +147,9 @@ class RunQueueScheduler(object): """ Return the id of the first task we find that is buildable """ + # Once tasks are running we don't need to worry about them again + self.buildable.difference_update(self.rq.runq_running) buildable =3D set(self.buildable) - buildable.difference_update(self.rq.runq_running) buildable.difference_update(self.rq.holdoff_tasks) buildable.intersection_update(self.rq.tasks_covered | self.rq.task= s_notcovered) if not buildable: @@ -207,8 +207,6 @@ class RunQueueScheduler(object): =20 def newbuildable(self, task): self.buildable.add(task) - # Once tasks are running we don't need to worry about them again - self.buildable.difference_update(self.rq.runq_running) =20 def removebuildable(self, task): self.buildable.remove(task) @@ -923,9 +921,11 @@ class RunQueueData: runq_build =3D {} =20 for task in self.cooker.configuration.runall: + if not task.startswith("do_"): + task =3D "do_{0}".format(task) runall_tids =3D set() for tid in list(self.runtaskentries): - wanttid =3D fn_from_tid(tid) + ":do_%s" % task + wanttid =3D "{0}:{1}".format(fn_from_tid(tid), task) if wanttid in delcount: self.runtaskentries[wanttid] =3D delcount[wanttid] if wanttid in self.runtaskentries: @@ -952,7 +952,9 @@ class RunQueueData: runq_build =3D {} =20 for task in self.cooker.configuration.runonly: - runonly_tids =3D { k: v for k, v in self.runtaskentries.it= ems() if taskname_from_tid(k) =3D=3D "do_%s" % task } + if not task.startswith("do_"): + task =3D "do_{0}".format(task) + runonly_tids =3D { k: v for k, v in self.runtaskentries.it= ems() if taskname_from_tid(k) =3D=3D task } =20 for tid in list(runonly_tids): mark_active(tid,1) @@ -1125,14 +1127,14 @@ class RunQueueData: self.init_progress_reporter.next_stage() =20 # Iterate over the task list looking for tasks with a 'setscene' f= unction - self.runq_setscene_tids =3D [] + self.runq_setscene_tids =3D set() if not self.cooker.configuration.nosetscene: for tid in self.runtaskentries: (mc, fn, taskname, _) =3D split_tid_mcfn(tid) setscenetid =3D tid + "_setscene" if setscenetid not in taskData[mc].taskentries: continue - self.runq_setscene_tids.append(tid) + self.runq_setscene_tids.add(tid) =20 self.init_progress_reporter.next_stage() =20 @@ -1182,10 +1184,8 @@ class RunQueueData: return len(self.runtaskentries) =20 def prepare_task_hash(self, tid): - procdep =3D [] - for dep in self.runtaskentries[tid].depends: - procdep.append(dep) - self.runtaskentries[tid].hash =3D bb.parse.siggen.get_taskhash(tid= , procdep, self.dataCaches[mc_from_tid(tid)]) + bb.parse.siggen.prep_taskhash(tid, self.runtaskentries[tid].depend= s, self.dataCaches[mc_from_tid(tid)]) + self.runtaskentries[tid].hash =3D bb.parse.siggen.get_taskhash(tid= , self.runtaskentries[tid].depends, self.dataCaches[mc_from_tid(tid)]) self.runtaskentries[tid].unihash =3D bb.parse.siggen.get_unihash(t= id) =20 def dump_data(self): @@ -1255,7 +1255,7 @@ class RunQueue: "fakerootdirs" : self.rqdata.dataCaches[mc].fakerootdirs, "fakerootnoenv" : self.rqdata.dataCaches[mc].fakerootnoenv, "sigdata" : bb.parse.siggen.get_taskdata(), - "logdefaultdebug" : bb.msg.loggerDefaultDebugLevel, + "logdefaultlevel" : bb.msg.loggerDefaultLogLevel, "logdefaultverbose" : bb.msg.loggerDefaultVerbose, "logdefaultverboselogs" : bb.msg.loggerVerboseLogs, "logdefaultdomain" : bb.msg.loggerDefaultDomains, @@ -1397,7 +1397,7 @@ class RunQueue: cache[tid] =3D iscurrent return iscurrent =20 - def validate_hashes(self, tocheck, data, currentcount=3D0, siginfo=3DF= alse): + def validate_hashes(self, tocheck, data, currentcount=3D0, siginfo=3DF= alse, summary=3DTrue): valid =3D set() if self.hashvalidate: sq_data =3D {} @@ -1410,15 +1410,15 @@ class RunQueue: sq_data['hashfn'][tid] =3D self.rqdata.dataCaches[mc].hash= fn[taskfn] sq_data['unihash'][tid] =3D self.rqdata.runtaskentries[tid= ].unihash =20 - valid =3D self.validate_hash(sq_data, data, siginfo, currentco= unt) + valid =3D self.validate_hash(sq_data, data, siginfo, currentco= unt, summary) =20 return valid =20 - def validate_hash(self, sq_data, d, siginfo, currentcount): - locs =3D {"sq_data" : sq_data, "d" : d, "siginfo" : siginfo, "curr= entcount" : currentcount} + def validate_hash(self, sq_data, d, siginfo, currentcount, summary): + locs =3D {"sq_data" : sq_data, "d" : d, "siginfo" : siginfo, "curr= entcount" : currentcount, "summary" : summary} =20 # Metadata has **kwargs so args can be added, sq_data can also gai= n new fields - call =3D self.hashvalidate + "(sq_data, d, siginfo=3Dsiginfo, curr= entcount=3Dcurrentcount)" + call =3D self.hashvalidate + "(sq_data, d, siginfo=3Dsiginfo, curr= entcount=3Dcurrentcount, summary=3Dsummary)" =20 return bb.utils.better_eval(call, locs) =20 @@ -1605,7 +1605,7 @@ class RunQueue: =20 tocheck.add(tid) =20 - valid_new =3D self.validate_hashes(tocheck, self.cooker.data, 0, T= rue) + valid_new =3D self.validate_hashes(tocheck, self.cooker.data, 0, T= rue, summary=3DFalse) =20 # Tasks which are both setscene and noexec never care about depend= encies # We therefore find tasks which are setscene and noexec and mark t= heir @@ -1711,6 +1711,7 @@ class RunQueueExecute: self.runq_buildable =3D set() self.runq_running =3D set() self.runq_complete =3D set() + self.runq_tasksrun =3D set() =20 self.build_stamps =3D {} self.build_stamps2 =3D [] @@ -1896,6 +1897,7 @@ class RunQueueExecute: self.stats.taskCompleted() bb.event.fire(runQueueTaskCompleted(task, self.stats, self.rq), se= lf.cfgData) self.task_completeoutright(task) + self.runq_tasksrun.add(task) =20 def task_fail(self, task, exitcode): """ @@ -1962,12 +1964,17 @@ class RunQueueExecute: """ =20 self.rq.read_workers() - self.process_possible_migrations() + if self.updated_taskhash_queue or self.pending_migrations: + self.process_possible_migrations() + + if not hasattr(self, "sorted_setscene_tids"): + # Don't want to sort this set every execution + self.sorted_setscene_tids =3D sorted(self.rqdata.runq_setscene= _tids) =20 task =3D None if not self.sqdone and self.can_start_task(): # Find the next setscene to run - for nexttask in sorted(self.rqdata.runq_setscene_tids): + for nexttask in self.sorted_setscene_tids: if nexttask in self.sq_buildable and nexttask not in self.= sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values= (): if nexttask not in self.sqdata.unskippable and len(sel= f.sqdata.sq_revdeps[nexttask]) > 0 and self.sqdata.sq_revdeps[nexttask].iss= ubset(self.scenequeue_covered) and self.check_dependencies(nexttask, self.s= qdata.sq_revdeps[nexttask]): if nexttask not in self.rqdata.target_tids: @@ -1986,7 +1993,7 @@ class RunQueueExecute: continue logger.debug(1, "Task %s no longer deferred" % nex= ttask) del self.sq_deferred[nexttask] - valid =3D self.rq.validate_hashes(set([nexttask]),= self.cooker.data, 0, False) + valid =3D self.rq.validate_hashes(set([nexttask]),= self.cooker.data, 0, False, summary=3DFalse) if not valid: logger.debug(1, "%s didn't become valid, skipp= ing setscene" % nexttask) self.sq_task_failoutright(nexttask) @@ -2052,7 +2059,7 @@ class RunQueueExecute: self.update_holdofftasks() =20 if not self.sq_live and not self.sqdone and not self.sq_deferred a= nd not self.updated_taskhash_queue and not self.holdoff_tasks: - logger.info("Setscene tasks completed") + hashequiv_logger.verbose("Setscene tasks completed") =20 err =3D self.summarise_scenequeue_errors() if err: @@ -2090,6 +2097,7 @@ class RunQueueExecute: logger.debug(2, "Stamp current task %s", task) =20 self.task_skip(task, "existing") + self.runq_tasksrun.add(task) return True =20 taskdep =3D self.rqdata.dataCaches[mc].task_deps[taskfn] @@ -2248,6 +2256,7 @@ class RunQueueExecute: def process_possible_migrations(self): =20 changed =3D set() + toprocess =3D set() for tid, unihash in self.updated_taskhash_queue.copy(): if tid in self.runq_running and tid not in self.runq_complete: continue @@ -2255,42 +2264,63 @@ class RunQueueExecute: self.updated_taskhash_queue.remove((tid, unihash)) =20 if unihash !=3D self.rqdata.runtaskentries[tid].unihash: - logger.info("Task %s unihash changed to %s" % (tid, unihas= h)) + hashequiv_logger.verbose("Task %s unihash changed to %s" %= (tid, unihash)) self.rqdata.runtaskentries[tid].unihash =3D unihash bb.parse.siggen.set_unihash(tid, unihash) + toprocess.add(tid) =20 - # Work out all tasks which depend on this one - total =3D set() - next =3D set(self.rqdata.runtaskentries[tid].revdeps) - while next: - current =3D next.copy() - total =3D total |next - next =3D set() - for ntid in current: - next |=3D self.rqdata.runtaskentries[ntid].revdeps - next.difference_update(total) - - # Now iterate those tasks in dependency order to regenerat= e their taskhash/unihash - done =3D set() - next =3D set(self.rqdata.runtaskentries[tid].revdeps) - while next: - current =3D next.copy() - next =3D set() - for tid in current: - if not self.rqdata.runtaskentries[tid].depends.isd= isjoint(total): - continue - procdep =3D [] - for dep in self.rqdata.runtaskentries[tid].depends= : - procdep.append(dep) - orighash =3D self.rqdata.runtaskentries[tid].hash - self.rqdata.runtaskentries[tid].hash =3D bb.parse.= siggen.get_taskhash(tid, procdep, self.rqdata.dataCaches[mc_from_tid(tid)]) - origuni =3D self.rqdata.runtaskentries[tid].unihas= h - self.rqdata.runtaskentries[tid].unihash =3D bb.par= se.siggen.get_unihash(tid) - logger.debug(1, "Task %s hash changes: %s->%s %s->= %s" % (tid, orighash, self.rqdata.runtaskentries[tid].hash, origuni, self.r= qdata.runtaskentries[tid].unihash)) - next |=3D self.rqdata.runtaskentries[tid].revdeps - changed.add(tid) - total.remove(tid) - next.intersection_update(total) + # Work out all tasks which depend upon these + total =3D set() + next =3D set() + for p in toprocess: + next |=3D self.rqdata.runtaskentries[p].revdeps + while next: + current =3D next.copy() + total =3D total | next + next =3D set() + for ntid in current: + next |=3D self.rqdata.runtaskentries[ntid].revdeps + next.difference_update(total) + + # Now iterate those tasks in dependency order to regenerate their = taskhash/unihash + next =3D set() + for p in total: + if len(self.rqdata.runtaskentries[p].depends) =3D=3D 0: + next.add(p) + elif self.rqdata.runtaskentries[p].depends.isdisjoint(total): + next.add(p) + + # When an item doesn't have dependencies in total, we can process = it. Drop items from total when handled + while next: + current =3D next.copy() + next =3D set() + for tid in current: + if len(self.rqdata.runtaskentries[p].depends) and not self= .rqdata.runtaskentries[tid].depends.isdisjoint(total): + continue + orighash =3D self.rqdata.runtaskentries[tid].hash + newhash =3D bb.parse.siggen.get_taskhash(tid, self.rqdata.= runtaskentries[tid].depends, self.rqdata.dataCaches[mc_from_tid(tid)]) + origuni =3D self.rqdata.runtaskentries[tid].unihash + newuni =3D bb.parse.siggen.get_unihash(tid) + # FIXME, need to check it can come from sstate at all for = determinism? + remapped =3D False + if newuni =3D=3D origuni: + # Nothing to do, we match, skip code below + remapped =3D True + elif tid in self.scenequeue_covered or tid in self.sq_live= : + # Already ran this setscene task or it running. Report= the new taskhash + bb.parse.siggen.report_unihash_equiv(tid, newhash, ori= guni, newuni, self.rqdata.dataCaches) + hashequiv_logger.verbose("Already covered setscene for= %s so ignoring rehash (remap)" % (tid)) + remapped =3D True + + if not remapped: + #logger.debug(1, "Task %s hash changes: %s->%s %s->%s"= % (tid, orighash, newhash, origuni, newuni)) + self.rqdata.runtaskentries[tid].hash =3D newhash + self.rqdata.runtaskentries[tid].unihash =3D newuni + changed.add(tid) + + next |=3D self.rqdata.runtaskentries[tid].revdeps + total.remove(tid) + next.intersection_update(total) =20 if changed: for mc in self.rq.worker: @@ -2298,26 +2328,26 @@ class RunQueueExecute: for mc in self.rq.fakeworker: self.rq.fakeworker[mc].process.stdin.write(b"<newtaskhashe= s>" + pickle.dumps(bb.parse.siggen.get_taskhashes()) + b"</newtaskhashes>") =20 - logger.debug(1, pprint.pformat("Tasks changed:\n%s" % (changed= ))) + hashequiv_logger.debug(1, pprint.pformat("Tasks changed:\n%s" = % (changed))) =20 for tid in changed: if tid not in self.rqdata.runq_setscene_tids: continue - if tid in self.runq_running: - continue - if tid in self.scenequeue_covered: - # Potentially risky, should we report this hash as a match= ? - logger.info("Already covered setscene for %s so ignoring r= ehash" % (tid)) - continue if tid not in self.pending_migrations: self.pending_migrations.add(tid) =20 + update_tasks =3D [] for tid in self.pending_migrations.copy(): + if tid in self.runq_running or tid in self.sq_live: + # Too late, task already running, not much we can do now + self.pending_migrations.remove(tid) + continue + valid =3D True # Check no tasks this covers are running for dep in self.sqdata.sq_covered_tasks[tid]: if dep in self.runq_running and dep not in self.runq_compl= ete: - logger.debug(2, "Task %s is running which blocks setsc= ene for %s from running" % (dep, tid)) + hashequiv_logger.debug(2, "Task %s is running which bl= ocks setscene for %s from running" % (dep, tid)) valid =3D False break if not valid: @@ -2329,6 +2359,12 @@ class RunQueueExecute: if tid in self.tasks_scenequeue_done: self.tasks_scenequeue_done.remove(tid) for dep in self.sqdata.sq_covered_tasks[tid]: + if dep in self.runq_complete and dep not in self.runq_task= srun: + bb.error("Task %s marked as completed but now needing = to rerun? Aborting build." % dep) + self.failed_tids.append(tid) + self.rq.state =3D runQueueCleanUp + return + if dep not in self.runq_complete: if dep in self.tasks_scenequeue_done and dep not in se= lf.sqdata.unskippable: self.tasks_scenequeue_done.remove(dep) @@ -2337,7 +2373,12 @@ class RunQueueExecute: self.sq_buildable.remove(tid) if tid in self.sq_running: self.sq_running.remove(tid) - if self.sqdata.sq_revdeps[tid].issubset(self.scenequeue_covere= d | self.scenequeue_notcovered): + harddepfail =3D False + for t in self.sqdata.sq_harddeps: + if tid in self.sqdata.sq_harddeps[t] and t in self.scenequ= eue_notcovered: + harddepfail =3D True + break + if not harddepfail and self.sqdata.sq_revdeps[tid].issubset(se= lf.scenequeue_covered | self.scenequeue_notcovered): if tid not in self.sq_buildable: self.sq_buildable.add(tid) if len(self.sqdata.sq_revdeps[tid]) =3D=3D 0: @@ -2361,9 +2402,17 @@ class RunQueueExecute: if tid in self.build_stamps: del self.build_stamps[tid] =20 - logger.info("Setscene task %s now valid and being rerun" % tid= ) + update_tasks.append((tid, harddepfail, tid in self.sqdata.vali= d)) + + if update_tasks: self.sqdone =3D False - update_scenequeue_data([tid], self.sqdata, self.rqdata, self.r= q, self.cooker, self.stampcache, self) + update_scenequeue_data([t[0] for t in update_tasks], self.sqda= ta, self.rqdata, self.rq, self.cooker, self.stampcache, self, summary=3DFal= se) + + for (tid, harddepfail, origvalid) in update_tasks: + if tid in self.sqdata.valid and not origvalid: + hashequiv_logger.verbose("Setscene task %s became valid" %= tid) + if harddepfail: + self.sq_task_failoutright(tid) =20 if changed: self.holdoff_need_update =3D True @@ -2500,6 +2549,8 @@ class RunQueueExecute: msg =3D 'Task %s.%s attempted to execute unexpectedly and = should have been setscened' % (pn, taskname) else: msg =3D 'Task %s.%s attempted to execute unexpectedly' % (= pn, taskname) + for t in self.scenequeue_notcovered: + msg =3D msg + "\nTask %s, unihash %s, taskhash %s" % (t, s= elf.rqdata.runtaskentries[t].unihash, self.rqdata.runtaskentries[t].hash) logger.error(msg + '\nThis is usually due to missing setscene = tasks. Those missing in this build were: %s' % pprint.pformat(self.sceneque= ue_notcovered)) return True return False @@ -2692,9 +2743,9 @@ def build_scenequeue_data(sqdata, rqdata, rq, cooker,= stampcache, sqrq): sqdata.stamppresent =3D set() sqdata.valid =3D set() =20 - update_scenequeue_data(sqdata.sq_revdeps, sqdata, rqdata, rq, cooker, = stampcache, sqrq) + update_scenequeue_data(sqdata.sq_revdeps, sqdata, rqdata, rq, cooker, = stampcache, sqrq, summary=3DTrue) =20 -def update_scenequeue_data(tids, sqdata, rqdata, rq, cooker, stampcache, s= qrq): +def update_scenequeue_data(tids, sqdata, rqdata, rq, cooker, stampcache, s= qrq, summary=3DTrue): =20 tocheck =3D set() =20 @@ -2728,7 +2779,7 @@ def update_scenequeue_data(tids, sqdata, rqdata, rq, = cooker, stampcache, sqrq): =20 tocheck.add(tid) =20 - sqdata.valid |=3D rq.validate_hashes(tocheck, cooker.data, len(sqdata.= stamppresent), False) + sqdata.valid |=3D rq.validate_hashes(tocheck, cooker.data, len(sqdata.= stamppresent), False, summary=3Dsummary) =20 sqdata.hashes =3D {} for mc in sorted(sqdata.multiconfigs): @@ -2750,7 +2801,7 @@ def update_scenequeue_data(tids, sqdata, rqdata, rq, = cooker, stampcache, sqrq): sqdata.hashes[h] =3D tid else: sqrq.sq_deferred[tid] =3D sqdata.hashes[h] - bb.warn("Deferring %s after %s" % (tid, sqdata.hashes[h])) + bb.note("Deferring %s after %s" % (tid, sqdata.hashes[h])) =20 =20 class TaskFailure(Exception): @@ -2907,7 +2958,12 @@ class runQueuePipe(): while index !=3D -1 and self.queue.startswith(b"<event>"): try: event =3D pickle.loads(self.queue[7:index]) - except ValueError as e: + except (ValueError, pickle.UnpicklingError, AttributeError= , IndexError) as e: + if isinstance(e, pickle.UnpicklingError) and "truncate= d" in str(e): + # The pickled data could contain "</event>" so sea= rch for the next occurance + # unpickling again, this should be the only way an= unpickle error could occur + index =3D self.queue.find(b"</event>", index + 1) + continue bb.msg.fatal("RunQueue", "failed load pickle '%s': '%s= '" % (e, self.queue[7:index])) bb.event.fire_from_worker(event, self.d) if isinstance(event, taskUniHashUpdate): @@ -2919,7 +2975,7 @@ class runQueuePipe(): while index !=3D -1 and self.queue.startswith(b"<exitcode>"): try: task, status =3D pickle.loads(self.queue[10:index]) - except ValueError as e: + except (ValueError, pickle.UnpicklingError, AttributeError= , IndexError) as e: bb.msg.fatal("RunQueue", "failed load pickle '%s': '%s= '" % (e, self.queue[10:index])) self.rqexec.runqueue_process_waitpid(task, status) found =3D True diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/proce= ss.py index 69aae62..9ec79f5 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py @@ -48,7 +48,7 @@ class ProcessServer(multiprocessing.Process): =20 self.event_handle =3D None self.haveui =3D False - self.lastui =3D False + self.maxuiwait =3D 30 self.xmlrpc =3D False =20 self._idlefuns =3D {} @@ -155,6 +155,7 @@ class ProcessServer(multiprocessing.Process): print("No timeout, exiting.") self.quit =3D True =20 + self.lastui =3D time.time() while not self.quit: if self.sock in ready: while select.select([self.sock],[],[],0)[0]: @@ -191,11 +192,18 @@ class ProcessServer(multiprocessing.Process): except (EOFError, OSError): disconnect_client(self, fds) =20 - if not self.timeout =3D=3D -1.0 and not self.haveui and self.l= astui and self.timeout and \ + if not self.timeout =3D=3D -1.0 and not self.haveui and self.t= imeout and \ (self.lastui + self.timeout) < time.time(): print("Server timeout, exiting.") self.quit =3D True =20 + # If we don't see a UI connection within maxuiwait, its unlike= ly we're going to see + # one. We have had issue with processes hanging indefinitely s= o timing out UI-less + # servers is useful. + if not self.haveui and not self.timeout and (self.lastui + sel= f.maxuiwait) < time.time(): + print("No UI connection within max timeout, exiting to avo= id infinite loop.") + self.quit =3D True + if self.command_channel in ready: try: command =3D self.command_channel.get() @@ -220,10 +228,13 @@ class ProcessServer(multiprocessing.Process): =20 print("Exiting") # Remove the socket file so we don't get any more connections to a= void races - os.unlink(self.sockname) + try: + os.unlink(self.sockname) + except: + pass self.sock.close() =20 - try:=20 + try: self.cooker.shutdown(True) self.cooker.notifier.stop() self.cooker.confignotifier.stop() @@ -243,7 +254,7 @@ class ProcessServer(multiprocessing.Process): lock =3D bb.utils.lockfile(lockfile, shared=3DFalse, retry= =3DFalse, block=3DTrue) if lock: # We hold the lock so we can remove the file (hide sta= le pid data) - bb.utils.remove(lockfile) + # via unlockfile. bb.utils.unlockfile(lock) return =20 @@ -331,7 +342,9 @@ class ServerCommunicator(): def runCommand(self, command): self.connection.send(command) if not self.recv.poll(30): - raise ProcessTimeout("Timeout while waiting for a reply from t= he bitbake server") + logger.info("No reply from server in 30s") + if not self.recv.poll(30): + raise ProcessTimeout("Timeout while waiting for a reply fr= om the bitbake server (60s)") return self.recv.get() =20 def updateFeatureSet(self, featureset): diff --git a/bitbake/lib/bb/server/xmlrpcclient.py b/bitbake/lib/bb/server/= xmlrpcclient.py index c054c3c..442ea7b 100644 --- a/bitbake/lib/bb/server/xmlrpcclient.py +++ b/bitbake/lib/bb/server/xmlrpcclient.py @@ -7,9 +7,6 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -import os -import sys - import socket import http.client import xmlrpc.client diff --git a/bitbake/lib/bb/server/xmlrpcserver.py b/bitbake/lib/bb/server/= xmlrpcserver.py index 54fa32f..2fa71be 100644 --- a/bitbake/lib/bb/server/xmlrpcserver.py +++ b/bitbake/lib/bb/server/xmlrpcserver.py @@ -7,9 +7,6 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -import os -import sys - import hashlib import time import inspect diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index a4bb1ff..94d1762 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py @@ -14,8 +14,10 @@ import simplediff from bb.checksum import FileChecksumCache from bb import runqueue import hashserv +import hashserv.client =20 logger =3D logging.getLogger('BitBake.SigGen') +hashequiv_logger =3D logging.getLogger('BitBake.SigGen.HashEquiv') =20 def init(d): siggens =3D [obj for obj in globals().values() @@ -40,18 +42,26 @@ class SignatureGenerator(object): def __init__(self, data): self.basehash =3D {} self.taskhash =3D {} + self.unihash =3D {} self.runtaskdeps =3D {} self.file_checksum_values =3D {} self.taints =3D {} self.unitaskhashes =3D {} - self.setscenetasks =3D {} + self.tidtopn =3D {} + self.setscenetasks =3D set() =20 def finalise(self, fn, d, varient): return =20 + def postparsing_clean_cache(self): + return + def get_unihash(self, tid): return self.taskhash[tid] =20 + def prep_taskhash(self, tid, deps, dataCache): + return + def get_taskhash(self, tid, deps, dataCache): self.taskhash[tid] =3D hashlib.sha256(tid.encode("utf-8")).hexdige= st() return self.taskhash[tid] @@ -76,19 +86,19 @@ class SignatureGenerator(object): return =20 def get_taskdata(self): - return (self.runtaskdeps, self.taskhash, self.file_checksum_values= , self.taints, self.basehash, self.unitaskhashes, self.setscenetasks) + return (self.runtaskdeps, self.taskhash, self.unihash, self.file_c= hecksum_values, self.taints, self.basehash, self.unitaskhashes, self.tidtop= n, self.setscenetasks) =20 def set_taskdata(self, data): - self.runtaskdeps, self.taskhash, self.file_checksum_values, self.t= aints, self.basehash, self.unitaskhashes, self.setscenetasks =3D data + self.runtaskdeps, self.taskhash, self.unihash, self.file_checksum_= values, self.taints, self.basehash, self.unitaskhashes, self.tidtopn, self.= setscenetasks =3D data =20 def reset(self, data): self.__init__(data) =20 def get_taskhashes(self): - return self.taskhash, self.unitaskhashes + return self.taskhash, self.unihash, self.unitaskhashes, self.tidto= pn =20 def set_taskhashes(self, hashes): - self.taskhash, self.unitaskhashes =3D hashes + self.taskhash, self.unihash, self.unitaskhashes, self.tidtopn =3D = hashes =20 def save_unitaskhashes(self): return @@ -104,13 +114,14 @@ class SignatureGeneratorBasic(SignatureGenerator): def __init__(self, data): self.basehash =3D {} self.taskhash =3D {} + self.unihash =3D {} self.taskdeps =3D {} self.runtaskdeps =3D {} self.file_checksum_values =3D {} self.taints =3D {} self.gendeps =3D {} self.lookupcache =3D {} - self.setscenetasks =3D {} + self.setscenetasks =3D set() self.basewhitelist =3D set((data.getVar("BB_HASHBASE_WHITELIST") o= r "").split()) self.taskwhitelist =3D None self.init_rundepcheck(data) @@ -121,8 +132,10 @@ class SignatureGeneratorBasic(SignatureGenerator): else: self.checksum_cache =3D None =20 - self.unihash_cache =3D bb.cache.SimpleCache("1") + self.unihash_cache =3D bb.cache.SimpleCache("3") self.unitaskhashes =3D self.unihash_cache.init_cache(data, "bb_uni= hashes.dat", {}) + self.localdirsexclude =3D (data.getVar("BB_SIGNATURE_LOCAL_DIRS_EX= CLUDE") or "CVS .bzr .git .hg .osc .p4 .repo .svn").split() + self.tidtopn =3D {} =20 def init_rundepcheck(self, data): self.taskwhitelist =3D data.getVar("BB_HASHTASK_WHITELIST") or Non= e @@ -134,7 +147,7 @@ class SignatureGeneratorBasic(SignatureGenerator): def _build_data(self, fn, d): =20 ignore_mismatch =3D ((d.getVar("BB_HASH_IGNORE_MISMATCH") or '') = =3D=3D '1') - tasklist, gendeps, lookupcache =3D bb.data.generate_dependencies(d= ) + tasklist, gendeps, lookupcache =3D bb.data.generate_dependencies(d= , self.basewhitelist) =20 taskdeps, basehash =3D bb.data.generate_dependency_hash(tasklist, = gendeps, lookupcache, self.basewhitelist, fn) =20 @@ -157,7 +170,7 @@ class SignatureGeneratorBasic(SignatureGenerator): return taskdeps =20 def set_setscene_tasks(self, setscene_tasks): - self.setscenetasks =3D setscene_tasks + self.setscenetasks =3D set(setscene_tasks) =20 def finalise(self, fn, d, variant): =20 @@ -180,6 +193,14 @@ class SignatureGeneratorBasic(SignatureGenerator): for task in taskdeps: d.setVar("BB_BASEHASH_task-%s" % task, self.basehash[fn + ":" = + task]) =20 + def postparsing_clean_cache(self): + # + # After parsing we can remove some things from memory to reduce ou= r memory footprint + # + self.gendeps =3D {} + self.lookupcache =3D {} + self.taskdeps =3D {} + def rundep_check(self, fn, recipename, task, dep, depname, dataCache): # Return True if we should keep the dependency, False to drop it # We only manipulate the dependencies for packages not in the whit= elist @@ -198,15 +219,17 @@ class SignatureGeneratorBasic(SignatureGenerator): pass return taint =20 - def get_taskhash(self, tid, deps, dataCache): + def prep_taskhash(self, tid, deps, dataCache): =20 (mc, _, task, fn) =3D bb.runqueue.split_tid_mcfn(tid) =20 - data =3D dataCache.basetaskhash[tid] - self.basehash[tid] =3D data + self.basehash[tid] =3D dataCache.basetaskhash[tid] self.runtaskdeps[tid] =3D [] self.file_checksum_values[tid] =3D [] recipename =3D dataCache.pkg_fn[fn] + + self.tidtopn[tid] =3D recipename + for dep in sorted(deps, key=3Dclean_basepath): (depmc, _, deptaskname, depfn) =3D bb.runqueue.split_tid_mcfn(= dep) if mc !=3D depmc: @@ -216,33 +239,56 @@ class SignatureGeneratorBasic(SignatureGenerator): continue if dep not in self.taskhash: bb.fatal("%s is not in taskhash, caller isn't calling in d= ependency order?" % dep) - data =3D data + self.get_unihash(dep) self.runtaskdeps[tid].append(dep) =20 if task in dataCache.file_checksums[fn]: if self.checksum_cache: - checksums =3D self.checksum_cache.get_checksums(dataCache.= file_checksums[fn][task], recipename) + checksums =3D self.checksum_cache.get_checksums(dataCache.= file_checksums[fn][task], recipename, self.localdirsexclude) else: - checksums =3D bb.fetch2.get_file_checksums(dataCache.file_= checksums[fn][task], recipename) + checksums =3D bb.fetch2.get_file_checksums(dataCache.file_= checksums[fn][task], recipename, self.localdirsexclude) for (f,cs) in checksums: self.file_checksum_values[tid].append((f,cs)) - if cs: - data =3D data + cs =20 taskdep =3D dataCache.task_deps[fn] if 'nostamp' in taskdep and task in taskdep['nostamp']: # Nostamp tasks need an implicit taint so that they force any = dependent tasks to run - import uuid - taint =3D str(uuid.uuid4()) - data =3D data + taint - self.taints[tid] =3D "nostamp:" + taint + if tid in self.taints and self.taints[tid].startswith("nostamp= :"): + # Don't reset taint value upon every call + pass + else: + import uuid + taint =3D str(uuid.uuid4()) + self.taints[tid] =3D "nostamp:" + taint =20 taint =3D self.read_taint(fn, task, dataCache.stamp[fn]) if taint: - data =3D data + taint self.taints[tid] =3D taint logger.warning("%s is tainted from a forced run" % tid) =20 + return + + def get_taskhash(self, tid, deps, dataCache): + + data =3D self.basehash[tid] + for dep in self.runtaskdeps[tid]: + if dep in self.unihash: + if self.unihash[dep] is None: + data =3D data + self.taskhash[dep] + else: + data =3D data + self.unihash[dep] + else: + data =3D data + self.get_unihash(dep) + + for (f, cs) in self.file_checksum_values[tid]: + if cs: + data =3D data + cs + + if tid in self.taints: + if self.taints[tid].startswith("nostamp:"): + data =3D data + self.taints[tid][8:] + else: + data =3D data + self.taints[tid] + h =3D hashlib.sha256(data.encode("utf-8")).hexdigest() self.taskhash[tid] =3D h #d.setVar("BB_TASKHASH_task-%s" % task, taskhash[task]) @@ -371,50 +417,66 @@ class SignatureGeneratorBasicHash(SignatureGeneratorB= asic): bb.build.write_taint(task, d, fn) =20 class SignatureGeneratorUniHashMixIn(object): + def __init__(self, data): + self.extramethod =3D {} + super().__init__(data) + def get_taskdata(self): - return (self.server, self.method) + super().get_taskdata() + return (self.server, self.method, self.extramethod) + super().get_= taskdata() =20 def set_taskdata(self, data): - self.server, self.method =3D data[:2] - super().set_taskdata(data[2:]) + self.server, self.method, self.extramethod =3D data[:3] + super().set_taskdata(data[3:]) =20 def client(self): if getattr(self, '_client', None) is None: self._client =3D hashserv.create_client(self.server) return self._client =20 - def __get_task_unihash_key(self, tid): - # TODO: The key only *needs* to be the taskhash, the tid is just - # convenient - return '%s:%s' % (tid.rsplit("/", 1)[1], self.taskhash[tid]) - def get_stampfile_hash(self, tid): if tid in self.taskhash: # If a unique hash is reported, use it as the stampfile hash. = This # ensures that if a task won't be re-run if the taskhash chang= es, # but it would result in the same output hash - unihash =3D self.unitaskhashes.get(self.__get_task_unihash_key= (tid), None) + unihash =3D self._get_unihash(tid) if unihash is not None: return unihash =20 return super().get_stampfile_hash(tid) =20 def set_unihash(self, tid, unihash): - self.unitaskhashes[self.__get_task_unihash_key(tid)] =3D unihash + (mc, fn, taskname, taskfn) =3D bb.runqueue.split_tid_mcfn(tid) + key =3D mc + ":" + self.tidtopn[tid] + ":" + taskname + self.unitaskhashes[key] =3D (self.taskhash[tid], unihash) + self.unihash[tid] =3D unihash + + def _get_unihash(self, tid, checkkey=3DNone): + if tid not in self.tidtopn: + return None + (mc, fn, taskname, taskfn) =3D bb.runqueue.split_tid_mcfn(tid) + key =3D mc + ":" + self.tidtopn[tid] + ":" + taskname + if key not in self.unitaskhashes: + return None + if not checkkey: + checkkey =3D self.taskhash[tid] + (key, unihash) =3D self.unitaskhashes[key] + if key !=3D checkkey: + return None + return unihash =20 def get_unihash(self, tid): taskhash =3D self.taskhash[tid] =20 # If its not a setscene task we can return if self.setscenetasks and tid not in self.setscenetasks: + self.unihash[tid] =3D None return taskhash =20 - key =3D self.__get_task_unihash_key(tid) - # TODO: This cache can grow unbounded. It probably only needs to k= eep # for each task - unihash =3D self.unitaskhashes.get(key, None) + unihash =3D self._get_unihash(tid) if unihash is not None: + self.unihash[tid] =3D unihash return unihash =20 # In the absence of being able to discover a unique hash from the @@ -433,19 +495,23 @@ class SignatureGeneratorUniHashMixIn(object): unihash =3D taskhash =20 try: - data =3D self.client().get_unihash(self.method, self.taskhash[= tid]) + method =3D self.method + if tid in self.extramethod: + method =3D method + self.extramethod[tid] + data =3D self.client().get_unihash(method, self.taskhash[tid]) if data: unihash =3D data # A unique hash equal to the taskhash is not very interest= ing, # so it is reported it at debug level 2. If they differ, t= hat # is much more interesting, so it is reported at debug lev= el 1 - bb.debug((1, 2)[unihash =3D=3D taskhash], 'Found unihash %= s in place of %s for %s from %s' % (unihash, taskhash, tid, self.server)) + hashequiv_logger.debug((1, 2)[unihash =3D=3D taskhash], 'F= ound unihash %s in place of %s for %s from %s' % (unihash, taskhash, tid, s= elf.server)) else: - bb.debug(2, 'No reported unihash for %s:%s from %s' % (tid= , taskhash, self.server)) + hashequiv_logger.debug(2, 'No reported unihash for %s:%s f= rom %s' % (tid, taskhash, self.server)) except hashserv.client.HashConnectionError as e: bb.warn('Error contacting Hash Equivalence Server %s: %s' % (s= elf.server, str(e))) =20 - self.unitaskhashes[key] =3D unihash + self.set_unihash(tid, unihash) + self.unihash[tid] =3D unihash return unihash =20 def report_unihash(self, path, task, d): @@ -457,13 +523,17 @@ class SignatureGeneratorUniHashMixIn(object): tempdir =3D d.getVar('T') fn =3D d.getVar('BB_FILENAME') tid =3D fn + ':do_' + task - key =3D tid.rsplit("/", 1)[1] + ':' + taskhash + key =3D tid + ':' + taskhash =20 if self.setscenetasks and tid not in self.setscenetasks: return =20 + # This can happen if locked sigs are in action. Detect and just ab= ort + if taskhash !=3D self.taskhash[tid]: + return + # Sanity checks - cache_unihash =3D self.unitaskhashes.get(key, None) + cache_unihash =3D self._get_unihash(tid, checkkey=3Dtaskhash) if cache_unihash is None: bb.fatal('%s not in unihash cache. Please report this error' %= key) =20 @@ -502,14 +572,20 @@ class SignatureGeneratorUniHashMixIn(object): extra_data['task'] =3D task extra_data['outhash_siginfo'] =3D sigfile.read().decod= e('utf-8') =20 - data =3D self.client().report_unihash(taskhash, self.metho= d, outhash, unihash, extra_data) + method =3D self.method + if tid in self.extramethod: + method =3D method + self.extramethod[tid] + + data =3D self.client().report_unihash(taskhash, method, ou= thash, unihash, extra_data) new_unihash =3D data['unihash'] =20 if new_unihash !=3D unihash: - bb.debug(1, 'Task %s unihash changed %s -> %s by serve= r %s' % (taskhash, unihash, new_unihash, self.server)) + hashequiv_logger.debug(1, 'Task %s unihash changed %s = -> %s by server %s' % (taskhash, unihash, new_unihash, self.server)) bb.event.fire(bb.runqueue.taskUniHashUpdate(fn + ':do_= ' + task, new_unihash), d) + self.set_unihash(tid, new_unihash) + d.setVar('BB_UNIHASH', new_unihash) else: - bb.debug(1, 'Reported task %s as unihash %s to %s' % (= taskhash, unihash, self.server)) + hashequiv_logger.debug(1, 'Reported task %s as unihash= %s to %s' % (taskhash, unihash, self.server)) except hashserv.client.HashConnectionError as e: bb.warn('Error contacting Hash Equivalence Server %s: %s' = % (self.server, str(e))) finally: @@ -524,6 +600,36 @@ class SignatureGeneratorUniHashMixIn(object): except OSError: pass =20 + def report_unihash_equiv(self, tid, taskhash, wanted_unihash, current_= unihash, datacaches): + try: + extra_data =3D {} + method =3D self.method + if tid in self.extramethod: + method =3D method + self.extramethod[tid] + + data =3D self.client().report_unihash_equiv(taskhash, method, = wanted_unihash, extra_data) + hashequiv_logger.verbose('Reported task %s as unihash %s to %s= (%s)' % (tid, wanted_unihash, self.server, str(data))) + + if data is None: + bb.warn("Server unable to handle unihash report") + return False + + finalunihash =3D data['unihash'] + + if finalunihash =3D=3D current_unihash: + hashequiv_logger.verbose('Task %s unihash %s unchanged by = server' % (tid, finalunihash)) + elif finalunihash =3D=3D wanted_unihash: + hashequiv_logger.verbose('Task %s unihash changed %s -> %s= as wanted' % (tid, current_unihash, finalunihash)) + self.set_unihash(tid, finalunihash) + return True + else: + # TODO: What to do here? + hashequiv_logger.verbose('Task %s unihash reported as unwa= nted hash %s' % (tid, finalunihash)) + + except hashserv.client.HashConnectionError as e: + bb.warn('Error contacting Hash Equivalence Server %s: %s' % (s= elf.server, str(e))) + + return False =20 # # Dummy class used for bitbake-selftest diff --git a/bitbake/lib/bb/taskdata.py b/bitbake/lib/bb/taskdata.py index 8c25e09..d13a124 100644 --- a/bitbake/lib/bb/taskdata.py +++ b/bitbake/lib/bb/taskdata.py @@ -362,7 +362,7 @@ class TaskData: bb.event.fire(bb.event.NoProvider(item, dependees=3Dself.get_d= ependees(item), reasons=3D["No eligible PROVIDERs exist for '%s'" % item]),= cfgData) raise bb.providers.NoProvider(item) =20 - if len(eligible) > 1 and foundUnique =3D=3D False: + if len(eligible) > 1 and not foundUnique: if item not in self.consider_msgs_cache: providers_list =3D [] for fn in eligible: diff --git a/bitbake/lib/bb/tests/cooker.py b/bitbake/lib/bb/tests/cooker.p= y index 090916e..74c903f 100644 --- a/bitbake/lib/bb/tests/cooker.py +++ b/bitbake/lib/bb/tests/cooker.py @@ -5,7 +5,6 @@ # =20 import unittest -import tempfile import os import bb, bb.cooker import re diff --git a/bitbake/lib/bb/tests/cow.py b/bitbake/lib/bb/tests/cow.py index b4af4bb..bf6e79f 100644 --- a/bitbake/lib/bb/tests/cow.py +++ b/bitbake/lib/bb/tests/cow.py @@ -7,7 +7,7 @@ # =20 import unittest -import os + =20 class COWTestCase(unittest.TestCase): """ diff --git a/bitbake/lib/bb/tests/data.py b/bitbake/lib/bb/tests/data.py index 3e49984..5f19504 100644 --- a/bitbake/lib/bb/tests/data.py +++ b/bitbake/lib/bb/tests/data.py @@ -476,7 +476,7 @@ class Contains(unittest.TestCase): class TaskHash(unittest.TestCase): def test_taskhashes(self): def gettask_bashhash(taskname, d): - tasklist, gendeps, lookupcache =3D bb.data.generate_dependenci= es(d) + tasklist, gendeps, lookupcache =3D bb.data.generate_dependenci= es(d, set()) taskdeps, basehash =3D bb.data.generate_dependency_hash(taskli= st, gendeps, lookupcache, set(), "somefile") bb.warn(str(lookupcache)) return basehash["somefile:" + taskname] @@ -544,142 +544,3 @@ class Serialize(unittest.TestCase): self.assertEqual(newd.getVarFlag('HELLO', 'other'), 'planet') =20 =20 -# Remote datastore tests -# These really only test the interface, since in actual usage we have a -# tinfoil connector that does everything over RPC, and this doesn't test -# that. - -class TestConnector: - d =3D None - def __init__(self, d): - self.d =3D d - def getVar(self, name): - return self.d._findVar(name) - def getKeys(self): - return set(self.d.keys()) - def getVarHistory(self, name): - return self.d.varhistory.variable(name) - def expandPythonRef(self, varname, expr, d): - localdata =3D self.d.createCopy() - for key in d.localkeys(): - localdata.setVar(d.getVar(key)) - varparse =3D bb.data_smart.VariableParse(varname, localdata) - return varparse.python_sub(expr) - def setVar(self, name, value): - self.d.setVar(name, value) - def setVarFlag(self, name, flag, value): - self.d.setVarFlag(name, flag, value) - def delVar(self, name): - self.d.delVar(name) - return False - def delVarFlag(self, name, flag): - self.d.delVarFlag(name, flag) - return False - def renameVar(self, name, newname): - self.d.renameVar(name, newname) - return False - -class Remote(unittest.TestCase): - def test_remote(self): - - d1 =3D bb.data.init() - d1.enableTracking() - d2 =3D bb.data.init() - d2.enableTracking() - connector =3D TestConnector(d1) - - d2.setVar('_remote_data', connector) - - d1.setVar('HELLO', 'world') - d1.setVarFlag('OTHER', 'flagname', 'flagvalue') - self.assertEqual(d2.getVar('HELLO'), 'world') - self.assertEqual(d2.expand('${HELLO}'), 'world') - self.assertEqual(d2.expand('${@d.getVar("HELLO")}'), 'world') - self.assertIn('flagname', d2.getVarFlags('OTHER')) - self.assertEqual(d2.getVarFlag('OTHER', 'flagname'), 'flagvalue') - self.assertEqual(d1.varhistory.variable('HELLO'), d2.varhistory.va= riable('HELLO')) - # Test setVar on client side affects server - d2.setVar('HELLO', 'other-world') - self.assertEqual(d1.getVar('HELLO'), 'other-world') - # Test setVarFlag on client side affects server - d2.setVarFlag('HELLO', 'flagname', 'flagvalue') - self.assertEqual(d1.getVarFlag('HELLO', 'flagname'), 'flagvalue') - # Test client side data is incorporated in python expansion (which= is done on server) - d2.setVar('FOO', 'bar') - self.assertEqual(d2.expand('${@d.getVar("FOO")}'), 'bar') - # Test overrides work - d1.setVar('FOO_test', 'baz') - d1.appendVar('OVERRIDES', ':test') - self.assertEqual(d2.getVar('FOO'), 'baz') - - -# Remote equivalents of local test classes -# Note that these aren't perfect since we only test in one direction - -class RemoteDataExpansions(DataExpansions): - def setUp(self): - self.d1 =3D bb.data.init() - self.d =3D bb.data.init() - self.d1["foo"] =3D "value_of_foo" - self.d1["bar"] =3D "value_of_bar" - self.d1["value_of_foo"] =3D "value_of_'value_of_foo'" - connector =3D TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteNestedExpansions(TestNestedExpansions): - def setUp(self): - self.d1 =3D bb.data.init() - self.d =3D bb.data.init() - self.d1["foo"] =3D "foo" - self.d1["bar"] =3D "bar" - self.d1["value_of_foobar"] =3D "187" - connector =3D TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteConcat(TestConcat): - def setUp(self): - self.d1 =3D bb.data.init() - self.d =3D bb.data.init() - self.d1.setVar("FOO", "foo") - self.d1.setVar("VAL", "val") - self.d1.setVar("BAR", "bar") - connector =3D TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteConcatOverride(TestConcatOverride): - def setUp(self): - self.d1 =3D bb.data.init() - self.d =3D bb.data.init() - self.d1.setVar("FOO", "foo") - self.d1.setVar("VAL", "val") - self.d1.setVar("BAR", "bar") - connector =3D TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteOverrides(TestOverrides): - def setUp(self): - self.d1 =3D bb.data.init() - self.d =3D bb.data.init() - self.d1.setVar("OVERRIDES", "foo:bar:local") - self.d1.setVar("TEST", "testvalue") - connector =3D TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteKeyExpansion(TestKeyExpansion): - def setUp(self): - self.d1 =3D bb.data.init() - self.d =3D bb.data.init() - self.d1.setVar("FOO", "foo") - self.d1.setVar("BAR", "foo") - connector =3D TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteFlags(TestFlags): - def setUp(self): - self.d1 =3D bb.data.init() - self.d =3D bb.data.init() - self.d1.setVar("foo", "value of foo") - self.d1.setVarFlag("foo", "flag1", "value of flag1") - self.d1.setVarFlag("foo", "flag2", "value of flag2") - connector =3D TestConnector(self.d1) - self.d.setVar('_remote_data', connector) diff --git a/bitbake/lib/bb/tests/fetch-testdata/apple/cups/releases b/bitb= ake/lib/bb/tests/fetch-testdata/apple/cups/releases new file mode 100644 index 0000000..f8934f5 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/apple/cups/releases @@ -0,0 +1,2400 @@ + + + + + + +<!DOCTYPE html> +<html lang=3D"en"> + <head> + <meta charset=3D"utf-8"> + <link rel=3D"dns-prefetch" href=3D"https://github.githubassets.com"> + <link rel=3D"dns-prefetch" href=3D"https://avatars0.githubusercontent.co= m"> + <link rel=3D"dns-prefetch" href=3D"https://avatars1.githubusercontent.co= m"> + <link rel=3D"dns-prefetch" href=3D"https://avatars2.githubusercontent.co= m"> + <link rel=3D"dns-prefetch" href=3D"https://avatars3.githubusercontent.co= m"> + <link rel=3D"dns-prefetch" href=3D"https://github-cloud.s3.amazonaws.com= "> + <link rel=3D"dns-prefetch" href=3D"https://user-images.githubusercontent= .com/"> + + + + <link crossorigin=3D"anonymous" media=3D"all" integrity=3D"sha512-7mtunH= qp/Bw0ND9akjJME8XCh0WPm3HAXOSeX7skL0qGAhpdfzkQvYcujYcwNPTpWKeKMFUGZGtvnEkcc= zFgwQ=3D=3D" rel=3D"stylesheet" href=3D"https://github.githubassets.com/ass= ets/frameworks-9b5314213e37056ed87b0418056c4f2c.css" /> + <link crossorigin=3D"anonymous" media=3D"all" integrity=3D"sha512-Cmoegi= zWCUR1jC94Y2eukVQIFxJ9GxYerz9q7dBwImLlx8ODwYkXAMIhCfTnA45Ep6++rcO/ZtKVLvFBM= 8dapA=3D=3D" rel=3D"stylesheet" href=3D"https://github.githubassets.com/ass= ets/site-4e9f27fa33341743f730ae7b0e33eff5.css" /> + <link crossorigin=3D"anonymous" media=3D"all" integrity=3D"sha512-BvnI= CKFjIvT69o61dyYllXtaOnGVb7Ifj5c3lk3wj7tkjat2ICuN+XRwyk8tqP3dj7IFhEQzxDdxSHa= J3xj3Mw=3D=3D" rel=3D"stylesheet" href=3D"https://github.githubassets.com/a= ssets/github-ff986874cf7e28cbcd5d448cdca7245d.css" /> + =20 + =20 + =20 + =20 + + + <meta name=3D"viewport" content=3D"width=3Ddevice-width"> + =20 + <title>Releases =C2=B7 apple/cups =C2=B7 GitHub + + + + + + + + + + =20 + =20 + + + + + + =20 + + + + + + + + <= meta name=3D"octolytics-app-id" content=3D"github" /> + + + + + + + + + + + + + =20 + + + + + + + + + + + + + + =20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + =20 + +
+ Skip to content + + + + + =20 + =20 + =20 + + +
+ +
+ +
+ +
+ + +
+ +
+ + + +
+
+
+ =20 + + + =20 + + + + =20 + + + + + + + + + + +
+
+ + =20 + =20 +
+
+
+
<= input name=3D"utf8" type=3D"hidden" value=3D"✓" /> + +

Be notified of new releases

+

Create your free GitHub account today= to subscribe to this repository for new releases and build software alongs= ide 40 million developers.

+ Sign up +
+
+
+ + +
+
+ +
+ + +
+ +
+ + + +
+ =20 +
+
+
+ + Latest release + + + +
+ + + =20 + +
+ +
+
+
+
+ v2.3.1 +
+ + + Latest release + + +
+ + =20 +

+ + michaelrsweet + released this + Dec= 13, 2019 +

+
+ + =20 + +
+

CUPS 2.3.1 is a general bug fix release, including a fix for CVE-20= 19-2228. Changes include:

+
    +
  • Documentation updates (Issue #5661, #5674= , #5682)
  • +
  • CVE-2019-2228: The ippSetValuetag function did not valida= te the default
    +language value.
  • +
  • Fixed a crash bug in the web interface (Issue #5621)
  • +
  • The PPD cache code now looks up page sizes using their dimensions
    +(Issue #5633)
  • +
  • PPD files containing "custom" option keywords did not work (Issue #5639)
  • +
  • Added a workaround for the scheduler's systemd support (Issue #5640)
  • +
  • On Windows, TLS certificates generated on February 29 would likely fai= l
    +(Issue #5643)
  • +
  • Added a DigestOptions directive for the client.conf file = to control whether
    +MD5-based Digest authentication is allowed (Issue #5647)
  • +
  • Fixed a bug in the handling of printer resource files (Issue #5652)
  • +
  • The libusb-based USB backend now reports an error when the distributio= n
    +permissions are wrong (Issue #5658)
  • +
  • Added paint can labels to Dymo driver (Issue #5662)
  • +
  • The ippeveprinter program now supports authentication (Is= sue #5665)
  • +
  • The ippeveprinter program now advertises DNS-SD services = on the correct
    +interfaces, and provides a way to turn them off (Issue #5666)
  • +
  • The --with-dbusdir option was ignored by the configure sc= ript (Issue #5671)
  • +
  • Sandboxed applications were not able to get the default printer (Issue= #5676)
  • +
  • Log file access controls were not preserved by cupsctl (I= ssue #5677)
  • +
  • Default printers set with lpoptions did not work in all c= ases (Issue #5681,
    +Issue #5683, Issue #5684)
  • +
  • Fixed an error in the jobs web interface template (Issue #5694)
  • +
  • Fixed an off-by-one error in ippEnumString (Issue #5695)
  • +
  • Fixed some new compiler warnings (Issue #5700)
  • +
  • Fixed a few issues with the Apple Raster support (rdar://55301114) +
  • The IPP backend did not detect all cases where a job should be retried= using
    +a raster format (rdar://56021091)
  • +
  • Fixed spelling of "fold-accordion".
  • +
  • Fixed the default common name for TLS certificates used by ippev= eprinter.
  • +
  • Fixed the option names used for IPP Everywhere finishing options.
  • +
  • Added support for the second roll of the DYMO Twin/DUO label printers.=
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ + + +
+ =20 +
+
+
+ + +
+ + + =20 + +
+ +
+
+
+
+ v2.2.13 +
+ + +
+ + =20 +

+ + michaelrsweet + released this + Dec= 13, 2019 + · + + 793 commits + to master + since this release +

+
+ + =20 + +
+

CUPS 2.2.13 is the last general bug fix release in the 2.2.x series= and includes
+a fix for CVE-2019-2228. Changes include:

+
    +
  • CVE-2019-2228: The ippSetValuetag function did not valida= te the default
    +language value.
  • +
  • Added a workaround for the scheduler's systemd support (Issue #5640)
  • +
  • Fixed spelling of "fold-accordion".
  • +
  • Fixed the default common name for TLS certificates used by ippse= rver.
  • +
  • The libusb-based USB backend now reports an error when the distributio= n
    +permissions are wrong (Issue #5658)
  • +
  • Default printers set with lpoptions did not work in all c= ases (Issue #5681,
    +Issue #5683, Issue #5684)
  • +
  • Fixed an off-by-one error in ippEnumString (Issue #5695)
  • +
  • Fixed some new compiler warnings (Issue #5700)
  • +
  • Fixed a few issues with the Apple Raster support (rdar://55301114) +
  • The IPP backend did not detect all cases where a job should be retried= using
    +a raster format (rdar://56021091)
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ + + +
+ =20 +
+
+
+ + +
+ + + =20 + +
+ +
+
+
+
+ v2.3.0 +
+ + +
+ + =20 +

+ + michaelrsweet + released this + Aug= 23, 2019 + · + + 65 commits + to master + since this release +

+
+ + =20 + +
+

CUPS 2.3.0 is now available for download, which adopts the new CUPS= license, adds support for IPP presets and finishing templates, fixes a num= ber of bugs and "polish" issues, and includes the new ippeveprinter utility= . Changes include:

+
    +
  • CVE-2019-8696 and CVE-2019-8675: Fixed SNMP buffer overflows (rdar://5= 1685251)
  • +
  • Added a GPL2/LGPL2 exception to the new CUPS license terms.
  • +
  • Documentation updates (Issue #5604)
  • +
  • Localization updates (Issue #5637)
  • +
  • Fixed a bug in the scheduler job cleanup code (Issue #5588)
  • +
  • Fixed builds when there is no TLS library (Issue #5590)
  • +
  • Eliminated some new GCC compiler warnings (Issue #5591)
  • +
  • Removed dead code from the scheduler (Issue #5593)
  • +
  • "make" failed with GZIP options (Issue #5595)
  • +
  • Fixed potential excess logging from the scheduler when removing job fi= les
    +(Issue #5597)
  • +
  • Fixed a NULL pointer dereference bug in httpGetSubField2 = (Issue #5598)
  • +
  • Added FIPS-140 workarounds for GNU TLS (Issue #5601, Issue #5622)
  • +
  • The scheduler no longer provides a default value for the description +(Issue #5603)
  • +
  • The scheduler now logs jobs held for authentication using the error le= vel so
    +it is clear what happened (Issue #5604)
  • +
  • The lpadmin command did not always update the PPD file fo= r changes to the
    +cupsIPPSupplies and cupsSNMPSupplies keywords (I= ssue #5610)
  • +
  • The scheduler now uses both the group's membership list as well as the=
    +various OS-specific membership functions to determine whether a user belon= gs
    +to a named group (Issue #5613)
  • +
  • Added USB quirks rule for HP LaserJet 1015 (Issue #5617)
  • +
  • Fixed some PPD parser issues (Issue #5623, Issue #5624)
  • +
  • The IPP parser no longer allows invalid member attributes in collectio= ns
    +(Issue #5630)
  • +
  • The configure script now treats the "wheel" group as a potential syste= m
    +group (Issue #5638)=
  • +
  • Fixed a USB printing issue on macOS (rdar://31433931)
  • +
  • Fixed IPP buffer overflow (rdar://50035411)
  • +
  • Fixed memory disclosure issue in the scheduler (rdar://51373853)
  • +
  • Fixed DoS issues in the scheduler (rdar://51373929)
  • +
  • Fixed an issue with unsupported "sides" values in the IPP backend
    +(rdar://51775322)
  • +
  • The scheduler would restart continuously when idle and printers were n= ot
    +shared (rdar://52561199)
  • +
  • Fixed an issue with EXPECT !name WITH-VALUE ... tests. +
  • Fixed a command ordering issue in the Zebra ZPL driver.
  • +
  • Fixed a memory leak in ppdOpen.
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ + + +
+ =20 +
+
+
+ + +
+ + + =20 + +
+ +
+
+
+
+ v2.2.12 +
+ + +
+ + =20 +

+ + michaelrsweet + released this + Aug= 15, 2019 + · + + 793 commits + to master + since this release +

+
+ + =20 + +
+

CUPS 2.2.12 is now available and includes security, compatibility, = and general bug fixes. Changes include:

+
    +
  • CVE-2019-8696 and CVE-2019-8675: Fixed SNMP buffer overflows (rdar://5= 1685251)
  • +
  • The cupsctl command now prevents setting "cups-files.conf= " directives
    +(Issue #5530)
  • +
  • Updated the systemd service file for cupsd (Issue #5551)
  • +
  • The cupsCheckDestSupported function did not check octetSt= ring values
    +correctly (Issue #5557<= /a>)
  • +
  • The scheduler did not encode octetString values like "job-password" co= rrectly
    +for the print filters (Issue
    #5558)
  • +
  • Restored minimal support for the Emulators keyword in PPD= files to allow
    +old Samsung printer drivers to continue to work (Issue #5562)
  • +
  • Timed out job submission now yields an error (Issue #5570)
  • +
  • The footer in the web interface covered some content on small displays=
    +(Issue #5574)
  • +
  • The libusb-based USB backend now enforces read limits, improving print= speed
    +in many cases (Issue #558= 3)
  • +
  • Fixed some compatibility issues with old releases of CUPS (Issue #5587)
  • +
  • Fixed a bug in the scheduler job cleanup code (Issue #5588)
  • +
  • "make" failed with GZIP options (Issue #5595)
  • +
  • Added FIPS-140 workarounds for GNU TLS (Issue #5601, Issue #5622)
  • +
  • The scheduler no longer provides a default value for the description +(Issue #5603)
  • +
  • The lpadmin command did not always update the PPD file fo= r changes to the
    +cupsIPPSupplies and cupsSNMPSupplies keywords (I= ssue #5610)
  • +
  • The scheduler now uses both the group's membership list as well as the=
    +various OS-specific membership functions to determine whether a user belon= gs
    +to a named group (Issue #5613)
  • +
  • Added USB quirks rule for HP LaserJet 1015 (Issue #5617)
  • +
  • Fixed some PPD parser issues (Issue #5623, Issue #5624)
  • +
  • The IPP parser no longer allows invalid member attributes in collectio= ns
    +(Issue #5630)
  • +
  • Fixed IPP buffer overflow (rdar://50035411)
  • +
  • Fixed memory disclosure issue in the scheduler (rdar://51373853)
  • +
  • Fixed DoS issues in the scheduler (rdar://51373929)
  • +
  • The scheduler would restart continuously when idle and printers were n= ot
    +shared (rdar://52561199)
  • +
  • Fixed a command ordering issue in the Zebra ZPL driver.
  • +
  • Fixed a memory leak in ppdOpen.
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ + + +
+ =20 +
+
+
+ + Pre-release + + + +
+ + + =20 + +
+ +
+
+
+
+ v2.3rc1 +
+ + + Pre-release + + +
+ + =20 +

+ + michaelrsweet + released this + May= 21, 2019 + · + + 122 commits + to master + since this release +

+
+ + =20 + +
+

CUPS 2.3rc1 is now available for download. This is the first relea= se candidate for CUPS 2.3.0 which adopts the new CUPS license, adds support= for IPP presets and finishing templates, and fixes a number of bugs and "p= olish" issues. This beta also includes the new ippeveprinter utility. Chan= ges include:

+
    +
  • The cups-config script no longer adds extra libraries whe= n linking against
    +shared libraries (Issue #5261)
  • +
  • The supplied example print documents have been optimized for size
    +(Issue #5529)
  • +
  • The cupsctl command now prevents setting "cups-files.conf= " directives
    +(Issue #5530)
  • +
  • The "forbidden" message in the web interface is now explained (Issue <= a class=3D"issue-link js-issue-link" data-error-text=3D"Failed to load issu= e title" data-id=3D"424534348" data-permission-text=3D"Issue title is priva= te" data-url=3D"https://github.com/apple/cups/issues/5547" data-hovercard-t= ype=3D"issue" data-hovercard-url=3D"/apple/cups/issues/5547/hovercard" href= =3D"https://github.com/apple/cups/issues/5547">#5547)
  • +
  • The footer in the web interface covered some content on small displays=
    +(Issue #5574)
  • +
  • The libusb-based USB backend now enforces read limits, improving print= speed
    +in many cases (Issue #558= 3)
  • +
  • The ippeveprinter command now looks for print commands in= the "command"
    +subdirectory.
  • +
  • The ipptool command now supports $date-current and $date-start variables
    +to insert the current and starting date and time values, as well as ISO-86= 01
    +relative time values such as "PT30S" for 30 seconds in the future.
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ + + +
+ =20 +
+
+
+ + Pre-release + + + +
+ + + =20 + +
+ +
+
+
+
+ v2.3b8 +
+ + + Pre-release + + +
+ + =20 +

+ + michaelrsweet + released this + May= 2, 2019 + · + + 165 commits + to master + since this release +

+
+ + =20 + +
+

CUPS 2.3b8 is now available for download. This is the eighth beta = of the CUPS 2.3 series which adopts the new CUPS license, adds support for = IPP presets and finishing templates, and fixes a number of bugs and "polish= " issues. This beta also includes the new ippeveprinter utility. Changes = include:

+
    +
  • Media size matching now uses a tolerance of 0.5mm (rdar://33822024) +
  • The lpadmin command would hang with a bad PPD file (rdar://41495016) +
  • Fixed a potential crash bug in cups-driverd (rdar://46625579)
  • +
  • Fixed a performance regression with large PPDs (rdar://47040759)
  • +
  • Fixed a memory reallocation bug in HTTP header value expansion
    +(rdar://problem/50000749)
  • +
  • Timed out job submission now yields an error (Issue #5570)
  • +
  • Restored minimal support for the Emulators keyword in PPD= files to allow
    +old Samsung printer drivers to continue to work (Issue #5562)
  • +
  • The scheduler did not encode octetString values like "job-password" co= rrectly
    +for the print filters (Issue #5558)
  • +
  • The cupsCheckDestSupported function did not check octetSt= ring values
    +correctly (Issue #5557<= /a>)
  • +
  • Added support for UserAgentTokens directive in "client.co= nf" (Issue #5555)
  • +
  • Updated the systemd service file for cupsd (Issue #5551)
  • +
  • The ippValidateAttribute function did not catch all insta= nces of invalid
    +UTF-8 strings (Issue #550= 9)
  • +
  • Fixed an issue with the self-signed certificates generated by GNU TLS<= br> +(Issue #5506)
  • +
  • Fixed a potential memory leak when reading at the end of a file (Issue= #5473)
  • +
  • Fixed potential unaligned accesses in the string pool (Issue #5474)
  • +
  • Fixed a potential memory leak when loading a PPD file (Issue #5475)
  • +
  • Added a USB quirks rule for the Lexmark E120n (Issue #5478)
  • +
  • Updated the USB quirks rule for Zebra label printers (Issue #5395)
  • +
  • Fixed a compile error on Linux (Issue #5483)
  • +
  • The lpadmin command, web interface, and scheduler all queried an IPP +Everywhere printer differently, resulting in different PPDs for the same +printer (Issue #5484)<= /li> +
  • The web interface no longer provides access to the log files (Issue #5513)
  • +
  • Non-Kerberized printing to Windows via IPP was broken (Issue #5515)
  • +
  • Eliminated use of private headers and some deprecated macOS APIs (Issu= e #5516)
  • +
  • The scheduler no longer stops a printer if an error occurs when a job = is
    +canceled or aborted (Issue #5517)
  • +
  • Added a USB quirks rule for the DYMO 450 Turbo (Issue #5521)
  • +
  • Added a USB quirks rule for Xerox printers (Issue #5523)
  • +
  • The scheduler's self-signed certificate did not include all of the alt= ernate
    +names for the server when using GNU TLS (Issue #5525)
  • +
  • Fixed compiler warnings with newer versions of GCC (Issue #5532, Issue #5533)
  • +
  • Fixed some PPD caching and IPP Everywhere PPD accounting/password bugs=
    +(Issue #5535)
  • +
  • Fixed PreserveJobHistory bug with time values (Issue #5538)
  • +
  • The scheduler no longer advertises the HTTP methods it supports (Issue= #5540)
  • +
  • Localization updates (Issue #5461, Issues #5471, Issue #= 5481, Issue #5486,
    +Issue
    #5489, Issue = #5491, Issue #5492, Issue #5493, Issue #5494, Issue #5495,
    +Issue #5497, Issue #5499, Issue #5500, Issue #5501, Issue #5504)
  • +
  • The scheduler did not always idle exit as quickly as it could.
  • +
  • Added a new ippeveprinter command based on the old ippser= ver sample code.
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ + + +
+ =20 +
+
+
+ + +
+ + + =20 + +
+ +
+
+
+
+ v2.2.11 +
+ + +
+ + =20 +

+ + michaelrsweet + released this + Mar= 22, 2019 + · + + 793 commits + to master + since this release +

+
+ + =20 + +
+

CUPS 2.2.11 is a bug fix release that addresses issues in the sched= uler,
+IPP Everywhere support, CUPS library, and USB printer support. Changes in= clude:

+
    +
  • Running ppdmerge with the same input and output filenames did not work= as
    +advertised (Issue #5455)
  • +
  • Fixed a potential memory leak when reading at the end of a file (Issue= #5473)
  • +
  • Fixed potential unaligned accesses in the string pool (Issue #5474)
  • +
  • Fixed a potential memory leak when loading a PPD file (Issue #5475)
  • +
  • Added a USB quirks rule for the Lexmark E120n (Issue #5478)
  • +
  • Updated the USB quirks rule for Zebra label printers (Issue #5395)
  • +
  • Fixed a compile error on Linux (Issue #5483)
  • +
  • The lpadmin command, web interface, and scheduler all queried an IPP +Everywhere printer differently, resulting in different PPDs for the same +printer (Issue #5484)<= /li> +
  • Fixed an issue with the self-signed certificates generated by GNU TLS<= br> +(Issue #5506)
  • +
  • The ippValidateAttribute function did not catch all insta= nces of invalid
    +UTF-8 strings (Issue #550= 9)
  • +
  • Non-Kerberized printing to Windows via IPP was broken (Issue #5515)
  • +
  • The scheduler no longer stops a printer if an error occurs when a job = is
    +canceled or aborted (Issue #5517)
  • +
  • Added a USB quirks rule for the DYMO 450 Turbo (Issue #5521)
  • +
  • Added a USB quirks rule for Xerox printers (Issue #5523)
  • +
  • The scheduler's self-signed certificate did not include all of the alt= ernate
    +names for the server when using GNU TLS (Issue #5525)
  • +
  • Fixed compiler warnings with newer versions of GCC (Issue #5532, Issue #5533)
  • +
  • Fixed some PPD caching and IPP Everywhere PPD accounting/password bugs=
    +(Issue #5535)
  • +
  • Fixed PreserveJobHistory bug with time values (Issue #5538)
  • +
  • Media size matching now uses a tolerance of 0.5mm (rdar://33822024) +
  • The lpadmin command would hang with a bad PPD file (rdar://41495016) +
  • Fixed a potential crash bug in cups-driverd (rdar://46625579)
  • +
  • Fixed a performance regression with large PPDs (rdar://47040759)
  • +
  • The scheduler did not always idle exit as quickly as it could.
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ + + +
+ =20 +
+
+
+ + Pre-release + + + +
+ + + =20 + +
+ +
+
+
+
+ v2.3b7 +
+ + + Pre-release + + +
+ + =20 +

+ + michaelrsweet + released this + Dec= 14, 2018 + · + + 350 commits + to master + since this release +

+
+ + =20 + +
+

CUPS 2.3b7 is now available for download. This is the sixth beta o= f the CUPS 2.3 series which adopts the new CUPS license, adds support for I= PP presets and finishing templates, and fixes a number of bugs and "polish"= issues.

+

Changes include:

+
    +
  • Fixed some build failures (Issue #5451, Issue #5463)
  • +
  • Running ppdmerge with the same input and output filenames did not work= as
    +advertised (Issue #5455)
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+
+
+ + +
+
+ +
+ + + +
+ =20 +
+
+
+ + Pre-release + + + +
+ + + =20 + +
+ +
+
+
+
+ v2.3b6 +
+ + + Pre-release + + +
+ + =20 +

+ + michaelrsweet + released this + Dec= 7, 2018 + · + + 358 commits + to master + since this release +

+
+ + =20 + +
+

CUPS 2.3b6 is now available for download. This is the sixth beta of= the CUPS 2.3 series which adopts the new CUPS license, adds support for IP= P presets and finishing templates, and fixes a number of bugs and =E2=80=9C= polish=E2=80=9D issues. Changes include:

+
    +
  • Localization update (Issue #5339, Issue #5348, Issue #5362= , Issue #5408, Issue= #5410)
  • +
  • Documentation updates (Issue #5369, Issue #5402, Issue #5403= , Issue #5404)
  • +
  • CVE-2018-4700: Linux session cookies used a predictable random number = seed.
  • +
  • All user commands now support the --help option (Issue #5326)
  • +
  • The lpoptions command now works with IPP Everywhere print= ers that have not yet been added as local queues (Issue #5045)
  • +
  • The lpadmin command would create a non-working printer in some error c= ases (Issue #5305)
  • +
  • The scheduler would crash if an empty AccessLog directive= was specified (Issue #530= 9)
  • +
  • The scheduler did not idle-exit on some Linux distributions (Issue #5319)
  • +
  • Fixed a regression in the changes to ippValidateAttribute (Issue #5322, Issue #5330)
  • +
  • Fixed a crash bug in the Epson dot matrix driver (Issue #5323)
  • +
  • Automatic debug logging of job errors did not work with systemd (Issue= #5337)
  • +
  • The web interface did not list the IPP Everywhere "driver" (Issue #5338)
  • +
  • The scheduler did not report all of the supported job options and valu= es (Issue #5340)
  • +
  • The IPP Everywhere "driver" now properly supports face-up printers (Is= sue #5345)
  • +
  • Fixed some typos in the label printer drivers (Issue #5350)
  • +
  • Setting the Community name to the empty string in s= nmp.conf now disables SNMP supply level monitoring by all the standa= rd network backends (Issue = #5354)
  • +
  • Multi-file jobs could get stuck if the backend failed (Issue #5359, Issue #5413)
  • +
  • The IPP Everywhere "driver" no longer does local filtering when printi= ng to a shared CUPS printer (Issue #5361)
  • +
  • The lpadmin command now correctly reports IPP errors when configuring = an IPP Everywhere printer (Issue #5370)
  • +
  • Fixed some memory leaks discovered by Coverity (Issue #5375)
  • +
  • The PPD compiler incorrectly terminated JCL options (Issue #5379)
  • +
  • The cupstestppd utility did not generate errors for missing/mismatched= CloseUI/JCLCloseUI keywords (Issue #5381)
  • +
  • The scheduler now reports the actual location of the log file (Issue <= a class=3D"issue-link js-issue-link" data-error-text=3D"Failed to load issu= e title" data-id=3D"360830362" data-permission-text=3D"Issue title is priva= te" data-url=3D"https://github.com/apple/cups/issues/5398" data-hovercard-t= ype=3D"pull_request" data-hovercard-url=3D"/apple/cups/pull/5398/hovercard"= href=3D"https://github.com/apple/cups/pull/5398">#5398)
  • +
  • Added USB quirk rules (Issue #5395, Issue #54= 20, Issue #5443) +
  • The generated PPD files for IPP Everywhere printers did not contain th= e cupsManualCopies keyword (Issue #5433)
  • +
  • Kerberos credentials might be truncated (Issue #5435)
  • +
  • The handling of MaxJobTime 0 did not match the documentat= ion (Issue #5438)
  • +
  • Fixed a bug adding a queue with the -E option (Issue #5440)
  • +
  • The cupsaddsmb program has been removed (Issue #5449)
  • +
  • The cupstestdsc program has been removed (Issue #5450)
  • +
  • The scheduler was being backgrounded on macOS, causing applications to= spin (rdar://40436080)
  • +
  • The scheduler did not validate that required initial request attribute= s were in the operation group (rdar://41098178)
  • +
  • Authentication in the web interface did not work on macOS (rdar://4144= 4473)
  • +
  • Fixed an issue with HTTP Digest authentication (rdar://41709086)
  • +
  • The scheduler could crash when job history was purged (rdar://42198057= )
  • +
  • Fixed a crash bug when mapping PPD duplex options to IPP attributes (r= dar://46183976)
  • +
  • Fixed a memory leak for some IPP (extension) syntaxes.
  • +
  • The cupscgi, cupsmime, and cupsppdc support libraries are no longer installed as shared libraries.
  • +
  • The snmp backend is now deprecated.
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ + + +
+ =20 +
+
+
+ + +
+ + + =20 + +
+ +
+
+
+
+ v2.2.10 +
+ + +
+ + =20 +

+ + michaelrsweet + released this + Dec= 7, 2018 + · + + 793 commits + to master + since this release +

+
+ + =20 + +
+

CUPS 2.2.10 is a bug fix release that addresses issues in the sched= uler, IPP Everywhere support, CUPS library, and USB printer support. Change= s include:

+
    +
  • CVE-2018-4300: Linux session cookies used a predictable random number = seed.
  • +
  • The lpoptions command now works with IPP Everywhere print= ers that have not yet been added as local queues (Issue #5045)
  • +
  • Added USB quirk rules (Issue #5395, Issue #54= 43)
  • +
  • The generated PPD files for IPP Everywhere printers did not contain th= e cupsManualCopies keyword (Issue #5433)
  • +
  • Kerberos credentials might be truncated (Issue #5435)
  • +
  • The handling of MaxJobTime 0 did not match the documentat= ion (Issue #5438)
  • +
  • Incorporated the page accounting changes from CUPS 2.3 (Issue #5439)
  • +
  • Fixed a bug adding a queue with the -E option (Issue #5440)
  • +
  • Fixed a crash bug when mapping PPD duplex options to IPP attributes (r= dar://46183976)
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ +
+ +
+
PreviousNext
+
+ + +
+
+ +
+
+ =20 + +
+ + =20 +
+
+ + + + + + +
+
+ +
+
+ + + +
+ + + You can=E2=80=99t perform that action at this time. +
+ + + + + =20 + + =20 + =20 + =20 +
+ + + +
+ + +
+
+
+
+ +
+ + + + diff --git a/bitbake/lib/bb/tests/fetch-testdata/debian/pool/main/d/db5.3/i= ndex.html b/bitbake/lib/bb/tests/fetch-testdata/debian/pool/main/d/db5.3/in= dex.html new file mode 100644 index 0000000..a5a6f48 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/debian/pool/main/d/db5.3/index.ht= ml @@ -0,0 +1,509 @@ + + + + Index of /debian/pool/main/d/db5.3 + + +

Index of /debian/pool/main/d/db5.3

+ + + + += += += += += += += += += <= td align=3D"right"> 22K += <= td align=3D"right"> 19K += += += += += += += += += <= td align=3D"right"> 22K += += += += += <= td align=3D"right"> 21K += <= td align=3D"right"> 20K += <= td align=3D"right"> 19K += 22K += += += += += <= td align=3D"right"> 22K += <= td align=3D"right"> 19K += += += += += += += += += += += <= td align=3D"right"> 64K += += 69K += += += += += += += <= td align=3D"right"> 64K += += 69K += += += += += += += += += += += += <= td align=3D"right"> 64K += += 60K += += += = += += = += += += += += = += <= td align=3D"right">2013-10-27 14:01 += += += += += <= td align=3D"right">842K += <= td align=3D"right">773K += += += += += += += += += <= td align=3D"right">842K += += += += += <= td align=3D"right">740K += <= td align=3D"right">643K += <= td align=3D"right">672K += 780K += += += += += <= td align=3D"right">836K += <= td align=3D"right">768K += += += += += += += += += += += <= td align=3D"right">604K += += 723K += += += += += += += <= td align=3D"right">604K += += 724K += += += += += += += += += += += += <= td align=3D"right">601K += += 618K += += 43M += 42M += 42M += 42M += += += += <= td align=3D"right"> 42M += += 44M += 43M += 42M += 42M += 42M += += += <= td align=3D"right"> 42M += += 44M += += += += += 40M += 40M += 39M += 39M += += += += <= td align=3D"right"> 39M += += 42M += 743K += 707K += 654K += 677K += += += += <= td align=3D"right">769K += += 679K += 743K += 707K += 654K += 677K += += += <= td align=3D"right">769K += += 679K += += += += += 742K += 648K += 660K += 676K += += += += <= td align=3D"right">765K += += 699K += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += 885K += 808K += 737K += 766K += += += += <= td align=3D"right">788K += += 794K += 883K += 808K += 739K += 766K += += += <= td align=3D"right">788K += += 794K += += += += += 879K += 733K += 737K += 766K += += += += <= td align=3D"right">788K += += 817K += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += 711K += 650K += 592K += 618K += += += += <= td align=3D"right">623K += += 639K += 712K += 649K += 592K += 618K += += += <= td align=3D"right">624K += += 639K += += += += += 707K += 594K += 591K += 617K += += += += <= td align=3D"right">622K += += 657K += 954K += 894K += 805K += 826K += += += += <= td align=3D"right">941K += += 854K += 954K += 894K += 803K += 825K += += += <= td align=3D"right">942K += += 853K += += += += += 949K += 809K += 808K += 823K += += += += <= td align=3D"right">936K += += 885K += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += + +
3D"[ICO]"NameLas= t modifiedSize

3D"[PARENTDIR]"Parent Directory = -
3D"[db5.3-doc_5.3.28+dfsg1-0= .5_all.deb2019-02-26 10:57 15M
3D"[db5.3-doc_5.3.28+dfsg1-0= .6_all.deb2019-03-12 05:28 15M
3D"[db5.3-doc_5.3.28-9+deb8u1= _all.deb2017-11-18 20:15 18M
3D"[db5.3-doc_5.3.28-12+deb9= u1_all.deb2017-09-28 09:42 18M
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 21K
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 19K
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 20K
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 19K
3D"[db5.3-sql-util_5.3= .28+dfsg1-0.5_i386.deb2019-02-26 09:46
3D"[db5.3-sql-util_5.3= .28+dfsg1-0.5_mips.deb2019-02-26 10:57
3D"[db5.3-sql-util= _5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42= 19K
3D"[db5.3-sql-util_5= .3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 19K
3D"[db5.3-sql-util_= 5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 = 23K
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 20K
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 21K
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 19K
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 20K
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 19K
3D"[db5.3-sql-util_5.3= .28+dfsg1-0.6_i386.deb2019-03-12 05:43
3D"[db5.3-sql-util= _5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29= 19K
3D"[db5.3-sql-util_5= .3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 19K
3D"[db5.3-sql-util_= 5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 = 23K
3D"[db5.3-sql-util_5.= 3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 20K
3D"[db5.3-sql-util_5.3= .28-9+deb8u1_amd64.deb2017-11-20 03:40
3D"[db5.3-sql-util_5.3= .28-9+deb8u1_armel.deb2017-11-20 04:26
3D"[db5.3-sql-util_5.3= .28-9+deb8u1_armhf.deb2017-12-02 16:26
3D"[db5.3-sql-util_5.3.= 28-9+deb8u1_i386.deb2017-11-20 03:25
3D"[db5.3-sql-util_5.= 3.28-12+deb9u1_amd64.deb2017-09-28 09:42 20K
3D"[db5.3-sql-util_5.= 3.28-12+deb9u1_arm64.deb2017-09-28 09:42 18K
3D"[db5.3-sql-util_5.= 3.28-12+deb9u1_armel.deb2017-09-28 10:28 20K
3D"[db5.3-sql-util_5.= 3.28-12+deb9u1_armhf.deb2017-09-28 10:28 19K
3D"[db5.3-sql-util_5.3= .28-12+deb9u1_i386.deb2017-09-28 09:27
3D"[db5.3-sql-util_5.3= .28-12+deb9u1_mips.deb2017-09-29 16:10
3D"[db5.3-sql-util= _5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29= 19K
3D"[db5.3-sql-util_5= .3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 19K
3D"[db5.3-sql-util_= 5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 = 19K
3D"[db5.3-sql-util_5.= 3.28-12+deb9u1_s390x.deb2017-09-28 09:42 20K
3D"[db5.3-util_5.3.28+dfs= g1-0.5_amd64.deb2019-02-26 10:11 63K
3D"[db5.3-util_5.3.28+dfs= g1-0.5_arm64.deb2019-02-26 09:56 63K
3D"[db5.3-util_5.3.28+dfs= g1-0.5_armel.deb2019-02-26 10:57 58K
3D"[db5.3-util_5.3.28+dfs= g1-0.5_armhf.deb2019-02-26 10:57 59K
3D"[db5.3-util_5.3.28+dfsg= 1-0.5_i386.deb2019-02-26 09:46 65K
3D"[db5.3-util_5.3.28+dfsg= 1-0.5_mips.deb2019-02-26 10:57 62K
3D"[db5.3-util_5.3.28+= dfsg1-0.5_mips64el.deb2019-02-26 12:42
3D"[db5.3-util_5.3.28+df= sg1-0.5_mipsel.deb2019-02-26 12:42 63K
3D"[db5.3-util_5.3.28+d= fsg1-0.5_ppc64el.deb2019-02-26 09:56
3D"[db5.3-util_5.3.28+dfs= g1-0.5_s390x.deb2019-02-26 09:56 64K
3D"[db5.3-util_5.3.28+dfs= g1-0.6_amd64.deb2019-03-12 05:28 63K
3D"[db5.3-util_5.3.28+dfs= g1-0.6_arm64.deb2019-03-12 05:28 63K
3D"[db5.3-util_5.3.28+dfs= g1-0.6_armel.deb2019-03-12 06:29 58K
3D"[db5.3-util_5.3.28+dfs= g1-0.6_armhf.deb2019-03-12 06:14 59K
3D"[db5.3-util_5.3.28+dfsg= 1-0.6_i386.deb2019-03-12 05:43 65K
3D"[db5.3-util_5.3.28+= dfsg1-0.6_mips64el.deb2019-03-12 06:29
3D"[db5.3-util_5.3.28+df= sg1-0.6_mipsel.deb2019-03-12 07:30 63K
3D"[db5.3-util_5.3.28+d= fsg1-0.6_ppc64el.deb2019-03-12 05:28
3D"[db5.3-util_5.3.28+dfs= g1-0.6_s390x.deb2019-03-12 05:13 64K
3D"[db5.3-util_5.3.28-9+de= b8u1_amd64.deb2017-11-20 03:40 63K
3D"[db5.3-util_5.3.28-9+de= b8u1_armel.deb2017-11-20 04:26 60K
3D"[db5.3-util_5.3.28-9+de= b8u1_armhf.deb2017-12-02 16:26 61K
3D"[db5.3-util_5.3.28-9+deb= 8u1_i386.deb2017-11-20 03:25 65K
3D"[db5.3-util_5.3.28-12+= deb9u1_amd64.deb2017-09-28 09:42 63K
3D"[db5.3-util_5.3.28-12+= deb9u1_arm64.deb2017-09-28 09:42 60K
3D"[db5.3-util_5.3.28-12+= deb9u1_armel.deb2017-09-28 10:28 60K
3D"[db5.3-util_5.3.28-12+= deb9u1_armhf.deb2017-09-28 10:28 61K
3D"[db5.3-util_5.3.28-12+d= eb9u1_i386.deb2017-09-28 09:27 66K
3D"[db5.3-util_5.3.28-12+d= eb9u1_mips.deb2017-09-29 16:10 62K
3D"[db5.3-util_5.3.28-= 12+deb9u1_mips64el.deb2017-09-28 11:29
3D"[db5.3-util_5.3.28-12= +deb9u1_mipsel.deb2017-09-28 11:14 63K
3D"[db5.3-util_5.3.28-1= 2+deb9u1_ppc64el.deb2017-09-28 09:27
3D"[db5.3-util_5.3.28-12+= deb9u1_s390x.deb2017-09-28 09:42 64K
3D"[db5.3_5.3.28+dfsg1-0.5= .debian.tar.xz2019-02-26 08:51 28K
3D"[db5.3_5.3.28+dfsg1-0.5.dsc2019-02-26 08:51 2.7K
3D"[db5.3_5.3.28+dfsg1-0.6= .debian.tar.xz2019-03-12 04:27 29K
3D"[db5.3_5.3.28+dfsg1-0.6.dsc2019-03-12 04:27 3.1K
3D"[db5.3_5.3.28+dfsg1.orig.tar.= xz2018-08-09 01:52 = 19M
3D"[db5.3_5.3.28-9+deb8u1.d= ebian.tar.xz2017-11-18 20:15 28K
3D"[db5.3_5.3.28-9+deb8u1.dsc2017-11-18 20:15 3.2K
3D"[db5.3_5.3.28-12+deb9u1= .debian.tar.xz2017-09-24 16:26 28K
3D"[db5.3_5.3.28-12+deb9u1.dsc2017-09-24 16:26 3.2K
3D"[db5.3_5.3.28.orig.tar.xz 23M
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 760K
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 722K
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 668K
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 692K
3D"[libdb5.3++-dev_5.3= .28+dfsg1-0.5_i386.deb2019-02-26 09:46
3D"[libdb5.3++-dev_5.3= .28+dfsg1-0.5_mips.deb2019-02-26 10:57
3D"[libdb5.3++-dev= _5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42= 801K
3D"[libdb5.3++-dev_5= .3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 789K
3D"[libdb5.3++-dev_= 5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 = 816K
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 693K
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 759K
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 722K
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 668K
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 692K
3D"[libdb5.3++-dev_5.3= .28+dfsg1-0.6_i386.deb2019-03-12 05:43
3D"[libdb5.3++-dev= _5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29= 801K
3D"[libdb5.3++-dev_5= .3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 789K
3D"[libdb5.3++-dev_= 5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 = 816K
3D"[libdb5.3++-dev_5.= 3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 693K
3D"[libdb5.3++-dev_5.3= .28-9+deb8u1_amd64.deb2017-11-20 03:40
3D"[libdb5.3++-dev_5.3= .28-9+deb8u1_armel.deb2017-11-20 04:26
3D"[libdb5.3++-dev_5.3= .28-9+deb8u1_armhf.deb2017-12-02 16:26
3D"[libdb5.3++-dev_5.3.= 28-9+deb8u1_i386.deb2017-11-20 03:25
3D"[libdb5.3++-dev_5.= 3.28-12+deb9u1_amd64.deb2017-09-28 09:42 757K
3D"[libdb5.3++-dev_5.= 3.28-12+deb9u1_arm64.deb2017-09-28 09:42 663K
3D"[libdb5.3++-dev_5.= 3.28-12+deb9u1_armel.deb2017-09-28 10:28 676K
3D"[libdb5.3++-dev_5.= 3.28-12+deb9u1_armhf.deb2017-09-28 10:28 690K
3D"[libdb5.3++-dev_5.3= .28-12+deb9u1_i386.deb2017-09-28 09:27
3D"[libdb5.3++-dev_5.3= .28-12+deb9u1_mips.deb2017-09-29 16:10
3D"[libdb5.3++-dev= _5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29= 795K
3D"[libdb5.3++-dev_5= .3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 786K
3D"[libdb5.3++-dev_= 5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 = 701K
3D"[libdb5.3++-dev_5.= 3.28-12+deb9u1_s390x.deb2017-09-28 09:42 714K
3D"[libdb5.3++_5.3.28+dfs= g1-0.5_amd64.deb2019-02-26 10:11 690K
3D"[libdb5.3++_5.3.28+dfs= g1-0.5_arm64.deb2019-02-26 09:56 628K
3D"[libdb5.3++_5.3.28+dfs= g1-0.5_armel.deb2019-02-26 10:57 576K
3D"[libdb5.3++_5.3.28+dfs= g1-0.5_armhf.deb2019-02-26 10:57 600K
3D"[libdb5.3++_5.3.28+dfsg= 1-0.5_i386.deb2019-02-26 09:46 755K
3D"[libdb5.3++_5.3.28+dfsg= 1-0.5_mips.deb2019-02-26 10:57 595K
3D"[libdb5.3++_5.3.28+= dfsg1-0.5_mips64el.deb2019-02-26 12:42
3D"[libdb5.3++_5.3.28+df= sg1-0.5_mipsel.deb2019-02-26 12:42 604K
3D"[libdb5.3++_5.3.28+d= fsg1-0.5_ppc64el.deb2019-02-26 09:56
3D"[libdb5.3++_5.3.28+dfs= g1-0.5_s390x.deb2019-02-26 09:56 619K
3D"[libdb5.3++_5.3.28+dfs= g1-0.6_amd64.deb2019-03-12 05:28 690K
3D"[libdb5.3++_5.3.28+dfs= g1-0.6_arm64.deb2019-03-12 05:28 629K
3D"[libdb5.3++_5.3.28+dfs= g1-0.6_armel.deb2019-03-12 06:29 574K
3D"[libdb5.3++_5.3.28+dfs= g1-0.6_armhf.deb2019-03-12 06:14 600K
3D"[libdb5.3++_5.3.28+dfsg= 1-0.6_i386.deb2019-03-12 05:43 755K
3D"[libdb5.3++_5.3.28+= dfsg1-0.6_mips64el.deb2019-03-12 06:29
3D"[libdb5.3++_5.3.28+df= sg1-0.6_mipsel.deb2019-03-12 07:30 604K
3D"[libdb5.3++_5.3.28+d= fsg1-0.6_ppc64el.deb2019-03-12 05:28
3D"[libdb5.3++_5.3.28+dfs= g1-0.6_s390x.deb2019-03-12 05:13 620K
3D"[libdb5.3++_5.3.28-9+de= b8u1_amd64.deb2017-11-20 03:40 691K
3D"[libdb5.3++_5.3.28-9+de= b8u1_armel.deb2017-11-20 04:26 580K
3D"[libdb5.3++_5.3.28-9+de= b8u1_armhf.deb2017-12-02 16:26 606K
3D"[libdb5.3++_5.3.28-9+deb= 8u1_i386.deb2017-11-20 03:25 749K
3D"[libdb5.3++_5.3.28-12+= deb9u1_amd64.deb2017-09-28 09:42 687K
3D"[libdb5.3++_5.3.28-12+= deb9u1_arm64.deb2017-09-28 09:42 574K
3D"[libdb5.3++_5.3.28-12+= deb9u1_armel.deb2017-09-28 10:28 575K
3D"[libdb5.3++_5.3.28-12+= deb9u1_armhf.deb2017-09-28 10:28 600K
3D"[libdb5.3++_5.3.28-12+d= eb9u1_i386.deb2017-09-28 09:27 751K
3D"[libdb5.3++_5.3.28-12+d= eb9u1_mips.deb2017-09-29 16:10 593K
3D"[libdb5.3++_5.3.28-= 12+deb9u1_mips64el.deb2017-09-28 11:29
3D"[libdb5.3++_5.3.28-12= +deb9u1_mipsel.deb2017-09-28 11:14 602K
3D"[libdb5.3++_5.3.28-1= 2+deb9u1_ppc64el.deb2017-09-28 09:27
3D"[libdb5.3++_5.3.28-12+= deb9u1_s390x.deb2017-09-28 09:42 637K
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.5_amd64.deb2019-02-26 10:11
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.5_arm64.deb2019-02-26 09:56
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.5_armel.deb2019-02-26 10:57
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.5_armhf.deb2019-02-26 10:57
3D"[libdb5.3-dbg_5.3.28+= dfsg1-0.5_i386.deb2019-02-26 09:46 41M
3D"[libdb5.3-dbg_5.3.28+= dfsg1-0.5_mips.deb2019-02-26 10:57 43M
3D"[libdb5.3-dbg_5.3= .28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 43M
3D"[libdb5.3-dbg_5.3.2= 8+dfsg1-0.5_mipsel.deb2019-02-26 12:42
3D"[libdb5.3-dbg_5.3.= 28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 42M
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.5_s390x.deb2019-02-26 09:56
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.6_amd64.deb2019-03-12 05:28
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.6_arm64.deb2019-03-12 05:28
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.6_armel.deb2019-03-12 06:29
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.6_armhf.deb2019-03-12 06:14
3D"[libdb5.3-dbg_5.3.28+= dfsg1-0.6_i386.deb2019-03-12 05:43 41M
3D"[libdb5.3-dbg_5.3= .28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 43M
3D"[libdb5.3-dbg_5.3.2= 8+dfsg1-0.6_mipsel.deb2019-03-12 07:30
3D"[libdb5.3-dbg_5.3.= 28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 42M
3D"[libdb5.3-dbg_5.3.28= +dfsg1-0.6_s390x.deb2019-03-12 05:13
3D"[libdb5.3-dbg_5.3.28-= 9+deb8u1_amd64.deb2017-11-20 03:40 34M
3D"[libdb5.3-dbg_5.3.28-= 9+deb8u1_armel.deb2017-11-20 04:26 35M
3D"[libdb5.3-dbg_5.3.28-= 9+deb8u1_armhf.deb2017-12-02 16:26 35M
3D"[libdb5.3-dbg_5.3.28-9= +deb8u1_i386.deb2017-11-20 03:25 32M
3D"[libdb5.3-dbg_5.3.28= -12+deb9u1_amd64.deb2017-09-28 09:42
3D"[libdb5.3-dbg_5.3.28= -12+deb9u1_arm64.deb2017-09-28 09:42
3D"[libdb5.3-dbg_5.3.28= -12+deb9u1_armel.deb2017-09-28 10:28
3D"[libdb5.3-dbg_5.3.28= -12+deb9u1_armhf.deb2017-09-28 10:28
3D"[libdb5.3-dbg_5.3.28-= 12+deb9u1_i386.deb2017-09-28 09:27 38M
3D"[libdb5.3-dbg_5.3.28-= 12+deb9u1_mips.deb2017-09-29 16:10 41M
3D"[libdb5.3-dbg_5.3= .28-12+deb9u1_mips64el.deb2017-09-28 11:29 40M
3D"[libdb5.3-dbg_5.3.2= 8-12+deb9u1_mipsel.deb2017-09-28 11:14
3D"[libdb5.3-dbg_5.3.= 28-12+deb9u1_ppc64el.deb2017-09-28 09:27 40M
3D"[libdb5.3-dbg_5.3.28= -12+deb9u1_s390x.deb2017-09-28 09:42
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.5_amd64.deb2019-02-26 10:11
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.5_arm64.deb2019-02-26 09:56
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.5_armel.deb2019-02-26 10:57
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.5_armhf.deb2019-02-26 10:57
3D"[libdb5.3-dev_5.3.28+= dfsg1-0.5_i386.deb2019-02-26 09:46 822K
3D"[libdb5.3-dev_5.3.28+= dfsg1-0.5_mips.deb2019-02-26 10:57 753K
3D"[libdb5.3-dev_5.3= .28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 780K
3D"[libdb5.3-dev_5.3.2= 8+dfsg1-0.5_mipsel.deb2019-02-26 12:42
3D"[libdb5.3-dev_5.3.= 28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 797K
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.5_s390x.deb2019-02-26 09:56
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.6_amd64.deb2019-03-12 05:28
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.6_arm64.deb2019-03-12 05:28
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.6_armel.deb2019-03-12 06:29
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.6_armhf.deb2019-03-12 06:14
3D"[libdb5.3-dev_5.3.28+= dfsg1-0.6_i386.deb2019-03-12 05:43 822K
3D"[libdb5.3-dev_5.3= .28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 780K
3D"[libdb5.3-dev_5.3.2= 8+dfsg1-0.6_mipsel.deb2019-03-12 07:30
3D"[libdb5.3-dev_5.3.= 28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 797K
3D"[libdb5.3-dev_5.3.28= +dfsg1-0.6_s390x.deb2019-03-12 05:13
3D"[libdb5.3-dev_5.3.28-= 9+deb8u1_amd64.deb2017-11-20 03:40 725K
3D"[libdb5.3-dev_5.3.28-= 9+deb8u1_armel.deb2017-11-20 04:26 630K
3D"[libdb5.3-dev_5.3.28-= 9+deb8u1_armhf.deb2017-12-02 16:26 659K
3D"[libdb5.3-dev_5.3.28-9= +deb8u1_i386.deb2017-11-20 03:25 766K
3D"[libdb5.3-dev_5.3.28= -12+deb9u1_amd64.deb2017-09-28 09:42
3D"[libdb5.3-dev_5.3.28= -12+deb9u1_arm64.deb2017-09-28 09:42
3D"[libdb5.3-dev_5.3.28= -12+deb9u1_armel.deb2017-09-28 10:28
3D"[libdb5.3-dev_5.3.28= -12+deb9u1_armhf.deb2017-09-28 10:28
3D"[libdb5.3-dev_5.3.28-= 12+deb9u1_i386.deb2017-09-28 09:27 817K
3D"[libdb5.3-dev_5.3.28-= 12+deb9u1_mips.deb2017-09-29 16:10 748K
3D"[libdb5.3-dev_5.3= .28-12+deb9u1_mips64el.deb2017-09-28 11:29 774K
3D"[libdb5.3-dev_5.3.2= 8-12+deb9u1_mipsel.deb2017-09-28 11:14
3D"[libdb5.3-dev_5.3.= 28-12+deb9u1_ppc64el.deb2017-09-28 09:27 682K
3D"[libdb5.3-dev_5.3.28= -12+deb9u1_s390x.deb2017-09-28 09:42
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11= 757K
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56= 720K
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57= 662K
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57= 688K
3D"[libdb5.3-java-d= ev_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 = 840K
3D"[libdb5.3-java-d= ev_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 = 768K
3D"[libdb5.3-ja= va-dev_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26= 12:42 795K
3D"[libdb5.3-java= -dev_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:= 42 784K
3D"[libdb5.3-jav= a-dev_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 0= 9:56 814K
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56= 688K
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28= 756K
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28= 721K
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29= 663K
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14= 688K
3D"[libdb5.3-java-d= ev_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 = 840K
3D"[libdb5.3-ja= va-dev_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12= 06:29 796K
3D"[libdb5.3-java= -dev_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:= 30 785K
3D"[libdb5.3-jav= a-dev_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 0= 5:28 814K
3D"[libdb5.3-java-= dev_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13= 688K
3D"[libdb5.3-java-d= ev_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 = 737K
3D"[libdb5.3-java-d= ev_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 = 637K
3D"[libdb5.3-java-d= ev_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 = 666K
3D"[libdb5.3-java-de= v_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 781K
3D"[libdb5.3-java-= dev_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42= 756K
3D"[libdb5.3-java-= dev_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42= 657K
3D"[libdb5.3-java-= dev_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28= 670K
3D"[libdb5.3-java-= dev_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28= 686K
3D"[libdb5.3-java-d= ev_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 = 836K
3D"[libdb5.3-java-d= ev_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 = 763K
3D"[libdb5.3-ja= va-dev_5.3.28-12+deb9u1_mips64el.deb2017-09-28= 11:29 789K
3D"[libdb5.3-java= -dev_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:= 14 780K
3D"[libdb5.3-jav= a-dev_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 0= 9:27 691K
3D"[libdb5.3-java-= dev_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42= 711K
3D"[libdb5.3-java-g= cj_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 = 602K
3D"[libdb5.3-java-g= cj_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 = 455K
3D"[libdb5.3-java-g= cj_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 = 450K
3D"[libdb5.3-java-gc= j_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 503K
3D"[libdb5.3-java-= gcj_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42= 602K
3D"[libdb5.3-java-= gcj_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42= 595K
3D"[libdb5.3-java-= gcj_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28= 453K
3D"[libdb5.3-java-= gcj_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28= 447K
3D"[libdb5.3-java-g= cj_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 = 518K
3D"[libdb5.3-java-g= cj_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 = 463K
3D"[libdb5.3-ja= va-gcj_5.3.28-12+deb9u1_mips64el.deb2017-09-28= 11:29 474K
3D"[libdb5.3-java= -gcj_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:= 14 471K
3D"[libdb5.3-jav= a-gcj_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 0= 9:27 611K
3D"[libdb5.3-java-= gcj_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42= 578K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11= 696K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56= 635K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57= 580K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57= 606K
3D"[libdb5.3-java-j= ni_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 = 763K
3D"[libdb5.3-java-j= ni_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 = 596K
3D"[libdb5.3-ja= va-jni_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26= 12:42 603K
3D"[libdb5.3-java= -jni_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:= 42 605K
3D"[libdb5.3-jav= a-jni_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 0= 9:56 732K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56= 624K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28= 696K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28= 636K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29= 581K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14= 606K
3D"[libdb5.3-java-j= ni_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 = 762K
3D"[libdb5.3-ja= va-jni_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12= 06:29 603K
3D"[libdb5.3-java= -jni_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:= 30 605K
3D"[libdb5.3-jav= a-jni_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 0= 5:28 733K
3D"[libdb5.3-java-= jni_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13= 625K
3D"[libdb5.3-java-j= ni_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 = 696K
3D"[libdb5.3-java-j= ni_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 = 583K
3D"[libdb5.3-java-j= ni_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 = 612K
3D"[libdb5.3-java-jn= i_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 754K
3D"[libdb5.3-java-= jni_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42= 695K
3D"[libdb5.3-java-= jni_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42= 574K
3D"[libdb5.3-java-= jni_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28= 580K
3D"[libdb5.3-java-= jni_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28= 606K
3D"[libdb5.3-java-j= ni_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 = 758K
3D"[libdb5.3-java-j= ni_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 = 593K
3D"[libdb5.3-ja= va-jni_5.3.28-12+deb9u1_mips64el.deb2017-09-28= 11:29 600K
3D"[libdb5.3-java= -jni_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:= 14 603K
3D"[libdb5.3-jav= a-jni_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 0= 9:27 618K
3D"[libdb5.3-java-= jni_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42= 641K
3D"[libdb5.3-java_5.3.28= +dfsg1-0.5_all.deb2019-02-26 10:57 575K
3D"[libdb5.3-java_5.3.28= +dfsg1-0.6_all.deb2019-03-12 05:28 575K
3D"[libdb5.3-java_5.3.28-= 9+deb8u1_all.deb2017-11-18 20:15 543K
3D"[libdb5.3-java_5.3.28= -12+deb9u1_all.deb2017-09-28 09:42 548K
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 = 1.0M
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 = 968K
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 = 901K
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 = 929K
3D"[libdb5.3-sql-dev= _5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 1.1M
3D"[libdb5.3-sql-dev= _5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 1.0M
3D"[libdb5.3-sql= -dev_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 1= 2:42 1.1M
3D"[libdb5.3-sql-d= ev_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42= 1.0M
3D"[libdb5.3-sql-= dev_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:= 56 1.1M
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 = 938K
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 = 1.0M
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 = 968K
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 = 901K
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 = 929K
3D"[libdb5.3-sql-dev= _5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 1.1M
3D"[libdb5.3-sql= -dev_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 0= 6:29 1.1M
3D"[libdb5.3-sql-d= ev_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30= 1.0M
3D"[libdb5.3-sql-= dev_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:= 28 1.1M
3D"[libdb5.3-sql-de= v_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 = 938K
3D"[libdb5.3-sql-dev= _5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 1.0M
3D"[libdb5.3-sql-dev= _5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 869K
3D"[libdb5.3-sql-dev= _5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 906K
3D"[libdb5.3-sql-dev_= 5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 1.0M
3D"[libdb5.3-sql-de= v_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 = 1.0M
3D"[libdb5.3-sql-de= v_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 = 891K
3D"[libdb5.3-sql-de= v_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 = 910K
3D"[libdb5.3-sql-de= v_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 = 929K
3D"[libdb5.3-sql-dev= _5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 1.1M
3D"[libdb5.3-sql-dev= _5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 1.0M
3D"[libdb5.3-sql= -dev_5.3.28-12+deb9u1_mips64el.deb2017-09-28 1= 1:29 1.0M
3D"[libdb5.3-sql-d= ev_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14= 1.0M
3D"[libdb5.3-sql-= dev_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:= 27 939K
3D"[libdb5.3-sql-de= v_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 = 965K
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.5_amd64.deb2019-02-26 10:11
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.5_arm64.deb2019-02-26 09:56
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.5_armel.deb2019-02-26 10:57
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.5_armhf.deb2019-02-26 10:57
3D"[libdb5.3-sql_5.3.28+= dfsg1-0.5_i386.deb2019-02-26 09:46 963K
3D"[libdb5.3-sql_5.3.28+= dfsg1-0.5_mips.deb2019-02-26 10:57 777K
3D"[libdb5.3-sql_5.3= .28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 789K
3D"[libdb5.3-sql_5.3.2= 8+dfsg1-0.5_mipsel.deb2019-02-26 12:42
3D"[libdb5.3-sql_5.3.= 28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 928K
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.5_s390x.deb2019-02-26 09:56
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.6_amd64.deb2019-03-12 05:28
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.6_arm64.deb2019-03-12 05:28
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.6_armel.deb2019-03-12 06:29
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.6_armhf.deb2019-03-12 06:14
3D"[libdb5.3-sql_5.3.28+= dfsg1-0.6_i386.deb2019-03-12 05:43 963K
3D"[libdb5.3-sql_5.3= .28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 789K
3D"[libdb5.3-sql_5.3.2= 8+dfsg1-0.6_mipsel.deb2019-03-12 07:30
3D"[libdb5.3-sql_5.3.= 28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 927K
3D"[libdb5.3-sql_5.3.28= +dfsg1-0.6_s390x.deb2019-03-12 05:13
3D"[libdb5.3-sql_5.3.28-= 9+deb8u1_amd64.deb2017-11-20 03:40 882K
3D"[libdb5.3-sql_5.3.28-= 9+deb8u1_armel.deb2017-11-20 04:26 742K
3D"[libdb5.3-sql_5.3.28-= 9+deb8u1_armhf.deb2017-12-02 16:26 774K
3D"[libdb5.3-sql_5.3.28-9= +deb8u1_i386.deb2017-11-20 03:25 954K
3D"[libdb5.3-sql_5.3.28= -12+deb9u1_amd64.deb2017-09-28 09:42
3D"[libdb5.3-sql_5.3.28= -12+deb9u1_arm64.deb2017-09-28 09:42
3D"[libdb5.3-sql_5.3.28= -12+deb9u1_armel.deb2017-09-28 10:28
3D"[libdb5.3-sql_5.3.28= -12+deb9u1_armhf.deb2017-09-28 10:28
3D"[libdb5.3-sql_5.3.28-= 12+deb9u1_i386.deb2017-09-28 09:27 958K
3D"[libdb5.3-sql_5.3.28-= 12+deb9u1_mips.deb2017-09-29 16:10 776K
3D"[libdb5.3-sql_5.3= .28-12+deb9u1_mips64el.deb2017-09-28 11:29 786K
3D"[libdb5.3-sql_5.3.2= 8-12+deb9u1_mipsel.deb2017-09-28 11:14
3D"[libdb5.3-sql_5.3.= 28-12+deb9u1_ppc64el.deb2017-09-28 09:27 786K
3D"[libdb5.3-sql_5.3.28= -12+deb9u1_s390x.deb2017-09-28 09:42
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 = 842K
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 = 804K
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 = 751K
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 = 774K
3D"[libdb5.3-stl-dev= _5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 927K
3D"[libdb5.3-stl-dev= _5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 856K
3D"[libdb5.3-stl= -dev_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 1= 2:42 885K
3D"[libdb5.3-stl-d= ev_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42= 874K
3D"[libdb5.3-stl-= dev_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:= 56 900K
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 = 773K
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 = 842K
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 = 804K
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 = 751K
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 = 774K
3D"[libdb5.3-stl-dev= _5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 927K
3D"[libdb5.3-stl= -dev_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 0= 6:29 886K
3D"[libdb5.3-stl-d= ev_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30= 874K
3D"[libdb5.3-stl-= dev_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:= 28 900K
3D"[libdb5.3-stl-de= v_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 = 774K
3D"[libdb5.3-stl-dev= _5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 826K
3D"[libdb5.3-stl-dev= _5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 727K
3D"[libdb5.3-stl-dev= _5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 757K
3D"[libdb5.3-stl-dev_= 5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 868K
3D"[libdb5.3-stl-de= v_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 = 838K
3D"[libdb5.3-stl-de= v_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 = 745K
3D"[libdb5.3-stl-de= v_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 = 759K
3D"[libdb5.3-stl-de= v_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 = 773K
3D"[libdb5.3-stl-dev= _5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 920K
3D"[libdb5.3-stl-dev= _5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 852K
3D"[libdb5.3-stl= -dev_5.3.28-12+deb9u1_mips64el.deb2017-09-28 1= 1:29 880K
3D"[libdb5.3-stl-d= ev_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14= 870K
3D"[libdb5.3-stl-= dev_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:= 27 783K
3D"[libdb5.3-stl-de= v_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 = 795K
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.5_amd64.deb2019-02-26 10:11
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.5_arm64.deb2019-02-26 09:56
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.5_armel.deb2019-02-26 10:57
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.5_armhf.deb2019-02-26 10:57
3D"[libdb5.3-stl_5.3.28+= dfsg1-0.5_i386.deb2019-02-26 09:46 779K
3D"[libdb5.3-stl_5.3.28+= dfsg1-0.5_mips.deb2019-02-26 10:57 614K
3D"[libdb5.3-stl_5.3= .28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 623K
3D"[libdb5.3-stl_5.3.2= 8+dfsg1-0.5_mipsel.deb2019-02-26 12:42
3D"[libdb5.3-stl_5.3.= 28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 746K
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.5_s390x.deb2019-02-26 09:56
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.6_amd64.deb2019-03-12 05:28
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.6_arm64.deb2019-03-12 05:28
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.6_armel.deb2019-03-12 06:29
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.6_armhf.deb2019-03-12 06:14
3D"[libdb5.3-stl_5.3.28+= dfsg1-0.6_i386.deb2019-03-12 05:43 779K
3D"[libdb5.3-stl_5.3= .28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 623K
3D"[libdb5.3-stl_5.3.2= 8+dfsg1-0.6_mipsel.deb2019-03-12 07:30
3D"[libdb5.3-stl_5.3.= 28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 746K
3D"[libdb5.3-stl_5.3.28= +dfsg1-0.6_s390x.deb2019-03-12 05:13
3D"[libdb5.3-stl_5.3.28-= 9+deb8u1_amd64.deb2017-11-20 03:40 714K
3D"[libdb5.3-stl_5.3.28-= 9+deb8u1_armel.deb2017-11-20 04:26 599K
3D"[libdb5.3-stl_5.3.28-= 9+deb8u1_armhf.deb2017-12-02 16:26 627K
3D"[libdb5.3-stl_5.3.28-9= +deb8u1_i386.deb2017-11-20 03:25 774K
3D"[libdb5.3-stl_5.3.28= -12+deb9u1_amd64.deb2017-09-28 09:42
3D"[libdb5.3-stl_5.3.28= -12+deb9u1_arm64.deb2017-09-28 09:42
3D"[libdb5.3-stl_5.3.28= -12+deb9u1_armel.deb2017-09-28 10:28
3D"[libdb5.3-stl_5.3.28= -12+deb9u1_armhf.deb2017-09-28 10:28
3D"[libdb5.3-stl_5.3.28-= 12+deb9u1_i386.deb2017-09-28 09:27 774K
3D"[libdb5.3-stl_5.3.28-= 12+deb9u1_mips.deb2017-09-29 16:10 612K
3D"[libdb5.3-stl_5.3= .28-12+deb9u1_mips64el.deb2017-09-28 11:29 620K
3D"[libdb5.3-stl_5.3.2= 8-12+deb9u1_mipsel.deb2017-09-28 11:14
3D"[libdb5.3-stl_5.3.= 28-12+deb9u1_ppc64el.deb2017-09-28 09:27 639K
3D"[libdb5.3-stl_5.3.28= -12+deb9u1_s390x.deb2017-09-28 09:42
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.5_amd64.deb2019-02-26 10:11
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.5_arm64.deb2019-02-26 09:56
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.5_armel.deb2019-02-26 10:57
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.5_armhf.deb2019-02-26 10:57
3D"[libdb5.3-tcl_5.3.28+= dfsg1-0.5_i386.deb2019-02-26 09:46 1.0M
3D"[libdb5.3-tcl_5.3.28+= dfsg1-0.5_mips.deb2019-02-26 10:57 921K
3D"[libdb5.3-tcl_5.3= .28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 952K
3D"[libdb5.3-tcl_5.3.2= 8+dfsg1-0.5_mipsel.deb2019-02-26 12:42
3D"[libdb5.3-tcl_5.3.= 28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 1.0M
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.5_s390x.deb2019-02-26 09:56
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.6_amd64.deb2019-03-12 05:28
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.6_arm64.deb2019-03-12 05:28
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.6_armel.deb2019-03-12 06:29
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.6_armhf.deb2019-03-12 06:14
3D"[libdb5.3-tcl_5.3.28+= dfsg1-0.6_i386.deb2019-03-12 05:43 1.0M
3D"[libdb5.3-tcl_5.3= .28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 952K
3D"[libdb5.3-tcl_5.3.2= 8+dfsg1-0.6_mipsel.deb2019-03-12 07:30
3D"[libdb5.3-tcl_5.3.= 28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 1.0M
3D"[libdb5.3-tcl_5.3.28= +dfsg1-0.6_s390x.deb2019-03-12 05:13
3D"[libdb5.3-tcl_5.3.28-= 9+deb8u1_amd64.deb2017-11-20 03:40 1.1M
3D"[libdb5.3-tcl_5.3.28-= 9+deb8u1_armel.deb2017-11-20 04:26 971K
3D"[libdb5.3-tcl_5.3.28-= 9+deb8u1_armhf.deb2017-12-02 16:26 1.0M
3D"[libdb5.3-tcl_5.3.28-9= +deb8u1_i386.deb2017-11-20 03:25 1.3M
3D"[libdb5.3-tcl_5.3.28= -12+deb9u1_amd64.deb2017-09-28 09:42
3D"[libdb5.3-tcl_5.3.28= -12+deb9u1_arm64.deb2017-09-28 09:42
3D"[libdb5.3-tcl_5.3.28= -12+deb9u1_armel.deb2017-09-28 10:28
3D"[libdb5.3-tcl_5.3.28= -12+deb9u1_armhf.deb2017-09-28 10:28
3D"[libdb5.3-tcl_5.3.28-= 12+deb9u1_i386.deb2017-09-28 09:27 1.0M
3D"[libdb5.3-tcl_5.3.28-= 12+deb9u1_mips.deb2017-09-29 16:10 915K
3D"[libdb5.3-tcl_5.3= .28-12+deb9u1_mips64el.deb2017-09-28 11:29 943K
3D"[libdb5.3-tcl_5.3.2= 8-12+deb9u1_mipsel.deb2017-09-28 11:14
3D"[libdb5.3-tcl_5.3.= 28-12+deb9u1_ppc64el.deb2017-09-28 09:27 871K
3D"[libdb5.3-tcl_5.3.28= -12+deb9u1_s390x.deb2017-09-28 09:42
3D"[libdb5.3_5.3.28+dfsg1-0= .5_amd64.deb2019-02-26 10:11 667K
3D"[libdb5.3_5.3.28+dfsg1-0= .5_arm64.deb2019-02-26 09:56 607K
3D"[libdb5.3_5.3.28+dfsg1-0= .5_armel.deb2019-02-26 10:57 558K
3D"[libdb5.3_5.3.28+dfsg1-0= .5_armhf.deb2019-02-26 10:57 583K
3D"[libdb5.3_5.3.28+dfsg1-0.= 5_i386.deb2019-02-26 09:46 730K
3D"[libdb5.3_5.3.28+dfsg1-0.= 5_mips.deb2019-02-26 10:57 575K
3D"[libdb5.3_5.3.28+dfsg= 1-0.5_mips64el.deb2019-02-26 12:42 583K
3D"[libdb5.3_5.3.28+dfsg1-= 0.5_mipsel.deb2019-02-26 12:42 584K
3D"[libdb5.3_5.3.28+dfsg1= -0.5_ppc64el.deb2019-02-26 09:56 701K
3D"[libdb5.3_5.3.28+dfsg1-0= .5_s390x.deb2019-02-26 09:56 599K
3D"[libdb5.3_5.3.28+dfsg1-0= .6_amd64.deb2019-03-12 05:28 667K
3D"[libdb5.3_5.3.28+dfsg1-0= .6_arm64.deb2019-03-12 05:28 607K
3D"[libdb5.3_5.3.28+dfsg1-0= .6_armel.deb2019-03-12 06:29 559K
3D"[libdb5.3_5.3.28+dfsg1-0= .6_armhf.deb2019-03-12 06:14 583K
3D"[libdb5.3_5.3.28+dfsg1-0.= 6_i386.deb2019-03-12 05:43 730K
3D"[libdb5.3_5.3.28+dfsg= 1-0.6_mips64el.deb2019-03-12 06:29 583K
3D"[libdb5.3_5.3.28+dfsg1-= 0.6_mipsel.deb2019-03-12 07:30 584K
3D"[libdb5.3_5.3.28+dfsg1= -0.6_ppc64el.deb2019-03-12 05:28 701K
3D"[libdb5.3_5.3.28+dfsg1-0= .6_s390x.deb2019-03-12 05:13 598K
3D"[libdb5.3_5.3.28-9+deb8u1= _amd64.deb2017-11-20 03:40 664K
3D"[libdb5.3_5.3.28-9+deb8u1= _armel.deb2017-11-20 04:26 561K
3D"[libdb5.3_5.3.28-9+deb8u1= _armhf.deb2017-12-02 16:26 587K
3D"[libdb5.3_5.3.28-9+deb8u1_= i386.deb2017-11-20 03:25 721K
3D"[libdb5.3_5.3.28-12+deb9= u1_amd64.deb2017-09-28 09:42 663K
3D"[libdb5.3_5.3.28-12+deb9= u1_arm64.deb2017-09-28 09:42 550K
3D"[libdb5.3_5.3.28-12+deb9= u1_armel.deb2017-09-28 10:28 556K
3D"[libdb5.3_5.3.28-12+deb9= u1_armhf.deb2017-09-28 10:28 581K
3D"[libdb5.3_5.3.28-12+deb9u= 1_i386.deb2017-09-28 09:27 725K
3D"[libdb5.3_5.3.28-12+deb9u= 1_mips.deb2017-09-29 16:10 572K
3D"[libdb5.3_5.3.28-12+d= eb9u1_mips64el.deb2017-09-28 11:29 579K
3D"[libdb5.3_5.3.28-12+deb= 9u1_mipsel.deb2017-09-28 11:14 581K
3D"[libdb5.3_5.3.28-12+de= b9u1_ppc64el.deb2017-09-28 09:27 594K
3D"[libdb5.3_5.3.28-12+deb9= u1_s390x.deb2017-09-28 09:42 615K

+
Apache Server at ftp.debian.org Port 80
+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/downloads/enchant/1.6.0/in= dex.html b/bitbake/lib/bb/tests/fetch-testdata/downloads/enchant/1.6.0/inde= x.html new file mode 100644 index 0000000..b7bfb1e --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/downloads/enchant/1.6.0/index.htm= l @@ -0,0 +1,15 @@ + + + + Index of /downloads/enchant/1.6.0 + + +

Index of /downloads/enchant/1.6.0

+ +Parent Directory - += + + +
3D"[ICO]"NameLast modified<= /a>SizeDescription

3D"[DIR]"  
3D"[MD5SUM01-Apr-2010 23:03= 55  
3D"[enchant-1.6.0.tar.gz01-Apr-2010 23:02 593K&nbs= p;

+
Apache/2.2.15 (Fedora) Server at www.abisource.com Port 443 + diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v2.8/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v2.8/index.html new file mode 100644 index 0000000..9ea077d --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v2.8/index.html @@ -0,0 +1,774 @@ + + + + Index of /files/v2.8 + + +

Index of /files/v2.8

+ + + + += 0 += += += += += += += += += += += += 2012-11-07 11:52 += 2012-11-27 15:15 += += += 2013-11-08 14:33 += 2010-05-27 09:45 +cmake-2.8.0-AIX-powerpc.sh=   + + += + + +cmake-2.8.0-HP-UX-9000_785.sh + + +cmake-2.8.0-IRIX64-64.sh + + +cmake-2.8.0-IRIX64-n32.sh2009-11-13 15:32 + + +cmake-2.8.0-Linux-i386.sh2009-11-13 15:32 + + +cmake-2.8.0-SunOS-sparc.sh=   + + +<= td>cmake-2.8.0-win32-x86.exe=   + += + + +cmake-2.8.1-AIX-powerpc.sh=   + + += + + +cmake-2.8.1-HP-UX-9000_785.sh + + +cmake-2.8.1-IRIX64-64.sh + + +cmake-2.8.1-IRIX64-n32.sh2010-04-06 14:37 + + +cmake-2.8.1-Linux-i386.sh2010-04-06 14:37 + + +cmake-2.8.1-SunOS-sparc.sh=   + + +<= td>cmake-2.8.1-win32-x86.exe=   + += + + +cmake-2.8.2-AIX-powerpc.sh=   + + += + + +cmake-2.8.2-HP-UX-9000_785.sh + + +cmake-2.8.2-IRIX64-64.sh + + +cmake-2.8.2-IRIX64-n32.sh2010-06-28 14:10 + + +cmake-2.8.2-Linux-i386.sh2010-06-28 14:10 + + +cmake-2.8.2-SunOS-sparc.sh=   + + +<= td>cmake-2.8.2-win32-x86.exe=   + += + + +cmake-2.8.3-AIX-powerpc.sh=   + + += + + +cmake-2.8.3-IRIX64-64.sh + + +cmake-2.8.3-IRIX64-n32.sh2010-11-03 17:10 + + +cmake-2.8.3-Linux-i386.sh2010-11-03 17:11 + + +cmake-2.8.3-SunOS-sparc.sh=   + + +<= td>cmake-2.8.3-win32-x86.exe=   + += + + +cmake-2.8.4-AIX-powerpc.sh=   + + += + + +cmake-2.8.4-IRIX64-64.sh + + +cmake-2.8.4-IRIX64-n32.sh2011-02-15 15:53 + + +cmake-2.8.4-Linux-i386.sh2011-02-15 15:54 + + +cmake-2.8.4-SunOS-sparc.sh=   + + +<= td>cmake-2.8.4-win32-x86.exe=   + += + + +=   += +cmake-2.8.5-AIX-powerpc.sh=   + + += + + +cmake-2.8.5-IRIX64-64.sh + + +cmake-2.8.5-IRIX64-n32.sh2011-07-08 10:34 + + +cmake-2.8.5-Linux-i386.sh2011-07-08 10:34 + + +cmake-2.8.5-SunOS-sparc.sh=   + + +<= td>cmake-2.8.5-win32-x86.exe=   + += + + +=   += +cmake-2.8.6-AIX-powerpc.sh=   + + += + + += + + +cmake-2.8.6-IRIX64-64.sh + + +cmake-2.8.6-IRIX64-n32.sh2011-10-04 13:59 + + +cmake-2.8.6-Linux-i386.sh2011-10-04 13:59 + + +<= td>cmake-2.8.6-win32-x86.exe=   + += + + +=   += +cmake-2.8.7-AIX-powerpc.sh=   + + += + + += + + +cmake-2.8.7-IRIX64-64.sh + + +cmake-2.8.7-IRIX64-n32.sh2011-12-30 14:13 + + +cmake-2.8.7-Linux-i386.sh2011-12-30 14:13 + + +<= td>cmake-2.8.7-win32-x86.exe=   + += + + +cmake-2.8.8-AIX-powerpc.sh=   + + += + + += + + +cmake-2.8.8-IRIX64-64.sh + + +cmake-2.8.8-IRIX64-n32.sh2012-04-18 15:22 + + +cmake-2.8.8-Linux-i386.sh2012-04-18 15:22 + + +cmake-2.8.8-SHA-256.txt +cmake-2.8.8-SHA-256.txt.asc<= td>  +<= td>cmake-2.8.8-win32-x86.exe=   + += + + +cmake-2.8.9-AIX-powerpc.sh=   + + += + + += + + +cmake-2.8.9-IRIX64-64.sh + + +cmake-2.8.9-IRIX64-n32.sh2012-08-09 15:35 + + +cmake-2.8.9-Linux-i386.sh2012-08-09 15:35 + + +cmake-2.8.9-SHA-256.txt +cmake-2.8.9-SHA-256.txt.asc<= td>  +<= td>cmake-2.8.9-win32-x86.exe=   + += + + +cmake-2.8.10-AIX-powerpc.sh<= td>  + + += + + += + + 38M +cmake-2.8.10-IRIX64-64.sh2012-10-31 13:04 + + +cmake-2.8.10-IRIX64-n32.sh=   + + +cmake-2.8.10-Linux-i386.sh=   + + +cmake-2.8.10-SHA-256.txt +cmake-2.8.10-SHA-256.txt.asc<= /td> +cmake-2.8.10-rc1-AIX-powerpc.s= h + + += += + += 38M + + +cmake-2.8.10-rc1-IRIX64-64.sh + + +cmake-2.8.10-rc1-IRIX64-n32.sh<= /a> + + +cmake-2.8.10-rc1-Linux-i386.sh<= /a> + + +cmake-2.8.10-rc1-SHA-256.txt<= /td> +cmake-2.8.10-rc1-SHA-256.txt.= asc +<= td>cmake-2.8.10-rc1-win32-x86.ex= e + +2012-10-02 13:27 +=   + +cmake-2.8.10-rc2-AIX-powerpc.s= h + + += += + += 38M + + +cmake-2.8.10-rc2-IRIX64-64.sh + + +cmake-2.8.10-rc2-IRIX64-n32.sh<= /a> + + +cmake-2.8.10-rc2-Linux-i386.sh<= /a> + + +cmake-2.8.10-rc2-SHA-256.txt<= /td> +cmake-2.8.10-rc2-SHA-256.txt.= asc +<= td>cmake-2.8.10-rc2-win32-x86.ex= e + +2012-10-19 09:24 +=   + +cmake-2.8.10-rc3-AIX-powerpc.s= h + + += += + += 38M + + +cmake-2.8.10-rc3-IRIX64-64.sh + + +cmake-2.8.10-rc3-IRIX64-n32.sh<= /a> + + +cmake-2.8.10-rc3-Linux-i386.sh<= /a> + + +cmake-2.8.10-rc3-SHA-256.txt<= /td> +cmake-2.8.10-rc3-SHA-256.txt.= asc +<= td>cmake-2.8.10-rc3-win32-x86.ex= e + +2012-10-24 15:09 +=   + +<= td>cmake-2.8.10-win32-x86.exe<= td>  + +cmake-2.8.10.1-AIX-powerpc.sh + + += + + 41M += += + +cmake-2.8.10.1-IRIX64-64.sh<= td>  + + +cmake-2.8.10.1-IRIX64-n32.sh<= /td> + + +cmake-2.8.10.1-Linux-i386.sh<= /td> + + +cmake-2.8.10.1-SHA-256.txt=   +cmake-2.8.10.1-SHA-256.txt.asc<= /a> +<= td>cmake-2.8.10.1-win32-x86.exe + + + + +cmake-2.8.10.2-AIX-powerpc.sh + + += + + 41M += += + +cmake-2.8.10.2-IRIX64-64.sh<= td>  + + +cmake-2.8.10.2-IRIX64-n32.sh<= /td> + + +cmake-2.8.10.2-Linux-i386.sh<= /td> + + +cmake-2.8.10.2-SHA-256.txt=   +cmake-2.8.10.2-SHA-256.txt.asc<= /a> +<= td>cmake-2.8.10.2-win32-x86.exe + + + + + + + +cmake-2.8.11-AIX-powerpc.sh<= td>  + + += + + += + + 39M +cmake-2.8.11-IRIX64-64.sh2013-05-15 15:53 + + +cmake-2.8.11-IRIX64-n32.sh=   + + +cmake-2.8.11-Linux-i386.sh=   + + +cmake-2.8.11-SHA-256.txt +cmake-2.8.11-SHA-256.txt.asc<= /td> +cmake-2.8.11-rc1-AIX-powerpc.s= h + + += += + += 39M + + +cmake-2.8.11-rc1-IRIX64-64.sh + + +cmake-2.8.11-rc1-IRIX64-n32.sh<= /a> + + +cmake-2.8.11-rc1-Linux-i386.sh<= /a> + + +cmake-2.8.11-rc1-SHA-256.txt<= /td> +cmake-2.8.11-rc1-SHA-256.txt.= asc +<= td>cmake-2.8.11-rc1-win32-x86.ex= e + +2013-03-14 17:14 +=   + +cmake-2.8.11-rc2-AIX-powerpc.s= h + + += += + += 39M + + +cmake-2.8.11-rc2-IRIX64-64.sh + + +cmake-2.8.11-rc2-IRIX64-n32.sh<= /a> + + +cmake-2.8.11-rc2-Linux-i386.sh<= /a> + + +cmake-2.8.11-rc2-SHA-256.txt<= /td> +cmake-2.8.11-rc2-SHA-256.txt.= asc +<= td>cmake-2.8.11-rc2-win32-x86.ex= e + +2013-04-05 18:00 +=   + +cmake-2.8.11-rc3-AIX-powerpc.s= h + + += += + += 39M + + +cmake-2.8.11-rc3-IRIX64-64.sh + + +cmake-2.8.11-rc3-IRIX64-n32.sh<= /a> + + +cmake-2.8.11-rc3-Linux-i386.sh<= /a> + + +cmake-2.8.11-rc3-SHA-256.txt<= /td> +cmake-2.8.11-rc3-SHA-256.txt.= asc +<= td>cmake-2.8.11-rc3-win32-x86.ex= e + +2013-04-18 17:32 +=   + +cmake-2.8.11-rc4-AIX-powerpc.s= h + + += += + += 39M + + +cmake-2.8.11-rc4-IRIX64-64.sh + + +cmake-2.8.11-rc4-IRIX64-n32.sh<= /a> + + +cmake-2.8.11-rc4-Linux-i386.sh<= /a> + + +cmake-2.8.11-rc4-SHA-256.txt<= /td> +cmake-2.8.11-rc4-SHA-256.txt.= asc +<= td>cmake-2.8.11-rc4-win32-x86.ex= e + +2013-05-08 09:53 +=   + +<= td>cmake-2.8.11-win32-x86.exe<= td>  + +cmake-2.8.11.1-AIX-powerpc.sh + + += + + 42M += += + +cmake-2.8.11.1-IRIX64-64.sh<= td>  + + +cmake-2.8.11.1-IRIX64-n32.sh<= /td> + + +cmake-2.8.11.1-Linux-i386.sh<= /td> + + +cmake-2.8.11.1-SHA-256.txt=   +cmake-2.8.11.1-SHA-256.txt.asc<= /a> +<= td>cmake-2.8.11.1-win32-x86.exe + + + + +cmake-2.8.11.2-AIX-powerpc.sh + + += + + 42M += += + +cmake-2.8.11.2-IRIX64-64.sh<= td>  + + +cmake-2.8.11.2-IRIX64-n32.sh<= /td> + + +cmake-2.8.11.2-Linux-i386.sh<= /td> + + +cmake-2.8.11.2-SHA-256.txt=   +cmake-2.8.11.2-SHA-256.txt.asc<= /a> +<= td>cmake-2.8.11.2-win32-x86.exe + + + + + + + +cmake-2.8.12-AIX-powerpc.sh<= td>  + + += + + += + + 40M +cmake-2.8.12-IRIX64-64.sh2013-10-07 14:33 + + +cmake-2.8.12-IRIX64-n32.sh=   + + +cmake-2.8.12-Linux-i386.sh=   + + +cmake-2.8.12-SHA-256.txt +cmake-2.8.12-SHA-256.txt.asc<= /td> +cmake-2.8.12-rc1-AIX-powerpc.s= h + + += += + += 40M + + +cmake-2.8.12-rc1-IRIX64-64.sh + + +cmake-2.8.12-rc1-IRIX64-n32.sh<= /a> + + +cmake-2.8.12-rc1-Linux-i386.sh<= /a> + + +cmake-2.8.12-rc1-SHA-256.txt<= /td> +cmake-2.8.12-rc1-SHA-256.txt.= asc +<= td>cmake-2.8.12-rc1-win32-x86.ex= e + +2013-08-19 08:52 +=   + +cmake-2.8.12-rc2-AIX-powerpc.s= h + + += += + += 40M + + + + +cmake-2.8.12-rc2-IRIX64-n32.sh<= /a> + + +cmake-2.8.12-rc2-Linux-i386.sh<= /a> + + +cmake-2.8.12-rc2-SHA-256.txt<= /td> +cmake-2.8.12-rc2-SHA-256.txt.= asc +<= td>cmake-2.8.12-rc2-win32-x86.ex= e + +2013-08-30 15:58 +=   + +cmake-2.8.12-rc3-AIX-powerpc.s= h + + += += + += 41M + + +cmake-2.8.12-rc3-Linux-i386.sh<= /a> + + +cmake-2.8.12-rc3-SHA-256.txt<= /td> +cmake-2.8.12-rc3-SHA-256.txt.= asc +<= td>cmake-2.8.12-rc3-win32-x86.ex= e + +2013-09-10 15:38 +=   + +cmake-2.8.12-rc4-AIX-powerpc.s= h + + += += + += 40M + + +cmake-2.8.12-rc4-IRIX64-64.sh + + +cmake-2.8.12-rc4-IRIX64-n32.sh<= /a> + + +cmake-2.8.12-rc4-Linux-i386.sh<= /a> + + +cmake-2.8.12-rc4-SHA-256.txt<= /td> +cmake-2.8.12-rc4-SHA-256.txt.= asc +<= td>cmake-2.8.12-rc4-win32-x86.ex= e + +2013-10-01 16:22 +=   + +<= td>cmake-2.8.12-win32-x86.exe<= td>  + +cmake-2.8.12.1-AIX-powerpc.sh + + += + + 43M += += + +cmake-2.8.12.1-IRIX64-64.sh<= td>  + + +cmake-2.8.12.1-IRIX64-n32.sh<= /td> + + +cmake-2.8.12.1-Linux-i386.sh<= /td> + + +cmake-2.8.12.1-SHA-256.txt=   +cmake-2.8.12.1-SHA-256.txt.asc<= /a> +<= td>cmake-2.8.12.1-win32-x86.exe + + + + +cmake-2.8.12.2-AIX-powerpc.sh + + += + + 43M += += + +cmake-2.8.12.2-IRIX64-64.sh<= td>  + + +cmake-2.8.12.2-IRIX64-n32.sh<= /td> + + +cmake-2.8.12.2-Linux-i386.sh<= /td> + + +cmake-2.8.12.2-SHA-256.txt=   +cmake-2.8.12.2-SHA-256.txt.asc<= /a> +<= td>cmake-2.8.12.2-win32-x86.exe + + + + + + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[-*2012-06-07 12:08  
3D"[CMakeChangeLog-2.8.02009-11-13 15:41 13K 
3D"[CMakeChangeLog-2.8.12010-03-17 14:37 17K 
3D"[CMakeChangeLog-2.8.22010-06-28 14:37 23K 
3D"[CMakeChangeLog-2.8.32010-11-03 17:21 41K 
3D"[CMakeChangeLog-2.8.42011-02-16 09:15 61K 
3D"[CMakeChangeLog-2.8.52011-07-08 10:49 81K 
3D"[CMakeChangeLog-2.8.62011-12-30 15:30 100K 
3D"[CMakeChangeLog-2.8.72011-12-30 15:31 115K 
3D"[CMakeChangeLog-2.8.82012-04-18 17:47 144K 
3D"[CMakeChangeLog-2.8.92012-08-09 16:29 163K 
3D"[CMakeChangeLog-2.8.102012-10-31 15:09 185K =
3D"[CMakeChangeLog-2.8.10.1186K&n= bsp;
3D"[CMakeChangeLog-2.8.10.2186K&n= bsp;
3D"[CMakeChangeLog-2.8.112013-05-16 09:39 218K =
3D"[CMakeChangeLog-2.8.122013-10-11 08:57 247K =
3D"[CMakeChangeLog-2.8.12.1248K&n= bsp;
3D"[CMakeVS10FindMake.cmake1.2K&n= bsp;
3D"[TXT]"2010-02-08 10:44 17M
3D"[cmake-2.8.0-AIX-powerpc.ta= r.Z2010-02-08 10:44 = 24M 
3D"[cmake-2.8.0-AIX-powerpc.t= ar.gz2010-02-08 10:44 17M 
3D"[cmake-2.8.0-Darwin-univers= al.dmg2009-11-13 15:32 24M 
3D"[cmake-2.8.0-Darwin-un= iversal.tar.Z2009-11-13 15:32 35M 
3D"[cmake-2.8.0-Darwin-u= niversal.tar.gz2009-11-13 15:33 24M 
3D"[TXT]"2009-11-13 15:32 14M 
3D"[cmake-2.8.0-HP-UX-9000_= 785.tar.Z2009-11-13 15:32 19M 
3D"[cmake-2.8.0-HP-UX-9000= _785.tar.gz2009-11-13 15:32 14M 
3D"[TXT]"2009-11-13 15:32 9.0M&nb= sp;
3D"[cmake-2.8.0-IRIX64-64.tar.Z<= /a>2009-11-13 15:32 13M=  
3D"[cmake-2.8.0-IRIX64-64.tar.g= z2009-11-13 15:32 9.= 0M 
3D"[TXT]"8.8M&= nbsp;
3D"[cmake-2.8.0-IRIX64-n32.tar.= Z2009-11-13 15:32 1= 3M 
3D"[cmake-2.8.0-IRIX64-n32.tar= .gz2009-11-13 15:32 = 8.8M 
3D"[TXT]" 15M&= nbsp;
3D"[cmake-2.8.0-Linux-i386.tar.= Z2009-11-13 15:32 2= 1M 
3D"[cmake-2.8.0-Linux-i386.tar= .gz2009-11-13 15:32 = 15M 
3D"[TXT]"2009-11-13 15:32 10M
3D"[cmake-2.8.0-SunOS-sparc.ta= r.Z2009-11-13 15:32 = 14M 
3D"[cmake-2.8.0-SunOS-sparc.t= ar.gz2009-11-13 15:32 10M 
3D"[2009-11-13 15:32 7.4M
3D"[cmake-2.8.0-win32-x86.zip<= /td>2009-11-13 15:32 9.3M 
3D"[cmake-2.8.0.tar.Z2009-11-13 15:32 5.4M 
3D"[cmake-2.8.0.tar.gz2009-11-13 15:32 3.4M 
3D"[cmake-2.8.0.zip2009-11-13 15:32 4.6M 
3D"[TXT]"2010-04-06 14:37 17M
3D"[cmake-2.8.1-AIX-powerpc.ta= r.Z2010-04-06 14:37 = 24M 
3D"[cmake-2.8.1-AIX-powerpc.t= ar.gz2010-04-06 14:37 17M 
3D"[cmake-2.8.1-Darwin-univers= al.dmg2010-04-06 14:37 26M 
3D"[cmake-2.8.1-Darwin-un= iversal.tar.Z2010-04-06 14:37 37M 
3D"[cmake-2.8.1-Darwin-u= niversal.tar.gz2010-04-06 14:37 26M 
3D"[TXT]"2010-04-06 14:37 14M 
3D"[cmake-2.8.1-HP-UX-9000_= 785.tar.Z2010-04-06 14:37 19M 
3D"[cmake-2.8.1-HP-UX-9000= _785.tar.gz2010-04-06 14:37 14M 
3D"[TXT]"2010-04-06 14:37 9.1M&nb= sp;
3D"[cmake-2.8.1-IRIX64-64.tar.Z<= /a>2010-04-06 14:37 13M=  
3D"[cmake-2.8.1-IRIX64-64.tar.g= z2010-04-06 14:37 9.= 1M 
3D"[TXT]"8.8M&= nbsp;
3D"[cmake-2.8.1-IRIX64-n32.tar.= Z2010-04-06 14:37 1= 3M 
3D"[cmake-2.8.1-IRIX64-n32.tar= .gz2010-04-06 14:37 = 8.8M 
3D"[TXT]" 15M&= nbsp;
3D"[cmake-2.8.1-Linux-i386.tar.= Z2010-04-06 14:37 2= 1M 
3D"[cmake-2.8.1-Linux-i386.tar= .gz2010-04-06 14:37 = 15M 
3D"[TXT]"2010-04-06 14:37 10M
3D"[cmake-2.8.1-SunOS-sparc.ta= r.Z2010-04-06 14:37 = 14M 
3D"[cmake-2.8.1-SunOS-sparc.t= ar.gz2010-04-06 14:37 10M 
3D"[2010-04-06 14:37 7.5M
3D"[cmake-2.8.1-win32-x86.zip<= /td>2010-04-06 14:37 9.5M 
3D"[cmake-2.8.1.tar.Z2010-04-06 14:37 5.5M 
3D"[cmake-2.8.1.tar.gz2010-04-06 14:37 3.4M 
3D"[cmake-2.8.1.zip2010-04-06 14:37 4.6M 
3D"[TXT]"2010-06-28 14:10 17M
3D"[cmake-2.8.2-AIX-powerpc.ta= r.Z2010-06-28 14:09 = 24M 
3D"[cmake-2.8.2-AIX-powerpc.t= ar.gz2010-06-28 14:09 17M 
3D"[cmake-2.8.2-Darwin-univers= al.dmg2010-06-28 14:10 27M 
3D"[cmake-2.8.2-Darwin-un= iversal.tar.Z2010-06-28 14:10 39M 
3D"[cmake-2.8.2-Darwin-u= niversal.tar.gz2010-06-28 14:09 27M 
3D"[TXT]"2010-06-28 14:09 15M 
3D"[cmake-2.8.2-HP-UX-9000_= 785.tar.Z2010-06-28 14:10 20M 
3D"[cmake-2.8.2-HP-UX-9000= _785.tar.gz2010-06-28 14:10 15M 
3D"[TXT]"2010-06-28 14:10 9.6M&nb= sp;
3D"[cmake-2.8.2-IRIX64-64.tar.Z<= /a>2010-06-28 14:09 14M=  
3D"[cmake-2.8.2-IRIX64-64.tar.g= z2010-06-28 14:10 9.= 6M 
3D"[TXT]"9.4M&= nbsp;
3D"[cmake-2.8.2-IRIX64-n32.tar.= Z2010-06-28 14:09 1= 4M 
3D"[cmake-2.8.2-IRIX64-n32.tar= .gz2010-06-28 14:10 = 9.3M 
3D"[TXT]" 15M&= nbsp;
3D"[cmake-2.8.2-Linux-i386.tar.= Z2010-06-28 14:09 2= 1M 
3D"[cmake-2.8.2-Linux-i386.tar= .gz2010-06-28 14:10 = 15M 
3D"[TXT]"2010-06-28 14:09 10M
3D"[cmake-2.8.2-SunOS-sparc.ta= r.Z2010-06-28 14:10 = 14M 
3D"[cmake-2.8.2-SunOS-sparc.t= ar.gz2010-06-28 14:10 10M 
3D"[2010-06-28 14:09 7.7M
3D"[cmake-2.8.2-win32-x86.zip<= /td>2010-06-28 14:09 9.7M 
3D"[cmake-2.8.2.tar.Z2010-06-28 14:10 8.1M 
3D"[cmake-2.8.2.tar.gz2010-06-28 14:09 5.1M 
3D"[cmake-2.8.2.zip2010-06-28 14:10 6.8M 
3D"[TXT]"2010-11-03 17:11 17M
3D"[cmake-2.8.3-AIX-powerpc.ta= r.Z2010-11-03 17:11 = 24M 
3D"[cmake-2.8.3-AIX-powerpc.t= ar.gz2010-11-03 17:10 17M 
3D"[cmake-2.8.3-Darwin-univers= al.dmg2010-11-03 17:11 27M 
3D"[cmake-2.8.3-Darwin-un= iversal.tar.Z2010-11-03 17:11 39M 
3D"[cmake-2.8.3-Darwin-u= niversal.tar.gz2010-11-03 17:11 27M 
3D"[TXT]"2010-11-03 17:11 9.8M&nb= sp;
3D"[cmake-2.8.3-IRIX64-64.tar.Z<= /a>2010-11-03 17:11 14M=  
3D"[cmake-2.8.3-IRIX64-64.tar.g= z2010-11-03 17:11 9.= 8M 
3D"[TXT]"9.5M&= nbsp;
3D"[cmake-2.8.3-IRIX64-n32.tar.= Z2010-11-03 17:11 1= 4M 
3D"[cmake-2.8.3-IRIX64-n32.tar= .gz2010-11-03 17:10 = 9.5M 
3D"[TXT]" 16M&= nbsp;
3D"[cmake-2.8.3-Linux-i386.tar.= Z2010-11-03 17:11 2= 2M 
3D"[cmake-2.8.3-Linux-i386.tar= .gz2010-11-03 17:10 = 16M 
3D"[TXT]"2010-11-03 17:10 11M
3D"[cmake-2.8.3-SunOS-sparc.ta= r.Z2010-11-03 17:11 = 15M 
3D"[cmake-2.8.3-SunOS-sparc.t= ar.gz2010-11-03 17:11 11M 
3D"[2010-11-03 17:11 7.9M
3D"[cmake-2.8.3-win32-x86.zip<= /td>2010-11-03 17:11 9.9M 
3D"[cmake-2.8.3.tar.Z2010-11-03 17:11 8.1M 
3D"[cmake-2.8.3.tar.gz2010-11-03 17:11 5.2M 
3D"[cmake-2.8.3.zip2010-11-03 17:11 6.9M 
3D"[TXT]"2011-02-15 15:54 17M
3D"[cmake-2.8.4-AIX-powerpc.ta= r.Z2011-02-15 15:54 = 24M 
3D"[cmake-2.8.4-AIX-powerpc.t= ar.gz2011-02-15 15:53 17M 
3D"[cmake-2.8.4-Darwin-univers= al.dmg2011-02-15 15:53 28M 
3D"[cmake-2.8.4-Darwin-un= iversal.tar.Z2011-02-15 15:54 39M 
3D"[cmake-2.8.4-Darwin-u= niversal.tar.gz2011-02-15 15:54 27M 
3D"[TXT]"2011-02-15 15:53 9.9M&nb= sp;
3D"[cmake-2.8.4-IRIX64-64.tar.Z<= /a>2011-02-15 15:54 15M=  
3D"[cmake-2.8.4-IRIX64-64.tar.g= z2011-02-15 15:54 9.= 9M 
3D"[TXT]"9.7M&= nbsp;
3D"[cmake-2.8.4-IRIX64-n32.tar.= Z2011-02-15 15:55 1= 4M 
3D"[cmake-2.8.4-IRIX64-n32.tar= .gz2011-02-15 15:54 = 9.7M 
3D"[TXT]" 16M&= nbsp;
3D"[cmake-2.8.4-Linux-i386.tar.= Z2011-02-15 15:54 2= 2M 
3D"[cmake-2.8.4-Linux-i386.tar= .gz2011-02-15 15:54 = 16M 
3D"[TXT]"2011-02-15 15:54 11M
3D"[cmake-2.8.4-SunOS-sparc.ta= r.Z2011-02-15 15:54 = 15M 
3D"[cmake-2.8.4-SunOS-sparc.t= ar.gz2011-02-15 15:54 11M 
3D"[2011-02-15 15:54 7.9M
3D"[cmake-2.8.4-win32-x86.zip<= /td>2011-02-15 15:54 10M 
3D"[cmake-2.8.4.tar.Z2011-02-15 15:54 8.3M 
3D"[cmake-2.8.4.tar.gz2011-02-15 15:54 5.2M 
3D"[cmake-2.8.4.zip2011-02-15 15:54 7.0M 
3D"[cmake-2.8.5-1-src.tar.bz22011-07-08 10:34 4.1M
3D"[cmake-2.8.5-1.tar.bz22011-07-08 10:34 6.3M =
3D"[TXT]"2011-07-08 10:34 17M
3D"[cmake-2.8.5-AIX-powerpc.ta= r.Z2011-07-08 10:34 = 24M 
3D"[cmake-2.8.5-AIX-powerpc.t= ar.gz2011-07-08 10:34 17M 
3D"[cmake-2.8.5-Darwin-univers= al.dmg2011-07-08 10:34 28M 
3D"[cmake-2.8.5-Darwin-un= iversal.tar.Z2011-07-08 10:34 40M 
3D"[cmake-2.8.5-Darwin-u= niversal.tar.gz2011-07-08 10:34 28M 
3D"[TXT]"2011-07-08 10:34 10M&nb= sp;
3D"[cmake-2.8.5-IRIX64-64.tar.Z<= /a>2011-07-08 10:34 15M=  
3D"[cmake-2.8.5-IRIX64-64.tar.g= z2011-07-08 10:34 1= 0M 
3D"[TXT]"9.8M&= nbsp;
3D"[cmake-2.8.5-IRIX64-n32.tar.= Z2011-07-08 10:34 1= 5M 
3D"[cmake-2.8.5-IRIX64-n32.tar= .gz2011-07-08 10:34 = 9.8M 
3D"[TXT]" 16M&= nbsp;
3D"[cmake-2.8.5-Linux-i386.tar.= Z2011-07-08 10:34 2= 2M 
3D"[cmake-2.8.5-Linux-i386.tar= .gz2011-07-08 10:34 = 16M 
3D"[TXT]"2011-07-08 10:34 11M
3D"[cmake-2.8.5-SunOS-sparc.ta= r.Z2011-07-08 10:34 = 15M 
3D"[cmake-2.8.5-SunOS-sparc.t= ar.gz2011-07-08 10:34 11M 
3D"[2011-07-08 10:34 8.0M
3D"[cmake-2.8.5-win32-x86.zip<= /td>2011-07-08 10:34 10M 
3D"[cmake-2.8.5.tar.Z2011-07-08 10:34 8.3M 
3D"[cmake-2.8.5.tar.gz2011-07-08 10:34 5.3M 
3D"[cmake-2.8.5.zip2011-07-08 10:34 7.0M 
3D"[cmake-2.8.6-1-src.tar.bz22011-10-04 13:59 4.1M
3D"[cmake-2.8.6-1.tar.bz22011-10-04 13:59 6.4M =
3D"[TXT]"2011-10-04 13:59 17M
3D"[cmake-2.8.6-AIX-powerpc.ta= r.Z2011-10-04 13:59 = 25M 
3D"[cmake-2.8.6-AIX-powerpc.t= ar.gz2011-10-04 13:59 17M 
3D"[cmake-2.8.6-Darwin-univers= al.dmg2011-10-04 13:59 28M 
3D"[cmake-2.8.6-Darwin-un= iversal.tar.Z2011-10-04 13:59 40M 
3D"[cmake-2.8.6-Darwin-u= niversal.tar.gz2011-10-04 13:59 28M 
3D"[cmake-2.8.6-Darwin64-uni= versal.dmg2011-10-04 13:59 29M 
3D"[cmake-2.8.6-Darwin6= 4-universal.tar.Z2011-10-04 13:59 41M 
3D"[cmake-2.8.6-Darwin= 64-universal.tar.gz2011-10-04 13:59 29M 
3D"[TXT]"2011-10-04 13:59 10M&nb= sp;
3D"[cmake-2.8.6-IRIX64-64.tar.Z<= /a>2011-10-04 13:59 15M=  
3D"[cmake-2.8.6-IRIX64-64.tar.g= z2011-10-04 13:59 1= 0M 
3D"[TXT]" 10M&= nbsp;
3D"[cmake-2.8.6-IRIX64-n32.tar.= Z2011-10-04 13:59 1= 5M 
3D"[cmake-2.8.6-IRIX64-n32.tar= .gz2011-10-04 13:59 = 10M 
3D"[TXT]" 16M&= nbsp;
3D"[cmake-2.8.6-Linux-i386.tar.= Z2011-10-04 13:59 2= 3M 
3D"[cmake-2.8.6-Linux-i386.tar= .gz2011-10-04 13:58 = 16M 
3D"[2011-10-04 13:58 8.2M
3D"[cmake-2.8.6-win32-x86.zip<= /td>2011-10-04 13:58 10M 
3D"[cmake-2.8.6.tar.Z2011-10-04 13:58 8.4M 
3D"[cmake-2.8.6.tar.gz2011-10-04 13:58 5.3M 
3D"[cmake-2.8.6.zip2011-10-04 13:58 7.1M 
3D"[cmake-2.8.7-1-src.tar.bz22011-12-30 14:14 4.2M
3D"[cmake-2.8.7-1.tar.bz22011-12-30 14:14 6.5M =
3D"[TXT]"2012-01-03 16:51 17M
3D"[cmake-2.8.7-AIX-powerpc.ta= r.Z2012-01-03 16:51 = 25M 
3D"[cmake-2.8.7-AIX-powerpc.t= ar.gz2012-01-03 16:51 17M 
3D"[cmake-2.8.7-Darwin-univers= al.dmg2011-12-30 14:14 29M 
3D"[cmake-2.8.7-Darwin-un= iversal.tar.Z2011-12-30 14:14 41M 
3D"[cmake-2.8.7-Darwin-u= niversal.tar.gz2011-12-30 14:14 28M 
3D"[cmake-2.8.7-Darwin64-uni= versal.dmg2011-12-30 14:14 30M 
3D"[cmake-2.8.7-Darwin6= 4-universal.tar.Z2011-12-30 14:13 42M 
3D"[cmake-2.8.7-Darwin= 64-universal.tar.gz2011-12-30 14:13 30M 
3D"[TXT]"2011-12-30 14:13 10M&nb= sp;
3D"[cmake-2.8.7-IRIX64-64.tar.Z<= /a>2011-12-30 14:13 15M=  
3D"[cmake-2.8.7-IRIX64-64.tar.g= z2011-12-30 14:13 1= 0M 
3D"[TXT]" 10M&= nbsp;
3D"[cmake-2.8.7-IRIX64-n32.tar.= Z2011-12-30 14:13 1= 5M 
3D"[cmake-2.8.7-IRIX64-n32.tar= .gz2011-12-30 14:13 = 10M 
3D"[TXT]" 16M&= nbsp;
3D"[cmake-2.8.7-Linux-i386.tar.= Z2011-12-30 14:13 2= 3M 
3D"[cmake-2.8.7-Linux-i386.tar= .gz2011-12-30 14:13 = 16M 
3D"[2011-12-30 14:13 8.2M
3D"[cmake-2.8.7-win32-x86.zip<= /td>2011-12-30 14:13 10M 
3D"[cmake-2.8.7.tar.Z2011-12-30 14:13 8.5M 
3D"[cmake-2.8.7.tar.gz2011-12-30 14:13 5.4M 
3D"[cmake-2.8.7.zip2011-12-30 14:13 7.2M 
3D"[TXT]"2012-04-18 15:23 19M
3D"[cmake-2.8.8-AIX-powerpc.ta= r.Z2012-04-18 15:23 = 27M 
3D"[cmake-2.8.8-AIX-powerpc.t= ar.gz2012-04-18 15:23 19M 
3D"[cmake-2.8.8-Darwin-univers= al.dmg2012-04-18 15:23 34M 
3D"[cmake-2.8.8-Darwin-un= iversal.tar.Z2012-04-18 15:23 49M 
3D"[cmake-2.8.8-Darwin-u= niversal.tar.gz2012-04-18 15:23 34M 
3D"[cmake-2.8.8-Darwin64-uni= versal.dmg2012-04-18 15:22 32M 
3D"[cmake-2.8.8-Darwin6= 4-universal.tar.Z2012-04-18 15:22 44M 
3D"[cmake-2.8.8-Darwin= 64-universal.tar.gz2012-04-18 15:22 32M 
3D"[TXT]"2012-04-18 15:22 12M&nb= sp;
3D"[cmake-2.8.8-IRIX64-64.tar.Z<= /a>2012-04-18 15:22 17M=  
3D"[cmake-2.8.8-IRIX64-64.tar.g= z2012-04-18 15:22 1= 2M 
3D"[TXT]" 11M&= nbsp;
3D"[cmake-2.8.8-IRIX64-n32.tar.= Z2012-04-18 15:22 1= 7M 
3D"[cmake-2.8.8-IRIX64-n32.tar= .gz2012-04-18 15:22 = 11M 
3D"[TXT]" 18M&= nbsp;
3D"[cmake-2.8.8-Linux-i386.tar.= Z2012-04-18 15:22 2= 6M 
3D"[cmake-2.8.8-Linux-i386.tar= .gz2012-04-18 15:22 = 18M 
3D"[TXT]"2016-04-13 12:48 2.1K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2012-04-18 15:22 8.7M
3D"[cmake-2.8.8-win32-x86.zip<= /td>2012-04-18 15:22 11M 
3D"[cmake-2.8.8.tar.Z2012-04-18 15:22 8.5M 
3D"[cmake-2.8.8.tar.gz2012-04-18 15:22 5.4M 
3D"[cmake-2.8.8.zip2012-04-18 15:22 7.2M 
3D"[TXT]"2012-08-09 15:36 19M
3D"[cmake-2.8.9-AIX-powerpc.ta= r.Z2012-08-09 15:36 = 27M 
3D"[cmake-2.8.9-AIX-powerpc.t= ar.gz2012-08-09 15:36 19M 
3D"[cmake-2.8.9-Darwin-univers= al.dmg2012-08-09 15:36 35M 
3D"[cmake-2.8.9-Darwin-un= iversal.tar.Z2012-08-09 15:36 50M 
3D"[cmake-2.8.9-Darwin-u= niversal.tar.gz2012-08-09 15:36 35M 
3D"[cmake-2.8.9-Darwin64-uni= versal.dmg2012-08-09 15:36 33M 
3D"[cmake-2.8.9-Darwin6= 4-universal.tar.Z2012-08-09 15:35 45M 
3D"[cmake-2.8.9-Darwin= 64-universal.tar.gz2012-08-09 15:35 32M 
3D"[TXT]"2012-08-09 15:35 12M&nb= sp;
3D"[cmake-2.8.9-IRIX64-64.tar.Z<= /a>2012-08-09 15:35 17M=  
3D"[cmake-2.8.9-IRIX64-64.tar.g= z2012-08-09 15:35 1= 2M 
3D"[TXT]" 12M&= nbsp;
3D"[cmake-2.8.9-IRIX64-n32.tar.= Z2012-08-09 15:35 1= 7M 
3D"[cmake-2.8.9-IRIX64-n32.tar= .gz2012-08-09 15:35 = 12M 
3D"[TXT]" 19M&= nbsp;
3D"[cmake-2.8.9-Linux-i386.tar.= Z2012-08-09 15:35 2= 6M 
3D"[cmake-2.8.9-Linux-i386.tar= .gz2012-08-09 15:35 = 19M 
3D"[TXT]"2016-04-13 12:48 2.1K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2012-08-09 15:35 8.9M
3D"[cmake-2.8.9-win32-x86.zip<= /td>2012-08-09 15:35 11M 
3D"[cmake-2.8.9.tar.Z2012-08-09 15:35 8.5M 
3D"[cmake-2.8.9.tar.gz2012-08-09 15:35 5.4M 
3D"[cmake-2.8.9.zip2012-08-09 15:35 7.2M 
3D"[TXT]"2012-10-31 13:05 20M
3D"[cmake-2.8.10-AIX-powerpc.= tar.Z2012-10-31 13:05 28M 
3D"[cmake-2.8.10-AIX-powerpc= .tar.gz2012-10-31 13:05 20M 
3D"[cmake-2.8.10-Darwin-unive= rsal.dmg2012-10-31 13:04 41M 
3D"[cmake-2.8.10-Darwin-= universal.tar.Z2012-10-31 13:04 58M 
3D"[cmake-2.8.10-Darwin= -universal.tar.gz2012-10-31 13:04 41M 
3D"[cmake-2.8.10-Darwin64-u= niversal.dmg2012-10-31 13:04 38M 
3D"[cmake-2.8.10-Darwi= n64-universal.tar.Z2012-10-31 13:04 53M 
3D"[cmake-2.8.10-Darw= in64-universal.tar.gz2012-10-31 13:04  
3D"[TXT]" 12M&= nbsp;
3D"[cmake-2.8.10-IRIX64-64.tar.= Z2012-10-31 13:04 1= 8M 
3D"[cmake-2.8.10-IRIX64-64.tar= .gz2012-10-31 13:04 = 12M 
3D"[TXT]"2012-10-31 13:04 12M
3D"[cmake-2.8.10-IRIX64-n32.ta= r.Z2012-10-31 13:04 = 17M 
3D"[cmake-2.8.10-IRIX64-n32.t= ar.gz2012-10-31 13:04 12M 
3D"[TXT]"2012-10-31 13:04 22M
3D"[cmake-2.8.10-Linux-i386.ta= r.Z2012-10-31 13:04 = 30M 
3D"[cmake-2.8.10-Linux-i386.t= ar.gz2012-10-31 13:04 22M 
3D"[TXT]"2016-04-13 12:48 2.1K&nb= sp;
3D"[TXT]"2016-04-13 12:48 819  
3D"[TXT]"2012-10-02 13:28 2= 0M 
3D"[cmake-2.8.10-rc1-AIX-= powerpc.tar.Z2012-10-02 13:28 28M 
3D"[cmake-2.8.10-rc1-AIX= -powerpc.tar.gz2012-10-02 13:28 20M 
3D"[cmake-2.8.10-rc1-Darw= in-universal.dmg2012-10-02 13:28 41M 
3D"[cmake-2.8.10-rc1= -Darwin-universal.tar.Z2012-10-02 13:28 58M 
3D"[cmake-2.8.10-rc= 1-Darwin-universal.tar.gz2012-10-02 13:28 40M 
3D"[cmake-2.8.10-rc1-Da= rwin64-universal.dmg2012-10-02 13:28  
3D"[cmake-2.8.10-r= c1-Darwin64-universal.tar.Z2012-10-02 13:28 <= /td> 53M 
3D"[cmake-2.8.10-= rc1-Darwin64-universal.tar.gz2012-10-02 13:28 = 38M 
3D"[TXT]"2012-10-02 13:27 12M 
3D"[cmake-2.8.10-rc1-IRIX64= -64.tar.Z2012-10-02 13:27 18M 
3D"[cmake-2.8.10-rc1-IRIX6= 4-64.tar.gz2012-10-02 13:27 12M 
3D"[TXT]"2012-10-02 13:27 12M=  
3D"[cmake-2.8.10-rc1-IRIX6= 4-n32.tar.Z2012-10-02 13:27 17M 
3D"[cmake-2.8.10-rc1-IRIX= 64-n32.tar.gz2012-10-02 13:27 12M 
3D"[TXT]"2012-10-02 13:27 22M=  
3D"[cmake-2.8.10-rc1-Linux= -i386.tar.Z2012-10-02 13:27 30M 
3D"[cmake-2.8.10-rc1-Linu= x-i386.tar.gz2012-10-02 13:27 22M 
3D"[TXT]"2016-04-13 12:48 2.2K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2012-10-02 13:27 9.= 6M 
3D"[cmake-2.8.10-rc1-win32-x8= 6.zip2012-10-02 13:27 12M 
3D"[cmake-2.8.10-rc1.tar.Z8.6M&= nbsp;
3D"[cmake-2.8.10-rc1.tar.gz2012-10-02 13:27 5.5M
3D"[cmake-2.8.10-rc1.zip2012-10-02 13:27 7.4M = ;
3D"[TXT]"2012-10-19 09:26 2= 0M 
3D"[cmake-2.8.10-rc2-AIX-= powerpc.tar.Z2012-10-19 09:26 28M 
3D"[cmake-2.8.10-rc2-AIX= -powerpc.tar.gz2012-10-19 09:26 20M 
3D"[cmake-2.8.10-rc2-Darw= in-universal.dmg2012-10-19 09:26 41M 
3D"[cmake-2.8.10-rc2= -Darwin-universal.tar.Z2012-10-19 09:26 58M 
3D"[cmake-2.8.10-rc= 2-Darwin-universal.tar.gz2012-10-19 09:26 41M 
3D"[cmake-2.8.10-rc2-Da= rwin64-universal.dmg2012-10-19 09:25  
3D"[cmake-2.8.10-r= c2-Darwin64-universal.tar.Z2012-10-19 09:25 <= /td> 53M 
3D"[cmake-2.8.10-= rc2-Darwin64-universal.tar.gz2012-10-19 09:25 = 38M 
3D"[TXT]"2012-10-19 09:25 12M 
3D"[cmake-2.8.10-rc2-IRIX64= -64.tar.Z2012-10-19 09:25 18M 
3D"[cmake-2.8.10-rc2-IRIX6= 4-64.tar.gz2012-10-19 09:25 12M 
3D"[TXT]"2012-10-19 09:25 12M=  
3D"[cmake-2.8.10-rc2-IRIX6= 4-n32.tar.Z2012-10-19 09:25 17M 
3D"[cmake-2.8.10-rc2-IRIX= 64-n32.tar.gz2012-10-19 09:25 12M 
3D"[TXT]"2012-10-19 09:25 22M=  
3D"[cmake-2.8.10-rc2-Linux= -i386.tar.Z2012-10-19 09:24 30M 
3D"[cmake-2.8.10-rc2-Linu= x-i386.tar.gz2012-10-19 09:24 22M 
3D"[TXT]"2016-04-13 12:48 2.2K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2012-10-19 09:24 9.= 6M 
3D"[cmake-2.8.10-rc2-win32-x8= 6.zip2012-10-19 09:24 12M 
3D"[cmake-2.8.10-rc2.tar.Z8.6M&= nbsp;
3D"[cmake-2.8.10-rc2.tar.gz2012-10-19 09:24 5.5M
3D"[cmake-2.8.10-rc2.zip2012-10-19 09:24 7.4M = ;
3D"[TXT]"2012-10-24 15:11 2= 0M 
3D"[cmake-2.8.10-rc3-AIX-= powerpc.tar.Z2012-10-24 15:11 28M 
3D"[cmake-2.8.10-rc3-AIX= -powerpc.tar.gz2012-10-24 15:10 20M 
3D"[cmake-2.8.10-rc3-Darw= in-universal.dmg2012-10-24 15:10 41M 
3D"[cmake-2.8.10-rc3= -Darwin-universal.tar.Z2012-10-24 15:10 58M 
3D"[cmake-2.8.10-rc= 3-Darwin-universal.tar.gz2012-10-24 15:10 41M 
3D"[cmake-2.8.10-rc3-Da= rwin64-universal.dmg2012-10-24 15:10  
3D"[cmake-2.8.10-r= c3-Darwin64-universal.tar.Z2012-10-24 15:10 <= /td> 53M 
3D"[cmake-2.8.10-= rc3-Darwin64-universal.tar.gz2012-10-24 15:10 = 38M 
3D"[TXT]"2012-10-24 15:10 12M 
3D"[cmake-2.8.10-rc3-IRIX64= -64.tar.Z2012-10-24 15:10 18M 
3D"[cmake-2.8.10-rc3-IRIX6= 4-64.tar.gz2012-10-24 15:10 12M 
3D"[TXT]"2012-10-24 15:10 12M=  
3D"[cmake-2.8.10-rc3-IRIX6= 4-n32.tar.Z2012-10-24 15:10 17M 
3D"[cmake-2.8.10-rc3-IRIX= 64-n32.tar.gz2012-10-24 15:10 12M 
3D"[TXT]"2012-10-24 15:10 22M=  
3D"[cmake-2.8.10-rc3-Linux= -i386.tar.Z2012-10-24 15:10 30M 
3D"[cmake-2.8.10-rc3-Linu= x-i386.tar.gz2012-10-24 15:10 22M 
3D"[TXT]"2016-04-13 12:48 2.2K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2012-10-24 15:10 9.= 6M 
3D"[cmake-2.8.10-rc3-win32-x8= 6.zip2012-10-24 15:09 12M 
3D"[cmake-2.8.10-rc3.tar.Z8.7M&= nbsp;
3D"[cmake-2.8.10-rc3.tar.gz2012-10-24 15:09 5.5M
3D"[cmake-2.8.10-rc3.zip2012-10-24 15:09 7.4M = ;
3D"[2012-10-31 13:04 9.6M
3D"[cmake-2.8.10-win32-x86.zip2012-10-31 13:04 12M 
3D"[TXT]"2012-11-07 11:48 20M 
3D"[cmake-2.8.10.1-AIX-powe= rpc.tar.Z2012-11-07 11:48 28M 
3D"[cmake-2.8.10.1-AIX-pow= erpc.tar.gz2012-11-07 11:48 20M 
3D"[cmake-2.8.10.1-Darwin-u= niversal.dmg2012-11-07 11:48 41M 
3D"[cmake-2.8.10.1-Dar= win-universal.tar.Z2012-11-07 11:48 58M 
3D"[cmake-2.8.10.1-Da= rwin-universal.tar.gz2012-11-07 11:48  
3D"[cmake-2.8.10.1-Darwin= 64-universal.dmg2012-11-07 11:48 38M 
3D"[cmake-2.8.10.1-D= arwin64-universal.tar.Z2012-11-07 11:48 53M 
3D"[cmake-2.8.10.1-= Darwin64-universal.tar.gz2012-11-07 11:48 38M 
3D"[TXT]"2012-11-07 11:48 12M
3D"[cmake-2.8.10.1-IRIX64-64.= tar.Z2012-11-07 11:48 18M 
3D"[cmake-2.8.10.1-IRIX64-64= .tar.gz2012-11-07 11:48 12M 
3D"[TXT]"2012-11-07 11:47 12M 
3D"[cmake-2.8.10.1-IRIX64-n3= 2.tar.Z2012-11-07 11:47 17M 
3D"[cmake-2.8.10.1-IRIX64-n= 32.tar.gz2012-11-07 11:47 12M 
3D"[TXT]"2012-11-07 11:47 22M 
3D"[cmake-2.8.10.1-Linux-i38= 6.tar.Z2012-11-07 11:47 30M 
3D"[cmake-2.8.10.1-Linux-i3= 86.tar.gz2012-11-07 11:47 22M 
3D"[TXT]"2016-04-13 12:48 2.2K
3D"[TXT]"2016-04-13 12:48 819 =  
3D"[2012-11-07 11:47 9.6M 
3D"[cmake-2.8.10.1-win32-x86.zi= p2012-11-07 11:47 1= 2M 
3D"[cmake-2.8.10.1.tar.Z2012-11-07 11:47 8.6M = ;
3D"[cmake-2.8.10.1.tar.gz2012-11-07 11:47 5.5M&nb= sp;
3D"[cmake-2.8.10.1.zip2012-11-07 11:47 7.4M 
3D"[TXT]"2012-11-27 15:05 20M 
3D"[cmake-2.8.10.2-AIX-powe= rpc.tar.Z2012-11-27 15:05 28M 
3D"[cmake-2.8.10.2-AIX-pow= erpc.tar.gz2012-11-27 15:04 20M 
3D"[cmake-2.8.10.2-Darwin-u= niversal.dmg2012-11-27 15:04 41M 
3D"[cmake-2.8.10.2-Dar= win-universal.tar.Z2012-11-27 15:04 58M 
3D"[cmake-2.8.10.2-Da= rwin-universal.tar.gz2012-11-27 15:04  
3D"[cmake-2.8.10.2-Darwin= 64-universal.dmg2012-11-27 15:04 38M 
3D"[cmake-2.8.10.2-D= arwin64-universal.tar.Z2012-11-27 15:04 53M 
3D"[cmake-2.8.10.2-= Darwin64-universal.tar.gz2012-11-27 15:04 38M 
3D"[TXT]"2012-11-27 15:04 12M
3D"[cmake-2.8.10.2-IRIX64-64.= tar.Z2012-11-27 15:04 18M 
3D"[cmake-2.8.10.2-IRIX64-64= .tar.gz2012-11-27 15:04 12M 
3D"[TXT]"2012-11-27 15:04 12M 
3D"[cmake-2.8.10.2-IRIX64-n3= 2.tar.Z2012-11-27 15:04 17M 
3D"[cmake-2.8.10.2-IRIX64-n= 32.tar.gz2012-11-27 15:04 12M 
3D"[TXT]"2012-11-27 15:04 22M 
3D"[cmake-2.8.10.2-Linux-i38= 6.tar.Z2012-11-27 15:04 30M 
3D"[cmake-2.8.10.2-Linux-i3= 86.tar.gz2012-11-27 15:04 22M 
3D"[TXT]"2016-04-13 12:48 2.2K
3D"[TXT]"2016-04-13 12:48 819 =  
3D"[2012-11-27 15:04 9.6M 
3D"[cmake-2.8.10.2-win32-x86.zi= p2012-11-27 15:03 1= 2M 
3D"[cmake-2.8.10.2.tar.Z2012-11-27 15:03 8.7M = ;
3D"[cmake-2.8.10.2.tar.gz2012-11-27 15:03 5.5M&nb= sp;
3D"[cmake-2.8.10.2.zip2012-11-27 15:03 7.4M 
3D"[cmake-2.8.10.tar.Z2012-10-31 13:03 8.7M 
3D"[cmake-2.8.10.tar.gz2012-10-31 13:03 5.5M <= /td>
3D"[cmake-2.8.10.zip2012-10-31 13:03 7.4M 
3D"[TXT]"2013-06-07 14:42 21M
3D"[cmake-2.8.11-AIX-powerpc.= tar.Z2013-06-07 14:42 30M 
3D"[cmake-2.8.11-AIX-powerpc= .tar.gz2013-06-07 14:42 21M 
3D"[cmake-2.8.11-Darwin-unive= rsal.dmg2013-05-15 15:54 42M 
3D"[cmake-2.8.11-Darwin-= universal.tar.Z2013-05-15 15:54 59M 
3D"[cmake-2.8.11-Darwin= -universal.tar.gz2013-05-15 15:54 42M 
3D"[cmake-2.8.11-Darwin64-u= niversal.dmg2013-05-15 15:54 39M 
3D"[cmake-2.8.11-Darwi= n64-universal.tar.Z2013-05-15 15:54 55M 
3D"[cmake-2.8.11-Darw= in64-universal.tar.gz2013-05-15 15:54  
3D"[TXT]" 13M&= nbsp;
3D"[cmake-2.8.11-IRIX64-64.tar.= Z2013-05-15 15:53 1= 9M 
3D"[cmake-2.8.11-IRIX64-64.tar= .gz2013-05-15 15:53 = 13M 
3D"[TXT]"2013-05-15 15:53 12M
3D"[cmake-2.8.11-IRIX64-n32.ta= r.Z2013-05-15 15:53 = 18M 
3D"[cmake-2.8.11-IRIX64-n32.t= ar.gz2013-05-15 15:53 12M 
3D"[TXT]"2013-05-15 15:53 23M
3D"[cmake-2.8.11-Linux-i386.ta= r.Z2013-05-15 15:53 = 31M 
3D"[cmake-2.8.11-Linux-i386.t= ar.gz2013-05-15 15:53 23M 
3D"[TXT]"2016-04-13 12:48 2.4K&nb= sp;
3D"[TXT]"2016-04-13 12:48 819  
3D"[TXT]"2013-03-14 17:16 2= 1M 
3D"[cmake-2.8.11-rc1-AIX-= powerpc.tar.Z2013-03-14 17:16 30M 
3D"[cmake-2.8.11-rc1-AIX= -powerpc.tar.gz2013-03-14 17:16 21M 
3D"[cmake-2.8.11-rc1-Darw= in-universal.dmg2013-03-14 17:16 42M 
3D"[cmake-2.8.11-rc1= -Darwin-universal.tar.Z2013-03-14 17:16 59M 
3D"[cmake-2.8.11-rc= 1-Darwin-universal.tar.gz2013-03-14 17:16 41M 
3D"[cmake-2.8.11-rc1-Da= rwin64-universal.dmg2013-03-14 17:15  
3D"[cmake-2.8.11-r= c1-Darwin64-universal.tar.Z2013-03-14 17:15 <= /td> 55M 
3D"[cmake-2.8.11-= rc1-Darwin64-universal.tar.gz2013-03-14 17:15 = 39M 
3D"[TXT]"2013-03-14 17:15 13M 
3D"[cmake-2.8.11-rc1-IRIX64= -64.tar.Z2013-03-14 17:15 19M 
3D"[cmake-2.8.11-rc1-IRIX6= 4-64.tar.gz2013-03-14 17:15 13M 
3D"[TXT]"2013-03-14 17:15 12M=  
3D"[cmake-2.8.11-rc1-IRIX6= 4-n32.tar.Z2013-03-14 17:15 18M 
3D"[cmake-2.8.11-rc1-IRIX= 64-n32.tar.gz2013-03-14 17:15 12M 
3D"[TXT]"2013-03-14 17:15 23M=  
3D"[cmake-2.8.11-rc1-Linux= -i386.tar.Z2013-03-14 17:15 31M 
3D"[cmake-2.8.11-rc1-Linu= x-i386.tar.gz2013-03-14 17:15 23M 
3D"[TXT]"2016-04-13 12:48 2.2K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2013-03-14 17:15 9.= 9M 
3D"[cmake-2.8.11-rc1-win32-x8= 6.zip2013-03-14 17:14 12M 
3D"[cmake-2.8.11-rc1.tar.Z8.8M&= nbsp;
3D"[cmake-2.8.11-rc1.tar.gz2013-03-14 17:14 5.6M
3D"[cmake-2.8.11-rc1.zip2013-03-14 17:14 7.6M = ;
3D"[TXT]"2013-04-05 18:01 2= 1M 
3D"[cmake-2.8.11-rc2-AIX-= powerpc.tar.Z2013-04-05 18:01 30M 
3D"[cmake-2.8.11-rc2-AIX= -powerpc.tar.gz2013-04-05 18:01 21M 
3D"[cmake-2.8.11-rc2-Darw= in-universal.dmg2013-04-05 18:01 42M 
3D"[cmake-2.8.11-rc2= -Darwin-universal.tar.Z2013-04-05 18:01 59M 
3D"[cmake-2.8.11-rc= 2-Darwin-universal.tar.gz2013-04-05 18:01 42M 
3D"[cmake-2.8.11-rc2-Da= rwin64-universal.dmg2013-04-05 18:01  
3D"[cmake-2.8.11-r= c2-Darwin64-universal.tar.Z2013-04-05 18:01 <= /td> 55M 
3D"[cmake-2.8.11-= rc2-Darwin64-universal.tar.gz2013-04-05 18:01 = 39M 
3D"[TXT]"2013-04-05 18:01 13M 
3D"[cmake-2.8.11-rc2-IRIX64= -64.tar.Z2013-04-05 18:01 19M 
3D"[cmake-2.8.11-rc2-IRIX6= 4-64.tar.gz2013-04-05 18:01 13M 
3D"[TXT]"2013-04-05 18:01 12M=  
3D"[cmake-2.8.11-rc2-IRIX6= 4-n32.tar.Z2013-04-05 18:01 18M 
3D"[cmake-2.8.11-rc2-IRIX= 64-n32.tar.gz2013-04-05 18:00 12M 
3D"[TXT]"2013-04-05 18:00 23M=  
3D"[cmake-2.8.11-rc2-Linux= -i386.tar.Z2013-04-05 18:00 31M 
3D"[cmake-2.8.11-rc2-Linu= x-i386.tar.gz2013-04-05 18:00 23M 
3D"[TXT]"2016-04-13 12:48 2.2K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2013-04-05 18:00 9.= 9M 
3D"[cmake-2.8.11-rc2-win32-x8= 6.zip2013-04-05 18:00 12M 
3D"[cmake-2.8.11-rc2.tar.Z8.8M&= nbsp;
3D"[cmake-2.8.11-rc2.tar.gz2013-04-05 18:00 5.6M
3D"[cmake-2.8.11-rc2.zip2013-04-05 18:00 7.6M = ;
3D"[TXT]"2013-04-18 17:33 2= 1M 
3D"[cmake-2.8.11-rc3-AIX-= powerpc.tar.Z2013-04-18 17:33 30M 
3D"[cmake-2.8.11-rc3-AIX= -powerpc.tar.gz2013-04-18 17:33 21M 
3D"[cmake-2.8.11-rc3-Darw= in-universal.dmg2013-04-18 17:33 42M 
3D"[cmake-2.8.11-rc3= -Darwin-universal.tar.Z2013-04-18 17:33 59M 
3D"[cmake-2.8.11-rc= 3-Darwin-universal.tar.gz2013-04-18 17:33 42M 
3D"[cmake-2.8.11-rc3-Da= rwin64-universal.dmg2013-04-18 17:33  
3D"[cmake-2.8.11-r= c3-Darwin64-universal.tar.Z2013-04-18 17:33 <= /td> 55M 
3D"[cmake-2.8.11-= rc3-Darwin64-universal.tar.gz2013-04-18 17:33 = 39M 
3D"[TXT]"2013-04-18 17:33 13M 
3D"[cmake-2.8.11-rc3-IRIX64= -64.tar.Z2013-04-18 17:33 19M 
3D"[cmake-2.8.11-rc3-IRIX6= 4-64.tar.gz2013-04-18 17:33 13M 
3D"[TXT]"2013-04-18 17:33 12M=  
3D"[cmake-2.8.11-rc3-IRIX6= 4-n32.tar.Z2013-04-18 17:33 18M 
3D"[cmake-2.8.11-rc3-IRIX= 64-n32.tar.gz2013-04-18 17:33 12M 
3D"[TXT]"2013-04-18 17:32 23M=  
3D"[cmake-2.8.11-rc3-Linux= -i386.tar.Z2013-04-18 17:32 31M 
3D"[cmake-2.8.11-rc3-Linu= x-i386.tar.gz2013-04-18 17:32 23M 
3D"[TXT]"2016-04-13 12:48 2.2K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2013-04-18 17:32 9.= 9M 
3D"[cmake-2.8.11-rc3-win32-x8= 6.zip2013-04-18 17:32 12M 
3D"[cmake-2.8.11-rc3.tar.Z8.8M&= nbsp;
3D"[cmake-2.8.11-rc3.tar.gz2013-04-18 17:32 5.6M
3D"[cmake-2.8.11-rc3.zip2013-04-18 17:32 7.6M = ;
3D"[TXT]"2013-05-08 09:54 2= 1M 
3D"[cmake-2.8.11-rc4-AIX-= powerpc.tar.Z2013-05-08 09:54 30M 
3D"[cmake-2.8.11-rc4-AIX= -powerpc.tar.gz2013-05-08 09:54 21M 
3D"[cmake-2.8.11-rc4-Darw= in-universal.dmg2013-05-08 09:54 42M 
3D"[cmake-2.8.11-rc4= -Darwin-universal.tar.Z2013-05-08 09:54 59M 
3D"[cmake-2.8.11-rc= 4-Darwin-universal.tar.gz2013-05-08 09:54 42M 
3D"[cmake-2.8.11-rc4-Da= rwin64-universal.dmg2013-05-08 09:54  
3D"[cmake-2.8.11-r= c4-Darwin64-universal.tar.Z2013-05-08 09:54 <= /td> 55M 
3D"[cmake-2.8.11-= rc4-Darwin64-universal.tar.gz2013-05-08 09:54 = 39M 
3D"[TXT]"2013-05-08 09:54 13M 
3D"[cmake-2.8.11-rc4-IRIX64= -64.tar.Z2013-05-08 09:54 19M 
3D"[cmake-2.8.11-rc4-IRIX6= 4-64.tar.gz2013-05-08 09:53 13M 
3D"[TXT]"2013-05-08 09:53 12M=  
3D"[cmake-2.8.11-rc4-IRIX6= 4-n32.tar.Z2013-05-08 09:53 18M 
3D"[cmake-2.8.11-rc4-IRIX= 64-n32.tar.gz2013-05-08 09:53 12M 
3D"[TXT]"2013-05-08 09:53 23M=  
3D"[cmake-2.8.11-rc4-Linux= -i386.tar.Z2013-05-08 09:53 31M 
3D"[cmake-2.8.11-rc4-Linu= x-i386.tar.gz2013-05-08 09:53 23M 
3D"[TXT]"2016-04-13 12:48 2.2K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2013-05-08 09:53 9.= 9M 
3D"[cmake-2.8.11-rc4-win32-x8= 6.zip2013-05-08 09:53 12M 
3D"[cmake-2.8.11-rc4.tar.Z8.9M&= nbsp;
3D"[cmake-2.8.11-rc4.tar.gz2013-05-08 09:53 5.6M
3D"[cmake-2.8.11-rc4.zip2013-05-08 09:53 7.6M = ;
3D"[2013-05-15 15:53 9.9M
3D"[cmake-2.8.11-win32-x86.zip2013-05-15 15:53 12M 
3D"[TXT]"2013-06-07 14:41 21M 
3D"[cmake-2.8.11.1-AIX-powe= rpc.tar.Z2013-06-07 14:41 30M 
3D"[cmake-2.8.11.1-AIX-pow= erpc.tar.gz2013-06-07 14:41 21M 
3D"[cmake-2.8.11.1-Darwin-u= niversal.dmg2013-06-07 14:41 42M 
3D"[cmake-2.8.11.1-Dar= win-universal.tar.Z2013-06-07 14:41 59M 
3D"[cmake-2.8.11.1-Da= rwin-universal.tar.gz2013-06-07 14:41  
3D"[cmake-2.8.11.1-Darwin= 64-universal.dmg2013-06-07 14:41 39M 
3D"[cmake-2.8.11.1-D= arwin64-universal.tar.Z2013-06-07 14:41 55M 
3D"[cmake-2.8.11.1-= Darwin64-universal.tar.gz2013-06-07 14:41 39M 
3D"[TXT]"2013-06-07 14:41 13M
3D"[cmake-2.8.11.1-IRIX64-64.= tar.Z2013-06-07 14:41 19M 
3D"[cmake-2.8.11.1-IRIX64-64= .tar.gz2013-06-07 14:41 13M 
3D"[TXT]"2013-06-07 14:41 12M 
3D"[cmake-2.8.11.1-IRIX64-n3= 2.tar.Z2013-06-07 14:41 18M 
3D"[cmake-2.8.11.1-IRIX64-n= 32.tar.gz2013-06-07 14:41 12M 
3D"[TXT]"2013-06-07 14:41 23M 
3D"[cmake-2.8.11.1-Linux-i38= 6.tar.Z2013-06-07 14:40 31M 
3D"[cmake-2.8.11.1-Linux-i3= 86.tar.gz2013-06-07 14:40 23M 
3D"[TXT]"2016-04-13 12:48 2.2K
3D"[TXT]"2016-04-13 12:48 819 =  
3D"[2013-06-07 14:40 9.9M 
3D"[cmake-2.8.11.1-win32-x86.zi= p2013-06-07 14:40 1= 2M 
3D"[cmake-2.8.11.1.tar.Z2013-06-07 14:40 8.9M = ;
3D"[cmake-2.8.11.1.tar.gz2013-06-07 14:40 5.6M&nb= sp;
3D"[cmake-2.8.11.1.zip2013-06-07 14:40 7.6M 
3D"[TXT]"2013-07-03 11:53 21M 
3D"[cmake-2.8.11.2-AIX-powe= rpc.tar.Z2013-07-03 11:53 30M 
3D"[cmake-2.8.11.2-AIX-pow= erpc.tar.gz2013-07-03 11:53 21M 
3D"[cmake-2.8.11.2-Darwin-u= niversal.dmg2013-07-03 11:53 42M 
3D"[cmake-2.8.11.2-Dar= win-universal.tar.Z2013-07-03 11:53 59M 
3D"[cmake-2.8.11.2-Da= rwin-universal.tar.gz2013-07-03 11:53  
3D"[cmake-2.8.11.2-Darwin= 64-universal.dmg2013-07-03 11:53 39M 
3D"[cmake-2.8.11.2-D= arwin64-universal.tar.Z2013-07-03 11:53 55M 
3D"[cmake-2.8.11.2-= Darwin64-universal.tar.gz2013-07-03 11:53 39M 
3D"[TXT]"2013-07-03 11:53 13M
3D"[cmake-2.8.11.2-IRIX64-64.= tar.Z2013-07-03 11:53 19M 
3D"[cmake-2.8.11.2-IRIX64-64= .tar.gz2013-07-03 11:52 13M 
3D"[TXT]"2013-07-03 11:52 12M 
3D"[cmake-2.8.11.2-IRIX64-n3= 2.tar.Z2013-07-03 11:52 18M 
3D"[cmake-2.8.11.2-IRIX64-n= 32.tar.gz2013-07-03 11:52 12M 
3D"[TXT]"2013-07-03 11:52 23M 
3D"[cmake-2.8.11.2-Linux-i38= 6.tar.Z2013-07-03 11:52 31M 
3D"[cmake-2.8.11.2-Linux-i3= 86.tar.gz2013-07-03 11:52 23M 
3D"[TXT]"2016-04-13 12:48 2.2K
3D"[TXT]"2016-04-13 12:48 819 =  
3D"[2013-07-03 11:52 9.9M 
3D"[cmake-2.8.11.2-win32-x86.zi= p2013-07-03 11:52 1= 2M 
3D"[cmake-2.8.11.2.tar.Z2013-07-03 11:52 8.9M = ;
3D"[cmake-2.8.11.2.tar.gz2013-07-03 11:52 5.6M&nb= sp;
3D"[cmake-2.8.11.2.zip2013-07-03 11:52 7.6M 
3D"[cmake-2.8.11.tar.Z2013-05-15 15:53 8.9M 
3D"[cmake-2.8.11.tar.gz2013-05-15 15:53 5.6M <= /td>
3D"[cmake-2.8.11.zip2013-05-15 15:53 7.6M 
3D"[TXT]"2013-10-07 14:34 22M
3D"[cmake-2.8.12-AIX-powerpc.= tar.Z2013-10-07 14:34 32M 
3D"[cmake-2.8.12-AIX-powerpc= .tar.gz2013-10-07 14:34 22M 
3D"[cmake-2.8.12-Darwin-unive= rsal.dmg2013-10-07 14:34 43M 
3D"[cmake-2.8.12-Darwin-= universal.tar.Z2013-10-07 14:33 61M 
3D"[cmake-2.8.12-Darwin= -universal.tar.gz2013-10-07 14:33 43M 
3D"[cmake-2.8.12-Darwin64-u= niversal.dmg2013-10-07 14:33 41M 
3D"[cmake-2.8.12-Darwi= n64-universal.tar.Z2013-10-07 14:33 57M 
3D"[cmake-2.8.12-Darw= in64-universal.tar.gz2013-10-07 14:33  
3D"[TXT]" 13M&= nbsp;
3D"[cmake-2.8.12-IRIX64-64.tar.= Z2013-10-07 14:33 2= 0M 
3D"[cmake-2.8.12-IRIX64-64.tar= .gz2013-10-07 14:33 = 13M 
3D"[TXT]"2013-10-07 14:33 13M
3D"[cmake-2.8.12-IRIX64-n32.ta= r.Z2013-10-07 14:33 = 19M 
3D"[cmake-2.8.12-IRIX64-n32.t= ar.gz2013-10-07 14:33 13M 
3D"[TXT]"2013-10-07 14:33 24M
3D"[cmake-2.8.12-Linux-i386.ta= r.Z2013-10-07 14:33 = 33M 
3D"[cmake-2.8.12-Linux-i386.t= ar.gz2013-10-07 14:33 24M 
3D"[TXT]"2016-04-13 12:48 2.1K&nb= sp;
3D"[TXT]"2016-04-13 12:48 819  
3D"[TXT]"2013-08-19 08:54 2= 2M 
3D"[cmake-2.8.12-rc1-AIX-= powerpc.tar.Z2013-08-19 08:54 32M 
3D"[cmake-2.8.12-rc1-AIX= -powerpc.tar.gz2013-08-19 08:54 22M 
3D"[cmake-2.8.12-rc1-Darw= in-universal.dmg2013-08-19 08:54 43M 
3D"[cmake-2.8.12-rc1= -Darwin-universal.tar.Z2013-08-19 08:53 61M 
3D"[cmake-2.8.12-rc= 1-Darwin-universal.tar.gz2013-08-19 08:53 43M 
3D"[cmake-2.8.12-rc1-Da= rwin64-universal.dmg2013-08-19 08:53  
3D"[cmake-2.8.12-r= c1-Darwin64-universal.tar.Z2013-08-19 08:53 <= /td> 57M 
3D"[cmake-2.8.12-= rc1-Darwin64-universal.tar.gz2013-08-19 08:53 = 40M 
3D"[TXT]"2013-08-19 08:53 13M 
3D"[cmake-2.8.12-rc1-IRIX64= -64.tar.Z2013-08-19 08:53 20M 
3D"[cmake-2.8.12-rc1-IRIX6= 4-64.tar.gz2013-08-19 08:53 13M 
3D"[TXT]"2013-08-19 08:53 13M=  
3D"[cmake-2.8.12-rc1-IRIX6= 4-n32.tar.Z2013-08-19 08:53 19M 
3D"[cmake-2.8.12-rc1-IRIX= 64-n32.tar.gz2013-08-19 08:53 13M 
3D"[TXT]"2013-08-19 08:52 24M=  
3D"[cmake-2.8.12-rc1-Linux= -i386.tar.Z2013-08-19 08:52 33M 
3D"[cmake-2.8.12-rc1-Linu= x-i386.tar.gz2013-08-19 08:52 24M 
3D"[TXT]"2016-04-13 12:48 2.2K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2013-08-19 08:52 1= 0M 
3D"[cmake-2.8.12-rc1-win32-x8= 6.zip2013-08-19 08:52 13M 
3D"[cmake-2.8.12-rc1.tar.Z9.1M&= nbsp;
3D"[cmake-2.8.12-rc1.tar.gz2013-08-19 08:52 5.8M
3D"[cmake-2.8.12-rc1.zip2013-08-19 08:52 8.0M = ;
3D"[TXT]"2013-08-30 15:59 2= 2M 
3D"[cmake-2.8.12-rc2-AIX-= powerpc.tar.Z2013-08-30 15:59 32M 
3D"[cmake-2.8.12-rc2-AIX= -powerpc.tar.gz2013-08-30 15:59 22M 
3D"[cmake-2.8.12-rc2-Darw= in-universal.dmg2013-08-30 15:59 43M 
3D"[cmake-2.8.12-rc2= -Darwin-universal.tar.Z2013-08-30 15:59 61M 
3D"[cmake-2.8.12-rc= 2-Darwin-universal.tar.gz2013-08-30 15:59 43M 
3D"[cmake-2.8.12-rc2-Da= rwin64-universal.dmg2013-08-30 15:59  
3D"[cmake-2.8.12-r= c2-Darwin64-universal.tar.Z2013-08-30 15:59 <= /td> 57M 
3D"[cmake-2.8.12-= rc2-Darwin64-universal.tar.gz2013-08-30 15:58 = 40M 
3D"[cmake-2.8.12-rc2-IRIX64= -64.tar.Z2013-08-30 15:58 20M 
3D"[cmake-2.8.12-rc2-IRIX6= 4-64.tar.gz2013-08-30 15:58 13M 
3D"[TXT]"2013-08-30 15:58 13M=  
3D"[cmake-2.8.12-rc2-IRIX6= 4-n32.tar.Z2013-08-30 15:58 19M 
3D"[cmake-2.8.12-rc2-IRIX= 64-n32.tar.gz2013-08-30 15:58 13M 
3D"[TXT]"2013-08-30 15:58 24M=  
3D"[cmake-2.8.12-rc2-Linux= -i386.tar.Z2013-08-30 15:58 33M 
3D"[cmake-2.8.12-rc2-Linu= x-i386.tar.gz2013-08-30 15:58 24M 
3D"[TXT]"2016-04-13 12:48 2.1K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2013-08-30 15:58 1= 0M 
3D"[cmake-2.8.12-rc2-win32-x8= 6.zip2013-08-30 15:58 13M 
3D"[cmake-2.8.12-rc2.tar.Z9.2M&= nbsp;
3D"[cmake-2.8.12-rc2.tar.gz2013-08-30 15:58 5.8M
3D"[cmake-2.8.12-rc2.zip2013-08-30 15:58 8.0M = ;
3D"[TXT]"2013-09-10 15:39 2= 2M 
3D"[cmake-2.8.12-rc3-AIX-= powerpc.tar.Z2013-09-10 15:39 32M 
3D"[cmake-2.8.12-rc3-AIX= -powerpc.tar.gz2013-09-10 15:39 22M 
3D"[cmake-2.8.12-rc3-Darw= in-universal.dmg2013-09-10 15:39 43M 
3D"[cmake-2.8.12-rc3= -Darwin-universal.tar.Z2013-09-10 15:39 61M 
3D"[cmake-2.8.12-rc= 3-Darwin-universal.tar.gz2013-09-10 15:39 43M 
3D"[cmake-2.8.12-rc3-Da= rwin64-universal.dmg2013-09-10 15:39  
3D"[cmake-2.8.12-r= c3-Darwin64-universal.tar.Z2013-09-10 15:39 <= /td> 57M 
3D"[cmake-2.8.12-= rc3-Darwin64-universal.tar.gz2013-09-10 15:39 = 40M 
3D"[TXT]"2013-09-10 15:39 24M=  
3D"[cmake-2.8.12-rc3-Linux= -i386.tar.Z2013-09-10 15:39 33M 
3D"[cmake-2.8.12-rc3-Linu= x-i386.tar.gz2013-09-10 15:39 24M 
3D"[TXT]"2016-04-13 12:48 1.7K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2013-09-10 15:39 1= 0M 
3D"[cmake-2.8.12-rc3-win32-x8= 6.zip2013-09-10 15:38 13M 
3D"[cmake-2.8.12-rc3.tar.Z9.1M&= nbsp;
3D"[cmake-2.8.12-rc3.tar.gz2013-09-10 15:38 5.8M
3D"[cmake-2.8.12-rc3.zip2013-09-10 15:38 8.0M = ;
3D"[TXT]"2013-10-01 16:23 2= 2M 
3D"[cmake-2.8.12-rc4-AIX-= powerpc.tar.Z2013-10-01 16:23 32M 
3D"[cmake-2.8.12-rc4-AIX= -powerpc.tar.gz2013-10-01 16:23 22M 
3D"[cmake-2.8.12-rc4-Darw= in-universal.dmg2013-10-01 16:23 43M 
3D"[cmake-2.8.12-rc4= -Darwin-universal.tar.Z2013-10-01 16:23 61M 
3D"[cmake-2.8.12-rc= 4-Darwin-universal.tar.gz2013-10-01 16:23 43M 
3D"[cmake-2.8.12-rc4-Da= rwin64-universal.dmg2013-10-01 16:23  
3D"[cmake-2.8.12-r= c4-Darwin64-universal.tar.Z2013-10-01 16:23 <= /td> 57M 
3D"[cmake-2.8.12-= rc4-Darwin64-universal.tar.gz2013-10-01 16:23 = 40M 
3D"[TXT]"2013-10-01 16:23 13M 
3D"[cmake-2.8.12-rc4-IRIX64= -64.tar.Z2013-10-01 16:23 20M 
3D"[cmake-2.8.12-rc4-IRIX6= 4-64.tar.gz2013-10-01 16:23 13M 
3D"[TXT]"2013-10-01 16:23 13M=  
3D"[cmake-2.8.12-rc4-IRIX6= 4-n32.tar.Z2013-10-01 16:23 19M 
3D"[cmake-2.8.12-rc4-IRIX= 64-n32.tar.gz2013-10-01 16:23 13M 
3D"[TXT]"2013-10-01 16:23 24M=  
3D"[cmake-2.8.12-rc4-Linux= -i386.tar.Z2013-10-01 16:23 33M 
3D"[cmake-2.8.12-rc4-Linu= x-i386.tar.gz2013-10-01 16:23 24M 
3D"[TXT]"2016-04-13 12:48 2.2K 
3D"[TXT]"2016-04-13 12:48 = 819  
3D"[2013-10-01 16:22 1= 0M 
3D"[cmake-2.8.12-rc4-win32-x8= 6.zip2013-10-01 16:22 13M 
3D"[cmake-2.8.12-rc4.tar.Z9.1M&= nbsp;
3D"[cmake-2.8.12-rc4.tar.gz2013-10-01 16:22 5.8M
3D"[cmake-2.8.12-rc4.zip2013-10-01 16:22 8.0M = ;
3D"[2013-10-07 14:33 10M
3D"[cmake-2.8.12-win32-x86.zip2013-10-07 14:33 13M 
3D"[TXT]"2013-11-06 10:48 22M 
3D"[cmake-2.8.12.1-AIX-powe= rpc.tar.Z2013-11-06 10:47 32M 
3D"[cmake-2.8.12.1-AIX-pow= erpc.tar.gz2013-11-06 10:47 22M 
3D"[cmake-2.8.12.1-Darwin-u= niversal.dmg2013-11-06 10:47 43M 
3D"[cmake-2.8.12.1-Dar= win-universal.tar.Z2013-11-06 10:47 61M 
3D"[cmake-2.8.12.1-Da= rwin-universal.tar.gz2013-11-06 10:47  
3D"[cmake-2.8.12.1-Darwin= 64-universal.dmg2013-11-06 10:47 41M 
3D"[cmake-2.8.12.1-D= arwin64-universal.tar.Z2013-11-06 10:46 57M 
3D"[cmake-2.8.12.1-= Darwin64-universal.tar.gz2013-11-06 10:46 41M 
3D"[TXT]"2013-11-06 10:46 13M
3D"[cmake-2.8.12.1-IRIX64-64.= tar.Z2013-11-06 10:46 20M 
3D"[cmake-2.8.12.1-IRIX64-64= .tar.gz2013-11-06 10:46 13M 
3D"[TXT]"2013-11-06 10:46 13M 
3D"[cmake-2.8.12.1-IRIX64-n3= 2.tar.Z2013-11-06 10:46 19M 
3D"[cmake-2.8.12.1-IRIX64-n= 32.tar.gz2013-11-06 10:46 13M 
3D"[TXT]"2013-11-06 10:46 24M 
3D"[cmake-2.8.12.1-Linux-i38= 6.tar.Z2013-11-06 10:46 33M 
3D"[cmake-2.8.12.1-Linux-i3= 86.tar.gz2013-11-06 10:46 24M 
3D"[TXT]"2016-04-13 12:48 2.2K
3D"[TXT]"2016-04-13 12:48 819 =  
3D"[2013-11-06 10:46 10M 
3D"[cmake-2.8.12.1-win32-x86.zi= p2013-11-06 10:46 1= 3M 
3D"[cmake-2.8.12.1.tar.Z2013-11-06 10:45 9.1M = ;
3D"[cmake-2.8.12.1.tar.gz2013-11-06 10:45 5.8M&nb= sp;
3D"[cmake-2.8.12.1.zip2013-11-06 10:45 8.0M 
3D"[TXT]"2014-01-16 14:49 22M 
3D"[cmake-2.8.12.2-AIX-powe= rpc.tar.Z2014-01-16 14:49 32M 
3D"[cmake-2.8.12.2-AIX-pow= erpc.tar.gz2014-01-16 14:49 22M 
3D"[cmake-2.8.12.2-Darwin-u= niversal.dmg2014-01-16 14:48 43M 
3D"[cmake-2.8.12.2-Dar= win-universal.tar.Z2014-01-16 14:48 61M 
3D"[cmake-2.8.12.2-Da= rwin-universal.tar.gz2014-01-16 14:48  
3D"[cmake-2.8.12.2-Darwin= 64-universal.dmg2014-01-16 14:48 41M 
3D"[cmake-2.8.12.2-D= arwin64-universal.tar.Z2014-01-16 14:48 57M 
3D"[cmake-2.8.12.2-= Darwin64-universal.tar.gz2014-01-16 14:48 41M 
3D"[TXT]"2014-01-16 14:48 13M
3D"[cmake-2.8.12.2-IRIX64-64.= tar.Z2014-01-16 14:48 20M 
3D"[cmake-2.8.12.2-IRIX64-64= .tar.gz2014-01-16 14:48 13M 
3D"[TXT]"2014-01-16 14:48 13M 
3D"[cmake-2.8.12.2-IRIX64-n3= 2.tar.Z2014-01-16 14:48 19M 
3D"[cmake-2.8.12.2-IRIX64-n= 32.tar.gz2014-01-16 14:48 13M 
3D"[TXT]"2014-01-16 14:48 24M 
3D"[cmake-2.8.12.2-Linux-i38= 6.tar.Z2014-01-16 14:48 33M 
3D"[cmake-2.8.12.2-Linux-i3= 86.tar.gz2014-01-16 14:48 24M 
3D"[TXT]"2016-04-13 12:48 2.2K
3D"[TXT]"2016-04-13 12:48 819 =  
3D"[2014-01-16 14:48 10M 
3D"[cmake-2.8.12.2-win32-x86.zi= p2014-01-16 14:48 1= 3M 
3D"[cmake-2.8.12.2.tar.Z2014-01-16 14:48 9.2M = ;
3D"[cmake-2.8.12.2.tar.gz2014-01-16 14:48 5.8M&nb= sp;
3D"[cmake-2.8.12.2.zip2014-01-16 14:48 8.0M 
3D"[cmake-2.8.12.tar.Z2013-10-07 14:32 9.2M 
3D"[cmake-2.8.12.tar.gz2013-10-07 14:32 5.8M <= /td>
3D"[cmake-2.8.12.zip2013-10-07 14:32 8.0M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.0/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.0/index.html new file mode 100644 index 0000000..2583dcd --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.0/index.html @@ -0,0 +1,209 @@ + + + + Index of /files/v3.0 + + +

Index of /files/v3.0

+ + + + +=   += += + + += + + +cmake-3.0.0-Linux-i386.sh2014-06-10 13:27 + + +cmake-3.0.0-SHA-256.txt +cmake-3.0.0-SHA-256.txt.asc<= td>  += +=   +cmake-3.0.0-rc1-AIX-powerpc.sh<= /a> + + += + 58M += += + + +cmake-3.0.0-rc1-IRIX64-64.sh<= /td> + + +cmake-3.0.0-rc1-IRIX64-n32.sh + + +cmake-3.0.0-rc1-Linux-i386.sh + + +cmake-3.0.0-rc1-SHA-256.txt<= td>  +cmake-3.0.0-rc1-SHA-256.txt.as= c +<= td>cmake-3.0.0-rc1-win32-x86.exe<= /a> + + +2014-02-28 13:53 + += +=   +cmake-3.0.0-rc2-AIX-powerpc.sh<= /a> + + += + 58M += += + + +cmake-3.0.0-rc2-IRIX64-64.sh<= /td> + + +cmake-3.0.0-rc2-IRIX64-n32.sh + + +cmake-3.0.0-rc2-Linux-i386.sh + + +cmake-3.0.0-rc2-SHA-256.txt<= td>  +cmake-3.0.0-rc2-SHA-256.txt.as= c +<= td>cmake-3.0.0-rc2-win32-x86.exe<= /a> + + +2014-03-19 10:27 + += +=   +cmake-3.0.0-rc3-AIX-powerpc.sh<= /a> + + += + 58M += += + + +cmake-3.0.0-rc3-IRIX64-64.sh<= /td> + + +cmake-3.0.0-rc3-IRIX64-n32.sh + + +cmake-3.0.0-rc3-SHA-256.txt<= td>  +cmake-3.0.0-rc3-SHA-256.txt.as= c +<= td>cmake-3.0.0-rc3-win32-x86.exe<= /a> + + +2014-03-26 12:59 + += +=   +cmake-3.0.0-rc4-AIX-powerpc.sh<= /a> + + += + 58M += += + + +cmake-3.0.0-rc4-IRIX64-64.sh<= /td> + + +cmake-3.0.0-rc4-IRIX64-n32.sh + + +cmake-3.0.0-rc4-Linux-i386.sh + + +cmake-3.0.0-rc4-SHA-256.txt<= td>  +cmake-3.0.0-rc4-SHA-256.txt.as= c +<= td>cmake-3.0.0-rc4-win32-x86.exe<= /a> + + +2014-04-18 09:51 + += +=   += + 58M += += + + +cmake-3.0.0-rc5-Linux-i386.sh + + +cmake-3.0.0-rc5-SHA-256.txt<= td>  +cmake-3.0.0-rc5-SHA-256.txt.as= c +<= td>cmake-3.0.0-rc5-win32-x86.exe<= /a> + + +2014-05-13 14:24 + += +=   += + 58M += += + + +cmake-3.0.0-rc6-Linux-i386.sh + + +cmake-3.0.0-rc6-SHA-256.txt<= td>  +cmake-3.0.0-rc6-SHA-256.txt.as= c +<= td>cmake-3.0.0-rc6-win32-x86.exe<= /a> + + +2014-05-22 14:56 + +<= td>cmake-3.0.0-win32-x86.exe=   + += + + +=   += += + + += + + +cmake-3.0.1-Linux-i386.sh2014-09-11 09:18 + + +cmake-3.0.1-SHA-256.txt +cmake-3.0.1-SHA-256.txt.asc<= td>  +<= td>cmake-3.0.1-win32-x86.exe=   + += + + +=   += += + + += + + +cmake-3.0.2-Linux-i386.sh2014-09-11 12:18 + + +cmake-3.0.2-SHA-256.txt +cmake-3.0.2-SHA-256.txt.asc<= td>  +<= td>cmake-3.0.2-win32-x86.exe=   + += + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.0.0-1-src.tar.bz22014-06-10 13:28 4.2M
3D"[cmake-3.0.0-1.tar.bz22014-06-10 13:28 8.0M =
3D"[cmake-3.0.0-Darwin-univers= al.dmg2014-06-10 13:28 41M 
3D"[cmake-3.0.0-Darwin-un= iversal.tar.Z2014-06-10 13:27 58M 
3D"[cmake-3.0.0-Darwin-u= niversal.tar.gz2014-06-10 13:27 41M 
3D"[cmake-3.0.0-Darwin64-uni= versal.dmg2014-06-10 13:27 39M 
3D"[cmake-3.0.0-Darwin6= 4-universal.tar.Z2014-06-10 13:27 54M 
3D"[cmake-3.0.0-Darwin= 64-universal.tar.gz2014-06-10 13:27 39M 
3D"[TXT]" 22M&= nbsp;
3D"[cmake-3.0.0-Linux-i386.tar.= Z2014-06-10 13:27 3= 1M 
3D"[cmake-3.0.0-Linux-i386.tar= .gz2014-06-10 13:27 = 22M 
3D"[TXT]"2016-04-13 12:48 1.3K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[cmake-3.0.0-rc1-1-src.tar.bz2= 2014-02-28 13:54 4.2= M 
3D"[cmake-3.0.0-rc1-1.tar.bz22014-02-28 13:54 8.0M
3D"[TXT]"2014-02-28 13:54 21M=  
3D"[cmake-3.0.0-rc1-AIX-po= werpc.tar.Z2014-02-28 13:54 31M 
3D"[cmake-3.0.0-rc1-AIX-p= owerpc.tar.gz2014-02-28 13:54 21M 
3D"[cmake-3.0.0-rc1-Darwin= -universal.dmg2014-02-28 13:54 41M 
3D"[cmake-3.0.0-rc1-D= arwin-universal.tar.Z2014-02-28 13:54  
3D"[cmake-3.0.0-rc1-= Darwin-universal.tar.gz2014-02-28 13:54 41M 
3D"[cmake-3.0.0-rc1-Darw= in64-universal.dmg2014-02-28 13:54 39M 
3D"[cmake-3.0.0-rc1= -Darwin64-universal.tar.Z2014-02-28 13:54 54M 
3D"[cmake-3.0.0-rc= 1-Darwin64-universal.tar.gz2014-02-28 13:54 <= /td> 39M 
3D"[TXT]"2014-02-28 13:54 13M 
3D"[cmake-3.0.0-rc1-IRIX64-6= 4.tar.Z2014-02-28 13:54 19M 
3D"[cmake-3.0.0-rc1-IRIX64-= 64.tar.gz2014-02-28 13:54 13M 
3D"[TXT]"2014-02-28 13:54 12M 
3D"[cmake-3.0.0-rc1-IRIX64-= n32.tar.Z2014-02-28 13:54 19M 
3D"[cmake-3.0.0-rc1-IRIX64= -n32.tar.gz2014-02-28 13:54 12M 
3D"[TXT]"2014-02-28 13:54 22M 
3D"[cmake-3.0.0-rc1-Linux-i= 386.tar.Z2014-02-28 13:54 31M 
3D"[cmake-3.0.0-rc1-Linux-= i386.tar.gz2014-02-28 13:53 22M 
3D"[TXT]"2016-04-13 12:48 2.2K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2014-02-28 13:53 11M=  
3D"[cmake-3.0.0-rc1-win32-x86.= zip2014-02-28 13:53 = 14M 
3D"[cmake-3.0.0-rc1.tar.Z2014-02-28 13:53 8.5M&nb= sp;
3D"[cmake-3.0.0-rc1.tar.gz5.2M&= nbsp;
3D"[cmake-3.0.0-rc1.zip2014-02-28 13:53 8.0M <= /td>
3D"[cmake-3.0.0-rc2-1-src.tar.bz2= 2014-03-19 10:29 4.2= M 
3D"[cmake-3.0.0-rc2-1.tar.bz22014-03-19 10:28 8.0M
3D"[TXT]"2014-03-19 10:28 21M=  
3D"[cmake-3.0.0-rc2-AIX-po= werpc.tar.Z2014-03-19 10:28 31M 
3D"[cmake-3.0.0-rc2-AIX-p= owerpc.tar.gz2014-03-19 10:28 21M 
3D"[cmake-3.0.0-rc2-Darwin= -universal.dmg2014-03-19 10:28 41M 
3D"[cmake-3.0.0-rc2-D= arwin-universal.tar.Z2014-03-19 10:28  
3D"[cmake-3.0.0-rc2-= Darwin-universal.tar.gz2014-03-19 10:28 41M 
3D"[cmake-3.0.0-rc2-Darw= in64-universal.dmg2014-03-19 10:28 39M 
3D"[cmake-3.0.0-rc2= -Darwin64-universal.tar.Z2014-03-19 10:28 54M 
3D"[cmake-3.0.0-rc= 2-Darwin64-universal.tar.gz2014-03-19 10:28 <= /td> 39M 
3D"[TXT]"2014-03-19 10:28 13M 
3D"[cmake-3.0.0-rc2-IRIX64-6= 4.tar.Z2014-03-19 10:28 19M 
3D"[cmake-3.0.0-rc2-IRIX64-= 64.tar.gz2014-03-19 10:28 13M 
3D"[TXT]"2014-03-19 10:28 12M 
3D"[cmake-3.0.0-rc2-IRIX64-= n32.tar.Z2014-03-19 10:28 19M 
3D"[cmake-3.0.0-rc2-IRIX64= -n32.tar.gz2014-03-19 10:28 12M 
3D"[TXT]"2014-03-19 10:28 22M 
3D"[cmake-3.0.0-rc2-Linux-i= 386.tar.Z2014-03-19 10:28 31M 
3D"[cmake-3.0.0-rc2-Linux-= i386.tar.gz2014-03-19 10:28 22M 
3D"[TXT]"2016-04-13 12:48 2.2K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2014-03-19 10:28 11M=  
3D"[cmake-3.0.0-rc2-win32-x86.= zip2014-03-19 10:27 = 14M 
3D"[cmake-3.0.0-rc2.tar.Z2014-03-19 10:27 8.5M&nb= sp;
3D"[cmake-3.0.0-rc2.tar.gz5.2M&= nbsp;
3D"[cmake-3.0.0-rc2.zip2014-03-19 10:27 8.0M <= /td>
3D"[cmake-3.0.0-rc3-1-src.tar.bz2= 2014-03-26 13:00 4.2= M 
3D"[cmake-3.0.0-rc3-1.tar.bz22014-03-26 13:00 8.0M
3D"[TXT]"2014-03-26 13:00 21M=  
3D"[cmake-3.0.0-rc3-AIX-po= werpc.tar.Z2014-03-26 13:00 31M 
3D"[cmake-3.0.0-rc3-AIX-p= owerpc.tar.gz2014-03-26 13:00 21M 
3D"[cmake-3.0.0-rc3-Darwin= -universal.dmg2014-03-26 13:00 41M 
3D"[cmake-3.0.0-rc3-D= arwin-universal.tar.Z2014-03-26 13:00  
3D"[cmake-3.0.0-rc3-= Darwin-universal.tar.gz2014-03-26 13:00 41M 
3D"[cmake-3.0.0-rc3-Darw= in64-universal.dmg2014-03-26 12:59 39M 
3D"[cmake-3.0.0-rc3= -Darwin64-universal.tar.Z2014-03-26 12:59 54M 
3D"[cmake-3.0.0-rc= 3-Darwin64-universal.tar.gz2014-03-26 12:59 <= /td> 39M 
3D"[TXT]"2014-03-26 12:59 13M 
3D"[cmake-3.0.0-rc3-IRIX64-6= 4.tar.Z2014-03-26 12:59 19M 
3D"[cmake-3.0.0-rc3-IRIX64-= 64.tar.gz2014-03-26 12:59 13M 
3D"[TXT]"2014-03-26 12:59 12M 
3D"[cmake-3.0.0-rc3-IRIX64-= n32.tar.Z2014-03-26 12:59 19M 
3D"[cmake-3.0.0-rc3-IRIX64= -n32.tar.gz2014-03-26 12:59 12M 
3D"[TXT]"2016-04-13 12:48 1.9K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2014-03-26 12:59 11M=  
3D"[cmake-3.0.0-rc3-win32-x86.= zip2014-03-26 12:59 = 14M 
3D"[cmake-3.0.0-rc3.tar.Z2014-03-26 12:59 8.4M&nb= sp;
3D"[cmake-3.0.0-rc3.tar.gz5.2M&= nbsp;
3D"[cmake-3.0.0-rc3.zip2014-03-26 12:59 8.0M <= /td>
3D"[cmake-3.0.0-rc4-1-src.tar.bz2= 2014-04-18 09:52 4.2= M 
3D"[cmake-3.0.0-rc4-1.tar.bz22014-04-18 09:52 8.0M
3D"[TXT]"2014-04-18 09:52 22M=  
3D"[cmake-3.0.0-rc4-AIX-po= werpc.tar.Z2014-04-18 09:52 31M 
3D"[cmake-3.0.0-rc4-AIX-p= owerpc.tar.gz2014-04-18 09:52 22M 
3D"[cmake-3.0.0-rc4-Darwin= -universal.dmg2014-04-18 09:52 41M 
3D"[cmake-3.0.0-rc4-D= arwin-universal.tar.Z2014-04-18 09:52  
3D"[cmake-3.0.0-rc4-= Darwin-universal.tar.gz2014-04-18 09:51 41M 
3D"[cmake-3.0.0-rc4-Darw= in64-universal.dmg2014-04-18 09:51 39M 
3D"[cmake-3.0.0-rc4= -Darwin64-universal.tar.Z2014-04-18 09:51 54M 
3D"[cmake-3.0.0-rc= 4-Darwin64-universal.tar.gz2014-04-18 09:51 <= /td> 39M 
3D"[TXT]"2014-04-18 09:51 13M 
3D"[cmake-3.0.0-rc4-IRIX64-6= 4.tar.Z2014-04-18 09:51 19M 
3D"[cmake-3.0.0-rc4-IRIX64-= 64.tar.gz2014-04-18 09:51 13M 
3D"[TXT]"2014-04-18 09:51 12M 
3D"[cmake-3.0.0-rc4-IRIX64-= n32.tar.Z2014-04-18 09:51 19M 
3D"[cmake-3.0.0-rc4-IRIX64= -n32.tar.gz2014-04-18 09:51 12M 
3D"[TXT]"2014-04-18 09:51 22M 
3D"[cmake-3.0.0-rc4-Linux-i= 386.tar.Z2014-04-18 09:51 31M 
3D"[cmake-3.0.0-rc4-Linux-= i386.tar.gz2014-04-18 09:51 22M 
3D"[TXT]"2016-04-13 12:48 2.2K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2014-04-18 09:51 11M=  
3D"[cmake-3.0.0-rc4-win32-x86.= zip2014-04-18 09:51 = 14M 
3D"[cmake-3.0.0-rc4.tar.Z2014-04-18 09:51 8.5M&nb= sp;
3D"[cmake-3.0.0-rc4.tar.gz5.2M&= nbsp;
3D"[cmake-3.0.0-rc4.zip2014-04-18 09:51 8.0M <= /td>
3D"[cmake-3.0.0-rc5-1-src.tar.bz2= 2014-05-13 14:25 4.2= M 
3D"[cmake-3.0.0-rc5-1.tar.bz22014-05-13 14:25 8.0M
3D"[cmake-3.0.0-rc5-Darwin= -universal.dmg2014-05-13 14:25 41M 
3D"[cmake-3.0.0-rc5-D= arwin-universal.tar.Z2014-05-13 14:24  
3D"[cmake-3.0.0-rc5-= Darwin-universal.tar.gz2014-05-13 14:24 41M 
3D"[cmake-3.0.0-rc5-Darw= in64-universal.dmg2014-05-13 14:24 39M 
3D"[cmake-3.0.0-rc5= -Darwin64-universal.tar.Z2014-05-13 14:24 54M 
3D"[cmake-3.0.0-rc= 5-Darwin64-universal.tar.gz2014-05-13 14:24 <= /td> 39M 
3D"[TXT]"2014-05-13 14:24 22M 
3D"[cmake-3.0.0-rc5-Linux-i= 386.tar.Z2014-05-13 14:24 31M 
3D"[cmake-3.0.0-rc5-Linux-= i386.tar.gz2014-05-13 14:24 22M 
3D"[TXT]"2016-04-13 12:48 1.4K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2014-05-13 14:24 11M=  
3D"[cmake-3.0.0-rc5-win32-x86.= zip2014-05-13 14:24 = 14M 
3D"[cmake-3.0.0-rc5.tar.Z2014-05-13 14:24 8.5M&nb= sp;
3D"[cmake-3.0.0-rc5.tar.gz5.2M&= nbsp;
3D"[cmake-3.0.0-rc5.zip2014-05-13 14:24 8.0M <= /td>
3D"[cmake-3.0.0-rc6-1-src.tar.bz2= 2014-05-22 14:57 4.2= M 
3D"[cmake-3.0.0-rc6-1.tar.bz22014-05-22 14:57 8.0M
3D"[cmake-3.0.0-rc6-Darwin= -universal.dmg2014-05-22 14:57 41M 
3D"[cmake-3.0.0-rc6-D= arwin-universal.tar.Z2014-05-22 14:56  
3D"[cmake-3.0.0-rc6-= Darwin-universal.tar.gz2014-05-22 14:56 41M 
3D"[cmake-3.0.0-rc6-Darw= in64-universal.dmg2014-05-22 14:56 39M 
3D"[cmake-3.0.0-rc6= -Darwin64-universal.tar.Z2014-05-22 14:56 54M 
3D"[cmake-3.0.0-rc= 6-Darwin64-universal.tar.gz2014-05-22 14:56 <= /td> 39M 
3D"[TXT]"2014-05-22 14:56 22M 
3D"[cmake-3.0.0-rc6-Linux-i= 386.tar.Z2014-05-22 14:56 31M 
3D"[cmake-3.0.0-rc6-Linux-= i386.tar.gz2014-05-22 14:56 22M 
3D"[TXT]"2016-04-13 12:48 1.4K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2014-05-22 14:56 11M=  
3D"[cmake-3.0.0-rc6-win32-x86.= zip2014-05-22 14:56 = 14M 
3D"[cmake-3.0.0-rc6.tar.Z2014-05-22 14:56 8.5M&nb= sp;
3D"[cmake-3.0.0-rc6.tar.gz5.2M&= nbsp;
3D"[cmake-3.0.0-rc6.zip2014-05-22 14:56 8.0M <= /td>
3D"[2014-06-10 13:27 11M
3D"[cmake-3.0.0-win32-x86.zip<= /td>2014-06-10 13:27 14M 
3D"[cmake-3.0.0.tar.Z2014-06-10 13:27 8.5M 
3D"[cmake-3.0.0.tar.gz2014-06-10 13:27 5.2M 
3D"[cmake-3.0.0.zip2014-06-10 13:27 7.9M 
3D"[cmake-3.0.1-1-src.tar.bz22014-09-11 09:19 4.2M
3D"[cmake-3.0.1-1.tar.bz22014-09-11 09:19 8.0M =
3D"[cmake-3.0.1-Darwin-univers= al.dmg2014-09-11 09:19 41M 
3D"[cmake-3.0.1-Darwin-un= iversal.tar.Z2014-09-11 09:19 58M 
3D"[cmake-3.0.1-Darwin-u= niversal.tar.gz2014-09-11 09:19 41M 
3D"[cmake-3.0.1-Darwin64-uni= versal.dmg2014-09-11 09:18 39M 
3D"[cmake-3.0.1-Darwin6= 4-universal.tar.Z2014-09-11 09:18 54M 
3D"[cmake-3.0.1-Darwin= 64-universal.tar.gz2014-09-11 09:18 39M 
3D"[TXT]" 22M&= nbsp;
3D"[cmake-3.0.1-Linux-i386.tar.= Z2014-09-11 09:18 3= 1M 
3D"[cmake-3.0.1-Linux-i386.tar= .gz2014-09-11 09:18 = 22M 
3D"[TXT]"2016-04-13 12:48 1.3K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2014-09-11 09:18 11M
3D"[cmake-3.0.1-win32-x86.zip<= /td>2014-09-11 09:18 14M 
3D"[cmake-3.0.1.tar.Z2014-09-11 09:18 8.5M 
3D"[cmake-3.0.1.tar.gz2014-09-11 09:18 5.2M 
3D"[cmake-3.0.1.zip2014-09-11 09:18 7.9M 
3D"[cmake-3.0.2-1-src.tar.bz22014-09-11 12:19 4.2M
3D"[cmake-3.0.2-1.tar.bz22014-09-11 12:19 8.0M =
3D"[cmake-3.0.2-Darwin-univers= al.dmg2014-09-11 12:19 41M 
3D"[cmake-3.0.2-Darwin-un= iversal.tar.Z2014-09-11 12:19 58M 
3D"[cmake-3.0.2-Darwin-u= niversal.tar.gz2014-09-11 12:19 41M 
3D"[cmake-3.0.2-Darwin64-uni= versal.dmg2014-09-11 12:19 39M 
3D"[cmake-3.0.2-Darwin6= 4-universal.tar.Z2014-09-11 12:19 54M 
3D"[cmake-3.0.2-Darwin= 64-universal.tar.gz2014-09-11 12:18 39M 
3D"[TXT]" 22M&= nbsp;
3D"[cmake-3.0.2-Linux-i386.tar.= Z2014-09-11 12:18 3= 1M 
3D"[cmake-3.0.2-Linux-i386.tar= .gz2014-09-11 12:18 = 22M 
3D"[TXT]"2016-04-13 12:48 1.3K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2014-09-11 12:18 11M
3D"[cmake-3.0.2-win32-x86.zip<= /td>2014-09-11 12:18 14M 
3D"[cmake-3.0.2.tar.Z2014-09-11 12:18 8.5M 
3D"[cmake-3.0.2.tar.gz2014-09-11 12:18 5.2M 
3D"[cmake-3.0.2.zip2014-09-11 12:18 7.9M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.1/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.1/index.html new file mode 100644 index 0000000..635d34c --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.1/index.html @@ -0,0 +1,156 @@ + + + + Index of /files/v3.1 + + +

Index of /files/v3.1

+ + + + +=   += += + + += + + += <= td align=3D"right">2014-12-19 11:38 + + +cmake-3.1.0-Linux-i386.sh2014-12-17 13:10 + + +cmake-3.1.0-Linux-x86_64.sh<= td>  + + +cmake-3.1.0-SHA-256.txt +cmake-3.1.0-SHA-256.txt.asc<= td>  += +=   += + 63M += += + + +cmake-3.1.0-rc1-Linux-i386.sh + + +cmake-3.1.0-rc1-SHA-256.txt<= td>  +cmake-3.1.0-rc1-SHA-256.txt.as= c +<= td>cmake-3.1.0-rc1-win32-x86.exe<= /a> + + +2014-10-28 14:08 + += +=   += + 63M += += + + +cmake-3.1.0-rc2-Linux-i386.sh + + +cmake-3.1.0-rc2-SHA-256.txt<= td>  +cmake-3.1.0-rc2-SHA-256.txt.as= c +<= td>cmake-3.1.0-rc2-win32-x86.exe<= /a> + + +2014-11-13 11:50 + += +=   += + 63M += += + + +cmake-3.1.0-rc3-Linux-i386.sh + + +cmake-3.1.0-rc3-Linux-x86_64.s= h + + +cmake-3.1.0-rc3-SHA-256.txt<= td>  +cmake-3.1.0-rc3-SHA-256.txt.as= c +<= td>cmake-3.1.0-rc3-win32-x86.exe<= /a> + + +2014-12-09 16:52 + +<= td>cmake-3.1.0-win32-x86.exe=   + += + + +=   += += + + += + + +cmake-3.1.1-Linux-i386.sh2015-01-22 16:48 + + +cmake-3.1.1-Linux-x86_64.sh<= td>  + + +cmake-3.1.1-SHA-256.txt +cmake-3.1.1-SHA-256.txt.asc<= td>  +<= td>cmake-3.1.1-win32-x86.exe=   + += + + += + + += + + +cmake-3.1.2-Linux-i386.sh2015-02-05 10:06 + + +cmake-3.1.2-Linux-x86_64.sh<= td>  + + +cmake-3.1.2-SHA-256.txt +cmake-3.1.2-SHA-256.txt.asc<= td>  +<= td>cmake-3.1.2-win32-x86.exe=   + += + + +=   += += + + += + + +cmake-3.1.3-Linux-i386.sh2015-02-12 17:39 + + +cmake-3.1.3-Linux-x86_64.sh<= td>  + + +cmake-3.1.3-SHA-256.txt +cmake-3.1.3-SHA-256.txt.asc<= td>  +<= td>cmake-3.1.3-win32-x86.exe=   + += + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.1.0-1-src.tar.bz22014-12-17 13:10 4.5M
3D"[cmake-3.1.0-1.tar.bz22014-12-17 13:10 9.0M =
3D"[cmake-3.1.0-Darwin-univers= al.dmg2014-12-17 13:10 45M 
3D"[cmake-3.1.0-Darwin-un= iversal.tar.Z2014-12-17 13:10 63M 
3D"[cmake-3.1.0-Darwin-u= niversal.tar.gz2014-12-17 13:10 44M 
3D"[cmake-3.1.0-Darwin64-uni= versal.dmg2014-12-17 13:10 28M 
3D"[cmake-3.1.0-Darwin6= 4-universal.tar.Z2014-12-17 13:10 40M 
3D"[cmake-3.1.0-Darwin= 64-universal.tar.gz2014-12-17 13:10 28M 
3D"[cmake-3.1.0-Darwin64.dmg 29M=  
3D"[cmake-3.1.0-Darwin64.tar.Z2014-12-19 11:38 41M 
3D"[cmake-3.1.0-Darwin64.tar.gz<= /a>2014-12-19 11:38 29M=  
3D"[TXT]" 24M&= nbsp;
3D"[cmake-3.1.0-Linux-i386.tar.= Z2014-12-17 13:10 3= 3M 
3D"[cmake-3.1.0-Linux-i386.tar= .gz2014-12-17 13:10 = 24M 
3D"[TXT]"2014-12-17 13:10 25M
3D"[cmake-3.1.0-Linux-x86_64.= tar.Z2014-12-17 13:10 35M 
3D"[cmake-3.1.0-Linux-x86_64= .tar.gz2014-12-17 13:10 25M 
3D"[TXT]"2016-04-13 12:48 1.9K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[cmake-3.1.0-rc1-1-src.tar.bz2= 2014-10-28 14:09 4.5= M 
3D"[cmake-3.1.0-rc1-1.tar.bz22014-10-28 14:09 9.0M
3D"[cmake-3.1.0-rc1-Darwin= -universal.dmg2014-10-28 14:09 45M 
3D"[cmake-3.1.0-rc1-D= arwin-universal.tar.Z2014-10-28 14:09  
3D"[cmake-3.1.0-rc1-= Darwin-universal.tar.gz2014-10-28 14:09 44M 
3D"[cmake-3.1.0-rc1-Darw= in64-universal.dmg2014-10-28 14:09 28M 
3D"[cmake-3.1.0-rc1= -Darwin64-universal.tar.Z2014-10-28 14:09 40M 
3D"[cmake-3.1.0-rc= 1-Darwin64-universal.tar.gz2014-10-28 14:08 <= /td> 28M 
3D"[TXT]"2014-10-28 14:08 24M 
3D"[cmake-3.1.0-rc1-Linux-i= 386.tar.Z2014-10-28 14:08 33M 
3D"[cmake-3.1.0-rc1-Linux-= i386.tar.gz2014-10-28 14:08 24M 
3D"[TXT]"2016-04-13 12:48 1.4K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2014-10-28 14:08 12M=  
3D"[cmake-3.1.0-rc1-win32-x86.= zip2014-10-28 14:08 = 15M 
3D"[cmake-3.1.0-rc1.tar.Z2014-10-28 14:08 9.2M&nb= sp;
3D"[cmake-3.1.0-rc1.tar.gz5.7M&= nbsp;
3D"[cmake-3.1.0-rc1.zip2014-10-28 14:08 9.0M <= /td>
3D"[cmake-3.1.0-rc2-1-src.tar.bz2= 2014-11-13 11:51 4.5= M 
3D"[cmake-3.1.0-rc2-1.tar.bz22014-11-13 11:51 9.0M
3D"[cmake-3.1.0-rc2-Darwin= -universal.dmg2014-11-13 11:51 45M 
3D"[cmake-3.1.0-rc2-D= arwin-universal.tar.Z2014-11-13 11:51  
3D"[cmake-3.1.0-rc2-= Darwin-universal.tar.gz2014-11-13 11:50 44M 
3D"[cmake-3.1.0-rc2-Darw= in64-universal.dmg2014-11-13 11:50 28M 
3D"[cmake-3.1.0-rc2= -Darwin64-universal.tar.Z2014-11-13 11:50 40M 
3D"[cmake-3.1.0-rc= 2-Darwin64-universal.tar.gz2014-11-13 11:50 <= /td> 28M 
3D"[TXT]"2014-11-13 11:50 24M 
3D"[cmake-3.1.0-rc2-Linux-i= 386.tar.Z2014-11-13 11:50 33M 
3D"[cmake-3.1.0-rc2-Linux-= i386.tar.gz2014-11-13 11:50 24M 
3D"[TXT]"2016-04-13 12:48 1.4K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2014-11-13 11:50 12M=  
3D"[cmake-3.1.0-rc2-win32-x86.= zip2014-11-13 11:50 = 15M 
3D"[cmake-3.1.0-rc2.tar.Z2014-11-13 11:50 9.2M&nb= sp;
3D"[cmake-3.1.0-rc2.tar.gz5.7M&= nbsp;
3D"[cmake-3.1.0-rc2.zip2014-11-13 11:50 9.0M <= /td>
3D"[cmake-3.1.0-rc3-1-src.tar.bz2= 2014-12-09 16:53 4.5= M 
3D"[cmake-3.1.0-rc3-1.tar.bz22014-12-09 16:53 9.0M
3D"[cmake-3.1.0-rc3-Darwin= -universal.dmg2014-12-09 16:53 45M 
3D"[cmake-3.1.0-rc3-D= arwin-universal.tar.Z2014-12-09 16:52  
3D"[cmake-3.1.0-rc3-= Darwin-universal.tar.gz2014-12-09 16:52 44M 
3D"[cmake-3.1.0-rc3-Darw= in64-universal.dmg2014-12-09 16:52 28M 
3D"[cmake-3.1.0-rc3= -Darwin64-universal.tar.Z2014-12-09 16:52 40M 
3D"[cmake-3.1.0-rc= 3-Darwin64-universal.tar.gz2014-12-09 16:52 <= /td> 28M 
3D"[TXT]"2014-12-09 16:52 24M 
3D"[cmake-3.1.0-rc3-Linux-i= 386.tar.Z2014-12-09 16:52 33M 
3D"[cmake-3.1.0-rc3-Linux-= i386.tar.gz2014-12-09 16:52 24M 
3D"[TXT]"2014-12-09 16:52 2= 5M 
3D"[cmake-3.1.0-rc3-Linux= -x86_64.tar.Z2014-12-09 16:52 35M 
3D"[cmake-3.1.0-rc3-Linu= x-x86_64.tar.gz2014-12-09 16:52 25M 
3D"[TXT]"2016-04-13 12:48 1.6K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2014-12-09 16:52 12M=  
3D"[cmake-3.1.0-rc3-win32-x86.= zip2014-12-09 16:52 = 15M 
3D"[cmake-3.1.0-rc3.tar.Z2014-12-09 16:52 9.2M&nb= sp;
3D"[cmake-3.1.0-rc3.tar.gz5.7M&= nbsp;
3D"[cmake-3.1.0-rc3.zip2014-12-09 16:52 9.0M <= /td>
3D"[2014-12-17 13:10 12M
3D"[cmake-3.1.0-win32-x86.zip<= /td>2014-12-17 13:10 15M 
3D"[cmake-3.1.0.tar.Z2014-12-17 13:10 9.2M 
3D"[cmake-3.1.0.tar.gz2014-12-17 13:10 5.7M 
3D"[cmake-3.1.0.zip2014-12-17 13:10 9.0M 
3D"[cmake-3.1.1-1-src.tar.bz22015-01-22 16:49 4.5M
3D"[cmake-3.1.1-1.tar.bz22015-01-22 16:49 9.1M =
3D"[cmake-3.1.1-Darwin-univers= al.dmg2015-01-22 16:49 45M 
3D"[cmake-3.1.1-Darwin-un= iversal.tar.Z2015-01-22 16:49 64M 
3D"[cmake-3.1.1-Darwin-u= niversal.tar.gz2015-01-22 16:49 44M 
3D"[cmake-3.1.1-Darwin-x86_64.dmg= 2015-01-22 16:48 29= M 
3D"[cmake-3.1.1-Darwin-x86_6= 4.tar.Z2015-01-22 16:48 41M 
3D"[cmake-3.1.1-Darwin-x86_= 64.tar.gz2015-01-22 16:48 29M 
3D"[TXT]" 24M&= nbsp;
3D"[cmake-3.1.1-Linux-i386.tar.= Z2015-01-22 16:48 3= 3M 
3D"[cmake-3.1.1-Linux-i386.tar= .gz2015-01-22 16:48 = 24M 
3D"[TXT]"2015-01-22 16:48 25M
3D"[cmake-3.1.1-Linux-x86_64.= tar.Z2015-01-22 16:48 35M 
3D"[cmake-3.1.1-Linux-x86_64= .tar.gz2015-01-22 16:48 25M 
3D"[TXT]"2016-04-13 12:48 1.6K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2015-01-22 16:48 12M
3D"[cmake-3.1.1-win32-x86.zip<= /td>2015-01-22 16:48 15M 
3D"[cmake-3.1.1.tar.Z2015-01-22 16:48 9.2M 
3D"[cmake-3.1.1.tar.gz2015-01-22 16:48 5.7M 
3D"[cmake-3.1.1.zip2015-01-22 16:48 9.0M 
3D"[cmake-3.1.2-Darwin-univers= al.dmg2015-02-05 10:06 45M 
3D"[cmake-3.1.2-Darwin-un= iversal.tar.Z2015-02-05 10:06 64M 
3D"[cmake-3.1.2-Darwin-u= niversal.tar.gz2015-02-05 10:06 44M 
3D"[cmake-3.1.2-Darwin-x86_64.dmg= 2015-02-05 10:06 29= M 
3D"[cmake-3.1.2-Darwin-x86_6= 4.tar.Z2015-02-05 10:06 41M 
3D"[cmake-3.1.2-Darwin-x86_= 64.tar.gz2015-02-05 10:06 29M 
3D"[TXT]" 24M&= nbsp;
3D"[cmake-3.1.2-Linux-i386.tar.= Z2015-02-05 10:06 3= 3M 
3D"[cmake-3.1.2-Linux-i386.tar= .gz2015-02-05 10:05 = 24M 
3D"[TXT]"2015-02-05 10:05 25M
3D"[cmake-3.1.2-Linux-x86_64.= tar.Z2015-02-05 10:05 35M 
3D"[cmake-3.1.2-Linux-x86_64= .tar.gz2015-02-05 10:05 25M 
3D"[TXT]"2016-04-13 12:48 1.6K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2015-02-05 10:05 12M
3D"[cmake-3.1.2-win32-x86.zip<= /td>2015-02-05 10:05 15M 
3D"[cmake-3.1.2.tar.Z2015-02-05 10:05 9.2M 
3D"[cmake-3.1.2.tar.gz2015-02-05 10:05 5.7M 
3D"[cmake-3.1.2.zip2015-02-05 10:05 9.0M 
3D"[cmake-3.1.3-1-src.tar.bz22015-02-12 17:40 4.5M
3D"[cmake-3.1.3-1.tar.bz22015-02-12 17:40 9.0M =
3D"[cmake-3.1.3-Darwin-univers= al.dmg2015-02-12 17:40 45M 
3D"[cmake-3.1.3-Darwin-un= iversal.tar.Z2015-02-12 17:40 64M 
3D"[cmake-3.1.3-Darwin-u= niversal.tar.gz2015-02-12 17:40 44M 
3D"[cmake-3.1.3-Darwin-x86_64.dmg= 2015-02-12 17:40 29= M 
3D"[cmake-3.1.3-Darwin-x86_6= 4.tar.Z2015-02-12 17:40 41M 
3D"[cmake-3.1.3-Darwin-x86_= 64.tar.gz2015-02-12 17:39 29M 
3D"[TXT]" 24M&= nbsp;
3D"[cmake-3.1.3-Linux-i386.tar.= Z2015-02-12 17:39 3= 3M 
3D"[cmake-3.1.3-Linux-i386.tar= .gz2015-02-12 17:39 = 24M 
3D"[TXT]"2015-02-12 17:39 25M
3D"[cmake-3.1.3-Linux-x86_64.= tar.Z2015-02-12 17:39 35M 
3D"[cmake-3.1.3-Linux-x86_64= .tar.gz2015-02-12 17:39 25M 
3D"[TXT]"2016-04-13 12:48 1.6K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2015-02-12 17:39 12M
3D"[cmake-3.1.3-win32-x86.zip<= /td>2015-02-12 17:39 15M 
3D"[cmake-3.1.3.tar.Z2015-02-12 17:39 9.2M 
3D"[cmake-3.1.3.tar.gz2015-02-12 17:39 5.7M 
3D"[cmake-3.1.3.zip2015-02-12 17:39 9.0M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.10/index.html b/b= itbake/lib/bb/tests/fetch-testdata/files/v3.10/index.html new file mode 100644 index 0000000..df654a3 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.10/index.html @@ -0,0 +1,131 @@ + + + + Index of /files/v3.10 + + +

Index of /files/v3.10

+ + + + += + +cmake-3.10.0-Linux-x86_64.sh<= /td> + +cmake-3.10.0-SHA-256.txt +cmake-3.10.0-SHA-256.txt.asc<= /td> += + +cmake-3.10.0-rc1-Linux-x86_64= .sh + +cmake-3.10.0-rc1-SHA-256.txt<= /td> +cmake-3.10.0-rc1-SHA-256.txt.= asc += + += + +2017-10-05 15:50 +=   + += + +cmake-3.10.0-rc2-Linux-x86_64= .sh + +cmake-3.10.0-rc2-SHA-256.txt<= /td> +cmake-3.10.0-rc2-SHA-256.txt.= asc += + += + +2017-10-12 12:06 +=   + += + +cmake-3.10.0-rc3-Linux-x86_64= .sh + +cmake-3.10.0-rc3-SHA-256.txt<= /td> +cmake-3.10.0-rc3-SHA-256.txt.= asc += + += + +2017-10-19 13:24 +=   + += + +cmake-3.10.0-rc4-Linux-x86_64= .sh + +cmake-3.10.0-rc4-SHA-256.txt<= /td> +cmake-3.10.0-rc4-SHA-256.txt.= asc += + += + +2017-11-01 15:37 +=   + += + +cmake-3.10.0-rc5-Linux-x86_64= .sh + +cmake-3.10.0-rc5-SHA-256.txt<= /td> +cmake-3.10.0-rc5-SHA-256.txt.= asc += + += + +2017-11-10 14:01 +=   + += = + += = + + + + += + +cmake-3.10.1-Linux-x86_64.sh<= /td> + +cmake-3.10.1-SHA-256.txt +cmake-3.10.1-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.10.2-Linux-x86_64.sh<= /td> + +cmake-3.10.2-SHA-256.txt +cmake-3.10.2-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.10.3-Linux-x86_64.sh<= /td> + +cmake-3.10.3-SHA-256.txt +cmake-3.10.3-SHA-256.txt.asc<= /td> += = + += = + + + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.10.0-Darwin-x86_64.d= mg2017-11-20 16:00 = 26M 
3D"[cmake-3.10.0-Darwin-x8= 6_64.tar.gz2017-11-20 16:00 26M 
3D"[TXT]"2017-11-20 16:00 33M 
3D"[cmake-3.10.0-Linux-x86_= 64.tar.gz2017-11-20 16:00 33M 
3D"[TXT]"2017-11-20 16:00 1.0K&nb= sp;
3D"[TXT]"2017-11-20 16:00 833  
3D"[cmake-3.10.0-rc1-Darwin-= x86_64.dmg2017-10-05 15:50 26M 
3D"[cmake-3.10.0-rc1-D= arwin-x86_64.tar.gz2017-10-05 15:50 26M 
3D"[TXT]"2017-10-05 15:50 = 31M 
3D"[cmake-3.10.0-rc1-Li= nux-x86_64.tar.gz2017-10-05 15:50 31M 
3D"[TXT]"2017-10-05 15:50 1.0K 
3D"[TXT]"2017-10-05 15:50 = 833  
3D"[cmake-3.10.0-rc1-win32-x86.m= si2017-10-05 15:50 = 16M 
3D"[cmake-3.10.0-rc1-win32-x8= 6.zip2017-10-05 15:50 22M 
3D"[cmake-3.10.0-rc1-win64-x64.m= si2017-10-05 15:50 = 18M 
3D"[cmake-3.10.0-rc1-win64-x6= 4.zip2017-10-05 15:50 25M 
3D"[cmake-3.10.0-rc1.tar.Z 12M&= nbsp;
3D"[cmake-3.10.0-rc1.tar.gz2017-10-05 15:50 7.4M
3D"[cmake-3.10.0-rc1.zip2017-10-05 15:50 12M = ;
3D"[cmake-3.10.0-rc2-Darwin-= x86_64.dmg2017-10-12 12:07 26M 
3D"[cmake-3.10.0-rc2-D= arwin-x86_64.tar.gz2017-10-12 12:07 26M 
3D"[TXT]"2017-10-12 12:07 = 31M 
3D"[cmake-3.10.0-rc2-Li= nux-x86_64.tar.gz2017-10-12 12:07 31M 
3D"[TXT]"2017-10-12 12:07 1.0K 
3D"[TXT]"2017-10-12 12:06 = 833  
3D"[cmake-3.10.0-rc2-win32-x86.m= si2017-10-12 12:06 = 16M 
3D"[cmake-3.10.0-rc2-win32-x8= 6.zip2017-10-12 12:06 22M 
3D"[cmake-3.10.0-rc2-win64-x64.m= si2017-10-12 12:06 = 18M 
3D"[cmake-3.10.0-rc2-win64-x6= 4.zip2017-10-12 12:06 25M 
3D"[cmake-3.10.0-rc2.tar.Z 12M&= nbsp;
3D"[cmake-3.10.0-rc2.tar.gz2017-10-12 12:06 7.5M
3D"[cmake-3.10.0-rc2.zip2017-10-12 12:06 13M = ;
3D"[cmake-3.10.0-rc3-Darwin-= x86_64.dmg2017-10-19 13:24 26M 
3D"[cmake-3.10.0-rc3-D= arwin-x86_64.tar.gz2017-10-19 13:24 26M 
3D"[TXT]"2017-10-19 13:24 = 31M 
3D"[cmake-3.10.0-rc3-Li= nux-x86_64.tar.gz2017-10-19 13:24 31M 
3D"[TXT]"2017-10-19 13:24 1.0K 
3D"[TXT]"2017-10-19 13:24 = 833  
3D"[cmake-3.10.0-rc3-win32-x86.m= si2017-10-19 13:24 = 16M 
3D"[cmake-3.10.0-rc3-win32-x8= 6.zip2017-10-19 13:24 22M 
3D"[cmake-3.10.0-rc3-win64-x64.m= si2017-10-19 13:24 = 18M 
3D"[cmake-3.10.0-rc3-win64-x6= 4.zip2017-10-19 13:24 25M 
3D"[cmake-3.10.0-rc3.tar.Z 12M&= nbsp;
3D"[cmake-3.10.0-rc3.tar.gz2017-10-19 13:24 7.5M
3D"[cmake-3.10.0-rc3.zip2017-10-19 13:24 13M = ;
3D"[cmake-3.10.0-rc4-Darwin-= x86_64.dmg2017-11-01 15:37 26M 
3D"[cmake-3.10.0-rc4-D= arwin-x86_64.tar.gz2017-11-01 15:37 26M 
3D"[TXT]"2017-11-01 15:37 = 31M 
3D"[cmake-3.10.0-rc4-Li= nux-x86_64.tar.gz2017-11-01 15:37 31M 
3D"[TXT]"2017-11-01 15:37 1.0K 
3D"[TXT]"2017-11-01 15:37 = 833  
3D"[cmake-3.10.0-rc4-win32-x86.m= si2017-11-01 15:37 = 16M 
3D"[cmake-3.10.0-rc4-win32-x8= 6.zip2017-11-01 15:37 22M 
3D"[cmake-3.10.0-rc4-win64-x64.m= si2017-11-01 15:37 = 18M 
3D"[cmake-3.10.0-rc4-win64-x6= 4.zip2017-11-01 15:37 25M 
3D"[cmake-3.10.0-rc4.tar.Z 12M&= nbsp;
3D"[cmake-3.10.0-rc4.tar.gz2017-11-01 15:37 7.5M
3D"[cmake-3.10.0-rc4.zip2017-11-01 15:37 13M = ;
3D"[cmake-3.10.0-rc5-Darwin-= x86_64.dmg2017-11-10 14:01 26M 
3D"[cmake-3.10.0-rc5-D= arwin-x86_64.tar.gz2017-11-10 14:01 26M 
3D"[TXT]"2017-11-10 14:01 = 31M 
3D"[cmake-3.10.0-rc5-Li= nux-x86_64.tar.gz2017-11-10 14:01 31M 
3D"[TXT]"2017-11-10 14:01 1.0K 
3D"[TXT]"2017-11-10 14:01 = 833  
3D"[cmake-3.10.0-rc5-win32-x86.m= si2017-11-10 14:01 = 16M 
3D"[cmake-3.10.0-rc5-win32-x8= 6.zip2017-11-10 14:01 22M 
3D"[cmake-3.10.0-rc5-win64-x64.m= si2017-11-10 14:01 = 18M 
3D"[cmake-3.10.0-rc5-win64-x6= 4.zip2017-11-10 14:01 25M 
3D"[cmake-3.10.0-rc5.tar.Z 12M&= nbsp;
3D"[cmake-3.10.0-rc5.tar.gz2017-11-10 14:01 7.5M
3D"[cmake-3.10.0-rc5.zip2017-11-10 14:00 13M = ;
3D"[cmake-3.10.0-win32-x86.msi2017-11-20 16:00 15M 
3D"[cmake-3.10.0-win32-x86.zip2017-11-20 16:00 21M 
3D"[cmake-3.10.0-win64-x64.msi2017-11-20 16:00 17M 
3D"[cmake-3.10.0-win64-x64.zip2017-11-20 16:00 24M 
3D"[cmake-3.10.0.tar.Z2017-11-20 16:00 12M 
3D"[cmake-3.10.0.tar.gz2017-11-20 16:00 7.5M <= /td>
3D"[cmake-3.10.0.zip2017-11-20 16:00 12M 
3D"[cmake-3.10.1-Darwin-x86_64.d= mg2017-12-14 09:10 = 26M 
3D"[cmake-3.10.1-Darwin-x8= 6_64.tar.gz2017-12-14 09:10 26M 
3D"[TXT]"2017-12-14 09:10 33M 
3D"[cmake-3.10.1-Linux-x86_= 64.tar.gz2017-12-14 09:10 33M 
3D"[TXT]"2017-12-14 09:10 1.0K&nb= sp;
3D"[TXT]"2017-12-14 09:10 833  
3D"[cmake-3.10.1-win32-x86.msi2017-12-14 09:10 15M 
3D"[cmake-3.10.1-win32-x86.zip2017-12-14 09:10 21M 
3D"[cmake-3.10.1-win64-x64.msi2017-12-14 09:10 18M 
3D"[cmake-3.10.1-win64-x64.zip2017-12-14 09:09 25M 
3D"[cmake-3.10.1.tar.Z2017-12-14 09:09 12M 
3D"[cmake-3.10.1.tar.gz2017-12-14 09:09 7.5M <= /td>
3D"[cmake-3.10.1.zip2017-12-14 09:09 12M 
3D"[cmake-3.10.2-Darwin-x86_64.d= mg2018-01-18 12:09 = 26M 
3D"[cmake-3.10.2-Darwin-x8= 6_64.tar.gz2018-01-18 12:09 26M 
3D"[TXT]"2018-01-18 12:09 33M 
3D"[cmake-3.10.2-Linux-x86_= 64.tar.gz2018-01-18 12:09 33M 
3D"[TXT]"2018-01-18 12:09 1.0K&nb= sp;
3D"[TXT]"2018-01-18 12:09 833  
3D"[cmake-3.10.2-win32-x86.msi2018-01-18 12:09 15M 
3D"[cmake-3.10.2-win32-x86.zip2018-01-18 12:09 21M 
3D"[cmake-3.10.2-win64-x64.msi2018-01-18 12:09 18M 
3D"[cmake-3.10.2-win64-x64.zip2018-01-18 12:09 25M 
3D"[cmake-3.10.2.tar.Z2018-01-18 12:09 12M 
3D"[cmake-3.10.2.tar.gz2018-01-18 12:09 7.5M <= /td>
3D"[cmake-3.10.2.zip2018-01-18 12:08 12M 
3D"[cmake-3.10.3-Darwin-x86_64.d= mg2018-03-16 09:38 = 26M 
3D"[cmake-3.10.3-Darwin-x8= 6_64.tar.gz2018-03-16 09:38 26M 
3D"[TXT]"2018-03-16 09:38 33M 
3D"[cmake-3.10.3-Linux-x86_= 64.tar.gz2018-03-16 09:38 33M 
3D"[TXT]"2018-03-16 09:38 1.0K&nb= sp;
3D"[TXT]"2018-03-16 09:38 833  
3D"[cmake-3.10.3-win32-x86.msi2018-03-16 09:38 15M 
3D"[cmake-3.10.3-win32-x86.zip2018-03-16 09:38 21M 
3D"[cmake-3.10.3-win64-x64.msi2018-03-16 09:38 18M 
3D"[cmake-3.10.3-win64-x64.zip2018-03-16 09:38 25M 
3D"[cmake-3.10.3.tar.Z2018-03-16 09:38 12M 
3D"[cmake-3.10.3.tar.gz2018-03-16 09:38 7.5M <= /td>
3D"[cmake-3.10.3.zip2018-03-16 09:38 12M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.11/index.html b/b= itbake/lib/bb/tests/fetch-testdata/files/v3.11/index.html new file mode 100644 index 0000000..869d742 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.11/index.html @@ -0,0 +1,131 @@ + + + + Index of /files/v3.11 + + +

Index of /files/v3.11

+ + + + += + +cmake-3.11.0-Linux-x86_64.sh<= /td> + +cmake-3.11.0-SHA-256.txt +cmake-3.11.0-SHA-256.txt.asc<= /td> += + +cmake-3.11.0-rc1-Linux-x86_64= .sh + +cmake-3.11.0-rc1-SHA-256.txt<= /td> +cmake-3.11.0-rc1-SHA-256.txt.= asc += + += + +2018-02-15 11:52 +=   + += + +cmake-3.11.0-rc2-Linux-x86_64= .sh + +cmake-3.11.0-rc2-SHA-256.txt<= /td> +cmake-3.11.0-rc2-SHA-256.txt.= asc += + += + +2018-02-27 11:09 +=   + += + +cmake-3.11.0-rc3-Linux-x86_64= .sh + +cmake-3.11.0-rc3-SHA-256.txt<= /td> +cmake-3.11.0-rc3-SHA-256.txt.= asc += + += + +2018-03-09 13:45 +=   + += + +cmake-3.11.0-rc4-Linux-x86_64= .sh + +cmake-3.11.0-rc4-SHA-256.txt<= /td> +cmake-3.11.0-rc4-SHA-256.txt.= asc += + += + +2018-03-19 11:06 +=   + += = + += = + + + + += + +cmake-3.11.1-Linux-x86_64.sh<= /td> + +cmake-3.11.1-SHA-256.txt +cmake-3.11.1-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.11.2-Linux-x86_64.sh<= /td> + +cmake-3.11.2-SHA-256.txt +cmake-3.11.2-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.11.3-Linux-x86_64.sh<= /td> + +cmake-3.11.3-SHA-256.txt +cmake-3.11.3-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.11.4-Linux-x86_64.sh<= /td> + +cmake-3.11.4-SHA-256.txt +cmake-3.11.4-SHA-256.txt.asc<= /td> += = + += = + + + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.11.0-Darwin-x86_64.d= mg2018-03-28 13:40 = 26M 
3D"[cmake-3.11.0-Darwin-x8= 6_64.tar.gz2018-03-28 13:40 26M 
3D"[TXT]"2018-03-28 13:40 33M 
3D"[cmake-3.11.0-Linux-x86_= 64.tar.gz2018-03-28 13:40 33M 
3D"[TXT]"2018-03-28 13:40 1.0K&nb= sp;
3D"[TXT]"2018-03-28 13:40 833  
3D"[cmake-3.11.0-rc1-Darwin-= x86_64.dmg2018-02-15 11:53 26M 
3D"[cmake-3.11.0-rc1-D= arwin-x86_64.tar.gz2018-02-15 11:53 26M 
3D"[TXT]"2018-02-15 11:53 = 33M 
3D"[cmake-3.11.0-rc1-Li= nux-x86_64.tar.gz2018-02-15 11:53 33M 
3D"[TXT]"2018-02-15 11:53 1.0K 
3D"[TXT]"2018-02-15 11:53 = 833  
3D"[cmake-3.11.0-rc1-win32-x86.m= si2018-02-15 11:53 = 16M 
3D"[cmake-3.11.0-rc1-win32-x8= 6.zip2018-02-15 11:53 22M 
3D"[cmake-3.11.0-rc1-win64-x64.m= si2018-02-15 11:53 = 19M 
3D"[cmake-3.11.0-rc1-win64-x6= 4.zip2018-02-15 11:53 26M 
3D"[cmake-3.11.0-rc1.tar.Z 12M&= nbsp;
3D"[cmake-3.11.0-rc1.tar.gz2018-02-15 11:52 7.6M
3D"[cmake-3.11.0-rc1.zip2018-02-15 11:52 13M = ;
3D"[cmake-3.11.0-rc2-Darwin-= x86_64.dmg2018-02-27 11:09 26M 
3D"[cmake-3.11.0-rc2-D= arwin-x86_64.tar.gz2018-02-27 11:09 26M 
3D"[TXT]"2018-02-27 11:09 = 33M 
3D"[cmake-3.11.0-rc2-Li= nux-x86_64.tar.gz2018-02-27 11:09 33M 
3D"[TXT]"2018-02-27 11:09 1.0K 
3D"[TXT]"2018-02-27 11:09 = 833  
3D"[cmake-3.11.0-rc2-win32-x86.m= si2018-02-27 11:09 = 16M 
3D"[cmake-3.11.0-rc2-win32-x8= 6.zip2018-02-27 11:09 22M 
3D"[cmake-3.11.0-rc2-win64-x64.m= si2018-02-27 11:09 = 19M 
3D"[cmake-3.11.0-rc2-win64-x6= 4.zip2018-02-27 11:09 26M 
3D"[cmake-3.11.0-rc2.tar.Z 12M&= nbsp;
3D"[cmake-3.11.0-rc2.tar.gz2018-02-27 11:09 7.6M
3D"[cmake-3.11.0-rc2.zip2018-02-27 11:09 13M = ;
3D"[cmake-3.11.0-rc3-Darwin-= x86_64.dmg2018-03-09 13:46 26M 
3D"[cmake-3.11.0-rc3-D= arwin-x86_64.tar.gz2018-03-09 13:46 26M 
3D"[TXT]"2018-03-09 13:46 = 33M 
3D"[cmake-3.11.0-rc3-Li= nux-x86_64.tar.gz2018-03-09 13:46 33M 
3D"[TXT]"2018-03-09 13:46 1.0K 
3D"[TXT]"2018-03-09 13:46 = 833  
3D"[cmake-3.11.0-rc3-win32-x86.m= si2018-03-09 13:46 = 16M 
3D"[cmake-3.11.0-rc3-win32-x8= 6.zip2018-03-09 13:45 22M 
3D"[cmake-3.11.0-rc3-win64-x64.m= si2018-03-09 13:45 = 19M 
3D"[cmake-3.11.0-rc3-win64-x6= 4.zip2018-03-09 13:45 26M 
3D"[cmake-3.11.0-rc3.tar.Z 12M&= nbsp;
3D"[cmake-3.11.0-rc3.tar.gz2018-03-09 13:45 7.6M
3D"[cmake-3.11.0-rc3.zip2018-03-09 13:45 13M = ;
3D"[cmake-3.11.0-rc4-Darwin-= x86_64.dmg2018-03-19 11:07 26M 
3D"[cmake-3.11.0-rc4-D= arwin-x86_64.tar.gz2018-03-19 11:07 26M 
3D"[TXT]"2018-03-19 11:06 = 33M 
3D"[cmake-3.11.0-rc4-Li= nux-x86_64.tar.gz2018-03-19 11:06 33M 
3D"[TXT]"2018-03-19 11:06 1.0K 
3D"[TXT]"2018-03-19 11:06 = 833  
3D"[cmake-3.11.0-rc4-win32-x86.m= si2018-03-19 11:06 = 16M 
3D"[cmake-3.11.0-rc4-win32-x8= 6.zip2018-03-19 11:06 22M 
3D"[cmake-3.11.0-rc4-win64-x64.m= si2018-03-19 11:06 = 19M 
3D"[cmake-3.11.0-rc4-win64-x6= 4.zip2018-03-19 11:06 26M 
3D"[cmake-3.11.0-rc4.tar.Z 12M&= nbsp;
3D"[cmake-3.11.0-rc4.tar.gz2018-03-19 11:06 7.6M
3D"[cmake-3.11.0-rc4.zip2018-03-19 11:06 13M = ;
3D"[cmake-3.11.0-win32-x86.msi2018-03-28 13:40 16M 
3D"[cmake-3.11.0-win32-x86.zip2018-03-28 13:40 22M 
3D"[cmake-3.11.0-win64-x64.msi2018-03-28 13:40 19M 
3D"[cmake-3.11.0-win64-x64.zip2018-03-28 13:40 26M 
3D"[cmake-3.11.0.tar.Z2018-03-28 13:40 12M 
3D"[cmake-3.11.0.tar.gz2018-03-28 13:40 7.6M <= /td>
3D"[cmake-3.11.0.zip2018-03-28 13:40 13M 
3D"[cmake-3.11.1-Darwin-x86_64.d= mg2018-04-17 11:33 = 26M 
3D"[cmake-3.11.1-Darwin-x8= 6_64.tar.gz2018-04-17 11:32 26M 
3D"[TXT]"2018-04-17 11:32 33M 
3D"[cmake-3.11.1-Linux-x86_= 64.tar.gz2018-04-17 11:32 33M 
3D"[TXT]"2018-04-17 11:32 1.0K&nb= sp;
3D"[TXT]"2018-04-17 11:32 833  
3D"[cmake-3.11.1-win32-x86.msi2018-04-17 11:32 16M 
3D"[cmake-3.11.1-win32-x86.zip2018-04-17 11:32 22M 
3D"[cmake-3.11.1-win64-x64.msi2018-04-17 11:32 19M 
3D"[cmake-3.11.1-win64-x64.zip2018-04-17 11:32 26M 
3D"[cmake-3.11.1.tar.Z2018-04-17 11:32 12M 
3D"[cmake-3.11.1.tar.gz2018-04-17 11:32 7.6M <= /td>
3D"[cmake-3.11.1.zip2018-04-17 11:32 13M 
3D"[cmake-3.11.2-Darwin-x86_64.d= mg2018-05-17 12:45 = 26M 
3D"[cmake-3.11.2-Darwin-x8= 6_64.tar.gz2018-05-17 12:45 26M 
3D"[TXT]"2018-05-17 12:45 33M 
3D"[cmake-3.11.2-Linux-x86_= 64.tar.gz2018-05-17 12:45 33M 
3D"[TXT]"2018-05-17 12:45 1.0K&nb= sp;
3D"[TXT]"2018-05-17 12:45 833  
3D"[cmake-3.11.2-win32-x86.msi2018-05-17 12:45 16M 
3D"[cmake-3.11.2-win32-x86.zip2018-05-17 12:45 22M 
3D"[cmake-3.11.2-win64-x64.msi2018-05-17 12:45 18M 
3D"[cmake-3.11.2-win64-x64.zip2018-05-17 12:44 25M 
3D"[cmake-3.11.2.tar.Z2018-05-17 12:44 12M 
3D"[cmake-3.11.2.tar.gz2018-05-17 12:44 7.6M <= /td>
3D"[cmake-3.11.2.zip2018-05-17 12:44 13M 
3D"[cmake-3.11.3-Darwin-x86_64.d= mg2018-05-31 15:53 = 26M 
3D"[cmake-3.11.3-Darwin-x8= 6_64.tar.gz2018-05-31 15:53 26M 
3D"[TXT]"2018-05-31 15:53 33M 
3D"[cmake-3.11.3-Linux-x86_= 64.tar.gz2018-05-31 15:52 33M 
3D"[TXT]"2018-05-31 15:52 1.0K&nb= sp;
3D"[TXT]"2018-05-31 15:52 833  
3D"[cmake-3.11.3-win32-x86.msi2018-05-31 15:52 16M 
3D"[cmake-3.11.3-win32-x86.zip2018-05-31 15:52 22M 
3D"[cmake-3.11.3-win64-x64.msi2018-05-31 15:52 18M 
3D"[cmake-3.11.3-win64-x64.zip2018-05-31 15:52 25M 
3D"[cmake-3.11.3.tar.Z2018-05-31 15:52 12M 
3D"[cmake-3.11.3.tar.gz2018-05-31 15:52 7.6M <= /td>
3D"[cmake-3.11.3.zip2018-05-31 15:52 13M 
3D"[cmake-3.11.4-Darwin-x86_64.d= mg2018-06-14 13:50 = 26M 
3D"[cmake-3.11.4-Darwin-x8= 6_64.tar.gz2018-06-14 13:50 26M 
3D"[TXT]"2018-06-14 13:50 33M 
3D"[cmake-3.11.4-Linux-x86_= 64.tar.gz2018-06-14 13:50 33M 
3D"[TXT]"2018-06-14 13:50 1.0K&nb= sp;
3D"[TXT]"2018-06-14 13:50 833  
3D"[cmake-3.11.4-win32-x86.msi2018-06-14 13:50 16M 
3D"[cmake-3.11.4-win32-x86.zip2018-06-14 13:50 22M 
3D"[cmake-3.11.4-win64-x64.msi2018-06-14 13:50 18M 
3D"[cmake-3.11.4-win64-x64.zip2018-06-14 13:50 25M 
3D"[cmake-3.11.4.tar.Z2018-06-14 13:50 12M 
3D"[cmake-3.11.4.tar.gz2018-06-14 13:50 7.6M <= /td>
3D"[cmake-3.11.4.zip2018-06-14 13:50 13M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.12/index.html b/b= itbake/lib/bb/tests/fetch-testdata/files/v3.12/index.html new file mode 100644 index 0000000..1977e7e --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.12/index.html @@ -0,0 +1,118 @@ + + + + Index of /files/v3.12 + + +

Index of /files/v3.12

+ + + + += + +cmake-3.12.0-Linux-x86_64.sh<= /td> + +cmake-3.12.0-SHA-256.txt +cmake-3.12.0-SHA-256.txt.asc<= /td> += + +cmake-3.12.0-rc1-Linux-x86_64= .sh + +cmake-3.12.0-rc1-SHA-256.txt<= /td> +cmake-3.12.0-rc1-SHA-256.txt.= asc += + += + +2018-06-14 15:01 +=   + += + +cmake-3.12.0-rc2-Linux-x86_64= .sh + +cmake-3.12.0-rc2-SHA-256.txt<= /td> +cmake-3.12.0-rc2-SHA-256.txt.= asc += + += + +2018-06-29 13:56 +=   + += + +cmake-3.12.0-rc3-Linux-x86_64= .sh + +cmake-3.12.0-rc3-SHA-256.txt<= /td> +cmake-3.12.0-rc3-SHA-256.txt.= asc += + += + +2018-07-09 11:37 +=   + += = + += = + + + + += + +cmake-3.12.1-Linux-x86_64.sh<= /td> + +cmake-3.12.1-SHA-256.txt +cmake-3.12.1-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.12.2-Linux-x86_64.sh<= /td> + +cmake-3.12.2-SHA-256.txt +cmake-3.12.2-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.12.3-Linux-x86_64.sh<= /td> + +cmake-3.12.3-SHA-256.txt +cmake-3.12.3-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.12.4-Linux-x86_64.sh<= /td> + +cmake-3.12.4-SHA-256.txt +cmake-3.12.4-SHA-256.txt.asc<= /td> += = + += = + + + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.12.0-Darwin-x86_64.d= mg2018-07-17 09:58 = 27M 
3D"[cmake-3.12.0-Darwin-x8= 6_64.tar.gz2018-07-17 09:58 27M 
3D"[TXT]"2018-07-17 09:58 33M 
3D"[cmake-3.12.0-Linux-x86_= 64.tar.gz2018-07-17 09:58 33M 
3D"[TXT]"2018-07-17 09:58 1.0K&nb= sp;
3D"[TXT]"2018-07-17 09:58 833  
3D"[cmake-3.12.0-rc1-Darwin-= x86_64.dmg2018-06-14 15:01 27M 
3D"[cmake-3.12.0-rc1-D= arwin-x86_64.tar.gz2018-06-14 15:01 27M 
3D"[TXT]"2018-06-14 15:01 = 29M 
3D"[cmake-3.12.0-rc1-Li= nux-x86_64.tar.gz2018-06-14 15:01 29M 
3D"[TXT]"2018-06-14 15:01 1.0K 
3D"[TXT]"2018-06-14 15:01 = 833  
3D"[cmake-3.12.0-rc1-win32-x86.m= si2018-06-14 15:01 = 16M 
3D"[cmake-3.12.0-rc1-win32-x8= 6.zip2018-06-14 15:01 23M 
3D"[cmake-3.12.0-rc1-win64-x64.m= si2018-06-14 15:01 = 18M 
3D"[cmake-3.12.0-rc1-win64-x6= 4.zip2018-06-14 15:01 25M 
3D"[cmake-3.12.0-rc1.tar.Z 13M&= nbsp;
3D"[cmake-3.12.0-rc1.tar.gz2018-06-14 15:01 7.7M
3D"[cmake-3.12.0-rc1.zip2018-06-14 15:01 13M = ;
3D"[cmake-3.12.0-rc2-Darwin-= x86_64.dmg2018-06-29 13:57 27M 
3D"[cmake-3.12.0-rc2-D= arwin-x86_64.tar.gz2018-06-29 13:57 27M 
3D"[TXT]"2018-06-29 13:57 = 29M 
3D"[cmake-3.12.0-rc2-Li= nux-x86_64.tar.gz2018-06-29 13:57 29M 
3D"[TXT]"2018-06-29 13:57 1.0K 
3D"[TXT]"2018-06-29 13:57 = 833  
3D"[cmake-3.12.0-rc2-win32-x86.m= si2018-06-29 13:56 = 16M 
3D"[cmake-3.12.0-rc2-win32-x8= 6.zip2018-06-29 13:56 23M 
3D"[cmake-3.12.0-rc2-win64-x64.m= si2018-06-29 13:56 = 18M 
3D"[cmake-3.12.0-rc2-win64-x6= 4.zip2018-06-29 13:56 25M 
3D"[cmake-3.12.0-rc2.tar.Z 13M&= nbsp;
3D"[cmake-3.12.0-rc2.tar.gz2018-06-29 13:56 7.7M
3D"[cmake-3.12.0-rc2.zip2018-06-29 13:56 13M = ;
3D"[cmake-3.12.0-rc3-Darwin-= x86_64.dmg2018-07-09 11:38 27M 
3D"[cmake-3.12.0-rc3-D= arwin-x86_64.tar.gz2018-07-09 11:38 27M 
3D"[TXT]"2018-07-09 11:38 = 33M 
3D"[cmake-3.12.0-rc3-Li= nux-x86_64.tar.gz2018-07-09 11:38 33M 
3D"[TXT]"2018-07-09 11:38 1.0K 
3D"[TXT]"2018-07-09 11:38 = 833  
3D"[cmake-3.12.0-rc3-win32-x86.m= si2018-07-09 11:38 = 16M 
3D"[cmake-3.12.0-rc3-win32-x8= 6.zip2018-07-09 11:38 23M 
3D"[cmake-3.12.0-rc3-win64-x64.m= si2018-07-09 11:37 = 18M 
3D"[cmake-3.12.0-rc3-win64-x6= 4.zip2018-07-09 11:37 25M 
3D"[cmake-3.12.0-rc3.tar.Z 13M&= nbsp;
3D"[cmake-3.12.0-rc3.tar.gz2018-07-09 11:37 7.7M
3D"[cmake-3.12.0-rc3.zip2018-07-09 11:37 13M = ;
3D"[cmake-3.12.0-win32-x86.msi2018-07-17 09:58 16M 
3D"[cmake-3.12.0-win32-x86.zip2018-07-17 09:58 23M 
3D"[cmake-3.12.0-win64-x64.msi2018-07-17 09:58 18M 
3D"[cmake-3.12.0-win64-x64.zip2018-07-17 09:58 25M 
3D"[cmake-3.12.0.tar.Z2018-07-17 09:58 13M 
3D"[cmake-3.12.0.tar.gz2018-07-17 09:58 7.7M <= /td>
3D"[cmake-3.12.0.zip2018-07-17 09:57 13M 
3D"[cmake-3.12.1-Darwin-x86_64.d= mg2018-08-09 11:21 = 27M 
3D"[cmake-3.12.1-Darwin-x8= 6_64.tar.gz2018-08-09 11:21 27M 
3D"[TXT]"2018-08-09 11:21 33M 
3D"[cmake-3.12.1-Linux-x86_= 64.tar.gz2018-08-09 11:21 33M 
3D"[TXT]"2018-08-09 11:20 1.0K&nb= sp;
3D"[TXT]"2018-08-09 11:20 833  
3D"[cmake-3.12.1-win32-x86.msi2018-08-09 11:20 16M 
3D"[cmake-3.12.1-win32-x86.zip2018-08-09 11:20 23M 
3D"[cmake-3.12.1-win64-x64.msi2018-08-09 11:20 18M 
3D"[cmake-3.12.1-win64-x64.zip2018-08-09 11:20 25M 
3D"[cmake-3.12.1.tar.Z2018-08-09 11:20 13M 
3D"[cmake-3.12.1.tar.gz2018-08-09 11:20 7.7M <= /td>
3D"[cmake-3.12.1.zip2018-08-09 11:20 13M 
3D"[cmake-3.12.2-Darwin-x86_64.d= mg2018-09-07 12:51 = 28M 
3D"[cmake-3.12.2-Darwin-x8= 6_64.tar.gz2018-09-07 12:51 28M 
3D"[TXT]"2018-09-07 12:51 33M 
3D"[cmake-3.12.2-Linux-x86_= 64.tar.gz2018-09-07 12:51 33M 
3D"[TXT]"2018-09-07 12:51 1.0K&nb= sp;
3D"[TXT]"2018-09-07 12:51 833  
3D"[cmake-3.12.2-win32-x86.msi2018-09-07 12:51 16M 
3D"[cmake-3.12.2-win32-x86.zip2018-09-07 12:51 22M 
3D"[cmake-3.12.2-win64-x64.msi2018-09-07 12:51 18M 
3D"[cmake-3.12.2-win64-x64.zip2018-09-07 12:51 25M 
3D"[cmake-3.12.2.tar.Z2018-09-07 12:51 13M 
3D"[cmake-3.12.2.tar.gz2018-09-07 12:51 8.0M <= /td>
3D"[cmake-3.12.2.zip2018-09-07 12:51 13M 
3D"[cmake-3.12.3-Darwin-x86_64.d= mg2018-10-03 10:46 = 28M 
3D"[cmake-3.12.3-Darwin-x8= 6_64.tar.gz2018-10-03 10:46 28M 
3D"[TXT]"2018-10-03 10:45 33M 
3D"[cmake-3.12.3-Linux-x86_= 64.tar.gz2018-10-03 10:45 33M 
3D"[TXT]"2018-10-03 10:45 1.0K&nb= sp;
3D"[TXT]"2018-10-03 10:45 833  
3D"[cmake-3.12.3-win32-x86.msi2018-10-03 10:45 16M 
3D"[cmake-3.12.3-win32-x86.zip2018-10-03 10:45 22M 
3D"[cmake-3.12.3-win64-x64.msi2018-10-03 10:45 18M 
3D"[cmake-3.12.3-win64-x64.zip2018-10-03 10:45 25M 
3D"[cmake-3.12.3.tar.Z2018-10-03 10:45 13M 
3D"[cmake-3.12.3.tar.gz2018-10-03 10:45 8.0M <= /td>
3D"[cmake-3.12.3.zip2018-10-03 10:45 13M 
3D"[cmake-3.12.4-Darwin-x86_64.d= mg2018-11-02 13:51 = 28M 
3D"[cmake-3.12.4-Darwin-x8= 6_64.tar.gz2018-11-02 13:51 28M 
3D"[TXT]"2018-11-02 13:51 33M 
3D"[cmake-3.12.4-Linux-x86_= 64.tar.gz2018-11-02 13:51 33M 
3D"[TXT]"2018-11-02 13:51 1.0K&nb= sp;
3D"[TXT]"2018-11-02 13:51 833  
3D"[cmake-3.12.4-win32-x86.msi2018-11-02 13:51 16M 
3D"[cmake-3.12.4-win32-x86.zip2018-11-02 13:51 22M 
3D"[cmake-3.12.4-win64-x64.msi2018-11-02 13:51 18M 
3D"[cmake-3.12.4-win64-x64.zip2018-11-02 13:51 25M 
3D"[cmake-3.12.4.tar.Z2018-11-02 13:51 13M 
3D"[cmake-3.12.4.tar.gz2018-11-02 13:51 8.0M <= /td>
3D"[cmake-3.12.4.zip2018-11-02 13:51 13M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.13/index.html b/b= itbake/lib/bb/tests/fetch-testdata/files/v3.13/index.html new file mode 100644 index 0000000..b50a791 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.13/index.html @@ -0,0 +1,131 @@ + + + + Index of /files/v3.13 + + +

Index of /files/v3.13

+ + + + += + +cmake-3.13.0-Linux-x86_64.sh<= /td> + +cmake-3.13.0-SHA-256.txt +cmake-3.13.0-SHA-256.txt.asc<= /td> += + +cmake-3.13.0-rc1-Linux-x86_64= .sh + +cmake-3.13.0-rc1-SHA-256.txt<= /td> +cmake-3.13.0-rc1-SHA-256.txt.= asc += + += + +2018-10-09 11:32 +=   + += + +cmake-3.13.0-rc2-Linux-x86_64= .sh + +cmake-3.13.0-rc2-SHA-256.txt<= /td> +cmake-3.13.0-rc2-SHA-256.txt.= asc += + += + +2018-10-25 10:27 +=   + += + +cmake-3.13.0-rc3-Linux-x86_64= .sh + +cmake-3.13.0-rc3-SHA-256.txt<= /td> +cmake-3.13.0-rc3-SHA-256.txt.= asc += + += + +2018-11-07 12:11 +=   + += = + += = + + + + += + +cmake-3.13.1-Linux-x86_64.sh<= /td> + +cmake-3.13.1-SHA-256.txt +cmake-3.13.1-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.13.2-Linux-x86_64.sh<= /td> + +cmake-3.13.2-SHA-256.txt +cmake-3.13.2-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.13.3-Linux-x86_64.sh<= /td> + +cmake-3.13.3-SHA-256.txt +cmake-3.13.3-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.13.4-Linux-x86_64.sh<= /td> + +cmake-3.13.4-SHA-256.txt +cmake-3.13.4-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.13.5-Linux-x86_64.sh<= /td> + +cmake-3.13.5-SHA-256.txt +cmake-3.13.5-SHA-256.txt.asc<= /td> += = + += = + + + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.13.0-Darwin-x86_64.d= mg2018-11-20 14:05 = 31M 
3D"[cmake-3.13.0-Darwin-x8= 6_64.tar.gz2018-11-20 14:05 31M 
3D"[TXT]"2018-11-20 14:05 37M 
3D"[cmake-3.13.0-Linux-x86_= 64.tar.gz2018-11-20 14:05 37M 
3D"[TXT]"2018-11-20 14:05 1.0K&nb= sp;
3D"[TXT]"2018-11-20 14:05 833  
3D"[cmake-3.13.0-rc1-Darwin-= x86_64.dmg2018-10-09 11:32 29M 
3D"[cmake-3.13.0-rc1-D= arwin-x86_64.tar.gz2018-10-09 11:32 28M 
3D"[TXT]"2018-10-09 11:32 = 34M 
3D"[cmake-3.13.0-rc1-Li= nux-x86_64.tar.gz2018-10-09 11:32 34M 
3D"[TXT]"2018-10-09 11:32 1.0K 
3D"[TXT]"2018-10-09 11:32 = 833  
3D"[cmake-3.13.0-rc1-win32-x86.m= si2018-10-09 11:32 = 16M 
3D"[cmake-3.13.0-rc1-win32-x8= 6.zip2018-10-09 11:32 23M 
3D"[cmake-3.13.0-rc1-win64-x64.m= si2018-10-09 11:32 = 19M 
3D"[cmake-3.13.0-rc1-win64-x6= 4.zip2018-10-09 11:32 26M 
3D"[cmake-3.13.0-rc1.tar.Z 13M&= nbsp;
3D"[cmake-3.13.0-rc1.tar.gz2018-10-09 11:32 8.2M
3D"[cmake-3.13.0-rc1.zip2018-10-09 11:32 13M = ;
3D"[cmake-3.13.0-rc2-Darwin-= x86_64.dmg2018-10-25 10:28 31M 
3D"[cmake-3.13.0-rc2-D= arwin-x86_64.tar.gz2018-10-25 10:28 31M 
3D"[TXT]"2018-10-25 10:27 = 37M 
3D"[cmake-3.13.0-rc2-Li= nux-x86_64.tar.gz2018-10-25 10:27 37M 
3D"[TXT]"2018-10-25 10:27 1.0K 
3D"[TXT]"2018-10-25 10:27 = 833  
3D"[cmake-3.13.0-rc2-win32-x86.m= si2018-10-25 10:27 = 19M 
3D"[cmake-3.13.0-rc2-win32-x8= 6.zip2018-10-25 10:27 25M 
3D"[cmake-3.13.0-rc2-win64-x64.m= si2018-10-25 10:27 = 21M 
3D"[cmake-3.13.0-rc2-win64-x6= 4.zip2018-10-25 10:27 28M 
3D"[cmake-3.13.0-rc2.tar.Z 13M&= nbsp;
3D"[cmake-3.13.0-rc2.tar.gz2018-10-25 10:27 8.2M
3D"[cmake-3.13.0-rc2.zip2018-10-25 10:27 13M = ;
3D"[cmake-3.13.0-rc3-Darwin-= x86_64.dmg2018-11-07 12:11 31M 
3D"[cmake-3.13.0-rc3-D= arwin-x86_64.tar.gz2018-11-07 12:11 31M 
3D"[TXT]"2018-11-07 12:11 = 37M 
3D"[cmake-3.13.0-rc3-Li= nux-x86_64.tar.gz2018-11-07 12:11 37M 
3D"[TXT]"2018-11-07 12:11 1.0K 
3D"[TXT]"2018-11-07 12:11 = 833  
3D"[cmake-3.13.0-rc3-win32-x86.m= si2018-11-07 12:11 = 19M 
3D"[cmake-3.13.0-rc3-win32-x8= 6.zip2018-11-07 12:11 25M 
3D"[cmake-3.13.0-rc3-win64-x64.m= si2018-11-07 12:11 = 21M 
3D"[cmake-3.13.0-rc3-win64-x6= 4.zip2018-11-07 12:11 28M 
3D"[cmake-3.13.0-rc3.tar.Z 13M&= nbsp;
3D"[cmake-3.13.0-rc3.tar.gz2018-11-07 12:11 8.2M
3D"[cmake-3.13.0-rc3.zip2018-11-07 12:11 13M = ;
3D"[cmake-3.13.0-win32-x86.msi2018-11-20 14:05 19M 
3D"[cmake-3.13.0-win32-x86.zip2018-11-20 14:05 25M 
3D"[cmake-3.13.0-win64-x64.msi2018-11-20 14:05 21M 
3D"[cmake-3.13.0-win64-x64.zip2018-11-20 14:05 28M 
3D"[cmake-3.13.0.tar.Z2018-11-20 14:04 13M 
3D"[cmake-3.13.0.tar.gz2018-11-20 14:04 8.2M <= /td>
3D"[cmake-3.13.0.zip2018-11-20 14:04 13M 
3D"[cmake-3.13.1-Darwin-x86_64.d= mg2018-11-28 08:50 = 31M 
3D"[cmake-3.13.1-Darwin-x8= 6_64.tar.gz2018-11-28 08:50 31M 
3D"[TXT]"2018-11-28 08:50 37M 
3D"[cmake-3.13.1-Linux-x86_= 64.tar.gz2018-11-28 08:50 37M 
3D"[TXT]"2018-11-28 08:50 1.0K&nb= sp;
3D"[TXT]"2018-11-28 08:50 833  
3D"[cmake-3.13.1-win32-x86.msi2018-11-28 08:50 19M 
3D"[cmake-3.13.1-win32-x86.zip2018-11-28 08:50 25M 
3D"[cmake-3.13.1-win64-x64.msi2018-11-28 08:50 21M 
3D"[cmake-3.13.1-win64-x64.zip2018-11-28 08:50 28M 
3D"[cmake-3.13.1.tar.Z2018-11-28 08:50 13M 
3D"[cmake-3.13.1.tar.gz2018-11-28 08:50 8.2M <= /td>
3D"[cmake-3.13.1.zip2018-11-28 08:50 13M 
3D"[cmake-3.13.2-Darwin-x86_64.d= mg2018-12-13 08:41 = 31M 
3D"[cmake-3.13.2-Darwin-x8= 6_64.tar.gz2018-12-13 08:41 31M 
3D"[TXT]"2018-12-13 08:41 37M 
3D"[cmake-3.13.2-Linux-x86_= 64.tar.gz2018-12-13 08:41 37M 
3D"[TXT]"2018-12-13 08:41 1.0K&nb= sp;
3D"[TXT]"2018-12-13 08:41 833  
3D"[cmake-3.13.2-win32-x86.msi2018-12-13 08:41 19M 
3D"[cmake-3.13.2-win32-x86.zip2018-12-13 08:41 25M 
3D"[cmake-3.13.2-win64-x64.msi2018-12-13 08:41 21M 
3D"[cmake-3.13.2-win64-x64.zip2018-12-13 08:41 28M 
3D"[cmake-3.13.2.tar.Z2018-12-13 08:41 13M 
3D"[cmake-3.13.2.tar.gz2018-12-13 08:41 8.2M <= /td>
3D"[cmake-3.13.2.zip2018-12-13 08:41 13M 
3D"[cmake-3.13.3-Darwin-x86_64.d= mg2019-01-14 09:26 = 31M 
3D"[cmake-3.13.3-Darwin-x8= 6_64.tar.gz2019-01-14 09:26 31M 
3D"[TXT]"2019-01-14 09:25 37M 
3D"[cmake-3.13.3-Linux-x86_= 64.tar.gz2019-01-14 09:25 37M 
3D"[TXT]"2019-01-14 09:25 1.0K&nb= sp;
3D"[TXT]"2019-01-14 09:25 833  
3D"[cmake-3.13.3-win32-x86.msi2019-01-14 09:25 19M 
3D"[cmake-3.13.3-win32-x86.zip2019-01-14 09:25 25M 
3D"[cmake-3.13.3-win64-x64.msi2019-01-14 09:25 21M 
3D"[cmake-3.13.3-win64-x64.zip2019-01-14 09:25 28M 
3D"[cmake-3.13.3.tar.Z2019-01-14 09:25 13M 
3D"[cmake-3.13.3.tar.gz2019-01-14 09:25 8.2M <= /td>
3D"[cmake-3.13.3.zip2019-01-14 09:25 13M 
3D"[cmake-3.13.4-Darwin-x86_64.d= mg2019-02-01 13:20 = 31M 
3D"[cmake-3.13.4-Darwin-x8= 6_64.tar.gz2019-02-01 13:20 31M 
3D"[TXT]"2019-02-01 13:20 37M 
3D"[cmake-3.13.4-Linux-x86_= 64.tar.gz2019-02-01 13:20 37M 
3D"[TXT]"2019-02-01 13:20 1.0K&nb= sp;
3D"[TXT]"2019-02-01 13:20 833  
3D"[cmake-3.13.4-win32-x86.msi2019-02-01 13:20 19M 
3D"[cmake-3.13.4-win32-x86.zip2019-02-01 13:20 25M 
3D"[cmake-3.13.4-win64-x64.msi2019-02-01 13:20 21M 
3D"[cmake-3.13.4-win64-x64.zip2019-02-01 13:20 28M 
3D"[cmake-3.13.4.tar.Z2019-02-01 13:20 13M 
3D"[cmake-3.13.4.tar.gz2019-02-01 13:20 8.2M <= /td>
3D"[cmake-3.13.4.zip2019-02-01 13:20 13M 
3D"[cmake-3.13.5-Darwin-x86_64.d= mg2019-05-14 12:44 = 31M 
3D"[cmake-3.13.5-Darwin-x8= 6_64.tar.gz2019-05-14 12:44 31M 
3D"[TXT]"2019-05-14 12:44 37M 
3D"[cmake-3.13.5-Linux-x86_= 64.tar.gz2019-05-14 12:44 37M 
3D"[TXT]"2019-05-14 12:43 1.0K&nb= sp;
3D"[TXT]"2019-05-14 12:43 833  
3D"[cmake-3.13.5-win32-x86.msi2019-05-14 12:43 19M 
3D"[cmake-3.13.5-win32-x86.zip2019-05-14 12:43 25M 
3D"[cmake-3.13.5-win64-x64.msi2019-05-14 12:43 21M 
3D"[cmake-3.13.5-win64-x64.zip2019-05-14 12:43 28M 
3D"[cmake-3.13.5.tar.Z2019-05-14 12:43 13M 
3D"[cmake-3.13.5.tar.gz2019-05-14 12:43 8.2M <= /td>
3D"[cmake-3.13.5.zip2019-05-14 12:43 13M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.14/index.html b/b= itbake/lib/bb/tests/fetch-testdata/files/v3.14/index.html new file mode 100644 index 0000000..bec9c14 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.14/index.html @@ -0,0 +1,170 @@ + + + + Index of /files/v3.14 + + +

Index of /files/v3.14

+ + + + += + +cmake-3.14.0-Linux-x86_64.sh<= /td> + +cmake-3.14.0-SHA-256.txt +cmake-3.14.0-SHA-256.txt.asc<= /td> += + +cmake-3.14.0-rc1-Linux-x86_64= .sh + +cmake-3.14.0-rc1-SHA-256.txt<= /td> +cmake-3.14.0-rc1-SHA-256.txt.= asc += + += + +2019-02-07 10:36 +=   + += + +cmake-3.14.0-rc2-Linux-x86_64= .sh + +cmake-3.14.0-rc2-SHA-256.txt<= /td> +cmake-3.14.0-rc2-SHA-256.txt.= asc += + += + +2019-02-15 10:03 +=   + += + +cmake-3.14.0-rc3-Linux-x86_64= .sh + +cmake-3.14.0-rc3-SHA-256.txt<= /td> +cmake-3.14.0-rc3-SHA-256.txt.= asc += + += + +2019-03-01 11:20 +=   + += + +cmake-3.14.0-rc4-Linux-x86_64= .sh + +cmake-3.14.0-rc4-SHA-256.txt<= /td> +cmake-3.14.0-rc4-SHA-256.txt.= asc += + += + +2019-03-08 11:08 +=   + += = + += = + + + + += + +cmake-3.14.1-Linux-x86_64.sh<= /td> + +cmake-3.14.1-SHA-256.txt +cmake-3.14.1-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.14.2-Linux-x86_64.sh<= /td> + +cmake-3.14.2-SHA-256.txt +cmake-3.14.2-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.14.3-Linux-x86_64.sh<= /td> + +cmake-3.14.3-SHA-256.txt +cmake-3.14.3-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.14.4-Linux-x86_64.sh<= /td> + +cmake-3.14.4-SHA-256.txt +cmake-3.14.4-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.14.5-Linux-x86_64.sh<= /td> + +cmake-3.14.5-SHA-256.txt +cmake-3.14.5-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.14.6-Linux-x86_64.sh<= /td> + +cmake-3.14.6-SHA-256.txt +cmake-3.14.6-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.14.7-Linux-x86_64.sh<= /td> + +cmake-3.14.7-SHA-256.txt +cmake-3.14.7-SHA-256.txt.asc<= /td> += = + += = + + + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.14.0-Darwin-x86_64.d= mg2019-03-14 11:37 = 33M 
3D"[cmake-3.14.0-Darwin-x8= 6_64.tar.gz2019-03-14 11:37 32M 
3D"[TXT]"2019-03-14 11:37 35M 
3D"[cmake-3.14.0-Linux-x86_= 64.tar.gz2019-03-14 11:37 35M 
3D"[TXT]"2019-03-22 11:03 1.0K&nb= sp;
3D"[TXT]"2019-03-22 11:03 833  
3D"[cmake-3.14.0-rc1-Darwin-= x86_64.dmg2019-02-07 10:36 33M 
3D"[cmake-3.14.0-rc1-D= arwin-x86_64.tar.gz2019-02-07 10:36 32M 
3D"[TXT]"2019-02-07 10:36 = 35M 
3D"[cmake-3.14.0-rc1-Li= nux-x86_64.tar.gz2019-02-07 10:36 35M 
3D"[TXT]"2019-02-07 10:36 1.0K 
3D"[TXT]"2019-02-07 10:36 = 833  
3D"[cmake-3.14.0-rc1-win32-x86.m= si2019-02-07 10:36 = 19M 
3D"[cmake-3.14.0-rc1-win32-x8= 6.zip2019-02-07 10:36 26M 
3D"[cmake-3.14.0-rc1-win64-x64.m= si2019-02-07 10:36 = 22M 
3D"[cmake-3.14.0-rc1-win64-x6= 4.zip2019-02-07 10:36 29M 
3D"[cmake-3.14.0-rc1.tar.Z 14M&= nbsp;
3D"[cmake-3.14.0-rc1.tar.gz2019-02-07 10:35 8.4M
3D"[cmake-3.14.0-rc1.zip2019-02-07 10:35 14M = ;
3D"[cmake-3.14.0-rc2-Darwin-= x86_64.dmg2019-02-15 10:04 33M 
3D"[cmake-3.14.0-rc2-D= arwin-x86_64.tar.gz2019-02-15 10:04 32M 
3D"[TXT]"2019-02-15 10:04 = 35M 
3D"[cmake-3.14.0-rc2-Li= nux-x86_64.tar.gz2019-02-15 10:04 35M 
3D"[TXT]"2019-02-15 10:04 1.0K 
3D"[TXT]"2019-02-15 10:04 = 833  
3D"[cmake-3.14.0-rc2-win32-x86.m= si2019-02-15 10:04 = 19M 
3D"[cmake-3.14.0-rc2-win32-x8= 6.zip2019-02-15 10:04 26M 
3D"[cmake-3.14.0-rc2-win64-x64.m= si2019-02-15 10:03 = 22M 
3D"[cmake-3.14.0-rc2-win64-x6= 4.zip2019-02-15 10:03 29M 
3D"[cmake-3.14.0-rc2.tar.Z 14M&= nbsp;
3D"[cmake-3.14.0-rc2.tar.gz2019-02-15 10:03 8.4M
3D"[cmake-3.14.0-rc2.zip2019-02-15 10:03 14M = ;
3D"[cmake-3.14.0-rc3-Darwin-= x86_64.dmg2019-03-01 11:20 33M 
3D"[cmake-3.14.0-rc3-D= arwin-x86_64.tar.gz2019-03-01 11:20 32M 
3D"[TXT]"2019-03-01 11:20 = 35M 
3D"[cmake-3.14.0-rc3-Li= nux-x86_64.tar.gz2019-03-01 11:20 35M 
3D"[TXT]"2019-03-01 11:20 1.0K 
3D"[TXT]"2019-03-01 11:20 = 833  
3D"[cmake-3.14.0-rc3-win32-x86.m= si2019-03-01 11:20 = 19M 
3D"[cmake-3.14.0-rc3-win32-x8= 6.zip2019-03-01 11:20 26M 
3D"[cmake-3.14.0-rc3-win64-x64.m= si2019-03-01 11:20 = 22M 
3D"[cmake-3.14.0-rc3-win64-x6= 4.zip2019-03-01 11:20 29M 
3D"[cmake-3.14.0-rc3.tar.Z 14M&= nbsp;
3D"[cmake-3.14.0-rc3.tar.gz2019-03-01 11:19 8.4M
3D"[cmake-3.14.0-rc3.zip2019-03-01 11:19 14M = ;
3D"[cmake-3.14.0-rc4-Darwin-= x86_64.dmg2019-03-08 11:09 33M 
3D"[cmake-3.14.0-rc4-D= arwin-x86_64.tar.gz2019-03-08 11:09 32M 
3D"[TXT]"2019-03-08 11:09 = 35M 
3D"[cmake-3.14.0-rc4-Li= nux-x86_64.tar.gz2019-03-08 11:09 35M 
3D"[TXT]"2019-03-08 11:09 1.0K 
3D"[TXT]"2019-03-08 11:09 = 833  
3D"[cmake-3.14.0-rc4-win32-x86.m= si2019-03-08 11:08 = 20M 
3D"[cmake-3.14.0-rc4-win32-x8= 6.zip2019-03-08 11:08 26M 
3D"[cmake-3.14.0-rc4-win64-x64.m= si2019-03-08 11:08 = 22M 
3D"[cmake-3.14.0-rc4-win64-x6= 4.zip2019-03-08 11:08 30M 
3D"[cmake-3.14.0-rc4.tar.Z 14M&= nbsp;
3D"[cmake-3.14.0-rc4.tar.gz2019-03-08 11:08 8.4M
3D"[cmake-3.14.0-rc4.zip2019-03-08 11:08 14M = ;
3D"[cmake-3.14.0-win32-x86.msi2019-03-14 11:36 20M 
3D"[cmake-3.14.0-win32-x86.zip2019-03-14 11:36 26M 
3D"[cmake-3.14.0-win64-x64.msi2019-03-22 11:03 22M 
3D"[cmake-3.14.0-win64-x64.zip2019-03-22 11:03 30M 
3D"[cmake-3.14.0.tar.Z2019-03-14 11:36 14M 
3D"[cmake-3.14.0.tar.gz2019-03-14 11:36 8.4M <= /td>
3D"[cmake-3.14.0.zip2019-03-14 11:36 14M 
3D"[cmake-3.14.1-Darwin-x86_64.d= mg2019-03-29 12:20 = 33M 
3D"[cmake-3.14.1-Darwin-x8= 6_64.tar.gz2019-03-29 12:20 32M 
3D"[TXT]"2019-03-29 12:20 35M 
3D"[cmake-3.14.1-Linux-x86_= 64.tar.gz2019-03-29 12:19 35M 
3D"[TXT]"2019-03-29 12:19 1.0K&nb= sp;
3D"[TXT]"2019-03-29 12:19 833  
3D"[cmake-3.14.1-win32-x86.msi2019-03-29 12:19 20M 
3D"[cmake-3.14.1-win32-x86.zip2019-03-29 12:19 26M 
3D"[cmake-3.14.1-win64-x64.msi2019-03-29 12:19 22M 
3D"[cmake-3.14.1-win64-x64.zip2019-03-29 12:19 30M 
3D"[cmake-3.14.1.tar.Z2019-03-29 12:19 14M 
3D"[cmake-3.14.1.tar.gz2019-03-29 12:19 8.4M <= /td>
3D"[cmake-3.14.1.zip2019-03-29 12:19 14M 
3D"[cmake-3.14.2-Darwin-x86_64.d= mg2019-04-12 10:19 = 33M 
3D"[cmake-3.14.2-Darwin-x8= 6_64.tar.gz2019-04-12 10:19 32M 
3D"[TXT]"2019-04-12 10:19 35M 
3D"[cmake-3.14.2-Linux-x86_= 64.tar.gz2019-04-12 10:19 35M 
3D"[TXT]"2019-04-12 10:19 1.0K&nb= sp;
3D"[TXT]"2019-04-12 10:19 833  
3D"[cmake-3.14.2-win32-x86.msi2019-04-12 10:19 20M 
3D"[cmake-3.14.2-win32-x86.zip2019-04-12 10:19 26M 
3D"[cmake-3.14.2-win64-x64.msi2019-04-12 10:19 22M 
3D"[cmake-3.14.2-win64-x64.zip2019-04-12 10:19 30M 
3D"[cmake-3.14.2.tar.Z2019-04-12 10:19 14M 
3D"[cmake-3.14.2.tar.gz2019-04-12 10:19 8.4M <= /td>
3D"[cmake-3.14.2.zip2019-04-12 10:19 14M 
3D"[cmake-3.14.3-Darwin-x86_64.d= mg2019-04-22 10:40 = 33M 
3D"[cmake-3.14.3-Darwin-x8= 6_64.tar.gz2019-04-22 10:39 32M 
3D"[TXT]"2019-04-22 10:39 35M 
3D"[cmake-3.14.3-Linux-x86_= 64.tar.gz2019-04-22 10:39 35M 
3D"[TXT]"2019-04-22 10:39 1.0K&nb= sp;
3D"[TXT]"2019-04-22 10:39 833  
3D"[cmake-3.14.3-win32-x86.msi2019-04-22 10:39 20M 
3D"[cmake-3.14.3-win32-x86.zip2019-04-22 10:39 26M 
3D"[cmake-3.14.3-win64-x64.msi2019-04-22 10:39 22M 
3D"[cmake-3.14.3-win64-x64.zip2019-04-22 10:39 30M 
3D"[cmake-3.14.3.tar.Z2019-04-22 10:39 14M 
3D"[cmake-3.14.3.tar.gz2019-04-22 10:39 8.4M <= /td>
3D"[cmake-3.14.3.zip2019-04-22 10:39 14M 
3D"[cmake-3.14.4-Darwin-x86_64.d= mg2019-05-14 14:00 = 33M 
3D"[cmake-3.14.4-Darwin-x8= 6_64.tar.gz2019-05-14 14:00 32M 
3D"[TXT]"2019-05-14 14:00 35M 
3D"[cmake-3.14.4-Linux-x86_= 64.tar.gz2019-05-14 13:59 35M 
3D"[TXT]"2019-05-14 13:59 1.0K&nb= sp;
3D"[TXT]"2019-05-14 13:59 833  
3D"[cmake-3.14.4-win32-x86.msi2019-05-14 13:59 20M 
3D"[cmake-3.14.4-win32-x86.zip2019-05-14 13:59 26M 
3D"[cmake-3.14.4-win64-x64.msi2019-05-14 13:59 22M 
3D"[cmake-3.14.4-win64-x64.zip2019-05-14 13:59 30M 
3D"[cmake-3.14.4.tar.Z2019-05-14 13:59 14M 
3D"[cmake-3.14.4.tar.gz2019-05-14 13:59 8.4M <= /td>
3D"[cmake-3.14.4.zip2019-05-14 13:59 14M 
3D"[cmake-3.14.5-Darwin-x86_64.d= mg2019-05-31 12:39 = 33M 
3D"[cmake-3.14.5-Darwin-x8= 6_64.tar.gz2019-05-31 12:39 32M 
3D"[TXT]"2019-05-31 12:39 35M 
3D"[cmake-3.14.5-Linux-x86_= 64.tar.gz2019-05-31 12:39 35M 
3D"[TXT]"2019-05-31 12:39 1.0K&nb= sp;
3D"[TXT]"2019-05-31 12:39 833  
3D"[cmake-3.14.5-win32-x86.msi2019-05-31 12:39 20M 
3D"[cmake-3.14.5-win32-x86.zip2019-05-31 12:39 26M 
3D"[cmake-3.14.5-win64-x64.msi2019-05-31 12:39 22M 
3D"[cmake-3.14.5-win64-x64.zip2019-05-31 12:39 30M 
3D"[cmake-3.14.5.tar.Z2019-05-31 12:39 14M 
3D"[cmake-3.14.5.tar.gz2019-05-31 12:39 8.4M <= /td>
3D"[cmake-3.14.5.zip2019-05-31 12:40 14M 
3D"[cmake-3.14.6-Darwin-x86_64.d= mg2019-07-16 09:33 = 33M 
3D"[cmake-3.14.6-Darwin-x8= 6_64.tar.gz2019-07-16 09:33 32M 
3D"[TXT]"2019-07-16 09:33 35M 
3D"[cmake-3.14.6-Linux-x86_= 64.tar.gz2019-07-16 09:33 35M 
3D"[TXT]"2019-07-16 09:33 1.0K&nb= sp;
3D"[TXT]"2019-07-16 09:33 833  
3D"[cmake-3.14.6-win32-x86.msi2019-07-16 09:34 20M 
3D"[cmake-3.14.6-win32-x86.zip2019-07-16 09:34 26M 
3D"[cmake-3.14.6-win64-x64.msi2019-07-16 09:34 22M 
3D"[cmake-3.14.6-win64-x64.zip2019-07-16 09:34 30M 
3D"[cmake-3.14.6.tar.Z2019-07-16 09:34 14M 
3D"[cmake-3.14.6.tar.gz2019-07-16 09:34 8.5M <= /td>
3D"[cmake-3.14.6.zip2019-07-16 09:34 14M 
3D"[cmake-3.14.7-Darwin-x86_64.d= mg2019-10-02 10:48 = 33M 
3D"[cmake-3.14.7-Darwin-x8= 6_64.tar.gz2019-10-02 10:48 32M 
3D"[TXT]"2019-10-02 10:48 35M 
3D"[cmake-3.14.7-Linux-x86_= 64.tar.gz2019-10-02 10:48 35M 
3D"[TXT]"2019-10-02 10:48 1.0K&nb= sp;
3D"[TXT]"2019-10-02 10:48 833  
3D"[cmake-3.14.7-win32-x86.msi2019-10-02 10:48 20M 
3D"[cmake-3.14.7-win32-x86.zip2019-10-02 10:48 26M 
3D"[cmake-3.14.7-win64-x64.msi2019-10-02 10:48 21M 
3D"[cmake-3.14.7-win64-x64.zip2019-10-02 10:48 29M 
3D"[cmake-3.14.7.tar.Z2019-10-02 10:48 14M 
3D"[cmake-3.14.7.tar.gz2019-10-02 10:48 8.5M <= /td>
3D"[cmake-3.14.7.zip2019-10-02 10:48 14M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.15/index.html b/b= itbake/lib/bb/tests/fetch-testdata/files/v3.15/index.html new file mode 100644 index 0000000..9272676 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.15/index.html @@ -0,0 +1,157 @@ + + + + Index of /files/v3.15 + + +

Index of /files/v3.15

+ + + + += + +cmake-3.15.0-Linux-x86_64.sh<= /td> + +cmake-3.15.0-SHA-256.txt +cmake-3.15.0-SHA-256.txt.asc<= /td> += + +cmake-3.15.0-rc1-Linux-x86_64= .sh + +cmake-3.15.0-rc1-SHA-256.txt<= /td> +cmake-3.15.0-rc1-SHA-256.txt.= asc += + += + +2019-06-04 14:23 +=   + += + +cmake-3.15.0-rc2-Linux-x86_64= .sh + +cmake-3.15.0-rc2-SHA-256.txt<= /td> +cmake-3.15.0-rc2-SHA-256.txt.= asc += + += + +2019-06-19 10:04 +=   + += + +cmake-3.15.0-rc3-Linux-x86_64= .sh + +cmake-3.15.0-rc3-SHA-256.txt<= /td> +cmake-3.15.0-rc3-SHA-256.txt.= asc += + += + +2019-06-27 11:33 +=   + += + +cmake-3.15.0-rc4-Linux-x86_64= .sh + +cmake-3.15.0-rc4-SHA-256.txt<= /td> +cmake-3.15.0-rc4-SHA-256.txt.= asc += + += + +2019-07-10 15:07 +=   + += = + += = + + + + += + +cmake-3.15.1-Linux-x86_64.sh<= /td> + +cmake-3.15.1-SHA-256.txt +cmake-3.15.1-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.15.2-Linux-x86_64.sh<= /td> + +cmake-3.15.2-SHA-256.txt +cmake-3.15.2-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.15.3-Linux-x86_64.sh<= /td> + +cmake-3.15.3-SHA-256.txt +cmake-3.15.3-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.15.4-Linux-x86_64.sh<= /td> + +cmake-3.15.4-SHA-256.txt +cmake-3.15.4-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.15.5-Linux-x86_64.sh<= /td> + +cmake-3.15.5-SHA-256.txt +cmake-3.15.5-SHA-256.txt.asc<= /td> += = + += = + + + + += + +cmake-3.15.6-Linux-x86_64.sh<= /td> + +cmake-3.15.6-SHA-256.txt +cmake-3.15.6-SHA-256.txt.asc<= /td> += = + += = + + + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.15.0-Darwin-x86_64.d= mg2019-07-17 10:38 = 33M 
3D"[cmake-3.15.0-Darwin-x8= 6_64.tar.gz2019-07-17 10:38 33M 
3D"[TXT]"2019-07-17 10:38 37M 
3D"[cmake-3.15.0-Linux-x86_= 64.tar.gz2019-07-17 10:38 37M 
3D"[TXT]"2019-07-17 10:38 1.0K&nb= sp;
3D"[TXT]"2019-07-17 10:38 833  
3D"[cmake-3.15.0-rc1-Darwin-= x86_64.dmg2019-06-04 14:22 33M 
3D"[cmake-3.15.0-rc1-D= arwin-x86_64.tar.gz2019-06-04 14:22 33M 
3D"[TXT]"2019-06-04 14:22 = 37M 
3D"[cmake-3.15.0-rc1-Li= nux-x86_64.tar.gz2019-06-04 14:22 37M 
3D"[TXT]"2019-06-04 14:22 1.0K 
3D"[TXT]"2019-06-04 14:22 = 833  
3D"[cmake-3.15.0-rc1-win32-x86.m= si2019-06-04 14:23 = 20M 
3D"[cmake-3.15.0-rc1-win32-x8= 6.zip2019-06-04 14:23 28M 
3D"[cmake-3.15.0-rc1-win64-x64.m= si2019-06-04 14:23 = 23M 
3D"[cmake-3.15.0-rc1-win64-x6= 4.zip2019-06-04 14:23 31M 
3D"[cmake-3.15.0-rc1.tar.Z 14M&= nbsp;
3D"[cmake-3.15.0-rc1.tar.gz2019-06-04 14:22 8.8M
3D"[cmake-3.15.0-rc1.zip2019-06-04 14:23 15M = ;
3D"[cmake-3.15.0-rc2-Darwin-= x86_64.dmg2019-06-19 10:04 33M 
3D"[cmake-3.15.0-rc2-D= arwin-x86_64.tar.gz2019-06-19 10:04 33M 
3D"[TXT]"2019-06-19 10:04 = 37M 
3D"[cmake-3.15.0-rc2-Li= nux-x86_64.tar.gz2019-06-19 10:04 37M 
3D"[TXT]"2019-06-19 10:04 1.0K 
3D"[TXT]"2019-06-19 10:04 = 833  
3D"[cmake-3.15.0-rc2-win32-x86.m= si2019-06-19 10:04 = 20M 
3D"[cmake-3.15.0-rc2-win32-x8= 6.zip2019-06-19 10:04 28M 
3D"[cmake-3.15.0-rc2-win64-x64.m= si2019-06-19 10:04 = 23M 
3D"[cmake-3.15.0-rc2-win64-x6= 4.zip2019-06-19 10:04 31M 
3D"[cmake-3.15.0-rc2.tar.Z 14M&= nbsp;
3D"[cmake-3.15.0-rc2.tar.gz2019-06-19 10:04 8.8M
3D"[cmake-3.15.0-rc2.zip2019-06-19 10:04 15M = ;
3D"[cmake-3.15.0-rc3-Darwin-= x86_64.dmg2019-06-27 11:33 33M 
3D"[cmake-3.15.0-rc3-D= arwin-x86_64.tar.gz2019-06-27 11:33 33M 
3D"[TXT]"2019-06-27 11:33 = 37M 
3D"[cmake-3.15.0-rc3-Li= nux-x86_64.tar.gz2019-06-27 11:33 37M 
3D"[TXT]"2019-06-27 11:33 1.0K 
3D"[TXT]"2019-06-27 11:33 = 833  
3D"[cmake-3.15.0-rc3-win32-x86.m= si2019-06-27 11:33 = 20M 
3D"[cmake-3.15.0-rc3-win32-x8= 6.zip2019-06-27 11:33 28M 
3D"[cmake-3.15.0-rc3-win64-x64.m= si2019-06-27 11:33 = 23M 
3D"[cmake-3.15.0-rc3-win64-x6= 4.zip2019-06-27 11:33 31M 
3D"[cmake-3.15.0-rc3.tar.Z 14M&= nbsp;
3D"[cmake-3.15.0-rc3.tar.gz2019-06-27 11:33 8.8M
3D"[cmake-3.15.0-rc3.zip2019-06-27 11:33 15M = ;
3D"[cmake-3.15.0-rc4-Darwin-= x86_64.dmg2019-07-10 15:06 33M 
3D"[cmake-3.15.0-rc4-D= arwin-x86_64.tar.gz2019-07-10 15:07 33M 
3D"[TXT]"2019-07-10 15:07 = 37M 
3D"[cmake-3.15.0-rc4-Li= nux-x86_64.tar.gz2019-07-10 15:07 37M 
3D"[TXT]"2019-07-10 15:07 1.0K 
3D"[TXT]"2019-07-10 15:07 = 833  
3D"[cmake-3.15.0-rc4-win32-x86.m= si2019-07-10 15:07 = 20M 
3D"[cmake-3.15.0-rc4-win32-x8= 6.zip2019-07-10 15:07 28M 
3D"[cmake-3.15.0-rc4-win64-x64.m= si2019-07-10 15:07 = 23M 
3D"[cmake-3.15.0-rc4-win64-x6= 4.zip2019-07-10 15:07 31M 
3D"[cmake-3.15.0-rc4.tar.Z 14M&= nbsp;
3D"[cmake-3.15.0-rc4.tar.gz2019-07-10 15:07 8.8M
3D"[cmake-3.15.0-rc4.zip2019-07-10 15:07 15M = ;
3D"[cmake-3.15.0-win32-x86.msi2019-07-17 10:38 20M 
3D"[cmake-3.15.0-win32-x86.zip2019-07-17 10:38 27M 
3D"[cmake-3.15.0-win64-x64.msi2019-07-17 10:38 23M 
3D"[cmake-3.15.0-win64-x64.zip2019-07-17 10:38 31M 
3D"[cmake-3.15.0.tar.Z2019-07-17 10:38 14M 
3D"[cmake-3.15.0.tar.gz2019-07-17 10:38 8.8M <= /td>
3D"[cmake-3.15.0.zip2019-07-17 10:38 15M 
3D"[cmake-3.15.1-Darwin-x86_64.d= mg2019-07-26 10:14 = 33M 
3D"[cmake-3.15.1-Darwin-x8= 6_64.tar.gz2019-07-26 10:14 33M 
3D"[TXT]"2019-07-26 10:14 37M 
3D"[cmake-3.15.1-Linux-x86_= 64.tar.gz2019-07-26 10:14 37M 
3D"[TXT]"2019-07-26 10:14 1.0K&nb= sp;
3D"[TXT]"2019-07-26 10:14 833  
3D"[cmake-3.15.1-win32-x86.msi2019-07-26 10:14 20M 
3D"[cmake-3.15.1-win32-x86.zip2019-07-26 10:14 27M 
3D"[cmake-3.15.1-win64-x64.msi2019-07-26 10:14 23M 
3D"[cmake-3.15.1-win64-x64.zip2019-07-26 10:14 31M 
3D"[cmake-3.15.1.tar.Z2019-07-26 10:14 14M 
3D"[cmake-3.15.1.tar.gz2019-07-26 10:14 8.8M <= /td>
3D"[cmake-3.15.1.zip2019-07-26 10:15 15M 
3D"[cmake-3.15.2-Darwin-x86_64.d= mg2019-08-07 15:05 = 33M 
3D"[cmake-3.15.2-Darwin-x8= 6_64.tar.gz2019-08-07 15:05 33M 
3D"[TXT]"2019-08-07 15:05 37M 
3D"[cmake-3.15.2-Linux-x86_= 64.tar.gz2019-08-07 15:05 37M 
3D"[TXT]"2019-08-07 15:05 1.0K&nb= sp;
3D"[TXT]"2019-08-07 15:05 833  
3D"[cmake-3.15.2-win32-x86.msi2019-08-07 15:05 20M 
3D"[cmake-3.15.2-win32-x86.zip2019-08-07 15:05 27M 
3D"[cmake-3.15.2-win64-x64.msi2019-08-07 15:05 23M 
3D"[cmake-3.15.2-win64-x64.zip2019-08-07 15:05 31M 
3D"[cmake-3.15.2.tar.Z2019-08-07 15:05 14M 
3D"[cmake-3.15.2.tar.gz2019-08-07 15:05 8.8M <= /td>
3D"[cmake-3.15.2.zip2019-08-07 15:05 15M 
3D"[cmake-3.15.3-Darwin-x86_64.d= mg2019-09-04 11:13 = 33M 
3D"[cmake-3.15.3-Darwin-x8= 6_64.tar.gz2019-09-04 11:13 33M 
3D"[TXT]"2019-09-04 11:13 37M 
3D"[cmake-3.15.3-Linux-x86_= 64.tar.gz2019-09-04 11:13 37M 
3D"[TXT]"2019-09-04 11:13 1.0K&nb= sp;
3D"[TXT]"2019-09-04 11:13 833  
3D"[cmake-3.15.3-win32-x86.msi2019-09-04 11:13 20M 
3D"[cmake-3.15.3-win32-x86.zip2019-09-04 11:13 27M 
3D"[cmake-3.15.3-win64-x64.msi2019-09-04 11:13 23M 
3D"[cmake-3.15.3-win64-x64.zip2019-09-04 11:13 31M 
3D"[cmake-3.15.3.tar.Z2019-09-04 11:13 14M 
3D"[cmake-3.15.3.tar.gz2019-09-04 11:13 8.8M <= /td>
3D"[cmake-3.15.3.zip2019-09-04 11:13 15M 
3D"[cmake-3.15.4-Darwin-x86_64.d= mg2019-10-02 10:45 = 33M 
3D"[cmake-3.15.4-Darwin-x8= 6_64.tar.gz2019-10-02 10:45 33M 
3D"[TXT]"2019-10-02 10:45 37M 
3D"[cmake-3.15.4-Linux-x86_= 64.tar.gz2019-10-02 10:45 37M 
3D"[TXT]"2019-10-02 10:45 1.0K&nb= sp;
3D"[TXT]"2019-10-02 10:45 833  
3D"[cmake-3.15.4-win32-x86.msi2019-10-02 10:45 20M 
3D"[cmake-3.15.4-win32-x86.zip2019-10-02 10:45 27M 
3D"[cmake-3.15.4-win64-x64.msi2019-10-02 10:45 22M 
3D"[cmake-3.15.4-win64-x64.zip2019-10-02 10:45 30M 
3D"[cmake-3.15.4.tar.Z2019-10-02 10:45 14M 
3D"[cmake-3.15.4.tar.gz2019-10-02 10:45 8.8M <= /td>
3D"[cmake-3.15.4.zip2019-10-02 10:45 15M 
3D"[cmake-3.15.5-Darwin-x86_64.d= mg2019-10-30 10:49 = 33M 
3D"[cmake-3.15.5-Darwin-x8= 6_64.tar.gz2019-10-30 10:49 33M 
3D"[TXT]"2019-10-30 10:49 37M 
3D"[cmake-3.15.5-Linux-x86_= 64.tar.gz2019-10-30 10:49 37M 
3D"[TXT]"2019-10-30 10:49 1.0K&nb= sp;
3D"[TXT]"2019-10-30 10:49 833  
3D"[cmake-3.15.5-win32-x86.msi2019-10-30 10:49 20M 
3D"[cmake-3.15.5-win32-x86.zip2019-10-30 10:49 27M 
3D"[cmake-3.15.5-win64-x64.msi2019-10-30 10:49 22M 
3D"[cmake-3.15.5-win64-x64.zip2019-10-30 10:49 30M 
3D"[cmake-3.15.5.tar.Z2019-10-30 10:49 14M 
3D"[cmake-3.15.5.tar.gz2019-10-30 10:49 8.8M <= /td>
3D"[cmake-3.15.5.zip2019-10-30 10:49 15M 
3D"[cmake-3.15.6-Darwin-x86_64.d= mg2019-12-16 11:30 = 34M 
3D"[cmake-3.15.6-Darwin-x8= 6_64.tar.gz2019-12-16 11:30 33M 
3D"[TXT]"2019-12-16 11:30 37M 
3D"[cmake-3.15.6-Linux-x86_= 64.tar.gz2019-12-16 11:30 37M 
3D"[TXT]"2019-12-16 11:30 1.0K&nb= sp;
3D"[TXT]"2019-12-16 11:30 833  
3D"[cmake-3.15.6-win32-x86.msi2019-12-16 11:30 21M 
3D"[cmake-3.15.6-win32-x86.zip2019-12-16 11:30 28M 
3D"[cmake-3.15.6-win64-x64.msi2019-12-16 11:30 22M 
3D"[cmake-3.15.6-win64-x64.zip2019-12-16 11:30 30M 
3D"[cmake-3.15.6.tar.Z2019-12-16 11:30 14M 
3D"[cmake-3.15.6.tar.gz2019-12-16 11:30 8.8M <= /td>
3D"[cmake-3.15.6.zip2019-12-16 11:30 15M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.16/index.html b/b= itbake/lib/bb/tests/fetch-testdata/files/v3.16/index.html new file mode 100644 index 0000000..74f9b40 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.16/index.html @@ -0,0 +1,86 @@ + + + + Index of /files/v3.16 + + +

Index of /files/v3.16

+ + + + += + +cmake-3.16.0-Linux-x86_64.sh<= /td> + +cmake-3.16.0-SHA-256.txt +cmake-3.16.0-SHA-256.txt.asc<= /td> += + +cmake-3.16.0-rc1-Linux-x86_64= .sh + +cmake-3.16.0-rc1-SHA-256.txt<= /td> +cmake-3.16.0-rc1-SHA-256.txt.= asc += + += + +=   + += + +cmake-3.16.0-rc2-Linux-x86_64= .sh + +cmake-3.16.0-rc2-SHA-256.txt<= /td> +cmake-3.16.0-rc2-SHA-256.txt.= asc += + += + +=   + += + +cmake-3.16.0-rc3-Linux-x86_64= .sh + +cmake-3.16.0-rc3-SHA-256.txt<= /td> +cmake-3.16.0-rc3-SHA-256.txt.= asc += + += + +=   + += + +cmake-3.16.0-rc4-Linux-x86_64= .sh + +cmake-3.16.0-rc4-SHA-256.txt<= /td> +cmake-3.16.0-rc4-SHA-256.txt.= asc += + += + +=   + += = + += = + + + += + +cmake-3.16.1-Linux-x86_64.sh<= /td> + +cmake-3.16.1-SHA-256.txt +cmake-3.16.1-SHA-256.txt.asc<= /td> += = + += = + + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.16.0-Darwin-x86_64.d= mg2019-11-26 10:27 = 35M 
3D"[cmake-3.16.0-Darwin-x8= 6_64.tar.gz2019-11-26 10:27 34M 
3D"[TXT]"2019-11-26 10:27 38M 
3D"[cmake-3.16.0-Linux-x86_= 64.tar.gz2019-11-26 10:27 38M 
3D"[TXT]"2019-11-26 10:27 932 &nb= sp;
3D"[TXT]"2019-11-26 10:27 833  
3D"[cmake-3.16.0-rc1-Darwin-= x86_64.dmg2019-10-10 14:18 34M 
3D"[cmake-3.16.0-rc1-D= arwin-x86_64.tar.gz2019-10-10 14:18 34M 
3D"[TXT]"2019-10-10 14:18 = 38M 
3D"[cmake-3.16.0-rc1-Li= nux-x86_64.tar.gz2019-10-10 14:18 38M 
3D"[TXT]"2019-10-10 14:18 972  
3D"[TXT]"2019-10-10 14:18 = 833  
3D"[cmake-3.16.0-rc1-win32-x86.m= si2019-10-10 14:18 = 21M 
3D"[cmake-3.16.0-rc1-win32-x8= 6.zip2019-10-10 14:18 28M 
3D"[cmake-3.16.0-rc1-win64-x64.m= si2019-10-10 14:18 = 23M 
3D"[cmake-3.16.0-rc1-win64-x6= 4.zip2019-10-10 14:18 31M 
3D"[cmake-3.16.0-rc1.tar.gz2019-10-10 14:18 8.7M
3D"[cmake-3.16.0-rc1.zip2019-10-10 14:18 14M = ;
3D"[cmake-3.16.0-rc2-Darwin-= x86_64.dmg2019-10-18 10:47 34M 
3D"[cmake-3.16.0-rc2-D= arwin-x86_64.tar.gz2019-10-18 10:47 34M 
3D"[TXT]"2019-10-18 10:47 = 38M 
3D"[cmake-3.16.0-rc2-Li= nux-x86_64.tar.gz2019-10-18 10:47 38M 
3D"[TXT]"2019-10-18 10:47 972  
3D"[TXT]"2019-10-18 10:47 = 833  
3D"[cmake-3.16.0-rc2-win32-x86.m= si2019-10-18 10:47 = 21M 
3D"[cmake-3.16.0-rc2-win32-x8= 6.zip2019-10-18 10:47 28M 
3D"[cmake-3.16.0-rc2-win64-x64.m= si2019-10-18 10:47 = 23M 
3D"[cmake-3.16.0-rc2-win64-x6= 4.zip2019-10-18 10:47 31M 
3D"[cmake-3.16.0-rc2.tar.gz2019-10-18 10:47 8.7M
3D"[cmake-3.16.0-rc2.zip2019-10-18 10:47 14M = ;
3D"[cmake-3.16.0-rc3-Darwin-= x86_64.dmg2019-10-31 12:09 34M 
3D"[cmake-3.16.0-rc3-D= arwin-x86_64.tar.gz2019-10-31 12:09 34M 
3D"[TXT]"2019-10-31 12:09 = 38M 
3D"[cmake-3.16.0-rc3-Li= nux-x86_64.tar.gz2019-10-31 12:10 38M 
3D"[TXT]"2019-10-31 12:10 972  
3D"[TXT]"2019-10-31 12:10 = 833  
3D"[cmake-3.16.0-rc3-win32-x86.m= si2019-10-31 12:10 = 21M 
3D"[cmake-3.16.0-rc3-win32-x8= 6.zip2019-10-31 12:10 28M 
3D"[cmake-3.16.0-rc3-win64-x64.m= si2019-10-31 12:10 = 23M 
3D"[cmake-3.16.0-rc3-win64-x6= 4.zip2019-10-31 12:10 31M 
3D"[cmake-3.16.0-rc3.tar.gz2019-10-31 12:10 8.7M
3D"[cmake-3.16.0-rc3.zip2019-10-31 12:10 14M = ;
3D"[cmake-3.16.0-rc4-Darwin-= x86_64.dmg2019-11-18 17:01 35M 
3D"[cmake-3.16.0-rc4-D= arwin-x86_64.tar.gz2019-11-18 17:01 34M 
3D"[TXT]"2019-11-18 17:01 = 38M 
3D"[cmake-3.16.0-rc4-Li= nux-x86_64.tar.gz2019-11-18 17:01 38M 
3D"[TXT]"2019-11-18 17:01 972  
3D"[TXT]"2019-11-18 17:01 = 833  
3D"[cmake-3.16.0-rc4-win32-x86.m= si2019-11-18 17:01 = 21M 
3D"[cmake-3.16.0-rc4-win32-x8= 6.zip2019-11-18 17:01 28M 
3D"[cmake-3.16.0-rc4-win64-x64.m= si2019-11-18 17:01 = 23M 
3D"[cmake-3.16.0-rc4-win64-x6= 4.zip2019-11-18 17:01 31M 
3D"[cmake-3.16.0-rc4.tar.gz2019-11-18 17:01 8.7M
3D"[cmake-3.16.0-rc4.zip2019-11-18 17:01 14M = ;
3D"[cmake-3.16.0-win32-x86.msi2019-11-26 10:27 21M 
3D"[cmake-3.16.0-win32-x86.zip2019-11-26 10:27 28M 
3D"[cmake-3.16.0-win64-x64.msi2019-11-26 10:27 23M 
3D"[cmake-3.16.0-win64-x64.zip2019-11-26 10:27 31M 
3D"[cmake-3.16.0.tar.gz2019-11-26 10:27 8.7M <= /td>
3D"[cmake-3.16.0.zip2019-11-26 10:27 14M 
3D"[cmake-3.16.1-Darwin-x86_64.d= mg2019-12-10 10:42 = 35M 
3D"[cmake-3.16.1-Darwin-x8= 6_64.tar.gz2019-12-10 10:42 34M 
3D"[TXT]"2019-12-10 10:42 38M 
3D"[cmake-3.16.1-Linux-x86_= 64.tar.gz2019-12-10 10:42 38M 
3D"[TXT]"2019-12-10 10:42 932 &nb= sp;
3D"[TXT]"2019-12-10 10:42 833  
3D"[cmake-3.16.1-win32-x86.msi2019-12-10 10:42 21M 
3D"[cmake-3.16.1-win32-x86.zip2019-12-10 10:42 28M 
3D"[cmake-3.16.1-win64-x64.msi2019-12-10 10:42 23M 
3D"[cmake-3.16.1-win64-x64.zip2019-12-10 10:42 31M 
3D"[cmake-3.16.1.tar.gz2019-12-10 10:42 8.7M <= /td>
3D"[cmake-3.16.1.zip2019-12-10 10:42 14M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.2/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.2/index.html new file mode 100644 index 0000000..a8c6c7f --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.2/index.html @@ -0,0 +1,132 @@ + + + + Index of /files/v3.2 + + +

Index of /files/v3.2

+ + + + +=   += += + + += + + +cmake-3.2.0-Linux-i386.sh2015-03-10 09:01 + + +cmake-3.2.0-Linux-x86_64.sh<= td>  + + +cmake-3.2.0-SHA-256.txt +cmake-3.2.0-SHA-256.txt.asc<= td>  += + 66M += += + + +cmake-3.2.0-rc1-Linux-i386.sh + + +cmake-3.2.0-rc1-Linux-x86_64.s= h + + +cmake-3.2.0-rc1-SHA-256.txt<= td>  +cmake-3.2.0-rc1-SHA-256.txt.as= c +<= td>cmake-3.2.0-rc1-win32-x86.exe<= /a> + + +2015-02-13 15:02 + += + 66M += += + + +cmake-3.2.0-rc2-Linux-i386.sh + + +cmake-3.2.0-rc2-Linux-x86_64.s= h + + +cmake-3.2.0-rc2-SHA-256.txt<= td>  +cmake-3.2.0-rc2-SHA-256.txt.as= c +<= td>cmake-3.2.0-rc2-win32-x86.exe<= /a> + + +2015-02-24 08:50 + +<= td>cmake-3.2.0-win32-x86.exe=   + += + + +=   += += + + += + + +cmake-3.2.1-Linux-i386.sh2015-03-11 09:10 + + +cmake-3.2.1-Linux-x86_64.sh<= td>  + + +cmake-3.2.1-SHA-256.txt +cmake-3.2.1-SHA-256.txt.asc<= td>  +<= td>cmake-3.2.1-win32-x86.exe=   + += + + += + + += + + +cmake-3.2.2-Linux-i386.sh2015-04-14 13:44 + + +cmake-3.2.2-Linux-x86_64.sh<= td>  + + +cmake-3.2.2-SHA-256.txt +cmake-3.2.2-SHA-256.txt.asc<= td>  +<= td>cmake-3.2.2-win32-x86.exe=   + += + + += + + += + + +cmake-3.2.3-Linux-i386.sh2015-06-01 17:04 + + +cmake-3.2.3-Linux-x86_64.sh<= td>  + + +cmake-3.2.3-SHA-256.txt +cmake-3.2.3-SHA-256.txt.asc<= td>  +<= td>cmake-3.2.3-win32-x86.exe=   + += + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.2.0-1-src.tar.bz22015-03-10 09:02 4.9M
3D"[cmake-3.2.0-1.tar.bz22015-03-10 09:02 9.4M =
3D"[cmake-3.2.0-Darwin-univers= al.dmg2015-03-10 09:02 47M 
3D"[cmake-3.2.0-Darwin-un= iversal.tar.Z2015-03-10 09:02 66M 
3D"[cmake-3.2.0-Darwin-u= niversal.tar.gz2015-03-10 09:01 46M 
3D"[cmake-3.2.0-Darwin-x86_64.dmg= 2015-03-10 09:01 27= M 
3D"[cmake-3.2.0-Darwin-x86_6= 4.tar.Z2015-03-10 09:01 38M 
3D"[cmake-3.2.0-Darwin-x86_= 64.tar.gz2015-03-10 09:01 26M 
3D"[TXT]" 25M&= nbsp;
3D"[cmake-3.2.0-Linux-i386.tar.= Z2015-03-10 09:01 3= 6M 
3D"[cmake-3.2.0-Linux-i386.tar= .gz2015-03-10 09:01 = 25M 
3D"[TXT]"2015-03-10 09:01 26M
3D"[cmake-3.2.0-Linux-x86_64.= tar.Z2015-03-10 09:01 36M 
3D"[cmake-3.2.0-Linux-x86_64= .tar.gz2015-03-10 09:01 26M 
3D"[TXT]"2016-04-13 12:48 1.6K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[cmake-3.2.0-rc1-Darwin= -universal.dmg2015-02-13 15:03 47M 
3D"[cmake-3.2.0-rc1-D= arwin-universal.tar.Z2015-02-13 15:03  
3D"[cmake-3.2.0-rc1-= Darwin-universal.tar.gz2015-02-13 15:03 46M 
3D"[cmake-3.2.0-rc1-Darwin-x8= 6_64.dmg2015-02-13 15:03 30M 
3D"[cmake-3.2.0-rc1-Darw= in-x86_64.tar.Z2015-02-13 15:03 42M 
3D"[cmake-3.2.0-rc1-Dar= win-x86_64.tar.gz2015-02-13 15:03 29M 
3D"[TXT]"2015-02-13 15:03 25M 
3D"[cmake-3.2.0-rc1-Linux-i= 386.tar.Z2015-02-13 15:03 36M 
3D"[cmake-3.2.0-rc1-Linux-= i386.tar.gz2015-02-13 15:03 25M 
3D"[TXT]"2015-02-13 15:03 2= 6M 
3D"[cmake-3.2.0-rc1-Linux= -x86_64.tar.Z2015-02-13 15:03 36M 
3D"[cmake-3.2.0-rc1-Linu= x-x86_64.tar.gz2015-02-13 15:02 26M 
3D"[TXT]"2016-04-13 12:48 1.6K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2015-02-13 15:02 12M=  
3D"[cmake-3.2.0-rc1-win32-x86.= zip2015-02-13 15:02 = 16M 
3D"[cmake-3.2.0-rc1.tar.Z2015-02-13 15:02 9.9M&nb= sp;
3D"[cmake-3.2.0-rc1.tar.gz6.1M&= nbsp;
3D"[cmake-3.2.0-rc1.zip2015-02-13 15:02 9.8M <= /td>
3D"[cmake-3.2.0-rc2-Darwin= -universal.dmg2015-02-24 08:51 47M 
3D"[cmake-3.2.0-rc2-D= arwin-universal.tar.Z2015-02-24 08:51  
3D"[cmake-3.2.0-rc2-= Darwin-universal.tar.gz2015-02-24 08:51 46M 
3D"[cmake-3.2.0-rc2-Darwin-x8= 6_64.dmg2015-02-24 08:51 27M 
3D"[cmake-3.2.0-rc2-Darw= in-x86_64.tar.Z2015-02-24 08:51 38M 
3D"[cmake-3.2.0-rc2-Dar= win-x86_64.tar.gz2015-02-24 08:51 26M 
3D"[TXT]"2015-02-24 08:50 25M 
3D"[cmake-3.2.0-rc2-Linux-i= 386.tar.Z2015-02-24 08:50 36M 
3D"[cmake-3.2.0-rc2-Linux-= i386.tar.gz2015-02-24 08:50 25M 
3D"[TXT]"2015-02-24 08:50 2= 6M 
3D"[cmake-3.2.0-rc2-Linux= -x86_64.tar.Z2015-02-24 08:50 36M 
3D"[cmake-3.2.0-rc2-Linu= x-x86_64.tar.gz2015-02-24 08:50 26M 
3D"[TXT]"2016-04-13 12:48 1.6K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2015-02-24 08:50 11M=  
3D"[cmake-3.2.0-rc2-win32-x86.= zip2015-02-24 08:50 = 15M 
3D"[cmake-3.2.0-rc2.tar.Z2015-02-24 08:50 10M&nb= sp;
3D"[cmake-3.2.0-rc2.tar.gz6.1M&= nbsp;
3D"[cmake-3.2.0-rc2.zip2015-02-24 08:50 9.8M <= /td>
3D"[2015-03-10 09:01 11M
3D"[cmake-3.2.0-win32-x86.zip<= /td>2015-03-10 09:01 15M 
3D"[cmake-3.2.0.tar.Z2015-03-10 09:01 9.9M 
3D"[cmake-3.2.0.tar.gz2015-03-10 09:01 6.1M 
3D"[cmake-3.2.0.zip2015-03-10 09:01 9.7M 
3D"[cmake-3.2.1-1-src.tar.bz22015-03-11 09:10 4.9M
3D"[cmake-3.2.1-1.tar.bz22015-03-11 09:10 9.5M =
3D"[cmake-3.2.1-Darwin-univers= al.dmg2015-03-11 09:10 47M 
3D"[cmake-3.2.1-Darwin-un= iversal.tar.Z2015-03-11 09:10 66M 
3D"[cmake-3.2.1-Darwin-u= niversal.tar.gz2015-03-11 09:10 46M 
3D"[cmake-3.2.1-Darwin-x86_64.dmg= 2015-03-11 09:10 27= M 
3D"[cmake-3.2.1-Darwin-x86_6= 4.tar.Z2015-03-11 09:10 38M 
3D"[cmake-3.2.1-Darwin-x86_= 64.tar.gz2015-03-11 09:10 26M 
3D"[TXT]" 25M&= nbsp;
3D"[cmake-3.2.1-Linux-i386.tar.= Z2015-03-11 09:09 3= 6M 
3D"[cmake-3.2.1-Linux-i386.tar= .gz2015-03-11 09:09 = 25M 
3D"[TXT]"2015-03-11 09:09 26M
3D"[cmake-3.2.1-Linux-x86_64.= tar.Z2015-03-11 09:09 36M 
3D"[cmake-3.2.1-Linux-x86_64= .tar.gz2015-03-11 09:09 26M 
3D"[TXT]"2016-04-13 12:48 1.6K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2015-03-11 09:09 11M
3D"[cmake-3.2.1-win32-x86.zip<= /td>2015-03-11 09:09 15M 
3D"[cmake-3.2.1.tar.Z2015-03-11 09:09 10M 
3D"[cmake-3.2.1.tar.gz2015-03-11 09:09 6.1M 
3D"[cmake-3.2.1.zip2015-03-11 09:09 9.7M 
3D"[cmake-3.2.2-Darwin-univers= al.dmg2015-04-14 13:45 47M 
3D"[cmake-3.2.2-Darwin-un= iversal.tar.Z2015-04-14 13:45 66M 
3D"[cmake-3.2.2-Darwin-u= niversal.tar.gz2015-04-14 13:45 46M 
3D"[cmake-3.2.2-Darwin-x86_64.dmg= 2015-04-14 13:45 27= M 
3D"[cmake-3.2.2-Darwin-x86_6= 4.tar.Z2015-04-14 13:45 38M 
3D"[cmake-3.2.2-Darwin-x86_= 64.tar.gz2015-04-14 13:45 26M 
3D"[TXT]" 25M&= nbsp;
3D"[cmake-3.2.2-Linux-i386.tar.= Z2015-04-14 13:44 3= 6M 
3D"[cmake-3.2.2-Linux-i386.tar= .gz2015-04-14 13:44 = 25M 
3D"[TXT]"2015-04-14 13:44 26M
3D"[cmake-3.2.2-Linux-x86_64.= tar.Z2015-04-14 13:44 36M 
3D"[cmake-3.2.2-Linux-x86_64= .tar.gz2015-04-14 13:44 26M 
3D"[TXT]"2016-04-13 12:48 1.6K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2015-04-14 13:44 11M
3D"[cmake-3.2.2-win32-x86.zip<= /td>2015-04-14 13:44 15M 
3D"[cmake-3.2.2.tar.Z2015-04-14 13:44 9.9M 
3D"[cmake-3.2.2.tar.gz2015-04-14 13:44 6.1M 
3D"[cmake-3.2.2.zip2015-04-14 13:44 9.7M 
3D"[cmake-3.2.3-Darwin-univers= al.dmg2015-06-01 17:04 47M 
3D"[cmake-3.2.3-Darwin-un= iversal.tar.Z2015-06-01 17:04 66M 
3D"[cmake-3.2.3-Darwin-u= niversal.tar.gz2015-06-01 17:04 46M 
3D"[cmake-3.2.3-Darwin-x86_64.dmg= 2015-06-01 17:04 27= M 
3D"[cmake-3.2.3-Darwin-x86_6= 4.tar.Z2015-06-01 17:04 38M 
3D"[cmake-3.2.3-Darwin-x86_= 64.tar.gz2015-06-01 17:04 26M 
3D"[TXT]" 25M&= nbsp;
3D"[cmake-3.2.3-Linux-i386.tar.= Z2015-06-01 17:03 3= 6M 
3D"[cmake-3.2.3-Linux-i386.tar= .gz2015-06-01 17:03 = 25M 
3D"[TXT]"2015-06-01 17:03 26M
3D"[cmake-3.2.3-Linux-x86_64.= tar.Z2015-06-01 17:03 36M 
3D"[cmake-3.2.3-Linux-x86_64= .tar.gz2015-06-01 17:03 26M 
3D"[TXT]"2016-04-13 12:48 1.6K = ;
3D"[TXT]"2016-04-13 12:48 819
3D"[2015-06-01 17:03 11M
3D"[cmake-3.2.3-win32-x86.zip<= /td>2015-06-01 17:03 15M 
3D"[cmake-3.2.3.tar.Z2015-06-01 17:03 9.9M 
3D"[cmake-3.2.3.tar.gz2015-06-01 17:03 6.1M 
3D"[cmake-3.2.3.zip2015-06-01 17:03 9.7M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.3/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.3/index.html new file mode 100644 index 0000000..d053736 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.3/index.html @@ -0,0 +1,163 @@ + + + + Index of /files/v3.3 + + +

Index of /files/v3.3

+ + + + +=   += += + + += + + +cmake-3.3.0-Linux-i386.sh2015-07-23 16:38 + + +cmake-3.3.0-Linux-x86_64.sh<= td>  + + +cmake-3.3.0-SHA-256.txt +cmake-3.3.0-SHA-256.txt.asc<= td>  += +cmake-3.3.0-rc1-1.patch +cmake-3.3.0-rc1-1.sh= +=   += + 68M += += + + +cmake-3.3.0-rc1-Linux-i386.sh + + +cmake-3.3.0-rc1-Linux-x86_64.s= h + + +cmake-3.3.0-rc1-SHA-256.txt<= td>  +cmake-3.3.0-rc1-SHA-256.txt.as= c +<= td>cmake-3.3.0-rc1-win32-x86.exe<= /a> + + +2015-06-05 09:00 + += +=   += + 68M += += + + +cmake-3.3.0-rc2-Linux-i386.sh + + +cmake-3.3.0-rc2-Linux-x86_64.s= h + + +cmake-3.3.0-rc2-SHA-256.txt<= td>  +cmake-3.3.0-rc2-SHA-256.txt.as= c +<= td>cmake-3.3.0-rc2-win32-x86.exe<= /a> + + +2015-06-10 15:27 + += +=   += + 68M += += + + +cmake-3.3.0-rc3-Linux-i386.sh + + +cmake-3.3.0-rc3-Linux-x86_64.s= h + + +cmake-3.3.0-rc3-SHA-256.txt<= td>  +cmake-3.3.0-rc3-SHA-256.txt.as= c +<= td>cmake-3.3.0-rc3-win32-x86.exe<= /a> + + +2015-06-26 13:34 + += +=   += + 68M += += + + +cmake-3.3.0-rc4-Linux-i386.sh + + +cmake-3.3.0-rc4-Linux-x86_64.s= h + + +cmake-3.3.0-rc4-SHA-256.txt<= td>  +cmake-3.3.0-rc4-SHA-256.txt.as= c +<= td>cmake-3.3.0-rc4-win32-x86.exe<= /a> + + +2015-07-13 15:55 + +<= td>cmake-3.3.0-win32-x86.exe=   + += + + +=   += += + + += + + +cmake-3.3.1-Linux-i386.sh2015-08-13 15:55 + + +cmake-3.3.1-Linux-x86_64.sh<= td>  + + +cmake-3.3.1-SHA-256.txt +cmake-3.3.1-SHA-256.txt.asc<= td>  +<= td>cmake-3.3.1-win32-x86.exe=   + += + + +=   += += + + += + + +cmake-3.3.2-Linux-i386.sh2015-09-17 14:35 + + +cmake-3.3.2-Linux-x86_64.sh<= td>  + + +cmake-3.3.2-SHA-256.txt +cmake-3.3.2-SHA-256.txt.asc<= td>  +<= td>cmake-3.3.2-win32-x86.exe=   + += + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.3.0-1-src.tar.bz22015-07-23 16:39 5.0M
3D"[cmake-3.3.0-1.tar.bz22015-07-23 16:39 9.8M =
3D"[cmake-3.3.0-Darwin-univers= al.dmg2015-07-23 16:39 48M 
3D"[cmake-3.3.0-Darwin-un= iversal.tar.Z2015-07-23 16:39 68M 
3D"[cmake-3.3.0-Darwin-u= niversal.tar.gz2015-07-23 16:39 47M 
3D"[cmake-3.3.0-Darwin-x86_64.dmg= 2015-07-23 16:39 22= M 
3D"[cmake-3.3.0-Darwin-x86_6= 4.tar.Z2015-07-23 16:39 31M 
3D"[cmake-3.3.0-Darwin-x86_= 64.tar.gz2015-07-23 16:38 21M 
3D"[TXT]" 26M&= nbsp;
3D"[cmake-3.3.0-Linux-i386.tar.= Z2015-07-23 16:38 3= 7M 
3D"[cmake-3.3.0-Linux-i386.tar= .gz2015-07-23 16:38 = 26M 
3D"[TXT]"2015-07-23 16:38 27M
3D"[cmake-3.3.0-Linux-x86_64.= tar.Z2015-07-23 16:38 37M 
3D"[cmake-3.3.0-Linux-x86_64= .tar.gz2015-07-23 16:38 27M 
3D"[TXT]"2015-08-13 14:42 1.6K = ;
3D"[TXT]"2015-08-13 14:42 819
3D"[cmake-3.3.0-rc1-1-src.tar.bz2= 2015-06-05 09:01 9.8= M 
3D"[TXT]"2015-06-05 09:01 0  = ;
3D"[TXT]"2015-06-05 09:01 1.5K 
3D"[cmake-3.3.0-rc1-1.tar.bz22015-06-05 09:01 9.8M
3D"[cmake-3.3.0-rc1-Darwin= -universal.dmg2015-06-05 09:01 48M 
3D"[cmake-3.3.0-rc1-D= arwin-universal.tar.Z2015-06-05 09:01  
3D"[cmake-3.3.0-rc1-= Darwin-universal.tar.gz2015-06-05 09:01 47M 
3D"[cmake-3.3.0-rc1-Darwin-x8= 6_64.dmg2015-06-05 09:01 27M 
3D"[cmake-3.3.0-rc1-Darw= in-x86_64.tar.Z2015-06-05 09:01 38M 
3D"[cmake-3.3.0-rc1-Dar= win-x86_64.tar.gz2015-06-05 09:01 27M 
3D"[TXT]"2015-06-05 09:00 26M 
3D"[cmake-3.3.0-rc1-Linux-i= 386.tar.Z2015-06-05 09:00 36M 
3D"[cmake-3.3.0-rc1-Linux-= i386.tar.gz2015-06-05 09:00 26M 
3D"[TXT]"2015-06-05 09:00 2= 6M 
3D"[cmake-3.3.0-rc1-Linux= -x86_64.tar.Z2015-06-05 09:00 37M 
3D"[cmake-3.3.0-rc1-Linu= x-x86_64.tar.gz2015-06-05 09:00 26M 
3D"[TXT]"2016-04-13 12:48 1.6K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2015-06-05 09:00 12M=  
3D"[cmake-3.3.0-rc1-win32-x86.= zip2015-06-05 09:00 = 16M 
3D"[cmake-3.3.0-rc1.tar.Z2015-06-05 09:00 10M&nb= sp;
3D"[cmake-3.3.0-rc1.tar.gz6.3M&= nbsp;
3D"[cmake-3.3.0-rc1.zip2015-06-05 09:00 10M <= /td>
3D"[cmake-3.3.0-rc2-1-src.tar.bz2= 2015-06-10 15:27 5.0= M 
3D"[cmake-3.3.0-rc2-1.tar.bz22015-06-10 15:27 9.8M
3D"[cmake-3.3.0-rc2-Darwin= -universal.dmg2015-06-10 15:27 48M 
3D"[cmake-3.3.0-rc2-D= arwin-universal.tar.Z2015-06-10 15:27  
3D"[cmake-3.3.0-rc2-= Darwin-universal.tar.gz2015-06-10 15:27 47M 
3D"[cmake-3.3.0-rc2-Darwin-x8= 6_64.dmg2015-06-10 15:27 21M 
3D"[cmake-3.3.0-rc2-Darw= in-x86_64.tar.Z2015-06-10 15:27 31M 
3D"[cmake-3.3.0-rc2-Dar= win-x86_64.tar.gz2015-06-10 15:27 21M 
3D"[TXT]"2015-06-10 15:27 26M 
3D"[cmake-3.3.0-rc2-Linux-i= 386.tar.Z2015-06-10 15:27 36M 
3D"[cmake-3.3.0-rc2-Linux-= i386.tar.gz2015-06-10 15:27 26M 
3D"[TXT]"2015-06-10 15:27 2= 6M 
3D"[cmake-3.3.0-rc2-Linux= -x86_64.tar.Z2015-06-10 15:27 37M 
3D"[cmake-3.3.0-rc2-Linu= x-x86_64.tar.gz2015-06-10 15:27 26M 
3D"[TXT]"2016-04-13 12:48 1.6K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2015-06-10 15:27 12M=  
3D"[cmake-3.3.0-rc2-win32-x86.= zip2015-06-10 15:27 = 16M 
3D"[cmake-3.3.0-rc2.tar.Z2015-06-10 15:27 10M&nb= sp;
3D"[cmake-3.3.0-rc2.tar.gz6.3M&= nbsp;
3D"[cmake-3.3.0-rc2.zip2015-06-10 15:27 10M <= /td>
3D"[cmake-3.3.0-rc3-1-src.tar.bz2= 2015-06-26 13:34 5.0= M 
3D"[cmake-3.3.0-rc3-1.tar.bz22015-06-26 13:34 9.8M
3D"[cmake-3.3.0-rc3-Darwin= -universal.dmg2015-06-26 13:34 48M 
3D"[cmake-3.3.0-rc3-D= arwin-universal.tar.Z2015-06-26 13:34  
3D"[cmake-3.3.0-rc3-= Darwin-universal.tar.gz2015-06-26 13:34 47M 
3D"[cmake-3.3.0-rc3-Darwin-x8= 6_64.dmg2015-06-26 13:34 22M 
3D"[cmake-3.3.0-rc3-Darw= in-x86_64.tar.Z2015-06-26 13:34 31M 
3D"[cmake-3.3.0-rc3-Dar= win-x86_64.tar.gz2015-06-26 13:34 21M 
3D"[TXT]"2015-06-26 13:34 26M 
3D"[cmake-3.3.0-rc3-Linux-i= 386.tar.Z2015-06-26 13:34 37M 
3D"[cmake-3.3.0-rc3-Linux-= i386.tar.gz2015-06-26 13:34 26M 
3D"[TXT]"2015-06-26 13:34 2= 7M 
3D"[cmake-3.3.0-rc3-Linux= -x86_64.tar.Z2015-06-26 13:34 37M 
3D"[cmake-3.3.0-rc3-Linu= x-x86_64.tar.gz2015-06-26 13:34 27M 
3D"[TXT]"2016-04-13 12:48 1.6K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2015-06-26 13:34 12M=  
3D"[cmake-3.3.0-rc3-win32-x86.= zip2015-06-26 13:34 = 16M 
3D"[cmake-3.3.0-rc3.tar.Z2015-06-26 13:34 10M&nb= sp;
3D"[cmake-3.3.0-rc3.tar.gz6.3M&= nbsp;
3D"[cmake-3.3.0-rc3.zip2015-06-26 13:34 10M <= /td>
3D"[cmake-3.3.0-rc4-1-src.tar.bz2= 2015-07-13 15:56 5.0= M 
3D"[cmake-3.3.0-rc4-1.tar.bz22015-07-13 15:56 9.8M
3D"[cmake-3.3.0-rc4-Darwin= -universal.dmg2015-07-13 15:56 48M 
3D"[cmake-3.3.0-rc4-D= arwin-universal.tar.Z2015-07-13 15:56  
3D"[cmake-3.3.0-rc4-= Darwin-universal.tar.gz2015-07-13 15:55 47M 
3D"[cmake-3.3.0-rc4-Darwin-x8= 6_64.dmg2015-07-13 15:55 22M 
3D"[cmake-3.3.0-rc4-Darw= in-x86_64.tar.Z2015-07-13 15:55 31M 
3D"[cmake-3.3.0-rc4-Dar= win-x86_64.tar.gz2015-07-13 15:55 21M 
3D"[TXT]"2015-07-13 15:55 26M 
3D"[cmake-3.3.0-rc4-Linux-i= 386.tar.Z2015-07-13 15:55 37M 
3D"[cmake-3.3.0-rc4-Linux-= i386.tar.gz2015-07-13 15:55 26M 
3D"[TXT]"2015-07-13 15:55 2= 7M 
3D"[cmake-3.3.0-rc4-Linux= -x86_64.tar.Z2015-07-13 15:55 37M 
3D"[cmake-3.3.0-rc4-Linu= x-x86_64.tar.gz2015-07-13 15:55 27M 
3D"[TXT]"2016-04-13 12:48 1.6K
3D"[TXT]"2016-04-13 12:48 81= 9  
3D"[2015-07-13 15:55 12M=  
3D"[cmake-3.3.0-rc4-win32-x86.= zip2015-07-13 15:55 = 16M 
3D"[cmake-3.3.0-rc4.tar.Z2015-07-13 15:55 10M&nb= sp;
3D"[cmake-3.3.0-rc4.tar.gz6.3M&= nbsp;
3D"[cmake-3.3.0-rc4.zip2015-07-13 15:55 10M <= /td>
3D"[2015-07-23 16:38 12M
3D"[cmake-3.3.0-win32-x86.zip<= /td>2015-07-23 16:38 16M 
3D"[cmake-3.3.0.tar.Z2015-07-23 16:38 10M 
3D"[cmake-3.3.0.tar.gz2015-07-23 16:38 6.3M 
3D"[cmake-3.3.0.zip2015-07-23 16:38 10M 
3D"[cmake-3.3.1-1-src.tar.bz22015-08-13 15:55 5.0M
3D"[cmake-3.3.1-1.tar.bz22015-08-13 15:55 9.8M =
3D"[cmake-3.3.1-Darwin-univers= al.dmg2015-08-13 15:55 48M 
3D"[cmake-3.3.1-Darwin-un= iversal.tar.Z2015-08-13 15:55 68M 
3D"[cmake-3.3.1-Darwin-u= niversal.tar.gz2015-08-13 15:55 47M 
3D"[cmake-3.3.1-Darwin-x86_64.dmg= 2015-08-13 15:55 22= M 
3D"[cmake-3.3.1-Darwin-x86_6= 4.tar.Z2015-08-13 15:55 31M 
3D"[cmake-3.3.1-Darwin-x86_= 64.tar.gz2015-08-13 15:55 21M 
3D"[TXT]" 26M&= nbsp;
3D"[cmake-3.3.1-Linux-i386.tar.= Z2015-08-13 15:55 3= 7M 
3D"[cmake-3.3.1-Linux-i386.tar= .gz2015-08-13 15:55 = 26M 
3D"[TXT]"2015-08-13 15:55 27M
3D"[cmake-3.3.1-Linux-x86_64.= tar.Z2015-08-13 15:55 37M 
3D"[cmake-3.3.1-Linux-x86_64= .tar.gz2015-08-13 15:55 27M 
3D"[TXT]"2015-08-13 15:55 1.3K = ;
3D"[TXT]"2015-08-13 15:55 819
3D"[2015-08-13 15:55 12M
3D"[cmake-3.3.1-win32-x86.zip<= /td>2015-08-13 15:55 16M 
3D"[cmake-3.3.1.tar.Z2015-08-13 15:54 10M 
3D"[cmake-3.3.1.tar.gz2015-08-13 15:54 6.3M 
3D"[cmake-3.3.1.zip2015-08-13 15:54 10M 
3D"[cmake-3.3.2-1-src.tar.bz22015-09-17 14:36 5.0M
3D"[cmake-3.3.2-1.tar.bz22015-09-17 14:36 9.8M =
3D"[cmake-3.3.2-Darwin-univers= al.dmg2015-09-17 14:36 48M 
3D"[cmake-3.3.2-Darwin-un= iversal.tar.Z2015-09-17 14:36 68M 
3D"[cmake-3.3.2-Darwin-u= niversal.tar.gz2015-09-17 14:36 47M 
3D"[cmake-3.3.2-Darwin-x86_64.dmg= 2015-09-17 14:35 22= M 
3D"[cmake-3.3.2-Darwin-x86_6= 4.tar.Z2015-09-17 14:35 31M 
3D"[cmake-3.3.2-Darwin-x86_= 64.tar.gz2015-09-17 14:35 21M 
3D"[TXT]" 26M&= nbsp;
3D"[cmake-3.3.2-Linux-i386.tar.= Z2015-09-17 14:35 3= 7M 
3D"[cmake-3.3.2-Linux-i386.tar= .gz2015-09-17 14:35 = 26M 
3D"[TXT]"2015-09-17 14:35 27M
3D"[cmake-3.3.2-Linux-x86_64.= tar.Z2015-09-17 14:35 37M 
3D"[cmake-3.3.2-Linux-x86_64= .tar.gz2015-09-17 14:35 27M 
3D"[TXT]"2015-09-17 14:35 1.6K = ;
3D"[TXT]"2015-09-17 14:35 819
3D"[2015-09-17 14:35 12M
3D"[cmake-3.3.2-win32-x86.zip<= /td>2015-09-17 14:35 16M 
3D"[cmake-3.3.2.tar.Z2015-09-17 14:35 10M 
3D"[cmake-3.3.2.tar.gz2015-09-17 14:35 6.3M 
3D"[cmake-3.3.2.zip2015-09-17 14:35 10M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.4/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.4/index.html new file mode 100644 index 0000000..e7b56da --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.4/index.html @@ -0,0 +1,127 @@ + + + + Index of /files/v3.4 + + +

Index of /files/v3.4

+ + + + += + + +cmake-3.4.0-Linux-i386.sh2015-11-12 13:42 + + +cmake-3.4.0-Linux-x86_64.sh<= td>  + + +cmake-3.4.0-SHA-256.txt +cmake-3.4.0-SHA-256.txt.asc<= td>  += + + +cmake-3.4.0-rc1-Linux-i386.sh + + +cmake-3.4.0-rc1-Linux-x86_64.s= h + + +cmake-3.4.0-rc1-SHA-256.txt<= td>  +cmake-3.4.0-rc1-SHA-256.txt.as= c +<= td>cmake-3.4.0-rc1-win32-x86.exe<= /a> + + +2015-10-06 11:01 + += + + +cmake-3.4.0-rc2-Linux-i386.sh + + +cmake-3.4.0-rc2-Linux-x86_64.s= h + + +cmake-3.4.0-rc2-SHA-256.txt<= td>  +cmake-3.4.0-rc2-SHA-256.txt.as= c +<= td>cmake-3.4.0-rc2-win32-x86.exe<= /a> + + +2015-10-21 16:26 + += + + +cmake-3.4.0-rc3-Linux-i386.sh + + +cmake-3.4.0-rc3-Linux-x86_64.s= h + + +cmake-3.4.0-rc3-SHA-256.txt<= td>  +cmake-3.4.0-rc3-SHA-256.txt.as= c +<= td>cmake-3.4.0-rc3-win32-x86.exe<= /a> + + +2015-11-03 11:08 + +<= td>cmake-3.4.0-win32-x86.exe=   + += + + += + + +cmake-3.4.1-Linux-i386.sh2015-12-02 14:42 + + +cmake-3.4.1-Linux-x86_64.sh<= td>  + + +cmake-3.4.1-SHA-256.txt +cmake-3.4.1-SHA-256.txt.asc<= td>  +<= td>cmake-3.4.1-win32-x86.exe=   + += + + += + + +cmake-3.4.2-Linux-i386.sh2016-01-19 14:58 + + +cmake-3.4.2-Linux-x86_64.sh<= td>  + + +cmake-3.4.2-SHA-256.txt +cmake-3.4.2-SHA-256.txt.asc<= td>  +<= td>cmake-3.4.2-win32-x86.exe=   + += + + += + + +cmake-3.4.3-Linux-i386.sh2016-01-25 14:29 + + +cmake-3.4.3-Linux-x86_64.sh<= td>  + + +cmake-3.4.3-SHA-256.txt +cmake-3.4.3-SHA-256.txt.asc<= td>  +<= td>cmake-3.4.3-win32-x86.exe=   + += + + +<= td>cygwin/ + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.4.0-Darwin-x86_64.dmg= 2015-11-12 13:42 22= M 
3D"[cmake-3.4.0-Darwin-x86_6= 4.tar.Z2015-11-12 13:42 31M 
3D"[cmake-3.4.0-Darwin-x86_= 64.tar.gz2015-11-12 13:42 22M 
3D"[TXT]" 26M&= nbsp;
3D"[cmake-3.4.0-Linux-i386.tar.= Z2015-11-12 13:42 3= 7M 
3D"[cmake-3.4.0-Linux-i386.tar= .gz2015-11-12 13:42 = 26M 
3D"[TXT]"2015-11-12 13:42 27M
3D"[cmake-3.4.0-Linux-x86_64.= tar.Z2015-11-12 13:42 38M 
3D"[cmake-3.4.0-Linux-x86_64= .tar.gz2015-11-12 13:42 27M 
3D"[TXT]"2015-11-12 13:42 1.3K = ;
3D"[TXT]"2015-11-12 13:42 819
3D"[cmake-3.4.0-rc1-Darwin-x8= 6_64.dmg2015-10-06 11:02 22M 
3D"[cmake-3.4.0-rc1-Darw= in-x86_64.tar.Z2015-10-06 11:02 31M 
3D"[cmake-3.4.0-rc1-Dar= win-x86_64.tar.gz2015-10-06 11:02 22M 
3D"[TXT]"2015-10-06 11:02 26M 
3D"[cmake-3.4.0-rc1-Linux-i= 386.tar.Z2015-10-06 11:02 37M 
3D"[cmake-3.4.0-rc1-Linux-= i386.tar.gz2015-10-06 11:01 26M 
3D"[TXT]"2015-10-06 11:01 2= 7M 
3D"[cmake-3.4.0-rc1-Linux= -x86_64.tar.Z2015-10-06 11:01 38M 
3D"[cmake-3.4.0-rc1-Linu= x-x86_64.tar.gz2015-10-06 11:01 27M 
3D"[TXT]"2015-10-06 11:01 1.3K
3D"[TXT]"2015-10-06 11:01 81= 9  
3D"[2015-10-06 11:01 13M=  
3D"[cmake-3.4.0-rc1-win32-x86.= zip2015-10-06 11:01 = 16M 
3D"[cmake-3.4.0-rc1.tar.Z2015-10-06 11:01 10M&nb= sp;
3D"[cmake-3.4.0-rc1.tar.gz6.4M&= nbsp;
3D"[cmake-3.4.0-rc1.zip2015-10-06 11:01 11M <= /td>
3D"[cmake-3.4.0-rc2-Darwin-x8= 6_64.dmg2015-10-21 16:27 22M 
3D"[cmake-3.4.0-rc2-Darw= in-x86_64.tar.Z2015-10-21 16:27 31M 
3D"[cmake-3.4.0-rc2-Dar= win-x86_64.tar.gz2015-10-21 16:27 22M 
3D"[TXT]"2015-10-21 16:27 26M 
3D"[cmake-3.4.0-rc2-Linux-i= 386.tar.Z2015-10-21 16:27 37M 
3D"[cmake-3.4.0-rc2-Linux-= i386.tar.gz2015-10-21 16:27 26M 
3D"[TXT]"2015-10-21 16:27 2= 7M 
3D"[cmake-3.4.0-rc2-Linux= -x86_64.tar.Z2015-10-21 16:27 38M 
3D"[cmake-3.4.0-rc2-Linu= x-x86_64.tar.gz2015-10-21 16:27 27M 
3D"[TXT]"2015-10-21 16:26 1.3K
3D"[TXT]"2015-10-21 16:26 81= 9  
3D"[2015-10-21 16:26 13M=  
3D"[cmake-3.4.0-rc2-win32-x86.= zip2015-10-21 16:26 = 16M 
3D"[cmake-3.4.0-rc2.tar.Z2015-10-21 16:26 10M&nb= sp;
3D"[cmake-3.4.0-rc2.tar.gz6.4M&= nbsp;
3D"[cmake-3.4.0-rc2.zip2015-10-21 16:26 11M <= /td>
3D"[cmake-3.4.0-rc3-Darwin-x8= 6_64.dmg2015-11-03 11:09 22M 
3D"[cmake-3.4.0-rc3-Darw= in-x86_64.tar.Z2015-11-03 11:09 31M 
3D"[cmake-3.4.0-rc3-Dar= win-x86_64.tar.gz2015-11-03 11:09 22M 
3D"[TXT]"2015-11-03 11:09 26M 
3D"[cmake-3.4.0-rc3-Linux-i= 386.tar.Z2015-11-03 11:09 37M 
3D"[cmake-3.4.0-rc3-Linux-= i386.tar.gz2015-11-03 11:09 26M 
3D"[TXT]"2015-11-03 11:09 2= 7M 
3D"[cmake-3.4.0-rc3-Linux= -x86_64.tar.Z2015-11-03 11:09 38M 
3D"[cmake-3.4.0-rc3-Linu= x-x86_64.tar.gz2015-11-03 11:09 27M 
3D"[TXT]"2015-11-03 11:09 1.3K
3D"[TXT]"2015-11-03 11:09 81= 9  
3D"[2015-11-03 11:09 13M=  
3D"[cmake-3.4.0-rc3-win32-x86.= zip2015-11-03 11:09 = 16M 
3D"[cmake-3.4.0-rc3.tar.Z2015-11-03 11:09 10M&nb= sp;
3D"[cmake-3.4.0-rc3.tar.gz6.4M&= nbsp;
3D"[cmake-3.4.0-rc3.zip2015-11-03 11:08 11M <= /td>
3D"[2015-11-12 13:42 13M
3D"[cmake-3.4.0-win32-x86.zip<= /td>2015-11-12 13:42 16M 
3D"[cmake-3.4.0.tar.Z2015-11-12 13:42 10M 
3D"[cmake-3.4.0.tar.gz2015-11-12 13:42 6.4M 
3D"[cmake-3.4.0.zip2015-11-12 13:42 10M 
3D"[cmake-3.4.1-Darwin-x86_64.dmg= 2015-12-02 14:42 22= M 
3D"[cmake-3.4.1-Darwin-x86_6= 4.tar.Z2015-12-02 14:42 31M 
3D"[cmake-3.4.1-Darwin-x86_= 64.tar.gz2015-12-02 14:42 22M 
3D"[TXT]" 26M&= nbsp;
3D"[cmake-3.4.1-Linux-i386.tar.= Z2015-12-02 14:42 3= 7M 
3D"[cmake-3.4.1-Linux-i386.tar= .gz2015-12-02 14:42 = 26M 
3D"[TXT]"2015-12-02 14:42 27M
3D"[cmake-3.4.1-Linux-x86_64.= tar.Z2015-12-02 14:42 38M 
3D"[cmake-3.4.1-Linux-x86_64= .tar.gz2015-12-02 14:42 27M 
3D"[TXT]"2015-12-02 14:42 1.3K = ;
3D"[TXT]"2015-12-02 14:42 819
3D"[2015-12-02 14:42 13M
3D"[cmake-3.4.1-win32-x86.zip<= /td>2015-12-02 14:42 16M 
3D"[cmake-3.4.1.tar.Z2015-12-02 14:42 10M 
3D"[cmake-3.4.1.tar.gz2015-12-02 14:42 6.4M 
3D"[cmake-3.4.1.zip2015-12-02 14:41 10M 
3D"[cmake-3.4.2-Darwin-x86_64.dmg= 2016-01-19 14:58 22= M 
3D"[cmake-3.4.2-Darwin-x86_6= 4.tar.Z2016-01-19 14:58 31M 
3D"[cmake-3.4.2-Darwin-x86_= 64.tar.gz2016-01-19 14:58 22M 
3D"[TXT]" 26M&= nbsp;
3D"[cmake-3.4.2-Linux-i386.tar.= Z2016-01-19 14:58 3= 7M 
3D"[cmake-3.4.2-Linux-i386.tar= .gz2016-01-19 14:58 = 26M 
3D"[TXT]"2016-01-19 14:58 27M
3D"[cmake-3.4.2-Linux-x86_64.= tar.Z2016-01-19 14:58 38M 
3D"[cmake-3.4.2-Linux-x86_64= .tar.gz2016-01-19 14:58 27M 
3D"[TXT]"2016-01-19 14:58 1.3K = ;
3D"[TXT]"2016-01-19 14:58 819
3D"[2016-01-19 14:58 13M
3D"[cmake-3.4.2-win32-x86.zip<= /td>2016-01-19 14:58 16M 
3D"[cmake-3.4.2.tar.Z2016-01-19 14:58 10M 
3D"[cmake-3.4.2.tar.gz2016-01-19 14:58 6.4M 
3D"[cmake-3.4.2.zip2016-01-19 14:58 10M 
3D"[cmake-3.4.3-Darwin-x86_64.dmg= 2016-01-25 14:29 22= M 
3D"[cmake-3.4.3-Darwin-x86_6= 4.tar.Z2016-01-25 14:29 31M 
3D"[cmake-3.4.3-Darwin-x86_= 64.tar.gz2016-01-25 14:29 22M 
3D"[TXT]" 26M&= nbsp;
3D"[cmake-3.4.3-Linux-i386.tar.= Z2016-01-25 14:29 3= 7M 
3D"[cmake-3.4.3-Linux-i386.tar= .gz2016-01-25 14:29 = 26M 
3D"[TXT]"2016-01-25 14:29 27M
3D"[cmake-3.4.3-Linux-x86_64.= tar.Z2016-01-25 14:29 38M 
3D"[cmake-3.4.3-Linux-x86_64= .tar.gz2016-01-25 14:29 27M 
3D"[TXT]"2016-01-25 14:29 1.3K = ;
3D"[TXT]"2016-01-25 14:29 819
3D"[2016-01-25 14:29 13M
3D"[cmake-3.4.3-win32-x86.zip<= /td>2016-01-25 14:29 16M 
3D"[cmake-3.4.3.tar.Z2016-01-25 14:29 10M 
3D"[cmake-3.4.3.tar.gz2016-01-25 14:29 6.4M 
3D"[cmake-3.4.3.zip2016-01-25 14:29 10M 
3D"[DIR]"2016-01-25 14:34= -  

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.5/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.5/index.html new file mode 100644 index 0000000..03d4f7c --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.5/index.html @@ -0,0 +1,111 @@ + + + + Index of /files/v3.5 + + +

Index of /files/v3.5

+ + + + += + + +cmake-3.5.0-Linux-i386.sh2016-03-08 11:17 + + +cmake-3.5.0-Linux-x86_64.sh<= td>  + + +cmake-3.5.0-SHA-256.txt +cmake-3.5.0-SHA-256.txt.asc<= td>  += + + +cmake-3.5.0-rc1-Linux-i386.sh + + +cmake-3.5.0-rc1-Linux-x86_64.s= h + + +cmake-3.5.0-rc1-SHA-256.txt<= td>  +cmake-3.5.0-rc1-SHA-256.txt.as= c += + + +2016-02-02 15:51 + += + + +cmake-3.5.0-rc2-Linux-i386.sh + + +cmake-3.5.0-rc2-Linux-x86_64.s= h + + +cmake-3.5.0-rc2-SHA-256.txt<= td>  +cmake-3.5.0-rc2-SHA-256.txt.as= c += + + +2016-02-10 15:02 + += + + +cmake-3.5.0-rc3-Linux-i386.sh + + +cmake-3.5.0-rc3-Linux-x86_64.s= h + + +cmake-3.5.0-rc3-SHA-256.txt<= td>  +cmake-3.5.0-rc3-SHA-256.txt.as= c += + + +2016-02-18 15:40 + +=   + += + + += + + +cmake-3.5.1-Linux-i386.sh2016-03-24 16:00 + + +cmake-3.5.1-Linux-x86_64.sh<= td>  + + +cmake-3.5.1-SHA-256.txt +cmake-3.5.1-SHA-256.txt.asc<= td>  +=   + += + + += + + +cmake-3.5.2-Linux-i386.sh2016-04-15 13:40 + + +cmake-3.5.2-Linux-x86_64.sh<= td>  + + +cmake-3.5.2-SHA-256.txt +cmake-3.5.2-SHA-256.txt.asc<= td>  +=   + += + + +<= td>cygwin/ + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.5.0-Darwin-x86_64.dmg= 2016-03-08 11:17 22= M 
3D"[cmake-3.5.0-Darwin-x86_6= 4.tar.Z2016-03-08 11:17 31M 
3D"[cmake-3.5.0-Darwin-x86_= 64.tar.gz2016-03-08 11:17 22M 
3D"[TXT]" 27M&= nbsp;
3D"[cmake-3.5.0-Linux-i386.tar.= Z2016-03-08 11:17 3= 8M 
3D"[cmake-3.5.0-Linux-i386.tar= .gz2016-03-08 11:17 = 27M 
3D"[TXT]"2016-03-08 11:17 27M
3D"[cmake-3.5.0-Linux-x86_64.= tar.Z2016-03-08 11:17 38M 
3D"[cmake-3.5.0-Linux-x86_64= .tar.gz2016-03-08 11:17 27M 
3D"[TXT]"2016-03-08 11:17 1.3K = ;
3D"[TXT]"2016-03-08 11:16 819
3D"[cmake-3.5.0-rc1-Darwin-x8= 6_64.dmg2016-02-02 15:51 22M 
3D"[cmake-3.5.0-rc1-Darw= in-x86_64.tar.Z2016-02-02 15:51 31M 
3D"[cmake-3.5.0-rc1-Dar= win-x86_64.tar.gz2016-02-02 15:51 22M 
3D"[TXT]"2016-02-02 15:51 27M 
3D"[cmake-3.5.0-rc1-Linux-i= 386.tar.Z2016-02-02 15:51 38M 
3D"[cmake-3.5.0-rc1-Linux-= i386.tar.gz2016-02-02 15:51 27M 
3D"[TXT]"2016-02-02 15:51 2= 7M 
3D"[cmake-3.5.0-rc1-Linux= -x86_64.tar.Z2016-02-02 15:51 38M 
3D"[cmake-3.5.0-rc1-Linu= x-x86_64.tar.gz2016-02-02 15:51 27M 
3D"[TXT]"2016-02-03 13:29 1.3K
3D"[TXT]"2016-02-03 13:29 81= 9  
3D"[cmake-3.5.0-rc1-win32-x86.msi= 2016-02-03 13:29 15= M 
3D"[cmake-3.5.0-rc1-win32-x86.= zip2016-02-03 13:29 = 20M 
3D"[cmake-3.5.0-rc1.tar.Z2016-02-02 15:51 11M&nb= sp;
3D"[cmake-3.5.0-rc1.tar.gz6.5M&= nbsp;
3D"[cmake-3.5.0-rc1.zip2016-02-02 15:51 11M <= /td>
3D"[cmake-3.5.0-rc2-Darwin-x8= 6_64.dmg2016-02-10 15:03 22M 
3D"[cmake-3.5.0-rc2-Darw= in-x86_64.tar.Z2016-02-10 15:03 31M 
3D"[cmake-3.5.0-rc2-Dar= win-x86_64.tar.gz2016-02-10 15:03 22M 
3D"[TXT]"2016-02-10 15:03 27M 
3D"[cmake-3.5.0-rc2-Linux-i= 386.tar.Z2016-02-10 15:03 38M 
3D"[cmake-3.5.0-rc2-Linux-= i386.tar.gz2016-02-10 15:03 27M 
3D"[TXT]"2016-02-10 15:03 2= 7M 
3D"[cmake-3.5.0-rc2-Linux= -x86_64.tar.Z2016-02-10 15:03 38M 
3D"[cmake-3.5.0-rc2-Linu= x-x86_64.tar.gz2016-02-10 15:03 27M 
3D"[TXT]"2016-02-10 15:03 1.3K
3D"[TXT]"2016-02-10 15:03 81= 9  
3D"[cmake-3.5.0-rc2-win32-x86.msi= 2016-02-10 15:03 15= M 
3D"[cmake-3.5.0-rc2-win32-x86.= zip2016-02-10 15:03 = 20M 
3D"[cmake-3.5.0-rc2.tar.Z2016-02-10 15:02 11M&nb= sp;
3D"[cmake-3.5.0-rc2.tar.gz6.5M&= nbsp;
3D"[cmake-3.5.0-rc2.zip2016-02-10 15:02 11M <= /td>
3D"[cmake-3.5.0-rc3-Darwin-x8= 6_64.dmg2016-02-18 15:41 22M 
3D"[cmake-3.5.0-rc3-Darw= in-x86_64.tar.Z2016-02-18 15:41 31M 
3D"[cmake-3.5.0-rc3-Dar= win-x86_64.tar.gz2016-02-18 15:41 22M 
3D"[TXT]"2016-02-18 15:41 27M 
3D"[cmake-3.5.0-rc3-Linux-i= 386.tar.Z2016-02-18 15:41 38M 
3D"[cmake-3.5.0-rc3-Linux-= i386.tar.gz2016-02-18 15:41 27M 
3D"[TXT]"2016-02-18 15:41 2= 7M 
3D"[cmake-3.5.0-rc3-Linux= -x86_64.tar.Z2016-02-18 15:41 38M 
3D"[cmake-3.5.0-rc3-Linu= x-x86_64.tar.gz2016-02-18 15:41 27M 
3D"[TXT]"2016-02-18 15:41 1.3K
3D"[TXT]"2016-02-18 15:41 81= 9  
3D"[cmake-3.5.0-rc3-win32-x86.msi= 2016-02-18 15:41 15= M 
3D"[cmake-3.5.0-rc3-win32-x86.= zip2016-02-18 15:41 = 20M 
3D"[cmake-3.5.0-rc3.tar.Z2016-02-18 15:41 11M&nb= sp;
3D"[cmake-3.5.0-rc3.tar.gz6.5M&= nbsp;
3D"[cmake-3.5.0-rc3.zip2016-02-18 15:40 11M <= /td>
3D"[cmake-3.5.0-win32-x86.msi2016-03-08 11:16 15M
3D"[cmake-3.5.0-win32-x86.zip<= /td>2016-03-08 11:16 20M 
3D"[cmake-3.5.0.tar.Z2016-03-08 11:16 11M 
3D"[cmake-3.5.0.tar.gz2016-03-08 11:16 6.5M 
3D"[cmake-3.5.0.zip2016-03-08 11:16 11M 
3D"[cmake-3.5.1-Darwin-x86_64.dmg= 2016-03-24 16:00 22= M 
3D"[cmake-3.5.1-Darwin-x86_6= 4.tar.Z2016-03-24 16:00 31M 
3D"[cmake-3.5.1-Darwin-x86_= 64.tar.gz2016-03-24 16:00 22M 
3D"[TXT]" 27M&= nbsp;
3D"[cmake-3.5.1-Linux-i386.tar.= Z2016-03-24 16:00 3= 8M 
3D"[cmake-3.5.1-Linux-i386.tar= .gz2016-03-24 16:00 = 27M 
3D"[TXT]"2016-03-24 16:00 27M
3D"[cmake-3.5.1-Linux-x86_64.= tar.Z2016-03-24 16:00 38M 
3D"[cmake-3.5.1-Linux-x86_64= .tar.gz2016-03-24 16:00 27M 
3D"[TXT]"2016-03-24 16:00 1.3K = ;
3D"[TXT]"2016-03-24 16:00 819
3D"[cmake-3.5.1-win32-x86.msi2016-03-24 16:00 15M
3D"[cmake-3.5.1-win32-x86.zip<= /td>2016-03-24 16:00 20M 
3D"[cmake-3.5.1.tar.Z2016-03-24 16:00 11M 
3D"[cmake-3.5.1.tar.gz2016-03-24 16:00 6.5M 
3D"[cmake-3.5.1.zip2016-03-24 16:00 11M 
3D"[cmake-3.5.2-Darwin-x86_64.dmg= 2016-04-15 13:40 22= M 
3D"[cmake-3.5.2-Darwin-x86_6= 4.tar.Z2016-04-15 13:40 31M 
3D"[cmake-3.5.2-Darwin-x86_= 64.tar.gz2016-04-15 13:40 22M 
3D"[TXT]" 27M&= nbsp;
3D"[cmake-3.5.2-Linux-i386.tar.= Z2016-04-15 13:40 3= 8M 
3D"[cmake-3.5.2-Linux-i386.tar= .gz2016-04-15 13:40 = 27M 
3D"[TXT]"2016-04-15 13:40 27M
3D"[cmake-3.5.2-Linux-x86_64.= tar.Z2016-04-15 13:40 38M 
3D"[cmake-3.5.2-Linux-x86_64= .tar.gz2016-04-15 13:40 27M 
3D"[TXT]"2016-04-15 13:40 1.3K = ;
3D"[TXT]"2016-04-15 13:40 819
3D"[cmake-3.5.2-win32-x86.msi2016-04-15 13:40 15M
3D"[cmake-3.5.2-win32-x86.zip<= /td>2016-04-15 13:40 20M 
3D"[cmake-3.5.2.tar.Z2016-04-15 13:40 11M 
3D"[cmake-3.5.2.tar.gz2016-04-15 13:40 6.5M 
3D"[cmake-3.5.2.zip2016-04-15 13:40 11M 
3D"[DIR]"2016-04-15 13:42= -  

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.6/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.6/index.html new file mode 100644 index 0000000..4fca3a5 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.6/index.html @@ -0,0 +1,159 @@ + + + + Index of /files/v3.6 + + +

Index of /files/v3.6

+ + + + += + + +cmake-3.6.0-Linux-i386.sh2016-07-07 13:05 + + +cmake-3.6.0-Linux-x86_64.sh<= td>  + + +cmake-3.6.0-SHA-256.txt +cmake-3.6.0-SHA-256.txt.asc<= td>  += + + +cmake-3.6.0-rc1-Linux-i386.sh + + +cmake-3.6.0-rc1-Linux-x86_64.s= h + + +cmake-3.6.0-rc1-SHA-256.txt<= td>  +cmake-3.6.0-rc1-SHA-256.txt.as= c += + += + + +2016-06-03 14:49 + += + + +cmake-3.6.0-rc2-Linux-i386.sh + + +cmake-3.6.0-rc2-Linux-x86_64.s= h + + +cmake-3.6.0-rc2-SHA-256.txt<= td>  +cmake-3.6.0-rc2-SHA-256.txt.as= c += + += + + +2016-06-13 14:28 + += + + +cmake-3.6.0-rc3-Linux-i386.sh + + +cmake-3.6.0-rc3-Linux-x86_64.s= h + + +cmake-3.6.0-rc3-SHA-256.txt<= td>  +cmake-3.6.0-rc3-SHA-256.txt.as= c += + += + + +2016-06-22 13:57 + += + + +cmake-3.6.0-rc4-Linux-i386.sh + + +cmake-3.6.0-rc4-Linux-x86_64.s= h + + +cmake-3.6.0-rc4-SHA-256.txt<= td>  +cmake-3.6.0-rc4-SHA-256.txt.as= c += + += + + +2016-06-29 14:49 + +=   + +=   + += + + += + + +cmake-3.6.1-Linux-i386.sh2016-07-22 10:58 + + +cmake-3.6.1-Linux-x86_64.sh<= td>  + + +cmake-3.6.1-SHA-256.txt +cmake-3.6.1-SHA-256.txt.asc<= td>  +=   + +=   + += + + += + + +cmake-3.6.2-Linux-i386.sh2016-09-07 14:29 + + +cmake-3.6.2-Linux-x86_64.sh<= td>  + + +cmake-3.6.2-SHA-256.txt +cmake-3.6.2-SHA-256.txt.asc<= td>  +=   + +=   + += + + += + + +cmake-3.6.3-Linux-i386.sh2016-11-03 12:13 + + +cmake-3.6.3-Linux-x86_64.sh<= td>  + + +cmake-3.6.3-SHA-256.txt +cmake-3.6.3-SHA-256.txt.asc<= td>  +=   + +=   + += + + +<= td>cygwin/ + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.6.0-Darwin-x86_64.dmg= 2016-07-07 13:05 25= M 
3D"[cmake-3.6.0-Darwin-x86_6= 4.tar.Z2016-07-07 13:05 36M 
3D"[cmake-3.6.0-Darwin-x86_= 64.tar.gz2016-07-07 13:05 25M 
3D"[TXT]" 27M&= nbsp;
3D"[cmake-3.6.0-Linux-i386.tar.= Z2016-07-07 13:05 3= 8M 
3D"[cmake-3.6.0-Linux-i386.tar= .gz2016-07-07 13:05 = 27M 
3D"[TXT]"2016-07-07 13:05 27M
3D"[cmake-3.6.0-Linux-x86_64.= tar.Z2016-07-07 13:05 38M 
3D"[cmake-3.6.0-Linux-x86_64= .tar.gz2016-07-07 13:05 27M 
3D"[TXT]"2016-07-07 13:05 1.4K = ;
3D"[TXT]"2016-07-07 13:05 819
3D"[cmake-3.6.0-rc1-Darwin-x8= 6_64.dmg2016-06-03 14:50 25M 
3D"[cmake-3.6.0-rc1-Darw= in-x86_64.tar.Z2016-06-03 14:50 36M 
3D"[cmake-3.6.0-rc1-Dar= win-x86_64.tar.gz2016-06-03 14:50 25M 
3D"[TXT]"2016-06-03 14:50 27M 
3D"[cmake-3.6.0-rc1-Linux-i= 386.tar.Z2016-06-03 14:50 38M 
3D"[cmake-3.6.0-rc1-Linux-= i386.tar.gz2016-06-03 14:50 27M 
3D"[TXT]"2016-06-03 14:50 2= 7M 
3D"[cmake-3.6.0-rc1-Linux= -x86_64.tar.Z2016-06-03 14:50 38M 
3D"[cmake-3.6.0-rc1-Linu= x-x86_64.tar.gz2016-06-03 14:49 27M 
3D"[TXT]"2016-06-03 14:49 1.5K
3D"[TXT]"2016-06-03 14:49 81= 9  
3D"[cmake-3.6.0-rc1-win32-x86.msi= 2016-06-03 14:49 15= M 
3D"[cmake-3.6.0-rc1-win32-x86.= zip2016-06-03 14:49 = 21M 
3D"[cmake-3.6.0-rc1-win64-x64.msi= 2016-06-03 14:49 15= M 
3D"[cmake-3.6.0-rc1-win64-x64.= zip2016-06-03 14:49 = 19M 
3D"[cmake-3.6.0-rc1.tar.Z2016-06-03 14:49 11M&nb= sp;
3D"[cmake-3.6.0-rc1.tar.gz6.6M&= nbsp;
3D"[cmake-3.6.0-rc1.zip2016-06-03 14:49 11M <= /td>
3D"[cmake-3.6.0-rc2-Darwin-x8= 6_64.dmg2016-06-13 14:29 25M 
3D"[cmake-3.6.0-rc2-Darw= in-x86_64.tar.Z2016-06-13 14:29 36M 
3D"[cmake-3.6.0-rc2-Dar= win-x86_64.tar.gz2016-06-13 14:29 25M 
3D"[TXT]"2016-06-13 14:29 27M 
3D"[cmake-3.6.0-rc2-Linux-i= 386.tar.Z2016-06-13 14:29 38M 
3D"[cmake-3.6.0-rc2-Linux-= i386.tar.gz2016-06-13 14:29 27M 
3D"[TXT]"2016-06-13 14:29 2= 7M 
3D"[cmake-3.6.0-rc2-Linux= -x86_64.tar.Z2016-06-13 14:29 38M 
3D"[cmake-3.6.0-rc2-Linu= x-x86_64.tar.gz2016-06-13 14:29 27M 
3D"[TXT]"2016-06-13 14:29 1.5K
3D"[TXT]"2016-06-13 14:29 81= 9  
3D"[cmake-3.6.0-rc2-win32-x86.msi= 2016-06-13 14:29 15= M 
3D"[cmake-3.6.0-rc2-win32-x86.= zip2016-06-13 14:29 = 21M 
3D"[cmake-3.6.0-rc2-win64-x64.msi= 2016-06-13 14:29 15= M 
3D"[cmake-3.6.0-rc2-win64-x64.= zip2016-06-13 14:29 = 19M 
3D"[cmake-3.6.0-rc2.tar.Z2016-06-13 14:29 11M&nb= sp;
3D"[cmake-3.6.0-rc2.tar.gz6.6M&= nbsp;
3D"[cmake-3.6.0-rc2.zip2016-06-13 14:28 11M <= /td>
3D"[cmake-3.6.0-rc3-Darwin-x8= 6_64.dmg2016-06-22 13:58 25M 
3D"[cmake-3.6.0-rc3-Darw= in-x86_64.tar.Z2016-06-22 13:58 36M 
3D"[cmake-3.6.0-rc3-Dar= win-x86_64.tar.gz2016-06-22 13:57 25M 
3D"[TXT]"2016-06-22 13:57 27M 
3D"[cmake-3.6.0-rc3-Linux-i= 386.tar.Z2016-06-22 13:57 38M 
3D"[cmake-3.6.0-rc3-Linux-= i386.tar.gz2016-06-22 13:57 27M 
3D"[TXT]"2016-06-22 13:57 2= 7M 
3D"[cmake-3.6.0-rc3-Linux= -x86_64.tar.Z2016-06-22 13:57 38M 
3D"[cmake-3.6.0-rc3-Linu= x-x86_64.tar.gz2016-06-22 13:57 27M 
3D"[TXT]"2016-06-22 13:57 1.5K
3D"[TXT]"2016-06-22 13:57 81= 9  
3D"[cmake-3.6.0-rc3-win32-x86.msi= 2016-06-22 13:57 15= M 
3D"[cmake-3.6.0-rc3-win32-x86.= zip2016-06-22 13:57 = 21M 
3D"[cmake-3.6.0-rc3-win64-x64.msi= 2016-06-22 13:57 15= M 
3D"[cmake-3.6.0-rc3-win64-x64.= zip2016-06-22 13:57 = 19M 
3D"[cmake-3.6.0-rc3.tar.Z2016-06-22 13:57 11M&nb= sp;
3D"[cmake-3.6.0-rc3.tar.gz6.6M&= nbsp;
3D"[cmake-3.6.0-rc3.zip2016-06-22 13:57 11M <= /td>
3D"[cmake-3.6.0-rc4-Darwin-x8= 6_64.dmg2016-06-29 14:50 25M 
3D"[cmake-3.6.0-rc4-Darw= in-x86_64.tar.Z2016-06-29 14:50 36M 
3D"[cmake-3.6.0-rc4-Dar= win-x86_64.tar.gz2016-06-29 14:50 25M 
3D"[TXT]"2016-06-29 14:50 27M 
3D"[cmake-3.6.0-rc4-Linux-i= 386.tar.Z2016-06-29 14:50 38M 
3D"[cmake-3.6.0-rc4-Linux-= i386.tar.gz2016-06-29 14:50 27M 
3D"[TXT]"2016-06-29 14:50 2= 7M 
3D"[cmake-3.6.0-rc4-Linux= -x86_64.tar.Z2016-06-29 14:49 38M 
3D"[cmake-3.6.0-rc4-Linu= x-x86_64.tar.gz2016-06-29 14:49 27M 
3D"[TXT]"2016-06-29 14:49 1.5K
3D"[TXT]"2016-06-29 14:49 81= 9  
3D"[cmake-3.6.0-rc4-win32-x86.msi= 2016-06-29 14:49 15= M 
3D"[cmake-3.6.0-rc4-win32-x86.= zip2016-06-29 14:49 = 21M 
3D"[cmake-3.6.0-rc4-win64-x64.msi= 2016-06-29 14:49 15= M 
3D"[cmake-3.6.0-rc4-win64-x64.= zip2016-06-29 14:49 = 19M 
3D"[cmake-3.6.0-rc4.tar.Z2016-06-29 14:49 11M&nb= sp;
3D"[cmake-3.6.0-rc4.tar.gz6.6M&= nbsp;
3D"[cmake-3.6.0-rc4.zip2016-06-29 14:49 11M <= /td>
3D"[cmake-3.6.0-win32-x86.msi2016-07-07 13:04 15M
3D"[cmake-3.6.0-win32-x86.zip<= /td>2016-07-07 13:04 20M 
3D"[cmake-3.6.0-win64-x64.msi2016-07-07 13:04 15M
3D"[cmake-3.6.0-win64-x64.zip<= /td>2016-07-07 13:04 19M 
3D"[cmake-3.6.0.tar.Z2016-07-07 13:04 11M 
3D"[cmake-3.6.0.tar.gz2016-07-07 13:04 6.6M 
3D"[cmake-3.6.0.zip2016-07-07 13:04 11M 
3D"[cmake-3.6.1-Darwin-x86_64.dmg= 2016-07-22 10:58 25= M 
3D"[cmake-3.6.1-Darwin-x86_6= 4.tar.Z2016-07-22 10:58 36M 
3D"[cmake-3.6.1-Darwin-x86_= 64.tar.gz2016-07-22 10:58 25M 
3D"[TXT]" 27M&= nbsp;
3D"[cmake-3.6.1-Linux-i386.tar.= Z2016-07-22 10:58 3= 8M 
3D"[cmake-3.6.1-Linux-i386.tar= .gz2016-07-22 10:58 = 27M 
3D"[TXT]"2016-07-22 10:58 27M
3D"[cmake-3.6.1-Linux-x86_64.= tar.Z2016-07-22 10:58 38M 
3D"[cmake-3.6.1-Linux-x86_64= .tar.gz2016-07-22 10:58 27M 
3D"[TXT]"2016-07-22 10:58 1.4K = ;
3D"[TXT]"2016-07-22 10:58 819
3D"[cmake-3.6.1-win32-x86.msi2016-07-22 10:58 15M
3D"[cmake-3.6.1-win32-x86.zip<= /td>2016-07-22 10:58 20M 
3D"[cmake-3.6.1-win64-x64.msi2016-07-22 10:58 15M
3D"[cmake-3.6.1-win64-x64.zip<= /td>2016-07-22 10:57 19M 
3D"[cmake-3.6.1.tar.Z2016-07-22 10:57 11M 
3D"[cmake-3.6.1.tar.gz2016-07-22 10:57 6.6M 
3D"[cmake-3.6.1.zip2016-07-22 10:57 11M 
3D"[cmake-3.6.2-Darwin-x86_64.dmg= 2016-09-07 14:29 25= M 
3D"[cmake-3.6.2-Darwin-x86_6= 4.tar.Z2016-09-07 14:29 36M 
3D"[cmake-3.6.2-Darwin-x86_= 64.tar.gz2016-09-07 14:29 25M 
3D"[TXT]" 27M&= nbsp;
3D"[cmake-3.6.2-Linux-i386.tar.= Z2016-09-07 14:29 3= 8M 
3D"[cmake-3.6.2-Linux-i386.tar= .gz2016-09-07 14:28 = 27M 
3D"[TXT]"2016-09-07 14:28 27M
3D"[cmake-3.6.2-Linux-x86_64.= tar.Z2016-09-07 14:28 38M 
3D"[cmake-3.6.2-Linux-x86_64= .tar.gz2016-09-07 14:28 27M 
3D"[TXT]"2016-09-07 14:28 1.4K = ;
3D"[TXT]"2016-09-07 14:28 819
3D"[cmake-3.6.2-win32-x86.msi2016-09-07 14:28 15M
3D"[cmake-3.6.2-win32-x86.zip<= /td>2016-09-07 14:28 20M 
3D"[cmake-3.6.2-win64-x64.msi2016-09-07 14:28 15M
3D"[cmake-3.6.2-win64-x64.zip<= /td>2016-09-07 14:28 19M 
3D"[cmake-3.6.2.tar.Z2016-09-07 14:28 11M 
3D"[cmake-3.6.2.tar.gz2016-09-07 14:28 6.6M 
3D"[cmake-3.6.2.zip2016-09-07 14:28 11M 
3D"[cmake-3.6.3-Darwin-x86_64.dmg= 2016-11-03 12:13 25= M 
3D"[cmake-3.6.3-Darwin-x86_6= 4.tar.Z2016-11-03 12:13 36M 
3D"[cmake-3.6.3-Darwin-x86_= 64.tar.gz2016-11-03 12:13 25M 
3D"[TXT]" 27M&= nbsp;
3D"[cmake-3.6.3-Linux-i386.tar.= Z2016-11-03 12:13 3= 8M 
3D"[cmake-3.6.3-Linux-i386.tar= .gz2016-11-03 12:13 = 27M 
3D"[TXT]"2016-11-03 12:13 27M
3D"[cmake-3.6.3-Linux-x86_64.= tar.Z2016-11-03 12:13 38M 
3D"[cmake-3.6.3-Linux-x86_64= .tar.gz2016-11-03 12:13 27M 
3D"[TXT]"2016-11-03 12:13 1.4K = ;
3D"[TXT]"2016-11-03 12:13 801
3D"[cmake-3.6.3-win32-x86.msi2016-11-03 12:13 15M
3D"[cmake-3.6.3-win32-x86.zip<= /td>2016-11-03 12:13 20M 
3D"[cmake-3.6.3-win64-x64.msi2016-11-03 12:12 17M
3D"[cmake-3.6.3-win64-x64.zip<= /td>2016-11-03 12:12 23M 
3D"[cmake-3.6.3.tar.Z2016-11-03 12:12 11M 
3D"[cmake-3.6.3.tar.gz2016-11-03 12:12 6.6M 
3D"[cmake-3.6.3.zip2016-11-03 12:12 11M 
3D"[DIR]"2016-09-07 14:44= -  

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.7/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.7/index.html new file mode 100644 index 0000000..4812f93 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.7/index.html @@ -0,0 +1,92 @@ + + + + Index of /files/v3.7 + + +

Index of /files/v3.7

+ + + + += + +cmake-3.7.0-Linux-x86_64.sh<= td>  + +cmake-3.7.0-SHA-256.txt +cmake-3.7.0-SHA-256.txt.asc<= td>  += + +cmake-3.7.0-rc1-Linux-x86_64.s= h + +cmake-3.7.0-rc1-SHA-256.txt<= td>  +cmake-3.7.0-rc1-SHA-256.txt.as= c += + += + + +2016-10-04 15:23 + += + +cmake-3.7.0-rc2-Linux-x86_64.s= h + +cmake-3.7.0-rc2-SHA-256.txt<= td>  +cmake-3.7.0-rc2-SHA-256.txt.as= c += + += + + +2016-10-19 15:23 + += + +cmake-3.7.0-rc3-Linux-x86_64.s= h + +cmake-3.7.0-rc3-SHA-256.txt<= td>  +cmake-3.7.0-rc3-SHA-256.txt.as= c += + += + + +2016-11-04 15:26 + +=   + +=   + += + + += + +cmake-3.7.1-Linux-x86_64.sh<= td>  + +cmake-3.7.1-SHA-256.txt +cmake-3.7.1-SHA-256.txt.asc<= td>  +=   + +=   + += + + += + +cmake-3.7.2-Linux-x86_64.sh<= td>  + +cmake-3.7.2-SHA-256.txt +cmake-3.7.2-SHA-256.txt.asc<= td>  +=   + +=   + += + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.7.0-Darwin-x86_64.dmg= 2016-11-11 14:01 26= M 
3D"[cmake-3.7.0-Darwin-x86_= 64.tar.gz2016-11-11 14:01 25M 
3D"[TXT]"2016-11-11 14:01 29M
3D"[cmake-3.7.0-Linux-x86_64= .tar.gz2016-11-11 14:01 29M 
3D"[TXT]"2016-11-11 14:01 1.0K = ;
3D"[TXT]"2016-11-11 14:01 801
3D"[cmake-3.7.0-rc1-Darwin-x8= 6_64.dmg2016-10-04 15:23 26M 
3D"[cmake-3.7.0-rc1-Dar= win-x86_64.tar.gz2016-10-04 15:23 25M 
3D"[TXT]"2016-10-04 15:23 2= 9M 
3D"[cmake-3.7.0-rc1-Linu= x-x86_64.tar.gz2016-10-04 15:23 29M 
3D"[TXT]"2016-10-04 15:23 1.0K
3D"[TXT]"2016-10-04 15:23 80= 1  
3D"[cmake-3.7.0-rc1-win32-x86.msi= 2016-10-04 15:23 15= M 
3D"[cmake-3.7.0-rc1-win32-x86.= zip2016-10-04 15:23 = 21M 
3D"[cmake-3.7.0-rc1-win64-x64.msi= 2016-10-04 15:23 17= M 
3D"[cmake-3.7.0-rc1-win64-x64.= zip2016-10-04 15:23 = 24M 
3D"[cmake-3.7.0-rc1.tar.Z2016-10-04 15:23 11M&nb= sp;
3D"[cmake-3.7.0-rc1.tar.gz7.0M&= nbsp;
3D"[cmake-3.7.0-rc1.zip2016-10-04 15:23 12M <= /td>
3D"[cmake-3.7.0-rc2-Darwin-x8= 6_64.dmg2016-10-19 15:24 26M 
3D"[cmake-3.7.0-rc2-Dar= win-x86_64.tar.gz2016-10-19 15:24 25M 
3D"[TXT]"2016-10-19 15:24 2= 9M 
3D"[cmake-3.7.0-rc2-Linu= x-x86_64.tar.gz2016-10-19 15:24 29M 
3D"[TXT]"2016-10-19 15:24 1.0K
3D"[TXT]"2016-10-19 15:24 80= 1  
3D"[cmake-3.7.0-rc2-win32-x86.msi= 2016-10-19 15:23 15= M 
3D"[cmake-3.7.0-rc2-win32-x86.= zip2016-10-19 15:23 = 21M 
3D"[cmake-3.7.0-rc2-win64-x64.msi= 2016-10-19 15:23 17= M 
3D"[cmake-3.7.0-rc2-win64-x64.= zip2016-10-19 15:23 = 24M 
3D"[cmake-3.7.0-rc2.tar.Z2016-10-19 15:23 11M&nb= sp;
3D"[cmake-3.7.0-rc2.tar.gz7.0M&= nbsp;
3D"[cmake-3.7.0-rc2.zip2016-10-19 15:23 12M <= /td>
3D"[cmake-3.7.0-rc3-Darwin-x8= 6_64.dmg2016-11-04 15:26 26M 
3D"[cmake-3.7.0-rc3-Dar= win-x86_64.tar.gz2016-11-04 15:26 25M 
3D"[TXT]"2016-11-04 15:26 2= 9M 
3D"[cmake-3.7.0-rc3-Linu= x-x86_64.tar.gz2016-11-04 15:26 29M 
3D"[TXT]"2016-11-04 15:26 1.0K
3D"[TXT]"2016-11-04 15:26 80= 1  
3D"[cmake-3.7.0-rc3-win32-x86.msi= 2016-11-04 15:26 15= M 
3D"[cmake-3.7.0-rc3-win32-x86.= zip2016-11-04 15:26 = 21M 
3D"[cmake-3.7.0-rc3-win64-x64.msi= 2016-11-04 15:26 17= M 
3D"[cmake-3.7.0-rc3-win64-x64.= zip2016-11-04 15:26 = 24M 
3D"[cmake-3.7.0-rc3.tar.Z2016-11-04 15:26 11M&nb= sp;
3D"[cmake-3.7.0-rc3.tar.gz7.0M&= nbsp;
3D"[cmake-3.7.0-rc3.zip2016-11-04 15:26 12M <= /td>
3D"[cmake-3.7.0-win32-x86.msi2016-11-11 14:01 15M
3D"[cmake-3.7.0-win32-x86.zip<= /td>2016-11-11 14:01 21M 
3D"[cmake-3.7.0-win64-x64.msi2016-11-11 14:01 17M
3D"[cmake-3.7.0-win64-x64.zip<= /td>2016-11-11 14:00 24M 
3D"[cmake-3.7.0.tar.Z2016-11-11 14:00 11M 
3D"[cmake-3.7.0.tar.gz2016-11-11 14:00 7.0M 
3D"[cmake-3.7.0.zip2016-11-11 14:00 11M 
3D"[cmake-3.7.1-Darwin-x86_64.dmg= 2016-11-30 14:25 26= M 
3D"[cmake-3.7.1-Darwin-x86_= 64.tar.gz2016-11-30 14:25 25M 
3D"[TXT]"2016-11-30 14:25 29M
3D"[cmake-3.7.1-Linux-x86_64= .tar.gz2016-11-30 14:25 29M 
3D"[TXT]"2016-11-30 14:25 1.0K = ;
3D"[TXT]"2016-11-30 14:25 833
3D"[cmake-3.7.1-win32-x86.msi2016-11-30 14:25 15M
3D"[cmake-3.7.1-win32-x86.zip<= /td>2016-11-30 14:25 21M 
3D"[cmake-3.7.1-win64-x64.msi2016-11-30 14:24 17M
3D"[cmake-3.7.1-win64-x64.zip<= /td>2016-11-30 14:24 24M 
3D"[cmake-3.7.1.tar.Z2016-11-30 14:24 11M 
3D"[cmake-3.7.1.tar.gz2016-11-30 14:24 7.0M 
3D"[cmake-3.7.1.zip2016-11-30 14:24 11M 
3D"[cmake-3.7.2-Darwin-x86_64.dmg= 2017-01-13 14:13 26= M 
3D"[cmake-3.7.2-Darwin-x86_= 64.tar.gz2017-01-13 14:13 25M 
3D"[TXT]"2017-01-13 14:13 29M
3D"[cmake-3.7.2-Linux-x86_64= .tar.gz2017-01-13 14:13 29M 
3D"[TXT]"2017-01-13 14:13 1.0K = ;
3D"[TXT]"2017-01-13 14:13 833
3D"[cmake-3.7.2-win32-x86.msi2017-01-13 14:13 15M
3D"[cmake-3.7.2-win32-x86.zip<= /td>2017-01-13 14:12 21M 
3D"[cmake-3.7.2-win64-x64.msi2017-01-13 14:12 17M
3D"[cmake-3.7.2-win64-x64.zip<= /td>2017-01-13 14:12 24M 
3D"[cmake-3.7.2.tar.Z2017-01-13 14:12 11M 
3D"[cmake-3.7.2.tar.gz2017-01-13 14:12 7.0M 
3D"[cmake-3.7.2.zip2017-01-13 14:12 11M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.8/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.8/index.html new file mode 100644 index 0000000..5fc8caa --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.8/index.html @@ -0,0 +1,105 @@ + + + + Index of /files/v3.8 + + +

Index of /files/v3.8

+ + + + += + +cmake-3.8.0-Linux-x86_64.sh<= td>  + +cmake-3.8.0-SHA-256.txt +cmake-3.8.0-SHA-256.txt.asc<= td>  += + +cmake-3.8.0-rc1-Linux-x86_64.s= h + +cmake-3.8.0-rc1-SHA-256.txt<= td>  +cmake-3.8.0-rc1-SHA-256.txt.as= c += + += + + +2017-02-07 12:54 + += + +cmake-3.8.0-rc2-Linux-x86_64.s= h + +cmake-3.8.0-rc2-SHA-256.txt<= td>  +cmake-3.8.0-rc2-SHA-256.txt.as= c += + += + + +2017-03-03 09:59 + += + +cmake-3.8.0-rc3-Linux-x86_64.s= h + +cmake-3.8.0-rc3-SHA-256.txt<= td>  +cmake-3.8.0-rc3-SHA-256.txt.as= c += + += + + +2017-03-24 13:52 + += + +cmake-3.8.0-rc4-Linux-x86_64.s= h + +cmake-3.8.0-rc4-SHA-256.txt<= td>  +cmake-3.8.0-rc4-SHA-256.txt.as= c += + += + + +2017-03-30 11:38 + +=   + +=   + += + + += + +cmake-3.8.1-Linux-x86_64.sh<= td>  + +cmake-3.8.1-SHA-256.txt +cmake-3.8.1-SHA-256.txt.asc<= td>  +=   + +=   + += + + += + +cmake-3.8.2-Linux-x86_64.sh<= td>  + +cmake-3.8.2-SHA-256.txt +cmake-3.8.2-SHA-256.txt.asc<= td>  +=   + +=   + += + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.8.0-Darwin-x86_64.dmg= 2017-04-10 13:39 26= M 
3D"[cmake-3.8.0-Darwin-x86_= 64.tar.gz2017-04-10 13:39 26M 
3D"[TXT]"2017-04-10 13:39 31M
3D"[cmake-3.8.0-Linux-x86_64= .tar.gz2017-04-10 13:39 31M 
3D"[TXT]"2017-04-10 13:39 1.0K = ;
3D"[TXT]"2017-04-10 13:39 833
3D"[cmake-3.8.0-rc1-Darwin-x8= 6_64.dmg2017-02-07 12:54 26M 
3D"[cmake-3.8.0-rc1-Dar= win-x86_64.tar.gz2017-02-07 12:54 26M 
3D"[TXT]"2017-02-07 12:54 3= 1M 
3D"[cmake-3.8.0-rc1-Linu= x-x86_64.tar.gz2017-02-07 12:54 31M 
3D"[TXT]"2017-02-07 12:54 1.0K
3D"[TXT]"2017-02-07 12:54 83= 3  
3D"[cmake-3.8.0-rc1-win32-x86.msi= 2017-02-07 12:54 15= M 
3D"[cmake-3.8.0-rc1-win32-x86.= zip2017-02-07 12:54 = 21M 
3D"[cmake-3.8.0-rc1-win64-x64.msi= 2017-02-07 12:54 18= M 
3D"[cmake-3.8.0-rc1-win64-x64.= zip2017-02-07 12:54 = 24M 
3D"[cmake-3.8.0-rc1.tar.Z2017-02-07 12:54 12M&nb= sp;
3D"[cmake-3.8.0-rc1.tar.gz7.1M&= nbsp;
3D"[cmake-3.8.0-rc1.zip2017-02-07 12:54 12M <= /td>
3D"[cmake-3.8.0-rc2-Darwin-x8= 6_64.dmg2017-03-03 10:00 26M 
3D"[cmake-3.8.0-rc2-Dar= win-x86_64.tar.gz2017-03-03 10:00 26M 
3D"[TXT]"2017-03-03 10:00 3= 1M 
3D"[cmake-3.8.0-rc2-Linu= x-x86_64.tar.gz2017-03-03 09:59 31M 
3D"[TXT]"2017-03-03 09:59 1.0K
3D"[TXT]"2017-03-03 09:59 83= 3  
3D"[cmake-3.8.0-rc2-win32-x86.msi= 2017-03-03 09:59 16= M 
3D"[cmake-3.8.0-rc2-win32-x86.= zip2017-03-03 09:59 = 22M 
3D"[cmake-3.8.0-rc2-win64-x64.msi= 2017-03-03 09:59 18= M 
3D"[cmake-3.8.0-rc2-win64-x64.= zip2017-03-03 09:59 = 24M 
3D"[cmake-3.8.0-rc2.tar.Z2017-03-03 09:59 12M&nb= sp;
3D"[cmake-3.8.0-rc2.tar.gz7.2M&= nbsp;
3D"[cmake-3.8.0-rc2.zip2017-03-03 09:59 12M <= /td>
3D"[cmake-3.8.0-rc3-Darwin-x8= 6_64.dmg2017-03-24 13:52 26M 
3D"[cmake-3.8.0-rc3-Dar= win-x86_64.tar.gz2017-03-24 13:52 26M 
3D"[TXT]"2017-03-24 13:52 3= 1M 
3D"[cmake-3.8.0-rc3-Linu= x-x86_64.tar.gz2017-03-24 13:52 31M 
3D"[TXT]"2017-03-24 13:52 1.0K
3D"[TXT]"2017-03-24 13:52 83= 3  
3D"[cmake-3.8.0-rc3-win32-x86.msi= 2017-03-24 13:52 16= M 
3D"[cmake-3.8.0-rc3-win32-x86.= zip2017-03-24 13:52 = 22M 
3D"[cmake-3.8.0-rc3-win64-x64.msi= 2017-03-24 13:52 18= M 
3D"[cmake-3.8.0-rc3-win64-x64.= zip2017-03-24 13:52 = 24M 
3D"[cmake-3.8.0-rc3.tar.Z2017-03-24 13:52 12M&nb= sp;
3D"[cmake-3.8.0-rc3.tar.gz7.2M&= nbsp;
3D"[cmake-3.8.0-rc3.zip2017-03-24 13:52 12M <= /td>
3D"[cmake-3.8.0-rc4-Darwin-x8= 6_64.dmg2017-03-30 11:38 26M 
3D"[cmake-3.8.0-rc4-Dar= win-x86_64.tar.gz2017-03-30 11:38 26M 
3D"[TXT]"2017-03-30 11:38 3= 1M 
3D"[cmake-3.8.0-rc4-Linu= x-x86_64.tar.gz2017-03-30 11:38 31M 
3D"[TXT]"2017-03-30 11:38 1.0K
3D"[TXT]"2017-03-30 11:38 83= 3  
3D"[cmake-3.8.0-rc4-win32-x86.msi= 2017-03-30 11:38 16= M 
3D"[cmake-3.8.0-rc4-win32-x86.= zip2017-03-30 11:38 = 22M 
3D"[cmake-3.8.0-rc4-win64-x64.msi= 2017-03-30 11:38 18= M 
3D"[cmake-3.8.0-rc4-win64-x64.= zip2017-03-30 11:38 = 24M 
3D"[cmake-3.8.0-rc4.tar.Z2017-03-30 11:38 12M&nb= sp;
3D"[cmake-3.8.0-rc4.tar.gz7.2M&= nbsp;
3D"[cmake-3.8.0-rc4.zip2017-03-30 11:38 12M <= /td>
3D"[cmake-3.8.0-win32-x86.msi2017-04-10 13:39 16M
3D"[cmake-3.8.0-win32-x86.zip<= /td>2017-04-10 13:39 22M 
3D"[cmake-3.8.0-win64-x64.msi2017-04-10 13:39 18M
3D"[cmake-3.8.0-win64-x64.zip<= /td>2017-04-10 13:38 24M 
3D"[cmake-3.8.0.tar.Z2017-04-10 13:38 12M 
3D"[cmake-3.8.0.tar.gz2017-04-10 13:38 7.2M 
3D"[cmake-3.8.0.zip2017-04-10 13:38 12M 
3D"[cmake-3.8.1-Darwin-x86_64.dmg= 2017-05-02 11:06 26= M 
3D"[cmake-3.8.1-Darwin-x86_= 64.tar.gz2017-05-02 11:06 26M 
3D"[TXT]"2017-05-02 11:06 31M
3D"[cmake-3.8.1-Linux-x86_64= .tar.gz2017-05-02 11:05 31M 
3D"[TXT]"2017-05-02 11:05 1.0K = ;
3D"[TXT]"2017-05-02 11:05 833
3D"[cmake-3.8.1-win32-x86.msi2017-05-02 11:05 16M
3D"[cmake-3.8.1-win32-x86.zip<= /td>2017-05-02 11:05 22M 
3D"[cmake-3.8.1-win64-x64.msi2017-05-02 11:05 18M
3D"[cmake-3.8.1-win64-x64.zip<= /td>2017-05-02 11:05 24M 
3D"[cmake-3.8.1.tar.Z2017-05-02 11:05 12M 
3D"[cmake-3.8.1.tar.gz2017-05-02 11:05 7.2M 
3D"[cmake-3.8.1.zip2017-05-02 11:05 12M 
3D"[cmake-3.8.2-Darwin-x86_64.dmg= 2017-05-31 12:26 26= M 
3D"[cmake-3.8.2-Darwin-x86_= 64.tar.gz2017-05-31 12:26 25M 
3D"[TXT]"2017-05-31 12:26 31M
3D"[cmake-3.8.2-Linux-x86_64= .tar.gz2017-05-31 12:26 31M 
3D"[TXT]"2017-05-31 12:26 1.0K = ;
3D"[TXT]"2017-05-31 12:26 833
3D"[cmake-3.8.2-win32-x86.msi2017-05-31 12:26 16M
3D"[cmake-3.8.2-win32-x86.zip<= /td>2017-05-31 12:26 22M 
3D"[cmake-3.8.2-win64-x64.msi2017-05-31 12:25 18M
3D"[cmake-3.8.2-win64-x64.zip<= /td>2017-05-31 12:25 24M 
3D"[cmake-3.8.2.tar.Z2017-05-31 12:25 12M 
3D"[cmake-3.8.2.tar.gz2017-05-31 12:25 7.2M 
3D"[cmake-3.8.2.zip2017-05-31 12:25 12M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.9/index.html b/bi= tbake/lib/bb/tests/fetch-testdata/files/v3.9/index.html new file mode 100644 index 0000000..54182af --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/files/v3.9/index.html @@ -0,0 +1,183 @@ + + + + Index of /files/v3.9 + + +

Index of /files/v3.9

+ + + + += + +cmake-3.9.0-Linux-x86_64.sh<= td>  + +cmake-3.9.0-SHA-256.txt +cmake-3.9.0-SHA-256.txt.asc<= td>  += + +cmake-3.9.0-rc1-Linux-x86_64.s= h + +cmake-3.9.0-rc1-SHA-256.txt<= td>  +cmake-3.9.0-rc1-SHA-256.txt.as= c += + += + + +2017-06-05 14:47 + += + +cmake-3.9.0-rc2-Linux-x86_64.s= h + +cmake-3.9.0-rc2-SHA-256.txt<= td>  +cmake-3.9.0-rc2-SHA-256.txt.as= c += + += + + +2017-06-07 14:46 + += + +cmake-3.9.0-rc3-Linux-x86_64.s= h + +cmake-3.9.0-rc3-SHA-256.txt<= td>  +cmake-3.9.0-rc3-SHA-256.txt.as= c += + += + + +2017-06-13 14:01 + += + +cmake-3.9.0-rc4-Linux-x86_64.s= h + +cmake-3.9.0-rc4-SHA-256.txt<= td>  +cmake-3.9.0-rc4-SHA-256.txt.as= c += + += + + +2017-06-22 13:26 + += + +cmake-3.9.0-rc5-Linux-x86_64.s= h + +cmake-3.9.0-rc5-SHA-256.txt<= td>  +cmake-3.9.0-rc5-SHA-256.txt.as= c += + += + + +2017-06-27 13:55 + += + +cmake-3.9.0-rc6-Linux-x86_64.s= h + +cmake-3.9.0-rc6-SHA-256.txt<= td>  +cmake-3.9.0-rc6-SHA-256.txt.as= c += + += + + +2017-07-12 11:45 + +=   + +=   + += + + += + +cmake-3.9.1-Linux-x86_64.sh<= td>  + +cmake-3.9.1-SHA-256.txt +cmake-3.9.1-SHA-256.txt.asc<= td>  +=   + +=   + += + + += + +cmake-3.9.2-Linux-x86_64.sh<= td>  + +cmake-3.9.2-SHA-256.txt +cmake-3.9.2-SHA-256.txt.asc<= td>  +=   + +=   + += + + += + +cmake-3.9.3-Linux-x86_64.sh<= td>  + +cmake-3.9.3-SHA-256.txt +cmake-3.9.3-SHA-256.txt.asc<= td>  +=   + +=   + += + + += + +cmake-3.9.4-Linux-x86_64.sh<= td>  + +cmake-3.9.4-SHA-256.txt +cmake-3.9.4-SHA-256.txt.asc<= td>  +=   + +=   + += + + += + +cmake-3.9.5-Linux-x86_64.sh<= td>  + +cmake-3.9.5-SHA-256.txt +cmake-3.9.5-SHA-256.txt.asc<= td>  +=   + +=   + += + + += + +cmake-3.9.6-Linux-x86_64.sh<= td>  + +cmake-3.9.6-SHA-256.txt +cmake-3.9.6-SHA-256.txt.asc<= td>  +=   + +=   + += + + + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory  -  
3D"[cmake-3.9.0-Darwin-x86_64.dmg= 2017-07-18 13:32 26= M 
3D"[cmake-3.9.0-Darwin-x86_= 64.tar.gz2017-07-18 13:32 25M 
3D"[TXT]"2017-07-18 13:32 31M
3D"[cmake-3.9.0-Linux-x86_64= .tar.gz2017-07-18 13:32 31M 
3D"[TXT]"2017-07-18 13:32 1.0K = ;
3D"[TXT]"2017-07-18 13:32 833
3D"[cmake-3.9.0-rc1-Darwin-x8= 6_64.dmg2017-06-05 14:48 26M 
3D"[cmake-3.9.0-rc1-Dar= win-x86_64.tar.gz2017-06-05 14:48 25M 
3D"[TXT]"2017-06-05 14:48 3= 1M 
3D"[cmake-3.9.0-rc1-Linu= x-x86_64.tar.gz2017-06-05 14:48 31M 
3D"[TXT]"2017-06-05 14:48 1.0K
3D"[TXT]"2017-06-05 14:47 83= 3  
3D"[cmake-3.9.0-rc1-win32-x86.msi= 2017-06-05 14:47 16= M 
3D"[cmake-3.9.0-rc1-win32-x86.= zip2017-06-05 14:47 = 22M 
3D"[cmake-3.9.0-rc1-win64-x64.msi= 2017-06-05 14:47 18= M 
3D"[cmake-3.9.0-rc1-win64-x64.= zip2017-06-05 14:47 = 25M 
3D"[cmake-3.9.0-rc1.tar.Z2017-06-05 14:47 12M&nb= sp;
3D"[cmake-3.9.0-rc1.tar.gz7.3M&= nbsp;
3D"[cmake-3.9.0-rc1.zip2017-06-05 14:47 12M <= /td>
3D"[cmake-3.9.0-rc2-Darwin-x8= 6_64.dmg2017-06-07 14:46 26M 
3D"[cmake-3.9.0-rc2-Dar= win-x86_64.tar.gz2017-06-07 14:46 25M 
3D"[TXT]"2017-06-07 14:46 3= 1M 
3D"[cmake-3.9.0-rc2-Linu= x-x86_64.tar.gz2017-06-07 14:46 31M 
3D"[TXT]"2017-06-07 14:46 1.0K
3D"[TXT]"2017-06-07 14:46 83= 3  
3D"[cmake-3.9.0-rc2-win32-x86.msi= 2017-06-07 14:46 16= M 
3D"[cmake-3.9.0-rc2-win32-x86.= zip2017-06-07 14:46 = 22M 
3D"[cmake-3.9.0-rc2-win64-x64.msi= 2017-06-07 14:46 18= M 
3D"[cmake-3.9.0-rc2-win64-x64.= zip2017-06-07 14:46 = 25M 
3D"[cmake-3.9.0-rc2.tar.Z2017-06-07 14:46 12M&nb= sp;
3D"[cmake-3.9.0-rc2.tar.gz7.3M&= nbsp;
3D"[cmake-3.9.0-rc2.zip2017-06-07 14:46 12M <= /td>
3D"[cmake-3.9.0-rc3-Darwin-x8= 6_64.dmg2017-06-13 14:02 26M 
3D"[cmake-3.9.0-rc3-Dar= win-x86_64.tar.gz2017-06-13 14:02 25M 
3D"[TXT]"2017-06-13 14:02 3= 1M 
3D"[cmake-3.9.0-rc3-Linu= x-x86_64.tar.gz2017-06-13 14:02 31M 
3D"[TXT]"2017-06-13 14:02 1.0K
3D"[TXT]"2017-06-13 14:02 83= 3  
3D"[cmake-3.9.0-rc3-win32-x86.msi= 2017-06-13 14:02 16= M 
3D"[cmake-3.9.0-rc3-win32-x86.= zip2017-06-13 14:02 = 22M 
3D"[cmake-3.9.0-rc3-win64-x64.msi= 2017-06-13 14:01 18= M 
3D"[cmake-3.9.0-rc3-win64-x64.= zip2017-06-13 14:01 = 25M 
3D"[cmake-3.9.0-rc3.tar.Z2017-06-13 14:01 12M&nb= sp;
3D"[cmake-3.9.0-rc3.tar.gz7.3M&= nbsp;
3D"[cmake-3.9.0-rc3.zip2017-06-13 14:01 12M <= /td>
3D"[cmake-3.9.0-rc4-Darwin-x8= 6_64.dmg2017-06-22 13:27 26M 
3D"[cmake-3.9.0-rc4-Dar= win-x86_64.tar.gz2017-06-22 13:27 25M 
3D"[TXT]"2017-06-22 13:27 3= 1M 
3D"[cmake-3.9.0-rc4-Linu= x-x86_64.tar.gz2017-06-22 13:27 31M 
3D"[TXT]"2017-06-22 13:27 1.0K
3D"[TXT]"2017-06-22 13:26 83= 3  
3D"[cmake-3.9.0-rc4-win32-x86.msi= 2017-06-22 13:26 16= M 
3D"[cmake-3.9.0-rc4-win32-x86.= zip2017-06-22 13:26 = 22M 
3D"[cmake-3.9.0-rc4-win64-x64.msi= 2017-06-22 13:26 18= M 
3D"[cmake-3.9.0-rc4-win64-x64.= zip2017-06-22 13:26 = 25M 
3D"[cmake-3.9.0-rc4.tar.Z2017-06-22 13:26 12M&nb= sp;
3D"[cmake-3.9.0-rc4.tar.gz7.3M&= nbsp;
3D"[cmake-3.9.0-rc4.zip2017-06-22 13:26 12M <= /td>
3D"[cmake-3.9.0-rc5-Darwin-x8= 6_64.dmg2017-06-27 13:56 26M 
3D"[cmake-3.9.0-rc5-Dar= win-x86_64.tar.gz2017-06-27 13:56 25M 
3D"[TXT]"2017-06-27 13:56 3= 1M 
3D"[cmake-3.9.0-rc5-Linu= x-x86_64.tar.gz2017-06-27 13:56 31M 
3D"[TXT]"2017-06-27 13:56 1.0K
3D"[TXT]"2017-06-27 13:56 83= 3  
3D"[cmake-3.9.0-rc5-win32-x86.msi= 2017-06-27 13:56 16= M 
3D"[cmake-3.9.0-rc5-win32-x86.= zip2017-06-27 13:56 = 22M 
3D"[cmake-3.9.0-rc5-win64-x64.msi= 2017-06-27 13:56 18= M 
3D"[cmake-3.9.0-rc5-win64-x64.= zip2017-06-27 13:56 = 25M 
3D"[cmake-3.9.0-rc5.tar.Z2017-06-27 13:55 12M&nb= sp;
3D"[cmake-3.9.0-rc5.tar.gz7.3M&= nbsp;
3D"[cmake-3.9.0-rc5.zip2017-06-27 13:55 12M <= /td>
3D"[cmake-3.9.0-rc6-Darwin-x8= 6_64.dmg2017-07-12 11:46 26M 
3D"[cmake-3.9.0-rc6-Dar= win-x86_64.tar.gz2017-07-12 11:46 25M 
3D"[TXT]"2017-07-12 11:46 3= 1M 
3D"[cmake-3.9.0-rc6-Linu= x-x86_64.tar.gz2017-07-12 11:46 31M 
3D"[TXT]"2017-07-12 11:46 1.0K
3D"[TXT]"2017-07-12 11:46 83= 3  
3D"[cmake-3.9.0-rc6-win32-x86.msi= 2017-07-12 11:46 16= M 
3D"[cmake-3.9.0-rc6-win32-x86.= zip2017-07-12 11:45 = 22M 
3D"[cmake-3.9.0-rc6-win64-x64.msi= 2017-07-12 11:45 18= M 
3D"[cmake-3.9.0-rc6-win64-x64.= zip2017-07-12 11:45 = 25M 
3D"[cmake-3.9.0-rc6.tar.Z2017-07-12 11:45 12M&nb= sp;
3D"[cmake-3.9.0-rc6.tar.gz7.3M&= nbsp;
3D"[cmake-3.9.0-rc6.zip2017-07-12 11:45 12M <= /td>
3D"[cmake-3.9.0-win32-x86.msi2017-07-18 13:32 16M
3D"[cmake-3.9.0-win32-x86.zip<= /td>2017-07-18 13:32 22M 
3D"[cmake-3.9.0-win64-x64.msi2017-07-18 13:32 18M
3D"[cmake-3.9.0-win64-x64.zip<= /td>2017-07-18 13:31 25M 
3D"[cmake-3.9.0.tar.Z2017-07-18 13:31 12M 
3D"[cmake-3.9.0.tar.gz2017-07-18 13:31 7.3M 
3D"[cmake-3.9.0.zip2017-07-18 13:31 12M 
3D"[cmake-3.9.1-Darwin-x86_64.dmg= 2017-08-10 11:49 26= M 
3D"[cmake-3.9.1-Darwin-x86_= 64.tar.gz2017-08-10 11:49 25M 
3D"[TXT]"2017-08-10 11:49 31M
3D"[cmake-3.9.1-Linux-x86_64= .tar.gz2017-08-10 11:49 31M 
3D"[TXT]"2017-08-10 11:49 1.0K = ;
3D"[TXT]"2017-08-10 11:49 833
3D"[cmake-3.9.1-win32-x86.msi2017-08-10 11:49 16M
3D"[cmake-3.9.1-win32-x86.zip<= /td>2017-08-10 11:49 22M 
3D"[cmake-3.9.1-win64-x64.msi2017-08-10 11:49 18M
3D"[cmake-3.9.1-win64-x64.zip<= /td>2017-08-10 11:49 25M 
3D"[cmake-3.9.1.tar.Z2017-08-10 11:49 12M 
3D"[cmake-3.9.1.tar.gz2017-08-10 11:49 7.3M 
3D"[cmake-3.9.1.zip2017-08-10 11:49 12M 
3D"[cmake-3.9.2-Darwin-x86_64.dmg= 2017-09-07 15:55 26= M 
3D"[cmake-3.9.2-Darwin-x86_= 64.tar.gz2017-09-07 15:54 25M 
3D"[TXT]"2017-09-07 15:54 31M
3D"[cmake-3.9.2-Linux-x86_64= .tar.gz2017-09-07 15:54 31M 
3D"[TXT]"2017-09-07 15:54 1.0K = ;
3D"[TXT]"2017-09-07 15:54 833
3D"[cmake-3.9.2-win32-x86.msi2017-09-07 15:54 16M
3D"[cmake-3.9.2-win32-x86.zip<= /td>2017-09-07 15:54 22M 
3D"[cmake-3.9.2-win64-x64.msi2017-09-07 15:54 18M
3D"[cmake-3.9.2-win64-x64.zip<= /td>2017-09-07 15:54 25M 
3D"[cmake-3.9.2.tar.Z2017-09-07 15:54 12M 
3D"[cmake-3.9.2.tar.gz2017-09-07 15:54 7.3M 
3D"[cmake-3.9.2.zip2017-09-07 15:54 12M 
3D"[cmake-3.9.3-Darwin-x86_64.dmg= 2017-09-20 11:59 26= M 
3D"[cmake-3.9.3-Darwin-x86_= 64.tar.gz2017-09-20 11:59 25M 
3D"[TXT]"2017-09-20 11:59 31M
3D"[cmake-3.9.3-Linux-x86_64= .tar.gz2017-09-20 11:59 31M 
3D"[TXT]"2017-09-20 11:59 1.0K = ;
3D"[TXT]"2017-09-20 11:59 833
3D"[cmake-3.9.3-win32-x86.msi2017-09-20 11:59 16M
3D"[cmake-3.9.3-win32-x86.zip<= /td>2017-09-20 11:59 22M 
3D"[cmake-3.9.3-win64-x64.msi2017-09-20 11:59 18M
3D"[cmake-3.9.3-win64-x64.zip<= /td>2017-09-20 11:59 25M 
3D"[cmake-3.9.3.tar.Z2017-09-20 11:59 12M 
3D"[cmake-3.9.3.tar.gz2017-09-20 11:59 7.3M 
3D"[cmake-3.9.3.zip2017-09-20 11:59 12M 
3D"[cmake-3.9.4-Darwin-x86_64.dmg= 2017-10-04 09:43 26= M 
3D"[cmake-3.9.4-Darwin-x86_= 64.tar.gz2017-10-04 09:43 25M 
3D"[TXT]"2017-10-04 09:43 31M
3D"[cmake-3.9.4-Linux-x86_64= .tar.gz2017-10-04 09:43 31M 
3D"[TXT]"2017-10-04 09:43 1.0K = ;
3D"[TXT]"2017-10-04 09:42 833
3D"[cmake-3.9.4-win32-x86.msi2017-10-04 09:42 16M
3D"[cmake-3.9.4-win32-x86.zip<= /td>2017-10-04 09:42 22M 
3D"[cmake-3.9.4-win64-x64.msi2017-10-04 09:42 18M
3D"[cmake-3.9.4-win64-x64.zip<= /td>2017-10-04 09:42 25M 
3D"[cmake-3.9.4.tar.Z2017-10-04 09:42 12M 
3D"[cmake-3.9.4.tar.gz2017-10-04 09:42 7.3M 
3D"[cmake-3.9.4.zip2017-10-04 09:42 12M 
3D"[cmake-3.9.5-Darwin-x86_64.dmg= 2017-11-03 10:26 26= M 
3D"[cmake-3.9.5-Darwin-x86_= 64.tar.gz2017-11-03 10:26 25M 
3D"[TXT]"2017-11-03 10:26 31M
3D"[cmake-3.9.5-Linux-x86_64= .tar.gz2017-11-03 10:26 31M 
3D"[TXT]"2017-11-03 10:26 1.0K = ;
3D"[TXT]"2017-11-03 10:26 833
3D"[cmake-3.9.5-win32-x86.msi2017-11-03 10:26 16M
3D"[cmake-3.9.5-win32-x86.zip<= /td>2017-11-03 10:26 22M 
3D"[cmake-3.9.5-win64-x64.msi2017-11-03 10:26 18M
3D"[cmake-3.9.5-win64-x64.zip<= /td>2017-11-03 10:26 25M 
3D"[cmake-3.9.5.tar.Z2017-11-03 10:26 12M 
3D"[cmake-3.9.5.tar.gz2017-11-03 10:26 7.3M 
3D"[cmake-3.9.5.zip2017-11-03 10:26 12M 
3D"[cmake-3.9.6-Darwin-x86_64.dmg= 2017-11-10 09:22 26= M 
3D"[cmake-3.9.6-Darwin-x86_= 64.tar.gz2017-11-10 09:21 25M 
3D"[TXT]"2017-11-10 09:21 31M
3D"[cmake-3.9.6-Linux-x86_64= .tar.gz2017-11-10 09:21 31M 
3D"[TXT]"2017-11-10 09:21 1.0K = ;
3D"[TXT]"2017-11-10 09:21 833
3D"[cmake-3.9.6-win32-x86.msi2017-11-10 09:21 16M
3D"[cmake-3.9.6-win32-x86.zip<= /td>2017-11-10 09:21 22M 
3D"[cmake-3.9.6-win64-x64.msi2017-11-10 09:21 18M
3D"[cmake-3.9.6-win64-x64.zip<= /td>2017-11-10 09:21 25M 
3D"[cmake-3.9.6.tar.Z2017-11-10 09:21 12M 
3D"[cmake-3.9.6.tar.gz2017-11-10 09:21 7.3M 
3D"[cmake-3.9.6.zip2017-11-10 09:21 12M 

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.23/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.23/index.html new file mode 100644 index 0000000..b3d9244 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.23/= index.html @@ -0,0 +1,45 @@ + +Index of /pub/linux/utils/util-linux/v2.23/ + +

Index of /pub/linux/utils/util-linux/v2.23/


../
+libblkid-docs/                             =
        31-Jul-2013 12:35       -
+libmount-docs/                             =
        31-Jul-2013 12:39       -
+sha256sums.asc                             =
        12-May-2017 10:53    2942
+util-linux-2.23-rc1.tar.bz2   =
                     22-Mar-2013 12:48      5M
+util-linux-2.23-rc1.tar.gz     =
                    22-Mar-2013 12:48      7M
+util-linux-2.23-rc1.tar.sign =
                      22-Mar-2013 12:48     836
+util-linux-2.23-rc1.tar.xz     =
                    22-Mar-2013 12:48      3M
+util-linux-2.23-rc2.tar.bz2   =
                     10-Apr-2013 22:14      5M
+util-linux-2.23-rc2.tar.gz     =
                    10-Apr-2013 22:14      7M
+util-linux-2.23-rc2.tar.sign =
                      10-Apr-2013 22:14     836
+util-linux-2.23-rc2.tar.xz     =
                    10-Apr-2013 22:14      3M
+util-linux-2.23.1.tar.bz2       =
                   28-May-2013 09:57      5M
+util-linux-2.23.1.tar.gz         =
                  28-May-2013 09:57      7M
+util-linux-2.23.1.tar.sign     =
                    28-May-2013 09:57     836
+util-linux-2.23.1.tar.xz         =
                  28-May-2013 09:57      3M
+util-linux-2.23.2.tar.bz2       =
                   31-Jul-2013 12:40      5M
+util-linux-2.23.2.tar.gz         =
                  31-Jul-2013 12:40      7M
+util-linux-2.23.2.tar.sign     =
                    31-Jul-2013 12:40     836
+util-linux-2.23.2.tar.xz         =
                  31-Jul-2013 12:40      3M
+util-linux-2.23.tar.bz2           =
                 25-Apr-2013 10:48      5M
+util-linux-2.23.tar.gz             =
                25-Apr-2013 10:48      7M
+util-linux-2.23.tar.sign         =
                  25-Apr-2013 10:48     836
+util-linux-2.23.tar.xz             =
                25-Apr-2013 10:48      3M
+v2.23-ChangeLog                           =
         25-Apr-2013 10:48     19K
+v2.23-ChangeLog.sign                 =
              25-Apr-2013 10:48     836
+v2.23-ReleaseNotes                     =
            25-Apr-2013 10:48     53K
+v2.23-ReleaseNotes.sign           =
                 25-Apr-2013 10:48     836
+v2.23-rc1-ChangeLog                   =
             22-Mar-2013 12:48    361K
+v2.23-rc1-ChangeLog.sign         =
                  22-Mar-2013 12:48     836
+v2.23-rc2-ChangeLog                   =
             10-Apr-2013 22:14     80K
+v2.23-rc2-ChangeLog.sign         =
                  10-Apr-2013 22:14     836
+v2.23.1-ChangeLog                       =
           28-May-2013 09:57     13K
+v2.23.1-ChangeLog.sign             =
                28-May-2013 09:57     836
+v2.23.1-ReleaseNotes                 =
              28-May-2013 09:58    1448
+v2.23.1-ReleaseNotes.sign       =
                   28-May-2013 09:58     836
+v2.23.2-ChangeLog                       =
           31-Jul-2013 12:40     23K
+v2.23.2-ChangeLog.sign             =
                31-Jul-2013 12:40     836
+v2.23.2-ReleaseNotes                 =
              31-Jul-2013 12:40    2582
+v2.23.2-ReleaseNotes.sign       =
                   31-Jul-2013 12:40     836
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.24/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.24/index.html new file mode 100644 index 0000000..4afb462 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.24/= index.html @@ -0,0 +1,43 @@ + +Index of /pub/linux/utils/util-linux/v2.24/ + +

Index of /pub/linux/utils/util-linux/v2.24/


../
+libblkid-docs/                             =
        24-Apr-2014 10:15       -
+libmount-docs/                             =
        24-Apr-2014 10:17       -
+sha256sums.asc                             =
        12-May-2017 10:53    2758
+util-linux-2.24-rc1.tar.bz2   =
                     27-Sep-2013 12:54      5M
+util-linux-2.24-rc1.tar.gz     =
                    27-Sep-2013 12:54      7M
+util-linux-2.24-rc1.tar.sign =
                      27-Sep-2013 12:54     836
+util-linux-2.24-rc1.tar.xz     =
                    27-Sep-2013 12:54      3M
+util-linux-2.24-rc2.tar.bz2   =
                     11-Oct-2013 11:37      5M
+util-linux-2.24-rc2.tar.gz     =
                    11-Oct-2013 11:37      7M
+util-linux-2.24-rc2.tar.sign =
                      11-Oct-2013 11:37     836
+util-linux-2.24-rc2.tar.xz     =
                    11-Oct-2013 11:37      3M
+util-linux-2.24.1.tar.gz         =
                  20-Jan-2014 13:33      7M
+util-linux-2.24.1.tar.sign     =
                    20-Jan-2014 13:33     819
+util-linux-2.24.1.tar.xz         =
                  20-Jan-2014 13:33      3M
+util-linux-2.24.2.tar.gz         =
                  24-Apr-2014 10:17      7M
+util-linux-2.24.2.tar.sign     =
                    24-Apr-2014 10:17     819
+util-linux-2.24.2.tar.xz         =
                  24-Apr-2014 10:17      3M
+util-linux-2.24.tar.bz2           =
                 21-Oct-2013 13:49      5M
+util-linux-2.24.tar.gz             =
                21-Oct-2013 13:49      7M
+util-linux-2.24.tar.sign         =
                  21-Oct-2013 13:49     836
+util-linux-2.24.tar.xz             =
                21-Oct-2013 13:49      3M
+v2.24-ChangeLog                           =
         21-Oct-2013 13:49     22K
+v2.24-ChangeLog.sign                 =
              21-Oct-2013 13:49     836
+v2.24-ReleaseNotes                     =
            21-Oct-2013 13:49     44K
+v2.24-ReleaseNotes.sign           =
                 21-Oct-2013 13:49     836
+v2.24-rc1-ChangeLog                   =
             27-Sep-2013 12:54    292K
+v2.24-rc1-ChangeLog.sign         =
                  27-Sep-2013 12:54     836
+v2.24-rc2-ChangeLog                   =
             11-Oct-2013 11:37     42K
+v2.24-rc2-ChangeLog.sign         =
                  11-Oct-2013 11:37     836
+v2.24.1-ChangeLog                       =
           20-Jan-2014 13:33     38K
+v2.24.1-ChangeLog.sign             =
                20-Jan-2014 13:33     819
+v2.24.1-ReleaseNotes                 =
              20-Jan-2014 13:33    4449
+v2.24.1-ReleaseNotes.sign       =
                   20-Jan-2014 13:33     819
+v2.24.2-ChangeLog                       =
           24-Apr-2014 10:17     47K
+v2.24.2-ChangeLog.sign             =
                24-Apr-2014 10:17     819
+v2.24.2-ReleaseNotes                 =
              24-Apr-2014 10:18    5748
+v2.24.2-ReleaseNotes.sign       =
                   24-Apr-2014 10:18     819
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.25/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.25/index.html new file mode 100644 index 0000000..9516c3b --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.25/= index.html @@ -0,0 +1,46 @@ + +Index of /pub/linux/utils/util-linux/v2.25/ + +

Index of /pub/linux/utils/util-linux/v2.25/


../
+libblkid-docs/                             =
        24-Oct-2014 13:05       -
+libmount-docs/                             =
        24-Oct-2014 13:06       -
+libsmartcols-docs/                     =
            24-Oct-2014 13:08       -
+sha256sums.asc                             =
        12-May-2017 10:53    2758
+util-linux-2.25-rc1.tar.gz     =
                    18-Jun-2014 13:33      7M
+util-linux-2.25-rc1.tar.sign =
                      18-Jun-2014 13:33     819
+util-linux-2.25-rc1.tar.xz     =
                    18-Jun-2014 13:33      3M
+util-linux-2.25-rc2.tar.gz     =
                    02-Jul-2014 10:02      7M
+util-linux-2.25-rc2.tar.sign =
                      02-Jul-2014 10:02     819
+util-linux-2.25-rc2.tar.xz     =
                    02-Jul-2014 10:02      3M
+util-linux-2.25.1-rc1.tar.gz =
                      27-Aug-2014 13:18      8M
+util-linux-2.25.1-rc1.tar.sign<=
/a>                     27-Aug-2014 13:18     819
+util-linux-2.25.1-rc1.tar.xz =
                      27-Aug-2014 13:18      4M
+util-linux-2.25.1.tar.gz         =
                  03-Sep-2014 10:41      8M
+util-linux-2.25.1.tar.sign     =
                    03-Sep-2014 10:41     819
+util-linux-2.25.1.tar.xz         =
                  03-Sep-2014 10:41      4M
+util-linux-2.25.2.tar.gz         =
                  24-Oct-2014 13:08      8M
+util-linux-2.25.2.tar.sign     =
                    24-Oct-2014 13:08     819
+util-linux-2.25.2.tar.xz         =
                  24-Oct-2014 13:08      4M
+util-linux-2.25.tar.gz             =
                22-Jul-2014 09:50      8M
+util-linux-2.25.tar.sign         =
                  22-Jul-2014 09:50     819
+util-linux-2.25.tar.xz             =
                22-Jul-2014 09:50      4M
+v2.25-ChangeLog                           =
         22-Jul-2014 09:50     41K
+v2.25-ChangeLog.sign                 =
              22-Jul-2014 09:50     819
+v2.25-ReleaseNotes                     =
            22-Jul-2014 09:50     61K
+v2.25-ReleaseNotes.sign           =
                 22-Jul-2014 09:50     819
+v2.25-rc1-ChangeLog                   =
             18-Jun-2014 13:33    489K
+v2.25-rc1-ChangeLog.sign         =
                  18-Jun-2014 13:33     819
+v2.25-rc2-ChangeLog                   =
             02-Jul-2014 10:02     27K
+v2.25-rc2-ChangeLog.sign         =
                  02-Jul-2014 10:02     819
+v2.25.1-ChangeLog                       =
           03-Sep-2014 10:41    5816
+v2.25.1-ChangeLog.sign             =
                03-Sep-2014 10:41     819
+v2.25.1-ReleaseNotes                 =
              03-Sep-2014 10:52    3220
+v2.25.1-ReleaseNotes.sign       =
                   03-Sep-2014 10:52     819
+v2.25.1-rc1-ChangeLog               =
               27-Aug-2014 13:18     22K
+v2.25.1-rc1-ChangeLog.sign     =
                    27-Aug-2014 13:18     819
+v2.25.2-ChangeLog                       =
           24-Oct-2014 13:08     26K
+v2.25.2-ChangeLog.sign             =
                24-Oct-2014 13:08     819
+v2.25.2-ReleaseNotes                 =
              24-Oct-2014 13:08    3016
+v2.25.2-ReleaseNotes.sign       =
                   24-Oct-2014 13:08     819
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.26/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.26/index.html new file mode 100644 index 0000000..b991489 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.26/= index.html @@ -0,0 +1,42 @@ + +Index of /pub/linux/utils/util-linux/v2.26/ + +

Index of /pub/linux/utils/util-linux/v2.26/


../
+libblkid-docs/                             =
        30-Apr-2015 10:38       -
+libfdisk-docs/                             =
        30-Apr-2015 10:40       -
+libmount-docs/                             =
        30-Apr-2015 10:42       -
+libsmartcols-docs/                     =
            30-Apr-2015 10:43       -
+sha256sums.asc                             =
        12-May-2017 10:54    2480
+util-linux-2.26-rc1.tar.gz     =
                    14-Jan-2015 13:14      8M
+util-linux-2.26-rc1.tar.sign =
                      14-Jan-2015 13:14     819
+util-linux-2.26-rc1.tar.xz     =
                    14-Jan-2015 13:14      4M
+util-linux-2.26-rc2.tar.gz     =
                    04-Feb-2015 11:49      8M
+util-linux-2.26-rc2.tar.sign =
                      04-Feb-2015 11:49     819
+util-linux-2.26-rc2.tar.xz     =
                    04-Feb-2015 11:49      4M
+util-linux-2.26.1.tar.gz         =
                  13-Mar-2015 14:23      8M
+util-linux-2.26.1.tar.sign     =
                    13-Mar-2015 14:23     819
+util-linux-2.26.1.tar.xz         =
                  13-Mar-2015 14:23      4M
+util-linux-2.26.2.tar.gz         =
                  30-Apr-2015 10:44      8M
+util-linux-2.26.2.tar.sign     =
                    30-Apr-2015 10:44     819
+util-linux-2.26.2.tar.xz         =
                  30-Apr-2015 10:44      4M
+util-linux-2.26.tar.gz             =
                19-Feb-2015 12:47      8M
+util-linux-2.26.tar.sign         =
                  19-Feb-2015 12:47     819
+util-linux-2.26.tar.xz             =
                19-Feb-2015 12:47      4M
+v2.26-ChangeLog                           =
         19-Feb-2015 12:47     30K
+v2.26-ChangeLog.sign                 =
              19-Feb-2015 12:47     819
+v2.26-ReleaseNotes                     =
            19-Feb-2015 12:47     51K
+v2.26-ReleaseNotes.sign           =
                 19-Feb-2015 12:47     819
+v2.26-rc1-ChangeLog                   =
             14-Jan-2015 13:14    360K
+v2.26-rc1-ChangeLog.sign         =
                  14-Jan-2015 13:14     819
+v2.26-rc2-ChangeLog                   =
             04-Feb-2015 11:50     51K
+v2.26-rc2-ChangeLog.sign         =
                  04-Feb-2015 11:50     819
+v2.26.1-ChangeLog                       =
           13-Mar-2015 14:23     32K
+v2.26.1-ChangeLog.sign             =
                13-Mar-2015 14:23     819
+v2.26.1-ReleaseNotes                 =
              13-Mar-2015 14:23    2944
+v2.26.1-ReleaseNotes.sign       =
                   13-Mar-2015 14:23     819
+v2.26.2-ChangeLog                       =
           30-Apr-2015 10:44     58K
+v2.26.2-ChangeLog.sign             =
                30-Apr-2015 10:44     819
+v2.26.2-ReleaseNotes                 =
              30-Apr-2015 10:44    5834
+v2.26.2-ReleaseNotes.sign       =
                   30-Apr-2015 10:44     819
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.27/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.27/index.html new file mode 100644 index 0000000..14eb368 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.27/= index.html @@ -0,0 +1,35 @@ + +Index of /pub/linux/utils/util-linux/v2.27/ + +

Index of /pub/linux/utils/util-linux/v2.27/


../
+libblkid-docs/                             =
        02-Nov-2015 11:01       -
+libfdisk-docs/                             =
        02-Nov-2015 11:03       -
+libmount-docs/                             =
        02-Nov-2015 11:04       -
+libsmartcols-docs/                     =
            02-Nov-2015 11:06       -
+sha256sums.asc                             =
        12-May-2017 10:54    2127
+util-linux-2.27-rc1.tar.gz     =
                    31-Jul-2015 11:01      8M
+util-linux-2.27-rc1.tar.sign =
                      31-Jul-2015 11:01     819
+util-linux-2.27-rc1.tar.xz     =
                    31-Jul-2015 11:01      4M
+util-linux-2.27-rc2.tar.gz     =
                    24-Aug-2015 11:04      8M
+util-linux-2.27-rc2.tar.sign =
                      24-Aug-2015 11:04     819
+util-linux-2.27-rc2.tar.xz     =
                    24-Aug-2015 11:04      4M
+util-linux-2.27.1.tar.gz         =
                  02-Nov-2015 11:06      8M
+util-linux-2.27.1.tar.sign     =
                    02-Nov-2015 11:06     819
+util-linux-2.27.1.tar.xz         =
                  02-Nov-2015 11:06      4M
+util-linux-2.27.tar.gz             =
                07-Sep-2015 08:17      8M
+util-linux-2.27.tar.sign         =
                  07-Sep-2015 08:17     819
+util-linux-2.27.tar.xz             =
                07-Sep-2015 08:17      4M
+v2.27-ChangeLog                           =
         07-Sep-2015 08:17     21K
+v2.27-ChangeLog.sign                 =
              07-Sep-2015 08:17     819
+v2.27-ReleaseNotes                     =
            07-Sep-2015 08:17     35K
+v2.27-ReleaseNotes.sign           =
                 07-Sep-2015 08:17     819
+v2.27-rc1-ChangeLog                   =
             31-Jul-2015 11:01    263K
+v2.27-rc1-ChangeLog.sign         =
                  31-Jul-2015 11:01     819
+v2.27-rc2-ChangeLog                   =
             24-Aug-2015 11:04     38K
+v2.27-rc2-ChangeLog.sign         =
                  24-Aug-2015 11:04     819
+v2.27.1-ChangeLog                       =
           02-Nov-2015 11:06     18K
+v2.27.1-ChangeLog.sign             =
                02-Nov-2015 11:06     819
+v2.27.1-ReleaseNotes                 =
              02-Nov-2015 11:06    2107
+v2.27.1-ReleaseNotes.sign       =
                   02-Nov-2015 11:06     819
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.28/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.28/index.html new file mode 100644 index 0000000..4bba6b4 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.28/= index.html @@ -0,0 +1,42 @@ + +Index of /pub/linux/utils/util-linux/v2.28/ + +

Index of /pub/linux/utils/util-linux/v2.28/


../
+libblkid-docs/                             =
        07-Sep-2016 12:00       -
+libfdisk-docs/                             =
        07-Sep-2016 12:02       -
+libmount-docs/                             =
        07-Sep-2016 12:04       -
+libsmartcols-docs/                     =
            07-Sep-2016 12:06       -
+sha256sums.asc                             =
        12-May-2017 10:55    2480
+util-linux-2.28-rc1.tar.gz     =
                    11-Mar-2016 11:45      8M
+util-linux-2.28-rc1.tar.sign =
                      11-Mar-2016 11:45     819
+util-linux-2.28-rc1.tar.xz     =
                    11-Mar-2016 11:45      4M
+util-linux-2.28-rc2.tar.gz     =
                    29-Mar-2016 09:04      8M
+util-linux-2.28-rc2.tar.sign =
                      29-Mar-2016 09:04     819
+util-linux-2.28-rc2.tar.xz     =
                    29-Mar-2016 09:04      4M
+util-linux-2.28.1.tar.gz         =
                  11-Aug-2016 10:09      9M
+util-linux-2.28.1.tar.sign     =
                    11-Aug-2016 10:09     819
+util-linux-2.28.1.tar.xz         =
                  11-Aug-2016 10:09      4M
+util-linux-2.28.2.tar.gz         =
                  07-Sep-2016 12:06      9M
+util-linux-2.28.2.tar.sign     =
                    07-Sep-2016 12:06     819
+util-linux-2.28.2.tar.xz         =
                  07-Sep-2016 12:06      4M
+util-linux-2.28.tar.gz             =
                12-Apr-2016 11:26      8M
+util-linux-2.28.tar.sign         =
                  12-Apr-2016 11:26     819
+util-linux-2.28.tar.xz             =
                12-Apr-2016 11:26      4M
+v2.28-ChangeLog                           =
         12-Apr-2016 11:26     13K
+v2.28-ChangeLog.sign                 =
              12-Apr-2016 11:26     819
+v2.28-ReleaseNotes                     =
            12-Apr-2016 11:26     33K
+v2.28-ReleaseNotes.sign           =
                 12-Apr-2016 11:26     819
+v2.28-rc1-ChangeLog                   =
             11-Mar-2016 11:45    269K
+v2.28-rc1-ChangeLog.sign         =
                  11-Mar-2016 11:45     819
+v2.28-rc2-ChangeLog                   =
             29-Mar-2016 09:04     52K
+v2.28-rc2-ChangeLog.sign         =
                  29-Mar-2016 09:04     819
+v2.28.1-ChangeLog                       =
           11-Aug-2016 10:09     37K
+v2.28.1-ChangeLog.sign             =
                11-Aug-2016 10:09     819
+v2.28.1-ReleaseNotes                 =
              11-Aug-2016 10:09    3748
+v2.28.1-ReleaseNotes.sign       =
                   11-Aug-2016 10:09     819
+v2.28.2-ChangeLog                       =
           07-Sep-2016 12:06    8900
+v2.28.2-ChangeLog.sign             =
                07-Sep-2016 12:06     819
+v2.28.2-ReleaseNotes                 =
              07-Sep-2016 12:06    1161
+v2.28.2-ReleaseNotes.sign       =
                   07-Sep-2016 12:06     819
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.29/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.29/index.html new file mode 100644 index 0000000..916a255 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.29/= index.html @@ -0,0 +1,42 @@ + +Index of /pub/linux/utils/util-linux/v2.29/ + +

Index of /pub/linux/utils/util-linux/v2.29/


../
+libblkid-docs/                             =
        22-Feb-2017 15:20       -
+libfdisk-docs/                             =
        22-Feb-2017 15:22       -
+libmount-docs/                             =
        22-Feb-2017 15:24       -
+libsmartcols-docs/                     =
            22-Feb-2017 15:26       -
+sha256sums.asc                             =
        12-May-2017 10:55    2480
+util-linux-2.29-rc1.tar.gz     =
                    30-Sep-2016 09:55      9M
+util-linux-2.29-rc1.tar.sign =
                      30-Sep-2016 09:55     819
+util-linux-2.29-rc1.tar.xz     =
                    30-Sep-2016 09:55      4M
+util-linux-2.29-rc2.tar.gz     =
                    19-Oct-2016 13:13      9M
+util-linux-2.29-rc2.tar.sign =
                      19-Oct-2016 13:13     819
+util-linux-2.29-rc2.tar.xz     =
                    19-Oct-2016 13:13      4M
+util-linux-2.29.1.tar.gz         =
                  20-Jan-2017 14:02      9M
+util-linux-2.29.1.tar.sign     =
                    20-Jan-2017 14:02     819
+util-linux-2.29.1.tar.xz         =
                  20-Jan-2017 14:02      4M
+util-linux-2.29.2.tar.gz         =
                  22-Feb-2017 15:26      9M
+util-linux-2.29.2.tar.sign     =
                    22-Feb-2017 15:26     819
+util-linux-2.29.2.tar.xz         =
                  22-Feb-2017 15:26      4M
+util-linux-2.29.tar.gz             =
                08-Nov-2016 11:23      9M
+util-linux-2.29.tar.sign         =
                  08-Nov-2016 11:23     819
+util-linux-2.29.tar.xz             =
                08-Nov-2016 11:23      4M
+v2.29-ChangeLog                           =
         08-Nov-2016 11:23     28K
+v2.29-ChangeLog.sign                 =
              08-Nov-2016 11:23     819
+v2.29-ReleaseNotes                     =
            08-Nov-2016 11:24     26K
+v2.29-ReleaseNotes.sign           =
                 08-Nov-2016 11:24     819
+v2.29-rc1-ChangeLog                   =
             30-Sep-2016 09:55    219K
+v2.29-rc1-ChangeLog.sign         =
                  30-Sep-2016 09:55     819
+v2.29-rc2-ChangeLog                   =
             19-Oct-2016 13:13     19K
+v2.29-rc2-ChangeLog.sign         =
                  19-Oct-2016 13:13     819
+v2.29.1-ChangeLog                       =
           20-Jan-2017 14:02     47K
+v2.29.1-ChangeLog.sign             =
                20-Jan-2017 14:02     819
+v2.29.1-ReleaseNotes                 =
              20-Jan-2017 14:02    5067
+v2.29.1-ReleaseNotes.sign       =
                   20-Jan-2017 14:02     819
+v2.29.2-ChangeLog                       =
           22-Feb-2017 15:26     14K
+v2.29.2-ChangeLog.sign             =
                22-Feb-2017 15:26     819
+v2.29.2-ReleaseNotes                 =
              22-Feb-2017 15:26    2012
+v2.29.2-ReleaseNotes.sign       =
                   22-Feb-2017 15:26     819
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.30/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.30/index.html new file mode 100644 index 0000000..0441bc0 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.30/= index.html @@ -0,0 +1,42 @@ + +Index of /pub/linux/utils/util-linux/v2.30/ + +

Index of /pub/linux/utils/util-linux/v2.30/


../
+libblkid-docs/                             =
        21-Sep-2017 09:49       -
+libfdisk-docs/                             =
        21-Sep-2017 09:50       -
+libmount-docs/                             =
        21-Sep-2017 09:50       -
+libsmartcols-docs/                     =
            21-Sep-2017 09:51       -
+sha256sums.asc                             =
        21-Sep-2017 09:52    2480
+util-linux-2.30-rc1.tar.gz     =
                    12-May-2017 12:02      9M
+util-linux-2.30-rc1.tar.sign =
                      12-May-2017 12:02     819
+util-linux-2.30-rc1.tar.xz     =
                    12-May-2017 12:02      4M
+util-linux-2.30-rc2.tar.gz     =
                    23-May-2017 10:42      9M
+util-linux-2.30-rc2.tar.sign =
                      23-May-2017 10:42     819
+util-linux-2.30-rc2.tar.xz     =
                    23-May-2017 10:42      4M
+util-linux-2.30.1.tar.gz         =
                  20-Jul-2017 09:33      9M
+util-linux-2.30.1.tar.sign     =
                    20-Jul-2017 09:33     819
+util-linux-2.30.1.tar.xz         =
                  20-Jul-2017 09:33      4M
+util-linux-2.30.2.tar.gz         =
                  21-Sep-2017 09:51      9M
+util-linux-2.30.2.tar.sign     =
                    21-Sep-2017 09:51     833
+util-linux-2.30.2.tar.xz         =
                  21-Sep-2017 09:51      4M
+util-linux-2.30.tar.gz             =
                02-Jun-2017 10:44      9M
+util-linux-2.30.tar.sign         =
                  02-Jun-2017 10:44     819
+util-linux-2.30.tar.xz             =
                02-Jun-2017 10:44      4M
+v2.30-ChangeLog                           =
         02-Jun-2017 10:44     28K
+v2.30-ChangeLog.sign                 =
              02-Jun-2017 10:44     819
+v2.30-ReleaseNotes                     =
            02-Jun-2017 10:44     34K
+v2.30-ReleaseNotes.sign           =
                 02-Jun-2017 10:44     819
+v2.30-rc1-ChangeLog                   =
             23-May-2017 10:42    318K
+v2.30-rc1-ChangeLog.sign         =
                  23-May-2017 10:42     819
+v2.30-rc2-ChangeLog                   =
             23-May-2017 10:42     19K
+v2.30-rc2-ChangeLog.sign         =
                  23-May-2017 10:42     819
+v2.30.1-ChangeLog                       =
           20-Jul-2017 09:33     20K
+v2.30.1-ChangeLog.sign             =
                20-Jul-2017 09:33     819
+v2.30.1-ReleaseNotes                 =
              20-Jul-2017 09:33    1901
+v2.30.1-ReleaseNotes.sign       =
                   20-Jul-2017 09:33     819
+v2.30.2-ChangeLog                       =
           21-Sep-2017 09:51     13K
+v2.30.2-ChangeLog.sign             =
                21-Sep-2017 09:51     833
+v2.30.2-ReleaseNotes                 =
              21-Sep-2017 09:51    1604
+v2.30.2-ReleaseNotes.sign       =
                   21-Sep-2017 09:51     833
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.31/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.31/index.html new file mode 100644 index 0000000..097e4e0 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.31/= index.html @@ -0,0 +1,35 @@ + +Index of /pub/linux/utils/util-linux/v2.31/ + +

Index of /pub/linux/utils/util-linux/v2.31/


../
+libblkid-docs/                             =
        19-Dec-2017 15:16       -
+libfdisk-docs/                             =
        19-Dec-2017 15:17       -
+libmount-docs/                             =
        19-Dec-2017 15:17       -
+libsmartcols-docs/                     =
            19-Dec-2017 15:17       -
+sha256sums.asc                             =
        19-Dec-2017 15:20    2127
+util-linux-2.31-rc1.tar.gz     =
                    22-Sep-2017 10:39      9M
+util-linux-2.31-rc1.tar.sign =
                      22-Sep-2017 10:39     833
+util-linux-2.31-rc1.tar.xz     =
                    22-Sep-2017 10:39      4M
+util-linux-2.31-rc2.tar.gz     =
                    03-Oct-2017 16:03      9M
+util-linux-2.31-rc2.tar.sign =
                      03-Oct-2017 16:03     833
+util-linux-2.31-rc2.tar.xz     =
                    03-Oct-2017 16:03      4M
+util-linux-2.31.1.tar.gz         =
                  19-Dec-2017 15:18      9M
+util-linux-2.31.1.tar.sign     =
                    19-Dec-2017 15:18     833
+util-linux-2.31.1.tar.xz         =
                  19-Dec-2017 15:18      4M
+util-linux-2.31.tar.gz             =
                19-Oct-2017 11:27      9M
+util-linux-2.31.tar.sign         =
                  19-Oct-2017 11:27     833
+util-linux-2.31.tar.xz             =
                19-Oct-2017 11:27      4M
+v2.31-ChangeLog                           =
         19-Oct-2017 11:27     15K
+v2.31-ChangeLog.sign                 =
              19-Oct-2017 11:27     833
+v2.31-ReleaseNotes                     =
            19-Oct-2017 11:27     31K
+v2.31-ReleaseNotes.sign           =
                 19-Oct-2017 11:27     833
+v2.31-rc1-ChangeLog                   =
             22-Sep-2017 10:39    290K
+v2.31-rc1-ChangeLog.sign         =
                  22-Sep-2017 10:39     833
+v2.31-rc2-ChangeLog                   =
             03-Oct-2017 16:03     12K
+v2.31-rc2-ChangeLog.sign         =
                  03-Oct-2017 16:03     833
+v2.31.1-ChangeLog                       =
           19-Dec-2017 15:18     27K
+v2.31.1-ChangeLog.sign             =
                19-Dec-2017 15:18     833
+v2.31.1-ReleaseNotes                 =
              19-Dec-2017 15:18    3175
+v2.31.1-ReleaseNotes.sign       =
                   19-Dec-2017 15:18     833
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.32/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.32/index.html new file mode 100644 index 0000000..d373e98 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.32/= index.html @@ -0,0 +1,35 @@ + +Index of /pub/linux/utils/util-linux/v2.32/ + +

Index of /pub/linux/utils/util-linux/v2.32/


../
+libblkid-docs/                             =
        16-Jul-2018 11:27       -
+libfdisk-docs/                             =
        16-Jul-2018 11:28       -
+libmount-docs/                             =
        16-Jul-2018 11:28       -
+libsmartcols-docs/                     =
            16-Jul-2018 11:28       -
+sha256sums.asc                             =
        16-Jul-2018 11:30    2127
+util-linux-2.32-rc1.tar.gz     =
                    13-Feb-2018 12:25      9M
+util-linux-2.32-rc1.tar.sign =
                      13-Feb-2018 12:25     833
+util-linux-2.32-rc1.tar.xz     =
                    13-Feb-2018 12:25      4M
+util-linux-2.32-rc2.tar.gz     =
                    01-Mar-2018 13:38      9M
+util-linux-2.32-rc2.tar.sign =
                      01-Mar-2018 13:38     833
+util-linux-2.32-rc2.tar.xz     =
                    01-Mar-2018 13:38      4M
+util-linux-2.32.1.tar.gz         =
                  16-Jul-2018 11:29      9M
+util-linux-2.32.1.tar.sign     =
                    16-Jul-2018 11:29     833
+util-linux-2.32.1.tar.xz         =
                  16-Jul-2018 11:29      4M
+util-linux-2.32.tar.gz             =
                21-Mar-2018 14:49      9M
+util-linux-2.32.tar.sign         =
                  21-Mar-2018 14:49     833
+util-linux-2.32.tar.xz             =
                21-Mar-2018 14:49      4M
+v2.32-ChangeLog                           =
         21-Mar-2018 14:49     36K
+v2.32-ChangeLog.sign                 =
              21-Mar-2018 14:49     833
+v2.32-ReleaseNotes                     =
            21-Mar-2018 14:49     21K
+v2.32-ReleaseNotes.sign           =
                 21-Mar-2018 14:49     833
+v2.32-rc1-ChangeLog                   =
             13-Feb-2018 12:25    174K
+v2.32-rc1-ChangeLog.sign         =
                  13-Feb-2018 12:25     833
+v2.32-rc2-ChangeLog                   =
             01-Mar-2018 13:38     21K
+v2.32-rc2-ChangeLog.sign         =
                  01-Mar-2018 13:38     833
+v2.32.1-ChangeLog                       =
           16-Jul-2018 11:29     31K
+v2.32.1-ChangeLog.sign             =
                16-Jul-2018 11:29     833
+v2.32.1-ReleaseNotes                 =
              16-Jul-2018 11:29    3425
+v2.32.1-ReleaseNotes.sign       =
                   16-Jul-2018 11:29     833
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.33/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.33/index.html new file mode 100644 index 0000000..5495305 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.33/= index.html @@ -0,0 +1,42 @@ + +Index of /pub/linux/utils/util-linux/v2.33/ + +

Index of /pub/linux/utils/util-linux/v2.33/


../
+libblkid-docs/                             =
        09-Apr-2019 13:55       -
+libfdisk-docs/                             =
        09-Apr-2019 13:56       -
+libmount-docs/                             =
        09-Apr-2019 13:56       -
+libsmartcols-docs/                     =
            09-Apr-2019 13:56       -
+sha256sums.asc                             =
        09-Apr-2019 14:01    2480
+util-linux-2.33-rc1.tar.gz     =
                    25-Sep-2018 10:34      9M
+util-linux-2.33-rc1.tar.sign =
                      25-Sep-2018 10:34     833
+util-linux-2.33-rc1.tar.xz     =
                    25-Sep-2018 10:34      4M
+util-linux-2.33-rc2.tar.gz     =
                    19-Oct-2018 11:44      9M
+util-linux-2.33-rc2.tar.sign =
                      19-Oct-2018 11:44     833
+util-linux-2.33-rc2.tar.xz     =
                    19-Oct-2018 11:44      4M
+util-linux-2.33.1.tar.gz         =
                  09-Jan-2019 10:28      9M
+util-linux-2.33.1.tar.sign     =
                    09-Jan-2019 10:28     833
+util-linux-2.33.1.tar.xz         =
                  09-Jan-2019 10:28      4M
+util-linux-2.33.2.tar.gz         =
                  09-Apr-2019 13:57     10M
+util-linux-2.33.2.tar.sign     =
                    09-Apr-2019 13:57     833
+util-linux-2.33.2.tar.xz         =
                  09-Apr-2019 13:57      4M
+util-linux-2.33.tar.gz             =
                06-Nov-2018 11:25      9M
+util-linux-2.33.tar.sign         =
                  06-Nov-2018 11:25     833
+util-linux-2.33.tar.xz             =
                06-Nov-2018 11:25      4M
+v2.33-ChangeLog                           =
         06-Nov-2018 11:25    7977
+v2.33-ChangeLog.sign                 =
              06-Nov-2018 11:25     833
+v2.33-ReleaseNotes                     =
            06-Nov-2018 11:25     27K
+v2.33-ReleaseNotes.sign           =
                 06-Nov-2018 11:25     833
+v2.33-rc1-ChangeLog                   =
             25-Sep-2018 10:34    210K
+v2.33-rc1-ChangeLog.sign         =
                  25-Sep-2018 10:34     833
+v2.33-rc2-ChangeLog                   =
             19-Oct-2018 11:44     18K
+v2.33-rc2-ChangeLog.sign         =
                  19-Oct-2018 11:44     833
+v2.33.1-ChangeLog                       =
           09-Jan-2019 10:28     17K
+v2.33.1-ChangeLog.sign             =
                09-Jan-2019 10:28     833
+v2.33.1-ReleaseNotes                 =
              09-Jan-2019 10:28    1899
+v2.33.1-ReleaseNotes.sign       =
                   09-Jan-2019 10:28     833
+v2.33.2-ChangeLog                       =
           09-Apr-2019 13:57     21K
+v2.33.2-ChangeLog.sign             =
                09-Apr-2019 13:57     833
+v2.33.2-ReleaseNotes                 =
              09-Apr-2019 13:57    2566
+v2.33.2-ReleaseNotes.sign       =
                   09-Apr-2019 13:57     833
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.34/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.34/index.html new file mode 100644 index 0000000..bd9d9c8 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.34/= index.html @@ -0,0 +1,28 @@ + +Index of /pub/linux/utils/util-linux/v2.34/ + +

Index of /pub/linux/utils/util-linux/v2.34/


../
+libblkid-docs/                             =
        14-Jun-2019 10:45       -
+libfdisk-docs/                             =
        14-Jun-2019 10:45       -
+libmount-docs/                             =
        14-Jun-2019 10:45       -
+libsmartcols-docs/                     =
            14-Jun-2019 10:46       -
+sha256sums.asc                             =
        14-Jun-2019 10:51    1774
+util-linux-2.34-rc1.tar.gz     =
                    30-Apr-2019 10:24     10M
+util-linux-2.34-rc1.tar.sign =
                      30-Apr-2019 10:24     833
+util-linux-2.34-rc1.tar.xz     =
                    30-Apr-2019 10:24      5M
+util-linux-2.34-rc2.tar.gz     =
                    30-May-2019 10:24     10M
+util-linux-2.34-rc2.tar.sign =
                      30-May-2019 10:24     833
+util-linux-2.34-rc2.tar.xz     =
                    30-May-2019 10:24      5M
+util-linux-2.34.tar.gz             =
                14-Jun-2019 10:46     10M
+util-linux-2.34.tar.sign         =
                  14-Jun-2019 10:46     833
+util-linux-2.34.tar.xz             =
                14-Jun-2019 10:46      5M
+v2.34-ChangeLog                           =
         14-Jun-2019 10:46     14K
+v2.34-ChangeLog.sign                 =
              14-Jun-2019 10:46     833
+v2.34-ReleaseNotes                     =
            14-Jun-2019 10:46     27K
+v2.34-ReleaseNotes.sign           =
                 14-Jun-2019 10:46     833
+v2.34-rc1-ChangeLog                   =
             30-Apr-2019 10:24    167K
+v2.34-rc1-ChangeLog.sign         =
                  30-Apr-2019 10:24     833
+v2.34-rc2-ChangeLog                   =
             30-May-2019 10:24     57K
+v2.34-rc2-ChangeLog.sign         =
                  30-May-2019 10:24     833
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux= /v2.35/index.html b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/uti= l-linux/v2.35/index.html new file mode 100644 index 0000000..aa714d3 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.35/= index.html @@ -0,0 +1,18 @@ + +Index of /pub/linux/utils/util-linux/v2.35/ + +

Index of /pub/linux/utils/util-linux/v2.35/


../
+libblkid-docs/                             =
        11-Dec-2019 10:04       -
+libfdisk-docs/                             =
        11-Dec-2019 10:05       -
+libmount-docs/                             =
        11-Dec-2019 10:05       -
+libsmartcols-docs/                     =
            11-Dec-2019 10:05       -
+sha256sums.asc                             =
        11-Dec-2019 10:11    1242
+util-linux-2.35-rc1.tar.gz     =
                    11-Dec-2019 10:06     10M
+util-linux-2.35-rc1.tar.sign =
                      11-Dec-2019 10:06     833
+util-linux-2.35-rc1.tar.xz     =
                    11-Dec-2019 10:06      5M
+v2.35-ReleaseNotes                     =
            11-Dec-2019 10:06     21K
+v2.35-ReleaseNotes.sign           =
                 11-Dec-2019 10:06     833
+v2.35-rc1-ChangeLog                   =
             11-Dec-2019 10:06    228K
+v2.35-rc1-ChangeLog.sign         =
                  11-Dec-2019 10:06     833
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/releases/eglibc/index.html= b/bitbake/lib/bb/tests/fetch-testdata/releases/eglibc/index.html new file mode 100644 index 0000000..b267940 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/releases/eglibc/index.html @@ -0,0 +1,21 @@ + +Index of /releases/eglibc/ + +

Index of /releases/eglibc/


../
+eglibc-2.16-svnr21224.tar.bz2                      17-Oct-2012 18:01            17310656
+eglibc-2.16-svnr21224.tar.bz=
2.md5                  17-Oct-2012 21:53                  64
+eglibc-2.16-svnr21224.tar.b=
z2.sha1                 17-Oct-2012 21:53                  72
+eglibc-2.17-svnr22064.tar.bz2                      04-Jan-2013 05:44            17565519
+eglibc-2.17-svnr22064.tar.bz=
2.asc                  04-Jan-2013 05:45                 302
+eglibc-2.17-svnr22064.tar.bz=
2.md5                  04-Jan-2013 05:44                  64
+eglibc-2.17-svnr22064.tar.b=
z2.sha1                 04-Jan-2013 05:44                  72
+eglibc-2.18-svnr23787.tar.bz2                      21-Aug-2013 05:36            17862773
+eglibc-2.18-svnr23787.tar.bz=
2.asc                  21-Aug-2013 05:36                 302
+eglibc-2.18-svnr23787.tar.bz=
2.md5                  21-Aug-2013 05:36                  64
+eglibc-2.18-svnr23787.tar.b=
z2.sha1                 21-Aug-2013 05:36                  72
+eglibc-2.19-svnr25243.tar.bz2                      08-Feb-2014 10:06            18873620
+eglibc-2.19-svnr25243.tar.bz=
2.asc                  08-Feb-2014 10:06                 285
+eglibc-2.19-svnr25243.tar.bz=
2.md5                  08-Feb-2014 10:06                  64
+eglibc-2.19-svnr25243.tar.b=
z2.sha1                 08-Feb-2014 10:06                  72
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/releases/gnu-config/index.= html b/bitbake/lib/bb/tests/fetch-testdata/releases/gnu-config/index.html new file mode 100644 index 0000000..051aa48 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/releases/gnu-config/index.html @@ -0,0 +1,9 @@ + +Index of /releases/gnu-config/ + +

Index of /releases/gnu-config/


../
+SHA256SUM                                       =
   03-Oct-2012 17:23                 190
+gnu-config-20120814.tar.bz2   =
                     18-Sep-2012 09:28               43026
+gnu-config-yocto-20111111.tgz                      08-May-2012 21:11               48762
+

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/releases/individual/xserve= r/index.html b/bitbake/lib/bb/tests/fetch-testdata/releases/individual/xser= ver/index.html new file mode 100644 index 0000000..72e0d65 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/releases/individual/xserver/index= .html @@ -0,0 +1,609 @@ + + + + Index of /releases/individual/xserver + + +

Index of /releases/individual/xserver

+ + + + +=   +<= td>  +=   +<= td>  += + += + += + += + +=   +<= td>  +=   +<= td>  += + += + += + +=   +<= td>  += + += + += + += + += + += + += + += + += + += + +=   +<= td>  +=   +<= td>  += + += + += + += + += + += 2007-09-06 09:23 +2007-09-06 09:22 +=   +<= td>  +=   +<= td>  +=   +<= td>  +=   +<= td>  += + += + += + += + += + += + +=   +<= td>  += + += + +=   +<= td>  += + +=   +<= td>  += + +=   +<= td>  += + +=   +<= td>  +=   +<= td>  += + += + += + += + += + += + +=   +<= td>  += + += + +=   +<= td>  +=   +<= td>  += + += + +=   +<= td>  += + += + +=   +<= td>  += + += + +=   +<= td>  += + += + +=   +<= td>  +=   +<= td>  += + += + += + += + += + += + +=   +<= td>  += + += + +=   +<= td>  +=   +<= td>  += + += + += + += + += + += + += + += + +=   +<= td>  +=   +<= td>  += + += + +=   +<= td>  += + += + +=   +<= td>  += + +=   +<= td>  +=   +<= td>  += + += + += + += + += + += = + += + += + += = + += + += + += = + += + += + += = + += = + += = + += + += + += = + += + += + += = + += + += + += = + += + += + += = + += = + += + += + += + += + += + += + += + += = + += + += + += = + += + += + += = + += + += + += = + += = + += + += + += + += + += + += + += + += = + += + += = += + += += + += + += = + += = + += = + += + += + += = + += + += + += = + += + += += + += += + += = + += + += + += = + += + += = + += + += = + += = + += = + += + += + += + += + += + += + += + += + += + += = + += = + += = += + += += + += + += + += += + += += += + += += = += + += += += + += += = += + += += += + += += = += + += += = += + += += = += + += += += + += += += + += += = += + += += = += + += += = += + += += = += + += += = += + += += += + += += += + += += = += + += += = += + += += = += + += += = += + += += = += + += += += + += += += + += += += + += += = += + += += = += + += += = += + += += = += + += += = += + += += = += + += += = += + += += = += + += += += + += += += + += += += + += += += + += += += + += += = += + += += = += + += += = += + += += = += + += += = += + += += = += + += += = += + += + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory = ; -  
3D"[xorg-server-1.0.1.tar.bz22006-01-18 23:51 5.7M
3D"[xorg-server-1.0.1.tar.gz2006-01-18 23:51 7.7M
3D"[xorg-server-1.0.2.tar.bz22006-03-20 14:01 5.7M
3D"[xorg-server-1.0.2.tar.gz2006-03-20 14:02 7.6M
3D"[xorg-server-1.0.99.2.tar.bz22006-04-02 00:47 6.1M<= /td> 
3D"[xorg-server-1.0.99.2.tar.gz<= /a>2006-04-02 00:48 8.3M=  
3D"[xorg-server-1.0.99.901.tar.b= z22006-04-07 22:51 6= .0M 
3D"[xorg-server-1.0.99.901.tar= .gz2006-04-07 22:51 = 8.2M 
3D"[xorg-server-1.0.99.902.tar.b= z22006-04-28 23:17 6= .0M 
3D"[xorg-server-1.0.99.902.tar= .gz2006-04-28 23:16 = 8.2M 
3D"[xorg-server-1.0.99.903.tar.b= z22006-05-12 20:54 6= .0M 
3D"[xorg-server-1.0.99.903.tar= .gz2006-05-12 20:52 = 8.3M 
3D"[xorg-server-1.1.0.tar.bz22006-05-22 23:31 6.0M
3D"[xorg-server-1.1.0.tar.gz2006-05-22 23:29 8.3M
3D"[xorg-server-1.1.1.tar.bz22006-07-08 00:57 6.0M
3D"[xorg-server-1.1.1.tar.gz2006-07-08 00:59 8.0M
3D"[xorg-server-1.1.99.901.tar.b= z22006-10-13 23:06 6= .0M 
3D"[xorg-server-1.1.99.901.tar= .gz2006-10-13 23:08 = 8.1M 
3D"[xorg-server-1.1.99.902.tar.b= z22006-11-13 22:04 5= .8M 
3D"[xorg-server-1.1.99.902.tar= .gz2006-11-13 22:06 = 7.8M 
3D"[xorg-server-1.1.99.903.tar.b= z22006-12-02 00:14 5= .7M 
3D"[xorg-server-1.1.99.903.tar= .gz2006-12-02 00:17 = 7.7M 
3D"[xorg-server-1.2.0.tar.bz22007-01-23 06:15 5.7M
3D"[xorg-server-1.2.0.tar.gz2007-01-23 06:17 7.7M
3D"[xorg-server-1.2.99.0.tar.bz22006-11-02 03:15 5.9M<= /td> 
3D"[xorg-server-1.2.99.0.tar.gz<= /a>2006-11-02 03:17 7.9M=  
3D"[xorg-server-1.2.99.901.tar.b= z22007-03-05 05:11 5= .7M 
3D"[xorg-server-1.2.99.901.tar= .gz2007-03-05 05:14 = 7.6M 
3D"[xorg-server-1.2.99.902.tar.b= z22007-03-14 19:38 5= .7M 
3D"[xorg-server-1.2.99.902.tar= .gz2007-03-14 19:43 = 7.6M 
3D"[xorg-server-1.2.99.903.tar.b= z22007-03-27 05:01 5= .7M 
3D"[xorg-server-1.2.99.903.tar= .gz2007-03-27 05:05 = 7.6M 
3D"[xorg-server-1.2.99.904.tar.b= z22007-04-06 06:31 4= .2M 
3D"[xorg-server-1.2.99.904.tar= .gz2007-04-06 06:28 = 7.6M 
3D"[xorg-server-1.2.99.905.tar.b= z22007-04-06 07:01 5= .7M 
3D"[xorg-server-1.2.99.905.tar= .gz2007-04-06 06:57 = 7.6M 
3D"[xorg-server-1.3.0.0.tar.bz2= 2007-04-20 02:45 5.7M 
3D"[xorg-server-1.3.0.0.tar.gz2007-04-20 02:42 7.6M 
3D"[xorg-server-1.3.99.0.tar.bz22007-08-01 05:38 6.0M<= /td> 
3D"[xorg-server-1.3.99.0.tar.gz<= /a>2007-08-01 05:36 8.0M=  
3D"[xorg-server-1.3.99.2.tar.bz22007-09-01 03:12 5.9M<= /td> 
3D"[xorg-server-1.3.99.2.tar.gz<= /a>2007-09-01 03:10 7.8M=  
3D"[xorg-server-1.4.0.90.tar.bz22007-12-12 20:44 6.0M<= /td> 
3D"[xorg-server-1.4.0.90.tar.gz<= /a>2007-12-12 20:43 8.0M=  
3D"[xorg-server-1.4.1.tar.bz22008-06-10 15:57 6.0M
3D"[xorg-server-1.4.1.tar.gz2008-06-10 15:56 8.1M
3D"[xorg-server-1.4.2.tar.bz22008-06-11 15:08 5.9M
3D"[xorg-server-1.4.2.tar.gz2008-06-11 15:08 7.9M
3D"[xorg-server-1.4.99.901.tar.b= z22008-03-06 05:25 5= .3M 
3D"[xorg-server-1.4.99.901.tar= .gz2008-03-06 05:23 = 7.1M 
3D"[xorg-server-1.4.99.902.tar.b= z22008-05-22 19:16 5= .3M 
3D"[xorg-server-1.4.99.902.tar= .gz2008-05-22 19:16 = 7.1M 
3D"[xorg-server-1.4.99.904.tar.b= z22008-06-30 15:42 5= .4M 
3D"[xorg-server-1.4.99.904.tar= .gz2008-06-30 15:42 = 7.3M 
3D"[xorg-server-1.4.99.905.tar.b= z22008-06-30 20:31 5= .4M 
3D"[xorg-server-1.4.99.905.tar= .gz2008-06-30 20:31 = 7.3M 
3D"[xorg-server-1.4.99.906.tar.b= z22008-07-23 18:55 5= .4M 
3D"[xorg-server-1.4.99.906.tar= .gz2008-07-23 18:55 = 7.3M 
3D"[xorg-server-1.4.tar.bz25.9M&n= bsp;
3D"[xorg-server-1.4.tar.gz7.8M&= nbsp;
3D"[xorg-server-1.5.0.tar.bz22008-09-03 23:16 5.4M
3D"[xorg-server-1.5.0.tar.gz2008-09-03 23:16 7.3M
3D"[xorg-server-1.5.1.tar.bz22008-09-23 19:15 5.4M
3D"[xorg-server-1.5.1.tar.gz2008-09-23 19:15 7.3M
3D"[xorg-server-1.5.2.tar.bz22008-10-10 19:27 5.4M
3D"[xorg-server-1.5.2.tar.gz2008-10-10 19:27 7.3M
3D"[xorg-server-1.5.3.tar.bz22008-11-05 20:49 5.4M
3D"[xorg-server-1.5.3.tar.gz2008-11-05 20:49 7.3M
3D"[xorg-server-1.5.99.1.tar.bz22008-11-26 07:29 4.4M<= /td> 
3D"[xorg-server-1.5.99.1.tar.gz<= /a>2008-11-26 07:26 5.9M=  
3D"[xorg-server-1.5.99.2.tar.bz22008-12-03 08:16 4.4M<= /td> 
3D"[xorg-server-1.5.99.2.tar.gz<= /a>2008-12-03 08:09 5.9M=  
3D"[xorg-server-1.5.99.3.tar.bz22008-12-10 06:28 4.4M<= /td> 
3D"[xorg-server-1.5.99.3.tar.gz<= /a>2008-12-10 06:25 5.9M=  
3D"[xorg-server-1.5.99.901.tar.b= z22009-01-12 21:12 4= .4M 
3D"[xorg-server-1.5.99.901.tar= .gz2009-01-12 21:12 = 6.0M 
3D"[xorg-server-1.5.99.902.tar.b= z22009-01-31 05:27 4= .4M 
3D"[xorg-server-1.5.99.902.tar= .gz2009-01-31 05:24 = 6.0M 
3D"[xorg-server-1.5.99.903.tar.b= z22009-02-18 06:35 4= .4M 
3D"[xorg-server-1.5.99.903.tar= .gz2009-02-18 06:32 = 6.0M 
3D"[xorg-server-1.6.0.tar.bz22009-02-25 20:25 4.4M
3D"[xorg-server-1.6.0.tar.gz2009-02-25 20:19 6.0M
3D"[xorg-server-1.6.1.901.tar.bz2= 2009-05-09 05:46 4.4= M 
3D"[xorg-server-1.6.1.901.tar.g= z2009-05-09 05:42 5.= 8M 
3D"[xorg-server-1.6.1.902.tar.bz2= 2009-06-29 23:05 4.4= M 
3D"[xorg-server-1.6.1.902.tar.g= z2009-06-29 23:02 5.= 9M 
3D"[xorg-server-1.6.1.tar.bz22009-04-14 20:09 4.4M
3D"[xorg-server-1.6.1.tar.gz2009-04-14 20:09 5.8M
3D"[xorg-server-1.6.2.901.tar.bz2= 2009-07-26 21:42 4.4= M 
3D"[xorg-server-1.6.2.901.tar.g= z2009-07-26 21:41 5.= 9M 
3D"[xorg-server-1.6.2.tar.bz22009-07-07 23:40 4.4M
3D"[xorg-server-1.6.2.tar.gz2009-07-07 23:39 5.9M
3D"[xorg-server-1.6.3.901.tar.bz2= 2009-08-26 05:55 4.5= M 
3D"[xorg-server-1.6.3.901.tar.g= z2009-08-26 05:54 5.= 9M 
3D"[xorg-server-1.6.3.tar.bz22009-08-01 06:45 4.4M
3D"[xorg-server-1.6.3.tar.gz2009-08-01 06:42 5.9M
3D"[xorg-server-1.6.4.901.tar.bz2= 2009-10-03 07:40 4.5= M 
3D"[xorg-server-1.6.4.901.tar.g= z2009-10-03 07:44 5.= 9M 
3D"[xorg-server-1.6.4.tar.bz22009-09-28 02:47 4.5M
3D"[xorg-server-1.6.4.tar.gz2009-09-28 02:45 5.9M
3D"[xorg-server-1.6.5.tar.bz22009-10-12 05:27 4.5M
3D"[xorg-server-1.6.5.tar.gz2009-10-12 05:26 5.9M
3D"[xorg-server-1.6.99.900.tar.b= z22009-09-04 07:02 4= .7M 
3D"[xorg-server-1.6.99.900.tar= .gz2009-09-04 07:02 = 6.2M 
3D"[xorg-server-1.6.99.901.tar.b= z22009-09-14 10:26 4= .7M 
3D"[xorg-server-1.6.99.901.tar= .gz2009-09-14 10:23 = 6.2M 
3D"[xorg-server-1.6.99.902.tar.b= z22009-09-22 04:53 4= .7M 
3D"[xorg-server-1.6.99.902.tar= .gz2009-09-22 04:50 = 6.2M 
3D"[xorg-server-1.6.99.903.tar.b= z22009-09-28 11:25 4= .7M 
3D"[xorg-server-1.6.99.903.tar= .gz2009-09-28 11:22 = 6.2M 
3D"[xorg-server-1.7.0.901.tar.bz2= 2009-10-12 04:40 4.7= M 
3D"[xorg-server-1.7.0.901.tar.g= z2009-10-12 04:39 6.= 3M 
3D"[xorg-server-1.7.0.902.tar.bz2= 2009-10-19 02:10 4.7= M 
3D"[xorg-server-1.7.0.902.tar.g= z2009-10-19 02:10 6.= 3M 
3D"[xorg-server-1.7.0.tar.bz22009-10-02 06:17 4.7M
3D"[xorg-server-1.7.0.tar.gz2009-10-02 06:16 6.3M
3D"[xorg-server-1.7.1.901.tar.bz2= 2009-11-06 05:11 4.7= M 
3D"[xorg-server-1.7.1.901.tar.g= z2009-11-06 05:11 6.= 3M 
3D"[xorg-server-1.7.1.902.tar.bz2= 2009-11-20 05:52 4.7= M 
3D"[xorg-server-1.7.1.902.tar.g= z2009-11-20 05:51 6.= 3M 
3D"[xorg-server-1.7.1.tar.bz22009-10-23 05:40 4.7M
3D"[xorg-server-1.7.1.tar.gz2009-10-23 05:39 6.3M
3D"[xorg-server-1.7.2.tar.bz22009-11-27 05:46 4.7M
3D"[xorg-server-1.7.2.tar.gz2009-11-27 05:45 6.3M
3D"[xorg-server-1.7.3.901.tar.bz2= 2009-12-11 06:40 4.7= M 
3D"[xorg-server-1.7.3.901.tar.g= z2009-12-11 06:40 6.= 3M 
3D"[xorg-server-1.7.3.902.tar.bz2= 2009-12-26 01:08 4.7= M 
3D"[xorg-server-1.7.3.902.tar.g= z2009-12-26 01:05 6.= 3M 
3D"[xorg-server-1.7.3.tar.bz22009-12-03 03:38 4.7M
3D"[xorg-server-1.7.3.tar.gz2009-12-03 03:37 6.3M
3D"[xorg-server-1.7.4.901.tar.bz2= 2010-01-23 00:16 4.7= M 
3D"[xorg-server-1.7.4.901.tar.g= z2010-01-23 00:16 6.= 3M 
3D"[xorg-server-1.7.4.902.tar.bz2= 2010-02-05 08:37 4.7= M 
3D"[xorg-server-1.7.4.902.tar.g= z2010-02-05 08:32 6.= 3M 
3D"[xorg-server-1.7.4.tar.bz22010-01-08 01:09 4.7M
3D"[xorg-server-1.7.4.tar.gz2010-01-08 01:09 6.3M
3D"[xorg-server-1.7.5.901.tar.bz2= 2010-03-05 00:26 4.7= M 
3D"[xorg-server-1.7.5.901.tar.g= z2010-03-05 00:23 6.= 3M 
3D"[xorg-server-1.7.5.902.tar.bz2= 2010-03-12 07:07 4.7= M 
3D"[xorg-server-1.7.5.902.tar.g= z2010-03-12 07:02 6.= 3M 
3D"[xorg-server-1.7.5.tar.bz22010-02-16 03:54 4.7M
3D"[xorg-server-1.7.5.tar.gz2010-02-16 03:50 6.3M
3D"[xorg-server-1.7.6.901.tar.bz2= 2010-04-12 02:12 4.7= M 
3D"[xorg-server-1.7.6.901.tar.g= z2010-04-12 02:12 6.= 3M 
3D"[xorg-server-1.7.6.902.tar.bz2= 2010-04-21 00:25 4.7= M 
3D"[xorg-server-1.7.6.902.tar.g= z2010-04-21 00:25 6.= 3M 
3D"[xorg-server-1.7.6.tar.bz22010-03-17 01:56 4.7M
3D"[xorg-server-1.7.6.tar.gz2010-03-17 01:56 6.3M
3D"[xorg-server-1.7.7.tar.bz22010-05-04 07:51 4.7M
3D"[xorg-server-1.7.7.tar.gz2010-05-04 07:48 6.3M
3D"[xorg-server-1.7.99.1.tar.bz22009-10-21 16:15 4.8M<= /td> 
3D"[xorg-server-1.7.99.1.tar.gz<= /a>2009-10-21 16:15 6.5M=  
3D"[xorg-server-1.7.99.2.tar.bz22009-12-20 03:50 4.8M<= /td> 
3D"[xorg-server-1.7.99.2.tar.gz<= /a>2009-12-20 03:48 6.5M=  
3D"[xorg-server-1.7.99.901.tar.b= z22010-02-12 22:00 4= .9M 
3D"[xorg-server-1.7.99.901.tar= .gz2010-02-12 21:59 = 6.5M 
3D"[xorg-server-1.7.99.902.tar.b= z22010-03-22 05:42 4= .9M 
3D"[xorg-server-1.7.99.902.tar= .gz2010-03-22 05:41 = 6.5M 
3D"[xorg-server-1.8.0.901.tar.bz2= 2010-04-27 05:08 4.9= M 
3D"[xorg-server-1.8.0.901.tar.g= z2010-04-27 05:05 6.= 6M 
3D"[xorg-server-1.8.0.902.tar.bz2= 2010-05-04 00:39 4.9= M 
3D"[xorg-server-1.8.0.902.tar.g= z2010-05-04 00:36 6.= 6M 
3D"[xorg-server-1.8.0.tar.bz22010-04-02 07:30 4.9M
3D"[xorg-server-1.8.0.tar.gz2010-04-02 07:28 6.5M
3D"[xorg-server-1.8.1.901.tar.bz2= 2010-06-02 00:07 5.0= M 
3D"[xorg-server-1.8.1.901.tar.g= z2010-06-02 00:07 6.= 6M 
3D"[xorg-server-1.8.1.902.tar.bz2= 2010-06-21 02:07 5.0= M 
3D"[xorg-server-1.8.1.902.tar.g= z2010-06-21 02:07 6.= 6M 
3D"[xorg-server-1.8.1.tar.bz22010-05-11 21:52 5.0M
3D"[xorg-server-1.8.1.tar.gz2010-05-11 21:52 6.6M
3D"[xorg-server-1.8.2.tar.bz22010-07-01 05:29 5.0M
3D"[xorg-server-1.8.2.tar.gz2010-07-01 05:29 6.6M
3D"[xorg-server-1.8.99.901.tar.b= z22010-06-15 21:19 5= .1M 
3D"[xorg-server-1.8.99.901.tar= .gz2010-06-15 21:18 = 6.8M 
3D"[xorg-server-1.8.99.902.tar.b= z22010-06-22 19:05 5= .1M 
3D"[xorg-server-1.8.99.902.tar= .gz2010-06-22 19:04 = 6.8M 
3D"[xorg-server-1.8.99.903.tar.b= z22010-06-22 19:33 5= .1M 
3D"[xorg-server-1.8.99.903.tar= .gz2010-06-22 19:32 = 6.8M 
3D"[xorg-server-1.8.99.904.tar.b= z22010-07-01 13:46 5= .1M 
3D"[xorg-server-1.8.99.904.tar= .gz2010-07-01 13:39 = 6.8M 
3D"[xorg-server-1.8.99.905.tar.b= z22010-07-14 19:58 5= .1M 
3D"[xorg-server-1.8.99.905.tar= .gz2010-07-14 19:58 = 6.8M 
3D"[xorg-server-1.8.99.906.tar.b= z22010-08-13 06:22 5= .1M 
3D"[xorg-server-1.8.99.906.tar= .gz2010-08-13 06:20 = 6.8M 
3D"[xorg-server-1.9.0.901.tar.bz2= 2010-10-01 21:22 5.0= M 
3D"[xorg-server-1.9.0.901.tar.g= z2010-10-01 21:21 6.= 7M 
3D"[xorg-server-1.9.0.902.tar.bz2= 2010-10-15 18:34 5.0= M 
3D"[xorg-server-1.9.0.902.tar.g= z2010-10-15 18:33 6.= 7M 
3D"[xorg-server-1.9.0.tar.bz22010-08-21 00:46 5.1M
3D"[xorg-server-1.9.0.tar.gz2010-08-21 00:45 6.8M
3D"[xorg-server-1.9.1.tar.bz22010-10-24 03:22 5.0M
3D"[xorg-server-1.9.1.tar.gz2010-10-24 03:22 6.7M
3D"[xorg-server-1.9.2.901.tar.bz2= 2010-11-14 00:12 5.0= M 
3D"[xorg-server-1.9.2.901.tar.g= z2010-11-14 00:12 6.= 8M 
3D"[xorg-server-1.9.2.902.tar.bz2= 2010-12-04 19:25 5.0= M 
3D"[xorg-server-1.9.2.902.tar.g= z2010-12-04 19:25 6.= 8M 
3D"[xorg-server-1.9.2.tar.bz22010-10-31 23:15 5.0M
3D"[xorg-server-1.9.2.tar.gz2010-10-31 23:15 6.8M
3D"[xorg-server-1.9.3.901.tar.bz2= 2011-01-08 21:37 5.0= M 
3D"[xorg-server-1.9.3.901.tar.g= z2011-01-08 21:37 6.= 8M 
3D"[xorg-server-1.9.3.902.tar.bz2= 2011-01-31 01:16 5.0= M 
3D"[xorg-server-1.9.3.902.tar.g= z2011-01-31 01:16 6.= 7M 
3D"[xorg-server-1.9.3.tar.bz22010-12-13 20:05 5.0M
3D"[xorg-server-1.9.3.tar.gz2010-12-13 20:05 6.8M
3D"[xorg-server-1.9.4.901.tar.bz2= 2011-03-04 23:21 4.9= M 
3D"[xorg-server-1.9.4.901.tar.g= z2011-03-04 23:21 6.= 7M 
3D"[xorg-server-1.9.4.tar.bz22011-02-04 20:03 5.0M
3D"[xorg-server-1.9.4.tar.gz2011-02-04 20:02 6.7M
3D"[xorg-server-1.9.5.tar.bz22011-03-17 21:49 4.9M
3D"[xorg-server-1.9.5.tar.gz2011-03-17 21:49 6.7M
3D"[xorg-server-1.9.99.901.tar.b= z22010-12-07 04:57 5= .1M 
3D"[xorg-server-1.9.99.901.tar= .gz2010-12-07 04:56 = 6.8M 
3D"[xorg-server-1.9.99.902.tar.b= z22011-02-18 22:50 5= .1M 
3D"[xorg-server-1.9.99.902.tar= .gz2011-02-18 22:49 = 6.8M 
3D"[xorg-server-1.9.99.903.tar.b= z22011-02-25 06:46 5= .0M 
3D"[xorg-server-1.9.99.903.tar= .gz2011-02-25 06:44 = 6.8M 
3D"[xorg-server-1.10.0.901.tar.b= z22011-03-29 07:36 5= .1M 
3D"[xorg-server-1.10.0.901.tar= .gz2011-03-29 07:36 = 6.9M 
3D"[xorg-server-1.10.0.902.tar.b= z22011-04-08 23:49 5= .1M 
3D"[xorg-server-1.10.0.902.tar= .gz2011-04-08 23:48 = 6.9M 
3D"[xorg-server-1.10.0.tar.bz22011-02-26 05:49 5.1M 
3D"[xorg-server-1.10.0.tar.gz<= /td>2011-02-26 05:48 6.9M 
3D"[xorg-server-1.10.1.901.tar.b= z22011-05-06 22:59 5= .1M 
3D"[xorg-server-1.10.1.901.tar= .gz2011-05-06 22:59 = 6.9M 
3D"[xorg-server-1.10.1.902.tar.b= z22011-05-21 06:13 5= .1M 
3D"[xorg-server-1.10.1.902.tar= .gz2011-05-21 06:13 = 6.9M 
3D"[xorg-server-1.10.1.tar.bz22011-04-16 01:13 5.1M 
3D"[xorg-server-1.10.1.tar.gz<= /td>2011-04-16 01:13 6.9M 
3D"[xorg-server-1.10.2.901.tar.b= z22011-06-17 17:30 5= .1M 
3D"[xorg-server-1.10.2.901.tar= .gz2011-06-17 17:30 = 6.9M 
3D"[xorg-server-1.10.2.902.tar.b= z22011-07-02 03:55 5= .1M 
3D"[xorg-server-1.10.2.902.tar= .gz2011-07-02 03:55 = 6.9M 
3D"[xorg-server-1.10.2.tar.bz22011-05-29 00:20 5.1M 
3D"[xorg-server-1.10.2.tar.gz<= /td>2011-05-29 00:20 6.9M 
3D"[xorg-server-1.10.3.901.tar.b= z22011-07-29 18:39 5= .1M 
3D"[xorg-server-1.10.3.901.tar= .gz2011-07-29 18:39 = 7.0M 
3D"[xorg-server-1.10.3.902.tar.b= z22011-08-12 22:30 5= .1M 
3D"[xorg-server-1.10.3.902.tar= .gz2011-08-12 22:30 = 7.0M 
3D"[xorg-server-1.10.3.tar.bz22011-07-08 20:04 5.1M 
3D"[xorg-server-1.10.3.tar.gz<= /td>2011-07-08 20:04 6.9M 
3D"[xorg-server-1.10.4.tar.bz22011-08-19 07:13 5.1M 
3D"[xorg-server-1.10.4.tar.gz<= /td>2011-08-19 07:12 7.0M 
3D"[xorg-server-1.10.6.tar.bz22012-02-11 01:11 5.2M 
3D"[xorg-server-1.10.6.tar.gz<= /td>2012-02-11 01:11 7.0M 
3D"[xorg-server-1.10.99.901.tar= .bz22011-06-01 18:34 4.7M 
3D"[xorg-server-1.10.99.901.t= ar.gz2011-06-01 18:33 6.3M 
3D"[xorg-server-1.10.99.902.tar= .bz22011-08-04 04:10 4.8M 
3D"[xorg-server-1.10.99.902.t= ar.gz2011-08-04 04:09 6.4M 
3D"[xorg-server-1.11.0.tar.bz22011-08-27 01:02 4.8M 
3D"[xorg-server-1.11.0.tar.gz<= /td>2011-08-27 01:01 6.4M 
3D"[xorg-server-1.11.1.901.tar.b= z22011-10-14 23:41 4= .7M 
3D"[xorg-server-1.11.1.901.tar= .gz2011-10-14 23:40 = 6.3M 
3D"[xorg-server-1.11.1.902.tar.b= z22011-10-29 01:44 4= .7M 
3D"[xorg-server-1.11.1.902.tar= .gz2011-10-29 01:44 = 6.3M 
3D"[xorg-server-1.11.1.tar.bz22011-09-24 07:19 4.7M 
3D"[xorg-server-1.11.1.tar.gz<= /td>2011-09-24 07:19 6.3M 
3D"[xorg-server-1.11.2.901.tar.b= z22011-11-28 08:17 4= .7M 
3D"[xorg-server-1.11.2.901.tar= .gz2011-11-28 08:16 = 6.3M 
3D"[xorg-server-1.11.2.902.tar.b= z22011-12-09 21:10 4= .7M 
3D"[xorg-server-1.11.2.902.tar= .gz2011-12-09 21:10 = 6.3M 
3D"[xorg-server-1.11.2.tar.bz22011-11-04 17:38 4.7M 
3D"[xorg-server-1.11.2.tar.gz<= /td>2011-11-04 17:38 6.3M 
3D"[xorg-server-1.11.3.901.tar.b= z22012-01-07 07:34 4= .7M 
3D"[xorg-server-1.11.3.901.tar= .gz2012-01-07 07:34 = 6.3M 
3D"[xorg-server-1.11.3.902.tar.b= z22012-01-21 08:29 4= .7M 
3D"[xorg-server-1.11.3.902.tar= .gz2012-01-21 08:29 = 6.3M 
3D"[xorg-server-1.11.3.tar.bz22011-12-17 02:03 4.7M 
3D"[xorg-server-1.11.3.tar.gz<= /td>2011-12-17 02:03 6.3M 
3D"[xorg-server-1.11.4.tar.bz22012-01-28 05:20 4.7M 
3D"[xorg-server-1.11.4.tar.gz<= /td>2012-01-28 05:20 6.3M 
3D"[xorg-server-1.11.99.1.tar.bz2= 2011-11-20 23:05 4.8= M 
3D"[xorg-server-1.11.99.1.tar.g= z2011-11-20 23:04 6.= 5M 
3D"[xorg-server-1.11.99.2.tar.bz2= 2011-12-18 01:30 4.8= M 
3D"[xorg-server-1.11.99.2.tar.g= z2011-12-18 01:29 6.= 5M 
3D"[xorg-server-1.11.99.901.tar= .bz22011-12-27 22:19 4.9M 
3D"[xorg-server-1.11.99.901.t= ar.gz2011-12-27 22:18 6.6M 
3D"[xorg-server-1.11.99.902.tar= .bz22012-01-28 06:48 4.9M 
3D"[xorg-server-1.11.99.902.t= ar.gz2012-01-28 06:47 6.6M 
3D"[xorg-server-1.11.99.903.tar= .bz22012-02-11 03:18 5.3M 
3D"[xorg-server-1.11.99.903.t= ar.gz2012-02-11 03:16 7.2M 
3D"[xorg-server-1.12.0.901.tar.b= z22012-03-31 03:15 5= .1M 
3D"[xorg-server-1.12.0.901.tar= .gz2012-03-31 03:15 = 7.0M 
3D"[xorg-server-1.12.0.902.tar.b= z22012-04-10 02:48 5= .1M 
3D"[xorg-server-1.12.0.902.tar= .gz2012-04-10 02:48 = 7.0M 
3D"[xorg-server-1.12.0.tar.bz22012-03-05 05:12 5.3M 
3D"[xorg-server-1.12.0.tar.gz<= /td>2012-03-05 05:11 7.2M 
3D"[xorg-server-1.12.1.901.tar.b= z22012-05-07 07:10 5= .2M 
3D"[xorg-server-1.12.1.901.tar= .gz2012-05-07 07:10 = 7.2M 
3D"[xorg-server-1.12.1.902.tar.b= z22012-05-20 05:17 5= .2M 
3D"[xorg-server-1.12.1.902.tar= .gz2012-05-20 05:17 = 7.2M 
3D"[xorg-server-1.12.1.tar.bz22012-04-13 22:52 5.1M 
3D"[xorg-server-1.12.1.tar.gz<= /td>2012-04-13 22:52 7.0M 
3D"[xorg-server-1.12.2.901.tar.b= z22012-06-15 03:15 5= .2M 
3D"[xorg-server-1.12.2.901.tar= .gz2012-06-15 03:14 = 7.2M 
3D"[xorg-server-1.12.2.902.tar.b= z22012-07-02 00:34 5= .2M 
3D"[xorg-server-1.12.2.902.tar= .gz2012-07-02 00:34 = 7.2M 
3D"[xorg-server-1.12.2.tar.bz22012-05-29 20:11 5.2M 
3D"[xorg-server-1.12.2.tar.gz<= /td>2012-05-29 20:11 7.2M 
3D"[xorg-server-1.12.3.901.tar.b= z22012-08-03 17:26 5= .2M 
3D"[xorg-server-1.12.3.901.tar= .gz2012-08-03 17:26 = 7.2M 
3D"[xorg-server-1.12.3.902.tar.b= z22012-08-19 16:11 5= .2M 
3D"[xorg-server-1.12.3.902.tar= .gz2012-08-19 16:11 = 7.2M 
3D"[xorg-server-1.12.3.tar.bz22012-07-09 01:21 5.2M 
3D"[xorg-server-1.12.3.tar.gz<= /td>2012-07-09 01:21 7.2M 
3D"[xorg-server-1.12.4.tar.bz22012-08-27 05:15 5.2M 
3D"[xorg-server-1.12.4.tar.gz<= /td>2012-08-27 05:15 7.2M 
3D"[xorg-server-1.12.99.901.tar= .bz22012-07-10 08:35 5.2M 
3D"[xorg-server-1.12.99.901.t= ar.gz2012-07-10 08:34 7.2M 
3D"[xorg-server-1.12.99.902.tar= .bz22012-07-17 22:50 5.2M 
3D"[xorg-server-1.12.99.902.t= ar.gz2012-07-17 22:49 7.2M 
3D"[xorg-server-1.12.99.903.tar= .bz22012-07-26 05:50 5.2M 
3D"[xorg-server-1.12.99.903.t= ar.gz2012-07-26 05:49 7.2M 
3D"[xorg-server-1.12.99.904.tar= .bz22012-08-08 00:57 5.2M 
3D"[xorg-server-1.12.99.904.t= ar.gz2012-08-08 00:56 7.2M 
3D"[xorg-server-1.12.99.905.tar= .bz22012-08-21 21:53 5.2M 
3D"[xorg-server-1.12.99.905.t= ar.gz2012-08-21 21:52 7.2M 
3D"[xorg-server-1.13.0.901.tar.b= z22012-11-23 05:10 5= .2M 
3D"[xorg-server-1.13.0.901.tar= .gz2012-11-23 05:09 = 7.2M 
3D"[xorg-server-1.13.0.902.tar.b= z22012-12-07 06:09 5= .2M 
3D"[xorg-server-1.13.0.902.tar= .gz2012-12-07 06:08 = 7.2M 
3D"[xorg-server-1.13.0.tar.bz22012-09-05 21:48 5.2M 
3D"[xorg-server-1.13.0.tar.gz<= /td>2012-09-05 21:47 7.2M 
3D"[xorg-server-1.13.1.901.tar.b= z22013-01-04 06:51 5= .2M 
3D"[xorg-server-1.13.1.901.tar= .gz2013-01-04 06:50 = 7.2M 
3D"[xorg-server-1.13.1.tar.bz22012-12-14 21:47 5.2M 
3D"[xorg-server-1.13.1.tar.bz2.o= ld2012-12-14 04:43 5= .2M 
3D"[xorg-server-1.13.1.tar.gz<= /td>2012-12-14 21:49 7.2M 
3D"[xorg-server-1.13.1.tar.gz.old= 2012-12-14 04:42 7.2= M 
3D"[xorg-server-1.13.2.901.tar.b= z22013-02-16 07:14 5= .2M 
3D"[xorg-server-1.13.2.901.tar= .gz2013-02-16 07:14 = 7.2M 
3D"[xorg-server-1.13.2.902.tar.b= z22013-03-01 07:31 5= .2M 
3D"[xorg-server-1.13.2.902.tar= .gz2013-03-01 07:31 = 7.2M 
3D"[xorg-server-1.13.2.tar.bz22013-01-25 06:01 5.2M 
3D"[xorg-server-1.13.2.tar.gz<= /td>2013-01-25 06:00 7.2M 
3D"[xorg-server-1.13.3.tar.bz22013-03-08 06:19 5.2M 
3D"[xorg-server-1.13.3.tar.gz<= /td>2013-03-08 06:19 7.2M 
3D"[xorg-server-1.13.4.tar.bz22013-04-17 06:00 5.3M 
3D"[xorg-server-1.13.4.tar.gz<= /td>2013-04-17 05:59 7.2M 
3D"[xorg-server-1.13.99.901.tar= .bz22012-12-19 20:50 5.2M 
3D"[xorg-server-1.13.99.901.t= ar.gz2012-12-19 20:50 7.2M 
3D"[xorg-server-1.13.99.902.tar= .bz22013-02-14 05:44 5.3M 
3D"[xorg-server-1.13.99.902.t= ar.gz2013-02-14 05:43 7.3M 
3D"[xorg-server-1.14.0.tar.bz22013-03-06 06:35 5.3M 
3D"[xorg-server-1.14.0.tar.gz<= /td>2013-03-06 06:34 7.3M 
3D"[xorg-server-1.14.1.901.tar.b= z22013-05-31 06:09 5= .2M 
3D"[xorg-server-1.14.1.901.tar= .gz2013-05-31 06:09 = 7.2M 
3D"[xorg-server-1.14.1.902.tar.b= z22013-06-13 22:28 5= .2M 
3D"[xorg-server-1.14.1.902.tar= .gz2013-06-13 22:28 = 7.2M 
3D"[xorg-server-1.14.1.tar.bz22013-04-17 07:37 5.3M 
3D"[xorg-server-1.14.1.tar.gz<= /td>2013-04-17 07:36 7.3M 
3D"[xorg-server-1.14.2-rc1.tar.b= z22013-05-31 04:38 5= .2M 
3D"[xorg-server-1.14.2-rc1.tar= .gz2013-05-31 04:38 = 7.2M 
3D"[xorg-server-1.14.2.901.tar.b= z22013-07-26 05:47 5= .2M 
3D"[xorg-server-1.14.2.901.t= ar.bz2.old2013-07-26 04:27 5.2M 
3D"[xorg-server-1.14.2.901.tar= .gz2013-07-26 05:47 = 7.2M 
3D"[xorg-server-1.14.2.901.ta= r.gz.old2013-07-26 04:27 7.2M 
3D"[xorg-server-1.14.2.902.tar.b= z22013-08-22 23:57 5= .2M 
3D"[xorg-server-1.14.2.902.tar= .gz2013-08-22 23:57 = 7.3M 
3D"[xorg-server-1.14.2.tar.bz22013-06-25 15:52 5.2M 
3D"[xorg-server-1.14.2.tar.gz<= /td>2013-06-25 15:52 7.2M 
3D"[xorg-server-1.14.3-rc1.tar.b= z22013-07-26 04:21 5= .2M 
3D"[xorg-server-1.14.3-rc1.tar= .gz2013-07-26 04:21 = 7.2M 
3D"[xorg-server-1.14.3.901.tar.b= z22013-10-26 19:53 5= .3M 
3D"[xorg-server-1.14.3.901.tar= .gz2013-10-26 19:53 = 7.3M 
3D"[xorg-server-1.14.3.tar.bz22013-09-13 03:19 5.2M 
3D"[xorg-server-1.14.3.tar.gz<= /td>2013-09-13 03:19 7.3M 
3D"[xorg-server-1.14.4.901.tar.b= z22013-11-22 05:13 5= .2M 
3D"[xorg-server-1.14.4.901.tar= .gz2013-11-22 05:13 = 7.3M 
3D"[xorg-server-1.14.4.tar.bz22013-11-01 05:31 5.3M 
3D"[xorg-server-1.14.4.tar.gz<= /td>2013-11-01 05:31 7.3M 
3D"[xorg-server-1.14.5.901.tar.b= z22014-03-22 05:21 5= .3M 
3D"[xorg-server-1.14.5.901.tar= .gz2014-03-22 05:21 = 7.3M 
3D"[xorg-server-1.14.5.tar.bz22013-12-13 03:53 5.2M 
3D"[xorg-server-1.14.5.tar.gz<= /td>2013-12-13 03:53 7.3M 
3D"[xorg-server-1.14.6.tar.bz22014-04-14 02:49 5.3M 
3D"[xorg-server-1.14.6.tar.gz<= /td>2014-04-14 02:49 7.3M 
3D"[xorg-server-1.14.7.tar.bz22014-06-06 04:20 5.3M 
3D"[xorg-server-1.14.7.tar.gz<= /td>2014-06-06 04:19 7.3M 
3D"[xorg-server-1.14.99.1.tar.bz2= 2013-04-24 17:16 5.3= M 
3D"[xorg-server-1.14.99.1.tar.g= z2013-04-24 17:15 7.= 3M 
3D"[xorg-server-1.14.99.2.tar.bz2= 2013-10-05 00:01 5.3= M 
3D"[xorg-server-1.14.99.2.tar.g= z2013-10-05 00:00 7.= 4M 
3D"[xorg-server-1.14.99.3.tar.bz2= 2013-10-19 00:34 5.3= M 
3D"[xorg-server-1.14.99.3.tar.g= z2013-10-19 00:33 7.= 4M 
3D"[xorg-server-1.14.99.901.tar= .bz22013-11-01 08:51 5.3M 
3D"[xorg-server-1.14.99.901.t= ar.gz2013-11-01 08:50 7.3M 
3D"[xorg-server-1.14.99.902.tar= .bz22013-11-14 01:32 5.3M 
3D"[xorg-server-1.14.99.902.t= ar.gz2013-11-14 01:32 7.3M 
3D"[xorg-server-1.14.99.903.tar= .bz22013-11-24 06:31 5.3M 
3D"[xorg-server-1.14.99.903.t= ar.gz2013-11-24 06:30 7.3M 
3D"[xorg-server-1.14.99.904.tar= .bz22013-12-11 15:57 5.3M 
3D"[xorg-server-1.14.99.904.t= ar.gz2013-12-11 15:56 7.3M 
3D"[xorg-server-1.14.99.905.tar= .bz22013-12-19 22:35 5.3M 
3D"[xorg-server-1.14.99.905.t= ar.gz2013-12-19 22:35 7.3M 
3D"[xorg-server-1.15.0.901.tar.b= z22014-03-22 06:04 5= .2M 
3D"[xorg-server-1.15.0.901.tar= .gz2014-03-22 06:04 = 7.3M 
3D"[xorg-server-1.15.0.tar.bz22013-12-27 18:01 5.3M 
3D"[xorg-server-1.15.0.tar.gz<= /td>2013-12-27 18:00 7.3M 
3D"[xorg-server-1.15.1.tar.bz22014-04-14 03:16 5.2M 
3D"[xorg-server-1.15.1.tar.gz<= /td>2014-04-14 03:16 7.3M 
3D"[xorg-server-1.15.2.tar.bz22014-06-27 01:30 5.3M 
3D"[xorg-server-1.15.2.tar.bz2.s= ig2014-06-27 01:30 = 72  
3D"[xorg-server-1.15.2.tar.gz<= /td>2014-06-27 01:29 7.4M 
3D"[xorg-server-1.15.2.tar.gz.sig= 2014-06-27 01:30 72=  
3D"[xorg-server-1.15.99.901.tar= .bz22014-02-24 21:52 5.4M 
3D"[xorg-server-1.15.99.901.t= ar.gz2014-02-24 21:52 7.6M 
3D"[xorg-server-1.15.99.902.tar= .bz22014-04-08 21:32 5.5M 
3D"[xorg-server-1.15.99.902.t= ar.gz2014-04-08 21:31 7.7M 
3D"[xorg-server-1.15.99.903.tar= .bz22014-06-05 05:41 5.5M 
3D"[xorg-server-1.15.99.903.t= ar.gz2014-06-05 05:40 7.7M 
3D"[xorg-server-1.15.99.904.tar= .bz22014-07-07 23:35 5.6M 
3D"[xorg-server-1.15.99.904= .tar.bz2.sig2014-07-07 23:35 536  
3D"[xorg-server-1.15.99.904.t= ar.gz2014-07-07 23:35 7.7M 
3D"[xorg-server-1.15.99.904.= tar.gz.sig2014-07-07 23:35 536  
3D"[xorg-server-1.16.0.901.tar.b= z22014-09-15 21:38 5= .5M 
3D"[xorg-server-1.16.0.901.t= ar.bz2.sig2014-09-15 21:38 543  
3D"[xorg-server-1.16.0.901.tar= .gz2014-09-15 21:37 = 7.7M 
3D"[xorg-server-1.16.0.901.ta= r.gz.sig2014-09-15 21:38 543  
3D"[xorg-server-1.16.0.tar.bz22014-07-17 07:09 5.6M 
3D"[xorg-server-1.16.0.tar.bz2.s= ig2014-07-17 07:09 5= 36  
3D"[xorg-server-1.16.0.tar.gz<= /td>2014-07-17 07:08 7.7M 
3D"[xorg-server-1.16.0.tar.gz.sig= 2014-07-17 07:09 536=  
3D"[xorg-server-1.16.1.901.tar.b= z22014-11-02 10:52 5= .5M 
3D"[xorg-server-1.16.1.901.t= ar.bz2.sig2014-11-02 10:52 543  
3D"[xorg-server-1.16.1.901.tar= .gz2014-11-02 10:51 = 7.7M 
3D"[xorg-server-1.16.1.901.ta= r.gz.sig2014-11-02 10:52 543  
3D"[xorg-server-1.16.1.tar.bz22014-09-21 09:17 5.5M 
3D"[xorg-server-1.16.1.tar.bz2.s= ig2014-09-21 09:17 5= 43  
3D"[xorg-server-1.16.1.tar.gz<= /td>2014-09-21 09:16 7.7M 
3D"[xorg-server-1.16.1.tar.gz.sig= 2014-09-21 09:17 543=  
3D"[xorg-server-1.16.2.901.tar.b= z22014-12-09 20:12 5= .5M 
3D"[xorg-server-1.16.2.901.t= ar.bz2.sig2014-12-09 20:12 543  
3D"[xorg-server-1.16.2.901.tar= .gz2014-12-09 20:11 = 7.7M 
3D"[xorg-server-1.16.2.901.ta= r.gz.sig2014-12-09 20:12 543  
3D"[xorg-server-1.16.2.tar.bz22014-11-10 15:53 5.5M 
3D"[xorg-server-1.16.2.tar.bz2.s= ig2014-11-10 15:53 5= 43  
3D"[xorg-server-1.16.2.tar.gz<= /td>2014-11-10 15:53 7.7M 
3D"[xorg-server-1.16.2.tar.gz.sig= 2014-11-10 15:53 543=  
3D"[xorg-server-1.16.3.tar.bz22014-12-20 12:19 5.5M 
3D"[xorg-server-1.16.3.tar.bz2.s= ig2014-12-20 12:19 5= 43  
3D"[xorg-server-1.16.3.tar.gz<= /td>2014-12-20 12:18 7.7M 
3D"[xorg-server-1.16.3.tar.gz.sig= 2014-12-20 12:19 543=  
3D"[xorg-server-1.16.4.tar.bz22015-02-11 00:15 5.5M 
3D"[xorg-server-1.16.4.tar.bz2.s= ig2015-02-11 00:15 5= 43  
3D"[xorg-server-1.16.4.tar.gz<= /td>2015-02-11 00:14 7.7M 
3D"[xorg-server-1.16.4.tar.gz.sig= 2015-02-11 00:15 543=  
3D"[xorg-server-1.16.99.901.tar= .bz22014-10-29 04:37 5.6M 
3D"[xorg-server-1.16.99.901= .tar.bz2.sig2014-10-29 04:37 536  
3D"[xorg-server-1.16.99.901.t= ar.gz2014-10-29 04:37 7.8M 
3D"[xorg-server-1.16.99.901.= tar.gz.sig2014-10-29 04:37 536  
3D"[xorg-server-1.16.99.902.tar= .bz22015-01-23 19:03 5.6M 
3D"[xorg-server-1.16.99.902= .tar.bz2.sig2015-01-23 19:03 536  
3D"[xorg-server-1.16.99.902.t= ar.gz2015-01-23 19:03 7.8M 
3D"[xorg-server-1.16.99.902.= tar.gz.sig2015-01-23 19:03 536  
3D"[xorg-server-1.17.0.tar.bz22015-02-04 17:37 5.6M 
3D"[xorg-server-1.17.0.tar.bz2.s= ig2015-02-04 17:37 5= 36  
3D"[xorg-server-1.17.0.tar.gz<= /td>2015-02-04 17:37 7.8M 
3D"[xorg-server-1.17.0.tar.gz.sig= 2015-02-04 17:37 536=  
3D"[xorg-server-1.17.1.tar.bz22015-02-10 22:53 5.6M 
3D"[xorg-server-1.17.1.tar.bz2.s= ig2015-02-10 22:53 5= 36  
3D"[xorg-server-1.17.1.tar.gz<= /td>2015-02-10 22:52 7.8M 
3D"[xorg-server-1.17.1.tar.gz.sig= 2015-02-10 22:53 536=  
3D"[xorg-server-1.17.2.tar.bz22015-06-16 16:31 5.5M 
3D"[xorg-server-1.17.2.tar.bz2.s= ig2015-06-16 16:31 = 72  
3D"[xorg-server-1.17.2.tar.gz<= /td>2015-06-16 16:30 7.7M 
3D"[xorg-server-1.17.2.tar.gz.sig= 2015-06-16 16:31 72=  
3D"[xorg-server-1.17.3.tar.bz22015-10-26 17:09 5.5M 
3D"[xorg-server-1.17.3.tar.bz2.s= ig2015-10-26 17:09 = 72  
3D"[xorg-server-1.17.3.tar.gz<= /td>2015-10-26 17:09 7.8M 
3D"[xorg-server-1.17.3.tar.gz.sig= 2015-10-26 17:09 72=  
3D"[xorg-server-1.17.4.tar.bz22015-10-28 16:38 5.5M 
3D"[xorg-server-1.17.4.tar.bz2.s= ig2015-10-28 16:38 = 72  
3D"[xorg-server-1.17.4.tar.gz<= /td>2015-10-28 16:38 7.8M 
3D"[xorg-server-1.17.4.tar.gz.sig= 2015-10-28 16:38 72=  
3D"[xorg-server-1.17.99.901.tar= .bz22015-09-02 02:34 5.6M 
3D"[xorg-server-1.17.99.901= .tar.bz2.sig2015-09-02 02:34 536  
3D"[xorg-server-1.17.99.901.t= ar.gz2015-09-02 02:34 7.9M 
3D"[xorg-server-1.17.99.901.= tar.gz.sig2015-09-02 02:34 536  
3D"[xorg-server-1.17.99.902.tar= .bz22015-10-26 18:13 5.5M 
3D"[xorg-server-1.17.99.902= .tar.bz2.sig2015-10-26 18:13 72  
3D"[xorg-server-1.17.99.902.t= ar.gz2015-10-26 18:13 7.8M 
3D"[xorg-server-1.17.99.902.= tar.gz.sig2015-10-26 18:13 72  
3D"[xorg-server-1.18.0.tar.bz22015-11-09 21:11 5.5M 
3D"[xorg-server-1.18.0.tar.bz2.s= ig2015-11-09 21:11 = 72  
3D"[xorg-server-1.18.0.tar.gz<= /td>2015-11-09 21:11 7.8M 
3D"[xorg-server-1.18.0.tar.gz.sig= 2015-11-09 21:11 72=  
3D"[xorg-server-1.18.1.tar.bz22016-02-08 23:41 5.6M 
3D"[xorg-server-1.18.1.tar.bz2.s= ig2016-02-08 23:41 = 72  
3D"[xorg-server-1.18.1.tar.gz<= /td>2016-02-08 23:41 7.8M 
3D"[xorg-server-1.18.1.tar.gz.sig= 2016-02-08 23:41 72=  
3D"[xorg-server-1.18.2.tar.bz22016-03-11 21:45 5.6M 
3D"[xorg-server-1.18.2.tar.bz2.s= ig2016-03-11 21:45 = 72  
3D"[xorg-server-1.18.2.tar.gz<= /td>2016-03-11 21:45 7.8M 
3D"[xorg-server-1.18.2.tar.gz.sig= 2016-03-11 21:45 72=  
3D"[xorg-server-1.18.3.tar.bz22016-04-04 19:48 5.6M 
3D"[xorg-server-1.18.3.tar.bz2.s= ig2016-04-04 19:48 = 72  
3D"[xorg-server-1.18.3.tar.gz<= /td>2016-04-04 19:48 7.9M 
3D"[xorg-server-1.18.3.tar.gz.sig= 2016-04-04 19:48 72=  
3D"[xorg-server-1.18.4.tar.bz22016-07-19 17:42 5.7M 
3D"[xorg-server-1.18.4.tar.bz2.s= ig2016-07-19 17:42 = 72  
3D"[xorg-server-1.18.4.tar.gz<= /td>2016-07-19 17:42 8.0M 
3D"[xorg-server-1.18.4.tar.gz.sig= 2016-07-19 17:42 72=  
3D"[xorg-server-1.18.99.2.tar.bz2= 2016-09-16 20:55 5.8= M 
3D"[xorg-server-1.18.99.2.tar= .bz2.sig2016-09-16 20:55 543  
3D"[xorg-server-1.18.99.2.tar.g= z2016-09-16 20:54 8.= 0M 
3D"[xorg-server-1.18.99.2.tar.= gz.sig2016-09-16 20:55 543  
3D"[xorg-server-1.18.99.901.tar= .bz22016-09-19 16:10 5.8M 
3D"[xorg-server-1.18.99.901= .tar.bz2.sig2016-09-19 16:10 543  
3D"[xorg-server-1.18.99.901.t= ar.gz2016-09-19 16:10 8.0M 
3D"[xorg-server-1.18.99.901.= tar.gz.sig2016-09-19 16:10 543  
3D"[xorg-server-1.18.99.902.tar= .bz22016-10-28 16:47 5.8M 
3D"[xorg-server-1.18.99.902= .tar.bz2.sig2016-10-28 16:47 543  
3D"[xorg-server-1.18.99.902.t= ar.gz2016-10-28 16:47 8.1M 
3D"[xorg-server-1.18.99.902.= tar.gz.sig2016-10-28 16:47 543  
3D"[xorg-server-1.19.0.tar.bz22016-11-15 17:08 5.8M 
3D"[xorg-server-1.19.0.tar.bz2.s= ig2016-11-15 17:08 5= 43  
3D"[xorg-server-1.19.0.tar.gz<= /td>2016-11-15 17:07 8.1M 
3D"[xorg-server-1.19.0.tar.gz.sig= 2016-11-15 17:08 543=  
3D"[xorg-server-1.19.1.tar.bz22017-01-11 21:25 5.8M 
3D"[xorg-server-1.19.1.tar.bz2.s= ig2017-01-11 21:25 = 72  
3D"[xorg-server-1.19.1.tar.gz<= /td>2017-01-11 21:25 8.1M 
3D"[xorg-server-1.19.1.tar.gz.sig= 2017-01-11 21:25 72=  
3D"[xorg-server-1.19.2.tar.bz22017-03-02 23:05 5.7M 
3D"[xorg-server-1.19.2.tar.bz2.s= ig2017-03-02 23:05 = 72  
3D"[xorg-server-1.19.2.tar.gz<= /td>2017-03-02 23:05 7.9M 
3D"[xorg-server-1.19.2.tar.gz.sig= 2017-03-02 23:05 72=  
3D"[xorg-server-1.19.3.tar.bz22017-03-15 18:12 5.8M 
3D"[xorg-server-1.19.3.tar.bz2.s= ig2017-03-15 18:12 = 72  
3D"[xorg-server-1.19.3.tar.gz<= /td>2017-03-15 18:12 8.1M 
3D"[xorg-server-1.19.3.tar.gz.sig= 2017-03-15 18:12 72=  
3D"[xorg-server-1.19.4.tar.bz22017-10-04 22:00 5.7M 
3D"[xorg-server-1.19.4.tar.bz2.s= ig2017-10-04 22:00 4= 38  
3D"[xorg-server-1.19.4.tar.gz<= /td>2017-10-04 22:00 8.0M 
3D"[xorg-server-1.19.4.tar.gz.sig= 2017-10-04 22:00 438=  
3D"[xorg-server-1.19.5.tar.bz22017-10-12 17:31 5.7M 
3D"[xorg-server-1.19.5.tar.bz2.s= ig2017-10-12 17:31 4= 38  
3D"[xorg-server-1.19.5.tar.gz<= /td>2017-10-12 17:31 8.0M 
3D"[xorg-server-1.19.5.tar.gz.sig= 2017-10-12 17:31 438=  
3D"[xorg-server-1.19.6.tar.bz22017-12-20 20:39 5.7M 
3D"[xorg-server-1.19.6.tar.bz2.s= ig2017-12-20 20:39 4= 38  
3D"[xorg-server-1.19.6.tar.gz<= /td>2017-12-20 20:39 8.0M 
3D"[xorg-server-1.19.6.tar.gz.sig= 2017-12-20 20:39 438=  
3D"[xorg-server-1.19.7.tar.bz22019-03-02 23:03 5.8M 
3D"[xorg-server-1.19.7.tar.bz2.s= ig2019-03-02 23:03 2= 87  
3D"[xorg-server-1.19.7.tar.gz<= /td>2019-03-02 23:02 8.1M 
3D"[xorg-server-1.19.7.tar.gz.sig= 2019-03-02 23:03 287=  
3D"[xorg-server-1.19.99.901.tar= .bz22018-02-28 18:28 5.8M 
3D"[xorg-server-1.19.99.901= .tar.bz2.sig2018-02-28 18:28 95  
3D"[xorg-server-1.19.99.901.t= ar.gz2018-02-28 18:28 8.1M 
3D"[xorg-server-1.19.99.901.= tar.gz.sig2018-02-28 18:28 95  
3D"[xorg-server-1.19.99.902.tar= .bz22018-03-28 20:39 5.8M 
3D"[xorg-server-1.19.99.902= .tar.bz2.sig2018-03-28 20:39 438  
3D"[xorg-server-1.19.99.902.t= ar.gz2018-03-28 20:39 8.1M 
3D"[xorg-server-1.19.99.902.= tar.gz.sig2018-03-28 20:39 438  
3D"[xorg-server-1.19.99.903.tar= .bz22018-04-02 19:56 5.8M 
3D"[xorg-server-1.19.99.903= .tar.bz2.sig2018-04-02 19:56 438  
3D"[xorg-server-1.19.99.903.t= ar.gz2018-04-02 19:56 8.1M 
3D"[xorg-server-1.19.99.903.= tar.gz.sig2018-04-02 19:56 438  
3D"[xorg-server-1.19.99.904.tar= .bz22018-04-10 19:50 5.8M 
3D"[xorg-server-1.19.99.904= .tar.bz2.sig2018-04-10 19:50 438  
3D"[xorg-server-1.19.99.904.t= ar.gz2018-04-10 19:50 8.1M 
3D"[xorg-server-1.19.99.904.= tar.gz.sig2018-04-10 19:50 438  
3D"[xorg-server-1.19.99.905.tar= .bz22018-04-24 21:12 5.8M 
3D"[xorg-server-1.19.99.905= .tar.bz2.sig2018-04-24 21:12 438  
3D"[xorg-server-1.19.99.905.t= ar.gz2018-04-24 21:12 8.1M 
3D"[xorg-server-1.19.99.905.= tar.gz.sig2018-04-24 21:12 438  
3D"[xorg-server-1.20.0.tar.bz22018-05-10 16:38 5.8M 
3D"[xorg-server-1.20.0.tar.bz2.s= ig2018-05-10 16:38 4= 38  
3D"[xorg-server-1.20.0.tar.gz<= /td>2018-05-10 16:38 8.1M 
3D"[xorg-server-1.20.0.tar.gz.sig= 2018-05-10 16:38 438=  
3D"[xorg-server-1.20.1.tar.bz22018-08-07 16:37 5.8M 
3D"[xorg-server-1.20.1.tar.bz2.s= ig2018-08-07 16:37 4= 38  
3D"[xorg-server-1.20.1.tar.gz<= /td>2018-08-07 16:37 8.1M 
3D"[xorg-server-1.20.1.tar.gz.sig= 2018-08-07 16:37 438=  
3D"[xorg-server-1.20.2.tar.bz22018-10-15 16:03 5.9M 
3D"[xorg-server-1.20.2.tar.bz2.s= ig2018-10-15 16:03 4= 38  
3D"[xorg-server-1.20.2.tar.gz<= /td>2018-10-15 16:03 8.2M 
3D"[xorg-server-1.20.2.tar.gz.sig= 2018-10-15 16:03 438=  
3D"[xorg-server-1.20.3.tar.bz22018-10-25 14:17 5.9M 
3D"[xorg-server-1.20.3.tar.bz2.s= ig2018-10-25 14:17 4= 38  
3D"[xorg-server-1.20.3.tar.gz<= /td>2018-10-25 14:17 8.2M 
3D"[xorg-server-1.20.3.tar.gz.sig= 2018-10-25 14:17 438=  
3D"[xorg-server-1.20.4.tar.bz22019-02-26 19:33 5.8M 
3D"[xorg-server-1.20.4.tar.bz2.s= ig2019-02-26 19:33 4= 38  
3D"[xorg-server-1.20.4.tar.gz<= /td>2019-02-26 19:33 8.2M 
3D"[xorg-server-1.20.4.tar.gz.sig= 2019-02-26 19:33 438=  
3D"[xorg-server-1.20.5.tar.bz22019-05-30 18:32 5.8M 
3D"[xorg-server-1.20.5.tar.bz2.s= ig2019-05-30 18:32 4= 38  
3D"[xorg-server-1.20.5.tar.gz<= /td>2019-05-30 18:32 8.2M 
3D"[xorg-server-1.20.5.tar.gz.sig= 2019-05-30 18:32 438=  
3D"[xorg-server-1.20.6.tar.bz22019-11-22 23:50 6.0M 
3D"[xorg-server-1.20.6.tar.bz2.s= ig2019-11-22 23:50 2= 15  
3D"[xorg-server-1.20.6.tar.gz<= /td>2019-11-22 23:50 8.3M 
3D"[xorg-server-1.20.6.tar.gz.sig= 2019-11-22 23:50 215=  

+
Apache/2.4.38 (Debian) Server at www.x.org Port 443
+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/software/pulseaudio/releas= es/index.html b/bitbake/lib/bb/tests/fetch-testdata/software/pulseaudio/rel= eases/index.html new file mode 100644 index 0000000..bf2d23c --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/software/pulseaudio/releases/inde= x.html @@ -0,0 +1,383 @@ + + + + Index of /software/pulseaudio/releases + + +

Index of /software/pulseaudio/releases

+ + + + +<= td>bad/ + +=   += = + +=   += = + +=   += = + +=   += = +=   += += + +=   += = + +=   += = + +=   += = +=   += += + +=   += = +=   += += +=   += += +=   += += +=   += += +=   += += +=   += += +=   += += +=   += += +=   += += +=   += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += + += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += +<= td>  += += + +=   += = += +=   += = + +=   += = += +=   += = +<= td>  += += += <= td align=3D"right">2012-03-15 12:50 += += + +=   += = += +=   += = + +=   += = += +=   += = +<= td>  += += += <= td align=3D"right">2012-11-03 11:44 += += +<= td>  += += += <= td align=3D"right">2012-11-17 08:21 += += +<= td>  += += += <= td align=3D"right">2012-12-07 04:07 += += + +=   += = += +=   += = +<= td>  += += += <= td align=3D"right">2013-04-16 04:10 += += +<= td>  += += += <= td align=3D"right">2013-05-23 03:26 += += + +=   += = += +=   += = +<= td>  += += += <= td align=3D"right">2014-01-23 19:10 += += +<= td>  += += += <= td align=3D"right">2014-01-29 20:16 += += +<= td>  += += += <= td align=3D"right">2014-02-15 06:04 += += + +=   += = += +=   += = +<= td>  += += += <= td align=3D"right">2014-11-21 14:27 += += +<= td>  += += += <= td align=3D"right">2014-12-19 13:08 += += +<= td>  += += += <= td align=3D"right">2015-01-21 14:45 += += + +=   += = += +=   += = +<= td>  += += += <= td align=3D"right">2015-08-27 17:56 += += +<= td>  += += += <= td align=3D"right">2015-09-12 13:56 += += + += += += +=   += += = += + +=   += = += +=   += = +<= td>  += += += <= td align=3D"right">2015-12-28 12:39 += += +<= td>  += += += <= td align=3D"right">2016-01-12 03:28 += += + +=   += = += +=   += = +<= td>  += += += <= td align=3D"right">2016-05-12 10:58 += += +<= td>  += += += <= td align=3D"right">2016-05-29 06:08 += += + +=   += = += +=   += = +<= td>  += += += <= td align=3D"right">2017-01-03 16:14 += += +2017-01-19 00:12 += = += += += = += + += += +=   += += +2017-09-05 09:49 += = += += += = += +2017-09-18 15:23 += = += += += = += + += += +=   += += +2018-06-20 20:33 += = += += += = += +2018-07-14 16:43 += = += += += = += +2018-07-16 16:12 += += += + += +=   += + += +=   += + += +=   += +2019-09-13 13:34 += += += + +
3D"[ICO]"NameLas= t modifiedSizeDescription

3D"[PARENTDIR]"Parent Directory = ; -  
3D"[DIR]"2014-01-26 17:50 -  
3D"[polypaudio-0.1.tar.gz2008-03-28 21:16 387K&nb= sp;
3D"[polypaudio-0.1.tar.gz.md52011-05-29 11:28 56
3D"[polypaudio-0.1.tar.gz.sha12011-05-29 11:28 64  
3D"[polypaudio-0.2.tar.gz2008-03-28 21:16 460K&nb= sp;
3D"[polypaudio-0.2.tar.gz.md52011-05-29 11:28 56
3D"[polypaudio-0.2.tar.gz.sha12011-05-29 11:28 64  
3D"[polypaudio-0.3.tar.gz2008-03-28 21:16 470K&nb= sp;
3D"[polypaudio-0.3.tar.gz.md52011-05-29 11:28 56
3D"[polypaudio-0.3.tar.gz.sha12011-05-29 11:28 64  
3D"[polypaudio-0.4.tar.gz2008-03-28 21:16 486K&nb= sp;
3D"[polypaudio-0.4.tar.gz.md52011-05-29 11:28 56
3D"[polypaudio-0.4.tar.gz.sha12011-05-29 11:28 64  
3D"[polypaudio-0.5.1.tar.gz2008-03-28 21:16 524K
3D"[polypaudio-0.5.1.tar.gz.md5= 2011-05-29 11:28 58  
3D"[polypaudio-0.5.1.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[polypaudio-0.5.tar.gz2008-03-28 21:16 518K&nb= sp;
3D"[polypaudio-0.5.tar.gz.md52011-05-29 11:28 56
3D"[polypaudio-0.5.tar.gz.sha12011-05-29 11:28 64  
3D"[polypaudio-0.6.tar.gz2008-03-28 21:16 448K&nb= sp;
3D"[polypaudio-0.6.tar.gz.md52011-05-29 11:28 56
3D"[polypaudio-0.6.tar.gz.sha12011-05-29 11:28 64  
3D"[polypaudio-0.7.tar.gz2008-03-28 21:16 924K&nb= sp;
3D"[polypaudio-0.7.tar.gz.md52011-05-29 11:28 56
3D"[polypaudio-0.7.tar.gz.sha12011-05-29 11:28 64  
3D"[polypaudio-0.8.1.tar.gz2008-03-28 21:16 1.1M
3D"[polypaudio-0.8.1.tar.gz.md5= 2011-05-29 11:28 58  
3D"[polypaudio-0.8.1.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[polypaudio-0.8.tar.gz2008-03-28 21:16 1.1M&nb= sp;
3D"[polypaudio-0.8.tar.gz.md52011-05-29 11:28 56
3D"[polypaudio-0.8.tar.gz.sha12011-05-29 11:28 64  
3D"[polypaudio-0.9.0.tar.gz2008-03-28 21:16 1.1M
3D"[polypaudio-0.9.0.tar.gz.md5= 2011-05-29 11:28 58  
3D"[polypaudio-0.9.0.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[polypaudio-0.9.1.tar.gz2008-03-28 21:16 1.1M
3D"[polypaudio-0.9.1.tar.gz.md5= 2011-05-29 11:28 58  
3D"[polypaudio-0.9.1.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[pulseaudio-0.9.2.tar.gz2008-03-28 21:16 1.0M
3D"[pulseaudio-0.9.2.tar.gz.md5= 2011-05-29 11:28 58  
3D"[pulseaudio-0.9.2.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[pulseaudio-0.9.3.tar.gz2008-03-28 21:16 1.1M
3D"[pulseaudio-0.9.3.tar.gz.md5= 2011-05-29 11:28 58  
3D"[pulseaudio-0.9.3.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[pulseaudio-0.9.4.tar.gz2008-03-28 21:16 1.1M
3D"[pulseaudio-0.9.4.tar.gz.md5= 2011-05-29 11:28 58  
3D"[pulseaudio-0.9.4.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[pulseaudio-0.9.5.tar.gz2008-03-28 21:16 1.1M
3D"[pulseaudio-0.9.5.tar.gz.md5= 2011-05-29 11:28 58  
3D"[pulseaudio-0.9.5.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[pulseaudio-0.9.6.tar.gz2008-03-28 21:16 1.1M
3D"[pulseaudio-0.9.6.tar.gz.md5= 2011-05-29 11:28 58  
3D"[pulseaudio-0.9.6.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[pulseaudio-0.9.7.tar.gz2008-03-28 21:16 1.0M
3D"[pulseaudio-0.9.7.tar.gz.md5= 2011-05-29 11:28 58  
3D"[pulseaudio-0.9.7.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[pulseaudio-0.9.8.tar.gz2008-03-28 21:16 1.0M
3D"[pulseaudio-0.9.8.tar.gz.md5= 2011-05-29 11:28 58  
3D"[pulseaudio-0.9.8.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[pulseaudio-0.9.9.tar.gz2008-03-28 21:16 1.0M
3D"[pulseaudio-0.9.9.tar.gz.md5= 2011-05-29 11:28 58  
3D"[pulseaudio-0.9.9.tar.gz.sha12011-05-29 11:28 66 <= /td> 
3D"[pulseaudio-0.9.10.tar.gz2008-03-30 16:30 1.0M
3D"[pulseaudio-0.9.10.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.10.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.11.tar.gz2008-07-24 12:41 1.1M
3D"[pulseaudio-0.9.11.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.11.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.12.tar.gz2008-09-09 00:17 1.2M
3D"[pulseaudio-0.9.12.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.12.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.13.tar.gz2008-10-06 01:43 1.2M
3D"[pulseaudio-0.9.13.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.13.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.14.tar.gz2009-01-12 23:09 1.2M
3D"[pulseaudio-0.9.14.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.14.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.15.tar.gz2009-04-13 23:24 1.6M
3D"[pulseaudio-0.9.15.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.15.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.16-test1.t= ar.gz2009-06-23 17:16 1.8M 
3D"[pulseaudio-0.9.16-test1.= tar.gz.md52011-05-29 11:28 65  
3D"[pulseaudio-0.9.16-test1= .tar.gz.sha12011-05-29 11:28 73  
3D"[pulseaudio-0.9.16.tar.gz2009-09-10 00:49 1.9M
3D"[pulseaudio-0.9.16.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.16.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.17.tar.gz2009-09-11 01:32 1.9M
3D"[pulseaudio-0.9.17.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.17.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.18.tar.gz2009-09-19 00:43 1.9M
3D"[pulseaudio-0.9.18.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.18.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.19.tar.gz2009-09-30 01:30 1.9M
3D"[pulseaudio-0.9.19.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.19.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.20.tar.gz2009-11-11 05:10 2.0M
3D"[pulseaudio-0.9.20.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.20.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.21.tar.gz2009-11-23 04:23 2.0M
3D"[pulseaudio-0.9.21.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.21.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.22.tar.gz2010-11-26 01:12 2.0M
3D"[pulseaudio-0.9.22.tar.gz.md52011-05-29 11:28 59 <= /td> 
3D"[pulseaudio-0.9.22.tar.gz.sha1= 2011-05-29 11:28 67=  
3D"[pulseaudio-0.9.23.tar.gz2011-06-23 21:13 2.0M
3D"[pulseaudio-0.9.23.tar.gz.md52011-06-23 21:13 59 <= /td> 
3D"[pulseaudio-0.9.23.tar.gz.sha1= 2011-06-23 21:13 67=  
3D"[pulseaudio-0.99.1.tar.gz2011-08-02 21:59 2.2M
3D"[pulseaudio-0.99.1.tar.gz.md52011-08-02 21:59 59 <= /td> 
3D"[pulseaudio-0.99.1.tar.gz.sha1= 2011-08-02 21:59 67=  
3D"[pulseaudio-0.99.2.tar.gz2011-08-16 10:19 2.2M
3D"[pulseaudio-0.99.2.tar.gz.md52011-08-16 10:19 59 <= /td> 
3D"[pulseaudio-0.99.2.tar.gz.sha1= 2011-08-16 10:19 67=  
3D"[pulseaudio-0.99.3.tar.gz2011-08-29 17:11 2.2M
3D"[pulseaudio-0.99.3.tar.gz.md52011-08-29 17:11 59 <= /td> 
3D"[pulseaudio-0.99.3.tar.gz.sha1= 2011-08-29 17:11 67=  
3D"[pulseaudio-0.99.4.tar.gz2011-09-15 11:04 2.2M
3D"[pulseaudio-0.99.4.tar.gz.md52011-09-15 11:04 59 <= /td> 
3D"[pulseaudio-0.99.4.tar.gz.sha1= 2011-09-15 11:04 67=  
3D"[pulseaudio-1.0.tar.gz2011-09-27 08:54 2.1M&nb= sp;
3D"[pulseaudio-1.0.tar.gz.md52011-09-27 08:54 56
3D"[pulseaudio-1.0.tar.gz.sha12011-09-27 08:54 64  
3D"[pulseaudio-1.0.tar.xz2011-09-27 08:54 1.2M =
3D"[pulseaudio-1.0.tar.xz.md52011-09-27 08:54 56
3D"[pulseaudio-1.0.tar.xz.sha12011-09-27 08:54 64  
3D"[pulseaudio-1.1.tar.gz2011-10-20 13:25 2.1M&nb= sp;
3D"[pulseaudio-1.1.tar.gz.md52011-10-20 13:25 56
3D"[pulseaudio-1.1.tar.gz.sha12011-10-20 13:25 64  
3D"[pulseaudio-1.1.tar.xz2011-10-20 13:25 1.2M =
3D"[pulseaudio-1.1.tar.xz.md52011-10-20 13:25 56
3D"[pulseaudio-1.1.tar.xz.sha12011-10-20 13:25 64  
3D"[pulseaudio-1.99.1.tar.gz2012-03-15 12:50 2.2M
3D"[pulseaudio-1.99.1.tar.gz.md52012-03-15 12:50 59 <= /td> 
3D"[pulseaudio-1.99.1.tar.gz.sha1= 2012-03-15 12:50 67=  
3D"[pulseaudio-1.99.1.tar.xz1.3M=  
3D"[pulseaudio-1.99.1.tar.xz.md52012-03-15 12:50 59 <= /td> 
3D"[pulseaudio-1.99.1.tar.xz.sha1= 2012-03-15 12:50 67=  
3D"[pulseaudio-2.0.tar.gz2012-05-11 13:48 2.2M&nb= sp;
3D"[pulseaudio-2.0.tar.gz.md52012-05-11 13:48 56
3D"[pulseaudio-2.0.tar.gz.sha12012-05-11 13:48 64  
3D"[pulseaudio-2.0.tar.xz2012-05-11 13:48 1.3M =
3D"[pulseaudio-2.0.tar.xz.md52012-05-11 13:48 56
3D"[pulseaudio-2.0.tar.xz.sha12012-05-11 13:48 64  
3D"[pulseaudio-2.1.tar.gz2012-07-19 12:09 2.2M&nb= sp;
3D"[pulseaudio-2.1.tar.gz.md52012-07-19 12:09 56
3D"[pulseaudio-2.1.tar.gz.sha12012-07-19 12:09 64  
3D"[pulseaudio-2.1.tar.xz2012-07-19 12:09 1.3M =
3D"[pulseaudio-2.1.tar.xz.md52012-07-19 12:09 56
3D"[pulseaudio-2.1.tar.xz.sha12012-07-19 12:09 64  
3D"[pulseaudio-2.99.1.tar.gz2012-11-03 11:44 2.3M
3D"[pulseaudio-2.99.1.tar.gz.md52012-11-03 11:45 59 <= /td> 
3D"[pulseaudio-2.99.1.tar.gz.sha1= 2012-11-03 11:45 67=  
3D"[pulseaudio-2.99.1.tar.xz1.3M=  
3D"[pulseaudio-2.99.1.tar.xz.md52012-11-03 11:46 59 <= /td> 
3D"[pulseaudio-2.99.1.tar.xz.sha1= 2012-11-03 11:46 67=  
3D"[pulseaudio-2.99.2.tar.gz2012-11-17 08:21 2.3M
3D"[pulseaudio-2.99.2.tar.gz.md52012-11-17 08:22 59 <= /td> 
3D"[pulseaudio-2.99.2.tar.gz.sha1= 2012-11-17 08:22 67=  
3D"[pulseaudio-2.99.2.tar.xz1.3M=  
3D"[pulseaudio-2.99.2.tar.xz.md52012-11-17 08:22 59 <= /td> 
3D"[pulseaudio-2.99.2.tar.xz.sha1= 2012-11-17 08:22 67=  
3D"[pulseaudio-2.99.3.tar.gz2012-12-07 04:07 2.3M
3D"[pulseaudio-2.99.3.tar.gz.md52012-12-07 04:07 59 <= /td> 
3D"[pulseaudio-2.99.3.tar.gz.sha1= 2012-12-07 04:07 67=  
3D"[pulseaudio-2.99.3.tar.xz1.3M=  
3D"[pulseaudio-2.99.3.tar.xz.md52012-12-07 04:07 59 <= /td> 
3D"[pulseaudio-2.99.3.tar.xz.sha1= 2012-12-07 04:07 67=  
3D"[pulseaudio-3.0.tar.gz2012-12-18 07:22 2.3M&nb= sp;
3D"[pulseaudio-3.0.tar.gz.md52012-12-18 07:22 56
3D"[pulseaudio-3.0.tar.gz.sha12012-12-18 07:22 64  
3D"[pulseaudio-3.0.tar.xz2012-12-18 07:22 1.3M =
3D"[pulseaudio-3.0.tar.xz.md52012-12-18 07:22 56
3D"[pulseaudio-3.0.tar.xz.sha12012-12-18 07:22 64  
3D"[pulseaudio-3.99.1.tar.gz2013-04-16 04:10 2.3M
3D"[pulseaudio-3.99.1.tar.gz.md52013-04-16 04:10 59 <= /td> 
3D"[pulseaudio-3.99.1.tar.gz.sha1= 2013-04-16 04:10 67=  
3D"[pulseaudio-3.99.1.tar.xz1.3M=  
3D"[pulseaudio-3.99.1.tar.xz.md52013-04-16 04:10 59 <= /td> 
3D"[pulseaudio-3.99.1.tar.xz.sha1= 2013-04-16 04:10 67=  
3D"[pulseaudio-3.99.2.tar.gz2013-05-23 03:26 2.3M
3D"[pulseaudio-3.99.2.tar.gz.md52013-05-23 03:26 59 <= /td> 
3D"[pulseaudio-3.99.2.tar.gz.sha1= 2013-05-23 03:26 67=  
3D"[pulseaudio-3.99.2.tar.xz1.3M=  
3D"[pulseaudio-3.99.2.tar.xz.md52013-05-23 03:26 59 <= /td> 
3D"[pulseaudio-3.99.2.tar.xz.sha1= 2013-05-23 03:26 67=  
3D"[pulseaudio-4.0.tar.gz2013-06-03 18:52 2.3M&nb= sp;
3D"[pulseaudio-4.0.tar.gz.md52013-06-03 18:52 56
3D"[pulseaudio-4.0.tar.gz.sha12013-06-03 18:52 64  
3D"[pulseaudio-4.0.tar.xz2013-06-03 18:52 1.3M =
3D"[pulseaudio-4.0.tar.xz.md52013-06-03 18:52 56
3D"[pulseaudio-4.0.tar.xz.sha12013-06-03 18:52 64  
3D"[pulseaudio-4.99.2.tar.gz2014-01-23 19:10 2.4M
3D"[pulseaudio-4.99.2.tar.gz.md52014-01-23 19:10 59 <= /td> 
3D"[pulseaudio-4.99.2.tar.gz.sha1= 2014-01-23 19:10 67=  
3D"[pulseaudio-4.99.2.tar.xz1.4M=  
3D"[pulseaudio-4.99.2.tar.xz.md52014-01-23 19:10 59 <= /td> 
3D"[pulseaudio-4.99.2.tar.xz.sha1= 2014-01-23 19:10 67=  
3D"[pulseaudio-4.99.3.tar.gz2014-01-29 20:16 2.4M
3D"[pulseaudio-4.99.3.tar.gz.md52014-01-29 20:16 59 <= /td> 
3D"[pulseaudio-4.99.3.tar.gz.sha1= 2014-01-29 20:16 67=  
3D"[pulseaudio-4.99.3.tar.xz1.4M=  
3D"[pulseaudio-4.99.3.tar.xz.md52014-01-29 20:16 59 <= /td> 
3D"[pulseaudio-4.99.3.tar.xz.sha1= 2014-01-29 20:16 67=  
3D"[pulseaudio-4.99.4.tar.gz2014-02-15 06:04 2.5M
3D"[pulseaudio-4.99.4.tar.gz.md52014-02-15 06:04 59 <= /td> 
3D"[pulseaudio-4.99.4.tar.gz.sha1= 2014-02-15 06:04 67=  
3D"[pulseaudio-4.99.4.tar.xz1.4M=  
3D"[pulseaudio-4.99.4.tar.xz.md52014-02-15 06:04 59 <= /td> 
3D"[pulseaudio-4.99.4.tar.xz.sha1= 2014-02-15 06:04 67=  
3D"[pulseaudio-5.0.tar.gz2014-03-03 15:00 2.4M&nb= sp;
3D"[pulseaudio-5.0.tar.gz.md52014-03-03 15:00 56
3D"[pulseaudio-5.0.tar.gz.sha12014-03-03 15:00 64  
3D"[pulseaudio-5.0.tar.xz2014-03-03 15:00 1.4M =
3D"[pulseaudio-5.0.tar.xz.md52014-03-03 15:00 56
3D"[pulseaudio-5.0.tar.xz.sha12014-03-03 15:00 64  
3D"[pulseaudio-5.99.1.tar.gz2014-11-21 14:26 2.5M
3D"[pulseaudio-5.99.1.tar.gz.md52014-11-21 14:26 59 <= /td> 
3D"[pulseaudio-5.99.1.tar.gz.sha1= 2014-11-21 14:26 67=  
3D"[pulseaudio-5.99.1.tar.xz1.4M=  
3D"[pulseaudio-5.99.1.tar.xz.md52014-11-21 14:27 59 <= /td> 
3D"[pulseaudio-5.99.1.tar.xz.sha1= 2014-11-21 14:27 67=  
3D"[pulseaudio-5.99.2.tar.gz2014-12-19 13:08 2.5M
3D"[pulseaudio-5.99.2.tar.gz.md52014-12-19 13:08 59 <= /td> 
3D"[pulseaudio-5.99.2.tar.gz.sha1= 2014-12-19 13:08 67=  
3D"[pulseaudio-5.99.2.tar.xz1.4M=  
3D"[pulseaudio-5.99.2.tar.xz.md52014-12-19 13:08 59 <= /td> 
3D"[pulseaudio-5.99.2.tar.xz.sha1= 2014-12-19 13:08 67=  
3D"[pulseaudio-5.99.3.tar.gz2015-01-21 14:45 2.5M
3D"[pulseaudio-5.99.3.tar.gz.md52015-01-21 14:45 59 <= /td> 
3D"[pulseaudio-5.99.3.tar.gz.sha1= 2015-01-21 14:45 67=  
3D"[pulseaudio-5.99.3.tar.xz1.4M=  
3D"[pulseaudio-5.99.3.tar.xz.md52015-01-21 14:45 59 <= /td> 
3D"[pulseaudio-5.99.3.tar.xz.sha1= 2015-01-21 14:45 67=  
3D"[pulseaudio-6.0.tar.gz2015-02-12 19:02 2.5M&nb= sp;
3D"[pulseaudio-6.0.tar.gz.md52015-02-12 19:02 56
3D"[pulseaudio-6.0.tar.gz.sha12015-02-12 19:02 64  
3D"[pulseaudio-6.0.tar.xz2015-02-12 19:02 1.4M =
3D"[pulseaudio-6.0.tar.xz.md52015-02-12 19:02 56
3D"[pulseaudio-6.0.tar.xz.sha12015-02-12 19:02 64  
3D"[pulseaudio-6.99.1.tar.gz2015-08-27 17:56 2.6M
3D"[pulseaudio-6.99.1.tar.gz.md52015-08-27 17:56 59 <= /td> 
3D"[pulseaudio-6.99.1.tar.gz.sha1= 2015-08-27 17:56 67=  
3D"[pulseaudio-6.99.1.tar.xz1.4M=  
3D"[pulseaudio-6.99.1.tar.xz.md52015-08-27 17:56 59 <= /td> 
3D"[pulseaudio-6.99.1.tar.xz.sha1= 2015-08-27 17:56 67=  
3D"[pulseaudio-6.99.2.tar.gz2015-09-12 13:56 2.6M
3D"[pulseaudio-6.99.2.tar.gz.md52015-09-12 13:56 59 <= /td> 
3D"[pulseaudio-6.99.2.tar.gz.sha1= 2015-09-12 13:56 67=  
3D"[pulseaudio-6.99.2.tar.xz1.4M=  
3D"[pulseaudio-6.99.2.tar.xz.md52015-09-12 13:56 59 <= /td> 
3D"[pulseaudio-6.99.2.tar.xz.sha1= 2015-09-12 13:56 67=  
3D"[pulseaudio-7.0.tar.gz2015-09-24 03:31 2.6M&nb= sp;
3D"[pulseaudio-7.0.tar.gz.md5sum2015-09-24 03:31 56 <= /td> 
3D"[pulseaudio-7.0.tar.gz.sha1sum= 2015-09-24 03:31 64=  
3D"[pulseaudio-7.0.tar.xz2015-09-24 03:31 1.4M =
3D"[pulseaudio-7.0.tar.xz.md52015-09-24 03:31 56
3D"[pulseaudio-7.0.tar.xz.md5sum2015-09-24 03:31 56 <= /td> 
3D"[pulseaudio-7.0.tar.xz.sha12015-09-24 03:31 64  
3D"[pulseaudio-7.0.tar.xz.sha1sum= 2015-09-24 03:31 64=  
3D"[pulseaudio-7.1.tar.gz2015-10-30 12:51 2.6M&nb= sp;
3D"[pulseaudio-7.1.tar.gz.md52015-10-30 12:51 56
3D"[pulseaudio-7.1.tar.gz.sha12015-10-30 12:51 64  
3D"[pulseaudio-7.1.tar.xz2015-10-30 12:51 1.4M =
3D"[pulseaudio-7.1.tar.xz.md52015-10-30 12:51 56
3D"[pulseaudio-7.1.tar.xz.sha12015-10-30 12:51 64  
3D"[pulseaudio-7.99.1.tar.gz2015-12-28 12:38 2.6M
3D"[pulseaudio-7.99.1.tar.gz.md52015-12-28 12:38 59 <= /td> 
3D"[pulseaudio-7.99.1.tar.gz.sha1= 2015-12-28 12:38 67=  
3D"[pulseaudio-7.99.1.tar.xz1.4M=  
3D"[pulseaudio-7.99.1.tar.xz.md52015-12-28 12:39 59 <= /td> 
3D"[pulseaudio-7.99.1.tar.xz.sha1= 2015-12-28 12:39 67=  
3D"[pulseaudio-7.99.2.tar.gz2016-01-12 03:28 2.6M
3D"[pulseaudio-7.99.2.tar.gz.md52016-01-12 03:28 59 <= /td> 
3D"[pulseaudio-7.99.2.tar.gz.sha1= 2016-01-12 03:28 67=  
3D"[pulseaudio-7.99.2.tar.xz1.4M=  
3D"[pulseaudio-7.99.2.tar.xz.md52016-01-12 03:28 59 <= /td> 
3D"[pulseaudio-7.99.2.tar.xz.sha1= 2016-01-12 03:28 67=  
3D"[pulseaudio-8.0.tar.gz2016-01-22 07:38 2.6M&nb= sp;
3D"[pulseaudio-8.0.tar.gz.md52016-01-22 07:38 56
3D"[pulseaudio-8.0.tar.gz.sha12016-01-22 07:38 64  
3D"[pulseaudio-8.0.tar.xz2016-01-22 07:38 1.4M =
3D"[pulseaudio-8.0.tar.xz.md52016-01-22 07:38 56
3D"[pulseaudio-8.0.tar.xz.sha12016-01-22 07:38 64  
3D"[pulseaudio-8.99.1.tar.gz2016-05-12 10:58 2.6M
3D"[pulseaudio-8.99.1.tar.gz.md52016-05-12 10:58 59 <= /td> 
3D"[pulseaudio-8.99.1.tar.gz.sha1= 2016-05-12 10:58 67=  
3D"[pulseaudio-8.99.1.tar.xz1.5M=  
3D"[pulseaudio-8.99.1.tar.xz.md52016-05-12 10:58 59 <= /td> 
3D"[pulseaudio-8.99.1.tar.xz.sha1= 2016-05-12 10:58 67=  
3D"[pulseaudio-8.99.2.tar.gz2016-05-29 06:08 2.6M
3D"[pulseaudio-8.99.2.tar.gz.md52016-05-29 06:08 59 <= /td> 
3D"[pulseaudio-8.99.2.tar.gz.sha1= 2016-05-29 06:08 67=  
3D"[pulseaudio-8.99.2.tar.xz1.5M=  
3D"[pulseaudio-8.99.2.tar.xz.md52016-05-29 06:08 59 <= /td> 
3D"[pulseaudio-8.99.2.tar.xz.sha1= 2016-05-29 06:08 67=  
3D"[pulseaudio-9.0.tar.gz2016-06-22 07:09 2.6M&nb= sp;
3D"[pulseaudio-9.0.tar.gz.md52016-06-22 07:09 56
3D"[pulseaudio-9.0.tar.gz.sha12016-06-22 07:09 64  
3D"[pulseaudio-9.0.tar.xz2016-06-22 07:09 1.5M =
3D"[pulseaudio-9.0.tar.xz.md52016-06-22 07:09 56
3D"[pulseaudio-9.0.tar.xz.sha12016-06-22 07:09 64  
3D"[pulseaudio-9.99.1.tar.gz2017-01-03 16:14 2.7M
3D"[pulseaudio-9.99.1.tar.gz.md52017-01-03 16:14 59 <= /td> 
3D"[pulseaudio-9.99.1.tar.gz.sha1= 2017-01-03 16:14 67=  
3D"[pulseaudio-9.99.1.tar.xz1.5M=  
3D"[pulseaudio-9.99.1.tar.xz.md52017-01-03 16:14 59 <= /td> 
3D"[pulseaudio-9.99.1.tar.xz.sha1= 2017-01-03 16:14 67=  
3D"[pulseaudio-10.0.tar.gz2.7M&= nbsp;
3D"[pulseaudio-10.0.tar.gz.md52017-01-19 00:12 57  
3D"[pulseaudio-10.0.tar.gz.sha1= 2017-01-19 00:12 65  
3D"[pulseaudio-10.0.tar.xz2017-01-19 00:12 1.5M&nbs= p;
3D"[pulseaudio-10.0.tar.xz.md52017-01-19 00:12 57  
3D"[pulseaudio-10.0.tar.xz.sha1= 2017-01-19 00:12 65  
3D"[pulseaudio-10.99.1.tar.gz<= /td>2017-07-24 23:52 2.8M 
3D"[pulseaudio-10.99.1.tar.gz.md5= 2017-07-24 23:52 60=  
3D"[pulseaudio-10.99.1.tar.gz.sh= a12017-07-24 23:52 = 68  
3D"[pulseaudio-10.99.1.tar.xz2017-07-24 23:52 1.6M
3D"[pulseaudio-10.99.1.tar.xz.md5= 2017-07-24 23:52 60=  
3D"[pulseaudio-10.99.1.tar.xz.sh= a12017-07-24 23:52 = 68  
3D"[pulseaudio-11.0.tar.gz2.8M&= nbsp;
3D"[pulseaudio-11.0.tar.gz.md52017-09-05 09:49 57  
3D"[pulseaudio-11.0.tar.gz.sha1= 2017-09-05 09:49 65  
3D"[pulseaudio-11.0.tar.xz2017-09-05 09:49 1.6M&nbs= p;
3D"[pulseaudio-11.0.tar.xz.md52017-09-05 09:49 57  
3D"[pulseaudio-11.0.tar.xz.sha1= 2017-09-05 09:49 65  
3D"[pulseaudio-11.1.tar.gz2.8M&= nbsp;
3D"[pulseaudio-11.1.tar.gz.md52017-09-18 15:23 57  
3D"[pulseaudio-11.1.tar.gz.sha1= 2017-09-18 15:23 65  
3D"[pulseaudio-11.1.tar.xz2017-09-18 15:23 1.6M&nbs= p;
3D"[pulseaudio-11.1.tar.xz.md52017-09-18 15:23 57  
3D"[pulseaudio-11.1.tar.xz.sha1= 2017-09-18 15:23 65  
3D"[pulseaudio-11.99.1.tar.gz<= /td>2018-05-13 06:57 2.8M 
3D"[pulseaudio-11.99.1.tar.gz.md5= 2018-05-13 06:57 60=  
3D"[pulseaudio-11.99.1.tar.gz.sh= a12018-05-13 06:57 = 68  
3D"[pulseaudio-11.99.1.tar.xz2018-05-13 06:57 1.6M
3D"[pulseaudio-11.99.1.tar.xz.md5= 2018-05-13 06:57 60=  
3D"[pulseaudio-11.99.1.tar.xz.sh= a12018-05-13 06:57 = 68  
3D"[pulseaudio-12.0.tar.gz2.8M&= nbsp;
3D"[pulseaudio-12.0.tar.gz.md52018-06-20 20:33 57  
3D"[pulseaudio-12.0.tar.gz.sha1= 2018-06-20 20:33 65  
3D"[pulseaudio-12.0.tar.xz2018-06-20 20:33 1.6M&nbs= p;
3D"[pulseaudio-12.0.tar.xz.md52018-06-20 20:33 57  
3D"[pulseaudio-12.0.tar.xz.sha1= 2018-06-20 20:33 65  
3D"[pulseaudio-12.1.tar.gz2.8M&= nbsp;
3D"[pulseaudio-12.1.tar.gz.md52018-07-14 16:43 57  
3D"[pulseaudio-12.1.tar.gz.sha1= 2018-07-14 16:43 65  
3D"[pulseaudio-12.1.tar.xz2018-07-14 16:43 1.6M&nbs= p;
3D"[pulseaudio-12.1.tar.xz.md52018-07-14 16:43 57  
3D"[pulseaudio-12.1.tar.xz.sha1= 2018-07-14 16:43 65  
3D"[pulseaudio-12.2.tar.gz2.8M&= nbsp;
3D"[pulseaudio-12.2.tar.gz.sha256= 2018-07-16 16:13 89=  
3D"[pulseaudio-12.2.tar.xz2018-07-16 16:12 1.6M&nbs= p;
3D"[pulseaudio-12.2.tar.xz.sha256= 2018-07-16 16:13 89=  
3D"[pulseaudio-12.99.1.tar.gz<= /td>2019-07-09 03:16 3.6M 
3D"[pulseaudio-12.99.1.tar.gz.= sha2562019-07-09 03:16 92  
3D"[pulseaudio-12.99.1.tar.xz2019-07-09 03:16 1.8M
3D"[pulseaudio-12.99.1.tar.xz.= sha2562019-07-09 03:16 92  
3D"[pulseaudio-12.99.2.tar.gz<= /td>2019-08-06 17:47 3.6M 
3D"[pulseaudio-12.99.2.tar.gz.= sha2562019-08-06 17:47 92  
3D"[pulseaudio-12.99.2.tar.xz2019-08-06 17:47 1.8M
3D"[pulseaudio-12.99.2.tar.xz.= sha2562019-08-06 17:47 92  
3D"[pulseaudio-12.99.3.tar.gz<= /td>2019-09-01 07:44 3.6M 
3D"[pulseaudio-12.99.3.tar.gz.= sha2562019-09-01 07:44 92  
3D"[pulseaudio-12.99.3.tar.xz2019-09-01 07:44 1.9M
3D"[pulseaudio-12.99.3.tar.xz.= sha2562019-09-01 07:44 92  
3D"[pulseaudio-13.0.tar.gz3.6M&= nbsp;
3D"[pulseaudio-13.0.tar.gz.sha256= 2019-09-13 13:34 89=  
3D"[pulseaudio-13.0.tar.xz2019-09-13 13:34 1.8M&nbs= p;
3D"[pulseaudio-13.0.tar.xz.sha256= 2019-09-13 13:34 89=  

+
Apache/2.4.38 (Debian) Server at freedesktop.org Port 443 + diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py index a0b656b..29c96b2 100644 --- a/bitbake/lib/bb/tests/fetch.py +++ b/bitbake/lib/bb/tests/fetch.py @@ -9,12 +9,12 @@ import unittest import hashlib import tempfile -import subprocess import collections import os from bb.fetch2 import URI from bb.fetch2 import FetchMethod import bb +from bb.tests.support.httpserver import HTTPService =20 def skipIfNoNetwork(): if os.environ.get("BB_SKIP_NETTESTS") =3D=3D "yes": @@ -1031,7 +1031,7 @@ class SVNTest(FetcherTest): =20 bb.process.run("svn co %s svnfetch_co" % self.repo_url, cwd=3Dself= .tempdir) # Github will emulate SVN. Use this to check if we're downloding.= .. - bb.process.run("svn propset svn:externals 'bitbake http://github.c= om/openembedded/bitbake' .", + bb.process.run("svn propset svn:externals 'bitbake svn://vcs.pcre.= org/pcre2/code' .", cwd=3Dos.path.join(self.tempdir, 'svnfetch_co', 'tr= unk')) bb.process.run("svn commit --non-interactive -m 'Add external'", cwd=3Dos.path.join(self.tempdir, 'svnfetch_co', 'tr= unk')) @@ -1152,7 +1152,8 @@ class FetchLatestVersionTest(FetcherTest): ("mx-1.0", "git://github.com/clutter-project/mx.git;branch=3Dmx-1.= 4", "9b1db6b8060bd00b121a692f942404a24ae2960f", "") : "1.99.4", # version pattern "vX.Y" - ("mtd-utils", "git://git.infradead.org/mtd-utils.git", "ca39eb1d98= e736109c64ff9c1aa2a6ecca222d8f", "") + # mirror of git.infradead.org since network issues interfered with= testing + ("mtd-utils", "git://git.yoctoproject.org/mtd-utils.git", "ca39eb1= d98e736109c64ff9c1aa2a6ecca222d8f", "") : "1.5.0", # version pattern "pkg_name-X.Y" ("presentproto", "git://anongit.freedesktop.org/git/xorg/proto/pre= sentproto", "24f3a56e541b0a9e6c6ee76081f441221a120ef9", "") @@ -1180,27 +1181,46 @@ class FetchLatestVersionTest(FetcherTest): } =20 test_wget_uris =3D { + # # packages with versions inside directory name - ("util-linux", "http://kernel.org/pub/linux/utils/util-linux/v2.23= /util-linux-2.24.2.tar.bz2", "", "") + # + # http://kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.= 24.2.tar.bz2 + ("util-linux", "/pub/linux/utils/util-linux/v2.23/util-linux-2.24.= 2.tar.bz2", "", "") : "2.24.2", - ("enchant", "http://www.abisource.com/downloads/enchant/1.6.0/ench= ant-1.6.0.tar.gz", "", "") + # http://www.abisource.com/downloads/enchant/1.6.0/enchant-1.6.0.t= ar.gz + ("enchant", "/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz", "", "= ") : "1.6.0", - ("cmake", "http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz",= "", "") + # http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz + ("cmake", "/files/v2.8/cmake-2.8.12.1.tar.gz", "", "") : "2.8.12.1", + # # packages with versions only in current directory - ("eglic", "http://downloads.yoctoproject.org/releases/eglibc/eglib= c-2.18-svnr23787.tar.bz2", "", "") + # + # http://downloads.yoctoproject.org/releases/eglibc/eglibc-2.18-sv= nr23787.tar.bz2 + ("eglic", "/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2", "", ""= ) : "2.19", - ("gnu-config", "http://downloads.yoctoproject.org/releases/gnu-con= fig/gnu-config-20120814.tar.bz2", "", "") + # http://downloads.yoctoproject.org/releases/gnu-config/gnu-config= -20120814.tar.bz2 + ("gnu-config", "/releases/gnu-config/gnu-config-20120814.tar.bz2",= "", "") : "20120814", + # # packages with "99" in the name of possible version - ("pulseaudio", "http://freedesktop.org/software/pulseaudio/release= s/pulseaudio-4.0.tar.xz", "", "") + # + # http://freedesktop.org/software/pulseaudio/releases/pulseaudio-4= .0.tar.xz + ("pulseaudio", "/software/pulseaudio/releases/pulseaudio-4.0.tar.x= z", "", "") : "5.0", - ("xserver-xorg", "http://xorg.freedesktop.org/releases/individual/= xserver/xorg-server-1.15.1.tar.bz2", "", "") + # http://xorg.freedesktop.org/releases/individual/xserver/xorg-ser= ver-1.15.1.tar.bz2 + ("xserver-xorg", "/releases/individual/xserver/xorg-server-1.15.1.= tar.bz2", "", "") : "1.15.1", + # # packages with valid UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX - ("cups", "http://www.cups.org/software/1.7.2/cups-1.7.2-source.tar= .bz2", "https://github.com/apple/cups/releases", "(?Pcups\-)(?P= ((\d+[\.\-_]*)+))\-source\.tar\.gz") + # + # http://www.cups.org/software/1.7.2/cups-1.7.2-source.tar.bz2 + # https://github.com/apple/cups/releases + ("cups", "/software/1.7.2/cups-1.7.2-source.tar.bz2", "/apple/cups= /releases", "(?Pcups\-)(?P((\d+[\.\-_]*)+))\-source\.tar\.gz") : "2.0.0", - ("db", "http://download.oracle.com/berkeley-db/db-5.3.21.tar.gz", = "http://ftp.debian.org/debian/pool/main/d/db5.3/", "(?Pdb5\.3_)(?P\d+(\.\d+)+).+\.orig\.tar\.xz") + # http://download.oracle.com/berkeley-db/db-5.3.21.tar.gz + # http://ftp.debian.org/debian/pool/main/d/db5.3/ + ("db", "/berkeley-db/db-5.3.21.tar.gz", "/debian/pool/main/d/db5.3= /", "(?Pdb5\.3_)(?P\d+(\.\d+)+).+\.orig\.tar\.xz") : "5.3.10", } =20 @@ -1217,18 +1237,28 @@ class FetchLatestVersionTest(FetcherTest): r =3D bb.utils.vercmp_string(v, verstring) self.assertTrue(r =3D=3D -1 or r =3D=3D 0, msg=3D"Package %s, = version: %s <=3D %s" % (k[0], v, verstring)) =20 - @skipIfNoNetwork() def test_wget_latest_versionstring(self): - for k, v in self.test_wget_uris.items(): - self.d.setVar("PN", k[0]) - self.d.setVar("UPSTREAM_CHECK_URI", k[2]) - self.d.setVar("UPSTREAM_CHECK_REGEX", k[3]) - ud =3D bb.fetch2.FetchData(k[1], self.d) - pupver =3D ud.method.latest_versionstring(ud, self.d) - verstring =3D pupver[0] - self.assertTrue(verstring, msg=3D"Could not find upstream vers= ion for %s" % k[0]) - r =3D bb.utils.vercmp_string(v, verstring) - self.assertTrue(r =3D=3D -1 or r =3D=3D 0, msg=3D"Package %s, = version: %s <=3D %s" % (k[0], v, verstring)) + testdata =3D os.path.dirname(os.path.abspath(__file__)) + "/fetch-= testdata" + server =3D HTTPService(testdata) + server.start() + port =3D server.port + try: + for k, v in self.test_wget_uris.items(): + self.d.setVar("PN", k[0]) + checkuri =3D "" + if k[2]: + checkuri =3D "http://localhost:%s/" % port + k[2] + self.d.setVar("UPSTREAM_CHECK_URI", checkuri) + self.d.setVar("UPSTREAM_CHECK_REGEX", k[3]) + url =3D "http://localhost:%s/" % port + k[1] + ud =3D bb.fetch2.FetchData(url, self.d) + pupver =3D ud.method.latest_versionstring(ud, self.d) + verstring =3D pupver[0] + self.assertTrue(verstring, msg=3D"Could not find upstream = version for %s" % k[0]) + r =3D bb.utils.vercmp_string(v, verstring) + self.assertTrue(r =3D=3D -1 or r =3D=3D 0, msg=3D"Package = %s, version: %s <=3D %s" % (k[0], v, verstring)) + finally: + server.stop() =20 =20 class FetchCheckStatusTest(FetcherTest): @@ -1662,6 +1692,47 @@ class GitShallowTest(FetcherTest): # Verify the submodule is also shallow self.assertRevCount(1, cwd=3Dos.path.join(self.gitdir, 'gitsubmodu= le')) =20 + def test_shallow_submodule_mirrors(self): + self.add_empty_file('a') + self.add_empty_file('b') + + smdir =3D os.path.join(self.tempdir, 'gitsubmodule') + bb.utils.mkdirhier(smdir) + self.git('init', cwd=3Dsmdir) + # Make this look like it was cloned from a remote... + self.git('config --add remote.origin.url "%s"' % smdir, cwd=3Dsmdi= r) + self.git('config --add remote.origin.fetch "+refs/heads/*:refs/rem= otes/origin/*"', cwd=3Dsmdir) + self.add_empty_file('asub', cwd=3Dsmdir) + self.add_empty_file('bsub', cwd=3Dsmdir) + + self.git('submodule init', cwd=3Dself.srcdir) + self.git('submodule add file://%s' % smdir, cwd=3Dself.srcdir) + self.git('submodule update', cwd=3Dself.srcdir) + self.git('commit -m submodule -a', cwd=3Dself.srcdir) + + uri =3D 'gitsm://%s;protocol=3Dfile;subdir=3D${S}' % self.srcdir + + # Fetch once to generate the shallow tarball + fetcher, ud =3D self.fetch(uri) + + # Set up the mirror + mirrordir =3D os.path.join(self.tempdir, 'mirror') + os.rename(self.dldir, mirrordir) + self.d.setVar('PREMIRRORS', 'gitsm://.*/.* file://%s/\n' % mirrord= ir) + + # Fetch from the mirror + bb.utils.remove(self.dldir, recurse=3DTrue) + bb.utils.remove(self.gitdir, recurse=3DTrue) + self.fetch_and_unpack(uri) + + # Verify the main repository is shallow + self.assertRevCount(1) + + # Verify the gitsubmodule directory is present + assert os.listdir(os.path.join(self.gitdir, 'gitsubmodule')) + + # Verify the submodule is also shallow + self.assertRevCount(1, cwd=3Dos.path.join(self.gitdir, 'gitsubmodu= le')) =20 if any(os.path.exists(os.path.join(p, 'git-annex')) for p in os.enviro= n.get('PATH').split(':')): def test_shallow_annex(self): @@ -1863,6 +1934,26 @@ class GitShallowTest(FetcherTest): with self.assertRaises(bb.fetch2.FetchError): self.fetch() =20 + def test_shallow_fetch_missing_revs(self): + self.add_empty_file('a') + self.add_empty_file('b') + fetcher, ud =3D self.fetch(self.d.getVar('SRC_URI')) + self.git('tag v0.0 master', cwd=3Dself.srcdir) + self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0') + self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0') + self.fetch_shallow() + + def test_shallow_fetch_missing_revs_fails(self): + self.add_empty_file('a') + self.add_empty_file('b') + fetcher, ud =3D self.fetch(self.d.getVar('SRC_URI')) + self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0') + self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0') + + with self.assertRaises(bb.fetch2.FetchError), self.assertLogs("Bit= Bake.Fetcher", level=3D"ERROR") as cm: + self.fetch_shallow() + self.assertIn("Unable to find revision v0.0 even from upstream", c= m.output[0]) + @skipIfNoNetwork() def test_bitbake(self): self.git('remote add --mirror=3Dfetch origin git://github.com/open= embedded/bitbake', cwd=3Dself.srcdir) @@ -1988,3 +2079,437 @@ class GitLfsTest(FetcherTest): ud.method._find_git_lfs =3D lambda d: False shutil.rmtree(self.gitdir, ignore_errors=3DTrue) fetcher.unpack(self.d.getVar('WORKDIR')) + +class NPMTest(FetcherTest): + def skipIfNoNpm(): + import shutil + if not shutil.which('npm'): + return unittest.skip('npm not installed, tests being skipped') + return lambda f: f + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example;version=3D1.0.0' + fetcher =3D bb.fetch.Fetch([url], self.d) + ud =3D fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + self.assertTrue(os.path.exists(ud.localpath + '.done')) + self.assertTrue(os.path.exists(ud.resolvefile)) + fetcher.unpack(self.unpackdir) + unpackdir =3D os.path.join(self.unpackdir, 'npm') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.js= on'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_bad_checksum(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example;version=3D1.0.0' + # Fetch once to get a tarball + fetcher =3D bb.fetch.Fetch([url], self.d) + ud =3D fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Modify the tarball + bad =3D b'bad checksum' + with open(ud.localpath, 'wb') as f: + f.write(bad) + # Verify that the tarball is fetched again + fetcher.download() + badsum =3D hashlib.sha512(bad).hexdigest() + self.assertTrue(os.path.exists(ud.localpath + '_bad-checksum_' + b= adsum)) + self.assertTrue(os.path.exists(ud.localpath)) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_premirrors(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example;version=3D1.0.0' + # Fetch once to get a tarball + fetcher =3D bb.fetch.Fetch([url], self.d) + ud =3D fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Setup the mirror + mirrordir =3D os.path.join(self.tempdir, 'mirror') + bb.utils.mkdirhier(mirrordir) + os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(= ud.localpath))) + self.d.setVar('PREMIRRORS', 'https?$://.*/.* file://%s/\n' % mirro= rdir) + self.d.setVar('BB_FETCH_PREMIRRORONLY', '1') + # Fetch again + self.assertFalse(os.path.exists(ud.localpath)) + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_mirrors(self): + # Fetch once to get a tarball + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example;version=3D1.0.0' + fetcher =3D bb.fetch.Fetch([url], self.d) + ud =3D fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Setup the mirror + mirrordir =3D os.path.join(self.tempdir, 'mirror') + bb.utils.mkdirhier(mirrordir) + os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(= ud.localpath))) + self.d.setVar('MIRRORS', 'https?$://.*/.* file://%s/\n' % mirrordi= r) + # Update the resolved url to an invalid url + with open(ud.resolvefile, 'r') as f: + url =3D f.read() + uri =3D URI(url) + uri.path =3D '/invalid' + with open(ud.resolvefile, 'w') as f: + f.write(str(uri)) + # Fetch again + self.assertFalse(os.path.exists(ud.localpath)) + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_destsuffix_downloadfilename(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example;version=3D1.0.0;destsuffix=3Dfoo/bar;downloadfilename=3Dfoo= -bar.tgz' + fetcher =3D bb.fetch.Fetch([url], self.d) + fetcher.download() + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'foo-bar.t= gz'))) + fetcher.unpack(self.unpackdir) + unpackdir =3D os.path.join(self.unpackdir, 'foo', 'bar') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.js= on'))) + + def test_npm_no_network_no_tarball(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example;version=3D1.0.0' + self.d.setVar('BB_NO_NETWORK', '1') + fetcher =3D bb.fetch.Fetch([url], self.d) + with self.assertRaises(bb.fetch2.NetworkAccess): + fetcher.download() + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_no_network_with_tarball(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example;version=3D1.0.0' + # Fetch once to get a tarball + fetcher =3D bb.fetch.Fetch([url], self.d) + fetcher.download() + # Disable network access + self.d.setVar('BB_NO_NETWORK', '1') + # Fetch again + fetcher.download() + fetcher.unpack(self.unpackdir) + unpackdir =3D os.path.join(self.unpackdir, 'npm') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.js= on'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_registry_alternate(self): + url =3D 'npm://registry.freajs.org;package=3D@savoirfairelinux/nod= e-server-example;version=3D1.0.0' + fetcher =3D bb.fetch.Fetch([url], self.d) + fetcher.download() + fetcher.unpack(self.unpackdir) + unpackdir =3D os.path.join(self.unpackdir, 'npm') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.js= on'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_version_latest(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example;version=3Dlatest' + fetcher =3D bb.fetch.Fetch([url], self.d) + fetcher.download() + fetcher.unpack(self.unpackdir) + unpackdir =3D os.path.join(self.unpackdir, 'npm') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.js= on'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_registry_invalid(self): + url =3D 'npm://registry.invalid.org;package=3D@savoirfairelinux/no= de-server-example;version=3D1.0.0' + fetcher =3D bb.fetch.Fetch([url], self.d) + with self.assertRaises(bb.fetch2.FetchError): + fetcher.download() + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_package_invalid(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/inva= lid;version=3D1.0.0' + fetcher =3D bb.fetch.Fetch([url], self.d) + with self.assertRaises(bb.fetch2.FetchError): + fetcher.download() + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_version_invalid(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example;version=3Dinvalid' + with self.assertRaises(bb.fetch2.ParameterError): + fetcher =3D bb.fetch.Fetch([url], self.d) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_registry_none(self): + url =3D 'npm://;package=3D@savoirfairelinux/node-server-example;ve= rsion=3D1.0.0' + with self.assertRaises(bb.fetch2.MalformedUrl): + fetcher =3D bb.fetch.Fetch([url], self.d) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_package_none(self): + url =3D 'npm://registry.npmjs.org;version=3D1.0.0' + with self.assertRaises(bb.fetch2.MissingParameterError): + fetcher =3D bb.fetch.Fetch([url], self.d) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_version_none(self): + url =3D 'npm://registry.npmjs.org;package=3D@savoirfairelinux/node= -server-example' + with self.assertRaises(bb.fetch2.MissingParameterError): + fetcher =3D bb.fetch.Fetch([url], self.d) + + def create_shrinkwrap_file(self, data): + import json + datadir =3D os.path.join(self.tempdir, 'data') + swfile =3D os.path.join(datadir, 'npm-shrinkwrap.json') + bb.utils.mkdirhier(datadir) + with open(swfile, 'w') as f: + json.dump(data, f) + # Also configure the S directory + self.sdir =3D os.path.join(self.unpackdir, 'S') + self.d.setVar('S', self.sdir) + return swfile + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw(self): + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://registry.npmjs.org/array-flatten/= -/array-flatten-1.1.1.tgz', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=3D', + 'dependencies': { + 'content-type': { + 'version': 'https://registry.npmjs.org/content= -type/-/content-type-1.0.4.tgz', + 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAp= s4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=3D=3D', + 'dependencies': { + 'cookie': { + 'version': 'git+https://github.com/jsh= ttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09', + 'from': 'git+https://github.com/jshttp= /cookie.git' + } + } + } + } + } + } + }) + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'a= rray-flatten-1.1.1.tgz'))) + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'c= ontent-type-1.0.4.tgz'))) + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'g= ithub.com.jshttp.cookie.git'))) + fetcher.unpack(self.unpackdir) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'npm-shrink= wrap.json'))) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modul= es', 'array-flatten', 'package.json'))) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modul= es', 'array-flatten', 'node_modules', 'content-type', 'package.json'))) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modul= es', 'array-flatten', 'node_modules', 'content-type', 'node_modules', 'cook= ie', 'package.json'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_dev(self): + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://registry.npmjs.org/array-flatten/= -/array-flatten-1.1.1.tgz', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=3D' + }, + 'content-type': { + 'version': '1.0.4', + 'resolved': 'https://registry.npmjs.org/content-type/-= /content-type-1.0.4.tgz', + 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob= 89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=3D=3D', + 'dev': True + } + } + }) + # Fetch with dev disabled + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'a= rray-flatten-1.1.1.tgz'))) + self.assertFalse(os.path.exists(os.path.join(self.dldir, 'npm2', '= content-type-1.0.4.tgz'))) + # Fetch with dev enabled + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile + ';dev=3D1'], sel= f.d) + fetcher.download() + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'a= rray-flatten-1.1.1.tgz'))) + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'c= ontent-type-1.0.4.tgz'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_destsuffix(self): + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://registry.npmjs.org/array-flatten/= -/array-flatten-1.1.1.tgz', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=3D' + } + } + }) + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile + ';destsuffix=3Df= oo/bar'], self.d) + fetcher.download() + fetcher.unpack(self.unpackdir) + self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'foo',= 'bar', 'node_modules', 'array-flatten', 'package.json'))) + + def test_npmsw_no_network_no_tarball(self): + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://registry.npmjs.org/array-flatten/= -/array-flatten-1.1.1.tgz', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=3D' + } + } + }) + self.d.setVar('BB_NO_NETWORK', '1') + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile], self.d) + with self.assertRaises(bb.fetch2.NetworkAccess): + fetcher.download() + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_no_network_with_tarball(self): + # Fetch once to get a tarball + fetcher =3D bb.fetch.Fetch(['npm://registry.npmjs.org;package=3Dar= ray-flatten;version=3D1.1.1'], self.d) + fetcher.download() + # Disable network access + self.d.setVar('BB_NO_NETWORK', '1') + # Fetch again + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://registry.npmjs.org/array-flatten/= -/array-flatten-1.1.1.tgz', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=3D' + } + } + }) + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + fetcher.unpack(self.unpackdir) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modul= es', 'array-flatten', 'package.json'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_npm_reusability(self): + # Fetch once with npmsw + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://registry.npmjs.org/array-flatten/= -/array-flatten-1.1.1.tgz', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=3D' + } + } + }) + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + # Disable network access + self.d.setVar('BB_NO_NETWORK', '1') + # Fetch again with npm + fetcher =3D bb.fetch.Fetch(['npm://registry.npmjs.org;package=3Dar= ray-flatten;version=3D1.1.1'], self.d) + fetcher.download() + fetcher.unpack(self.unpackdir) + self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'npm',= 'package.json'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_bad_checksum(self): + # Try to fetch with bad checksum + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://registry.npmjs.org/array-flatten/= -/array-flatten-1.1.1.tgz', + 'integrity': 'sha1-gfNEp2hqgLTFKT6P3AsBYMgsBqg=3D' + } + } + }) + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile], self.d) + with self.assertRaises(bb.fetch2.FetchError): + fetcher.download() + # Fetch correctly to get a tarball + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://registry.npmjs.org/array-flatten/= -/array-flatten-1.1.1.tgz', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=3D' + } + } + }) + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + localpath =3D os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.= 1.tgz') + self.assertTrue(os.path.exists(localpath)) + # Modify the tarball + bad =3D b'bad checksum' + with open(localpath, 'wb') as f: + f.write(bad) + # Verify that the tarball is fetched again + fetcher.download() + badsum =3D hashlib.sha1(bad).hexdigest() + self.assertTrue(os.path.exists(localpath + '_bad-checksum_' + bads= um)) + self.assertTrue(os.path.exists(localpath)) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_premirrors(self): + # Fetch once to get a tarball + fetcher =3D bb.fetch.Fetch(['npm://registry.npmjs.org;package=3Dar= ray-flatten;version=3D1.1.1'], self.d) + ud =3D fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Setup the mirror + mirrordir =3D os.path.join(self.tempdir, 'mirror') + bb.utils.mkdirhier(mirrordir) + os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(= ud.localpath))) + self.d.setVar('PREMIRRORS', 'https?$://.*/.* file://%s/\n' % mirro= rdir) + self.d.setVar('BB_FETCH_PREMIRRORONLY', '1') + # Fetch again + self.assertFalse(os.path.exists(ud.localpath)) + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://registry.npmjs.org/array-flatten/= -/array-flatten-1.1.1.tgz', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=3D' + } + } + }) + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_mirrors(self): + # Fetch once to get a tarball + fetcher =3D bb.fetch.Fetch(['npm://registry.npmjs.org;package=3Dar= ray-flatten;version=3D1.1.1'], self.d) + ud =3D fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Setup the mirror + mirrordir =3D os.path.join(self.tempdir, 'mirror') + bb.utils.mkdirhier(mirrordir) + os.replace(ud.localpath, os.path.join(mirrordir, os.path.basename(= ud.localpath))) + self.d.setVar('MIRRORS', 'https?$://.*/.* file://%s/\n' % mirrordi= r) + # Fetch again with invalid url + self.assertFalse(os.path.exists(ud.localpath)) + swfile =3D self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://invalid', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=3D' + } + } + }) + fetcher =3D bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) diff --git a/bitbake/lib/bb/tests/runqueue.py b/bitbake/lib/bb/tests/runque= ue.py index 5e64391..4ba12a0 100644 --- a/bitbake/lib/bb/tests/runqueue.py +++ b/bitbake/lib/bb/tests/runqueue.py @@ -7,7 +7,6 @@ # =20 import unittest -import bb import os import tempfile import subprocess @@ -255,7 +254,7 @@ class RunQueueTests(unittest.TestCase): cmd =3D ["bitbake", "a1", "b1"] tasks =3D self.run_bitbakecmd(cmd, tempdir, sstatevalid, extra= env=3Dextraenv, cleanup=3DTrue) expected =3D ['a1:populate_sysroot', 'a1:package', 'a1:package= _write_rpm_setscene', 'a1:packagedata_setscene', - 'a1:package_write_ipk_setscene', 'a1:package_qa_se= tscene'] + 'a1:package_write_ipk_setscene', 'a1:package_qa_se= tscene', 'a1:build'] self.assertEqual(set(tasks), set(expected)) =20 self.shutdown(tempdir) diff --git a/bitbake/lib/bb/tests/support/httpserver.py b/bitbake/lib/bb/te= sts/support/httpserver.py new file mode 100644 index 0000000..78f7660 --- /dev/null +++ b/bitbake/lib/bb/tests/support/httpserver.py @@ -0,0 +1,65 @@ +# +# SPDX-License-Identifier: MIT +# + +import http.server +import multiprocessing +import os +import traceback +import signal +import logging +from socketserver import ThreadingMixIn + +class HTTPServer(ThreadingMixIn, http.server.HTTPServer): + + def server_start(self, root_dir, logger): + os.chdir(root_dir) + self.serve_forever() + +class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler): + + def log_message(self, format_str, *args): + pass + +class HTTPService(object): + + def __init__(self, root_dir, host=3D'', port=3D0, logger=3DNone): + self.root_dir =3D root_dir + self.host =3D host + self.port =3D port + if not logger: + logger =3D logging.getLogger() + self.logger =3D logger + + def start(self): + print(self.root_dir) + if not os.path.exists(self.root_dir): + self.logger.info("Not starting HTTPService for directory %s wh= ich doesn't exist" % (self.root_dir)) + return + + self.server =3D HTTPServer((self.host, self.port), HTTPRequestHand= ler) + if self.port =3D=3D 0: + self.port =3D self.server.server_port + self.process =3D multiprocessing.Process(target=3Dself.server.serv= er_start, args=3D[self.root_dir, self.logger]) + + # The signal handler from testimage.bbclass can cause deadlocks he= re + # if the HTTPServer is terminated before it can restore the standa= rd=20 + #signal behaviour + orig =3D signal.getsignal(signal.SIGTERM) + signal.signal(signal.SIGTERM, signal.SIG_DFL) + self.process.start() + signal.signal(signal.SIGTERM, orig) + + if self.logger: + self.logger.info("Started HTTPService on %s:%s" % (self.host, = self.port)) + + + def stop(self): + if hasattr(self, "server"): + self.server.server_close() + if hasattr(self, "process"): + self.process.terminate() + self.process.join() + if self.logger: + self.logger.info("Stopped HTTPService on %s:%s" % (self.host, = self.port)) + diff --git a/bitbake/lib/bb/tests/utils.py b/bitbake/lib/bb/tests/utils.py index f4adf1d..a7ff33d 100644 --- a/bitbake/lib/bb/tests/utils.py +++ b/bitbake/lib/bb/tests/utils.py @@ -103,6 +103,32 @@ class Path(unittest.TestCase): result =3D bb.utils._check_unsafe_delete_path(arg1) self.assertEqual(result, correctresult, '_check_unsafe_delete_= path("%s") !=3D %s' % (arg1, correctresult)) =20 +class Checksum(unittest.TestCase): + filler =3D b"Shiver me timbers square-rigged spike Gold Road galleon b= ilge water boatswain wherry jack pirate. Mizzenmast rum lad Privateer jack = salmagundi hang the jib piracy Pieces of Eight Corsair. Parrel marooned bla= ck spot yawl provost quarterdeck cable no prey, no pay spirits lateen sail.= " + + def test_md5(self): + import hashlib + with tempfile.NamedTemporaryFile() as f: + f.write(self.filler) + f.flush() + checksum =3D bb.utils.md5_file(f.name) + self.assertEqual(checksum, "bd572cd5de30a785f4efcb6eaf5089e3") + + def test_sha1(self): + import hashlib + with tempfile.NamedTemporaryFile() as f: + f.write(self.filler) + f.flush() + checksum =3D bb.utils.sha1_file(f.name) + self.assertEqual(checksum, "249eb8fd654732ea836d5e702d7aa56789= 8eca71") + + def test_sha256(self): + import hashlib + with tempfile.NamedTemporaryFile() as f: + f.write(self.filler) + f.flush() + checksum =3D bb.utils.sha256_file(f.name) + self.assertEqual(checksum, "fcfbae8bf6b721dbb9d2dc6a9334a58f20= 31a9a9b302999243f99da4d7f12d0f") =20 class EditMetadataFile(unittest.TestCase): _origfile =3D """ @@ -596,3 +622,47 @@ BBLAYERS +=3D "/home/user/otherpath/layer6" ['/home/user/otherpath/layer6', '/home/us= er/path/layer3'], ['/home/user/path/layer1', '/home/user/path/layer4', '/ho= me/user/path/layer7'], ['/home/user/path/layer3'], ['/home/user/path/layer7']) + + +class GetReferencedVars(unittest.TestCase): + def setUp(self): + self.d =3D bb.data.init() + + def check_referenced(self, expression, expected_layers): + vars =3D bb.utils.get_referenced_vars(expression, self.d) + + # Do the easy check first - is every variable accounted for? + expected_vars =3D set.union(set(), *expected_layers) + got_vars =3D set(vars) + self.assertSetEqual(got_vars, expected_vars) + + # Now test the order of the layers + start =3D 0 + for i, expected_layer in enumerate(expected_layers): + got_layer =3D set(vars[start:len(expected_layer)+start]) + start +=3D len(expected_layer) + self.assertSetEqual(got_layer, expected_layer) + + def test_no_vars(self): + self.check_referenced("", []) + self.check_referenced(" ", []) + self.check_referenced(" no vars here! ", []) + + def test_single_layer(self): + self.check_referenced("${VAR}", [{"VAR"}]) + self.check_referenced("${VAR} ${VAR}", [{"VAR"}]) + + def test_two_layer(self): + self.d.setVar("VAR", "${B}") + self.check_referenced("${VAR}", [{"VAR"}, {"B"}]) + self.check_referenced("${@d.getVar('VAR')}", [{"VAR"}, {"B"}]) + + def test_more_complicated(self): + self.d["SRC_URI"] =3D "${QT_GIT}/${QT_MODULE}.git;name=3D${QT_MODU= LE};${QT_MODULE_BRANCH_PARAM};protocol=3D${QT_GIT_PROTOCOL}" + self.d["QT_GIT"] =3D "git://code.qt.io/${QT_GIT_PROJECT}" + self.d["QT_MODULE_BRANCH_PARAM"] =3D "branch=3D${QT_MODULE_BRANCH}= " + self.d["QT_MODULE"] =3D "${BPN}" + self.d["BPN"] =3D "something to do with ${PN} and ${SPECIAL_PKGSUF= FIX}" + + layers =3D [{"SRC_URI"}, {"QT_GIT", "QT_MODULE", "QT_MODULE_BRANCH= _PARAM", "QT_GIT_PROTOCOL"}, {"QT_GIT_PROJECT", "QT_MODULE_BRANCH", "BPN"},= {"PN", "SPECIAL_PKGSUFFIX"}] + self.check_referenced("${SRC_URI}", layers) diff --git a/bitbake/lib/bb/tinfoil.py b/bitbake/lib/bb/tinfoil.py index 0a1b913..8c9b6b8 100644 --- a/bitbake/lib/bb/tinfoil.py +++ b/bitbake/lib/bb/tinfoil.py @@ -13,6 +13,7 @@ import sys import atexit import re from collections import OrderedDict, defaultdict +from functools import partial =20 import bb.cache import bb.cooker @@ -21,8 +22,8 @@ import bb.taskdata import bb.utils import bb.command import bb.remotedata -from bb.cookerdata import CookerConfiguration, ConfigParameters -from bb.main import setup_bitbake, BitBakeConfigParameters, BBMainExceptio= n +from bb.cookerdata import CookerConfiguration +from bb.main import setup_bitbake, BitBakeConfigParameters import bb.fetch2 =20 =20 @@ -44,66 +45,69 @@ class TinfoilUIException(Exception): class TinfoilCommandFailed(Exception): """Exception raised when run_command fails""" =20 +class TinfoilDataStoreConnectorVarHistory: + def __init__(self, tinfoil, dsindex): + self.tinfoil =3D tinfoil + self.dsindex =3D dsindex + + def remoteCommand(self, cmd, *args, **kwargs): + return self.tinfoil.run_command('dataStoreConnectorVarHistCmd', se= lf.dsindex, cmd, args, kwargs) + + def __getattr__(self, name): + if not hasattr(bb.data_smart.VariableHistory, name): + raise AttributeError("VariableHistory has no such method %s" %= name) + + newfunc =3D partial(self.remoteCommand, name) + setattr(self, name, newfunc) + return newfunc + +class TinfoilDataStoreConnectorIncHistory: + def __init__(self, tinfoil, dsindex): + self.tinfoil =3D tinfoil + self.dsindex =3D dsindex + + def remoteCommand(self, cmd, *args, **kwargs): + return self.tinfoil.run_command('dataStoreConnectorIncHistCmd', se= lf.dsindex, cmd, args, kwargs) + + def __getattr__(self, name): + if not hasattr(bb.data_smart.IncludeHistory, name): + raise AttributeError("IncludeHistory has no such method %s" % = name) + + newfunc =3D partial(self.remoteCommand, name) + setattr(self, name, newfunc) + return newfunc + class TinfoilDataStoreConnector: - """Connector object used to enable access to datastore objects via tin= foil""" + """ + Connector object used to enable access to datastore objects via tinfoi= l + Method calls are transmitted to the remote datastore for processing, i= f a datastore is + returned we return a connector object for the new store + """ =20 def __init__(self, tinfoil, dsindex): self.tinfoil =3D tinfoil self.dsindex =3D dsindex - def getVar(self, name): - value =3D self.tinfoil.run_command('dataStoreConnectorFindVar', se= lf.dsindex, name) - overrides =3D None - if isinstance(value, dict): - if '_connector_origtype' in value: - value['_content'] =3D self.tinfoil._reconvert_type(value['= _content'], value['_connector_origtype']) - del value['_connector_origtype'] - if '_connector_overrides' in value: - overrides =3D value['_connector_overrides'] - del value['_connector_overrides'] - return value, overrides - def getKeys(self): - return set(self.tinfoil.run_command('dataStoreConnectorGetKeys', s= elf.dsindex)) - def getVarHistory(self, name): - return self.tinfoil.run_command('dataStoreConnectorGetVarHistory',= self.dsindex, name) - def expandPythonRef(self, varname, expr, d): - ds =3D bb.remotedata.RemoteDatastores.transmit_datastore(d) - ret =3D self.tinfoil.run_command('dataStoreConnectorExpandPythonRe= f', ds, varname, expr) + self.varhistory =3D TinfoilDataStoreConnectorVarHistory(tinfoil, d= sindex) + self.inchistory =3D TinfoilDataStoreConnectorIncHistory(tinfoil, d= sindex) + + def remoteCommand(self, cmd, *args, **kwargs): + ret =3D self.tinfoil.run_command('dataStoreConnectorCmd', self.dsi= ndex, cmd, args, kwargs) + if isinstance(ret, bb.command.DataStoreConnectionHandle): + return TinfoilDataStoreConnector(self.tinfoil, ret.dsindex) return ret - def setVar(self, varname, value): - if self.dsindex is None: - self.tinfoil.run_command('setVariable', varname, value) - else: - # Not currently implemented - indicate that setting should - # be redirected to local side - return True - def setVarFlag(self, varname, flagname, value): - if self.dsindex is None: - self.tinfoil.run_command('dataStoreConnectorSetVarFlag', self.= dsindex, varname, flagname, value) - else: - # Not currently implemented - indicate that setting should - # be redirected to local side - return True - def delVar(self, varname): - if self.dsindex is None: - self.tinfoil.run_command('dataStoreConnectorDelVar', self.dsin= dex, varname) - else: - # Not currently implemented - indicate that setting should - # be redirected to local side - return True - def delVarFlag(self, varname, flagname): - if self.dsindex is None: - self.tinfoil.run_command('dataStoreConnectorDelVar', self.dsin= dex, varname, flagname) - else: - # Not currently implemented - indicate that setting should - # be redirected to local side - return True - def renameVar(self, name, newname): - if self.dsindex is None: - self.tinfoil.run_command('dataStoreConnectorRenameVar', self.d= sindex, name, newname) - else: - # Not currently implemented - indicate that setting should - # be redirected to local side - return True + + def __getattr__(self, name): + if not hasattr(bb.data._dict_type, name): + raise AttributeError("Data store has no such method %s" % name= ) + + newfunc =3D partial(self.remoteCommand, name) + setattr(self, name, newfunc) + return newfunc + + def __iter__(self): + keys =3D self.tinfoil.run_command('dataStoreConnectorCmd', self.ds= index, "keys", [], {}) + for k in keys: + yield k =20 class TinfoilCookerAdapter: """ @@ -127,12 +131,13 @@ class TinfoilCookerAdapter: =20 class TinfoilRecipeCacheAdapter: """ cooker.recipecache adapter """ - def __init__(self, tinfoil): + def __init__(self, tinfoil, mc=3D''): self.tinfoil =3D tinfoil + self.mc =3D mc self._cache =3D {} =20 def get_pkg_pn_fn(self): - pkg_pn =3D defaultdict(list, self.tinfoil.run_command('getReci= pes') or []) + pkg_pn =3D defaultdict(list, self.tinfoil.run_command('getReci= pes', self.mc) or []) pkg_fn =3D {} for pn, fnlist in pkg_pn.items(): for fn in fnlist: @@ -151,27 +156,27 @@ class TinfoilCookerAdapter: self.get_pkg_pn_fn() return self._cache[name] elif name =3D=3D 'deps': - attrvalue =3D defaultdict(list, self.tinfoil.run_command('= getRecipeDepends') or []) + attrvalue =3D defaultdict(list, self.tinfoil.run_command('= getRecipeDepends', self.mc) or []) elif name =3D=3D 'rundeps': - attrvalue =3D defaultdict(lambda: defaultdict(list), self.= tinfoil.run_command('getRuntimeDepends') or []) + attrvalue =3D defaultdict(lambda: defaultdict(list), self.= tinfoil.run_command('getRuntimeDepends', self.mc) or []) elif name =3D=3D 'runrecs': - attrvalue =3D defaultdict(lambda: defaultdict(list), self.= tinfoil.run_command('getRuntimeRecommends') or []) + attrvalue =3D defaultdict(lambda: defaultdict(list), self.= tinfoil.run_command('getRuntimeRecommends', self.mc) or []) elif name =3D=3D 'pkg_pepvpr': - attrvalue =3D self.tinfoil.run_command('getRecipeVersions'= ) or {} + attrvalue =3D self.tinfoil.run_command('getRecipeVersions'= , self.mc) or {} elif name =3D=3D 'inherits': - attrvalue =3D self.tinfoil.run_command('getRecipeInherits'= ) or {} + attrvalue =3D self.tinfoil.run_command('getRecipeInherits'= , self.mc) or {} elif name =3D=3D 'bbfile_priority': - attrvalue =3D self.tinfoil.run_command('getBbFilePriority'= ) or {} + attrvalue =3D self.tinfoil.run_command('getBbFilePriority'= , self.mc) or {} elif name =3D=3D 'pkg_dp': - attrvalue =3D self.tinfoil.run_command('getDefaultPreferen= ce') or {} + attrvalue =3D self.tinfoil.run_command('getDefaultPreferen= ce', self.mc) or {} elif name =3D=3D 'fn_provides': - attrvalue =3D self.tinfoil.run_command('getRecipeProvides'= ) or {} + attrvalue =3D self.tinfoil.run_command('getRecipeProvides'= , self.mc) or {} elif name =3D=3D 'packages': - attrvalue =3D self.tinfoil.run_command('getRecipePackages'= ) or {} + attrvalue =3D self.tinfoil.run_command('getRecipePackages'= , self.mc) or {} elif name =3D=3D 'packages_dynamic': - attrvalue =3D self.tinfoil.run_command('getRecipePackagesD= ynamic') or {} + attrvalue =3D self.tinfoil.run_command('getRecipePackagesD= ynamic', self.mc) or {} elif name =3D=3D 'rproviders': - attrvalue =3D self.tinfoil.run_command('getRProviders') or= {} + attrvalue =3D self.tinfoil.run_command('getRProviders', se= lf.mc) or {} else: raise AttributeError("%s instance has no attribute '%s'" %= (self.__class__.__name__, name)) =20 @@ -182,8 +187,9 @@ class TinfoilCookerAdapter: self.tinfoil =3D tinfoil self.collection =3D self.TinfoilCookerCollectionAdapter(tinfoil) self.recipecaches =3D {} - # FIXME all machines self.recipecaches[''] =3D self.TinfoilRecipeCacheAdapter(tinfoil) + for mc in (tinfoil.config_data.getVar('BBMULTICONFIG') or '').spli= t(): + self.recipecaches[mc] =3D self.TinfoilRecipeCacheAdapter(tinfo= il, mc) self._cache =3D {} def __getattr__(self, name): # Grab these only when they are requested since they aren't always= used @@ -410,9 +416,7 @@ class Tinfoil: self.run_actions(config_params) self.recipes_parsed =3D True =20 - self.config_data =3D bb.data.init() - connector =3D TinfoilDataStoreConnector(self, None) - self.config_data.setVar('_remote_data', connector) + self.config_data =3D TinfoilDataStoreConnector(self, 0) self.cooker =3D TinfoilCookerAdapter(self) self.cooker_data =3D self.cooker.recipecaches[''] else: @@ -501,11 +505,11 @@ class Tinfoil: """ return OrderedDict(self.run_command('getSkippedRecipes')) =20 - def get_all_providers(self): - return defaultdict(list, self.run_command('allProviders')) + def get_all_providers(self, mc=3D''): + return defaultdict(list, self.run_command('allProviders', mc)) =20 - def find_providers(self): - return self.run_command('findProviders') + def find_providers(self, mc=3D''): + return self.run_command('findProviders', mc) =20 def find_best_provider(self, pn): return self.run_command('findBestProvider', pn) @@ -624,9 +628,6 @@ class Tinfoil: appends: True to apply bbappends, False otherwise appendlist: optional list of bbappend files to apply, if you want to filter them - config_data: custom config datastore to use. NOTE: if you - specify config_data then you cannot use a virtual - specification for fn. """ if self.tracking: # Enable history tracking just for the parse operation @@ -635,8 +636,8 @@ class Tinfoil: if appends and appendlist =3D=3D []: appends =3D False if config_data: - dctr =3D bb.remotedata.RemoteDatastores.transmit_datastore= (config_data) - dscon =3D self.run_command('parseRecipeFile', fn, appends,= appendlist, dctr) + config_data =3D bb.data.createCopy(config_data) + dscon =3D self.run_command('parseRecipeFile', fn, appends= , appendlist, config_data.dsindex) else: dscon =3D self.run_command('parseRecipeFile', fn, appends,= appendlist) if dscon: @@ -723,21 +724,9 @@ class Tinfoil: # Borrowed from knotty, instead somewhat hackily we use the he= lper # as the object to store "shutdown" on helper =3D bb.ui.uihelper.BBUIHelper() - # We set up logging optionally in the constructor so now we ne= ed to - # grab the handlers to pass to TerminalFilter - console =3D None - errconsole =3D None - for handler in self.logger.handlers: - if isinstance(handler, logging.StreamHandler): - if handler.stream =3D=3D sys.stdout: - console =3D handler - elif handler.stream =3D=3D sys.stderr: - errconsole =3D handler - format_str =3D "%(levelname)s: %(message)s" - format =3D bb.msg.BBLogFormatter(format_str) helper.shutdown =3D 0 parseprogress =3D None - termfilter =3D bb.ui.knotty.TerminalFilter(helper, helper, con= sole, errconsole, format, quiet=3Dself.quiet) + termfilter =3D bb.ui.knotty.TerminalFilter(helper, helper, sel= f.logger.handlers, quiet=3Dself.quiet) try: while True: try: @@ -859,9 +848,7 @@ class Tinfoil: newobj =3D origtype(obj) =20 if isinstance(newobj, bb.command.DataStoreConnectionHandle): - connector =3D TinfoilDataStoreConnector(self, newobj.dsindex) - newobj =3D bb.data.init() - newobj.setVar('_remote_data', connector) + newobj =3D TinfoilDataStoreConnector(self, newobj.dsindex) =20 return newobj =20 diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/build= infohelper.py index 5cbca97..82c62e3 100644 --- a/bitbake/lib/bb/ui/buildinfohelper.py +++ b/bitbake/lib/bb/ui/buildinfohelper.py @@ -935,7 +935,7 @@ class BuildInfoHelper(object): =20 # only reset the build name if the one on the server is actual= ly # a valid value for the build_name field - if build_name !=3D None: + if build_name is not None: build_info['build_name'] =3D build_name changed =3D True =20 @@ -1194,7 +1194,7 @@ class BuildInfoHelper(object): evdata =3D BuildInfoHelper._get_data_from_event(event) =20 for t in self.internal_state['targets']: - if t.is_image =3D=3D True: + if t.is_image: output_files =3D list(evdata.keys()) for output in output_files: if t.target in output and 'rootfs' in output and not o= utput.endswith(".manifest"): @@ -1236,7 +1236,7 @@ class BuildInfoHelper(object): task_information['outcome'] =3D Task.OUTCOME_PREBUILT else: task_information['task_executed'] =3D True - if 'noexec' in vars(event) and event.noexec =3D=3D True: + if 'noexec' in vars(event) and event.noexec: task_information['task_executed'] =3D False task_information['outcome'] =3D Task.OUTCOME_EMPTY task_information['script_type'] =3D Task.CODING_NA @@ -1776,7 +1776,7 @@ class BuildInfoHelper(object): image_file_extensions_unique =3D {} image_fstypes =3D self.server.runCommand( ['getVariable', 'IMAGE_FSTYPES'])[0] - if image_fstypes !=3D None: + if image_fstypes is not None: image_types_str =3D image_fstypes.strip() image_file_extensions =3D re.sub(r' {2,}', ' ', image_types_st= r) image_file_extensions_unique =3D set(image_file_extensions.spl= it(' ')) diff --git a/bitbake/lib/bb/ui/knotty.py b/bitbake/lib/bb/ui/knotty.py index 35736ad..87e873d 100644 --- a/bitbake/lib/bb/ui/knotty.py +++ b/bitbake/lib/bb/ui/knotty.py @@ -12,7 +12,6 @@ from __future__ import division =20 import os import sys -import xmlrpc.client as xmlrpclib import logging import progressbar import signal @@ -35,15 +34,15 @@ class BBProgress(progressbar.ProgressBar): self.msg =3D msg self.extrapos =3D extrapos if not widgets: - widgets =3D [progressbar.Percentage(), ' ', progressbar.Bar(),= ' ', - progressbar.ETA()] - self.extrapos =3D 4 + widgets =3D [': ', progressbar.Percentage(), ' ', progressbar.= Bar(), + ' ', progressbar.ETA()] + self.extrapos =3D 5 =20 if resize_handler: self._resize_default =3D resize_handler else: self._resize_default =3D signal.getsignal(signal.SIGWINCH) - progressbar.ProgressBar.__init__(self, maxval, [self.msg + ": "] += widgets, fd=3Dsys.stdout) + progressbar.ProgressBar.__init__(self, maxval, [self.msg] + widget= s, fd=3Dsys.stdout) =20 def _handle_resize(self, signum=3DNone, frame=3DNone): progressbar.ProgressBar._handle_resize(self, signum, frame) @@ -110,12 +109,11 @@ def pluralise(singular, plural, qty): =20 =20 class InteractConsoleLogFilter(logging.Filter): - def __init__(self, tf, format): + def __init__(self, tf): self.tf =3D tf - self.format =3D format =20 def filter(self, record): - if record.levelno =3D=3D self.format.NOTE and (record.msg.startswi= th("Running") or record.msg.startswith("recipe ")): + if record.levelno =3D=3D bb.msg.BBLogFormatter.NOTE and (record.ms= g.startswith("Running") or record.msg.startswith("recipe ")): return False self.tf.clearFooter() return True @@ -151,7 +149,7 @@ class TerminalFilter(object): cr =3D (25, 80) return cr =20 - def __init__(self, main, helper, console, errconsole, format, quiet): + def __init__(self, main, helper, handlers, quiet): self.main =3D main self.helper =3D helper self.cuu =3D None @@ -181,7 +179,11 @@ class TerminalFilter(object): termios.tcsetattr(fd, termios.TCSADRAIN, new) curses.setupterm() if curses.tigetnum("colors") > 2: - format.enable_color() + for h in handlers: + try: + h.formatter.enable_color() + except AttributeError: + pass self.ed =3D curses.tigetstr("ed") if self.ed: self.cuu =3D curses.tigetstr("cuu") @@ -197,10 +199,9 @@ class TerminalFilter(object): self.interactive =3D False bb.note("Unable to use interactive mode for this terminal, usi= ng fallback") return - if console: - console.addFilter(InteractConsoleLogFilter(self, format)) - if errconsole: - errconsole.addFilter(InteractConsoleLogFilter(self, format)) + + for h in handlers: + h.addFilter(InteractConsoleLogFilter(self)) =20 self.main_progress =3D None =20 @@ -255,19 +256,19 @@ class TerminalFilter(object): start_time =3D activetasks[t].get("starttime", None) if not pbar or pbar.bouncing !=3D (progress < 0): if progress < 0: - pbar =3D BBProgress("0: %s (pid %s) " % (activetas= ks[t]["title"], t), 100, widgets=3D[progressbar.BouncingSlider(), ''], extr= apos=3D2, resize_handler=3Dself.sigwinch_handle) + pbar =3D BBProgress("0: %s (pid %s)" % (activetask= s[t]["title"], activetasks[t]["pid"]), 100, widgets=3D[' ', progressbar.Bou= ncingSlider(), ''], extrapos=3D3, resize_handler=3Dself.sigwinch_handle) pbar.bouncing =3D True else: - pbar =3D BBProgress("0: %s (pid %s) " % (activetas= ks[t]["title"], t), 100, widgets=3D[progressbar.Percentage(), ' ', progress= bar.Bar(), ''], extrapos=3D4, resize_handler=3Dself.sigwinch_handle) + pbar =3D BBProgress("0: %s (pid %s)" % (activetask= s[t]["title"], activetasks[t]["pid"]), 100, widgets=3D[' ', progressbar.Per= centage(), ' ', progressbar.Bar(), ''], extrapos=3D5, resize_handler=3Dself= .sigwinch_handle) pbar.bouncing =3D False activetasks[t]["progressbar"] =3D pbar tasks.append((pbar, progress, rate, start_time)) else: start_time =3D activetasks[t].get("starttime", None) if start_time: - tasks.append("%s - %s (pid %s)" % (activetasks[t]["tit= le"], self.elapsed(currenttime - start_time), t)) + tasks.append("%s - %s (pid %s)" % (activetasks[t]["tit= le"], self.elapsed(currenttime - start_time), activetasks[t]["pid"])) else: - tasks.append("%s (pid %s)" % (activetasks[t]["title"],= t)) + tasks.append("%s (pid %s)" % (activetasks[t]["title"],= activetasks[t]["pid"])) =20 if self.main.shutdown: content =3D "Waiting for %s running tasks to finish:" % len(ac= tivetasks) @@ -363,7 +364,11 @@ def _log_settings_from_server(server, observe_only): if error: logger.error("Unable to get the value of BB_CONSOLELOG variable: %= s" % error) raise BaseException(error) - return includelogs, loglines, consolelogfile + logconfigfile, error =3D server.runCommand([cmd, "BB_LOGCONFIG"]) + if error: + logger.error("Unable to get the value of BB_LOGCONFIG variable: %s= " % error) + raise BaseException(error) + return includelogs, loglines, consolelogfile, logconfigfile =20 _evt_list =3D [ "bb.runqueue.runQueueExitWait", "bb.event.LogExecTTY", "lo= gging.LogRecord", "bb.build.TaskFailed", "bb.build.TaskBase", "bb.event.ParseS= tarted", @@ -380,7 +385,148 @@ def main(server, eventHandler, params, tf =3D Termina= lFilter): if not params.observe_only: params.updateToServer(server, os.environ.copy()) =20 - includelogs, loglines, consolelogfile =3D _log_settings_from_server(se= rver, params.observe_only) + includelogs, loglines, consolelogfile, logconfigfile =3D _log_settings= _from_server(server, params.observe_only) + + loglevel, _ =3D bb.msg.constructLogOptions() + + if params.options.quiet =3D=3D 0: + console_loglevel =3D loglevel + elif params.options.quiet > 2: + console_loglevel =3D bb.msg.BBLogFormatter.ERROR + else: + console_loglevel =3D bb.msg.BBLogFormatter.WARNING + + logconfig =3D { + "version": 1, + "handlers": { + "BitBake.console": { + "class": "logging.StreamHandler", + "formatter": "BitBake.consoleFormatter", + "level": console_loglevel, + "stream": "ext://sys.stdout", + "filters": ["BitBake.stdoutFilter"], + ".": { + "is_console": True, + }, + }, + "BitBake.errconsole": { + "class": "logging.StreamHandler", + "formatter": "BitBake.consoleFormatter", + "level": loglevel, + "stream": "ext://sys.stderr", + "filters": ["BitBake.stderrFilter"], + ".": { + "is_console": True, + }, + }, + # This handler can be used if specific loggers should print on + # the console at a lower severity than the default. It will + # display any messages sent to it that are lower than then + # BitBake.console logging level (so as to prevent duplication = of + # messages). Nothing is attached to this handler by default + "BitBake.verbconsole": { + "class": "logging.StreamHandler", + "formatter": "BitBake.consoleFormatter", + "level": 1, + "stream": "ext://sys.stdout", + "filters": ["BitBake.verbconsoleFilter"], + ".": { + "is_console": True, + }, + }, + }, + "formatters": { + # This format instance will get color output enabled by the + # terminal + "BitBake.consoleFormatter" : { + "()": "bb.msg.BBLogFormatter", + "format": "%(levelname)s: %(message)s" + }, + # The file log requires a separate instance so that it doesn't= get + # color enabled + "BitBake.logfileFormatter": { + "()": "bb.msg.BBLogFormatter", + "format": "%(levelname)s: %(message)s" + } + }, + "filters": { + "BitBake.stdoutFilter": { + "()": "bb.msg.LogFilterLTLevel", + "level": "ERROR" + }, + "BitBake.stderrFilter": { + "()": "bb.msg.LogFilterGEQLevel", + "level": "ERROR" + }, + "BitBake.verbconsoleFilter": { + "()": "bb.msg.LogFilterLTLevel", + "level": console_loglevel + }, + }, + "loggers": { + "BitBake": { + "level": loglevel, + "handlers": ["BitBake.console", "BitBake.errconsole"], + } + }, + "disable_existing_loggers": False + } + + # Enable the console log file if enabled + if consolelogfile and not params.options.show_environment and not para= ms.options.show_versions: + logconfig =3D bb.msg.mergeLoggingConfig(logconfig, { + "version": 1, + "handlers" : { + "BitBake.consolelog": { + "class": "logging.FileHandler", + "formatter": "BitBake.logfileFormatter", + "level": loglevel, + "filename": consolelogfile, + }, + # Just like verbconsole, anything sent here will go to= the + # log file, unless it would go to BitBake.consolelog + "BitBake.verbconsolelog" : { + "class": "logging.FileHandler", + "formatter": "BitBake.logfileFormatter", + "level": 1, + "filename": consolelogfile, + "filters": ["BitBake.verbconsolelogFilter"], + }, + }, + "filters": { + "BitBake.verbconsolelogFilter": { + "()": "bb.msg.LogFilterLTLevel", + "level": loglevel, + }, + }, + "loggers": { + "BitBake": { + "handlers": ["BitBake.consolelog"], + }, + + # Other interesting things that we want to keep an eye= on + # in the log files in case someone has an issue, but n= ot + # necessarily show to the user on the console + "BitBake.SigGen.HashEquiv": { + "level": "VERBOSE", + "handlers": ["BitBake.verbconsolelog"], + }, + "BitBake.RunQueue.HashEquiv": { + "level": "VERBOSE", + "handlers": ["BitBake.verbconsolelog"], + } + } + }) + + bb.utils.mkdirhier(os.path.dirname(consolelogfile)) + loglink =3D os.path.join(os.path.dirname(consolelogfile), 'console= -latest.log') + bb.utils.remove(loglink) + try: + os.symlink(os.path.basename(consolelogfile), loglink) + except OSError: + pass + + conf =3D bb.msg.setLoggingConfig(logconfig, logconfigfile) =20 if sys.stdin.isatty() and sys.stdout.isatty(): log_exec_tty =3D True @@ -389,23 +535,9 @@ def main(server, eventHandler, params, tf =3D Terminal= Filter): =20 helper =3D uihelper.BBUIHelper() =20 - console =3D logging.StreamHandler(sys.stdout) - errconsole =3D logging.StreamHandler(sys.stderr) - format_str =3D "%(levelname)s: %(message)s" - format =3D bb.msg.BBLogFormatter(format_str) - if params.options.quiet =3D=3D 0: - forcelevel =3D None - elif params.options.quiet > 2: - forcelevel =3D bb.msg.BBLogFormatter.ERROR - else: - forcelevel =3D bb.msg.BBLogFormatter.WARNING - bb.msg.addDefaultlogFilter(console, bb.msg.BBLogFilterStdOut, forcelev= el) - bb.msg.addDefaultlogFilter(errconsole, bb.msg.BBLogFilterStdErr) - console.setFormatter(format) - errconsole.setFormatter(format) - if not bb.msg.has_console_handler(logger): - logger.addHandler(console) - logger.addHandler(errconsole) + # Look for the specially designated handlers which need to be passed t= o the + # terminal handler + console_handlers =3D [h for h in conf.config['handlers'].values() if g= etattr(h, 'is_console', False)] =20 bb.utils.set_process_name("KnottyUI") =20 @@ -413,24 +545,14 @@ def main(server, eventHandler, params, tf =3D Termina= lFilter): server.terminateServer() return =20 - consolelog =3D None - if consolelogfile and not params.options.show_environment and not para= ms.options.show_versions: - bb.utils.mkdirhier(os.path.dirname(consolelogfile)) - conlogformat =3D bb.msg.BBLogFormatter(format_str) - consolelog =3D logging.FileHandler(consolelogfile) - bb.msg.addDefaultlogFilter(consolelog) - consolelog.setFormatter(conlogformat) - logger.addHandler(consolelog) - loglink =3D os.path.join(os.path.dirname(consolelogfile), 'console= -latest.log') - bb.utils.remove(loglink) - try: - os.symlink(os.path.basename(consolelogfile), loglink) - except OSError: - pass - llevel, debug_domains =3D bb.msg.constructLogOptions() server.runCommand(["setEventMask", server.getEventHandle(), llevel, de= bug_domains, _evt_list]) =20 + # The logging_tree module is *extremely* helpful in debugging logging + # domains. Uncomment here to dump the logging tree when bitbake starts + #import logging_tree + #logging_tree.printout() + universe =3D False if not params.observe_only: params.updateFromServer(server) @@ -448,7 +570,7 @@ def main(server, eventHandler, params, tf =3D TerminalF= ilter): if error: logger.error("Command '%s' failed: %s" % (cmdline, error)) return 1 - elif ret !=3D True: + elif not ret: logger.error("Command '%s' failed: returned %s" % (cmdline, re= t)) return 1 =20 @@ -465,7 +587,7 @@ def main(server, eventHandler, params, tf =3D TerminalF= ilter): printinterval =3D 5000 lastprint =3D time.time() =20 - termfilter =3D tf(main, helper, console, errconsole, format, params.op= tions.quiet) + termfilter =3D tf(main, helper, console_handlers, params.options.quiet= ) atexit.register(termfilter.finish) =20 while True: @@ -477,7 +599,8 @@ def main(server, eventHandler, params, tf =3D TerminalF= ilter): if event is None: if main.shutdown > 1: break - termfilter.updateFooter() + if not parseprogress: + termfilter.updateFooter() event =3D eventHandler.waitEvent(0.25) if event is None: continue @@ -503,26 +626,26 @@ def main(server, eventHandler, params, tf =3D Termina= lFilter): if isinstance(event, logging.LogRecord): lastprint =3D time.time() printinterval =3D 5000 - if event.levelno >=3D format.ERROR: + if event.levelno >=3D bb.msg.BBLogFormatter.ERROR: errors =3D errors + 1 return_value =3D 1 - elif event.levelno =3D=3D format.WARNING: + elif event.levelno =3D=3D bb.msg.BBLogFormatter.WARNING: warnings =3D warnings + 1 =20 if event.taskpid !=3D 0: # For "normal" logging conditions, don't show note log= s from tasks # but do show them if the user has changed the default= log level to # include verbose/debug messages - if event.levelno <=3D format.NOTE and (event.levelno <= llevel or (event.levelno =3D=3D format.NOTE and llevel !=3D format.VERBOSE= )): + if event.levelno <=3D bb.msg.BBLogFormatter.NOTE and (= event.levelno < llevel or (event.levelno =3D=3D bb.msg.BBLogFormatter.NOTE = and llevel !=3D bb.msg.BBLogFormatter.VERBOSE)): continue =20 # Prefix task messages with recipe/task - if event.taskpid in helper.running_tasks and event.lev= elno !=3D format.PLAIN: - taskinfo =3D helper.running_tasks[event.taskpid] + if event.taskpid in helper.pidmap and event.levelno != =3D bb.msg.BBLogFormatter.PLAIN: + taskinfo =3D helper.running_tasks[helper.pidmap[ev= ent.taskpid]] event.msg =3D taskinfo['title'] + ': ' + event.msg if hasattr(event, 'fn'): event.msg =3D event.fn + ': ' + event.msg - logger.handle(event) + logging.getLogger(event.name).handle(event) continue =20 if isinstance(event, bb.build.TaskFailedSilent): @@ -539,6 +662,7 @@ def main(server, eventHandler, params, tf =3D TerminalF= ilter): continue if event.total =3D=3D 0: continue + termfilter.clearFooter() parseprogress =3D new_progress("Parsing recipes", event.to= tal).start() continue if isinstance(event, bb.event.ParseProgress): @@ -589,6 +713,7 @@ def main(server, eventHandler, params, tf =3D TerminalF= ilter): if isinstance(event, bb.command.CommandExit): if not return_value: return_value =3D event.exitcode + main.shutdown =3D 2 continue if isinstance(event, (bb.command.CommandCompleted, bb.cooker.C= ookerExit)): main.shutdown =3D 2 @@ -638,6 +763,7 @@ def main(server, eventHandler, params, tf =3D TerminalF= ilter): if isinstance(event, bb.event.ProcessStarted): if params.options.quiet > 1: continue + termfilter.clearFooter() parseprogress =3D new_progress(event.processname, event.to= tal) parseprogress.start(False) continue @@ -745,8 +871,6 @@ def main(server, eventHandler, params, tf =3D TerminalF= ilter): if e.errno =3D=3D errno.EPIPE: pass =20 - if consolelog: - logger.removeHandler(consolelog) - consolelog.close() + logging.shutdown() =20 return return_value diff --git a/bitbake/lib/bb/ui/ncurses.py b/bitbake/lib/bb/ui/ncurses.py index c422732..da4fbea 100644 --- a/bitbake/lib/bb/ui/ncurses.py +++ b/bitbake/lib/bb/ui/ncurses.py @@ -37,7 +37,7 @@ =20 =20 import logging -import os, sys, itertools, time, subprocess +import os, sys, itertools, time =20 try: import curses @@ -46,7 +46,6 @@ except ImportError: =20 import bb import xmlrpc.client -from bb import ui from bb.ui import uihelper =20 parsespin =3D itertools.cycle( r'|/-\\' ) @@ -239,7 +238,7 @@ class NCursesUI: if error: print("Error running command '%s': %s" % (cmdline, error)) return - elif ret !=3D True: + elif not ret: print("Couldn't get default commandlind! %s" % ret) return except xmlrpc.client.Fault as x: diff --git a/bitbake/lib/bb/ui/taskexp.py b/bitbake/lib/bb/ui/taskexp.py index 50a943c..05e3233 100644 --- a/bitbake/lib/bb/ui/taskexp.py +++ b/bitbake/lib/bb/ui/taskexp.py @@ -8,13 +8,18 @@ # =20 import sys -import gi -gi.require_version('Gtk', '3.0') -from gi.repository import Gtk, Gdk, GObject -from multiprocessing import Queue + +try: + import gi + gi.require_version('Gtk', '3.0') + from gi.repository import Gtk, Gdk, GObject +except ValueError: + sys.exit("FATAL: Gtk version needs to be 3.0") +except ImportError: + sys.exit("FATAL: Gtk ui could not load the required gi python module") + import threading from xmlrpc import client -import time import bb import bb.event =20 @@ -202,7 +207,7 @@ def main(server, eventHandler, params): if error: print("Error running command '%s': %s" % (cmdline, error)) return 1 - elif ret !=3D True: + elif not ret: print("Error running command '%s': returned %s" % (cmdline, re= t)) return 1 except client.Fault as x: diff --git a/bitbake/lib/bb/ui/teamcity.py b/bitbake/lib/bb/ui/teamcity.py new file mode 100644 index 0000000..fca46c2 --- /dev/null +++ b/bitbake/lib/bb/ui/teamcity.py @@ -0,0 +1,396 @@ +# +# TeamCity UI Implementation +# +# Implements a TeamCity frontend for the BitBake utility, via service mess= ages. +# See https://www.jetbrains.com/help/teamcity/build-script-interaction-wit= h-teamcity.html +# +# Based on ncurses.py and knotty.py, variously by Michael Lauer and Richar= d Purdie +# +# Copyright (C) 2006 Michael 'Mickey' Lauer +# Copyright (C) 2006-2012 Richard Purdie +# Copyright (C) 2018-2020 Agilent Technologies, Inc. +# +# SPDX-License-Identifier: GPL-2.0-only +# +# Author: Chris Laplante + +from __future__ import division + +import datetime +import logging +import math +import os +import re +import sys +import xmlrpc.client +from collections import deque + +import bb +import bb.build +import bb.command +import bb.cooker +import bb.event +import bb.exceptions +import bb.runqueue +from bb.ui import uihelper + +logger =3D logging.getLogger("BitBake") + + +class TeamCityUI: + def __init__(self): + self._block_stack =3D [] + self._last_progress_state =3D None + + @classmethod + def escape_service_value(cls, value): + """ + Escape a value for inclusion in a service message. TeamCity uses t= he vertical pipe character for escaping. + See: https://confluence.jetbrains.com/display/TCD10/Build+Script+I= nteraction+with+TeamCity#BuildScriptInteractionwithTeamCity-Escapedvalues + """ + return re.sub(r"(['|\[\]])", r"|\1", value).replace("\n", "|n").re= place("\r", "|r") + + @classmethod + def emit_service_message(cls, message_type, **kwargs): + print(cls.format_service_message(message_type, **kwargs), flush=3D= True) + + @classmethod + def format_service_message(cls, message_type, **kwargs): + payload =3D " ".join(["{0}=3D'{1}'".format(k, cls.escape_service_v= alue(v)) for k, v in kwargs.items()]) + return "##teamcity[{0} {1}]".format(message_type, payload) + + @classmethod + def emit_simple_service_message(cls, message_type, message): + print(cls.format_simple_service_message(message_type, message), fl= ush=3DTrue) + + @classmethod + def format_simple_service_message(cls, message_type, message): + return "##teamcity[{0} '{1}']".format(message_type, cls.escape_ser= vice_value(message)) + + @classmethod + def format_build_message(cls, text, status): + return cls.format_service_message("message", text=3Dtext, status= =3Dstatus) + + def block_start(self, name): + self._block_stack.append(name) + self.emit_service_message("blockOpened", name=3Dname) + + def block_end(self): + if self._block_stack: + name =3D self._block_stack.pop() + self.emit_service_message("blockClosed", name=3Dname) + + def progress(self, message, percent, extra=3DNone): + now =3D datetime.datetime.now() + percent =3D "{0: >3.0f}".format(percent) + + report =3D False + if not self._last_progress_state \ + or (self._last_progress_state[0] =3D=3D message + and self._last_progress_state[1] !=3D percent + and (now - self._last_progress_state[2]).microseconds = >=3D 5000) \ + or self._last_progress_state[0] !=3D message: + report =3D True + self._last_progress_state =3D (message, percent, now) + + if report or percent in [0, 100]: + self.emit_simple_service_message("progressMessage", "{0}: {1}%= {2}".format(message, percent, extra or "")) + + +class TeamcityLogFormatter(logging.Formatter): + def format(self, record): + details =3D "" + if hasattr(record, 'bb_exc_formatted'): + details =3D ''.join(record.bb_exc_formatted) + elif hasattr(record, 'bb_exc_info'): + etype, value, tb =3D record.bb_exc_info + formatted =3D bb.exceptions.format_exception(etype, value, tb,= limit=3D5) + details =3D ''.join(formatted) + + if record.levelno in [bb.msg.BBLogFormatter.ERROR, bb.msg.BBLogFor= matter.CRITICAL]: + # ERROR gets a separate errorDetails field + msg =3D TeamCityUI.format_service_message("message", text=3Dre= cord.getMessage(), status=3D"ERROR", + errorDetails=3Ddetails= ) + else: + payload =3D record.getMessage() + if details: + payload +=3D "\n" + details + if record.levelno =3D=3D bb.msg.BBLogFormatter.PLAIN: + msg =3D payload + elif record.levelno =3D=3D bb.msg.BBLogFormatter.WARNING: + msg =3D TeamCityUI.format_service_message("message", text= =3Dpayload, status=3D"WARNING") + else: + msg =3D TeamCityUI.format_service_message("message", text= =3Dpayload, status=3D"NORMAL") + + return msg + + +_evt_list =3D ["bb.runqueue.runQueueExitWait", "bb.event.LogExecTTY", "log= ging.LogRecord", + "bb.build.TaskFailed", "bb.build.TaskBase", "bb.event.ParseSt= arted", + "bb.event.ParseProgress", "bb.event.ParseCompleted", "bb.even= t.CacheLoadStarted", + "bb.event.CacheLoadProgress", "bb.event.CacheLoadCompleted", = "bb.command.CommandFailed", + "bb.command.CommandExit", "bb.command.CommandCompleted", "bb.= cooker.CookerExit", + "bb.event.MultipleProviders", "bb.event.NoProvider", "bb.runq= ueue.sceneQueueTaskStarted", + "bb.runqueue.runQueueTaskStarted", "bb.runqueue.runQueueTaskF= ailed", "bb.runqueue.sceneQueueTaskFailed", + "bb.event.BuildBase", "bb.build.TaskStarted", "bb.build.TaskS= ucceeded", "bb.build.TaskFailedSilent", + "bb.build.TaskProgress", "bb.event.ProcessStarted", "bb.event= .ProcessProgress", "bb.event.ProcessFinished"] + + +def _log_settings_from_server(server): + # Get values of variables which control our output + includelogs, error =3D server.runCommand(["getVariable", "BBINCLUDELOG= S"]) + if error: + logger.error("Unable to get the value of BBINCLUDELOGS variable: %= s" % error) + raise BaseException(error) + loglines, error =3D server.runCommand(["getVariable", "BBINCLUDELOGS_L= INES"]) + if error: + logger.error("Unable to get the value of BBINCLUDELOGS_LINES varia= ble: %s" % error) + raise BaseException(error) + return includelogs, loglines + + +def main(server, eventHandler, params): + params.updateToServer(server, os.environ.copy()) + + includelogs, loglines =3D _log_settings_from_server(server) + + ui =3D TeamCityUI() + + helper =3D uihelper.BBUIHelper() + + console =3D logging.StreamHandler(sys.stdout) + errconsole =3D logging.StreamHandler(sys.stderr) + format =3D TeamcityLogFormatter() + if params.options.quiet =3D=3D 0: + forcelevel =3D None + elif params.options.quiet > 2: + forcelevel =3D bb.msg.BBLogFormatter.ERROR + else: + forcelevel =3D bb.msg.BBLogFormatter.WARNING + console.setFormatter(format) + errconsole.setFormatter(format) + if not bb.msg.has_console_handler(logger): + logger.addHandler(console) + logger.addHandler(errconsole) + + if params.options.remote_server and params.options.kill_server: + server.terminateServer() + return + + if params.observe_only: + logger.error("Observe-only mode not supported in this UI") + return 1 + + llevel, debug_domains =3D bb.msg.constructLogOptions() + server.runCommand(["setEventMask", server.getEventHandle(), llevel, de= bug_domains, _evt_list]) + + try: + params.updateFromServer(server) + cmdline =3D params.parseActions() + if not cmdline: + logger.error("No task given") + return 1 + if 'msg' in cmdline and cmdline['msg']: + logger.error(cmdline['msg']) + return 1 + cmdline =3D cmdline['action'] + ret, error =3D server.runCommand(cmdline) + if error: + logger.error("{0}: {1}".format(cmdline, error)) + return 1 + elif not ret: + logger.error("Couldn't get default commandline: {0}".format(re= )) + return 1 + except xmlrpc.client.Fault as x: + logger.error("XMLRPC Fault getting commandline: {0}".format(x)) + return 1 + + active_process_total =3D None + is_tasks_running =3D False + + while True: + try: + event =3D eventHandler.waitEvent(0.25) + if not event: + continue + + helper.eventHandler(event) + + if isinstance(event, bb.build.TaskBase): + logger.info(event._message) + if isinstance(event, logging.LogRecord): + # Don't report sstate failures as errors, since Yocto will= just run the tasks for real + if event.msg =3D=3D "No suitable staging package found" or= (event.msg.startswith( + "Fetcher failure: Unable to find file") and "downl= oadfilename" in event.msg and "sstate" in event.msg): + event.levelno =3D bb.msg.BBLogFormatter.WARNING + if event.taskpid !=3D 0: + # For "normal" logging conditions, don't show note log= s from tasks + # but do show them if the user has changed the default= log level to + # include verbose/debug messages + if event.levelno <=3D bb.msg.BBLogFormatter.NOTE and (= event.levelno < llevel or ( + event.levelno =3D=3D bb.msg.BBLogFormatter.NOT= E and llevel !=3D bb.msg.BBLogFormatter.VERBOSE)): + continue + + # Prefix task messages with recipe/task + if event.taskpid in helper.running_tasks and event.lev= elno !=3D bb.msg.BBLogFormatter.PLAIN: + taskinfo =3D helper.running_tasks[event.taskpid] + event.msg =3D taskinfo['title'] + ': ' + event.msg + if hasattr(event, 'fn'): + event.msg =3D event.fn + ': ' + event.msg + logger.handle(event) + if isinstance(event, bb.build.TaskFailedSilent): + logger.warning("Logfile for failed setscene task is %s" % = event.logfile) + continue + if isinstance(event, bb.build.TaskFailed): + rt =3D "{0}-{1}:{2}".format(event.pn, event.pv.replace("AU= TOINC", "0"), event.task) + + logfile =3D event.logfile + if not logfile or not os.path.exists(logfile): + TeamCityUI.emit_service_message("buildProblem", descri= ption=3D"{0}\nUnknown failure (no log file available)".format(rt)) + if not event.task.endswith("_setscene"): + server.runCommand(["stateForceShutdown"]) + continue + + details =3D deque(maxlen=3Dloglines) + error_lines =3D [] + if includelogs and not event.errprinted: + with open(logfile, "r") as f: + while True: + line =3D f.readline() + if not line: + break + line =3D line.rstrip() + details.append(' | %s' % line) + # TODO: a less stupid check for errors + if (event.task =3D=3D "do_compile") and ("erro= r:" in line): + error_lines.append(line) + + if error_lines: + TeamCityUI.emit_service_message("compilationStarted", = compiler=3Drt) + for line in error_lines: + TeamCityUI.emit_service_message("message", text=3D= line, status=3D"ERROR") + TeamCityUI.emit_service_message("compilationFinished",= compiler=3Drt) + else: + TeamCityUI.emit_service_message("buildProblem", descri= ption=3Drt) + + err =3D "Logfile of failure stored in: %s" % logfile + if details: + ui.block_start("{0} task log".format(rt)) + # TeamCity seems to choke on service messages longer t= han about 63800 characters, so if error + # details is longer than, say, 60000, batch it up into= several messages. + first_message =3D True + while details: + detail_len =3D 0 + batch =3D deque() + while details and detail_len < 60000: + # TODO: This code doesn't bother to handle lin= es that themselves are extremely long. + line =3D details.popleft() + batch.append(line) + detail_len +=3D len(line) + + if first_message: + batch.appendleft("Log data follows:") + first_message =3D False + TeamCityUI.emit_service_message("message", tex= t=3Derr, status=3D"ERROR", + errorDetails= =3D"\n".join(batch)) + else: + TeamCityUI.emit_service_message("message", tex= t=3D"[continued]", status=3D"ERROR", + errorDetails= =3D"\n".join(batch)) + ui.block_end() + else: + TeamCityUI.emit_service_message("message", text=3Derr,= status=3D"ERROR", errorDetails=3D"") + + if not event.task.endswith("_setscene"): + server.runCommand(["stateForceShutdown"]) + + if isinstance(event, bb.event.ProcessStarted): + if event.processname in ["Initialising tasks", "Checking s= state mirror object availability"]: + active_process_total =3D event.total + ui.block_start(event.processname) + if isinstance(event, bb.event.ProcessFinished): + if event.processname in ["Initialising tasks", "Checking s= state mirror object availability"]: + ui.progress(event.processname, 100) + ui.block_end() + if isinstance(event, bb.event.ProcessProgress): + if event.processname in ["Initialising tasks", + "Checking sstate mirror object av= ailability"] and active_process_total !=3D 0: + ui.progress(event.processname, event.progress * 100 / = active_process_total) + if isinstance(event, bb.event.CacheLoadStarted): + ui.block_start("Loading cache") + if isinstance(event, bb.event.CacheLoadProgress): + if event.total !=3D 0: + ui.progress("Loading cache", math.floor(event.current = * 100 / event.total)) + if isinstance(event, bb.event.CacheLoadCompleted): + ui.progress("Loading cache", 100) + ui.block_end() + if isinstance(event, bb.event.ParseStarted): + ui.block_start("Parsing recipes and checking upstream revi= sions") + if isinstance(event, bb.event.ParseProgress): + if event.total !=3D 0: + ui.progress("Parsing recipes", math.floor(event.curren= t * 100 / event.total)) + if isinstance(event, bb.event.ParseCompleted): + ui.progress("Parsing recipes", 100) + ui.block_end() + if isinstance(event, bb.command.CommandCompleted): + return + if isinstance(event, bb.command.CommandFailed): + logger.error(str(event)) + return 1 + if isinstance(event, bb.event.MultipleProviders): + logger.warning(str(event)) + continue + if isinstance(event, bb.event.NoProvider): + logger.error(str(event)) + continue + if isinstance(event, bb.command.CommandExit): + return + if isinstance(event, bb.cooker.CookerExit): + return + if isinstance(event, bb.runqueue.sceneQueueTaskStarted): + if not is_tasks_running: + is_tasks_running =3D True + ui.block_start("Running tasks") + if event.stats.total !=3D 0: + ui.progress("Running setscene tasks", ( + event.stats.completed + event.stats.active + e= vent.stats.failed + 1) * 100 / event.stats.total) + if isinstance(event, bb.runqueue.runQueueTaskStarted): + if not is_tasks_running: + is_tasks_running =3D True + ui.block_start("Running tasks") + if event.stats.total !=3D 0: + pseudo_total =3D event.stats.total - event.stats.skipp= ed + pseudo_complete =3D event.stats.completed + event.stat= s.active - event.stats.skipped + event.stats.failed + 1 + # TODO: sometimes this gives over 100% + ui.progress("Running runqueue tasks", (pseudo_complete= ) * 100 / pseudo_total, + " ({0}/{1})".format(pseudo_complete, pseudo_to= tal)) + if isinstance(event, bb.runqueue.sceneQueueTaskFailed): + logger.warning(str(event)) + continue + if isinstance(event, bb.runqueue.runQueueTaskFailed): + logger.error(str(event)) + return 1 + if isinstance(event, bb.event.LogExecTTY): + pass + except EnvironmentError as ioerror: + # ignore interrupted io + if ioerror.args[0] =3D=3D 4: + pass + except Exception as ex: + logger.error(str(ex)) + + # except KeyboardInterrupt: + # if shutdown =3D=3D 2: + # mw.appendText("Third Keyboard Interrupt, exit.\n") + # exitflag =3D True + # if shutdown =3D=3D 1: + # mw.appendText("Second Keyboard Interrupt, stopping...\n"= ) + # _, error =3D server.runCommand(["stateForceShutdown"]) + # if error: + # print("Unable to cleanly stop: %s" % error) + # if shutdown =3D=3D 0: + # mw.appendText("Keyboard Interrupt, closing down...\n") + # _, error =3D server.runCommand(["stateShutdown"]) + # if error: + # print("Unable to cleanly shutdown: %s" % error) + # shutdown =3D shutdown + 1 + # pass diff --git a/bitbake/lib/bb/ui/toasterui.py b/bitbake/lib/bb/ui/toasterui.p= y index 51892c9..9260f5d 100644 --- a/bitbake/lib/bb/ui/toasterui.py +++ b/bitbake/lib/bb/ui/toasterui.py @@ -176,7 +176,7 @@ def main(server, eventHandler, params): if error: logger.error("Command '%s' failed: %s" % (cmdline, error)) return 1 - elif ret !=3D True: + elif not ret: logger.error("Command '%s' failed: returned %s" % (cmdline, re= t)) return 1 =20 diff --git a/bitbake/lib/bb/ui/uievent.py b/bitbake/lib/bb/ui/uievent.py index fedb050..13d0d4a 100644 --- a/bitbake/lib/bb/ui/uievent.py +++ b/bitbake/lib/bb/ui/uievent.py @@ -46,7 +46,7 @@ class BBUIEventQueue: self.EventHandle =3D ret error =3D "" =20 - if self.EventHandle !=3D None: + if self.EventHandle is not None: break =20 errmsg =3D "Could not register UI event handler. Error: %s, ho= st %s, "\ diff --git a/bitbake/lib/bb/ui/uihelper.py b/bitbake/lib/bb/ui/uihelper.py index c8dd7df..48d808a 100644 --- a/bitbake/lib/bb/ui/uihelper.py +++ b/bitbake/lib/bb/ui/uihelper.py @@ -15,39 +15,48 @@ class BBUIHelper: # Running PIDs preserves the order tasks were executed in self.running_pids =3D [] self.failed_tasks =3D [] + self.pidmap =3D {} self.tasknumber_current =3D 0 self.tasknumber_total =3D 0 =20 def eventHandler(self, event): + # PIDs are a bad idea as they can be reused before we process all = UI events. + # We maintain a 'fuzzy' match for TaskProgress since there is no o= ther way to match + def removetid(pid, tid): + self.running_pids.remove(tid) + del self.running_tasks[tid] + if self.pidmap[pid] =3D=3D tid: + del self.pidmap[pid] + self.needUpdate =3D True + if isinstance(event, bb.build.TaskStarted): + tid =3D event._fn + ":" + event._task if event._mc !=3D "default": - self.running_tasks[event.pid] =3D { 'title' : "mc:%s:%s %s= " % (event._mc, event._package, event._task), 'starttime' : time.time() } + self.running_tasks[tid] =3D { 'title' : "mc:%s:%s %s" % (e= vent._mc, event._package, event._task), 'starttime' : time.time(), 'pid' : = event.pid } else: - self.running_tasks[event.pid] =3D { 'title' : "%s %s" % (e= vent._package, event._task), 'starttime' : time.time() } - self.running_pids.append(event.pid) + self.running_tasks[tid] =3D { 'title' : "%s %s" % (event._= package, event._task), 'starttime' : time.time(), 'pid' : event.pid } + self.running_pids.append(tid) + self.pidmap[event.pid] =3D tid self.needUpdate =3D True elif isinstance(event, bb.build.TaskSucceeded): - del self.running_tasks[event.pid] - self.running_pids.remove(event.pid) - self.needUpdate =3D True + tid =3D event._fn + ":" + event._task + removetid(event.pid, tid) elif isinstance(event, bb.build.TaskFailedSilent): - del self.running_tasks[event.pid] - self.running_pids.remove(event.pid) + tid =3D event._fn + ":" + event._task + removetid(event.pid, tid) # Don't add to the failed tasks list since this is e.g. a sets= cene task failure - self.needUpdate =3D True elif isinstance(event, bb.build.TaskFailed): - del self.running_tasks[event.pid] - self.running_pids.remove(event.pid) + tid =3D event._fn + ":" + event._task + removetid(event.pid, tid) self.failed_tasks.append( { 'title' : "%s %s" % (event._packag= e, event._task)}) - self.needUpdate =3D True elif isinstance(event, bb.runqueue.runQueueTaskStarted): self.tasknumber_current =3D event.stats.completed + event.stat= s.active + event.stats.failed + 1 self.tasknumber_total =3D event.stats.total self.needUpdate =3D True elif isinstance(event, bb.build.TaskProgress): - if event.pid > 0: - self.running_tasks[event.pid]['progress'] =3D event.progre= ss - self.running_tasks[event.pid]['rate'] =3D event.rate + if event.pid > 0 and event.pid in self.pidmap: + self.running_tasks[self.pidmap[event.pid]]['progress'] =3D= event.progress + self.running_tasks[self.pidmap[event.pid]]['rate'] =3D eve= nt.rate self.needUpdate =3D True else: return False diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index d035949..5f5767c 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -24,7 +24,6 @@ import fnmatch import traceback import errno import signal -import ast import collections import copy from subprocess import getstatusoutput @@ -428,10 +427,11 @@ def fileslocked(files): for lockfile in files: locks.append(bb.utils.lockfile(lockfile)) =20 - yield - - for lock in locks: - bb.utils.unlockfile(lock) + try: + yield + finally: + for lock in locks: + bb.utils.unlockfile(lock) =20 @contextmanager def timeout(seconds): @@ -520,22 +520,26 @@ def unlockfile(lf): fcntl.flock(lf.fileno(), fcntl.LOCK_UN) lf.close() =20 -def md5_file(filename): - """ - Return the hex string representation of the MD5 checksum of filename. - """ - import hashlib, mmap +def _hasher(method, filename): + import mmap =20 with open(filename, "rb") as f: - m =3D hashlib.md5() try: with mmap.mmap(f.fileno(), 0, access=3Dmmap.ACCESS_READ) as mm= : for chunk in iter(lambda: mm.read(8192), b''): - m.update(chunk) + method.update(chunk) except ValueError: # You can't mmap() an empty file so silence this exception pass - return m.hexdigest() + return method.hexdigest() + + +def md5_file(filename): + """ + Return the hex string representation of the MD5 checksum of filename. + """ + import hashlib + return _hasher(hashlib.md5(), filename) =20 def sha256_file(filename): """ @@ -543,24 +547,28 @@ def sha256_file(filename): filename. """ import hashlib - - s =3D hashlib.sha256() - with open(filename, "rb") as f: - for line in f: - s.update(line) - return s.hexdigest() + return _hasher(hashlib.sha256(), filename) =20 def sha1_file(filename): """ Return the hex string representation of the SHA1 checksum of the filen= ame """ import hashlib + return _hasher(hashlib.sha1(), filename) =20 - s =3D hashlib.sha1() - with open(filename, "rb") as f: - for line in f: - s.update(line) - return s.hexdigest() +def sha384_file(filename): + """ + Return the hex string representation of the SHA384 checksum of the fil= ename + """ + import hashlib + return _hasher(hashlib.sha384(), filename) + +def sha512_file(filename): + """ + Return the hex string representation of the SHA512 checksum of the fil= ename + """ + import hashlib + return _hasher(hashlib.sha512(), filename) =20 def preserved_envvars_exported(): """Variables which are taken from the environment and placed in and ex= ported @@ -856,7 +864,7 @@ def copyfile(src, dest, newmtime =3D None, sstat =3D No= ne): if destexists and not stat.S_ISDIR(dstat[stat.ST_MODE]): os.unlink(dest) os.symlink(target, dest) - #os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) + os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) return os.lstat(dest) except Exception as e: logger.warning("copyfile: failed to create symlink %s to %s (%= s)" % (dest, target, e)) @@ -1031,6 +1039,43 @@ def filter(variable, checkvalues, d): checkvalues =3D set(checkvalues) return ' '.join(sorted(checkvalues & val)) =20 + +def get_referenced_vars(start_expr, d): + """ + :return: names of vars referenced in start_expr (recursively), in quas= i-BFS order (variables within the same level + are ordered arbitrarily) + """ + + seen =3D set() + ret =3D [] + + # The first entry in the queue is the unexpanded start expression + queue =3D collections.deque([start_expr]) + # Subsequent entries will be variable names, so we need to track wheth= er or not entry requires getVar + is_first =3D True + + empty_data =3D bb.data.init() + while queue: + entry =3D queue.popleft() + if is_first: + # Entry is the start expression - no expansion needed + is_first =3D False + expression =3D entry + else: + # This is a variable name - need to get the value + expression =3D d.getVar(entry, False) + ret.append(entry) + + # expandWithRefs is how we actually get the referenced variables i= n the expression. We call it using an empty + # data store because we only want the variables directly used in t= he expression. It returns a set, which is what + # dooms us to only ever be "quasi-BFS" rather than full BFS. + new_vars =3D empty_data.expandWithRefs(expression, None).reference= s - set(seen) + + queue.extend(new_vars) + seen.update(new_vars) + return ret + + def cpu_count(): return multiprocessing.cpu_count() =20 @@ -1566,3 +1611,29 @@ class LogCatcher(logging.Handler): self.messages.append(bb.build.logformatter.format(record)) def contains(self, message): return (message in self.messages) + +def is_semver(version): + """ + Is the version string following the semver semantic? + + https://semver.org/spec/v2.0.0.html + """ + regex =3D re.compile( + r""" + ^ + (0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*) + (?:-( + (?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*) + (?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))* + ))? + (?:\+( + [0-9a-zA-Z-]+ + (?:\.[0-9a-zA-Z-]+)* + ))? + $ + """, re.VERBOSE) + + if regex.match(version) is None: + return False + + return True diff --git a/bitbake/lib/bblayers/common.py b/bitbake/lib/bblayers/common.p= y index c5657d3..6c76ef3 100644 --- a/bitbake/lib/bblayers/common.py +++ b/bitbake/lib/bblayers/common.py @@ -17,7 +17,7 @@ class LayerPlugin(): def tinfoil_init(self, tinfoil): self.tinfoil =3D tinfoil self.bblayers =3D (self.tinfoil.config_data.getVar('BBLAYERS') or = "").split() - layerconfs =3D self.tinfoil.config_data.varhistory.get_variable_it= ems_files('BBFILE_COLLECTIONS', self.tinfoil.config_data) + layerconfs =3D self.tinfoil.config_data.varhistory.get_variable_it= ems_files('BBFILE_COLLECTIONS') self.bbfile_collections =3D {layer: os.path.dirname(os.path.dirnam= e(path)) for layer, path in layerconfs.items()} =20 @staticmethod diff --git a/bitbake/lib/bblayers/layerindex.py b/bitbake/lib/bblayers/laye= rindex.py index 57cd902..95b67a6 100644 --- a/bitbake/lib/bblayers/layerindex.py +++ b/bitbake/lib/bblayers/layerindex.py @@ -24,7 +24,7 @@ class LayerIndexPlugin(ActionPlugin): This class inherits ActionPlugin to get do_add_layer. """ =20 - def get_fetch_layer(self, fetchdir, url, subdir, fetch_layer): + def get_fetch_layer(self, fetchdir, url, subdir, fetch_layer, branch, = shallow=3DFalse): layername =3D self.get_layer_name(url) if os.path.splitext(layername)[1] =3D=3D '.git': layername =3D os.path.splitext(layername)[0] @@ -32,9 +32,15 @@ class LayerIndexPlugin(ActionPlugin): layerdir =3D os.path.join(repodir, subdir) if not os.path.exists(repodir): if fetch_layer: - result =3D subprocess.call(['git', 'clone', url, repodir]) + cmd =3D ['git', 'clone'] + if shallow: + cmd.extend(['--depth', '1']) + if branch: + cmd.extend(['-b' , branch]) + cmd.extend([url, repodir]) + result =3D subprocess.call(cmd) if result: - logger.error("Failed to download %s" % url) + logger.error("Failed to download %s (%s)" % (url, bran= ch)) return None, None, None else: return subdir, layername, layerdir @@ -171,7 +177,9 @@ class LayerIndexPlugin(ActionPlugin): subdir, name, layerdir =3D self.get_fetch_layer(fetchdir, layerBranch.layer.vc= s_url, layerBranch.vcs_subd= ir, - not args.show_only) + not args.show_only, + layerBranch.actual_b= ranch, + args.shallow) if not name: # Error already shown return 1 @@ -204,6 +212,7 @@ class LayerIndexPlugin(ActionPlugin): parser_layerindex_fetch =3D self.add_command(sp, 'layerindex-fetch= ', self.do_layerindex_fetch, parserecipes=3DFalse) parser_layerindex_fetch.add_argument('-n', '--show-only', help=3D'= show dependencies and do nothing else', action=3D'store_true') parser_layerindex_fetch.add_argument('-b', '--branch', help=3D'bra= nch name to fetch') + parser_layerindex_fetch.add_argument('-s', '--shallow', help=3D'do= only shallow clones (--depth=3D1)', action=3D'store_true') parser_layerindex_fetch.add_argument('-i', '--ignore', help=3D'ass= ume the specified layers do not need to be fetched/added (separate multiple= layers with commas, no spaces)', metavar=3D'LAYER') parser_layerindex_fetch.add_argument('layername', nargs=3D'+', hel= p=3D'layer to fetch') =20 diff --git a/bitbake/lib/bblayers/query.py b/bitbake/lib/bblayers/query.py index 7db49c8..e2cc310 100644 --- a/bitbake/lib/bblayers/query.py +++ b/bitbake/lib/bblayers/query.py @@ -46,7 +46,7 @@ layer, with the preferred version first. Note that skippe= d recipes that are overlayed will also be listed, with a " (skipped)" suffix. """ =20 - items_listed =3D self.list_recipes('Overlayed recipes', None, True= , args.same_version, args.filenames, False, True, None, False, None) + items_listed =3D self.list_recipes('Overlayed recipes', None, True= , args.same_version, args.filenames, False, True, None, False, None, args.m= c) =20 # Check for overlayed .bbclass files classes =3D collections.defaultdict(list) @@ -112,9 +112,9 @@ skipped recipes will also be listed, with a " (skipped)= " suffix. title =3D 'Matching recipes:' else: title =3D 'Available recipes:' - self.list_recipes(title, args.pnspec, False, False, args.filenames= , args.recipes_only, args.multiple, args.layer, args.bare, inheritlist) + self.list_recipes(title, args.pnspec, False, False, args.filenames= , args.recipes_only, args.multiple, args.layer, args.bare, inheritlist, arg= s.mc) =20 - def list_recipes(self, title, pnspec, show_overlayed_only, show_same_v= er_only, show_filenames, show_recipes_only, show_multi_provider_only, selec= ted_layer, bare, inherits): + def list_recipes(self, title, pnspec, show_overlayed_only, show_same_v= er_only, show_filenames, show_recipes_only, show_multi_provider_only, selec= ted_layer, bare, inherits, mc): if inherits: bbpath =3D str(self.tinfoil.config_data.getVar('BBPATH')) for classname in inherits: @@ -123,14 +123,18 @@ skipped recipes will also be listed, with a " (skippe= d)" suffix. logger.error('No class named %s found in BBPATH', clas= sfile) sys.exit(1) =20 - pkg_pn =3D self.tinfoil.cooker.recipecaches[''].pkg_pn - (latest_versions, preferred_versions) =3D self.tinfoil.find_provid= ers() - allproviders =3D self.tinfoil.get_all_providers() + pkg_pn =3D self.tinfoil.cooker.recipecaches[mc].pkg_pn + (latest_versions, preferred_versions) =3D self.tinfoil.find_provid= ers(mc) + allproviders =3D self.tinfoil.get_all_providers(mc) =20 # Ensure we list skipped recipes # We are largely guessing about PN, PV and the preferred version h= ere, # but we have no choice since skipped recipes are not fully parsed skiplist =3D list(self.tinfoil.cooker.skiplist.keys()) + mcspec =3D 'mc:%s:' % mc + if mc: + skiplist =3D [s[len(mcspec):] for s in skiplist if s.startswit= h(mcspec)] + for fn in skiplist: recipe_parts =3D os.path.splitext(os.path.basename(fn))[0].spl= it('_') p =3D recipe_parts[0] @@ -187,7 +191,7 @@ skipped recipes will also be listed, with a " (skipped)= " suffix. # We only display once per recipe, we should prefer non ex= tended versions of the # recipe if present (so e.g. in OpenEmbedded, openssl rath= er than nativesdk-openssl # which would otherwise sort first). - if realfn[1] and realfn[0] in self.tinfoil.cooker.recipeca= ches[''].pkg_fn: + if realfn[1] and realfn[0] in self.tinfoil.cooker.recipeca= ches[mc].pkg_fn: continue =20 if inherits: @@ -496,6 +500,7 @@ NOTE: .bbappend files can impact the dependencies. parser_show_overlayed =3D self.add_command(sp, 'show-overlayed', s= elf.do_show_overlayed) parser_show_overlayed.add_argument('-f', '--filenames', help=3D'in= stead of the default formatting, list filenames of higher priority recipes = with the ones they overlay indented underneath', action=3D'store_true') parser_show_overlayed.add_argument('-s', '--same-version', help=3D= 'only list overlayed recipes where the version is the same', action=3D'stor= e_true') + parser_show_overlayed.add_argument('--mc', help=3D'use specified m= ulticonfig', default=3D'') =20 parser_show_recipes =3D self.add_command(sp, 'show-recipes', self.= do_show_recipes) parser_show_recipes.add_argument('-f', '--filenames', help=3D'inst= ead of the default formatting, list filenames of higher priority recipes wi= th the ones they overlay indented underneath', action=3D'store_true') @@ -504,6 +509,7 @@ NOTE: .bbappend files can impact the dependencies. parser_show_recipes.add_argument('-i', '--inherits', help=3D'only = list recipes that inherit the named class(es) - separate multiple classes u= sing , (without spaces)', metavar=3D'CLASS', default=3D'') parser_show_recipes.add_argument('-l', '--layer', help=3D'only lis= t recipes from the selected layer', default=3D'') parser_show_recipes.add_argument('-b', '--bare', help=3D'output ju= st names without the "(skipped)" marker', action=3D'store_true') + parser_show_recipes.add_argument('--mc', help=3D'use specified mul= ticonfig', default=3D'') parser_show_recipes.add_argument('pnspec', nargs=3D'*', help=3D'op= tional recipe name specification (wildcards allowed, enclose in quotes to a= void shell expansion)') =20 parser_show_appends =3D self.add_command(sp, 'show-appends', self.= do_show_appends) diff --git a/bitbake/lib/bs4/__init__.py b/bitbake/lib/bs4/__init__.py index f6fdfd5..e35725b 100644 --- a/bitbake/lib/bs4/__init__.py +++ b/bitbake/lib/bs4/__init__.py @@ -427,7 +427,7 @@ class BeautifulSoup(Tag): if self.is_xml: # Print the XML declaration encoding_part =3D '' - if eventual_encoding !=3D None: + if eventual_encoding is not None: encoding_part =3D ' encoding=3D"%s"' % eventual_encoding prefix =3D '\n' % encoding_part else: diff --git a/bitbake/lib/bs4/builder/_html5lib.py b/bitbake/lib/bs4/builder= /_html5lib.py index 2b7a70a..9e9216e 100644 --- a/bitbake/lib/bs4/builder/_html5lib.py +++ b/bitbake/lib/bs4/builder/_html5lib.py @@ -2,7 +2,6 @@ __all__ =3D [ 'HTML5TreeBuilder', ] =20 -from pdb import set_trace import warnings from bs4.builder import ( PERMISSIVE, @@ -322,7 +321,7 @@ class Element(treebuildersbase.Node): return self.element.contents =20 def getNameTuple(self): - if self.namespace =3D=3D None: + if self.namespace is None: return namespaces["html"], self.name else: return self.namespace, self.name diff --git a/bitbake/lib/bs4/dammit.py b/bitbake/lib/bs4/dammit.py index 805aa90..7ad9e0d 100644 --- a/bitbake/lib/bs4/dammit.py +++ b/bitbake/lib/bs4/dammit.py @@ -8,12 +8,10 @@ XML or HTML to reflect a new encoding; that's the tree bu= ilder's job. """ __license__ =3D "MIT" =20 -from pdb import set_trace import codecs from html.entities import codepoint2name import re import logging -import string =20 # Import a library to autodetect character encodings. chardet_type =3D None @@ -38,12 +36,6 @@ except ImportError: def chardet_dammit(s): return None =20 -# Available from http://cjkpython.i18n.org/. -try: - import iconv_codec -except ImportError: - pass - xml_encoding_re =3D re.compile( r'^<\?.*encoding=3D[\'"](.*?)[\'"].*\?>'.encode(), re.I) html_meta_re =3D re.compile( diff --git a/bitbake/lib/bs4/element.py b/bitbake/lib/bs4/element.py index 3775a60..68be42d 100644 --- a/bitbake/lib/bs4/element.py +++ b/bitbake/lib/bs4/element.py @@ -1,6 +1,5 @@ __license__ =3D "MIT" =20 -from pdb import set_trace import collections.abc import re import sys diff --git a/bitbake/lib/bs4/testing.py b/bitbake/lib/bs4/testing.py index 3a2f260..953bca8 100644 --- a/bitbake/lib/bs4/testing.py +++ b/bitbake/lib/bs4/testing.py @@ -4,7 +4,6 @@ __license__ =3D "MIT" =20 import pickle import copy -import functools import unittest from unittest import TestCase from bs4 import BeautifulSoup diff --git a/bitbake/lib/bs4/tests/test_docs.py b/bitbake/lib/bs4/tests/tes= t_docs.py index 5b9f677..d1d76a3 100644 --- a/bitbake/lib/bs4/tests/test_docs.py +++ b/bitbake/lib/bs4/tests/test_docs.py @@ -7,19 +7,15 @@ __all__ =3D [ 'additional_tests', ] =20 -import atexit import doctest -import os #from pkg_resources import ( # resource_filename, resource_exists, resource_listdir, cleanup_resourc= es) -import unittest =20 DOCTEST_FLAGS =3D ( doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE | doctest.REPORT_NDIFF) =20 - # def additional_tests(): # "Run the doc tests (README.txt and docs/*, if any exist)" # doctest_files =3D [ diff --git a/bitbake/lib/bs4/tests/test_htmlparser.py b/bitbake/lib/bs4/tes= ts/test_htmlparser.py index b45e35f..30a25e6 100644 --- a/bitbake/lib/bs4/tests/test_htmlparser.py +++ b/bitbake/lib/bs4/tests/test_htmlparser.py @@ -1,7 +1,6 @@ """Tests to ensure that the html.parser tree builder generates good trees.""" =20 -from pdb import set_trace import pickle from bs4.testing import SoupTest, HTMLTreeBuilderSmokeTest from bs4.builder import HTMLParserTreeBuilder diff --git a/bitbake/lib/bs4/tests/test_lxml.py b/bitbake/lib/bs4/tests/tes= t_lxml.py index 6c2a1d7..6b6cdd0 100644 --- a/bitbake/lib/bs4/tests/test_lxml.py +++ b/bitbake/lib/bs4/tests/test_lxml.py @@ -1,6 +1,5 @@ """Tests to ensure that the lxml tree builder generates good trees.""" =20 -import re import warnings =20 try: @@ -14,13 +13,8 @@ except ImportError as e: if LXML_PRESENT: from bs4.builder import LXMLTreeBuilder, LXMLTreeBuilderForXML =20 -from bs4 import ( - BeautifulSoup, - BeautifulStoneSoup, - ) -from bs4.element import Comment, Doctype, SoupStrainer +from bs4 import BeautifulStoneSoup from bs4.testing import skipIf -from bs4.tests import test_htmlparser from bs4.testing import ( HTMLTreeBuilderSmokeTest, XMLTreeBuilderSmokeTest, diff --git a/bitbake/lib/bs4/tests/test_soup.py b/bitbake/lib/bs4/tests/tes= t_soup.py index f87949e..6ad3cb3 100644 --- a/bitbake/lib/bs4/tests/test_soup.py +++ b/bitbake/lib/bs4/tests/test_soup.py @@ -1,16 +1,12 @@ # -*- coding: utf-8 -*- """Tests of Beautiful Soup as a whole.""" =20 -from pdb import set_trace import logging import unittest import sys import tempfile =20 -from bs4 import ( - BeautifulSoup, - BeautifulStoneSoup, -) +from bs4 import BeautifulSoup from bs4.element import ( CharsetMetaAttributeValue, ContentMetaAttributeValue, diff --git a/bitbake/lib/bs4/tests/test_tree.py b/bitbake/lib/bs4/tests/tes= t_tree.py index 6d3e67f..8e5c664 100644 --- a/bitbake/lib/bs4/tests/test_tree.py +++ b/bitbake/lib/bs4/tests/test_tree.py @@ -9,16 +9,12 @@ same markup, but all Beautiful Soup trees can be traverse= d with the methods tested here. """ =20 -from pdb import set_trace import copy import pickle import re import warnings from bs4 import BeautifulSoup -from bs4.builder import ( - builder_registry, - HTMLParserTreeBuilder, -) +from bs4.builder import builder_registry from bs4.element import ( PY3K, CData, @@ -29,10 +25,7 @@ from bs4.element import ( SoupStrainer, Tag, ) -from bs4.testing import ( - SoupTest, - skipIf, -) +from bs4.testing import SoupTest =20 XML_BUILDER_PRESENT =3D (builder_registry.lookup("xml") is not None) LXML_PRESENT =3D (builder_registry.lookup("lxml") is not None) diff --git a/bitbake/lib/hashserv/__init__.py b/bitbake/lib/hashserv/__init= __.py index c331862..f95e8f4 100644 --- a/bitbake/lib/hashserv/__init__.py +++ b/bitbake/lib/hashserv/__init__.py @@ -6,12 +6,20 @@ from contextlib import closing import re import sqlite3 +import itertools +import json =20 UNIX_PREFIX =3D "unix://" =20 ADDR_TYPE_UNIX =3D 0 ADDR_TYPE_TCP =3D 1 =20 +# The Python async server defaults to a 64K receive buffer, so we hardcode= our +# maximum chunk size. It would be better if the client and server reported= to +# each other what the maximum chunk sizes were, but that will slow down th= e +# connection setup with a round trip delay so I'd rather not do that unles= s it +# is necessary +DEFAULT_MAX_CHUNK =3D 32 * 1024 =20 def setup_database(database, sync=3DTrue): db =3D sqlite3.connect(database) @@ -66,6 +74,20 @@ def parse_address(addr): return (ADDR_TYPE_TCP, (host, int(port))) =20 =20 +def chunkify(msg, max_chunk): + if len(msg) < max_chunk - 1: + yield ''.join((msg, "\n")) + else: + yield ''.join((json.dumps({ + 'chunk-stream': None + }), "\n")) + + args =3D [iter(msg)] * (max_chunk - 1) + for m in map(''.join, itertools.zip_longest(*args, fillvalue=3D'')= ): + yield ''.join(itertools.chain(m, "\n")) + yield "\n" + + def create_server(addr, dbname, *, sync=3DTrue): from . import server db =3D setup_database(dbname, sync=3Dsync) diff --git a/bitbake/lib/hashserv/client.py b/bitbake/lib/hashserv/client.p= y index f659566..a29af83 100644 --- a/bitbake/lib/hashserv/client.py +++ b/bitbake/lib/hashserv/client.py @@ -3,11 +3,11 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from contextlib import closing import json import logging import socket import os +from . import chunkify, DEFAULT_MAX_CHUNK =20 =20 logger =3D logging.getLogger('hashserv.client') @@ -26,6 +26,7 @@ class Client(object): self.reader =3D None self.writer =3D None self.mode =3D self.MODE_NORMAL + self.max_chunk =3D DEFAULT_MAX_CHUNK =20 def connect_tcp(self, address, port): def connect_sock(): @@ -59,7 +60,7 @@ class Client(object): self.reader =3D self._socket.makefile('r', encoding=3D'utf-8') self.writer =3D self._socket.makefile('w', encoding=3D'utf-8') =20 - self.writer.write('OEHASHEQUIV 1.0\n\n') + self.writer.write('OEHASHEQUIV 1.1\n\n') self.writer.flush() =20 # Restore mode if the socket is being re-created @@ -92,18 +93,35 @@ class Client(object): count +=3D 1 =20 def send_message(self, msg): + def get_line(): + line =3D self.reader.readline() + if not line: + raise HashConnectionError('Connection closed') + + if not line.endswith('\n'): + raise HashConnectionError('Bad message %r' % message) + + return line + def proc(): - self.writer.write('%s\n' % json.dumps(msg)) + for c in chunkify(json.dumps(msg), self.max_chunk): + self.writer.write(c) self.writer.flush() =20 - l =3D self.reader.readline() - if not l: - raise HashConnectionError('Connection closed') + l =3D get_line() =20 - if not l.endswith('\n'): - raise HashConnectionError('Bad message %r' % message) + m =3D json.loads(l) + if 'chunk-stream' in m: + lines =3D [] + while True: + l =3D get_line().rstrip('\n') + if not l: + break + lines.append(l) =20 - return json.loads(l) + m =3D json.loads(''.join(lines)) + + return m =20 return self._send_wrapper(proc) =20 @@ -148,6 +166,22 @@ class Client(object): m['unihash'] =3D unihash return self.send_message({'report': m}) =20 + def report_unihash_equiv(self, taskhash, method, unihash, extra=3D{}): + self._set_mode(self.MODE_NORMAL) + m =3D extra.copy() + m['taskhash'] =3D taskhash + m['method'] =3D method + m['unihash'] =3D unihash + return self.send_message({'report-equiv': m}) + + def get_taskhash(self, method, taskhash, all_properties=3DFalse): + self._set_mode(self.MODE_NORMAL) + return self.send_message({'get': { + 'taskhash': taskhash, + 'method': method, + 'all': all_properties + }}) + def get_stats(self): self._set_mode(self.MODE_NORMAL) return self.send_message({'get-stats': None}) diff --git a/bitbake/lib/hashserv/server.py b/bitbake/lib/hashserv/server.p= y index 0aff776..8105071 100644 --- a/bitbake/lib/hashserv/server.py +++ b/bitbake/lib/hashserv/server.py @@ -13,6 +13,7 @@ import os import signal import socket import time +from . import chunkify, DEFAULT_MAX_CHUNK =20 logger =3D logging.getLogger('hashserv.server') =20 @@ -107,12 +108,29 @@ class Stats(object): return {k: getattr(self, k) for k in ('num', 'total_time', 'max_ti= me', 'average', 'stdev')} =20 =20 +class ClientError(Exception): + pass + class ServerClient(object): + FAST_QUERY =3D 'SELECT taskhash, method, unihash FROM tasks_v2 WHERE m= ethod=3D:method AND taskhash=3D:taskhash ORDER BY created ASC LIMIT 1' + ALL_QUERY =3D 'SELECT * FROM tasks_v2 WHERE m= ethod=3D:method AND taskhash=3D:taskhash ORDER BY created ASC LIMIT 1' + def __init__(self, reader, writer, db, request_stats): self.reader =3D reader self.writer =3D writer self.db =3D db self.request_stats =3D request_stats + self.max_chunk =3D DEFAULT_MAX_CHUNK + + self.handlers =3D { + 'get': self.handle_get, + 'report': self.handle_report, + 'report-equiv': self.handle_equivreport, + 'get-stream': self.handle_get_stream, + 'get-stats': self.handle_get_stats, + 'reset-stats': self.handle_reset_stats, + 'chunk-stream': self.handle_chunk, + } =20 async def process_requests(self): try: @@ -125,7 +143,11 @@ class ServerClient(object): return =20 (proto_name, proto_version) =3D protocol.decode('utf-8').rstri= p().split() - if proto_name !=3D 'OEHASHEQUIV' or proto_version !=3D '1.0': + if proto_name !=3D 'OEHASHEQUIV': + return + + proto_version =3D tuple(int(v) for v in proto_version.split('.= ')) + if proto_version < (1, 0) or proto_version > (1, 1): return =20 # Read headers. Currently, no headers are implemented, so look= for @@ -140,39 +162,34 @@ class ServerClient(object): break =20 # Handle messages - handlers =3D { - 'get': self.handle_get, - 'report': self.handle_report, - 'get-stream': self.handle_get_stream, - 'get-stats': self.handle_get_stats, - 'reset-stats': self.handle_reset_stats, - } - while True: d =3D await self.read_message() if d is None: break - - for k in handlers.keys(): - if k in d: - logger.debug('Handling %s' % k) - if 'stream' in k: - await handlers[k](d[k]) - else: - with self.request_stats.start_sample() as self= .request_sample, \ - self.request_sample.measure(): - await handlers[k](d[k]) - break - else: - logger.warning("Unrecognized command %r" % d) - break - + await self.dispatch_message(d) await self.writer.drain() + except ClientError as e: + logger.error(str(e)) finally: self.writer.close() =20 + async def dispatch_message(self, msg): + for k in self.handlers.keys(): + if k in msg: + logger.debug('Handling %s' % k) + if 'stream' in k: + await self.handlers[k](msg[k]) + else: + with self.request_stats.start_sample() as self.request= _sample, \ + self.request_sample.measure(): + await self.handlers[k](msg[k]) + return + + raise ClientError("Unrecognized command %r" % msg) + def write_message(self, msg): - self.writer.write(('%s\n' % json.dumps(msg)).encode('utf-8')) + for c in chunkify(json.dumps(msg), self.max_chunk): + self.writer.write(c.encode('utf-8')) =20 async def read_message(self): l =3D await self.reader.readline() @@ -190,14 +207,38 @@ class ServerClient(object): logger.error('Bad message from client: %r' % message) raise e =20 + async def handle_chunk(self, request): + lines =3D [] + try: + while True: + l =3D await self.reader.readline() + l =3D l.rstrip(b"\n").decode("utf-8") + if not l: + break + lines.append(l) + + msg =3D json.loads(''.join(lines)) + except (json.JSONDecodeError, UnicodeDecodeError) as e: + logger.error('Bad message from client: %r' % message) + raise e + + if 'chunk-stream' in msg: + raise ClientError("Nested chunks are not allowed") + + await self.dispatch_message(msg) + async def handle_get(self, request): method =3D request['method'] taskhash =3D request['taskhash'] =20 - row =3D self.query_equivalent(method, taskhash) + if request.get('all', False): + row =3D self.query_equivalent(method, taskhash, self.ALL_QUERY= ) + else: + row =3D self.query_equivalent(method, taskhash, self.FAST_QUER= Y) + if row is not None: logger.debug('Found equivalent task %s -> %s', (row['taskhash'= ], row['unihash'])) - d =3D {k: row[k] for k in ('taskhash', 'method', 'unihash')} + d =3D {k: row[k] for k in row.keys()} =20 self.write_message(d) else: @@ -227,7 +268,7 @@ class ServerClient(object): =20 (method, taskhash) =3D l.split() #logger.debug('Looking up %s %s' % (method, taskhash)) - row =3D self.query_equivalent(method, taskhash) + row =3D self.query_equivalent(method, taskhash, self.FAST_= QUERY) if row is not None: msg =3D ('%s\n' % row['unihash']).encode('utf-8') #logger.debug('Found equivalent task %s -> %s', (row['= taskhash'], row['unihash'])) @@ -303,6 +344,41 @@ class ServerClient(object): =20 self.write_message(d) =20 + async def handle_equivreport(self, data): + with closing(self.db.cursor()) as cursor: + insert_data =3D { + 'method': data['method'], + 'outhash': "", + 'taskhash': data['taskhash'], + 'unihash': data['unihash'], + 'created': datetime.now() + } + + for k in ('owner', 'PN', 'PV', 'PR', 'task', 'outhash_siginfo'= ): + if k in data: + insert_data[k] =3D data[k] + + cursor.execute('''INSERT OR IGNORE INTO tasks_v2 (%s) VALUES (= %s)''' % ( + ', '.join(sorted(insert_data.keys())), + ', '.join(':' + k for k in sorted(insert_data.keys()))), + insert_data) + + self.db.commit() + + # Fetch the unihash that will be reported for the taskhash. If= the + # unihash matches, it means this row was inserted (or the mapp= ing + # was already valid) + row =3D self.query_equivalent(data['method'], data['taskhash']= , self.FAST_QUERY) + + if row['unihash'] =3D=3D data['unihash']: + logger.info('Adding taskhash equivalence for %s with uniha= sh %s', + data['taskhash'], row['unihash']) + + d =3D {k: row[k] for k in ('taskhash', 'method', 'unihash')} + + self.write_message(d) + + async def handle_get_stats(self, request): d =3D { 'requests': self.request_stats.todict(), @@ -318,12 +394,11 @@ class ServerClient(object): self.request_stats.reset() self.write_message(d) =20 - def query_equivalent(self, method, taskhash): + def query_equivalent(self, method, taskhash, query): # This is part of the inner loop and must be as fast as possible try: cursor =3D self.db.cursor() - cursor.execute('SELECT taskhash, method, unihash FROM tasks_v2= WHERE method=3D:method AND taskhash=3D:taskhash ORDER BY created ASC LIMIT= 1', - {'method': method, 'taskhash': taskhash}) + cursor.execute(query, {'method': method, 'taskhash': taskhash}= ) return cursor.fetchone() except: cursor.close() diff --git a/bitbake/lib/hashserv/tests.py b/bitbake/lib/hashserv/tests.py index a5472a9..6e86295 100644 --- a/bitbake/lib/hashserv/tests.py +++ b/bitbake/lib/hashserv/tests.py @@ -99,6 +99,29 @@ class TestHashEquivalenceServer(object): result =3D self.client.get_unihash(self.METHOD, taskhash) self.assertEqual(result, unihash) =20 + def test_huge_message(self): + # Simple test that hashes can be created + taskhash =3D 'c665584ee6817aa99edfc77a44dd853828279370' + outhash =3D '3c979c3db45c569f51ab7626a4651074be3a9d11a84b1db076f5b= 14f7d39db44' + unihash =3D '90e9bc1d1f094c51824adca7f8ea79a048d68824' + + result =3D self.client.get_unihash(self.METHOD, taskhash) + self.assertIsNone(result, msg=3D'Found unexpected task, %r' % resu= lt) + + siginfo =3D "0" * (self.client.max_chunk * 4) + + result =3D self.client.report_unihash(taskhash, self.METHOD, outha= sh, unihash, { + 'outhash_siginfo': siginfo + }) + self.assertEqual(result['unihash'], unihash, 'Server returned bad = unihash') + + result =3D self.client.get_taskhash(self.METHOD, taskhash, True) + self.assertEqual(result['taskhash'], taskhash) + self.assertEqual(result['unihash'], unihash) + self.assertEqual(result['method'], self.METHOD) + self.assertEqual(result['outhash'], outhash) + self.assertEqual(result['outhash_siginfo'], siginfo) + def test_stress(self): def query_server(failures): client =3D Client(self.server.address) diff --git a/bitbake/lib/layerindexlib/cooker.py b/bitbake/lib/layerindexli= b/cooker.py index 604a961..65b23d0 100644 --- a/bitbake/lib/layerindexlib/cooker.py +++ b/bitbake/lib/layerindexlib/cooker.py @@ -4,9 +4,8 @@ # =20 import logging -import json =20 -from collections import OrderedDict, defaultdict +from collections import defaultdict =20 from urllib.parse import unquote, urlparse =20 @@ -94,7 +93,7 @@ class CookerPlugin(layerindexlib.plugin.IndexPlugin): return index =20 collections =3D d.getVar('BBFILE_COLLECTIONS') - layerconfs =3D d.varhistory.get_variable_items_files('BBFILE_COLLE= CTIONS', d) + layerconfs =3D d.varhistory.get_variable_items_files('BBFILE_COLLE= CTIONS') bbfile_collections =3D {layer: os.path.dirname(os.path.dirname(pat= h)) for layer, path in layerconfs.items()} =20 (_, bb_branch, _, _) =3D self._get_bitbake_info() diff --git a/bitbake/lib/layerindexlib/plugin.py b/bitbake/lib/layerindexli= b/plugin.py index 7015a1a..cadda36 100644 --- a/bitbake/lib/layerindexlib/plugin.py +++ b/bitbake/lib/layerindexlib/plugin.py @@ -7,10 +7,7 @@ # Plugin base class # Utility Functions for working on layerindex data =20 -import argparse import logging -import os -import bb.msg =20 logger =3D logging.getLogger('BitBake.layerindexlib.plugin') =20 diff --git a/bitbake/lib/layerindexlib/tests/cooker.py b/bitbake/lib/layeri= ndexlib/tests/cooker.py index 1fa102e..1d0685e 100644 --- a/bitbake/lib/layerindexlib/tests/cooker.py +++ b/bitbake/lib/layerindexlib/tests/cooker.py @@ -3,15 +3,12 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -import unittest -import tempfile import os import bb =20 import layerindexlib from layerindexlib.tests.common import LayersTest =20 -import logging =20 class LayerIndexCookerTest(LayersTest): =20 diff --git a/bitbake/lib/layerindexlib/tests/layerindexobj.py b/bitbake/lib= /layerindexlib/tests/layerindexobj.py index 0c5ec88..de1e474 100644 --- a/bitbake/lib/layerindexlib/tests/layerindexobj.py +++ b/bitbake/lib/layerindexlib/tests/layerindexobj.py @@ -3,14 +3,8 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -import unittest -import tempfile -import os -import bb - from layerindexlib.tests.common import LayersTest =20 -import logging =20 class LayerIndexObjectsTest(LayersTest): def setUp(self): diff --git a/bitbake/lib/layerindexlib/tests/restapi.py b/bitbake/lib/layer= indexlib/tests/restapi.py index 6d8dc00..e5ccafe 100644 --- a/bitbake/lib/layerindexlib/tests/restapi.py +++ b/bitbake/lib/layerindexlib/tests/restapi.py @@ -4,14 +4,11 @@ # =20 import unittest -import tempfile import os -import bb =20 import layerindexlib from layerindexlib.tests.common import LayersTest =20 -import logging =20 def skipIfNoNetwork(): if os.environ.get("BB_SKIP_NETTESTS") =3D=3D "yes": diff --git a/bitbake/lib/ply/yacc.py b/bitbake/lib/ply/yacc.py index d50886e..561784f 100644 --- a/bitbake/lib/ply/yacc.py +++ b/bitbake/lib/ply/yacc.py @@ -488,7 +488,7 @@ class LRParser: # --! DEBUG return result =20 - if t =3D=3D None: + if t is None: =20 # --! DEBUG debug.error('Error : %s', @@ -766,7 +766,7 @@ class LRParser: n =3D symstack[-1] return getattr(n,"value",None) =20 - if t =3D=3D None: + if t is None: =20 # We have some kind of parsing error here. To handle # this, we are going to push the current token onto @@ -1021,7 +1021,7 @@ class LRParser: n =3D symstack[-1] return getattr(n,"value",None) =20 - if t =3D=3D None: + if t is None: =20 # We have some kind of parsing error here. To handle # this, we are going to push the current token onto diff --git a/bitbake/lib/prserv/db.py b/bitbake/lib/prserv/db.py index 117d8c0..cb2a246 100644 --- a/bitbake/lib/prserv/db.py +++ b/bitbake/lib/prserv/db.py @@ -71,7 +71,7 @@ class PRTable(object): data=3Dself._execute("SELECT value FROM %s WHERE version=3D? AND p= kgarch=3D? AND checksum=3D?;" % self.table, (version, pkgarch, checksum)) row=3Ddata.fetchone() - if row !=3D None: + if row is not None: return row[0] else: #no value found, try to insert @@ -87,7 +87,7 @@ class PRTable(object): data=3Dself._execute("SELECT value FROM %s WHERE version=3D? A= ND pkgarch=3D? AND checksum=3D?;" % self.table, (version, pkgarch, checksum)) row=3Ddata.fetchone() - if row !=3D None: + if row is not None: return row[0] else: raise prserv.NotFoundError @@ -99,7 +99,7 @@ class PRTable(object): % (self.table, self.table), (version, pkgarch, checksum, version, pkgarch)= ) row=3Ddata.fetchone() - if row !=3D None: + if row is not None: return row[0] else: #no value found, try to insert @@ -116,7 +116,7 @@ class PRTable(object): data=3Dself._execute("SELECT value FROM %s WHERE version=3D? A= ND pkgarch=3D? AND checksum=3D?;" % self.table, (version, pkgarch, checksum)) row=3Ddata.fetchone() - if row !=3D None: + if row is not None: return row[0] else: raise prserv.NotFoundError @@ -132,7 +132,7 @@ class PRTable(object): data =3D self._execute("SELECT value FROM %s WHERE version=3D? AND= pkgarch=3D? AND checksum=3D?;" % self.table, (version, pkgarch, checksum)) row =3D data.fetchone() - if row !=3D None: + if row is not None: val=3Drow[0] else: #no value found, try to insert @@ -147,7 +147,7 @@ class PRTable(object): data =3D self._execute("SELECT value FROM %s WHERE version=3D?= AND pkgarch=3D? AND checksum=3D?;" % self.table, (version, pkgarch, checksum)) row =3D data.fetchone() - if row !=3D None: + if row is not None: val =3D row[0] return val =20 @@ -170,7 +170,7 @@ class PRTable(object): data =3D self._execute("SELECT value FROM %s WHERE version=3D? AND= pkgarch=3D? AND checksum=3D? AND value>=3D?;" % self.table, (version,pkgarch,checksum,value)) row=3Ddata.fetchone() - if row !=3D None: + if row is not None: return row[0] else: return None diff --git a/bitbake/lib/prserv/serv.py b/bitbake/lib/prserv/serv.py index be3acec..25dcf8a 100644 --- a/bitbake/lib/prserv/serv.py +++ b/bitbake/lib/prserv/serv.py @@ -243,6 +243,7 @@ class PRServer(SimpleXMLRPCServer): try: pid =3D os.fork() if pid > 0: + self.socket.close() # avoid ResourceWarning in parent return pid except OSError as e: raise Exception("%s [%d]" % (e.strerror, e.errno)) @@ -291,10 +292,9 @@ class PRServer(SimpleXMLRPCServer): logger.addHandler(streamhandler) =20 # write pidfile - pid =3D str(os.getpid())=20 - pf =3D open(self.pidfile, 'w') - pf.write("%s\n" % pid) - pf.close() + pid =3D str(os.getpid()) + with open(self.pidfile, 'w') as pf: + pf.write("%s\n" % pid) =20 self.work_forever() self.delpid() @@ -352,9 +352,8 @@ def start_daemon(dbfile, host, port, logfile): ip =3D socket.gethostbyname(host) pidfile =3D PIDPREFIX % (ip, port) try: - pf =3D open(pidfile,'r') - pid =3D int(pf.readline().strip()) - pf.close() + with open(pidfile) as pf: + pid =3D int(pf.readline().strip()) except IOError: pid =3D None =20 @@ -379,9 +378,8 @@ def stop_daemon(host, port): ip =3D socket.gethostbyname(host) pidfile =3D PIDPREFIX % (ip, port) try: - pf =3D open(pidfile,'r') - pid =3D int(pf.readline().strip()) - pf.close() + with open(pidfile) as pf: + pid =3D int(pf.readline().strip()) except IOError: pid =3D None =20 @@ -449,29 +447,35 @@ class PRServiceConfigError(Exception): def auto_start(d): global singleton =20 - # Shutdown any existing PR Server - auto_shutdown() - host_params =3D list(filter(None, (d.getVar('PRSERV_HOST') or '').spli= t(':'))) if not host_params: + # Shutdown any existing PR Server + auto_shutdown() return None =20 if len(host_params) !=3D 2: + # Shutdown any existing PR Server + auto_shutdown() logger.critical('\n'.join(['PRSERV_HOST: incorrect format', 'Usage: PRSERV_HOST =3D ":"'])) raise PRServiceConfigError =20 - if is_local_special(host_params[0], int(host_params[1])) and not singl= eton: + if is_local_special(host_params[0], int(host_params[1])): import bb.utils cachedir =3D (d.getVar("PERSISTENT_DIR") or d.getVar("CACHE")) if not cachedir: logger.critical("Please set the 'PERSISTENT_DIR' or 'CACHE' va= riable") raise PRServiceConfigError - bb.utils.mkdirhier(cachedir) dbfile =3D os.path.join(cachedir, "prserv.sqlite3") logfile =3D os.path.join(cachedir, "prserv.log") - singleton =3D PRServSingleton(os.path.abspath(dbfile), os.path.abs= path(logfile), ("localhost",0)) - singleton.start() + if singleton: + if singleton.dbfile !=3D dbfile: + # Shutdown any existing PR Server as doesn't match config + auto_shutdown() + if not singleton: + bb.utils.mkdirhier(cachedir) + singleton =3D PRServSingleton(os.path.abspath(dbfile), os.path= .abspath(logfile), ("localhost",0)) + singleton.start() if singleton: host, port =3D singleton.getinfo() else: diff --git a/bitbake/lib/pyinotify.py b/bitbake/lib/pyinotify.py index 1528a22..6ae40a2 100644 --- a/bitbake/lib/pyinotify.py +++ b/bitbake/lib/pyinotify.py @@ -1274,7 +1274,7 @@ class Notifier: basename =3D os.path.basename(sys.argv[0]) or 'pyinotify' pid_file =3D os.path.join(dirname, basename + '.pid') =20 - if pid_file !=3D False and os.path.lexists(pid_file): + if pid_file and os.path.lexists(pid_file): err =3D 'Cannot daemonize: pid file %s already exists.' % pid_= file raise NotifierError(err) =20 @@ -1308,7 +1308,7 @@ class Notifier: fork_daemon() =20 # Write pid - if pid_file !=3D False: + if pid_file: flags =3D os.O_WRONLY|os.O_CREAT|os.O_NOFOLLOW|os.O_EXCL fd_pid =3D os.open(pid_file, flags, 0o0600) os.write(fd_pid, bytes(str(os.getpid()) + '\n', diff --git a/bitbake/lib/toaster/bldcollector/urls.py b/bitbake/lib/toaster= /bldcollector/urls.py index 8eb1e34..efd67a8 100644 --- a/bitbake/lib/toaster/bldcollector/urls.py +++ b/bitbake/lib/toaster/bldcollector/urls.py @@ -6,7 +6,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.conf.urls import include, url +from django.conf.urls import url =20 import bldcollector.views =20 diff --git a/bitbake/lib/toaster/bldcollector/views.py b/bitbake/lib/toaste= r/bldcollector/views.py index c708b41..04cd8b3 100644 --- a/bitbake/lib/toaster/bldcollector/views.py +++ b/bitbake/lib/toaster/bldcollector/views.py @@ -6,16 +6,8 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.views.decorators.cache import cache_control -from django.core.urlresolvers import reverse -from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from django.urls import reverse from django.http import HttpResponseBadRequest, HttpResponse -from django.utils import timezone -from django.utils.html import escape -from datetime import timedelta -from django.utils import formats -from toastergui.templatetags.projecttags import json as jsonfilter -import json import os import tempfile import subprocess diff --git a/bitbake/lib/toaster/bldcontrol/admin.py b/bitbake/lib/toaster/= bldcontrol/admin.py index e85c30e..1754bc1 100644 --- a/bitbake/lib/toaster/bldcontrol/admin.py +++ b/bitbake/lib/toaster/bldcontrol/admin.py @@ -3,7 +3,6 @@ # =20 from django.contrib import admin -from django.contrib.admin.filters import RelatedFieldListFilter from .models import BuildEnvironment =20 class BuildEnvironmentAdmin(admin.ModelAdmin): diff --git a/bitbake/lib/toaster/bldcontrol/bbcontroller.py b/bitbake/lib/t= oaster/bldcontrol/bbcontroller.py index 301df18..71c288d 100644 --- a/bitbake/lib/toaster/bldcontrol/bbcontroller.py +++ b/bitbake/lib/toaster/bldcontrol/bbcontroller.py @@ -8,10 +8,8 @@ =20 import os import sys -import re -from django.db import transaction from django.db.models import Q -from bldcontrol.models import BuildEnvironment, BRLayer, BRVariable, BRTar= get, BRBitbake +from bldcontrol.models import BuildEnvironment, BRLayer, BRBitbake =20 # load Bitbake components path =3D os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.p= ath.abspath(__file__))))) diff --git a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py b/bitb= ake/lib/toaster/bldcontrol/localhostbecontroller.py index 39ea736..75674cc 100644 --- a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py +++ b/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py @@ -7,27 +7,24 @@ # =20 import os -import sys import re import shutil import time -from django.db import transaction -from django.db.models import Q -from bldcontrol.models import BuildEnvironment, BuildRequest, BRLayer, BRV= ariable, BRTarget, BRBitbake, Build -from orm.models import CustomImageRecipe, Layer, Layer_Version, Project, P= rojectLayer, ToasterSetting +from bldcontrol.models import BuildEnvironment, BuildRequest, Build +from orm.models import CustomImageRecipe, Layer, Layer_Version, Project, T= oasterSetting from orm.models import signal_runbuilds import subprocess =20 from toastermain import settings =20 -from bldcontrol.bbcontroller import BuildEnvironmentController, ShellCmdEx= ception, BuildSetupException, BitbakeController +from bldcontrol.bbcontroller import BuildEnvironmentController, ShellCmdEx= ception, BuildSetupException =20 import logging logger =3D logging.getLogger("toaster") =20 install_dir =3D os.environ.get('TOASTER_DIR') =20 -from pprint import pprint, pformat +from pprint import pformat =20 class LocalhostBEController(BuildEnvironmentController): """ Implementation of the BuildEnvironmentController for the localhost= ; diff --git a/bitbake/lib/toaster/bldcontrol/management/commands/checksettin= gs.py b/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py index fe2c4dc..20f9dce 100644 --- a/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py +++ b/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py @@ -2,11 +2,9 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.core.management.base import BaseCommand, CommandError -from django.db import transaction +from django.core.management.base import BaseCommand =20 from django.core.management import call_command -from bldcontrol.bbcontroller import getBuildEnvironmentController, ShellCm= dException from bldcontrol.models import BuildRequest, BuildEnvironment, BRError from orm.models import ToasterSetting, Build, Layer =20 @@ -80,7 +78,7 @@ class Command(BaseCommand): template_conf =3D os.environ.get("TEMPLATECONF", "= ") custom_xml_only =3D os.environ.get("CUSTOM_XML_ONL= Y") =20 - if ToasterSetting.objects.filter(name=3D'CUSTOM_XM= L_ONLY').count() > 0 or (not custom_xml_only =3D=3D None): + if ToasterSetting.objects.filter(name=3D'CUSTOM_XM= L_ONLY').count() > 0 or custom_xml_only is not None: # only use the custom settings pass elif "poky" in template_conf: diff --git a/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.p= y b/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py index 50ec409..19f659e 100644 --- a/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py +++ b/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py @@ -168,17 +168,17 @@ class Command(BaseCommand): try: self.cleanup() except Exception as e: - logger.warn("runbuilds: cleanup exception %s" % str(e)) + logger.warning("runbuilds: cleanup exception %s" % str(e)) =20 try: self.archive() except Exception as e: - logger.warn("runbuilds: archive exception %s" % str(e)) + logger.warning("runbuilds: archive exception %s" % str(e)) =20 try: self.schedule() except Exception as e: - logger.warn("runbuilds: schedule exception %s" % str(e)) + logger.warning("runbuilds: schedule exception %s" % str(e)) =20 def handle(self, **options): pidfile_path =3D os.path.join(os.environ.get("BUILDDIR", "."), diff --git a/bitbake/lib/toaster/bldcontrol/migrations/0001_initial.py b/bi= tbake/lib/toaster/bldcontrol/migrations/0001_initial.py index 67db378..7ee19f4 100644 --- a/bitbake/lib/toaster/bldcontrol/migrations/0001_initial.py +++ b/bitbake/lib/toaster/bldcontrol/migrations/0001_initial.py @@ -37,7 +37,7 @@ class Migration(migrations.Migration): ('giturl', models.CharField(max_length=3D254)), ('commit', models.CharField(max_length=3D254)), ('dirpath', models.CharField(max_length=3D254)), - ('layer_version', models.ForeignKey(to=3D'orm.Layer_Versio= n', null=3DTrue)), + ('layer_version', models.ForeignKey(to=3D'orm.Layer_Versio= n', null=3DTrue, on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -80,34 +80,34 @@ class Migration(migrations.Migration): ('state', models.IntegerField(default=3D0, choices=3D[(0, = b'created'), (1, b'queued'), (2, b'in progress'), (3, b'completed'), (4, b'= failed'), (5, b'deleted'), (6, b'archive')])), ('created', models.DateTimeField(auto_now_add=3DTrue)), ('updated', models.DateTimeField(auto_now=3DTrue)), - ('build', models.OneToOneField(null=3DTrue, to=3D'orm.Buil= d')), - ('environment', models.ForeignKey(to=3D'bldcontrol.BuildEn= vironment', null=3DTrue)), - ('project', models.ForeignKey(to=3D'orm.Project')), + ('build', models.OneToOneField(null=3DTrue, to=3D'orm.Buil= d', on_delete=3Dmodels.CASCADE)), + ('environment', models.ForeignKey(to=3D'bldcontrol.BuildEn= vironment', null=3DTrue, on_delete=3Dmodels.CASCADE)), + ('project', models.ForeignKey(to=3D'orm.Project', on_delet= e=3Dmodels.CASCADE)), ], ), migrations.AddField( model_name=3D'brvariable', name=3D'req', - field=3Dmodels.ForeignKey(to=3D'bldcontrol.BuildRequest'), + field=3Dmodels.ForeignKey(to=3D'bldcontrol.BuildRequest', on_d= elete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'brtarget', name=3D'req', - field=3Dmodels.ForeignKey(to=3D'bldcontrol.BuildRequest'), + field=3Dmodels.ForeignKey(to=3D'bldcontrol.BuildRequest', on_d= elete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'brlayer', name=3D'req', - field=3Dmodels.ForeignKey(to=3D'bldcontrol.BuildRequest'), + field=3Dmodels.ForeignKey(to=3D'bldcontrol.BuildRequest', on_d= elete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'brerror', name=3D'req', - field=3Dmodels.ForeignKey(to=3D'bldcontrol.BuildRequest'), + field=3Dmodels.ForeignKey(to=3D'bldcontrol.BuildRequest', on_d= elete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'brbitbake', name=3D'req', - field=3Dmodels.OneToOneField(to=3D'bldcontrol.BuildRequest'), + field=3Dmodels.OneToOneField(to=3D'bldcontrol.BuildRequest', o= n_delete=3Dmodels.CASCADE), ), ] diff --git a/bitbake/lib/toaster/bldcontrol/models.py b/bitbake/lib/toaster= /bldcontrol/models.py index bcffcf5..c2f302d 100644 --- a/bitbake/lib/toaster/bldcontrol/models.py +++ b/bitbake/lib/toaster/bldcontrol/models.py @@ -4,9 +4,8 @@ =20 from __future__ import unicode_literals from django.db import models -from django.core.validators import MaxValueValidator, MinValueValidator from django.utils.encoding import force_text -from orm.models import Project, ProjectLayer, ProjectVariable, ProjectTarg= et, Build, Layer_Version +from orm.models import Project, Build, Layer_Version =20 import logging logger =3D logging.getLogger("toaster") @@ -86,9 +85,9 @@ class BuildRequest(models.Model): =20 search_allowed_fields =3D ("brtarget__target", "build__project__name") =20 - project =3D models.ForeignKey(Project) - build =3D models.OneToOneField(Build, null =3D True) # TODO:= toasterui should set this when Build is created - environment =3D models.ForeignKey(BuildEnvironment, null =3D True) + project =3D models.ForeignKey(Project, on_delete=3Dmodels.CASCADE) + build =3D models.OneToOneField(Build, on_delete=3Dmodels.CASCADE= , null =3D True) # TODO: toasterui should set this when Build is create= d + environment =3D models.ForeignKey(BuildEnvironment, on_delete=3Dmodels= .CASCADE, null =3D True) state =3D models.IntegerField(choices =3D REQUEST_STATE, default= =3D REQ_CREATED) created =3D models.DateTimeField(auto_now_add =3D True) updated =3D models.DateTimeField(auto_now =3D True) @@ -132,32 +131,32 @@ class BuildRequest(models.Model): =20 =20 class BRLayer(models.Model): - req =3D models.ForeignKey(BuildRequest) + req =3D models.ForeignKey(BuildRequest, on_delete=3Dmodels.CASCADE) name =3D models.CharField(max_length=3D100) giturl =3D models.CharField(max_length=3D254, null=3DTrue) local_source_dir =3D models.CharField(max_length=3D254, null=3DTrue) commit =3D models.CharField(max_length=3D254, null=3DTrue) dirpath =3D models.CharField(max_length=3D254, null=3DTrue) - layer_version =3D models.ForeignKey(Layer_Version, null=3DTrue) + layer_version =3D models.ForeignKey(Layer_Version, on_delete=3Dmodels.= CASCADE, null=3DTrue) =20 class BRBitbake(models.Model): - req =3D models.OneToOneField(BuildRequest) # only one bitba= ke for a request + req =3D models.OneToOneField(BuildRequest, on_delete=3Dmodels.= CASCADE) # only one bitbake for a request giturl =3D models.CharField(max_length =3D254) commit =3D models.CharField(max_length =3D 254) dirpath =3D models.CharField(max_length =3D 254) =20 class BRVariable(models.Model): - req =3D models.ForeignKey(BuildRequest) + req =3D models.ForeignKey(BuildRequest, on_delete=3Dmodels.CAS= CADE) name =3D models.CharField(max_length=3D100) value =3D models.TextField(blank =3D True) =20 class BRTarget(models.Model): - req =3D models.ForeignKey(BuildRequest) + req =3D models.ForeignKey(BuildRequest, on_delete=3Dmodels.CAS= CADE) target =3D models.CharField(max_length=3D100) task =3D models.CharField(max_length=3D100, null=3DTrue) =20 class BRError(models.Model): - req =3D models.ForeignKey(BuildRequest) + req =3D models.ForeignKey(BuildRequest, on_delete=3Dmodels.CAS= CADE) errtype =3D models.CharField(max_length=3D100) errmsg =3D models.TextField() traceback =3D models.TextField() diff --git a/bitbake/lib/toaster/orm/fixtures/oe-core.xml b/bitbake/lib/toa= ster/orm/fixtures/oe-core.xml index a723f5a..fd93f4d 100644 --- a/bitbake/lib/toaster/orm/fixtures/oe-core.xml +++ b/bitbake/lib/toaster/orm/fixtures/oe-core.xml @@ -8,9 +8,9 @@ =20 - warrior + dunfell git://git.openembedded.org/b= itbake - 1.42 + 1.46 HEAD @@ -30,11 +30,11 @@ =20 - warrior - Openembedded Warrior + dunfell + Openembedded Dunfell 1 - warrior - Toaster will run your buil= ds using the tip of the <a href=3D\"http://cgit.openembedded.org/openemb= edded-core/log/?h=3Dwarrior\">OpenEmbedded Warrior</a> branch. + dunfell + Toaster will run your buil= ds using the tip of the <a href=3D\"http://cgit.openembedded.org/openemb= edded-core/log/?h=3Ddunfell\">OpenEmbedded Dunfell</a> branch. local diff --git a/bitbake/lib/toaster/orm/fixtures/poky.xml b/bitbake/lib/toaste= r/orm/fixtures/poky.xml index 7992383..902bc88 100644 --- a/bitbake/lib/toaster/orm/fixtures/poky.xml +++ b/bitbake/lib/toaster/orm/fixtures/poky.xml @@ -8,9 +8,9 @@ =20 - warrior + dunfell git://git.yoctoproject.org/p= oky - warrior + dunfell bitbake @@ -35,11 +35,11 @@ =20 - warrior - Yocto Project 2.7 "Warr= ior" + dunfell + Yocto Project 3.1 "Dunf= ell" 1 - warrior - Toaster will run your buil= ds using the tip of the <a href=3D"http://git.yoctoproject.org/cgit/cgit= .cgi/poky/log/?h=3Dwarrior">Yocto Project Warrior branch</a>. + dunfell + Toaster will run your buil= ds using the tip of the <a href=3D"http://git.yoctoproject.org/cgit/cgit= .cgi/poky/log/?h=3Ddunfell">Yocto Project Dunfell branch</a>. local @@ -130,7 +130,7 @@ 1 0 1 - warrior + dunfell meta @@ -168,7 +168,7 @@ 2 0 1 - warrior + dunfell meta-poky @@ -206,7 +206,7 @@ 3 0 1 - warrior + dunfell meta-yocto-bsp diff --git a/bitbake/lib/toaster/orm/management/commands/lsupdates.py b/bit= bake/lib/toaster/orm/management/commands/lsupdates.py index 5b5abbb..a4dbcaa 100644 --- a/bitbake/lib/toaster/orm/management/commands/lsupdates.py +++ b/bitbake/lib/toaster/orm/management/commands/lsupdates.py @@ -8,7 +8,7 @@ =20 from django.core.management.base import BaseCommand =20 -from orm.models import LayerSource, Layer, Release, Layer_Version +from orm.models import Layer, Release, Layer_Version from orm.models import LayerVersionDependency, Machine, Recipe from orm.models import Distro from orm.models import ToasterSetting diff --git a/bitbake/lib/toaster/orm/migrations/0001_initial.py b/bitbake/l= ib/toaster/orm/migrations/0001_initial.py index 760462f..a8ac23b 100644 --- a/bitbake/lib/toaster/orm/migrations/0001_initial.py +++ b/bitbake/lib/toaster/orm/migrations/0001_initial.py @@ -54,7 +54,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('file_name', models.FilePathField()), ('file_size', models.IntegerField()), - ('build', models.ForeignKey(to=3D'orm.Build')), + ('build', models.ForeignKey(to=3D'orm.Build', on_delete=3D= models.CASCADE)), ], ), migrations.CreateModel( @@ -64,7 +64,7 @@ class Migration(migrations.Migration): ('area', models.IntegerField(choices=3D[(0, b'variable')])= ), ('key', models.CharField(max_length=3D100)), ('text', models.TextField()), - ('build', models.ForeignKey(related_name=3D'helptext_build= ', to=3D'orm.Build')), + ('build', models.ForeignKey(related_name=3D'helptext_build= ', to=3D'orm.Build', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -94,8 +94,8 @@ class Migration(migrations.Migration): ('dirpath', models.CharField(default=3DNone, max_length=3D= 255, null=3DTrue)), ('priority', models.IntegerField(default=3D0)), ('local_path', models.FilePathField(default=3Db'/', max_le= ngth=3D1024)), - ('build', models.ForeignKey(related_name=3D'layer_version_= build', default=3DNone, to=3D'orm.Build', null=3DTrue)), - ('layer', models.ForeignKey(related_name=3D'layer_version_= layer', to=3D'orm.Layer')), + ('build', models.ForeignKey(related_name=3D'layer_version_= build', default=3DNone, to=3D'orm.Build', null=3DTrue, on_delete=3Dmodels.C= ASCADE)), + ('layer', models.ForeignKey(related_name=3D'layer_version_= layer', to=3D'orm.Layer', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -112,9 +112,9 @@ class Migration(migrations.Migration): fields=3D[ ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('up_id', models.IntegerField(default=3DNone, null=3DTrue)= ), - ('depends_on', models.ForeignKey(related_name=3D'dependees= ', to=3D'orm.Layer_Version')), - ('layer_source', models.ForeignKey(default=3DNone, to=3D'o= rm.LayerSource', null=3DTrue)), - ('layer_version', models.ForeignKey(related_name=3D'depend= encies', to=3D'orm.Layer_Version')), + ('depends_on', models.ForeignKey(related_name=3D'dependees= ', to=3D'orm.Layer_Version', on_delete=3Dmodels.CASCADE)), + ('layer_source', models.ForeignKey(default=3DNone, to=3D'o= rm.LayerSource', null=3DTrue, on_delete=3Dmodels.CASCADE)), + ('layer_version', models.ForeignKey(related_name=3D'depend= encies', to=3D'orm.Layer_Version', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -125,7 +125,7 @@ class Migration(migrations.Migration): ('message', models.TextField(null=3DTrue, blank=3DTrue)), ('pathname', models.FilePathField(max_length=3D255, blank= =3DTrue)), ('lineno', models.IntegerField(null=3DTrue)), - ('build', models.ForeignKey(to=3D'orm.Build')), + ('build', models.ForeignKey(to=3D'orm.Build', on_delete=3D= models.CASCADE)), ], ), migrations.CreateModel( @@ -136,8 +136,8 @@ class Migration(migrations.Migration): ('up_date', models.DateTimeField(default=3DNone, null=3DTr= ue)), ('name', models.CharField(max_length=3D255)), ('description', models.CharField(max_length=3D255)), - ('layer_source', models.ForeignKey(default=3DNone, to=3D'o= rm.LayerSource', null=3DTrue)), - ('layer_version', models.ForeignKey(to=3D'orm.Layer_Versio= n')), + ('layer_source', models.ForeignKey(default=3DNone, to=3D'o= rm.LayerSource', null=3DTrue, on_delete=3Dmodels.CASCADE)), + ('layer_version', models.ForeignKey(to=3D'orm.Layer_Versio= n', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -154,7 +154,7 @@ class Migration(migrations.Migration): ('installed_size', models.IntegerField(default=3D0)), ('section', models.CharField(max_length=3D80, blank=3DTrue= )), ('license', models.CharField(max_length=3D80, blank=3DTrue= )), - ('build', models.ForeignKey(to=3D'orm.Build', null=3DTrue)= ), + ('build', models.ForeignKey(to=3D'orm.Build', null=3DTrue,= on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -162,8 +162,8 @@ class Migration(migrations.Migration): fields=3D[ ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('dep_type', models.IntegerField(choices=3D[(0, b'depends'= ), (1, b'depends'), (3, b'recommends'), (2, b'recommends'), (4, b'suggests'= ), (5, b'provides'), (6, b'replaces'), (7, b'conflicts')])), - ('depends_on', models.ForeignKey(related_name=3D'package_d= ependencies_target', to=3D'orm.Package')), - ('package', models.ForeignKey(related_name=3D'package_depe= ndencies_source', to=3D'orm.Package')), + ('depends_on', models.ForeignKey(related_name=3D'package_d= ependencies_target', to=3D'orm.Package', on_delete=3Dmodels.CASCADE)), + ('package', models.ForeignKey(related_name=3D'package_depe= ndencies_source', to=3D'orm.Package', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -172,7 +172,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('path', models.FilePathField(max_length=3D255, blank=3DTr= ue)), ('size', models.IntegerField()), - ('package', models.ForeignKey(related_name=3D'buildfilelis= t_package', to=3D'orm.Package')), + ('package', models.ForeignKey(related_name=3D'buildfilelis= t_package', to=3D'orm.Package', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -185,7 +185,7 @@ class Migration(migrations.Migration): ('updated', models.DateTimeField(auto_now=3DTrue)), ('user_id', models.IntegerField(null=3DTrue)), ('is_default', models.BooleanField(default=3DFalse)), - ('bitbake_version', models.ForeignKey(to=3D'orm.BitbakeVer= sion', null=3DTrue)), + ('bitbake_version', models.ForeignKey(to=3D'orm.BitbakeVer= sion', null=3DTrue, on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -193,8 +193,8 @@ class Migration(migrations.Migration): fields=3D[ ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('optional', models.BooleanField(default=3DTrue)), - ('layercommit', models.ForeignKey(to=3D'orm.Layer_Version'= , null=3DTrue)), - ('project', models.ForeignKey(to=3D'orm.Project')), + ('layercommit', models.ForeignKey(to=3D'orm.Layer_Version'= , null=3DTrue, on_delete=3Dmodels.CASCADE)), + ('project', models.ForeignKey(to=3D'orm.Project', on_delet= e=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -203,7 +203,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('target', models.CharField(max_length=3D100)), ('task', models.CharField(max_length=3D100, null=3DTrue)), - ('project', models.ForeignKey(to=3D'orm.Project')), + ('project', models.ForeignKey(to=3D'orm.Project', on_delet= e=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -212,7 +212,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('name', models.CharField(max_length=3D100)), ('value', models.TextField(blank=3DTrue)), - ('project', models.ForeignKey(to=3D'orm.Project')), + ('project', models.ForeignKey(to=3D'orm.Project', on_delet= e=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -232,8 +232,8 @@ class Migration(migrations.Migration): ('file_path', models.FilePathField(max_length=3D255)), ('pathflags', models.CharField(max_length=3D200, blank=3DT= rue)), ('is_image', models.BooleanField(default=3DFalse)), - ('layer_source', models.ForeignKey(default=3DNone, to=3D'o= rm.LayerSource', null=3DTrue)), - ('layer_version', models.ForeignKey(related_name=3D'recipe= _layer_version', to=3D'orm.Layer_Version')), + ('layer_source', models.ForeignKey(default=3DNone, to=3D'o= rm.LayerSource', null=3DTrue, on_delete=3Dmodels.CASCADE)), + ('layer_version', models.ForeignKey(related_name=3D'recipe= _layer_version', to=3D'orm.Layer_Version', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -241,8 +241,8 @@ class Migration(migrations.Migration): fields=3D[ ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('dep_type', models.IntegerField(choices=3D[(0, b'depends'= ), (1, b'rdepends')])), - ('depends_on', models.ForeignKey(related_name=3D'r_depende= ncies_depends', to=3D'orm.Recipe')), - ('recipe', models.ForeignKey(related_name=3D'r_dependencie= s_recipe', to=3D'orm.Recipe')), + ('depends_on', models.ForeignKey(related_name=3D'r_depende= ncies_depends', to=3D'orm.Recipe', on_delete=3Dmodels.CASCADE)), + ('recipe', models.ForeignKey(related_name=3D'r_dependencie= s_recipe', to=3D'orm.Recipe', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -253,7 +253,7 @@ class Migration(migrations.Migration): ('description', models.CharField(max_length=3D255)), ('branch_name', models.CharField(default=3Db'', max_length= =3D50)), ('helptext', models.TextField(null=3DTrue)), - ('bitbake_version', models.ForeignKey(to=3D'orm.BitbakeVer= sion')), + ('bitbake_version', models.ForeignKey(to=3D'orm.BitbakeVer= sion', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -261,7 +261,7 @@ class Migration(migrations.Migration): fields=3D[ ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('layer_name', models.CharField(default=3Db'', max_length= =3D100)), - ('release', models.ForeignKey(to=3D'orm.Release')), + ('release', models.ForeignKey(to=3D'orm.Release', on_delet= e=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -269,8 +269,8 @@ class Migration(migrations.Migration): fields=3D[ ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('priority', models.IntegerField(default=3D0)), - ('layer_source', models.ForeignKey(to=3D'orm.LayerSource')= ), - ('release', models.ForeignKey(to=3D'orm.Release')), + ('layer_source', models.ForeignKey(to=3D'orm.LayerSource',= on_delete=3Dmodels.CASCADE)), + ('release', models.ForeignKey(to=3D'orm.Release', on_delet= e=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -282,7 +282,7 @@ class Migration(migrations.Migration): ('is_image', models.BooleanField(default=3DFalse)), ('image_size', models.IntegerField(default=3D0)), ('license_manifest_path', models.CharField(max_length=3D50= 0, null=3DTrue)), - ('build', models.ForeignKey(to=3D'orm.Build')), + ('build', models.ForeignKey(to=3D'orm.Build', on_delete=3D= models.CASCADE)), ], ), migrations.CreateModel( @@ -295,9 +295,9 @@ class Migration(migrations.Migration): ('permission', models.CharField(max_length=3D16)), ('owner', models.CharField(max_length=3D128)), ('group', models.CharField(max_length=3D128)), - ('directory', models.ForeignKey(related_name=3D'directory_= set', to=3D'orm.Target_File', null=3DTrue)), - ('sym_target', models.ForeignKey(related_name=3D'symlink_s= et', to=3D'orm.Target_File', null=3DTrue)), - ('target', models.ForeignKey(to=3D'orm.Target')), + ('directory', models.ForeignKey(related_name=3D'directory_= set', to=3D'orm.Target_File', null=3DTrue, on_delete=3Dmodels.CASCADE)), + ('sym_target', models.ForeignKey(related_name=3D'symlink_s= et', to=3D'orm.Target_File', null=3DTrue, on_delete=3Dmodels.CASCADE)), + ('target', models.ForeignKey(to=3D'orm.Target', on_delete= =3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -306,15 +306,15 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('file_name', models.FilePathField(max_length=3D254)), ('file_size', models.IntegerField()), - ('target', models.ForeignKey(to=3D'orm.Target')), + ('target', models.ForeignKey(to=3D'orm.Target', on_delete= =3Dmodels.CASCADE)), ], ), migrations.CreateModel( name=3D'Target_Installed_Package', fields=3D[ ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), - ('package', models.ForeignKey(related_name=3D'buildtargetl= ist_package', to=3D'orm.Package')), - ('target', models.ForeignKey(to=3D'orm.Target')), + ('package', models.ForeignKey(related_name=3D'buildtargetl= ist_package', to=3D'orm.Package', on_delete=3Dmodels.CASCADE)), + ('target', models.ForeignKey(to=3D'orm.Target', on_delete= =3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -337,8 +337,8 @@ class Migration(migrations.Migration): ('sstate_result', models.IntegerField(default=3D0, choices= =3D[(0, b'Not Applicable'), (1, b'File not in cache'), (2, b'Failed'), (3, = b'Succeeded')])), ('message', models.CharField(max_length=3D240)), ('logfile', models.FilePathField(max_length=3D255, blank= =3DTrue)), - ('build', models.ForeignKey(related_name=3D'task_build', t= o=3D'orm.Build')), - ('recipe', models.ForeignKey(related_name=3D'tasks', to=3D= 'orm.Recipe')), + ('build', models.ForeignKey(related_name=3D'task_build', t= o=3D'orm.Build', on_delete=3Dmodels.CASCADE)), + ('recipe', models.ForeignKey(related_name=3D'tasks', to=3D= 'orm.Recipe', on_delete=3Dmodels.CASCADE)), ], options=3D{ 'ordering': ('order', 'recipe'), @@ -348,8 +348,8 @@ class Migration(migrations.Migration): name=3D'Task_Dependency', fields=3D[ ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), - ('depends_on', models.ForeignKey(related_name=3D'task_depe= ndencies_depends', to=3D'orm.Task')), - ('task', models.ForeignKey(related_name=3D'task_dependenci= es_task', to=3D'orm.Task')), + ('depends_on', models.ForeignKey(related_name=3D'task_depe= ndencies_depends', to=3D'orm.Task', on_delete=3Dmodels.CASCADE)), + ('task', models.ForeignKey(related_name=3D'task_dependenci= es_task', to=3D'orm.Task', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -370,7 +370,7 @@ class Migration(migrations.Migration): ('changed', models.BooleanField(default=3DFalse)), ('human_readable_name', models.CharField(max_length=3D200)= ), ('description', models.TextField(blank=3DTrue)), - ('build', models.ForeignKey(related_name=3D'variable_build= ', to=3D'orm.Build')), + ('build', models.ForeignKey(related_name=3D'variable_build= ', to=3D'orm.Build', on_delete=3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -381,28 +381,28 @@ class Migration(migrations.Migration): ('file_name', models.FilePathField(max_length=3D255)), ('line_number', models.IntegerField(null=3DTrue)), ('operation', models.CharField(max_length=3D64)), - ('variable', models.ForeignKey(related_name=3D'vhistory', = to=3D'orm.Variable')), + ('variable', models.ForeignKey(related_name=3D'vhistory', = to=3D'orm.Variable', on_delete=3Dmodels.CASCADE)), ], ), migrations.AddField( model_name=3D'project', name=3D'release', - field=3Dmodels.ForeignKey(to=3D'orm.Release', null=3DTrue), + field=3Dmodels.ForeignKey(to=3D'orm.Release', null=3DTrue, on_= delete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'package_dependency', name=3D'target', - field=3Dmodels.ForeignKey(to=3D'orm.Target', null=3DTrue), + field=3Dmodels.ForeignKey(to=3D'orm.Target', null=3DTrue, on_d= elete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'package', name=3D'recipe', - field=3Dmodels.ForeignKey(to=3D'orm.Recipe', null=3DTrue), + field=3Dmodels.ForeignKey(to=3D'orm.Recipe', null=3DTrue, on_d= elete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'logmessage', name=3D'task', - field=3Dmodels.ForeignKey(blank=3DTrue, to=3D'orm.Task', null= =3DTrue), + field=3Dmodels.ForeignKey(blank=3DTrue, to=3D'orm.Task', null= =3DTrue, on_delete=3Dmodels.CASCADE), ), migrations.AlterUniqueTogether( name=3D'layersource', @@ -411,32 +411,32 @@ class Migration(migrations.Migration): migrations.AddField( model_name=3D'layer_version', name=3D'layer_source', - field=3Dmodels.ForeignKey(default=3DNone, to=3D'orm.LayerSourc= e', null=3DTrue), + field=3Dmodels.ForeignKey(default=3DNone, to=3D'orm.LayerSourc= e', null=3DTrue, on_delete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'layer_version', name=3D'project', - field=3Dmodels.ForeignKey(default=3DNone, to=3D'orm.Project', = null=3DTrue), + field=3Dmodels.ForeignKey(default=3DNone, to=3D'orm.Project', = null=3DTrue, on_delete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'layer_version', name=3D'up_branch', - field=3Dmodels.ForeignKey(default=3DNone, to=3D'orm.Branch', n= ull=3DTrue), + field=3Dmodels.ForeignKey(default=3DNone, to=3D'orm.Branch', n= ull=3DTrue, on_delete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'layer', name=3D'layer_source', - field=3Dmodels.ForeignKey(default=3DNone, to=3D'orm.LayerSourc= e', null=3DTrue), + field=3Dmodels.ForeignKey(default=3DNone, to=3D'orm.LayerSourc= e', null=3DTrue, on_delete=3Dmodels.CASCADE), ), migrations.AddField( model_name=3D'build', name=3D'project', - field=3Dmodels.ForeignKey(to=3D'orm.Project'), + field=3Dmodels.ForeignKey(to=3D'orm.Project', on_delete=3Dmode= ls.CASCADE), ), migrations.AddField( model_name=3D'branch', name=3D'layer_source', - field=3Dmodels.ForeignKey(default=3DTrue, to=3D'orm.LayerSourc= e', null=3DTrue), + field=3Dmodels.ForeignKey(default=3DTrue, to=3D'orm.LayerSourc= e', null=3DTrue, on_delete=3Dmodels.CASCADE), ), migrations.CreateModel( name=3D'ImportedLayerSource', diff --git a/bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py b= /bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py index 9cec82e..09c2bff 100644 --- a/bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py +++ b/bitbake/lib/toaster/orm/migrations/0002_customimagerecipe.py @@ -14,10 +14,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name=3D'CustomImageRecipe', fields=3D[ - ('recipe_ptr', models.OneToOneField(parent_link=3DTrue, au= to_created=3DTrue, primary_key=3DTrue, serialize=3DFalse, to=3D'orm.Recipe'= )), + ('recipe_ptr', models.OneToOneField(parent_link=3DTrue, au= to_created=3DTrue, primary_key=3DTrue, serialize=3DFalse, to=3D'orm.Recipe'= , on_delete=3Dmodels.CASCADE)), ('last_updated', models.DateTimeField(default=3DNone, null= =3DTrue)), - ('base_recipe', models.ForeignKey(related_name=3D'based_on= _recipe', to=3D'orm.Recipe')), - ('project', models.ForeignKey(to=3D'orm.Project')), + ('base_recipe', models.ForeignKey(related_name=3D'based_on= _recipe', to=3D'orm.Recipe', on_delete=3Dmodels.CASCADE)), + ('project', models.ForeignKey(to=3D'orm.Project', on_delet= e=3Dmodels.CASCADE)), ], bases=3D('orm.recipe',), ), diff --git a/bitbake/lib/toaster/orm/migrations/0003_customimagepackage.py = b/bitbake/lib/toaster/orm/migrations/0003_customimagepackage.py index b027f66..8cb81d7 100644 --- a/bitbake/lib/toaster/orm/migrations/0003_customimagepackage.py +++ b/bitbake/lib/toaster/orm/migrations/0003_customimagepackage.py @@ -14,7 +14,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name=3D'CustomImagePackage', fields=3D[ - ('package_ptr', models.OneToOneField(parent_link=3DTrue, a= uto_created=3DTrue, primary_key=3DTrue, serialize=3DFalse, to=3D'orm.Packag= e')), + ('package_ptr', models.OneToOneField(parent_link=3DTrue, a= uto_created=3DTrue, primary_key=3DTrue, serialize=3DFalse, to=3D'orm.Packag= e', on_delete=3Dmodels.CASCADE)), ('recipe_appends', models.ManyToManyField(related_name=3D'= appends_set', to=3D'orm.CustomImageRecipe')), ('recipe_excludes', models.ManyToManyField(related_name=3D= 'excludes_set', to=3D'orm.CustomImageRecipe')), ('recipe_includes', models.ManyToManyField(related_name=3D= 'includes_set', to=3D'orm.CustomImageRecipe')), diff --git a/bitbake/lib/toaster/orm/migrations/0004_provides.py b/bitbake/= lib/toaster/orm/migrations/0004_provides.py index dfde2d1..8449604 100644 --- a/bitbake/lib/toaster/orm/migrations/0004_provides.py +++ b/bitbake/lib/toaster/orm/migrations/0004_provides.py @@ -16,12 +16,12 @@ class Migration(migrations.Migration): fields=3D[ ('id', models.AutoField(verbose_name=3D'ID', serialize=3DF= alse, auto_created=3DTrue, primary_key=3DTrue)), ('name', models.CharField(max_length=3D100)), - ('recipe', models.ForeignKey(to=3D'orm.Recipe')), + ('recipe', models.ForeignKey(to=3D'orm.Recipe', on_delete= =3Dmodels.CASCADE)), ], ), migrations.AddField( model_name=3D'recipe_dependency', name=3D'via', - field=3Dmodels.ForeignKey(null=3DTrue, default=3DNone, to=3D'o= rm.Provides'), + field=3Dmodels.ForeignKey(null=3DTrue, default=3DNone, to=3D'o= rm.Provides', on_delete=3Dmodels.CASCADE), ), ] diff --git a/bitbake/lib/toaster/orm/migrations/0008_refactor_artifact_mode= ls.py b/bitbake/lib/toaster/orm/migrations/0008_refactor_artifact_models.py index 3367582..41a547a 100644 --- a/bitbake/lib/toaster/orm/migrations/0008_refactor_artifact_models.py +++ b/bitbake/lib/toaster/orm/migrations/0008_refactor_artifact_models.py @@ -17,7 +17,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=3DTrue, primary_key= =3DTrue, verbose_name=3D'ID', serialize=3DFalse)), ('file_name', models.FilePathField()), ('file_size', models.IntegerField()), - ('target', models.ForeignKey(to=3D'orm.Target')), + ('target', models.ForeignKey(to=3D'orm.Target', on_delete= =3Dmodels.CASCADE)), ], ), migrations.CreateModel( @@ -26,7 +26,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=3DTrue, primary_key= =3DTrue, verbose_name=3D'ID', serialize=3DFalse)), ('file_name', models.FilePathField()), ('file_size', models.IntegerField()), - ('target', models.ForeignKey(to=3D'orm.Target')), + ('target', models.ForeignKey(to=3D'orm.Target', on_delete= =3Dmodels.CASCADE)), ], ), migrations.RemoveField( diff --git a/bitbake/lib/toaster/orm/migrations/0011_delete_layersource.py = b/bitbake/lib/toaster/orm/migrations/0011_delete_layersource.py index 7550696..3f3a2e1 100644 --- a/bitbake/lib/toaster/orm/migrations/0011_delete_layersource.py +++ b/bitbake/lib/toaster/orm/migrations/0011_delete_layersource.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals =20 -from django.db import migrations, models +from django.db import migrations =20 =20 class Migration(migrations.Migration): diff --git a/bitbake/lib/toaster/orm/migrations/0012_use_release_instead_of= _up_branch.py b/bitbake/lib/toaster/orm/migrations/0012_use_release_instead= _of_up_branch.py index 0e6bb83..4b96bf0 100644 --- a/bitbake/lib/toaster/orm/migrations/0012_use_release_instead_of_up_bra= nch.py +++ b/bitbake/lib/toaster/orm/migrations/0012_use_release_instead_of_up_bra= nch.py @@ -46,7 +46,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name=3D'layer_version', name=3D'release', - field=3Dmodels.ForeignKey(to=3D'orm.Release', default=3DNone, = null=3DTrue), + field=3Dmodels.ForeignKey(to=3D'orm.Release', default=3DNone, = null=3DTrue, on_delete=3Dmodels.CASCADE), ), migrations.RunPython(branch_to_release, reverse_code=3Dmigrations.RunPython.noop), diff --git a/bitbake/lib/toaster/orm/migrations/0017_distro_clone.py b/bitb= ake/lib/toaster/orm/migrations/0017_distro_clone.py index d3c5901..731c0de 100644 --- a/bitbake/lib/toaster/orm/migrations/0017_distro_clone.py +++ b/bitbake/lib/toaster/orm/migrations/0017_distro_clone.py @@ -18,7 +18,7 @@ class Migration(migrations.Migration): ('up_date', models.DateTimeField(default=3DNone, null=3DTr= ue)), ('name', models.CharField(max_length=3D255)), ('description', models.CharField(max_length=3D255)), - ('layer_version', models.ForeignKey(to=3D'orm.Layer_Versio= n')), + ('layer_version', models.ForeignKey(to=3D'orm.Layer_Versio= n', on_delete=3Dmodels.CASCADE)), ], ), ] diff --git a/bitbake/lib/toaster/orm/migrations/0019_django_2_2.py b/bitbak= e/lib/toaster/orm/migrations/0019_django_2_2.py new file mode 100644 index 0000000..666aef1 --- /dev/null +++ b/bitbake/lib/toaster/orm/migrations/0019_django_2_2.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.7 on 2019-11-19 03:38 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies =3D [ + ('orm', '0018_project_specific'), + ] + + operations =3D [ + migrations.RemoveField( + model_name=3D'distro', + name=3D'up_id', + ), + migrations.AlterField( + model_name=3D'build', + name=3D'recipes_parsed', + field=3Dmodels.IntegerField(default=3D1), + ), + ] diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/mo= dels.py index bb6b5de..7f7e922 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py @@ -13,7 +13,7 @@ from django.db.models import F, Q, Sum, Count from django.utils import timezone from django.utils.encoding import force_bytes =20 -from django.core.urlresolvers import reverse +from django.urls import reverse =20 from django.core import validators from django.conf import settings @@ -178,8 +178,8 @@ class Project(models.Model): 'release__branch_name'] name =3D models.CharField(max_length=3D100) short_description =3D models.CharField(max_length=3D50, blank=3DTrue) - bitbake_version =3D models.ForeignKey('BitbakeVersion', null=3DTrue) - release =3D models.ForeignKey("Release", null=3DTrue) + bitbake_version =3D models.ForeignKey('BitbakeVersion', on_delete=3Dmo= dels.CASCADE, null=3DTrue) + release =3D models.ForeignKey("Release", on_delete=3Dmodels.CASCADE, n= ull=3DTrue) created =3D models.DateTimeField(auto_now_add=3DTrue) updated =3D models.DateTimeField(auto_now=3DTrue) # This is a horrible hack; since Toaster has no "User" model available= when @@ -469,7 +469,7 @@ class Build(models.Model): =20 search_allowed_fields =3D ['machine', 'cooker_log_path', "target__targ= et", "target__target_image_file__file_name"] =20 - project =3D models.ForeignKey(Project) # must have a projec= t + project =3D models.ForeignKey(Project, on_delete=3Dmodels.CASCADE) = # must have a project machine =3D models.CharField(max_length=3D100) distro =3D models.CharField(max_length=3D100) distro_version =3D models.CharField(max_length=3D100) @@ -777,13 +777,13 @@ class Build(models.Model): return "%d %s %s" % (self.id, self.project, ",".join([t.target for= t in self.target_set.all()])) =20 class ProjectTarget(models.Model): - project =3D models.ForeignKey(Project) + project =3D models.ForeignKey(Project, on_delete=3Dmodels.CASCADE) target =3D models.CharField(max_length=3D100) task =3D models.CharField(max_length=3D100, null=3DTrue) =20 class Target(models.Model): search_allowed_fields =3D ['target', 'file_name'] - build =3D models.ForeignKey(Build) + build =3D models.ForeignKey(Build, on_delete=3Dmodels.CASCADE) target =3D models.CharField(max_length=3D100) task =3D models.CharField(max_length=3D100, null=3DTrue) is_image =3D models.BooleanField(default =3D False) @@ -944,7 +944,7 @@ class Target(models.Model): =20 # kernel artifacts for a target: bzImage and modules* class TargetKernelFile(models.Model): - target =3D models.ForeignKey(Target) + target =3D models.ForeignKey(Target, on_delete=3Dmodels.CASCADE) file_name =3D models.FilePathField() file_size =3D models.IntegerField() =20 @@ -954,7 +954,7 @@ class TargetKernelFile(models.Model): =20 # SDK artifacts for a target: sh and manifest files class TargetSDKFile(models.Model): - target =3D models.ForeignKey(Target) + target =3D models.ForeignKey(Target, on_delete=3Dmodels.CASCADE) file_name =3D models.FilePathField() file_size =3D models.IntegerField() =20 @@ -973,7 +973,7 @@ class Target_Image_File(models.Model): 'ubifs', 'wic', 'wic.bz2', 'wic.gz', 'wic.lzma' } =20 - target =3D models.ForeignKey(Target) + target =3D models.ForeignKey(Target, on_delete=3Dmodels.CASCADE) file_name =3D models.FilePathField(max_length=3D254) file_size =3D models.IntegerField() =20 @@ -1007,15 +1007,15 @@ class Target_File(models.Model): ( ITYPE_BLOCK ,'block'), ) =20 - target =3D models.ForeignKey(Target) + target =3D models.ForeignKey(Target, on_delete=3Dmodels.CASCADE) path =3D models.FilePathField() size =3D models.IntegerField() inodetype =3D models.IntegerField(choices =3D ITYPES) permission =3D models.CharField(max_length=3D16) owner =3D models.CharField(max_length=3D128) group =3D models.CharField(max_length=3D128) - directory =3D models.ForeignKey('Target_File', related_name=3D"directo= ry_set", null=3DTrue) - sym_target =3D models.ForeignKey('Target_File', related_name=3D"symlin= k_set", null=3DTrue) + directory =3D models.ForeignKey('Target_File', on_delete=3Dmodels.CASC= ADE, related_name=3D"directory_set", null=3DTrue) + sym_target =3D models.ForeignKey('Target_File', on_delete=3Dmodels.CAS= CADE, related_name=3D"symlink_set", null=3DTrue) =20 =20 class Task(models.Model): @@ -1102,13 +1102,13 @@ class Task(models.Model): def get_description(self): return self._helptext =20 - build =3D models.ForeignKey(Build, related_name=3D'task_build') + build =3D models.ForeignKey(Build, on_delete=3Dmodels.CASCADE, related= _name=3D'task_build') order =3D models.IntegerField(null=3DTrue) task_executed =3D models.BooleanField(default=3DFalse) # True means Ex= ecuted, False means Not/Executed outcome =3D models.IntegerField(choices=3DTASK_OUTCOME, default=3DOUTC= OME_NA) sstate_checksum =3D models.CharField(max_length=3D100, blank=3DTrue) path_to_sstate_obj =3D models.FilePathField(max_length=3D500, blank=3D= True) - recipe =3D models.ForeignKey('Recipe', related_name=3D'tasks') + recipe =3D models.ForeignKey('Recipe', on_delete=3Dmodels.CASCADE, rel= ated_name=3D'tasks') task_name =3D models.CharField(max_length=3D100) source_url =3D models.FilePathField(max_length=3D255, blank=3DTrue) work_directory =3D models.FilePathField(max_length=3D255, blank=3DTrue= ) @@ -1147,13 +1147,13 @@ class Task(models.Model): =20 =20 class Task_Dependency(models.Model): - task =3D models.ForeignKey(Task, related_name=3D'task_dependencies_tas= k') - depends_on =3D models.ForeignKey(Task, related_name=3D'task_dependenci= es_depends') + task =3D models.ForeignKey(Task, on_delete=3Dmodels.CASCADE, related_n= ame=3D'task_dependencies_task') + depends_on =3D models.ForeignKey(Task, on_delete=3Dmodels.CASCADE, rel= ated_name=3D'task_dependencies_depends') =20 class Package(models.Model): search_allowed_fields =3D ['name', 'version', 'revision', 'recipe__nam= e', 'recipe__version', 'recipe__license', 'recipe__layer_version__layer__na= me', 'recipe__layer_version__branch', 'recipe__layer_version__commit', 'rec= ipe__layer_version__local_path', 'installed_name'] - build =3D models.ForeignKey('Build', null=3DTrue) - recipe =3D models.ForeignKey('Recipe', null=3DTrue) + build =3D models.ForeignKey('Build', on_delete=3Dmodels.CASCADE, null= =3DTrue) + recipe =3D models.ForeignKey('Recipe', on_delete=3Dmodels.CASCADE, nul= l=3DTrue) name =3D models.CharField(max_length=3D100) installed_name =3D models.CharField(max_length=3D100, default=3D'') version =3D models.CharField(max_length=3D100, blank=3DTrue) @@ -1289,19 +1289,19 @@ class Package_Dependency(models.Model): TYPE_RCONFLICTS : ("conflicts", "%s conflicts with %s, which wil= l not be installed if this package is not first removed"), } =20 - package =3D models.ForeignKey(Package, related_name=3D'package_depende= ncies_source') - depends_on =3D models.ForeignKey(Package, related_name=3D'package_depe= ndencies_target') # soft dependency + package =3D models.ForeignKey(Package, on_delete=3Dmodels.CASCADE, rel= ated_name=3D'package_dependencies_source') + depends_on =3D models.ForeignKey(Package, on_delete=3Dmodels.CASCADE, = related_name=3D'package_dependencies_target') # soft dependency dep_type =3D models.IntegerField(choices=3DDEPENDS_TYPE) - target =3D models.ForeignKey(Target, null=3DTrue) + target =3D models.ForeignKey(Target, on_delete=3Dmodels.CASCADE, null= =3DTrue) objects =3D Package_DependencyManager() =20 class Target_Installed_Package(models.Model): - target =3D models.ForeignKey(Target) - package =3D models.ForeignKey(Package, related_name=3D'buildtargetlist= _package') + target =3D models.ForeignKey(Target, on_delete=3Dmodels.CASCADE) + package =3D models.ForeignKey(Package, on_delete=3Dmodels.CASCADE, rel= ated_name=3D'buildtargetlist_package') =20 =20 class Package_File(models.Model): - package =3D models.ForeignKey(Package, related_name=3D'buildfilelist_p= ackage') + package =3D models.ForeignKey(Package, on_delete=3Dmodels.CASCADE, rel= ated_name=3D'buildfilelist_package') path =3D models.FilePathField(max_length=3D255, blank=3DTrue) size =3D models.IntegerField() =20 @@ -1318,7 +1318,7 @@ class Recipe(models.Model): =20 name =3D models.CharField(max_length=3D100, blank=3DTrue) version =3D models.CharField(max_length=3D100, blank=3DTrue) - layer_version =3D models.ForeignKey('Layer_Version', + layer_version =3D models.ForeignKey('Layer_Version', on_delete=3Dmodel= s.CASCADE, related_name=3D'recipe_layer_version= ') summary =3D models.TextField(blank=3DTrue) description =3D models.TextField(blank=3DTrue) @@ -1356,7 +1356,7 @@ class Recipe_DependencyManager(models.Manager): =20 class Provides(models.Model): name =3D models.CharField(max_length=3D100) - recipe =3D models.ForeignKey(Recipe) + recipe =3D models.ForeignKey(Recipe, on_delete=3Dmodels.CASCADE) =20 class Recipe_Dependency(models.Model): TYPE_DEPENDS =3D 0 @@ -1366,9 +1366,9 @@ class Recipe_Dependency(models.Model): (TYPE_DEPENDS, "depends"), (TYPE_RDEPENDS, "rdepends"), ) - recipe =3D models.ForeignKey(Recipe, related_name=3D'r_dependencies_re= cipe') - depends_on =3D models.ForeignKey(Recipe, related_name=3D'r_dependencie= s_depends') - via =3D models.ForeignKey(Provides, null=3DTrue, default=3DNone) + recipe =3D models.ForeignKey(Recipe, on_delete=3Dmodels.CASCADE, relat= ed_name=3D'r_dependencies_recipe') + depends_on =3D models.ForeignKey(Recipe, on_delete=3Dmodels.CASCADE, r= elated_name=3D'r_dependencies_depends') + via =3D models.ForeignKey(Provides, on_delete=3Dmodels.CASCADE, null= =3DTrue, default=3DNone) dep_type =3D models.IntegerField(choices=3DDEPENDS_TYPE) objects =3D Recipe_DependencyManager() =20 @@ -1377,7 +1377,7 @@ class Machine(models.Model): search_allowed_fields =3D ["name", "description", "layer_version__laye= r__name"] up_date =3D models.DateTimeField(null =3D True, default =3D None) =20 - layer_version =3D models.ForeignKey('Layer_Version') + layer_version =3D models.ForeignKey('Layer_Version', on_delete=3Dmodel= s.CASCADE) name =3D models.CharField(max_length=3D255) description =3D models.CharField(max_length=3D255) =20 @@ -1408,7 +1408,7 @@ class Release(models.Model): """ A release is a project template, used to pre-populate Project sett= ings with a configuration set """ name =3D models.CharField(max_length=3D32, unique =3D True) description =3D models.CharField(max_length=3D255) - bitbake_version =3D models.ForeignKey(BitbakeVersion) + bitbake_version =3D models.ForeignKey(BitbakeVersion, on_delete=3Dmode= ls.CASCADE) branch_name =3D models.CharField(max_length=3D50, default =3D "") helptext =3D models.TextField(null=3DTrue) =20 @@ -1419,7 +1419,7 @@ class Release(models.Model): return self.name =20 class ReleaseDefaultLayer(models.Model): - release =3D models.ForeignKey(Release) + release =3D models.ForeignKey(Release, on_delete=3Dmodels.CASCADE) layer_name =3D models.CharField(max_length=3D100, default=3D"") =20 =20 @@ -1474,10 +1474,10 @@ class Layer_Version(models.Model): "layer__description", "layer__vcs_url", "dirpath", "release__name", "commit", "branch= "] =20 - build =3D models.ForeignKey(Build, related_name=3D'layer_version_build= ', + build =3D models.ForeignKey(Build, on_delete=3Dmodels.CASCADE, related= _name=3D'layer_version_build', default=3DNone, null=3DTrue) =20 - layer =3D models.ForeignKey(Layer, related_name=3D'layer_version_layer= ') + layer =3D models.ForeignKey(Layer, on_delete=3Dmodels.CASCADE, related= _name=3D'layer_version_layer') =20 layer_source =3D models.IntegerField(choices=3DLayerSource.SOURCE_TYPE= , default=3D0) @@ -1485,7 +1485,7 @@ class Layer_Version(models.Model): up_date =3D models.DateTimeField(null=3DTrue, default=3Dtimezone.now) =20 # To which metadata release does this layer version belong to - release =3D models.ForeignKey(Release, null=3DTrue, default=3DNone) + release =3D models.ForeignKey(Release, on_delete=3Dmodels.CASCADE, nul= l=3DTrue, default=3DNone) =20 branch =3D models.CharField(max_length=3D80) commit =3D models.CharField(max_length=3D100) @@ -1499,7 +1499,7 @@ class Layer_Version(models.Model): local_path =3D models.FilePathField(max_length=3D1024, default=3D"/") =20 # Set if this layer is restricted to a particular project - project =3D models.ForeignKey('Project', null=3DTrue, default=3DNone) + project =3D models.ForeignKey('Project', on_delete=3Dmodels.CASCADE, n= ull=3DTrue, default=3DNone) =20 # code lifted, with adaptations, from the layerindex-web application # https://git.yoctoproject.org/cgit/cgit.cgi/layerindex-web/ @@ -1608,14 +1608,14 @@ class Layer_Version(models.Model): =20 class LayerVersionDependency(models.Model): =20 - layer_version =3D models.ForeignKey(Layer_Version, + layer_version =3D models.ForeignKey(Layer_Version, on_delete=3Dmodels.= CASCADE, related_name=3D"dependencies") - depends_on =3D models.ForeignKey(Layer_Version, + depends_on =3D models.ForeignKey(Layer_Version, on_delete=3Dmodels.CAS= CADE, related_name=3D"dependees") =20 class ProjectLayer(models.Model): - project =3D models.ForeignKey(Project) - layercommit =3D models.ForeignKey(Layer_Version, null=3DTrue) + project =3D models.ForeignKey(Project, on_delete=3Dmodels.CASCADE) + layercommit =3D models.ForeignKey(Layer_Version, on_delete=3Dmodels.CA= SCADE, null=3DTrue) optional =3D models.BooleanField(default =3D True) =20 def __unicode__(self): @@ -1630,8 +1630,8 @@ class CustomImageRecipe(Recipe): LAYER_NAME =3D "toaster-custom-images" =20 search_allowed_fields =3D ['name'] - base_recipe =3D models.ForeignKey(Recipe, related_name=3D'based_on_rec= ipe') - project =3D models.ForeignKey(Project) + base_recipe =3D models.ForeignKey(Recipe, on_delete=3Dmodels.CASCADE, = related_name=3D'based_on_recipe') + project =3D models.ForeignKey(Project, on_delete=3Dmodels.CASCADE) last_updated =3D models.DateTimeField(null=3DTrue, default=3DNone) =20 def get_last_successful_built_target(self): @@ -1647,14 +1647,14 @@ class CustomImageRecipe(Recipe): """ # Check if we're aldready up-to-date or not target =3D self.get_last_successful_built_target() - if target =3D=3D None: + if target is None: # So we've never actually built this Custom recipe but what ab= out # the recipe it's based on? target =3D \ Target.objects.filter(Q(build__outcome=3DBuild.SUCCEEDED) = & Q(build__project=3Dself.project) & Q(target=3Dself.base_recipe.name)).l= ast() - if target =3D=3D None: + if target is None: return =20 if target.build.completed_on =3D=3D self.last_updated: @@ -1784,14 +1784,14 @@ class CustomImageRecipe(Recipe): return recipe_contents =20 class ProjectVariable(models.Model): - project =3D models.ForeignKey(Project) + project =3D models.ForeignKey(Project, on_delete=3Dmodels.CASCADE) name =3D models.CharField(max_length=3D100) value =3D models.TextField(blank =3D True) =20 class Variable(models.Model): search_allowed_fields =3D ['variable_name', 'variable_value', 'vhistory__file_name', "description"] - build =3D models.ForeignKey(Build, related_name=3D'variable_build') + build =3D models.ForeignKey(Build, on_delete=3Dmodels.CASCADE, related= _name=3D'variable_build') variable_name =3D models.CharField(max_length=3D100) variable_value =3D models.TextField(blank=3DTrue) changed =3D models.BooleanField(default=3DFalse) @@ -1799,7 +1799,7 @@ class Variable(models.Model): description =3D models.TextField(blank=3DTrue) =20 class VariableHistory(models.Model): - variable =3D models.ForeignKey(Variable, related_name=3D'vhistory') + variable =3D models.ForeignKey(Variable, on_delete=3Dmodels.CASCADE, r= elated_name=3D'vhistory') value =3D models.TextField(blank=3DTrue) file_name =3D models.FilePathField(max_length=3D255) line_number =3D models.IntegerField(null=3DTrue) @@ -1809,7 +1809,7 @@ class HelpText(models.Model): VARIABLE =3D 0 HELPTEXT_AREA =3D ((VARIABLE, 'variable'), ) =20 - build =3D models.ForeignKey(Build, related_name=3D'helptext_build') + build =3D models.ForeignKey(Build, on_delete=3Dmodels.CASCADE, related= _name=3D'helptext_build') area =3D models.IntegerField(choices=3DHELPTEXT_AREA) key =3D models.CharField(max_length=3D100) text =3D models.TextField() @@ -1829,8 +1829,8 @@ class LogMessage(models.Model): (EXCEPTION, "toaster exception") ) =20 - build =3D models.ForeignKey(Build) - task =3D models.ForeignKey(Task, blank =3D True, null=3DTrue) + build =3D models.ForeignKey(Build, on_delete=3Dmodels.CASCADE) + task =3D models.ForeignKey(Task, on_delete=3Dmodels.CASCADE, blank = =3D True, null=3DTrue) level =3D models.IntegerField(choices=3DLOG_LEVEL, default=3DINFO) message =3D models.TextField(blank=3DTrue, null=3DTrue) pathname =3D models.FilePathField(max_length=3D255, blank=3DTrue) @@ -1859,7 +1859,7 @@ class Distro(models.Model): search_allowed_fields =3D ["name", "description", "layer_version__laye= r__name"] up_date =3D models.DateTimeField(null =3D True, default =3D None) =20 - layer_version =3D models.ForeignKey('Layer_Version') + layer_version =3D models.ForeignKey('Layer_Version', on_delete=3Dmodel= s.CASCADE) name =3D models.CharField(max_length=3D255) description =3D models.CharField(max_length=3D255) =20 diff --git a/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py b/b= itbake/lib/toaster/tests/browser/selenium_helpers_base.py index 6c94684..644d45f 100644 --- a/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py +++ b/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py @@ -19,7 +19,6 @@ import os import time import unittest =20 -from django.contrib.staticfiles.testing import StaticLiveServerTestCase from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.desired_capabilities import DesiredCapabili= ties diff --git a/bitbake/lib/toaster/tests/browser/test_all_builds_page.py b/bi= tbake/lib/toaster/tests/browser/test_all_builds_page.py index fba627b..8423d3d 100644 --- a/bitbake/lib/toaster/tests/browser/test_all_builds_page.py +++ b/bitbake/lib/toaster/tests/browser/test_all_builds_page.py @@ -9,7 +9,7 @@ =20 import re =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase =20 diff --git a/bitbake/lib/toaster/tests/browser/test_all_projects_page.py b/= bitbake/lib/toaster/tests/browser/test_all_projects_page.py index afd2d35..15b0340 100644 --- a/bitbake/lib/toaster/tests/browser/test_all_projects_page.py +++ b/bitbake/lib/toaster/tests/browser/test_all_projects_page.py @@ -9,7 +9,7 @@ =20 import re =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase =20 diff --git a/bitbake/lib/toaster/tests/browser/test_builddashboard_page.py = b/bitbake/lib/toaster/tests/browser/test_builddashboard_page.py index d972aff..efcd89b 100644 --- a/bitbake/lib/toaster/tests/browser/test_builddashboard_page.py +++ b/bitbake/lib/toaster/tests/browser/test_builddashboard_page.py @@ -7,7 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone =20 from tests.browser.selenium_helpers import SeleniumTestCase diff --git a/bitbake/lib/toaster/tests/browser/test_builddashboard_page_art= ifacts.py b/bitbake/lib/toaster/tests/browser/test_builddashboard_page_arti= facts.py index e2623e8..c6226d6 100644 --- a/bitbake/lib/toaster/tests/browser/test_builddashboard_page_artifacts.= py +++ b/bitbake/lib/toaster/tests/browser/test_builddashboard_page_artifacts.= py @@ -7,7 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone =20 from tests.browser.selenium_helpers import SeleniumTestCase diff --git a/bitbake/lib/toaster/tests/browser/test_builddashboard_page_rec= ipes.py b/bitbake/lib/toaster/tests/browser/test_builddashboard_page_recipe= s.py index c542d45..9d85ba9 100644 --- a/bitbake/lib/toaster/tests/browser/test_builddashboard_page_recipes.py +++ b/bitbake/lib/toaster/tests/browser/test_builddashboard_page_recipes.py @@ -7,7 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase from orm.models import Project, Build, Recipe, Task, Layer, Layer_Version diff --git a/bitbake/lib/toaster/tests/browser/test_builddashboard_page_tas= ks.py b/bitbake/lib/toaster/tests/browser/test_builddashboard_page_tasks.py index 22acb47..7fdf75d 100644 --- a/bitbake/lib/toaster/tests/browser/test_builddashboard_page_tasks.py +++ b/bitbake/lib/toaster/tests/browser/test_builddashboard_page_tasks.py @@ -7,7 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase from orm.models import Project, Build, Recipe, Task, Layer, Layer_Version diff --git a/bitbake/lib/toaster/tests/browser/test_js_unit_tests.py b/bitb= ake/lib/toaster/tests/browser/test_js_unit_tests.py index e8b4295..e6163bb 100644 --- a/bitbake/lib/toaster/tests/browser/test_js_unit_tests.py +++ b/bitbake/lib/toaster/tests/browser/test_js_unit_tests.py @@ -11,7 +11,7 @@ Run the js unit tests """ =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase import logging =20 diff --git a/bitbake/lib/toaster/tests/browser/test_landing_page.py b/bitba= ke/lib/toaster/tests/browser/test_landing_page.py index 0790198..8bb64b9 100644 --- a/bitbake/lib/toaster/tests/browser/test_landing_page.py +++ b/bitbake/lib/toaster/tests/browser/test_landing_page.py @@ -7,7 +7,7 @@ # Copyright (C) 2013-2016 Intel Corporation # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase =20 diff --git a/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py b/= bitbake/lib/toaster/tests/browser/test_layerdetails_page.py index f81e696..71bdd2a 100644 --- a/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py +++ b/bitbake/lib/toaster/tests/browser/test_layerdetails_page.py @@ -7,7 +7,7 @@ # Copyright (C) 2013-2016 Intel Corporation # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase =20 from orm.models import Layer, Layer_Version, Project, LayerSource, Release diff --git a/bitbake/lib/toaster/tests/browser/test_most_recent_builds_stat= es.py b/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py index 15d25dc..7844aaa 100644 --- a/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py +++ b/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.py @@ -7,7 +7,7 @@ # Copyright (C) 2013-2016 Intel Corporation # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase from tests.browser.selenium_helpers_base import Wait diff --git a/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.p= y b/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py index 0aa3b7a..9906ae4 100644 --- a/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py +++ b/bitbake/lib/toaster/tests/browser/test_new_custom_image_page.py @@ -7,7 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase =20 from orm.models import BitbakeVersion, Release, Project, ProjectLayer, Lay= er diff --git a/bitbake/lib/toaster/tests/browser/test_new_project_page.py b/b= itbake/lib/toaster/tests/browser/test_new_project_page.py index 8e56bb0..e20a1f6 100644 --- a/bitbake/lib/toaster/tests/browser/test_new_project_page.py +++ b/bitbake/lib/toaster/tests/browser/test_new_project_page.py @@ -7,7 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase from selenium.webdriver.support.ui import Select from selenium.common.exceptions import InvalidElementStateException diff --git a/bitbake/lib/toaster/tests/browser/test_project_builds_page.py = b/bitbake/lib/toaster/tests/browser/test_project_builds_page.py index 47fb10b..51717e7 100644 --- a/bitbake/lib/toaster/tests/browser/test_project_builds_page.py +++ b/bitbake/lib/toaster/tests/browser/test_project_builds_page.py @@ -9,7 +9,7 @@ =20 import re =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase =20 diff --git a/bitbake/lib/toaster/tests/browser/test_project_config_page.py = b/bitbake/lib/toaster/tests/browser/test_project_config_page.py index 2816eb9..944bcb2 100644 --- a/bitbake/lib/toaster/tests/browser/test_project_config_page.py +++ b/bitbake/lib/toaster/tests/browser/test_project_config_page.py @@ -7,10 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -import re - -from django.core.urlresolvers import reverse -from django.utils import timezone +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase =20 from orm.models import BitbakeVersion, Release, Project, ProjectVariable @@ -216,4 +213,5 @@ class TestProjectConfigsPage(SeleniumTestCase): =20 hidden_element =3D self.driver.find_element_by_id('hintError-sstat= e_dir') self.assertEqual(hidden_element.is_displayed(), False, - 'sstate directory path valid but treated as invalid') \ No newline at end of file + 'sstate directory path valid but treated as invalid') + diff --git a/bitbake/lib/toaster/tests/browser/test_project_page.py b/bitba= ke/lib/toaster/tests/browser/test_project_page.py index 8b5e1b6..546293f 100644 --- a/bitbake/lib/toaster/tests/browser/test_project_page.py +++ b/bitbake/lib/toaster/tests/browser/test_project_page.py @@ -7,7 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase =20 diff --git a/bitbake/lib/toaster/tests/browser/test_sample.py b/bitbake/lib= /toaster/tests/browser/test_sample.py index f4ad670..b0067c2 100644 --- a/bitbake/lib/toaster/tests/browser/test_sample.py +++ b/bitbake/lib/toaster/tests/browser/test_sample.py @@ -16,7 +16,7 @@ New test files should follow this structure, should be na= med "test_*.py", and should be in the same directory as this sample. """ =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase =20 class TestSample(SeleniumTestCase): diff --git a/bitbake/lib/toaster/tests/browser/test_task_page.py b/bitbake/= lib/toaster/tests/browser/test_task_page.py index 26f3dca..011b585 100644 --- a/bitbake/lib/toaster/tests/browser/test_task_page.py +++ b/bitbake/lib/toaster/tests/browser/test_task_page.py @@ -7,7 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase from orm.models import Project, Build, Layer, Layer_Version, Recipe, Targe= t diff --git a/bitbake/lib/toaster/tests/browser/test_toastertable_ui.py b/bi= tbake/lib/toaster/tests/browser/test_toastertable_ui.py index ef78cbb..e82d5ec 100644 --- a/bitbake/lib/toaster/tests/browser/test_toastertable_ui.py +++ b/bitbake/lib/toaster/tests/browser/test_toastertable_ui.py @@ -9,7 +9,7 @@ =20 from datetime import datetime =20 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase from orm.models import BitbakeVersion, Release, Project, Build diff --git a/bitbake/lib/toaster/tests/functional/test_functional_basic.py = b/bitbake/lib/toaster/tests/functional/test_functional_basic.py index 56c84fb..5683e38 100644 --- a/bitbake/lib/toaster/tests/functional/test_functional_basic.py +++ b/bitbake/lib/toaster/tests/functional/test_functional_basic.py @@ -7,7 +7,6 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -import time import re from tests.functional.functional_helpers import SeleniumFunctionalTestCase from orm.models import Project diff --git a/bitbake/lib/toaster/tests/views/test_views.py b/bitbake/lib/to= aster/tests/views/test_views.py index 68d9e9d..735d596 100644 --- a/bitbake/lib/toaster/tests/views/test_views.py +++ b/bitbake/lib/toaster/tests/views/test_views.py @@ -11,7 +11,7 @@ =20 from django.test import TestCase from django.test.client import RequestFactory -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import Q =20 from orm.models import Project, Package diff --git a/bitbake/lib/toaster/toastergui/api.py b/bitbake/lib/toaster/to= astergui/api.py index 8b49b3e..b4cdc33 100644 --- a/bitbake/lib/toaster/toastergui/api.py +++ b/bitbake/lib/toaster/toastergui/api.py @@ -13,7 +13,6 @@ import logging import json import subprocess from collections import Counter -from shutil import copyfile =20 from orm.models import Project, ProjectTarget, Build, Layer_Version from orm.models import LayerVersionDependency, LayerSource, ProjectLayer @@ -25,12 +24,10 @@ from bldcontrol import bbcontroller =20 from django.http import HttpResponse, JsonResponse from django.views.generic import View -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import Q, F from django.db import Error from toastergui.templatetags.projecttags import filtered_filesizeformat -from django.utils import timezone -import pytz =20 # development/debugging support verbose =3D 2 diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster= /toastergui/tables.py index b3ea222..528dd32 100644 --- a/bitbake/lib/toaster/toastergui/tables.py +++ b/bitbake/lib/toaster/toastergui/tables.py @@ -7,15 +7,10 @@ # =20 from toastergui.widgets import ToasterTable -from orm.models import Recipe, ProjectLayer, Layer_Version, Machine, Proje= ct +from orm.models import Recipe, ProjectLayer, Layer_Version, Project from orm.models import CustomImageRecipe, Package, Target, Build, LogMessa= ge, Task from orm.models import CustomImagePackage, Package_DependencyManager -from orm.models import Distro -from django.db.models import Q, Max, Sum, Count, When, Case, Value, Intege= rField -from django.conf.urls import url -from django.core.urlresolvers import reverse, resolve -from django.http import HttpResponse -from django.views.generic import TemplateView +from django.db.models import Q, Sum, Count, When, Case, Value, IntegerFiel= d =20 from toastergui.tablefilter import TableFilter from toastergui.tablefilter import TableFilterActionToggle diff --git a/bitbake/lib/toaster/toastergui/templatetags/objects_to_diction= aries_filter.py b/bitbake/lib/toaster/toastergui/templatetags/objects_to_di= ctionaries_filter.py index 048d533..e242234 100644 --- a/bitbake/lib/toaster/toastergui/templatetags/objects_to_dictionaries_f= ilter.py +++ b/bitbake/lib/toaster/toastergui/templatetags/objects_to_dictionaries_f= ilter.py @@ -3,7 +3,6 @@ # =20 from django import template -import json =20 register =3D template.Library() =20 diff --git a/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py= b/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py index 71e0925..7b6f15b 100644 --- a/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py +++ b/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py @@ -3,7 +3,7 @@ # =20 from django import template -from django.core.urlresolvers import reverse +from django.urls import reverse =20 register =3D template.Library() =20 diff --git a/bitbake/lib/toaster/toastergui/templatetags/projecttags.py b/b= itbake/lib/toaster/toastergui/templatetags/projecttags.py index 1dbab3b..c432f59 100644 --- a/bitbake/lib/toaster/toastergui/templatetags/projecttags.py +++ b/bitbake/lib/toaster/toastergui/templatetags/projecttags.py @@ -6,7 +6,7 @@ # SPDX-License-Identifier: GPL-2.0-only # =20 -from datetime import datetime, timedelta +from datetime import timedelta from os.path import relpath import re from django import template @@ -44,7 +44,7 @@ def json(value, default =3D None): # it manually here return mark_safe(JsonLib.dumps(value, indent=3D2, default =3D default,= ensure_ascii=3DFalse).replace('1.8,<1.12 +Django>2.2,<2.3 beautifulsoup4>=3D4.4.0 pytz --=20 2.17.1