From patchwork Mon Aug 17 08:00:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Vijai Kumar K X-Patchwork-Id: 6 Return-Path: Delivered-To: ilbers.mnt@gmail.com Received: by 2002:a05:7000:6242:0:0:0:0 with SMTP id v2csp2587127mad; Mon, 17 Aug 2020 09:00:47 -0700 (PDT) X-Received: by 2002:a67:3354:: with SMTP id z81mr8351101vsz.39.1597680046462; Mon, 17 Aug 2020 09:00:46 -0700 (PDT) ARC-Seal: i=3; a=rsa-sha256; t=1597680046; cv=pass; d=google.com; s=arc-20160816; b=gGbhbUD88V9Fu/Dt+9pWy70/+5PNb5X1//780skQSkb3rOQ700AMWrzhYxEJZyUZoI tRSO7I+yFQKxUDPRSqWeNFauKc/3zxNhugMSC9CVvcHn6G6ImgWpSgS/nTVWCaO1Ncay Llit1AfHMQ5TYWXkFEsRBk9hFIuc8hRk+UPzuc4MHatl9QJ0gA9L+aCLPo0pmYh5eXrn hhLbU3QmerBurj3V0ZFFHmpMWs+K87fbkHmo/gqZDgXwalRaPs24gq11CFPzKxx0/iG/ gJIIAmA0IG36iMZ8gIfGlRen32AT4cD5Ri/+goFSvmcTV4zKmZ7Woiu9QoTfIc5jWvqC fTdQ== ARC-Message-Signature: i=3; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:ironport-sdr:ironport-sdr:sender:dkim-signature; bh=zbHOvQgzwVFlDips2Kv7GQCq7LnAD8fKdhRVv6+rMfw=; b=C/CpGDmAXUJKlyTXzvRHIJV/woZJGGIc3snEBq2aahjb/9cpDv06BvlZ5sVodkKoy3 4oa6bjFQ+vQYwUd/hyAiFQeEqzX4Bv1SvPy91GtQwxd6hAawnkGeW1mKvJyEee5WZQ4C JfeOBKE6rupqW/EdoCUTjCD5jZpL9GMFRqRru8TtDLznYWK5A+zGOVmQyWuUKOEFX99F QNWcYiUu78Ag049/mS0VJA+8dGQjB5tq9Oy0gMsasw43DSo4mh8KQ1EqKi+vpVF/DEDh w5MCR+tcraifjDktYUwqclTkeceyKj5IbzkD7ntx4pu6ZSIlB78L4T/9pXgtBvi7zOv1 8wmQ== ARC-Authentication-Results: i=3; mx.google.com; dkim=pass header.i=@googlegroups.com header.s=20161025 header.b=B16lHdY5; arc=pass (i=2 spf=pass spfdomain=mentor.com); spf=pass (google.com: domain of isar-users+bncbcw7ho6fuybrbk6t5l4qkgqelasz3uy@googlegroups.com designates 209.85.220.55 as permitted sender) smtp.mailfrom=isar-users+bncBCW7HO6FUYBRBK6T5L4QKGQELASZ3UY@googlegroups.com Received: from mail-sor-f55.google.com (mail-sor-f55.google.com. [209.85.220.55]) by mx.google.com with SMTPS id v22sor5950013uau.40.2020.08.17.09.00.45 (Google Transport Security); Mon, 17 Aug 2020 09:00:46 -0700 (PDT) Received-SPF: pass (google.com: domain of isar-users+bncbcw7ho6fuybrbk6t5l4qkgqelasz3uy@googlegroups.com designates 209.85.220.55 as permitted sender) client-ip=209.85.220.55; Authentication-Results: mx.google.com; dkim=pass header.i=@googlegroups.com header.s=20161025 header.b=B16lHdY5; arc=pass (i=2 spf=pass spfdomain=mentor.com); spf=pass (google.com: domain of isar-users+bncbcw7ho6fuybrbk6t5l4qkgqelasz3uy@googlegroups.com designates 209.85.220.55 as permitted sender) smtp.mailfrom=isar-users+bncBCW7HO6FUYBRBK6T5L4QKGQELASZ3UY@googlegroups.com ARC-Seal: i=2; a=rsa-sha256; t=1597680045; cv=pass; d=google.com; s=arc-20160816; b=JRdRRGjSSFcSVRjRM18sz+hei+I2PbayuYKfRg19B1wc+o1NtrBREgKMhWt5+PeiEc lNCH6fjcHZGjKNhSb9+Wp2UqElrnACQNnKvG0BJh4UPXgqvCPe3Kn2+Qxv4EmiWlDCNx ZjaVAnSv2CpQytdj1H0v4R5+Sbkxm8RB4/ugMXAWi7PbSRaxKif3/bOywfxmqno3bJEb +2CSck1nJpWJJtpaWe9DzVm96CprkMkvDb6TFPMbeqjWfLfTIshGCyobl+vEH4XTEhyO gfB3tUII/GkbYQCmSefTKxbXIYRhdEdKyl0DJxmQqKcHMjBiyohqa8X+syqndzTx2Mrz Vpow== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:ironport-sdr:ironport-sdr:sender:dkim-signature; bh=zbHOvQgzwVFlDips2Kv7GQCq7LnAD8fKdhRVv6+rMfw=; b=Hyu6hSXUT9LA88ec33kftO/47NQO0hqJsxPM4dQzYf7aU5+fdX73suzrBJ1QKhAWd8 5cEUi1auyRBL/1mPS09aXa0ZfZyJYjzFbxwPLQyWBPGkzgc86oj51ceCvy5YPRWsDg/O i8reTNPcyBDQgckvPU4U/NhdTX6xywzCvDjjiNY4CItGzd14G8Ah6zgd7phY9wsnbnEt pi3Hzd7yevSgqpHtV7L3GRTXp6jIKGeIyAnRqI8P/cGpJix9C9M7S3kHhyEItvPK2GLd 8IJkbFzDKm3LweHP8tAz4K99X2/rlmvCX4GmAQ7jB5oCKO+dDvvLy6ekDVYx3gnZv23n CUsg== ARC-Authentication-Results: i=2; 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 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:ironport-sdr:ironport-sdr:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding :x-original-sender:x-original-authentication-results:precedence :mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=zbHOvQgzwVFlDips2Kv7GQCq7LnAD8fKdhRVv6+rMfw=; b=B16lHdY5jVY19KFd+TEtTImzW5c6PFDNKW56lLH6NILVOyrGX2J0b2tU0iZKe0zYQy RAhGVM5V3eF5HLAuq3gLBaH2AT0+AvSDDT5y5JBSEgTotj5XdCyn4lIPoXxIKd1yfJ3a olB+wu39j1wHXtW+FnrcjT6TtbtB/SNmQP3Pu+NEand0rb3Kb6Ix+c0QBI6ge48Km2bk yPGYMZ/QQZyl9rGlm6TxHMyC+4BSY4sUlfFA0RvPPQWuHf8KbHJ4F9Wu5GcpHzkDduNn WBDGStPmBia/DpMw0KdTWmXHyjzhKw31row8WEmckpowOSKI2teNZGUDNT8KTe23tD8V ag4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:ironport-sdr:ironport-sdr:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :x-spam-checked-in-group:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=zbHOvQgzwVFlDips2Kv7GQCq7LnAD8fKdhRVv6+rMfw=; b=uRnR2xWa89A9QM4CTgK0oMcDy9oO0nvNugSVYj34BfR0c1MhdhAIi7Zo0vuRzsLxd7 HlD4c33BQvtB4hqA78D5HAE6iuvCWmvYE2zcyhkPGonn5Zt7z4FFXBJNpTAn4+BBuowH ia1NZRslkxPorLc24KU1AiZAvo3Hlt4luDBDze6zdY7OzLUvoeV/PHnujSlyEp4xoTmU WyMVQT+UpaZmA6mlZw4uY9oZbLhhRgMdUKVN4Aqp7m0kIec8+F5EaQQsDVCa03NNgf96 savTNmtbgBqxIZE/Ydmcw7BoI3yhVGo0cPFt+6fXpnISCgP43Ff0SpH65V+JCS8LuIEi enTw== Sender: isar-users@googlegroups.com X-Gm-Message-State: AOAM533pfOLHOGAiRnSk6l2Brw91CCUk983EVINjdlLB/2TYIZ/77F34 xmlvXMO/N04W8K7UaS1uqIM= X-Google-Smtp-Source: ABdhPJw7DP/x3Sgqd+Jq4R06eiFZ7oHlUPkY1ATyZ8EFNdHkQoGSnsPvSQ3ga6YWw2VGQKFwruEI0A== X-Received: by 2002:a9f:2966:: with SMTP id t93mr8336047uat.90.1597680043760; 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-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 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; 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 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-Original-Sender: vijaikumar_kanagarajan@mentor.com X-Original-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 Precedence: list Mailing-list: list isar-users@googlegroups.com; contact isar-users+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: isar-users@googlegroups.com X-Google-Group-Id: 914930254986 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1675284799900863887?= X-GMAIL-MSGID: =?utf-8?q?1675288952061775014?= 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.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.0/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.1/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.10/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.11/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.12/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.13/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.14/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.15/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.16/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.2/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.3/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.4/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.5/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.6/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.7/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.8/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/files/v3.9/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.23/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.24/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.25/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.26/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.27/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.28/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.29/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.30/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.31/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.32/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.33/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.34/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/pub/linux/utils/util-linux/v2.35/index.html create mode 100644 bitbake/lib/bb/tests/fetch-testdata/releases/eglibc/index.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() != "utf-8": sys.exit("Please use a locale setting which supports UTF-8 (such as LANG=en_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.") -__version__ = "1.44.0" +__version__ = "1.46.0" if __name__ == "__main__": if __version__ != 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(): # 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=sys.stdout, color=global_args.color) + bb.msg.logger_create('bitbake-layers', output=sys.stdout, + color=global_args.color, + level=logger.getEffectiveLevel()) plugins = [] tinfoil = bb.tinfoil.Tinfoil(tracking=True) 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 = "%(levelname)s: %(message)s" conlogformat = bb.msg.BBLogFormatter(format_str) consolelog = logging.FileHandler(logfilename) - bb.msg.addDefaultlogFilter(consolelog) consolelog.setFormatter(conlogformat) logger.addHandler(consolelog) @@ -195,9 +194,6 @@ def fork_off_task(cfg, data, databuilder, workerdata, fn, task, taskname, taskha global worker_pipe_lock pipein.close() - signal.signal(signal.SIGTERM, sigterm_handler) - # Let SIGHUP exit as SIGTERM - signal.signal(signal.SIGHUP, sigterm_handler) bb.utils.signal_on_parent_exit("SIGTERM") # 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 Ctrl+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 = os.open(os.devnull, os.O_RDWR) os.dup2(newsi, sys.stdin.fileno()) @@ -412,7 +413,7 @@ class BitbakeWorker(object): def handle_workerdata(self, data): self.workerdata = pickle.loads(data) - bb.msg.loggerDefaultDebugLevel = self.workerdata["logdefaultdebug"] + bb.msg.loggerDefaultLogLevel = self.workerdata["logdefaultlevel"] bb.msg.loggerDefaultVerbose = self.workerdata["logdefaultverbose"] bb.msg.loggerVerboseLogs = self.workerdata["logdefaultverboselogs"] bb.msg.loggerDefaultDomains = 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 @@ # HELP=" -Usage: source toaster start|stop [webport=] [noweb] [nobuild] [toasterdir] +Usage 1: source toaster start|stop [webport=] [noweb] [nobuild] [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 but 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|makemigrations|checksettings|collectstatic|...] " custom_extention() @@ -208,13 +209,21 @@ for param in $*; do toasterdir=*) TOASTERDIR="${param#*=}" ;; + manage ) + CMD=$param + manage_cmd="" + ;; --help) echo "$HELP" return 0 ;; *) - echo "$HELP" - return 1 + if [ "manage" == "$CMD" ] ; then + manage_cmd="$manage_cmd $param" + else + echo "$HELP" + exit 1 + fi ;; 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 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] = "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))) } addtask listtasks do_listtasks[nostamp] = "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) } addtask build do_build[dirs] = "${TOPDIR}" do_build[nostamp] = "1" python base_do_build () { - bb.note("The included, default BB base.bbclass does not define a useful default 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 useful default task.") + bb.note("Try running the 'listtasks' task against a .bb to see what tasks are defined.") } 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. B = "${S}" -CVSDIR = "${DL_DIR}/cvs" DEPENDS = "" DEPLOY_DIR = "${TMPDIR}/deploy" DEPLOY_DIR_IMAGE = "${DEPLOY_DIR}/images" DL_DIR = "${TMPDIR}/downloads" FILESPATH = "${FILE_DIRNAME}/${PF}:${FILE_DIRNAME}/${P}:${FILE_DIRNAME}/${PN}:${FILE_DIRNAME}/files:${FILE_DIRNAME}" FILE_DIRNAME = "${@os.path.dirname(d.getVar('FILE', False))}" -GITDIR = "${DL_DIR}/git" IMAGE_CMD = "_NO_DEFINED_IMAGE_TYPES_" IMAGE_ROOTFS = "${TMPDIR}/rootfs" OVERRIDES = "local:${MACHINE}:${TARGET_OS}:${TARGET_ARCH}" @@ -40,7 +38,6 @@ PV = "${@bb.parse.BBHandler.vars_from_file(d.getVar('FILE', False),d)[1] or '1.0 S = "${WORKDIR}/${P}" SRC_URI = "file://${FILE}" STAMP = "${TMPDIR}/stamps/${PF}" -SVNDIR = "${DL_DIR}/svn" T = "${WORKDIR}/temp" TARGET_ARCH = "${BUILD_ARCH}" TMPDIR = "${TOPDIR}/tmp" diff --git a/bitbake/contrib/autobuilderlog.json b/bitbake/contrib/autobuilderlog.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/indent/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=BitbakeIndent(v:lnum) +setlocal autoindent nolisp + +function s:is_bb_python_func_def(lnum) + let stack = synstack(a:lnum, 1) + if len(stack) == 0 + return 0 + endif + + let top = synIDattr(stack[0], "name") + echo top + + return synIDattr(stack[0], "name") == "bbPyFuncDef" +endfunction + +"""" begin modified from indent/python.vim, upstream commit 7a9bd7c1e0ce1baf5a02daf36eeae3638aa315c7 +"""" This copied code is licensed the same as Vim itself. +setlocal indentkeys+=<:>,=elif,=except + +let s:keepcpo= &cpo +set cpo&vim + +let s:maxoff = 50 " maximum number of lines to look backwards for () + +function GetPythonIndent(lnum) + + " If this line is explicitly joined: If the previous line was also joined, + " line it up with that one, otherwise add two 'shiftwidth' + if getline(a:lnum - 1) =~ '\\$' + if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$' + return indent(a:lnum - 1) + endif + return indent(a:lnum - 1) + (exists("g:pyindent_continue") ? eval(g:pyindent_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") =~ "String$" + return -1 + endif + + " Search backwards for the previous non-empty line. + let plnum = prevnonblank(v:lnum - 1) + + if plnum == 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 searchpair() + " timeout, so let the user disable this feature if he doesn't need it + let disable_parentheses_indenting = get(g:, "pyindent_disable_parentheses_indenting", 0) + + if disable_parentheses_indenting == 1 + let plindent = indent(plnum) + let plnumstart = plnum + else + " searchpair() can be slow sometimes, limit the time to 150 msec or what is + " put in g:pyindent_searchpair_timeout + let searchpair_stopline = 0 + let searchpair_timeout = get(g:, 'pyindent_searchpair_timeout', 150) + + " If the previous line is inside parenthesis, use the indent of the starting + " line. + " Trick: use the non-existing "dummy" variable to break out of the loop when + " going too far back. + let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', + \ "line('.') < " . (plnum - s:maxoff) . " ? dummy :" + \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" + \ . " =~ '\\(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 = 0 + let plindent = indent(plnum) + let plnumstart = plnum + else + let plindent = indent(parlnum) + let plnumstart = parlnum + endif + else + let plindent = indent(plnum) + let plnumstart = plnum + endif + + " When inside parenthesis: If at the first line below the parenthesis add + " two 'shiftwidth', otherwise same as previous line. + " i = (a + " + b + " + c) + call cursor(a:lnum, 1) + let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', + \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" + \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" + \ . " =~ '\\(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 == plnum + return shiftwidth() + endif + + " Handle the user actually trying to close a BitBake Python task + let line = getline(a:lnum) + if line =~ '^\s*}' + return -2 + endif + + " Otherwise ignore the brace + let p = 0 + else + if p == plnum + " When the start is inside parenthesis, only indent one 'shiftwidth'. + let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', + \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" + \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" + \ . " =~ '\\(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 == 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 = getline(plnum) + let pline_len = strlen(pline) + if has('syntax_items') + " If the last character in the line is a comment, do a binary search for + " the start of the comment. synID() is slow, a linear search would take + " too long on a long line. + if synIDattr(synID(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$" + let min = 1 + let max = pline_len + while min < max + let col = (min + max) / 2 + if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$" + let max = col + else + let min = col + 1 + endif + endwhile + let pline = strpart(pline, 0, min - 1) + endif + else + let col = 0 + while col < pline_len + if pline[col] == '#' + let pline = strpart(pline, 0, col) + break + endif + let col = col + 1 + endwhile + endif + + " If the previous line ended with a colon, indent this line + if pline =~ ':\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) =~ '^\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) =~ '^\s*\(except\|finally\)\>' + let lnum = a:lnum - 1 + while lnum >= 1 + if getline(lnum) =~ '^\s*\(try\|except\)\>' + let ind = indent(lnum) + if ind >= indent(a:lnum) + return -1 " indent is already less than this + endif + return ind " line up with previous try or except + endif + let lnum = lnum - 1 + endwhile + return -1 " no matching "try"! + endif + + " If the current line begins with a header keyword, dedent + if getline(a:lnum) =~ '^\s*\(elif\|else\)\>' + + " Unless the previous line was a one-liner + if getline(plnumstart) =~ '^\s*\(for\|if\|try\)\>' + return plindent + endif + + " Or the user has already dedented + if indent(a:lnum) <= plindent - shiftwidth() + return -1 + endif + + return plindent - shiftwidth() + endif + + " When after a () construct we probably want to go back to the start line. + " a = (b + " + c) + " here + if parlnum > 0 + return plindent + endif + + return -1 + +endfunction + +let &cpo = s:keepcpo +unlet s:keepcpo + +""" end of stuff from indent/python.vim + + +let b:did_indent = 1 +setlocal indentkeys+=0\" + + +function BitbakeIndent(lnum) + if !has('syntax_items') + return -1 + endif + + let stack = synstack(a:lnum, 1) + if len(stack) == 0 + return -1 + endif + + let name = synIDattr(stack[0], "name") + + " TODO: support different styles of indentation for assignments. For now, + " we only support like this: + " VAR = " \ + " value1 \ + " value2 \ + " " + " + " i.e. each value indented by shiftwidth(), with the final quote " completely unindented. + if name == "bbVarValue" + " Quote handling is tricky. kernel.bbclass has this line for instance: + " EXTRA_OEMAKE = " HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}" " HOSTCPP="${BUILD_CPP}"" + " Instead of trying to handle crazy cases like that, just assume that 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) =~ '^\s*"$' + return 0 + endif + + let prevstack = synstack(a:lnum - 1, 1) + if len(prevstack) == 0 + return -1 + endif + + let prevname = synIDattr(prevstack[0], "name") + + " Only indent if there was actually a continuation character on + " the previous line, to avoid misleading indentation. + let prevlinelastchar = synIDattr(synID(a:lnum - 1, col([a:lnum - 1, "$"]) - 1, 1), "name") + let prev_continued = prevlinelastchar == "bbContinue" + + " Did the previous line introduce an assignment? + if index(["bbVarDef", "bbVarFlagDef"], prevname) != -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) != -1 + let ret = GetPythonIndent(a:lnum) + " Should normally always be indented by at least one shiftwidth; but allow + " return of -1 (defer to autoindent) or -2 (force indent to 0) + if ret == 0 + return shiftwidth() + elseif ret == -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 == "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 starts + " 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 @@ - 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 PREFERRED_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. @@ -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}/run.do_taskname.pid + ${T}/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. 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 @@ 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 defined + 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 configuration. + 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 rules + are ignored. + + + The user configuration must have a top level + version which must match the value of + the default configuration. + + + Any keys defined in the handlers, + formatters, or filters, + 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 configuration + and user configuration specify a handler named + myhandler, the user defined one will + replace the default. To prevent the user from inadvertently + 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 completely + 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 logger + 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 filters + will be applied to the logger + + + + + + As an example, consider the following user logging configuration + file which logs all Hash Equivalence related messages of VERBOSE 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.xml 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 @@
- 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 files. 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 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 provide 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 provide 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 artifacts 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 BitBake 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 recipes. However, since the same word is used to describe packaged @@ -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 organize + when working on a single project, the more modular your metadata, the easier it is to cope with future changes. @@ -300,8 +302,8 @@ To illustrate how you can use layers to keep things modular, consider customizations you might make to support a specific target machine. These types of customizations typically reside in a special layer, - rather than a general layer, called a Board Support Package (BSP) - Layer. + rather than a general layer, called a Board Support Package (BSP) + layer. Furthermore, the machine customizations should be isolated from recipes and metadata that support a new GUI environment, for example. @@ -448,7 +450,7 @@ Using the BitBake that Comes With Your Build Checkout: A final possibility for getting a copy of BitBake is that it - already comes with your checkout of a larger Bitbake-based build + already comes with your checkout of a larger BitBake-based build system, such as Poky. Rather than manually checking out individual layers and gluing them together yourself, you can check @@ -692,14 +694,9 @@ - When you generate a dependency graph, BitBake writes three files + When you generate a dependency graph, BitBake writes two files to the current working directory: - - recipe-depends.dot: - Shows dependencies between recipes (i.e. a collapsed version of - task-depends.dot). - task-depends.dot: Shows dependencies between tasks. diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-metadata.xml 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 - 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 = "123" - A := "${B} ${A} test ${T}" + A := "test ${T}" T = "456" - B = "${T} bval" + B := "${T} ${C}" C = "cval" C := "${C}append" In this example, A contains - "test 123" because ${B} and - ${A} at the time of parsing are undefined, - 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 preserved as is + during (immediate)expansion. This is in contrast to GNU Make, where undefined + variables expand to nothing. + The variable C contains "cvalappend" since ${C} immediately expands to "cval". @@ -429,7 +432,7 @@ The variable FOO becomes "  789 123456    " and FOO2 becomes - "     jkl  abcdef      ". + "     abcdef      ". @@ -1414,7 +1417,7 @@
- Bitbake-Style Python Functions Versus Python Functions + BitBake-Style Python Functions Versus Python Functions Following are some important differences between @@ -1864,7 +1867,7 @@ accessing your $HOME/.ccache directory. The following command "whitelists" the environment variable - CCACHE_DIR causing BitBack to allow that + CCACHE_DIR causing BitBake to allow that variable into the datastore: export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE CCACHE_DIR" @@ -1895,7 +1898,7 @@ 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 BB_ORIGENV. @@ -2523,6 +2526,9 @@ In the previous example, the do_packagedata task of each item in RDEPENDS must have completed before do_package_qa can execute. + Although RDEPENDS contains entries from the + runtime dependency namespace, BitBake knows how to map them back + to the build-time dependency namespace, in which the tasks are defined.
@@ -2559,15 +2565,17 @@
- 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: do_a[recrdeptask] = "do_a do_b" + In the same way as before, this means that the do_a + and do_b tasks of the current recipe and all + recipes reachable (by way of dependencies) from the recipe + must run before the do_a task can run. In this + case BitBake will ignore the current recipe's do_a + task circular dependency on itself. @@ -2616,7 +2624,7 @@ 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: diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.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 @@ + BB_LOGCONFIG + + + Specifies the name of a config file that contains the user + logging configuration. See + Logging for additional + information + + + + BB_LOGFMT @@ -1780,7 +1791,7 @@ - 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 @@ import copy -import types ImmutableTypes = ( 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 # -__version__ = "1.44.0" +__version__ = "1.46.0" 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") class BBHandledException(Exception): @@ -43,7 +43,13 @@ class BBLogger(Logger): Logger.__init__(self, name) def bbdebug(self, level, msg, *args, **kwargs): - return self.log(logging.DEBUG - level + 1, msg, *args, **kwargs) + loglevel = 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) 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'] = os class TaskBase(event.Event): """Base class for task events""" - def __init__(self, t, logfile, d): + def __init__(self, t, fn, logfile, d): self._task = t + self._fn = fn self._package = d.getVar("PF") self._mc = d.getVar("BB_CURRENT_MC") self.taskfile = d.getVar("FILE") self.taskname = self._task self.logfile = logfile self.time = time.time() + self.pn = d.getVar("PN") + self.pv = d.getVar("PV") event.Event.__init__(self) self._message = "recipe %s: task %s: %s" % (d.getVar("PF"), t, self.getDisplayName()) @@ -81,8 +83,8 @@ class TaskBase(event.Event): 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 = taskflags class TaskSucceeded(TaskBase): @@ -91,9 +93,9 @@ class TaskSucceeded(TaskBase): class TaskFailed(TaskBase): """Task execution failed""" - def __init__(self, task, logfile, metadata, errprinted = False): + def __init__(self, task, fn, logfile, metadata, errprinted = False): self.errprinted = errprinted - super(TaskFailed, self).__init__(task, logfile, metadata) + super(TaskFailed, self).__init__(task, fn, logfile, metadata) class TaskFailedSilent(TaskBase): """Task execution failed (silently)""" @@ -103,8 +105,8 @@ class TaskFailedSilent(TaskBase): class TaskInvalid(TaskBase): - 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 = "No such task '%s'" % task class TaskProgress(event.Event): @@ -572,7 +574,7 @@ def _exec_task(fn, task, d, quieterr): try: try: - event.fire(TaskStarted(task, logfn, flags, localdata), localdata) + event.fire(TaskStarted(task, fn, logfn, flags, localdata), localdata) except (bb.BBHandledException, SystemExit): return 1 @@ -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), localdata) return 1 except Exception as exc: if quieterr: - event.fire(TaskFailedSilent(task, logfn, localdata), localdata) + event.fire(TaskFailedSilent(task, fn, logfn, localdata), localdata) else: errprinted = errchk.triggered logger.error(str(exc)) - event.fire(TaskFailed(task, logfn, localdata, errprinted), localdata) + event.fire(TaskFailed(task, fn, logfn, localdata, errprinted), 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) 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 @@ # import os -import sys import logging import pickle from collections import defaultdict import bb.utils +import re logger = logging.getLogger("BitBake.Cache") @@ -208,10 +208,10 @@ class CoreRecipeInfo(RecipeInfoCommon): # 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) # 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 = None self.cacheclean = True self.data_hash = data_hash + self.filelist_regex = re.compile(r'(?:(?<=:True)|(?<=:False))\s+') if self.cachedir in [None, '']: self.has_cache = 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 = fl.strip() - while fl: - # A .split() would be simpler but means spaces or colons in filenames would break - a = fl.find(":True") - b = fl.find(":False") - if ((a < 0) and b) or ((b > 0) and (b < a)): - f = fl[:b+6] - fl = fl[b+7:] - elif ((b < 0) and a) or ((a > 0) and (a < b)): - f = fl[:a+5] - fl = fl[a+6:] - else: - break - fl = fl.strip() - if "*" in f: + if not fl: + continue + # Have to be careful about spaces and colons in filenames + flist = self.filelist_regex.split(fl) + for f in flist: + if not f or "*" in f: continue f, exist = f.split(":") if (exist == "True" and not os.path.exists(f)) or (exist == "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] = source[0][h] - def get_checksums(self, filelist, pn): + def get_checksums(self, filelist, pn, localdirsexclude): """Get checksums for a list of files""" def checksum_file(f): @@ -90,7 +89,8 @@ class FileChecksumCache(MultiProcessCache): if pth == "/": bb.fatal("Refusing to checksum /") dirchecksums = [] - for root, dirs, files in os.walk(pth): + for root, dirs, files in os.walk(pth, topdown=True): + [dirs.remove(d) for d in list(dirs) if d in localdirsexclude] for name in files: fullpth = os.path.join(root, name) checksum = 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 logger = logging.getLogger('BitBake.CodeParser') @@ -58,30 +56,10 @@ def check_indent(codestr): return codestr - -# Basically pickle, in python 2.7.3 at least, does badly with data duplication -# upon pickling and unpickling. Combine this with duplicate objects and things -# are a mess. -# -# When the sets are originally created, python calls intern() on the set keys -# which significantly improves memory usage. Sadly the pickle/unpickle process -# 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 times 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 (via 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 data. -# -# 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! + class SetCache(object): def __init__(self): self.setcache = {} 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 = getattr(self.cmds_sync, command) if ro_only: - if not hasattr(command_method, 'readonly') or False == getattr(command_method, 'readonly'): + if not hasattr(command_method, 'readonly') or not getattr(command_method, 'readonly'): return None, "Not able to execute not readonly commands in readonly mode" try: self.cooker.process_inotify_updates() @@ -414,7 +414,11 @@ class CommandsSync: getAllAppends.readonly = True def findProviders(self, command, params): - return command.cooker.findProviders() + try: + mc = params[0] + except IndexError: + mc = '' + return command.cooker.findProviders(mc) findProviders.readonly = True def findBestProvider(self, command, params): @@ -446,54 +450,38 @@ class CommandsSync: return all_p, best getRuntimeProviders.readonly = True - def dataStoreConnectorFindVar(self, command, params): + def dataStoreConnectorCmd(self, command, params): dsindex = params[0] - name = params[1] - datastore = command.remotedatastores[dsindex] - value, overridedata = datastore._findVar(name) - - if value: - content = 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 = 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'] = overridedata - else: - value = {} - value['_connector_overrides'] = overridedata - return value - dataStoreConnectorFindVar.readonly = True + method = params[1] + args = params[2] + kwargs = params[3] - def dataStoreConnectorGetKeys(self, command, params): - dsindex = params[0] - datastore = command.remotedatastores[dsindex] - return list(datastore.keys()) - dataStoreConnectorGetKeys.readonly = True + d = command.remotedatastores[dsindex] + ret = getattr(d, method)(*args, **kwargs) + + if isinstance(ret, bb.data_smart.DataSmart): + idx = command.remotedatastores.store(ret) + return DataStoreConnectionHandle(idx) + + return ret - def dataStoreConnectorGetVarHistory(self, command, params): + def dataStoreConnectorVarHistCmd(self, command, params): dsindex = params[0] - name = params[1] - datastore = command.remotedatastores[dsindex] - return datastore.varhistory.variable(name) - dataStoreConnectorGetVarHistory.readonly = True + method = params[1] + args = params[2] + kwargs = params[3] - def dataStoreConnectorExpandPythonRef(self, command, params): - config_data_dict = params[0] - varname = params[1] - expr = params[2] + d = command.remotedatastores[dsindex].varhistory + return getattr(d, method)(*args, **kwargs) - config_data = command.remotedatastores.receive_datastore(config_data_dict) + def dataStoreConnectorIncHistCmd(self, command, params): + dsindex = params[0] + method = params[1] + args = params[2] + kwargs = params[3] - varparse = bb.data_smart.VariableParse(varname, config_data) - return varparse.python_sub(expr) + d = command.remotedatastores[dsindex].inchistory + return getattr(d, method)(*args, **kwargs) def dataStoreConnectorRelease(self, command, params): dsindex = params[0] @@ -501,31 +489,6 @@ class CommandsSync: raise CommandError('dataStoreConnectorRelease: invalid index %d' % dsindex) command.remotedatastores.release(dsindex) - def dataStoreConnectorSetVarFlag(self, command, params): - dsindex = params[0] - name = params[1] - flag = params[2] - value = params[3] - datastore = command.remotedatastores[dsindex] - datastore.setVarFlag(name, flag, value) - - def dataStoreConnectorDelVar(self, command, params): - dsindex = params[0] - name = params[1] - datastore = command.remotedatastores[dsindex] - if len(params) > 2: - flag = params[2] - datastore.delVarFlag(name, flag) - else: - datastore.delVar(name) - - def dataStoreConnectorRenameVar(self, command, params): - dsindex = params[0] - name = params[1] - newname = params[2] - datastore = 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 = params[1] appendlist = params[2] if len(params) > 3: - config_data_dict = params[3] - config_data = command.remotedatastores.receive_datastore(config_data_dict) + config_data = command.remotedatastores[params[3]] else: config_data = None 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 @@ # 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, runqueue, 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() - self.configwatcher.bbseen = [] - self.configwatcher.bbwatchedfiles = [] + self.configwatcher.bbseen = set() + self.configwatcher.bbwatchedfiles = set() self.confignotifier = pyinotify.Notifier(self.configwatcher, self.config_notifications) bb.debug(1, "BBCooker pyinotify2 %s" % time.time()) sys.stdout.flush() @@ -180,8 +176,8 @@ class BBCooker: self.watcher = pyinotify.WatchManager() bb.debug(1, "BBCooker pyinotify3 %s" % time.time()) sys.stdout.flush() - self.watcher.bbseen = [] - self.watcher.bbwatchedfiles = [] + self.watcher.bbseen = set() + self.watcher.bbwatchedfiles = set() self.notifier = pyinotify.Notifier(self.watcher, self.notifications) bb.debug(1, "BBCooker pyinotify complete %s" % time.time()) @@ -278,14 +274,14 @@ class BBCooker: if not watcher: watcher = self.watcher for i in deps: - watcher.bbwatchedfiles.append(i[0]) + watcher.bbwatchedfiles.add(i[0]) if dirs: f = i[0] else: f = os.path.dirname(i[0]) if f in watcher.bbseen: continue - watcher.bbseen.append(f) + watcher.bbseen.add(f) watchtarget = 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=False) 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 = 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 exceeds fs.inotify.max_user_watches?") @@ -371,10 +367,6 @@ class BBCooker: self.data.setVar('BB_CMDLINE', self.ui_cmdline) - # - # Copy of the data store which has been expanded. - # Used for firing events and accessing variables where expansion needs to be accounted for - # if CookerFeatures.BASEDATASTORE_TRACKING in self.featureset: self.disableDataTracking() @@ -1031,16 +1023,16 @@ class BBCooker: bb.event.fire(bb.event.FilesMatchingFound(filepattern, matches), self.data) def findProviders(self, mc=''): - return bb.providers.findProviders(self.data, self.recipecaches[mc], self.recipecaches[mc].pkg_pn) + return bb.providers.findProviders(self.databuilder.mcdata[mc], self.recipecaches[mc], self.recipecaches[mc].pkg_pn) def findBestProvider(self, pn, mc=''): if pn in self.recipecaches[mc].providers: filenames = self.recipecaches[mc].providers[pn] - eligible, foundUnique = bb.providers.filterProviders(filenames, pn, self.data, self.recipecaches[mc]) + eligible, foundUnique = bb.providers.filterProviders(filenames, pn, self.databuilder.mcdata[mc], self.recipecaches[mc]) filename = eligible[0] return None, None, None, filename elif pn in self.recipecaches[mc].pkg_pn: - return bb.providers.findBestProvider(pn, self.data, self.recipecaches[mc], self.recipecaches[mc].pkg_pn) + return bb.providers.findBestProvider(pn, self.databuilder.mcdata[mc], self.recipecaches[mc], self.recipecaches[mc].pkg_pn) else: return None, None, None, None @@ -1212,7 +1204,7 @@ class BBCooker: for c in collection_list: calc_layer_priority(c) regex = self.data.getVar("BBFILE_PATTERN_%s" % c) - if regex == None: + if regex is None: parselog.error("BBFILE_PATTERN_%s not defined" % c) errors = True continue @@ -1318,7 +1310,7 @@ class BBCooker: self.parseConfiguration() # If we are told to do the None task then query the default task - if (task == None): + if task is None: task = self.configuration.cmd if not task.startswith("do_"): task = "do_%s" % task @@ -1462,7 +1454,7 @@ class BBCooker: self.buildSetVars() # If we are told to do the None task then query the default task - if (task == None): + if task is None: task = self.configuration.cmd if not task.startswith("do_"): @@ -1600,7 +1592,7 @@ class BBCooker: raise NothingToBuild ignore = (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_PROVIDED, ignoring" % pkg) if pkg.startswith("multiconfig:"): @@ -1673,6 +1665,8 @@ class BBCooker: self.command.reset() self.databuilder.reset() self.data = self.databuilder.data + self.parsecache_valid = False + self.baseconfig_valid = False class CookerExit(bb.event.Event): @@ -1695,7 +1689,7 @@ class CookerCollectFiles(object): def calc_bbfile_priority( self, filename, matched = None ): for _, _, regex, pri in self.bbfile_config_priorities: if regex.match(filename): - if matched != 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 possible for BBMASK # to end up beginning with '|', which matches and masks _everything_. if mask.startswith("|"): - collectlog.warn("BBMASK contains regular expression beginning with '|', fixing: %s" % mask) + collectlog.warning("BBMASK contains regular expression beginning with '|', fixing: %s" % mask) mask = mask[1:] try: re.compile(mask) @@ -1948,7 +1942,8 @@ class Parser(multiprocessing.Process): except IndexError: break result = self.parse(*job) - + # Clear the siggen cache after parsing to control memory usage, its huge + bb.parse.siggen.postparsing_clean_cache() try: self.results.put(result, timeout=0.25) except queue.Full: @@ -1956,6 +1951,7 @@ class Parser(multiprocessing.Process): def parse(self, filename, appends): try: + origfilter = bb.event.LogHandler.filter # Record the filename we're parsing into any events generated def parse_filter(self, record): record.taskpid = 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 = origfilter 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 = None): return d.expand(s, varname) def expandKeys(alterdata, readdata = None): - if readdata == None: + if readdata is None: readdata = alterdata todolist = {} @@ -365,7 +365,7 @@ def build_dependencies(key, keys, shelldeps, varflagsexcl, d): #bb.note("Variable %s references %s and calls %s" % (key, str(deps), str(execs))) #d.setVarFlag(key, "vardeps", deps) -def generate_dependencies(d): +def generate_dependencies(d, whitelist): keys = set(key for key in d if not key.startswith("__")) shelldeps = set(key for key in d.getVar("__exportlist", False) if d.getVarFlag(key, "export", False) and not d.getVarFlag(key, "unexport", False)) @@ -380,7 +380,7 @@ def generate_dependencies(d): newdeps = deps[task] seen = set() while newdeps: - nextdeps = newdeps + nextdeps = newdeps - whitelist seen |= nextdeps newdeps = 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 = match.group()[3:-1] - if "_remote_data" in self.d: - connector = self.d["_remote_data"] - return connector.expandPythonRef(self.varname, code, self.d) - if self.varname: varname = 'Var <%s>' % self.varname else: @@ -268,12 +264,7 @@ class VariableHistory(object): self.variables[newvar].append(i.copy()) def variable(self, var): - remote_connector = self.dataroot.getVar('_remote_data', False) - if remote_connector: - varhistory = remote_connector.getVarHistory(var) - else: - varhistory = [] - + varhistory = [] if var in self.variables: varhistory.extend(self.variables[var]) return varhistory @@ -338,11 +329,12 @@ class VariableHistory(object): lines.append(line) return lines - 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 = self.dataroot history = self.variable(var) finalitems = (d.getVar(var) or '').split() filemap = {} @@ -470,10 +462,6 @@ class DataSmart(MutableMapping): if var in dest: return dest[var], self.overridedata.get(var, None) - if "_remote_data" in dest: - connector = dest["_remote_data"]["_content"] - return connector.getVar(var) - if "_data" not in dest: break dest = dest["_data"] @@ -498,12 +486,6 @@ class DataSmart(MutableMapping): if 'parsing' in loginfo: parsing=True - if '_remote_data' in self.dict: - connector = self.dict["_remote_data"]["_content"] - res = connector.setVar(var, value) - if not res: - return - if 'op' not in loginfo: loginfo['op'] = "set" @@ -607,11 +589,9 @@ class DataSmart(MutableMapping): """ Rename the variable key to newkey """ - if '_remote_data' in self.dict: - connector = self.dict["_remote_data"]["_content"] - res = connector.renameVar(key, newkey) - if not res: - return + if key == newkey: + bb.warn("Calling renameVar with equivalent keys (%s) is invalid" % key) + return val = self.getVar(key, 0, parsing=True) if val is not None: @@ -658,11 +638,6 @@ class DataSmart(MutableMapping): def delVar(self, var, **loginfo): self.expand_cache = {} - if '_remote_data' in self.dict: - connector = self.dict["_remote_data"]["_content"] - res = connector.delVar(var) - if not res: - return loginfo['detail'] = "" loginfo['op'] = 'del' @@ -690,11 +665,6 @@ class DataSmart(MutableMapping): def setVarFlag(self, var, flag, value, **loginfo): self.expand_cache = {} - if '_remote_data' in self.dict: - connector = self.dict["_remote_data"]["_content"] - res = connector.setVarFlag(var, flag, value) - if not res: - return if 'op' not in loginfo: loginfo['op'] = "set" @@ -845,11 +815,6 @@ class DataSmart(MutableMapping): def delVarFlag(self, var, flag, **loginfo): self.expand_cache = {} - if '_remote_data' in self.dict: - connector = self.dict["_remote_data"]["_content"] - res = connector.delVarFlag(var, flag) - if not res: - return local_var, _ = self._findVar(var) if not local_var: @@ -967,7 +932,7 @@ class DataSmart(MutableMapping): def localkeys(self): for key in self.dict: - if key not in ['_data', '_remote_data']: + if key not in ['_data']: yield key def __iter__(self): @@ -976,7 +941,7 @@ class DataSmart(MutableMapping): def keylist(d): klist = 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 |= keylist(d["_data"]) - if "_remote_data" in d: - connector = d["_remote_data"]["_content"] - for key in connector.getKeys(): - if key in deleted: - continue - klist.add(key) - return klist self.need_overrides() @@ -1042,7 +1000,10 @@ class DataSmart(MutableMapping): continue value = 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}) varflags = d.getVarFlags(key, internalflags = 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 # -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): def getName(e): """Returns the name of a class or class instance""" - if getattr(e, "__name__", None) == None: + if getattr(e, "__name__", None) is None: return e.__class__.__name__ else: return e.__name__ @@ -509,7 +508,7 @@ class NoProvider(Event): extra = '' if not self._reasons: if self._close_matches: - extra = ". Close matches:\n %s" % '\n '.join(self._close_matches) + extra = ". Close matches:\n %s" % '\n '.join(sorted(set(self._close_matches))) if self._dependees: msg = "Nothing %sPROVIDES '%s' (but %s %sDEPENDS on or otherwise 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/__init__.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 = bb.checksum.FileChecksumCache() logger = logging.getLogger("BitBake.Fetcher") +CHECKSUM_LIST = [ "md5", "sha256", "sha1", "sha384", "sha512" ] +SHOWN_CHECKSUM_LIST = ["sha256"] + class BBFetchException(Exception): """Class all fetch exceptions inherit from""" def __init__(self, message): @@ -131,10 +134,9 @@ class NonLocalMethod(Exception): Exception.__init__(self) class MissingChecksumEvent(bb.event.Event): - def __init__(self, url, md5sum, sha256sum): + def __init__(self, url, **checksums): self.url = url - self.checksums = {'md5sum': md5sum, - 'sha256sum': sha256sum} + self.checksums = checksums bb.event.Event.__init__(self) @@ -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 = 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 = dict(revs) + except: + pass + # When to drop SCM head revisions controlled by user policy srcrev_policy = d.getVar('BB_SRCREV_POLICY') or "clear" if srcrev_policy == "cache": logger.debug(1, "Keeping SRCREV cache due to cache policy of: %s", srcrev_policy) elif srcrev_policy == "clear": logger.debug(1, "Clearing SRCREV cache due to cache policy of: %s", srcrev_policy) - revs = bb.persist_data.persist('BB_URI_HEADREVS', d) - try: - bb.fetch2.saved_headrevs = revs.items() - except: - pass revs.clear() else: raise FetchError("Invalid SRCREV cache policy of: %s" % srcrev_policy) @@ -513,22 +520,12 @@ def fetcher_parse_done(): 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 from + when bitbake was started and return true if they have changed. """ - data = bb.persist_data.persist('BB_URI_HEADREVS', d).items() - data2 = bb.fetch2.saved_headrevs - - changed = False - for key in data: - if key not in data2 or data2[key] != data[key]: - logger.debug(1, "%s changed", key) - changed = True - return True - else: - logger.debug(2, "%s did not change", key) - return False + headrevs = dict(bb.persist_data.persist('BB_URI_HEADREVS', d)) + return headrevs != bb.fetch2.saved_headrevs def mirror_from_string(data): mirrors = (data or "").replace('\\n',' ').split() @@ -552,71 +549,84 @@ def verify_checksum(ud, d, precomputed={}): downloading. See https://bugzilla.yoctoproject.org/show_bug.cgi?id=5571. """ - _MD5_KEY = "md5" - _SHA256_KEY = "sha256" - if ud.ignore_checksums or not ud.method.supports_checksum(ud): return {} - if _MD5_KEY in precomputed: - md5data = precomputed[_MD5_KEY] - else: - md5data = bb.utils.md5_file(ud.localpath) + def compute_checksum_info(checksum_id): + checksum_name = getattr(ud, "%s_name" % checksum_id) - if _SHA256_KEY in precomputed: - sha256data = precomputed[_SHA256_KEY] - else: - sha256data = bb.utils.sha256_file(ud.localpath) + if checksum_id in precomputed: + checksum_data = precomputed[checksum_id] + else: + checksum_data = getattr(bb.utils, "%s_file" % checksum_id)(ud.localpath) - if ud.method.recommends_checksum(ud) and not ud.md5_expected and not ud.sha256_expected: - # If strict checking enabled and neither sum defined, raise error + checksum_expected = getattr(ud, "%s_expected" % checksum_id) + + return { + "id": checksum_id, + "name": checksum_name, + "data": checksum_data, + "expected": checksum_expected + } + + checksum_infos = [] + for checksum_id in CHECKSUM_LIST: + checksum_infos.append(compute_checksum_info(checksum_id)) + + checksum_dict = {ci["id"] : ci["data"] for ci in checksum_infos} + checksum_event = {"%ssum" % ci["id"] : ci["data"] for ci in checksum_infos} + + for ci in checksum_infos: + if ci["id"] in SHOWN_CHECKSUM_LIST: + checksum_lines = ["SRC_URI[%s] = \"%s\"" % (ci["name"], ci["data"])] + + # If no checksum has been provided + if ud.method.recommends_checksum(ud) and all(ci["expected"] is None for ci in checksum_infos): + messages = [] strict = d.getVar("BB_STRICT_CHECKSUM") or "0" + + # If strict checking enabled and neither sum defined, raise error if strict == "1": - logger.error('No checksum specified for %s, please add at least one to the recipe:\n' - 'SRC_URI[%s] = "%s"\nSRC_URI[%s] = "%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) - bb.event.fire(MissingChecksumEvent(ud.url, md5data, sha256data), d) + bb.event.fire(MissingChecksumEvent(ud.url, **checksum_event), d) if strict == "ignore": - return { - _MD5_KEY: md5data, - _SHA256_KEY: sha256data - } + return checksum_dict # Log missing sums so user can more easily add them - logger.warning('Missing md5 SRC_URI checksum for %s, consider adding to the recipe:\n' - 'SRC_URI[%s] = "%s"', - ud.localpath, ud.md5_name, md5data) - logger.warning('Missing sha256 SRC_URI checksum for %s, consider adding to the recipe:\n' - 'SRC_URI[%s] = "%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)) # We want to alert the user if a checksum is defined in the recipe but # it does not match. - msg = "" - mismatch = False - if ud.md5_expected and ud.md5_expected != md5data: - msg = msg + "\nFile: '%s' has %s checksum %s when %s was expected" % (ud.localpath, 'md5', md5data, ud.md5_expected) - mismatch = True; - - if ud.sha256_expected and ud.sha256_expected != sha256data: - msg = msg + "\nFile: '%s' has %s checksum %s when %s was expected" % (ud.localpath, 'sha256', sha256data, ud.sha256_expected) - mismatch = True; - - if mismatch: - msg = msg + '\nIf this change is expected (e.g. you have upgraded to a new version without updating the checksums) then you can use these lines within the recipe:\nSRC_URI[%s] = "%s"\nSRC_URI[%s] = "%s"\nOtherwise you should retry the download and/or check with upstream to determine if the file has become corrupted or otherwise unexpectedly modified.\n' % (ud.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 = [] + messages.append("Checksum mismatch!") + bad_checksum = None + + for ci in checksum_infos: + if ci["expected"] and ci["expected"] != ci["data"]: + messages.append("File: '%s' has %s checksum %s when %s was " \ + "expected" % (ud.localpath, ci["id"], ci["data"], ci["expected"])) + bad_checksum = ci["data"] + + if bad_checksum: + messages.append("If this change is expected (e.g. you have upgraded " \ + "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 modified.") + raise ChecksumError("\n".join(messages), ud.url, bad_checksum) + + return checksum_dict def verify_donestamp(ud, d, origud=None): """ @@ -1081,7 +1091,7 @@ def try_mirrors(fetch, d, origud, mirrors, check = False): for index, uri in enumerate(uris): ret = try_mirror_url(fetch, origud, uds[index], ld, check) - if ret != False: + if ret: return ret return None @@ -1197,14 +1207,14 @@ def get_checksum_file_list(d): return " ".join(filelist) -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 Returns the checksums for a list of local files, caching the results as it proceeds """ - return _checksum_cache.get_checksums(filelist, pn) + return _checksum_cache.get_checksums(filelist, pn, localdirsexclude) class FetchData(object): @@ -1230,24 +1240,26 @@ class FetchData(object): self.pswd = self.parm["pswd"] self.setup = False - if "name" in self.parm: - self.md5_name = "%s.md5sum" % self.parm["name"] - self.sha256_name = "%s.sha256sum" % self.parm["name"] - else: - self.md5_name = "md5sum" - self.sha256_name = "sha256sum" - if self.md5_name in self.parm: - self.md5_expected = self.parm[self.md5_name] - elif self.type not in ["http", "https", "ftp", "ftps", "sftp", "s3"]: - self.md5_expected = None - else: - self.md5_expected = d.getVarFlag("SRC_URI", self.md5_name) - if self.sha256_name in self.parm: - self.sha256_expected = self.parm[self.sha256_name] - elif self.type not in ["http", "https", "ftp", "ftps", "sftp", "s3"]: - self.sha256_expected = None - else: - self.sha256_expected = d.getVarFlag("SRC_URI", self.sha256_name) + def configure_checksum(checksum_id): + if "name" in self.parm: + checksum_name = "%s.%ssum" % (self.parm["name"], checksum_id) + else: + checksum_name = "%ssum" % checksum_id + + setattr(self, "%s_name" % checksum_id, checksum_name) + + if checksum_name in self.parm: + checksum_expected = self.parm[checksum_name] + elif self.type not in ["http", "https", "ftp", "ftps", "sftp", "s3"]: + checksum_expected = None + else: + checksum_expected = d.getVarFlag("SRC_URI", checksum_name) + + setattr(self, "%s_expected" % checksum_id, checksum_expected) + + for checksum_id in CHECKSUM_LIST: + configure_checksum(checksum_id) + self.ignore_checksums = False self.names = self.parm.get("name",'default').split(',') @@ -1351,7 +1363,7 @@ class FetchMethod(object): """ # We cannot compute checksums for directories - if os.path.isdir(urldata.localpath) == True: + if os.path.isdir(urldata.localpath): return False if urldata.localpath.find("*") != -1: return False @@ -1365,6 +1377,18 @@ class FetchMethod(object): """ return False + 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 + def try_mirrors(self, fetch, urldata, d, mirrors, check=False): + """ + 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) def generate_revision_key(self, ud, d, name): - key = self._revision_key(ud, d, name) - return "%s-%s" % (key, d.getVar("PN") or "") + return self._revision_key(ud, d, name) def latest_versionstring(self, ud, d): """ @@ -1578,6 +1607,16 @@ class FetchMethod(object): """ return ('', '') + def done(self, ud, d): + """ + Is the download done ? + """ + if os.path.exists(ud.localpath): + return True + if ud.localpath.find("*") != -1: + return True + return False + class Fetch(object): def __init__(self, urls, d, cache = True, localonly = False, connection_cache = None): if localonly and cache: @@ -1592,8 +1631,11 @@ class Fetch(object): fn = d.getVar('FILE') mc = d.getVar('__BBMULTICONFIG') or "" - if cache and fn and mc + fn in urldata_cache: - self.ud = urldata_cache[mc + fn] + key = None + if cache and fn: + key = mc + fn + str(id(d)) + if key in urldata_cache: + self.ud = urldata_cache[key] for url in urls: if url not in self.ud: @@ -1604,8 +1646,8 @@ class Fetch(object): self.ud[url] = None pass - if fn and cache: - urldata_cache[mc + fn] = self.ud + if key: + urldata_cache[key] = self.ud def localpath(self, url): if url not in self.urls: @@ -1641,7 +1683,7 @@ class Fetch(object): ud = self.ud[u] ud.setup_localpath(self.d) m = ud.method - localpath = "" + done = False if ud.lockfile: lf = bb.utils.lockfile(ud.lockfile) @@ -1649,28 +1691,28 @@ class Fetch(object): try: self.d.setVar("BB_NO_NETWORK", network) - if verify_donestamp(ud, self.d) and not m.need_update(ud, self.d): - localpath = ud.localpath + if m.verify_donestamp(ud, self.d) and not m.need_update(ud, self.d): + done = True elif m.try_premirror(ud, self.d): logger.debug(1, "Trying PREMIRRORS") mirrors = mirror_from_string(self.d.getVar('PREMIRRORS')) - localpath = try_mirrors(self, self.d, ud, mirrors, False) - if localpath: + done = m.try_mirrors(self, ud, self.d, mirrors) + if done: try: # early checksum verification so that if the checksum 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 with premirror download of %s - will attempt other sources." % u) logger.debug(1, str(e)) - localpath = "" + done = False if premirroronly: self.d.setVar("BB_NO_NETWORK", "1") firsterr = None - verified_stamp = verify_donestamp(ud, self.d) - if not localpath and (not verified_stamp or m.need_update(ud, self.d)): + verified_stamp = m.verify_donestamp(ud, self.d) + if not done and (not verified_stamp or m.need_update(ud, self.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 = ud.localpath + done = True # early checksum verify, so that if checksum mismatched, # fetcher still have chance to fetch from mirror - update_stamp(ud, self.d) + m.update_donestamp(ud, self.d) except bb.fetch2.NetworkAccess: raise @@ -1703,14 +1745,14 @@ class Fetch(object): m.clean(ud, self.d) logger.debug(1, "Trying MIRRORS") mirrors = mirror_from_string(self.d.getVar('MIRRORS')) - localpath = try_mirrors(self, self.d, ud, mirrors) + done = m.try_mirrors(self, ud, self.d, mirrors) - if not localpath or ((not os.path.exists(localpath)) and localpath.find("*") == -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) - update_stamp(ud, self.d) + m.update_donestamp(ud, self.d) 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 = mirror_from_string(self.d.getVar('PREMIRRORS')) - ret = try_mirrors(self, self.d, ud, mirrors, True) + ret = m.try_mirrors(self, ud, self.d, mirrors, True) if not ret: # Next try checking from the original uri, u ret = m.checkstatus(self, ud, self.d) if not ret: # Finally, try checking uri, u, from MIRRORS mirrors = mirror_from_string(self.d.getVar('MIRRORS')) - ret = try_mirrors(self, self.d, ud, mirrors, True) + ret = m.try_mirrors(self, ud, self.d, mirrors, True) 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 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. # 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/clearcase.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: # import os -import sys import shutil import bb from bb.fetch2 import FetchMethod @@ -145,18 +144,18 @@ class ClearCase(FetchMethod): basecmd = "%s %s" % (ud.basecmd, command) - if command is 'mkview': + if command == '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) - elif command is 'rmview': + elif command == 'rmview': options.append("-force") options.append("%s" % ud.viewdir) - elif command is 'setcs': + elif command == 'setcs': options.append("-overwrite") options.append(ud.configspecfile) @@ -238,7 +237,7 @@ class ClearCase(FetchMethod): # Clean clearcase meta-data before tar - runfetchcmd('tar -czf "%s" .' % (ud.localpath), d, cleanup = [ud.localpath]) + runfetchcmd('tar -czf "%s" .' % (ud.localpath), d, cleanup = [ud.localpath], workdir = ud.viewdir) # 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. # import os -import logging import bb from bb.fetch2 import FetchMethod, FetchError, MissingParameterError, logger 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 + def clonedir_need_shallow_revs(self, ud, d): + for rev in ud.shallow_revs: + try: + runfetchcmd('%s rev-parse -q --verify %s' % (ud.basecmd, rev), d, quiet=True, workdir=ud.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.exists(ud.fullshallow) @@ -339,19 +349,13 @@ class Git(FetchMethod): runfetchcmd(clone_cmd, d, log=progresshandler) # Update the checkout if needed - needupdate = False - for name in ud.names: - if not self._contains_ref(ud, d, name, ud.clonedir): - needupdate = True - break - - if needupdate: + if self.clonedir_need_update(ud, d): output = runfetchcmd("%s remote" % ud.basecmd, d, quiet=True, workdir=ud.clonedir) if "origin" in output: runfetchcmd("%s remote rm origin" % ud.basecmd, d, workdir=ud.clonedir) runfetchcmd("%s remote add --mirror=fetch origin %s" % (ud.basecmd, repourl), d, workdir=ud.clonedir) - fetch_cmd = "LANG=C %s fetch -f --prune --progress %s refs/*:refs/*" % (ud.basecmd, repourl) + fetch_cmd = "LANG=C %s fetch -f --progress %s refs/*:refs/*" % (ud.basecmd, repourl) if ud.proto.lower() != 'file': bb.fetch2.check_network_access(d, fetch_cmd, ud.url) progresshandler = 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])) + if ud.shallow and ud.write_shallow_tarballs: + missing_rev = self.clonedir_need_shallow_revs(ud, d) + if missing_rev: + raise bb.fetch2.FetchError("Unable to find revision %s even 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.unresolvedrev[name] + # Collapse adjacent slashes + slash_re = re.compile(r"/+") + return "git:" + ud.host + slash_re.sub(".", ud.path) + ud.unresolvedrev[name] def _lsremote(self, ud, d, search): """ @@ -662,7 +673,7 @@ class Git(FetchMethod): # search for version in the line tag = tagregex.search(tag_head) - if tag == None: + if tag is None: continue tag = tag.group('pver') diff --git a/bitbake/lib/bb/fetch2/gitannex.py b/bitbake/lib/bb/fetch2/gitannex.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 # -import os import bb from bb.fetch2.git import Git from bb.fetch2 import runfetchcmd -from bb.fetch2 import logger class GitANNEX(Git): def supports(self, ud, d): diff --git a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.py 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://" requires 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 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) - function(ud, url, module, paths[module], ld) + function(ud, url, module, paths[module], workdir, ld) return submodules != [] @@ -153,7 +154,7 @@ class GitSM(Git): return False def download(self, ud, d): - def download_submodule(ud, url, module, modpath, d): + def download_submodule(ud, url, module, modpath, workdir, d): url += ";bareclone=1;nobranch=1" # 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, workdir=ud.clonedir) + (ud.basecmd, ud.revisions[ud.names[0]]), d, workdir=workdir) except Exception as e: logger.error('gitsm: submodule download failed: %s %s' % (type(e).__name__, str(e))) raise 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_update(ud, d): + tmpdir = tempfile.mkdtemp(dir=d.getVar("DL_DIR")) + runfetchcmd("tar -xzf %s" % ud.fullshallow, d, workdir=tmpdir) + self.process_submodules(ud, tmpdir, download_submodule, d) + shutil.rmtree(tmpdir) + else: + self.process_submodules(ud, ud.clonedir, download_submodule, d) def unpack(self, ud, destdir, d): - def unpack_submodules(ud, url, module, modpath, d): + def unpack_submodules(ud, url, module, modpath, workdir, d): url += ";bareclone=1;nobranch=1" # 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). # 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 = "hg" - ud.setup_revisions(d) - - if 'rev' in ud.parm: - ud.revision = ud.parm['rev'] - elif not ud.revision: - ud.revision = self.latest_revision(ud, d) - # Create paths to mercurial checkouts hgsrcname = '%s_%s_%s' % (ud.module.replace('/', '.'), \ ud.host, ud.path.replace('/', '.')) @@ -74,6 +65,13 @@ class Hg(FetchMethod): ud.localfile = ud.moddir ud.basecmd = d.getVar("FETCHCMD_hg") or "/usr/bin/env hg" + ud.setup_revisions(d) + + if 'rev' in ud.parm: + ud.revision = ud.parm['rev'] + elif not ud.revision: + ud.revision = self.latest_revision(ud, d) + ud.write_tarballs = d.getVar("BB_GENERATE_MIRROR_TARBALLS") def need_update(self, ud, d): @@ -139,7 +137,7 @@ class Hg(FetchMethod): cmd = "%s --config auth.default.prefix=* --config auth.default.username=%s --config auth.default.password=%s --config \"auth.default.schemes=%s\" pull" % (ud.basecmd, ud.user, ud.pswd, proto) else: cmd = "%s pull" % (ud.basecmd) - elif command == "update": + elif command == "update" or command == "up": if ud.user and ud.pswd: cmd = "%s --config auth.default.prefix=* --config auth.default.username=%s --config auth.default.password=%s --config \"auth.default.schemes=%s\" update -C %s" % (ud.basecmd, ud.user, ud.pswd, proto, " ".join(options)) else: @@ -247,12 +245,19 @@ class Hg(FetchMethod): scmdata = ud.parm.get("scmdata", "") if scmdata != "nokeep": + proto = 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=codir) - runfetchcmd("%s up -C %s" % (ud.basecmd, revflag), d, workdir=codir) + if ud.user and ud.pswd: + runfetchcmd("%s --config auth.default.prefix=* --config auth.default.username=%s --config auth.default.password=%s --config \"auth.default.schemes=%s\" pull %s" % (ud.basecmd, ud.user, ud.pswd, proto, ud.moddir), d, workdir=codir) + else: + runfetchcmd("%s pull %s" % (ud.basecmd, ud.moddir), d, workdir=codir) + if ud.user and ud.pswd: + runfetchcmd("%s --config auth.default.prefix=* --config auth.default.username=%s --config auth.default.password=%s --config \"auth.default.schemes=%s\" up -C %s" % (ud.basecmd, ud.user, ud.pswd, proto, revflag), d, workdir=codir) + else: + runfetchcmd("%s up -C %s" % (ud.basecmd, revflag), d, workdir=codir) else: logger.debug(2, "Unpack: extracting source to '" + codir + "'") runfetchcmd("%s archive -t files %s %s" % (ud.basecmd, revflag, codir), d, workdir=ud.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 -The NPM fetcher is used to retrieve files from the npmjs repository +npm fetcher support the SRC_URI with format of: +SRC_URI = "npm://some.registry.url;OptionA=xxx;OptionB=xxx;..." -Usage in the recipe: +Supported SRC_URI options are: - SRC_URI = "npm://registry.npmjs.org/;name=${PN};version=${PV}" - Suported SRC_URI options are: +- package + The npm package name. This is a mandatory parameter. - - name - - version +- version + The npm package version. This is a mandatory parameter. - npm://registry.npmjs.org/${PN}/-/${PN}-${PV}.tgz would become npm://registry.npmjs.org;name=${PN};version=${PV} - The fetcher all triggers off the existence of ud.localpath. If that exists and has the ".done" stamp, its assumed the fetch is good/done +- downloadfilename + Specifies the filename used when storing the downloaded file. +- destsuffix + Specifies the directory to use to unpack the package (default: npm). """ -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 what - # 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 integrity + https://www.w3.org/TR/SRI/ + """ + algo, value = integrity.split("-", maxsplit=1) + return "%ssum" % algo, base64.b64decode(value).hex() + +def npm_unpack(tarball, destdir, d): + """Unpack a npm tarball""" + bb.utils.mkdirhier(destdir) + cmd = "tar --extract --gzip --file=%s" % shlex.quote(tarball) + cmd += " --no-same-owner" + cmd += " --strip-components=1" + runfetchcmd(cmd, d, workdir=destdir) + +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=None): + self.d = d + self.configs = configs + + def run(self, cmd, args=None, configs=None, workdir=None): + """Run npm command in a controlled environment""" + with tempfile.TemporaryDirectory() as tmpdir: + d = bb.data.createCopy(self.d) + d.setVar("HOME", tmpdir) + + cfgfile = os.path.join(tmpdir, "npmrc") + + if not workdir: + workdir = tmpdir + + def _run(cmd): + cmd = "NPM_CONFIG_USERCONFIG=%s " % cfgfile + cmd + cmd = "NPM_CONFIG_GLOBALCONFIG=%s " % cfgfile + cmd + return runfetchcmd(cmd, d, workdir=workdir) + + 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 += " --%s=%s" % (key, shlex.quote(value)) + + return _run(cmd) class Npm(FetchMethod): - - """Class to fetch urls via 'npm'""" - def init(self, d): - pass + """Class to fetch a package from a npm registry""" 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 = None + ud.version = None + ud.registry = None - def debug(self, msg): - logger.debug(1, "NpmFetch: %s", msg) + # Get the 'package' parameter + if "package" in ud.parm: + ud.package = ud.parm.get("package") - 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 = ud.parm.get("version") - def urldata_init(self, ud, d): - """ - init NPM specific variable within url data - """ - if 'downloadfilename' in ud.parm: - ud.basename = ud.parm['downloadfilename'] - else: - ud.basename = os.path.basename(ud.path) - - # can't call it ud.name otherwise fetcher base class will start doing sha1stuff - # TODO: find a way to get an sha1/sha256 manifest of pkg & all deps - ud.pkgname = ud.parm.get("name", None) - if not ud.pkgname: - raise ParameterError("NPM fetcher requires a name parameter", ud.url) - ud.version = ud.parm.get("version", None) if not ud.version: - raise ParameterError("NPM fetcher requires a version parameter", ud.url) - ud.bbnpmmanifest = "%s-%s.deps.json" % (ud.pkgname, ud.version) - ud.bbnpmmanifest = ud.bbnpmmanifest.replace('/', '-') - ud.registry = "http://%s" % (ud.url.replace('npm://', '', 1).split(';'))[0] - prefixdir = "npm/%s" % ud.pkgname - ud.pkgdatadir = d.expand("${DL_DIR}/%s" % prefixdir) - if not os.path.exists(ud.pkgdatadir): - bb.utils.mkdirhier(ud.pkgdatadir) - ud.localpath = d.expand("${DL_DIR}/npm/%s" % ud.bbnpmmanifest) - - self.basecmd = d.getVar("FETCHCMD_wget") or "/usr/bin/env wget -O -t 2 -T 30 -nv --passive-ftp --no-check-certificate " - ud.prefixdir = prefixdir - - ud.write_tarballs = ((d.getVar("BB_GENERATE_MIRROR_TARBALLS") or "0") != "0") - mirrortarball = 'npm_%s-%s.tar.xz' % (ud.pkgname, ud.version) - mirrortarball = mirrortarball.replace('/', '-') - ud.fullmirror = os.path.join(d.getVar("DL_DIR"), mirrortarball) - ud.mirrortarballs = [mirrortarball] + raise MissingParameterError("Parameter 'version' required", ud.url) - def need_update(self, ud, d): - if os.path.exists(ud.localpath): - return False - return True - - def _runpack(self, ud, d, pkgfullname: str, quiet=False) -> 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 = d.getVar("DL_DIR") - dldir = os.path.join(dldir, ud.prefixdir) - - command = "npm pack {} --registry {}".format(pkgfullname, ud.registry) - logger.debug(2, "Fetching {} using command '{}' in {}".format(pkgfullname, command, dldir)) - filename = runfetchcmd(command, d, quiet, workdir=dldir) - return filename.rstrip() - - def _unpackdep(self, ud, pkg, data, destdir, dldir, d): - file = data[pkg]['tgz'] - logger.debug(2, "file to extract is %s" % file) - if file.endswith('.tgz') or file.endswith('.tar.gz') or file.endswith('.tar.Z'): - cmd = 'tar xz --strip 1 --no-same-owner --warning=no-unknown-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 = d.getVar('PATH') - if path: - cmd = "PATH=\"%s\" %s" % (path, cmd) - bb.note("Unpacking %s to %s/" % (file, destdir)) - ret = subprocess.call(cmd, preexec_fn=subprocess_setup, shell=True, cwd=destdir) - - if ret != 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 = d.getVar("DL_DIR") - with open("%s/npm/%s" % (dldir, ud.bbnpmmanifest)) as datafile: - workobj = json.load(datafile) - dldir = "%s/%s" % (os.path.dirname(ud.localpath), ud.pkgname) - - if 'subdir' in ud.parm: - unpackdir = '%s/%s' % (destdir, ud.parm.get('subdir')) + if not is_semver(ud.version) and not ud.version == "latest": + raise ParameterError("Invalid 'version' parameter", ud.url) + + # Extract the 'registry' part of the url + ud.registry = 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 = d.expand(ud.parm["downloadfilename"]) else: - unpackdir = '%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 = json.loads(output); - try: - return pdata[-1] - except: - return pdata - - def _getdependencies(self, pkg, data, version, d, ud, optional=False, fetchedlist=None): - if fetchedlist is None: - fetchedlist = [] - pkgfullname = pkg - if version != '*' and not '/' in version: - pkgfullname += "@'%s'" % version - if pkgfullname in fetchedlist: - return - - logger.debug(2, "Calling getdeps on %s" % pkg) - fetchcmd = "npm view %s --json --registry %s" % (pkgfullname, ud.registry) - output = runfetchcmd(fetchcmd, d, True) - pdata = self._parse_view(output) - if not pdata: - raise FetchError("The command '%s' returned no output" % fetchcmd) - if optional: - pkg_os = pdata.get('os', None) - if pkg_os: - if not isinstance(pkg_os, list): - pkg_os = [pkg_os] - blacklist = False - for item in pkg_os: - if item.startswith('!'): - blacklist = True - break - if (not blacklist and 'linux' not in pkg_os) or '!linux' in pkg_os: - logger.debug(2, "Skipping %s since it's incompatible with Linux" % pkg) - return - filename = self._runpack(ud, d, pkgfullname) - data[pkg] = {} - data[pkg]['tgz'] = filename - fetchedlist.append(pkgfullname) - - dependencies = pdata.get('dependencies', {}) - optionalDependencies = pdata.get('optionalDependencies', {}) - dependencies.update(optionalDependencies) - depsfound = {} - optdepsfound = {} - data[pkg]['deps'] = {} - for dep in dependencies: - if dep in optionalDependencies: - optdepsfound[dep] = dependencies[dep] + ud.localfile = npm_localfile(ud.package, ud.version) + + # Get the base 'npm' command + ud.basecmd = 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 the + # resolved URI is created to avoid unwanted network access (if the file + # already exists). The management of the donestamp file, the lockfile + # and the checksums are forwarded to the proxy fetcher. + ud.proxy = None + ud.needdonestamp = False + ud.resolvefile = self.localpath(ud, d) + ".resolved" + + def _resolve_proxy_url(self, ud, d): + def _npm_view(): + configs = [] + configs.append(("json", "true")) + configs.append(("registry", ud.registry)) + pkgver = shlex.quote(ud.package + "@" + ud.version) + cmd = ud.basecmd + " view %s" % pkgver + env = NpmEnvironment(d) + check_network_access(d, cmd, ud.registry) + view_string = env.run(cmd, configs=configs) + + if not view_string: + raise FetchError("Unavailable package %s" % pkgver, ud.url) + + try: + view = json.loads(view_string) + + error = view.get("error") + if error is not None: + raise FetchError(error.get("summary"), ud.url) + + if ud.version == "latest": + bb.warn("The npm package %s is using the latest " \ + "version available. This could lead to " \ + "non-reproducible builds." % pkgver) + elif ud.version != 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 = view.get("dist", {}).get("tarball") + + if tarball_url is None: + raise FetchError("Invalid 'dist.tarball' in view", ud.url) + + uri = URI(tarball_url) + uri.params["downloadfilename"] = ud.localfile + + integrity = view.get("dist", {}).get("integrity") + shasum = view.get("dist", {}).get("shasum") + + if integrity is not None: + checksum_name, checksum_expected = npm_integrity(integrity) + uri.params[checksum_name] = checksum_expected + elif shasum is not None: + uri.params["sha1sum"] = shasum else: - depsfound[dep] = dependencies[dep] - for dep, version in optdepsfound.items(): - self._getdependencies(dep, data[pkg]['deps'], version, d, ud, optional=True, fetchedlist=fetchedlist) - for dep, version in depsfound.items(): - self._getdependencies(dep, data[pkg]['deps'], version, d, ud, fetchedlist=fetchedlist) - - def _getshrinkeddependencies(self, pkg, data, version, d, ud, lockdown, manifest, toplevel=True): - logger.debug(2, "NPM shrinkwrap file is %s" % data) - if toplevel: - name = data.get('name', None) - if name and name != pkg: - for obj in data.get('dependencies', []): - if obj == pkg: - self._getshrinkeddependencies(obj, data['dependencies'][obj], data['dependencies'][obj]['version'], d, ud, lockdown, manifest, False) - return - - pkgnameWithVersion = "{}@{}".format(pkg, version) - logger.debug(2, "Get dependencies for {}".format(pkgnameWithVersion)) - filename = self._runpack(ud, d, pkgnameWithVersion) - manifest[pkg] = {} - manifest[pkg]['tgz'] = filename - manifest[pkg]['deps'] = {} - - if pkg in lockdown: - sha1_expected = lockdown[pkg][version] - sha1_data = bb.utils.sha1_file("npm/%s/%s" % (ud.pkgname, manifest[pkg]['tgz'])) - if sha1_expected != sha1_data: - msg = "\nFile: '%s' has %s checksum %s when %s was expected" % (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.url) - if 'dependencies' in data: - for obj in data['dependencies']: - logger.debug(2, "Found dep is %s" % str(obj)) - self._getshrinkeddependencies(obj, data['dependencies'][obj], data['dependencies'][obj]['version'], d, ud, lockdown, manifest[pkg]['deps'], False) + return str(uri) + + url = _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 = f.read() + + # Avoid conflicts between the environment data and: + # - the proxy url checksum + data = bb.data.createCopy(d) + data.delVarFlags("SRC_URI") + ud.proxy = Fetch([url], data) + + def _get_proxy_method(self, ud, d): + self._setup_proxy(ud, d) + proxy_url = ud.proxy.urls[0] + proxy_ud = ud.proxy.ud[proxy_url] + proxy_d = 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 = 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 = 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 == "latest": + return True + proxy_m, proxy_ud, proxy_d = 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 = self._get_proxy_method(ud, d) + return proxy_m.try_mirrors(fetch, proxy_ud, proxy_d, mirrors) def download(self, ud, d): """Fetch url""" - jsondepobj = {} - shrinkobj = {} - lockdown = {} - - if not os.listdir(ud.pkgdatadir) and os.path.exists(ud.fullmirror): - dest = d.getVar("DL_DIR") - bb.utils.mkdirhier(dest) - runfetchcmd("tar -xJf %s" % (ud.fullmirror), d, workdir=dest) - return - - if ud.parm.get("noverify", None) != '1': - shwrf = d.getVar('NPM_SHRINKWRAP') - logger.debug(2, "NPM shrinkwrap file is %s" % shwrf) - if shwrf: - try: - with open(shwrf) as datafile: - shrinkobj = 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 = d.getVar('NPM_LOCKDOWN') - logger.debug(2, "NPM lockdown file is %s" % lckdf) - if lckdf: - try: - with open(lckdf) as datafile: - lockdown = 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, ud) - else: - self._getshrinkeddependencies(ud.pkgname, shrinkobj, ud.version, 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 filesystem with PREMIRROR - if os.path.islink(ud.fullmirror): - os.unlink(ud.fullmirror) - - dldir = d.getVar("DL_DIR") - logger.info("Creating tarball of npm data") - runfetchcmd("tar -cJf %s npm/%s npm/%s" % (ud.fullmirror, ud.bbnpmmanifest, ud.pkgname), d, - workdir=dldir) - runfetchcmd("touch %s.done" % (ud.fullmirror), d, workdir=dldir) + self._setup_proxy(ud, d) + ud.proxy.download() + + def unpack(self, ud, rootdir, d): + """Unpack the downloaded archive""" + destsuffix = ud.parm.get("destsuffix", "npm") + destdir = 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 = 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.py 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 = "npmsw://some.registry.url;OptionA=xxx;OptionB=xxx;..." + +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=None, dev=False): + """ + Run a callback for each dependencies of a shrinkwrap file. + The callback is using the format: + callback(name, params, deptree) + with: + name = the package name (string) + params = the package parameters (dictionary) + deptree = the package dependency tree (array of strings) + """ + def _walk_deps(deps, deptree): + for name in deps: + subtree = [*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 = re.sub(r"^npmsw://", "", ud.url.split(";")[0]) + + # Get the 'dev' parameter + ud.dev = bb.utils.to_boolean(ud.parm.get("dev"), False) + + # Resolve the dependencies + ud.deps = [] + + def _resolve_dependency(name, params, deptree): + url = None + localpath = None + extrapaths = [] + destsubdirs = [os.path.join("node_modules", dep) for dep in deptree] + destsuffix = os.path.join(*destsubdirs) + + integrity = params.get("integrity", None) + resolved = params.get("resolved", None) + version = params.get("version", None) + + # Handle registry sources + if is_semver(version) and resolved and integrity: + localfile = npm_localfile(name, version) + + uri = URI(resolved) + uri.params["downloadfilename"] = localfile + + checksum_name, checksum_expected = npm_integrity(integrity) + uri.params[checksum_name] = checksum_expected + + url = str(uri) + + localpath = 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 = 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 = os.path.join("npm2", os.path.basename(version)) + + uri = URI(version) + uri.params["downloadfilename"] = localfile + + checksum_name, checksum_expected = npm_integrity(integrity) + uri.params[checksum_name] = checksum_expected + + url = str(uri) + + localpath = os.path.join(d.getVar("DL_DIR"), localfile) + + # Handle git sources + elif version.startswith("git"): + regex = re.compile(r""" + ^ + git\+ + (?P[a-z]+) + :// + (?P[^#]+) + \# + (?P[0-9a-f]+) + $ + """, re.VERBOSE) + + match = regex.match(version) + + if not match: + raise ParameterError("Invalid git url: %s" % version, ud.url) + + groups = match.groupdict() + + uri = URI("git://" + str(groups["url"])) + uri.params["protocol"] = str(groups["protocol"]) + uri.params["rev"] = str(groups["rev"]) + uri.params["destsuffix"] = destsuffix + + url = 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 = json.load(f) + except Exception as e: + raise ParameterError("Invalid shrinkwrap file: %s" % str(e), ud.url) + + foreach_dependencies(shrinkwrap, _resolve_dependency, ud.dev) + + # Avoid conflicts between the environment data and: + # - the proxy url revision + # - the proxy url checksum + data = bb.data.createCopy(d) + data.delVar("SRCREV") + data.delVarFlags("SRC_URI") + + # This fetcher resolves multiple URIs from a shrinkwrap file and then + # forwards it to a proxy fetcher. The management of the donestamp file, + # the lockfile and the checksums are forwarded to the proxy fetcher. + ud.proxy = Fetch([dep["url"] for dep in ud.deps], data) + ud.needdonestamp = False + + @staticmethod + def _foreach_proxy_method(ud, handle): + returns = [] + for proxy_url in ud.proxy.urls: + proxy_ud = ud.proxy.ud[proxy_url] + proxy_d = 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 = d.getVar("S") + destsuffix = ud.parm.get("destsuffix") + if destsuffix: + destdir = os.path.join(rootdir, destsuffix) + + bb.utils.mkdirhier(destdir) + bb.utils.copyfile(ud.shrinkwrap_file, + os.path.join(destdir, "npm-shrinkwrap.json")) + + auto = [dep["url"] for dep in ud.deps if not dep["localpath"]] + manual = [dep for dep in ud.deps if dep["localpath"]] + + if auto: + ud.proxy.unpack(destdir, auto) + + for dep in manual: + depdestdir = 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. """ -import os -import sys import logging import bb from bb.fetch2 import FetchMethod @@ -43,7 +41,7 @@ class Osc(FetchMethod): else: pv = d.getVar("PV", False) rev = bb.fetch2.srcrev_internal_helper(ud, d) - if rev and rev != True: + if rev: ud.revision = rev else: ud.revision = "" diff --git a/bitbake/lib/bb/fetch2/perforce.py b/bitbake/lib/bb/fetch2/perforce.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 Schurig 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 == 'changes': p4cmd = '%s%s changes -m 1 //%s' % (ud.basecmd, p4opt, pathnrev) elif command == 'print': - if depot_filename != None: + if depot_filename is not None: p4cmd = '%s%s print -o "p4/%s" "%s"' % (ud.basecmd, p4opt, 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: import re, os from bb.fetch2 import FetchMethod -from bb.fetch2 import FetchError -from bb.fetch2 import logger from bb.fetch2 import runfetchcmd @@ -60,7 +58,7 @@ class SSH(FetchMethod): '''Class to fetch a module or modules via Secure Shell''' def supports(self, urldata, d): - return __pattern__.match(urldata.url) != None + return __pattern__.match(urldata.url) is not None 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 Schurig import os -import sys -import logging import bb import re from bb.fetch2 import FetchMethod @@ -49,7 +47,7 @@ class Svn(FetchMethod): svndir = d.getVar("SVNDIR") or (d.getVar("DL_DIR") + "/svn") relpath = self._strip_leading_slashes(ud.path) ud.pkgdir = os.path.join(svndir, ud.host, relpath) - ud.moddir = os.path.join(ud.pkgdir, ud.module) + ud.moddir = 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 = os.path.join(ud.pkgdir, "svn.lock") @@ -124,30 +122,30 @@ class Svn(FetchMethod): try: if os.access(os.path.join(ud.moddir, '.svn'), os.R_OK): - svnupdatecmd = self._buildsvncommand(ud, d, "update") + svncmd = 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=ud.moddir) except FetchError: pass - logger.debug(1, "Running %s", svnupdatecmd) - bb.fetch2.check_network_access(d, svnupdatecmd, ud.url) - runfetchcmd(svnupdatecmd, d, workdir=ud.moddir) + logger.debug(1, "Running %s", svncmd) + bb.fetch2.check_network_access(d, svncmd, ud.url) + runfetchcmd(svncmd, d, workdir=ud.moddir) else: - svnfetchcmd = self._buildsvncommand(ud, d, "fetch") + svncmd = 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=ud.pkgdir) + logger.debug(1, "Running %s", svncmd) + bb.fetch2.check_network_access(d, svncmd, ud.url) + runfetchcmd(svncmd, d, workdir=ud.pkgdir) if not ("externals" in ud.parm and ud.parm["externals"] == "nowarn"): # Warn the user if this had externals (won't catch them all) output = runfetchcmd("svn propget svn:externals || true", d, workdir=ud.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_URI as necessary.") bb.warn("svn fetch has ignored externals:\n%s" % output) 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 Schurig +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 = self.basecmd if 'downloadfilename' in ud.parm: - dldir = d.getVar("DL_DIR") - bb.utils.mkdirhier(os.path.dirname(dldir + os.sep + ud.localfile)) - fetchcmd += " -O " + dldir + os.sep + ud.localfile + localpath = os.path.join(d.getVar("DL_DIR"), ud.localfile) + bb.utils.mkdirhier(os.path.dirname(localpath)) + fetchcmd += " -O %s" % shlex.quote(localpath) if ud.user and ud.pswd: fetchcmd += " --user=%s --password=%s --auth-no-challenge" % (ud.user, ud.pswd) @@ -302,6 +300,7 @@ class Wget(FetchMethod): # Some servers (FusionForge, as used on Alioth) require that the # optional Accept header is set. r.add_header("Accept", "*/*") + r.add_header("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-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 # -import os, logging, re, sys +import os, logging, re import bb logger = logging.getLogger("BitBake.Monitor") 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 @@ -100,6 +99,9 @@ class BBLogFormatter(logging.Formatter): def enable_color(self): self.color_enabled = True + def __repr__(self): + return "%s fmt='%s' color=%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 = level @@ -118,60 +120,59 @@ class BBLogFilter(object): return True return False -class BBLogFilterStdErr(BBLogFilter): +class LogFilterGEQLevel(logging.Filter): + def __init__(self, level): + self.strlevel = str(level) + self.level = stringToLevel(level) + + def __repr__(self): + return "%s level >= %s (%d)" % (self.__class__.__name__, self.strlevel, self.level) + 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) + +class LogFilterLTLevel(logging.Filter): + def __init__(self, level): + self.strlevel = str(level) + self.level = stringToLevel(level) + + def __repr__(self): + return "%s level < %s (%d)" % (self.__class__.__name__, self.strlevel, self.level) -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) # Message control functions # -loggerDefaultDebugLevel = 0 +loggerDefaultLogLevel = BBLogFormatter.NOTE loggerDefaultVerbose = False loggerVerboseLogs = False -loggerDefaultDomains = [] +loggerDefaultDomains = {} def init_msgconfig(verbose, debug, debug_domains=None): """ Set default verbosity and debug levels config the logger """ - bb.msg.loggerDefaultDebugLevel = debug bb.msg.loggerDefaultVerbose = verbose if verbose: bb.msg.loggerVerboseLogs = True - if debug_domains: - bb.msg.loggerDefaultDomains = debug_domains - else: - bb.msg.loggerDefaultDomains = [] - -def constructLogOptions(): - debug = loggerDefaultDebugLevel - verbose = loggerDefaultVerbose - domains = loggerDefaultDomains if debug: - level = BBLogFormatter.DEBUG - debug + 1 + bb.msg.loggerDefaultLogLevel = BBLogFormatter.DEBUG - debug + 1 elif verbose: - level = BBLogFormatter.VERBOSE + bb.msg.loggerDefaultLogLevel = BBLogFormatter.VERBOSE else: - level = BBLogFormatter.NOTE + bb.msg.loggerDefaultLogLevel = BBLogFormatter.NOTE - debug_domains = {} - for (domainarg, iterator) in groupby(domains): - dlevel = len(tuple(iterator)) - debug_domains["BitBake.%s" % domainarg] = logging.DEBUG - dlevel + 1 - return level, debug_domains + bb.msg.loggerDefaultDomains = {} + if debug_domains: + for (domainarg, iterator) in groupby(debug_domains): + dlevel = len(tuple(iterator)) + bb.msg.loggerDefaultDomains["BitBake.%s" % domainarg] = logging.DEBUG - dlevel + 1 + +def constructLogOptions(): + return loggerDefaultLogLevel, loggerDefaultDomains def addDefaultlogFilter(handler, cls = BBLogFilter, forcelevel=None): level, debug_domains = constructLogOptions() @@ -181,6 +182,19 @@ def addDefaultlogFilter(handler, cls = BBLogFilter, forcelevel=None): cls(handler, level, debug_domains) +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 = copy.deepcopy(logconfig) + userconfig = copy.deepcopy(userconfig) + + # Merge config with the default config + if userconfig.get('version') != 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 = 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 = 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"] = ulogger["level"] + + if "propagate" in ulogger: + l["propagate"] = 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] = userconfig["loggers"][name] + + return logconfig + +def setLoggingConfig(defaultconfig, userconfigfile=None): + logconfig = 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 = yaml.load(f) + elif userconfigfile.endswith('.json') or userconfigfile.endswith('.cfg'): + import json + userconfig = json.load(f) + else: + raise BaseException("Unrecognized file format: %s" % userconfigfile) + + if userconfig.get('bitbake_merge', True): + logconfig = mergeLoggingConfig(logconfig, userconfig) + else: + # Replace the entire default config + logconfig = userconfig + + # Convert all level parameters to integers in case users want to use the + # bitbake defined level names + for h in logconfig["handlers"].values(): + if "level" in h: + h["level"] = bb.msg.stringToLevel(h["level"]) + + for l in logconfig["loggers"].values(): + if "level" in l: + l["level"] = bb.msg.stringToLevel(l["level"]) + + conf = logging.config.dictConfigClass(logconfig) + conf.configure() + + # The user may have specified logging domains they want at a higher debug + # level than the standard. + for name, l in logconfig["loggers"].items(): + if not name.startswith("BitBake."): + continue + + if not "level" in l: + continue + + curlevel = bb.msg.loggerDefaultDomains.get(name) + # Note: level parameter should already be a int because of conversion + # above + newlevel = int(l["level"]) + if curlevel is None or newlevel < curlevel: + bb.msg.loggerDefaultDomains[name] = newlevel + + # TODO: I don't think that setting the global log level should be necessary + #if newlevel < bb.msg.loggerDefaultLogLevel: + # bb.msg.loggerDefaultLogLevel = 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 # -import re -import string -import logging import bb -import itertools from bb import methodpool from bb.parse import logger @@ -93,7 +89,7 @@ class DataNode(AstNode): self.groupd = groupd def getFunc(self, key, data): - if 'flag' in self.groupd and self.groupd['flag'] != None: + if 'flag' in self.groupd and self.groupd['flag'] is not None: return data.getVarFlag(key, self.groupd['flag'], expand=False, noweakdefault=True) else: return data.getVar(key, False, noweakdefault=True, parsing=True) @@ -106,36 +102,36 @@ class DataNode(AstNode): 'file': self.filename, 'line': self.lineno, } - if "exp" in groupd and groupd["exp"] != None: + if "exp" in groupd and groupd["exp"] is not None: data.setVarFlag(key, "export", 1, op = 'exported', **loginfo) op = "set" - if "ques" in groupd and groupd["ques"] != None: + if "ques" in groupd and groupd["ques"] is not None: val = self.getFunc(key, data) op = "set?" - if val == None: + if val is None: val = groupd["value"] - elif "colon" in groupd and groupd["colon"] != None: + elif "colon" in groupd and groupd["colon"] is not None: e = data.createCopy() op = "immediate" val = e.expand(groupd["value"], key + "[:=]") - elif "append" in groupd and groupd["append"] != None: + elif "append" in groupd and groupd["append"] is not None: op = "append" val = "%s %s" % ((self.getFunc(key, data) or ""), groupd["value"]) - elif "prepend" in groupd and groupd["prepend"] != None: + elif "prepend" in groupd and groupd["prepend"] is not None: op = "prepend" val = "%s %s" % (groupd["value"], (self.getFunc(key, data) or "")) - elif "postdot" in groupd and groupd["postdot"] != None: + elif "postdot" in groupd and groupd["postdot"] is not None: op = "postdot" val = "%s%s" % ((self.getFunc(key, data) or ""), groupd["value"]) - elif "predot" in groupd and groupd["predot"] != None: + elif "predot" in groupd and groupd["predot"] is not None: op = "predot" val = "%s%s" % (groupd["value"], (self.getFunc(key, data) or "")) else: val = groupd["value"] flag = None - if 'flag' in groupd and groupd['flag'] != None: + if 'flag' in groupd and groupd['flag'] is not None: flag = groupd['flag'] elif groupd["lazyques"]: flag = "_defaultval" diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/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 @@ # import re, bb, os -import logging import bb.build, bb.utils -from bb import data 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 = data.getVar('FILE', False) abs_fn = resolve_file(fn, data) - f = open(abs_fn, 'r') - - statements = ast.StatementGroup() - lineno = 0 - while True: - lineno = lineno + 1 - s = f.readline() - if not s: - break - w = s.strip() - # skip empty lines - if not w: - continue - s = s.rstrip() - while s[-1] == '\\': - s2 = f.readline().rstrip() + with open(abs_fn, 'r') as f: + + statements = ast.StatementGroup() + lineno = 0 + while True: lineno = lineno + 1 - if (not s2 or s2 and s2[0] != "#") and s[0] == "#" : - bb.fatal("There is a confusing multiline, partially commented expression on line %s of file %s (%s).\nPlease clarify whether this is all a comment or should be parsed." % (lineno, fn, s)) - s = s[:-1] + s2 - # skip comments - if s[0] == '#': - continue - feeder(lineno, s, abs_fn, statements) + s = f.readline() + if not s: + break + w = s.strip() + # skip empty lines + if not w: + continue + s = s.rstrip() + while s[-1] == '\\': + s2 = f.readline().rstrip() + lineno = lineno + 1 + if (not s2 or s2 and s2[0] != "#") and s[0] == "#" : + bb.fatal("There is a confusing multiline, partially commented expression on line %s of file %s (%s).\nPlease clarify whether this is all a comment or should be parsed." % (lineno, fn, s)) + s = s[:-1] + s2 + # skip comments + if s[0] == '#': + continue + feeder(lineno, s, abs_fn, statements) # 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.py 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') + # Ensure the entire transaction (including SELECT) executes under write lock + cursor.execute("BEGIN EXCLUSIVE") + cursor.execute("SELECT * from %s where key=?;" % self.table, [key]) row = 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 # -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, preferred_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 to start with that version after removing the '%' """ - if (pr == preferred_r or preferred_r == None): - if (pe == preferred_e or preferred_e == None): + if pr == preferred_r or preferred_r is None: + if pe == preferred_e or preferred_e is None: if preferred_v == pv: return True - if preferred_v != 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 pv.startswith(preferred_v[:len(preferred_v)-1]): return True return False 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): def p_separator_op(p): """separator_op : COMMA + | COMMA COMMA | AMP""" p[0] = p[1] 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 = cooker self.datastores = {} self.locked = [] + self.datastores[0] = self.cooker.data self.nextindex = 1 def __len__(self): return len(self.datastores) 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] = self.cooker.data + return self.datastores[key] 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] - def receive_datastore(self, remote_data): - """Receive a datastore object sent from the client (as prepared by transmit_datastore())""" - dct = dict(remote_data) - d = bb.data_smart.DataSmart() - d.dict = dct - while True: - if '_remote_data' in dct: - dsindex = dct['_remote_data']['_content'] - del dct['_remote_data'] - if dsindex is None: - dct['_data'] = self.cooker.data.dict - else: - dct['_data'] = self.datastores[dsindex].dict - break - elif '_data' in dct: - idct = dict(dct['_data']) - dct['_data'] = idct - dct = 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 = dct['_remote_data']['_content'].dsindex - newdct = dct.copy() - newdct['_remote_data'] = {'_content': dsindex} - return list(newdct.items()) - elif '_data' in dct: - newdct = dct.copy() - newdata = copy_dicts(dct['_data']) - if newdata: - newdct['_data'] = newdata - return list(newdct.items()) - return None - main_dict = 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 bblogger = logging.getLogger("BitBake") logger = logging.getLogger("BitBake.RunQueue") +hashequiv_logger = logging.getLogger("BitBake.RunQueue.HashEquiv") __find_sha256__ = re.compile( r'(?i)(? 0 and self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and self.check_dependencies(nexttask, self.sqdata.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" % nexttask) del self.sq_deferred[nexttask] - valid = self.rq.validate_hashes(set([nexttask]), self.cooker.data, 0, False) + valid = self.rq.validate_hashes(set([nexttask]), self.cooker.data, 0, False, summary=False) if not valid: logger.debug(1, "%s didn't become valid, skipping setscene" % nexttask) self.sq_task_failoutright(nexttask) @@ -2052,7 +2059,7 @@ class RunQueueExecute: self.update_holdofftasks() if not self.sq_live and not self.sqdone and not self.sq_deferred and not self.updated_taskhash_queue and not self.holdoff_tasks: - logger.info("Setscene tasks completed") + hashequiv_logger.verbose("Setscene tasks completed") err = self.summarise_scenequeue_errors() if err: @@ -2090,6 +2097,7 @@ class RunQueueExecute: logger.debug(2, "Stamp current task %s", task) self.task_skip(task, "existing") + self.runq_tasksrun.add(task) return True taskdep = self.rqdata.dataCaches[mc].task_deps[taskfn] @@ -2248,6 +2256,7 @@ class RunQueueExecute: def process_possible_migrations(self): changed = set() + toprocess = 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)) if unihash != self.rqdata.runtaskentries[tid].unihash: - logger.info("Task %s unihash changed to %s" % (tid, unihash)) + hashequiv_logger.verbose("Task %s unihash changed to %s" % (tid, unihash)) self.rqdata.runtaskentries[tid].unihash = unihash bb.parse.siggen.set_unihash(tid, unihash) + toprocess.add(tid) - # Work out all tasks which depend on this one - total = set() - next = set(self.rqdata.runtaskentries[tid].revdeps) - while next: - current = next.copy() - total = total |next - next = set() - for ntid in current: - next |= self.rqdata.runtaskentries[ntid].revdeps - next.difference_update(total) - - # Now iterate those tasks in dependency order to regenerate their taskhash/unihash - done = set() - next = set(self.rqdata.runtaskentries[tid].revdeps) - while next: - current = next.copy() - next = set() - for tid in current: - if not self.rqdata.runtaskentries[tid].depends.isdisjoint(total): - continue - procdep = [] - for dep in self.rqdata.runtaskentries[tid].depends: - procdep.append(dep) - orighash = self.rqdata.runtaskentries[tid].hash - self.rqdata.runtaskentries[tid].hash = bb.parse.siggen.get_taskhash(tid, procdep, self.rqdata.dataCaches[mc_from_tid(tid)]) - origuni = self.rqdata.runtaskentries[tid].unihash - self.rqdata.runtaskentries[tid].unihash = bb.parse.siggen.get_unihash(tid) - logger.debug(1, "Task %s hash changes: %s->%s %s->%s" % (tid, orighash, self.rqdata.runtaskentries[tid].hash, origuni, self.rqdata.runtaskentries[tid].unihash)) - next |= self.rqdata.runtaskentries[tid].revdeps - changed.add(tid) - total.remove(tid) - next.intersection_update(total) + # Work out all tasks which depend upon these + total = set() + next = set() + for p in toprocess: + next |= self.rqdata.runtaskentries[p].revdeps + while next: + current = next.copy() + total = total | next + next = set() + for ntid in current: + next |= self.rqdata.runtaskentries[ntid].revdeps + next.difference_update(total) + + # Now iterate those tasks in dependency order to regenerate their taskhash/unihash + next = set() + for p in total: + if len(self.rqdata.runtaskentries[p].depends) == 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 = next.copy() + next = set() + for tid in current: + if len(self.rqdata.runtaskentries[p].depends) and not self.rqdata.runtaskentries[tid].depends.isdisjoint(total): + continue + orighash = self.rqdata.runtaskentries[tid].hash + newhash = bb.parse.siggen.get_taskhash(tid, self.rqdata.runtaskentries[tid].depends, self.rqdata.dataCaches[mc_from_tid(tid)]) + origuni = self.rqdata.runtaskentries[tid].unihash + newuni = bb.parse.siggen.get_unihash(tid) + # FIXME, need to check it can come from sstate at all for determinism? + remapped = False + if newuni == origuni: + # Nothing to do, we match, skip code below + remapped = 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, origuni, newuni, self.rqdata.dataCaches) + hashequiv_logger.verbose("Already covered setscene for %s so ignoring rehash (remap)" % (tid)) + remapped = 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 = newhash + self.rqdata.runtaskentries[tid].unihash = newuni + changed.add(tid) + + next |= self.rqdata.runtaskentries[tid].revdeps + total.remove(tid) + next.intersection_update(total) 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"" + pickle.dumps(bb.parse.siggen.get_taskhashes()) + b"") - logger.debug(1, pprint.pformat("Tasks changed:\n%s" % (changed))) + hashequiv_logger.debug(1, pprint.pformat("Tasks changed:\n%s" % (changed))) 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 rehash" % (tid)) - continue if tid not in self.pending_migrations: self.pending_migrations.add(tid) + update_tasks = [] 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 = 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_complete: - logger.debug(2, "Task %s is running which blocks setscene for %s from running" % (dep, tid)) + hashequiv_logger.debug(2, "Task %s is running which blocks setscene for %s from running" % (dep, tid)) valid = 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_tasksrun: + bb.error("Task %s marked as completed but now needing to rerun? Aborting build." % dep) + self.failed_tids.append(tid) + self.rq.state = runQueueCleanUp + return + if dep not in self.runq_complete: if dep in self.tasks_scenequeue_done and dep not in self.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_covered | self.scenequeue_notcovered): + harddepfail = False + for t in self.sqdata.sq_harddeps: + if tid in self.sqdata.sq_harddeps[t] and t in self.scenequeue_notcovered: + harddepfail = True + break + if not harddepfail and self.sqdata.sq_revdeps[tid].issubset(self.scenequeue_covered | self.scenequeue_notcovered): if tid not in self.sq_buildable: self.sq_buildable.add(tid) if len(self.sqdata.sq_revdeps[tid]) == 0: @@ -2361,9 +2402,17 @@ class RunQueueExecute: if tid in self.build_stamps: del self.build_stamps[tid] - logger.info("Setscene task %s now valid and being rerun" % tid) + update_tasks.append((tid, harddepfail, tid in self.sqdata.valid)) + + if update_tasks: self.sqdone = False - update_scenequeue_data([tid], self.sqdata, self.rqdata, self.rq, self.cooker, self.stampcache, self) + update_scenequeue_data([t[0] for t in update_tasks], self.sqdata, self.rqdata, self.rq, self.cooker, self.stampcache, self, summary=False) + + 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) if changed: self.holdoff_need_update = True @@ -2500,6 +2549,8 @@ class RunQueueExecute: msg = 'Task %s.%s attempted to execute unexpectedly and should have been setscened' % (pn, taskname) else: msg = 'Task %s.%s attempted to execute unexpectedly' % (pn, taskname) + for t in self.scenequeue_notcovered: + msg = msg + "\nTask %s, unihash %s, taskhash %s" % (t, self.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.scenequeue_notcovered)) return True return False @@ -2692,9 +2743,9 @@ def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq): sqdata.stamppresent = set() sqdata.valid = set() - 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=True) -def update_scenequeue_data(tids, sqdata, rqdata, rq, cooker, stampcache, sqrq): +def update_scenequeue_data(tids, sqdata, rqdata, rq, cooker, stampcache, sqrq, summary=True): tocheck = set() @@ -2728,7 +2779,7 @@ def update_scenequeue_data(tids, sqdata, rqdata, rq, cooker, stampcache, sqrq): tocheck.add(tid) - sqdata.valid |= rq.validate_hashes(tocheck, cooker.data, len(sqdata.stamppresent), False) + sqdata.valid |= rq.validate_hashes(tocheck, cooker.data, len(sqdata.stamppresent), False, summary=summary) sqdata.hashes = {} for mc in sorted(sqdata.multiconfigs): @@ -2750,7 +2801,7 @@ def update_scenequeue_data(tids, sqdata, rqdata, rq, cooker, stampcache, sqrq): sqdata.hashes[h] = tid else: sqrq.sq_deferred[tid] = sqdata.hashes[h] - bb.warn("Deferring %s after %s" % (tid, sqdata.hashes[h])) + bb.note("Deferring %s after %s" % (tid, sqdata.hashes[h])) class TaskFailure(Exception): @@ -2907,7 +2958,12 @@ class runQueuePipe(): while index != -1 and self.queue.startswith(b""): try: event = pickle.loads(self.queue[7:index]) - except ValueError as e: + except (ValueError, pickle.UnpicklingError, AttributeError, IndexError) as e: + if isinstance(e, pickle.UnpicklingError) and "truncated" in str(e): + # The pickled data could contain "" so search for the next occurance + # unpickling again, this should be the only way an unpickle error could occur + index = self.queue.find(b"", 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 != -1 and self.queue.startswith(b""): try: task, status = 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 = True diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.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): self.event_handle = None self.haveui = False - self.lastui = False + self.maxuiwait = 30 self.xmlrpc = False self._idlefuns = {} @@ -155,6 +155,7 @@ class ProcessServer(multiprocessing.Process): print("No timeout, exiting.") self.quit = True + self.lastui = 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) - if not self.timeout == -1.0 and not self.haveui and self.lastui and self.timeout and \ + if not self.timeout == -1.0 and not self.haveui and self.timeout and \ (self.lastui + self.timeout) < time.time(): print("Server timeout, exiting.") self.quit = True + # If we don't see a UI connection within maxuiwait, its unlikely we're going to see + # one. We have had issue with processes hanging indefinitely so timing out UI-less + # servers is useful. + if not self.haveui and not self.timeout and (self.lastui + self.maxuiwait) < time.time(): + print("No UI connection within max timeout, exiting to avoid infinite loop.") + self.quit = True + if self.command_channel in ready: try: command = self.command_channel.get() @@ -220,10 +228,13 @@ class ProcessServer(multiprocessing.Process): print("Exiting") # Remove the socket file so we don't get any more connections to avoid races - os.unlink(self.sockname) + try: + os.unlink(self.sockname) + except: + pass self.sock.close() - try: + try: self.cooker.shutdown(True) self.cooker.notifier.stop() self.cooker.confignotifier.stop() @@ -243,7 +254,7 @@ class ProcessServer(multiprocessing.Process): lock = bb.utils.lockfile(lockfile, shared=False, retry=False, block=True) if lock: # We hold the lock so we can remove the file (hide stale pid data) - bb.utils.remove(lockfile) + # via unlockfile. bb.utils.unlockfile(lock) return @@ -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 the bitbake server") + logger.info("No reply from server in 30s") + if not self.recv.poll(30): + raise ProcessTimeout("Timeout while waiting for a reply from the bitbake server (60s)") return self.recv.get() 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 # -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 # -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 logger = logging.getLogger('BitBake.SigGen') +hashequiv_logger = logging.getLogger('BitBake.SigGen.HashEquiv') def init(d): siggens = [obj for obj in globals().values() @@ -40,18 +42,26 @@ class SignatureGenerator(object): def __init__(self, data): self.basehash = {} self.taskhash = {} + self.unihash = {} self.runtaskdeps = {} self.file_checksum_values = {} self.taints = {} self.unitaskhashes = {} - self.setscenetasks = {} + self.tidtopn = {} + self.setscenetasks = set() def finalise(self, fn, d, varient): return + def postparsing_clean_cache(self): + return + def get_unihash(self, tid): return self.taskhash[tid] + def prep_taskhash(self, tid, deps, dataCache): + return + def get_taskhash(self, tid, deps, dataCache): self.taskhash[tid] = hashlib.sha256(tid.encode("utf-8")).hexdigest() return self.taskhash[tid] @@ -76,19 +86,19 @@ class SignatureGenerator(object): return 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_checksum_values, self.taints, self.basehash, self.unitaskhashes, self.tidtopn, self.setscenetasks) def set_taskdata(self, data): - self.runtaskdeps, self.taskhash, self.file_checksum_values, self.taints, self.basehash, self.unitaskhashes, self.setscenetasks = data + self.runtaskdeps, self.taskhash, self.unihash, self.file_checksum_values, self.taints, self.basehash, self.unitaskhashes, self.tidtopn, self.setscenetasks = data def reset(self, data): self.__init__(data) def get_taskhashes(self): - return self.taskhash, self.unitaskhashes + return self.taskhash, self.unihash, self.unitaskhashes, self.tidtopn def set_taskhashes(self, hashes): - self.taskhash, self.unitaskhashes = hashes + self.taskhash, self.unihash, self.unitaskhashes, self.tidtopn = hashes def save_unitaskhashes(self): return @@ -104,13 +114,14 @@ class SignatureGeneratorBasic(SignatureGenerator): def __init__(self, data): self.basehash = {} self.taskhash = {} + self.unihash = {} self.taskdeps = {} self.runtaskdeps = {} self.file_checksum_values = {} self.taints = {} self.gendeps = {} self.lookupcache = {} - self.setscenetasks = {} + self.setscenetasks = set() self.basewhitelist = set((data.getVar("BB_HASHBASE_WHITELIST") or "").split()) self.taskwhitelist = None self.init_rundepcheck(data) @@ -121,8 +132,10 @@ class SignatureGeneratorBasic(SignatureGenerator): else: self.checksum_cache = None - self.unihash_cache = bb.cache.SimpleCache("1") + self.unihash_cache = bb.cache.SimpleCache("3") self.unitaskhashes = self.unihash_cache.init_cache(data, "bb_unihashes.dat", {}) + self.localdirsexclude = (data.getVar("BB_SIGNATURE_LOCAL_DIRS_EXCLUDE") or "CVS .bzr .git .hg .osc .p4 .repo .svn").split() + self.tidtopn = {} def init_rundepcheck(self, data): self.taskwhitelist = data.getVar("BB_HASHTASK_WHITELIST") or None @@ -134,7 +147,7 @@ class SignatureGeneratorBasic(SignatureGenerator): def _build_data(self, fn, d): ignore_mismatch = ((d.getVar("BB_HASH_IGNORE_MISMATCH") or '') == '1') - tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d) + tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d, self.basewhitelist) taskdeps, basehash = bb.data.generate_dependency_hash(tasklist, gendeps, lookupcache, self.basewhitelist, fn) @@ -157,7 +170,7 @@ class SignatureGeneratorBasic(SignatureGenerator): return taskdeps def set_setscene_tasks(self, setscene_tasks): - self.setscenetasks = setscene_tasks + self.setscenetasks = set(setscene_tasks) def finalise(self, fn, d, variant): @@ -180,6 +193,14 @@ class SignatureGeneratorBasic(SignatureGenerator): for task in taskdeps: d.setVar("BB_BASEHASH_task-%s" % task, self.basehash[fn + ":" + task]) + def postparsing_clean_cache(self): + # + # After parsing we can remove some things from memory to reduce our memory footprint + # + self.gendeps = {} + self.lookupcache = {} + self.taskdeps = {} + 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 whitelist @@ -198,15 +219,17 @@ class SignatureGeneratorBasic(SignatureGenerator): pass return taint - def get_taskhash(self, tid, deps, dataCache): + def prep_taskhash(self, tid, deps, dataCache): (mc, _, task, fn) = bb.runqueue.split_tid_mcfn(tid) - data = dataCache.basetaskhash[tid] - self.basehash[tid] = data + self.basehash[tid] = dataCache.basetaskhash[tid] self.runtaskdeps[tid] = [] self.file_checksum_values[tid] = [] recipename = dataCache.pkg_fn[fn] + + self.tidtopn[tid] = recipename + for dep in sorted(deps, key=clean_basepath): (depmc, _, deptaskname, depfn) = bb.runqueue.split_tid_mcfn(dep) if mc != 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 dependency order?" % dep) - data = data + self.get_unihash(dep) self.runtaskdeps[tid].append(dep) if task in dataCache.file_checksums[fn]: if self.checksum_cache: - checksums = self.checksum_cache.get_checksums(dataCache.file_checksums[fn][task], recipename) + checksums = self.checksum_cache.get_checksums(dataCache.file_checksums[fn][task], recipename, self.localdirsexclude) else: - checksums = bb.fetch2.get_file_checksums(dataCache.file_checksums[fn][task], recipename) + checksums = 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 = data + cs taskdep = 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 = str(uuid.uuid4()) - data = data + taint - self.taints[tid] = "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 = str(uuid.uuid4()) + self.taints[tid] = "nostamp:" + taint taint = self.read_taint(fn, task, dataCache.stamp[fn]) if taint: - data = data + taint self.taints[tid] = taint logger.warning("%s is tainted from a forced run" % tid) + return + + def get_taskhash(self, tid, deps, dataCache): + + data = self.basehash[tid] + for dep in self.runtaskdeps[tid]: + if dep in self.unihash: + if self.unihash[dep] is None: + data = data + self.taskhash[dep] + else: + data = data + self.unihash[dep] + else: + data = data + self.get_unihash(dep) + + for (f, cs) in self.file_checksum_values[tid]: + if cs: + data = data + cs + + if tid in self.taints: + if self.taints[tid].startswith("nostamp:"): + data = data + self.taints[tid][8:] + else: + data = data + self.taints[tid] + h = hashlib.sha256(data.encode("utf-8")).hexdigest() self.taskhash[tid] = h #d.setVar("BB_TASKHASH_task-%s" % task, taskhash[task]) @@ -371,50 +417,66 @@ class SignatureGeneratorBasicHash(SignatureGeneratorBasic): bb.build.write_taint(task, d, fn) class SignatureGeneratorUniHashMixIn(object): + def __init__(self, data): + self.extramethod = {} + 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() def set_taskdata(self, data): - self.server, self.method = data[:2] - super().set_taskdata(data[2:]) + self.server, self.method, self.extramethod = data[:3] + super().set_taskdata(data[3:]) def client(self): if getattr(self, '_client', None) is None: self._client = hashserv.create_client(self.server) return self._client - 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 changes, # but it would result in the same output hash - unihash = self.unitaskhashes.get(self.__get_task_unihash_key(tid), None) + unihash = self._get_unihash(tid) if unihash is not None: return unihash return super().get_stampfile_hash(tid) def set_unihash(self, tid, unihash): - self.unitaskhashes[self.__get_task_unihash_key(tid)] = unihash + (mc, fn, taskname, taskfn) = bb.runqueue.split_tid_mcfn(tid) + key = mc + ":" + self.tidtopn[tid] + ":" + taskname + self.unitaskhashes[key] = (self.taskhash[tid], unihash) + self.unihash[tid] = unihash + + def _get_unihash(self, tid, checkkey=None): + if tid not in self.tidtopn: + return None + (mc, fn, taskname, taskfn) = bb.runqueue.split_tid_mcfn(tid) + key = mc + ":" + self.tidtopn[tid] + ":" + taskname + if key not in self.unitaskhashes: + return None + if not checkkey: + checkkey = self.taskhash[tid] + (key, unihash) = self.unitaskhashes[key] + if key != checkkey: + return None + return unihash def get_unihash(self, tid): taskhash = self.taskhash[tid] # If its not a setscene task we can return if self.setscenetasks and tid not in self.setscenetasks: + self.unihash[tid] = None return taskhash - key = self.__get_task_unihash_key(tid) - # TODO: This cache can grow unbounded. It probably only needs to keep # for each task - unihash = self.unitaskhashes.get(key, None) + unihash = self._get_unihash(tid) if unihash is not None: + self.unihash[tid] = unihash return unihash # In the absence of being able to discover a unique hash from the @@ -433,19 +495,23 @@ class SignatureGeneratorUniHashMixIn(object): unihash = taskhash try: - data = self.client().get_unihash(self.method, self.taskhash[tid]) + method = self.method + if tid in self.extramethod: + method = method + self.extramethod[tid] + data = self.client().get_unihash(method, self.taskhash[tid]) if data: unihash = data # A unique hash equal to the taskhash is not very interesting, # so it is reported it at debug level 2. If they differ, that # is much more interesting, so it is reported at debug level 1 - bb.debug((1, 2)[unihash == taskhash], 'Found unihash %s in place of %s for %s from %s' % (unihash, taskhash, tid, self.server)) + hashequiv_logger.debug((1, 2)[unihash == taskhash], 'Found unihash %s in place of %s for %s from %s' % (unihash, taskhash, tid, self.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 from %s' % (tid, taskhash, self.server)) except hashserv.client.HashConnectionError as e: bb.warn('Error contacting Hash Equivalence Server %s: %s' % (self.server, str(e))) - self.unitaskhashes[key] = unihash + self.set_unihash(tid, unihash) + self.unihash[tid] = unihash return unihash def report_unihash(self, path, task, d): @@ -457,13 +523,17 @@ class SignatureGeneratorUniHashMixIn(object): tempdir = d.getVar('T') fn = d.getVar('BB_FILENAME') tid = fn + ':do_' + task - key = tid.rsplit("/", 1)[1] + ':' + taskhash + key = tid + ':' + taskhash if self.setscenetasks and tid not in self.setscenetasks: return + # This can happen if locked sigs are in action. Detect and just abort + if taskhash != self.taskhash[tid]: + return + # Sanity checks - cache_unihash = self.unitaskhashes.get(key, None) + cache_unihash = self._get_unihash(tid, checkkey=taskhash) if cache_unihash is None: bb.fatal('%s not in unihash cache. Please report this error' % key) @@ -502,14 +572,20 @@ class SignatureGeneratorUniHashMixIn(object): extra_data['task'] = task extra_data['outhash_siginfo'] = sigfile.read().decode('utf-8') - data = self.client().report_unihash(taskhash, self.method, outhash, unihash, extra_data) + method = self.method + if tid in self.extramethod: + method = method + self.extramethod[tid] + + data = self.client().report_unihash(taskhash, method, outhash, unihash, extra_data) new_unihash = data['unihash'] if new_unihash != unihash: - bb.debug(1, 'Task %s unihash changed %s -> %s by server %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 + def report_unihash_equiv(self, tid, taskhash, wanted_unihash, current_unihash, datacaches): + try: + extra_data = {} + method = self.method + if tid in self.extramethod: + method = method + self.extramethod[tid] + + data = 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 = data['unihash'] + + if finalunihash == current_unihash: + hashequiv_logger.verbose('Task %s unihash %s unchanged by server' % (tid, finalunihash)) + elif finalunihash == 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 unwanted hash %s' % (tid, finalunihash)) + + except hashserv.client.HashConnectionError as e: + bb.warn('Error contacting Hash Equivalence Server %s: %s' % (self.server, str(e))) + + return False # # 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=self.get_dependees(item), reasons=["No eligible PROVIDERs exist for '%s'" % item]), cfgData) raise bb.providers.NoProvider(item) - if len(eligible) > 1 and foundUnique == False: + if len(eligible) > 1 and not foundUnique: if item not in self.consider_msgs_cache: providers_list = [] for fn in eligible: diff --git a/bitbake/lib/bb/tests/cooker.py b/bitbake/lib/bb/tests/cooker.py index 090916e..74c903f 100644 --- a/bitbake/lib/bb/tests/cooker.py +++ b/bitbake/lib/bb/tests/cooker.py @@ -5,7 +5,6 @@ # 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 @@ # import unittest -import os + 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 = bb.data.generate_dependencies(d) + tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d, set()) taskdeps, basehash = bb.data.generate_dependency_hash(tasklist, 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') -# 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 = None - def __init__(self, d): - self.d = 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 = self.d.createCopy() - for key in d.localkeys(): - localdata.setVar(d.getVar(key)) - varparse = 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 = bb.data.init() - d1.enableTracking() - d2 = bb.data.init() - d2.enableTracking() - connector = 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.variable('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 = bb.data.init() - self.d = bb.data.init() - self.d1["foo"] = "value_of_foo" - self.d1["bar"] = "value_of_bar" - self.d1["value_of_foo"] = "value_of_'value_of_foo'" - connector = TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteNestedExpansions(TestNestedExpansions): - def setUp(self): - self.d1 = bb.data.init() - self.d = bb.data.init() - self.d1["foo"] = "foo" - self.d1["bar"] = "bar" - self.d1["value_of_foobar"] = "187" - connector = TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteConcat(TestConcat): - def setUp(self): - self.d1 = bb.data.init() - self.d = bb.data.init() - self.d1.setVar("FOO", "foo") - self.d1.setVar("VAL", "val") - self.d1.setVar("BAR", "bar") - connector = TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteConcatOverride(TestConcatOverride): - def setUp(self): - self.d1 = bb.data.init() - self.d = bb.data.init() - self.d1.setVar("FOO", "foo") - self.d1.setVar("VAL", "val") - self.d1.setVar("BAR", "bar") - connector = TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteOverrides(TestOverrides): - def setUp(self): - self.d1 = bb.data.init() - self.d = bb.data.init() - self.d1.setVar("OVERRIDES", "foo:bar:local") - self.d1.setVar("TEST", "testvalue") - connector = TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteKeyExpansion(TestKeyExpansion): - def setUp(self): - self.d1 = bb.data.init() - self.d = bb.data.init() - self.d1.setVar("FOO", "foo") - self.d1.setVar("BAR", "foo") - connector = TestConnector(self.d1) - self.d.setVar('_remote_data', connector) - -class TestRemoteFlags(TestFlags): - def setUp(self): - self.d1 = bb.data.init() - self.d = 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 = TestConnector(self.d1) - self.d.setVar('_remote_data', connector) diff --git a/bitbake/lib/bb/tests/fetch-testdata/apple/cups/releases b/bitbake/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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Releases · apple/cups · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content + + + + + + + + + + + +
+ +
+ + +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + +
+ +
+
+
+ + Latest release + + + +
+ + + + +
+ +
+
+
+
+ v2.3.1 +
+ + + Latest release + + +
+ + +

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

+
+ + + +
+

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

+
    +
  • Documentation updates (Issue #5661, #5674, #5682)
  • +
  • CVE-2019-2228: The ippSetValuetag function did not validate 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 fail
    +(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 distribution
    +permissions are wrong (Issue #5658)
  • +
  • Added paint can labels to Dymo driver (Issue #5662)
  • +
  • The ippeveprinter program now supports authentication (Issue #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 script (Issue #5671)
  • +
  • Sandboxed applications were not able to get the default printer (Issue #5676)
  • +
  • Log file access controls were not preserved by cupsctl (Issue #5677)
  • +
  • Default printers set with lpoptions did not work in all cases (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 ippeveprinter.
  • +
  • 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 +
+
+ +
+ + +
+
+ +
+ + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+
+ v2.2.13 +
+ + +
+ + +

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

+
+ + + +
+

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 validate 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 ippserver.
  • +
  • The libusb-based USB backend now reports an error when the distribution
    +permissions are wrong (Issue #5658)
  • +
  • Default printers set with lpoptions did not work in all cases (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 +
+
+ +
+ + +
+
+ +
+ + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+
+ v2.3.0 +
+ + +
+ + +

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

+
+ + + +
+

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 number 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://51685251)
  • +
  • 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 files
    +(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 level so
    +it is clear what happened (Issue #5604)
  • +
  • The lpadmin command did not always update the PPD file for changes to the
    +cupsIPPSupplies and cupsSNMPSupplies keywords (Issue #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 belongs
    +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 collections
    +(Issue #5630)
  • +
  • The configure script now treats the "wheel" group as a potential system
    +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 not
    +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 +
+
+ +
+ + +
+
+ +
+ + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+
+ v2.2.12 +
+ + +
+ + +

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

+
+ + + +
+

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://51685251)
  • +
  • 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 octetString values
    +correctly (Issue #5557)
  • +
  • The scheduler did not encode octetString values like "job-password" correctly
    +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 #5583)
  • +
  • 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 for changes to the
    +cupsIPPSupplies and cupsSNMPSupplies keywords (Issue #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 belongs
    +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 collections
    +(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 not
    +shared (rdar://52561199)
  • +
  • Fixed a command ordering issue in the Zebra ZPL driver.
  • +
  • Fixed a memory leak in ppdOpen.
  • +
+

Enjoy!

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

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

+
+ + + +
+

CUPS 2.3rc1 is now available for download. This is the first release 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 "polish" issues. This beta also includes the new ippeveprinter utility. Changes include:

+
    +
  • The cups-config script no longer adds extra libraries when 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 #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 #5583)
  • +
  • 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-8601
    +relative time values such as "PT30S" for 30 seconds in the future.
  • +
+

Enjoy!

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

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

+
+ + + +
+

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" correctly
    +for the print filters (Issue #5558)
  • +
  • The cupsCheckDestSupported function did not check octetString values
    +correctly (Issue #5557)
  • +
  • Added support for UserAgentTokens directive in "client.conf" (Issue #5555)
  • +
  • Updated the systemd service file for cupsd (Issue #5551)
  • +
  • The ippValidateAttribute function did not catch all instances of invalid
    +UTF-8 strings (Issue #5509)
  • +
  • Fixed an issue with the self-signed certificates generated by GNU TLS
    +(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)
  • +
  • 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 (Issue #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 alternate
    +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 ippserver sample code.
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+
+ v2.2.11 +
+ + +
+ + +

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

+
+ + + +
+

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

+
    +
  • 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)
  • +
  • Fixed an issue with the self-signed certificates generated by GNU TLS
    +(Issue #5506)
  • +
  • The ippValidateAttribute function did not catch all instances of invalid
    +UTF-8 strings (Issue #5509)
  • +
  • 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 alternate
    +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 +
+
+ +
+ + +
+
+ +
+ + + +
+ +
+
+
+ + Pre-release + + + +
+ + + + +
+ +
+
+
+
+ v2.3b7 +
+ + + Pre-release + + +
+ + +

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

+
+ + + +
+

CUPS 2.3b7 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 IPP 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 +
+
+ +
+ + +
+
+ +
+ + + +
+ +
+
+
+ + Pre-release + + + +
+ + + + +
+ +
+
+
+
+ v2.3b6 +
+ + + Pre-release + + +
+ + +

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

+
+ + + +
+

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 IPP presets and finishing templates, and fixes a number of bugs and “polish” 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 printers that have not yet been added as local queues (Issue #5045)
  • +
  • The lpadmin command would create a non-working printer in some error cases (Issue #5305)
  • +
  • The scheduler would crash if an empty AccessLog directive was specified (Issue #5309)
  • +
  • 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 values (Issue #5340)
  • +
  • The IPP Everywhere "driver" now properly supports face-up printers (Issue #5345)
  • +
  • Fixed some typos in the label printer drivers (Issue #5350)
  • +
  • Setting the Community name to the empty string in snmp.conf now disables SNMP supply level monitoring by all the standard 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 printing 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 #5398)
  • +
  • Added USB quirk rules (Issue #5395, Issue #5420, Issue #5443)
  • +
  • The generated PPD files for IPP Everywhere printers did not contain the cupsManualCopies keyword (Issue #5433)
  • +
  • Kerberos credentials might be truncated (Issue #5435)
  • +
  • The handling of MaxJobTime 0 did not match the documentation (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 attributes were in the operation group (rdar://41098178)
  • +
  • Authentication in the web interface did not work on macOS (rdar://41444473)
  • +
  • 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 (rdar://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 +
+
+ +
+ + +
+
+ +
+ + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+
+ v2.2.10 +
+ + +
+ + +

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

+
+ + + +
+

CUPS 2.2.10 is a bug fix release that addresses issues in the scheduler, IPP Everywhere support, CUPS library, and USB printer support. Changes include:

+
    +
  • CVE-2018-4300: Linux session cookies used a predictable random number seed.
  • +
  • The lpoptions command now works with IPP Everywhere printers that have not yet been added as local queues (Issue #5045)
  • +
  • Added USB quirk rules (Issue #5395, Issue #5443)
  • +
  • The generated PPD files for IPP Everywhere printers did not contain the cupsManualCopies keyword (Issue #5433)
  • +
  • Kerberos credentials might be truncated (Issue #5435)
  • +
  • The handling of MaxJobTime 0 did not match the documentation (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 (rdar://46183976)
  • +
+

Enjoy!

+
+ + +
+ +
+ + + Assets + 4 +
+
+ +
+ + +
+
+ +
+ +
+ +
+ +
+ + +
+
+ +
+
+ + +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + + + +
+ + + + diff --git a/bitbake/lib/bb/tests/fetch-testdata/debian/pool/main/d/db5.3/index.html b/bitbake/lib/bb/tests/fetch-testdata/debian/pool/main/d/db5.3/index.html new file mode 100644 index 0000000..a5a6f48 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/debian/pool/main/d/db5.3/index.html @@ -0,0 +1,509 @@ + + + + Index of /debian/pool/main/d/db5.3 + + +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSize

[PARENTDIR]Parent Directory  -
[   ]db5.3-doc_5.3.28+dfsg1-0.5_all.deb2019-02-26 10:57 15M
[   ]db5.3-doc_5.3.28+dfsg1-0.6_all.deb2019-03-12 05:28 15M
[   ]db5.3-doc_5.3.28-9+deb8u1_all.deb2017-11-18 20:15 18M
[   ]db5.3-doc_5.3.28-12+deb9u1_all.deb2017-09-28 09:42 18M
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 21K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 19K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 20K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 19K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 22K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 19K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 19K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 19K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 23K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 20K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 21K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 19K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 20K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 19K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 22K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 19K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 19K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 23K
[   ]db5.3-sql-util_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 20K
[   ]db5.3-sql-util_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 21K
[   ]db5.3-sql-util_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 20K
[   ]db5.3-sql-util_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 19K
[   ]db5.3-sql-util_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 22K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 20K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 18K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 20K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 19K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 22K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 19K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 19K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 19K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 19K
[   ]db5.3-sql-util_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 20K
[   ]db5.3-util_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 63K
[   ]db5.3-util_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 63K
[   ]db5.3-util_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 58K
[   ]db5.3-util_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 59K
[   ]db5.3-util_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 65K
[   ]db5.3-util_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 62K
[   ]db5.3-util_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 64K
[   ]db5.3-util_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 63K
[   ]db5.3-util_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 69K
[   ]db5.3-util_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 64K
[   ]db5.3-util_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 63K
[   ]db5.3-util_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 63K
[   ]db5.3-util_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 58K
[   ]db5.3-util_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 59K
[   ]db5.3-util_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 65K
[   ]db5.3-util_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 64K
[   ]db5.3-util_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 63K
[   ]db5.3-util_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 69K
[   ]db5.3-util_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 64K
[   ]db5.3-util_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 63K
[   ]db5.3-util_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 60K
[   ]db5.3-util_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 61K
[   ]db5.3-util_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 65K
[   ]db5.3-util_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 63K
[   ]db5.3-util_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 60K
[   ]db5.3-util_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 60K
[   ]db5.3-util_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 61K
[   ]db5.3-util_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 66K
[   ]db5.3-util_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 62K
[   ]db5.3-util_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 64K
[   ]db5.3-util_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 63K
[   ]db5.3-util_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 60K
[   ]db5.3-util_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 64K
[   ]db5.3_5.3.28+dfsg1-0.5.debian.tar.xz2019-02-26 08:51 28K
[   ]db5.3_5.3.28+dfsg1-0.5.dsc2019-02-26 08:51 2.7K
[   ]db5.3_5.3.28+dfsg1-0.6.debian.tar.xz2019-03-12 04:27 29K
[   ]db5.3_5.3.28+dfsg1-0.6.dsc2019-03-12 04:27 3.1K
[   ]db5.3_5.3.28+dfsg1.orig.tar.xz2018-08-09 01:52 19M
[   ]db5.3_5.3.28-9+deb8u1.debian.tar.xz2017-11-18 20:15 28K
[   ]db5.3_5.3.28-9+deb8u1.dsc2017-11-18 20:15 3.2K
[   ]db5.3_5.3.28-12+deb9u1.debian.tar.xz2017-09-24 16:26 28K
[   ]db5.3_5.3.28-12+deb9u1.dsc2017-09-24 16:26 3.2K
[   ]db5.3_5.3.28.orig.tar.xz2013-10-27 14:01 23M
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 760K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 722K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 668K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 692K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 842K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 773K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 801K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 789K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 816K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 693K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 759K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 722K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 668K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 692K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 842K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 801K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 789K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 816K
[   ]libdb5.3++-dev_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 693K
[   ]libdb5.3++-dev_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 740K
[   ]libdb5.3++-dev_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 643K
[   ]libdb5.3++-dev_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 672K
[   ]libdb5.3++-dev_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 780K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 757K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 663K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 676K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 690K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 836K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 768K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 795K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 786K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 701K
[   ]libdb5.3++-dev_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 714K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 690K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 628K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 576K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 600K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 755K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 595K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 604K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 604K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 723K
[   ]libdb5.3++_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 619K
[   ]libdb5.3++_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 690K
[   ]libdb5.3++_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 629K
[   ]libdb5.3++_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 574K
[   ]libdb5.3++_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 600K
[   ]libdb5.3++_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 755K
[   ]libdb5.3++_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 604K
[   ]libdb5.3++_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 604K
[   ]libdb5.3++_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 724K
[   ]libdb5.3++_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 620K
[   ]libdb5.3++_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 691K
[   ]libdb5.3++_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 580K
[   ]libdb5.3++_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 606K
[   ]libdb5.3++_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 749K
[   ]libdb5.3++_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 687K
[   ]libdb5.3++_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 574K
[   ]libdb5.3++_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 575K
[   ]libdb5.3++_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 600K
[   ]libdb5.3++_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 751K
[   ]libdb5.3++_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 593K
[   ]libdb5.3++_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 601K
[   ]libdb5.3++_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 602K
[   ]libdb5.3++_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 618K
[   ]libdb5.3++_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 637K
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 43M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 41M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 43M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 43M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 44M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 43M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 41M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 43M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 42M
[   ]libdb5.3-dbg_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 44M
[   ]libdb5.3-dbg_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 34M
[   ]libdb5.3-dbg_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 35M
[   ]libdb5.3-dbg_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 35M
[   ]libdb5.3-dbg_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 32M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 40M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 40M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 39M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 39M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 38M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 41M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 40M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 39M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 40M
[   ]libdb5.3-dbg_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 42M
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 743K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 707K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 654K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 677K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 822K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 753K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 780K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 769K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 797K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 679K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 743K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 707K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 654K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 677K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 822K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 780K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 769K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 797K
[   ]libdb5.3-dev_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 679K
[   ]libdb5.3-dev_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 725K
[   ]libdb5.3-dev_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 630K
[   ]libdb5.3-dev_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 659K
[   ]libdb5.3-dev_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 766K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 742K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 648K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 660K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 676K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 817K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 748K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 774K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 765K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 682K
[   ]libdb5.3-dev_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 699K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 757K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 720K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 662K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 688K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 840K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 768K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 795K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 784K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 814K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 688K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 756K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 721K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 663K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 688K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 840K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 796K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 785K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 814K
[   ]libdb5.3-java-dev_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 688K
[   ]libdb5.3-java-dev_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 737K
[   ]libdb5.3-java-dev_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 637K
[   ]libdb5.3-java-dev_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 666K
[   ]libdb5.3-java-dev_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 781K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 756K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 657K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 670K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 686K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 836K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 763K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 789K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 780K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 691K
[   ]libdb5.3-java-dev_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 711K
[   ]libdb5.3-java-gcj_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 602K
[   ]libdb5.3-java-gcj_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 455K
[   ]libdb5.3-java-gcj_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 450K
[   ]libdb5.3-java-gcj_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 503K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 602K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 595K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 453K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 447K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 518K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 463K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 474K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 471K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 611K
[   ]libdb5.3-java-gcj_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 578K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 696K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 635K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 580K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 606K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 763K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 596K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 603K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 605K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 732K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 624K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 696K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 636K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 581K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 606K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 762K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 603K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 605K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 733K
[   ]libdb5.3-java-jni_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 625K
[   ]libdb5.3-java-jni_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 696K
[   ]libdb5.3-java-jni_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 583K
[   ]libdb5.3-java-jni_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 612K
[   ]libdb5.3-java-jni_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 754K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 695K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 574K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 580K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 606K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 758K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 593K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 600K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 603K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 618K
[   ]libdb5.3-java-jni_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 641K
[   ]libdb5.3-java_5.3.28+dfsg1-0.5_all.deb2019-02-26 10:57 575K
[   ]libdb5.3-java_5.3.28+dfsg1-0.6_all.deb2019-03-12 05:28 575K
[   ]libdb5.3-java_5.3.28-9+deb8u1_all.deb2017-11-18 20:15 543K
[   ]libdb5.3-java_5.3.28-12+deb9u1_all.deb2017-09-28 09:42 548K
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 1.0M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 968K
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 901K
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 929K
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 1.1M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 1.0M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 1.1M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 1.0M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 1.1M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 938K
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 1.0M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 968K
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 901K
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 929K
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 1.1M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 1.1M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 1.0M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 1.1M
[   ]libdb5.3-sql-dev_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 938K
[   ]libdb5.3-sql-dev_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 1.0M
[   ]libdb5.3-sql-dev_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 869K
[   ]libdb5.3-sql-dev_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 906K
[   ]libdb5.3-sql-dev_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 1.0M
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 1.0M
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 891K
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 910K
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 929K
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 1.1M
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 1.0M
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 1.0M
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 1.0M
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 939K
[   ]libdb5.3-sql-dev_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 965K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 885K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 808K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 737K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 766K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 963K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 777K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 789K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 788K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 928K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 794K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 883K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 808K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 739K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 766K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 963K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 789K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 788K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 927K
[   ]libdb5.3-sql_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 794K
[   ]libdb5.3-sql_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 882K
[   ]libdb5.3-sql_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 742K
[   ]libdb5.3-sql_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 774K
[   ]libdb5.3-sql_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 954K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 879K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 733K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 737K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 766K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 958K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 776K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 786K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 788K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 786K
[   ]libdb5.3-sql_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 817K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 842K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 804K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 751K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 774K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 927K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 856K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 885K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 874K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 900K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 773K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 842K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 804K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 751K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 774K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 927K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 886K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 874K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 900K
[   ]libdb5.3-stl-dev_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 774K
[   ]libdb5.3-stl-dev_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 826K
[   ]libdb5.3-stl-dev_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 727K
[   ]libdb5.3-stl-dev_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 757K
[   ]libdb5.3-stl-dev_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 868K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 838K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 745K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 759K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 773K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 920K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 852K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 880K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 870K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 783K
[   ]libdb5.3-stl-dev_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 795K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 711K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 650K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 592K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 618K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 779K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 614K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 623K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 623K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 746K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 639K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 712K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 649K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 592K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 618K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 779K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 623K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 624K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 746K
[   ]libdb5.3-stl_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 639K
[   ]libdb5.3-stl_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 714K
[   ]libdb5.3-stl_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 599K
[   ]libdb5.3-stl_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 627K
[   ]libdb5.3-stl_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 774K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 707K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 594K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 591K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 617K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 774K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 612K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 620K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 622K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 639K
[   ]libdb5.3-stl_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 657K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 954K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 894K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 805K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 826K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 1.0M
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 921K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 952K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 941K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 1.0M
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 854K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 954K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 894K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 803K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 825K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 1.0M
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 952K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 942K
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 1.0M
[   ]libdb5.3-tcl_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 853K
[   ]libdb5.3-tcl_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 1.1M
[   ]libdb5.3-tcl_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 971K
[   ]libdb5.3-tcl_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 1.0M
[   ]libdb5.3-tcl_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 1.3M
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 949K
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 809K
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 808K
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 823K
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 1.0M
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 915K
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 943K
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 936K
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 871K
[   ]libdb5.3-tcl_5.3.28-12+deb9u1_s390x.deb2017-09-28 09:42 885K
[   ]libdb5.3_5.3.28+dfsg1-0.5_amd64.deb2019-02-26 10:11 667K
[   ]libdb5.3_5.3.28+dfsg1-0.5_arm64.deb2019-02-26 09:56 607K
[   ]libdb5.3_5.3.28+dfsg1-0.5_armel.deb2019-02-26 10:57 558K
[   ]libdb5.3_5.3.28+dfsg1-0.5_armhf.deb2019-02-26 10:57 583K
[   ]libdb5.3_5.3.28+dfsg1-0.5_i386.deb2019-02-26 09:46 730K
[   ]libdb5.3_5.3.28+dfsg1-0.5_mips.deb2019-02-26 10:57 575K
[   ]libdb5.3_5.3.28+dfsg1-0.5_mips64el.deb2019-02-26 12:42 583K
[   ]libdb5.3_5.3.28+dfsg1-0.5_mipsel.deb2019-02-26 12:42 584K
[   ]libdb5.3_5.3.28+dfsg1-0.5_ppc64el.deb2019-02-26 09:56 701K
[   ]libdb5.3_5.3.28+dfsg1-0.5_s390x.deb2019-02-26 09:56 599K
[   ]libdb5.3_5.3.28+dfsg1-0.6_amd64.deb2019-03-12 05:28 667K
[   ]libdb5.3_5.3.28+dfsg1-0.6_arm64.deb2019-03-12 05:28 607K
[   ]libdb5.3_5.3.28+dfsg1-0.6_armel.deb2019-03-12 06:29 559K
[   ]libdb5.3_5.3.28+dfsg1-0.6_armhf.deb2019-03-12 06:14 583K
[   ]libdb5.3_5.3.28+dfsg1-0.6_i386.deb2019-03-12 05:43 730K
[   ]libdb5.3_5.3.28+dfsg1-0.6_mips64el.deb2019-03-12 06:29 583K
[   ]libdb5.3_5.3.28+dfsg1-0.6_mipsel.deb2019-03-12 07:30 584K
[   ]libdb5.3_5.3.28+dfsg1-0.6_ppc64el.deb2019-03-12 05:28 701K
[   ]libdb5.3_5.3.28+dfsg1-0.6_s390x.deb2019-03-12 05:13 598K
[   ]libdb5.3_5.3.28-9+deb8u1_amd64.deb2017-11-20 03:40 664K
[   ]libdb5.3_5.3.28-9+deb8u1_armel.deb2017-11-20 04:26 561K
[   ]libdb5.3_5.3.28-9+deb8u1_armhf.deb2017-12-02 16:26 587K
[   ]libdb5.3_5.3.28-9+deb8u1_i386.deb2017-11-20 03:25 721K
[   ]libdb5.3_5.3.28-12+deb9u1_amd64.deb2017-09-28 09:42 663K
[   ]libdb5.3_5.3.28-12+deb9u1_arm64.deb2017-09-28 09:42 550K
[   ]libdb5.3_5.3.28-12+deb9u1_armel.deb2017-09-28 10:28 556K
[   ]libdb5.3_5.3.28-12+deb9u1_armhf.deb2017-09-28 10:28 581K
[   ]libdb5.3_5.3.28-12+deb9u1_i386.deb2017-09-28 09:27 725K
[   ]libdb5.3_5.3.28-12+deb9u1_mips.deb2017-09-29 16:10 572K
[   ]libdb5.3_5.3.28-12+deb9u1_mips64el.deb2017-09-28 11:29 579K
[   ]libdb5.3_5.3.28-12+deb9u1_mipsel.deb2017-09-28 11:14 581K
[   ]libdb5.3_5.3.28-12+deb9u1_ppc64el.deb2017-09-28 09:27 594K
[   ]libdb5.3_5.3.28-12+deb9u1_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/index.html b/bitbake/lib/bb/tests/fetch-testdata/downloads/enchant/1.6.0/index.html new file mode 100644 index 0000000..b7bfb1e --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/downloads/enchant/1.6.0/index.html @@ -0,0 +1,15 @@ + + + + Index of /downloads/enchant/1.6.0 + + +

Index of /downloads/enchant/1.6.0

+ + + + + +
[ICO]NameLast modifiedSizeDescription

[DIR]Parent Directory  -  
[   ]MD5SUM01-Apr-2010 23:03 55  
[   ]enchant-1.6.0.tar.gz01-Apr-2010 23:02 593K 

+
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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]-*2012-06-07 12:08 0  
[   ]CMakeChangeLog-2.8.02009-11-13 15:41 13K 
[   ]CMakeChangeLog-2.8.12010-03-17 14:37 17K 
[   ]CMakeChangeLog-2.8.22010-06-28 14:37 23K 
[   ]CMakeChangeLog-2.8.32010-11-03 17:21 41K 
[   ]CMakeChangeLog-2.8.42011-02-16 09:15 61K 
[   ]CMakeChangeLog-2.8.52011-07-08 10:49 81K 
[   ]CMakeChangeLog-2.8.62011-12-30 15:30 100K 
[   ]CMakeChangeLog-2.8.72011-12-30 15:31 115K 
[   ]CMakeChangeLog-2.8.82012-04-18 17:47 144K 
[   ]CMakeChangeLog-2.8.92012-08-09 16:29 163K 
[   ]CMakeChangeLog-2.8.102012-10-31 15:09 185K 
[   ]CMakeChangeLog-2.8.10.12012-11-07 11:52 186K 
[   ]CMakeChangeLog-2.8.10.22012-11-27 15:15 186K 
[   ]CMakeChangeLog-2.8.112013-05-16 09:39 218K 
[   ]CMakeChangeLog-2.8.122013-10-11 08:57 247K 
[   ]CMakeChangeLog-2.8.12.12013-11-08 14:33 248K 
[   ]CMakeVS10FindMake.cmake2010-05-27 09:45 1.2K 
[TXT]cmake-2.8.0-AIX-powerpc.sh2010-02-08 10:44 17M 
[   ]cmake-2.8.0-AIX-powerpc.tar.Z2010-02-08 10:44 24M 
[   ]cmake-2.8.0-AIX-powerpc.tar.gz2010-02-08 10:44 17M 
[   ]cmake-2.8.0-Darwin-universal.dmg2009-11-13 15:32 24M 
[   ]cmake-2.8.0-Darwin-universal.tar.Z2009-11-13 15:32 35M 
[   ]cmake-2.8.0-Darwin-universal.tar.gz2009-11-13 15:33 24M 
[TXT]cmake-2.8.0-HP-UX-9000_785.sh2009-11-13 15:32 14M 
[   ]cmake-2.8.0-HP-UX-9000_785.tar.Z2009-11-13 15:32 19M 
[   ]cmake-2.8.0-HP-UX-9000_785.tar.gz2009-11-13 15:32 14M 
[TXT]cmake-2.8.0-IRIX64-64.sh2009-11-13 15:32 9.0M 
[   ]cmake-2.8.0-IRIX64-64.tar.Z2009-11-13 15:32 13M 
[   ]cmake-2.8.0-IRIX64-64.tar.gz2009-11-13 15:32 9.0M 
[TXT]cmake-2.8.0-IRIX64-n32.sh2009-11-13 15:32 8.8M 
[   ]cmake-2.8.0-IRIX64-n32.tar.Z2009-11-13 15:32 13M 
[   ]cmake-2.8.0-IRIX64-n32.tar.gz2009-11-13 15:32 8.8M 
[TXT]cmake-2.8.0-Linux-i386.sh2009-11-13 15:32 15M 
[   ]cmake-2.8.0-Linux-i386.tar.Z2009-11-13 15:32 21M 
[   ]cmake-2.8.0-Linux-i386.tar.gz2009-11-13 15:32 15M 
[TXT]cmake-2.8.0-SunOS-sparc.sh2009-11-13 15:32 10M 
[   ]cmake-2.8.0-SunOS-sparc.tar.Z2009-11-13 15:32 14M 
[   ]cmake-2.8.0-SunOS-sparc.tar.gz2009-11-13 15:32 10M 
[   ]cmake-2.8.0-win32-x86.exe2009-11-13 15:32 7.4M 
[   ]cmake-2.8.0-win32-x86.zip2009-11-13 15:32 9.3M 
[   ]cmake-2.8.0.tar.Z2009-11-13 15:32 5.4M 
[   ]cmake-2.8.0.tar.gz2009-11-13 15:32 3.4M 
[   ]cmake-2.8.0.zip2009-11-13 15:32 4.6M 
[TXT]cmake-2.8.1-AIX-powerpc.sh2010-04-06 14:37 17M 
[   ]cmake-2.8.1-AIX-powerpc.tar.Z2010-04-06 14:37 24M 
[   ]cmake-2.8.1-AIX-powerpc.tar.gz2010-04-06 14:37 17M 
[   ]cmake-2.8.1-Darwin-universal.dmg2010-04-06 14:37 26M 
[   ]cmake-2.8.1-Darwin-universal.tar.Z2010-04-06 14:37 37M 
[   ]cmake-2.8.1-Darwin-universal.tar.gz2010-04-06 14:37 26M 
[TXT]cmake-2.8.1-HP-UX-9000_785.sh2010-04-06 14:37 14M 
[   ]cmake-2.8.1-HP-UX-9000_785.tar.Z2010-04-06 14:37 19M 
[   ]cmake-2.8.1-HP-UX-9000_785.tar.gz2010-04-06 14:37 14M 
[TXT]cmake-2.8.1-IRIX64-64.sh2010-04-06 14:37 9.1M 
[   ]cmake-2.8.1-IRIX64-64.tar.Z2010-04-06 14:37 13M 
[   ]cmake-2.8.1-IRIX64-64.tar.gz2010-04-06 14:37 9.1M 
[TXT]cmake-2.8.1-IRIX64-n32.sh2010-04-06 14:37 8.8M 
[   ]cmake-2.8.1-IRIX64-n32.tar.Z2010-04-06 14:37 13M 
[   ]cmake-2.8.1-IRIX64-n32.tar.gz2010-04-06 14:37 8.8M 
[TXT]cmake-2.8.1-Linux-i386.sh2010-04-06 14:37 15M 
[   ]cmake-2.8.1-Linux-i386.tar.Z2010-04-06 14:37 21M 
[   ]cmake-2.8.1-Linux-i386.tar.gz2010-04-06 14:37 15M 
[TXT]cmake-2.8.1-SunOS-sparc.sh2010-04-06 14:37 10M 
[   ]cmake-2.8.1-SunOS-sparc.tar.Z2010-04-06 14:37 14M 
[   ]cmake-2.8.1-SunOS-sparc.tar.gz2010-04-06 14:37 10M 
[   ]cmake-2.8.1-win32-x86.exe2010-04-06 14:37 7.5M 
[   ]cmake-2.8.1-win32-x86.zip2010-04-06 14:37 9.5M 
[   ]cmake-2.8.1.tar.Z2010-04-06 14:37 5.5M 
[   ]cmake-2.8.1.tar.gz2010-04-06 14:37 3.4M 
[   ]cmake-2.8.1.zip2010-04-06 14:37 4.6M 
[TXT]cmake-2.8.2-AIX-powerpc.sh2010-06-28 14:10 17M 
[   ]cmake-2.8.2-AIX-powerpc.tar.Z2010-06-28 14:09 24M 
[   ]cmake-2.8.2-AIX-powerpc.tar.gz2010-06-28 14:09 17M 
[   ]cmake-2.8.2-Darwin-universal.dmg2010-06-28 14:10 27M 
[   ]cmake-2.8.2-Darwin-universal.tar.Z2010-06-28 14:10 39M 
[   ]cmake-2.8.2-Darwin-universal.tar.gz2010-06-28 14:09 27M 
[TXT]cmake-2.8.2-HP-UX-9000_785.sh2010-06-28 14:09 15M 
[   ]cmake-2.8.2-HP-UX-9000_785.tar.Z2010-06-28 14:10 20M 
[   ]cmake-2.8.2-HP-UX-9000_785.tar.gz2010-06-28 14:10 15M 
[TXT]cmake-2.8.2-IRIX64-64.sh2010-06-28 14:10 9.6M 
[   ]cmake-2.8.2-IRIX64-64.tar.Z2010-06-28 14:09 14M 
[   ]cmake-2.8.2-IRIX64-64.tar.gz2010-06-28 14:10 9.6M 
[TXT]cmake-2.8.2-IRIX64-n32.sh2010-06-28 14:10 9.4M 
[   ]cmake-2.8.2-IRIX64-n32.tar.Z2010-06-28 14:09 14M 
[   ]cmake-2.8.2-IRIX64-n32.tar.gz2010-06-28 14:10 9.3M 
[TXT]cmake-2.8.2-Linux-i386.sh2010-06-28 14:10 15M 
[   ]cmake-2.8.2-Linux-i386.tar.Z2010-06-28 14:09 21M 
[   ]cmake-2.8.2-Linux-i386.tar.gz2010-06-28 14:10 15M 
[TXT]cmake-2.8.2-SunOS-sparc.sh2010-06-28 14:09 10M 
[   ]cmake-2.8.2-SunOS-sparc.tar.Z2010-06-28 14:10 14M 
[   ]cmake-2.8.2-SunOS-sparc.tar.gz2010-06-28 14:10 10M 
[   ]cmake-2.8.2-win32-x86.exe2010-06-28 14:09 7.7M 
[   ]cmake-2.8.2-win32-x86.zip2010-06-28 14:09 9.7M 
[   ]cmake-2.8.2.tar.Z2010-06-28 14:10 8.1M 
[   ]cmake-2.8.2.tar.gz2010-06-28 14:09 5.1M 
[   ]cmake-2.8.2.zip2010-06-28 14:10 6.8M 
[TXT]cmake-2.8.3-AIX-powerpc.sh2010-11-03 17:11 17M 
[   ]cmake-2.8.3-AIX-powerpc.tar.Z2010-11-03 17:11 24M 
[   ]cmake-2.8.3-AIX-powerpc.tar.gz2010-11-03 17:10 17M 
[   ]cmake-2.8.3-Darwin-universal.dmg2010-11-03 17:11 27M 
[   ]cmake-2.8.3-Darwin-universal.tar.Z2010-11-03 17:11 39M 
[   ]cmake-2.8.3-Darwin-universal.tar.gz2010-11-03 17:11 27M 
[TXT]cmake-2.8.3-IRIX64-64.sh2010-11-03 17:11 9.8M 
[   ]cmake-2.8.3-IRIX64-64.tar.Z2010-11-03 17:11 14M 
[   ]cmake-2.8.3-IRIX64-64.tar.gz2010-11-03 17:11 9.8M 
[TXT]cmake-2.8.3-IRIX64-n32.sh2010-11-03 17:10 9.5M 
[   ]cmake-2.8.3-IRIX64-n32.tar.Z2010-11-03 17:11 14M 
[   ]cmake-2.8.3-IRIX64-n32.tar.gz2010-11-03 17:10 9.5M 
[TXT]cmake-2.8.3-Linux-i386.sh2010-11-03 17:11 16M 
[   ]cmake-2.8.3-Linux-i386.tar.Z2010-11-03 17:11 22M 
[   ]cmake-2.8.3-Linux-i386.tar.gz2010-11-03 17:10 16M 
[TXT]cmake-2.8.3-SunOS-sparc.sh2010-11-03 17:10 11M 
[   ]cmake-2.8.3-SunOS-sparc.tar.Z2010-11-03 17:11 15M 
[   ]cmake-2.8.3-SunOS-sparc.tar.gz2010-11-03 17:11 11M 
[   ]cmake-2.8.3-win32-x86.exe2010-11-03 17:11 7.9M 
[   ]cmake-2.8.3-win32-x86.zip2010-11-03 17:11 9.9M 
[   ]cmake-2.8.3.tar.Z2010-11-03 17:11 8.1M 
[   ]cmake-2.8.3.tar.gz2010-11-03 17:11 5.2M 
[   ]cmake-2.8.3.zip2010-11-03 17:11 6.9M 
[TXT]cmake-2.8.4-AIX-powerpc.sh2011-02-15 15:54 17M 
[   ]cmake-2.8.4-AIX-powerpc.tar.Z2011-02-15 15:54 24M 
[   ]cmake-2.8.4-AIX-powerpc.tar.gz2011-02-15 15:53 17M 
[   ]cmake-2.8.4-Darwin-universal.dmg2011-02-15 15:53 28M 
[   ]cmake-2.8.4-Darwin-universal.tar.Z2011-02-15 15:54 39M 
[   ]cmake-2.8.4-Darwin-universal.tar.gz2011-02-15 15:54 27M 
[TXT]cmake-2.8.4-IRIX64-64.sh2011-02-15 15:53 9.9M 
[   ]cmake-2.8.4-IRIX64-64.tar.Z2011-02-15 15:54 15M 
[   ]cmake-2.8.4-IRIX64-64.tar.gz2011-02-15 15:54 9.9M 
[TXT]cmake-2.8.4-IRIX64-n32.sh2011-02-15 15:53 9.7M 
[   ]cmake-2.8.4-IRIX64-n32.tar.Z2011-02-15 15:55 14M 
[   ]cmake-2.8.4-IRIX64-n32.tar.gz2011-02-15 15:54 9.7M 
[TXT]cmake-2.8.4-Linux-i386.sh2011-02-15 15:54 16M 
[   ]cmake-2.8.4-Linux-i386.tar.Z2011-02-15 15:54 22M 
[   ]cmake-2.8.4-Linux-i386.tar.gz2011-02-15 15:54 16M 
[TXT]cmake-2.8.4-SunOS-sparc.sh2011-02-15 15:54 11M 
[   ]cmake-2.8.4-SunOS-sparc.tar.Z2011-02-15 15:54 15M 
[   ]cmake-2.8.4-SunOS-sparc.tar.gz2011-02-15 15:54 11M 
[   ]cmake-2.8.4-win32-x86.exe2011-02-15 15:54 7.9M 
[   ]cmake-2.8.4-win32-x86.zip2011-02-15 15:54 10M 
[   ]cmake-2.8.4.tar.Z2011-02-15 15:54 8.3M 
[   ]cmake-2.8.4.tar.gz2011-02-15 15:54 5.2M 
[   ]cmake-2.8.4.zip2011-02-15 15:54 7.0M 
[   ]cmake-2.8.5-1-src.tar.bz22011-07-08 10:34 4.1M 
[   ]cmake-2.8.5-1.tar.bz22011-07-08 10:34 6.3M 
[TXT]cmake-2.8.5-AIX-powerpc.sh2011-07-08 10:34 17M 
[   ]cmake-2.8.5-AIX-powerpc.tar.Z2011-07-08 10:34 24M 
[   ]cmake-2.8.5-AIX-powerpc.tar.gz2011-07-08 10:34 17M 
[   ]cmake-2.8.5-Darwin-universal.dmg2011-07-08 10:34 28M 
[   ]cmake-2.8.5-Darwin-universal.tar.Z2011-07-08 10:34 40M 
[   ]cmake-2.8.5-Darwin-universal.tar.gz2011-07-08 10:34 28M 
[TXT]cmake-2.8.5-IRIX64-64.sh2011-07-08 10:34 10M 
[   ]cmake-2.8.5-IRIX64-64.tar.Z2011-07-08 10:34 15M 
[   ]cmake-2.8.5-IRIX64-64.tar.gz2011-07-08 10:34 10M 
[TXT]cmake-2.8.5-IRIX64-n32.sh2011-07-08 10:34 9.8M 
[   ]cmake-2.8.5-IRIX64-n32.tar.Z2011-07-08 10:34 15M 
[   ]cmake-2.8.5-IRIX64-n32.tar.gz2011-07-08 10:34 9.8M 
[TXT]cmake-2.8.5-Linux-i386.sh2011-07-08 10:34 16M 
[   ]cmake-2.8.5-Linux-i386.tar.Z2011-07-08 10:34 22M 
[   ]cmake-2.8.5-Linux-i386.tar.gz2011-07-08 10:34 16M 
[TXT]cmake-2.8.5-SunOS-sparc.sh2011-07-08 10:34 11M 
[   ]cmake-2.8.5-SunOS-sparc.tar.Z2011-07-08 10:34 15M 
[   ]cmake-2.8.5-SunOS-sparc.tar.gz2011-07-08 10:34 11M 
[   ]cmake-2.8.5-win32-x86.exe2011-07-08 10:34 8.0M 
[   ]cmake-2.8.5-win32-x86.zip2011-07-08 10:34 10M 
[   ]cmake-2.8.5.tar.Z2011-07-08 10:34 8.3M 
[   ]cmake-2.8.5.tar.gz2011-07-08 10:34 5.3M 
[   ]cmake-2.8.5.zip2011-07-08 10:34 7.0M 
[   ]cmake-2.8.6-1-src.tar.bz22011-10-04 13:59 4.1M 
[   ]cmake-2.8.6-1.tar.bz22011-10-04 13:59 6.4M 
[TXT]cmake-2.8.6-AIX-powerpc.sh2011-10-04 13:59 17M 
[   ]cmake-2.8.6-AIX-powerpc.tar.Z2011-10-04 13:59 25M 
[   ]cmake-2.8.6-AIX-powerpc.tar.gz2011-10-04 13:59 17M 
[   ]cmake-2.8.6-Darwin-universal.dmg2011-10-04 13:59 28M 
[   ]cmake-2.8.6-Darwin-universal.tar.Z2011-10-04 13:59 40M 
[   ]cmake-2.8.6-Darwin-universal.tar.gz2011-10-04 13:59 28M 
[   ]cmake-2.8.6-Darwin64-universal.dmg2011-10-04 13:59 29M 
[   ]cmake-2.8.6-Darwin64-universal.tar.Z2011-10-04 13:59 41M 
[   ]cmake-2.8.6-Darwin64-universal.tar.gz2011-10-04 13:59 29M 
[TXT]cmake-2.8.6-IRIX64-64.sh2011-10-04 13:59 10M 
[   ]cmake-2.8.6-IRIX64-64.tar.Z2011-10-04 13:59 15M 
[   ]cmake-2.8.6-IRIX64-64.tar.gz2011-10-04 13:59 10M 
[TXT]cmake-2.8.6-IRIX64-n32.sh2011-10-04 13:59 10M 
[   ]cmake-2.8.6-IRIX64-n32.tar.Z2011-10-04 13:59 15M 
[   ]cmake-2.8.6-IRIX64-n32.tar.gz2011-10-04 13:59 10M 
[TXT]cmake-2.8.6-Linux-i386.sh2011-10-04 13:59 16M 
[   ]cmake-2.8.6-Linux-i386.tar.Z2011-10-04 13:59 23M 
[   ]cmake-2.8.6-Linux-i386.tar.gz2011-10-04 13:58 16M 
[   ]cmake-2.8.6-win32-x86.exe2011-10-04 13:58 8.2M 
[   ]cmake-2.8.6-win32-x86.zip2011-10-04 13:58 10M 
[   ]cmake-2.8.6.tar.Z2011-10-04 13:58 8.4M 
[   ]cmake-2.8.6.tar.gz2011-10-04 13:58 5.3M 
[   ]cmake-2.8.6.zip2011-10-04 13:58 7.1M 
[   ]cmake-2.8.7-1-src.tar.bz22011-12-30 14:14 4.2M 
[   ]cmake-2.8.7-1.tar.bz22011-12-30 14:14 6.5M 
[TXT]cmake-2.8.7-AIX-powerpc.sh2012-01-03 16:51 17M 
[   ]cmake-2.8.7-AIX-powerpc.tar.Z2012-01-03 16:51 25M 
[   ]cmake-2.8.7-AIX-powerpc.tar.gz2012-01-03 16:51 17M 
[   ]cmake-2.8.7-Darwin-universal.dmg2011-12-30 14:14 29M 
[   ]cmake-2.8.7-Darwin-universal.tar.Z2011-12-30 14:14 41M 
[   ]cmake-2.8.7-Darwin-universal.tar.gz2011-12-30 14:14 28M 
[   ]cmake-2.8.7-Darwin64-universal.dmg2011-12-30 14:14 30M 
[   ]cmake-2.8.7-Darwin64-universal.tar.Z2011-12-30 14:13 42M 
[   ]cmake-2.8.7-Darwin64-universal.tar.gz2011-12-30 14:13 30M 
[TXT]cmake-2.8.7-IRIX64-64.sh2011-12-30 14:13 10M 
[   ]cmake-2.8.7-IRIX64-64.tar.Z2011-12-30 14:13 15M 
[   ]cmake-2.8.7-IRIX64-64.tar.gz2011-12-30 14:13 10M 
[TXT]cmake-2.8.7-IRIX64-n32.sh2011-12-30 14:13 10M 
[   ]cmake-2.8.7-IRIX64-n32.tar.Z2011-12-30 14:13 15M 
[   ]cmake-2.8.7-IRIX64-n32.tar.gz2011-12-30 14:13 10M 
[TXT]cmake-2.8.7-Linux-i386.sh2011-12-30 14:13 16M 
[   ]cmake-2.8.7-Linux-i386.tar.Z2011-12-30 14:13 23M 
[   ]cmake-2.8.7-Linux-i386.tar.gz2011-12-30 14:13 16M 
[   ]cmake-2.8.7-win32-x86.exe2011-12-30 14:13 8.2M 
[   ]cmake-2.8.7-win32-x86.zip2011-12-30 14:13 10M 
[   ]cmake-2.8.7.tar.Z2011-12-30 14:13 8.5M 
[   ]cmake-2.8.7.tar.gz2011-12-30 14:13 5.4M 
[   ]cmake-2.8.7.zip2011-12-30 14:13 7.2M 
[TXT]cmake-2.8.8-AIX-powerpc.sh2012-04-18 15:23 19M 
[   ]cmake-2.8.8-AIX-powerpc.tar.Z2012-04-18 15:23 27M 
[   ]cmake-2.8.8-AIX-powerpc.tar.gz2012-04-18 15:23 19M 
[   ]cmake-2.8.8-Darwin-universal.dmg2012-04-18 15:23 34M 
[   ]cmake-2.8.8-Darwin-universal.tar.Z2012-04-18 15:23 49M 
[   ]cmake-2.8.8-Darwin-universal.tar.gz2012-04-18 15:23 34M 
[   ]cmake-2.8.8-Darwin64-universal.dmg2012-04-18 15:22 32M 
[   ]cmake-2.8.8-Darwin64-universal.tar.Z2012-04-18 15:22 44M 
[   ]cmake-2.8.8-Darwin64-universal.tar.gz2012-04-18 15:22 32M 
[TXT]cmake-2.8.8-IRIX64-64.sh2012-04-18 15:22 12M 
[   ]cmake-2.8.8-IRIX64-64.tar.Z2012-04-18 15:22 17M 
[   ]cmake-2.8.8-IRIX64-64.tar.gz2012-04-18 15:22 12M 
[TXT]cmake-2.8.8-IRIX64-n32.sh2012-04-18 15:22 11M 
[   ]cmake-2.8.8-IRIX64-n32.tar.Z2012-04-18 15:22 17M 
[   ]cmake-2.8.8-IRIX64-n32.tar.gz2012-04-18 15:22 11M 
[TXT]cmake-2.8.8-Linux-i386.sh2012-04-18 15:22 18M 
[   ]cmake-2.8.8-Linux-i386.tar.Z2012-04-18 15:22 26M 
[   ]cmake-2.8.8-Linux-i386.tar.gz2012-04-18 15:22 18M 
[TXT]cmake-2.8.8-SHA-256.txt2016-04-13 12:48 2.1K 
[TXT]cmake-2.8.8-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.8-win32-x86.exe2012-04-18 15:22 8.7M 
[   ]cmake-2.8.8-win32-x86.zip2012-04-18 15:22 11M 
[   ]cmake-2.8.8.tar.Z2012-04-18 15:22 8.5M 
[   ]cmake-2.8.8.tar.gz2012-04-18 15:22 5.4M 
[   ]cmake-2.8.8.zip2012-04-18 15:22 7.2M 
[TXT]cmake-2.8.9-AIX-powerpc.sh2012-08-09 15:36 19M 
[   ]cmake-2.8.9-AIX-powerpc.tar.Z2012-08-09 15:36 27M 
[   ]cmake-2.8.9-AIX-powerpc.tar.gz2012-08-09 15:36 19M 
[   ]cmake-2.8.9-Darwin-universal.dmg2012-08-09 15:36 35M 
[   ]cmake-2.8.9-Darwin-universal.tar.Z2012-08-09 15:36 50M 
[   ]cmake-2.8.9-Darwin-universal.tar.gz2012-08-09 15:36 35M 
[   ]cmake-2.8.9-Darwin64-universal.dmg2012-08-09 15:36 33M 
[   ]cmake-2.8.9-Darwin64-universal.tar.Z2012-08-09 15:35 45M 
[   ]cmake-2.8.9-Darwin64-universal.tar.gz2012-08-09 15:35 32M 
[TXT]cmake-2.8.9-IRIX64-64.sh2012-08-09 15:35 12M 
[   ]cmake-2.8.9-IRIX64-64.tar.Z2012-08-09 15:35 17M 
[   ]cmake-2.8.9-IRIX64-64.tar.gz2012-08-09 15:35 12M 
[TXT]cmake-2.8.9-IRIX64-n32.sh2012-08-09 15:35 12M 
[   ]cmake-2.8.9-IRIX64-n32.tar.Z2012-08-09 15:35 17M 
[   ]cmake-2.8.9-IRIX64-n32.tar.gz2012-08-09 15:35 12M 
[TXT]cmake-2.8.9-Linux-i386.sh2012-08-09 15:35 19M 
[   ]cmake-2.8.9-Linux-i386.tar.Z2012-08-09 15:35 26M 
[   ]cmake-2.8.9-Linux-i386.tar.gz2012-08-09 15:35 19M 
[TXT]cmake-2.8.9-SHA-256.txt2016-04-13 12:48 2.1K 
[TXT]cmake-2.8.9-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.9-win32-x86.exe2012-08-09 15:35 8.9M 
[   ]cmake-2.8.9-win32-x86.zip2012-08-09 15:35 11M 
[   ]cmake-2.8.9.tar.Z2012-08-09 15:35 8.5M 
[   ]cmake-2.8.9.tar.gz2012-08-09 15:35 5.4M 
[   ]cmake-2.8.9.zip2012-08-09 15:35 7.2M 
[TXT]cmake-2.8.10-AIX-powerpc.sh2012-10-31 13:05 20M 
[   ]cmake-2.8.10-AIX-powerpc.tar.Z2012-10-31 13:05 28M 
[   ]cmake-2.8.10-AIX-powerpc.tar.gz2012-10-31 13:05 20M 
[   ]cmake-2.8.10-Darwin-universal.dmg2012-10-31 13:04 41M 
[   ]cmake-2.8.10-Darwin-universal.tar.Z2012-10-31 13:04 58M 
[   ]cmake-2.8.10-Darwin-universal.tar.gz2012-10-31 13:04 41M 
[   ]cmake-2.8.10-Darwin64-universal.dmg2012-10-31 13:04 38M 
[   ]cmake-2.8.10-Darwin64-universal.tar.Z2012-10-31 13:04 53M 
[   ]cmake-2.8.10-Darwin64-universal.tar.gz2012-10-31 13:04 38M 
[TXT]cmake-2.8.10-IRIX64-64.sh2012-10-31 13:04 12M 
[   ]cmake-2.8.10-IRIX64-64.tar.Z2012-10-31 13:04 18M 
[   ]cmake-2.8.10-IRIX64-64.tar.gz2012-10-31 13:04 12M 
[TXT]cmake-2.8.10-IRIX64-n32.sh2012-10-31 13:04 12M 
[   ]cmake-2.8.10-IRIX64-n32.tar.Z2012-10-31 13:04 17M 
[   ]cmake-2.8.10-IRIX64-n32.tar.gz2012-10-31 13:04 12M 
[TXT]cmake-2.8.10-Linux-i386.sh2012-10-31 13:04 22M 
[   ]cmake-2.8.10-Linux-i386.tar.Z2012-10-31 13:04 30M 
[   ]cmake-2.8.10-Linux-i386.tar.gz2012-10-31 13:04 22M 
[TXT]cmake-2.8.10-SHA-256.txt2016-04-13 12:48 2.1K 
[TXT]cmake-2.8.10-SHA-256.txt.asc2016-04-13 12:48 819  
[TXT]cmake-2.8.10-rc1-AIX-powerpc.sh2012-10-02 13:28 20M 
[   ]cmake-2.8.10-rc1-AIX-powerpc.tar.Z2012-10-02 13:28 28M 
[   ]cmake-2.8.10-rc1-AIX-powerpc.tar.gz2012-10-02 13:28 20M 
[   ]cmake-2.8.10-rc1-Darwin-universal.dmg2012-10-02 13:28 41M 
[   ]cmake-2.8.10-rc1-Darwin-universal.tar.Z2012-10-02 13:28 58M 
[   ]cmake-2.8.10-rc1-Darwin-universal.tar.gz2012-10-02 13:28 40M 
[   ]cmake-2.8.10-rc1-Darwin64-universal.dmg2012-10-02 13:28 38M 
[   ]cmake-2.8.10-rc1-Darwin64-universal.tar.Z2012-10-02 13:28 53M 
[   ]cmake-2.8.10-rc1-Darwin64-universal.tar.gz2012-10-02 13:28 38M 
[TXT]cmake-2.8.10-rc1-IRIX64-64.sh2012-10-02 13:27 12M 
[   ]cmake-2.8.10-rc1-IRIX64-64.tar.Z2012-10-02 13:27 18M 
[   ]cmake-2.8.10-rc1-IRIX64-64.tar.gz2012-10-02 13:27 12M 
[TXT]cmake-2.8.10-rc1-IRIX64-n32.sh2012-10-02 13:27 12M 
[   ]cmake-2.8.10-rc1-IRIX64-n32.tar.Z2012-10-02 13:27 17M 
[   ]cmake-2.8.10-rc1-IRIX64-n32.tar.gz2012-10-02 13:27 12M 
[TXT]cmake-2.8.10-rc1-Linux-i386.sh2012-10-02 13:27 22M 
[   ]cmake-2.8.10-rc1-Linux-i386.tar.Z2012-10-02 13:27 30M 
[   ]cmake-2.8.10-rc1-Linux-i386.tar.gz2012-10-02 13:27 22M 
[TXT]cmake-2.8.10-rc1-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.10-rc1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.10-rc1-win32-x86.exe2012-10-02 13:27 9.6M 
[   ]cmake-2.8.10-rc1-win32-x86.zip2012-10-02 13:27 12M 
[   ]cmake-2.8.10-rc1.tar.Z2012-10-02 13:27 8.6M 
[   ]cmake-2.8.10-rc1.tar.gz2012-10-02 13:27 5.5M 
[   ]cmake-2.8.10-rc1.zip2012-10-02 13:27 7.4M 
[TXT]cmake-2.8.10-rc2-AIX-powerpc.sh2012-10-19 09:26 20M 
[   ]cmake-2.8.10-rc2-AIX-powerpc.tar.Z2012-10-19 09:26 28M 
[   ]cmake-2.8.10-rc2-AIX-powerpc.tar.gz2012-10-19 09:26 20M 
[   ]cmake-2.8.10-rc2-Darwin-universal.dmg2012-10-19 09:26 41M 
[   ]cmake-2.8.10-rc2-Darwin-universal.tar.Z2012-10-19 09:26 58M 
[   ]cmake-2.8.10-rc2-Darwin-universal.tar.gz2012-10-19 09:26 41M 
[   ]cmake-2.8.10-rc2-Darwin64-universal.dmg2012-10-19 09:25 38M 
[   ]cmake-2.8.10-rc2-Darwin64-universal.tar.Z2012-10-19 09:25 53M 
[   ]cmake-2.8.10-rc2-Darwin64-universal.tar.gz2012-10-19 09:25 38M 
[TXT]cmake-2.8.10-rc2-IRIX64-64.sh2012-10-19 09:25 12M 
[   ]cmake-2.8.10-rc2-IRIX64-64.tar.Z2012-10-19 09:25 18M 
[   ]cmake-2.8.10-rc2-IRIX64-64.tar.gz2012-10-19 09:25 12M 
[TXT]cmake-2.8.10-rc2-IRIX64-n32.sh2012-10-19 09:25 12M 
[   ]cmake-2.8.10-rc2-IRIX64-n32.tar.Z2012-10-19 09:25 17M 
[   ]cmake-2.8.10-rc2-IRIX64-n32.tar.gz2012-10-19 09:25 12M 
[TXT]cmake-2.8.10-rc2-Linux-i386.sh2012-10-19 09:25 22M 
[   ]cmake-2.8.10-rc2-Linux-i386.tar.Z2012-10-19 09:24 30M 
[   ]cmake-2.8.10-rc2-Linux-i386.tar.gz2012-10-19 09:24 22M 
[TXT]cmake-2.8.10-rc2-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.10-rc2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.10-rc2-win32-x86.exe2012-10-19 09:24 9.6M 
[   ]cmake-2.8.10-rc2-win32-x86.zip2012-10-19 09:24 12M 
[   ]cmake-2.8.10-rc2.tar.Z2012-10-19 09:24 8.6M 
[   ]cmake-2.8.10-rc2.tar.gz2012-10-19 09:24 5.5M 
[   ]cmake-2.8.10-rc2.zip2012-10-19 09:24 7.4M 
[TXT]cmake-2.8.10-rc3-AIX-powerpc.sh2012-10-24 15:11 20M 
[   ]cmake-2.8.10-rc3-AIX-powerpc.tar.Z2012-10-24 15:11 28M 
[   ]cmake-2.8.10-rc3-AIX-powerpc.tar.gz2012-10-24 15:10 20M 
[   ]cmake-2.8.10-rc3-Darwin-universal.dmg2012-10-24 15:10 41M 
[   ]cmake-2.8.10-rc3-Darwin-universal.tar.Z2012-10-24 15:10 58M 
[   ]cmake-2.8.10-rc3-Darwin-universal.tar.gz2012-10-24 15:10 41M 
[   ]cmake-2.8.10-rc3-Darwin64-universal.dmg2012-10-24 15:10 38M 
[   ]cmake-2.8.10-rc3-Darwin64-universal.tar.Z2012-10-24 15:10 53M 
[   ]cmake-2.8.10-rc3-Darwin64-universal.tar.gz2012-10-24 15:10 38M 
[TXT]cmake-2.8.10-rc3-IRIX64-64.sh2012-10-24 15:10 12M 
[   ]cmake-2.8.10-rc3-IRIX64-64.tar.Z2012-10-24 15:10 18M 
[   ]cmake-2.8.10-rc3-IRIX64-64.tar.gz2012-10-24 15:10 12M 
[TXT]cmake-2.8.10-rc3-IRIX64-n32.sh2012-10-24 15:10 12M 
[   ]cmake-2.8.10-rc3-IRIX64-n32.tar.Z2012-10-24 15:10 17M 
[   ]cmake-2.8.10-rc3-IRIX64-n32.tar.gz2012-10-24 15:10 12M 
[TXT]cmake-2.8.10-rc3-Linux-i386.sh2012-10-24 15:10 22M 
[   ]cmake-2.8.10-rc3-Linux-i386.tar.Z2012-10-24 15:10 30M 
[   ]cmake-2.8.10-rc3-Linux-i386.tar.gz2012-10-24 15:10 22M 
[TXT]cmake-2.8.10-rc3-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.10-rc3-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.10-rc3-win32-x86.exe2012-10-24 15:10 9.6M 
[   ]cmake-2.8.10-rc3-win32-x86.zip2012-10-24 15:09 12M 
[   ]cmake-2.8.10-rc3.tar.Z2012-10-24 15:09 8.7M 
[   ]cmake-2.8.10-rc3.tar.gz2012-10-24 15:09 5.5M 
[   ]cmake-2.8.10-rc3.zip2012-10-24 15:09 7.4M 
[   ]cmake-2.8.10-win32-x86.exe2012-10-31 13:04 9.6M 
[   ]cmake-2.8.10-win32-x86.zip2012-10-31 13:04 12M 
[TXT]cmake-2.8.10.1-AIX-powerpc.sh2012-11-07 11:48 20M 
[   ]cmake-2.8.10.1-AIX-powerpc.tar.Z2012-11-07 11:48 28M 
[   ]cmake-2.8.10.1-AIX-powerpc.tar.gz2012-11-07 11:48 20M 
[   ]cmake-2.8.10.1-Darwin-universal.dmg2012-11-07 11:48 41M 
[   ]cmake-2.8.10.1-Darwin-universal.tar.Z2012-11-07 11:48 58M 
[   ]cmake-2.8.10.1-Darwin-universal.tar.gz2012-11-07 11:48 41M 
[   ]cmake-2.8.10.1-Darwin64-universal.dmg2012-11-07 11:48 38M 
[   ]cmake-2.8.10.1-Darwin64-universal.tar.Z2012-11-07 11:48 53M 
[   ]cmake-2.8.10.1-Darwin64-universal.tar.gz2012-11-07 11:48 38M 
[TXT]cmake-2.8.10.1-IRIX64-64.sh2012-11-07 11:48 12M 
[   ]cmake-2.8.10.1-IRIX64-64.tar.Z2012-11-07 11:48 18M 
[   ]cmake-2.8.10.1-IRIX64-64.tar.gz2012-11-07 11:48 12M 
[TXT]cmake-2.8.10.1-IRIX64-n32.sh2012-11-07 11:47 12M 
[   ]cmake-2.8.10.1-IRIX64-n32.tar.Z2012-11-07 11:47 17M 
[   ]cmake-2.8.10.1-IRIX64-n32.tar.gz2012-11-07 11:47 12M 
[TXT]cmake-2.8.10.1-Linux-i386.sh2012-11-07 11:47 22M 
[   ]cmake-2.8.10.1-Linux-i386.tar.Z2012-11-07 11:47 30M 
[   ]cmake-2.8.10.1-Linux-i386.tar.gz2012-11-07 11:47 22M 
[TXT]cmake-2.8.10.1-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.10.1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.10.1-win32-x86.exe2012-11-07 11:47 9.6M 
[   ]cmake-2.8.10.1-win32-x86.zip2012-11-07 11:47 12M 
[   ]cmake-2.8.10.1.tar.Z2012-11-07 11:47 8.6M 
[   ]cmake-2.8.10.1.tar.gz2012-11-07 11:47 5.5M 
[   ]cmake-2.8.10.1.zip2012-11-07 11:47 7.4M 
[TXT]cmake-2.8.10.2-AIX-powerpc.sh2012-11-27 15:05 20M 
[   ]cmake-2.8.10.2-AIX-powerpc.tar.Z2012-11-27 15:05 28M 
[   ]cmake-2.8.10.2-AIX-powerpc.tar.gz2012-11-27 15:04 20M 
[   ]cmake-2.8.10.2-Darwin-universal.dmg2012-11-27 15:04 41M 
[   ]cmake-2.8.10.2-Darwin-universal.tar.Z2012-11-27 15:04 58M 
[   ]cmake-2.8.10.2-Darwin-universal.tar.gz2012-11-27 15:04 41M 
[   ]cmake-2.8.10.2-Darwin64-universal.dmg2012-11-27 15:04 38M 
[   ]cmake-2.8.10.2-Darwin64-universal.tar.Z2012-11-27 15:04 53M 
[   ]cmake-2.8.10.2-Darwin64-universal.tar.gz2012-11-27 15:04 38M 
[TXT]cmake-2.8.10.2-IRIX64-64.sh2012-11-27 15:04 12M 
[   ]cmake-2.8.10.2-IRIX64-64.tar.Z2012-11-27 15:04 18M 
[   ]cmake-2.8.10.2-IRIX64-64.tar.gz2012-11-27 15:04 12M 
[TXT]cmake-2.8.10.2-IRIX64-n32.sh2012-11-27 15:04 12M 
[   ]cmake-2.8.10.2-IRIX64-n32.tar.Z2012-11-27 15:04 17M 
[   ]cmake-2.8.10.2-IRIX64-n32.tar.gz2012-11-27 15:04 12M 
[TXT]cmake-2.8.10.2-Linux-i386.sh2012-11-27 15:04 22M 
[   ]cmake-2.8.10.2-Linux-i386.tar.Z2012-11-27 15:04 30M 
[   ]cmake-2.8.10.2-Linux-i386.tar.gz2012-11-27 15:04 22M 
[TXT]cmake-2.8.10.2-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.10.2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.10.2-win32-x86.exe2012-11-27 15:04 9.6M 
[   ]cmake-2.8.10.2-win32-x86.zip2012-11-27 15:03 12M 
[   ]cmake-2.8.10.2.tar.Z2012-11-27 15:03 8.7M 
[   ]cmake-2.8.10.2.tar.gz2012-11-27 15:03 5.5M 
[   ]cmake-2.8.10.2.zip2012-11-27 15:03 7.4M 
[   ]cmake-2.8.10.tar.Z2012-10-31 13:03 8.7M 
[   ]cmake-2.8.10.tar.gz2012-10-31 13:03 5.5M 
[   ]cmake-2.8.10.zip2012-10-31 13:03 7.4M 
[TXT]cmake-2.8.11-AIX-powerpc.sh2013-06-07 14:42 21M 
[   ]cmake-2.8.11-AIX-powerpc.tar.Z2013-06-07 14:42 30M 
[   ]cmake-2.8.11-AIX-powerpc.tar.gz2013-06-07 14:42 21M 
[   ]cmake-2.8.11-Darwin-universal.dmg2013-05-15 15:54 42M 
[   ]cmake-2.8.11-Darwin-universal.tar.Z2013-05-15 15:54 59M 
[   ]cmake-2.8.11-Darwin-universal.tar.gz2013-05-15 15:54 42M 
[   ]cmake-2.8.11-Darwin64-universal.dmg2013-05-15 15:54 39M 
[   ]cmake-2.8.11-Darwin64-universal.tar.Z2013-05-15 15:54 55M 
[   ]cmake-2.8.11-Darwin64-universal.tar.gz2013-05-15 15:54 39M 
[TXT]cmake-2.8.11-IRIX64-64.sh2013-05-15 15:53 13M 
[   ]cmake-2.8.11-IRIX64-64.tar.Z2013-05-15 15:53 19M 
[   ]cmake-2.8.11-IRIX64-64.tar.gz2013-05-15 15:53 13M 
[TXT]cmake-2.8.11-IRIX64-n32.sh2013-05-15 15:53 12M 
[   ]cmake-2.8.11-IRIX64-n32.tar.Z2013-05-15 15:53 18M 
[   ]cmake-2.8.11-IRIX64-n32.tar.gz2013-05-15 15:53 12M 
[TXT]cmake-2.8.11-Linux-i386.sh2013-05-15 15:53 23M 
[   ]cmake-2.8.11-Linux-i386.tar.Z2013-05-15 15:53 31M 
[   ]cmake-2.8.11-Linux-i386.tar.gz2013-05-15 15:53 23M 
[TXT]cmake-2.8.11-SHA-256.txt2016-04-13 12:48 2.4K 
[TXT]cmake-2.8.11-SHA-256.txt.asc2016-04-13 12:48 819  
[TXT]cmake-2.8.11-rc1-AIX-powerpc.sh2013-03-14 17:16 21M 
[   ]cmake-2.8.11-rc1-AIX-powerpc.tar.Z2013-03-14 17:16 30M 
[   ]cmake-2.8.11-rc1-AIX-powerpc.tar.gz2013-03-14 17:16 21M 
[   ]cmake-2.8.11-rc1-Darwin-universal.dmg2013-03-14 17:16 42M 
[   ]cmake-2.8.11-rc1-Darwin-universal.tar.Z2013-03-14 17:16 59M 
[   ]cmake-2.8.11-rc1-Darwin-universal.tar.gz2013-03-14 17:16 41M 
[   ]cmake-2.8.11-rc1-Darwin64-universal.dmg2013-03-14 17:15 39M 
[   ]cmake-2.8.11-rc1-Darwin64-universal.tar.Z2013-03-14 17:15 55M 
[   ]cmake-2.8.11-rc1-Darwin64-universal.tar.gz2013-03-14 17:15 39M 
[TXT]cmake-2.8.11-rc1-IRIX64-64.sh2013-03-14 17:15 13M 
[   ]cmake-2.8.11-rc1-IRIX64-64.tar.Z2013-03-14 17:15 19M 
[   ]cmake-2.8.11-rc1-IRIX64-64.tar.gz2013-03-14 17:15 13M 
[TXT]cmake-2.8.11-rc1-IRIX64-n32.sh2013-03-14 17:15 12M 
[   ]cmake-2.8.11-rc1-IRIX64-n32.tar.Z2013-03-14 17:15 18M 
[   ]cmake-2.8.11-rc1-IRIX64-n32.tar.gz2013-03-14 17:15 12M 
[TXT]cmake-2.8.11-rc1-Linux-i386.sh2013-03-14 17:15 23M 
[   ]cmake-2.8.11-rc1-Linux-i386.tar.Z2013-03-14 17:15 31M 
[   ]cmake-2.8.11-rc1-Linux-i386.tar.gz2013-03-14 17:15 23M 
[TXT]cmake-2.8.11-rc1-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.11-rc1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.11-rc1-win32-x86.exe2013-03-14 17:15 9.9M 
[   ]cmake-2.8.11-rc1-win32-x86.zip2013-03-14 17:14 12M 
[   ]cmake-2.8.11-rc1.tar.Z2013-03-14 17:14 8.8M 
[   ]cmake-2.8.11-rc1.tar.gz2013-03-14 17:14 5.6M 
[   ]cmake-2.8.11-rc1.zip2013-03-14 17:14 7.6M 
[TXT]cmake-2.8.11-rc2-AIX-powerpc.sh2013-04-05 18:01 21M 
[   ]cmake-2.8.11-rc2-AIX-powerpc.tar.Z2013-04-05 18:01 30M 
[   ]cmake-2.8.11-rc2-AIX-powerpc.tar.gz2013-04-05 18:01 21M 
[   ]cmake-2.8.11-rc2-Darwin-universal.dmg2013-04-05 18:01 42M 
[   ]cmake-2.8.11-rc2-Darwin-universal.tar.Z2013-04-05 18:01 59M 
[   ]cmake-2.8.11-rc2-Darwin-universal.tar.gz2013-04-05 18:01 42M 
[   ]cmake-2.8.11-rc2-Darwin64-universal.dmg2013-04-05 18:01 39M 
[   ]cmake-2.8.11-rc2-Darwin64-universal.tar.Z2013-04-05 18:01 55M 
[   ]cmake-2.8.11-rc2-Darwin64-universal.tar.gz2013-04-05 18:01 39M 
[TXT]cmake-2.8.11-rc2-IRIX64-64.sh2013-04-05 18:01 13M 
[   ]cmake-2.8.11-rc2-IRIX64-64.tar.Z2013-04-05 18:01 19M 
[   ]cmake-2.8.11-rc2-IRIX64-64.tar.gz2013-04-05 18:01 13M 
[TXT]cmake-2.8.11-rc2-IRIX64-n32.sh2013-04-05 18:01 12M 
[   ]cmake-2.8.11-rc2-IRIX64-n32.tar.Z2013-04-05 18:01 18M 
[   ]cmake-2.8.11-rc2-IRIX64-n32.tar.gz2013-04-05 18:00 12M 
[TXT]cmake-2.8.11-rc2-Linux-i386.sh2013-04-05 18:00 23M 
[   ]cmake-2.8.11-rc2-Linux-i386.tar.Z2013-04-05 18:00 31M 
[   ]cmake-2.8.11-rc2-Linux-i386.tar.gz2013-04-05 18:00 23M 
[TXT]cmake-2.8.11-rc2-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.11-rc2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.11-rc2-win32-x86.exe2013-04-05 18:00 9.9M 
[   ]cmake-2.8.11-rc2-win32-x86.zip2013-04-05 18:00 12M 
[   ]cmake-2.8.11-rc2.tar.Z2013-04-05 18:00 8.8M 
[   ]cmake-2.8.11-rc2.tar.gz2013-04-05 18:00 5.6M 
[   ]cmake-2.8.11-rc2.zip2013-04-05 18:00 7.6M 
[TXT]cmake-2.8.11-rc3-AIX-powerpc.sh2013-04-18 17:33 21M 
[   ]cmake-2.8.11-rc3-AIX-powerpc.tar.Z2013-04-18 17:33 30M 
[   ]cmake-2.8.11-rc3-AIX-powerpc.tar.gz2013-04-18 17:33 21M 
[   ]cmake-2.8.11-rc3-Darwin-universal.dmg2013-04-18 17:33 42M 
[   ]cmake-2.8.11-rc3-Darwin-universal.tar.Z2013-04-18 17:33 59M 
[   ]cmake-2.8.11-rc3-Darwin-universal.tar.gz2013-04-18 17:33 42M 
[   ]cmake-2.8.11-rc3-Darwin64-universal.dmg2013-04-18 17:33 39M 
[   ]cmake-2.8.11-rc3-Darwin64-universal.tar.Z2013-04-18 17:33 55M 
[   ]cmake-2.8.11-rc3-Darwin64-universal.tar.gz2013-04-18 17:33 39M 
[TXT]cmake-2.8.11-rc3-IRIX64-64.sh2013-04-18 17:33 13M 
[   ]cmake-2.8.11-rc3-IRIX64-64.tar.Z2013-04-18 17:33 19M 
[   ]cmake-2.8.11-rc3-IRIX64-64.tar.gz2013-04-18 17:33 13M 
[TXT]cmake-2.8.11-rc3-IRIX64-n32.sh2013-04-18 17:33 12M 
[   ]cmake-2.8.11-rc3-IRIX64-n32.tar.Z2013-04-18 17:33 18M 
[   ]cmake-2.8.11-rc3-IRIX64-n32.tar.gz2013-04-18 17:33 12M 
[TXT]cmake-2.8.11-rc3-Linux-i386.sh2013-04-18 17:32 23M 
[   ]cmake-2.8.11-rc3-Linux-i386.tar.Z2013-04-18 17:32 31M 
[   ]cmake-2.8.11-rc3-Linux-i386.tar.gz2013-04-18 17:32 23M 
[TXT]cmake-2.8.11-rc3-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.11-rc3-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.11-rc3-win32-x86.exe2013-04-18 17:32 9.9M 
[   ]cmake-2.8.11-rc3-win32-x86.zip2013-04-18 17:32 12M 
[   ]cmake-2.8.11-rc3.tar.Z2013-04-18 17:32 8.8M 
[   ]cmake-2.8.11-rc3.tar.gz2013-04-18 17:32 5.6M 
[   ]cmake-2.8.11-rc3.zip2013-04-18 17:32 7.6M 
[TXT]cmake-2.8.11-rc4-AIX-powerpc.sh2013-05-08 09:54 21M 
[   ]cmake-2.8.11-rc4-AIX-powerpc.tar.Z2013-05-08 09:54 30M 
[   ]cmake-2.8.11-rc4-AIX-powerpc.tar.gz2013-05-08 09:54 21M 
[   ]cmake-2.8.11-rc4-Darwin-universal.dmg2013-05-08 09:54 42M 
[   ]cmake-2.8.11-rc4-Darwin-universal.tar.Z2013-05-08 09:54 59M 
[   ]cmake-2.8.11-rc4-Darwin-universal.tar.gz2013-05-08 09:54 42M 
[   ]cmake-2.8.11-rc4-Darwin64-universal.dmg2013-05-08 09:54 39M 
[   ]cmake-2.8.11-rc4-Darwin64-universal.tar.Z2013-05-08 09:54 55M 
[   ]cmake-2.8.11-rc4-Darwin64-universal.tar.gz2013-05-08 09:54 39M 
[TXT]cmake-2.8.11-rc4-IRIX64-64.sh2013-05-08 09:54 13M 
[   ]cmake-2.8.11-rc4-IRIX64-64.tar.Z2013-05-08 09:54 19M 
[   ]cmake-2.8.11-rc4-IRIX64-64.tar.gz2013-05-08 09:53 13M 
[TXT]cmake-2.8.11-rc4-IRIX64-n32.sh2013-05-08 09:53 12M 
[   ]cmake-2.8.11-rc4-IRIX64-n32.tar.Z2013-05-08 09:53 18M 
[   ]cmake-2.8.11-rc4-IRIX64-n32.tar.gz2013-05-08 09:53 12M 
[TXT]cmake-2.8.11-rc4-Linux-i386.sh2013-05-08 09:53 23M 
[   ]cmake-2.8.11-rc4-Linux-i386.tar.Z2013-05-08 09:53 31M 
[   ]cmake-2.8.11-rc4-Linux-i386.tar.gz2013-05-08 09:53 23M 
[TXT]cmake-2.8.11-rc4-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.11-rc4-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.11-rc4-win32-x86.exe2013-05-08 09:53 9.9M 
[   ]cmake-2.8.11-rc4-win32-x86.zip2013-05-08 09:53 12M 
[   ]cmake-2.8.11-rc4.tar.Z2013-05-08 09:53 8.9M 
[   ]cmake-2.8.11-rc4.tar.gz2013-05-08 09:53 5.6M 
[   ]cmake-2.8.11-rc4.zip2013-05-08 09:53 7.6M 
[   ]cmake-2.8.11-win32-x86.exe2013-05-15 15:53 9.9M 
[   ]cmake-2.8.11-win32-x86.zip2013-05-15 15:53 12M 
[TXT]cmake-2.8.11.1-AIX-powerpc.sh2013-06-07 14:41 21M 
[   ]cmake-2.8.11.1-AIX-powerpc.tar.Z2013-06-07 14:41 30M 
[   ]cmake-2.8.11.1-AIX-powerpc.tar.gz2013-06-07 14:41 21M 
[   ]cmake-2.8.11.1-Darwin-universal.dmg2013-06-07 14:41 42M 
[   ]cmake-2.8.11.1-Darwin-universal.tar.Z2013-06-07 14:41 59M 
[   ]cmake-2.8.11.1-Darwin-universal.tar.gz2013-06-07 14:41 42M 
[   ]cmake-2.8.11.1-Darwin64-universal.dmg2013-06-07 14:41 39M 
[   ]cmake-2.8.11.1-Darwin64-universal.tar.Z2013-06-07 14:41 55M 
[   ]cmake-2.8.11.1-Darwin64-universal.tar.gz2013-06-07 14:41 39M 
[TXT]cmake-2.8.11.1-IRIX64-64.sh2013-06-07 14:41 13M 
[   ]cmake-2.8.11.1-IRIX64-64.tar.Z2013-06-07 14:41 19M 
[   ]cmake-2.8.11.1-IRIX64-64.tar.gz2013-06-07 14:41 13M 
[TXT]cmake-2.8.11.1-IRIX64-n32.sh2013-06-07 14:41 12M 
[   ]cmake-2.8.11.1-IRIX64-n32.tar.Z2013-06-07 14:41 18M 
[   ]cmake-2.8.11.1-IRIX64-n32.tar.gz2013-06-07 14:41 12M 
[TXT]cmake-2.8.11.1-Linux-i386.sh2013-06-07 14:41 23M 
[   ]cmake-2.8.11.1-Linux-i386.tar.Z2013-06-07 14:40 31M 
[   ]cmake-2.8.11.1-Linux-i386.tar.gz2013-06-07 14:40 23M 
[TXT]cmake-2.8.11.1-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.11.1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.11.1-win32-x86.exe2013-06-07 14:40 9.9M 
[   ]cmake-2.8.11.1-win32-x86.zip2013-06-07 14:40 12M 
[   ]cmake-2.8.11.1.tar.Z2013-06-07 14:40 8.9M 
[   ]cmake-2.8.11.1.tar.gz2013-06-07 14:40 5.6M 
[   ]cmake-2.8.11.1.zip2013-06-07 14:40 7.6M 
[TXT]cmake-2.8.11.2-AIX-powerpc.sh2013-07-03 11:53 21M 
[   ]cmake-2.8.11.2-AIX-powerpc.tar.Z2013-07-03 11:53 30M 
[   ]cmake-2.8.11.2-AIX-powerpc.tar.gz2013-07-03 11:53 21M 
[   ]cmake-2.8.11.2-Darwin-universal.dmg2013-07-03 11:53 42M 
[   ]cmake-2.8.11.2-Darwin-universal.tar.Z2013-07-03 11:53 59M 
[   ]cmake-2.8.11.2-Darwin-universal.tar.gz2013-07-03 11:53 42M 
[   ]cmake-2.8.11.2-Darwin64-universal.dmg2013-07-03 11:53 39M 
[   ]cmake-2.8.11.2-Darwin64-universal.tar.Z2013-07-03 11:53 55M 
[   ]cmake-2.8.11.2-Darwin64-universal.tar.gz2013-07-03 11:53 39M 
[TXT]cmake-2.8.11.2-IRIX64-64.sh2013-07-03 11:53 13M 
[   ]cmake-2.8.11.2-IRIX64-64.tar.Z2013-07-03 11:53 19M 
[   ]cmake-2.8.11.2-IRIX64-64.tar.gz2013-07-03 11:52 13M 
[TXT]cmake-2.8.11.2-IRIX64-n32.sh2013-07-03 11:52 12M 
[   ]cmake-2.8.11.2-IRIX64-n32.tar.Z2013-07-03 11:52 18M 
[   ]cmake-2.8.11.2-IRIX64-n32.tar.gz2013-07-03 11:52 12M 
[TXT]cmake-2.8.11.2-Linux-i386.sh2013-07-03 11:52 23M 
[   ]cmake-2.8.11.2-Linux-i386.tar.Z2013-07-03 11:52 31M 
[   ]cmake-2.8.11.2-Linux-i386.tar.gz2013-07-03 11:52 23M 
[TXT]cmake-2.8.11.2-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.11.2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.11.2-win32-x86.exe2013-07-03 11:52 9.9M 
[   ]cmake-2.8.11.2-win32-x86.zip2013-07-03 11:52 12M 
[   ]cmake-2.8.11.2.tar.Z2013-07-03 11:52 8.9M 
[   ]cmake-2.8.11.2.tar.gz2013-07-03 11:52 5.6M 
[   ]cmake-2.8.11.2.zip2013-07-03 11:52 7.6M 
[   ]cmake-2.8.11.tar.Z2013-05-15 15:53 8.9M 
[   ]cmake-2.8.11.tar.gz2013-05-15 15:53 5.6M 
[   ]cmake-2.8.11.zip2013-05-15 15:53 7.6M 
[TXT]cmake-2.8.12-AIX-powerpc.sh2013-10-07 14:34 22M 
[   ]cmake-2.8.12-AIX-powerpc.tar.Z2013-10-07 14:34 32M 
[   ]cmake-2.8.12-AIX-powerpc.tar.gz2013-10-07 14:34 22M 
[   ]cmake-2.8.12-Darwin-universal.dmg2013-10-07 14:34 43M 
[   ]cmake-2.8.12-Darwin-universal.tar.Z2013-10-07 14:33 61M 
[   ]cmake-2.8.12-Darwin-universal.tar.gz2013-10-07 14:33 43M 
[   ]cmake-2.8.12-Darwin64-universal.dmg2013-10-07 14:33 41M 
[   ]cmake-2.8.12-Darwin64-universal.tar.Z2013-10-07 14:33 57M 
[   ]cmake-2.8.12-Darwin64-universal.tar.gz2013-10-07 14:33 40M 
[TXT]cmake-2.8.12-IRIX64-64.sh2013-10-07 14:33 13M 
[   ]cmake-2.8.12-IRIX64-64.tar.Z2013-10-07 14:33 20M 
[   ]cmake-2.8.12-IRIX64-64.tar.gz2013-10-07 14:33 13M 
[TXT]cmake-2.8.12-IRIX64-n32.sh2013-10-07 14:33 13M 
[   ]cmake-2.8.12-IRIX64-n32.tar.Z2013-10-07 14:33 19M 
[   ]cmake-2.8.12-IRIX64-n32.tar.gz2013-10-07 14:33 13M 
[TXT]cmake-2.8.12-Linux-i386.sh2013-10-07 14:33 24M 
[   ]cmake-2.8.12-Linux-i386.tar.Z2013-10-07 14:33 33M 
[   ]cmake-2.8.12-Linux-i386.tar.gz2013-10-07 14:33 24M 
[TXT]cmake-2.8.12-SHA-256.txt2016-04-13 12:48 2.1K 
[TXT]cmake-2.8.12-SHA-256.txt.asc2016-04-13 12:48 819  
[TXT]cmake-2.8.12-rc1-AIX-powerpc.sh2013-08-19 08:54 22M 
[   ]cmake-2.8.12-rc1-AIX-powerpc.tar.Z2013-08-19 08:54 32M 
[   ]cmake-2.8.12-rc1-AIX-powerpc.tar.gz2013-08-19 08:54 22M 
[   ]cmake-2.8.12-rc1-Darwin-universal.dmg2013-08-19 08:54 43M 
[   ]cmake-2.8.12-rc1-Darwin-universal.tar.Z2013-08-19 08:53 61M 
[   ]cmake-2.8.12-rc1-Darwin-universal.tar.gz2013-08-19 08:53 43M 
[   ]cmake-2.8.12-rc1-Darwin64-universal.dmg2013-08-19 08:53 40M 
[   ]cmake-2.8.12-rc1-Darwin64-universal.tar.Z2013-08-19 08:53 57M 
[   ]cmake-2.8.12-rc1-Darwin64-universal.tar.gz2013-08-19 08:53 40M 
[TXT]cmake-2.8.12-rc1-IRIX64-64.sh2013-08-19 08:53 13M 
[   ]cmake-2.8.12-rc1-IRIX64-64.tar.Z2013-08-19 08:53 20M 
[   ]cmake-2.8.12-rc1-IRIX64-64.tar.gz2013-08-19 08:53 13M 
[TXT]cmake-2.8.12-rc1-IRIX64-n32.sh2013-08-19 08:53 13M 
[   ]cmake-2.8.12-rc1-IRIX64-n32.tar.Z2013-08-19 08:53 19M 
[   ]cmake-2.8.12-rc1-IRIX64-n32.tar.gz2013-08-19 08:53 13M 
[TXT]cmake-2.8.12-rc1-Linux-i386.sh2013-08-19 08:52 24M 
[   ]cmake-2.8.12-rc1-Linux-i386.tar.Z2013-08-19 08:52 33M 
[   ]cmake-2.8.12-rc1-Linux-i386.tar.gz2013-08-19 08:52 24M 
[TXT]cmake-2.8.12-rc1-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.12-rc1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.12-rc1-win32-x86.exe2013-08-19 08:52 10M 
[   ]cmake-2.8.12-rc1-win32-x86.zip2013-08-19 08:52 13M 
[   ]cmake-2.8.12-rc1.tar.Z2013-08-19 08:52 9.1M 
[   ]cmake-2.8.12-rc1.tar.gz2013-08-19 08:52 5.8M 
[   ]cmake-2.8.12-rc1.zip2013-08-19 08:52 8.0M 
[TXT]cmake-2.8.12-rc2-AIX-powerpc.sh2013-08-30 15:59 22M 
[   ]cmake-2.8.12-rc2-AIX-powerpc.tar.Z2013-08-30 15:59 32M 
[   ]cmake-2.8.12-rc2-AIX-powerpc.tar.gz2013-08-30 15:59 22M 
[   ]cmake-2.8.12-rc2-Darwin-universal.dmg2013-08-30 15:59 43M 
[   ]cmake-2.8.12-rc2-Darwin-universal.tar.Z2013-08-30 15:59 61M 
[   ]cmake-2.8.12-rc2-Darwin-universal.tar.gz2013-08-30 15:59 43M 
[   ]cmake-2.8.12-rc2-Darwin64-universal.dmg2013-08-30 15:59 40M 
[   ]cmake-2.8.12-rc2-Darwin64-universal.tar.Z2013-08-30 15:59 57M 
[   ]cmake-2.8.12-rc2-Darwin64-universal.tar.gz2013-08-30 15:58 40M 
[   ]cmake-2.8.12-rc2-IRIX64-64.tar.Z2013-08-30 15:58 20M 
[   ]cmake-2.8.12-rc2-IRIX64-64.tar.gz2013-08-30 15:58 13M 
[TXT]cmake-2.8.12-rc2-IRIX64-n32.sh2013-08-30 15:58 13M 
[   ]cmake-2.8.12-rc2-IRIX64-n32.tar.Z2013-08-30 15:58 19M 
[   ]cmake-2.8.12-rc2-IRIX64-n32.tar.gz2013-08-30 15:58 13M 
[TXT]cmake-2.8.12-rc2-Linux-i386.sh2013-08-30 15:58 24M 
[   ]cmake-2.8.12-rc2-Linux-i386.tar.Z2013-08-30 15:58 33M 
[   ]cmake-2.8.12-rc2-Linux-i386.tar.gz2013-08-30 15:58 24M 
[TXT]cmake-2.8.12-rc2-SHA-256.txt2016-04-13 12:48 2.1K 
[TXT]cmake-2.8.12-rc2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.12-rc2-win32-x86.exe2013-08-30 15:58 10M 
[   ]cmake-2.8.12-rc2-win32-x86.zip2013-08-30 15:58 13M 
[   ]cmake-2.8.12-rc2.tar.Z2013-08-30 15:58 9.2M 
[   ]cmake-2.8.12-rc2.tar.gz2013-08-30 15:58 5.8M 
[   ]cmake-2.8.12-rc2.zip2013-08-30 15:58 8.0M 
[TXT]cmake-2.8.12-rc3-AIX-powerpc.sh2013-09-10 15:39 22M 
[   ]cmake-2.8.12-rc3-AIX-powerpc.tar.Z2013-09-10 15:39 32M 
[   ]cmake-2.8.12-rc3-AIX-powerpc.tar.gz2013-09-10 15:39 22M 
[   ]cmake-2.8.12-rc3-Darwin-universal.dmg2013-09-10 15:39 43M 
[   ]cmake-2.8.12-rc3-Darwin-universal.tar.Z2013-09-10 15:39 61M 
[   ]cmake-2.8.12-rc3-Darwin-universal.tar.gz2013-09-10 15:39 43M 
[   ]cmake-2.8.12-rc3-Darwin64-universal.dmg2013-09-10 15:39 41M 
[   ]cmake-2.8.12-rc3-Darwin64-universal.tar.Z2013-09-10 15:39 57M 
[   ]cmake-2.8.12-rc3-Darwin64-universal.tar.gz2013-09-10 15:39 40M 
[TXT]cmake-2.8.12-rc3-Linux-i386.sh2013-09-10 15:39 24M 
[   ]cmake-2.8.12-rc3-Linux-i386.tar.Z2013-09-10 15:39 33M 
[   ]cmake-2.8.12-rc3-Linux-i386.tar.gz2013-09-10 15:39 24M 
[TXT]cmake-2.8.12-rc3-SHA-256.txt2016-04-13 12:48 1.7K 
[TXT]cmake-2.8.12-rc3-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.12-rc3-win32-x86.exe2013-09-10 15:39 10M 
[   ]cmake-2.8.12-rc3-win32-x86.zip2013-09-10 15:38 13M 
[   ]cmake-2.8.12-rc3.tar.Z2013-09-10 15:38 9.1M 
[   ]cmake-2.8.12-rc3.tar.gz2013-09-10 15:38 5.8M 
[   ]cmake-2.8.12-rc3.zip2013-09-10 15:38 8.0M 
[TXT]cmake-2.8.12-rc4-AIX-powerpc.sh2013-10-01 16:23 22M 
[   ]cmake-2.8.12-rc4-AIX-powerpc.tar.Z2013-10-01 16:23 32M 
[   ]cmake-2.8.12-rc4-AIX-powerpc.tar.gz2013-10-01 16:23 22M 
[   ]cmake-2.8.12-rc4-Darwin-universal.dmg2013-10-01 16:23 43M 
[   ]cmake-2.8.12-rc4-Darwin-universal.tar.Z2013-10-01 16:23 61M 
[   ]cmake-2.8.12-rc4-Darwin-universal.tar.gz2013-10-01 16:23 43M 
[   ]cmake-2.8.12-rc4-Darwin64-universal.dmg2013-10-01 16:23 40M 
[   ]cmake-2.8.12-rc4-Darwin64-universal.tar.Z2013-10-01 16:23 57M 
[   ]cmake-2.8.12-rc4-Darwin64-universal.tar.gz2013-10-01 16:23 40M 
[TXT]cmake-2.8.12-rc4-IRIX64-64.sh2013-10-01 16:23 13M 
[   ]cmake-2.8.12-rc4-IRIX64-64.tar.Z2013-10-01 16:23 20M 
[   ]cmake-2.8.12-rc4-IRIX64-64.tar.gz2013-10-01 16:23 13M 
[TXT]cmake-2.8.12-rc4-IRIX64-n32.sh2013-10-01 16:23 13M 
[   ]cmake-2.8.12-rc4-IRIX64-n32.tar.Z2013-10-01 16:23 19M 
[   ]cmake-2.8.12-rc4-IRIX64-n32.tar.gz2013-10-01 16:23 13M 
[TXT]cmake-2.8.12-rc4-Linux-i386.sh2013-10-01 16:23 24M 
[   ]cmake-2.8.12-rc4-Linux-i386.tar.Z2013-10-01 16:23 33M 
[   ]cmake-2.8.12-rc4-Linux-i386.tar.gz2013-10-01 16:23 24M 
[TXT]cmake-2.8.12-rc4-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.12-rc4-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.12-rc4-win32-x86.exe2013-10-01 16:22 10M 
[   ]cmake-2.8.12-rc4-win32-x86.zip2013-10-01 16:22 13M 
[   ]cmake-2.8.12-rc4.tar.Z2013-10-01 16:22 9.1M 
[   ]cmake-2.8.12-rc4.tar.gz2013-10-01 16:22 5.8M 
[   ]cmake-2.8.12-rc4.zip2013-10-01 16:22 8.0M 
[   ]cmake-2.8.12-win32-x86.exe2013-10-07 14:33 10M 
[   ]cmake-2.8.12-win32-x86.zip2013-10-07 14:33 13M 
[TXT]cmake-2.8.12.1-AIX-powerpc.sh2013-11-06 10:48 22M 
[   ]cmake-2.8.12.1-AIX-powerpc.tar.Z2013-11-06 10:47 32M 
[   ]cmake-2.8.12.1-AIX-powerpc.tar.gz2013-11-06 10:47 22M 
[   ]cmake-2.8.12.1-Darwin-universal.dmg2013-11-06 10:47 43M 
[   ]cmake-2.8.12.1-Darwin-universal.tar.Z2013-11-06 10:47 61M 
[   ]cmake-2.8.12.1-Darwin-universal.tar.gz2013-11-06 10:47 43M 
[   ]cmake-2.8.12.1-Darwin64-universal.dmg2013-11-06 10:47 41M 
[   ]cmake-2.8.12.1-Darwin64-universal.tar.Z2013-11-06 10:46 57M 
[   ]cmake-2.8.12.1-Darwin64-universal.tar.gz2013-11-06 10:46 41M 
[TXT]cmake-2.8.12.1-IRIX64-64.sh2013-11-06 10:46 13M 
[   ]cmake-2.8.12.1-IRIX64-64.tar.Z2013-11-06 10:46 20M 
[   ]cmake-2.8.12.1-IRIX64-64.tar.gz2013-11-06 10:46 13M 
[TXT]cmake-2.8.12.1-IRIX64-n32.sh2013-11-06 10:46 13M 
[   ]cmake-2.8.12.1-IRIX64-n32.tar.Z2013-11-06 10:46 19M 
[   ]cmake-2.8.12.1-IRIX64-n32.tar.gz2013-11-06 10:46 13M 
[TXT]cmake-2.8.12.1-Linux-i386.sh2013-11-06 10:46 24M 
[   ]cmake-2.8.12.1-Linux-i386.tar.Z2013-11-06 10:46 33M 
[   ]cmake-2.8.12.1-Linux-i386.tar.gz2013-11-06 10:46 24M 
[TXT]cmake-2.8.12.1-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.12.1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.12.1-win32-x86.exe2013-11-06 10:46 10M 
[   ]cmake-2.8.12.1-win32-x86.zip2013-11-06 10:46 13M 
[   ]cmake-2.8.12.1.tar.Z2013-11-06 10:45 9.1M 
[   ]cmake-2.8.12.1.tar.gz2013-11-06 10:45 5.8M 
[   ]cmake-2.8.12.1.zip2013-11-06 10:45 8.0M 
[TXT]cmake-2.8.12.2-AIX-powerpc.sh2014-01-16 14:49 22M 
[   ]cmake-2.8.12.2-AIX-powerpc.tar.Z2014-01-16 14:49 32M 
[   ]cmake-2.8.12.2-AIX-powerpc.tar.gz2014-01-16 14:49 22M 
[   ]cmake-2.8.12.2-Darwin-universal.dmg2014-01-16 14:48 43M 
[   ]cmake-2.8.12.2-Darwin-universal.tar.Z2014-01-16 14:48 61M 
[   ]cmake-2.8.12.2-Darwin-universal.tar.gz2014-01-16 14:48 43M 
[   ]cmake-2.8.12.2-Darwin64-universal.dmg2014-01-16 14:48 41M 
[   ]cmake-2.8.12.2-Darwin64-universal.tar.Z2014-01-16 14:48 57M 
[   ]cmake-2.8.12.2-Darwin64-universal.tar.gz2014-01-16 14:48 41M 
[TXT]cmake-2.8.12.2-IRIX64-64.sh2014-01-16 14:48 13M 
[   ]cmake-2.8.12.2-IRIX64-64.tar.Z2014-01-16 14:48 20M 
[   ]cmake-2.8.12.2-IRIX64-64.tar.gz2014-01-16 14:48 13M 
[TXT]cmake-2.8.12.2-IRIX64-n32.sh2014-01-16 14:48 13M 
[   ]cmake-2.8.12.2-IRIX64-n32.tar.Z2014-01-16 14:48 19M 
[   ]cmake-2.8.12.2-IRIX64-n32.tar.gz2014-01-16 14:48 13M 
[TXT]cmake-2.8.12.2-Linux-i386.sh2014-01-16 14:48 24M 
[   ]cmake-2.8.12.2-Linux-i386.tar.Z2014-01-16 14:48 33M 
[   ]cmake-2.8.12.2-Linux-i386.tar.gz2014-01-16 14:48 24M 
[TXT]cmake-2.8.12.2-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-2.8.12.2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-2.8.12.2-win32-x86.exe2014-01-16 14:48 10M 
[   ]cmake-2.8.12.2-win32-x86.zip2014-01-16 14:48 13M 
[   ]cmake-2.8.12.2.tar.Z2014-01-16 14:48 9.2M 
[   ]cmake-2.8.12.2.tar.gz2014-01-16 14:48 5.8M 
[   ]cmake-2.8.12.2.zip2014-01-16 14:48 8.0M 
[   ]cmake-2.8.12.tar.Z2013-10-07 14:32 9.2M 
[   ]cmake-2.8.12.tar.gz2013-10-07 14:32 5.8M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.0.0-1-src.tar.bz22014-06-10 13:28 4.2M 
[   ]cmake-3.0.0-1.tar.bz22014-06-10 13:28 8.0M 
[   ]cmake-3.0.0-Darwin-universal.dmg2014-06-10 13:28 41M 
[   ]cmake-3.0.0-Darwin-universal.tar.Z2014-06-10 13:27 58M 
[   ]cmake-3.0.0-Darwin-universal.tar.gz2014-06-10 13:27 41M 
[   ]cmake-3.0.0-Darwin64-universal.dmg2014-06-10 13:27 39M 
[   ]cmake-3.0.0-Darwin64-universal.tar.Z2014-06-10 13:27 54M 
[   ]cmake-3.0.0-Darwin64-universal.tar.gz2014-06-10 13:27 39M 
[TXT]cmake-3.0.0-Linux-i386.sh2014-06-10 13:27 22M 
[   ]cmake-3.0.0-Linux-i386.tar.Z2014-06-10 13:27 31M 
[   ]cmake-3.0.0-Linux-i386.tar.gz2014-06-10 13:27 22M 
[TXT]cmake-3.0.0-SHA-256.txt2016-04-13 12:48 1.3K 
[TXT]cmake-3.0.0-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.0.0-rc1-1-src.tar.bz22014-02-28 13:54 4.2M 
[   ]cmake-3.0.0-rc1-1.tar.bz22014-02-28 13:54 8.0M 
[TXT]cmake-3.0.0-rc1-AIX-powerpc.sh2014-02-28 13:54 21M 
[   ]cmake-3.0.0-rc1-AIX-powerpc.tar.Z2014-02-28 13:54 31M 
[   ]cmake-3.0.0-rc1-AIX-powerpc.tar.gz2014-02-28 13:54 21M 
[   ]cmake-3.0.0-rc1-Darwin-universal.dmg2014-02-28 13:54 41M 
[   ]cmake-3.0.0-rc1-Darwin-universal.tar.Z2014-02-28 13:54 58M 
[   ]cmake-3.0.0-rc1-Darwin-universal.tar.gz2014-02-28 13:54 41M 
[   ]cmake-3.0.0-rc1-Darwin64-universal.dmg2014-02-28 13:54 39M 
[   ]cmake-3.0.0-rc1-Darwin64-universal.tar.Z2014-02-28 13:54 54M 
[   ]cmake-3.0.0-rc1-Darwin64-universal.tar.gz2014-02-28 13:54 39M 
[TXT]cmake-3.0.0-rc1-IRIX64-64.sh2014-02-28 13:54 13M 
[   ]cmake-3.0.0-rc1-IRIX64-64.tar.Z2014-02-28 13:54 19M 
[   ]cmake-3.0.0-rc1-IRIX64-64.tar.gz2014-02-28 13:54 13M 
[TXT]cmake-3.0.0-rc1-IRIX64-n32.sh2014-02-28 13:54 12M 
[   ]cmake-3.0.0-rc1-IRIX64-n32.tar.Z2014-02-28 13:54 19M 
[   ]cmake-3.0.0-rc1-IRIX64-n32.tar.gz2014-02-28 13:54 12M 
[TXT]cmake-3.0.0-rc1-Linux-i386.sh2014-02-28 13:54 22M 
[   ]cmake-3.0.0-rc1-Linux-i386.tar.Z2014-02-28 13:54 31M 
[   ]cmake-3.0.0-rc1-Linux-i386.tar.gz2014-02-28 13:53 22M 
[TXT]cmake-3.0.0-rc1-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-3.0.0-rc1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.0.0-rc1-win32-x86.exe2014-02-28 13:53 11M 
[   ]cmake-3.0.0-rc1-win32-x86.zip2014-02-28 13:53 14M 
[   ]cmake-3.0.0-rc1.tar.Z2014-02-28 13:53 8.5M 
[   ]cmake-3.0.0-rc1.tar.gz2014-02-28 13:53 5.2M 
[   ]cmake-3.0.0-rc1.zip2014-02-28 13:53 8.0M 
[   ]cmake-3.0.0-rc2-1-src.tar.bz22014-03-19 10:29 4.2M 
[   ]cmake-3.0.0-rc2-1.tar.bz22014-03-19 10:28 8.0M 
[TXT]cmake-3.0.0-rc2-AIX-powerpc.sh2014-03-19 10:28 21M 
[   ]cmake-3.0.0-rc2-AIX-powerpc.tar.Z2014-03-19 10:28 31M 
[   ]cmake-3.0.0-rc2-AIX-powerpc.tar.gz2014-03-19 10:28 21M 
[   ]cmake-3.0.0-rc2-Darwin-universal.dmg2014-03-19 10:28 41M 
[   ]cmake-3.0.0-rc2-Darwin-universal.tar.Z2014-03-19 10:28 58M 
[   ]cmake-3.0.0-rc2-Darwin-universal.tar.gz2014-03-19 10:28 41M 
[   ]cmake-3.0.0-rc2-Darwin64-universal.dmg2014-03-19 10:28 39M 
[   ]cmake-3.0.0-rc2-Darwin64-universal.tar.Z2014-03-19 10:28 54M 
[   ]cmake-3.0.0-rc2-Darwin64-universal.tar.gz2014-03-19 10:28 39M 
[TXT]cmake-3.0.0-rc2-IRIX64-64.sh2014-03-19 10:28 13M 
[   ]cmake-3.0.0-rc2-IRIX64-64.tar.Z2014-03-19 10:28 19M 
[   ]cmake-3.0.0-rc2-IRIX64-64.tar.gz2014-03-19 10:28 13M 
[TXT]cmake-3.0.0-rc2-IRIX64-n32.sh2014-03-19 10:28 12M 
[   ]cmake-3.0.0-rc2-IRIX64-n32.tar.Z2014-03-19 10:28 19M 
[   ]cmake-3.0.0-rc2-IRIX64-n32.tar.gz2014-03-19 10:28 12M 
[TXT]cmake-3.0.0-rc2-Linux-i386.sh2014-03-19 10:28 22M 
[   ]cmake-3.0.0-rc2-Linux-i386.tar.Z2014-03-19 10:28 31M 
[   ]cmake-3.0.0-rc2-Linux-i386.tar.gz2014-03-19 10:28 22M 
[TXT]cmake-3.0.0-rc2-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-3.0.0-rc2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.0.0-rc2-win32-x86.exe2014-03-19 10:28 11M 
[   ]cmake-3.0.0-rc2-win32-x86.zip2014-03-19 10:27 14M 
[   ]cmake-3.0.0-rc2.tar.Z2014-03-19 10:27 8.5M 
[   ]cmake-3.0.0-rc2.tar.gz2014-03-19 10:27 5.2M 
[   ]cmake-3.0.0-rc2.zip2014-03-19 10:27 8.0M 
[   ]cmake-3.0.0-rc3-1-src.tar.bz22014-03-26 13:00 4.2M 
[   ]cmake-3.0.0-rc3-1.tar.bz22014-03-26 13:00 8.0M 
[TXT]cmake-3.0.0-rc3-AIX-powerpc.sh2014-03-26 13:00 21M 
[   ]cmake-3.0.0-rc3-AIX-powerpc.tar.Z2014-03-26 13:00 31M 
[   ]cmake-3.0.0-rc3-AIX-powerpc.tar.gz2014-03-26 13:00 21M 
[   ]cmake-3.0.0-rc3-Darwin-universal.dmg2014-03-26 13:00 41M 
[   ]cmake-3.0.0-rc3-Darwin-universal.tar.Z2014-03-26 13:00 58M 
[   ]cmake-3.0.0-rc3-Darwin-universal.tar.gz2014-03-26 13:00 41M 
[   ]cmake-3.0.0-rc3-Darwin64-universal.dmg2014-03-26 12:59 39M 
[   ]cmake-3.0.0-rc3-Darwin64-universal.tar.Z2014-03-26 12:59 54M 
[   ]cmake-3.0.0-rc3-Darwin64-universal.tar.gz2014-03-26 12:59 39M 
[TXT]cmake-3.0.0-rc3-IRIX64-64.sh2014-03-26 12:59 13M 
[   ]cmake-3.0.0-rc3-IRIX64-64.tar.Z2014-03-26 12:59 19M 
[   ]cmake-3.0.0-rc3-IRIX64-64.tar.gz2014-03-26 12:59 13M 
[TXT]cmake-3.0.0-rc3-IRIX64-n32.sh2014-03-26 12:59 12M 
[   ]cmake-3.0.0-rc3-IRIX64-n32.tar.Z2014-03-26 12:59 19M 
[   ]cmake-3.0.0-rc3-IRIX64-n32.tar.gz2014-03-26 12:59 12M 
[TXT]cmake-3.0.0-rc3-SHA-256.txt2016-04-13 12:48 1.9K 
[TXT]cmake-3.0.0-rc3-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.0.0-rc3-win32-x86.exe2014-03-26 12:59 11M 
[   ]cmake-3.0.0-rc3-win32-x86.zip2014-03-26 12:59 14M 
[   ]cmake-3.0.0-rc3.tar.Z2014-03-26 12:59 8.4M 
[   ]cmake-3.0.0-rc3.tar.gz2014-03-26 12:59 5.2M 
[   ]cmake-3.0.0-rc3.zip2014-03-26 12:59 8.0M 
[   ]cmake-3.0.0-rc4-1-src.tar.bz22014-04-18 09:52 4.2M 
[   ]cmake-3.0.0-rc4-1.tar.bz22014-04-18 09:52 8.0M 
[TXT]cmake-3.0.0-rc4-AIX-powerpc.sh2014-04-18 09:52 22M 
[   ]cmake-3.0.0-rc4-AIX-powerpc.tar.Z2014-04-18 09:52 31M 
[   ]cmake-3.0.0-rc4-AIX-powerpc.tar.gz2014-04-18 09:52 22M 
[   ]cmake-3.0.0-rc4-Darwin-universal.dmg2014-04-18 09:52 41M 
[   ]cmake-3.0.0-rc4-Darwin-universal.tar.Z2014-04-18 09:52 58M 
[   ]cmake-3.0.0-rc4-Darwin-universal.tar.gz2014-04-18 09:51 41M 
[   ]cmake-3.0.0-rc4-Darwin64-universal.dmg2014-04-18 09:51 39M 
[   ]cmake-3.0.0-rc4-Darwin64-universal.tar.Z2014-04-18 09:51 54M 
[   ]cmake-3.0.0-rc4-Darwin64-universal.tar.gz2014-04-18 09:51 39M 
[TXT]cmake-3.0.0-rc4-IRIX64-64.sh2014-04-18 09:51 13M 
[   ]cmake-3.0.0-rc4-IRIX64-64.tar.Z2014-04-18 09:51 19M 
[   ]cmake-3.0.0-rc4-IRIX64-64.tar.gz2014-04-18 09:51 13M 
[TXT]cmake-3.0.0-rc4-IRIX64-n32.sh2014-04-18 09:51 12M 
[   ]cmake-3.0.0-rc4-IRIX64-n32.tar.Z2014-04-18 09:51 19M 
[   ]cmake-3.0.0-rc4-IRIX64-n32.tar.gz2014-04-18 09:51 12M 
[TXT]cmake-3.0.0-rc4-Linux-i386.sh2014-04-18 09:51 22M 
[   ]cmake-3.0.0-rc4-Linux-i386.tar.Z2014-04-18 09:51 31M 
[   ]cmake-3.0.0-rc4-Linux-i386.tar.gz2014-04-18 09:51 22M 
[TXT]cmake-3.0.0-rc4-SHA-256.txt2016-04-13 12:48 2.2K 
[TXT]cmake-3.0.0-rc4-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.0.0-rc4-win32-x86.exe2014-04-18 09:51 11M 
[   ]cmake-3.0.0-rc4-win32-x86.zip2014-04-18 09:51 14M 
[   ]cmake-3.0.0-rc4.tar.Z2014-04-18 09:51 8.5M 
[   ]cmake-3.0.0-rc4.tar.gz2014-04-18 09:51 5.2M 
[   ]cmake-3.0.0-rc4.zip2014-04-18 09:51 8.0M 
[   ]cmake-3.0.0-rc5-1-src.tar.bz22014-05-13 14:25 4.2M 
[   ]cmake-3.0.0-rc5-1.tar.bz22014-05-13 14:25 8.0M 
[   ]cmake-3.0.0-rc5-Darwin-universal.dmg2014-05-13 14:25 41M 
[   ]cmake-3.0.0-rc5-Darwin-universal.tar.Z2014-05-13 14:24 58M 
[   ]cmake-3.0.0-rc5-Darwin-universal.tar.gz2014-05-13 14:24 41M 
[   ]cmake-3.0.0-rc5-Darwin64-universal.dmg2014-05-13 14:24 39M 
[   ]cmake-3.0.0-rc5-Darwin64-universal.tar.Z2014-05-13 14:24 54M 
[   ]cmake-3.0.0-rc5-Darwin64-universal.tar.gz2014-05-13 14:24 39M 
[TXT]cmake-3.0.0-rc5-Linux-i386.sh2014-05-13 14:24 22M 
[   ]cmake-3.0.0-rc5-Linux-i386.tar.Z2014-05-13 14:24 31M 
[   ]cmake-3.0.0-rc5-Linux-i386.tar.gz2014-05-13 14:24 22M 
[TXT]cmake-3.0.0-rc5-SHA-256.txt2016-04-13 12:48 1.4K 
[TXT]cmake-3.0.0-rc5-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.0.0-rc5-win32-x86.exe2014-05-13 14:24 11M 
[   ]cmake-3.0.0-rc5-win32-x86.zip2014-05-13 14:24 14M 
[   ]cmake-3.0.0-rc5.tar.Z2014-05-13 14:24 8.5M 
[   ]cmake-3.0.0-rc5.tar.gz2014-05-13 14:24 5.2M 
[   ]cmake-3.0.0-rc5.zip2014-05-13 14:24 8.0M 
[   ]cmake-3.0.0-rc6-1-src.tar.bz22014-05-22 14:57 4.2M 
[   ]cmake-3.0.0-rc6-1.tar.bz22014-05-22 14:57 8.0M 
[   ]cmake-3.0.0-rc6-Darwin-universal.dmg2014-05-22 14:57 41M 
[   ]cmake-3.0.0-rc6-Darwin-universal.tar.Z2014-05-22 14:56 58M 
[   ]cmake-3.0.0-rc6-Darwin-universal.tar.gz2014-05-22 14:56 41M 
[   ]cmake-3.0.0-rc6-Darwin64-universal.dmg2014-05-22 14:56 39M 
[   ]cmake-3.0.0-rc6-Darwin64-universal.tar.Z2014-05-22 14:56 54M 
[   ]cmake-3.0.0-rc6-Darwin64-universal.tar.gz2014-05-22 14:56 39M 
[TXT]cmake-3.0.0-rc6-Linux-i386.sh2014-05-22 14:56 22M 
[   ]cmake-3.0.0-rc6-Linux-i386.tar.Z2014-05-22 14:56 31M 
[   ]cmake-3.0.0-rc6-Linux-i386.tar.gz2014-05-22 14:56 22M 
[TXT]cmake-3.0.0-rc6-SHA-256.txt2016-04-13 12:48 1.4K 
[TXT]cmake-3.0.0-rc6-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.0.0-rc6-win32-x86.exe2014-05-22 14:56 11M 
[   ]cmake-3.0.0-rc6-win32-x86.zip2014-05-22 14:56 14M 
[   ]cmake-3.0.0-rc6.tar.Z2014-05-22 14:56 8.5M 
[   ]cmake-3.0.0-rc6.tar.gz2014-05-22 14:56 5.2M 
[   ]cmake-3.0.0-rc6.zip2014-05-22 14:56 8.0M 
[   ]cmake-3.0.0-win32-x86.exe2014-06-10 13:27 11M 
[   ]cmake-3.0.0-win32-x86.zip2014-06-10 13:27 14M 
[   ]cmake-3.0.0.tar.Z2014-06-10 13:27 8.5M 
[   ]cmake-3.0.0.tar.gz2014-06-10 13:27 5.2M 
[   ]cmake-3.0.0.zip2014-06-10 13:27 7.9M 
[   ]cmake-3.0.1-1-src.tar.bz22014-09-11 09:19 4.2M 
[   ]cmake-3.0.1-1.tar.bz22014-09-11 09:19 8.0M 
[   ]cmake-3.0.1-Darwin-universal.dmg2014-09-11 09:19 41M 
[   ]cmake-3.0.1-Darwin-universal.tar.Z2014-09-11 09:19 58M 
[   ]cmake-3.0.1-Darwin-universal.tar.gz2014-09-11 09:19 41M 
[   ]cmake-3.0.1-Darwin64-universal.dmg2014-09-11 09:18 39M 
[   ]cmake-3.0.1-Darwin64-universal.tar.Z2014-09-11 09:18 54M 
[   ]cmake-3.0.1-Darwin64-universal.tar.gz2014-09-11 09:18 39M 
[TXT]cmake-3.0.1-Linux-i386.sh2014-09-11 09:18 22M 
[   ]cmake-3.0.1-Linux-i386.tar.Z2014-09-11 09:18 31M 
[   ]cmake-3.0.1-Linux-i386.tar.gz2014-09-11 09:18 22M 
[TXT]cmake-3.0.1-SHA-256.txt2016-04-13 12:48 1.3K 
[TXT]cmake-3.0.1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.0.1-win32-x86.exe2014-09-11 09:18 11M 
[   ]cmake-3.0.1-win32-x86.zip2014-09-11 09:18 14M 
[   ]cmake-3.0.1.tar.Z2014-09-11 09:18 8.5M 
[   ]cmake-3.0.1.tar.gz2014-09-11 09:18 5.2M 
[   ]cmake-3.0.1.zip2014-09-11 09:18 7.9M 
[   ]cmake-3.0.2-1-src.tar.bz22014-09-11 12:19 4.2M 
[   ]cmake-3.0.2-1.tar.bz22014-09-11 12:19 8.0M 
[   ]cmake-3.0.2-Darwin-universal.dmg2014-09-11 12:19 41M 
[   ]cmake-3.0.2-Darwin-universal.tar.Z2014-09-11 12:19 58M 
[   ]cmake-3.0.2-Darwin-universal.tar.gz2014-09-11 12:19 41M 
[   ]cmake-3.0.2-Darwin64-universal.dmg2014-09-11 12:19 39M 
[   ]cmake-3.0.2-Darwin64-universal.tar.Z2014-09-11 12:19 54M 
[   ]cmake-3.0.2-Darwin64-universal.tar.gz2014-09-11 12:18 39M 
[TXT]cmake-3.0.2-Linux-i386.sh2014-09-11 12:18 22M 
[   ]cmake-3.0.2-Linux-i386.tar.Z2014-09-11 12:18 31M 
[   ]cmake-3.0.2-Linux-i386.tar.gz2014-09-11 12:18 22M 
[TXT]cmake-3.0.2-SHA-256.txt2016-04-13 12:48 1.3K 
[TXT]cmake-3.0.2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.0.2-win32-x86.exe2014-09-11 12:18 11M 
[   ]cmake-3.0.2-win32-x86.zip2014-09-11 12:18 14M 
[   ]cmake-3.0.2.tar.Z2014-09-11 12:18 8.5M 
[   ]cmake-3.0.2.tar.gz2014-09-11 12:18 5.2M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.1.0-1-src.tar.bz22014-12-17 13:10 4.5M 
[   ]cmake-3.1.0-1.tar.bz22014-12-17 13:10 9.0M 
[   ]cmake-3.1.0-Darwin-universal.dmg2014-12-17 13:10 45M 
[   ]cmake-3.1.0-Darwin-universal.tar.Z2014-12-17 13:10 63M 
[   ]cmake-3.1.0-Darwin-universal.tar.gz2014-12-17 13:10 44M 
[   ]cmake-3.1.0-Darwin64-universal.dmg2014-12-17 13:10 28M 
[   ]cmake-3.1.0-Darwin64-universal.tar.Z2014-12-17 13:10 40M 
[   ]cmake-3.1.0-Darwin64-universal.tar.gz2014-12-17 13:10 28M 
[   ]cmake-3.1.0-Darwin64.dmg2014-12-19 11:38 29M 
[   ]cmake-3.1.0-Darwin64.tar.Z2014-12-19 11:38 41M 
[   ]cmake-3.1.0-Darwin64.tar.gz2014-12-19 11:38 29M 
[TXT]cmake-3.1.0-Linux-i386.sh2014-12-17 13:10 24M 
[   ]cmake-3.1.0-Linux-i386.tar.Z2014-12-17 13:10 33M 
[   ]cmake-3.1.0-Linux-i386.tar.gz2014-12-17 13:10 24M 
[TXT]cmake-3.1.0-Linux-x86_64.sh2014-12-17 13:10 25M 
[   ]cmake-3.1.0-Linux-x86_64.tar.Z2014-12-17 13:10 35M 
[   ]cmake-3.1.0-Linux-x86_64.tar.gz2014-12-17 13:10 25M 
[TXT]cmake-3.1.0-SHA-256.txt2016-04-13 12:48 1.9K 
[TXT]cmake-3.1.0-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.1.0-rc1-1-src.tar.bz22014-10-28 14:09 4.5M 
[   ]cmake-3.1.0-rc1-1.tar.bz22014-10-28 14:09 9.0M 
[   ]cmake-3.1.0-rc1-Darwin-universal.dmg2014-10-28 14:09 45M 
[   ]cmake-3.1.0-rc1-Darwin-universal.tar.Z2014-10-28 14:09 63M 
[   ]cmake-3.1.0-rc1-Darwin-universal.tar.gz2014-10-28 14:09 44M 
[   ]cmake-3.1.0-rc1-Darwin64-universal.dmg2014-10-28 14:09 28M 
[   ]cmake-3.1.0-rc1-Darwin64-universal.tar.Z2014-10-28 14:09 40M 
[   ]cmake-3.1.0-rc1-Darwin64-universal.tar.gz2014-10-28 14:08 28M 
[TXT]cmake-3.1.0-rc1-Linux-i386.sh2014-10-28 14:08 24M 
[   ]cmake-3.1.0-rc1-Linux-i386.tar.Z2014-10-28 14:08 33M 
[   ]cmake-3.1.0-rc1-Linux-i386.tar.gz2014-10-28 14:08 24M 
[TXT]cmake-3.1.0-rc1-SHA-256.txt2016-04-13 12:48 1.4K 
[TXT]cmake-3.1.0-rc1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.1.0-rc1-win32-x86.exe2014-10-28 14:08 12M 
[   ]cmake-3.1.0-rc1-win32-x86.zip2014-10-28 14:08 15M 
[   ]cmake-3.1.0-rc1.tar.Z2014-10-28 14:08 9.2M 
[   ]cmake-3.1.0-rc1.tar.gz2014-10-28 14:08 5.7M 
[   ]cmake-3.1.0-rc1.zip2014-10-28 14:08 9.0M 
[   ]cmake-3.1.0-rc2-1-src.tar.bz22014-11-13 11:51 4.5M 
[   ]cmake-3.1.0-rc2-1.tar.bz22014-11-13 11:51 9.0M 
[   ]cmake-3.1.0-rc2-Darwin-universal.dmg2014-11-13 11:51 45M 
[   ]cmake-3.1.0-rc2-Darwin-universal.tar.Z2014-11-13 11:51 63M 
[   ]cmake-3.1.0-rc2-Darwin-universal.tar.gz2014-11-13 11:50 44M 
[   ]cmake-3.1.0-rc2-Darwin64-universal.dmg2014-11-13 11:50 28M 
[   ]cmake-3.1.0-rc2-Darwin64-universal.tar.Z2014-11-13 11:50 40M 
[   ]cmake-3.1.0-rc2-Darwin64-universal.tar.gz2014-11-13 11:50 28M 
[TXT]cmake-3.1.0-rc2-Linux-i386.sh2014-11-13 11:50 24M 
[   ]cmake-3.1.0-rc2-Linux-i386.tar.Z2014-11-13 11:50 33M 
[   ]cmake-3.1.0-rc2-Linux-i386.tar.gz2014-11-13 11:50 24M 
[TXT]cmake-3.1.0-rc2-SHA-256.txt2016-04-13 12:48 1.4K 
[TXT]cmake-3.1.0-rc2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.1.0-rc2-win32-x86.exe2014-11-13 11:50 12M 
[   ]cmake-3.1.0-rc2-win32-x86.zip2014-11-13 11:50 15M 
[   ]cmake-3.1.0-rc2.tar.Z2014-11-13 11:50 9.2M 
[   ]cmake-3.1.0-rc2.tar.gz2014-11-13 11:50 5.7M 
[   ]cmake-3.1.0-rc2.zip2014-11-13 11:50 9.0M 
[   ]cmake-3.1.0-rc3-1-src.tar.bz22014-12-09 16:53 4.5M 
[   ]cmake-3.1.0-rc3-1.tar.bz22014-12-09 16:53 9.0M 
[   ]cmake-3.1.0-rc3-Darwin-universal.dmg2014-12-09 16:53 45M 
[   ]cmake-3.1.0-rc3-Darwin-universal.tar.Z2014-12-09 16:52 63M 
[   ]cmake-3.1.0-rc3-Darwin-universal.tar.gz2014-12-09 16:52 44M 
[   ]cmake-3.1.0-rc3-Darwin64-universal.dmg2014-12-09 16:52 28M 
[   ]cmake-3.1.0-rc3-Darwin64-universal.tar.Z2014-12-09 16:52 40M 
[   ]cmake-3.1.0-rc3-Darwin64-universal.tar.gz2014-12-09 16:52 28M 
[TXT]cmake-3.1.0-rc3-Linux-i386.sh2014-12-09 16:52 24M 
[   ]cmake-3.1.0-rc3-Linux-i386.tar.Z2014-12-09 16:52 33M 
[   ]cmake-3.1.0-rc3-Linux-i386.tar.gz2014-12-09 16:52 24M 
[TXT]cmake-3.1.0-rc3-Linux-x86_64.sh2014-12-09 16:52 25M 
[   ]cmake-3.1.0-rc3-Linux-x86_64.tar.Z2014-12-09 16:52 35M 
[   ]cmake-3.1.0-rc3-Linux-x86_64.tar.gz2014-12-09 16:52 25M 
[TXT]cmake-3.1.0-rc3-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.1.0-rc3-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.1.0-rc3-win32-x86.exe2014-12-09 16:52 12M 
[   ]cmake-3.1.0-rc3-win32-x86.zip2014-12-09 16:52 15M 
[   ]cmake-3.1.0-rc3.tar.Z2014-12-09 16:52 9.2M 
[   ]cmake-3.1.0-rc3.tar.gz2014-12-09 16:52 5.7M 
[   ]cmake-3.1.0-rc3.zip2014-12-09 16:52 9.0M 
[   ]cmake-3.1.0-win32-x86.exe2014-12-17 13:10 12M 
[   ]cmake-3.1.0-win32-x86.zip2014-12-17 13:10 15M 
[   ]cmake-3.1.0.tar.Z2014-12-17 13:10 9.2M 
[   ]cmake-3.1.0.tar.gz2014-12-17 13:10 5.7M 
[   ]cmake-3.1.0.zip2014-12-17 13:10 9.0M 
[   ]cmake-3.1.1-1-src.tar.bz22015-01-22 16:49 4.5M 
[   ]cmake-3.1.1-1.tar.bz22015-01-22 16:49 9.1M 
[   ]cmake-3.1.1-Darwin-universal.dmg2015-01-22 16:49 45M 
[   ]cmake-3.1.1-Darwin-universal.tar.Z2015-01-22 16:49 64M 
[   ]cmake-3.1.1-Darwin-universal.tar.gz2015-01-22 16:49 44M 
[   ]cmake-3.1.1-Darwin-x86_64.dmg2015-01-22 16:48 29M 
[   ]cmake-3.1.1-Darwin-x86_64.tar.Z2015-01-22 16:48 41M 
[   ]cmake-3.1.1-Darwin-x86_64.tar.gz2015-01-22 16:48 29M 
[TXT]cmake-3.1.1-Linux-i386.sh2015-01-22 16:48 24M 
[   ]cmake-3.1.1-Linux-i386.tar.Z2015-01-22 16:48 33M 
[   ]cmake-3.1.1-Linux-i386.tar.gz2015-01-22 16:48 24M 
[TXT]cmake-3.1.1-Linux-x86_64.sh2015-01-22 16:48 25M 
[   ]cmake-3.1.1-Linux-x86_64.tar.Z2015-01-22 16:48 35M 
[   ]cmake-3.1.1-Linux-x86_64.tar.gz2015-01-22 16:48 25M 
[TXT]cmake-3.1.1-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.1.1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.1.1-win32-x86.exe2015-01-22 16:48 12M 
[   ]cmake-3.1.1-win32-x86.zip2015-01-22 16:48 15M 
[   ]cmake-3.1.1.tar.Z2015-01-22 16:48 9.2M 
[   ]cmake-3.1.1.tar.gz2015-01-22 16:48 5.7M 
[   ]cmake-3.1.1.zip2015-01-22 16:48 9.0M 
[   ]cmake-3.1.2-Darwin-universal.dmg2015-02-05 10:06 45M 
[   ]cmake-3.1.2-Darwin-universal.tar.Z2015-02-05 10:06 64M 
[   ]cmake-3.1.2-Darwin-universal.tar.gz2015-02-05 10:06 44M 
[   ]cmake-3.1.2-Darwin-x86_64.dmg2015-02-05 10:06 29M 
[   ]cmake-3.1.2-Darwin-x86_64.tar.Z2015-02-05 10:06 41M 
[   ]cmake-3.1.2-Darwin-x86_64.tar.gz2015-02-05 10:06 29M 
[TXT]cmake-3.1.2-Linux-i386.sh2015-02-05 10:06 24M 
[   ]cmake-3.1.2-Linux-i386.tar.Z2015-02-05 10:06 33M 
[   ]cmake-3.1.2-Linux-i386.tar.gz2015-02-05 10:05 24M 
[TXT]cmake-3.1.2-Linux-x86_64.sh2015-02-05 10:05 25M 
[   ]cmake-3.1.2-Linux-x86_64.tar.Z2015-02-05 10:05 35M 
[   ]cmake-3.1.2-Linux-x86_64.tar.gz2015-02-05 10:05 25M 
[TXT]cmake-3.1.2-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.1.2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.1.2-win32-x86.exe2015-02-05 10:05 12M 
[   ]cmake-3.1.2-win32-x86.zip2015-02-05 10:05 15M 
[   ]cmake-3.1.2.tar.Z2015-02-05 10:05 9.2M 
[   ]cmake-3.1.2.tar.gz2015-02-05 10:05 5.7M 
[   ]cmake-3.1.2.zip2015-02-05 10:05 9.0M 
[   ]cmake-3.1.3-1-src.tar.bz22015-02-12 17:40 4.5M 
[   ]cmake-3.1.3-1.tar.bz22015-02-12 17:40 9.0M 
[   ]cmake-3.1.3-Darwin-universal.dmg2015-02-12 17:40 45M 
[   ]cmake-3.1.3-Darwin-universal.tar.Z2015-02-12 17:40 64M 
[   ]cmake-3.1.3-Darwin-universal.tar.gz2015-02-12 17:40 44M 
[   ]cmake-3.1.3-Darwin-x86_64.dmg2015-02-12 17:40 29M 
[   ]cmake-3.1.3-Darwin-x86_64.tar.Z2015-02-12 17:40 41M 
[   ]cmake-3.1.3-Darwin-x86_64.tar.gz2015-02-12 17:39 29M 
[TXT]cmake-3.1.3-Linux-i386.sh2015-02-12 17:39 24M 
[   ]cmake-3.1.3-Linux-i386.tar.Z2015-02-12 17:39 33M 
[   ]cmake-3.1.3-Linux-i386.tar.gz2015-02-12 17:39 24M 
[TXT]cmake-3.1.3-Linux-x86_64.sh2015-02-12 17:39 25M 
[   ]cmake-3.1.3-Linux-x86_64.tar.Z2015-02-12 17:39 35M 
[   ]cmake-3.1.3-Linux-x86_64.tar.gz2015-02-12 17:39 25M 
[TXT]cmake-3.1.3-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.1.3-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.1.3-win32-x86.exe2015-02-12 17:39 12M 
[   ]cmake-3.1.3-win32-x86.zip2015-02-12 17:39 15M 
[   ]cmake-3.1.3.tar.Z2015-02-12 17:39 9.2M 
[   ]cmake-3.1.3.tar.gz2015-02-12 17:39 5.7M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.10.0-Darwin-x86_64.dmg2017-11-20 16:00 26M 
[   ]cmake-3.10.0-Darwin-x86_64.tar.gz2017-11-20 16:00 26M 
[TXT]cmake-3.10.0-Linux-x86_64.sh2017-11-20 16:00 33M 
[   ]cmake-3.10.0-Linux-x86_64.tar.gz2017-11-20 16:00 33M 
[TXT]cmake-3.10.0-SHA-256.txt2017-11-20 16:00 1.0K 
[TXT]cmake-3.10.0-SHA-256.txt.asc2017-11-20 16:00 833  
[   ]cmake-3.10.0-rc1-Darwin-x86_64.dmg2017-10-05 15:50 26M 
[   ]cmake-3.10.0-rc1-Darwin-x86_64.tar.gz2017-10-05 15:50 26M 
[TXT]cmake-3.10.0-rc1-Linux-x86_64.sh2017-10-05 15:50 31M 
[   ]cmake-3.10.0-rc1-Linux-x86_64.tar.gz2017-10-05 15:50 31M 
[TXT]cmake-3.10.0-rc1-SHA-256.txt2017-10-05 15:50 1.0K 
[TXT]cmake-3.10.0-rc1-SHA-256.txt.asc2017-10-05 15:50 833  
[   ]cmake-3.10.0-rc1-win32-x86.msi2017-10-05 15:50 16M 
[   ]cmake-3.10.0-rc1-win32-x86.zip2017-10-05 15:50 22M 
[   ]cmake-3.10.0-rc1-win64-x64.msi2017-10-05 15:50 18M 
[   ]cmake-3.10.0-rc1-win64-x64.zip2017-10-05 15:50 25M 
[   ]cmake-3.10.0-rc1.tar.Z2017-10-05 15:50 12M 
[   ]cmake-3.10.0-rc1.tar.gz2017-10-05 15:50 7.4M 
[   ]cmake-3.10.0-rc1.zip2017-10-05 15:50 12M 
[   ]cmake-3.10.0-rc2-Darwin-x86_64.dmg2017-10-12 12:07 26M 
[   ]cmake-3.10.0-rc2-Darwin-x86_64.tar.gz2017-10-12 12:07 26M 
[TXT]cmake-3.10.0-rc2-Linux-x86_64.sh2017-10-12 12:07 31M 
[   ]cmake-3.10.0-rc2-Linux-x86_64.tar.gz2017-10-12 12:07 31M 
[TXT]cmake-3.10.0-rc2-SHA-256.txt2017-10-12 12:07 1.0K 
[TXT]cmake-3.10.0-rc2-SHA-256.txt.asc2017-10-12 12:06 833  
[   ]cmake-3.10.0-rc2-win32-x86.msi2017-10-12 12:06 16M 
[   ]cmake-3.10.0-rc2-win32-x86.zip2017-10-12 12:06 22M 
[   ]cmake-3.10.0-rc2-win64-x64.msi2017-10-12 12:06 18M 
[   ]cmake-3.10.0-rc2-win64-x64.zip2017-10-12 12:06 25M 
[   ]cmake-3.10.0-rc2.tar.Z2017-10-12 12:06 12M 
[   ]cmake-3.10.0-rc2.tar.gz2017-10-12 12:06 7.5M 
[   ]cmake-3.10.0-rc2.zip2017-10-12 12:06 13M 
[   ]cmake-3.10.0-rc3-Darwin-x86_64.dmg2017-10-19 13:24 26M 
[   ]cmake-3.10.0-rc3-Darwin-x86_64.tar.gz2017-10-19 13:24 26M 
[TXT]cmake-3.10.0-rc3-Linux-x86_64.sh2017-10-19 13:24 31M 
[   ]cmake-3.10.0-rc3-Linux-x86_64.tar.gz2017-10-19 13:24 31M 
[TXT]cmake-3.10.0-rc3-SHA-256.txt2017-10-19 13:24 1.0K 
[TXT]cmake-3.10.0-rc3-SHA-256.txt.asc2017-10-19 13:24 833  
[   ]cmake-3.10.0-rc3-win32-x86.msi2017-10-19 13:24 16M 
[   ]cmake-3.10.0-rc3-win32-x86.zip2017-10-19 13:24 22M 
[   ]cmake-3.10.0-rc3-win64-x64.msi2017-10-19 13:24 18M 
[   ]cmake-3.10.0-rc3-win64-x64.zip2017-10-19 13:24 25M 
[   ]cmake-3.10.0-rc3.tar.Z2017-10-19 13:24 12M 
[   ]cmake-3.10.0-rc3.tar.gz2017-10-19 13:24 7.5M 
[   ]cmake-3.10.0-rc3.zip2017-10-19 13:24 13M 
[   ]cmake-3.10.0-rc4-Darwin-x86_64.dmg2017-11-01 15:37 26M 
[   ]cmake-3.10.0-rc4-Darwin-x86_64.tar.gz2017-11-01 15:37 26M 
[TXT]cmake-3.10.0-rc4-Linux-x86_64.sh2017-11-01 15:37 31M 
[   ]cmake-3.10.0-rc4-Linux-x86_64.tar.gz2017-11-01 15:37 31M 
[TXT]cmake-3.10.0-rc4-SHA-256.txt2017-11-01 15:37 1.0K 
[TXT]cmake-3.10.0-rc4-SHA-256.txt.asc2017-11-01 15:37 833  
[   ]cmake-3.10.0-rc4-win32-x86.msi2017-11-01 15:37 16M 
[   ]cmake-3.10.0-rc4-win32-x86.zip2017-11-01 15:37 22M 
[   ]cmake-3.10.0-rc4-win64-x64.msi2017-11-01 15:37 18M 
[   ]cmake-3.10.0-rc4-win64-x64.zip2017-11-01 15:37 25M 
[   ]cmake-3.10.0-rc4.tar.Z2017-11-01 15:37 12M 
[   ]cmake-3.10.0-rc4.tar.gz2017-11-01 15:37 7.5M 
[   ]cmake-3.10.0-rc4.zip2017-11-01 15:37 13M 
[   ]cmake-3.10.0-rc5-Darwin-x86_64.dmg2017-11-10 14:01 26M 
[   ]cmake-3.10.0-rc5-Darwin-x86_64.tar.gz2017-11-10 14:01 26M 
[TXT]cmake-3.10.0-rc5-Linux-x86_64.sh2017-11-10 14:01 31M 
[   ]cmake-3.10.0-rc5-Linux-x86_64.tar.gz2017-11-10 14:01 31M 
[TXT]cmake-3.10.0-rc5-SHA-256.txt2017-11-10 14:01 1.0K 
[TXT]cmake-3.10.0-rc5-SHA-256.txt.asc2017-11-10 14:01 833  
[   ]cmake-3.10.0-rc5-win32-x86.msi2017-11-10 14:01 16M 
[   ]cmake-3.10.0-rc5-win32-x86.zip2017-11-10 14:01 22M 
[   ]cmake-3.10.0-rc5-win64-x64.msi2017-11-10 14:01 18M 
[   ]cmake-3.10.0-rc5-win64-x64.zip2017-11-10 14:01 25M 
[   ]cmake-3.10.0-rc5.tar.Z2017-11-10 14:01 12M 
[   ]cmake-3.10.0-rc5.tar.gz2017-11-10 14:01 7.5M 
[   ]cmake-3.10.0-rc5.zip2017-11-10 14:00 13M 
[   ]cmake-3.10.0-win32-x86.msi2017-11-20 16:00 15M 
[   ]cmake-3.10.0-win32-x86.zip2017-11-20 16:00 21M 
[   ]cmake-3.10.0-win64-x64.msi2017-11-20 16:00 17M 
[   ]cmake-3.10.0-win64-x64.zip2017-11-20 16:00 24M 
[   ]cmake-3.10.0.tar.Z2017-11-20 16:00 12M 
[   ]cmake-3.10.0.tar.gz2017-11-20 16:00 7.5M 
[   ]cmake-3.10.0.zip2017-11-20 16:00 12M 
[   ]cmake-3.10.1-Darwin-x86_64.dmg2017-12-14 09:10 26M 
[   ]cmake-3.10.1-Darwin-x86_64.tar.gz2017-12-14 09:10 26M 
[TXT]cmake-3.10.1-Linux-x86_64.sh2017-12-14 09:10 33M 
[   ]cmake-3.10.1-Linux-x86_64.tar.gz2017-12-14 09:10 33M 
[TXT]cmake-3.10.1-SHA-256.txt2017-12-14 09:10 1.0K 
[TXT]cmake-3.10.1-SHA-256.txt.asc2017-12-14 09:10 833  
[   ]cmake-3.10.1-win32-x86.msi2017-12-14 09:10 15M 
[   ]cmake-3.10.1-win32-x86.zip2017-12-14 09:10 21M 
[   ]cmake-3.10.1-win64-x64.msi2017-12-14 09:10 18M 
[   ]cmake-3.10.1-win64-x64.zip2017-12-14 09:09 25M 
[   ]cmake-3.10.1.tar.Z2017-12-14 09:09 12M 
[   ]cmake-3.10.1.tar.gz2017-12-14 09:09 7.5M 
[   ]cmake-3.10.1.zip2017-12-14 09:09 12M 
[   ]cmake-3.10.2-Darwin-x86_64.dmg2018-01-18 12:09 26M 
[   ]cmake-3.10.2-Darwin-x86_64.tar.gz2018-01-18 12:09 26M 
[TXT]cmake-3.10.2-Linux-x86_64.sh2018-01-18 12:09 33M 
[   ]cmake-3.10.2-Linux-x86_64.tar.gz2018-01-18 12:09 33M 
[TXT]cmake-3.10.2-SHA-256.txt2018-01-18 12:09 1.0K 
[TXT]cmake-3.10.2-SHA-256.txt.asc2018-01-18 12:09 833  
[   ]cmake-3.10.2-win32-x86.msi2018-01-18 12:09 15M 
[   ]cmake-3.10.2-win32-x86.zip2018-01-18 12:09 21M 
[   ]cmake-3.10.2-win64-x64.msi2018-01-18 12:09 18M 
[   ]cmake-3.10.2-win64-x64.zip2018-01-18 12:09 25M 
[   ]cmake-3.10.2.tar.Z2018-01-18 12:09 12M 
[   ]cmake-3.10.2.tar.gz2018-01-18 12:09 7.5M 
[   ]cmake-3.10.2.zip2018-01-18 12:08 12M 
[   ]cmake-3.10.3-Darwin-x86_64.dmg2018-03-16 09:38 26M 
[   ]cmake-3.10.3-Darwin-x86_64.tar.gz2018-03-16 09:38 26M 
[TXT]cmake-3.10.3-Linux-x86_64.sh2018-03-16 09:38 33M 
[   ]cmake-3.10.3-Linux-x86_64.tar.gz2018-03-16 09:38 33M 
[TXT]cmake-3.10.3-SHA-256.txt2018-03-16 09:38 1.0K 
[TXT]cmake-3.10.3-SHA-256.txt.asc2018-03-16 09:38 833  
[   ]cmake-3.10.3-win32-x86.msi2018-03-16 09:38 15M 
[   ]cmake-3.10.3-win32-x86.zip2018-03-16 09:38 21M 
[   ]cmake-3.10.3-win64-x64.msi2018-03-16 09:38 18M 
[   ]cmake-3.10.3-win64-x64.zip2018-03-16 09:38 25M 
[   ]cmake-3.10.3.tar.Z2018-03-16 09:38 12M 
[   ]cmake-3.10.3.tar.gz2018-03-16 09:38 7.5M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.11.0-Darwin-x86_64.dmg2018-03-28 13:40 26M 
[   ]cmake-3.11.0-Darwin-x86_64.tar.gz2018-03-28 13:40 26M 
[TXT]cmake-3.11.0-Linux-x86_64.sh2018-03-28 13:40 33M 
[   ]cmake-3.11.0-Linux-x86_64.tar.gz2018-03-28 13:40 33M 
[TXT]cmake-3.11.0-SHA-256.txt2018-03-28 13:40 1.0K 
[TXT]cmake-3.11.0-SHA-256.txt.asc2018-03-28 13:40 833  
[   ]cmake-3.11.0-rc1-Darwin-x86_64.dmg2018-02-15 11:53 26M 
[   ]cmake-3.11.0-rc1-Darwin-x86_64.tar.gz2018-02-15 11:53 26M 
[TXT]cmake-3.11.0-rc1-Linux-x86_64.sh2018-02-15 11:53 33M 
[   ]cmake-3.11.0-rc1-Linux-x86_64.tar.gz2018-02-15 11:53 33M 
[TXT]cmake-3.11.0-rc1-SHA-256.txt2018-02-15 11:53 1.0K 
[TXT]cmake-3.11.0-rc1-SHA-256.txt.asc2018-02-15 11:53 833  
[   ]cmake-3.11.0-rc1-win32-x86.msi2018-02-15 11:53 16M 
[   ]cmake-3.11.0-rc1-win32-x86.zip2018-02-15 11:53 22M 
[   ]cmake-3.11.0-rc1-win64-x64.msi2018-02-15 11:53 19M 
[   ]cmake-3.11.0-rc1-win64-x64.zip2018-02-15 11:53 26M 
[   ]cmake-3.11.0-rc1.tar.Z2018-02-15 11:52 12M 
[   ]cmake-3.11.0-rc1.tar.gz2018-02-15 11:52 7.6M 
[   ]cmake-3.11.0-rc1.zip2018-02-15 11:52 13M 
[   ]cmake-3.11.0-rc2-Darwin-x86_64.dmg2018-02-27 11:09 26M 
[   ]cmake-3.11.0-rc2-Darwin-x86_64.tar.gz2018-02-27 11:09 26M 
[TXT]cmake-3.11.0-rc2-Linux-x86_64.sh2018-02-27 11:09 33M 
[   ]cmake-3.11.0-rc2-Linux-x86_64.tar.gz2018-02-27 11:09 33M 
[TXT]cmake-3.11.0-rc2-SHA-256.txt2018-02-27 11:09 1.0K 
[TXT]cmake-3.11.0-rc2-SHA-256.txt.asc2018-02-27 11:09 833  
[   ]cmake-3.11.0-rc2-win32-x86.msi2018-02-27 11:09 16M 
[   ]cmake-3.11.0-rc2-win32-x86.zip2018-02-27 11:09 22M 
[   ]cmake-3.11.0-rc2-win64-x64.msi2018-02-27 11:09 19M 
[   ]cmake-3.11.0-rc2-win64-x64.zip2018-02-27 11:09 26M 
[   ]cmake-3.11.0-rc2.tar.Z2018-02-27 11:09 12M 
[   ]cmake-3.11.0-rc2.tar.gz2018-02-27 11:09 7.6M 
[   ]cmake-3.11.0-rc2.zip2018-02-27 11:09 13M 
[   ]cmake-3.11.0-rc3-Darwin-x86_64.dmg2018-03-09 13:46 26M 
[   ]cmake-3.11.0-rc3-Darwin-x86_64.tar.gz2018-03-09 13:46 26M 
[TXT]cmake-3.11.0-rc3-Linux-x86_64.sh2018-03-09 13:46 33M 
[   ]cmake-3.11.0-rc3-Linux-x86_64.tar.gz2018-03-09 13:46 33M 
[TXT]cmake-3.11.0-rc3-SHA-256.txt2018-03-09 13:46 1.0K 
[TXT]cmake-3.11.0-rc3-SHA-256.txt.asc2018-03-09 13:46 833  
[   ]cmake-3.11.0-rc3-win32-x86.msi2018-03-09 13:46 16M 
[   ]cmake-3.11.0-rc3-win32-x86.zip2018-03-09 13:45 22M 
[   ]cmake-3.11.0-rc3-win64-x64.msi2018-03-09 13:45 19M 
[   ]cmake-3.11.0-rc3-win64-x64.zip2018-03-09 13:45 26M 
[   ]cmake-3.11.0-rc3.tar.Z2018-03-09 13:45 12M 
[   ]cmake-3.11.0-rc3.tar.gz2018-03-09 13:45 7.6M 
[   ]cmake-3.11.0-rc3.zip2018-03-09 13:45 13M 
[   ]cmake-3.11.0-rc4-Darwin-x86_64.dmg2018-03-19 11:07 26M 
[   ]cmake-3.11.0-rc4-Darwin-x86_64.tar.gz2018-03-19 11:07 26M 
[TXT]cmake-3.11.0-rc4-Linux-x86_64.sh2018-03-19 11:06 33M 
[   ]cmake-3.11.0-rc4-Linux-x86_64.tar.gz2018-03-19 11:06 33M 
[TXT]cmake-3.11.0-rc4-SHA-256.txt2018-03-19 11:06 1.0K 
[TXT]cmake-3.11.0-rc4-SHA-256.txt.asc2018-03-19 11:06 833  
[   ]cmake-3.11.0-rc4-win32-x86.msi2018-03-19 11:06 16M 
[   ]cmake-3.11.0-rc4-win32-x86.zip2018-03-19 11:06 22M 
[   ]cmake-3.11.0-rc4-win64-x64.msi2018-03-19 11:06 19M 
[   ]cmake-3.11.0-rc4-win64-x64.zip2018-03-19 11:06 26M 
[   ]cmake-3.11.0-rc4.tar.Z2018-03-19 11:06 12M 
[   ]cmake-3.11.0-rc4.tar.gz2018-03-19 11:06 7.6M 
[   ]cmake-3.11.0-rc4.zip2018-03-19 11:06 13M 
[   ]cmake-3.11.0-win32-x86.msi2018-03-28 13:40 16M 
[   ]cmake-3.11.0-win32-x86.zip2018-03-28 13:40 22M 
[   ]cmake-3.11.0-win64-x64.msi2018-03-28 13:40 19M 
[   ]cmake-3.11.0-win64-x64.zip2018-03-28 13:40 26M 
[   ]cmake-3.11.0.tar.Z2018-03-28 13:40 12M 
[   ]cmake-3.11.0.tar.gz2018-03-28 13:40 7.6M 
[   ]cmake-3.11.0.zip2018-03-28 13:40 13M 
[   ]cmake-3.11.1-Darwin-x86_64.dmg2018-04-17 11:33 26M 
[   ]cmake-3.11.1-Darwin-x86_64.tar.gz2018-04-17 11:32 26M 
[TXT]cmake-3.11.1-Linux-x86_64.sh2018-04-17 11:32 33M 
[   ]cmake-3.11.1-Linux-x86_64.tar.gz2018-04-17 11:32 33M 
[TXT]cmake-3.11.1-SHA-256.txt2018-04-17 11:32 1.0K 
[TXT]cmake-3.11.1-SHA-256.txt.asc2018-04-17 11:32 833  
[   ]cmake-3.11.1-win32-x86.msi2018-04-17 11:32 16M 
[   ]cmake-3.11.1-win32-x86.zip2018-04-17 11:32 22M 
[   ]cmake-3.11.1-win64-x64.msi2018-04-17 11:32 19M 
[   ]cmake-3.11.1-win64-x64.zip2018-04-17 11:32 26M 
[   ]cmake-3.11.1.tar.Z2018-04-17 11:32 12M 
[   ]cmake-3.11.1.tar.gz2018-04-17 11:32 7.6M 
[   ]cmake-3.11.1.zip2018-04-17 11:32 13M 
[   ]cmake-3.11.2-Darwin-x86_64.dmg2018-05-17 12:45 26M 
[   ]cmake-3.11.2-Darwin-x86_64.tar.gz2018-05-17 12:45 26M 
[TXT]cmake-3.11.2-Linux-x86_64.sh2018-05-17 12:45 33M 
[   ]cmake-3.11.2-Linux-x86_64.tar.gz2018-05-17 12:45 33M 
[TXT]cmake-3.11.2-SHA-256.txt2018-05-17 12:45 1.0K 
[TXT]cmake-3.11.2-SHA-256.txt.asc2018-05-17 12:45 833  
[   ]cmake-3.11.2-win32-x86.msi2018-05-17 12:45 16M 
[   ]cmake-3.11.2-win32-x86.zip2018-05-17 12:45 22M 
[   ]cmake-3.11.2-win64-x64.msi2018-05-17 12:45 18M 
[   ]cmake-3.11.2-win64-x64.zip2018-05-17 12:44 25M 
[   ]cmake-3.11.2.tar.Z2018-05-17 12:44 12M 
[   ]cmake-3.11.2.tar.gz2018-05-17 12:44 7.6M 
[   ]cmake-3.11.2.zip2018-05-17 12:44 13M 
[   ]cmake-3.11.3-Darwin-x86_64.dmg2018-05-31 15:53 26M 
[   ]cmake-3.11.3-Darwin-x86_64.tar.gz2018-05-31 15:53 26M 
[TXT]cmake-3.11.3-Linux-x86_64.sh2018-05-31 15:53 33M 
[   ]cmake-3.11.3-Linux-x86_64.tar.gz2018-05-31 15:52 33M 
[TXT]cmake-3.11.3-SHA-256.txt2018-05-31 15:52 1.0K 
[TXT]cmake-3.11.3-SHA-256.txt.asc2018-05-31 15:52 833  
[   ]cmake-3.11.3-win32-x86.msi2018-05-31 15:52 16M 
[   ]cmake-3.11.3-win32-x86.zip2018-05-31 15:52 22M 
[   ]cmake-3.11.3-win64-x64.msi2018-05-31 15:52 18M 
[   ]cmake-3.11.3-win64-x64.zip2018-05-31 15:52 25M 
[   ]cmake-3.11.3.tar.Z2018-05-31 15:52 12M 
[   ]cmake-3.11.3.tar.gz2018-05-31 15:52 7.6M 
[   ]cmake-3.11.3.zip2018-05-31 15:52 13M 
[   ]cmake-3.11.4-Darwin-x86_64.dmg2018-06-14 13:50 26M 
[   ]cmake-3.11.4-Darwin-x86_64.tar.gz2018-06-14 13:50 26M 
[TXT]cmake-3.11.4-Linux-x86_64.sh2018-06-14 13:50 33M 
[   ]cmake-3.11.4-Linux-x86_64.tar.gz2018-06-14 13:50 33M 
[TXT]cmake-3.11.4-SHA-256.txt2018-06-14 13:50 1.0K 
[TXT]cmake-3.11.4-SHA-256.txt.asc2018-06-14 13:50 833  
[   ]cmake-3.11.4-win32-x86.msi2018-06-14 13:50 16M 
[   ]cmake-3.11.4-win32-x86.zip2018-06-14 13:50 22M 
[   ]cmake-3.11.4-win64-x64.msi2018-06-14 13:50 18M 
[   ]cmake-3.11.4-win64-x64.zip2018-06-14 13:50 25M 
[   ]cmake-3.11.4.tar.Z2018-06-14 13:50 12M 
[   ]cmake-3.11.4.tar.gz2018-06-14 13:50 7.6M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.12.0-Darwin-x86_64.dmg2018-07-17 09:58 27M 
[   ]cmake-3.12.0-Darwin-x86_64.tar.gz2018-07-17 09:58 27M 
[TXT]cmake-3.12.0-Linux-x86_64.sh2018-07-17 09:58 33M 
[   ]cmake-3.12.0-Linux-x86_64.tar.gz2018-07-17 09:58 33M 
[TXT]cmake-3.12.0-SHA-256.txt2018-07-17 09:58 1.0K 
[TXT]cmake-3.12.0-SHA-256.txt.asc2018-07-17 09:58 833  
[   ]cmake-3.12.0-rc1-Darwin-x86_64.dmg2018-06-14 15:01 27M 
[   ]cmake-3.12.0-rc1-Darwin-x86_64.tar.gz2018-06-14 15:01 27M 
[TXT]cmake-3.12.0-rc1-Linux-x86_64.sh2018-06-14 15:01 29M 
[   ]cmake-3.12.0-rc1-Linux-x86_64.tar.gz2018-06-14 15:01 29M 
[TXT]cmake-3.12.0-rc1-SHA-256.txt2018-06-14 15:01 1.0K 
[TXT]cmake-3.12.0-rc1-SHA-256.txt.asc2018-06-14 15:01 833  
[   ]cmake-3.12.0-rc1-win32-x86.msi2018-06-14 15:01 16M 
[   ]cmake-3.12.0-rc1-win32-x86.zip2018-06-14 15:01 23M 
[   ]cmake-3.12.0-rc1-win64-x64.msi2018-06-14 15:01 18M 
[   ]cmake-3.12.0-rc1-win64-x64.zip2018-06-14 15:01 25M 
[   ]cmake-3.12.0-rc1.tar.Z2018-06-14 15:01 13M 
[   ]cmake-3.12.0-rc1.tar.gz2018-06-14 15:01 7.7M 
[   ]cmake-3.12.0-rc1.zip2018-06-14 15:01 13M 
[   ]cmake-3.12.0-rc2-Darwin-x86_64.dmg2018-06-29 13:57 27M 
[   ]cmake-3.12.0-rc2-Darwin-x86_64.tar.gz2018-06-29 13:57 27M 
[TXT]cmake-3.12.0-rc2-Linux-x86_64.sh2018-06-29 13:57 29M 
[   ]cmake-3.12.0-rc2-Linux-x86_64.tar.gz2018-06-29 13:57 29M 
[TXT]cmake-3.12.0-rc2-SHA-256.txt2018-06-29 13:57 1.0K 
[TXT]cmake-3.12.0-rc2-SHA-256.txt.asc2018-06-29 13:57 833  
[   ]cmake-3.12.0-rc2-win32-x86.msi2018-06-29 13:56 16M 
[   ]cmake-3.12.0-rc2-win32-x86.zip2018-06-29 13:56 23M 
[   ]cmake-3.12.0-rc2-win64-x64.msi2018-06-29 13:56 18M 
[   ]cmake-3.12.0-rc2-win64-x64.zip2018-06-29 13:56 25M 
[   ]cmake-3.12.0-rc2.tar.Z2018-06-29 13:56 13M 
[   ]cmake-3.12.0-rc2.tar.gz2018-06-29 13:56 7.7M 
[   ]cmake-3.12.0-rc2.zip2018-06-29 13:56 13M 
[   ]cmake-3.12.0-rc3-Darwin-x86_64.dmg2018-07-09 11:38 27M 
[   ]cmake-3.12.0-rc3-Darwin-x86_64.tar.gz2018-07-09 11:38 27M 
[TXT]cmake-3.12.0-rc3-Linux-x86_64.sh2018-07-09 11:38 33M 
[   ]cmake-3.12.0-rc3-Linux-x86_64.tar.gz2018-07-09 11:38 33M 
[TXT]cmake-3.12.0-rc3-SHA-256.txt2018-07-09 11:38 1.0K 
[TXT]cmake-3.12.0-rc3-SHA-256.txt.asc2018-07-09 11:38 833  
[   ]cmake-3.12.0-rc3-win32-x86.msi2018-07-09 11:38 16M 
[   ]cmake-3.12.0-rc3-win32-x86.zip2018-07-09 11:38 23M 
[   ]cmake-3.12.0-rc3-win64-x64.msi2018-07-09 11:37 18M 
[   ]cmake-3.12.0-rc3-win64-x64.zip2018-07-09 11:37 25M 
[   ]cmake-3.12.0-rc3.tar.Z2018-07-09 11:37 13M 
[   ]cmake-3.12.0-rc3.tar.gz2018-07-09 11:37 7.7M 
[   ]cmake-3.12.0-rc3.zip2018-07-09 11:37 13M 
[   ]cmake-3.12.0-win32-x86.msi2018-07-17 09:58 16M 
[   ]cmake-3.12.0-win32-x86.zip2018-07-17 09:58 23M 
[   ]cmake-3.12.0-win64-x64.msi2018-07-17 09:58 18M 
[   ]cmake-3.12.0-win64-x64.zip2018-07-17 09:58 25M 
[   ]cmake-3.12.0.tar.Z2018-07-17 09:58 13M 
[   ]cmake-3.12.0.tar.gz2018-07-17 09:58 7.7M 
[   ]cmake-3.12.0.zip2018-07-17 09:57 13M 
[   ]cmake-3.12.1-Darwin-x86_64.dmg2018-08-09 11:21 27M 
[   ]cmake-3.12.1-Darwin-x86_64.tar.gz2018-08-09 11:21 27M 
[TXT]cmake-3.12.1-Linux-x86_64.sh2018-08-09 11:21 33M 
[   ]cmake-3.12.1-Linux-x86_64.tar.gz2018-08-09 11:21 33M 
[TXT]cmake-3.12.1-SHA-256.txt2018-08-09 11:20 1.0K 
[TXT]cmake-3.12.1-SHA-256.txt.asc2018-08-09 11:20 833  
[   ]cmake-3.12.1-win32-x86.msi2018-08-09 11:20 16M 
[   ]cmake-3.12.1-win32-x86.zip2018-08-09 11:20 23M 
[   ]cmake-3.12.1-win64-x64.msi2018-08-09 11:20 18M 
[   ]cmake-3.12.1-win64-x64.zip2018-08-09 11:20 25M 
[   ]cmake-3.12.1.tar.Z2018-08-09 11:20 13M 
[   ]cmake-3.12.1.tar.gz2018-08-09 11:20 7.7M 
[   ]cmake-3.12.1.zip2018-08-09 11:20 13M 
[   ]cmake-3.12.2-Darwin-x86_64.dmg2018-09-07 12:51 28M 
[   ]cmake-3.12.2-Darwin-x86_64.tar.gz2018-09-07 12:51 28M 
[TXT]cmake-3.12.2-Linux-x86_64.sh2018-09-07 12:51 33M 
[   ]cmake-3.12.2-Linux-x86_64.tar.gz2018-09-07 12:51 33M 
[TXT]cmake-3.12.2-SHA-256.txt2018-09-07 12:51 1.0K 
[TXT]cmake-3.12.2-SHA-256.txt.asc2018-09-07 12:51 833  
[   ]cmake-3.12.2-win32-x86.msi2018-09-07 12:51 16M 
[   ]cmake-3.12.2-win32-x86.zip2018-09-07 12:51 22M 
[   ]cmake-3.12.2-win64-x64.msi2018-09-07 12:51 18M 
[   ]cmake-3.12.2-win64-x64.zip2018-09-07 12:51 25M 
[   ]cmake-3.12.2.tar.Z2018-09-07 12:51 13M 
[   ]cmake-3.12.2.tar.gz2018-09-07 12:51 8.0M 
[   ]cmake-3.12.2.zip2018-09-07 12:51 13M 
[   ]cmake-3.12.3-Darwin-x86_64.dmg2018-10-03 10:46 28M 
[   ]cmake-3.12.3-Darwin-x86_64.tar.gz2018-10-03 10:46 28M 
[TXT]cmake-3.12.3-Linux-x86_64.sh2018-10-03 10:45 33M 
[   ]cmake-3.12.3-Linux-x86_64.tar.gz2018-10-03 10:45 33M 
[TXT]cmake-3.12.3-SHA-256.txt2018-10-03 10:45 1.0K 
[TXT]cmake-3.12.3-SHA-256.txt.asc2018-10-03 10:45 833  
[   ]cmake-3.12.3-win32-x86.msi2018-10-03 10:45 16M 
[   ]cmake-3.12.3-win32-x86.zip2018-10-03 10:45 22M 
[   ]cmake-3.12.3-win64-x64.msi2018-10-03 10:45 18M 
[   ]cmake-3.12.3-win64-x64.zip2018-10-03 10:45 25M 
[   ]cmake-3.12.3.tar.Z2018-10-03 10:45 13M 
[   ]cmake-3.12.3.tar.gz2018-10-03 10:45 8.0M 
[   ]cmake-3.12.3.zip2018-10-03 10:45 13M 
[   ]cmake-3.12.4-Darwin-x86_64.dmg2018-11-02 13:51 28M 
[   ]cmake-3.12.4-Darwin-x86_64.tar.gz2018-11-02 13:51 28M 
[TXT]cmake-3.12.4-Linux-x86_64.sh2018-11-02 13:51 33M 
[   ]cmake-3.12.4-Linux-x86_64.tar.gz2018-11-02 13:51 33M 
[TXT]cmake-3.12.4-SHA-256.txt2018-11-02 13:51 1.0K 
[TXT]cmake-3.12.4-SHA-256.txt.asc2018-11-02 13:51 833  
[   ]cmake-3.12.4-win32-x86.msi2018-11-02 13:51 16M 
[   ]cmake-3.12.4-win32-x86.zip2018-11-02 13:51 22M 
[   ]cmake-3.12.4-win64-x64.msi2018-11-02 13:51 18M 
[   ]cmake-3.12.4-win64-x64.zip2018-11-02 13:51 25M 
[   ]cmake-3.12.4.tar.Z2018-11-02 13:51 13M 
[   ]cmake-3.12.4.tar.gz2018-11-02 13:51 8.0M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.13.0-Darwin-x86_64.dmg2018-11-20 14:05 31M 
[   ]cmake-3.13.0-Darwin-x86_64.tar.gz2018-11-20 14:05 31M 
[TXT]cmake-3.13.0-Linux-x86_64.sh2018-11-20 14:05 37M 
[   ]cmake-3.13.0-Linux-x86_64.tar.gz2018-11-20 14:05 37M 
[TXT]cmake-3.13.0-SHA-256.txt2018-11-20 14:05 1.0K 
[TXT]cmake-3.13.0-SHA-256.txt.asc2018-11-20 14:05 833  
[   ]cmake-3.13.0-rc1-Darwin-x86_64.dmg2018-10-09 11:32 29M 
[   ]cmake-3.13.0-rc1-Darwin-x86_64.tar.gz2018-10-09 11:32 28M 
[TXT]cmake-3.13.0-rc1-Linux-x86_64.sh2018-10-09 11:32 34M 
[   ]cmake-3.13.0-rc1-Linux-x86_64.tar.gz2018-10-09 11:32 34M 
[TXT]cmake-3.13.0-rc1-SHA-256.txt2018-10-09 11:32 1.0K 
[TXT]cmake-3.13.0-rc1-SHA-256.txt.asc2018-10-09 11:32 833  
[   ]cmake-3.13.0-rc1-win32-x86.msi2018-10-09 11:32 16M 
[   ]cmake-3.13.0-rc1-win32-x86.zip2018-10-09 11:32 23M 
[   ]cmake-3.13.0-rc1-win64-x64.msi2018-10-09 11:32 19M 
[   ]cmake-3.13.0-rc1-win64-x64.zip2018-10-09 11:32 26M 
[   ]cmake-3.13.0-rc1.tar.Z2018-10-09 11:32 13M 
[   ]cmake-3.13.0-rc1.tar.gz2018-10-09 11:32 8.2M 
[   ]cmake-3.13.0-rc1.zip2018-10-09 11:32 13M 
[   ]cmake-3.13.0-rc2-Darwin-x86_64.dmg2018-10-25 10:28 31M 
[   ]cmake-3.13.0-rc2-Darwin-x86_64.tar.gz2018-10-25 10:28 31M 
[TXT]cmake-3.13.0-rc2-Linux-x86_64.sh2018-10-25 10:27 37M 
[   ]cmake-3.13.0-rc2-Linux-x86_64.tar.gz2018-10-25 10:27 37M 
[TXT]cmake-3.13.0-rc2-SHA-256.txt2018-10-25 10:27 1.0K 
[TXT]cmake-3.13.0-rc2-SHA-256.txt.asc2018-10-25 10:27 833  
[   ]cmake-3.13.0-rc2-win32-x86.msi2018-10-25 10:27 19M 
[   ]cmake-3.13.0-rc2-win32-x86.zip2018-10-25 10:27 25M 
[   ]cmake-3.13.0-rc2-win64-x64.msi2018-10-25 10:27 21M 
[   ]cmake-3.13.0-rc2-win64-x64.zip2018-10-25 10:27 28M 
[   ]cmake-3.13.0-rc2.tar.Z2018-10-25 10:27 13M 
[   ]cmake-3.13.0-rc2.tar.gz2018-10-25 10:27 8.2M 
[   ]cmake-3.13.0-rc2.zip2018-10-25 10:27 13M 
[   ]cmake-3.13.0-rc3-Darwin-x86_64.dmg2018-11-07 12:11 31M 
[   ]cmake-3.13.0-rc3-Darwin-x86_64.tar.gz2018-11-07 12:11 31M 
[TXT]cmake-3.13.0-rc3-Linux-x86_64.sh2018-11-07 12:11 37M 
[   ]cmake-3.13.0-rc3-Linux-x86_64.tar.gz2018-11-07 12:11 37M 
[TXT]cmake-3.13.0-rc3-SHA-256.txt2018-11-07 12:11 1.0K 
[TXT]cmake-3.13.0-rc3-SHA-256.txt.asc2018-11-07 12:11 833  
[   ]cmake-3.13.0-rc3-win32-x86.msi2018-11-07 12:11 19M 
[   ]cmake-3.13.0-rc3-win32-x86.zip2018-11-07 12:11 25M 
[   ]cmake-3.13.0-rc3-win64-x64.msi2018-11-07 12:11 21M 
[   ]cmake-3.13.0-rc3-win64-x64.zip2018-11-07 12:11 28M 
[   ]cmake-3.13.0-rc3.tar.Z2018-11-07 12:11 13M 
[   ]cmake-3.13.0-rc3.tar.gz2018-11-07 12:11 8.2M 
[   ]cmake-3.13.0-rc3.zip2018-11-07 12:11 13M 
[   ]cmake-3.13.0-win32-x86.msi2018-11-20 14:05 19M 
[   ]cmake-3.13.0-win32-x86.zip2018-11-20 14:05 25M 
[   ]cmake-3.13.0-win64-x64.msi2018-11-20 14:05 21M 
[   ]cmake-3.13.0-win64-x64.zip2018-11-20 14:05 28M 
[   ]cmake-3.13.0.tar.Z2018-11-20 14:04 13M 
[   ]cmake-3.13.0.tar.gz2018-11-20 14:04 8.2M 
[   ]cmake-3.13.0.zip2018-11-20 14:04 13M 
[   ]cmake-3.13.1-Darwin-x86_64.dmg2018-11-28 08:50 31M 
[   ]cmake-3.13.1-Darwin-x86_64.tar.gz2018-11-28 08:50 31M 
[TXT]cmake-3.13.1-Linux-x86_64.sh2018-11-28 08:50 37M 
[   ]cmake-3.13.1-Linux-x86_64.tar.gz2018-11-28 08:50 37M 
[TXT]cmake-3.13.1-SHA-256.txt2018-11-28 08:50 1.0K 
[TXT]cmake-3.13.1-SHA-256.txt.asc2018-11-28 08:50 833  
[   ]cmake-3.13.1-win32-x86.msi2018-11-28 08:50 19M 
[   ]cmake-3.13.1-win32-x86.zip2018-11-28 08:50 25M 
[   ]cmake-3.13.1-win64-x64.msi2018-11-28 08:50 21M 
[   ]cmake-3.13.1-win64-x64.zip2018-11-28 08:50 28M 
[   ]cmake-3.13.1.tar.Z2018-11-28 08:50 13M 
[   ]cmake-3.13.1.tar.gz2018-11-28 08:50 8.2M 
[   ]cmake-3.13.1.zip2018-11-28 08:50 13M 
[   ]cmake-3.13.2-Darwin-x86_64.dmg2018-12-13 08:41 31M 
[   ]cmake-3.13.2-Darwin-x86_64.tar.gz2018-12-13 08:41 31M 
[TXT]cmake-3.13.2-Linux-x86_64.sh2018-12-13 08:41 37M 
[   ]cmake-3.13.2-Linux-x86_64.tar.gz2018-12-13 08:41 37M 
[TXT]cmake-3.13.2-SHA-256.txt2018-12-13 08:41 1.0K 
[TXT]cmake-3.13.2-SHA-256.txt.asc2018-12-13 08:41 833  
[   ]cmake-3.13.2-win32-x86.msi2018-12-13 08:41 19M 
[   ]cmake-3.13.2-win32-x86.zip2018-12-13 08:41 25M 
[   ]cmake-3.13.2-win64-x64.msi2018-12-13 08:41 21M 
[   ]cmake-3.13.2-win64-x64.zip2018-12-13 08:41 28M 
[   ]cmake-3.13.2.tar.Z2018-12-13 08:41 13M 
[   ]cmake-3.13.2.tar.gz2018-12-13 08:41 8.2M 
[   ]cmake-3.13.2.zip2018-12-13 08:41 13M 
[   ]cmake-3.13.3-Darwin-x86_64.dmg2019-01-14 09:26 31M 
[   ]cmake-3.13.3-Darwin-x86_64.tar.gz2019-01-14 09:26 31M 
[TXT]cmake-3.13.3-Linux-x86_64.sh2019-01-14 09:25 37M 
[   ]cmake-3.13.3-Linux-x86_64.tar.gz2019-01-14 09:25 37M 
[TXT]cmake-3.13.3-SHA-256.txt2019-01-14 09:25 1.0K 
[TXT]cmake-3.13.3-SHA-256.txt.asc2019-01-14 09:25 833  
[   ]cmake-3.13.3-win32-x86.msi2019-01-14 09:25 19M 
[   ]cmake-3.13.3-win32-x86.zip2019-01-14 09:25 25M 
[   ]cmake-3.13.3-win64-x64.msi2019-01-14 09:25 21M 
[   ]cmake-3.13.3-win64-x64.zip2019-01-14 09:25 28M 
[   ]cmake-3.13.3.tar.Z2019-01-14 09:25 13M 
[   ]cmake-3.13.3.tar.gz2019-01-14 09:25 8.2M 
[   ]cmake-3.13.3.zip2019-01-14 09:25 13M 
[   ]cmake-3.13.4-Darwin-x86_64.dmg2019-02-01 13:20 31M 
[   ]cmake-3.13.4-Darwin-x86_64.tar.gz2019-02-01 13:20 31M 
[TXT]cmake-3.13.4-Linux-x86_64.sh2019-02-01 13:20 37M 
[   ]cmake-3.13.4-Linux-x86_64.tar.gz2019-02-01 13:20 37M 
[TXT]cmake-3.13.4-SHA-256.txt2019-02-01 13:20 1.0K 
[TXT]cmake-3.13.4-SHA-256.txt.asc2019-02-01 13:20 833  
[   ]cmake-3.13.4-win32-x86.msi2019-02-01 13:20 19M 
[   ]cmake-3.13.4-win32-x86.zip2019-02-01 13:20 25M 
[   ]cmake-3.13.4-win64-x64.msi2019-02-01 13:20 21M 
[   ]cmake-3.13.4-win64-x64.zip2019-02-01 13:20 28M 
[   ]cmake-3.13.4.tar.Z2019-02-01 13:20 13M 
[   ]cmake-3.13.4.tar.gz2019-02-01 13:20 8.2M 
[   ]cmake-3.13.4.zip2019-02-01 13:20 13M 
[   ]cmake-3.13.5-Darwin-x86_64.dmg2019-05-14 12:44 31M 
[   ]cmake-3.13.5-Darwin-x86_64.tar.gz2019-05-14 12:44 31M 
[TXT]cmake-3.13.5-Linux-x86_64.sh2019-05-14 12:44 37M 
[   ]cmake-3.13.5-Linux-x86_64.tar.gz2019-05-14 12:44 37M 
[TXT]cmake-3.13.5-SHA-256.txt2019-05-14 12:43 1.0K 
[TXT]cmake-3.13.5-SHA-256.txt.asc2019-05-14 12:43 833  
[   ]cmake-3.13.5-win32-x86.msi2019-05-14 12:43 19M 
[   ]cmake-3.13.5-win32-x86.zip2019-05-14 12:43 25M 
[   ]cmake-3.13.5-win64-x64.msi2019-05-14 12:43 21M 
[   ]cmake-3.13.5-win64-x64.zip2019-05-14 12:43 28M 
[   ]cmake-3.13.5.tar.Z2019-05-14 12:43 13M 
[   ]cmake-3.13.5.tar.gz2019-05-14 12:43 8.2M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.14.0-Darwin-x86_64.dmg2019-03-14 11:37 33M 
[   ]cmake-3.14.0-Darwin-x86_64.tar.gz2019-03-14 11:37 32M 
[TXT]cmake-3.14.0-Linux-x86_64.sh2019-03-14 11:37 35M 
[   ]cmake-3.14.0-Linux-x86_64.tar.gz2019-03-14 11:37 35M 
[TXT]cmake-3.14.0-SHA-256.txt2019-03-22 11:03 1.0K 
[TXT]cmake-3.14.0-SHA-256.txt.asc2019-03-22 11:03 833  
[   ]cmake-3.14.0-rc1-Darwin-x86_64.dmg2019-02-07 10:36 33M 
[   ]cmake-3.14.0-rc1-Darwin-x86_64.tar.gz2019-02-07 10:36 32M 
[TXT]cmake-3.14.0-rc1-Linux-x86_64.sh2019-02-07 10:36 35M 
[   ]cmake-3.14.0-rc1-Linux-x86_64.tar.gz2019-02-07 10:36 35M 
[TXT]cmake-3.14.0-rc1-SHA-256.txt2019-02-07 10:36 1.0K 
[TXT]cmake-3.14.0-rc1-SHA-256.txt.asc2019-02-07 10:36 833  
[   ]cmake-3.14.0-rc1-win32-x86.msi2019-02-07 10:36 19M 
[   ]cmake-3.14.0-rc1-win32-x86.zip2019-02-07 10:36 26M 
[   ]cmake-3.14.0-rc1-win64-x64.msi2019-02-07 10:36 22M 
[   ]cmake-3.14.0-rc1-win64-x64.zip2019-02-07 10:36 29M 
[   ]cmake-3.14.0-rc1.tar.Z2019-02-07 10:36 14M 
[   ]cmake-3.14.0-rc1.tar.gz2019-02-07 10:35 8.4M 
[   ]cmake-3.14.0-rc1.zip2019-02-07 10:35 14M 
[   ]cmake-3.14.0-rc2-Darwin-x86_64.dmg2019-02-15 10:04 33M 
[   ]cmake-3.14.0-rc2-Darwin-x86_64.tar.gz2019-02-15 10:04 32M 
[TXT]cmake-3.14.0-rc2-Linux-x86_64.sh2019-02-15 10:04 35M 
[   ]cmake-3.14.0-rc2-Linux-x86_64.tar.gz2019-02-15 10:04 35M 
[TXT]cmake-3.14.0-rc2-SHA-256.txt2019-02-15 10:04 1.0K 
[TXT]cmake-3.14.0-rc2-SHA-256.txt.asc2019-02-15 10:04 833  
[   ]cmake-3.14.0-rc2-win32-x86.msi2019-02-15 10:04 19M 
[   ]cmake-3.14.0-rc2-win32-x86.zip2019-02-15 10:04 26M 
[   ]cmake-3.14.0-rc2-win64-x64.msi2019-02-15 10:03 22M 
[   ]cmake-3.14.0-rc2-win64-x64.zip2019-02-15 10:03 29M 
[   ]cmake-3.14.0-rc2.tar.Z2019-02-15 10:03 14M 
[   ]cmake-3.14.0-rc2.tar.gz2019-02-15 10:03 8.4M 
[   ]cmake-3.14.0-rc2.zip2019-02-15 10:03 14M 
[   ]cmake-3.14.0-rc3-Darwin-x86_64.dmg2019-03-01 11:20 33M 
[   ]cmake-3.14.0-rc3-Darwin-x86_64.tar.gz2019-03-01 11:20 32M 
[TXT]cmake-3.14.0-rc3-Linux-x86_64.sh2019-03-01 11:20 35M 
[   ]cmake-3.14.0-rc3-Linux-x86_64.tar.gz2019-03-01 11:20 35M 
[TXT]cmake-3.14.0-rc3-SHA-256.txt2019-03-01 11:20 1.0K 
[TXT]cmake-3.14.0-rc3-SHA-256.txt.asc2019-03-01 11:20 833  
[   ]cmake-3.14.0-rc3-win32-x86.msi2019-03-01 11:20 19M 
[   ]cmake-3.14.0-rc3-win32-x86.zip2019-03-01 11:20 26M 
[   ]cmake-3.14.0-rc3-win64-x64.msi2019-03-01 11:20 22M 
[   ]cmake-3.14.0-rc3-win64-x64.zip2019-03-01 11:20 29M 
[   ]cmake-3.14.0-rc3.tar.Z2019-03-01 11:20 14M 
[   ]cmake-3.14.0-rc3.tar.gz2019-03-01 11:19 8.4M 
[   ]cmake-3.14.0-rc3.zip2019-03-01 11:19 14M 
[   ]cmake-3.14.0-rc4-Darwin-x86_64.dmg2019-03-08 11:09 33M 
[   ]cmake-3.14.0-rc4-Darwin-x86_64.tar.gz2019-03-08 11:09 32M 
[TXT]cmake-3.14.0-rc4-Linux-x86_64.sh2019-03-08 11:09 35M 
[   ]cmake-3.14.0-rc4-Linux-x86_64.tar.gz2019-03-08 11:09 35M 
[TXT]cmake-3.14.0-rc4-SHA-256.txt2019-03-08 11:09 1.0K 
[TXT]cmake-3.14.0-rc4-SHA-256.txt.asc2019-03-08 11:09 833  
[   ]cmake-3.14.0-rc4-win32-x86.msi2019-03-08 11:08 20M 
[   ]cmake-3.14.0-rc4-win32-x86.zip2019-03-08 11:08 26M 
[   ]cmake-3.14.0-rc4-win64-x64.msi2019-03-08 11:08 22M 
[   ]cmake-3.14.0-rc4-win64-x64.zip2019-03-08 11:08 30M 
[   ]cmake-3.14.0-rc4.tar.Z2019-03-08 11:08 14M 
[   ]cmake-3.14.0-rc4.tar.gz2019-03-08 11:08 8.4M 
[   ]cmake-3.14.0-rc4.zip2019-03-08 11:08 14M 
[   ]cmake-3.14.0-win32-x86.msi2019-03-14 11:36 20M 
[   ]cmake-3.14.0-win32-x86.zip2019-03-14 11:36 26M 
[   ]cmake-3.14.0-win64-x64.msi2019-03-22 11:03 22M 
[   ]cmake-3.14.0-win64-x64.zip2019-03-22 11:03 30M 
[   ]cmake-3.14.0.tar.Z2019-03-14 11:36 14M 
[   ]cmake-3.14.0.tar.gz2019-03-14 11:36 8.4M 
[   ]cmake-3.14.0.zip2019-03-14 11:36 14M 
[   ]cmake-3.14.1-Darwin-x86_64.dmg2019-03-29 12:20 33M 
[   ]cmake-3.14.1-Darwin-x86_64.tar.gz2019-03-29 12:20 32M 
[TXT]cmake-3.14.1-Linux-x86_64.sh2019-03-29 12:20 35M 
[   ]cmake-3.14.1-Linux-x86_64.tar.gz2019-03-29 12:19 35M 
[TXT]cmake-3.14.1-SHA-256.txt2019-03-29 12:19 1.0K 
[TXT]cmake-3.14.1-SHA-256.txt.asc2019-03-29 12:19 833  
[   ]cmake-3.14.1-win32-x86.msi2019-03-29 12:19 20M 
[   ]cmake-3.14.1-win32-x86.zip2019-03-29 12:19 26M 
[   ]cmake-3.14.1-win64-x64.msi2019-03-29 12:19 22M 
[   ]cmake-3.14.1-win64-x64.zip2019-03-29 12:19 30M 
[   ]cmake-3.14.1.tar.Z2019-03-29 12:19 14M 
[   ]cmake-3.14.1.tar.gz2019-03-29 12:19 8.4M 
[   ]cmake-3.14.1.zip2019-03-29 12:19 14M 
[   ]cmake-3.14.2-Darwin-x86_64.dmg2019-04-12 10:19 33M 
[   ]cmake-3.14.2-Darwin-x86_64.tar.gz2019-04-12 10:19 32M 
[TXT]cmake-3.14.2-Linux-x86_64.sh2019-04-12 10:19 35M 
[   ]cmake-3.14.2-Linux-x86_64.tar.gz2019-04-12 10:19 35M 
[TXT]cmake-3.14.2-SHA-256.txt2019-04-12 10:19 1.0K 
[TXT]cmake-3.14.2-SHA-256.txt.asc2019-04-12 10:19 833  
[   ]cmake-3.14.2-win32-x86.msi2019-04-12 10:19 20M 
[   ]cmake-3.14.2-win32-x86.zip2019-04-12 10:19 26M 
[   ]cmake-3.14.2-win64-x64.msi2019-04-12 10:19 22M 
[   ]cmake-3.14.2-win64-x64.zip2019-04-12 10:19 30M 
[   ]cmake-3.14.2.tar.Z2019-04-12 10:19 14M 
[   ]cmake-3.14.2.tar.gz2019-04-12 10:19 8.4M 
[   ]cmake-3.14.2.zip2019-04-12 10:19 14M 
[   ]cmake-3.14.3-Darwin-x86_64.dmg2019-04-22 10:40 33M 
[   ]cmake-3.14.3-Darwin-x86_64.tar.gz2019-04-22 10:39 32M 
[TXT]cmake-3.14.3-Linux-x86_64.sh2019-04-22 10:39 35M 
[   ]cmake-3.14.3-Linux-x86_64.tar.gz2019-04-22 10:39 35M 
[TXT]cmake-3.14.3-SHA-256.txt2019-04-22 10:39 1.0K 
[TXT]cmake-3.14.3-SHA-256.txt.asc2019-04-22 10:39 833  
[   ]cmake-3.14.3-win32-x86.msi2019-04-22 10:39 20M 
[   ]cmake-3.14.3-win32-x86.zip2019-04-22 10:39 26M 
[   ]cmake-3.14.3-win64-x64.msi2019-04-22 10:39 22M 
[   ]cmake-3.14.3-win64-x64.zip2019-04-22 10:39 30M 
[   ]cmake-3.14.3.tar.Z2019-04-22 10:39 14M 
[   ]cmake-3.14.3.tar.gz2019-04-22 10:39 8.4M 
[   ]cmake-3.14.3.zip2019-04-22 10:39 14M 
[   ]cmake-3.14.4-Darwin-x86_64.dmg2019-05-14 14:00 33M 
[   ]cmake-3.14.4-Darwin-x86_64.tar.gz2019-05-14 14:00 32M 
[TXT]cmake-3.14.4-Linux-x86_64.sh2019-05-14 14:00 35M 
[   ]cmake-3.14.4-Linux-x86_64.tar.gz2019-05-14 13:59 35M 
[TXT]cmake-3.14.4-SHA-256.txt2019-05-14 13:59 1.0K 
[TXT]cmake-3.14.4-SHA-256.txt.asc2019-05-14 13:59 833  
[   ]cmake-3.14.4-win32-x86.msi2019-05-14 13:59 20M 
[   ]cmake-3.14.4-win32-x86.zip2019-05-14 13:59 26M 
[   ]cmake-3.14.4-win64-x64.msi2019-05-14 13:59 22M 
[   ]cmake-3.14.4-win64-x64.zip2019-05-14 13:59 30M 
[   ]cmake-3.14.4.tar.Z2019-05-14 13:59 14M 
[   ]cmake-3.14.4.tar.gz2019-05-14 13:59 8.4M 
[   ]cmake-3.14.4.zip2019-05-14 13:59 14M 
[   ]cmake-3.14.5-Darwin-x86_64.dmg2019-05-31 12:39 33M 
[   ]cmake-3.14.5-Darwin-x86_64.tar.gz2019-05-31 12:39 32M 
[TXT]cmake-3.14.5-Linux-x86_64.sh2019-05-31 12:39 35M 
[   ]cmake-3.14.5-Linux-x86_64.tar.gz2019-05-31 12:39 35M 
[TXT]cmake-3.14.5-SHA-256.txt2019-05-31 12:39 1.0K 
[TXT]cmake-3.14.5-SHA-256.txt.asc2019-05-31 12:39 833  
[   ]cmake-3.14.5-win32-x86.msi2019-05-31 12:39 20M 
[   ]cmake-3.14.5-win32-x86.zip2019-05-31 12:39 26M 
[   ]cmake-3.14.5-win64-x64.msi2019-05-31 12:39 22M 
[   ]cmake-3.14.5-win64-x64.zip2019-05-31 12:39 30M 
[   ]cmake-3.14.5.tar.Z2019-05-31 12:39 14M 
[   ]cmake-3.14.5.tar.gz2019-05-31 12:39 8.4M 
[   ]cmake-3.14.5.zip2019-05-31 12:40 14M 
[   ]cmake-3.14.6-Darwin-x86_64.dmg2019-07-16 09:33 33M 
[   ]cmake-3.14.6-Darwin-x86_64.tar.gz2019-07-16 09:33 32M 
[TXT]cmake-3.14.6-Linux-x86_64.sh2019-07-16 09:33 35M 
[   ]cmake-3.14.6-Linux-x86_64.tar.gz2019-07-16 09:33 35M 
[TXT]cmake-3.14.6-SHA-256.txt2019-07-16 09:33 1.0K 
[TXT]cmake-3.14.6-SHA-256.txt.asc2019-07-16 09:33 833  
[   ]cmake-3.14.6-win32-x86.msi2019-07-16 09:34 20M 
[   ]cmake-3.14.6-win32-x86.zip2019-07-16 09:34 26M 
[   ]cmake-3.14.6-win64-x64.msi2019-07-16 09:34 22M 
[   ]cmake-3.14.6-win64-x64.zip2019-07-16 09:34 30M 
[   ]cmake-3.14.6.tar.Z2019-07-16 09:34 14M 
[   ]cmake-3.14.6.tar.gz2019-07-16 09:34 8.5M 
[   ]cmake-3.14.6.zip2019-07-16 09:34 14M 
[   ]cmake-3.14.7-Darwin-x86_64.dmg2019-10-02 10:48 33M 
[   ]cmake-3.14.7-Darwin-x86_64.tar.gz2019-10-02 10:48 32M 
[TXT]cmake-3.14.7-Linux-x86_64.sh2019-10-02 10:48 35M 
[   ]cmake-3.14.7-Linux-x86_64.tar.gz2019-10-02 10:48 35M 
[TXT]cmake-3.14.7-SHA-256.txt2019-10-02 10:48 1.0K 
[TXT]cmake-3.14.7-SHA-256.txt.asc2019-10-02 10:48 833  
[   ]cmake-3.14.7-win32-x86.msi2019-10-02 10:48 20M 
[   ]cmake-3.14.7-win32-x86.zip2019-10-02 10:48 26M 
[   ]cmake-3.14.7-win64-x64.msi2019-10-02 10:48 21M 
[   ]cmake-3.14.7-win64-x64.zip2019-10-02 10:48 29M 
[   ]cmake-3.14.7.tar.Z2019-10-02 10:48 14M 
[   ]cmake-3.14.7.tar.gz2019-10-02 10:48 8.5M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.15.0-Darwin-x86_64.dmg2019-07-17 10:38 33M 
[   ]cmake-3.15.0-Darwin-x86_64.tar.gz2019-07-17 10:38 33M 
[TXT]cmake-3.15.0-Linux-x86_64.sh2019-07-17 10:38 37M 
[   ]cmake-3.15.0-Linux-x86_64.tar.gz2019-07-17 10:38 37M 
[TXT]cmake-3.15.0-SHA-256.txt2019-07-17 10:38 1.0K 
[TXT]cmake-3.15.0-SHA-256.txt.asc2019-07-17 10:38 833  
[   ]cmake-3.15.0-rc1-Darwin-x86_64.dmg2019-06-04 14:22 33M 
[   ]cmake-3.15.0-rc1-Darwin-x86_64.tar.gz2019-06-04 14:22 33M 
[TXT]cmake-3.15.0-rc1-Linux-x86_64.sh2019-06-04 14:22 37M 
[   ]cmake-3.15.0-rc1-Linux-x86_64.tar.gz2019-06-04 14:22 37M 
[TXT]cmake-3.15.0-rc1-SHA-256.txt2019-06-04 14:22 1.0K 
[TXT]cmake-3.15.0-rc1-SHA-256.txt.asc2019-06-04 14:22 833  
[   ]cmake-3.15.0-rc1-win32-x86.msi2019-06-04 14:23 20M 
[   ]cmake-3.15.0-rc1-win32-x86.zip2019-06-04 14:23 28M 
[   ]cmake-3.15.0-rc1-win64-x64.msi2019-06-04 14:23 23M 
[   ]cmake-3.15.0-rc1-win64-x64.zip2019-06-04 14:23 31M 
[   ]cmake-3.15.0-rc1.tar.Z2019-06-04 14:23 14M 
[   ]cmake-3.15.0-rc1.tar.gz2019-06-04 14:22 8.8M 
[   ]cmake-3.15.0-rc1.zip2019-06-04 14:23 15M 
[   ]cmake-3.15.0-rc2-Darwin-x86_64.dmg2019-06-19 10:04 33M 
[   ]cmake-3.15.0-rc2-Darwin-x86_64.tar.gz2019-06-19 10:04 33M 
[TXT]cmake-3.15.0-rc2-Linux-x86_64.sh2019-06-19 10:04 37M 
[   ]cmake-3.15.0-rc2-Linux-x86_64.tar.gz2019-06-19 10:04 37M 
[TXT]cmake-3.15.0-rc2-SHA-256.txt2019-06-19 10:04 1.0K 
[TXT]cmake-3.15.0-rc2-SHA-256.txt.asc2019-06-19 10:04 833  
[   ]cmake-3.15.0-rc2-win32-x86.msi2019-06-19 10:04 20M 
[   ]cmake-3.15.0-rc2-win32-x86.zip2019-06-19 10:04 28M 
[   ]cmake-3.15.0-rc2-win64-x64.msi2019-06-19 10:04 23M 
[   ]cmake-3.15.0-rc2-win64-x64.zip2019-06-19 10:04 31M 
[   ]cmake-3.15.0-rc2.tar.Z2019-06-19 10:04 14M 
[   ]cmake-3.15.0-rc2.tar.gz2019-06-19 10:04 8.8M 
[   ]cmake-3.15.0-rc2.zip2019-06-19 10:04 15M 
[   ]cmake-3.15.0-rc3-Darwin-x86_64.dmg2019-06-27 11:33 33M 
[   ]cmake-3.15.0-rc3-Darwin-x86_64.tar.gz2019-06-27 11:33 33M 
[TXT]cmake-3.15.0-rc3-Linux-x86_64.sh2019-06-27 11:33 37M 
[   ]cmake-3.15.0-rc3-Linux-x86_64.tar.gz2019-06-27 11:33 37M 
[TXT]cmake-3.15.0-rc3-SHA-256.txt2019-06-27 11:33 1.0K 
[TXT]cmake-3.15.0-rc3-SHA-256.txt.asc2019-06-27 11:33 833  
[   ]cmake-3.15.0-rc3-win32-x86.msi2019-06-27 11:33 20M 
[   ]cmake-3.15.0-rc3-win32-x86.zip2019-06-27 11:33 28M 
[   ]cmake-3.15.0-rc3-win64-x64.msi2019-06-27 11:33 23M 
[   ]cmake-3.15.0-rc3-win64-x64.zip2019-06-27 11:33 31M 
[   ]cmake-3.15.0-rc3.tar.Z2019-06-27 11:33 14M 
[   ]cmake-3.15.0-rc3.tar.gz2019-06-27 11:33 8.8M 
[   ]cmake-3.15.0-rc3.zip2019-06-27 11:33 15M 
[   ]cmake-3.15.0-rc4-Darwin-x86_64.dmg2019-07-10 15:06 33M 
[   ]cmake-3.15.0-rc4-Darwin-x86_64.tar.gz2019-07-10 15:07 33M 
[TXT]cmake-3.15.0-rc4-Linux-x86_64.sh2019-07-10 15:07 37M 
[   ]cmake-3.15.0-rc4-Linux-x86_64.tar.gz2019-07-10 15:07 37M 
[TXT]cmake-3.15.0-rc4-SHA-256.txt2019-07-10 15:07 1.0K 
[TXT]cmake-3.15.0-rc4-SHA-256.txt.asc2019-07-10 15:07 833  
[   ]cmake-3.15.0-rc4-win32-x86.msi2019-07-10 15:07 20M 
[   ]cmake-3.15.0-rc4-win32-x86.zip2019-07-10 15:07 28M 
[   ]cmake-3.15.0-rc4-win64-x64.msi2019-07-10 15:07 23M 
[   ]cmake-3.15.0-rc4-win64-x64.zip2019-07-10 15:07 31M 
[   ]cmake-3.15.0-rc4.tar.Z2019-07-10 15:07 14M 
[   ]cmake-3.15.0-rc4.tar.gz2019-07-10 15:07 8.8M 
[   ]cmake-3.15.0-rc4.zip2019-07-10 15:07 15M 
[   ]cmake-3.15.0-win32-x86.msi2019-07-17 10:38 20M 
[   ]cmake-3.15.0-win32-x86.zip2019-07-17 10:38 27M 
[   ]cmake-3.15.0-win64-x64.msi2019-07-17 10:38 23M 
[   ]cmake-3.15.0-win64-x64.zip2019-07-17 10:38 31M 
[   ]cmake-3.15.0.tar.Z2019-07-17 10:38 14M 
[   ]cmake-3.15.0.tar.gz2019-07-17 10:38 8.8M 
[   ]cmake-3.15.0.zip2019-07-17 10:38 15M 
[   ]cmake-3.15.1-Darwin-x86_64.dmg2019-07-26 10:14 33M 
[   ]cmake-3.15.1-Darwin-x86_64.tar.gz2019-07-26 10:14 33M 
[TXT]cmake-3.15.1-Linux-x86_64.sh2019-07-26 10:14 37M 
[   ]cmake-3.15.1-Linux-x86_64.tar.gz2019-07-26 10:14 37M 
[TXT]cmake-3.15.1-SHA-256.txt2019-07-26 10:14 1.0K 
[TXT]cmake-3.15.1-SHA-256.txt.asc2019-07-26 10:14 833  
[   ]cmake-3.15.1-win32-x86.msi2019-07-26 10:14 20M 
[   ]cmake-3.15.1-win32-x86.zip2019-07-26 10:14 27M 
[   ]cmake-3.15.1-win64-x64.msi2019-07-26 10:14 23M 
[   ]cmake-3.15.1-win64-x64.zip2019-07-26 10:14 31M 
[   ]cmake-3.15.1.tar.Z2019-07-26 10:14 14M 
[   ]cmake-3.15.1.tar.gz2019-07-26 10:14 8.8M 
[   ]cmake-3.15.1.zip2019-07-26 10:15 15M 
[   ]cmake-3.15.2-Darwin-x86_64.dmg2019-08-07 15:05 33M 
[   ]cmake-3.15.2-Darwin-x86_64.tar.gz2019-08-07 15:05 33M 
[TXT]cmake-3.15.2-Linux-x86_64.sh2019-08-07 15:05 37M 
[   ]cmake-3.15.2-Linux-x86_64.tar.gz2019-08-07 15:05 37M 
[TXT]cmake-3.15.2-SHA-256.txt2019-08-07 15:05 1.0K 
[TXT]cmake-3.15.2-SHA-256.txt.asc2019-08-07 15:05 833  
[   ]cmake-3.15.2-win32-x86.msi2019-08-07 15:05 20M 
[   ]cmake-3.15.2-win32-x86.zip2019-08-07 15:05 27M 
[   ]cmake-3.15.2-win64-x64.msi2019-08-07 15:05 23M 
[   ]cmake-3.15.2-win64-x64.zip2019-08-07 15:05 31M 
[   ]cmake-3.15.2.tar.Z2019-08-07 15:05 14M 
[   ]cmake-3.15.2.tar.gz2019-08-07 15:05 8.8M 
[   ]cmake-3.15.2.zip2019-08-07 15:05 15M 
[   ]cmake-3.15.3-Darwin-x86_64.dmg2019-09-04 11:13 33M 
[   ]cmake-3.15.3-Darwin-x86_64.tar.gz2019-09-04 11:13 33M 
[TXT]cmake-3.15.3-Linux-x86_64.sh2019-09-04 11:13 37M 
[   ]cmake-3.15.3-Linux-x86_64.tar.gz2019-09-04 11:13 37M 
[TXT]cmake-3.15.3-SHA-256.txt2019-09-04 11:13 1.0K 
[TXT]cmake-3.15.3-SHA-256.txt.asc2019-09-04 11:13 833  
[   ]cmake-3.15.3-win32-x86.msi2019-09-04 11:13 20M 
[   ]cmake-3.15.3-win32-x86.zip2019-09-04 11:13 27M 
[   ]cmake-3.15.3-win64-x64.msi2019-09-04 11:13 23M 
[   ]cmake-3.15.3-win64-x64.zip2019-09-04 11:13 31M 
[   ]cmake-3.15.3.tar.Z2019-09-04 11:13 14M 
[   ]cmake-3.15.3.tar.gz2019-09-04 11:13 8.8M 
[   ]cmake-3.15.3.zip2019-09-04 11:13 15M 
[   ]cmake-3.15.4-Darwin-x86_64.dmg2019-10-02 10:45 33M 
[   ]cmake-3.15.4-Darwin-x86_64.tar.gz2019-10-02 10:45 33M 
[TXT]cmake-3.15.4-Linux-x86_64.sh2019-10-02 10:45 37M 
[   ]cmake-3.15.4-Linux-x86_64.tar.gz2019-10-02 10:45 37M 
[TXT]cmake-3.15.4-SHA-256.txt2019-10-02 10:45 1.0K 
[TXT]cmake-3.15.4-SHA-256.txt.asc2019-10-02 10:45 833  
[   ]cmake-3.15.4-win32-x86.msi2019-10-02 10:45 20M 
[   ]cmake-3.15.4-win32-x86.zip2019-10-02 10:45 27M 
[   ]cmake-3.15.4-win64-x64.msi2019-10-02 10:45 22M 
[   ]cmake-3.15.4-win64-x64.zip2019-10-02 10:45 30M 
[   ]cmake-3.15.4.tar.Z2019-10-02 10:45 14M 
[   ]cmake-3.15.4.tar.gz2019-10-02 10:45 8.8M 
[   ]cmake-3.15.4.zip2019-10-02 10:45 15M 
[   ]cmake-3.15.5-Darwin-x86_64.dmg2019-10-30 10:49 33M 
[   ]cmake-3.15.5-Darwin-x86_64.tar.gz2019-10-30 10:49 33M 
[TXT]cmake-3.15.5-Linux-x86_64.sh2019-10-30 10:49 37M 
[   ]cmake-3.15.5-Linux-x86_64.tar.gz2019-10-30 10:49 37M 
[TXT]cmake-3.15.5-SHA-256.txt2019-10-30 10:49 1.0K 
[TXT]cmake-3.15.5-SHA-256.txt.asc2019-10-30 10:49 833  
[   ]cmake-3.15.5-win32-x86.msi2019-10-30 10:49 20M 
[   ]cmake-3.15.5-win32-x86.zip2019-10-30 10:49 27M 
[   ]cmake-3.15.5-win64-x64.msi2019-10-30 10:49 22M 
[   ]cmake-3.15.5-win64-x64.zip2019-10-30 10:49 30M 
[   ]cmake-3.15.5.tar.Z2019-10-30 10:49 14M 
[   ]cmake-3.15.5.tar.gz2019-10-30 10:49 8.8M 
[   ]cmake-3.15.5.zip2019-10-30 10:49 15M 
[   ]cmake-3.15.6-Darwin-x86_64.dmg2019-12-16 11:30 34M 
[   ]cmake-3.15.6-Darwin-x86_64.tar.gz2019-12-16 11:30 33M 
[TXT]cmake-3.15.6-Linux-x86_64.sh2019-12-16 11:30 37M 
[   ]cmake-3.15.6-Linux-x86_64.tar.gz2019-12-16 11:30 37M 
[TXT]cmake-3.15.6-SHA-256.txt2019-12-16 11:30 1.0K 
[TXT]cmake-3.15.6-SHA-256.txt.asc2019-12-16 11:30 833  
[   ]cmake-3.15.6-win32-x86.msi2019-12-16 11:30 21M 
[   ]cmake-3.15.6-win32-x86.zip2019-12-16 11:30 28M 
[   ]cmake-3.15.6-win64-x64.msi2019-12-16 11:30 22M 
[   ]cmake-3.15.6-win64-x64.zip2019-12-16 11:30 30M 
[   ]cmake-3.15.6.tar.Z2019-12-16 11:30 14M 
[   ]cmake-3.15.6.tar.gz2019-12-16 11:30 8.8M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.16.0-Darwin-x86_64.dmg2019-11-26 10:27 35M 
[   ]cmake-3.16.0-Darwin-x86_64.tar.gz2019-11-26 10:27 34M 
[TXT]cmake-3.16.0-Linux-x86_64.sh2019-11-26 10:27 38M 
[   ]cmake-3.16.0-Linux-x86_64.tar.gz2019-11-26 10:27 38M 
[TXT]cmake-3.16.0-SHA-256.txt2019-11-26 10:27 932  
[TXT]cmake-3.16.0-SHA-256.txt.asc2019-11-26 10:27 833  
[   ]cmake-3.16.0-rc1-Darwin-x86_64.dmg2019-10-10 14:18 34M 
[   ]cmake-3.16.0-rc1-Darwin-x86_64.tar.gz2019-10-10 14:18 34M 
[TXT]cmake-3.16.0-rc1-Linux-x86_64.sh2019-10-10 14:18 38M 
[   ]cmake-3.16.0-rc1-Linux-x86_64.tar.gz2019-10-10 14:18 38M 
[TXT]cmake-3.16.0-rc1-SHA-256.txt2019-10-10 14:18 972  
[TXT]cmake-3.16.0-rc1-SHA-256.txt.asc2019-10-10 14:18 833  
[   ]cmake-3.16.0-rc1-win32-x86.msi2019-10-10 14:18 21M 
[   ]cmake-3.16.0-rc1-win32-x86.zip2019-10-10 14:18 28M 
[   ]cmake-3.16.0-rc1-win64-x64.msi2019-10-10 14:18 23M 
[   ]cmake-3.16.0-rc1-win64-x64.zip2019-10-10 14:18 31M 
[   ]cmake-3.16.0-rc1.tar.gz2019-10-10 14:18 8.7M 
[   ]cmake-3.16.0-rc1.zip2019-10-10 14:18 14M 
[   ]cmake-3.16.0-rc2-Darwin-x86_64.dmg2019-10-18 10:47 34M 
[   ]cmake-3.16.0-rc2-Darwin-x86_64.tar.gz2019-10-18 10:47 34M 
[TXT]cmake-3.16.0-rc2-Linux-x86_64.sh2019-10-18 10:47 38M 
[   ]cmake-3.16.0-rc2-Linux-x86_64.tar.gz2019-10-18 10:47 38M 
[TXT]cmake-3.16.0-rc2-SHA-256.txt2019-10-18 10:47 972  
[TXT]cmake-3.16.0-rc2-SHA-256.txt.asc2019-10-18 10:47 833  
[   ]cmake-3.16.0-rc2-win32-x86.msi2019-10-18 10:47 21M 
[   ]cmake-3.16.0-rc2-win32-x86.zip2019-10-18 10:47 28M 
[   ]cmake-3.16.0-rc2-win64-x64.msi2019-10-18 10:47 23M 
[   ]cmake-3.16.0-rc2-win64-x64.zip2019-10-18 10:47 31M 
[   ]cmake-3.16.0-rc2.tar.gz2019-10-18 10:47 8.7M 
[   ]cmake-3.16.0-rc2.zip2019-10-18 10:47 14M 
[   ]cmake-3.16.0-rc3-Darwin-x86_64.dmg2019-10-31 12:09 34M 
[   ]cmake-3.16.0-rc3-Darwin-x86_64.tar.gz2019-10-31 12:09 34M 
[TXT]cmake-3.16.0-rc3-Linux-x86_64.sh2019-10-31 12:09 38M 
[   ]cmake-3.16.0-rc3-Linux-x86_64.tar.gz2019-10-31 12:10 38M 
[TXT]cmake-3.16.0-rc3-SHA-256.txt2019-10-31 12:10 972  
[TXT]cmake-3.16.0-rc3-SHA-256.txt.asc2019-10-31 12:10 833  
[   ]cmake-3.16.0-rc3-win32-x86.msi2019-10-31 12:10 21M 
[   ]cmake-3.16.0-rc3-win32-x86.zip2019-10-31 12:10 28M 
[   ]cmake-3.16.0-rc3-win64-x64.msi2019-10-31 12:10 23M 
[   ]cmake-3.16.0-rc3-win64-x64.zip2019-10-31 12:10 31M 
[   ]cmake-3.16.0-rc3.tar.gz2019-10-31 12:10 8.7M 
[   ]cmake-3.16.0-rc3.zip2019-10-31 12:10 14M 
[   ]cmake-3.16.0-rc4-Darwin-x86_64.dmg2019-11-18 17:01 35M 
[   ]cmake-3.16.0-rc4-Darwin-x86_64.tar.gz2019-11-18 17:01 34M 
[TXT]cmake-3.16.0-rc4-Linux-x86_64.sh2019-11-18 17:01 38M 
[   ]cmake-3.16.0-rc4-Linux-x86_64.tar.gz2019-11-18 17:01 38M 
[TXT]cmake-3.16.0-rc4-SHA-256.txt2019-11-18 17:01 972  
[TXT]cmake-3.16.0-rc4-SHA-256.txt.asc2019-11-18 17:01 833  
[   ]cmake-3.16.0-rc4-win32-x86.msi2019-11-18 17:01 21M 
[   ]cmake-3.16.0-rc4-win32-x86.zip2019-11-18 17:01 28M 
[   ]cmake-3.16.0-rc4-win64-x64.msi2019-11-18 17:01 23M 
[   ]cmake-3.16.0-rc4-win64-x64.zip2019-11-18 17:01 31M 
[   ]cmake-3.16.0-rc4.tar.gz2019-11-18 17:01 8.7M 
[   ]cmake-3.16.0-rc4.zip2019-11-18 17:01 14M 
[   ]cmake-3.16.0-win32-x86.msi2019-11-26 10:27 21M 
[   ]cmake-3.16.0-win32-x86.zip2019-11-26 10:27 28M 
[   ]cmake-3.16.0-win64-x64.msi2019-11-26 10:27 23M 
[   ]cmake-3.16.0-win64-x64.zip2019-11-26 10:27 31M 
[   ]cmake-3.16.0.tar.gz2019-11-26 10:27 8.7M 
[   ]cmake-3.16.0.zip2019-11-26 10:27 14M 
[   ]cmake-3.16.1-Darwin-x86_64.dmg2019-12-10 10:42 35M 
[   ]cmake-3.16.1-Darwin-x86_64.tar.gz2019-12-10 10:42 34M 
[TXT]cmake-3.16.1-Linux-x86_64.sh2019-12-10 10:42 38M 
[   ]cmake-3.16.1-Linux-x86_64.tar.gz2019-12-10 10:42 38M 
[TXT]cmake-3.16.1-SHA-256.txt2019-12-10 10:42 932  
[TXT]cmake-3.16.1-SHA-256.txt.asc2019-12-10 10:42 833  
[   ]cmake-3.16.1-win32-x86.msi2019-12-10 10:42 21M 
[   ]cmake-3.16.1-win32-x86.zip2019-12-10 10:42 28M 
[   ]cmake-3.16.1-win64-x64.msi2019-12-10 10:42 23M 
[   ]cmake-3.16.1-win64-x64.zip2019-12-10 10:42 31M 
[   ]cmake-3.16.1.tar.gz2019-12-10 10:42 8.7M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.2.0-1-src.tar.bz22015-03-10 09:02 4.9M 
[   ]cmake-3.2.0-1.tar.bz22015-03-10 09:02 9.4M 
[   ]cmake-3.2.0-Darwin-universal.dmg2015-03-10 09:02 47M 
[   ]cmake-3.2.0-Darwin-universal.tar.Z2015-03-10 09:02 66M 
[   ]cmake-3.2.0-Darwin-universal.tar.gz2015-03-10 09:01 46M 
[   ]cmake-3.2.0-Darwin-x86_64.dmg2015-03-10 09:01 27M 
[   ]cmake-3.2.0-Darwin-x86_64.tar.Z2015-03-10 09:01 38M 
[   ]cmake-3.2.0-Darwin-x86_64.tar.gz2015-03-10 09:01 26M 
[TXT]cmake-3.2.0-Linux-i386.sh2015-03-10 09:01 25M 
[   ]cmake-3.2.0-Linux-i386.tar.Z2015-03-10 09:01 36M 
[   ]cmake-3.2.0-Linux-i386.tar.gz2015-03-10 09:01 25M 
[TXT]cmake-3.2.0-Linux-x86_64.sh2015-03-10 09:01 26M 
[   ]cmake-3.2.0-Linux-x86_64.tar.Z2015-03-10 09:01 36M 
[   ]cmake-3.2.0-Linux-x86_64.tar.gz2015-03-10 09:01 26M 
[TXT]cmake-3.2.0-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.2.0-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.2.0-rc1-Darwin-universal.dmg2015-02-13 15:03 47M 
[   ]cmake-3.2.0-rc1-Darwin-universal.tar.Z2015-02-13 15:03 66M 
[   ]cmake-3.2.0-rc1-Darwin-universal.tar.gz2015-02-13 15:03 46M 
[   ]cmake-3.2.0-rc1-Darwin-x86_64.dmg2015-02-13 15:03 30M 
[   ]cmake-3.2.0-rc1-Darwin-x86_64.tar.Z2015-02-13 15:03 42M 
[   ]cmake-3.2.0-rc1-Darwin-x86_64.tar.gz2015-02-13 15:03 29M 
[TXT]cmake-3.2.0-rc1-Linux-i386.sh2015-02-13 15:03 25M 
[   ]cmake-3.2.0-rc1-Linux-i386.tar.Z2015-02-13 15:03 36M 
[   ]cmake-3.2.0-rc1-Linux-i386.tar.gz2015-02-13 15:03 25M 
[TXT]cmake-3.2.0-rc1-Linux-x86_64.sh2015-02-13 15:03 26M 
[   ]cmake-3.2.0-rc1-Linux-x86_64.tar.Z2015-02-13 15:03 36M 
[   ]cmake-3.2.0-rc1-Linux-x86_64.tar.gz2015-02-13 15:02 26M 
[TXT]cmake-3.2.0-rc1-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.2.0-rc1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.2.0-rc1-win32-x86.exe2015-02-13 15:02 12M 
[   ]cmake-3.2.0-rc1-win32-x86.zip2015-02-13 15:02 16M 
[   ]cmake-3.2.0-rc1.tar.Z2015-02-13 15:02 9.9M 
[   ]cmake-3.2.0-rc1.tar.gz2015-02-13 15:02 6.1M 
[   ]cmake-3.2.0-rc1.zip2015-02-13 15:02 9.8M 
[   ]cmake-3.2.0-rc2-Darwin-universal.dmg2015-02-24 08:51 47M 
[   ]cmake-3.2.0-rc2-Darwin-universal.tar.Z2015-02-24 08:51 66M 
[   ]cmake-3.2.0-rc2-Darwin-universal.tar.gz2015-02-24 08:51 46M 
[   ]cmake-3.2.0-rc2-Darwin-x86_64.dmg2015-02-24 08:51 27M 
[   ]cmake-3.2.0-rc2-Darwin-x86_64.tar.Z2015-02-24 08:51 38M 
[   ]cmake-3.2.0-rc2-Darwin-x86_64.tar.gz2015-02-24 08:51 26M 
[TXT]cmake-3.2.0-rc2-Linux-i386.sh2015-02-24 08:50 25M 
[   ]cmake-3.2.0-rc2-Linux-i386.tar.Z2015-02-24 08:50 36M 
[   ]cmake-3.2.0-rc2-Linux-i386.tar.gz2015-02-24 08:50 25M 
[TXT]cmake-3.2.0-rc2-Linux-x86_64.sh2015-02-24 08:50 26M 
[   ]cmake-3.2.0-rc2-Linux-x86_64.tar.Z2015-02-24 08:50 36M 
[   ]cmake-3.2.0-rc2-Linux-x86_64.tar.gz2015-02-24 08:50 26M 
[TXT]cmake-3.2.0-rc2-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.2.0-rc2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.2.0-rc2-win32-x86.exe2015-02-24 08:50 11M 
[   ]cmake-3.2.0-rc2-win32-x86.zip2015-02-24 08:50 15M 
[   ]cmake-3.2.0-rc2.tar.Z2015-02-24 08:50 10M 
[   ]cmake-3.2.0-rc2.tar.gz2015-02-24 08:50 6.1M 
[   ]cmake-3.2.0-rc2.zip2015-02-24 08:50 9.8M 
[   ]cmake-3.2.0-win32-x86.exe2015-03-10 09:01 11M 
[   ]cmake-3.2.0-win32-x86.zip2015-03-10 09:01 15M 
[   ]cmake-3.2.0.tar.Z2015-03-10 09:01 9.9M 
[   ]cmake-3.2.0.tar.gz2015-03-10 09:01 6.1M 
[   ]cmake-3.2.0.zip2015-03-10 09:01 9.7M 
[   ]cmake-3.2.1-1-src.tar.bz22015-03-11 09:10 4.9M 
[   ]cmake-3.2.1-1.tar.bz22015-03-11 09:10 9.5M 
[   ]cmake-3.2.1-Darwin-universal.dmg2015-03-11 09:10 47M 
[   ]cmake-3.2.1-Darwin-universal.tar.Z2015-03-11 09:10 66M 
[   ]cmake-3.2.1-Darwin-universal.tar.gz2015-03-11 09:10 46M 
[   ]cmake-3.2.1-Darwin-x86_64.dmg2015-03-11 09:10 27M 
[   ]cmake-3.2.1-Darwin-x86_64.tar.Z2015-03-11 09:10 38M 
[   ]cmake-3.2.1-Darwin-x86_64.tar.gz2015-03-11 09:10 26M 
[TXT]cmake-3.2.1-Linux-i386.sh2015-03-11 09:10 25M 
[   ]cmake-3.2.1-Linux-i386.tar.Z2015-03-11 09:09 36M 
[   ]cmake-3.2.1-Linux-i386.tar.gz2015-03-11 09:09 25M 
[TXT]cmake-3.2.1-Linux-x86_64.sh2015-03-11 09:09 26M 
[   ]cmake-3.2.1-Linux-x86_64.tar.Z2015-03-11 09:09 36M 
[   ]cmake-3.2.1-Linux-x86_64.tar.gz2015-03-11 09:09 26M 
[TXT]cmake-3.2.1-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.2.1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.2.1-win32-x86.exe2015-03-11 09:09 11M 
[   ]cmake-3.2.1-win32-x86.zip2015-03-11 09:09 15M 
[   ]cmake-3.2.1.tar.Z2015-03-11 09:09 10M 
[   ]cmake-3.2.1.tar.gz2015-03-11 09:09 6.1M 
[   ]cmake-3.2.1.zip2015-03-11 09:09 9.7M 
[   ]cmake-3.2.2-Darwin-universal.dmg2015-04-14 13:45 47M 
[   ]cmake-3.2.2-Darwin-universal.tar.Z2015-04-14 13:45 66M 
[   ]cmake-3.2.2-Darwin-universal.tar.gz2015-04-14 13:45 46M 
[   ]cmake-3.2.2-Darwin-x86_64.dmg2015-04-14 13:45 27M 
[   ]cmake-3.2.2-Darwin-x86_64.tar.Z2015-04-14 13:45 38M 
[   ]cmake-3.2.2-Darwin-x86_64.tar.gz2015-04-14 13:45 26M 
[TXT]cmake-3.2.2-Linux-i386.sh2015-04-14 13:44 25M 
[   ]cmake-3.2.2-Linux-i386.tar.Z2015-04-14 13:44 36M 
[   ]cmake-3.2.2-Linux-i386.tar.gz2015-04-14 13:44 25M 
[TXT]cmake-3.2.2-Linux-x86_64.sh2015-04-14 13:44 26M 
[   ]cmake-3.2.2-Linux-x86_64.tar.Z2015-04-14 13:44 36M 
[   ]cmake-3.2.2-Linux-x86_64.tar.gz2015-04-14 13:44 26M 
[TXT]cmake-3.2.2-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.2.2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.2.2-win32-x86.exe2015-04-14 13:44 11M 
[   ]cmake-3.2.2-win32-x86.zip2015-04-14 13:44 15M 
[   ]cmake-3.2.2.tar.Z2015-04-14 13:44 9.9M 
[   ]cmake-3.2.2.tar.gz2015-04-14 13:44 6.1M 
[   ]cmake-3.2.2.zip2015-04-14 13:44 9.7M 
[   ]cmake-3.2.3-Darwin-universal.dmg2015-06-01 17:04 47M 
[   ]cmake-3.2.3-Darwin-universal.tar.Z2015-06-01 17:04 66M 
[   ]cmake-3.2.3-Darwin-universal.tar.gz2015-06-01 17:04 46M 
[   ]cmake-3.2.3-Darwin-x86_64.dmg2015-06-01 17:04 27M 
[   ]cmake-3.2.3-Darwin-x86_64.tar.Z2015-06-01 17:04 38M 
[   ]cmake-3.2.3-Darwin-x86_64.tar.gz2015-06-01 17:04 26M 
[TXT]cmake-3.2.3-Linux-i386.sh2015-06-01 17:04 25M 
[   ]cmake-3.2.3-Linux-i386.tar.Z2015-06-01 17:03 36M 
[   ]cmake-3.2.3-Linux-i386.tar.gz2015-06-01 17:03 25M 
[TXT]cmake-3.2.3-Linux-x86_64.sh2015-06-01 17:03 26M 
[   ]cmake-3.2.3-Linux-x86_64.tar.Z2015-06-01 17:03 36M 
[   ]cmake-3.2.3-Linux-x86_64.tar.gz2015-06-01 17:03 26M 
[TXT]cmake-3.2.3-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.2.3-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.2.3-win32-x86.exe2015-06-01 17:03 11M 
[   ]cmake-3.2.3-win32-x86.zip2015-06-01 17:03 15M 
[   ]cmake-3.2.3.tar.Z2015-06-01 17:03 9.9M 
[   ]cmake-3.2.3.tar.gz2015-06-01 17:03 6.1M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.3.0-1-src.tar.bz22015-07-23 16:39 5.0M 
[   ]cmake-3.3.0-1.tar.bz22015-07-23 16:39 9.8M 
[   ]cmake-3.3.0-Darwin-universal.dmg2015-07-23 16:39 48M 
[   ]cmake-3.3.0-Darwin-universal.tar.Z2015-07-23 16:39 68M 
[   ]cmake-3.3.0-Darwin-universal.tar.gz2015-07-23 16:39 47M 
[   ]cmake-3.3.0-Darwin-x86_64.dmg2015-07-23 16:39 22M 
[   ]cmake-3.3.0-Darwin-x86_64.tar.Z2015-07-23 16:39 31M 
[   ]cmake-3.3.0-Darwin-x86_64.tar.gz2015-07-23 16:38 21M 
[TXT]cmake-3.3.0-Linux-i386.sh2015-07-23 16:38 26M 
[   ]cmake-3.3.0-Linux-i386.tar.Z2015-07-23 16:38 37M 
[   ]cmake-3.3.0-Linux-i386.tar.gz2015-07-23 16:38 26M 
[TXT]cmake-3.3.0-Linux-x86_64.sh2015-07-23 16:38 27M 
[   ]cmake-3.3.0-Linux-x86_64.tar.Z2015-07-23 16:38 37M 
[   ]cmake-3.3.0-Linux-x86_64.tar.gz2015-07-23 16:38 27M 
[TXT]cmake-3.3.0-SHA-256.txt2015-08-13 14:42 1.6K 
[TXT]cmake-3.3.0-SHA-256.txt.asc2015-08-13 14:42 819  
[   ]cmake-3.3.0-rc1-1-src.tar.bz22015-06-05 09:01 9.8M 
[TXT]cmake-3.3.0-rc1-1.patch2015-06-05 09:01 0  
[TXT]cmake-3.3.0-rc1-1.sh2015-06-05 09:01 1.5K 
[   ]cmake-3.3.0-rc1-1.tar.bz22015-06-05 09:01 9.8M 
[   ]cmake-3.3.0-rc1-Darwin-universal.dmg2015-06-05 09:01 48M 
[   ]cmake-3.3.0-rc1-Darwin-universal.tar.Z2015-06-05 09:01 68M 
[   ]cmake-3.3.0-rc1-Darwin-universal.tar.gz2015-06-05 09:01 47M 
[   ]cmake-3.3.0-rc1-Darwin-x86_64.dmg2015-06-05 09:01 27M 
[   ]cmake-3.3.0-rc1-Darwin-x86_64.tar.Z2015-06-05 09:01 38M 
[   ]cmake-3.3.0-rc1-Darwin-x86_64.tar.gz2015-06-05 09:01 27M 
[TXT]cmake-3.3.0-rc1-Linux-i386.sh2015-06-05 09:00 26M 
[   ]cmake-3.3.0-rc1-Linux-i386.tar.Z2015-06-05 09:00 36M 
[   ]cmake-3.3.0-rc1-Linux-i386.tar.gz2015-06-05 09:00 26M 
[TXT]cmake-3.3.0-rc1-Linux-x86_64.sh2015-06-05 09:00 26M 
[   ]cmake-3.3.0-rc1-Linux-x86_64.tar.Z2015-06-05 09:00 37M 
[   ]cmake-3.3.0-rc1-Linux-x86_64.tar.gz2015-06-05 09:00 26M 
[TXT]cmake-3.3.0-rc1-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.3.0-rc1-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.3.0-rc1-win32-x86.exe2015-06-05 09:00 12M 
[   ]cmake-3.3.0-rc1-win32-x86.zip2015-06-05 09:00 16M 
[   ]cmake-3.3.0-rc1.tar.Z2015-06-05 09:00 10M 
[   ]cmake-3.3.0-rc1.tar.gz2015-06-05 09:00 6.3M 
[   ]cmake-3.3.0-rc1.zip2015-06-05 09:00 10M 
[   ]cmake-3.3.0-rc2-1-src.tar.bz22015-06-10 15:27 5.0M 
[   ]cmake-3.3.0-rc2-1.tar.bz22015-06-10 15:27 9.8M 
[   ]cmake-3.3.0-rc2-Darwin-universal.dmg2015-06-10 15:27 48M 
[   ]cmake-3.3.0-rc2-Darwin-universal.tar.Z2015-06-10 15:27 68M 
[   ]cmake-3.3.0-rc2-Darwin-universal.tar.gz2015-06-10 15:27 47M 
[   ]cmake-3.3.0-rc2-Darwin-x86_64.dmg2015-06-10 15:27 21M 
[   ]cmake-3.3.0-rc2-Darwin-x86_64.tar.Z2015-06-10 15:27 31M 
[   ]cmake-3.3.0-rc2-Darwin-x86_64.tar.gz2015-06-10 15:27 21M 
[TXT]cmake-3.3.0-rc2-Linux-i386.sh2015-06-10 15:27 26M 
[   ]cmake-3.3.0-rc2-Linux-i386.tar.Z2015-06-10 15:27 36M 
[   ]cmake-3.3.0-rc2-Linux-i386.tar.gz2015-06-10 15:27 26M 
[TXT]cmake-3.3.0-rc2-Linux-x86_64.sh2015-06-10 15:27 26M 
[   ]cmake-3.3.0-rc2-Linux-x86_64.tar.Z2015-06-10 15:27 37M 
[   ]cmake-3.3.0-rc2-Linux-x86_64.tar.gz2015-06-10 15:27 26M 
[TXT]cmake-3.3.0-rc2-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.3.0-rc2-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.3.0-rc2-win32-x86.exe2015-06-10 15:27 12M 
[   ]cmake-3.3.0-rc2-win32-x86.zip2015-06-10 15:27 16M 
[   ]cmake-3.3.0-rc2.tar.Z2015-06-10 15:27 10M 
[   ]cmake-3.3.0-rc2.tar.gz2015-06-10 15:27 6.3M 
[   ]cmake-3.3.0-rc2.zip2015-06-10 15:27 10M 
[   ]cmake-3.3.0-rc3-1-src.tar.bz22015-06-26 13:34 5.0M 
[   ]cmake-3.3.0-rc3-1.tar.bz22015-06-26 13:34 9.8M 
[   ]cmake-3.3.0-rc3-Darwin-universal.dmg2015-06-26 13:34 48M 
[   ]cmake-3.3.0-rc3-Darwin-universal.tar.Z2015-06-26 13:34 68M 
[   ]cmake-3.3.0-rc3-Darwin-universal.tar.gz2015-06-26 13:34 47M 
[   ]cmake-3.3.0-rc3-Darwin-x86_64.dmg2015-06-26 13:34 22M 
[   ]cmake-3.3.0-rc3-Darwin-x86_64.tar.Z2015-06-26 13:34 31M 
[   ]cmake-3.3.0-rc3-Darwin-x86_64.tar.gz2015-06-26 13:34 21M 
[TXT]cmake-3.3.0-rc3-Linux-i386.sh2015-06-26 13:34 26M 
[   ]cmake-3.3.0-rc3-Linux-i386.tar.Z2015-06-26 13:34 37M 
[   ]cmake-3.3.0-rc3-Linux-i386.tar.gz2015-06-26 13:34 26M 
[TXT]cmake-3.3.0-rc3-Linux-x86_64.sh2015-06-26 13:34 27M 
[   ]cmake-3.3.0-rc3-Linux-x86_64.tar.Z2015-06-26 13:34 37M 
[   ]cmake-3.3.0-rc3-Linux-x86_64.tar.gz2015-06-26 13:34 27M 
[TXT]cmake-3.3.0-rc3-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.3.0-rc3-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.3.0-rc3-win32-x86.exe2015-06-26 13:34 12M 
[   ]cmake-3.3.0-rc3-win32-x86.zip2015-06-26 13:34 16M 
[   ]cmake-3.3.0-rc3.tar.Z2015-06-26 13:34 10M 
[   ]cmake-3.3.0-rc3.tar.gz2015-06-26 13:34 6.3M 
[   ]cmake-3.3.0-rc3.zip2015-06-26 13:34 10M 
[   ]cmake-3.3.0-rc4-1-src.tar.bz22015-07-13 15:56 5.0M 
[   ]cmake-3.3.0-rc4-1.tar.bz22015-07-13 15:56 9.8M 
[   ]cmake-3.3.0-rc4-Darwin-universal.dmg2015-07-13 15:56 48M 
[   ]cmake-3.3.0-rc4-Darwin-universal.tar.Z2015-07-13 15:56 68M 
[   ]cmake-3.3.0-rc4-Darwin-universal.tar.gz2015-07-13 15:55 47M 
[   ]cmake-3.3.0-rc4-Darwin-x86_64.dmg2015-07-13 15:55 22M 
[   ]cmake-3.3.0-rc4-Darwin-x86_64.tar.Z2015-07-13 15:55 31M 
[   ]cmake-3.3.0-rc4-Darwin-x86_64.tar.gz2015-07-13 15:55 21M 
[TXT]cmake-3.3.0-rc4-Linux-i386.sh2015-07-13 15:55 26M 
[   ]cmake-3.3.0-rc4-Linux-i386.tar.Z2015-07-13 15:55 37M 
[   ]cmake-3.3.0-rc4-Linux-i386.tar.gz2015-07-13 15:55 26M 
[TXT]cmake-3.3.0-rc4-Linux-x86_64.sh2015-07-13 15:55 27M 
[   ]cmake-3.3.0-rc4-Linux-x86_64.tar.Z2015-07-13 15:55 37M 
[   ]cmake-3.3.0-rc4-Linux-x86_64.tar.gz2015-07-13 15:55 27M 
[TXT]cmake-3.3.0-rc4-SHA-256.txt2016-04-13 12:48 1.6K 
[TXT]cmake-3.3.0-rc4-SHA-256.txt.asc2016-04-13 12:48 819  
[   ]cmake-3.3.0-rc4-win32-x86.exe2015-07-13 15:55 12M 
[   ]cmake-3.3.0-rc4-win32-x86.zip2015-07-13 15:55 16M 
[   ]cmake-3.3.0-rc4.tar.Z2015-07-13 15:55 10M 
[   ]cmake-3.3.0-rc4.tar.gz2015-07-13 15:55 6.3M 
[   ]cmake-3.3.0-rc4.zip2015-07-13 15:55 10M 
[   ]cmake-3.3.0-win32-x86.exe2015-07-23 16:38 12M 
[   ]cmake-3.3.0-win32-x86.zip2015-07-23 16:38 16M 
[   ]cmake-3.3.0.tar.Z2015-07-23 16:38 10M 
[   ]cmake-3.3.0.tar.gz2015-07-23 16:38 6.3M 
[   ]cmake-3.3.0.zip2015-07-23 16:38 10M 
[   ]cmake-3.3.1-1-src.tar.bz22015-08-13 15:55 5.0M 
[   ]cmake-3.3.1-1.tar.bz22015-08-13 15:55 9.8M 
[   ]cmake-3.3.1-Darwin-universal.dmg2015-08-13 15:55 48M 
[   ]cmake-3.3.1-Darwin-universal.tar.Z2015-08-13 15:55 68M 
[   ]cmake-3.3.1-Darwin-universal.tar.gz2015-08-13 15:55 47M 
[   ]cmake-3.3.1-Darwin-x86_64.dmg2015-08-13 15:55 22M 
[   ]cmake-3.3.1-Darwin-x86_64.tar.Z2015-08-13 15:55 31M 
[   ]cmake-3.3.1-Darwin-x86_64.tar.gz2015-08-13 15:55 21M 
[TXT]cmake-3.3.1-Linux-i386.sh2015-08-13 15:55 26M 
[   ]cmake-3.3.1-Linux-i386.tar.Z2015-08-13 15:55 37M 
[   ]cmake-3.3.1-Linux-i386.tar.gz2015-08-13 15:55 26M 
[TXT]cmake-3.3.1-Linux-x86_64.sh2015-08-13 15:55 27M 
[   ]cmake-3.3.1-Linux-x86_64.tar.Z2015-08-13 15:55 37M 
[   ]cmake-3.3.1-Linux-x86_64.tar.gz2015-08-13 15:55 27M 
[TXT]cmake-3.3.1-SHA-256.txt2015-08-13 15:55 1.3K 
[TXT]cmake-3.3.1-SHA-256.txt.asc2015-08-13 15:55 819  
[   ]cmake-3.3.1-win32-x86.exe2015-08-13 15:55 12M 
[   ]cmake-3.3.1-win32-x86.zip2015-08-13 15:55 16M 
[   ]cmake-3.3.1.tar.Z2015-08-13 15:54 10M 
[   ]cmake-3.3.1.tar.gz2015-08-13 15:54 6.3M 
[   ]cmake-3.3.1.zip2015-08-13 15:54 10M 
[   ]cmake-3.3.2-1-src.tar.bz22015-09-17 14:36 5.0M 
[   ]cmake-3.3.2-1.tar.bz22015-09-17 14:36 9.8M 
[   ]cmake-3.3.2-Darwin-universal.dmg2015-09-17 14:36 48M 
[   ]cmake-3.3.2-Darwin-universal.tar.Z2015-09-17 14:36 68M 
[   ]cmake-3.3.2-Darwin-universal.tar.gz2015-09-17 14:36 47M 
[   ]cmake-3.3.2-Darwin-x86_64.dmg2015-09-17 14:35 22M 
[   ]cmake-3.3.2-Darwin-x86_64.tar.Z2015-09-17 14:35 31M 
[   ]cmake-3.3.2-Darwin-x86_64.tar.gz2015-09-17 14:35 21M 
[TXT]cmake-3.3.2-Linux-i386.sh2015-09-17 14:35 26M 
[   ]cmake-3.3.2-Linux-i386.tar.Z2015-09-17 14:35 37M 
[   ]cmake-3.3.2-Linux-i386.tar.gz2015-09-17 14:35 26M 
[TXT]cmake-3.3.2-Linux-x86_64.sh2015-09-17 14:35 27M 
[   ]cmake-3.3.2-Linux-x86_64.tar.Z2015-09-17 14:35 37M 
[   ]cmake-3.3.2-Linux-x86_64.tar.gz2015-09-17 14:35 27M 
[TXT]cmake-3.3.2-SHA-256.txt2015-09-17 14:35 1.6K 
[TXT]cmake-3.3.2-SHA-256.txt.asc2015-09-17 14:35 819  
[   ]cmake-3.3.2-win32-x86.exe2015-09-17 14:35 12M 
[   ]cmake-3.3.2-win32-x86.zip2015-09-17 14:35 16M 
[   ]cmake-3.3.2.tar.Z2015-09-17 14:35 10M 
[   ]cmake-3.3.2.tar.gz2015-09-17 14:35 6.3M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.4.0-Darwin-x86_64.dmg2015-11-12 13:42 22M 
[   ]cmake-3.4.0-Darwin-x86_64.tar.Z2015-11-12 13:42 31M 
[   ]cmake-3.4.0-Darwin-x86_64.tar.gz2015-11-12 13:42 22M 
[TXT]cmake-3.4.0-Linux-i386.sh2015-11-12 13:42 26M 
[   ]cmake-3.4.0-Linux-i386.tar.Z2015-11-12 13:42 37M 
[   ]cmake-3.4.0-Linux-i386.tar.gz2015-11-12 13:42 26M 
[TXT]cmake-3.4.0-Linux-x86_64.sh2015-11-12 13:42 27M 
[   ]cmake-3.4.0-Linux-x86_64.tar.Z2015-11-12 13:42 38M 
[   ]cmake-3.4.0-Linux-x86_64.tar.gz2015-11-12 13:42 27M 
[TXT]cmake-3.4.0-SHA-256.txt2015-11-12 13:42 1.3K 
[TXT]cmake-3.4.0-SHA-256.txt.asc2015-11-12 13:42 819  
[   ]cmake-3.4.0-rc1-Darwin-x86_64.dmg2015-10-06 11:02 22M 
[   ]cmake-3.4.0-rc1-Darwin-x86_64.tar.Z2015-10-06 11:02 31M 
[   ]cmake-3.4.0-rc1-Darwin-x86_64.tar.gz2015-10-06 11:02 22M 
[TXT]cmake-3.4.0-rc1-Linux-i386.sh2015-10-06 11:02 26M 
[   ]cmake-3.4.0-rc1-Linux-i386.tar.Z2015-10-06 11:02 37M 
[   ]cmake-3.4.0-rc1-Linux-i386.tar.gz2015-10-06 11:01 26M 
[TXT]cmake-3.4.0-rc1-Linux-x86_64.sh2015-10-06 11:01 27M 
[   ]cmake-3.4.0-rc1-Linux-x86_64.tar.Z2015-10-06 11:01 38M 
[   ]cmake-3.4.0-rc1-Linux-x86_64.tar.gz2015-10-06 11:01 27M 
[TXT]cmake-3.4.0-rc1-SHA-256.txt2015-10-06 11:01 1.3K 
[TXT]cmake-3.4.0-rc1-SHA-256.txt.asc2015-10-06 11:01 819  
[   ]cmake-3.4.0-rc1-win32-x86.exe2015-10-06 11:01 13M 
[   ]cmake-3.4.0-rc1-win32-x86.zip2015-10-06 11:01 16M 
[   ]cmake-3.4.0-rc1.tar.Z2015-10-06 11:01 10M 
[   ]cmake-3.4.0-rc1.tar.gz2015-10-06 11:01 6.4M 
[   ]cmake-3.4.0-rc1.zip2015-10-06 11:01 11M 
[   ]cmake-3.4.0-rc2-Darwin-x86_64.dmg2015-10-21 16:27 22M 
[   ]cmake-3.4.0-rc2-Darwin-x86_64.tar.Z2015-10-21 16:27 31M 
[   ]cmake-3.4.0-rc2-Darwin-x86_64.tar.gz2015-10-21 16:27 22M 
[TXT]cmake-3.4.0-rc2-Linux-i386.sh2015-10-21 16:27 26M 
[   ]cmake-3.4.0-rc2-Linux-i386.tar.Z2015-10-21 16:27 37M 
[   ]cmake-3.4.0-rc2-Linux-i386.tar.gz2015-10-21 16:27 26M 
[TXT]cmake-3.4.0-rc2-Linux-x86_64.sh2015-10-21 16:27 27M 
[   ]cmake-3.4.0-rc2-Linux-x86_64.tar.Z2015-10-21 16:27 38M 
[   ]cmake-3.4.0-rc2-Linux-x86_64.tar.gz2015-10-21 16:27 27M 
[TXT]cmake-3.4.0-rc2-SHA-256.txt2015-10-21 16:26 1.3K 
[TXT]cmake-3.4.0-rc2-SHA-256.txt.asc2015-10-21 16:26 819  
[   ]cmake-3.4.0-rc2-win32-x86.exe2015-10-21 16:26 13M 
[   ]cmake-3.4.0-rc2-win32-x86.zip2015-10-21 16:26 16M 
[   ]cmake-3.4.0-rc2.tar.Z2015-10-21 16:26 10M 
[   ]cmake-3.4.0-rc2.tar.gz2015-10-21 16:26 6.4M 
[   ]cmake-3.4.0-rc2.zip2015-10-21 16:26 11M 
[   ]cmake-3.4.0-rc3-Darwin-x86_64.dmg2015-11-03 11:09 22M 
[   ]cmake-3.4.0-rc3-Darwin-x86_64.tar.Z2015-11-03 11:09 31M 
[   ]cmake-3.4.0-rc3-Darwin-x86_64.tar.gz2015-11-03 11:09 22M 
[TXT]cmake-3.4.0-rc3-Linux-i386.sh2015-11-03 11:09 26M 
[   ]cmake-3.4.0-rc3-Linux-i386.tar.Z2015-11-03 11:09 37M 
[   ]cmake-3.4.0-rc3-Linux-i386.tar.gz2015-11-03 11:09 26M 
[TXT]cmake-3.4.0-rc3-Linux-x86_64.sh2015-11-03 11:09 27M 
[   ]cmake-3.4.0-rc3-Linux-x86_64.tar.Z2015-11-03 11:09 38M 
[   ]cmake-3.4.0-rc3-Linux-x86_64.tar.gz2015-11-03 11:09 27M 
[TXT]cmake-3.4.0-rc3-SHA-256.txt2015-11-03 11:09 1.3K 
[TXT]cmake-3.4.0-rc3-SHA-256.txt.asc2015-11-03 11:09 819  
[   ]cmake-3.4.0-rc3-win32-x86.exe2015-11-03 11:09 13M 
[   ]cmake-3.4.0-rc3-win32-x86.zip2015-11-03 11:09 16M 
[   ]cmake-3.4.0-rc3.tar.Z2015-11-03 11:09 10M 
[   ]cmake-3.4.0-rc3.tar.gz2015-11-03 11:08 6.4M 
[   ]cmake-3.4.0-rc3.zip2015-11-03 11:08 11M 
[   ]cmake-3.4.0-win32-x86.exe2015-11-12 13:42 13M 
[   ]cmake-3.4.0-win32-x86.zip2015-11-12 13:42 16M 
[   ]cmake-3.4.0.tar.Z2015-11-12 13:42 10M 
[   ]cmake-3.4.0.tar.gz2015-11-12 13:42 6.4M 
[   ]cmake-3.4.0.zip2015-11-12 13:42 10M 
[   ]cmake-3.4.1-Darwin-x86_64.dmg2015-12-02 14:42 22M 
[   ]cmake-3.4.1-Darwin-x86_64.tar.Z2015-12-02 14:42 31M 
[   ]cmake-3.4.1-Darwin-x86_64.tar.gz2015-12-02 14:42 22M 
[TXT]cmake-3.4.1-Linux-i386.sh2015-12-02 14:42 26M 
[   ]cmake-3.4.1-Linux-i386.tar.Z2015-12-02 14:42 37M 
[   ]cmake-3.4.1-Linux-i386.tar.gz2015-12-02 14:42 26M 
[TXT]cmake-3.4.1-Linux-x86_64.sh2015-12-02 14:42 27M 
[   ]cmake-3.4.1-Linux-x86_64.tar.Z2015-12-02 14:42 38M 
[   ]cmake-3.4.1-Linux-x86_64.tar.gz2015-12-02 14:42 27M 
[TXT]cmake-3.4.1-SHA-256.txt2015-12-02 14:42 1.3K 
[TXT]cmake-3.4.1-SHA-256.txt.asc2015-12-02 14:42 819  
[   ]cmake-3.4.1-win32-x86.exe2015-12-02 14:42 13M 
[   ]cmake-3.4.1-win32-x86.zip2015-12-02 14:42 16M 
[   ]cmake-3.4.1.tar.Z2015-12-02 14:42 10M 
[   ]cmake-3.4.1.tar.gz2015-12-02 14:42 6.4M 
[   ]cmake-3.4.1.zip2015-12-02 14:41 10M 
[   ]cmake-3.4.2-Darwin-x86_64.dmg2016-01-19 14:58 22M 
[   ]cmake-3.4.2-Darwin-x86_64.tar.Z2016-01-19 14:58 31M 
[   ]cmake-3.4.2-Darwin-x86_64.tar.gz2016-01-19 14:58 22M 
[TXT]cmake-3.4.2-Linux-i386.sh2016-01-19 14:58 26M 
[   ]cmake-3.4.2-Linux-i386.tar.Z2016-01-19 14:58 37M 
[   ]cmake-3.4.2-Linux-i386.tar.gz2016-01-19 14:58 26M 
[TXT]cmake-3.4.2-Linux-x86_64.sh2016-01-19 14:58 27M 
[   ]cmake-3.4.2-Linux-x86_64.tar.Z2016-01-19 14:58 38M 
[   ]cmake-3.4.2-Linux-x86_64.tar.gz2016-01-19 14:58 27M 
[TXT]cmake-3.4.2-SHA-256.txt2016-01-19 14:58 1.3K 
[TXT]cmake-3.4.2-SHA-256.txt.asc2016-01-19 14:58 819  
[   ]cmake-3.4.2-win32-x86.exe2016-01-19 14:58 13M 
[   ]cmake-3.4.2-win32-x86.zip2016-01-19 14:58 16M 
[   ]cmake-3.4.2.tar.Z2016-01-19 14:58 10M 
[   ]cmake-3.4.2.tar.gz2016-01-19 14:58 6.4M 
[   ]cmake-3.4.2.zip2016-01-19 14:58 10M 
[   ]cmake-3.4.3-Darwin-x86_64.dmg2016-01-25 14:29 22M 
[   ]cmake-3.4.3-Darwin-x86_64.tar.Z2016-01-25 14:29 31M 
[   ]cmake-3.4.3-Darwin-x86_64.tar.gz2016-01-25 14:29 22M 
[TXT]cmake-3.4.3-Linux-i386.sh2016-01-25 14:29 26M 
[   ]cmake-3.4.3-Linux-i386.tar.Z2016-01-25 14:29 37M 
[   ]cmake-3.4.3-Linux-i386.tar.gz2016-01-25 14:29 26M 
[TXT]cmake-3.4.3-Linux-x86_64.sh2016-01-25 14:29 27M 
[   ]cmake-3.4.3-Linux-x86_64.tar.Z2016-01-25 14:29 38M 
[   ]cmake-3.4.3-Linux-x86_64.tar.gz2016-01-25 14:29 27M 
[TXT]cmake-3.4.3-SHA-256.txt2016-01-25 14:29 1.3K 
[TXT]cmake-3.4.3-SHA-256.txt.asc2016-01-25 14:29 819  
[   ]cmake-3.4.3-win32-x86.exe2016-01-25 14:29 13M 
[   ]cmake-3.4.3-win32-x86.zip2016-01-25 14:29 16M 
[   ]cmake-3.4.3.tar.Z2016-01-25 14:29 10M 
[   ]cmake-3.4.3.tar.gz2016-01-25 14:29 6.4M 
[   ]cmake-3.4.3.zip2016-01-25 14:29 10M 
[DIR]cygwin/2016-01-25 14:34 -  

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.5/index.html b/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.5.0-Darwin-x86_64.dmg2016-03-08 11:17 22M 
[   ]cmake-3.5.0-Darwin-x86_64.tar.Z2016-03-08 11:17 31M 
[   ]cmake-3.5.0-Darwin-x86_64.tar.gz2016-03-08 11:17 22M 
[TXT]cmake-3.5.0-Linux-i386.sh2016-03-08 11:17 27M 
[   ]cmake-3.5.0-Linux-i386.tar.Z2016-03-08 11:17 38M 
[   ]cmake-3.5.0-Linux-i386.tar.gz2016-03-08 11:17 27M 
[TXT]cmake-3.5.0-Linux-x86_64.sh2016-03-08 11:17 27M 
[   ]cmake-3.5.0-Linux-x86_64.tar.Z2016-03-08 11:17 38M 
[   ]cmake-3.5.0-Linux-x86_64.tar.gz2016-03-08 11:17 27M 
[TXT]cmake-3.5.0-SHA-256.txt2016-03-08 11:17 1.3K 
[TXT]cmake-3.5.0-SHA-256.txt.asc2016-03-08 11:16 819  
[   ]cmake-3.5.0-rc1-Darwin-x86_64.dmg2016-02-02 15:51 22M 
[   ]cmake-3.5.0-rc1-Darwin-x86_64.tar.Z2016-02-02 15:51 31M 
[   ]cmake-3.5.0-rc1-Darwin-x86_64.tar.gz2016-02-02 15:51 22M 
[TXT]cmake-3.5.0-rc1-Linux-i386.sh2016-02-02 15:51 27M 
[   ]cmake-3.5.0-rc1-Linux-i386.tar.Z2016-02-02 15:51 38M 
[   ]cmake-3.5.0-rc1-Linux-i386.tar.gz2016-02-02 15:51 27M 
[TXT]cmake-3.5.0-rc1-Linux-x86_64.sh2016-02-02 15:51 27M 
[   ]cmake-3.5.0-rc1-Linux-x86_64.tar.Z2016-02-02 15:51 38M 
[   ]cmake-3.5.0-rc1-Linux-x86_64.tar.gz2016-02-02 15:51 27M 
[TXT]cmake-3.5.0-rc1-SHA-256.txt2016-02-03 13:29 1.3K 
[TXT]cmake-3.5.0-rc1-SHA-256.txt.asc2016-02-03 13:29 819  
[   ]cmake-3.5.0-rc1-win32-x86.msi2016-02-03 13:29 15M 
[   ]cmake-3.5.0-rc1-win32-x86.zip2016-02-03 13:29 20M 
[   ]cmake-3.5.0-rc1.tar.Z2016-02-02 15:51 11M 
[   ]cmake-3.5.0-rc1.tar.gz2016-02-02 15:51 6.5M 
[   ]cmake-3.5.0-rc1.zip2016-02-02 15:51 11M 
[   ]cmake-3.5.0-rc2-Darwin-x86_64.dmg2016-02-10 15:03 22M 
[   ]cmake-3.5.0-rc2-Darwin-x86_64.tar.Z2016-02-10 15:03 31M 
[   ]cmake-3.5.0-rc2-Darwin-x86_64.tar.gz2016-02-10 15:03 22M 
[TXT]cmake-3.5.0-rc2-Linux-i386.sh2016-02-10 15:03 27M 
[   ]cmake-3.5.0-rc2-Linux-i386.tar.Z2016-02-10 15:03 38M 
[   ]cmake-3.5.0-rc2-Linux-i386.tar.gz2016-02-10 15:03 27M 
[TXT]cmake-3.5.0-rc2-Linux-x86_64.sh2016-02-10 15:03 27M 
[   ]cmake-3.5.0-rc2-Linux-x86_64.tar.Z2016-02-10 15:03 38M 
[   ]cmake-3.5.0-rc2-Linux-x86_64.tar.gz2016-02-10 15:03 27M 
[TXT]cmake-3.5.0-rc2-SHA-256.txt2016-02-10 15:03 1.3K 
[TXT]cmake-3.5.0-rc2-SHA-256.txt.asc2016-02-10 15:03 819  
[   ]cmake-3.5.0-rc2-win32-x86.msi2016-02-10 15:03 15M 
[   ]cmake-3.5.0-rc2-win32-x86.zip2016-02-10 15:03 20M 
[   ]cmake-3.5.0-rc2.tar.Z2016-02-10 15:02 11M 
[   ]cmake-3.5.0-rc2.tar.gz2016-02-10 15:02 6.5M 
[   ]cmake-3.5.0-rc2.zip2016-02-10 15:02 11M 
[   ]cmake-3.5.0-rc3-Darwin-x86_64.dmg2016-02-18 15:41 22M 
[   ]cmake-3.5.0-rc3-Darwin-x86_64.tar.Z2016-02-18 15:41 31M 
[   ]cmake-3.5.0-rc3-Darwin-x86_64.tar.gz2016-02-18 15:41 22M 
[TXT]cmake-3.5.0-rc3-Linux-i386.sh2016-02-18 15:41 27M 
[   ]cmake-3.5.0-rc3-Linux-i386.tar.Z2016-02-18 15:41 38M 
[   ]cmake-3.5.0-rc3-Linux-i386.tar.gz2016-02-18 15:41 27M 
[TXT]cmake-3.5.0-rc3-Linux-x86_64.sh2016-02-18 15:41 27M 
[   ]cmake-3.5.0-rc3-Linux-x86_64.tar.Z2016-02-18 15:41 38M 
[   ]cmake-3.5.0-rc3-Linux-x86_64.tar.gz2016-02-18 15:41 27M 
[TXT]cmake-3.5.0-rc3-SHA-256.txt2016-02-18 15:41 1.3K 
[TXT]cmake-3.5.0-rc3-SHA-256.txt.asc2016-02-18 15:41 819  
[   ]cmake-3.5.0-rc3-win32-x86.msi2016-02-18 15:41 15M 
[   ]cmake-3.5.0-rc3-win32-x86.zip2016-02-18 15:41 20M 
[   ]cmake-3.5.0-rc3.tar.Z2016-02-18 15:41 11M 
[   ]cmake-3.5.0-rc3.tar.gz2016-02-18 15:40 6.5M 
[   ]cmake-3.5.0-rc3.zip2016-02-18 15:40 11M 
[   ]cmake-3.5.0-win32-x86.msi2016-03-08 11:16 15M 
[   ]cmake-3.5.0-win32-x86.zip2016-03-08 11:16 20M 
[   ]cmake-3.5.0.tar.Z2016-03-08 11:16 11M 
[   ]cmake-3.5.0.tar.gz2016-03-08 11:16 6.5M 
[   ]cmake-3.5.0.zip2016-03-08 11:16 11M 
[   ]cmake-3.5.1-Darwin-x86_64.dmg2016-03-24 16:00 22M 
[   ]cmake-3.5.1-Darwin-x86_64.tar.Z2016-03-24 16:00 31M 
[   ]cmake-3.5.1-Darwin-x86_64.tar.gz2016-03-24 16:00 22M 
[TXT]cmake-3.5.1-Linux-i386.sh2016-03-24 16:00 27M 
[   ]cmake-3.5.1-Linux-i386.tar.Z2016-03-24 16:00 38M 
[   ]cmake-3.5.1-Linux-i386.tar.gz2016-03-24 16:00 27M 
[TXT]cmake-3.5.1-Linux-x86_64.sh2016-03-24 16:00 27M 
[   ]cmake-3.5.1-Linux-x86_64.tar.Z2016-03-24 16:00 38M 
[   ]cmake-3.5.1-Linux-x86_64.tar.gz2016-03-24 16:00 27M 
[TXT]cmake-3.5.1-SHA-256.txt2016-03-24 16:00 1.3K 
[TXT]cmake-3.5.1-SHA-256.txt.asc2016-03-24 16:00 819  
[   ]cmake-3.5.1-win32-x86.msi2016-03-24 16:00 15M 
[   ]cmake-3.5.1-win32-x86.zip2016-03-24 16:00 20M 
[   ]cmake-3.5.1.tar.Z2016-03-24 16:00 11M 
[   ]cmake-3.5.1.tar.gz2016-03-24 16:00 6.5M 
[   ]cmake-3.5.1.zip2016-03-24 16:00 11M 
[   ]cmake-3.5.2-Darwin-x86_64.dmg2016-04-15 13:40 22M 
[   ]cmake-3.5.2-Darwin-x86_64.tar.Z2016-04-15 13:40 31M 
[   ]cmake-3.5.2-Darwin-x86_64.tar.gz2016-04-15 13:40 22M 
[TXT]cmake-3.5.2-Linux-i386.sh2016-04-15 13:40 27M 
[   ]cmake-3.5.2-Linux-i386.tar.Z2016-04-15 13:40 38M 
[   ]cmake-3.5.2-Linux-i386.tar.gz2016-04-15 13:40 27M 
[TXT]cmake-3.5.2-Linux-x86_64.sh2016-04-15 13:40 27M 
[   ]cmake-3.5.2-Linux-x86_64.tar.Z2016-04-15 13:40 38M 
[   ]cmake-3.5.2-Linux-x86_64.tar.gz2016-04-15 13:40 27M 
[TXT]cmake-3.5.2-SHA-256.txt2016-04-15 13:40 1.3K 
[TXT]cmake-3.5.2-SHA-256.txt.asc2016-04-15 13:40 819  
[   ]cmake-3.5.2-win32-x86.msi2016-04-15 13:40 15M 
[   ]cmake-3.5.2-win32-x86.zip2016-04-15 13:40 20M 
[   ]cmake-3.5.2.tar.Z2016-04-15 13:40 11M 
[   ]cmake-3.5.2.tar.gz2016-04-15 13:40 6.5M 
[   ]cmake-3.5.2.zip2016-04-15 13:40 11M 
[DIR]cygwin/2016-04-15 13:42 -  

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.6/index.html b/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.6.0-Darwin-x86_64.dmg2016-07-07 13:05 25M 
[   ]cmake-3.6.0-Darwin-x86_64.tar.Z2016-07-07 13:05 36M 
[   ]cmake-3.6.0-Darwin-x86_64.tar.gz2016-07-07 13:05 25M 
[TXT]cmake-3.6.0-Linux-i386.sh2016-07-07 13:05 27M 
[   ]cmake-3.6.0-Linux-i386.tar.Z2016-07-07 13:05 38M 
[   ]cmake-3.6.0-Linux-i386.tar.gz2016-07-07 13:05 27M 
[TXT]cmake-3.6.0-Linux-x86_64.sh2016-07-07 13:05 27M 
[   ]cmake-3.6.0-Linux-x86_64.tar.Z2016-07-07 13:05 38M 
[   ]cmake-3.6.0-Linux-x86_64.tar.gz2016-07-07 13:05 27M 
[TXT]cmake-3.6.0-SHA-256.txt2016-07-07 13:05 1.4K 
[TXT]cmake-3.6.0-SHA-256.txt.asc2016-07-07 13:05 819  
[   ]cmake-3.6.0-rc1-Darwin-x86_64.dmg2016-06-03 14:50 25M 
[   ]cmake-3.6.0-rc1-Darwin-x86_64.tar.Z2016-06-03 14:50 36M 
[   ]cmake-3.6.0-rc1-Darwin-x86_64.tar.gz2016-06-03 14:50 25M 
[TXT]cmake-3.6.0-rc1-Linux-i386.sh2016-06-03 14:50 27M 
[   ]cmake-3.6.0-rc1-Linux-i386.tar.Z2016-06-03 14:50 38M 
[   ]cmake-3.6.0-rc1-Linux-i386.tar.gz2016-06-03 14:50 27M 
[TXT]cmake-3.6.0-rc1-Linux-x86_64.sh2016-06-03 14:50 27M 
[   ]cmake-3.6.0-rc1-Linux-x86_64.tar.Z2016-06-03 14:50 38M 
[   ]cmake-3.6.0-rc1-Linux-x86_64.tar.gz2016-06-03 14:49 27M 
[TXT]cmake-3.6.0-rc1-SHA-256.txt2016-06-03 14:49 1.5K 
[TXT]cmake-3.6.0-rc1-SHA-256.txt.asc2016-06-03 14:49 819  
[   ]cmake-3.6.0-rc1-win32-x86.msi2016-06-03 14:49 15M 
[   ]cmake-3.6.0-rc1-win32-x86.zip2016-06-03 14:49 21M 
[   ]cmake-3.6.0-rc1-win64-x64.msi2016-06-03 14:49 15M 
[   ]cmake-3.6.0-rc1-win64-x64.zip2016-06-03 14:49 19M 
[   ]cmake-3.6.0-rc1.tar.Z2016-06-03 14:49 11M 
[   ]cmake-3.6.0-rc1.tar.gz2016-06-03 14:49 6.6M 
[   ]cmake-3.6.0-rc1.zip2016-06-03 14:49 11M 
[   ]cmake-3.6.0-rc2-Darwin-x86_64.dmg2016-06-13 14:29 25M 
[   ]cmake-3.6.0-rc2-Darwin-x86_64.tar.Z2016-06-13 14:29 36M 
[   ]cmake-3.6.0-rc2-Darwin-x86_64.tar.gz2016-06-13 14:29 25M 
[TXT]cmake-3.6.0-rc2-Linux-i386.sh2016-06-13 14:29 27M 
[   ]cmake-3.6.0-rc2-Linux-i386.tar.Z2016-06-13 14:29 38M 
[   ]cmake-3.6.0-rc2-Linux-i386.tar.gz2016-06-13 14:29 27M 
[TXT]cmake-3.6.0-rc2-Linux-x86_64.sh2016-06-13 14:29 27M 
[   ]cmake-3.6.0-rc2-Linux-x86_64.tar.Z2016-06-13 14:29 38M 
[   ]cmake-3.6.0-rc2-Linux-x86_64.tar.gz2016-06-13 14:29 27M 
[TXT]cmake-3.6.0-rc2-SHA-256.txt2016-06-13 14:29 1.5K 
[TXT]cmake-3.6.0-rc2-SHA-256.txt.asc2016-06-13 14:29 819  
[   ]cmake-3.6.0-rc2-win32-x86.msi2016-06-13 14:29 15M 
[   ]cmake-3.6.0-rc2-win32-x86.zip2016-06-13 14:29 21M 
[   ]cmake-3.6.0-rc2-win64-x64.msi2016-06-13 14:29 15M 
[   ]cmake-3.6.0-rc2-win64-x64.zip2016-06-13 14:29 19M 
[   ]cmake-3.6.0-rc2.tar.Z2016-06-13 14:29 11M 
[   ]cmake-3.6.0-rc2.tar.gz2016-06-13 14:28 6.6M 
[   ]cmake-3.6.0-rc2.zip2016-06-13 14:28 11M 
[   ]cmake-3.6.0-rc3-Darwin-x86_64.dmg2016-06-22 13:58 25M 
[   ]cmake-3.6.0-rc3-Darwin-x86_64.tar.Z2016-06-22 13:58 36M 
[   ]cmake-3.6.0-rc3-Darwin-x86_64.tar.gz2016-06-22 13:57 25M 
[TXT]cmake-3.6.0-rc3-Linux-i386.sh2016-06-22 13:57 27M 
[   ]cmake-3.6.0-rc3-Linux-i386.tar.Z2016-06-22 13:57 38M 
[   ]cmake-3.6.0-rc3-Linux-i386.tar.gz2016-06-22 13:57 27M 
[TXT]cmake-3.6.0-rc3-Linux-x86_64.sh2016-06-22 13:57 27M 
[   ]cmake-3.6.0-rc3-Linux-x86_64.tar.Z2016-06-22 13:57 38M 
[   ]cmake-3.6.0-rc3-Linux-x86_64.tar.gz2016-06-22 13:57 27M 
[TXT]cmake-3.6.0-rc3-SHA-256.txt2016-06-22 13:57 1.5K 
[TXT]cmake-3.6.0-rc3-SHA-256.txt.asc2016-06-22 13:57 819  
[   ]cmake-3.6.0-rc3-win32-x86.msi2016-06-22 13:57 15M 
[   ]cmake-3.6.0-rc3-win32-x86.zip2016-06-22 13:57 21M 
[   ]cmake-3.6.0-rc3-win64-x64.msi2016-06-22 13:57 15M 
[   ]cmake-3.6.0-rc3-win64-x64.zip2016-06-22 13:57 19M 
[   ]cmake-3.6.0-rc3.tar.Z2016-06-22 13:57 11M 
[   ]cmake-3.6.0-rc3.tar.gz2016-06-22 13:57 6.6M 
[   ]cmake-3.6.0-rc3.zip2016-06-22 13:57 11M 
[   ]cmake-3.6.0-rc4-Darwin-x86_64.dmg2016-06-29 14:50 25M 
[   ]cmake-3.6.0-rc4-Darwin-x86_64.tar.Z2016-06-29 14:50 36M 
[   ]cmake-3.6.0-rc4-Darwin-x86_64.tar.gz2016-06-29 14:50 25M 
[TXT]cmake-3.6.0-rc4-Linux-i386.sh2016-06-29 14:50 27M 
[   ]cmake-3.6.0-rc4-Linux-i386.tar.Z2016-06-29 14:50 38M 
[   ]cmake-3.6.0-rc4-Linux-i386.tar.gz2016-06-29 14:50 27M 
[TXT]cmake-3.6.0-rc4-Linux-x86_64.sh2016-06-29 14:50 27M 
[   ]cmake-3.6.0-rc4-Linux-x86_64.tar.Z2016-06-29 14:49 38M 
[   ]cmake-3.6.0-rc4-Linux-x86_64.tar.gz2016-06-29 14:49 27M 
[TXT]cmake-3.6.0-rc4-SHA-256.txt2016-06-29 14:49 1.5K 
[TXT]cmake-3.6.0-rc4-SHA-256.txt.asc2016-06-29 14:49 819  
[   ]cmake-3.6.0-rc4-win32-x86.msi2016-06-29 14:49 15M 
[   ]cmake-3.6.0-rc4-win32-x86.zip2016-06-29 14:49 21M 
[   ]cmake-3.6.0-rc4-win64-x64.msi2016-06-29 14:49 15M 
[   ]cmake-3.6.0-rc4-win64-x64.zip2016-06-29 14:49 19M 
[   ]cmake-3.6.0-rc4.tar.Z2016-06-29 14:49 11M 
[   ]cmake-3.6.0-rc4.tar.gz2016-06-29 14:49 6.6M 
[   ]cmake-3.6.0-rc4.zip2016-06-29 14:49 11M 
[   ]cmake-3.6.0-win32-x86.msi2016-07-07 13:04 15M 
[   ]cmake-3.6.0-win32-x86.zip2016-07-07 13:04 20M 
[   ]cmake-3.6.0-win64-x64.msi2016-07-07 13:04 15M 
[   ]cmake-3.6.0-win64-x64.zip2016-07-07 13:04 19M 
[   ]cmake-3.6.0.tar.Z2016-07-07 13:04 11M 
[   ]cmake-3.6.0.tar.gz2016-07-07 13:04 6.6M 
[   ]cmake-3.6.0.zip2016-07-07 13:04 11M 
[   ]cmake-3.6.1-Darwin-x86_64.dmg2016-07-22 10:58 25M 
[   ]cmake-3.6.1-Darwin-x86_64.tar.Z2016-07-22 10:58 36M 
[   ]cmake-3.6.1-Darwin-x86_64.tar.gz2016-07-22 10:58 25M 
[TXT]cmake-3.6.1-Linux-i386.sh2016-07-22 10:58 27M 
[   ]cmake-3.6.1-Linux-i386.tar.Z2016-07-22 10:58 38M 
[   ]cmake-3.6.1-Linux-i386.tar.gz2016-07-22 10:58 27M 
[TXT]cmake-3.6.1-Linux-x86_64.sh2016-07-22 10:58 27M 
[   ]cmake-3.6.1-Linux-x86_64.tar.Z2016-07-22 10:58 38M 
[   ]cmake-3.6.1-Linux-x86_64.tar.gz2016-07-22 10:58 27M 
[TXT]cmake-3.6.1-SHA-256.txt2016-07-22 10:58 1.4K 
[TXT]cmake-3.6.1-SHA-256.txt.asc2016-07-22 10:58 819  
[   ]cmake-3.6.1-win32-x86.msi2016-07-22 10:58 15M 
[   ]cmake-3.6.1-win32-x86.zip2016-07-22 10:58 20M 
[   ]cmake-3.6.1-win64-x64.msi2016-07-22 10:58 15M 
[   ]cmake-3.6.1-win64-x64.zip2016-07-22 10:57 19M 
[   ]cmake-3.6.1.tar.Z2016-07-22 10:57 11M 
[   ]cmake-3.6.1.tar.gz2016-07-22 10:57 6.6M 
[   ]cmake-3.6.1.zip2016-07-22 10:57 11M 
[   ]cmake-3.6.2-Darwin-x86_64.dmg2016-09-07 14:29 25M 
[   ]cmake-3.6.2-Darwin-x86_64.tar.Z2016-09-07 14:29 36M 
[   ]cmake-3.6.2-Darwin-x86_64.tar.gz2016-09-07 14:29 25M 
[TXT]cmake-3.6.2-Linux-i386.sh2016-09-07 14:29 27M 
[   ]cmake-3.6.2-Linux-i386.tar.Z2016-09-07 14:29 38M 
[   ]cmake-3.6.2-Linux-i386.tar.gz2016-09-07 14:28 27M 
[TXT]cmake-3.6.2-Linux-x86_64.sh2016-09-07 14:28 27M 
[   ]cmake-3.6.2-Linux-x86_64.tar.Z2016-09-07 14:28 38M 
[   ]cmake-3.6.2-Linux-x86_64.tar.gz2016-09-07 14:28 27M 
[TXT]cmake-3.6.2-SHA-256.txt2016-09-07 14:28 1.4K 
[TXT]cmake-3.6.2-SHA-256.txt.asc2016-09-07 14:28 819  
[   ]cmake-3.6.2-win32-x86.msi2016-09-07 14:28 15M 
[   ]cmake-3.6.2-win32-x86.zip2016-09-07 14:28 20M 
[   ]cmake-3.6.2-win64-x64.msi2016-09-07 14:28 15M 
[   ]cmake-3.6.2-win64-x64.zip2016-09-07 14:28 19M 
[   ]cmake-3.6.2.tar.Z2016-09-07 14:28 11M 
[   ]cmake-3.6.2.tar.gz2016-09-07 14:28 6.6M 
[   ]cmake-3.6.2.zip2016-09-07 14:28 11M 
[   ]cmake-3.6.3-Darwin-x86_64.dmg2016-11-03 12:13 25M 
[   ]cmake-3.6.3-Darwin-x86_64.tar.Z2016-11-03 12:13 36M 
[   ]cmake-3.6.3-Darwin-x86_64.tar.gz2016-11-03 12:13 25M 
[TXT]cmake-3.6.3-Linux-i386.sh2016-11-03 12:13 27M 
[   ]cmake-3.6.3-Linux-i386.tar.Z2016-11-03 12:13 38M 
[   ]cmake-3.6.3-Linux-i386.tar.gz2016-11-03 12:13 27M 
[TXT]cmake-3.6.3-Linux-x86_64.sh2016-11-03 12:13 27M 
[   ]cmake-3.6.3-Linux-x86_64.tar.Z2016-11-03 12:13 38M 
[   ]cmake-3.6.3-Linux-x86_64.tar.gz2016-11-03 12:13 27M 
[TXT]cmake-3.6.3-SHA-256.txt2016-11-03 12:13 1.4K 
[TXT]cmake-3.6.3-SHA-256.txt.asc2016-11-03 12:13 801  
[   ]cmake-3.6.3-win32-x86.msi2016-11-03 12:13 15M 
[   ]cmake-3.6.3-win32-x86.zip2016-11-03 12:13 20M 
[   ]cmake-3.6.3-win64-x64.msi2016-11-03 12:12 17M 
[   ]cmake-3.6.3-win64-x64.zip2016-11-03 12:12 23M 
[   ]cmake-3.6.3.tar.Z2016-11-03 12:12 11M 
[   ]cmake-3.6.3.tar.gz2016-11-03 12:12 6.6M 
[   ]cmake-3.6.3.zip2016-11-03 12:12 11M 
[DIR]cygwin/2016-09-07 14:44 -  

+ diff --git a/bitbake/lib/bb/tests/fetch-testdata/files/v3.7/index.html b/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.7.0-Darwin-x86_64.dmg2016-11-11 14:01 26M 
[   ]cmake-3.7.0-Darwin-x86_64.tar.gz2016-11-11 14:01 25M 
[TXT]cmake-3.7.0-Linux-x86_64.sh2016-11-11 14:01 29M 
[   ]cmake-3.7.0-Linux-x86_64.tar.gz2016-11-11 14:01 29M 
[TXT]cmake-3.7.0-SHA-256.txt2016-11-11 14:01 1.0K 
[TXT]cmake-3.7.0-SHA-256.txt.asc2016-11-11 14:01 801  
[   ]cmake-3.7.0-rc1-Darwin-x86_64.dmg2016-10-04 15:23 26M 
[   ]cmake-3.7.0-rc1-Darwin-x86_64.tar.gz2016-10-04 15:23 25M 
[TXT]cmake-3.7.0-rc1-Linux-x86_64.sh2016-10-04 15:23 29M 
[   ]cmake-3.7.0-rc1-Linux-x86_64.tar.gz2016-10-04 15:23 29M 
[TXT]cmake-3.7.0-rc1-SHA-256.txt2016-10-04 15:23 1.0K 
[TXT]cmake-3.7.0-rc1-SHA-256.txt.asc2016-10-04 15:23 801  
[   ]cmake-3.7.0-rc1-win32-x86.msi2016-10-04 15:23 15M 
[   ]cmake-3.7.0-rc1-win32-x86.zip2016-10-04 15:23 21M 
[   ]cmake-3.7.0-rc1-win64-x64.msi2016-10-04 15:23 17M 
[   ]cmake-3.7.0-rc1-win64-x64.zip2016-10-04 15:23 24M 
[   ]cmake-3.7.0-rc1.tar.Z2016-10-04 15:23 11M 
[   ]cmake-3.7.0-rc1.tar.gz2016-10-04 15:23 7.0M 
[   ]cmake-3.7.0-rc1.zip2016-10-04 15:23 12M 
[   ]cmake-3.7.0-rc2-Darwin-x86_64.dmg2016-10-19 15:24 26M 
[   ]cmake-3.7.0-rc2-Darwin-x86_64.tar.gz2016-10-19 15:24 25M 
[TXT]cmake-3.7.0-rc2-Linux-x86_64.sh2016-10-19 15:24 29M 
[   ]cmake-3.7.0-rc2-Linux-x86_64.tar.gz2016-10-19 15:24 29M 
[TXT]cmake-3.7.0-rc2-SHA-256.txt2016-10-19 15:24 1.0K 
[TXT]cmake-3.7.0-rc2-SHA-256.txt.asc2016-10-19 15:24 801  
[   ]cmake-3.7.0-rc2-win32-x86.msi2016-10-19 15:23 15M 
[   ]cmake-3.7.0-rc2-win32-x86.zip2016-10-19 15:23 21M 
[   ]cmake-3.7.0-rc2-win64-x64.msi2016-10-19 15:23 17M 
[   ]cmake-3.7.0-rc2-win64-x64.zip2016-10-19 15:23 24M 
[   ]cmake-3.7.0-rc2.tar.Z2016-10-19 15:23 11M 
[   ]cmake-3.7.0-rc2.tar.gz2016-10-19 15:23 7.0M 
[   ]cmake-3.7.0-rc2.zip2016-10-19 15:23 12M 
[   ]cmake-3.7.0-rc3-Darwin-x86_64.dmg2016-11-04 15:26 26M 
[   ]cmake-3.7.0-rc3-Darwin-x86_64.tar.gz2016-11-04 15:26 25M 
[TXT]cmake-3.7.0-rc3-Linux-x86_64.sh2016-11-04 15:26 29M 
[   ]cmake-3.7.0-rc3-Linux-x86_64.tar.gz2016-11-04 15:26 29M 
[TXT]cmake-3.7.0-rc3-SHA-256.txt2016-11-04 15:26 1.0K 
[TXT]cmake-3.7.0-rc3-SHA-256.txt.asc2016-11-04 15:26 801  
[   ]cmake-3.7.0-rc3-win32-x86.msi2016-11-04 15:26 15M 
[   ]cmake-3.7.0-rc3-win32-x86.zip2016-11-04 15:26 21M 
[   ]cmake-3.7.0-rc3-win64-x64.msi2016-11-04 15:26 17M 
[   ]cmake-3.7.0-rc3-win64-x64.zip2016-11-04 15:26 24M 
[   ]cmake-3.7.0-rc3.tar.Z2016-11-04 15:26 11M 
[   ]cmake-3.7.0-rc3.tar.gz2016-11-04 15:26 7.0M 
[   ]cmake-3.7.0-rc3.zip2016-11-04 15:26 12M 
[   ]cmake-3.7.0-win32-x86.msi2016-11-11 14:01 15M 
[   ]cmake-3.7.0-win32-x86.zip2016-11-11 14:01 21M 
[   ]cmake-3.7.0-win64-x64.msi2016-11-11 14:01 17M 
[   ]cmake-3.7.0-win64-x64.zip2016-11-11 14:00 24M 
[   ]cmake-3.7.0.tar.Z2016-11-11 14:00 11M 
[   ]cmake-3.7.0.tar.gz2016-11-11 14:00 7.0M 
[   ]cmake-3.7.0.zip2016-11-11 14:00 11M 
[   ]cmake-3.7.1-Darwin-x86_64.dmg2016-11-30 14:25 26M 
[   ]cmake-3.7.1-Darwin-x86_64.tar.gz2016-11-30 14:25 25M 
[TXT]cmake-3.7.1-Linux-x86_64.sh2016-11-30 14:25 29M 
[   ]cmake-3.7.1-Linux-x86_64.tar.gz2016-11-30 14:25 29M 
[TXT]cmake-3.7.1-SHA-256.txt2016-11-30 14:25 1.0K 
[TXT]cmake-3.7.1-SHA-256.txt.asc2016-11-30 14:25 833  
[   ]cmake-3.7.1-win32-x86.msi2016-11-30 14:25 15M 
[   ]cmake-3.7.1-win32-x86.zip2016-11-30 14:25 21M 
[   ]cmake-3.7.1-win64-x64.msi2016-11-30 14:24 17M 
[   ]cmake-3.7.1-win64-x64.zip2016-11-30 14:24 24M 
[   ]cmake-3.7.1.tar.Z2016-11-30 14:24 11M 
[   ]cmake-3.7.1.tar.gz2016-11-30 14:24 7.0M 
[   ]cmake-3.7.1.zip2016-11-30 14:24 11M 
[   ]cmake-3.7.2-Darwin-x86_64.dmg2017-01-13 14:13 26M 
[   ]cmake-3.7.2-Darwin-x86_64.tar.gz2017-01-13 14:13 25M 
[TXT]cmake-3.7.2-Linux-x86_64.sh2017-01-13 14:13 29M 
[   ]cmake-3.7.2-Linux-x86_64.tar.gz2017-01-13 14:13 29M 
[TXT]cmake-3.7.2-SHA-256.txt2017-01-13 14:13 1.0K 
[TXT]cmake-3.7.2-SHA-256.txt.asc2017-01-13 14:13 833  
[   ]cmake-3.7.2-win32-x86.msi2017-01-13 14:13 15M 
[   ]cmake-3.7.2-win32-x86.zip2017-01-13 14:12 21M 
[   ]cmake-3.7.2-win64-x64.msi2017-01-13 14:12 17M 
[   ]cmake-3.7.2-win64-x64.zip2017-01-13 14:12 24M 
[   ]cmake-3.7.2.tar.Z2017-01-13 14:12 11M 
[   ]cmake-3.7.2.tar.gz2017-01-13 14:12 7.0M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.8.0-Darwin-x86_64.dmg2017-04-10 13:39 26M 
[   ]cmake-3.8.0-Darwin-x86_64.tar.gz2017-04-10 13:39 26M 
[TXT]cmake-3.8.0-Linux-x86_64.sh2017-04-10 13:39 31M 
[   ]cmake-3.8.0-Linux-x86_64.tar.gz2017-04-10 13:39 31M 
[TXT]cmake-3.8.0-SHA-256.txt2017-04-10 13:39 1.0K 
[TXT]cmake-3.8.0-SHA-256.txt.asc2017-04-10 13:39 833  
[   ]cmake-3.8.0-rc1-Darwin-x86_64.dmg2017-02-07 12:54 26M 
[   ]cmake-3.8.0-rc1-Darwin-x86_64.tar.gz2017-02-07 12:54 26M 
[TXT]cmake-3.8.0-rc1-Linux-x86_64.sh2017-02-07 12:54 31M 
[   ]cmake-3.8.0-rc1-Linux-x86_64.tar.gz2017-02-07 12:54 31M 
[TXT]cmake-3.8.0-rc1-SHA-256.txt2017-02-07 12:54 1.0K 
[TXT]cmake-3.8.0-rc1-SHA-256.txt.asc2017-02-07 12:54 833  
[   ]cmake-3.8.0-rc1-win32-x86.msi2017-02-07 12:54 15M 
[   ]cmake-3.8.0-rc1-win32-x86.zip2017-02-07 12:54 21M 
[   ]cmake-3.8.0-rc1-win64-x64.msi2017-02-07 12:54 18M 
[   ]cmake-3.8.0-rc1-win64-x64.zip2017-02-07 12:54 24M 
[   ]cmake-3.8.0-rc1.tar.Z2017-02-07 12:54 12M 
[   ]cmake-3.8.0-rc1.tar.gz2017-02-07 12:54 7.1M 
[   ]cmake-3.8.0-rc1.zip2017-02-07 12:54 12M 
[   ]cmake-3.8.0-rc2-Darwin-x86_64.dmg2017-03-03 10:00 26M 
[   ]cmake-3.8.0-rc2-Darwin-x86_64.tar.gz2017-03-03 10:00 26M 
[TXT]cmake-3.8.0-rc2-Linux-x86_64.sh2017-03-03 10:00 31M 
[   ]cmake-3.8.0-rc2-Linux-x86_64.tar.gz2017-03-03 09:59 31M 
[TXT]cmake-3.8.0-rc2-SHA-256.txt2017-03-03 09:59 1.0K 
[TXT]cmake-3.8.0-rc2-SHA-256.txt.asc2017-03-03 09:59 833  
[   ]cmake-3.8.0-rc2-win32-x86.msi2017-03-03 09:59 16M 
[   ]cmake-3.8.0-rc2-win32-x86.zip2017-03-03 09:59 22M 
[   ]cmake-3.8.0-rc2-win64-x64.msi2017-03-03 09:59 18M 
[   ]cmake-3.8.0-rc2-win64-x64.zip2017-03-03 09:59 24M 
[   ]cmake-3.8.0-rc2.tar.Z2017-03-03 09:59 12M 
[   ]cmake-3.8.0-rc2.tar.gz2017-03-03 09:59 7.2M 
[   ]cmake-3.8.0-rc2.zip2017-03-03 09:59 12M 
[   ]cmake-3.8.0-rc3-Darwin-x86_64.dmg2017-03-24 13:52 26M 
[   ]cmake-3.8.0-rc3-Darwin-x86_64.tar.gz2017-03-24 13:52 26M 
[TXT]cmake-3.8.0-rc3-Linux-x86_64.sh2017-03-24 13:52 31M 
[   ]cmake-3.8.0-rc3-Linux-x86_64.tar.gz2017-03-24 13:52 31M 
[TXT]cmake-3.8.0-rc3-SHA-256.txt2017-03-24 13:52 1.0K 
[TXT]cmake-3.8.0-rc3-SHA-256.txt.asc2017-03-24 13:52 833  
[   ]cmake-3.8.0-rc3-win32-x86.msi2017-03-24 13:52 16M 
[   ]cmake-3.8.0-rc3-win32-x86.zip2017-03-24 13:52 22M 
[   ]cmake-3.8.0-rc3-win64-x64.msi2017-03-24 13:52 18M 
[   ]cmake-3.8.0-rc3-win64-x64.zip2017-03-24 13:52 24M 
[   ]cmake-3.8.0-rc3.tar.Z2017-03-24 13:52 12M 
[   ]cmake-3.8.0-rc3.tar.gz2017-03-24 13:52 7.2M 
[   ]cmake-3.8.0-rc3.zip2017-03-24 13:52 12M 
[   ]cmake-3.8.0-rc4-Darwin-x86_64.dmg2017-03-30 11:38 26M 
[   ]cmake-3.8.0-rc4-Darwin-x86_64.tar.gz2017-03-30 11:38 26M 
[TXT]cmake-3.8.0-rc4-Linux-x86_64.sh2017-03-30 11:38 31M 
[   ]cmake-3.8.0-rc4-Linux-x86_64.tar.gz2017-03-30 11:38 31M 
[TXT]cmake-3.8.0-rc4-SHA-256.txt2017-03-30 11:38 1.0K 
[TXT]cmake-3.8.0-rc4-SHA-256.txt.asc2017-03-30 11:38 833  
[   ]cmake-3.8.0-rc4-win32-x86.msi2017-03-30 11:38 16M 
[   ]cmake-3.8.0-rc4-win32-x86.zip2017-03-30 11:38 22M 
[   ]cmake-3.8.0-rc4-win64-x64.msi2017-03-30 11:38 18M 
[   ]cmake-3.8.0-rc4-win64-x64.zip2017-03-30 11:38 24M 
[   ]cmake-3.8.0-rc4.tar.Z2017-03-30 11:38 12M 
[   ]cmake-3.8.0-rc4.tar.gz2017-03-30 11:38 7.2M 
[   ]cmake-3.8.0-rc4.zip2017-03-30 11:38 12M 
[   ]cmake-3.8.0-win32-x86.msi2017-04-10 13:39 16M 
[   ]cmake-3.8.0-win32-x86.zip2017-04-10 13:39 22M 
[   ]cmake-3.8.0-win64-x64.msi2017-04-10 13:39 18M 
[   ]cmake-3.8.0-win64-x64.zip2017-04-10 13:38 24M 
[   ]cmake-3.8.0.tar.Z2017-04-10 13:38 12M 
[   ]cmake-3.8.0.tar.gz2017-04-10 13:38 7.2M 
[   ]cmake-3.8.0.zip2017-04-10 13:38 12M 
[   ]cmake-3.8.1-Darwin-x86_64.dmg2017-05-02 11:06 26M 
[   ]cmake-3.8.1-Darwin-x86_64.tar.gz2017-05-02 11:06 26M 
[TXT]cmake-3.8.1-Linux-x86_64.sh2017-05-02 11:06 31M 
[   ]cmake-3.8.1-Linux-x86_64.tar.gz2017-05-02 11:05 31M 
[TXT]cmake-3.8.1-SHA-256.txt2017-05-02 11:05 1.0K 
[TXT]cmake-3.8.1-SHA-256.txt.asc2017-05-02 11:05 833  
[   ]cmake-3.8.1-win32-x86.msi2017-05-02 11:05 16M 
[   ]cmake-3.8.1-win32-x86.zip2017-05-02 11:05 22M 
[   ]cmake-3.8.1-win64-x64.msi2017-05-02 11:05 18M 
[   ]cmake-3.8.1-win64-x64.zip2017-05-02 11:05 24M 
[   ]cmake-3.8.1.tar.Z2017-05-02 11:05 12M 
[   ]cmake-3.8.1.tar.gz2017-05-02 11:05 7.2M 
[   ]cmake-3.8.1.zip2017-05-02 11:05 12M 
[   ]cmake-3.8.2-Darwin-x86_64.dmg2017-05-31 12:26 26M 
[   ]cmake-3.8.2-Darwin-x86_64.tar.gz2017-05-31 12:26 25M 
[TXT]cmake-3.8.2-Linux-x86_64.sh2017-05-31 12:26 31M 
[   ]cmake-3.8.2-Linux-x86_64.tar.gz2017-05-31 12:26 31M 
[TXT]cmake-3.8.2-SHA-256.txt2017-05-31 12:26 1.0K 
[TXT]cmake-3.8.2-SHA-256.txt.asc2017-05-31 12:26 833  
[   ]cmake-3.8.2-win32-x86.msi2017-05-31 12:26 16M 
[   ]cmake-3.8.2-win32-x86.zip2017-05-31 12:26 22M 
[   ]cmake-3.8.2-win64-x64.msi2017-05-31 12:25 18M 
[   ]cmake-3.8.2-win64-x64.zip2017-05-31 12:25 24M 
[   ]cmake-3.8.2.tar.Z2017-05-31 12:25 12M 
[   ]cmake-3.8.2.tar.gz2017-05-31 12:25 7.2M 
[   ]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/bitbake/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[   ]cmake-3.9.0-Darwin-x86_64.dmg2017-07-18 13:32 26M 
[   ]cmake-3.9.0-Darwin-x86_64.tar.gz2017-07-18 13:32 25M 
[TXT]cmake-3.9.0-Linux-x86_64.sh2017-07-18 13:32 31M 
[   ]cmake-3.9.0-Linux-x86_64.tar.gz2017-07-18 13:32 31M 
[TXT]cmake-3.9.0-SHA-256.txt2017-07-18 13:32 1.0K 
[TXT]cmake-3.9.0-SHA-256.txt.asc2017-07-18 13:32 833  
[   ]cmake-3.9.0-rc1-Darwin-x86_64.dmg2017-06-05 14:48 26M 
[   ]cmake-3.9.0-rc1-Darwin-x86_64.tar.gz2017-06-05 14:48 25M 
[TXT]cmake-3.9.0-rc1-Linux-x86_64.sh2017-06-05 14:48 31M 
[   ]cmake-3.9.0-rc1-Linux-x86_64.tar.gz2017-06-05 14:48 31M 
[TXT]cmake-3.9.0-rc1-SHA-256.txt2017-06-05 14:48 1.0K 
[TXT]cmake-3.9.0-rc1-SHA-256.txt.asc2017-06-05 14:47 833  
[   ]cmake-3.9.0-rc1-win32-x86.msi2017-06-05 14:47 16M 
[   ]cmake-3.9.0-rc1-win32-x86.zip2017-06-05 14:47 22M 
[   ]cmake-3.9.0-rc1-win64-x64.msi2017-06-05 14:47 18M 
[   ]cmake-3.9.0-rc1-win64-x64.zip2017-06-05 14:47 25M 
[   ]cmake-3.9.0-rc1.tar.Z2017-06-05 14:47 12M 
[   ]cmake-3.9.0-rc1.tar.gz2017-06-05 14:47 7.3M 
[   ]cmake-3.9.0-rc1.zip2017-06-05 14:47 12M 
[   ]cmake-3.9.0-rc2-Darwin-x86_64.dmg2017-06-07 14:46 26M 
[   ]cmake-3.9.0-rc2-Darwin-x86_64.tar.gz2017-06-07 14:46 25M 
[TXT]cmake-3.9.0-rc2-Linux-x86_64.sh2017-06-07 14:46 31M 
[   ]cmake-3.9.0-rc2-Linux-x86_64.tar.gz2017-06-07 14:46 31M 
[TXT]cmake-3.9.0-rc2-SHA-256.txt2017-06-07 14:46 1.0K 
[TXT]cmake-3.9.0-rc2-SHA-256.txt.asc2017-06-07 14:46 833  
[   ]cmake-3.9.0-rc2-win32-x86.msi2017-06-07 14:46 16M 
[   ]cmake-3.9.0-rc2-win32-x86.zip2017-06-07 14:46 22M 
[   ]cmake-3.9.0-rc2-win64-x64.msi2017-06-07 14:46 18M 
[   ]cmake-3.9.0-rc2-win64-x64.zip2017-06-07 14:46 25M 
[   ]cmake-3.9.0-rc2.tar.Z2017-06-07 14:46 12M 
[   ]cmake-3.9.0-rc2.tar.gz2017-06-07 14:46 7.3M 
[   ]cmake-3.9.0-rc2.zip2017-06-07 14:46 12M 
[   ]cmake-3.9.0-rc3-Darwin-x86_64.dmg2017-06-13 14:02 26M 
[   ]cmake-3.9.0-rc3-Darwin-x86_64.tar.gz2017-06-13 14:02 25M 
[TXT]cmake-3.9.0-rc3-Linux-x86_64.sh2017-06-13 14:02 31M 
[   ]cmake-3.9.0-rc3-Linux-x86_64.tar.gz2017-06-13 14:02 31M 
[TXT]cmake-3.9.0-rc3-SHA-256.txt2017-06-13 14:02 1.0K 
[TXT]cmake-3.9.0-rc3-SHA-256.txt.asc2017-06-13 14:02 833  
[   ]cmake-3.9.0-rc3-win32-x86.msi2017-06-13 14:02 16M 
[   ]cmake-3.9.0-rc3-win32-x86.zip2017-06-13 14:02 22M 
[   ]cmake-3.9.0-rc3-win64-x64.msi2017-06-13 14:01 18M 
[   ]cmake-3.9.0-rc3-win64-x64.zip2017-06-13 14:01 25M 
[   ]cmake-3.9.0-rc3.tar.Z2017-06-13 14:01 12M 
[   ]cmake-3.9.0-rc3.tar.gz2017-06-13 14:01 7.3M 
[   ]cmake-3.9.0-rc3.zip2017-06-13 14:01 12M 
[   ]cmake-3.9.0-rc4-Darwin-x86_64.dmg2017-06-22 13:27 26M 
[   ]cmake-3.9.0-rc4-Darwin-x86_64.tar.gz2017-06-22 13:27 25M 
[TXT]cmake-3.9.0-rc4-Linux-x86_64.sh2017-06-22 13:27 31M 
[   ]cmake-3.9.0-rc4-Linux-x86_64.tar.gz2017-06-22 13:27 31M 
[TXT]cmake-3.9.0-rc4-SHA-256.txt2017-06-22 13:27 1.0K 
[TXT]cmake-3.9.0-rc4-SHA-256.txt.asc2017-06-22 13:26 833  
[   ]cmake-3.9.0-rc4-win32-x86.msi2017-06-22 13:26 16M 
[   ]cmake-3.9.0-rc4-win32-x86.zip2017-06-22 13:26 22M 
[   ]cmake-3.9.0-rc4-win64-x64.msi2017-06-22 13:26 18M 
[   ]cmake-3.9.0-rc4-win64-x64.zip2017-06-22 13:26 25M 
[   ]cmake-3.9.0-rc4.tar.Z2017-06-22 13:26 12M 
[   ]cmake-3.9.0-rc4.tar.gz2017-06-22 13:26 7.3M 
[   ]cmake-3.9.0-rc4.zip2017-06-22 13:26 12M 
[   ]cmake-3.9.0-rc5-Darwin-x86_64.dmg2017-06-27 13:56 26M 
[   ]cmake-3.9.0-rc5-Darwin-x86_64.tar.gz2017-06-27 13:56 25M 
[TXT]cmake-3.9.0-rc5-Linux-x86_64.sh2017-06-27 13:56 31M 
[   ]cmake-3.9.0-rc5-Linux-x86_64.tar.gz2017-06-27 13:56 31M 
[TXT]cmake-3.9.0-rc5-SHA-256.txt2017-06-27 13:56 1.0K 
[TXT]cmake-3.9.0-rc5-SHA-256.txt.asc2017-06-27 13:56 833  
[   ]cmake-3.9.0-rc5-win32-x86.msi2017-06-27 13:56 16M 
[   ]cmake-3.9.0-rc5-win32-x86.zip2017-06-27 13:56 22M 
[   ]cmake-3.9.0-rc5-win64-x64.msi2017-06-27 13:56 18M 
[   ]cmake-3.9.0-rc5-win64-x64.zip2017-06-27 13:56 25M 
[   ]cmake-3.9.0-rc5.tar.Z2017-06-27 13:55 12M 
[   ]cmake-3.9.0-rc5.tar.gz2017-06-27 13:55 7.3M 
[   ]cmake-3.9.0-rc5.zip2017-06-27 13:55 12M 
[   ]cmake-3.9.0-rc6-Darwin-x86_64.dmg2017-07-12 11:46 26M 
[   ]cmake-3.9.0-rc6-Darwin-x86_64.tar.gz2017-07-12 11:46 25M 
[TXT]cmake-3.9.0-rc6-Linux-x86_64.sh2017-07-12 11:46 31M 
[   ]cmake-3.9.0-rc6-Linux-x86_64.tar.gz2017-07-12 11:46 31M 
[TXT]cmake-3.9.0-rc6-SHA-256.txt2017-07-12 11:46 1.0K 
[TXT]cmake-3.9.0-rc6-SHA-256.txt.asc2017-07-12 11:46 833  
[   ]cmake-3.9.0-rc6-win32-x86.msi2017-07-12 11:46 16M 
[   ]cmake-3.9.0-rc6-win32-x86.zip2017-07-12 11:45 22M 
[   ]cmake-3.9.0-rc6-win64-x64.msi2017-07-12 11:45 18M 
[   ]cmake-3.9.0-rc6-win64-x64.zip2017-07-12 11:45 25M 
[   ]cmake-3.9.0-rc6.tar.Z2017-07-12 11:45 12M 
[   ]cmake-3.9.0-rc6.tar.gz2017-07-12 11:45 7.3M 
[   ]cmake-3.9.0-rc6.zip2017-07-12 11:45 12M 
[   ]cmake-3.9.0-win32-x86.msi2017-07-18 13:32 16M 
[   ]cmake-3.9.0-win32-x86.zip2017-07-18 13:32 22M 
[   ]cmake-3.9.0-win64-x64.msi2017-07-18 13:32 18M 
[   ]cmake-3.9.0-win64-x64.zip2017-07-18 13:31 25M 
[   ]cmake-3.9.0.tar.Z2017-07-18 13:31 12M 
[   ]cmake-3.9.0.tar.gz2017-07-18 13:31 7.3M 
[   ]cmake-3.9.0.zip2017-07-18 13:31 12M 
[   ]cmake-3.9.1-Darwin-x86_64.dmg2017-08-10 11:49 26M 
[   ]cmake-3.9.1-Darwin-x86_64.tar.gz2017-08-10 11:49 25M 
[TXT]cmake-3.9.1-Linux-x86_64.sh2017-08-10 11:49 31M 
[   ]cmake-3.9.1-Linux-x86_64.tar.gz2017-08-10 11:49 31M 
[TXT]cmake-3.9.1-SHA-256.txt2017-08-10 11:49 1.0K 
[TXT]cmake-3.9.1-SHA-256.txt.asc2017-08-10 11:49 833  
[   ]cmake-3.9.1-win32-x86.msi2017-08-10 11:49 16M 
[   ]cmake-3.9.1-win32-x86.zip2017-08-10 11:49 22M 
[   ]cmake-3.9.1-win64-x64.msi2017-08-10 11:49 18M 
[   ]cmake-3.9.1-win64-x64.zip2017-08-10 11:49 25M 
[   ]cmake-3.9.1.tar.Z2017-08-10 11:49 12M 
[   ]cmake-3.9.1.tar.gz2017-08-10 11:49 7.3M 
[   ]cmake-3.9.1.zip2017-08-10 11:49 12M 
[   ]cmake-3.9.2-Darwin-x86_64.dmg2017-09-07 15:55 26M 
[   ]cmake-3.9.2-Darwin-x86_64.tar.gz2017-09-07 15:54 25M 
[TXT]cmake-3.9.2-Linux-x86_64.sh2017-09-07 15:54 31M 
[   ]cmake-3.9.2-Linux-x86_64.tar.gz2017-09-07 15:54 31M 
[TXT]cmake-3.9.2-SHA-256.txt2017-09-07 15:54 1.0K 
[TXT]cmake-3.9.2-SHA-256.txt.asc2017-09-07 15:54 833  
[   ]cmake-3.9.2-win32-x86.msi2017-09-07 15:54 16M 
[   ]cmake-3.9.2-win32-x86.zip2017-09-07 15:54 22M 
[   ]cmake-3.9.2-win64-x64.msi2017-09-07 15:54 18M 
[   ]cmake-3.9.2-win64-x64.zip2017-09-07 15:54 25M 
[   ]cmake-3.9.2.tar.Z2017-09-07 15:54 12M 
[   ]cmake-3.9.2.tar.gz2017-09-07 15:54 7.3M 
[   ]cmake-3.9.2.zip2017-09-07 15:54 12M 
[   ]cmake-3.9.3-Darwin-x86_64.dmg2017-09-20 11:59 26M 
[   ]cmake-3.9.3-Darwin-x86_64.tar.gz2017-09-20 11:59 25M 
[TXT]cmake-3.9.3-Linux-x86_64.sh2017-09-20 11:59 31M 
[   ]cmake-3.9.3-Linux-x86_64.tar.gz2017-09-20 11:59 31M 
[TXT]cmake-3.9.3-SHA-256.txt2017-09-20 11:59 1.0K 
[TXT]cmake-3.9.3-SHA-256.txt.asc2017-09-20 11:59 833  
[   ]cmake-3.9.3-win32-x86.msi2017-09-20 11:59 16M 
[   ]cmake-3.9.3-win32-x86.zip2017-09-20 11:59 22M 
[   ]cmake-3.9.3-win64-x64.msi2017-09-20 11:59 18M 
[   ]cmake-3.9.3-win64-x64.zip2017-09-20 11:59 25M 
[   ]cmake-3.9.3.tar.Z2017-09-20 11:59 12M 
[   ]cmake-3.9.3.tar.gz2017-09-20 11:59 7.3M 
[   ]cmake-3.9.3.zip2017-09-20 11:59 12M 
[   ]cmake-3.9.4-Darwin-x86_64.dmg2017-10-04 09:43 26M 
[   ]cmake-3.9.4-Darwin-x86_64.tar.gz2017-10-04 09:43 25M 
[TXT]cmake-3.9.4-Linux-x86_64.sh2017-10-04 09:43 31M 
[   ]cmake-3.9.4-Linux-x86_64.tar.gz2017-10-04 09:43 31M 
[TXT]cmake-3.9.4-SHA-256.txt2017-10-04 09:43 1.0K 
[TXT]cmake-3.9.4-SHA-256.txt.asc2017-10-04 09:42 833  
[   ]cmake-3.9.4-win32-x86.msi2017-10-04 09:42 16M 
[   ]cmake-3.9.4-win32-x86.zip2017-10-04 09:42 22M 
[   ]cmake-3.9.4-win64-x64.msi2017-10-04 09:42 18M 
[   ]cmake-3.9.4-win64-x64.zip2017-10-04 09:42 25M 
[   ]cmake-3.9.4.tar.Z2017-10-04 09:42 12M 
[   ]cmake-3.9.4.tar.gz2017-10-04 09:42 7.3M 
[   ]cmake-3.9.4.zip2017-10-04 09:42 12M 
[   ]cmake-3.9.5-Darwin-x86_64.dmg2017-11-03 10:26 26M 
[   ]cmake-3.9.5-Darwin-x86_64.tar.gz2017-11-03 10:26 25M 
[TXT]cmake-3.9.5-Linux-x86_64.sh2017-11-03 10:26 31M 
[   ]cmake-3.9.5-Linux-x86_64.tar.gz2017-11-03 10:26 31M 
[TXT]cmake-3.9.5-SHA-256.txt2017-11-03 10:26 1.0K 
[TXT]cmake-3.9.5-SHA-256.txt.asc2017-11-03 10:26 833  
[   ]cmake-3.9.5-win32-x86.msi2017-11-03 10:26 16M 
[   ]cmake-3.9.5-win32-x86.zip2017-11-03 10:26 22M 
[   ]cmake-3.9.5-win64-x64.msi2017-11-03 10:26 18M 
[   ]cmake-3.9.5-win64-x64.zip2017-11-03 10:26 25M 
[   ]cmake-3.9.5.tar.Z2017-11-03 10:26 12M 
[   ]cmake-3.9.5.tar.gz2017-11-03 10:26 7.3M 
[   ]cmake-3.9.5.zip2017-11-03 10:26 12M 
[   ]cmake-3.9.6-Darwin-x86_64.dmg2017-11-10 09:22 26M 
[   ]cmake-3.9.6-Darwin-x86_64.tar.gz2017-11-10 09:21 25M 
[TXT]cmake-3.9.6-Linux-x86_64.sh2017-11-10 09:21 31M 
[   ]cmake-3.9.6-Linux-x86_64.tar.gz2017-11-10 09:21 31M 
[TXT]cmake-3.9.6-SHA-256.txt2017-11-10 09:21 1.0K 
[TXT]cmake-3.9.6-SHA-256.txt.asc2017-11-10 09:21 833  
[   ]cmake-3.9.6-win32-x86.msi2017-11-10 09:21 16M 
[   ]cmake-3.9.6-win32-x86.zip2017-11-10 09:21 22M 
[   ]cmake-3.9.6-win64-x64.msi2017-11-10 09:21 18M 
[   ]cmake-3.9.6-win64-x64.zip2017-11-10 09:21 25M 
[   ]cmake-3.9.6.tar.Z2017-11-10 09:21 12M 
[   ]cmake-3.9.6.tar.gz2017-11-10 09:21 7.3M 
[   ]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/util-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/util-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/util-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                     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/util-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/util-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/util-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/util-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/util-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/util-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/util-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/util-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/util-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/util-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.bz2.md5                  17-Oct-2012 21:53                  64
+eglibc-2.16-svnr21224.tar.bz2.sha1                 17-Oct-2012 21:53                  72
+eglibc-2.17-svnr22064.tar.bz2                      04-Jan-2013 05:44            17565519
+eglibc-2.17-svnr22064.tar.bz2.asc                  04-Jan-2013 05:45                 302
+eglibc-2.17-svnr22064.tar.bz2.md5                  04-Jan-2013 05:44                  64
+eglibc-2.17-svnr22064.tar.bz2.sha1                 04-Jan-2013 05:44                  72
+eglibc-2.18-svnr23787.tar.bz2                      21-Aug-2013 05:36            17862773
+eglibc-2.18-svnr23787.tar.bz2.asc                  21-Aug-2013 05:36                 302
+eglibc-2.18-svnr23787.tar.bz2.md5                  21-Aug-2013 05:36                  64
+eglibc-2.18-svnr23787.tar.bz2.sha1                 21-Aug-2013 05:36                  72
+eglibc-2.19-svnr25243.tar.bz2                      08-Feb-2014 10:06            18873620
+eglibc-2.19-svnr25243.tar.bz2.asc                  08-Feb-2014 10:06                 285
+eglibc-2.19-svnr25243.tar.bz2.md5                  08-Feb-2014 10:06                  64
+eglibc-2.19-svnr25243.tar.bz2.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/xserver/index.html b/bitbake/lib/bb/tests/fetch-testdata/releases/individual/xserver/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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

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

Index of /software/pulseaudio/releases

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[PARENTDIR]Parent Directory  -  
[DIR]bad/2014-01-26 17:50 -  
[   ]polypaudio-0.1.tar.gz2008-03-28 21:16 387K 
[   ]polypaudio-0.1.tar.gz.md52011-05-29 11:28 56  
[   ]polypaudio-0.1.tar.gz.sha12011-05-29 11:28 64  
[   ]polypaudio-0.2.tar.gz2008-03-28 21:16 460K 
[   ]polypaudio-0.2.tar.gz.md52011-05-29 11:28 56  
[   ]polypaudio-0.2.tar.gz.sha12011-05-29 11:28 64  
[   ]polypaudio-0.3.tar.gz2008-03-28 21:16 470K 
[   ]polypaudio-0.3.tar.gz.md52011-05-29 11:28 56  
[   ]polypaudio-0.3.tar.gz.sha12011-05-29 11:28 64  
[   ]polypaudio-0.4.tar.gz2008-03-28 21:16 486K 
[   ]polypaudio-0.4.tar.gz.md52011-05-29 11:28 56  
[   ]polypaudio-0.4.tar.gz.sha12011-05-29 11:28 64  
[   ]polypaudio-0.5.1.tar.gz2008-03-28 21:16 524K 
[   ]polypaudio-0.5.1.tar.gz.md52011-05-29 11:28 58  
[   ]polypaudio-0.5.1.tar.gz.sha12011-05-29 11:28 66  
[   ]polypaudio-0.5.tar.gz2008-03-28 21:16 518K 
[   ]polypaudio-0.5.tar.gz.md52011-05-29 11:28 56  
[   ]polypaudio-0.5.tar.gz.sha12011-05-29 11:28 64  
[   ]polypaudio-0.6.tar.gz2008-03-28 21:16 448K 
[   ]polypaudio-0.6.tar.gz.md52011-05-29 11:28 56  
[   ]polypaudio-0.6.tar.gz.sha12011-05-29 11:28 64  
[   ]polypaudio-0.7.tar.gz2008-03-28 21:16 924K 
[   ]polypaudio-0.7.tar.gz.md52011-05-29 11:28 56  
[   ]polypaudio-0.7.tar.gz.sha12011-05-29 11:28 64  
[   ]polypaudio-0.8.1.tar.gz2008-03-28 21:16 1.1M 
[   ]polypaudio-0.8.1.tar.gz.md52011-05-29 11:28 58  
[   ]polypaudio-0.8.1.tar.gz.sha12011-05-29 11:28 66  
[   ]polypaudio-0.8.tar.gz2008-03-28 21:16 1.1M 
[   ]polypaudio-0.8.tar.gz.md52011-05-29 11:28 56  
[   ]polypaudio-0.8.tar.gz.sha12011-05-29 11:28 64  
[   ]polypaudio-0.9.0.tar.gz2008-03-28 21:16 1.1M 
[   ]polypaudio-0.9.0.tar.gz.md52011-05-29 11:28 58  
[   ]polypaudio-0.9.0.tar.gz.sha12011-05-29 11:28 66  
[   ]polypaudio-0.9.1.tar.gz2008-03-28 21:16 1.1M 
[   ]polypaudio-0.9.1.tar.gz.md52011-05-29 11:28 58  
[   ]polypaudio-0.9.1.tar.gz.sha12011-05-29 11:28 66  
[   ]pulseaudio-0.9.2.tar.gz2008-03-28 21:16 1.0M 
[   ]pulseaudio-0.9.2.tar.gz.md52011-05-29 11:28 58  
[   ]pulseaudio-0.9.2.tar.gz.sha12011-05-29 11:28 66  
[   ]pulseaudio-0.9.3.tar.gz2008-03-28 21:16 1.1M 
[   ]pulseaudio-0.9.3.tar.gz.md52011-05-29 11:28 58  
[   ]pulseaudio-0.9.3.tar.gz.sha12011-05-29 11:28 66  
[   ]pulseaudio-0.9.4.tar.gz2008-03-28 21:16 1.1M 
[   ]pulseaudio-0.9.4.tar.gz.md52011-05-29 11:28 58  
[   ]pulseaudio-0.9.4.tar.gz.sha12011-05-29 11:28 66  
[   ]pulseaudio-0.9.5.tar.gz2008-03-28 21:16 1.1M 
[   ]pulseaudio-0.9.5.tar.gz.md52011-05-29 11:28 58  
[   ]pulseaudio-0.9.5.tar.gz.sha12011-05-29 11:28 66  
[   ]pulseaudio-0.9.6.tar.gz2008-03-28 21:16 1.1M 
[   ]pulseaudio-0.9.6.tar.gz.md52011-05-29 11:28 58  
[   ]pulseaudio-0.9.6.tar.gz.sha12011-05-29 11:28 66  
[   ]pulseaudio-0.9.7.tar.gz2008-03-28 21:16 1.0M 
[   ]pulseaudio-0.9.7.tar.gz.md52011-05-29 11:28 58  
[   ]pulseaudio-0.9.7.tar.gz.sha12011-05-29 11:28 66  
[   ]pulseaudio-0.9.8.tar.gz2008-03-28 21:16 1.0M 
[   ]pulseaudio-0.9.8.tar.gz.md52011-05-29 11:28 58  
[   ]pulseaudio-0.9.8.tar.gz.sha12011-05-29 11:28 66  
[   ]pulseaudio-0.9.9.tar.gz2008-03-28 21:16 1.0M 
[   ]pulseaudio-0.9.9.tar.gz.md52011-05-29 11:28 58  
[   ]pulseaudio-0.9.9.tar.gz.sha12011-05-29 11:28 66  
[   ]pulseaudio-0.9.10.tar.gz2008-03-30 16:30 1.0M 
[   ]pulseaudio-0.9.10.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.10.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.11.tar.gz2008-07-24 12:41 1.1M 
[   ]pulseaudio-0.9.11.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.11.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.12.tar.gz2008-09-09 00:17 1.2M 
[   ]pulseaudio-0.9.12.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.12.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.13.tar.gz2008-10-06 01:43 1.2M 
[   ]pulseaudio-0.9.13.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.13.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.14.tar.gz2009-01-12 23:09 1.2M 
[   ]pulseaudio-0.9.14.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.14.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.15.tar.gz2009-04-13 23:24 1.6M 
[   ]pulseaudio-0.9.15.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.15.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.16-test1.tar.gz2009-06-23 17:16 1.8M 
[   ]pulseaudio-0.9.16-test1.tar.gz.md52011-05-29 11:28 65  
[   ]pulseaudio-0.9.16-test1.tar.gz.sha12011-05-29 11:28 73  
[   ]pulseaudio-0.9.16.tar.gz2009-09-10 00:49 1.9M 
[   ]pulseaudio-0.9.16.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.16.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.17.tar.gz2009-09-11 01:32 1.9M 
[   ]pulseaudio-0.9.17.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.17.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.18.tar.gz2009-09-19 00:43 1.9M 
[   ]pulseaudio-0.9.18.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.18.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.19.tar.gz2009-09-30 01:30 1.9M 
[   ]pulseaudio-0.9.19.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.19.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.20.tar.gz2009-11-11 05:10 2.0M 
[   ]pulseaudio-0.9.20.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.20.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.21.tar.gz2009-11-23 04:23 2.0M 
[   ]pulseaudio-0.9.21.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.21.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.22.tar.gz2010-11-26 01:12 2.0M 
[   ]pulseaudio-0.9.22.tar.gz.md52011-05-29 11:28 59  
[   ]pulseaudio-0.9.22.tar.gz.sha12011-05-29 11:28 67  
[   ]pulseaudio-0.9.23.tar.gz2011-06-23 21:13 2.0M 
[   ]pulseaudio-0.9.23.tar.gz.md52011-06-23 21:13 59  
[   ]pulseaudio-0.9.23.tar.gz.sha12011-06-23 21:13 67  
[   ]pulseaudio-0.99.1.tar.gz2011-08-02 21:59 2.2M 
[   ]pulseaudio-0.99.1.tar.gz.md52011-08-02 21:59 59  
[   ]pulseaudio-0.99.1.tar.gz.sha12011-08-02 21:59 67  
[   ]pulseaudio-0.99.2.tar.gz2011-08-16 10:19 2.2M 
[   ]pulseaudio-0.99.2.tar.gz.md52011-08-16 10:19 59  
[   ]pulseaudio-0.99.2.tar.gz.sha12011-08-16 10:19 67  
[   ]pulseaudio-0.99.3.tar.gz2011-08-29 17:11 2.2M 
[   ]pulseaudio-0.99.3.tar.gz.md52011-08-29 17:11 59  
[   ]pulseaudio-0.99.3.tar.gz.sha12011-08-29 17:11 67  
[   ]pulseaudio-0.99.4.tar.gz2011-09-15 11:04 2.2M 
[   ]pulseaudio-0.99.4.tar.gz.md52011-09-15 11:04 59  
[   ]pulseaudio-0.99.4.tar.gz.sha12011-09-15 11:04 67  
[   ]pulseaudio-1.0.tar.gz2011-09-27 08:54 2.1M 
[   ]pulseaudio-1.0.tar.gz.md52011-09-27 08:54 56  
[   ]pulseaudio-1.0.tar.gz.sha12011-09-27 08:54 64  
[   ]pulseaudio-1.0.tar.xz2011-09-27 08:54 1.2M 
[   ]pulseaudio-1.0.tar.xz.md52011-09-27 08:54 56  
[   ]pulseaudio-1.0.tar.xz.sha12011-09-27 08:54 64  
[   ]pulseaudio-1.1.tar.gz2011-10-20 13:25 2.1M 
[   ]pulseaudio-1.1.tar.gz.md52011-10-20 13:25 56  
[   ]pulseaudio-1.1.tar.gz.sha12011-10-20 13:25 64  
[   ]pulseaudio-1.1.tar.xz2011-10-20 13:25 1.2M 
[   ]pulseaudio-1.1.tar.xz.md52011-10-20 13:25 56  
[   ]pulseaudio-1.1.tar.xz.sha12011-10-20 13:25 64  
[   ]pulseaudio-1.99.1.tar.gz2012-03-15 12:50 2.2M 
[   ]pulseaudio-1.99.1.tar.gz.md52012-03-15 12:50 59  
[   ]pulseaudio-1.99.1.tar.gz.sha12012-03-15 12:50 67  
[   ]pulseaudio-1.99.1.tar.xz2012-03-15 12:50 1.3M 
[   ]pulseaudio-1.99.1.tar.xz.md52012-03-15 12:50 59  
[   ]pulseaudio-1.99.1.tar.xz.sha12012-03-15 12:50 67  
[   ]pulseaudio-2.0.tar.gz2012-05-11 13:48 2.2M 
[   ]pulseaudio-2.0.tar.gz.md52012-05-11 13:48 56  
[   ]pulseaudio-2.0.tar.gz.sha12012-05-11 13:48 64  
[   ]pulseaudio-2.0.tar.xz2012-05-11 13:48 1.3M 
[   ]pulseaudio-2.0.tar.xz.md52012-05-11 13:48 56  
[   ]pulseaudio-2.0.tar.xz.sha12012-05-11 13:48 64  
[   ]pulseaudio-2.1.tar.gz2012-07-19 12:09 2.2M 
[   ]pulseaudio-2.1.tar.gz.md52012-07-19 12:09 56  
[   ]pulseaudio-2.1.tar.gz.sha12012-07-19 12:09 64  
[   ]pulseaudio-2.1.tar.xz2012-07-19 12:09 1.3M 
[   ]pulseaudio-2.1.tar.xz.md52012-07-19 12:09 56  
[   ]pulseaudio-2.1.tar.xz.sha12012-07-19 12:09 64  
[   ]pulseaudio-2.99.1.tar.gz2012-11-03 11:44 2.3M 
[   ]pulseaudio-2.99.1.tar.gz.md52012-11-03 11:45 59  
[   ]pulseaudio-2.99.1.tar.gz.sha12012-11-03 11:45 67  
[   ]pulseaudio-2.99.1.tar.xz2012-11-03 11:44 1.3M 
[   ]pulseaudio-2.99.1.tar.xz.md52012-11-03 11:46 59  
[   ]pulseaudio-2.99.1.tar.xz.sha12012-11-03 11:46 67  
[   ]pulseaudio-2.99.2.tar.gz2012-11-17 08:21 2.3M 
[   ]pulseaudio-2.99.2.tar.gz.md52012-11-17 08:22 59  
[   ]pulseaudio-2.99.2.tar.gz.sha12012-11-17 08:22 67  
[   ]pulseaudio-2.99.2.tar.xz2012-11-17 08:21 1.3M 
[   ]pulseaudio-2.99.2.tar.xz.md52012-11-17 08:22 59  
[   ]pulseaudio-2.99.2.tar.xz.sha12012-11-17 08:22 67  
[   ]pulseaudio-2.99.3.tar.gz2012-12-07 04:07 2.3M 
[   ]pulseaudio-2.99.3.tar.gz.md52012-12-07 04:07 59  
[   ]pulseaudio-2.99.3.tar.gz.sha12012-12-07 04:07 67  
[   ]pulseaudio-2.99.3.tar.xz2012-12-07 04:07 1.3M 
[   ]pulseaudio-2.99.3.tar.xz.md52012-12-07 04:07 59  
[   ]pulseaudio-2.99.3.tar.xz.sha12012-12-07 04:07 67  
[   ]pulseaudio-3.0.tar.gz2012-12-18 07:22 2.3M 
[   ]pulseaudio-3.0.tar.gz.md52012-12-18 07:22 56  
[   ]pulseaudio-3.0.tar.gz.sha12012-12-18 07:22 64  
[   ]pulseaudio-3.0.tar.xz2012-12-18 07:22 1.3M 
[   ]pulseaudio-3.0.tar.xz.md52012-12-18 07:22 56  
[   ]pulseaudio-3.0.tar.xz.sha12012-12-18 07:22 64  
[   ]pulseaudio-3.99.1.tar.gz2013-04-16 04:10 2.3M 
[   ]pulseaudio-3.99.1.tar.gz.md52013-04-16 04:10 59  
[   ]pulseaudio-3.99.1.tar.gz.sha12013-04-16 04:10 67  
[   ]pulseaudio-3.99.1.tar.xz2013-04-16 04:10 1.3M 
[   ]pulseaudio-3.99.1.tar.xz.md52013-04-16 04:10 59  
[   ]pulseaudio-3.99.1.tar.xz.sha12013-04-16 04:10 67  
[   ]pulseaudio-3.99.2.tar.gz2013-05-23 03:26 2.3M 
[   ]pulseaudio-3.99.2.tar.gz.md52013-05-23 03:26 59  
[   ]pulseaudio-3.99.2.tar.gz.sha12013-05-23 03:26 67  
[   ]pulseaudio-3.99.2.tar.xz2013-05-23 03:26 1.3M 
[   ]pulseaudio-3.99.2.tar.xz.md52013-05-23 03:26 59  
[   ]pulseaudio-3.99.2.tar.xz.sha12013-05-23 03:26 67  
[   ]pulseaudio-4.0.tar.gz2013-06-03 18:52 2.3M 
[   ]pulseaudio-4.0.tar.gz.md52013-06-03 18:52 56  
[   ]pulseaudio-4.0.tar.gz.sha12013-06-03 18:52 64  
[   ]pulseaudio-4.0.tar.xz2013-06-03 18:52 1.3M 
[   ]pulseaudio-4.0.tar.xz.md52013-06-03 18:52 56  
[   ]pulseaudio-4.0.tar.xz.sha12013-06-03 18:52 64  
[   ]pulseaudio-4.99.2.tar.gz2014-01-23 19:10 2.4M 
[   ]pulseaudio-4.99.2.tar.gz.md52014-01-23 19:10 59  
[   ]pulseaudio-4.99.2.tar.gz.sha12014-01-23 19:10 67  
[   ]pulseaudio-4.99.2.tar.xz2014-01-23 19:10 1.4M 
[   ]pulseaudio-4.99.2.tar.xz.md52014-01-23 19:10 59  
[   ]pulseaudio-4.99.2.tar.xz.sha12014-01-23 19:10 67  
[   ]pulseaudio-4.99.3.tar.gz2014-01-29 20:16 2.4M 
[   ]pulseaudio-4.99.3.tar.gz.md52014-01-29 20:16 59  
[   ]pulseaudio-4.99.3.tar.gz.sha12014-01-29 20:16 67  
[   ]pulseaudio-4.99.3.tar.xz2014-01-29 20:16 1.4M 
[   ]pulseaudio-4.99.3.tar.xz.md52014-01-29 20:16 59  
[   ]pulseaudio-4.99.3.tar.xz.sha12014-01-29 20:16 67  
[   ]pulseaudio-4.99.4.tar.gz2014-02-15 06:04 2.5M 
[   ]pulseaudio-4.99.4.tar.gz.md52014-02-15 06:04 59  
[   ]pulseaudio-4.99.4.tar.gz.sha12014-02-15 06:04 67  
[   ]pulseaudio-4.99.4.tar.xz2014-02-15 06:04 1.4M 
[   ]pulseaudio-4.99.4.tar.xz.md52014-02-15 06:04 59  
[   ]pulseaudio-4.99.4.tar.xz.sha12014-02-15 06:04 67  
[   ]pulseaudio-5.0.tar.gz2014-03-03 15:00 2.4M 
[   ]pulseaudio-5.0.tar.gz.md52014-03-03 15:00 56  
[   ]pulseaudio-5.0.tar.gz.sha12014-03-03 15:00 64  
[   ]pulseaudio-5.0.tar.xz2014-03-03 15:00 1.4M 
[   ]pulseaudio-5.0.tar.xz.md52014-03-03 15:00 56  
[   ]pulseaudio-5.0.tar.xz.sha12014-03-03 15:00 64  
[   ]pulseaudio-5.99.1.tar.gz2014-11-21 14:26 2.5M 
[   ]pulseaudio-5.99.1.tar.gz.md52014-11-21 14:26 59  
[   ]pulseaudio-5.99.1.tar.gz.sha12014-11-21 14:26 67  
[   ]pulseaudio-5.99.1.tar.xz2014-11-21 14:27 1.4M 
[   ]pulseaudio-5.99.1.tar.xz.md52014-11-21 14:27 59  
[   ]pulseaudio-5.99.1.tar.xz.sha12014-11-21 14:27 67  
[   ]pulseaudio-5.99.2.tar.gz2014-12-19 13:08 2.5M 
[   ]pulseaudio-5.99.2.tar.gz.md52014-12-19 13:08 59  
[   ]pulseaudio-5.99.2.tar.gz.sha12014-12-19 13:08 67  
[   ]pulseaudio-5.99.2.tar.xz2014-12-19 13:08 1.4M 
[   ]pulseaudio-5.99.2.tar.xz.md52014-12-19 13:08 59  
[   ]pulseaudio-5.99.2.tar.xz.sha12014-12-19 13:08 67  
[   ]pulseaudio-5.99.3.tar.gz2015-01-21 14:45 2.5M 
[   ]pulseaudio-5.99.3.tar.gz.md52015-01-21 14:45 59  
[   ]pulseaudio-5.99.3.tar.gz.sha12015-01-21 14:45 67  
[   ]pulseaudio-5.99.3.tar.xz2015-01-21 14:45 1.4M 
[   ]pulseaudio-5.99.3.tar.xz.md52015-01-21 14:45 59  
[   ]pulseaudio-5.99.3.tar.xz.sha12015-01-21 14:45 67  
[   ]pulseaudio-6.0.tar.gz2015-02-12 19:02 2.5M 
[   ]pulseaudio-6.0.tar.gz.md52015-02-12 19:02 56  
[   ]pulseaudio-6.0.tar.gz.sha12015-02-12 19:02 64  
[   ]pulseaudio-6.0.tar.xz2015-02-12 19:02 1.4M 
[   ]pulseaudio-6.0.tar.xz.md52015-02-12 19:02 56  
[   ]pulseaudio-6.0.tar.xz.sha12015-02-12 19:02 64  
[   ]pulseaudio-6.99.1.tar.gz2015-08-27 17:56 2.6M 
[   ]pulseaudio-6.99.1.tar.gz.md52015-08-27 17:56 59  
[   ]pulseaudio-6.99.1.tar.gz.sha12015-08-27 17:56 67  
[   ]pulseaudio-6.99.1.tar.xz2015-08-27 17:56 1.4M 
[   ]pulseaudio-6.99.1.tar.xz.md52015-08-27 17:56 59  
[   ]pulseaudio-6.99.1.tar.xz.sha12015-08-27 17:56 67  
[   ]pulseaudio-6.99.2.tar.gz2015-09-12 13:56 2.6M 
[   ]pulseaudio-6.99.2.tar.gz.md52015-09-12 13:56 59  
[   ]pulseaudio-6.99.2.tar.gz.sha12015-09-12 13:56 67  
[   ]pulseaudio-6.99.2.tar.xz2015-09-12 13:56 1.4M 
[   ]pulseaudio-6.99.2.tar.xz.md52015-09-12 13:56 59  
[   ]pulseaudio-6.99.2.tar.xz.sha12015-09-12 13:56 67  
[   ]pulseaudio-7.0.tar.gz2015-09-24 03:31 2.6M 
[   ]pulseaudio-7.0.tar.gz.md5sum2015-09-24 03:31 56  
[   ]pulseaudio-7.0.tar.gz.sha1sum2015-09-24 03:31 64  
[   ]pulseaudio-7.0.tar.xz2015-09-24 03:31 1.4M 
[   ]pulseaudio-7.0.tar.xz.md52015-09-24 03:31 56  
[   ]pulseaudio-7.0.tar.xz.md5sum2015-09-24 03:31 56  
[   ]pulseaudio-7.0.tar.xz.sha12015-09-24 03:31 64  
[   ]pulseaudio-7.0.tar.xz.sha1sum2015-09-24 03:31 64  
[   ]pulseaudio-7.1.tar.gz2015-10-30 12:51 2.6M 
[   ]pulseaudio-7.1.tar.gz.md52015-10-30 12:51 56  
[   ]pulseaudio-7.1.tar.gz.sha12015-10-30 12:51 64  
[   ]pulseaudio-7.1.tar.xz2015-10-30 12:51 1.4M 
[   ]pulseaudio-7.1.tar.xz.md52015-10-30 12:51 56  
[   ]pulseaudio-7.1.tar.xz.sha12015-10-30 12:51 64  
[   ]pulseaudio-7.99.1.tar.gz2015-12-28 12:38 2.6M 
[   ]pulseaudio-7.99.1.tar.gz.md52015-12-28 12:38 59  
[   ]pulseaudio-7.99.1.tar.gz.sha12015-12-28 12:38 67  
[   ]pulseaudio-7.99.1.tar.xz2015-12-28 12:39 1.4M 
[   ]pulseaudio-7.99.1.tar.xz.md52015-12-28 12:39 59  
[   ]pulseaudio-7.99.1.tar.xz.sha12015-12-28 12:39 67  
[   ]pulseaudio-7.99.2.tar.gz2016-01-12 03:28 2.6M 
[   ]pulseaudio-7.99.2.tar.gz.md52016-01-12 03:28 59  
[   ]pulseaudio-7.99.2.tar.gz.sha12016-01-12 03:28 67  
[   ]pulseaudio-7.99.2.tar.xz2016-01-12 03:28 1.4M 
[   ]pulseaudio-7.99.2.tar.xz.md52016-01-12 03:28 59  
[   ]pulseaudio-7.99.2.tar.xz.sha12016-01-12 03:28 67  
[   ]pulseaudio-8.0.tar.gz2016-01-22 07:38 2.6M 
[   ]pulseaudio-8.0.tar.gz.md52016-01-22 07:38 56  
[   ]pulseaudio-8.0.tar.gz.sha12016-01-22 07:38 64  
[   ]pulseaudio-8.0.tar.xz2016-01-22 07:38 1.4M 
[   ]pulseaudio-8.0.tar.xz.md52016-01-22 07:38 56  
[   ]pulseaudio-8.0.tar.xz.sha12016-01-22 07:38 64  
[   ]pulseaudio-8.99.1.tar.gz2016-05-12 10:58 2.6M 
[   ]pulseaudio-8.99.1.tar.gz.md52016-05-12 10:58 59  
[   ]pulseaudio-8.99.1.tar.gz.sha12016-05-12 10:58 67  
[   ]pulseaudio-8.99.1.tar.xz2016-05-12 10:58 1.5M 
[   ]pulseaudio-8.99.1.tar.xz.md52016-05-12 10:58 59  
[   ]pulseaudio-8.99.1.tar.xz.sha12016-05-12 10:58 67  
[   ]pulseaudio-8.99.2.tar.gz2016-05-29 06:08 2.6M 
[   ]pulseaudio-8.99.2.tar.gz.md52016-05-29 06:08 59  
[   ]pulseaudio-8.99.2.tar.gz.sha12016-05-29 06:08 67  
[   ]pulseaudio-8.99.2.tar.xz2016-05-29 06:08 1.5M 
[   ]pulseaudio-8.99.2.tar.xz.md52016-05-29 06:08 59  
[   ]pulseaudio-8.99.2.tar.xz.sha12016-05-29 06:08 67  
[   ]pulseaudio-9.0.tar.gz2016-06-22 07:09 2.6M 
[   ]pulseaudio-9.0.tar.gz.md52016-06-22 07:09 56  
[   ]pulseaudio-9.0.tar.gz.sha12016-06-22 07:09 64  
[   ]pulseaudio-9.0.tar.xz2016-06-22 07:09 1.5M 
[   ]pulseaudio-9.0.tar.xz.md52016-06-22 07:09 56  
[   ]pulseaudio-9.0.tar.xz.sha12016-06-22 07:09 64  
[   ]pulseaudio-9.99.1.tar.gz2017-01-03 16:14 2.7M 
[   ]pulseaudio-9.99.1.tar.gz.md52017-01-03 16:14 59  
[   ]pulseaudio-9.99.1.tar.gz.sha12017-01-03 16:14 67  
[   ]pulseaudio-9.99.1.tar.xz2017-01-03 16:14 1.5M 
[   ]pulseaudio-9.99.1.tar.xz.md52017-01-03 16:14 59  
[   ]pulseaudio-9.99.1.tar.xz.sha12017-01-03 16:14 67  
[   ]pulseaudio-10.0.tar.gz2017-01-19 00:12 2.7M 
[   ]pulseaudio-10.0.tar.gz.md52017-01-19 00:12 57  
[   ]pulseaudio-10.0.tar.gz.sha12017-01-19 00:12 65  
[   ]pulseaudio-10.0.tar.xz2017-01-19 00:12 1.5M 
[   ]pulseaudio-10.0.tar.xz.md52017-01-19 00:12 57  
[   ]pulseaudio-10.0.tar.xz.sha12017-01-19 00:12 65  
[   ]pulseaudio-10.99.1.tar.gz2017-07-24 23:52 2.8M 
[   ]pulseaudio-10.99.1.tar.gz.md52017-07-24 23:52 60  
[   ]pulseaudio-10.99.1.tar.gz.sha12017-07-24 23:52 68  
[   ]pulseaudio-10.99.1.tar.xz2017-07-24 23:52 1.6M 
[   ]pulseaudio-10.99.1.tar.xz.md52017-07-24 23:52 60  
[   ]pulseaudio-10.99.1.tar.xz.sha12017-07-24 23:52 68  
[   ]pulseaudio-11.0.tar.gz2017-09-05 09:49 2.8M 
[   ]pulseaudio-11.0.tar.gz.md52017-09-05 09:49 57  
[   ]pulseaudio-11.0.tar.gz.sha12017-09-05 09:49 65  
[   ]pulseaudio-11.0.tar.xz2017-09-05 09:49 1.6M 
[   ]pulseaudio-11.0.tar.xz.md52017-09-05 09:49 57  
[   ]pulseaudio-11.0.tar.xz.sha12017-09-05 09:49 65  
[   ]pulseaudio-11.1.tar.gz2017-09-18 15:23 2.8M 
[   ]pulseaudio-11.1.tar.gz.md52017-09-18 15:23 57  
[   ]pulseaudio-11.1.tar.gz.sha12017-09-18 15:23 65  
[   ]pulseaudio-11.1.tar.xz2017-09-18 15:23 1.6M 
[   ]pulseaudio-11.1.tar.xz.md52017-09-18 15:23 57  
[   ]pulseaudio-11.1.tar.xz.sha12017-09-18 15:23 65  
[   ]pulseaudio-11.99.1.tar.gz2018-05-13 06:57 2.8M 
[   ]pulseaudio-11.99.1.tar.gz.md52018-05-13 06:57 60  
[   ]pulseaudio-11.99.1.tar.gz.sha12018-05-13 06:57 68  
[   ]pulseaudio-11.99.1.tar.xz2018-05-13 06:57 1.6M 
[   ]pulseaudio-11.99.1.tar.xz.md52018-05-13 06:57 60  
[   ]pulseaudio-11.99.1.tar.xz.sha12018-05-13 06:57 68  
[   ]pulseaudio-12.0.tar.gz2018-06-20 20:33 2.8M 
[   ]pulseaudio-12.0.tar.gz.md52018-06-20 20:33 57  
[   ]pulseaudio-12.0.tar.gz.sha12018-06-20 20:33 65  
[   ]pulseaudio-12.0.tar.xz2018-06-20 20:33 1.6M 
[   ]pulseaudio-12.0.tar.xz.md52018-06-20 20:33 57  
[   ]pulseaudio-12.0.tar.xz.sha12018-06-20 20:33 65  
[   ]pulseaudio-12.1.tar.gz2018-07-14 16:43 2.8M 
[   ]pulseaudio-12.1.tar.gz.md52018-07-14 16:43 57  
[   ]pulseaudio-12.1.tar.gz.sha12018-07-14 16:43 65  
[   ]pulseaudio-12.1.tar.xz2018-07-14 16:43 1.6M 
[   ]pulseaudio-12.1.tar.xz.md52018-07-14 16:43 57  
[   ]pulseaudio-12.1.tar.xz.sha12018-07-14 16:43 65  
[   ]pulseaudio-12.2.tar.gz2018-07-16 16:12 2.8M 
[   ]pulseaudio-12.2.tar.gz.sha2562018-07-16 16:13 89  
[   ]pulseaudio-12.2.tar.xz2018-07-16 16:12 1.6M 
[   ]pulseaudio-12.2.tar.xz.sha2562018-07-16 16:13 89  
[   ]pulseaudio-12.99.1.tar.gz2019-07-09 03:16 3.6M 
[   ]pulseaudio-12.99.1.tar.gz.sha2562019-07-09 03:16 92  
[   ]pulseaudio-12.99.1.tar.xz2019-07-09 03:16 1.8M 
[   ]pulseaudio-12.99.1.tar.xz.sha2562019-07-09 03:16 92  
[   ]pulseaudio-12.99.2.tar.gz2019-08-06 17:47 3.6M 
[   ]pulseaudio-12.99.2.tar.gz.sha2562019-08-06 17:47 92  
[   ]pulseaudio-12.99.2.tar.xz2019-08-06 17:47 1.8M 
[   ]pulseaudio-12.99.2.tar.xz.sha2562019-08-06 17:47 92  
[   ]pulseaudio-12.99.3.tar.gz2019-09-01 07:44 3.6M 
[   ]pulseaudio-12.99.3.tar.gz.sha2562019-09-01 07:44 92  
[   ]pulseaudio-12.99.3.tar.xz2019-09-01 07:44 1.9M 
[   ]pulseaudio-12.99.3.tar.xz.sha2562019-09-01 07:44 92  
[   ]pulseaudio-13.0.tar.gz2019-09-13 13:34 3.6M 
[   ]pulseaudio-13.0.tar.gz.sha2562019-09-13 13:34 89  
[   ]pulseaudio-13.0.tar.xz2019-09-13 13:34 1.8M 
[   ]pulseaudio-13.0.tar.xz.sha2562019-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 def skipIfNoNetwork(): if os.environ.get("BB_SKIP_NETTESTS") == "yes": @@ -1031,7 +1031,7 @@ class SVNTest(FetcherTest): bb.process.run("svn co %s svnfetch_co" % self.repo_url, cwd=self.tempdir) # Github will emulate SVN. Use this to check if we're downloding... - bb.process.run("svn propset svn:externals 'bitbake http://github.com/openembedded/bitbake' .", + bb.process.run("svn propset svn:externals 'bitbake svn://vcs.pcre.org/pcre2/code' .", cwd=os.path.join(self.tempdir, 'svnfetch_co', 'trunk')) bb.process.run("svn commit --non-interactive -m 'Add external'", cwd=os.path.join(self.tempdir, 'svnfetch_co', 'trunk')) @@ -1152,7 +1152,8 @@ class FetchLatestVersionTest(FetcherTest): ("mx-1.0", "git://github.com/clutter-project/mx.git;branch=mx-1.4", "9b1db6b8060bd00b121a692f942404a24ae2960f", "") : "1.99.4", # version pattern "vX.Y" - ("mtd-utils", "git://git.infradead.org/mtd-utils.git", "ca39eb1d98e736109c64ff9c1aa2a6ecca222d8f", "") + # mirror of git.infradead.org since network issues interfered with testing + ("mtd-utils", "git://git.yoctoproject.org/mtd-utils.git", "ca39eb1d98e736109c64ff9c1aa2a6ecca222d8f", "") : "1.5.0", # version pattern "pkg_name-X.Y" ("presentproto", "git://anongit.freedesktop.org/git/xorg/proto/presentproto", "24f3a56e541b0a9e6c6ee76081f441221a120ef9", "") @@ -1180,27 +1181,46 @@ class FetchLatestVersionTest(FetcherTest): } test_wget_uris = { + # # 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/enchant-1.6.0.tar.gz", "", "") + # http://www.abisource.com/downloads/enchant/1.6.0/enchant-1.6.0.tar.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/eglibc-2.18-svnr23787.tar.bz2", "", "") + # + # http://downloads.yoctoproject.org/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2 + ("eglic", "/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2", "", "") : "2.19", - ("gnu-config", "http://downloads.yoctoproject.org/releases/gnu-config/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/releases/pulseaudio-4.0.tar.xz", "", "") + # + # http://freedesktop.org/software/pulseaudio/releases/pulseaudio-4.0.tar.xz + ("pulseaudio", "/software/pulseaudio/releases/pulseaudio-4.0.tar.xz", "", "") : "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-server-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", } @@ -1217,18 +1237,28 @@ class FetchLatestVersionTest(FetcherTest): r = bb.utils.vercmp_string(v, verstring) self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring)) - @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 = bb.fetch2.FetchData(k[1], self.d) - pupver = ud.method.latest_versionstring(ud, self.d) - verstring = pupver[0] - self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0]) - r = bb.utils.vercmp_string(v, verstring) - self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring)) + testdata = os.path.dirname(os.path.abspath(__file__)) + "/fetch-testdata" + server = HTTPService(testdata) + server.start() + port = server.port + try: + for k, v in self.test_wget_uris.items(): + self.d.setVar("PN", k[0]) + checkuri = "" + if k[2]: + checkuri = "http://localhost:%s/" % port + k[2] + self.d.setVar("UPSTREAM_CHECK_URI", checkuri) + self.d.setVar("UPSTREAM_CHECK_REGEX", k[3]) + url = "http://localhost:%s/" % port + k[1] + ud = bb.fetch2.FetchData(url, self.d) + pupver = ud.method.latest_versionstring(ud, self.d) + verstring = pupver[0] + self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0]) + r = bb.utils.vercmp_string(v, verstring) + self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring)) + finally: + server.stop() class FetchCheckStatusTest(FetcherTest): @@ -1662,6 +1692,47 @@ class GitShallowTest(FetcherTest): # Verify the submodule is also shallow self.assertRevCount(1, cwd=os.path.join(self.gitdir, 'gitsubmodule')) + def test_shallow_submodule_mirrors(self): + self.add_empty_file('a') + self.add_empty_file('b') + + smdir = os.path.join(self.tempdir, 'gitsubmodule') + bb.utils.mkdirhier(smdir) + self.git('init', cwd=smdir) + # Make this look like it was cloned from a remote... + self.git('config --add remote.origin.url "%s"' % smdir, cwd=smdir) + self.git('config --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"', cwd=smdir) + self.add_empty_file('asub', cwd=smdir) + self.add_empty_file('bsub', cwd=smdir) + + self.git('submodule init', cwd=self.srcdir) + self.git('submodule add file://%s' % smdir, cwd=self.srcdir) + self.git('submodule update', cwd=self.srcdir) + self.git('commit -m submodule -a', cwd=self.srcdir) + + uri = 'gitsm://%s;protocol=file;subdir=${S}' % self.srcdir + + # Fetch once to generate the shallow tarball + fetcher, ud = self.fetch(uri) + + # Set up the mirror + mirrordir = os.path.join(self.tempdir, 'mirror') + os.rename(self.dldir, mirrordir) + self.d.setVar('PREMIRRORS', 'gitsm://.*/.* file://%s/\n' % mirrordir) + + # Fetch from the mirror + bb.utils.remove(self.dldir, recurse=True) + bb.utils.remove(self.gitdir, recurse=True) + 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=os.path.join(self.gitdir, 'gitsubmodule')) if any(os.path.exists(os.path.join(p, 'git-annex')) for p in os.environ.get('PATH').split(':')): def test_shallow_annex(self): @@ -1863,6 +1934,26 @@ class GitShallowTest(FetcherTest): with self.assertRaises(bb.fetch2.FetchError): self.fetch() + def test_shallow_fetch_missing_revs(self): + self.add_empty_file('a') + self.add_empty_file('b') + fetcher, ud = self.fetch(self.d.getVar('SRC_URI')) + self.git('tag v0.0 master', cwd=self.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 = 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("BitBake.Fetcher", level="ERROR") as cm: + self.fetch_shallow() + self.assertIn("Unable to find revision v0.0 even from upstream", cm.output[0]) + @skipIfNoNetwork() def test_bitbake(self): self.git('remote add --mirror=fetch origin git://github.com/openembedded/bitbake', cwd=self.srcdir) @@ -1988,3 +2079,437 @@ class GitLfsTest(FetcherTest): ud.method._find_git_lfs = lambda d: False shutil.rmtree(self.gitdir, ignore_errors=True) 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 = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' + fetcher = bb.fetch.Fetch([url], self.d) + ud = 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 = os.path.join(self.unpackdir, 'npm') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_bad_checksum(self): + url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' + # Fetch once to get a tarball + fetcher = bb.fetch.Fetch([url], self.d) + ud = fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Modify the tarball + bad = b'bad checksum' + with open(ud.localpath, 'wb') as f: + f.write(bad) + # Verify that the tarball is fetched again + fetcher.download() + badsum = hashlib.sha512(bad).hexdigest() + self.assertTrue(os.path.exists(ud.localpath + '_bad-checksum_' + badsum)) + self.assertTrue(os.path.exists(ud.localpath)) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_premirrors(self): + url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' + # Fetch once to get a tarball + fetcher = bb.fetch.Fetch([url], self.d) + ud = fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Setup the mirror + mirrordir = 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' % mirrordir) + 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 = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' + fetcher = bb.fetch.Fetch([url], self.d) + ud = fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Setup the mirror + mirrordir = 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' % mirrordir) + # Update the resolved url to an invalid url + with open(ud.resolvefile, 'r') as f: + url = f.read() + uri = URI(url) + uri.path = '/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 = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0;destsuffix=foo/bar;downloadfilename=foo-bar.tgz' + fetcher = bb.fetch.Fetch([url], self.d) + fetcher.download() + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'foo-bar.tgz'))) + fetcher.unpack(self.unpackdir) + unpackdir = os.path.join(self.unpackdir, 'foo', 'bar') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json'))) + + def test_npm_no_network_no_tarball(self): + url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' + self.d.setVar('BB_NO_NETWORK', '1') + fetcher = 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 = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' + # Fetch once to get a tarball + fetcher = 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 = os.path.join(self.unpackdir, 'npm') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_registry_alternate(self): + url = 'npm://registry.freajs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' + fetcher = bb.fetch.Fetch([url], self.d) + fetcher.download() + fetcher.unpack(self.unpackdir) + unpackdir = os.path.join(self.unpackdir, 'npm') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_version_latest(self): + url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=latest' + fetcher = bb.fetch.Fetch([url], self.d) + fetcher.download() + fetcher.unpack(self.unpackdir) + unpackdir = os.path.join(self.unpackdir, 'npm') + self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_registry_invalid(self): + url = 'npm://registry.invalid.org;package=@savoirfairelinux/node-server-example;version=1.0.0' + fetcher = bb.fetch.Fetch([url], self.d) + with self.assertRaises(bb.fetch2.FetchError): + fetcher.download() + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_package_invalid(self): + url = 'npm://registry.npmjs.org;package=@savoirfairelinux/invalid;version=1.0.0' + fetcher = bb.fetch.Fetch([url], self.d) + with self.assertRaises(bb.fetch2.FetchError): + fetcher.download() + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_version_invalid(self): + url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=invalid' + with self.assertRaises(bb.fetch2.ParameterError): + fetcher = bb.fetch.Fetch([url], self.d) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_registry_none(self): + url = 'npm://;package=@savoirfairelinux/node-server-example;version=1.0.0' + with self.assertRaises(bb.fetch2.MalformedUrl): + fetcher = bb.fetch.Fetch([url], self.d) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_package_none(self): + url = 'npm://registry.npmjs.org;version=1.0.0' + with self.assertRaises(bb.fetch2.MissingParameterError): + fetcher = bb.fetch.Fetch([url], self.d) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npm_version_none(self): + url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example' + with self.assertRaises(bb.fetch2.MissingParameterError): + fetcher = bb.fetch.Fetch([url], self.d) + + def create_shrinkwrap_file(self, data): + import json + datadir = os.path.join(self.tempdir, 'data') + swfile = 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 = os.path.join(self.unpackdir, 'S') + self.d.setVar('S', self.sdir) + return swfile + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw(self): + swfile = 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=', + 'dependencies': { + 'content-type': { + 'version': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz', + 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==', + 'dependencies': { + 'cookie': { + 'version': 'git+https://github.com/jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09', + 'from': 'git+https://github.com/jshttp/cookie.git' + } + } + } + } + } + } + }) + fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz'))) + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz'))) + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git'))) + fetcher.unpack(self.unpackdir) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'npm-shrinkwrap.json'))) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'package.json'))) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'package.json'))) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'node_modules', 'cookie', 'package.json'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_dev(self): + swfile = 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=' + }, + 'content-type': { + 'version': '1.0.4', + 'resolved': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz', + 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==', + 'dev': True + } + } + }) + # Fetch with dev disabled + fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-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 = bb.fetch.Fetch(['npmsw://' + swfile + ';dev=1'], self.d) + fetcher.download() + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz'))) + self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_destsuffix(self): + swfile = 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=' + } + } + }) + fetcher = bb.fetch.Fetch(['npmsw://' + swfile + ';destsuffix=foo/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 = 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=' + } + } + }) + self.d.setVar('BB_NO_NETWORK', '1') + fetcher = 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 = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d) + fetcher.download() + # Disable network access + self.d.setVar('BB_NO_NETWORK', '1') + # Fetch again + swfile = 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=' + } + } + }) + fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + fetcher.unpack(self.unpackdir) + self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'package.json'))) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_npm_reusability(self): + # Fetch once with npmsw + swfile = 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=' + } + } + }) + fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + # Disable network access + self.d.setVar('BB_NO_NETWORK', '1') + # Fetch again with npm + fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.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 = 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=' + } + } + }) + fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) + with self.assertRaises(bb.fetch2.FetchError): + fetcher.download() + # Fetch correctly to get a tarball + swfile = 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=' + } + } + }) + fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) + fetcher.download() + localpath = os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz') + self.assertTrue(os.path.exists(localpath)) + # Modify the tarball + bad = b'bad checksum' + with open(localpath, 'wb') as f: + f.write(bad) + # Verify that the tarball is fetched again + fetcher.download() + badsum = hashlib.sha1(bad).hexdigest() + self.assertTrue(os.path.exists(localpath + '_bad-checksum_' + badsum)) + self.assertTrue(os.path.exists(localpath)) + + @skipIfNoNpm() + @skipIfNoNetwork() + def test_npmsw_premirrors(self): + # Fetch once to get a tarball + fetcher = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d) + ud = fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Setup the mirror + mirrordir = 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' % mirrordir) + self.d.setVar('BB_FETCH_PREMIRRORONLY', '1') + # Fetch again + self.assertFalse(os.path.exists(ud.localpath)) + swfile = 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=' + } + } + }) + fetcher = 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 = bb.fetch.Fetch(['npm://registry.npmjs.org;package=array-flatten;version=1.1.1'], self.d) + ud = fetcher.ud[fetcher.urls[0]] + fetcher.download() + self.assertTrue(os.path.exists(ud.localpath)) + # Setup the mirror + mirrordir = 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' % mirrordir) + # Fetch again with invalid url + self.assertFalse(os.path.exists(ud.localpath)) + swfile = self.create_shrinkwrap_file({ + 'dependencies': { + 'array-flatten': { + 'version': '1.1.1', + 'resolved': 'https://invalid', + 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' + } + } + }) + fetcher = 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/runqueue.py index 5e64391..4ba12a0 100644 --- a/bitbake/lib/bb/tests/runqueue.py +++ b/bitbake/lib/bb/tests/runqueue.py @@ -7,7 +7,6 @@ # import unittest -import bb import os import tempfile import subprocess @@ -255,7 +254,7 @@ class RunQueueTests(unittest.TestCase): cmd = ["bitbake", "a1", "b1"] tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True) expected = ['a1:populate_sysroot', 'a1:package', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene', - 'a1:package_write_ipk_setscene', 'a1:package_qa_setscene'] + 'a1:package_write_ipk_setscene', 'a1:package_qa_setscene', 'a1:build'] self.assertEqual(set(tasks), set(expected)) self.shutdown(tempdir) diff --git a/bitbake/lib/bb/tests/support/httpserver.py b/bitbake/lib/bb/tests/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='', port=0, logger=None): + self.root_dir = root_dir + self.host = host + self.port = port + if not logger: + logger = logging.getLogger() + self.logger = 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 which doesn't exist" % (self.root_dir)) + return + + self.server = HTTPServer((self.host, self.port), HTTPRequestHandler) + if self.port == 0: + self.port = self.server.server_port + self.process = multiprocessing.Process(target=self.server.server_start, args=[self.root_dir, self.logger]) + + # The signal handler from testimage.bbclass can cause deadlocks here + # if the HTTPServer is terminated before it can restore the standard + #signal behaviour + orig = 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 = bb.utils._check_unsafe_delete_path(arg1) self.assertEqual(result, correctresult, '_check_unsafe_delete_path("%s") != %s' % (arg1, correctresult)) +class Checksum(unittest.TestCase): + filler = b"Shiver me timbers square-rigged spike Gold Road galleon bilge water boatswain wherry jack pirate. Mizzenmast rum lad Privateer jack salmagundi hang the jib piracy Pieces of Eight Corsair. Parrel marooned black 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 = 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 = bb.utils.sha1_file(f.name) + self.assertEqual(checksum, "249eb8fd654732ea836d5e702d7aa567898eca71") + + def test_sha256(self): + import hashlib + with tempfile.NamedTemporaryFile() as f: + f.write(self.filler) + f.flush() + checksum = bb.utils.sha256_file(f.name) + self.assertEqual(checksum, "fcfbae8bf6b721dbb9d2dc6a9334a58f2031a9a9b302999243f99da4d7f12d0f") class EditMetadataFile(unittest.TestCase): _origfile = """ @@ -596,3 +622,47 @@ BBLAYERS += "/home/user/otherpath/layer6" ['/home/user/otherpath/layer6', '/home/user/path/layer3'], ['/home/user/path/layer1', '/home/user/path/layer4', '/home/user/path/layer7'], ['/home/user/path/layer3'], ['/home/user/path/layer7']) + + +class GetReferencedVars(unittest.TestCase): + def setUp(self): + self.d = bb.data.init() + + def check_referenced(self, expression, expected_layers): + vars = bb.utils.get_referenced_vars(expression, self.d) + + # Do the easy check first - is every variable accounted for? + expected_vars = set.union(set(), *expected_layers) + got_vars = set(vars) + self.assertSetEqual(got_vars, expected_vars) + + # Now test the order of the layers + start = 0 + for i, expected_layer in enumerate(expected_layers): + got_layer = set(vars[start:len(expected_layer)+start]) + start += 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"] = "${QT_GIT}/${QT_MODULE}.git;name=${QT_MODULE};${QT_MODULE_BRANCH_PARAM};protocol=${QT_GIT_PROTOCOL}" + self.d["QT_GIT"] = "git://code.qt.io/${QT_GIT_PROJECT}" + self.d["QT_MODULE_BRANCH_PARAM"] = "branch=${QT_MODULE_BRANCH}" + self.d["QT_MODULE"] = "${BPN}" + self.d["BPN"] = "something to do with ${PN} and ${SPECIAL_PKGSUFFIX}" + + layers = [{"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 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, BBMainException +from bb.cookerdata import CookerConfiguration +from bb.main import setup_bitbake, BitBakeConfigParameters import bb.fetch2 @@ -44,66 +45,69 @@ class TinfoilUIException(Exception): class TinfoilCommandFailed(Exception): """Exception raised when run_command fails""" +class TinfoilDataStoreConnectorVarHistory: + def __init__(self, tinfoil, dsindex): + self.tinfoil = tinfoil + self.dsindex = dsindex + + def remoteCommand(self, cmd, *args, **kwargs): + return self.tinfoil.run_command('dataStoreConnectorVarHistCmd', self.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 = partial(self.remoteCommand, name) + setattr(self, name, newfunc) + return newfunc + +class TinfoilDataStoreConnectorIncHistory: + def __init__(self, tinfoil, dsindex): + self.tinfoil = tinfoil + self.dsindex = dsindex + + def remoteCommand(self, cmd, *args, **kwargs): + return self.tinfoil.run_command('dataStoreConnectorIncHistCmd', self.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 = partial(self.remoteCommand, name) + setattr(self, name, newfunc) + return newfunc + class TinfoilDataStoreConnector: - """Connector object used to enable access to datastore objects via tinfoil""" + """ + Connector object used to enable access to datastore objects via tinfoil + Method calls are transmitted to the remote datastore for processing, if a datastore is + returned we return a connector object for the new store + """ def __init__(self, tinfoil, dsindex): self.tinfoil = tinfoil self.dsindex = dsindex - def getVar(self, name): - value = self.tinfoil.run_command('dataStoreConnectorFindVar', self.dsindex, name) - overrides = None - if isinstance(value, dict): - if '_connector_origtype' in value: - value['_content'] = self.tinfoil._reconvert_type(value['_content'], value['_connector_origtype']) - del value['_connector_origtype'] - if '_connector_overrides' in value: - overrides = value['_connector_overrides'] - del value['_connector_overrides'] - return value, overrides - def getKeys(self): - return set(self.tinfoil.run_command('dataStoreConnectorGetKeys', self.dsindex)) - def getVarHistory(self, name): - return self.tinfoil.run_command('dataStoreConnectorGetVarHistory', self.dsindex, name) - def expandPythonRef(self, varname, expr, d): - ds = bb.remotedata.RemoteDatastores.transmit_datastore(d) - ret = self.tinfoil.run_command('dataStoreConnectorExpandPythonRef', ds, varname, expr) + self.varhistory = TinfoilDataStoreConnectorVarHistory(tinfoil, dsindex) + self.inchistory = TinfoilDataStoreConnectorIncHistory(tinfoil, dsindex) + + def remoteCommand(self, cmd, *args, **kwargs): + ret = self.tinfoil.run_command('dataStoreConnectorCmd', self.dsindex, 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.dsindex, 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.dsindex, 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.dsindex, 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 = partial(self.remoteCommand, name) + setattr(self, name, newfunc) + return newfunc + + def __iter__(self): + keys = self.tinfoil.run_command('dataStoreConnectorCmd', self.dsindex, "keys", [], {}) + for k in keys: + yield k class TinfoilCookerAdapter: """ @@ -127,12 +131,13 @@ class TinfoilCookerAdapter: class TinfoilRecipeCacheAdapter: """ cooker.recipecache adapter """ - def __init__(self, tinfoil): + def __init__(self, tinfoil, mc=''): self.tinfoil = tinfoil + self.mc = mc self._cache = {} def get_pkg_pn_fn(self): - pkg_pn = defaultdict(list, self.tinfoil.run_command('getRecipes') or []) + pkg_pn = defaultdict(list, self.tinfoil.run_command('getRecipes', self.mc) or []) pkg_fn = {} 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 == 'deps': - attrvalue = defaultdict(list, self.tinfoil.run_command('getRecipeDepends') or []) + attrvalue = defaultdict(list, self.tinfoil.run_command('getRecipeDepends', self.mc) or []) elif name == 'rundeps': - attrvalue = defaultdict(lambda: defaultdict(list), self.tinfoil.run_command('getRuntimeDepends') or []) + attrvalue = defaultdict(lambda: defaultdict(list), self.tinfoil.run_command('getRuntimeDepends', self.mc) or []) elif name == 'runrecs': - attrvalue = defaultdict(lambda: defaultdict(list), self.tinfoil.run_command('getRuntimeRecommends') or []) + attrvalue = defaultdict(lambda: defaultdict(list), self.tinfoil.run_command('getRuntimeRecommends', self.mc) or []) elif name == 'pkg_pepvpr': - attrvalue = self.tinfoil.run_command('getRecipeVersions') or {} + attrvalue = self.tinfoil.run_command('getRecipeVersions', self.mc) or {} elif name == 'inherits': - attrvalue = self.tinfoil.run_command('getRecipeInherits') or {} + attrvalue = self.tinfoil.run_command('getRecipeInherits', self.mc) or {} elif name == 'bbfile_priority': - attrvalue = self.tinfoil.run_command('getBbFilePriority') or {} + attrvalue = self.tinfoil.run_command('getBbFilePriority', self.mc) or {} elif name == 'pkg_dp': - attrvalue = self.tinfoil.run_command('getDefaultPreference') or {} + attrvalue = self.tinfoil.run_command('getDefaultPreference', self.mc) or {} elif name == 'fn_provides': - attrvalue = self.tinfoil.run_command('getRecipeProvides') or {} + attrvalue = self.tinfoil.run_command('getRecipeProvides', self.mc) or {} elif name == 'packages': - attrvalue = self.tinfoil.run_command('getRecipePackages') or {} + attrvalue = self.tinfoil.run_command('getRecipePackages', self.mc) or {} elif name == 'packages_dynamic': - attrvalue = self.tinfoil.run_command('getRecipePackagesDynamic') or {} + attrvalue = self.tinfoil.run_command('getRecipePackagesDynamic', self.mc) or {} elif name == 'rproviders': - attrvalue = self.tinfoil.run_command('getRProviders') or {} + attrvalue = self.tinfoil.run_command('getRProviders', self.mc) or {} else: raise AttributeError("%s instance has no attribute '%s'" % (self.__class__.__name__, name)) @@ -182,8 +187,9 @@ class TinfoilCookerAdapter: self.tinfoil = tinfoil self.collection = self.TinfoilCookerCollectionAdapter(tinfoil) self.recipecaches = {} - # FIXME all machines self.recipecaches[''] = self.TinfoilRecipeCacheAdapter(tinfoil) + for mc in (tinfoil.config_data.getVar('BBMULTICONFIG') or '').split(): + self.recipecaches[mc] = self.TinfoilRecipeCacheAdapter(tinfoil, mc) self._cache = {} 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 = True - self.config_data = bb.data.init() - connector = TinfoilDataStoreConnector(self, None) - self.config_data.setVar('_remote_data', connector) + self.config_data = TinfoilDataStoreConnector(self, 0) self.cooker = TinfoilCookerAdapter(self) self.cooker_data = self.cooker.recipecaches[''] else: @@ -501,11 +505,11 @@ class Tinfoil: """ return OrderedDict(self.run_command('getSkippedRecipes')) - def get_all_providers(self): - return defaultdict(list, self.run_command('allProviders')) + def get_all_providers(self, mc=''): + return defaultdict(list, self.run_command('allProviders', mc)) - def find_providers(self): - return self.run_command('findProviders') + def find_providers(self, mc=''): + return self.run_command('findProviders', mc) 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 == []: appends = False if config_data: - dctr = bb.remotedata.RemoteDatastores.transmit_datastore(config_data) - dscon = self.run_command('parseRecipeFile', fn, appends, appendlist, dctr) + config_data = bb.data.createCopy(config_data) + dscon = self.run_command('parseRecipeFile', fn, appends, appendlist, config_data.dsindex) else: dscon = self.run_command('parseRecipeFile', fn, appends, appendlist) if dscon: @@ -723,21 +724,9 @@ class Tinfoil: # Borrowed from knotty, instead somewhat hackily we use the helper # as the object to store "shutdown" on helper = bb.ui.uihelper.BBUIHelper() - # We set up logging optionally in the constructor so now we need to - # grab the handlers to pass to TerminalFilter - console = None - errconsole = None - for handler in self.logger.handlers: - if isinstance(handler, logging.StreamHandler): - if handler.stream == sys.stdout: - console = handler - elif handler.stream == sys.stderr: - errconsole = handler - format_str = "%(levelname)s: %(message)s" - format = bb.msg.BBLogFormatter(format_str) helper.shutdown = 0 parseprogress = None - termfilter = bb.ui.knotty.TerminalFilter(helper, helper, console, errconsole, format, quiet=self.quiet) + termfilter = bb.ui.knotty.TerminalFilter(helper, helper, self.logger.handlers, quiet=self.quiet) try: while True: try: @@ -859,9 +848,7 @@ class Tinfoil: newobj = origtype(obj) if isinstance(newobj, bb.command.DataStoreConnectionHandle): - connector = TinfoilDataStoreConnector(self, newobj.dsindex) - newobj = bb.data.init() - newobj.setVar('_remote_data', connector) + newobj = TinfoilDataStoreConnector(self, newobj.dsindex) return newobj diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.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): # only reset the build name if the one on the server is actually # a valid value for the build_name field - if build_name != None: + if build_name is not None: build_info['build_name'] = build_name changed = True @@ -1194,7 +1194,7 @@ class BuildInfoHelper(object): evdata = BuildInfoHelper._get_data_from_event(event) for t in self.internal_state['targets']: - if t.is_image == True: + if t.is_image: output_files = list(evdata.keys()) for output in output_files: if t.target in output and 'rootfs' in output and not output.endswith(".manifest"): @@ -1236,7 +1236,7 @@ class BuildInfoHelper(object): task_information['outcome'] = Task.OUTCOME_PREBUILT else: task_information['task_executed'] = True - if 'noexec' in vars(event) and event.noexec == True: + if 'noexec' in vars(event) and event.noexec: task_information['task_executed'] = False task_information['outcome'] = Task.OUTCOME_EMPTY task_information['script_type'] = Task.CODING_NA @@ -1776,7 +1776,7 @@ class BuildInfoHelper(object): image_file_extensions_unique = {} image_fstypes = self.server.runCommand( ['getVariable', 'IMAGE_FSTYPES'])[0] - if image_fstypes != None: + if image_fstypes is not None: image_types_str = image_fstypes.strip() image_file_extensions = re.sub(r' {2,}', ' ', image_types_str) image_file_extensions_unique = set(image_file_extensions.split(' ')) 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 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 = msg self.extrapos = extrapos if not widgets: - widgets = [progressbar.Percentage(), ' ', progressbar.Bar(), ' ', - progressbar.ETA()] - self.extrapos = 4 + widgets = [': ', progressbar.Percentage(), ' ', progressbar.Bar(), + ' ', progressbar.ETA()] + self.extrapos = 5 if resize_handler: self._resize_default = resize_handler else: self._resize_default = signal.getsignal(signal.SIGWINCH) - progressbar.ProgressBar.__init__(self, maxval, [self.msg + ": "] + widgets, fd=sys.stdout) + progressbar.ProgressBar.__init__(self, maxval, [self.msg] + widgets, fd=sys.stdout) def _handle_resize(self, signum=None, frame=None): progressbar.ProgressBar._handle_resize(self, signum, frame) @@ -110,12 +109,11 @@ def pluralise(singular, plural, qty): class InteractConsoleLogFilter(logging.Filter): - def __init__(self, tf, format): + def __init__(self, tf): self.tf = tf - self.format = format def filter(self, record): - if record.levelno == self.format.NOTE and (record.msg.startswith("Running") or record.msg.startswith("recipe ")): + if record.levelno == bb.msg.BBLogFormatter.NOTE and (record.msg.startswith("Running") or record.msg.startswith("recipe ")): return False self.tf.clearFooter() return True @@ -151,7 +149,7 @@ class TerminalFilter(object): cr = (25, 80) return cr - def __init__(self, main, helper, console, errconsole, format, quiet): + def __init__(self, main, helper, handlers, quiet): self.main = main self.helper = helper self.cuu = 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 = curses.tigetstr("ed") if self.ed: self.cuu = curses.tigetstr("cuu") @@ -197,10 +199,9 @@ class TerminalFilter(object): self.interactive = False bb.note("Unable to use interactive mode for this terminal, using fallback") return - if console: - console.addFilter(InteractConsoleLogFilter(self, format)) - if errconsole: - errconsole.addFilter(InteractConsoleLogFilter(self, format)) + + for h in handlers: + h.addFilter(InteractConsoleLogFilter(self)) self.main_progress = None @@ -255,19 +256,19 @@ class TerminalFilter(object): start_time = activetasks[t].get("starttime", None) if not pbar or pbar.bouncing != (progress < 0): if progress < 0: - pbar = BBProgress("0: %s (pid %s) " % (activetasks[t]["title"], t), 100, widgets=[progressbar.BouncingSlider(), ''], extrapos=2, resize_handler=self.sigwinch_handle) + pbar = BBProgress("0: %s (pid %s)" % (activetasks[t]["title"], activetasks[t]["pid"]), 100, widgets=[' ', progressbar.BouncingSlider(), ''], extrapos=3, resize_handler=self.sigwinch_handle) pbar.bouncing = True else: - pbar = BBProgress("0: %s (pid %s) " % (activetasks[t]["title"], t), 100, widgets=[progressbar.Percentage(), ' ', progressbar.Bar(), ''], extrapos=4, resize_handler=self.sigwinch_handle) + pbar = BBProgress("0: %s (pid %s)" % (activetasks[t]["title"], activetasks[t]["pid"]), 100, widgets=[' ', progressbar.Percentage(), ' ', progressbar.Bar(), ''], extrapos=5, resize_handler=self.sigwinch_handle) pbar.bouncing = False activetasks[t]["progressbar"] = pbar tasks.append((pbar, progress, rate, start_time)) else: start_time = activetasks[t].get("starttime", None) if start_time: - tasks.append("%s - %s (pid %s)" % (activetasks[t]["title"], self.elapsed(currenttime - start_time), t)) + tasks.append("%s - %s (pid %s)" % (activetasks[t]["title"], 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"])) if self.main.shutdown: content = "Waiting for %s running tasks to finish:" % len(activetasks) @@ -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 = 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 _evt_list = [ "bb.runqueue.runQueueExitWait", "bb.event.LogExecTTY", "logging.LogRecord", "bb.build.TaskFailed", "bb.build.TaskBase", "bb.event.ParseStarted", @@ -380,7 +385,148 @@ def main(server, eventHandler, params, tf = TerminalFilter): if not params.observe_only: params.updateToServer(server, os.environ.copy()) - includelogs, loglines, consolelogfile = _log_settings_from_server(server, params.observe_only) + includelogs, loglines, consolelogfile, logconfigfile = _log_settings_from_server(server, params.observe_only) + + loglevel, _ = bb.msg.constructLogOptions() + + if params.options.quiet == 0: + console_loglevel = loglevel + elif params.options.quiet > 2: + console_loglevel = bb.msg.BBLogFormatter.ERROR + else: + console_loglevel = bb.msg.BBLogFormatter.WARNING + + logconfig = { + "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 params.options.show_versions: + logconfig = 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 not + # 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 = 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 = bb.msg.setLoggingConfig(logconfig, logconfigfile) if sys.stdin.isatty() and sys.stdout.isatty(): log_exec_tty = True @@ -389,23 +535,9 @@ def main(server, eventHandler, params, tf = TerminalFilter): helper = uihelper.BBUIHelper() - console = logging.StreamHandler(sys.stdout) - errconsole = logging.StreamHandler(sys.stderr) - format_str = "%(levelname)s: %(message)s" - format = bb.msg.BBLogFormatter(format_str) - if params.options.quiet == 0: - forcelevel = None - elif params.options.quiet > 2: - forcelevel = bb.msg.BBLogFormatter.ERROR - else: - forcelevel = bb.msg.BBLogFormatter.WARNING - bb.msg.addDefaultlogFilter(console, bb.msg.BBLogFilterStdOut, forcelevel) - 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 to the + # terminal handler + console_handlers = [h for h in conf.config['handlers'].values() if getattr(h, 'is_console', False)] bb.utils.set_process_name("KnottyUI") @@ -413,24 +545,14 @@ def main(server, eventHandler, params, tf = TerminalFilter): server.terminateServer() return - consolelog = None - if consolelogfile and not params.options.show_environment and not params.options.show_versions: - bb.utils.mkdirhier(os.path.dirname(consolelogfile)) - conlogformat = bb.msg.BBLogFormatter(format_str) - consolelog = logging.FileHandler(consolelogfile) - bb.msg.addDefaultlogFilter(consolelog) - consolelog.setFormatter(conlogformat) - logger.addHandler(consolelog) - loglink = 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 = bb.msg.constructLogOptions() server.runCommand(["setEventMask", server.getEventHandle(), llevel, debug_domains, _evt_list]) + # 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 = False if not params.observe_only: params.updateFromServer(server) @@ -448,7 +570,7 @@ def main(server, eventHandler, params, tf = TerminalFilter): if error: logger.error("Command '%s' failed: %s" % (cmdline, error)) return 1 - elif ret != True: + elif not ret: logger.error("Command '%s' failed: returned %s" % (cmdline, ret)) return 1 @@ -465,7 +587,7 @@ def main(server, eventHandler, params, tf = TerminalFilter): printinterval = 5000 lastprint = time.time() - termfilter = tf(main, helper, console, errconsole, format, params.options.quiet) + termfilter = tf(main, helper, console_handlers, params.options.quiet) atexit.register(termfilter.finish) while True: @@ -477,7 +599,8 @@ def main(server, eventHandler, params, tf = TerminalFilter): if event is None: if main.shutdown > 1: break - termfilter.updateFooter() + if not parseprogress: + termfilter.updateFooter() event = eventHandler.waitEvent(0.25) if event is None: continue @@ -503,26 +626,26 @@ def main(server, eventHandler, params, tf = TerminalFilter): if isinstance(event, logging.LogRecord): lastprint = time.time() printinterval = 5000 - if event.levelno >= format.ERROR: + if event.levelno >= bb.msg.BBLogFormatter.ERROR: errors = errors + 1 return_value = 1 - elif event.levelno == format.WARNING: + elif event.levelno == bb.msg.BBLogFormatter.WARNING: warnings = warnings + 1 if event.taskpid != 0: # For "normal" logging conditions, don't show note logs from tasks # but do show them if the user has changed the default log level to # include verbose/debug messages - if event.levelno <= format.NOTE and (event.levelno < llevel or (event.levelno == format.NOTE and llevel != format.VERBOSE)): + if event.levelno <= bb.msg.BBLogFormatter.NOTE and (event.levelno < llevel or (event.levelno == bb.msg.BBLogFormatter.NOTE and llevel != bb.msg.BBLogFormatter.VERBOSE)): continue # Prefix task messages with recipe/task - if event.taskpid in helper.running_tasks and event.levelno != format.PLAIN: - taskinfo = helper.running_tasks[event.taskpid] + if event.taskpid in helper.pidmap and event.levelno != bb.msg.BBLogFormatter.PLAIN: + taskinfo = helper.running_tasks[helper.pidmap[event.taskpid]] event.msg = taskinfo['title'] + ': ' + event.msg if hasattr(event, 'fn'): event.msg = event.fn + ': ' + event.msg - logger.handle(event) + logging.getLogger(event.name).handle(event) continue if isinstance(event, bb.build.TaskFailedSilent): @@ -539,6 +662,7 @@ def main(server, eventHandler, params, tf = TerminalFilter): continue if event.total == 0: continue + termfilter.clearFooter() parseprogress = new_progress("Parsing recipes", event.total).start() continue if isinstance(event, bb.event.ParseProgress): @@ -589,6 +713,7 @@ def main(server, eventHandler, params, tf = TerminalFilter): if isinstance(event, bb.command.CommandExit): if not return_value: return_value = event.exitcode + main.shutdown = 2 continue if isinstance(event, (bb.command.CommandCompleted, bb.cooker.CookerExit)): main.shutdown = 2 @@ -638,6 +763,7 @@ def main(server, eventHandler, params, tf = TerminalFilter): if isinstance(event, bb.event.ProcessStarted): if params.options.quiet > 1: continue + termfilter.clearFooter() parseprogress = new_progress(event.processname, event.total) parseprogress.start(False) continue @@ -745,8 +871,6 @@ def main(server, eventHandler, params, tf = TerminalFilter): if e.errno == errno.EPIPE: pass - if consolelog: - logger.removeHandler(consolelog) - consolelog.close() + logging.shutdown() 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 @@ import logging -import os, sys, itertools, time, subprocess +import os, sys, itertools, time try: import curses @@ -46,7 +46,6 @@ except ImportError: import bb import xmlrpc.client -from bb import ui from bb.ui import uihelper parsespin = itertools.cycle( r'|/-\\' ) @@ -239,7 +238,7 @@ class NCursesUI: if error: print("Error running command '%s': %s" % (cmdline, error)) return - elif ret != 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 @@ # 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 @@ -202,7 +207,7 @@ def main(server, eventHandler, params): if error: print("Error running command '%s': %s" % (cmdline, error)) return 1 - elif ret != True: + elif not ret: print("Error running command '%s': returned %s" % (cmdline, ret)) 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 messages. +# See https://www.jetbrains.com/help/teamcity/build-script-interaction-with-teamcity.html +# +# Based on ncurses.py and knotty.py, variously by Michael Lauer and Richard 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 = logging.getLogger("BitBake") + + +class TeamCityUI: + def __init__(self): + self._block_stack = [] + self._last_progress_state = None + + @classmethod + def escape_service_value(cls, value): + """ + Escape a value for inclusion in a service message. TeamCity uses the vertical pipe character for escaping. + See: https://confluence.jetbrains.com/display/TCD10/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-Escapedvalues + """ + return re.sub(r"(['|\[\]])", r"|\1", value).replace("\n", "|n").replace("\r", "|r") + + @classmethod + def emit_service_message(cls, message_type, **kwargs): + print(cls.format_service_message(message_type, **kwargs), flush=True) + + @classmethod + def format_service_message(cls, message_type, **kwargs): + payload = " ".join(["{0}='{1}'".format(k, cls.escape_service_value(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), flush=True) + + @classmethod + def format_simple_service_message(cls, message_type, message): + return "##teamcity[{0} '{1}']".format(message_type, cls.escape_service_value(message)) + + @classmethod + def format_build_message(cls, text, status): + return cls.format_service_message("message", text=text, status=status) + + def block_start(self, name): + self._block_stack.append(name) + self.emit_service_message("blockOpened", name=name) + + def block_end(self): + if self._block_stack: + name = self._block_stack.pop() + self.emit_service_message("blockClosed", name=name) + + def progress(self, message, percent, extra=None): + now = datetime.datetime.now() + percent = "{0: >3.0f}".format(percent) + + report = False + if not self._last_progress_state \ + or (self._last_progress_state[0] == message + and self._last_progress_state[1] != percent + and (now - self._last_progress_state[2]).microseconds >= 5000) \ + or self._last_progress_state[0] != message: + report = True + self._last_progress_state = (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 = "" + if hasattr(record, 'bb_exc_formatted'): + details = ''.join(record.bb_exc_formatted) + elif hasattr(record, 'bb_exc_info'): + etype, value, tb = record.bb_exc_info + formatted = bb.exceptions.format_exception(etype, value, tb, limit=5) + details = ''.join(formatted) + + if record.levelno in [bb.msg.BBLogFormatter.ERROR, bb.msg.BBLogFormatter.CRITICAL]: + # ERROR gets a separate errorDetails field + msg = TeamCityUI.format_service_message("message", text=record.getMessage(), status="ERROR", + errorDetails=details) + else: + payload = record.getMessage() + if details: + payload += "\n" + details + if record.levelno == bb.msg.BBLogFormatter.PLAIN: + msg = payload + elif record.levelno == bb.msg.BBLogFormatter.WARNING: + msg = TeamCityUI.format_service_message("message", text=payload, status="WARNING") + else: + msg = TeamCityUI.format_service_message("message", text=payload, status="NORMAL") + + return msg + + +_evt_list = ["bb.runqueue.runQueueExitWait", "bb.event.LogExecTTY", "logging.LogRecord", + "bb.build.TaskFailed", "bb.build.TaskBase", "bb.event.ParseStarted", + "bb.event.ParseProgress", "bb.event.ParseCompleted", "bb.event.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.runqueue.sceneQueueTaskStarted", + "bb.runqueue.runQueueTaskStarted", "bb.runqueue.runQueueTaskFailed", "bb.runqueue.sceneQueueTaskFailed", + "bb.event.BuildBase", "bb.build.TaskStarted", "bb.build.TaskSucceeded", "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 = server.runCommand(["getVariable", "BBINCLUDELOGS"]) + if error: + logger.error("Unable to get the value of BBINCLUDELOGS variable: %s" % error) + raise BaseException(error) + loglines, error = server.runCommand(["getVariable", "BBINCLUDELOGS_LINES"]) + if error: + logger.error("Unable to get the value of BBINCLUDELOGS_LINES variable: %s" % error) + raise BaseException(error) + return includelogs, loglines + + +def main(server, eventHandler, params): + params.updateToServer(server, os.environ.copy()) + + includelogs, loglines = _log_settings_from_server(server) + + ui = TeamCityUI() + + helper = uihelper.BBUIHelper() + + console = logging.StreamHandler(sys.stdout) + errconsole = logging.StreamHandler(sys.stderr) + format = TeamcityLogFormatter() + if params.options.quiet == 0: + forcelevel = None + elif params.options.quiet > 2: + forcelevel = bb.msg.BBLogFormatter.ERROR + else: + forcelevel = 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 = bb.msg.constructLogOptions() + server.runCommand(["setEventMask", server.getEventHandle(), llevel, debug_domains, _evt_list]) + + try: + params.updateFromServer(server) + cmdline = 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 = cmdline['action'] + ret, error = 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 = None + is_tasks_running = False + + while True: + try: + event = 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 == "No suitable staging package found" or (event.msg.startswith( + "Fetcher failure: Unable to find file") and "downloadfilename" in event.msg and "sstate" in event.msg): + event.levelno = bb.msg.BBLogFormatter.WARNING + if event.taskpid != 0: + # For "normal" logging conditions, don't show note logs from tasks + # but do show them if the user has changed the default log level to + # include verbose/debug messages + if event.levelno <= bb.msg.BBLogFormatter.NOTE and (event.levelno < llevel or ( + event.levelno == bb.msg.BBLogFormatter.NOTE and llevel != bb.msg.BBLogFormatter.VERBOSE)): + continue + + # Prefix task messages with recipe/task + if event.taskpid in helper.running_tasks and event.levelno != bb.msg.BBLogFormatter.PLAIN: + taskinfo = helper.running_tasks[event.taskpid] + event.msg = taskinfo['title'] + ': ' + event.msg + if hasattr(event, 'fn'): + event.msg = 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 = "{0}-{1}:{2}".format(event.pn, event.pv.replace("AUTOINC", "0"), event.task) + + logfile = event.logfile + if not logfile or not os.path.exists(logfile): + TeamCityUI.emit_service_message("buildProblem", description="{0}\nUnknown failure (no log file available)".format(rt)) + if not event.task.endswith("_setscene"): + server.runCommand(["stateForceShutdown"]) + continue + + details = deque(maxlen=loglines) + error_lines = [] + if includelogs and not event.errprinted: + with open(logfile, "r") as f: + while True: + line = f.readline() + if not line: + break + line = line.rstrip() + details.append(' | %s' % line) + # TODO: a less stupid check for errors + if (event.task == "do_compile") and ("error:" in line): + error_lines.append(line) + + if error_lines: + TeamCityUI.emit_service_message("compilationStarted", compiler=rt) + for line in error_lines: + TeamCityUI.emit_service_message("message", text=line, status="ERROR") + TeamCityUI.emit_service_message("compilationFinished", compiler=rt) + else: + TeamCityUI.emit_service_message("buildProblem", description=rt) + + err = "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 than about 63800 characters, so if error + # details is longer than, say, 60000, batch it up into several messages. + first_message = True + while details: + detail_len = 0 + batch = deque() + while details and detail_len < 60000: + # TODO: This code doesn't bother to handle lines that themselves are extremely long. + line = details.popleft() + batch.append(line) + detail_len += len(line) + + if first_message: + batch.appendleft("Log data follows:") + first_message = False + TeamCityUI.emit_service_message("message", text=err, status="ERROR", + errorDetails="\n".join(batch)) + else: + TeamCityUI.emit_service_message("message", text="[continued]", status="ERROR", + errorDetails="\n".join(batch)) + ui.block_end() + else: + TeamCityUI.emit_service_message("message", text=err, status="ERROR", errorDetails="") + + if not event.task.endswith("_setscene"): + server.runCommand(["stateForceShutdown"]) + + if isinstance(event, bb.event.ProcessStarted): + if event.processname in ["Initialising tasks", "Checking sstate mirror object availability"]: + active_process_total = event.total + ui.block_start(event.processname) + if isinstance(event, bb.event.ProcessFinished): + if event.processname in ["Initialising tasks", "Checking sstate 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 availability"] and active_process_total != 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 != 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 revisions") + if isinstance(event, bb.event.ParseProgress): + if event.total != 0: + ui.progress("Parsing recipes", math.floor(event.current * 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 = True + ui.block_start("Running tasks") + if event.stats.total != 0: + ui.progress("Running setscene tasks", ( + event.stats.completed + event.stats.active + event.stats.failed + 1) * 100 / event.stats.total) + if isinstance(event, bb.runqueue.runQueueTaskStarted): + if not is_tasks_running: + is_tasks_running = True + ui.block_start("Running tasks") + if event.stats.total != 0: + pseudo_total = event.stats.total - event.stats.skipped + pseudo_complete = event.stats.completed + event.stats.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_total)) + 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] == 4: + pass + except Exception as ex: + logger.error(str(ex)) + + # except KeyboardInterrupt: + # if shutdown == 2: + # mw.appendText("Third Keyboard Interrupt, exit.\n") + # exitflag = True + # if shutdown == 1: + # mw.appendText("Second Keyboard Interrupt, stopping...\n") + # _, error = server.runCommand(["stateForceShutdown"]) + # if error: + # print("Unable to cleanly stop: %s" % error) + # if shutdown == 0: + # mw.appendText("Keyboard Interrupt, closing down...\n") + # _, error = server.runCommand(["stateShutdown"]) + # if error: + # print("Unable to cleanly shutdown: %s" % error) + # shutdown = shutdown + 1 + # pass diff --git a/bitbake/lib/bb/ui/toasterui.py b/bitbake/lib/bb/ui/toasterui.py 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 != True: + elif not ret: logger.error("Command '%s' failed: returned %s" % (cmdline, ret)) return 1 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 = ret error = "" - if self.EventHandle != None: + if self.EventHandle is not None: break errmsg = "Could not register UI event handler. Error: %s, host %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 = [] self.failed_tasks = [] + self.pidmap = {} self.tasknumber_current = 0 self.tasknumber_total = 0 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 other way to match + def removetid(pid, tid): + self.running_pids.remove(tid) + del self.running_tasks[tid] + if self.pidmap[pid] == tid: + del self.pidmap[pid] + self.needUpdate = True + if isinstance(event, bb.build.TaskStarted): + tid = event._fn + ":" + event._task if event._mc != "default": - self.running_tasks[event.pid] = { 'title' : "mc:%s:%s %s" % (event._mc, event._package, event._task), 'starttime' : time.time() } + self.running_tasks[tid] = { 'title' : "mc:%s:%s %s" % (event._mc, event._package, event._task), 'starttime' : time.time(), 'pid' : event.pid } else: - self.running_tasks[event.pid] = { 'title' : "%s %s" % (event._package, event._task), 'starttime' : time.time() } - self.running_pids.append(event.pid) + self.running_tasks[tid] = { 'title' : "%s %s" % (event._package, event._task), 'starttime' : time.time(), 'pid' : event.pid } + self.running_pids.append(tid) + self.pidmap[event.pid] = tid self.needUpdate = True elif isinstance(event, bb.build.TaskSucceeded): - del self.running_tasks[event.pid] - self.running_pids.remove(event.pid) - self.needUpdate = True + tid = 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 = event._fn + ":" + event._task + removetid(event.pid, tid) # Don't add to the failed tasks list since this is e.g. a setscene task failure - self.needUpdate = True elif isinstance(event, bb.build.TaskFailed): - del self.running_tasks[event.pid] - self.running_pids.remove(event.pid) + tid = event._fn + ":" + event._task + removetid(event.pid, tid) self.failed_tasks.append( { 'title' : "%s %s" % (event._package, event._task)}) - self.needUpdate = True elif isinstance(event, bb.runqueue.runQueueTaskStarted): self.tasknumber_current = event.stats.completed + event.stats.active + event.stats.failed + 1 self.tasknumber_total = event.stats.total self.needUpdate = True elif isinstance(event, bb.build.TaskProgress): - if event.pid > 0: - self.running_tasks[event.pid]['progress'] = event.progress - self.running_tasks[event.pid]['rate'] = event.rate + if event.pid > 0 and event.pid in self.pidmap: + self.running_tasks[self.pidmap[event.pid]]['progress'] = event.progress + self.running_tasks[self.pidmap[event.pid]]['rate'] = event.rate self.needUpdate = 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)) - yield - - for lock in locks: - bb.utils.unlockfile(lock) + try: + yield + finally: + for lock in locks: + bb.utils.unlockfile(lock) @contextmanager def timeout(seconds): @@ -520,22 +520,26 @@ def unlockfile(lf): fcntl.flock(lf.fileno(), fcntl.LOCK_UN) lf.close() -def md5_file(filename): - """ - Return the hex string representation of the MD5 checksum of filename. - """ - import hashlib, mmap +def _hasher(method, filename): + import mmap with open(filename, "rb") as f: - m = hashlib.md5() try: with mmap.mmap(f.fileno(), 0, access=mmap.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) def sha256_file(filename): """ @@ -543,24 +547,28 @@ def sha256_file(filename): filename. """ import hashlib - - s = hashlib.sha256() - with open(filename, "rb") as f: - for line in f: - s.update(line) - return s.hexdigest() + return _hasher(hashlib.sha256(), filename) def sha1_file(filename): """ Return the hex string representation of the SHA1 checksum of the filename """ import hashlib + return _hasher(hashlib.sha1(), filename) - s = 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 filename + """ + import hashlib + return _hasher(hashlib.sha384(), filename) + +def sha512_file(filename): + """ + Return the hex string representation of the SHA512 checksum of the filename + """ + import hashlib + return _hasher(hashlib.sha512(), filename) def preserved_envvars_exported(): """Variables which are taken from the environment and placed in and exported @@ -856,7 +864,7 @@ def copyfile(src, dest, newmtime = None, sstat = None): 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 = set(checkvalues) return ' '.join(sorted(checkvalues & val)) + +def get_referenced_vars(start_expr, d): + """ + :return: names of vars referenced in start_expr (recursively), in quasi-BFS order (variables within the same level + are ordered arbitrarily) + """ + + seen = set() + ret = [] + + # The first entry in the queue is the unexpanded start expression + queue = collections.deque([start_expr]) + # Subsequent entries will be variable names, so we need to track whether or not entry requires getVar + is_first = True + + empty_data = bb.data.init() + while queue: + entry = queue.popleft() + if is_first: + # Entry is the start expression - no expansion needed + is_first = False + expression = entry + else: + # This is a variable name - need to get the value + expression = d.getVar(entry, False) + ret.append(entry) + + # expandWithRefs is how we actually get the referenced variables in the expression. We call it using an empty + # data store because we only want the variables directly used in the expression. It returns a set, which is what + # dooms us to only ever be "quasi-BFS" rather than full BFS. + new_vars = empty_data.expandWithRefs(expression, None).references - set(seen) + + queue.extend(new_vars) + seen.update(new_vars) + return ret + + def cpu_count(): return multiprocessing.cpu_count() @@ -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 = 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.py 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 = tinfoil self.bblayers = (self.tinfoil.config_data.getVar('BBLAYERS') or "").split() - layerconfs = self.tinfoil.config_data.varhistory.get_variable_items_files('BBFILE_COLLECTIONS', self.tinfoil.config_data) + layerconfs = self.tinfoil.config_data.varhistory.get_variable_items_files('BBFILE_COLLECTIONS') self.bbfile_collections = {layer: os.path.dirname(os.path.dirname(path)) for layer, path in layerconfs.items()} @staticmethod diff --git a/bitbake/lib/bblayers/layerindex.py b/bitbake/lib/bblayers/layerindex.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. """ - def get_fetch_layer(self, fetchdir, url, subdir, fetch_layer): + def get_fetch_layer(self, fetchdir, url, subdir, fetch_layer, branch, shallow=False): layername = self.get_layer_name(url) if os.path.splitext(layername)[1] == '.git': layername = os.path.splitext(layername)[0] @@ -32,9 +32,15 @@ class LayerIndexPlugin(ActionPlugin): layerdir = os.path.join(repodir, subdir) if not os.path.exists(repodir): if fetch_layer: - result = subprocess.call(['git', 'clone', url, repodir]) + cmd = ['git', 'clone'] + if shallow: + cmd.extend(['--depth', '1']) + if branch: + cmd.extend(['-b' , branch]) + cmd.extend([url, repodir]) + result = subprocess.call(cmd) if result: - logger.error("Failed to download %s" % url) + logger.error("Failed to download %s (%s)" % (url, branch)) return None, None, None else: return subdir, layername, layerdir @@ -171,7 +177,9 @@ class LayerIndexPlugin(ActionPlugin): subdir, name, layerdir = self.get_fetch_layer(fetchdir, layerBranch.layer.vcs_url, layerBranch.vcs_subdir, - not args.show_only) + not args.show_only, + layerBranch.actual_branch, + args.shallow) if not name: # Error already shown return 1 @@ -204,6 +212,7 @@ class LayerIndexPlugin(ActionPlugin): parser_layerindex_fetch = self.add_command(sp, 'layerindex-fetch', self.do_layerindex_fetch, parserecipes=False) parser_layerindex_fetch.add_argument('-n', '--show-only', help='show dependencies and do nothing else', action='store_true') parser_layerindex_fetch.add_argument('-b', '--branch', help='branch name to fetch') + parser_layerindex_fetch.add_argument('-s', '--shallow', help='do only shallow clones (--depth=1)', action='store_true') parser_layerindex_fetch.add_argument('-i', '--ignore', help='assume the specified layers do not need to be fetched/added (separate multiple layers with commas, no spaces)', metavar='LAYER') parser_layerindex_fetch.add_argument('layername', nargs='+', help='layer to fetch') 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 skipped recipes that are overlayed will also be listed, with a " (skipped)" suffix. """ - items_listed = self.list_recipes('Overlayed recipes', None, True, args.same_version, args.filenames, False, True, None, False, None) + items_listed = self.list_recipes('Overlayed recipes', None, True, args.same_version, args.filenames, False, True, None, False, None, args.mc) # Check for overlayed .bbclass files classes = collections.defaultdict(list) @@ -112,9 +112,9 @@ skipped recipes will also be listed, with a " (skipped)" suffix. title = 'Matching recipes:' else: title = '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, args.mc) - def list_recipes(self, title, pnspec, show_overlayed_only, show_same_ver_only, show_filenames, show_recipes_only, show_multi_provider_only, selected_layer, bare, inherits): + def list_recipes(self, title, pnspec, show_overlayed_only, show_same_ver_only, show_filenames, show_recipes_only, show_multi_provider_only, selected_layer, bare, inherits, mc): if inherits: bbpath = str(self.tinfoil.config_data.getVar('BBPATH')) for classname in inherits: @@ -123,14 +123,18 @@ skipped recipes will also be listed, with a " (skipped)" suffix. logger.error('No class named %s found in BBPATH', classfile) sys.exit(1) - pkg_pn = self.tinfoil.cooker.recipecaches[''].pkg_pn - (latest_versions, preferred_versions) = self.tinfoil.find_providers() - allproviders = self.tinfoil.get_all_providers() + pkg_pn = self.tinfoil.cooker.recipecaches[mc].pkg_pn + (latest_versions, preferred_versions) = self.tinfoil.find_providers(mc) + allproviders = self.tinfoil.get_all_providers(mc) # Ensure we list skipped recipes # We are largely guessing about PN, PV and the preferred version here, # but we have no choice since skipped recipes are not fully parsed skiplist = list(self.tinfoil.cooker.skiplist.keys()) + mcspec = 'mc:%s:' % mc + if mc: + skiplist = [s[len(mcspec):] for s in skiplist if s.startswith(mcspec)] + for fn in skiplist: recipe_parts = os.path.splitext(os.path.basename(fn))[0].split('_') p = 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 extended versions of the # recipe if present (so e.g. in OpenEmbedded, openssl rather than nativesdk-openssl # which would otherwise sort first). - if realfn[1] and realfn[0] in self.tinfoil.cooker.recipecaches[''].pkg_fn: + if realfn[1] and realfn[0] in self.tinfoil.cooker.recipecaches[mc].pkg_fn: continue if inherits: @@ -496,6 +500,7 @@ NOTE: .bbappend files can impact the dependencies. parser_show_overlayed = self.add_command(sp, 'show-overlayed', self.do_show_overlayed) parser_show_overlayed.add_argument('-f', '--filenames', help='instead of the default formatting, list filenames of higher priority recipes with the ones they overlay indented underneath', action='store_true') parser_show_overlayed.add_argument('-s', '--same-version', help='only list overlayed recipes where the version is the same', action='store_true') + parser_show_overlayed.add_argument('--mc', help='use specified multiconfig', default='') parser_show_recipes = self.add_command(sp, 'show-recipes', self.do_show_recipes) parser_show_recipes.add_argument('-f', '--filenames', help='instead of the default formatting, list filenames of higher priority recipes with the ones they overlay indented underneath', action='store_true') @@ -504,6 +509,7 @@ NOTE: .bbappend files can impact the dependencies. parser_show_recipes.add_argument('-i', '--inherits', help='only list recipes that inherit the named class(es) - separate multiple classes using , (without spaces)', metavar='CLASS', default='') parser_show_recipes.add_argument('-l', '--layer', help='only list recipes from the selected layer', default='') parser_show_recipes.add_argument('-b', '--bare', help='output just names without the "(skipped)" marker', action='store_true') + parser_show_recipes.add_argument('--mc', help='use specified multiconfig', default='') parser_show_recipes.add_argument('pnspec', nargs='*', help='optional recipe name specification (wildcards allowed, enclose in quotes to avoid shell expansion)') parser_show_appends = 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 = '' - if eventual_encoding != None: + if eventual_encoding is not None: encoding_part = ' encoding="%s"' % eventual_encoding prefix = '\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__ = [ 'HTML5TreeBuilder', ] -from pdb import set_trace import warnings from bs4.builder import ( PERMISSIVE, @@ -322,7 +321,7 @@ class Element(treebuildersbase.Node): return self.element.contents def getNameTuple(self): - if self.namespace == 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 builder's job. """ __license__ = "MIT" -from pdb import set_trace import codecs from html.entities import codepoint2name import re import logging -import string # Import a library to autodetect character encodings. chardet_type = None @@ -38,12 +36,6 @@ except ImportError: def chardet_dammit(s): return None -# Available from http://cjkpython.i18n.org/. -try: - import iconv_codec -except ImportError: - pass - xml_encoding_re = re.compile( r'^<\?.*encoding=[\'"](.*?)[\'"].*\?>'.encode(), re.I) html_meta_re = 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__ = "MIT" -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__ = "MIT" 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/test_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__ = [ 'additional_tests', ] -import atexit import doctest -import os #from pkg_resources import ( # resource_filename, resource_exists, resource_listdir, cleanup_resources) -import unittest DOCTEST_FLAGS = ( doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE | doctest.REPORT_NDIFF) - # def additional_tests(): # "Run the doc tests (README.txt and docs/*, if any exist)" # doctest_files = [ diff --git a/bitbake/lib/bs4/tests/test_htmlparser.py b/bitbake/lib/bs4/tests/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.""" -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/test_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.""" -import re import warnings try: @@ -14,13 +13,8 @@ except ImportError as e: if LXML_PRESENT: from bs4.builder import LXMLTreeBuilder, LXMLTreeBuilderForXML -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/test_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.""" -from pdb import set_trace import logging import unittest import sys import tempfile -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/test_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 traversed with the methods tested here. """ -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 XML_BUILDER_PRESENT = (builder_registry.lookup("xml") is not None) LXML_PRESENT = (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 UNIX_PREFIX = "unix://" ADDR_TYPE_UNIX = 0 ADDR_TYPE_TCP = 1 +# 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 the +# connection setup with a round trip delay so I'd rather not do that unless it +# is necessary +DEFAULT_MAX_CHUNK = 32 * 1024 def setup_database(database, sync=True): db = sqlite3.connect(database) @@ -66,6 +74,20 @@ def parse_address(addr): return (ADDR_TYPE_TCP, (host, int(port))) +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 = [iter(msg)] * (max_chunk - 1) + for m in map(''.join, itertools.zip_longest(*args, fillvalue='')): + yield ''.join(itertools.chain(m, "\n")) + yield "\n" + + def create_server(addr, dbname, *, sync=True): from . import server db = setup_database(dbname, sync=sync) diff --git a/bitbake/lib/hashserv/client.py b/bitbake/lib/hashserv/client.py 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 # -from contextlib import closing import json import logging import socket import os +from . import chunkify, DEFAULT_MAX_CHUNK logger = logging.getLogger('hashserv.client') @@ -26,6 +26,7 @@ class Client(object): self.reader = None self.writer = None self.mode = self.MODE_NORMAL + self.max_chunk = DEFAULT_MAX_CHUNK def connect_tcp(self, address, port): def connect_sock(): @@ -59,7 +60,7 @@ class Client(object): self.reader = self._socket.makefile('r', encoding='utf-8') self.writer = self._socket.makefile('w', encoding='utf-8') - self.writer.write('OEHASHEQUIV 1.0\n\n') + self.writer.write('OEHASHEQUIV 1.1\n\n') self.writer.flush() # Restore mode if the socket is being re-created @@ -92,18 +93,35 @@ class Client(object): count += 1 def send_message(self, msg): + def get_line(): + line = 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() - l = self.reader.readline() - if not l: - raise HashConnectionError('Connection closed') + l = get_line() - if not l.endswith('\n'): - raise HashConnectionError('Bad message %r' % message) + m = json.loads(l) + if 'chunk-stream' in m: + lines = [] + while True: + l = get_line().rstrip('\n') + if not l: + break + lines.append(l) - return json.loads(l) + m = json.loads(''.join(lines)) + + return m return self._send_wrapper(proc) @@ -148,6 +166,22 @@ class Client(object): m['unihash'] = unihash return self.send_message({'report': m}) + def report_unihash_equiv(self, taskhash, method, unihash, extra={}): + self._set_mode(self.MODE_NORMAL) + m = extra.copy() + m['taskhash'] = taskhash + m['method'] = method + m['unihash'] = unihash + return self.send_message({'report-equiv': m}) + + def get_taskhash(self, method, taskhash, all_properties=False): + 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.py 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 logger = logging.getLogger('hashserv.server') @@ -107,12 +108,29 @@ class Stats(object): return {k: getattr(self, k) for k in ('num', 'total_time', 'max_time', 'average', 'stdev')} +class ClientError(Exception): + pass + class ServerClient(object): + FAST_QUERY = 'SELECT taskhash, method, unihash FROM tasks_v2 WHERE method=:method AND taskhash=:taskhash ORDER BY created ASC LIMIT 1' + ALL_QUERY = 'SELECT * FROM tasks_v2 WHERE method=:method AND taskhash=:taskhash ORDER BY created ASC LIMIT 1' + def __init__(self, reader, writer, db, request_stats): self.reader = reader self.writer = writer self.db = db self.request_stats = request_stats + self.max_chunk = DEFAULT_MAX_CHUNK + + self.handlers = { + '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, + } async def process_requests(self): try: @@ -125,7 +143,11 @@ class ServerClient(object): return (proto_name, proto_version) = protocol.decode('utf-8').rstrip().split() - if proto_name != 'OEHASHEQUIV' or proto_version != '1.0': + if proto_name != 'OEHASHEQUIV': + return + + proto_version = tuple(int(v) for v in proto_version.split('.')) + if proto_version < (1, 0) or proto_version > (1, 1): return # Read headers. Currently, no headers are implemented, so look for @@ -140,39 +162,34 @@ class ServerClient(object): break # Handle messages - handlers = { - '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 = 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() + 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')) async def read_message(self): l = await self.reader.readline() @@ -190,14 +207,38 @@ class ServerClient(object): logger.error('Bad message from client: %r' % message) raise e + async def handle_chunk(self, request): + lines = [] + try: + while True: + l = await self.reader.readline() + l = l.rstrip(b"\n").decode("utf-8") + if not l: + break + lines.append(l) + + msg = 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 = request['method'] taskhash = request['taskhash'] - row = self.query_equivalent(method, taskhash) + if request.get('all', False): + row = self.query_equivalent(method, taskhash, self.ALL_QUERY) + else: + row = self.query_equivalent(method, taskhash, self.FAST_QUERY) + if row is not None: logger.debug('Found equivalent task %s -> %s', (row['taskhash'], row['unihash'])) - d = {k: row[k] for k in ('taskhash', 'method', 'unihash')} + d = {k: row[k] for k in row.keys()} self.write_message(d) else: @@ -227,7 +268,7 @@ class ServerClient(object): (method, taskhash) = l.split() #logger.debug('Looking up %s %s' % (method, taskhash)) - row = self.query_equivalent(method, taskhash) + row = self.query_equivalent(method, taskhash, self.FAST_QUERY) if row is not None: msg = ('%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): self.write_message(d) + async def handle_equivreport(self, data): + with closing(self.db.cursor()) as cursor: + insert_data = { + '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] = 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 mapping + # was already valid) + row = self.query_equivalent(data['method'], data['taskhash'], self.FAST_QUERY) + + if row['unihash'] == data['unihash']: + logger.info('Adding taskhash equivalence for %s with unihash %s', + data['taskhash'], row['unihash']) + + d = {k: row[k] for k in ('taskhash', 'method', 'unihash')} + + self.write_message(d) + + async def handle_get_stats(self, request): d = { 'requests': self.request_stats.todict(), @@ -318,12 +394,11 @@ class ServerClient(object): self.request_stats.reset() self.write_message(d) - 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 = self.db.cursor() - cursor.execute('SELECT taskhash, method, unihash FROM tasks_v2 WHERE method=:method AND taskhash=: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 = self.client.get_unihash(self.METHOD, taskhash) self.assertEqual(result, unihash) + def test_huge_message(self): + # Simple test that hashes can be created + taskhash = 'c665584ee6817aa99edfc77a44dd853828279370' + outhash = '3c979c3db45c569f51ab7626a4651074be3a9d11a84b1db076f5b14f7d39db44' + unihash = '90e9bc1d1f094c51824adca7f8ea79a048d68824' + + result = self.client.get_unihash(self.METHOD, taskhash) + self.assertIsNone(result, msg='Found unexpected task, %r' % result) + + siginfo = "0" * (self.client.max_chunk * 4) + + result = self.client.report_unihash(taskhash, self.METHOD, outhash, unihash, { + 'outhash_siginfo': siginfo + }) + self.assertEqual(result['unihash'], unihash, 'Server returned bad unihash') + + result = 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 = Client(self.server.address) diff --git a/bitbake/lib/layerindexlib/cooker.py b/bitbake/lib/layerindexlib/cooker.py index 604a961..65b23d0 100644 --- a/bitbake/lib/layerindexlib/cooker.py +++ b/bitbake/lib/layerindexlib/cooker.py @@ -4,9 +4,8 @@ # import logging -import json -from collections import OrderedDict, defaultdict +from collections import defaultdict from urllib.parse import unquote, urlparse @@ -94,7 +93,7 @@ class CookerPlugin(layerindexlib.plugin.IndexPlugin): return index collections = d.getVar('BBFILE_COLLECTIONS') - layerconfs = d.varhistory.get_variable_items_files('BBFILE_COLLECTIONS', d) + layerconfs = d.varhistory.get_variable_items_files('BBFILE_COLLECTIONS') bbfile_collections = {layer: os.path.dirname(os.path.dirname(path)) for layer, path in layerconfs.items()} (_, bb_branch, _, _) = self._get_bitbake_info() diff --git a/bitbake/lib/layerindexlib/plugin.py b/bitbake/lib/layerindexlib/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 -import argparse import logging -import os -import bb.msg logger = logging.getLogger('BitBake.layerindexlib.plugin') diff --git a/bitbake/lib/layerindexlib/tests/cooker.py b/bitbake/lib/layerindexlib/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 # -import unittest -import tempfile import os import bb import layerindexlib from layerindexlib.tests.common import LayersTest -import logging class LayerIndexCookerTest(LayersTest): 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 # -import unittest -import tempfile -import os -import bb - from layerindexlib.tests.common import LayersTest -import logging class LayerIndexObjectsTest(LayersTest): def setUp(self): diff --git a/bitbake/lib/layerindexlib/tests/restapi.py b/bitbake/lib/layerindexlib/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 @@ # import unittest -import tempfile import os -import bb import layerindexlib from layerindexlib.tests.common import LayersTest -import logging def skipIfNoNetwork(): if os.environ.get("BB_SKIP_NETTESTS") == "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 - if t == None: + if t is None: # --! DEBUG debug.error('Error : %s', @@ -766,7 +766,7 @@ class LRParser: n = symstack[-1] return getattr(n,"value",None) - if t == None: + if t is None: # 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 = symstack[-1] return getattr(n,"value",None) - if t == None: + if t is None: # 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=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table, (version, pkgarch, checksum)) row=data.fetchone() - if row != None: + if row is not None: return row[0] else: #no value found, try to insert @@ -87,7 +87,7 @@ class PRTable(object): data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table, (version, pkgarch, checksum)) row=data.fetchone() - if row != 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=data.fetchone() - if row != None: + if row is not None: return row[0] else: #no value found, try to insert @@ -116,7 +116,7 @@ class PRTable(object): data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table, (version, pkgarch, checksum)) row=data.fetchone() - if row != None: + if row is not None: return row[0] else: raise prserv.NotFoundError @@ -132,7 +132,7 @@ class PRTable(object): data = self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table, (version, pkgarch, checksum)) row = data.fetchone() - if row != None: + if row is not None: val=row[0] else: #no value found, try to insert @@ -147,7 +147,7 @@ class PRTable(object): data = self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table, (version, pkgarch, checksum)) row = data.fetchone() - if row != None: + if row is not None: val = row[0] return val @@ -170,7 +170,7 @@ class PRTable(object): data = self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=? AND value>=?;" % self.table, (version,pkgarch,checksum,value)) row=data.fetchone() - if row != 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 = 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) # write pidfile - pid = str(os.getpid()) - pf = open(self.pidfile, 'w') - pf.write("%s\n" % pid) - pf.close() + pid = str(os.getpid()) + with open(self.pidfile, 'w') as pf: + pf.write("%s\n" % pid) self.work_forever() self.delpid() @@ -352,9 +352,8 @@ def start_daemon(dbfile, host, port, logfile): ip = socket.gethostbyname(host) pidfile = PIDPREFIX % (ip, port) try: - pf = open(pidfile,'r') - pid = int(pf.readline().strip()) - pf.close() + with open(pidfile) as pf: + pid = int(pf.readline().strip()) except IOError: pid = None @@ -379,9 +378,8 @@ def stop_daemon(host, port): ip = socket.gethostbyname(host) pidfile = PIDPREFIX % (ip, port) try: - pf = open(pidfile,'r') - pid = int(pf.readline().strip()) - pf.close() + with open(pidfile) as pf: + pid = int(pf.readline().strip()) except IOError: pid = None @@ -449,29 +447,35 @@ class PRServiceConfigError(Exception): def auto_start(d): global singleton - # Shutdown any existing PR Server - auto_shutdown() - host_params = list(filter(None, (d.getVar('PRSERV_HOST') or '').split(':'))) if not host_params: + # Shutdown any existing PR Server + auto_shutdown() return None if len(host_params) != 2: + # Shutdown any existing PR Server + auto_shutdown() logger.critical('\n'.join(['PRSERV_HOST: incorrect format', 'Usage: PRSERV_HOST = ":"'])) raise PRServiceConfigError - if is_local_special(host_params[0], int(host_params[1])) and not singleton: + if is_local_special(host_params[0], int(host_params[1])): import bb.utils cachedir = (d.getVar("PERSISTENT_DIR") or d.getVar("CACHE")) if not cachedir: logger.critical("Please set the 'PERSISTENT_DIR' or 'CACHE' variable") raise PRServiceConfigError - bb.utils.mkdirhier(cachedir) dbfile = os.path.join(cachedir, "prserv.sqlite3") logfile = os.path.join(cachedir, "prserv.log") - singleton = PRServSingleton(os.path.abspath(dbfile), os.path.abspath(logfile), ("localhost",0)) - singleton.start() + if singleton: + if singleton.dbfile != dbfile: + # Shutdown any existing PR Server as doesn't match config + auto_shutdown() + if not singleton: + bb.utils.mkdirhier(cachedir) + singleton = PRServSingleton(os.path.abspath(dbfile), os.path.abspath(logfile), ("localhost",0)) + singleton.start() if singleton: host, port = 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 = os.path.basename(sys.argv[0]) or 'pyinotify' pid_file = os.path.join(dirname, basename + '.pid') - if pid_file != False and os.path.lexists(pid_file): + if pid_file and os.path.lexists(pid_file): err = 'Cannot daemonize: pid file %s already exists.' % pid_file raise NotifierError(err) @@ -1308,7 +1308,7 @@ class Notifier: fork_daemon() # Write pid - if pid_file != False: + if pid_file: flags = os.O_WRONLY|os.O_CREAT|os.O_NOFOLLOW|os.O_EXCL fd_pid = 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 # -from django.conf.urls import include, url +from django.conf.urls import url import bldcollector.views diff --git a/bitbake/lib/toaster/bldcollector/views.py b/bitbake/lib/toaster/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 # -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 @@ # from django.contrib import admin -from django.contrib.admin.filters import RelatedFieldListFilter from .models import BuildEnvironment class BuildEnvironmentAdmin(admin.ModelAdmin): diff --git a/bitbake/lib/toaster/bldcontrol/bbcontroller.py b/bitbake/lib/toaster/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 @@ import os import sys -import re -from django.db import transaction from django.db.models import Q -from bldcontrol.models import BuildEnvironment, BRLayer, BRVariable, BRTarget, BRBitbake +from bldcontrol.models import BuildEnvironment, BRLayer, BRBitbake # load Bitbake components path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) diff --git a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py b/bitbake/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 @@ # 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, BRVariable, BRTarget, BRBitbake, Build -from orm.models import CustomImageRecipe, Layer, Layer_Version, Project, ProjectLayer, ToasterSetting +from bldcontrol.models import BuildEnvironment, BuildRequest, Build +from orm.models import CustomImageRecipe, Layer, Layer_Version, Project, ToasterSetting from orm.models import signal_runbuilds import subprocess from toastermain import settings -from bldcontrol.bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException, BitbakeController +from bldcontrol.bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException import logging logger = logging.getLogger("toaster") install_dir = os.environ.get('TOASTER_DIR') -from pprint import pprint, pformat +from pprint import pformat class LocalhostBEController(BuildEnvironmentController): """ Implementation of the BuildEnvironmentController for the localhost; diff --git a/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.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 # -from django.core.management.base import BaseCommand, CommandError -from django.db import transaction +from django.core.management.base import BaseCommand from django.core.management import call_command -from bldcontrol.bbcontroller import getBuildEnvironmentController, ShellCmdException from bldcontrol.models import BuildRequest, BuildEnvironment, BRError from orm.models import ToasterSetting, Build, Layer @@ -80,7 +78,7 @@ class Command(BaseCommand): template_conf = os.environ.get("TEMPLATECONF", "") custom_xml_only = os.environ.get("CUSTOM_XML_ONLY") - if ToasterSetting.objects.filter(name='CUSTOM_XML_ONLY').count() > 0 or (not custom_xml_only == None): + if ToasterSetting.objects.filter(name='CUSTOM_XML_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.py 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)) try: self.archive() except Exception as e: - logger.warn("runbuilds: archive exception %s" % str(e)) + logger.warning("runbuilds: archive exception %s" % str(e)) try: self.schedule() except Exception as e: - logger.warn("runbuilds: schedule exception %s" % str(e)) + logger.warning("runbuilds: schedule exception %s" % str(e)) def handle(self, **options): pidfile_path = os.path.join(os.environ.get("BUILDDIR", "."), diff --git a/bitbake/lib/toaster/bldcontrol/migrations/0001_initial.py b/bitbake/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=254)), ('commit', models.CharField(max_length=254)), ('dirpath', models.CharField(max_length=254)), - ('layer_version', models.ForeignKey(to='orm.Layer_Version', null=True)), + ('layer_version', models.ForeignKey(to='orm.Layer_Version', null=True, on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -80,34 +80,34 @@ class Migration(migrations.Migration): ('state', models.IntegerField(default=0, choices=[(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=True)), ('updated', models.DateTimeField(auto_now=True)), - ('build', models.OneToOneField(null=True, to='orm.Build')), - ('environment', models.ForeignKey(to='bldcontrol.BuildEnvironment', null=True)), - ('project', models.ForeignKey(to='orm.Project')), + ('build', models.OneToOneField(null=True, to='orm.Build', on_delete=models.CASCADE)), + ('environment', models.ForeignKey(to='bldcontrol.BuildEnvironment', null=True, on_delete=models.CASCADE)), + ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)), ], ), migrations.AddField( model_name='brvariable', name='req', - field=models.ForeignKey(to='bldcontrol.BuildRequest'), + field=models.ForeignKey(to='bldcontrol.BuildRequest', on_delete=models.CASCADE), ), migrations.AddField( model_name='brtarget', name='req', - field=models.ForeignKey(to='bldcontrol.BuildRequest'), + field=models.ForeignKey(to='bldcontrol.BuildRequest', on_delete=models.CASCADE), ), migrations.AddField( model_name='brlayer', name='req', - field=models.ForeignKey(to='bldcontrol.BuildRequest'), + field=models.ForeignKey(to='bldcontrol.BuildRequest', on_delete=models.CASCADE), ), migrations.AddField( model_name='brerror', name='req', - field=models.ForeignKey(to='bldcontrol.BuildRequest'), + field=models.ForeignKey(to='bldcontrol.BuildRequest', on_delete=models.CASCADE), ), migrations.AddField( model_name='brbitbake', name='req', - field=models.OneToOneField(to='bldcontrol.BuildRequest'), + field=models.OneToOneField(to='bldcontrol.BuildRequest', on_delete=models.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 @@ 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, ProjectTarget, Build, Layer_Version +from orm.models import Project, Build, Layer_Version import logging logger = logging.getLogger("toaster") @@ -86,9 +85,9 @@ class BuildRequest(models.Model): search_allowed_fields = ("brtarget__target", "build__project__name") - project = models.ForeignKey(Project) - build = models.OneToOneField(Build, null = True) # TODO: toasterui should set this when Build is created - environment = models.ForeignKey(BuildEnvironment, null = True) + project = models.ForeignKey(Project, on_delete=models.CASCADE) + build = models.OneToOneField(Build, on_delete=models.CASCADE, null = True) # TODO: toasterui should set this when Build is created + environment = models.ForeignKey(BuildEnvironment, on_delete=models.CASCADE, null = True) state = models.IntegerField(choices = REQUEST_STATE, default = REQ_CREATED) created = models.DateTimeField(auto_now_add = True) updated = models.DateTimeField(auto_now = True) @@ -132,32 +131,32 @@ class BuildRequest(models.Model): class BRLayer(models.Model): - req = models.ForeignKey(BuildRequest) + req = models.ForeignKey(BuildRequest, on_delete=models.CASCADE) name = models.CharField(max_length=100) giturl = models.CharField(max_length=254, null=True) local_source_dir = models.CharField(max_length=254, null=True) commit = models.CharField(max_length=254, null=True) dirpath = models.CharField(max_length=254, null=True) - layer_version = models.ForeignKey(Layer_Version, null=True) + layer_version = models.ForeignKey(Layer_Version, on_delete=models.CASCADE, null=True) class BRBitbake(models.Model): - req = models.OneToOneField(BuildRequest) # only one bitbake for a request + req = models.OneToOneField(BuildRequest, on_delete=models.CASCADE) # only one bitbake for a request giturl = models.CharField(max_length =254) commit = models.CharField(max_length = 254) dirpath = models.CharField(max_length = 254) class BRVariable(models.Model): - req = models.ForeignKey(BuildRequest) + req = models.ForeignKey(BuildRequest, on_delete=models.CASCADE) name = models.CharField(max_length=100) value = models.TextField(blank = True) class BRTarget(models.Model): - req = models.ForeignKey(BuildRequest) + req = models.ForeignKey(BuildRequest, on_delete=models.CASCADE) target = models.CharField(max_length=100) task = models.CharField(max_length=100, null=True) class BRError(models.Model): - req = models.ForeignKey(BuildRequest) + req = models.ForeignKey(BuildRequest, on_delete=models.CASCADE) errtype = models.CharField(max_length=100) errmsg = models.TextField() traceback = models.TextField() diff --git a/bitbake/lib/toaster/orm/fixtures/oe-core.xml b/bitbake/lib/toaster/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 @@ - warrior + dunfell git://git.openembedded.org/bitbake - 1.42 + 1.46 HEAD @@ -30,11 +30,11 @@ - warrior - Openembedded Warrior + dunfell + Openembedded Dunfell 1 - warrior - Toaster will run your builds using the tip of the <a href=\"http://cgit.openembedded.org/openembedded-core/log/?h=warrior\">OpenEmbedded Warrior</a> branch. + dunfell + Toaster will run your builds using the tip of the <a href=\"http://cgit.openembedded.org/openembedded-core/log/?h=dunfell\">OpenEmbedded Dunfell</a> branch. local diff --git a/bitbake/lib/toaster/orm/fixtures/poky.xml b/bitbake/lib/toaster/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 @@ - warrior + dunfell git://git.yoctoproject.org/poky - warrior + dunfell bitbake @@ -35,11 +35,11 @@ - warrior - Yocto Project 2.7 "Warrior" + dunfell + Yocto Project 3.1 "Dunfell" 1 - warrior - Toaster will run your builds using the tip of the <a href="http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=warrior">Yocto Project Warrior branch</a>. + dunfell + Toaster will run your builds using the tip of the <a href="http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=dunfell">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/bitbake/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 @@ from django.core.management.base import BaseCommand -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/lib/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='ID', serialize=False, auto_created=True, primary_key=True)), ('file_name', models.FilePathField()), ('file_size', models.IntegerField()), - ('build', models.ForeignKey(to='orm.Build')), + ('build', models.ForeignKey(to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -64,7 +64,7 @@ class Migration(migrations.Migration): ('area', models.IntegerField(choices=[(0, b'variable')])), ('key', models.CharField(max_length=100)), ('text', models.TextField()), - ('build', models.ForeignKey(related_name='helptext_build', to='orm.Build')), + ('build', models.ForeignKey(related_name='helptext_build', to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -94,8 +94,8 @@ class Migration(migrations.Migration): ('dirpath', models.CharField(default=None, max_length=255, null=True)), ('priority', models.IntegerField(default=0)), ('local_path', models.FilePathField(default=b'/', max_length=1024)), - ('build', models.ForeignKey(related_name='layer_version_build', default=None, to='orm.Build', null=True)), - ('layer', models.ForeignKey(related_name='layer_version_layer', to='orm.Layer')), + ('build', models.ForeignKey(related_name='layer_version_build', default=None, to='orm.Build', null=True, on_delete=models.CASCADE)), + ('layer', models.ForeignKey(related_name='layer_version_layer', to='orm.Layer', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -112,9 +112,9 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('up_id', models.IntegerField(default=None, null=True)), - ('depends_on', models.ForeignKey(related_name='dependees', to='orm.Layer_Version')), - ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True)), - ('layer_version', models.ForeignKey(related_name='dependencies', to='orm.Layer_Version')), + ('depends_on', models.ForeignKey(related_name='dependees', to='orm.Layer_Version', on_delete=models.CASCADE)), + ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE)), + ('layer_version', models.ForeignKey(related_name='dependencies', to='orm.Layer_Version', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -125,7 +125,7 @@ class Migration(migrations.Migration): ('message', models.TextField(null=True, blank=True)), ('pathname', models.FilePathField(max_length=255, blank=True)), ('lineno', models.IntegerField(null=True)), - ('build', models.ForeignKey(to='orm.Build')), + ('build', models.ForeignKey(to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -136,8 +136,8 @@ class Migration(migrations.Migration): ('up_date', models.DateTimeField(default=None, null=True)), ('name', models.CharField(max_length=255)), ('description', models.CharField(max_length=255)), - ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True)), - ('layer_version', models.ForeignKey(to='orm.Layer_Version')), + ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE)), + ('layer_version', models.ForeignKey(to='orm.Layer_Version', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -154,7 +154,7 @@ class Migration(migrations.Migration): ('installed_size', models.IntegerField(default=0)), ('section', models.CharField(max_length=80, blank=True)), ('license', models.CharField(max_length=80, blank=True)), - ('build', models.ForeignKey(to='orm.Build', null=True)), + ('build', models.ForeignKey(to='orm.Build', null=True, on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -162,8 +162,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('dep_type', models.IntegerField(choices=[(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='package_dependencies_target', to='orm.Package')), - ('package', models.ForeignKey(related_name='package_dependencies_source', to='orm.Package')), + ('depends_on', models.ForeignKey(related_name='package_dependencies_target', to='orm.Package', on_delete=models.CASCADE)), + ('package', models.ForeignKey(related_name='package_dependencies_source', to='orm.Package', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -172,7 +172,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('path', models.FilePathField(max_length=255, blank=True)), ('size', models.IntegerField()), - ('package', models.ForeignKey(related_name='buildfilelist_package', to='orm.Package')), + ('package', models.ForeignKey(related_name='buildfilelist_package', to='orm.Package', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -185,7 +185,7 @@ class Migration(migrations.Migration): ('updated', models.DateTimeField(auto_now=True)), ('user_id', models.IntegerField(null=True)), ('is_default', models.BooleanField(default=False)), - ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion', null=True)), + ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion', null=True, on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -193,8 +193,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('optional', models.BooleanField(default=True)), - ('layercommit', models.ForeignKey(to='orm.Layer_Version', null=True)), - ('project', models.ForeignKey(to='orm.Project')), + ('layercommit', models.ForeignKey(to='orm.Layer_Version', null=True, on_delete=models.CASCADE)), + ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -203,7 +203,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('target', models.CharField(max_length=100)), ('task', models.CharField(max_length=100, null=True)), - ('project', models.ForeignKey(to='orm.Project')), + ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -212,7 +212,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=100)), ('value', models.TextField(blank=True)), - ('project', models.ForeignKey(to='orm.Project')), + ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -232,8 +232,8 @@ class Migration(migrations.Migration): ('file_path', models.FilePathField(max_length=255)), ('pathflags', models.CharField(max_length=200, blank=True)), ('is_image', models.BooleanField(default=False)), - ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True)), - ('layer_version', models.ForeignKey(related_name='recipe_layer_version', to='orm.Layer_Version')), + ('layer_source', models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE)), + ('layer_version', models.ForeignKey(related_name='recipe_layer_version', to='orm.Layer_Version', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -241,8 +241,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('dep_type', models.IntegerField(choices=[(0, b'depends'), (1, b'rdepends')])), - ('depends_on', models.ForeignKey(related_name='r_dependencies_depends', to='orm.Recipe')), - ('recipe', models.ForeignKey(related_name='r_dependencies_recipe', to='orm.Recipe')), + ('depends_on', models.ForeignKey(related_name='r_dependencies_depends', to='orm.Recipe', on_delete=models.CASCADE)), + ('recipe', models.ForeignKey(related_name='r_dependencies_recipe', to='orm.Recipe', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -253,7 +253,7 @@ class Migration(migrations.Migration): ('description', models.CharField(max_length=255)), ('branch_name', models.CharField(default=b'', max_length=50)), ('helptext', models.TextField(null=True)), - ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion')), + ('bitbake_version', models.ForeignKey(to='orm.BitbakeVersion', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -261,7 +261,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('layer_name', models.CharField(default=b'', max_length=100)), - ('release', models.ForeignKey(to='orm.Release')), + ('release', models.ForeignKey(to='orm.Release', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -269,8 +269,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('priority', models.IntegerField(default=0)), - ('layer_source', models.ForeignKey(to='orm.LayerSource')), - ('release', models.ForeignKey(to='orm.Release')), + ('layer_source', models.ForeignKey(to='orm.LayerSource', on_delete=models.CASCADE)), + ('release', models.ForeignKey(to='orm.Release', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -282,7 +282,7 @@ class Migration(migrations.Migration): ('is_image', models.BooleanField(default=False)), ('image_size', models.IntegerField(default=0)), ('license_manifest_path', models.CharField(max_length=500, null=True)), - ('build', models.ForeignKey(to='orm.Build')), + ('build', models.ForeignKey(to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -295,9 +295,9 @@ class Migration(migrations.Migration): ('permission', models.CharField(max_length=16)), ('owner', models.CharField(max_length=128)), ('group', models.CharField(max_length=128)), - ('directory', models.ForeignKey(related_name='directory_set', to='orm.Target_File', null=True)), - ('sym_target', models.ForeignKey(related_name='symlink_set', to='orm.Target_File', null=True)), - ('target', models.ForeignKey(to='orm.Target')), + ('directory', models.ForeignKey(related_name='directory_set', to='orm.Target_File', null=True, on_delete=models.CASCADE)), + ('sym_target', models.ForeignKey(related_name='symlink_set', to='orm.Target_File', null=True, on_delete=models.CASCADE)), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -306,15 +306,15 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('file_name', models.FilePathField(max_length=254)), ('file_size', models.IntegerField()), - ('target', models.ForeignKey(to='orm.Target')), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)), ], ), migrations.CreateModel( name='Target_Installed_Package', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('package', models.ForeignKey(related_name='buildtargetlist_package', to='orm.Package')), - ('target', models.ForeignKey(to='orm.Target')), + ('package', models.ForeignKey(related_name='buildtargetlist_package', to='orm.Package', on_delete=models.CASCADE)), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -337,8 +337,8 @@ class Migration(migrations.Migration): ('sstate_result', models.IntegerField(default=0, choices=[(0, b'Not Applicable'), (1, b'File not in cache'), (2, b'Failed'), (3, b'Succeeded')])), ('message', models.CharField(max_length=240)), ('logfile', models.FilePathField(max_length=255, blank=True)), - ('build', models.ForeignKey(related_name='task_build', to='orm.Build')), - ('recipe', models.ForeignKey(related_name='tasks', to='orm.Recipe')), + ('build', models.ForeignKey(related_name='task_build', to='orm.Build', on_delete=models.CASCADE)), + ('recipe', models.ForeignKey(related_name='tasks', to='orm.Recipe', on_delete=models.CASCADE)), ], options={ 'ordering': ('order', 'recipe'), @@ -348,8 +348,8 @@ class Migration(migrations.Migration): name='Task_Dependency', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('depends_on', models.ForeignKey(related_name='task_dependencies_depends', to='orm.Task')), - ('task', models.ForeignKey(related_name='task_dependencies_task', to='orm.Task')), + ('depends_on', models.ForeignKey(related_name='task_dependencies_depends', to='orm.Task', on_delete=models.CASCADE)), + ('task', models.ForeignKey(related_name='task_dependencies_task', to='orm.Task', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -370,7 +370,7 @@ class Migration(migrations.Migration): ('changed', models.BooleanField(default=False)), ('human_readable_name', models.CharField(max_length=200)), ('description', models.TextField(blank=True)), - ('build', models.ForeignKey(related_name='variable_build', to='orm.Build')), + ('build', models.ForeignKey(related_name='variable_build', to='orm.Build', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -381,28 +381,28 @@ class Migration(migrations.Migration): ('file_name', models.FilePathField(max_length=255)), ('line_number', models.IntegerField(null=True)), ('operation', models.CharField(max_length=64)), - ('variable', models.ForeignKey(related_name='vhistory', to='orm.Variable')), + ('variable', models.ForeignKey(related_name='vhistory', to='orm.Variable', on_delete=models.CASCADE)), ], ), migrations.AddField( model_name='project', name='release', - field=models.ForeignKey(to='orm.Release', null=True), + field=models.ForeignKey(to='orm.Release', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='package_dependency', name='target', - field=models.ForeignKey(to='orm.Target', null=True), + field=models.ForeignKey(to='orm.Target', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='package', name='recipe', - field=models.ForeignKey(to='orm.Recipe', null=True), + field=models.ForeignKey(to='orm.Recipe', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='logmessage', name='task', - field=models.ForeignKey(blank=True, to='orm.Task', null=True), + field=models.ForeignKey(blank=True, to='orm.Task', null=True, on_delete=models.CASCADE), ), migrations.AlterUniqueTogether( name='layersource', @@ -411,32 +411,32 @@ class Migration(migrations.Migration): migrations.AddField( model_name='layer_version', name='layer_source', - field=models.ForeignKey(default=None, to='orm.LayerSource', null=True), + field=models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='layer_version', name='project', - field=models.ForeignKey(default=None, to='orm.Project', null=True), + field=models.ForeignKey(default=None, to='orm.Project', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='layer_version', name='up_branch', - field=models.ForeignKey(default=None, to='orm.Branch', null=True), + field=models.ForeignKey(default=None, to='orm.Branch', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='layer', name='layer_source', - field=models.ForeignKey(default=None, to='orm.LayerSource', null=True), + field=models.ForeignKey(default=None, to='orm.LayerSource', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='build', name='project', - field=models.ForeignKey(to='orm.Project'), + field=models.ForeignKey(to='orm.Project', on_delete=models.CASCADE), ), migrations.AddField( model_name='branch', name='layer_source', - field=models.ForeignKey(default=True, to='orm.LayerSource', null=True), + field=models.ForeignKey(default=True, to='orm.LayerSource', null=True, on_delete=models.CASCADE), ), migrations.CreateModel( name='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='CustomImageRecipe', fields=[ - ('recipe_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Recipe')), + ('recipe_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Recipe', on_delete=models.CASCADE)), ('last_updated', models.DateTimeField(default=None, null=True)), - ('base_recipe', models.ForeignKey(related_name='based_on_recipe', to='orm.Recipe')), - ('project', models.ForeignKey(to='orm.Project')), + ('base_recipe', models.ForeignKey(related_name='based_on_recipe', to='orm.Recipe', on_delete=models.CASCADE)), + ('project', models.ForeignKey(to='orm.Project', on_delete=models.CASCADE)), ], bases=('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='CustomImagePackage', fields=[ - ('package_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Package')), + ('package_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='orm.Package', on_delete=models.CASCADE)), ('recipe_appends', models.ManyToManyField(related_name='appends_set', to='orm.CustomImageRecipe')), ('recipe_excludes', models.ManyToManyField(related_name='excludes_set', to='orm.CustomImageRecipe')), ('recipe_includes', models.ManyToManyField(related_name='includes_set', to='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=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=100)), - ('recipe', models.ForeignKey(to='orm.Recipe')), + ('recipe', models.ForeignKey(to='orm.Recipe', on_delete=models.CASCADE)), ], ), migrations.AddField( model_name='recipe_dependency', name='via', - field=models.ForeignKey(null=True, default=None, to='orm.Provides'), + field=models.ForeignKey(null=True, default=None, to='orm.Provides', on_delete=models.CASCADE), ), ] diff --git a/bitbake/lib/toaster/orm/migrations/0008_refactor_artifact_models.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=True, primary_key=True, verbose_name='ID', serialize=False)), ('file_name', models.FilePathField()), ('file_size', models.IntegerField()), - ('target', models.ForeignKey(to='orm.Target')), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -26,7 +26,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, verbose_name='ID', serialize=False)), ('file_name', models.FilePathField()), ('file_size', models.IntegerField()), - ('target', models.ForeignKey(to='orm.Target')), + ('target', models.ForeignKey(to='orm.Target', on_delete=models.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 -from django.db import migrations, models +from django.db import migrations 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_branch.py +++ b/bitbake/lib/toaster/orm/migrations/0012_use_release_instead_of_up_branch.py @@ -46,7 +46,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='layer_version', name='release', - field=models.ForeignKey(to='orm.Release', default=None, null=True), + field=models.ForeignKey(to='orm.Release', default=None, null=True, on_delete=models.CASCADE), ), migrations.RunPython(branch_to_release, reverse_code=migrations.RunPython.noop), diff --git a/bitbake/lib/toaster/orm/migrations/0017_distro_clone.py b/bitbake/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=None, null=True)), ('name', models.CharField(max_length=255)), ('description', models.CharField(max_length=255)), - ('layer_version', models.ForeignKey(to='orm.Layer_Version')), + ('layer_version', models.ForeignKey(to='orm.Layer_Version', on_delete=models.CASCADE)), ], ), ] diff --git a/bitbake/lib/toaster/orm/migrations/0019_django_2_2.py b/bitbake/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 = [ + ('orm', '0018_project_specific'), + ] + + operations = [ + migrations.RemoveField( + model_name='distro', + name='up_id', + ), + migrations.AlterField( + model_name='build', + name='recipes_parsed', + field=models.IntegerField(default=1), + ), + ] diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.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 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core import validators from django.conf import settings @@ -178,8 +178,8 @@ class Project(models.Model): 'release__branch_name'] name = models.CharField(max_length=100) short_description = models.CharField(max_length=50, blank=True) - bitbake_version = models.ForeignKey('BitbakeVersion', null=True) - release = models.ForeignKey("Release", null=True) + bitbake_version = models.ForeignKey('BitbakeVersion', on_delete=models.CASCADE, null=True) + release = models.ForeignKey("Release", on_delete=models.CASCADE, null=True) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) # This is a horrible hack; since Toaster has no "User" model available when @@ -469,7 +469,7 @@ class Build(models.Model): search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"] - project = models.ForeignKey(Project) # must have a project + project = models.ForeignKey(Project, on_delete=models.CASCADE) # must have a project machine = models.CharField(max_length=100) distro = models.CharField(max_length=100) distro_version = models.CharField(max_length=100) @@ -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()])) class ProjectTarget(models.Model): - project = models.ForeignKey(Project) + project = models.ForeignKey(Project, on_delete=models.CASCADE) target = models.CharField(max_length=100) task = models.CharField(max_length=100, null=True) class Target(models.Model): search_allowed_fields = ['target', 'file_name'] - build = models.ForeignKey(Build) + build = models.ForeignKey(Build, on_delete=models.CASCADE) target = models.CharField(max_length=100) task = models.CharField(max_length=100, null=True) is_image = models.BooleanField(default = False) @@ -944,7 +944,7 @@ class Target(models.Model): # kernel artifacts for a target: bzImage and modules* class TargetKernelFile(models.Model): - target = models.ForeignKey(Target) + target = models.ForeignKey(Target, on_delete=models.CASCADE) file_name = models.FilePathField() file_size = models.IntegerField() @@ -954,7 +954,7 @@ class TargetKernelFile(models.Model): # SDK artifacts for a target: sh and manifest files class TargetSDKFile(models.Model): - target = models.ForeignKey(Target) + target = models.ForeignKey(Target, on_delete=models.CASCADE) file_name = models.FilePathField() file_size = models.IntegerField() @@ -973,7 +973,7 @@ class Target_Image_File(models.Model): 'ubifs', 'wic', 'wic.bz2', 'wic.gz', 'wic.lzma' } - target = models.ForeignKey(Target) + target = models.ForeignKey(Target, on_delete=models.CASCADE) file_name = models.FilePathField(max_length=254) file_size = models.IntegerField() @@ -1007,15 +1007,15 @@ class Target_File(models.Model): ( ITYPE_BLOCK ,'block'), ) - target = models.ForeignKey(Target) + target = models.ForeignKey(Target, on_delete=models.CASCADE) path = models.FilePathField() size = models.IntegerField() inodetype = models.IntegerField(choices = ITYPES) permission = models.CharField(max_length=16) owner = models.CharField(max_length=128) group = models.CharField(max_length=128) - directory = models.ForeignKey('Target_File', related_name="directory_set", null=True) - sym_target = models.ForeignKey('Target_File', related_name="symlink_set", null=True) + directory = models.ForeignKey('Target_File', on_delete=models.CASCADE, related_name="directory_set", null=True) + sym_target = models.ForeignKey('Target_File', on_delete=models.CASCADE, related_name="symlink_set", null=True) class Task(models.Model): @@ -1102,13 +1102,13 @@ class Task(models.Model): def get_description(self): return self._helptext - build = models.ForeignKey(Build, related_name='task_build') + build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='task_build') order = models.IntegerField(null=True) task_executed = models.BooleanField(default=False) # True means Executed, False means Not/Executed outcome = models.IntegerField(choices=TASK_OUTCOME, default=OUTCOME_NA) sstate_checksum = models.CharField(max_length=100, blank=True) path_to_sstate_obj = models.FilePathField(max_length=500, blank=True) - recipe = models.ForeignKey('Recipe', related_name='tasks') + recipe = models.ForeignKey('Recipe', on_delete=models.CASCADE, related_name='tasks') task_name = models.CharField(max_length=100) source_url = models.FilePathField(max_length=255, blank=True) work_directory = models.FilePathField(max_length=255, blank=True) @@ -1147,13 +1147,13 @@ class Task(models.Model): class Task_Dependency(models.Model): - task = models.ForeignKey(Task, related_name='task_dependencies_task') - depends_on = models.ForeignKey(Task, related_name='task_dependencies_depends') + task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='task_dependencies_task') + depends_on = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='task_dependencies_depends') class Package(models.Model): search_allowed_fields = ['name', 'version', 'revision', 'recipe__name', 'recipe__version', 'recipe__license', 'recipe__layer_version__layer__name', 'recipe__layer_version__branch', 'recipe__layer_version__commit', 'recipe__layer_version__local_path', 'installed_name'] - build = models.ForeignKey('Build', null=True) - recipe = models.ForeignKey('Recipe', null=True) + build = models.ForeignKey('Build', on_delete=models.CASCADE, null=True) + recipe = models.ForeignKey('Recipe', on_delete=models.CASCADE, null=True) name = models.CharField(max_length=100) installed_name = models.CharField(max_length=100, default='') version = models.CharField(max_length=100, blank=True) @@ -1289,19 +1289,19 @@ class Package_Dependency(models.Model): TYPE_RCONFLICTS : ("conflicts", "%s conflicts with %s, which will not be installed if this package is not first removed"), } - package = models.ForeignKey(Package, related_name='package_dependencies_source') - depends_on = models.ForeignKey(Package, related_name='package_dependencies_target') # soft dependency + package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='package_dependencies_source') + depends_on = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='package_dependencies_target') # soft dependency dep_type = models.IntegerField(choices=DEPENDS_TYPE) - target = models.ForeignKey(Target, null=True) + target = models.ForeignKey(Target, on_delete=models.CASCADE, null=True) objects = Package_DependencyManager() class Target_Installed_Package(models.Model): - target = models.ForeignKey(Target) - package = models.ForeignKey(Package, related_name='buildtargetlist_package') + target = models.ForeignKey(Target, on_delete=models.CASCADE) + package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='buildtargetlist_package') class Package_File(models.Model): - package = models.ForeignKey(Package, related_name='buildfilelist_package') + package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='buildfilelist_package') path = models.FilePathField(max_length=255, blank=True) size = models.IntegerField() @@ -1318,7 +1318,7 @@ class Recipe(models.Model): name = models.CharField(max_length=100, blank=True) version = models.CharField(max_length=100, blank=True) - layer_version = models.ForeignKey('Layer_Version', + layer_version = models.ForeignKey('Layer_Version', on_delete=models.CASCADE, related_name='recipe_layer_version') summary = models.TextField(blank=True) description = models.TextField(blank=True) @@ -1356,7 +1356,7 @@ class Recipe_DependencyManager(models.Manager): class Provides(models.Model): name = models.CharField(max_length=100) - recipe = models.ForeignKey(Recipe) + recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE) class Recipe_Dependency(models.Model): TYPE_DEPENDS = 0 @@ -1366,9 +1366,9 @@ class Recipe_Dependency(models.Model): (TYPE_DEPENDS, "depends"), (TYPE_RDEPENDS, "rdepends"), ) - recipe = models.ForeignKey(Recipe, related_name='r_dependencies_recipe') - depends_on = models.ForeignKey(Recipe, related_name='r_dependencies_depends') - via = models.ForeignKey(Provides, null=True, default=None) + recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='r_dependencies_recipe') + depends_on = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='r_dependencies_depends') + via = models.ForeignKey(Provides, on_delete=models.CASCADE, null=True, default=None) dep_type = models.IntegerField(choices=DEPENDS_TYPE) objects = Recipe_DependencyManager() @@ -1377,7 +1377,7 @@ class Machine(models.Model): search_allowed_fields = ["name", "description", "layer_version__layer__name"] up_date = models.DateTimeField(null = True, default = None) - layer_version = models.ForeignKey('Layer_Version') + layer_version = models.ForeignKey('Layer_Version', on_delete=models.CASCADE) name = models.CharField(max_length=255) description = models.CharField(max_length=255) @@ -1408,7 +1408,7 @@ class Release(models.Model): """ A release is a project template, used to pre-populate Project settings with a configuration set """ name = models.CharField(max_length=32, unique = True) description = models.CharField(max_length=255) - bitbake_version = models.ForeignKey(BitbakeVersion) + bitbake_version = models.ForeignKey(BitbakeVersion, on_delete=models.CASCADE) branch_name = models.CharField(max_length=50, default = "") helptext = models.TextField(null=True) @@ -1419,7 +1419,7 @@ class Release(models.Model): return self.name class ReleaseDefaultLayer(models.Model): - release = models.ForeignKey(Release) + release = models.ForeignKey(Release, on_delete=models.CASCADE) layer_name = models.CharField(max_length=100, default="") @@ -1474,10 +1474,10 @@ class Layer_Version(models.Model): "layer__description", "layer__vcs_url", "dirpath", "release__name", "commit", "branch"] - build = models.ForeignKey(Build, related_name='layer_version_build', + build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='layer_version_build', default=None, null=True) - layer = models.ForeignKey(Layer, related_name='layer_version_layer') + layer = models.ForeignKey(Layer, on_delete=models.CASCADE, related_name='layer_version_layer') layer_source = models.IntegerField(choices=LayerSource.SOURCE_TYPE, default=0) @@ -1485,7 +1485,7 @@ class Layer_Version(models.Model): up_date = models.DateTimeField(null=True, default=timezone.now) # To which metadata release does this layer version belong to - release = models.ForeignKey(Release, null=True, default=None) + release = models.ForeignKey(Release, on_delete=models.CASCADE, null=True, default=None) branch = models.CharField(max_length=80) commit = models.CharField(max_length=100) @@ -1499,7 +1499,7 @@ class Layer_Version(models.Model): local_path = models.FilePathField(max_length=1024, default="/") # Set if this layer is restricted to a particular project - project = models.ForeignKey('Project', null=True, default=None) + project = models.ForeignKey('Project', on_delete=models.CASCADE, null=True, default=None) # 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): class LayerVersionDependency(models.Model): - layer_version = models.ForeignKey(Layer_Version, + layer_version = models.ForeignKey(Layer_Version, on_delete=models.CASCADE, related_name="dependencies") - depends_on = models.ForeignKey(Layer_Version, + depends_on = models.ForeignKey(Layer_Version, on_delete=models.CASCADE, related_name="dependees") class ProjectLayer(models.Model): - project = models.ForeignKey(Project) - layercommit = models.ForeignKey(Layer_Version, null=True) + project = models.ForeignKey(Project, on_delete=models.CASCADE) + layercommit = models.ForeignKey(Layer_Version, on_delete=models.CASCADE, null=True) optional = models.BooleanField(default = True) def __unicode__(self): @@ -1630,8 +1630,8 @@ class CustomImageRecipe(Recipe): LAYER_NAME = "toaster-custom-images" search_allowed_fields = ['name'] - base_recipe = models.ForeignKey(Recipe, related_name='based_on_recipe') - project = models.ForeignKey(Project) + base_recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name='based_on_recipe') + project = models.ForeignKey(Project, on_delete=models.CASCADE) last_updated = models.DateTimeField(null=True, default=None) 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 = self.get_last_successful_built_target() - if target == None: + if target is None: # So we've never actually built this Custom recipe but what about # the recipe it's based on? target = \ Target.objects.filter(Q(build__outcome=Build.SUCCEEDED) & Q(build__project=self.project) & Q(target=self.base_recipe.name)).last() - if target == None: + if target is None: return if target.build.completed_on == self.last_updated: @@ -1784,14 +1784,14 @@ class CustomImageRecipe(Recipe): return recipe_contents class ProjectVariable(models.Model): - project = models.ForeignKey(Project) + project = models.ForeignKey(Project, on_delete=models.CASCADE) name = models.CharField(max_length=100) value = models.TextField(blank = True) class Variable(models.Model): search_allowed_fields = ['variable_name', 'variable_value', 'vhistory__file_name', "description"] - build = models.ForeignKey(Build, related_name='variable_build') + build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='variable_build') variable_name = models.CharField(max_length=100) variable_value = models.TextField(blank=True) changed = models.BooleanField(default=False) @@ -1799,7 +1799,7 @@ class Variable(models.Model): description = models.TextField(blank=True) class VariableHistory(models.Model): - variable = models.ForeignKey(Variable, related_name='vhistory') + variable = models.ForeignKey(Variable, on_delete=models.CASCADE, related_name='vhistory') value = models.TextField(blank=True) file_name = models.FilePathField(max_length=255) line_number = models.IntegerField(null=True) @@ -1809,7 +1809,7 @@ class HelpText(models.Model): VARIABLE = 0 HELPTEXT_AREA = ((VARIABLE, 'variable'), ) - build = models.ForeignKey(Build, related_name='helptext_build') + build = models.ForeignKey(Build, on_delete=models.CASCADE, related_name='helptext_build') area = models.IntegerField(choices=HELPTEXT_AREA) key = models.CharField(max_length=100) text = models.TextField() @@ -1829,8 +1829,8 @@ class LogMessage(models.Model): (EXCEPTION, "toaster exception") ) - build = models.ForeignKey(Build) - task = models.ForeignKey(Task, blank = True, null=True) + build = models.ForeignKey(Build, on_delete=models.CASCADE) + task = models.ForeignKey(Task, on_delete=models.CASCADE, blank = True, null=True) level = models.IntegerField(choices=LOG_LEVEL, default=INFO) message = models.TextField(blank=True, null=True) pathname = models.FilePathField(max_length=255, blank=True) @@ -1859,7 +1859,7 @@ class Distro(models.Model): search_allowed_fields = ["name", "description", "layer_version__layer__name"] up_date = models.DateTimeField(null = True, default = None) - layer_version = models.ForeignKey('Layer_Version') + layer_version = models.ForeignKey('Layer_Version', on_delete=models.CASCADE) name = models.CharField(max_length=255) description = models.CharField(max_length=255) diff --git a/bitbake/lib/toaster/tests/browser/selenium_helpers_base.py b/bitbake/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 -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 DesiredCapabilities diff --git a/bitbake/lib/toaster/tests/browser/test_all_builds_page.py b/bitbake/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 @@ import re -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase 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 @@ import re -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase 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 # -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase diff --git a/bitbake/lib/toaster/tests/browser/test_builddashboard_page_artifacts.py b/bitbake/lib/toaster/tests/browser/test_builddashboard_page_artifacts.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 # -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase diff --git a/bitbake/lib/toaster/tests/browser/test_builddashboard_page_recipes.py b/bitbake/lib/toaster/tests/browser/test_builddashboard_page_recipes.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 # -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_tasks.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 # -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/bitbake/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 """ -from django.core.urlresolvers import reverse +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase import logging diff --git a/bitbake/lib/toaster/tests/browser/test_landing_page.py b/bitbake/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 # -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase 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 # -from django.core.urlresolvers import reverse +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase from orm.models import Layer, Layer_Version, Project, LayerSource, Release diff --git a/bitbake/lib/toaster/tests/browser/test_most_recent_builds_states.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 # -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.py 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 # -from django.core.urlresolvers import reverse +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase from orm.models import BitbakeVersion, Release, Project, ProjectLayer, Layer diff --git a/bitbake/lib/toaster/tests/browser/test_new_project_page.py b/bitbake/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 # -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 @@ import re -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase 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 # -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 from orm.models import BitbakeVersion, Release, Project, ProjectVariable @@ -216,4 +213,5 @@ class TestProjectConfigsPage(SeleniumTestCase): hidden_element = self.driver.find_element_by_id('hintError-sstate_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/bitbake/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 # -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from tests.browser.selenium_helpers import SeleniumTestCase 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 named "test_*.py", and should be in the same directory as this sample. """ -from django.core.urlresolvers import reverse +from django.urls import reverse from tests.browser.selenium_helpers import SeleniumTestCase 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 # -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, Target diff --git a/bitbake/lib/toaster/tests/browser/test_toastertable_ui.py b/bitbake/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 @@ from datetime import datetime -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 # -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/toaster/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 @@ 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 from orm.models import Project, Package diff --git a/bitbake/lib/toaster/toastergui/api.py b/bitbake/lib/toaster/toastergui/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 from orm.models import Project, ProjectTarget, Build, Layer_Version from orm.models import LayerVersionDependency, LayerSource, ProjectLayer @@ -25,12 +24,10 @@ from bldcontrol import bbcontroller 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 # development/debugging support verbose = 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 @@ # from toastergui.widgets import ToasterTable -from orm.models import Recipe, ProjectLayer, Layer_Version, Machine, Project +from orm.models import Recipe, ProjectLayer, Layer_Version, Project from orm.models import CustomImageRecipe, Package, Target, Build, LogMessage, 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, IntegerField -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, IntegerField from toastergui.tablefilter import TableFilter from toastergui.tablefilter import TableFilterActionToggle diff --git a/bitbake/lib/toaster/toastergui/templatetags/objects_to_dictionaries_filter.py b/bitbake/lib/toaster/toastergui/templatetags/objects_to_dictionaries_filter.py index 048d533..e242234 100644 --- a/bitbake/lib/toaster/toastergui/templatetags/objects_to_dictionaries_filter.py +++ b/bitbake/lib/toaster/toastergui/templatetags/objects_to_dictionaries_filter.py @@ -3,7 +3,6 @@ # from django import template -import json register = template.Library() 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 @@ # from django import template -from django.core.urlresolvers import reverse +from django.urls import reverse register = template.Library() diff --git a/bitbake/lib/toaster/toastergui/templatetags/projecttags.py b/bitbake/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 # -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 = None): # it manually here return mark_safe(JsonLib.dumps(value, indent=2, default = default, ensure_ascii=False).replace('1.8,<1.12 +Django>2.2,<2.3 beautifulsoup4>=4.4.0 pytz