diff options
Diffstat (limited to 'bitbake/lib/bb/tests')
-rw-r--r-- | bitbake/lib/bb/tests/codeparser.py | 40 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/compression.py | 4 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/data.py | 49 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/fetch-testdata/software/miniupnp/download.php | 3528 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/fetch.py | 1098 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/parse.py | 142 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/persist_data.py | 129 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass | 2 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/runqueue-tests/recipes/g1.bb | 2 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/runqueue-tests/recipes/h1.bb | 0 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/runqueue.py | 11 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/utils.py | 8 |
12 files changed, 4503 insertions, 510 deletions
diff --git a/bitbake/lib/bb/tests/codeparser.py b/bitbake/lib/bb/tests/codeparser.py index f6585fb3aa..c0d1362a0c 100644 --- a/bitbake/lib/bb/tests/codeparser.py +++ b/bitbake/lib/bb/tests/codeparser.py | |||
@@ -106,6 +106,46 @@ ${D}${libdir}/pkgconfig/*.pc | |||
106 | self.parseExpression("foo=$(echo bar)") | 106 | self.parseExpression("foo=$(echo bar)") |
107 | self.assertExecs(set(["echo"])) | 107 | self.assertExecs(set(["echo"])) |
108 | 108 | ||
109 | def test_assign_subshell_expansion_quotes(self): | ||
110 | self.parseExpression('foo="$(echo bar)"') | ||
111 | self.assertExecs(set(["echo"])) | ||
112 | |||
113 | def test_assign_subshell_expansion_nested(self): | ||
114 | self.parseExpression('foo="$(func1 "$(func2 bar$(func3))")"') | ||
115 | self.assertExecs(set(["func1", "func2", "func3"])) | ||
116 | |||
117 | def test_assign_subshell_expansion_multiple(self): | ||
118 | self.parseExpression('foo="$(func1 "$(func2)") $(func3)"') | ||
119 | self.assertExecs(set(["func1", "func2", "func3"])) | ||
120 | |||
121 | def test_assign_subshell_expansion_escaped_quotes(self): | ||
122 | self.parseExpression('foo="\\"fo\\"o$(func1)"') | ||
123 | self.assertExecs(set(["func1"])) | ||
124 | |||
125 | def test_assign_subshell_expansion_empty(self): | ||
126 | self.parseExpression('foo="bar$()foo"') | ||
127 | self.assertExecs(set()) | ||
128 | |||
129 | def test_assign_subshell_backticks(self): | ||
130 | self.parseExpression("foo=`echo bar`") | ||
131 | self.assertExecs(set(["echo"])) | ||
132 | |||
133 | def test_assign_subshell_backticks_quotes(self): | ||
134 | self.parseExpression('foo="`echo bar`"') | ||
135 | self.assertExecs(set(["echo"])) | ||
136 | |||
137 | def test_assign_subshell_backticks_multiple(self): | ||
138 | self.parseExpression('foo="`func1 bar` `func2`"') | ||
139 | self.assertExecs(set(["func1", "func2"])) | ||
140 | |||
141 | def test_assign_subshell_backticks_escaped_quotes(self): | ||
142 | self.parseExpression('foo="\\"fo\\"o`func1`"') | ||
143 | self.assertExecs(set(["func1"])) | ||
144 | |||
145 | def test_assign_subshell_backticks_empty(self): | ||
146 | self.parseExpression('foo="bar``foo"') | ||
147 | self.assertExecs(set()) | ||
148 | |||
109 | def test_shell_unexpanded(self): | 149 | def test_shell_unexpanded(self): |
110 | self.setEmptyVars(["QT_BASE_NAME"]) | 150 | self.setEmptyVars(["QT_BASE_NAME"]) |
111 | self.parseExpression('echo "${QT_BASE_NAME}"') | 151 | self.parseExpression('echo "${QT_BASE_NAME}"') |
diff --git a/bitbake/lib/bb/tests/compression.py b/bitbake/lib/bb/tests/compression.py index 95af3f96d7..16c297b315 100644 --- a/bitbake/lib/bb/tests/compression.py +++ b/bitbake/lib/bb/tests/compression.py | |||
@@ -66,8 +66,8 @@ class CompressionTests(object): | |||
66 | 66 | ||
67 | class LZ4Tests(CompressionTests, unittest.TestCase): | 67 | class LZ4Tests(CompressionTests, unittest.TestCase): |
68 | def setUp(self): | 68 | def setUp(self): |
69 | if shutil.which("lz4c") is None: | 69 | if shutil.which("lz4") is None: |
70 | self.skipTest("'lz4c' not found") | 70 | self.skipTest("'lz4' not found") |
71 | super().setUp() | 71 | super().setUp() |
72 | 72 | ||
73 | @contextlib.contextmanager | 73 | @contextlib.contextmanager |
diff --git a/bitbake/lib/bb/tests/data.py b/bitbake/lib/bb/tests/data.py index cbc7c1ecd4..a895f6a58e 100644 --- a/bitbake/lib/bb/tests/data.py +++ b/bitbake/lib/bb/tests/data.py | |||
@@ -450,17 +450,64 @@ class TestFlags(unittest.TestCase): | |||
450 | self.d = bb.data.init() | 450 | self.d = bb.data.init() |
451 | self.d.setVar("foo", "value of foo") | 451 | self.d.setVar("foo", "value of foo") |
452 | self.d.setVarFlag("foo", "flag1", "value of flag1") | 452 | self.d.setVarFlag("foo", "flag1", "value of flag1") |
453 | self.d.setVarFlag("foo", "_defaultval_flag_flag1", "default of flag1") | ||
453 | self.d.setVarFlag("foo", "flag2", "value of flag2") | 454 | self.d.setVarFlag("foo", "flag2", "value of flag2") |
455 | self.d.setVarFlag("foo", "_defaultval_flag_flag2", "default of flag2") | ||
456 | self.d.setVarFlag("foo", "flag3", "value of flag3") | ||
457 | self.d.setVarFlag("foo", "_defaultval_flag_flagnovalue", "default of flagnovalue") | ||
454 | 458 | ||
455 | def test_setflag(self): | 459 | def test_setflag(self): |
456 | self.assertEqual(self.d.getVarFlag("foo", "flag1", False), "value of flag1") | 460 | self.assertEqual(self.d.getVarFlag("foo", "flag1", False), "value of flag1") |
457 | self.assertEqual(self.d.getVarFlag("foo", "flag2", False), "value of flag2") | 461 | self.assertEqual(self.d.getVarFlag("foo", "flag2", False), "value of flag2") |
462 | self.assertDictEqual( | ||
463 | self.d.getVarFlags("foo"), | ||
464 | { | ||
465 | "flag1": "value of flag1", | ||
466 | "flag2": "value of flag2", | ||
467 | "flag3": "value of flag3", | ||
468 | "flagnovalue": "default of flagnovalue", | ||
469 | } | ||
470 | ) | ||
471 | self.assertDictEqual( | ||
472 | self.d.getVarFlags("foo", internalflags=True), | ||
473 | { | ||
474 | "_content": "value of foo", | ||
475 | "flag1": "value of flag1", | ||
476 | "flag2": "value of flag2", | ||
477 | "flag3": "value of flag3", | ||
478 | "_defaultval_flag_flag1": "default of flag1", | ||
479 | "_defaultval_flag_flag2": "default of flag2", | ||
480 | "_defaultval_flag_flagnovalue": "default of flagnovalue", | ||
481 | } | ||
482 | ) | ||
458 | 483 | ||
459 | def test_delflag(self): | 484 | def test_delflag(self): |
460 | self.d.delVarFlag("foo", "flag2") | 485 | self.d.delVarFlag("foo", "flag2") |
486 | self.d.delVarFlag("foo", "flag3") | ||
461 | self.assertEqual(self.d.getVarFlag("foo", "flag1", False), "value of flag1") | 487 | self.assertEqual(self.d.getVarFlag("foo", "flag1", False), "value of flag1") |
462 | self.assertEqual(self.d.getVarFlag("foo", "flag2", False), None) | 488 | self.assertEqual(self.d.getVarFlag("foo", "flag2", False), None) |
463 | 489 | self.assertDictEqual( | |
490 | self.d.getVarFlags("foo"), | ||
491 | { | ||
492 | "flag1": "value of flag1", | ||
493 | "flagnovalue": "default of flagnovalue", | ||
494 | } | ||
495 | ) | ||
496 | self.assertDictEqual( | ||
497 | self.d.getVarFlags("foo", internalflags=True), | ||
498 | { | ||
499 | "_content": "value of foo", | ||
500 | "flag1": "value of flag1", | ||
501 | "_defaultval_flag_flag1": "default of flag1", | ||
502 | "_defaultval_flag_flagnovalue": "default of flagnovalue", | ||
503 | } | ||
504 | ) | ||
505 | |||
506 | def test_delvar(self): | ||
507 | self.d.delVar("foo") | ||
508 | self.assertEqual(self.d.getVarFlag("foo", "flag1", False), None) | ||
509 | self.assertEqual(self.d.getVarFlag("foo", "flag2", False), None) | ||
510 | self.assertEqual(self.d.getVarFlags("foo", internalflags=True), None) | ||
464 | 511 | ||
465 | class Contains(unittest.TestCase): | 512 | class Contains(unittest.TestCase): |
466 | def setUp(self): | 513 | def setUp(self): |
diff --git a/bitbake/lib/bb/tests/fetch-testdata/software/miniupnp/download.php b/bitbake/lib/bb/tests/fetch-testdata/software/miniupnp/download.php new file mode 100644 index 0000000000..e27ee134f2 --- /dev/null +++ b/bitbake/lib/bb/tests/fetch-testdata/software/miniupnp/download.php | |||
@@ -0,0 +1,3528 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" | ||
3 | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||
4 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | ||
5 | <head> | ||
6 | <title>MiniUPnP download zone</title> | ||
7 | <link href="../css/miniupnp.css" rel="stylesheet" type="text/css"/> | ||
8 | <meta name="description" content="files download of the miniupnp project"/> | ||
9 | <meta name="keywords" content="upnp,download,openbsd,freebsd,linux,windows"/> | ||
10 | <meta name="viewport" content="width=device-width" /> | ||
11 | <link href="rss.php" title="MiniUPnPd, MiniUPnPc and MiniSSDPd Files" type="application/rss+xml" rel="alternate" /> | ||
12 | <link rel="canonical" href="http://miniupnp.free.fr/files/" /> | ||
13 | <link rel="alternate" hreflang="fr" href="/files/index_fr.php" /> | ||
14 | <script async="async" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" type="text/javascript"></script> | ||
15 | <script type="text/javascript"> | ||
16 | (adsbygoogle = window.adsbygoogle || []).push({ | ||
17 | google_ad_client: "ca-pub-6883148866513192", | ||
18 | enable_page_level_ads: true | ||
19 | }); | ||
20 | </script> | ||
21 | </head> | ||
22 | <body> | ||
23 | <h2>MiniUPnP Project</h2> | ||
24 | |||
25 | <p align="center"> | ||
26 | <a href="../">Home</a> | | ||
27 | <b>Downloads</b> | | ||
28 | <a href="../devicelist.php">Compatibility list</a> | | ||
29 | <a href="../libnatpmp.html">libnatpmp</a> | | ||
30 | <a href="../minissdpd.html">MiniSSDPd</a> | | ||
31 | <a href="../xchat-upnp.html">xchat upnp patch</a> | | ||
32 | <a href="../search.html">Search</a> | | ||
33 | <a href="https://miniupnp.tuxfamily.org/forum/">Forum</a> | ||
34 | </p> | ||
35 | <p align="center"> | ||
36 | <b>English</b> | <a href="/files/index_fr.php">Français</a> | ||
37 | </p> | ||
38 | |||
39 | <div align="center"> | ||
40 | <script type="text/javascript"><!-- | ||
41 | google_ad_client = "pub-6883148866513192"; | ||
42 | /* 728x90, created 7/10/08 */ | ||
43 | google_ad_slot = "0774293141"; | ||
44 | google_ad_width = 728; | ||
45 | google_ad_height = 90; | ||
46 | //--> | ||
47 | </script> | ||
48 | <script type="text/javascript" | ||
49 | src="https://pagead2.googlesyndication.com/pagead/show_ads.js"> | ||
50 | </script> | ||
51 | </div> | ||
52 | |||
53 | <h2>MiniUPnP download zone</h2> | ||
54 | <p> | ||
55 | Find on this page the source of miniupnp and | ||
56 | some related files. You will also find precompiled binaries | ||
57 | of the UPnP client sample program for windows compiled using | ||
58 | <a href="https://mingw.osdn.io/">MinGW</a>. There are also Windows | ||
59 | binaries (including python module) automatically built using | ||
60 | <a href="https://ci.appveyor.com/project/miniupnp/miniupnp/build/artifacts">AppVeyor</a>. | ||
61 | </p> | ||
62 | <p>If you just need one of the software installed on your machine, | ||
63 | you probably don't need to download and compile the source files. | ||
64 | It is very likely that a package/port already exists for | ||
65 | your system/distribution. Refer to your system documentation | ||
66 | to find how to search and install a package/port. | ||
67 | Mac OS X does have port systems too : see | ||
68 | <a href="http://www.macports.org/">MacPorts</a> or | ||
69 | <a href="http://mxcl.github.com/homebrew/">Homebrew</a> or | ||
70 | <a href="http://www.finkproject.org/">Fink</a>. | ||
71 | </p> | ||
72 | <p> | ||
73 | The miniupnpc (client) sources have been successfully compiled | ||
74 | under Windows XP/vista/7/10/etc. (using | ||
75 | <a href="https://mingw.osdn.io/">MinGW</a>, | ||
76 | <a href="https://www.mingw-w64.org/">Mingw-w64</a> | ||
77 | or <a href="http://www.cygwin.com/">Cygwin</a>), | ||
78 | Linux, OpenBSD, FreeBSD, NetBSD, DragonFlyBSD, | ||
79 | Solaris, MacOS X and AmigaOS. <br/> | ||
80 | The Makefile of the client is made for GNU make : | ||
81 | check which version your system have | ||
82 | with the command "make --version". On some systems, such as OpenBSD, | ||
83 | you have to use "gmake". Under Windows with MinGW, GNU make is | ||
84 | called "mingw32-make" and a sligthly modified version of the Makefile | ||
85 | should be used : Makefile.mingw. Run "mingw32make.bat" to compile. <br/> | ||
86 | If you have any compatibility problem, please post on the | ||
87 | <a href="https://miniupnp.tuxfamily.org/forum/">forum</a> | ||
88 | or contact me by email. | ||
89 | </p> | ||
90 | <!-- | ||
91 | <p>A devoted user compiled miniupnp<strong>c</strong> for | ||
92 | Openwrt (currently Kamikaze 7.09) | ||
93 | and his work is available here : | ||
94 | <a href="http://replay.waybackmachine.org/20081120030628/http://www.myantihero.net/pub/openwrt/packages/">http://myantihero.net/pub/openwrt/packages/</a>.</p> | ||
95 | --> | ||
96 | <p>Get miniupnpc under AmigaOS 4 on | ||
97 | <a href="http://os4depot.net/index.php?function=showfile&file=network/misc/miniupnpc.lha">OS4Depot</a>. | ||
98 | </p> | ||
99 | <p> | ||
100 | Dario Meloni has made a Ruby Gem embedding miniupnpc : | ||
101 | <a href="https://rubygems.org/gems/mupnp">https://rubygems.org/gems/mupnp</a>. | ||
102 | </p> | ||
103 | <p> | ||
104 | The python module is available on pypi.org : | ||
105 | <a href="https://pypi.org/project/miniupnpc/">pip install miniupnpc</a>. | ||
106 | </p> | ||
107 | <p> | ||
108 | The daemon (starting in November 2006) compiles with BSD make under BSD | ||
109 | and Solaris.<br/> | ||
110 | To compile the daemon under linux, use "make -f Makefile.linux"<br/> | ||
111 | To compile for <a href="http://openwrt.org/">OpenWRT</a> | ||
112 | please read the README.openwrt file, or use the packages | ||
113 | <a href="https://openwrt.org/packages/pkgdata/miniupnpd">miniupnpc</a> and | ||
114 | <a href="https://openwrt.org/packages/pkgdata/miniupnpd">miniupnpd</a>. | ||
115 | <!-- The | ||
116 | <a href="http://www.x-wrt.org/">X-Wrt</a> project is providing | ||
117 | precompiled ipkg packages for OpenWrt for both OpenWrt | ||
118 | <a href="ftp://ftp.berlios.de/pub/xwrt/packages/">White Russian</a> | ||
119 | and OpenWrt | ||
120 | <a href="ftp://ftp.berlios.de/pub/xwrt/kamikaze/packages">kamikaze</a>. | ||
121 | Check | ||
122 | <a href="ftp://ftp.berlios.de/pub/xwrt/">ftp://ftp.berlios.de/pub/xwrt/</a>. | ||
123 | For White Russian, take a look at | ||
124 | <a href="http://jackassofalltrades.com/openwrt/">this</a>. --> | ||
125 | <br/> | ||
126 | <a href="http://pfsense.com">pfSense</a> users are advised to use the | ||
127 | miniupnpd port available for their system. Recent versions of | ||
128 | pfSense include MiniUPnPd in the base system. | ||
129 | <br/> | ||
130 | For <a href="http://en.wikipedia.org/wiki/WRT54G">Linksys WRT54G</a> | ||
131 | and WRT54GL owners, | ||
132 | <a href="http://sourceforge.net/projects/tarifa/">Tarifa firmware</a> | ||
133 | is another alternative to get miniUPnPd running on the router. | ||
134 | </p> | ||
135 | <p> | ||
136 | Please read README and | ||
137 | LICENCE files included with the distribution for further informations. | ||
138 | </p> | ||
139 | <p> | ||
140 | The MiniUPnP daemon (miniupnpd) is working under | ||
141 | <a href="http://www.openbsd.org/">OpenBSD</a>, | ||
142 | <a href="http://www.netbsd.org/">NetBSD</a>, | ||
143 | <a href="http://www.freebsd.org/">FreeBSD</a>, | ||
144 | <a href="http://www.dragonflybsd.org/">DragonFlyBSD</a>, | ||
145 | <a href="http://www.apple.com/macosx/">Mac OS X</a> and | ||
146 | (<a href="https://en.wikipedia.org/wiki/OpenSolaris">Open</a>)<a href="http://www.oracle.com/us/products/servers-storage/solaris/solaris11/overview/index.html">Solaris</a> | ||
147 | with <a href="http://www.openbsd.org/faq/pf/">pf</a>, | ||
148 | with <a href="https://en.wikipedia.org/wiki/IPFilter">IP Filter</a> or | ||
149 | with <a href="http://en.wikipedia.org/wiki/Ipfirewall">ipfw</a>. | ||
150 | The linux version uses either libiptc which permits to access | ||
151 | <a href="http://netfilter.org/">netfilter</a> | ||
152 | rules inside the kernel the same way as | ||
153 | <a href="https://www.netfilter.org/projects/iptables/index.html">iptables</a>, or | ||
154 | <a href="https://www.netfilter.org/projects/libnftnl/index.html">libnftnl</a> | ||
155 | which is the equivalent for | ||
156 | <a href="https://www.netfilter.org/projects/nftables/index.html">nftables</a>. | ||
157 | </p> | ||
158 | |||
159 | <p>Releases are now GPG signed with the key <a href="../A31ACAAF.asc">A31ACAAF</a>. | ||
160 | Previous signing key was <a href="../A5C0863C.asc">A5C0863C</a>. | ||
161 | Get it from your favorite | ||
162 | <a href="https://pgp.mit.edu/pks/lookup?search=0xA31ACAAF&op=index&fingerprint=on">key server</a>.</p> | ||
163 | |||
164 | <h4>REST API</h4> | ||
165 | <p>You can use the REST API to get the latest releases available:</p> | ||
166 | <ul> | ||
167 | <li><a href="rest.php/tags/miniupnpd?count=1">rest.php/tags/miniupnpd?count=1</a>: latest miniupnpd.</li> | ||
168 | <li><a href="rest.php/tags?count=1">rest.php/tags?count=1</a>: miniupnpc, miniupnpd and minissdpd.</li> | ||
169 | </ul> | ||
170 | |||
171 | <h4>You can help !</h4> | ||
172 | <p>If you make a package/port for your favorite OS distribution, | ||
173 | inform me so I can upload the package here or add a link to your | ||
174 | repository. | ||
175 | </p> | ||
176 | |||
177 | <h4>Latest files</h4> | ||
178 | <table> | ||
179 | <tr><th>name</th> | ||
180 | <th>size</th> | ||
181 | <th>date</th> | ||
182 | <th>comment</th> | ||
183 | <th><!-- Changelog --></th> | ||
184 | <th><!-- Signature --></th> | ||
185 | </tr> | ||
186 | <tr> | ||
187 | <td class="filename"><a href='miniupnpc-2.3.2.tar.gz'>miniupnpc-2.3.2.tar.gz</a></td> | ||
188 | <td class="filesize">140137</td> | ||
189 | <td class="filedate">05/03/2025 10:31</td> | ||
190 | <td class="comment">MiniUPnP client release source code</td> | ||
191 | <td><a href="changelog.php?file=miniupnpc-2.3.2.tar.gz">changelog</a></td> | ||
192 | <td><a href="miniupnpc-2.3.2.tar.gz.sig">Signature</a></td> | ||
193 | </tr> | ||
194 | <tr> | ||
195 | <td class="filename"><a href='miniupnpd-2.3.7.tar.gz'>miniupnpd-2.3.7.tar.gz</a></td> | ||
196 | <td class="filesize">265329</td> | ||
197 | <td class="filedate">22/06/2024 22:31</td> | ||
198 | <td class="comment">MiniUPnP daemon release source code</td> | ||
199 | <td><a href="changelog.php?file=miniupnpd-2.3.7.tar.gz">changelog</a></td> | ||
200 | <td><a href="miniupnpd-2.3.7.tar.gz.sig">Signature</a></td> | ||
201 | </tr> | ||
202 | <tr> | ||
203 | <td class="filename"><a href='libnatpmp-20230423.tar.gz'>libnatpmp-20230423.tar.gz</a></td> | ||
204 | <td class="filesize">26506</td> | ||
205 | <td class="filedate">23/04/2023 11:02</td> | ||
206 | <td class="comment">latest libnatpmp source code</td> | ||
207 | <td><a href="changelog.php?file=libnatpmp-20230423.tar.gz">changelog</a></td> | ||
208 | <td><a href="libnatpmp-20230423.tar.gz.sig">Signature</a></td> | ||
209 | </tr> | ||
210 | <tr> | ||
211 | <td class="filename"><a href='minissdpd-1.6.0.tar.gz'>minissdpd-1.6.0.tar.gz</a></td> | ||
212 | <td class="filesize">39077</td> | ||
213 | <td class="filedate">22/10/2022 18:41</td> | ||
214 | <td class="comment">MiniSSDPd release source code</td> | ||
215 | <td><a href="changelog.php?file=minissdpd-1.6.0.tar.gz">changelog</a></td> | ||
216 | <td><a href="minissdpd-1.6.0.tar.gz.sig">Signature</a></td> | ||
217 | </tr> | ||
218 | <tr> | ||
219 | <td class="filename"><a href='upnpc-exe-win32-20220515.zip'>upnpc-exe-win32-20220515.zip</a></td> | ||
220 | <td class="filesize">69503</td> | ||
221 | <td class="filedate">15/05/2022 14:31</td> | ||
222 | <td class="comment">Windows executable</td> | ||
223 | <td><a href="changelog.php?file=upnpc-exe-win32-20220515.zip">changelog</a></td> | ||
224 | <td></td> | ||
225 | </tr> | ||
226 | <tr> | ||
227 | <td class="filename"><a href='minissdpd-1.5.20211105.tar.gz'>minissdpd-1.5.20211105.tar.gz</a></td> | ||
228 | <td class="filesize">38870</td> | ||
229 | <td class="filedate">04/11/2021 23:34</td> | ||
230 | <td class="comment">latest MiniSSDPd source code</td> | ||
231 | <td><a href="changelog.php?file=minissdpd-1.5.20211105.tar.gz">changelog</a></td> | ||
232 | <td><a href="minissdpd-1.5.20211105.tar.gz.sig">Signature</a></td> | ||
233 | </tr> | ||
234 | <tr> | ||
235 | <td class="filename"><a href='miniupnpc-2.1.20201016.tar.gz'>miniupnpc-2.1.20201016.tar.gz</a></td> | ||
236 | <td class="filesize">97682</td> | ||
237 | <td class="filedate">15/10/2020 22:31</td> | ||
238 | <td class="comment">latest MiniUPnP client source code</td> | ||
239 | <td><a href="changelog.php?file=miniupnpc-2.1.20201016.tar.gz">changelog</a></td> | ||
240 | <td><a href="miniupnpc-2.1.20201016.tar.gz.sig">Signature</a></td> | ||
241 | </tr> | ||
242 | <tr> | ||
243 | <td class="filename"><a href='miniupnpd-2.1.20200510.tar.gz'>miniupnpd-2.1.20200510.tar.gz</a></td> | ||
244 | <td class="filesize">245426</td> | ||
245 | <td class="filedate">10/05/2020 18:23</td> | ||
246 | <td class="comment">latest MiniUPnP daemon source code</td> | ||
247 | <td><a href="changelog.php?file=miniupnpd-2.1.20200510.tar.gz">changelog</a></td> | ||
248 | <td><a href="miniupnpd-2.1.20200510.tar.gz.sig">Signature</a></td> | ||
249 | </tr> | ||
250 | <tr> | ||
251 | <td class="filename"><a href='xchat-upnp20110811.patch'>xchat-upnp20110811.patch</a></td> | ||
252 | <td class="filesize">10329</td> | ||
253 | <td class="filedate">11/08/2011 15:18</td> | ||
254 | <td class="comment">Patch to add UPnP capabilities to xchat</td> | ||
255 | <td><a href="changelog.php?file=xchat-upnp20110811.patch">changelog</a></td> | ||
256 | <td></td> | ||
257 | </tr> | ||
258 | <tr> | ||
259 | <td class="filename"><a href='minidlna_1.0.21.minissdp1.patch'>minidlna_1.0.21.minissdp1.patch</a></td> | ||
260 | <td class="filesize">7598</td> | ||
261 | <td class="filedate">25/07/2011 14:57</td> | ||
262 | <td class="comment">Patch for MiniDLNA to use miniSSDPD</td> | ||
263 | <td><a href="changelog.php?file=minidlna_1.0.21.minissdp1.patch">changelog</a></td> | ||
264 | <td></td> | ||
265 | </tr> | ||
266 | <tr> | ||
267 | <td class="filename"><a href='miniupnpc-new20060630.tar.gz'>miniupnpc-new20060630.tar.gz</a></td> | ||
268 | <td class="filesize">14840</td> | ||
269 | <td class="filedate">04/11/2006 18:16</td> | ||
270 | <td class="comment">João Paulo Barraca version of the upnp client</td> | ||
271 | <td><a href="changelog.php?file=miniupnpc-new20060630.tar.gz">changelog</a></td> | ||
272 | <td></td> | ||
273 | </tr> | ||
274 | </table> | ||
275 | |||
276 | <h4>All files</h4> | ||
277 | <table> | ||
278 | <tr><th>name</th> | ||
279 | <th>size</th> | ||
280 | <th>date</th> | ||
281 | <th>comment</th> | ||
282 | <th><!-- signature --></th> | ||
283 | </tr> | ||
284 | <tr> | ||
285 | <td class="filename"><a href='download.php?file=miniupnpc-2.3.2.tar.gz'>miniupnpc-2.3.2.tar.gz</a></td> | ||
286 | <td class="filesize">140137</td> | ||
287 | <td class="filedate">05/03/2025 10:31:36 +0000</td> | ||
288 | <td class="comment">MiniUPnP client release source code</td> | ||
289 | <td><a href="miniupnpc-2.3.2.tar.gz.sig">Signature</a></td> | ||
290 | </tr> | ||
291 | <tr> | ||
292 | <td class="filename"><a href='download.php?file=miniupnpc-2.3.1.tar.gz'>miniupnpc-2.3.1.tar.gz</a></td> | ||
293 | <td class="filesize">139499</td> | ||
294 | <td class="filedate">23/02/2025 16:44:16 +0000</td> | ||
295 | <td class="comment">MiniUPnP client release source code</td> | ||
296 | <td><a href="miniupnpc-2.3.1.tar.gz.sig">Signature</a></td> | ||
297 | </tr> | ||
298 | <tr> | ||
299 | <td class="filename"><a href='download.php?file=miniupnpc-2.3.0.tar.gz'>miniupnpc-2.3.0.tar.gz</a></td> | ||
300 | <td class="filesize">105071</td> | ||
301 | <td class="filedate">10/01/2025 23:16:45 +0000</td> | ||
302 | <td class="comment">MiniUPnP client release source code</td> | ||
303 | <td><a href="miniupnpc-2.3.0.tar.gz.sig">Signature</a></td> | ||
304 | </tr> | ||
305 | <tr> | ||
306 | <td class="filename"><a href='download.php?file=miniupnpd-2.3.7.tar.gz'>miniupnpd-2.3.7.tar.gz</a></td> | ||
307 | <td class="filesize">265329</td> | ||
308 | <td class="filedate">22/06/2024 22:31:38 +0000</td> | ||
309 | <td class="comment">MiniUPnP daemon release source code</td> | ||
310 | <td><a href="miniupnpd-2.3.7.tar.gz.sig">Signature</a></td> | ||
311 | </tr> | ||
312 | <tr> | ||
313 | <td class="filename"><a href='download.php?file=miniupnpc-2.2.8.tar.gz'>miniupnpc-2.2.8.tar.gz</a></td> | ||
314 | <td class="filesize">104603</td> | ||
315 | <td class="filedate">08/06/2024 22:13:39 +0000</td> | ||
316 | <td class="comment">MiniUPnP client release source code</td> | ||
317 | <td><a href="miniupnpc-2.2.8.tar.gz.sig">Signature</a></td> | ||
318 | </tr> | ||
319 | <tr> | ||
320 | <td class="filename"><a href='download.php?file=miniupnpd-2.3.6.tar.gz'>miniupnpd-2.3.6.tar.gz</a></td> | ||
321 | <td class="filesize">263018</td> | ||
322 | <td class="filedate">19/03/2024 23:39:51 +0000</td> | ||
323 | <td class="comment">MiniUPnP daemon release source code</td> | ||
324 | <td><a href="miniupnpd-2.3.6.tar.gz.sig">Signature</a></td> | ||
325 | </tr> | ||
326 | <tr> | ||
327 | <td class="filename"><a href='download.php?file=miniupnpc-2.2.7.tar.gz'>miniupnpc-2.2.7.tar.gz</a></td> | ||
328 | <td class="filesize">104258</td> | ||
329 | <td class="filedate">19/03/2024 23:25:18 +0000</td> | ||
330 | <td class="comment">MiniUPnP client release source code</td> | ||
331 | <td><a href="miniupnpc-2.2.7.tar.gz.sig">Signature</a></td> | ||
332 | </tr> | ||
333 | <tr> | ||
334 | <td class="filename"><a href='download.php?file=miniupnpd-2.3.5.tar.gz'>miniupnpd-2.3.5.tar.gz</a></td> | ||
335 | <td class="filesize">261952</td> | ||
336 | <td class="filedate">02/03/2024 11:04:07 +0000</td> | ||
337 | <td class="comment">MiniUPnP daemon release source code</td> | ||
338 | <td><a href="miniupnpd-2.3.5.tar.gz.sig">Signature</a></td> | ||
339 | </tr> | ||
340 | <tr> | ||
341 | <td class="filename"><a href='download.php?file=miniupnpd-2.3.4.tar.gz'>miniupnpd-2.3.4.tar.gz</a></td> | ||
342 | <td class="filesize">260810</td> | ||
343 | <td class="filedate">04/01/2024 00:53:17 +0000</td> | ||
344 | <td class="comment">MiniUPnP daemon release source code</td> | ||
345 | <td><a href="miniupnpd-2.3.4.tar.gz.sig">Signature</a></td> | ||
346 | </tr> | ||
347 | <tr> | ||
348 | <td class="filename"><a href='download.php?file=miniupnpc-2.2.6.tar.gz'>miniupnpc-2.2.6.tar.gz</a></td> | ||
349 | <td class="filesize">103949</td> | ||
350 | <td class="filedate">04/01/2024 00:27:14 +0000</td> | ||
351 | <td class="comment">MiniUPnP client release source code</td> | ||
352 | <td><a href="miniupnpc-2.2.6.tar.gz.sig">Signature</a></td> | ||
353 | </tr> | ||
354 | <tr> | ||
355 | <td class="filename"><a href='download.php?file=miniupnpc-2.2.5.tar.gz'>miniupnpc-2.2.5.tar.gz</a></td> | ||
356 | <td class="filesize">103654</td> | ||
357 | <td class="filedate">11/06/2023 23:14:56 +0000</td> | ||
358 | <td class="comment">MiniUPnP client release source code</td> | ||
359 | <td><a href="miniupnpc-2.2.5.tar.gz.sig">Signature</a></td> | ||
360 | </tr> | ||
361 | <tr> | ||
362 | <td class="filename"><a href='download.php?file=libnatpmp-20230423.tar.gz'>libnatpmp-20230423.tar.gz</a></td> | ||
363 | <td class="filesize">26506</td> | ||
364 | <td class="filedate">23/04/2023 11:02:09 +0000</td> | ||
365 | <td class="comment">libnatpmp source code</td> | ||
366 | <td><a href="libnatpmp-20230423.tar.gz.sig">Signature</a></td> | ||
367 | </tr> | ||
368 | <tr> | ||
369 | <td class="filename"><a href='download.php?file=miniupnpd-2.3.3.tar.gz'>miniupnpd-2.3.3.tar.gz</a></td> | ||
370 | <td class="filesize">260079</td> | ||
371 | <td class="filedate">17/02/2023 03:07:46 +0000</td> | ||
372 | <td class="comment">MiniUPnP daemon release source code</td> | ||
373 | <td><a href="miniupnpd-2.3.3.tar.gz.sig">Signature</a></td> | ||
374 | </tr> | ||
375 | <tr> | ||
376 | <td class="filename"><a href='download.php?file=miniupnpd-2.3.2.tar.gz'>miniupnpd-2.3.2.tar.gz</a></td> | ||
377 | <td class="filesize">259686</td> | ||
378 | <td class="filedate">19/01/2023 23:18:08 +0000</td> | ||
379 | <td class="comment">MiniUPnP daemon release source code</td> | ||
380 | <td><a href="miniupnpd-2.3.2.tar.gz.sig">Signature</a></td> | ||
381 | </tr> | ||
382 | <tr> | ||
383 | <td class="filename"><a href='download.php?file=minissdpd-1.6.0.tar.gz'>minissdpd-1.6.0.tar.gz</a></td> | ||
384 | <td class="filesize">39077</td> | ||
385 | <td class="filedate">22/10/2022 18:41:54 +0000</td> | ||
386 | <td class="comment">MiniSSDPd release source code</td> | ||
387 | <td><a href="minissdpd-1.6.0.tar.gz.sig">Signature</a></td> | ||
388 | </tr> | ||
389 | <tr> | ||
390 | <td class="filename"><a href='download.php?file=miniupnpc-2.2.4.tar.gz'>miniupnpc-2.2.4.tar.gz</a></td> | ||
391 | <td class="filesize">102932</td> | ||
392 | <td class="filedate">21/10/2022 21:01:01 +0000</td> | ||
393 | <td class="comment">MiniUPnP client release source code</td> | ||
394 | <td><a href="miniupnpc-2.2.4.tar.gz.sig">Signature</a></td> | ||
395 | </tr> | ||
396 | <tr> | ||
397 | <td class="filename"><a href='download.php?file=miniupnpd-2.3.1.tar.gz'>miniupnpd-2.3.1.tar.gz</a></td> | ||
398 | <td class="filesize">258050</td> | ||
399 | <td class="filedate">16/10/2022 05:58:44 +0000</td> | ||
400 | <td class="comment">MiniUPnP daemon release source code</td> | ||
401 | <td><a href="miniupnpd-2.3.1.tar.gz.sig">Signature</a></td> | ||
402 | </tr> | ||
403 | <tr> | ||
404 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20220515.zip'>upnpc-exe-win32-20220515.zip</a></td> | ||
405 | <td class="filesize">69503</td> | ||
406 | <td class="filedate">15/05/2022 14:31:25 +0000</td> | ||
407 | <td class="comment">Windows executable</td> | ||
408 | <td></td> | ||
409 | </tr> | ||
410 | <tr> | ||
411 | <td class="filename"><a href='download.php?file=hexchat-2.16.patch'>hexchat-2.16.patch</a></td> | ||
412 | <td class="filesize">8147</td> | ||
413 | <td class="filedate">19/03/2022 16:52:05 +0000</td> | ||
414 | <td class="comment"></td> | ||
415 | <td></td> | ||
416 | </tr> | ||
417 | <tr> | ||
418 | <td class="filename"><a href='download.php?file=miniupnpd-2.3.0.tar.gz'>miniupnpd-2.3.0.tar.gz</a></td> | ||
419 | <td class="filesize">256069</td> | ||
420 | <td class="filedate">23/01/2022 00:23:32 +0000</td> | ||
421 | <td class="comment">MiniUPnP daemon release source code</td> | ||
422 | <td><a href="miniupnpd-2.3.0.tar.gz.sig">Signature</a></td> | ||
423 | </tr> | ||
424 | <tr> | ||
425 | <td class="filename"><a href='download.php?file=minissdpd-1.5.20211105.tar.gz'>minissdpd-1.5.20211105.tar.gz</a></td> | ||
426 | <td class="filesize">38870</td> | ||
427 | <td class="filedate">04/11/2021 23:34:49 +0000</td> | ||
428 | <td class="comment">MiniSSDPd source code</td> | ||
429 | <td><a href="minissdpd-1.5.20211105.tar.gz.sig">Signature</a></td> | ||
430 | </tr> | ||
431 | <tr> | ||
432 | <td class="filename"><a href='download.php?file=miniupnpc-2.2.3.tar.gz'>miniupnpc-2.2.3.tar.gz</a></td> | ||
433 | <td class="filesize">101360</td> | ||
434 | <td class="filedate">28/09/2021 21:43:32 +0000</td> | ||
435 | <td class="comment">MiniUPnP client release source code</td> | ||
436 | <td><a href="miniupnpc-2.2.3.tar.gz.sig">Signature</a></td> | ||
437 | </tr> | ||
438 | <tr> | ||
439 | <td class="filename"><a href='download.php?file=miniupnpd-2.2.3.tar.gz'>miniupnpd-2.2.3.tar.gz</a></td> | ||
440 | <td class="filesize">254752</td> | ||
441 | <td class="filedate">21/08/2021 08:35:13 +0000</td> | ||
442 | <td class="comment">MiniUPnP daemon release source code</td> | ||
443 | <td><a href="miniupnpd-2.2.3.tar.gz.sig">Signature</a></td> | ||
444 | </tr> | ||
445 | <tr> | ||
446 | <td class="filename"><a href='download.php?file=miniupnpd-2.2.2.tar.gz'>miniupnpd-2.2.2.tar.gz</a></td> | ||
447 | <td class="filesize">250649</td> | ||
448 | <td class="filedate">13/05/2021 11:30:11 +0000</td> | ||
449 | <td class="comment">MiniUPnP daemon release source code</td> | ||
450 | <td><a href="miniupnpd-2.2.2.tar.gz.sig">Signature</a></td> | ||
451 | </tr> | ||
452 | <tr> | ||
453 | <td class="filename"><a href='download.php?file=miniupnpc-2.2.2.tar.gz'>miniupnpc-2.2.2.tar.gz</a></td> | ||
454 | <td class="filesize">100008</td> | ||
455 | <td class="filedate">02/03/2021 23:44:52 +0000</td> | ||
456 | <td class="comment">MiniUPnP client release source code</td> | ||
457 | <td><a href="miniupnpc-2.2.2.tar.gz.sig">Signature</a></td> | ||
458 | </tr> | ||
459 | <tr> | ||
460 | <td class="filename"><a href='download.php?file=miniupnpd-2.2.1.tar.gz'>miniupnpd-2.2.1.tar.gz</a></td> | ||
461 | <td class="filesize">250023</td> | ||
462 | <td class="filedate">20/12/2020 18:08:08 +0000</td> | ||
463 | <td class="comment">MiniUPnP daemon release source code</td> | ||
464 | <td><a href="miniupnpd-2.2.1.tar.gz.sig">Signature</a></td> | ||
465 | </tr> | ||
466 | <tr> | ||
467 | <td class="filename"><a href='download.php?file=miniupnpc-2.2.1.tar.gz'>miniupnpc-2.2.1.tar.gz</a></td> | ||
468 | <td class="filesize">99595</td> | ||
469 | <td class="filedate">20/12/2020 18:08:02 +0000</td> | ||
470 | <td class="comment">MiniUPnP client release source code</td> | ||
471 | <td><a href="miniupnpc-2.2.1.tar.gz.sig">Signature</a></td> | ||
472 | </tr> | ||
473 | <tr> | ||
474 | <td class="filename"><a href='download.php?file=miniupnpc-2.2.0.tar.gz'>miniupnpc-2.2.0.tar.gz</a></td> | ||
475 | <td class="filesize">98348</td> | ||
476 | <td class="filedate">09/11/2020 19:51:24 +0000</td> | ||
477 | <td class="comment">MiniUPnP client release source code</td> | ||
478 | <td><a href="miniupnpc-2.2.0.tar.gz.sig">Signature</a></td> | ||
479 | </tr> | ||
480 | <tr> | ||
481 | <td class="filename"><a href='download.php?file=miniupnpd-2.2.0.tar.gz'>miniupnpd-2.2.0.tar.gz</a></td> | ||
482 | <td class="filesize">249858</td> | ||
483 | <td class="filedate">31/10/2020 09:20:59 +0000</td> | ||
484 | <td class="comment">MiniUPnP daemon release source code</td> | ||
485 | <td><a href="miniupnpd-2.2.0.tar.gz.sig">Signature</a></td> | ||
486 | </tr> | ||
487 | <tr> | ||
488 | <td class="filename"><a href='download.php?file=miniupnpd-2.2.0-RC3.tar.gz'>miniupnpd-2.2.0-RC3.tar.gz</a></td> | ||
489 | <td class="filesize">249879</td> | ||
490 | <td class="filedate">30/10/2020 21:49:49 +0000</td> | ||
491 | <td class="comment">MiniUPnP daemon release source code</td> | ||
492 | <td><a href="miniupnpd-2.2.0-RC3.tar.gz.sig">Signature</a></td> | ||
493 | </tr> | ||
494 | <tr> | ||
495 | <td class="filename"><a href='download.php?file=miniupnpc-2.1.20201016.tar.gz'>miniupnpc-2.1.20201016.tar.gz</a></td> | ||
496 | <td class="filesize">97682</td> | ||
497 | <td class="filedate">15/10/2020 22:31:09 +0000</td> | ||
498 | <td class="comment">MiniUPnP client source code</td> | ||
499 | <td><a href="miniupnpc-2.1.20201016.tar.gz.sig">Signature</a></td> | ||
500 | </tr> | ||
501 | <tr> | ||
502 | <td class="filename"><a href='download.php?file=miniupnpd-2.2.0-RC2.tar.gz'>miniupnpd-2.2.0-RC2.tar.gz</a></td> | ||
503 | <td class="filesize">248756</td> | ||
504 | <td class="filedate">28/09/2020 21:57:22 +0000</td> | ||
505 | <td class="comment">MiniUPnP daemon release source code</td> | ||
506 | <td><a href="miniupnpd-2.2.0-RC2.tar.gz.sig">Signature</a></td> | ||
507 | </tr> | ||
508 | <tr> | ||
509 | <td class="filename"><a href='download.php?file=miniupnpc-2.1.20200928.tar.gz'>miniupnpc-2.1.20200928.tar.gz</a></td> | ||
510 | <td class="filesize">96508</td> | ||
511 | <td class="filedate">28/09/2020 21:56:09 +0000</td> | ||
512 | <td class="comment">MiniUPnP client source code</td> | ||
513 | <td><a href="miniupnpc-2.1.20200928.tar.gz.sig">Signature</a></td> | ||
514 | </tr> | ||
515 | <tr> | ||
516 | <td class="filename"><a href='download.php?file=minissdpd-1.5.20200928.tar.gz'>minissdpd-1.5.20200928.tar.gz</a></td> | ||
517 | <td class="filesize">37860</td> | ||
518 | <td class="filedate">28/09/2020 21:55:40 +0000</td> | ||
519 | <td class="comment">MiniSSDPd source code</td> | ||
520 | <td><a href="minissdpd-1.5.20200928.tar.gz.sig">Signature</a></td> | ||
521 | </tr> | ||
522 | <tr> | ||
523 | <td class="filename"><a href='download.php?file=miniupnpd-2.2.0-RC1.tar.gz'>miniupnpd-2.2.0-RC1.tar.gz</a></td> | ||
524 | <td class="filesize">247772</td> | ||
525 | <td class="filedate">06/06/2020 18:34:50 +0000</td> | ||
526 | <td class="comment">MiniUPnP daemon release source code</td> | ||
527 | <td><a href="miniupnpd-2.2.0-RC1.tar.gz.sig">Signature</a></td> | ||
528 | </tr> | ||
529 | <tr> | ||
530 | <td class="filename"><a href='download.php?file=miniupnpd-2.2.0-RC0.tar.gz'>miniupnpd-2.2.0-RC0.tar.gz</a></td> | ||
531 | <td class="filesize">245507</td> | ||
532 | <td class="filedate">16/05/2020 18:03:17 +0000</td> | ||
533 | <td class="comment">MiniUPnP daemon release source code</td> | ||
534 | <td><a href="miniupnpd-2.2.0-RC0.tar.gz.sig">Signature</a></td> | ||
535 | </tr> | ||
536 | <tr> | ||
537 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20200510.tar.gz'>miniupnpd-2.1.20200510.tar.gz</a></td> | ||
538 | <td class="filesize">245426</td> | ||
539 | <td class="filedate">10/05/2020 18:23:13 +0000</td> | ||
540 | <td class="comment">MiniUPnP daemon source code</td> | ||
541 | <td><a href="miniupnpd-2.1.20200510.tar.gz.sig">Signature</a></td> | ||
542 | </tr> | ||
543 | <tr> | ||
544 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20200329.tar.gz'>miniupnpd-2.1.20200329.tar.gz</a></td> | ||
545 | <td class="filesize">243725</td> | ||
546 | <td class="filedate">29/03/2020 09:11:02 +0000</td> | ||
547 | <td class="comment">MiniUPnP daemon source code</td> | ||
548 | <td><a href="miniupnpd-2.1.20200329.tar.gz.sig">Signature</a></td> | ||
549 | </tr> | ||
550 | <tr> | ||
551 | <td class="filename"><a href='download.php?file=miniupnpc-2.1.20191224.tar.gz'>miniupnpc-2.1.20191224.tar.gz</a></td> | ||
552 | <td class="filesize">94740</td> | ||
553 | <td class="filedate">23/12/2019 23:37:32 +0000</td> | ||
554 | <td class="comment">MiniUPnP client source code</td> | ||
555 | <td><a href="miniupnpc-2.1.20191224.tar.gz.sig">Signature</a></td> | ||
556 | </tr> | ||
557 | <tr> | ||
558 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20191006.tar.gz'>miniupnpd-2.1.20191006.tar.gz</a></td> | ||
559 | <td class="filesize">243255</td> | ||
560 | <td class="filedate">06/10/2019 21:02:31 +0000</td> | ||
561 | <td class="comment">MiniUPnP daemon source code</td> | ||
562 | <td><a href="miniupnpd-2.1.20191006.tar.gz.sig">Signature</a></td> | ||
563 | </tr> | ||
564 | <tr> | ||
565 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20191005.tar.gz'>miniupnpd-2.1.20191005.tar.gz</a></td> | ||
566 | <td class="filesize">244100</td> | ||
567 | <td class="filedate">05/10/2019 21:33:08 +0000</td> | ||
568 | <td class="comment">MiniUPnP daemon source code</td> | ||
569 | <td><a href="miniupnpd-2.1.20191005.tar.gz.sig">Signature</a></td> | ||
570 | </tr> | ||
571 | <tr> | ||
572 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20191003.tar.gz'>miniupnpd-2.1.20191003.tar.gz</a></td> | ||
573 | <td class="filesize">243287</td> | ||
574 | <td class="filedate">02/10/2019 22:23:51 +0000</td> | ||
575 | <td class="comment">MiniUPnP daemon source code</td> | ||
576 | <td><a href="miniupnpd-2.1.20191003.tar.gz.sig">Signature</a></td> | ||
577 | </tr> | ||
578 | <tr> | ||
579 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20190924.tar.gz'>miniupnpd-2.1.20190924.tar.gz</a></td> | ||
580 | <td class="filesize">241008</td> | ||
581 | <td class="filedate">24/09/2019 11:58:15 +0000</td> | ||
582 | <td class="comment">MiniUPnP daemon source code</td> | ||
583 | <td><a href="miniupnpd-2.1.20190924.tar.gz.sig">Signature</a></td> | ||
584 | </tr> | ||
585 | <tr> | ||
586 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20190902.tar.gz'>miniupnpd-2.1.20190902.tar.gz</a></td> | ||
587 | <td class="filesize">240742</td> | ||
588 | <td class="filedate">01/09/2019 23:03:03 +0000</td> | ||
589 | <td class="comment">MiniUPnP daemon source code</td> | ||
590 | <td><a href="miniupnpd-2.1.20190902.tar.gz.sig">Signature</a></td> | ||
591 | </tr> | ||
592 | <tr> | ||
593 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20190824.tar.gz'>miniupnpd-2.1.20190824.tar.gz</a></td> | ||
594 | <td class="filesize">240490</td> | ||
595 | <td class="filedate">24/08/2019 09:21:52 +0000</td> | ||
596 | <td class="comment">MiniUPnP daemon source code</td> | ||
597 | <td><a href="miniupnpd-2.1.20190824.tar.gz.sig">Signature</a></td> | ||
598 | </tr> | ||
599 | <tr> | ||
600 | <td class="filename"><a href='download.php?file=minissdpd-1.5.20190824.tar.gz'>minissdpd-1.5.20190824.tar.gz</a></td> | ||
601 | <td class="filesize">37300</td> | ||
602 | <td class="filedate">24/08/2019 09:17:32 +0000</td> | ||
603 | <td class="comment">MiniSSDPd source code</td> | ||
604 | <td><a href="minissdpd-1.5.20190824.tar.gz.sig">Signature</a></td> | ||
605 | </tr> | ||
606 | <tr> | ||
607 | <td class="filename"><a href='download.php?file=miniupnpc-2.1.20190824.tar.gz'>miniupnpc-2.1.20190824.tar.gz</a></td> | ||
608 | <td class="filesize">94564</td> | ||
609 | <td class="filedate">24/08/2019 09:12:50 +0000</td> | ||
610 | <td class="comment">MiniUPnP client source code</td> | ||
611 | <td><a href="miniupnpc-2.1.20190824.tar.gz.sig">Signature</a></td> | ||
612 | </tr> | ||
613 | <tr> | ||
614 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20190630.tar.gz'>miniupnpd-2.1.20190630.tar.gz</a></td> | ||
615 | <td class="filesize">240466</td> | ||
616 | <td class="filedate">30/06/2019 20:27:38 +0000</td> | ||
617 | <td class="comment">MiniUPnP daemon source code</td> | ||
618 | <td><a href="miniupnpd-2.1.20190630.tar.gz.sig">Signature</a></td> | ||
619 | </tr> | ||
620 | <tr> | ||
621 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20190625.tar.gz'>miniupnpd-2.1.20190625.tar.gz</a></td> | ||
622 | <td class="filesize">240120</td> | ||
623 | <td class="filedate">25/06/2019 21:33:49 +0000</td> | ||
624 | <td class="comment">MiniUPnP daemon source code</td> | ||
625 | <td><a href="miniupnpd-2.1.20190625.tar.gz.sig">Signature</a></td> | ||
626 | </tr> | ||
627 | <tr> | ||
628 | <td class="filename"><a href='download.php?file=miniupnpc-2.1.20190625.tar.gz'>miniupnpc-2.1.20190625.tar.gz</a></td> | ||
629 | <td class="filesize">94461</td> | ||
630 | <td class="filedate">25/06/2019 21:33:26 +0000</td> | ||
631 | <td class="comment">MiniUPnP client source code</td> | ||
632 | <td><a href="miniupnpc-2.1.20190625.tar.gz.sig">Signature</a></td> | ||
633 | </tr> | ||
634 | <tr> | ||
635 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20190502.tar.gz'>miniupnpd-2.1.20190502.tar.gz</a></td> | ||
636 | <td class="filesize">236052</td> | ||
637 | <td class="filedate">02/05/2019 17:22:23 +0000</td> | ||
638 | <td class="comment">MiniUPnP daemon source code</td> | ||
639 | <td><a href="miniupnpd-2.1.20190502.tar.gz.sig">Signature</a></td> | ||
640 | </tr> | ||
641 | <tr> | ||
642 | <td class="filename"><a href='download.php?file=miniupnpc-2.1.20190408.tar.gz'>miniupnpc-2.1.20190408.tar.gz</a></td> | ||
643 | <td class="filesize">94216</td> | ||
644 | <td class="filedate">08/04/2019 12:50:21 +0000</td> | ||
645 | <td class="comment">MiniUPnP client source code</td> | ||
646 | <td><a href="miniupnpc-2.1.20190408.tar.gz.sig">Signature</a></td> | ||
647 | </tr> | ||
648 | <tr> | ||
649 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20190408.tar.gz'>miniupnpd-2.1.20190408.tar.gz</a></td> | ||
650 | <td class="filesize">235989</td> | ||
651 | <td class="filedate">08/04/2019 12:50:01 +0000</td> | ||
652 | <td class="comment">MiniUPnP daemon source code</td> | ||
653 | <td><a href="miniupnpd-2.1.20190408.tar.gz.sig">Signature</a></td> | ||
654 | </tr> | ||
655 | <tr> | ||
656 | <td class="filename"><a href='download.php?file=miniupnpc-2.1.20190403.tar.gz'>miniupnpc-2.1.20190403.tar.gz</a></td> | ||
657 | <td class="filesize">94204</td> | ||
658 | <td class="filedate">03/04/2019 15:41:36 +0000</td> | ||
659 | <td class="comment">MiniUPnP client source code</td> | ||
660 | <td><a href="miniupnpc-2.1.20190403.tar.gz.sig">Signature</a></td> | ||
661 | </tr> | ||
662 | <tr> | ||
663 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20190403.tar.gz'>miniupnpd-2.1.20190403.tar.gz</a></td> | ||
664 | <td class="filesize">235909</td> | ||
665 | <td class="filedate">03/04/2019 15:41:17 +0000</td> | ||
666 | <td class="comment">MiniUPnP daemon source code</td> | ||
667 | <td><a href="miniupnpd-2.1.20190403.tar.gz.sig">Signature</a></td> | ||
668 | </tr> | ||
669 | <tr> | ||
670 | <td class="filename"><a href='download.php?file=minissdpd-1.5.20190210.tar.gz'>minissdpd-1.5.20190210.tar.gz</a></td> | ||
671 | <td class="filesize">37227</td> | ||
672 | <td class="filedate">10/02/2019 15:21:49 +0000</td> | ||
673 | <td class="comment">MiniSSDPd source code</td> | ||
674 | <td><a href="minissdpd-1.5.20190210.tar.gz.sig">Signature</a></td> | ||
675 | </tr> | ||
676 | <tr> | ||
677 | <td class="filename"><a href='download.php?file=miniupnpc-2.1.20190210.tar.gz'>miniupnpc-2.1.20190210.tar.gz</a></td> | ||
678 | <td class="filesize">94125</td> | ||
679 | <td class="filedate">10/02/2019 12:46:09 +0000</td> | ||
680 | <td class="comment">MiniUPnP client source code</td> | ||
681 | <td><a href="miniupnpc-2.1.20190210.tar.gz.sig">Signature</a></td> | ||
682 | </tr> | ||
683 | <tr> | ||
684 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20190210.tar.gz'>miniupnpd-2.1.20190210.tar.gz</a></td> | ||
685 | <td class="filesize">235093</td> | ||
686 | <td class="filedate">10/02/2019 11:20:11 +0000</td> | ||
687 | <td class="comment">MiniUPnP daemon source code</td> | ||
688 | <td><a href="miniupnpd-2.1.20190210.tar.gz.sig">Signature</a></td> | ||
689 | </tr> | ||
690 | <tr> | ||
691 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.20180706.tar.gz'>miniupnpd-2.1.20180706.tar.gz</a></td> | ||
692 | <td class="filesize">233675</td> | ||
693 | <td class="filedate">06/07/2018 12:44:24 +0000</td> | ||
694 | <td class="comment">MiniUPnP daemon source code</td> | ||
695 | <td><a href="miniupnpd-2.1.20180706.tar.gz.sig">Signature</a></td> | ||
696 | </tr> | ||
697 | <tr> | ||
698 | <td class="filename"><a href='download.php?file=miniupnpd-2.1.tar.gz'>miniupnpd-2.1.tar.gz</a></td> | ||
699 | <td class="filesize">225458</td> | ||
700 | <td class="filedate">08/05/2018 21:50:32 +0000</td> | ||
701 | <td class="comment">MiniUPnP daemon release source code</td> | ||
702 | <td><a href="miniupnpd-2.1.tar.gz.sig">Signature</a></td> | ||
703 | </tr> | ||
704 | <tr> | ||
705 | <td class="filename"><a href='download.php?file=miniupnpc-2.1.tar.gz'>miniupnpc-2.1.tar.gz</a></td> | ||
706 | <td class="filesize">91914</td> | ||
707 | <td class="filedate">07/05/2018 11:10:59 +0000</td> | ||
708 | <td class="comment">MiniUPnP client release source code</td> | ||
709 | <td><a href="miniupnpc-2.1.tar.gz.sig">Signature</a></td> | ||
710 | </tr> | ||
711 | <tr> | ||
712 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.20180503.tar.gz'>miniupnpd-2.0.20180503.tar.gz</a></td> | ||
713 | <td class="filesize">225454</td> | ||
714 | <td class="filedate">03/05/2018 08:33:10 +0000</td> | ||
715 | <td class="comment">MiniUPnP daemon source code</td> | ||
716 | <td></td> | ||
717 | </tr> | ||
718 | <tr> | ||
719 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20180503.tar.gz'>miniupnpc-2.0.20180503.tar.gz</a></td> | ||
720 | <td class="filesize">88207</td> | ||
721 | <td class="filedate">03/05/2018 08:31:22 +0000</td> | ||
722 | <td class="comment">MiniUPnP client source code</td> | ||
723 | <td></td> | ||
724 | </tr> | ||
725 | <tr> | ||
726 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.20180422.tar.gz'>miniupnpd-2.0.20180422.tar.gz</a></td> | ||
727 | <td class="filesize">224942</td> | ||
728 | <td class="filedate">22/04/2018 19:48:54 +0000</td> | ||
729 | <td class="comment">MiniUPnP daemon source code</td> | ||
730 | <td></td> | ||
731 | </tr> | ||
732 | <tr> | ||
733 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.20180412.tar.gz'>miniupnpd-2.0.20180412.tar.gz</a></td> | ||
734 | <td class="filesize">224831</td> | ||
735 | <td class="filedate">12/04/2018 08:16:25 +0000</td> | ||
736 | <td class="comment">MiniUPnP daemon source code</td> | ||
737 | <td></td> | ||
738 | </tr> | ||
739 | <tr> | ||
740 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.20180410.tar.gz'>miniupnpd-2.0.20180410.tar.gz</a></td> | ||
741 | <td class="filesize">224736</td> | ||
742 | <td class="filedate">10/04/2018 07:58:28 +0000</td> | ||
743 | <td class="comment">MiniUPnP daemon source code</td> | ||
744 | <td></td> | ||
745 | </tr> | ||
746 | <tr> | ||
747 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20180410.tar.gz'>miniupnpc-2.0.20180410.tar.gz</a></td> | ||
748 | <td class="filesize">87363</td> | ||
749 | <td class="filedate">10/04/2018 07:52:55 +0000</td> | ||
750 | <td class="comment">MiniUPnP client source code</td> | ||
751 | <td></td> | ||
752 | </tr> | ||
753 | <tr> | ||
754 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20180406.tar.gz'>miniupnpc-2.0.20180406.tar.gz</a></td> | ||
755 | <td class="filesize">87374</td> | ||
756 | <td class="filedate">06/04/2018 10:55:21 +0000</td> | ||
757 | <td class="comment">MiniUPnP client source code</td> | ||
758 | <td></td> | ||
759 | </tr> | ||
760 | <tr> | ||
761 | <td class="filename"><a href='download.php?file=minissdpd-1.5.20180223.tar.gz'>minissdpd-1.5.20180223.tar.gz</a></td> | ||
762 | <td class="filesize">36179</td> | ||
763 | <td class="filedate">23/02/2018 14:24:07 +0000</td> | ||
764 | <td class="comment">MiniSSDPd source code</td> | ||
765 | <td></td> | ||
766 | </tr> | ||
767 | <tr> | ||
768 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20180222.tar.gz'>miniupnpc-2.0.20180222.tar.gz</a></td> | ||
769 | <td class="filesize">87018</td> | ||
770 | <td class="filedate">22/02/2018 15:09:24 +0000</td> | ||
771 | <td class="comment">MiniUPnP client source code</td> | ||
772 | <td></td> | ||
773 | </tr> | ||
774 | <tr> | ||
775 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.20180222.tar.gz'>miniupnpd-2.0.20180222.tar.gz</a></td> | ||
776 | <td class="filesize">223697</td> | ||
777 | <td class="filedate">22/02/2018 15:09:14 +0000</td> | ||
778 | <td class="comment">MiniUPnP daemon source code</td> | ||
779 | <td></td> | ||
780 | </tr> | ||
781 | <tr> | ||
782 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.20180203.tar.gz'>miniupnpd-2.0.20180203.tar.gz</a></td> | ||
783 | <td class="filesize">223084</td> | ||
784 | <td class="filedate">03/02/2018 22:34:46 +0000</td> | ||
785 | <td class="comment">MiniUPnP daemon source code</td> | ||
786 | <td></td> | ||
787 | </tr> | ||
788 | <tr> | ||
789 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20180203.tar.gz'>miniupnpc-2.0.20180203.tar.gz</a></td> | ||
790 | <td class="filesize">86772</td> | ||
791 | <td class="filedate">03/02/2018 22:34:32 +0000</td> | ||
792 | <td class="comment">MiniUPnP client source code</td> | ||
793 | <td></td> | ||
794 | </tr> | ||
795 | <tr> | ||
796 | <td class="filename"><a href='download.php?file=minissdpd-1.5.20180203.tar.gz'>minissdpd-1.5.20180203.tar.gz</a></td> | ||
797 | <td class="filesize">35848</td> | ||
798 | <td class="filedate">03/02/2018 22:33:08 +0000</td> | ||
799 | <td class="comment">MiniSSDPd source code</td> | ||
800 | <td></td> | ||
801 | </tr> | ||
802 | <tr> | ||
803 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20171212.tar.gz'>miniupnpc-2.0.20171212.tar.gz</a></td> | ||
804 | <td class="filesize">86607</td> | ||
805 | <td class="filedate">12/12/2017 12:03:38 +0000</td> | ||
806 | <td class="comment">MiniUPnP client source code</td> | ||
807 | <td></td> | ||
808 | </tr> | ||
809 | <tr> | ||
810 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.20171212.tar.gz'>miniupnpd-2.0.20171212.tar.gz</a></td> | ||
811 | <td class="filesize">222617</td> | ||
812 | <td class="filedate">12/12/2017 12:03:32 +0000</td> | ||
813 | <td class="comment">MiniUPnP daemon source code</td> | ||
814 | <td></td> | ||
815 | </tr> | ||
816 | <tr> | ||
817 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20171102.tar.gz'>miniupnpc-2.0.20171102.tar.gz</a></td> | ||
818 | <td class="filesize">86363</td> | ||
819 | <td class="filedate">02/11/2017 17:58:34 +0000</td> | ||
820 | <td class="comment">MiniUPnP client source code</td> | ||
821 | <td></td> | ||
822 | </tr> | ||
823 | <tr> | ||
824 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20170509.tar.gz'>miniupnpc-2.0.20170509.tar.gz</a></td> | ||
825 | <td class="filesize">86055</td> | ||
826 | <td class="filedate">09/05/2017 10:14:56 +0000</td> | ||
827 | <td class="comment">MiniUPnP client source code</td> | ||
828 | <td></td> | ||
829 | </tr> | ||
830 | <tr> | ||
831 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20170421.tar.gz'>miniupnpc-2.0.20170421.tar.gz</a></td> | ||
832 | <td class="filesize">85984</td> | ||
833 | <td class="filedate">21/04/2017 12:02:26 +0000</td> | ||
834 | <td class="comment">MiniUPnP client source code</td> | ||
835 | <td></td> | ||
836 | </tr> | ||
837 | <tr> | ||
838 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.20170421.tar.gz'>miniupnpd-2.0.20170421.tar.gz</a></td> | ||
839 | <td class="filesize">219191</td> | ||
840 | <td class="filedate">21/04/2017 12:02:06 +0000</td> | ||
841 | <td class="comment">MiniUPnP daemon source code</td> | ||
842 | <td></td> | ||
843 | </tr> | ||
844 | <tr> | ||
845 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.20161216.tar.gz'>miniupnpd-2.0.20161216.tar.gz</a></td> | ||
846 | <td class="filesize">218119</td> | ||
847 | <td class="filedate">16/12/2016 09:34:08 +0000</td> | ||
848 | <td class="comment">MiniUPnP daemon source code</td> | ||
849 | <td></td> | ||
850 | </tr> | ||
851 | <tr> | ||
852 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.20161216.tar.gz'>miniupnpc-2.0.20161216.tar.gz</a></td> | ||
853 | <td class="filesize">85780</td> | ||
854 | <td class="filedate">16/12/2016 09:34:03 +0000</td> | ||
855 | <td class="comment">MiniUPnP client source code</td> | ||
856 | <td></td> | ||
857 | </tr> | ||
858 | <tr> | ||
859 | <td class="filename"><a href='download.php?file=minissdpd-1.5.20161216.tar.gz'>minissdpd-1.5.20161216.tar.gz</a></td> | ||
860 | <td class="filesize">35078</td> | ||
861 | <td class="filedate">16/12/2016 09:33:59 +0000</td> | ||
862 | <td class="comment">MiniSSDPd source code</td> | ||
863 | <td></td> | ||
864 | </tr> | ||
865 | <tr> | ||
866 | <td class="filename"><a href='download.php?file=miniupnpd-2.0.tar.gz'>miniupnpd-2.0.tar.gz</a></td> | ||
867 | <td class="filesize">217802</td> | ||
868 | <td class="filedate">19/04/2016 21:12:01 +0000</td> | ||
869 | <td class="comment">MiniUPnP daemon release source code</td> | ||
870 | <td><a href="miniupnpd-2.0.tar.gz.sig">Signature</a></td> | ||
871 | </tr> | ||
872 | <tr> | ||
873 | <td class="filename"><a href='download.php?file=miniupnpc-2.0.tar.gz'>miniupnpc-2.0.tar.gz</a></td> | ||
874 | <td class="filesize">85287</td> | ||
875 | <td class="filedate">19/04/2016 21:07:52 +0000</td> | ||
876 | <td class="comment">MiniUPnP client release source code</td> | ||
877 | <td></td> | ||
878 | </tr> | ||
879 | <tr> | ||
880 | <td class="filename"><a href='download.php?file=minissdpd-1.5.20160301.tar.gz'>minissdpd-1.5.20160301.tar.gz</a></td> | ||
881 | <td class="filesize">34827</td> | ||
882 | <td class="filedate">01/03/2016 18:08:23 +0000</td> | ||
883 | <td class="comment">MiniSSDPd source code</td> | ||
884 | <td></td> | ||
885 | </tr> | ||
886 | <tr> | ||
887 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20160222.tar.gz'>miniupnpd-1.9.20160222.tar.gz</a></td> | ||
888 | <td class="filesize">217541</td> | ||
889 | <td class="filedate">22/02/2016 10:21:40 +0000</td> | ||
890 | <td class="comment">MiniUPnP daemon source code</td> | ||
891 | <td></td> | ||
892 | </tr> | ||
893 | <tr> | ||
894 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20160216.tar.gz'>miniupnpd-1.9.20160216.tar.gz</a></td> | ||
895 | <td class="filesize">217007</td> | ||
896 | <td class="filedate">16/02/2016 12:41:44 +0000</td> | ||
897 | <td class="comment">MiniUPnP daemon source code</td> | ||
898 | <td></td> | ||
899 | </tr> | ||
900 | <tr> | ||
901 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20160212.tar.gz'>miniupnpd-1.9.20160212.tar.gz</a></td> | ||
902 | <td class="filesize">215866</td> | ||
903 | <td class="filedate">12/02/2016 15:22:04 +0000</td> | ||
904 | <td class="comment">MiniUPnP daemon source code</td> | ||
905 | <td></td> | ||
906 | </tr> | ||
907 | <tr> | ||
908 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20160209.tar.gz'>miniupnpd-1.9.20160209.tar.gz</a></td> | ||
909 | <td class="filesize">213416</td> | ||
910 | <td class="filedate">09/02/2016 09:47:03 +0000</td> | ||
911 | <td class="comment">MiniUPnP daemon source code</td> | ||
912 | <td></td> | ||
913 | </tr> | ||
914 | <tr> | ||
915 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20160209.tar.gz'>miniupnpc-1.9.20160209.tar.gz</a></td> | ||
916 | <td class="filesize">85268</td> | ||
917 | <td class="filedate">09/02/2016 09:44:50 +0000</td> | ||
918 | <td class="comment">MiniUPnP client source code</td> | ||
919 | <td></td> | ||
920 | </tr> | ||
921 | <tr> | ||
922 | <td class="filename"><a href='download.php?file=minissdpd-1.5.20160119.tar.gz'>minissdpd-1.5.20160119.tar.gz</a></td> | ||
923 | <td class="filesize">34711</td> | ||
924 | <td class="filedate">19/01/2016 13:39:51 +0000</td> | ||
925 | <td class="comment">MiniSSDPd source code</td> | ||
926 | <td></td> | ||
927 | </tr> | ||
928 | <tr> | ||
929 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20160113.tar.gz'>miniupnpd-1.9.20160113.tar.gz</a></td> | ||
930 | <td class="filesize">211437</td> | ||
931 | <td class="filedate">13/01/2016 16:03:14 +0000</td> | ||
932 | <td class="comment">MiniUPnP daemon source code</td> | ||
933 | <td></td> | ||
934 | </tr> | ||
935 | <tr> | ||
936 | <td class="filename"><a href='download.php?file=minissdpd-1.5.tar.gz'>minissdpd-1.5.tar.gz</a></td> | ||
937 | <td class="filesize">34404</td> | ||
938 | <td class="filedate">13/01/2016 15:26:53 +0000</td> | ||
939 | <td class="comment">MiniSSDPd release source code</td> | ||
940 | <td></td> | ||
941 | </tr> | ||
942 | <tr> | ||
943 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20151212.tar.gz'>miniupnpd-1.9.20151212.tar.gz</a></td> | ||
944 | <td class="filesize">210912</td> | ||
945 | <td class="filedate">12/12/2015 10:06:07 +0000</td> | ||
946 | <td class="comment">MiniUPnP daemon source code</td> | ||
947 | <td></td> | ||
948 | </tr> | ||
949 | <tr> | ||
950 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20151118.tar.gz'>miniupnpd-1.9.20151118.tar.gz</a></td> | ||
951 | <td class="filesize">210322</td> | ||
952 | <td class="filedate">18/11/2015 08:59:46 +0000</td> | ||
953 | <td class="comment">MiniUPnP daemon source code</td> | ||
954 | <td></td> | ||
955 | </tr> | ||
956 | <tr> | ||
957 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20151026.tar.gz'>miniupnpc-1.9.20151026.tar.gz</a></td> | ||
958 | <td class="filesize">84208</td> | ||
959 | <td class="filedate">26/10/2015 17:07:34 +0000</td> | ||
960 | <td class="comment">MiniUPnP client source code</td> | ||
961 | <td></td> | ||
962 | </tr> | ||
963 | <tr> | ||
964 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20151008.tar.gz'>miniupnpc-1.9.20151008.tar.gz</a></td> | ||
965 | <td class="filesize">83538</td> | ||
966 | <td class="filedate">08/10/2015 16:22:28 +0000</td> | ||
967 | <td class="comment">MiniUPnP client source code</td> | ||
968 | <td></td> | ||
969 | </tr> | ||
970 | <tr> | ||
971 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20150922.tar.gz'>miniupnpd-1.9.20150922.tar.gz</a></td> | ||
972 | <td class="filesize">208700</td> | ||
973 | <td class="filedate">22/09/2015 10:21:50 +0000</td> | ||
974 | <td class="comment">MiniUPnP daemon source code</td> | ||
975 | <td></td> | ||
976 | </tr> | ||
977 | <tr> | ||
978 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20150918.zip'>upnpc-exe-win32-20150918.zip</a></td> | ||
979 | <td class="filesize">100004</td> | ||
980 | <td class="filedate">18/09/2015 12:50:51 +0000</td> | ||
981 | <td class="comment">Windows executable</td> | ||
982 | <td></td> | ||
983 | </tr> | ||
984 | <tr> | ||
985 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20150917.tar.gz'>miniupnpc-1.9.20150917.tar.gz</a></td> | ||
986 | <td class="filesize">82609</td> | ||
987 | <td class="filedate">17/09/2015 14:09:14 +0000</td> | ||
988 | <td class="comment">MiniUPnP client source code</td> | ||
989 | <td></td> | ||
990 | </tr> | ||
991 | <tr> | ||
992 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20150824.zip'>upnpc-exe-win32-20150824.zip</a></td> | ||
993 | <td class="filesize">99520</td> | ||
994 | <td class="filedate">24/08/2015 15:25:18 +0000</td> | ||
995 | <td class="comment">Windows executable</td> | ||
996 | <td></td> | ||
997 | </tr> | ||
998 | <tr> | ||
999 | <td class="filename"><a href='download.php?file=minissdpd-1.4.tar.gz'>minissdpd-1.4.tar.gz</a></td> | ||
1000 | <td class="filesize">32017</td> | ||
1001 | <td class="filedate">06/08/2015 13:38:37 +0000</td> | ||
1002 | <td class="comment">MiniSSDPd release source code</td> | ||
1003 | <td></td> | ||
1004 | </tr> | ||
1005 | <tr> | ||
1006 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20150730.tar.gz'>miniupnpc-1.9.20150730.tar.gz</a></td> | ||
1007 | <td class="filesize">81431</td> | ||
1008 | <td class="filedate">29/07/2015 22:10:00 +0000</td> | ||
1009 | <td class="comment">MiniUPnP client source code</td> | ||
1010 | <td></td> | ||
1011 | </tr> | ||
1012 | <tr> | ||
1013 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20150721.tar.gz'>miniupnpd-1.9.20150721.tar.gz</a></td> | ||
1014 | <td class="filesize">207562</td> | ||
1015 | <td class="filedate">21/07/2015 13:35:51 +0000</td> | ||
1016 | <td class="comment">MiniUPnP daemon source code</td> | ||
1017 | <td></td> | ||
1018 | </tr> | ||
1019 | <tr> | ||
1020 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20150721.tar.gz'>miniupnpc-1.9.20150721.tar.gz</a></td> | ||
1021 | <td class="filesize">80521</td> | ||
1022 | <td class="filedate">21/07/2015 13:27:00 +0000</td> | ||
1023 | <td class="comment">MiniUPnP client source code</td> | ||
1024 | <td></td> | ||
1025 | </tr> | ||
1026 | <tr> | ||
1027 | <td class="filename"><a href='download.php?file=libnatpmp-20150609.tar.gz'>libnatpmp-20150609.tar.gz</a></td> | ||
1028 | <td class="filesize">24392</td> | ||
1029 | <td class="filedate">09/06/2015 15:40:28 +0000</td> | ||
1030 | <td class="comment">libnatpmp source code</td> | ||
1031 | <td></td> | ||
1032 | </tr> | ||
1033 | <tr> | ||
1034 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20150609.tar.gz'>miniupnpc-1.9.20150609.tar.gz</a></td> | ||
1035 | <td class="filesize">79311</td> | ||
1036 | <td class="filedate">09/06/2015 15:39:48 +0000</td> | ||
1037 | <td class="comment">MiniUPnP client source code</td> | ||
1038 | <td></td> | ||
1039 | </tr> | ||
1040 | <tr> | ||
1041 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20150609.tar.gz'>miniupnpd-1.9.20150609.tar.gz</a></td> | ||
1042 | <td class="filesize">207088</td> | ||
1043 | <td class="filedate">09/06/2015 15:39:36 +0000</td> | ||
1044 | <td class="comment">MiniUPnP daemon source code</td> | ||
1045 | <td></td> | ||
1046 | </tr> | ||
1047 | <tr> | ||
1048 | <td class="filename"><a href='download.php?file=minissdpd-1.3.20150527.tar.gz'>minissdpd-1.3.20150527.tar.gz</a></td> | ||
1049 | <td class="filesize">31025</td> | ||
1050 | <td class="filedate">27/05/2015 09:17:15 +0000</td> | ||
1051 | <td class="comment">MiniSSDPd source code</td> | ||
1052 | <td></td> | ||
1053 | </tr> | ||
1054 | <tr> | ||
1055 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20150522.tar.gz'>miniupnpc-1.9.20150522.tar.gz</a></td> | ||
1056 | <td class="filesize">79080</td> | ||
1057 | <td class="filedate">22/05/2015 11:02:27 +0000</td> | ||
1058 | <td class="comment">MiniUPnP client source code</td> | ||
1059 | <td></td> | ||
1060 | </tr> | ||
1061 | <tr> | ||
1062 | <td class="filename"><a href='download.php?file=minissdpd-1.3.20150522.tar.gz'>minissdpd-1.3.20150522.tar.gz</a></td> | ||
1063 | <td class="filesize">30334</td> | ||
1064 | <td class="filedate">22/05/2015 11:02:04 +0000</td> | ||
1065 | <td class="comment">MiniSSDPd source code</td> | ||
1066 | <td></td> | ||
1067 | </tr> | ||
1068 | <tr> | ||
1069 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20150430.tar.gz'>miniupnpd-1.9.20150430.tar.gz</a></td> | ||
1070 | <td class="filesize">205930</td> | ||
1071 | <td class="filedate">30/04/2015 09:09:27 +0000</td> | ||
1072 | <td class="comment">MiniUPnP daemon source code</td> | ||
1073 | <td></td> | ||
1074 | </tr> | ||
1075 | <tr> | ||
1076 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20150430.tar.gz'>miniupnpc-1.9.20150430.tar.gz</a></td> | ||
1077 | <td class="filesize">78459</td> | ||
1078 | <td class="filedate">30/04/2015 08:39:31 +0000</td> | ||
1079 | <td class="comment">MiniUPnP client source code</td> | ||
1080 | <td></td> | ||
1081 | </tr> | ||
1082 | <tr> | ||
1083 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20150427.tar.gz'>miniupnpc-1.9.20150427.tar.gz</a></td> | ||
1084 | <td class="filesize">78424</td> | ||
1085 | <td class="filedate">27/04/2015 16:08:42 +0000</td> | ||
1086 | <td class="comment">MiniUPnP client source code</td> | ||
1087 | <td></td> | ||
1088 | </tr> | ||
1089 | <tr> | ||
1090 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20150427.tar.gz'>miniupnpd-1.9.20150427.tar.gz</a></td> | ||
1091 | <td class="filesize">191157</td> | ||
1092 | <td class="filedate">27/04/2015 16:08:27 +0000</td> | ||
1093 | <td class="comment">MiniUPnP daemon source code</td> | ||
1094 | <td></td> | ||
1095 | </tr> | ||
1096 | <tr> | ||
1097 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20150307.tar.gz'>miniupnpd-1.9.20150307.tar.gz</a></td> | ||
1098 | <td class="filesize">190913</td> | ||
1099 | <td class="filedate">07/03/2015 16:11:51 +0000</td> | ||
1100 | <td class="comment">MiniUPnP daemon source code</td> | ||
1101 | <td></td> | ||
1102 | </tr> | ||
1103 | <tr> | ||
1104 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20150206.tar.gz'>miniupnpc-1.9.20150206.tar.gz</a></td> | ||
1105 | <td class="filesize">76864</td> | ||
1106 | <td class="filedate">06/02/2015 14:38:00 +0000</td> | ||
1107 | <td class="comment">MiniUPnP client source code</td> | ||
1108 | <td></td> | ||
1109 | </tr> | ||
1110 | <tr> | ||
1111 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20141209.tar.gz'>miniupnpd-1.9.20141209.tar.gz</a></td> | ||
1112 | <td class="filesize">193183</td> | ||
1113 | <td class="filedate">09/12/2014 09:58:34 +0000</td> | ||
1114 | <td class="comment">MiniUPnP daemon source code</td> | ||
1115 | <td></td> | ||
1116 | </tr> | ||
1117 | <tr> | ||
1118 | <td class="filename"><a href='download.php?file=minissdpd-1.3.tar.gz'>minissdpd-1.3.tar.gz</a></td> | ||
1119 | <td class="filesize">30326</td> | ||
1120 | <td class="filedate">09/12/2014 09:57:30 +0000</td> | ||
1121 | <td class="comment">MiniSSDPd release source code</td> | ||
1122 | <td></td> | ||
1123 | </tr> | ||
1124 | <tr> | ||
1125 | <td class="filename"><a href='download.php?file=minissdpd-1.2.20141204.tar.gz'>minissdpd-1.2.20141204.tar.gz</a></td> | ||
1126 | <td class="filesize">26978</td> | ||
1127 | <td class="filedate">04/12/2014 10:55:26 +0000</td> | ||
1128 | <td class="comment">MiniSSDPd source code</td> | ||
1129 | <td></td> | ||
1130 | </tr> | ||
1131 | <tr> | ||
1132 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20141204.tar.gz'>miniupnpd-1.9.20141204.tar.gz</a></td> | ||
1133 | <td class="filesize">192597</td> | ||
1134 | <td class="filedate">04/12/2014 10:55:03 +0000</td> | ||
1135 | <td class="comment">MiniUPnP daemon source code</td> | ||
1136 | <td></td> | ||
1137 | </tr> | ||
1138 | <tr> | ||
1139 | <td class="filename"><a href='download.php?file=minissdpd-1.2.20141128.tar.gz'>minissdpd-1.2.20141128.tar.gz</a></td> | ||
1140 | <td class="filesize">26795</td> | ||
1141 | <td class="filedate">28/11/2014 16:33:10 +0000</td> | ||
1142 | <td class="comment">MiniSSDPd source code</td> | ||
1143 | <td></td> | ||
1144 | </tr> | ||
1145 | <tr> | ||
1146 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20141128.tar.gz'>miniupnpd-1.9.20141128.tar.gz</a></td> | ||
1147 | <td class="filesize">192558</td> | ||
1148 | <td class="filedate">28/11/2014 13:31:36 +0000</td> | ||
1149 | <td class="comment">MiniUPnP daemon source code</td> | ||
1150 | <td></td> | ||
1151 | </tr> | ||
1152 | <tr> | ||
1153 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20141128.tar.gz'>miniupnpc-1.9.20141128.tar.gz</a></td> | ||
1154 | <td class="filesize">76541</td> | ||
1155 | <td class="filedate">28/11/2014 13:31:15 +0000</td> | ||
1156 | <td class="comment">MiniUPnP client source code</td> | ||
1157 | <td></td> | ||
1158 | </tr> | ||
1159 | <tr> | ||
1160 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20141117.tar.gz'>miniupnpc-1.9.20141117.tar.gz</a></td> | ||
1161 | <td class="filesize">73865</td> | ||
1162 | <td class="filedate">17/11/2014 09:51:36 +0000</td> | ||
1163 | <td class="comment">MiniUPnP client source code</td> | ||
1164 | <td></td> | ||
1165 | </tr> | ||
1166 | <tr> | ||
1167 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20141113.tar.gz'>miniupnpc-1.9.20141113.tar.gz</a></td> | ||
1168 | <td class="filesize">72857</td> | ||
1169 | <td class="filedate">13/11/2014 10:36:44 +0000</td> | ||
1170 | <td class="comment">MiniUPnP client source code</td> | ||
1171 | <td></td> | ||
1172 | </tr> | ||
1173 | <tr> | ||
1174 | <td class="filename"><a href='download.php?file=minissdpd-1.2.20141108.tar.gz'>minissdpd-1.2.20141108.tar.gz</a></td> | ||
1175 | <td class="filesize">22001</td> | ||
1176 | <td class="filedate">08/11/2014 13:55:41 +0000</td> | ||
1177 | <td class="comment">MiniSSDPd source code</td> | ||
1178 | <td></td> | ||
1179 | </tr> | ||
1180 | <tr> | ||
1181 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20141108.tar.gz'>miniupnpc-1.9.20141108.tar.gz</a></td> | ||
1182 | <td class="filesize">72781</td> | ||
1183 | <td class="filedate">08/11/2014 13:53:48 +0000</td> | ||
1184 | <td class="comment">MiniUPnP client source code</td> | ||
1185 | <td></td> | ||
1186 | </tr> | ||
1187 | <tr> | ||
1188 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.20141108.tar.gz'>miniupnpd-1.9.20141108.tar.gz</a></td> | ||
1189 | <td class="filesize">192413</td> | ||
1190 | <td class="filedate">08/11/2014 13:53:38 +0000</td> | ||
1191 | <td class="comment">MiniUPnP daemon source code</td> | ||
1192 | <td></td> | ||
1193 | </tr> | ||
1194 | <tr> | ||
1195 | <td class="filename"><a href='download.php?file=miniupnpd-1.9.tar.gz'>miniupnpd-1.9.tar.gz</a></td> | ||
1196 | <td class="filesize">192183</td> | ||
1197 | <td class="filedate">27/10/2014 16:45:34 +0000</td> | ||
1198 | <td class="comment">MiniUPnP daemon release source code</td> | ||
1199 | <td></td> | ||
1200 | </tr> | ||
1201 | <tr> | ||
1202 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20141027.tar.gz'>miniupnpc-1.9.20141027.tar.gz</a></td> | ||
1203 | <td class="filesize">76763</td> | ||
1204 | <td class="filedate">27/10/2014 16:45:25 +0000</td> | ||
1205 | <td class="comment">MiniUPnP client source code</td> | ||
1206 | <td></td> | ||
1207 | </tr> | ||
1208 | <tr> | ||
1209 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20141022.tar.gz'>miniupnpd-1.8.20141022.tar.gz</a></td> | ||
1210 | <td class="filesize">191630</td> | ||
1211 | <td class="filedate">22/10/2014 09:17:41 +0000</td> | ||
1212 | <td class="comment">MiniUPnP daemon source code</td> | ||
1213 | <td></td> | ||
1214 | </tr> | ||
1215 | <tr> | ||
1216 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20141021.tar.gz'>miniupnpd-1.8.20141021.tar.gz</a></td> | ||
1217 | <td class="filesize">191270</td> | ||
1218 | <td class="filedate">21/10/2014 14:18:58 +0000</td> | ||
1219 | <td class="comment">MiniUPnP daemon source code</td> | ||
1220 | <td></td> | ||
1221 | </tr> | ||
1222 | <tr> | ||
1223 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20140911.tar.gz'>miniupnpc-1.9.20140911.tar.gz</a></td> | ||
1224 | <td class="filesize">76855</td> | ||
1225 | <td class="filedate">11/09/2014 14:15:23 +0000</td> | ||
1226 | <td class="comment">MiniUPnP client source code</td> | ||
1227 | <td></td> | ||
1228 | </tr> | ||
1229 | <tr> | ||
1230 | <td class="filename"><a href='download.php?file=minissdpd-1.2.20140906.tar.gz'>minissdpd-1.2.20140906.tar.gz</a></td> | ||
1231 | <td class="filesize">21956</td> | ||
1232 | <td class="filedate">06/09/2014 08:34:10 +0000</td> | ||
1233 | <td class="comment">MiniSSDPd source code</td> | ||
1234 | <td></td> | ||
1235 | </tr> | ||
1236 | <tr> | ||
1237 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20140906.tar.gz'>miniupnpd-1.8.20140906.tar.gz</a></td> | ||
1238 | <td class="filesize">191183</td> | ||
1239 | <td class="filedate">06/09/2014 08:34:02 +0000</td> | ||
1240 | <td class="comment">MiniUPnP daemon source code</td> | ||
1241 | <td></td> | ||
1242 | </tr> | ||
1243 | <tr> | ||
1244 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20140906.tar.gz'>miniupnpc-1.9.20140906.tar.gz</a></td> | ||
1245 | <td class="filesize">76791</td> | ||
1246 | <td class="filedate">06/09/2014 08:33:45 +0000</td> | ||
1247 | <td class="comment">MiniUPnP client source code</td> | ||
1248 | <td></td> | ||
1249 | </tr> | ||
1250 | <tr> | ||
1251 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20140701.tar.gz'>miniupnpc-1.9.20140701.tar.gz</a></td> | ||
1252 | <td class="filesize">76735</td> | ||
1253 | <td class="filedate">01/07/2014 13:06:51 +0000</td> | ||
1254 | <td class="comment">MiniUPnP client source code</td> | ||
1255 | <td></td> | ||
1256 | </tr> | ||
1257 | <tr> | ||
1258 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20140610.tar.gz'>miniupnpc-1.9.20140610.tar.gz</a></td> | ||
1259 | <td class="filesize">76674</td> | ||
1260 | <td class="filedate">10/06/2014 10:28:27 +0000</td> | ||
1261 | <td class="comment">MiniUPnP client source code</td> | ||
1262 | <td></td> | ||
1263 | </tr> | ||
1264 | <tr> | ||
1265 | <td class="filename"><a href='download.php?file=minissdpd-1.2.20140610.tar.gz'>minissdpd-1.2.20140610.tar.gz</a></td> | ||
1266 | <td class="filesize">21909</td> | ||
1267 | <td class="filedate">10/06/2014 10:03:29 +0000</td> | ||
1268 | <td class="comment">MiniSSDPd source code</td> | ||
1269 | <td></td> | ||
1270 | </tr> | ||
1271 | <tr> | ||
1272 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20140523.tar.gz'>miniupnpd-1.8.20140523.tar.gz</a></td> | ||
1273 | <td class="filesize">190936</td> | ||
1274 | <td class="filedate">23/05/2014 15:48:03 +0000</td> | ||
1275 | <td class="comment">MiniUPnP daemon source code</td> | ||
1276 | <td></td> | ||
1277 | </tr> | ||
1278 | <tr> | ||
1279 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20140422.zip'>upnpc-exe-win32-20140422.zip</a></td> | ||
1280 | <td class="filesize">97505</td> | ||
1281 | <td class="filedate">22/04/2014 10:10:07 +0000</td> | ||
1282 | <td class="comment">Windows executable</td> | ||
1283 | <td></td> | ||
1284 | </tr> | ||
1285 | <tr> | ||
1286 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20140422.tar.gz'>miniupnpd-1.8.20140422.tar.gz</a></td> | ||
1287 | <td class="filesize">187225</td> | ||
1288 | <td class="filedate">22/04/2014 08:58:56 +0000</td> | ||
1289 | <td class="comment">MiniUPnP daemon source code</td> | ||
1290 | <td></td> | ||
1291 | </tr> | ||
1292 | <tr> | ||
1293 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20140401.tar.gz'>miniupnpd-1.8.20140401.tar.gz</a></td> | ||
1294 | <td class="filesize">183131</td> | ||
1295 | <td class="filedate">01/04/2014 10:07:20 +0000</td> | ||
1296 | <td class="comment">MiniUPnP daemon source code</td> | ||
1297 | <td></td> | ||
1298 | </tr> | ||
1299 | <tr> | ||
1300 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.20140401.tar.gz'>miniupnpc-1.9.20140401.tar.gz</a></td> | ||
1301 | <td class="filesize">74703</td> | ||
1302 | <td class="filedate">01/04/2014 09:49:46 +0000</td> | ||
1303 | <td class="comment">MiniUPnP client source code</td> | ||
1304 | <td></td> | ||
1305 | </tr> | ||
1306 | <tr> | ||
1307 | <td class="filename"><a href='download.php?file=libnatpmp-20140401.tar.gz'>libnatpmp-20140401.tar.gz</a></td> | ||
1308 | <td class="filesize">23302</td> | ||
1309 | <td class="filedate">01/04/2014 09:49:44 +0000</td> | ||
1310 | <td class="comment">libnatpmp source code</td> | ||
1311 | <td></td> | ||
1312 | </tr> | ||
1313 | <tr> | ||
1314 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20140313.tar.gz'>miniupnpd-1.8.20140313.tar.gz</a></td> | ||
1315 | <td class="filesize">177120</td> | ||
1316 | <td class="filedate">13/03/2014 10:39:11 +0000</td> | ||
1317 | <td class="comment">MiniUPnP daemon source code</td> | ||
1318 | <td></td> | ||
1319 | </tr> | ||
1320 | <tr> | ||
1321 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20140310.tar.gz'>miniupnpd-1.8.20140310.tar.gz</a></td> | ||
1322 | <td class="filesize">176585</td> | ||
1323 | <td class="filedate">09/03/2014 23:16:49 +0000</td> | ||
1324 | <td class="comment">MiniUPnP daemon source code</td> | ||
1325 | <td></td> | ||
1326 | </tr> | ||
1327 | <tr> | ||
1328 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20140225.tar.gz'>miniupnpd-1.8.20140225.tar.gz</a></td> | ||
1329 | <td class="filesize">175183</td> | ||
1330 | <td class="filedate">25/02/2014 11:01:29 +0000</td> | ||
1331 | <td class="comment">MiniUPnP daemon source code</td> | ||
1332 | <td></td> | ||
1333 | </tr> | ||
1334 | <tr> | ||
1335 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20140203.tar.gz'>miniupnpd-1.8.20140203.tar.gz</a></td> | ||
1336 | <td class="filesize">170112</td> | ||
1337 | <td class="filedate">03/02/2014 09:56:05 +0000</td> | ||
1338 | <td class="comment">MiniUPnP daemon source code</td> | ||
1339 | <td></td> | ||
1340 | </tr> | ||
1341 | <tr> | ||
1342 | <td class="filename"><a href='download.php?file=miniupnpc-1.9.tar.gz'>miniupnpc-1.9.tar.gz</a></td> | ||
1343 | <td class="filesize">74230</td> | ||
1344 | <td class="filedate">31/01/2014 13:57:40 +0000</td> | ||
1345 | <td class="comment">MiniUPnP client release source code</td> | ||
1346 | <td></td> | ||
1347 | </tr> | ||
1348 | <tr> | ||
1349 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20140127.tar.gz'>miniupnpd-1.8.20140127.tar.gz</a></td> | ||
1350 | <td class="filesize">170467</td> | ||
1351 | <td class="filedate">27/01/2014 11:25:34 +0000</td> | ||
1352 | <td class="comment">MiniUPnP daemon source code</td> | ||
1353 | <td></td> | ||
1354 | </tr> | ||
1355 | <tr> | ||
1356 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20140117.zip'>upnpc-exe-win32-20140117.zip</a></td> | ||
1357 | <td class="filesize">97270</td> | ||
1358 | <td class="filedate">17/01/2014 11:37:53 +0000</td> | ||
1359 | <td class="comment">Windows executable</td> | ||
1360 | <td></td> | ||
1361 | </tr> | ||
1362 | <tr> | ||
1363 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20131216.tar.gz'>miniupnpd-1.8.20131216.tar.gz</a></td> | ||
1364 | <td class="filesize">170277</td> | ||
1365 | <td class="filedate">16/12/2013 16:15:40 +0000</td> | ||
1366 | <td class="comment">MiniUPnP daemon source code</td> | ||
1367 | <td></td> | ||
1368 | </tr> | ||
1369 | <tr> | ||
1370 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20131213.tar.gz'>miniupnpd-1.8.20131213.tar.gz</a></td> | ||
1371 | <td class="filesize">169753</td> | ||
1372 | <td class="filedate">13/12/2013 16:18:10 +0000</td> | ||
1373 | <td class="comment">MiniUPnP daemon source code</td> | ||
1374 | <td></td> | ||
1375 | </tr> | ||
1376 | <tr> | ||
1377 | <td class="filename"><a href='download.php?file=miniupnpc-1.8.20131209.tar.gz'>miniupnpc-1.8.20131209.tar.gz</a></td> | ||
1378 | <td class="filesize">73900</td> | ||
1379 | <td class="filedate">09/12/2013 20:52:54 +0000</td> | ||
1380 | <td class="comment">MiniUPnP client source code</td> | ||
1381 | <td></td> | ||
1382 | </tr> | ||
1383 | <tr> | ||
1384 | <td class="filename"><a href='download.php?file=libnatpmp-20131126.tar.gz'>libnatpmp-20131126.tar.gz</a></td> | ||
1385 | <td class="filesize">22972</td> | ||
1386 | <td class="filedate">26/11/2013 08:51:36 +0000</td> | ||
1387 | <td class="comment">libnatpmp source code</td> | ||
1388 | <td></td> | ||
1389 | </tr> | ||
1390 | <tr> | ||
1391 | <td class="filename"><a href='download.php?file=miniupnpc-1.8.20131007.tar.gz'>miniupnpc-1.8.20131007.tar.gz</a></td> | ||
1392 | <td class="filesize">73750</td> | ||
1393 | <td class="filedate">07/10/2013 10:10:25 +0000</td> | ||
1394 | <td class="comment">MiniUPnP client source code</td> | ||
1395 | <td></td> | ||
1396 | </tr> | ||
1397 | <tr> | ||
1398 | <td class="filename"><a href='download.php?file=libnatpmp-20130911.tar.gz'>libnatpmp-20130911.tar.gz</a></td> | ||
1399 | <td class="filesize">18744</td> | ||
1400 | <td class="filedate">11/09/2013 07:35:51 +0000</td> | ||
1401 | <td class="comment">libnatpmp source code</td> | ||
1402 | <td></td> | ||
1403 | </tr> | ||
1404 | <tr> | ||
1405 | <td class="filename"><a href='download.php?file=libnatpmp-20130910.tar.gz'>libnatpmp-20130910.tar.gz</a></td> | ||
1406 | <td class="filesize">18734</td> | ||
1407 | <td class="filedate">10/09/2013 20:15:34 +0000</td> | ||
1408 | <td class="comment">libnatpmp source code</td> | ||
1409 | <td></td> | ||
1410 | </tr> | ||
1411 | <tr> | ||
1412 | <td class="filename"><a href='download.php?file=minissdpd-1.2.20130907.tar.gz'>minissdpd-1.2.20130907.tar.gz</a></td> | ||
1413 | <td class="filesize">20237</td> | ||
1414 | <td class="filedate">07/09/2013 06:46:31 +0000</td> | ||
1415 | <td class="comment">MiniSSDPd source code</td> | ||
1416 | <td></td> | ||
1417 | </tr> | ||
1418 | <tr> | ||
1419 | <td class="filename"><a href='download.php?file=minissdpd-1.2.20130819.tar.gz'>minissdpd-1.2.20130819.tar.gz</a></td> | ||
1420 | <td class="filesize">20772</td> | ||
1421 | <td class="filedate">19/08/2013 16:50:29 +0000</td> | ||
1422 | <td class="comment">MiniSSDPd source code</td> | ||
1423 | <td></td> | ||
1424 | </tr> | ||
1425 | <tr> | ||
1426 | <td class="filename"><a href='download.php?file=miniupnpc-1.8.20130801.tar.gz'>miniupnpc-1.8.20130801.tar.gz</a></td> | ||
1427 | <td class="filesize">73426</td> | ||
1428 | <td class="filedate">01/08/2013 21:38:05 +0000</td> | ||
1429 | <td class="comment">MiniUPnP client source code</td> | ||
1430 | <td></td> | ||
1431 | </tr> | ||
1432 | <tr> | ||
1433 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20130730.tar.gz'>miniupnpd-1.8.20130730.tar.gz</a></td> | ||
1434 | <td class="filesize">149904</td> | ||
1435 | <td class="filedate">30/07/2013 11:37:48 +0000</td> | ||
1436 | <td class="comment">MiniUPnP daemon source code</td> | ||
1437 | <td></td> | ||
1438 | </tr> | ||
1439 | <tr> | ||
1440 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20130607.tar.gz'>miniupnpd-1.8.20130607.tar.gz</a></td> | ||
1441 | <td class="filesize">149521</td> | ||
1442 | <td class="filedate">07/06/2013 08:46:17 +0000</td> | ||
1443 | <td class="comment">MiniUPnP daemon source code</td> | ||
1444 | <td></td> | ||
1445 | </tr> | ||
1446 | <tr> | ||
1447 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20130521.tar.gz'>miniupnpd-1.8.20130521.tar.gz</a></td> | ||
1448 | <td class="filesize">149276</td> | ||
1449 | <td class="filedate">21/05/2013 09:01:33 +0000</td> | ||
1450 | <td class="comment">MiniUPnP daemon source code</td> | ||
1451 | <td></td> | ||
1452 | </tr> | ||
1453 | <tr> | ||
1454 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20130503.tar.gz'>miniupnpd-1.8.20130503.tar.gz</a></td> | ||
1455 | <td class="filesize">148420</td> | ||
1456 | <td class="filedate">03/05/2013 19:27:16 +0000</td> | ||
1457 | <td class="comment">MiniUPnP daemon source code</td> | ||
1458 | <td></td> | ||
1459 | </tr> | ||
1460 | <tr> | ||
1461 | <td class="filename"><a href='download.php?file=miniupnpc-1.8.20130503.tar.gz'>miniupnpc-1.8.20130503.tar.gz</a></td> | ||
1462 | <td class="filesize">71858</td> | ||
1463 | <td class="filedate">03/05/2013 19:27:07 +0000</td> | ||
1464 | <td class="comment">MiniUPnP client source code</td> | ||
1465 | <td></td> | ||
1466 | </tr> | ||
1467 | <tr> | ||
1468 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20130426.tar.gz'>miniupnpd-1.8.20130426.tar.gz</a></td> | ||
1469 | <td class="filesize">147890</td> | ||
1470 | <td class="filedate">26/04/2013 16:57:20 +0000</td> | ||
1471 | <td class="comment">MiniUPnP daemon source code</td> | ||
1472 | <td></td> | ||
1473 | </tr> | ||
1474 | <tr> | ||
1475 | <td class="filename"><a href='download.php?file=miniupnpc-1.8.20130211.tar.gz'>miniupnpc-1.8.20130211.tar.gz</a></td> | ||
1476 | <td class="filesize">70723</td> | ||
1477 | <td class="filedate">11/02/2013 10:32:44 +0000</td> | ||
1478 | <td class="comment">MiniUPnP client source code</td> | ||
1479 | <td></td> | ||
1480 | </tr> | ||
1481 | <tr> | ||
1482 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.20130207.tar.gz'>miniupnpd-1.8.20130207.tar.gz</a></td> | ||
1483 | <td class="filesize">147325</td> | ||
1484 | <td class="filedate">07/02/2013 12:29:32 +0000</td> | ||
1485 | <td class="comment">MiniUPnP daemon source code</td> | ||
1486 | <td></td> | ||
1487 | </tr> | ||
1488 | <tr> | ||
1489 | <td class="filename"><a href='download.php?file=miniupnpc-1.8.tar.gz'>miniupnpc-1.8.tar.gz</a></td> | ||
1490 | <td class="filesize">70624</td> | ||
1491 | <td class="filedate">06/02/2013 14:31:06 +0000</td> | ||
1492 | <td class="comment">MiniUPnP client release source code</td> | ||
1493 | <td></td> | ||
1494 | </tr> | ||
1495 | <tr> | ||
1496 | <td class="filename"><a href='download.php?file=miniupnpd-1.8.tar.gz'>miniupnpd-1.8.tar.gz</a></td> | ||
1497 | <td class="filesize">146679</td> | ||
1498 | <td class="filedate">06/02/2013 14:30:59 +0000</td> | ||
1499 | <td class="comment">MiniUPnP daemon release source code</td> | ||
1500 | <td></td> | ||
1501 | </tr> | ||
1502 | <tr> | ||
1503 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20121009.zip'>upnpc-exe-win32-20121009.zip</a></td> | ||
1504 | <td class="filesize">96513</td> | ||
1505 | <td class="filedate">09/10/2012 17:54:12 +0000</td> | ||
1506 | <td class="comment">Windows executable</td> | ||
1507 | <td></td> | ||
1508 | </tr> | ||
1509 | <tr> | ||
1510 | <td class="filename"><a href='download.php?file=miniupnpd-1.7.20121005.tar.gz'>miniupnpd-1.7.20121005.tar.gz</a></td> | ||
1511 | <td class="filesize">144393</td> | ||
1512 | <td class="filedate">04/10/2012 22:39:05 +0000</td> | ||
1513 | <td class="comment">MiniUPnP daemon source code</td> | ||
1514 | <td></td> | ||
1515 | </tr> | ||
1516 | <tr> | ||
1517 | <td class="filename"><a href='download.php?file=miniupnpc-1.7.20120830.tar.gz'>miniupnpc-1.7.20120830.tar.gz</a></td> | ||
1518 | <td class="filesize">70074</td> | ||
1519 | <td class="filedate">30/08/2012 08:41:51 +0000</td> | ||
1520 | <td class="comment">MiniUPnP client source code</td> | ||
1521 | <td></td> | ||
1522 | </tr> | ||
1523 | <tr> | ||
1524 | <td class="filename"><a href='download.php?file=miniupnpd-1.7.20120824.tar.gz'>miniupnpd-1.7.20120824.tar.gz</a></td> | ||
1525 | <td class="filesize">141960</td> | ||
1526 | <td class="filedate">24/08/2012 18:15:01 +0000</td> | ||
1527 | <td class="comment">MiniUPnP daemon source code</td> | ||
1528 | <td></td> | ||
1529 | </tr> | ||
1530 | <tr> | ||
1531 | <td class="filename"><a href='download.php?file=libnatpmp-20120821.tar.gz'>libnatpmp-20120821.tar.gz</a></td> | ||
1532 | <td class="filesize">17832</td> | ||
1533 | <td class="filedate">21/08/2012 17:24:46 +0000</td> | ||
1534 | <td class="comment">libnatpmp source code</td> | ||
1535 | <td></td> | ||
1536 | </tr> | ||
1537 | <tr> | ||
1538 | <td class="filename"><a href='download.php?file=miniupnpc-1.7.20120714.tar.gz'>miniupnpc-1.7.20120714.tar.gz</a></td> | ||
1539 | <td class="filesize">69570</td> | ||
1540 | <td class="filedate">14/07/2012 14:40:47 +0000</td> | ||
1541 | <td class="comment">MiniUPnP client source code</td> | ||
1542 | <td></td> | ||
1543 | </tr> | ||
1544 | <tr> | ||
1545 | <td class="filename"><a href='download.php?file=miniupnpc-1.7.20120711.tar.gz'>miniupnpc-1.7.20120711.tar.gz</a></td> | ||
1546 | <td class="filesize">69580</td> | ||
1547 | <td class="filedate">10/07/2012 22:27:05 +0000</td> | ||
1548 | <td class="comment">MiniUPnP client source code</td> | ||
1549 | <td></td> | ||
1550 | </tr> | ||
1551 | <tr> | ||
1552 | <td class="filename"><a href='download.php?file=miniupnpd-1.7.20120711.tar.gz'>miniupnpd-1.7.20120711.tar.gz</a></td> | ||
1553 | <td class="filesize">141380</td> | ||
1554 | <td class="filedate">10/07/2012 22:26:58 +0000</td> | ||
1555 | <td class="comment">MiniUPnP daemon source code</td> | ||
1556 | <td></td> | ||
1557 | </tr> | ||
1558 | <tr> | ||
1559 | <td class="filename"><a href='download.php?file=miniupnpd-1.7.tar.gz'>miniupnpd-1.7.tar.gz</a></td> | ||
1560 | <td class="filesize">138047</td> | ||
1561 | <td class="filedate">27/05/2012 23:13:30 +0000</td> | ||
1562 | <td class="comment">MiniUPnP daemon release source code</td> | ||
1563 | <td></td> | ||
1564 | </tr> | ||
1565 | <tr> | ||
1566 | <td class="filename"><a href='download.php?file=miniupnpc-1.7.tar.gz'>miniupnpc-1.7.tar.gz</a></td> | ||
1567 | <td class="filesize">68327</td> | ||
1568 | <td class="filedate">24/05/2012 18:17:48 +0000</td> | ||
1569 | <td class="comment">MiniUPnP client release source code</td> | ||
1570 | <td></td> | ||
1571 | </tr> | ||
1572 | <tr> | ||
1573 | <td class="filename"><a href='download.php?file=minissdpd-1.2.tar.gz'>minissdpd-1.2.tar.gz</a></td> | ||
1574 | <td class="filesize">19874</td> | ||
1575 | <td class="filedate">24/05/2012 18:06:24 +0000</td> | ||
1576 | <td class="comment">MiniSSDPd release source code</td> | ||
1577 | <td></td> | ||
1578 | </tr> | ||
1579 | <tr> | ||
1580 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120509.tar.gz'>miniupnpd-1.6.20120509.tar.gz</a></td> | ||
1581 | <td class="filesize">137147</td> | ||
1582 | <td class="filedate">09/05/2012 10:45:44 +0000</td> | ||
1583 | <td class="comment">MiniUPnP daemon source code</td> | ||
1584 | <td></td> | ||
1585 | </tr> | ||
1586 | <tr> | ||
1587 | <td class="filename"><a href='download.php?file=miniupnpc-1.6.20120509.tar.gz'>miniupnpc-1.6.20120509.tar.gz</a></td> | ||
1588 | <td class="filesize">68205</td> | ||
1589 | <td class="filedate">09/05/2012 10:45:41 +0000</td> | ||
1590 | <td class="comment">MiniUPnP client source code</td> | ||
1591 | <td></td> | ||
1592 | </tr> | ||
1593 | <tr> | ||
1594 | <td class="filename"><a href='download.php?file=minissdpd-1.1.20120509.tar.gz'>minissdpd-1.1.20120509.tar.gz</a></td> | ||
1595 | <td class="filesize">18123</td> | ||
1596 | <td class="filedate">09/05/2012 10:45:39 +0000</td> | ||
1597 | <td class="comment">MiniSSDPd source code</td> | ||
1598 | <td></td> | ||
1599 | </tr> | ||
1600 | <tr> | ||
1601 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120502.tar.gz'>miniupnpd-1.6.20120502.tar.gz</a></td> | ||
1602 | <td class="filesize">136688</td> | ||
1603 | <td class="filedate">01/05/2012 22:51:18 +0000</td> | ||
1604 | <td class="comment">MiniUPnP daemon source code</td> | ||
1605 | <td></td> | ||
1606 | </tr> | ||
1607 | <tr> | ||
1608 | <td class="filename"><a href='download.php?file=miniupnpc-1.6.20120502.tar.gz'>miniupnpc-1.6.20120502.tar.gz</a></td> | ||
1609 | <td class="filesize">68170</td> | ||
1610 | <td class="filedate">01/05/2012 22:51:11 +0000</td> | ||
1611 | <td class="comment">MiniUPnP client source code</td> | ||
1612 | <td></td> | ||
1613 | </tr> | ||
1614 | <tr> | ||
1615 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120426.tar.gz'>miniupnpd-1.6.20120426.tar.gz</a></td> | ||
1616 | <td class="filesize">134764</td> | ||
1617 | <td class="filedate">26/04/2012 16:24:29 +0000</td> | ||
1618 | <td class="comment">MiniUPnP daemon source code</td> | ||
1619 | <td></td> | ||
1620 | </tr> | ||
1621 | <tr> | ||
1622 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120424.tar.gz'>miniupnpd-1.6.20120424.tar.gz</a></td> | ||
1623 | <td class="filesize">132522</td> | ||
1624 | <td class="filedate">23/04/2012 22:43:17 +0000</td> | ||
1625 | <td class="comment">MiniUPnP daemon source code</td> | ||
1626 | <td></td> | ||
1627 | </tr> | ||
1628 | <tr> | ||
1629 | <td class="filename"><a href='download.php?file=miniupnpc-1.6.20120424.tar.gz'>miniupnpc-1.6.20120424.tar.gz</a></td> | ||
1630 | <td class="filesize">68067</td> | ||
1631 | <td class="filedate">23/04/2012 22:43:10 +0000</td> | ||
1632 | <td class="comment">MiniUPnP client source code</td> | ||
1633 | <td></td> | ||
1634 | </tr> | ||
1635 | <tr> | ||
1636 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120420.tar.gz'>miniupnpd-1.6.20120420.tar.gz</a></td> | ||
1637 | <td class="filesize">131972</td> | ||
1638 | <td class="filedate">20/04/2012 14:58:57 +0000</td> | ||
1639 | <td class="comment">MiniUPnP daemon source code</td> | ||
1640 | <td></td> | ||
1641 | </tr> | ||
1642 | <tr> | ||
1643 | <td class="filename"><a href='download.php?file=miniupnpc-1.6.20120420.tar.gz'>miniupnpc-1.6.20120420.tar.gz</a></td> | ||
1644 | <td class="filesize">68068</td> | ||
1645 | <td class="filedate">20/04/2012 14:58:39 +0000</td> | ||
1646 | <td class="comment">MiniUPnP client source code</td> | ||
1647 | <td></td> | ||
1648 | </tr> | ||
1649 | <tr> | ||
1650 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120419.tar.gz'>miniupnpd-1.6.20120419.tar.gz</a></td> | ||
1651 | <td class="filesize">131088</td> | ||
1652 | <td class="filedate">18/04/2012 23:41:36 +0000</td> | ||
1653 | <td class="comment">MiniUPnP daemon source code</td> | ||
1654 | <td></td> | ||
1655 | </tr> | ||
1656 | <tr> | ||
1657 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120418.tar.gz'>miniupnpd-1.6.20120418.tar.gz</a></td> | ||
1658 | <td class="filesize">130879</td> | ||
1659 | <td class="filedate">18/04/2012 21:01:10 +0000</td> | ||
1660 | <td class="comment">MiniUPnP daemon source code</td> | ||
1661 | <td></td> | ||
1662 | </tr> | ||
1663 | <tr> | ||
1664 | <td class="filename"><a href='download.php?file=minissdpd-1.1.20120410.tar.gz'>minissdpd-1.1.20120410.tar.gz</a></td> | ||
1665 | <td class="filesize">18059</td> | ||
1666 | <td class="filedate">09/04/2012 22:45:38 +0000</td> | ||
1667 | <td class="comment">MiniSSDPd source code</td> | ||
1668 | <td></td> | ||
1669 | </tr> | ||
1670 | <tr> | ||
1671 | <td class="filename"><a href='download.php?file=miniupnpc-1.6.20120410.tar.gz'>miniupnpc-1.6.20120410.tar.gz</a></td> | ||
1672 | <td class="filesize">67934</td> | ||
1673 | <td class="filedate">09/04/2012 22:45:10 +0000</td> | ||
1674 | <td class="comment">MiniUPnP client source code</td> | ||
1675 | <td></td> | ||
1676 | </tr> | ||
1677 | <tr> | ||
1678 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120406.tar.gz'>miniupnpd-1.6.20120406.tar.gz</a></td> | ||
1679 | <td class="filesize">128992</td> | ||
1680 | <td class="filedate">06/04/2012 17:52:57 +0000</td> | ||
1681 | <td class="comment">MiniUPnP daemon source code</td> | ||
1682 | <td></td> | ||
1683 | </tr> | ||
1684 | <tr> | ||
1685 | <td class="filename"><a href='download.php?file=miniupnpc-1.6.20120320.tar.gz'>miniupnpc-1.6.20120320.tar.gz</a></td> | ||
1686 | <td class="filesize">67374</td> | ||
1687 | <td class="filedate">20/03/2012 16:55:48 +0000</td> | ||
1688 | <td class="comment">MiniUPnP client source code</td> | ||
1689 | <td></td> | ||
1690 | </tr> | ||
1691 | <tr> | ||
1692 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120320.tar.gz'>miniupnpd-1.6.20120320.tar.gz</a></td> | ||
1693 | <td class="filesize">127968</td> | ||
1694 | <td class="filedate">20/03/2012 16:46:07 +0000</td> | ||
1695 | <td class="comment">MiniUPnP daemon source code</td> | ||
1696 | <td></td> | ||
1697 | </tr> | ||
1698 | <tr> | ||
1699 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120305.tar.gz'>miniupnpd-1.6.20120305.tar.gz</a></td> | ||
1700 | <td class="filesize">126985</td> | ||
1701 | <td class="filedate">05/03/2012 20:42:01 +0000</td> | ||
1702 | <td class="comment">MiniUPnP daemon source code</td> | ||
1703 | <td></td> | ||
1704 | </tr> | ||
1705 | <tr> | ||
1706 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120207.tar.gz'>miniupnpd-1.6.20120207.tar.gz</a></td> | ||
1707 | <td class="filesize">127425</td> | ||
1708 | <td class="filedate">07/02/2012 10:21:16 +0000</td> | ||
1709 | <td class="comment">MiniUPnP daemon source code</td> | ||
1710 | <td></td> | ||
1711 | </tr> | ||
1712 | <tr> | ||
1713 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120203.tar.gz'>miniupnpd-1.6.20120203.tar.gz</a></td> | ||
1714 | <td class="filesize">126599</td> | ||
1715 | <td class="filedate">03/02/2012 15:14:13 +0000</td> | ||
1716 | <td class="comment">MiniUPnP daemon source code</td> | ||
1717 | <td></td> | ||
1718 | </tr> | ||
1719 | <tr> | ||
1720 | <td class="filename"><a href='download.php?file=miniupnpc-1.6.20120125.tar.gz'>miniupnpc-1.6.20120125.tar.gz</a></td> | ||
1721 | <td class="filesize">67354</td> | ||
1722 | <td class="filedate">25/01/2012 21:12:28 +0000</td> | ||
1723 | <td class="comment">MiniUPnP client source code</td> | ||
1724 | <td></td> | ||
1725 | </tr> | ||
1726 | <tr> | ||
1727 | <td class="filename"><a href='download.php?file=miniupnpc-1.6.20120121.tar.gz'>miniupnpc-1.6.20120121.tar.gz</a></td> | ||
1728 | <td class="filesize">67347</td> | ||
1729 | <td class="filedate">21/01/2012 14:07:41 +0000</td> | ||
1730 | <td class="comment">MiniUPnP client source code</td> | ||
1731 | <td></td> | ||
1732 | </tr> | ||
1733 | <tr> | ||
1734 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20120121.tar.gz'>miniupnpd-1.6.20120121.tar.gz</a></td> | ||
1735 | <td class="filesize">126021</td> | ||
1736 | <td class="filedate">21/01/2012 14:07:33 +0000</td> | ||
1737 | <td class="comment">MiniUPnP daemon source code</td> | ||
1738 | <td></td> | ||
1739 | </tr> | ||
1740 | <tr> | ||
1741 | <td class="filename"><a href='download.php?file=minissdpd-1.1.20120121.tar.gz'>minissdpd-1.1.20120121.tar.gz</a></td> | ||
1742 | <td class="filesize">17762</td> | ||
1743 | <td class="filedate">21/01/2012 14:07:16 +0000</td> | ||
1744 | <td class="comment">MiniSSDPd source code</td> | ||
1745 | <td></td> | ||
1746 | </tr> | ||
1747 | <tr> | ||
1748 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20120121.zip'>upnpc-exe-win32-20120121.zip</a></td> | ||
1749 | <td class="filesize">94575</td> | ||
1750 | <td class="filedate">21/01/2012 13:59:11 +0000</td> | ||
1751 | <td class="comment">Windows executable</td> | ||
1752 | <td></td> | ||
1753 | </tr> | ||
1754 | <tr> | ||
1755 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20111212.zip'>upnpc-exe-win32-20111212.zip</a></td> | ||
1756 | <td class="filesize">94507</td> | ||
1757 | <td class="filedate">12/12/2011 12:33:48 +0000</td> | ||
1758 | <td class="comment">Windows executable</td> | ||
1759 | <td></td> | ||
1760 | </tr> | ||
1761 | <tr> | ||
1762 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20111118.tar.gz'>miniupnpd-1.6.20111118.tar.gz</a></td> | ||
1763 | <td class="filesize">125683</td> | ||
1764 | <td class="filedate">18/11/2011 11:26:12 +0000</td> | ||
1765 | <td class="comment">MiniUPnP daemon source code</td> | ||
1766 | <td></td> | ||
1767 | </tr> | ||
1768 | <tr> | ||
1769 | <td class="filename"><a href='download.php?file=minissdpd-1.1.20111007.tar.gz'>minissdpd-1.1.20111007.tar.gz</a></td> | ||
1770 | <td class="filesize">17611</td> | ||
1771 | <td class="filedate">07/10/2011 09:47:51 +0000</td> | ||
1772 | <td class="comment">MiniSSDPd source code</td> | ||
1773 | <td></td> | ||
1774 | </tr> | ||
1775 | <tr> | ||
1776 | <td class="filename"><a href='download.php?file=xchat-upnp20110811.patch'>xchat-upnp20110811.patch</a></td> | ||
1777 | <td class="filesize">10329</td> | ||
1778 | <td class="filedate">11/08/2011 15:18:25 +0000</td> | ||
1779 | <td class="comment">Patch to add UPnP capabilities to xchat</td> | ||
1780 | <td></td> | ||
1781 | </tr> | ||
1782 | <tr> | ||
1783 | <td class="filename"><a href='download.php?file=xchat-upnp20110811-2.8.8.patch'>xchat-upnp20110811-2.8.8.patch</a></td> | ||
1784 | <td class="filesize">11529</td> | ||
1785 | <td class="filedate">11/08/2011 15:18:23 +0000</td> | ||
1786 | <td class="comment">Patch to add UPnP capabilities to xchat</td> | ||
1787 | <td></td> | ||
1788 | </tr> | ||
1789 | <tr> | ||
1790 | <td class="filename"><a href='download.php?file=libnatpmp-20110808.tar.gz'>libnatpmp-20110808.tar.gz</a></td> | ||
1791 | <td class="filesize">17762</td> | ||
1792 | <td class="filedate">08/08/2011 21:21:34 +0000</td> | ||
1793 | <td class="comment">libnatpmp source code</td> | ||
1794 | <td></td> | ||
1795 | </tr> | ||
1796 | <tr> | ||
1797 | <td class="filename"><a href='download.php?file=libnatpmp-20110730.tar.gz'>libnatpmp-20110730.tar.gz</a></td> | ||
1798 | <td class="filesize">17687</td> | ||
1799 | <td class="filedate">30/07/2011 13:19:31 +0000</td> | ||
1800 | <td class="comment">libnatpmp source code</td> | ||
1801 | <td></td> | ||
1802 | </tr> | ||
1803 | <tr> | ||
1804 | <td class="filename"><a href='download.php?file=minissdpd-1.1.tar.gz'>minissdpd-1.1.tar.gz</a></td> | ||
1805 | <td class="filesize">17481</td> | ||
1806 | <td class="filedate">30/07/2011 13:17:30 +0000</td> | ||
1807 | <td class="comment">MiniSSDPd release source code</td> | ||
1808 | <td></td> | ||
1809 | </tr> | ||
1810 | <tr> | ||
1811 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.20110730.tar.gz'>miniupnpd-1.6.20110730.tar.gz</a></td> | ||
1812 | <td class="filesize">125583</td> | ||
1813 | <td class="filedate">30/07/2011 13:17:09 +0000</td> | ||
1814 | <td class="comment">MiniUPnP daemon source code</td> | ||
1815 | <td></td> | ||
1816 | </tr> | ||
1817 | <tr> | ||
1818 | <td class="filename"><a href='download.php?file=minissdpd-1.0.20110729.tar.gz'>minissdpd-1.0.20110729.tar.gz</a></td> | ||
1819 | <td class="filesize">15898</td> | ||
1820 | <td class="filedate">29/07/2011 08:47:26 +0000</td> | ||
1821 | <td class="comment">MiniSSDPd source code</td> | ||
1822 | <td></td> | ||
1823 | </tr> | ||
1824 | <tr> | ||
1825 | <td class="filename"><a href='download.php?file=miniupnpc-1.6.tar.gz'>miniupnpc-1.6.tar.gz</a></td> | ||
1826 | <td class="filesize">66454</td> | ||
1827 | <td class="filedate">25/07/2011 18:03:09 +0000</td> | ||
1828 | <td class="comment">MiniUPnP client release source code</td> | ||
1829 | <td></td> | ||
1830 | </tr> | ||
1831 | <tr> | ||
1832 | <td class="filename"><a href='download.php?file=miniupnpd-1.6.tar.gz'>miniupnpd-1.6.tar.gz</a></td> | ||
1833 | <td class="filesize">124917</td> | ||
1834 | <td class="filedate">25/07/2011 16:37:57 +0000</td> | ||
1835 | <td class="comment">MiniUPnP daemon release source code</td> | ||
1836 | <td></td> | ||
1837 | </tr> | ||
1838 | <tr> | ||
1839 | <td class="filename"><a href='download.php?file=minidlna_1.0.21.minissdp1.patch'>minidlna_1.0.21.minissdp1.patch</a></td> | ||
1840 | <td class="filesize">7598</td> | ||
1841 | <td class="filedate">25/07/2011 14:57:50 +0000</td> | ||
1842 | <td class="comment">Patch for MiniDLNA to use miniSSDPD</td> | ||
1843 | <td></td> | ||
1844 | </tr> | ||
1845 | <tr> | ||
1846 | <td class="filename"><a href='download.php?file=libnatpmp-20110715.tar.gz'>libnatpmp-20110715.tar.gz</a></td> | ||
1847 | <td class="filesize">17943</td> | ||
1848 | <td class="filedate">15/07/2011 08:31:40 +0000</td> | ||
1849 | <td class="comment">libnatpmp source code</td> | ||
1850 | <td></td> | ||
1851 | </tr> | ||
1852 | <tr> | ||
1853 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110715.tar.gz'>miniupnpd-1.5.20110715.tar.gz</a></td> | ||
1854 | <td class="filesize">124519</td> | ||
1855 | <td class="filedate">15/07/2011 07:55:17 +0000</td> | ||
1856 | <td class="comment">MiniUPnP daemon source code</td> | ||
1857 | <td></td> | ||
1858 | </tr> | ||
1859 | <tr> | ||
1860 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20110714.zip'>upnpc-exe-win32-20110714.zip</a></td> | ||
1861 | <td class="filesize">94236</td> | ||
1862 | <td class="filedate">13/07/2011 23:16:01 +0000</td> | ||
1863 | <td class="comment">Windows executable</td> | ||
1864 | <td></td> | ||
1865 | </tr> | ||
1866 | <tr> | ||
1867 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110623.tar.gz'>miniupnpd-1.5.20110623.tar.gz</a></td> | ||
1868 | <td class="filesize">123529</td> | ||
1869 | <td class="filedate">22/06/2011 22:29:15 +0000</td> | ||
1870 | <td class="comment">MiniUPnP daemon source code</td> | ||
1871 | <td></td> | ||
1872 | </tr> | ||
1873 | <tr> | ||
1874 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110620.tar.gz'>miniupnpd-1.5.20110620.tar.gz</a></td> | ||
1875 | <td class="filesize">123221</td> | ||
1876 | <td class="filedate">20/06/2011 14:11:11 +0000</td> | ||
1877 | <td class="comment">MiniUPnP daemon source code</td> | ||
1878 | <td></td> | ||
1879 | </tr> | ||
1880 | <tr> | ||
1881 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110618.tar.gz'>miniupnpd-1.5.20110618.tar.gz</a></td> | ||
1882 | <td class="filesize">123176</td> | ||
1883 | <td class="filedate">17/06/2011 23:29:18 +0000</td> | ||
1884 | <td class="comment">MiniUPnP daemon source code</td> | ||
1885 | <td></td> | ||
1886 | </tr> | ||
1887 | <tr> | ||
1888 | <td class="filename"><a href='download.php?file=miniupnpc-1.5.20110618.tar.gz'>miniupnpc-1.5.20110618.tar.gz</a></td> | ||
1889 | <td class="filesize">66401</td> | ||
1890 | <td class="filedate">17/06/2011 23:29:17 +0000</td> | ||
1891 | <td class="comment">MiniUPnP client source code</td> | ||
1892 | <td></td> | ||
1893 | </tr> | ||
1894 | <tr> | ||
1895 | <td class="filename"><a href='download.php?file=libnatpmp-20110618.tar.gz'>libnatpmp-20110618.tar.gz</a></td> | ||
1896 | <td class="filesize">17901</td> | ||
1897 | <td class="filedate">17/06/2011 23:29:16 +0000</td> | ||
1898 | <td class="comment">libnatpmp source code</td> | ||
1899 | <td></td> | ||
1900 | </tr> | ||
1901 | <tr> | ||
1902 | <td class="filename"><a href='download.php?file=minissdpd-1.0.20110618.tar.gz'>minissdpd-1.0.20110618.tar.gz</a></td> | ||
1903 | <td class="filesize">15193</td> | ||
1904 | <td class="filedate">17/06/2011 23:29:16 +0000</td> | ||
1905 | <td class="comment">MiniSSDPd source code</td> | ||
1906 | <td></td> | ||
1907 | </tr> | ||
1908 | <tr> | ||
1909 | <td class="filename" colspan="2"><a href='download.php?file=minidlna_cvs20110529_minissdp1.patch'>minidlna_cvs20110529_minissdp1.patch</a></td> | ||
1910 | <td class="filedate">29/05/2011 21:19:09 +0000</td> | ||
1911 | <td class="comment">Patch for MiniDLNA to use miniSSDPD</td> | ||
1912 | <td></td> | ||
1913 | </tr> | ||
1914 | <tr> | ||
1915 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110528.tar.gz'>miniupnpd-1.5.20110528.tar.gz</a></td> | ||
1916 | <td class="filesize">121985</td> | ||
1917 | <td class="filedate">28/05/2011 09:39:04 +0000</td> | ||
1918 | <td class="comment">MiniUPnP daemon source code</td> | ||
1919 | <td></td> | ||
1920 | </tr> | ||
1921 | <tr> | ||
1922 | <td class="filename"><a href='download.php?file=minidlna_1.0.19_minissdp1.patch'>minidlna_1.0.19_minissdp1.patch</a></td> | ||
1923 | <td class="filesize">9080</td> | ||
1924 | <td class="filedate">27/05/2011 09:55:04 +0000</td> | ||
1925 | <td class="comment">Patch for MiniDLNA to use miniSSDPD</td> | ||
1926 | <td></td> | ||
1927 | </tr> | ||
1928 | <tr> | ||
1929 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110527.tar.gz'>miniupnpd-1.5.20110527.tar.gz</a></td> | ||
1930 | <td class="filesize">120896</td> | ||
1931 | <td class="filedate">27/05/2011 08:28:35 +0000</td> | ||
1932 | <td class="comment">MiniUPnP daemon source code</td> | ||
1933 | <td></td> | ||
1934 | </tr> | ||
1935 | <tr> | ||
1936 | <td class="filename"><a href='download.php?file=miniupnpc-1.5.20110527.tar.gz'>miniupnpc-1.5.20110527.tar.gz</a></td> | ||
1937 | <td class="filesize">66279</td> | ||
1938 | <td class="filedate">27/05/2011 08:28:34 +0000</td> | ||
1939 | <td class="comment">MiniUPnP client source code</td> | ||
1940 | <td></td> | ||
1941 | </tr> | ||
1942 | <tr> | ||
1943 | <td class="filename"><a href='download.php?file=libnatpmp-20110527.tar.gz'>libnatpmp-20110527.tar.gz</a></td> | ||
1944 | <td class="filesize">17627</td> | ||
1945 | <td class="filedate">27/05/2011 08:28:33 +0000</td> | ||
1946 | <td class="comment">libnatpmp source code</td> | ||
1947 | <td></td> | ||
1948 | </tr> | ||
1949 | <tr> | ||
1950 | <td class="filename"><a href='download.php?file=minissdpd-1.0.20110523.tar.gz'>minissdpd-1.0.20110523.tar.gz</a></td> | ||
1951 | <td class="filesize">15024</td> | ||
1952 | <td class="filedate">23/05/2011 12:55:31 +0000</td> | ||
1953 | <td class="comment">MiniSSDPd source code</td> | ||
1954 | <td></td> | ||
1955 | </tr> | ||
1956 | <tr> | ||
1957 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110520.tar.gz'>miniupnpd-1.5.20110520.tar.gz</a></td> | ||
1958 | <td class="filesize">119227</td> | ||
1959 | <td class="filedate">20/05/2011 18:00:41 +0000</td> | ||
1960 | <td class="comment">MiniUPnP daemon source code</td> | ||
1961 | <td></td> | ||
1962 | </tr> | ||
1963 | <tr> | ||
1964 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110519.tar.gz'>miniupnpd-1.5.20110519.tar.gz</a></td> | ||
1965 | <td class="filesize">114735</td> | ||
1966 | <td class="filedate">18/05/2011 22:29:06 +0000</td> | ||
1967 | <td class="comment">MiniUPnP daemon source code</td> | ||
1968 | <td></td> | ||
1969 | </tr> | ||
1970 | <tr> | ||
1971 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110516.tar.gz'>miniupnpd-1.5.20110516.tar.gz</a></td> | ||
1972 | <td class="filesize">113348</td> | ||
1973 | <td class="filedate">16/05/2011 09:32:51 +0000</td> | ||
1974 | <td class="comment">MiniUPnP daemon source code</td> | ||
1975 | <td></td> | ||
1976 | </tr> | ||
1977 | <tr> | ||
1978 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110515.tar.gz'>miniupnpd-1.5.20110515.tar.gz</a></td> | ||
1979 | <td class="filesize">113135</td> | ||
1980 | <td class="filedate">15/05/2011 21:51:29 +0000</td> | ||
1981 | <td class="comment">MiniUPnP daemon source code</td> | ||
1982 | <td></td> | ||
1983 | </tr> | ||
1984 | <tr> | ||
1985 | <td class="filename"><a href='download.php?file=miniupnpc-1.5.20110515.tar.gz'>miniupnpc-1.5.20110515.tar.gz</a></td> | ||
1986 | <td class="filesize">66112</td> | ||
1987 | <td class="filedate">15/05/2011 21:51:28 +0000</td> | ||
1988 | <td class="comment">MiniUPnP client source code</td> | ||
1989 | <td></td> | ||
1990 | </tr> | ||
1991 | <tr> | ||
1992 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110513.tar.gz'>miniupnpd-1.5.20110513.tar.gz</a></td> | ||
1993 | <td class="filesize">111029</td> | ||
1994 | <td class="filedate">13/05/2011 14:03:12 +0000</td> | ||
1995 | <td class="comment">MiniUPnP daemon source code</td> | ||
1996 | <td></td> | ||
1997 | </tr> | ||
1998 | <tr> | ||
1999 | <td class="filename"><a href='download.php?file=miniupnpc-1.5.20110506.tar.gz'>miniupnpc-1.5.20110506.tar.gz</a></td> | ||
2000 | <td class="filesize">65536</td> | ||
2001 | <td class="filedate">06/05/2011 16:35:38 +0000</td> | ||
2002 | <td class="comment">MiniUPnP client source code</td> | ||
2003 | <td></td> | ||
2004 | </tr> | ||
2005 | <tr> | ||
2006 | <td class="filename"><a href='download.php?file=miniupnpc-1.4-v6.20100505.zip'>miniupnpc-1.4-v6.20100505.zip</a></td> | ||
2007 | <td class="filesize">91833</td> | ||
2008 | <td class="filedate">18/04/2011 20:14:11 +0000</td> | ||
2009 | <td class="comment"></td> | ||
2010 | <td></td> | ||
2011 | </tr> | ||
2012 | <tr> | ||
2013 | <td class="filename"><a href='download.php?file=miniupnpd-1.4-v6.20100823.zip'>miniupnpd-1.4-v6.20100823.zip</a></td> | ||
2014 | <td class="filesize">222235</td> | ||
2015 | <td class="filedate">18/04/2011 20:14:07 +0000</td> | ||
2016 | <td class="comment"></td> | ||
2017 | <td></td> | ||
2018 | </tr> | ||
2019 | <tr> | ||
2020 | <td class="filename"><a href='download.php?file=miniupnpc-1.5.20110418.tar.gz'>miniupnpc-1.5.20110418.tar.gz</a></td> | ||
2021 | <td class="filesize">61820</td> | ||
2022 | <td class="filedate">18/04/2011 20:09:22 +0000</td> | ||
2023 | <td class="comment">MiniUPnP client source code</td> | ||
2024 | <td></td> | ||
2025 | </tr> | ||
2026 | <tr> | ||
2027 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20110418.zip'>upnpc-exe-win32-20110418.zip</a></td> | ||
2028 | <td class="filesize">94183</td> | ||
2029 | <td class="filedate">18/04/2011 17:53:26 +0000</td> | ||
2030 | <td class="comment">Windows executable</td> | ||
2031 | <td></td> | ||
2032 | </tr> | ||
2033 | <tr> | ||
2034 | <td class="filename"><a href='download.php?file=miniupnpc-1.5.20110314.tar.gz'>miniupnpc-1.5.20110314.tar.gz</a></td> | ||
2035 | <td class="filesize">57210</td> | ||
2036 | <td class="filedate">14/03/2011 14:27:29 +0000</td> | ||
2037 | <td class="comment">MiniUPnP client source code</td> | ||
2038 | <td></td> | ||
2039 | </tr> | ||
2040 | <tr> | ||
2041 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110309.tar.gz'>miniupnpd-1.5.20110309.tar.gz</a></td> | ||
2042 | <td class="filesize">100073</td> | ||
2043 | <td class="filedate">09/03/2011 15:36:12 +0000</td> | ||
2044 | <td class="comment">MiniUPnP daemon source code</td> | ||
2045 | <td></td> | ||
2046 | </tr> | ||
2047 | <tr> | ||
2048 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110302.tar.gz'>miniupnpd-1.5.20110302.tar.gz</a></td> | ||
2049 | <td class="filesize">100756</td> | ||
2050 | <td class="filedate">02/03/2011 16:17:44 +0000</td> | ||
2051 | <td class="comment">MiniUPnP daemon source code</td> | ||
2052 | <td></td> | ||
2053 | </tr> | ||
2054 | <tr> | ||
2055 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110221.tar.gz'>miniupnpd-1.5.20110221.tar.gz</a></td> | ||
2056 | <td class="filesize">100092</td> | ||
2057 | <td class="filedate">20/02/2011 23:48:17 +0000</td> | ||
2058 | <td class="comment">MiniUPnP daemon source code</td> | ||
2059 | <td></td> | ||
2060 | </tr> | ||
2061 | <tr> | ||
2062 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20110215.zip'>upnpc-exe-win32-20110215.zip</a></td> | ||
2063 | <td class="filesize">55409</td> | ||
2064 | <td class="filedate">15/02/2011 23:05:00 +0000</td> | ||
2065 | <td class="comment">Windows executable</td> | ||
2066 | <td></td> | ||
2067 | </tr> | ||
2068 | <tr> | ||
2069 | <td class="filename"><a href='download.php?file=miniupnpc-1.5.20110215.tar.gz'>miniupnpc-1.5.20110215.tar.gz</a></td> | ||
2070 | <td class="filesize">54880</td> | ||
2071 | <td class="filedate">15/02/2011 11:16:04 +0000</td> | ||
2072 | <td class="comment">MiniUPnP client source code</td> | ||
2073 | <td></td> | ||
2074 | </tr> | ||
2075 | <tr> | ||
2076 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110214.tar.gz'>miniupnpd-1.5.20110214.tar.gz</a></td> | ||
2077 | <td class="filesize">99629</td> | ||
2078 | <td class="filedate">14/02/2011 18:00:43 +0000</td> | ||
2079 | <td class="comment">MiniUPnP daemon source code</td> | ||
2080 | <td></td> | ||
2081 | </tr> | ||
2082 | <tr> | ||
2083 | <td class="filename"><a href='download.php?file=minidlna_1.0.18_minissdp1.patch'>minidlna_1.0.18_minissdp1.patch</a></td> | ||
2084 | <td class="filesize">9747</td> | ||
2085 | <td class="filedate">02/02/2011 15:12:19 +0000</td> | ||
2086 | <td class="comment">Patch for MiniDLNA to use miniSSDPD</td> | ||
2087 | <td></td> | ||
2088 | </tr> | ||
2089 | <tr> | ||
2090 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.20110127.tar.gz'>miniupnpd-1.5.20110127.tar.gz</a></td> | ||
2091 | <td class="filesize">97421</td> | ||
2092 | <td class="filedate">27/01/2011 17:51:25 +0000</td> | ||
2093 | <td class="comment">MiniUPnP daemon source code</td> | ||
2094 | <td></td> | ||
2095 | </tr> | ||
2096 | <tr> | ||
2097 | <td class="filename"><a href='download.php?file=miniupnpd-1.5.tar.gz'>miniupnpd-1.5.tar.gz</a></td> | ||
2098 | <td class="filesize">98993</td> | ||
2099 | <td class="filedate">04/01/2011 09:45:10 +0000</td> | ||
2100 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2101 | <td></td> | ||
2102 | </tr> | ||
2103 | <tr> | ||
2104 | <td class="filename"><a href='download.php?file=miniupnpc-1.5.tar.gz'>miniupnpc-1.5.tar.gz</a></td> | ||
2105 | <td class="filesize">53309</td> | ||
2106 | <td class="filedate">04/01/2011 09:45:06 +0000</td> | ||
2107 | <td class="comment">MiniUPnP client release source code</td> | ||
2108 | <td></td> | ||
2109 | </tr> | ||
2110 | <tr> | ||
2111 | <td class="filename"><a href='download.php?file=libnatpmp-20110103.tar.gz'>libnatpmp-20110103.tar.gz</a></td> | ||
2112 | <td class="filesize">17529</td> | ||
2113 | <td class="filedate">03/01/2011 17:33:16 +0000</td> | ||
2114 | <td class="comment">libnatpmp source code</td> | ||
2115 | <td></td> | ||
2116 | </tr> | ||
2117 | <tr> | ||
2118 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20101221.tar.gz'>miniupnpc-1.4.20101221.tar.gz</a></td> | ||
2119 | <td class="filesize">52342</td> | ||
2120 | <td class="filedate">21/12/2010 16:15:38 +0000</td> | ||
2121 | <td class="comment">MiniUPnP client source code</td> | ||
2122 | <td></td> | ||
2123 | </tr> | ||
2124 | <tr> | ||
2125 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20101213.zip'>upnpc-exe-win32-20101213.zip</a></td> | ||
2126 | <td class="filesize">52359</td> | ||
2127 | <td class="filedate">12/12/2010 23:44:01 +0000</td> | ||
2128 | <td class="comment">Windows executable</td> | ||
2129 | <td></td> | ||
2130 | </tr> | ||
2131 | <tr> | ||
2132 | <td class="filename"><a href='download.php?file=libnatpmp-20101211.tar.gz'>libnatpmp-20101211.tar.gz</a></td> | ||
2133 | <td class="filesize">17324</td> | ||
2134 | <td class="filedate">11/12/2010 17:20:36 +0000</td> | ||
2135 | <td class="comment">libnatpmp source code</td> | ||
2136 | <td></td> | ||
2137 | </tr> | ||
2138 | <tr> | ||
2139 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20101209.tar.gz'>miniupnpc-1.4.20101209.tar.gz</a></td> | ||
2140 | <td class="filesize">51900</td> | ||
2141 | <td class="filedate">09/12/2010 16:17:30 +0000</td> | ||
2142 | <td class="comment">MiniUPnP client source code</td> | ||
2143 | <td></td> | ||
2144 | </tr> | ||
2145 | <tr> | ||
2146 | <td class="filename"><a href='download.php?file=miniupnpd-1.4.20100921.tar.gz'>miniupnpd-1.4.20100921.tar.gz</a></td> | ||
2147 | <td class="filesize">95483</td> | ||
2148 | <td class="filedate">21/09/2010 15:50:00 +0000</td> | ||
2149 | <td class="comment">MiniUPnP daemon source code</td> | ||
2150 | <td></td> | ||
2151 | </tr> | ||
2152 | <tr> | ||
2153 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20100825.zip'>upnpc-exe-win32-20100825.zip</a></td> | ||
2154 | <td class="filesize">50636</td> | ||
2155 | <td class="filedate">25/08/2010 08:42:59 +0000</td> | ||
2156 | <td class="comment">Windows executable</td> | ||
2157 | <td></td> | ||
2158 | </tr> | ||
2159 | <tr> | ||
2160 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20100609.tar.gz'>miniupnpc-1.4.20100609.tar.gz</a></td> | ||
2161 | <td class="filesize">50390</td> | ||
2162 | <td class="filedate">09/06/2010 11:03:11 +0000</td> | ||
2163 | <td class="comment">MiniUPnP client source code</td> | ||
2164 | <td></td> | ||
2165 | </tr> | ||
2166 | <tr> | ||
2167 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20100513.zip'>upnpc-exe-win32-20100513.zip</a></td> | ||
2168 | <td class="filesize">50950</td> | ||
2169 | <td class="filedate">13/05/2010 16:54:33 +0000</td> | ||
2170 | <td class="comment">Windows executable</td> | ||
2171 | <td></td> | ||
2172 | </tr> | ||
2173 | <tr> | ||
2174 | <td class="filename"><a href='download.php?file=miniupnpd-1.4.20100511.tar.gz'>miniupnpd-1.4.20100511.tar.gz</a></td> | ||
2175 | <td class="filesize">93281</td> | ||
2176 | <td class="filedate">11/05/2010 16:22:33 +0000</td> | ||
2177 | <td class="comment">MiniUPnP daemon source code</td> | ||
2178 | <td></td> | ||
2179 | </tr> | ||
2180 | <tr> | ||
2181 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20100418.zip'>upnpc-exe-win32-20100418.zip</a></td> | ||
2182 | <td class="filesize">40758</td> | ||
2183 | <td class="filedate">17/04/2010 23:00:37 +0000</td> | ||
2184 | <td class="comment">Windows executable</td> | ||
2185 | <td></td> | ||
2186 | </tr> | ||
2187 | <tr> | ||
2188 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20100418.tar.gz'>miniupnpc-1.4.20100418.tar.gz</a></td> | ||
2189 | <td class="filesize">50245</td> | ||
2190 | <td class="filedate">17/04/2010 22:18:31 +0000</td> | ||
2191 | <td class="comment">MiniUPnP client source code</td> | ||
2192 | <td></td> | ||
2193 | </tr> | ||
2194 | <tr> | ||
2195 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20100412.tar.gz'>miniupnpc-1.4.20100412.tar.gz</a></td> | ||
2196 | <td class="filesize">50145</td> | ||
2197 | <td class="filedate">12/04/2010 20:42:53 +0000</td> | ||
2198 | <td class="comment">MiniUPnP client source code</td> | ||
2199 | <td></td> | ||
2200 | </tr> | ||
2201 | <tr> | ||
2202 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20100407.tar.gz'>miniupnpc-1.4.20100407.tar.gz</a></td> | ||
2203 | <td class="filesize">49756</td> | ||
2204 | <td class="filedate">07/04/2010 10:05:08 +0000</td> | ||
2205 | <td class="comment">MiniUPnP client source code</td> | ||
2206 | <td></td> | ||
2207 | </tr> | ||
2208 | <tr> | ||
2209 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20100405.tar.gz'>miniupnpc-1.4.20100405.tar.gz</a></td> | ||
2210 | <td class="filesize">49549</td> | ||
2211 | <td class="filedate">05/04/2010 14:34:38 +0000</td> | ||
2212 | <td class="comment">MiniUPnP client source code</td> | ||
2213 | <td></td> | ||
2214 | </tr> | ||
2215 | <tr> | ||
2216 | <td class="filename"><a href='download.php?file=miniupnpd-1.4.20100308.tar.gz'>miniupnpd-1.4.20100308.tar.gz</a></td> | ||
2217 | <td class="filesize">92889</td> | ||
2218 | <td class="filedate">08/03/2010 17:18:00 +0000</td> | ||
2219 | <td class="comment">MiniUPnP daemon source code</td> | ||
2220 | <td></td> | ||
2221 | </tr> | ||
2222 | <tr> | ||
2223 | <td class="filename"><a href='download.php?file=libnatpmp-20100202.tar.gz'>libnatpmp-20100202.tar.gz</a></td> | ||
2224 | <td class="filesize">17231</td> | ||
2225 | <td class="filedate">02/02/2010 18:41:13 +0000</td> | ||
2226 | <td class="comment">libnatpmp source code</td> | ||
2227 | <td></td> | ||
2228 | </tr> | ||
2229 | <tr> | ||
2230 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20100202.tar.gz'>miniupnpc-1.4.20100202.tar.gz</a></td> | ||
2231 | <td class="filesize">46710</td> | ||
2232 | <td class="filedate">02/02/2010 18:41:13 +0000</td> | ||
2233 | <td class="comment">MiniUPnP client source code</td> | ||
2234 | <td></td> | ||
2235 | </tr> | ||
2236 | <tr> | ||
2237 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20100106.tar.gz'>miniupnpc-1.4.20100106.tar.gz</a></td> | ||
2238 | <td class="filesize">46659</td> | ||
2239 | <td class="filedate">06/01/2010 10:08:21 +0000</td> | ||
2240 | <td class="comment">MiniUPnP client source code</td> | ||
2241 | <td></td> | ||
2242 | </tr> | ||
2243 | <tr> | ||
2244 | <td class="filename"><a href='download.php?file=miniupnpd-1.4.20091222.tar.gz'>miniupnpd-1.4.20091222.tar.gz</a></td> | ||
2245 | <td class="filesize">90993</td> | ||
2246 | <td class="filedate">22/12/2009 17:23:48 +0000</td> | ||
2247 | <td class="comment">MiniUPnP daemon source code</td> | ||
2248 | <td></td> | ||
2249 | </tr> | ||
2250 | <tr> | ||
2251 | <td class="filename"><a href='download.php?file=libnatpmp-20091219.tar.gz'>libnatpmp-20091219.tar.gz</a></td> | ||
2252 | <td class="filesize">16839</td> | ||
2253 | <td class="filedate">19/12/2009 14:35:22 +0000</td> | ||
2254 | <td class="comment">libnatpmp source code</td> | ||
2255 | <td></td> | ||
2256 | </tr> | ||
2257 | <tr> | ||
2258 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20091213.tar.gz'>miniupnpc-1.4.20091213.tar.gz</a></td> | ||
2259 | <td class="filesize">46510</td> | ||
2260 | <td class="filedate">12/12/2009 23:05:40 +0000</td> | ||
2261 | <td class="comment">MiniUPnP client source code</td> | ||
2262 | <td></td> | ||
2263 | </tr> | ||
2264 | <tr> | ||
2265 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20091211.tar.gz'>miniupnpc-1.4.20091211.tar.gz</a></td> | ||
2266 | <td class="filesize">45852</td> | ||
2267 | <td class="filedate">11/12/2009 16:43:01 +0000</td> | ||
2268 | <td class="comment">MiniUPnP client source code</td> | ||
2269 | <td></td> | ||
2270 | </tr> | ||
2271 | <tr> | ||
2272 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20091210.zip'>upnpc-exe-win32-20091210.zip</a></td> | ||
2273 | <td class="filesize">38666</td> | ||
2274 | <td class="filedate">10/12/2009 18:50:27 +0000</td> | ||
2275 | <td class="comment">Windows executable</td> | ||
2276 | <td></td> | ||
2277 | </tr> | ||
2278 | <tr> | ||
2279 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20091208.tar.gz'>miniupnpc-1.4.20091208.tar.gz</a></td> | ||
2280 | <td class="filesize">43392</td> | ||
2281 | <td class="filedate">08/12/2009 10:58:26 +0000</td> | ||
2282 | <td class="comment">MiniUPnP client source code</td> | ||
2283 | <td></td> | ||
2284 | </tr> | ||
2285 | <tr> | ||
2286 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.20091203.tar.gz'>miniupnpc-1.4.20091203.tar.gz</a></td> | ||
2287 | <td class="filesize">42040</td> | ||
2288 | <td class="filedate">03/12/2009 13:56:28 +0000</td> | ||
2289 | <td class="comment">MiniUPnP client source code</td> | ||
2290 | <td></td> | ||
2291 | </tr> | ||
2292 | <tr> | ||
2293 | <td class="filename"><a href='download.php?file=miniupnpd-1.4.20091106.tar.gz'>miniupnpd-1.4.20091106.tar.gz</a></td> | ||
2294 | <td class="filesize">90787</td> | ||
2295 | <td class="filedate">06/11/2009 21:18:50 +0000</td> | ||
2296 | <td class="comment">MiniUPnP daemon source code</td> | ||
2297 | <td></td> | ||
2298 | </tr> | ||
2299 | <tr> | ||
2300 | <td class="filename"><a href='download.php?file=miniupnpd-1.4.tar.gz'>miniupnpd-1.4.tar.gz</a></td> | ||
2301 | <td class="filesize">90071</td> | ||
2302 | <td class="filedate">30/10/2009 09:20:05 +0000</td> | ||
2303 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2304 | <td></td> | ||
2305 | </tr> | ||
2306 | <tr> | ||
2307 | <td class="filename"><a href='download.php?file=miniupnpc-1.4.tar.gz'>miniupnpc-1.4.tar.gz</a></td> | ||
2308 | <td class="filesize">41790</td> | ||
2309 | <td class="filedate">30/10/2009 09:20:04 +0000</td> | ||
2310 | <td class="comment">MiniUPnP client release source code</td> | ||
2311 | <td></td> | ||
2312 | </tr> | ||
2313 | <tr> | ||
2314 | <td class="filename"><a href='download.php?file=miniupnpc-20091016.tar.gz'>miniupnpc-20091016.tar.gz</a></td> | ||
2315 | <td class="filesize">41792</td> | ||
2316 | <td class="filedate">16/10/2009 09:04:35 +0000</td> | ||
2317 | <td class="comment">MiniUPnP client source code</td> | ||
2318 | <td></td> | ||
2319 | </tr> | ||
2320 | <tr> | ||
2321 | <td class="filename"><a href='download.php?file=miniupnpd-20091010.tar.gz'>miniupnpd-20091010.tar.gz</a></td> | ||
2322 | <td class="filesize">90043</td> | ||
2323 | <td class="filedate">10/10/2009 19:21:30 +0000</td> | ||
2324 | <td class="comment">MiniUPnP daemon source code</td> | ||
2325 | <td></td> | ||
2326 | </tr> | ||
2327 | <tr> | ||
2328 | <td class="filename"><a href='download.php?file=miniupnpc-20091010.tar.gz'>miniupnpc-20091010.tar.gz</a></td> | ||
2329 | <td class="filesize">41671</td> | ||
2330 | <td class="filedate">10/10/2009 19:21:28 +0000</td> | ||
2331 | <td class="comment">MiniUPnP client source code</td> | ||
2332 | <td></td> | ||
2333 | </tr> | ||
2334 | <tr> | ||
2335 | <td class="filename"><a href='download.php?file=miniupnpd-20090921.tar.gz'>miniupnpd-20090921.tar.gz</a></td> | ||
2336 | <td class="filesize">89476</td> | ||
2337 | <td class="filedate">21/09/2009 13:00:04 +0000</td> | ||
2338 | <td class="comment">MiniUPnP daemon source code</td> | ||
2339 | <td></td> | ||
2340 | </tr> | ||
2341 | <tr> | ||
2342 | <td class="filename"><a href='download.php?file=miniupnpc-20090921.tar.gz'>miniupnpc-20090921.tar.gz</a></td> | ||
2343 | <td class="filesize">41630</td> | ||
2344 | <td class="filedate">21/09/2009 13:00:03 +0000</td> | ||
2345 | <td class="comment">MiniUPnP client source code</td> | ||
2346 | <td></td> | ||
2347 | </tr> | ||
2348 | <tr> | ||
2349 | <td class="filename"><a href='download.php?file=miniupnpd-20090904.tar.gz'>miniupnpd-20090904.tar.gz</a></td> | ||
2350 | <td class="filesize">89344</td> | ||
2351 | <td class="filedate">04/09/2009 16:24:26 +0000</td> | ||
2352 | <td class="comment">MiniUPnP daemon source code</td> | ||
2353 | <td></td> | ||
2354 | </tr> | ||
2355 | <tr> | ||
2356 | <td class="filename"><a href='download.php?file=miniupnpd-20090820.tar.gz'>miniupnpd-20090820.tar.gz</a></td> | ||
2357 | <td class="filesize">89149</td> | ||
2358 | <td class="filedate">20/08/2009 09:35:58 +0000</td> | ||
2359 | <td class="comment">MiniUPnP daemon source code</td> | ||
2360 | <td></td> | ||
2361 | </tr> | ||
2362 | <tr> | ||
2363 | <td class="filename"><a href='download.php?file=miniupnpc-20090807.tar.gz'>miniupnpc-20090807.tar.gz</a></td> | ||
2364 | <td class="filesize">41288</td> | ||
2365 | <td class="filedate">07/08/2009 14:46:11 +0000</td> | ||
2366 | <td class="comment">MiniUPnP client source code</td> | ||
2367 | <td></td> | ||
2368 | </tr> | ||
2369 | <tr> | ||
2370 | <td class="filename"><a href='download.php?file=miniupnpc-20090729.tar.gz'>miniupnpc-20090729.tar.gz</a></td> | ||
2371 | <td class="filesize">40588</td> | ||
2372 | <td class="filedate">29/07/2009 08:47:43 +0000</td> | ||
2373 | <td class="comment">MiniUPnP client source code</td> | ||
2374 | <td></td> | ||
2375 | </tr> | ||
2376 | <tr> | ||
2377 | <td class="filename"><a href='download.php?file=xchat-upnp20061022.patch'>xchat-upnp20061022.patch</a></td> | ||
2378 | <td class="filesize">10258</td> | ||
2379 | <td class="filedate">17/07/2009 15:49:46 +0000</td> | ||
2380 | <td class="comment">Patch to add UPnP capabilities to xchat</td> | ||
2381 | <td></td> | ||
2382 | </tr> | ||
2383 | <tr> | ||
2384 | <td class="filename"><a href='download.php?file=miniupnpc-20090713.tar.gz'>miniupnpc-20090713.tar.gz</a></td> | ||
2385 | <td class="filesize">40206</td> | ||
2386 | <td class="filedate">13/07/2009 08:53:49 +0000</td> | ||
2387 | <td class="comment">MiniUPnP client source code</td> | ||
2388 | <td></td> | ||
2389 | </tr> | ||
2390 | <tr> | ||
2391 | <td class="filename"><a href='download.php?file=libnatpmp-20090713.tar.gz'>libnatpmp-20090713.tar.gz</a></td> | ||
2392 | <td class="filesize">14262</td> | ||
2393 | <td class="filedate">13/07/2009 08:53:49 +0000</td> | ||
2394 | <td class="comment">libnatpmp source code</td> | ||
2395 | <td></td> | ||
2396 | </tr> | ||
2397 | <tr> | ||
2398 | <td class="filename"><a href='download.php?file=miniupnpd-20090605.tar.gz'>miniupnpd-20090605.tar.gz</a></td> | ||
2399 | <td class="filesize">83774</td> | ||
2400 | <td class="filedate">04/06/2009 23:32:20 +0000</td> | ||
2401 | <td class="comment">MiniUPnP daemon source code</td> | ||
2402 | <td></td> | ||
2403 | </tr> | ||
2404 | <tr> | ||
2405 | <td class="filename"><a href='download.php?file=miniupnpc-20090605.tar.gz'>miniupnpc-20090605.tar.gz</a></td> | ||
2406 | <td class="filesize">40077</td> | ||
2407 | <td class="filedate">04/06/2009 23:32:16 +0000</td> | ||
2408 | <td class="comment">MiniUPnP client source code</td> | ||
2409 | <td></td> | ||
2410 | </tr> | ||
2411 | <tr> | ||
2412 | <td class="filename"><a href='download.php?file=libnatpmp-20090605.tar.gz'>libnatpmp-20090605.tar.gz</a></td> | ||
2413 | <td class="filesize">13817</td> | ||
2414 | <td class="filedate">04/06/2009 23:32:15 +0000</td> | ||
2415 | <td class="comment">libnatpmp source code</td> | ||
2416 | <td></td> | ||
2417 | </tr> | ||
2418 | <tr> | ||
2419 | <td class="filename"><a href='download.php?file=miniupnpd-20090516.tar.gz'>miniupnpd-20090516.tar.gz</a></td> | ||
2420 | <td class="filesize">83689</td> | ||
2421 | <td class="filedate">16/05/2009 08:47:31 +0000</td> | ||
2422 | <td class="comment">MiniUPnP daemon source code</td> | ||
2423 | <td></td> | ||
2424 | </tr> | ||
2425 | <tr> | ||
2426 | <td class="filename"><a href='download.php?file=miniupnpc-1.3.tar.gz'>miniupnpc-1.3.tar.gz</a></td> | ||
2427 | <td class="filesize">40058</td> | ||
2428 | <td class="filedate">17/04/2009 21:27:55 +0000</td> | ||
2429 | <td class="comment">MiniUPnP client release source code</td> | ||
2430 | <td></td> | ||
2431 | </tr> | ||
2432 | <tr> | ||
2433 | <td class="filename"><a href='download.php?file=miniupnpd-1.3.tar.gz'>miniupnpd-1.3.tar.gz</a></td> | ||
2434 | <td class="filesize">83464</td> | ||
2435 | <td class="filedate">17/04/2009 20:11:21 +0000</td> | ||
2436 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2437 | <td></td> | ||
2438 | </tr> | ||
2439 | <tr> | ||
2440 | <td class="filename"><a href='download.php?file=libnatpmp-20090310.tar.gz'>libnatpmp-20090310.tar.gz</a></td> | ||
2441 | <td class="filesize">11847</td> | ||
2442 | <td class="filedate">10/03/2009 10:19:45 +0000</td> | ||
2443 | <td class="comment">libnatpmp source code</td> | ||
2444 | <td></td> | ||
2445 | </tr> | ||
2446 | <tr> | ||
2447 | <td class="filename"><a href='download.php?file=miniupnpd-20090214.tar.gz'>miniupnpd-20090214.tar.gz</a></td> | ||
2448 | <td class="filesize">82921</td> | ||
2449 | <td class="filedate">14/02/2009 11:27:03 +0000</td> | ||
2450 | <td class="comment">MiniUPnP daemon source code</td> | ||
2451 | <td></td> | ||
2452 | </tr> | ||
2453 | <tr> | ||
2454 | <td class="filename"><a href='download.php?file=miniupnpd-20090213.tar.gz'>miniupnpd-20090213.tar.gz</a></td> | ||
2455 | <td class="filesize">82594</td> | ||
2456 | <td class="filedate">13/02/2009 19:48:01 +0000</td> | ||
2457 | <td class="comment">MiniUPnP daemon source code</td> | ||
2458 | <td></td> | ||
2459 | </tr> | ||
2460 | <tr> | ||
2461 | <td class="filename"><a href='download.php?file=libnatpmp-20090129.tar.gz'>libnatpmp-20090129.tar.gz</a></td> | ||
2462 | <td class="filesize">11748</td> | ||
2463 | <td class="filedate">29/01/2009 21:50:31 +0000</td> | ||
2464 | <td class="comment">libnatpmp source code</td> | ||
2465 | <td></td> | ||
2466 | </tr> | ||
2467 | <tr> | ||
2468 | <td class="filename"><a href='download.php?file=miniupnpc-20090129.tar.gz'>miniupnpc-20090129.tar.gz</a></td> | ||
2469 | <td class="filesize">39976</td> | ||
2470 | <td class="filedate">29/01/2009 21:50:30 +0000</td> | ||
2471 | <td class="comment">MiniUPnP client source code</td> | ||
2472 | <td></td> | ||
2473 | </tr> | ||
2474 | <tr> | ||
2475 | <td class="filename"><a href='download.php?file=miniupnpd-20090129.tar.gz'>miniupnpd-20090129.tar.gz</a></td> | ||
2476 | <td class="filesize">82487</td> | ||
2477 | <td class="filedate">29/01/2009 21:50:27 +0000</td> | ||
2478 | <td class="comment">MiniUPnP daemon source code</td> | ||
2479 | <td></td> | ||
2480 | </tr> | ||
2481 | <tr> | ||
2482 | <td class="filename"><a href='download.php?file=miniupnpd-20081009.tar.gz'>miniupnpd-20081009.tar.gz</a></td> | ||
2483 | <td class="filesize">81732</td> | ||
2484 | <td class="filedate">09/10/2008 12:53:02 +0000</td> | ||
2485 | <td class="comment">MiniUPnP daemon source code</td> | ||
2486 | <td></td> | ||
2487 | </tr> | ||
2488 | <tr> | ||
2489 | <td class="filename"><a href='download.php?file=minissdpd-1.0.tar.gz'>minissdpd-1.0.tar.gz</a></td> | ||
2490 | <td class="filesize">12996</td> | ||
2491 | <td class="filedate">07/10/2008 14:03:49 +0000</td> | ||
2492 | <td class="comment">MiniSSDPd release source code</td> | ||
2493 | <td></td> | ||
2494 | </tr> | ||
2495 | <tr> | ||
2496 | <td class="filename"><a href='download.php?file=miniupnpc-1.2.tar.gz'>miniupnpc-1.2.tar.gz</a></td> | ||
2497 | <td class="filesize">38787</td> | ||
2498 | <td class="filedate">07/10/2008 14:03:47 +0000</td> | ||
2499 | <td class="comment">MiniUPnP client release source code</td> | ||
2500 | <td></td> | ||
2501 | </tr> | ||
2502 | <tr> | ||
2503 | <td class="filename"><a href='download.php?file=miniupnpd-1.2.tar.gz'>miniupnpd-1.2.tar.gz</a></td> | ||
2504 | <td class="filesize">81025</td> | ||
2505 | <td class="filedate">07/10/2008 14:03:45 +0000</td> | ||
2506 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2507 | <td></td> | ||
2508 | </tr> | ||
2509 | <tr> | ||
2510 | <td class="filename"><a href='download.php?file=miniupnpd-20081006.tar.gz'>miniupnpd-20081006.tar.gz</a></td> | ||
2511 | <td class="filesize">80510</td> | ||
2512 | <td class="filedate">06/10/2008 15:50:34 +0000</td> | ||
2513 | <td class="comment">MiniUPnP daemon source code</td> | ||
2514 | <td></td> | ||
2515 | </tr> | ||
2516 | <tr> | ||
2517 | <td class="filename"><a href='download.php?file=minissdpd-20081006.tar.gz'>minissdpd-20081006.tar.gz</a></td> | ||
2518 | <td class="filesize">12230</td> | ||
2519 | <td class="filedate">06/10/2008 15:50:33 +0000</td> | ||
2520 | <td class="comment">MiniSSDPd source code</td> | ||
2521 | <td></td> | ||
2522 | </tr> | ||
2523 | <tr> | ||
2524 | <td class="filename"><a href='download.php?file=libnatpmp-20081006.tar.gz'>libnatpmp-20081006.tar.gz</a></td> | ||
2525 | <td class="filesize">11710</td> | ||
2526 | <td class="filedate">06/10/2008 15:50:31 +0000</td> | ||
2527 | <td class="comment">libnatpmp source code</td> | ||
2528 | <td></td> | ||
2529 | </tr> | ||
2530 | <tr> | ||
2531 | <td class="filename" colspan="2"><a href='download.php?file=mediatomb_minissdp-20081006.patch'>mediatomb_minissdp-20081006.patch</a></td> | ||
2532 | <td class="filedate">06/10/2008 15:48:18 +0000</td> | ||
2533 | <td class="comment"></td> | ||
2534 | <td></td> | ||
2535 | </tr> | ||
2536 | <tr> | ||
2537 | <td class="filename"><a href='download.php?file=miniupnpc-20081002.tar.gz'>miniupnpc-20081002.tar.gz</a></td> | ||
2538 | <td class="filesize">38291</td> | ||
2539 | <td class="filedate">02/10/2008 09:20:18 +0000</td> | ||
2540 | <td class="comment">MiniUPnP client source code</td> | ||
2541 | <td></td> | ||
2542 | </tr> | ||
2543 | <tr> | ||
2544 | <td class="filename"><a href='download.php?file=miniupnpd-20081001.tar.gz'>miniupnpd-20081001.tar.gz</a></td> | ||
2545 | <td class="filesize">79696</td> | ||
2546 | <td class="filedate">01/10/2008 13:11:20 +0000</td> | ||
2547 | <td class="comment">MiniUPnP daemon source code</td> | ||
2548 | <td></td> | ||
2549 | </tr> | ||
2550 | <tr> | ||
2551 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20080925.zip'>upnpc-exe-win32-20080925.zip</a></td> | ||
2552 | <td class="filesize">36602</td> | ||
2553 | <td class="filedate">25/09/2008 06:59:33 +0000</td> | ||
2554 | <td class="comment">Windows executable</td> | ||
2555 | <td></td> | ||
2556 | </tr> | ||
2557 | <tr> | ||
2558 | <td class="filename"><a href='download.php?file=miniupnpd-20080710.tar.gz'>miniupnpd-20080710.tar.gz</a></td> | ||
2559 | <td class="filesize">78898</td> | ||
2560 | <td class="filedate">10/07/2008 09:38:41 +0000</td> | ||
2561 | <td class="comment">MiniUPnP daemon source code</td> | ||
2562 | <td></td> | ||
2563 | </tr> | ||
2564 | <tr> | ||
2565 | <td class="filename"><a href='download.php?file=libnatpmp-20080707.tar.gz'>libnatpmp-20080707.tar.gz</a></td> | ||
2566 | <td class="filesize">11679</td> | ||
2567 | <td class="filedate">06/07/2008 22:05:23 +0000</td> | ||
2568 | <td class="comment">libnatpmp source code</td> | ||
2569 | <td></td> | ||
2570 | </tr> | ||
2571 | <tr> | ||
2572 | <td class="filename"><a href='download.php?file=miniupnpc-1.1.tar.gz'>miniupnpc-1.1.tar.gz</a></td> | ||
2573 | <td class="filesize">38235</td> | ||
2574 | <td class="filedate">04/07/2008 16:45:24 +0000</td> | ||
2575 | <td class="comment">MiniUPnP client release source code</td> | ||
2576 | <td></td> | ||
2577 | </tr> | ||
2578 | <tr> | ||
2579 | <td class="filename"><a href='download.php?file=miniupnpc-20080703.tar.gz'>miniupnpc-20080703.tar.gz</a></td> | ||
2580 | <td class="filesize">38204</td> | ||
2581 | <td class="filedate">03/07/2008 15:47:37 +0000</td> | ||
2582 | <td class="comment">MiniUPnP client source code</td> | ||
2583 | <td></td> | ||
2584 | </tr> | ||
2585 | <tr> | ||
2586 | <td class="filename"><a href='download.php?file=libnatpmp-20080703.tar.gz'>libnatpmp-20080703.tar.gz</a></td> | ||
2587 | <td class="filesize">11570</td> | ||
2588 | <td class="filedate">03/07/2008 15:47:25 +0000</td> | ||
2589 | <td class="comment">libnatpmp source code</td> | ||
2590 | <td></td> | ||
2591 | </tr> | ||
2592 | <tr> | ||
2593 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20080703.zip'>upnpc-exe-win32-20080703.zip</a></td> | ||
2594 | <td class="filesize">36137</td> | ||
2595 | <td class="filedate">02/07/2008 23:35:14 +0000</td> | ||
2596 | <td class="comment">Windows executable</td> | ||
2597 | <td></td> | ||
2598 | </tr> | ||
2599 | <tr> | ||
2600 | <td class="filename"><a href='download.php?file=libnatpmp-20080702.tar.gz'>libnatpmp-20080702.tar.gz</a></td> | ||
2601 | <td class="filesize">8873</td> | ||
2602 | <td class="filedate">02/07/2008 17:32:35 +0000</td> | ||
2603 | <td class="comment">libnatpmp source code</td> | ||
2604 | <td></td> | ||
2605 | </tr> | ||
2606 | <tr> | ||
2607 | <td class="filename"><a href='download.php?file=libnatpmp-20080630.tar.gz'>libnatpmp-20080630.tar.gz</a></td> | ||
2608 | <td class="filesize">8864</td> | ||
2609 | <td class="filedate">30/06/2008 14:20:16 +0000</td> | ||
2610 | <td class="comment">libnatpmp source code</td> | ||
2611 | <td></td> | ||
2612 | </tr> | ||
2613 | <tr> | ||
2614 | <td class="filename"><a href='download.php?file=libnatpmp-20080529.tar.gz'>libnatpmp-20080529.tar.gz</a></td> | ||
2615 | <td class="filesize">7397</td> | ||
2616 | <td class="filedate">29/05/2008 09:06:25 +0000</td> | ||
2617 | <td class="comment">libnatpmp source code</td> | ||
2618 | <td></td> | ||
2619 | </tr> | ||
2620 | <tr> | ||
2621 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20080514.zip'>upnpc-exe-win32-20080514.zip</a></td> | ||
2622 | <td class="filesize">14227</td> | ||
2623 | <td class="filedate">14/05/2008 20:23:19 +0000</td> | ||
2624 | <td class="comment">Windows executable</td> | ||
2625 | <td></td> | ||
2626 | </tr> | ||
2627 | <tr> | ||
2628 | <td class="filename"><a href='download.php?file=libnatpmp-20080428.tar.gz'>libnatpmp-20080428.tar.gz</a></td> | ||
2629 | <td class="filesize">7295</td> | ||
2630 | <td class="filedate">28/04/2008 03:09:14 +0000</td> | ||
2631 | <td class="comment">libnatpmp source code</td> | ||
2632 | <td></td> | ||
2633 | </tr> | ||
2634 | <tr> | ||
2635 | <td class="filename"><a href='download.php?file=miniupnpd-20080427.tar.gz'>miniupnpd-20080427.tar.gz</a></td> | ||
2636 | <td class="filesize">78765</td> | ||
2637 | <td class="filedate">27/04/2008 18:16:36 +0000</td> | ||
2638 | <td class="comment">MiniUPnP daemon source code</td> | ||
2639 | <td></td> | ||
2640 | </tr> | ||
2641 | <tr> | ||
2642 | <td class="filename"><a href='download.php?file=miniupnpc-20080427.tar.gz'>miniupnpc-20080427.tar.gz</a></td> | ||
2643 | <td class="filesize">37610</td> | ||
2644 | <td class="filedate">27/04/2008 18:16:35 +0000</td> | ||
2645 | <td class="comment">MiniUPnP client source code</td> | ||
2646 | <td></td> | ||
2647 | </tr> | ||
2648 | <tr> | ||
2649 | <td class="filename"><a href='download.php?file=miniupnpd-1.1.tar.gz'>miniupnpd-1.1.tar.gz</a></td> | ||
2650 | <td class="filesize">78594</td> | ||
2651 | <td class="filedate">25/04/2008 17:38:05 +0000</td> | ||
2652 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2653 | <td></td> | ||
2654 | </tr> | ||
2655 | <tr> | ||
2656 | <td class="filename"><a href='download.php?file=miniupnpc-20080423.tar.gz'>miniupnpc-20080423.tar.gz</a></td> | ||
2657 | <td class="filesize">36818</td> | ||
2658 | <td class="filedate">23/04/2008 11:57:36 +0000</td> | ||
2659 | <td class="comment">MiniUPnP client source code</td> | ||
2660 | <td></td> | ||
2661 | </tr> | ||
2662 | <tr> | ||
2663 | <td class="filename"><a href='download.php?file=miniupnpd-20080308.tar.gz'>miniupnpd-20080308.tar.gz</a></td> | ||
2664 | <td class="filesize">75679</td> | ||
2665 | <td class="filedate">08/03/2008 11:13:29 +0000</td> | ||
2666 | <td class="comment">MiniUPnP daemon source code</td> | ||
2667 | <td></td> | ||
2668 | </tr> | ||
2669 | <tr> | ||
2670 | <td class="filename"><a href='download.php?file=miniupnpd-20080303.tar.gz'>miniupnpd-20080303.tar.gz</a></td> | ||
2671 | <td class="filesize">74202</td> | ||
2672 | <td class="filedate">03/03/2008 01:43:16 +0000</td> | ||
2673 | <td class="comment">MiniUPnP daemon source code</td> | ||
2674 | <td></td> | ||
2675 | </tr> | ||
2676 | <tr> | ||
2677 | <td class="filename"><a href='download.php?file=miniupnpd-20080224.tar.gz'>miniupnpd-20080224.tar.gz</a></td> | ||
2678 | <td class="filesize">72773</td> | ||
2679 | <td class="filedate">24/02/2008 11:23:17 +0000</td> | ||
2680 | <td class="comment">MiniUPnP daemon source code</td> | ||
2681 | <td></td> | ||
2682 | </tr> | ||
2683 | <tr> | ||
2684 | <td class="filename"><a href='download.php?file=miniupnpc-1.0.tar.gz'>miniupnpc-1.0.tar.gz</a></td> | ||
2685 | <td class="filesize">36223</td> | ||
2686 | <td class="filedate">21/02/2008 13:26:46 +0000</td> | ||
2687 | <td class="comment">MiniUPnP client release source code</td> | ||
2688 | <td></td> | ||
2689 | </tr> | ||
2690 | <tr> | ||
2691 | <td class="filename"><a href='download.php?file=miniupnpd-20080221.tar.gz'>miniupnpd-20080221.tar.gz</a></td> | ||
2692 | <td class="filesize">70823</td> | ||
2693 | <td class="filedate">21/02/2008 10:23:46 +0000</td> | ||
2694 | <td class="comment">MiniUPnP daemon source code</td> | ||
2695 | <td></td> | ||
2696 | </tr> | ||
2697 | <tr> | ||
2698 | <td class="filename"><a href='download.php?file=miniupnpc-20080217.tar.gz'>miniupnpc-20080217.tar.gz</a></td> | ||
2699 | <td class="filesize">35243</td> | ||
2700 | <td class="filedate">16/02/2008 23:47:59 +0000</td> | ||
2701 | <td class="comment">MiniUPnP client source code</td> | ||
2702 | <td></td> | ||
2703 | </tr> | ||
2704 | <tr> | ||
2705 | <td class="filename"><a href='download.php?file=miniupnpd-20080207.tar.gz'>miniupnpd-20080207.tar.gz</a></td> | ||
2706 | <td class="filesize">70647</td> | ||
2707 | <td class="filedate">07/02/2008 21:21:00 +0000</td> | ||
2708 | <td class="comment">MiniUPnP daemon source code</td> | ||
2709 | <td></td> | ||
2710 | </tr> | ||
2711 | <tr> | ||
2712 | <td class="filename"><a href='download.php?file=miniupnpc-20080203.tar.gz'>miniupnpc-20080203.tar.gz</a></td> | ||
2713 | <td class="filesize">34921</td> | ||
2714 | <td class="filedate">03/02/2008 22:28:11 +0000</td> | ||
2715 | <td class="comment">MiniUPnP client source code</td> | ||
2716 | <td></td> | ||
2717 | </tr> | ||
2718 | <tr> | ||
2719 | <td class="filename"><a href='download.php?file=miniupnpd-1.0.tar.gz'>miniupnpd-1.0.tar.gz</a></td> | ||
2720 | <td class="filesize">69427</td> | ||
2721 | <td class="filedate">27/01/2008 22:41:25 +0000</td> | ||
2722 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2723 | <td></td> | ||
2724 | </tr> | ||
2725 | <tr> | ||
2726 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20080118.zip'>upnpc-exe-win32-20080118.zip</a></td> | ||
2727 | <td class="filesize">13582</td> | ||
2728 | <td class="filedate">18/01/2008 11:42:16 +0000</td> | ||
2729 | <td class="comment">Windows executable</td> | ||
2730 | <td></td> | ||
2731 | </tr> | ||
2732 | <tr> | ||
2733 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC13.tar.gz'>miniupnpd-1.0-RC13.tar.gz</a></td> | ||
2734 | <td class="filesize">67892</td> | ||
2735 | <td class="filedate">03/01/2008 16:50:21 +0000</td> | ||
2736 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2737 | <td></td> | ||
2738 | </tr> | ||
2739 | <tr> | ||
2740 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC13.tar.gz'>miniupnpc-1.0-RC13.tar.gz</a></td> | ||
2741 | <td class="filesize">34820</td> | ||
2742 | <td class="filedate">03/01/2008 16:50:20 +0000</td> | ||
2743 | <td class="comment">MiniUPnP client release source code</td> | ||
2744 | <td></td> | ||
2745 | </tr> | ||
2746 | <tr> | ||
2747 | <td class="filename"><a href='download.php?file=miniupnpd-20071220.tar.gz'>miniupnpd-20071220.tar.gz</a></td> | ||
2748 | <td class="filesize">67211</td> | ||
2749 | <td class="filedate">20/12/2007 12:08:34 +0000</td> | ||
2750 | <td class="comment">MiniUPnP daemon source code</td> | ||
2751 | <td></td> | ||
2752 | </tr> | ||
2753 | <tr> | ||
2754 | <td class="filename"><a href='download.php?file=miniupnpc-20071219.tar.gz'>miniupnpc-20071219.tar.gz</a></td> | ||
2755 | <td class="filesize">34290</td> | ||
2756 | <td class="filedate">19/12/2007 18:31:47 +0000</td> | ||
2757 | <td class="comment">MiniUPnP client source code</td> | ||
2758 | <td></td> | ||
2759 | </tr> | ||
2760 | <tr> | ||
2761 | <td class="filename"><a href='download.php?file=minissdpd-1.0-RC12.tar.gz'>minissdpd-1.0-RC12.tar.gz</a></td> | ||
2762 | <td class="filesize">9956</td> | ||
2763 | <td class="filedate">19/12/2007 18:30:12 +0000</td> | ||
2764 | <td class="comment">MiniSSDPd release source code</td> | ||
2765 | <td></td> | ||
2766 | </tr> | ||
2767 | <tr> | ||
2768 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC12.tar.gz'>miniupnpd-1.0-RC12.tar.gz</a></td> | ||
2769 | <td class="filesize">66911</td> | ||
2770 | <td class="filedate">14/12/2007 17:39:20 +0000</td> | ||
2771 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2772 | <td></td> | ||
2773 | </tr> | ||
2774 | <tr> | ||
2775 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC12.tar.gz'>miniupnpc-1.0-RC12.tar.gz</a></td> | ||
2776 | <td class="filesize">32543</td> | ||
2777 | <td class="filedate">14/12/2007 17:39:19 +0000</td> | ||
2778 | <td class="comment">MiniUPnP client release source code</td> | ||
2779 | <td></td> | ||
2780 | </tr> | ||
2781 | <tr> | ||
2782 | <td class="filename"><a href='download.php?file=miniupnpc-20071213.tar.gz'>miniupnpc-20071213.tar.gz</a></td> | ||
2783 | <td class="filesize">32541</td> | ||
2784 | <td class="filedate">13/12/2007 17:09:51 +0000</td> | ||
2785 | <td class="comment">MiniUPnP client source code</td> | ||
2786 | <td></td> | ||
2787 | </tr> | ||
2788 | <tr> | ||
2789 | <td class="filename"><a href='download.php?file=miniupnpd-20071213.tar.gz'>miniupnpd-20071213.tar.gz</a></td> | ||
2790 | <td class="filesize">66826</td> | ||
2791 | <td class="filedate">13/12/2007 16:42:50 +0000</td> | ||
2792 | <td class="comment">MiniUPnP daemon source code</td> | ||
2793 | <td></td> | ||
2794 | </tr> | ||
2795 | <tr> | ||
2796 | <td class="filename"><a href='download.php?file=libnatpmp-20071213.tar.gz'>libnatpmp-20071213.tar.gz</a></td> | ||
2797 | <td class="filesize">5997</td> | ||
2798 | <td class="filedate">13/12/2007 14:56:30 +0000</td> | ||
2799 | <td class="comment">libnatpmp source code</td> | ||
2800 | <td></td> | ||
2801 | </tr> | ||
2802 | <tr> | ||
2803 | <td class="filename"><a href='download.php?file=libnatpmp-20071202.tar.gz'>libnatpmp-20071202.tar.gz</a></td> | ||
2804 | <td class="filesize">5664</td> | ||
2805 | <td class="filedate">02/12/2007 00:15:28 +0000</td> | ||
2806 | <td class="comment">libnatpmp source code</td> | ||
2807 | <td></td> | ||
2808 | </tr> | ||
2809 | <tr> | ||
2810 | <td class="filename"><a href='download.php?file=miniupnpd-20071103.tar.gz'>miniupnpd-20071103.tar.gz</a></td> | ||
2811 | <td class="filesize">65740</td> | ||
2812 | <td class="filedate">02/11/2007 23:58:38 +0000</td> | ||
2813 | <td class="comment">MiniUPnP daemon source code</td> | ||
2814 | <td></td> | ||
2815 | </tr> | ||
2816 | <tr> | ||
2817 | <td class="filename"><a href='download.php?file=miniupnpd-20071102.tar.gz'>miniupnpd-20071102.tar.gz</a></td> | ||
2818 | <td class="filesize">65733</td> | ||
2819 | <td class="filedate">02/11/2007 23:05:44 +0000</td> | ||
2820 | <td class="comment">MiniUPnP daemon source code</td> | ||
2821 | <td></td> | ||
2822 | </tr> | ||
2823 | <tr> | ||
2824 | <td class="filename"><a href='download.php?file=miniupnpc-20071103.tar.gz'>miniupnpc-20071103.tar.gz</a></td> | ||
2825 | <td class="filesize">32239</td> | ||
2826 | <td class="filedate">02/11/2007 23:05:34 +0000</td> | ||
2827 | <td class="comment">MiniUPnP client source code</td> | ||
2828 | <td></td> | ||
2829 | </tr> | ||
2830 | <tr> | ||
2831 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC11.tar.gz'>miniupnpd-1.0-RC11.tar.gz</a></td> | ||
2832 | <td class="filesize">64828</td> | ||
2833 | <td class="filedate">25/10/2007 13:27:18 +0000</td> | ||
2834 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2835 | <td></td> | ||
2836 | </tr> | ||
2837 | <tr> | ||
2838 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC11.tar.gz'>miniupnpc-1.0-RC11.tar.gz</a></td> | ||
2839 | <td class="filesize">32161</td> | ||
2840 | <td class="filedate">25/10/2007 13:27:17 +0000</td> | ||
2841 | <td class="comment">MiniUPnP client release source code</td> | ||
2842 | <td></td> | ||
2843 | </tr> | ||
2844 | <tr> | ||
2845 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20071025.zip'>upnpc-exe-win32-20071025.zip</a></td> | ||
2846 | <td class="filesize">12809</td> | ||
2847 | <td class="filedate">24/10/2007 23:15:55 +0000</td> | ||
2848 | <td class="comment">Windows executable</td> | ||
2849 | <td></td> | ||
2850 | </tr> | ||
2851 | <tr> | ||
2852 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC10.tar.gz'>miniupnpd-1.0-RC10.tar.gz</a></td> | ||
2853 | <td class="filesize">62674</td> | ||
2854 | <td class="filedate">12/10/2007 08:38:33 +0000</td> | ||
2855 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2856 | <td></td> | ||
2857 | </tr> | ||
2858 | <tr> | ||
2859 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC10.tar.gz'>miniupnpc-1.0-RC10.tar.gz</a></td> | ||
2860 | <td class="filesize">31962</td> | ||
2861 | <td class="filedate">12/10/2007 08:38:31 +0000</td> | ||
2862 | <td class="comment">MiniUPnP client release source code</td> | ||
2863 | <td></td> | ||
2864 | </tr> | ||
2865 | <tr> | ||
2866 | <td class="filename"><a href='download.php?file=minissdpd-1.0-RC10.tar.gz'>minissdpd-1.0-RC10.tar.gz</a></td> | ||
2867 | <td class="filesize">9517</td> | ||
2868 | <td class="filedate">12/10/2007 08:38:30 +0000</td> | ||
2869 | <td class="comment">MiniSSDPd release source code</td> | ||
2870 | <td></td> | ||
2871 | </tr> | ||
2872 | <tr> | ||
2873 | <td class="filename"><a href='download.php?file=miniupnpc-20071003.tar.gz'>miniupnpc-20071003.tar.gz</a></td> | ||
2874 | <td class="filesize">31199</td> | ||
2875 | <td class="filedate">03/10/2007 15:30:13 +0000</td> | ||
2876 | <td class="comment">MiniUPnP client source code</td> | ||
2877 | <td></td> | ||
2878 | </tr> | ||
2879 | <tr> | ||
2880 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20071001.zip'>upnpc-exe-win32-20071001.zip</a></td> | ||
2881 | <td class="filesize">12604</td> | ||
2882 | <td class="filedate">01/10/2007 17:09:22 +0000</td> | ||
2883 | <td class="comment">Windows executable</td> | ||
2884 | <td></td> | ||
2885 | </tr> | ||
2886 | <tr> | ||
2887 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC9.tar.gz'>miniupnpd-1.0-RC9.tar.gz</a></td> | ||
2888 | <td class="filesize">54778</td> | ||
2889 | <td class="filedate">27/09/2007 19:38:36 +0000</td> | ||
2890 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2891 | <td></td> | ||
2892 | </tr> | ||
2893 | <tr> | ||
2894 | <td class="filename"><a href='download.php?file=minissdpd-1.0-RC9.tar.gz'>minissdpd-1.0-RC9.tar.gz</a></td> | ||
2895 | <td class="filesize">9163</td> | ||
2896 | <td class="filedate">27/09/2007 17:00:03 +0000</td> | ||
2897 | <td class="comment">MiniSSDPd release source code</td> | ||
2898 | <td></td> | ||
2899 | </tr> | ||
2900 | <tr> | ||
2901 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC9.tar.gz'>miniupnpc-1.0-RC9.tar.gz</a></td> | ||
2902 | <td class="filesize">30538</td> | ||
2903 | <td class="filedate">27/09/2007 17:00:03 +0000</td> | ||
2904 | <td class="comment">MiniUPnP client release source code</td> | ||
2905 | <td></td> | ||
2906 | </tr> | ||
2907 | <tr> | ||
2908 | <td class="filename"><a href='download.php?file=miniupnpd-20070924.tar.gz'>miniupnpd-20070924.tar.gz</a></td> | ||
2909 | <td class="filesize">52338</td> | ||
2910 | <td class="filedate">24/09/2007 20:26:05 +0000</td> | ||
2911 | <td class="comment">MiniUPnP daemon source code</td> | ||
2912 | <td></td> | ||
2913 | </tr> | ||
2914 | <tr> | ||
2915 | <td class="filename"><a href='download.php?file=miniupnpd-20070923.tar.gz'>miniupnpd-20070923.tar.gz</a></td> | ||
2916 | <td class="filesize">51060</td> | ||
2917 | <td class="filedate">23/09/2007 21:13:34 +0000</td> | ||
2918 | <td class="comment">MiniUPnP daemon source code</td> | ||
2919 | <td></td> | ||
2920 | </tr> | ||
2921 | <tr> | ||
2922 | <td class="filename"><a href='download.php?file=miniupnpc-20070923.tar.gz'>miniupnpc-20070923.tar.gz</a></td> | ||
2923 | <td class="filesize">30246</td> | ||
2924 | <td class="filedate">23/09/2007 21:13:33 +0000</td> | ||
2925 | <td class="comment">MiniUPnP client source code</td> | ||
2926 | <td></td> | ||
2927 | </tr> | ||
2928 | <tr> | ||
2929 | <td class="filename"><a href='download.php?file=minissdpd-20070923.tar.gz'>minissdpd-20070923.tar.gz</a></td> | ||
2930 | <td class="filesize">8978</td> | ||
2931 | <td class="filedate">23/09/2007 21:13:32 +0000</td> | ||
2932 | <td class="comment">MiniSSDPd source code</td> | ||
2933 | <td></td> | ||
2934 | </tr> | ||
2935 | <tr> | ||
2936 | <td class="filename"><a href='download.php?file=miniupnpc-20070902.tar.gz'>miniupnpc-20070902.tar.gz</a></td> | ||
2937 | <td class="filesize">30205</td> | ||
2938 | <td class="filedate">01/09/2007 23:47:23 +0000</td> | ||
2939 | <td class="comment">MiniUPnP client source code</td> | ||
2940 | <td></td> | ||
2941 | </tr> | ||
2942 | <tr> | ||
2943 | <td class="filename"><a href='download.php?file=minissdpd-20070902.tar.gz'>minissdpd-20070902.tar.gz</a></td> | ||
2944 | <td class="filesize">6539</td> | ||
2945 | <td class="filedate">01/09/2007 23:47:20 +0000</td> | ||
2946 | <td class="comment">MiniSSDPd source code</td> | ||
2947 | <td></td> | ||
2948 | </tr> | ||
2949 | <tr> | ||
2950 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC8.tar.gz'>miniupnpd-1.0-RC8.tar.gz</a></td> | ||
2951 | <td class="filesize">50952</td> | ||
2952 | <td class="filedate">29/08/2007 10:56:09 +0000</td> | ||
2953 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2954 | <td></td> | ||
2955 | </tr> | ||
2956 | <tr> | ||
2957 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC8.tar.gz'>miniupnpc-1.0-RC8.tar.gz</a></td> | ||
2958 | <td class="filesize">29312</td> | ||
2959 | <td class="filedate">29/08/2007 10:56:08 +0000</td> | ||
2960 | <td class="comment">MiniUPnP client release source code</td> | ||
2961 | <td></td> | ||
2962 | </tr> | ||
2963 | <tr> | ||
2964 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC7.tar.gz'>miniupnpd-1.0-RC7.tar.gz</a></td> | ||
2965 | <td class="filesize">50613</td> | ||
2966 | <td class="filedate">20/07/2007 00:15:45 +0000</td> | ||
2967 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2968 | <td></td> | ||
2969 | </tr> | ||
2970 | <tr> | ||
2971 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC6.tar.gz'>miniupnpd-1.0-RC6.tar.gz</a></td> | ||
2972 | <td class="filesize">49986</td> | ||
2973 | <td class="filedate">12/06/2007 17:12:07 +0000</td> | ||
2974 | <td class="comment">MiniUPnP daemon release source code</td> | ||
2975 | <td></td> | ||
2976 | </tr> | ||
2977 | <tr> | ||
2978 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC6.tar.gz'>miniupnpc-1.0-RC6.tar.gz</a></td> | ||
2979 | <td class="filesize">29032</td> | ||
2980 | <td class="filedate">12/06/2007 17:12:06 +0000</td> | ||
2981 | <td class="comment">MiniUPnP client release source code</td> | ||
2982 | <td></td> | ||
2983 | </tr> | ||
2984 | <tr> | ||
2985 | <td class="filename"><a href='download.php?file=miniupnpd-20070607.tar.gz'>miniupnpd-20070607.tar.gz</a></td> | ||
2986 | <td class="filesize">49768</td> | ||
2987 | <td class="filedate">06/06/2007 23:12:00 +0000</td> | ||
2988 | <td class="comment">MiniUPnP daemon source code</td> | ||
2989 | <td></td> | ||
2990 | </tr> | ||
2991 | <tr> | ||
2992 | <td class="filename"><a href='download.php?file=miniupnpd-20070605.tar.gz'>miniupnpd-20070605.tar.gz</a></td> | ||
2993 | <td class="filesize">49710</td> | ||
2994 | <td class="filedate">05/06/2007 21:01:53 +0000</td> | ||
2995 | <td class="comment">MiniUPnP daemon source code</td> | ||
2996 | <td></td> | ||
2997 | </tr> | ||
2998 | <tr> | ||
2999 | <td class="filename"><a href='download.php?file=miniupnpd-20070521.tar.gz'>miniupnpd-20070521.tar.gz</a></td> | ||
3000 | <td class="filesize">48374</td> | ||
3001 | <td class="filedate">21/05/2007 13:07:43 +0000</td> | ||
3002 | <td class="comment">MiniUPnP daemon source code</td> | ||
3003 | <td></td> | ||
3004 | </tr> | ||
3005 | <tr> | ||
3006 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20070519.zip'>upnpc-exe-win32-20070519.zip</a></td> | ||
3007 | <td class="filesize">10836</td> | ||
3008 | <td class="filedate">19/05/2007 13:14:15 +0000</td> | ||
3009 | <td class="comment">Windows executable</td> | ||
3010 | <td></td> | ||
3011 | </tr> | ||
3012 | <tr> | ||
3013 | <td class="filename"><a href='download.php?file=miniupnpc-20070515.tar.gz'>miniupnpc-20070515.tar.gz</a></td> | ||
3014 | <td class="filesize">25802</td> | ||
3015 | <td class="filedate">15/05/2007 18:15:25 +0000</td> | ||
3016 | <td class="comment">MiniUPnP client source code</td> | ||
3017 | <td></td> | ||
3018 | </tr> | ||
3019 | <tr> | ||
3020 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC5.tar.gz'>miniupnpd-1.0-RC5.tar.gz</a></td> | ||
3021 | <td class="filesize">48064</td> | ||
3022 | <td class="filedate">10/05/2007 20:22:48 +0000</td> | ||
3023 | <td class="comment">MiniUPnP daemon release source code</td> | ||
3024 | <td></td> | ||
3025 | </tr> | ||
3026 | <tr> | ||
3027 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC5.tar.gz'>miniupnpc-1.0-RC5.tar.gz</a></td> | ||
3028 | <td class="filesize">25242</td> | ||
3029 | <td class="filedate">10/05/2007 20:22:46 +0000</td> | ||
3030 | <td class="comment">MiniUPnP client release source code</td> | ||
3031 | <td></td> | ||
3032 | </tr> | ||
3033 | <tr> | ||
3034 | <td class="filename"><a href='download.php?file=miniupnpd-20070412.tar.gz'>miniupnpd-20070412.tar.gz</a></td> | ||
3035 | <td class="filesize">47807</td> | ||
3036 | <td class="filedate">12/04/2007 20:21:48 +0000</td> | ||
3037 | <td class="comment">MiniUPnP daemon source code</td> | ||
3038 | <td></td> | ||
3039 | </tr> | ||
3040 | <tr> | ||
3041 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC4.tar.gz'>miniupnpd-1.0-RC4.tar.gz</a></td> | ||
3042 | <td class="filesize">47687</td> | ||
3043 | <td class="filedate">17/03/2007 11:43:13 +0000</td> | ||
3044 | <td class="comment">MiniUPnP daemon release source code</td> | ||
3045 | <td></td> | ||
3046 | </tr> | ||
3047 | <tr> | ||
3048 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC4.tar.gz'>miniupnpc-1.0-RC4.tar.gz</a></td> | ||
3049 | <td class="filesize">25085</td> | ||
3050 | <td class="filedate">17/03/2007 11:43:10 +0000</td> | ||
3051 | <td class="comment">MiniUPnP client release source code</td> | ||
3052 | <td></td> | ||
3053 | </tr> | ||
3054 | <tr> | ||
3055 | <td class="filename"><a href='download.php?file=miniupnpd-20070311.tar.gz'>miniupnpd-20070311.tar.gz</a></td> | ||
3056 | <td class="filesize">47599</td> | ||
3057 | <td class="filedate">11/03/2007 00:25:26 +0000</td> | ||
3058 | <td class="comment">MiniUPnP daemon source code</td> | ||
3059 | <td></td> | ||
3060 | </tr> | ||
3061 | <tr> | ||
3062 | <td class="filename"><a href='download.php?file=miniupnpd-20070208.tar.gz'>miniupnpd-20070208.tar.gz</a></td> | ||
3063 | <td class="filesize">45084</td> | ||
3064 | <td class="filedate">07/02/2007 23:04:06 +0000</td> | ||
3065 | <td class="comment">MiniUPnP daemon source code</td> | ||
3066 | <td></td> | ||
3067 | </tr> | ||
3068 | <tr> | ||
3069 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC3.tar.gz'>miniupnpd-1.0-RC3.tar.gz</a></td> | ||
3070 | <td class="filesize">44683</td> | ||
3071 | <td class="filedate">30/01/2007 23:00:44 +0000</td> | ||
3072 | <td class="comment">MiniUPnP daemon release source code</td> | ||
3073 | <td></td> | ||
3074 | </tr> | ||
3075 | <tr> | ||
3076 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC3.tar.gz'>miniupnpc-1.0-RC3.tar.gz</a></td> | ||
3077 | <td class="filesize">25055</td> | ||
3078 | <td class="filedate">30/01/2007 23:00:42 +0000</td> | ||
3079 | <td class="comment">MiniUPnP client release source code</td> | ||
3080 | <td></td> | ||
3081 | </tr> | ||
3082 | <tr> | ||
3083 | <td class="filename"><a href='download.php?file=miniupnpd-20070130.tar.gz'>miniupnpd-20070130.tar.gz</a></td> | ||
3084 | <td class="filesize">43735</td> | ||
3085 | <td class="filedate">29/01/2007 23:26:16 +0000</td> | ||
3086 | <td class="comment">MiniUPnP daemon source code</td> | ||
3087 | <td></td> | ||
3088 | </tr> | ||
3089 | <tr> | ||
3090 | <td class="filename"><a href='download.php?file=miniupnpc-20070130.tar.gz'>miniupnpc-20070130.tar.gz</a></td> | ||
3091 | <td class="filesize">24466</td> | ||
3092 | <td class="filedate">29/01/2007 23:26:13 +0000</td> | ||
3093 | <td class="comment">MiniUPnP client source code</td> | ||
3094 | <td></td> | ||
3095 | </tr> | ||
3096 | <tr> | ||
3097 | <td class="filename"><a href='download.php?file=miniupnpd-20070127.tar.gz'>miniupnpd-20070127.tar.gz</a></td> | ||
3098 | <td class="filesize">42643</td> | ||
3099 | <td class="filedate">27/01/2007 16:02:35 +0000</td> | ||
3100 | <td class="comment">MiniUPnP daemon source code</td> | ||
3101 | <td></td> | ||
3102 | </tr> | ||
3103 | <tr> | ||
3104 | <td class="filename"><a href='download.php?file=miniupnpc-20070127.tar.gz'>miniupnpc-20070127.tar.gz</a></td> | ||
3105 | <td class="filesize">24241</td> | ||
3106 | <td class="filedate">27/01/2007 16:02:33 +0000</td> | ||
3107 | <td class="comment">MiniUPnP client source code</td> | ||
3108 | <td></td> | ||
3109 | </tr> | ||
3110 | <tr> | ||
3111 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC2.tar.gz'>miniupnpd-1.0-RC2.tar.gz</a></td> | ||
3112 | <td class="filesize">40424</td> | ||
3113 | <td class="filedate">17/01/2007 16:13:05 +0000</td> | ||
3114 | <td class="comment">MiniUPnP daemon release source code</td> | ||
3115 | <td></td> | ||
3116 | </tr> | ||
3117 | <tr> | ||
3118 | <td class="filename"><a href='download.php?file=miniupnpd-20070112.tar.gz'>miniupnpd-20070112.tar.gz</a></td> | ||
3119 | <td class="filesize">40708</td> | ||
3120 | <td class="filedate">12/01/2007 13:40:50 +0000</td> | ||
3121 | <td class="comment">MiniUPnP daemon source code</td> | ||
3122 | <td></td> | ||
3123 | </tr> | ||
3124 | <tr> | ||
3125 | <td class="filename"><a href='download.php?file=miniupnpd-20070111.tar.gz'>miniupnpd-20070111.tar.gz</a></td> | ||
3126 | <td class="filesize">40651</td> | ||
3127 | <td class="filedate">11/01/2007 18:50:21 +0000</td> | ||
3128 | <td class="comment">MiniUPnP daemon source code</td> | ||
3129 | <td></td> | ||
3130 | </tr> | ||
3131 | <tr> | ||
3132 | <td class="filename"><a href='download.php?file=miniupnpd-20070108.tar.gz'>miniupnpd-20070108.tar.gz</a></td> | ||
3133 | <td class="filesize">40025</td> | ||
3134 | <td class="filedate">08/01/2007 10:02:14 +0000</td> | ||
3135 | <td class="comment">MiniUPnP daemon source code</td> | ||
3136 | <td></td> | ||
3137 | </tr> | ||
3138 | <tr> | ||
3139 | <td class="filename"><a href='download.php?file=miniupnpd-20070103.tar.gz'>miniupnpd-20070103.tar.gz</a></td> | ||
3140 | <td class="filesize">40065</td> | ||
3141 | <td class="filedate">03/01/2007 14:39:11 +0000</td> | ||
3142 | <td class="comment">MiniUPnP daemon source code</td> | ||
3143 | <td></td> | ||
3144 | </tr> | ||
3145 | <tr> | ||
3146 | <td class="filename"><a href='download.php?file=miniupnpc-20061214.tar.gz'>miniupnpc-20061214.tar.gz</a></td> | ||
3147 | <td class="filesize">24106</td> | ||
3148 | <td class="filedate">14/12/2006 15:43:54 +0000</td> | ||
3149 | <td class="comment">MiniUPnP client source code</td> | ||
3150 | <td></td> | ||
3151 | </tr> | ||
3152 | <tr> | ||
3153 | <td class="filename"><a href='download.php?file=miniupnpd-20061214.tar.gz'>miniupnpd-20061214.tar.gz</a></td> | ||
3154 | <td class="filesize">39750</td> | ||
3155 | <td class="filedate">14/12/2006 13:44:51 +0000</td> | ||
3156 | <td class="comment">MiniUPnP daemon source code</td> | ||
3157 | <td></td> | ||
3158 | </tr> | ||
3159 | <tr> | ||
3160 | <td class="filename"><a href='download.php?file=miniupnpd-1.0-RC1.tar.gz'>miniupnpd-1.0-RC1.tar.gz</a></td> | ||
3161 | <td class="filesize">39572</td> | ||
3162 | <td class="filedate">07/12/2006 10:55:31 +0000</td> | ||
3163 | <td class="comment">MiniUPnP daemon release source code</td> | ||
3164 | <td></td> | ||
3165 | </tr> | ||
3166 | <tr> | ||
3167 | <td class="filename"><a href='download.php?file=miniupnpc-1.0-RC1.tar.gz'>miniupnpc-1.0-RC1.tar.gz</a></td> | ||
3168 | <td class="filesize">23582</td> | ||
3169 | <td class="filedate">07/12/2006 10:55:30 +0000</td> | ||
3170 | <td class="comment">MiniUPnP client release source code</td> | ||
3171 | <td></td> | ||
3172 | </tr> | ||
3173 | <tr> | ||
3174 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20061201.zip'>upnpc-exe-win32-20061201.zip</a></td> | ||
3175 | <td class="filesize">10378</td> | ||
3176 | <td class="filedate">01/12/2006 00:33:08 +0000</td> | ||
3177 | <td class="comment">Windows executable</td> | ||
3178 | <td></td> | ||
3179 | </tr> | ||
3180 | <tr> | ||
3181 | <td class="filename"><a href='download.php?file=miniupnpd20061130.tar.gz'>miniupnpd20061130.tar.gz</a></td> | ||
3182 | <td class="filesize">37184</td> | ||
3183 | <td class="filedate">30/11/2006 12:25:25 +0000</td> | ||
3184 | <td class="comment">MiniUPnP daemon source code</td> | ||
3185 | <td></td> | ||
3186 | </tr> | ||
3187 | <tr> | ||
3188 | <td class="filename"><a href='download.php?file=miniupnpd20061129.tar.gz'>miniupnpd20061129.tar.gz</a></td> | ||
3189 | <td class="filesize">36045</td> | ||
3190 | <td class="filedate">29/11/2006 00:10:49 +0000</td> | ||
3191 | <td class="comment">MiniUPnP daemon source code</td> | ||
3192 | <td></td> | ||
3193 | </tr> | ||
3194 | <tr> | ||
3195 | <td class="filename"><a href='download.php?file=miniupnpd20061127.tar.gz'>miniupnpd20061127.tar.gz</a></td> | ||
3196 | <td class="filesize">34155</td> | ||
3197 | <td class="filedate">26/11/2006 23:15:28 +0000</td> | ||
3198 | <td class="comment">MiniUPnP daemon source code</td> | ||
3199 | <td></td> | ||
3200 | </tr> | ||
3201 | <tr> | ||
3202 | <td class="filename"><a href='download.php?file=miniupnpc20061123.tar.gz'>miniupnpc20061123.tar.gz</a></td> | ||
3203 | <td class="filesize">21004</td> | ||
3204 | <td class="filedate">23/11/2006 22:41:46 +0000</td> | ||
3205 | <td class="comment">MiniUPnP client source code</td> | ||
3206 | <td></td> | ||
3207 | </tr> | ||
3208 | <tr> | ||
3209 | <td class="filename" colspan="2"><a href='download.php?file=miniupnpd-bin-openwrt20061123.tar.gz'>miniupnpd-bin-openwrt20061123.tar.gz</a></td> | ||
3210 | <td class="filedate">23/11/2006 22:41:44 +0000</td> | ||
3211 | <td class="comment">Precompiled binaries for openwrt</td> | ||
3212 | <td></td> | ||
3213 | </tr> | ||
3214 | <tr> | ||
3215 | <td class="filename"><a href='download.php?file=miniupnpd20061123.tar.gz'>miniupnpd20061123.tar.gz</a></td> | ||
3216 | <td class="filesize">33809</td> | ||
3217 | <td class="filedate">23/11/2006 22:28:29 +0000</td> | ||
3218 | <td class="comment">MiniUPnP daemon source code</td> | ||
3219 | <td></td> | ||
3220 | </tr> | ||
3221 | <tr> | ||
3222 | <td class="filename"><a href='download.php?file=miniupnpc20061119.tar.gz'>miniupnpc20061119.tar.gz</a></td> | ||
3223 | <td class="filesize">20897</td> | ||
3224 | <td class="filedate">19/11/2006 22:50:37 +0000</td> | ||
3225 | <td class="comment">MiniUPnP client source code</td> | ||
3226 | <td></td> | ||
3227 | </tr> | ||
3228 | <tr> | ||
3229 | <td class="filename"><a href='download.php?file=miniupnpd20061119.tar.gz'>miniupnpd20061119.tar.gz</a></td> | ||
3230 | <td class="filesize">32580</td> | ||
3231 | <td class="filedate">19/11/2006 22:50:36 +0000</td> | ||
3232 | <td class="comment">MiniUPnP daemon source code</td> | ||
3233 | <td></td> | ||
3234 | </tr> | ||
3235 | <tr> | ||
3236 | <td class="filename"><a href='download.php?file=miniupnpd20061117.tar.gz'>miniupnpd20061117.tar.gz</a></td> | ||
3237 | <td class="filesize">32646</td> | ||
3238 | <td class="filedate">17/11/2006 13:29:33 +0000</td> | ||
3239 | <td class="comment">MiniUPnP daemon source code</td> | ||
3240 | <td></td> | ||
3241 | </tr> | ||
3242 | <tr> | ||
3243 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20061112.zip'>upnpc-exe-win32-20061112.zip</a></td> | ||
3244 | <td class="filesize">10262</td> | ||
3245 | <td class="filedate">12/11/2006 22:41:25 +0000</td> | ||
3246 | <td class="comment">Windows executable</td> | ||
3247 | <td></td> | ||
3248 | </tr> | ||
3249 | <tr> | ||
3250 | <td class="filename"><a href='download.php?file=miniupnpd20061112.tar.gz'>miniupnpd20061112.tar.gz</a></td> | ||
3251 | <td class="filesize">32023</td> | ||
3252 | <td class="filedate">12/11/2006 21:30:32 +0000</td> | ||
3253 | <td class="comment">MiniUPnP daemon source code</td> | ||
3254 | <td></td> | ||
3255 | </tr> | ||
3256 | <tr> | ||
3257 | <td class="filename"><a href='download.php?file=miniupnpc20061112.tar.gz'>miniupnpc20061112.tar.gz</a></td> | ||
3258 | <td class="filesize">21047</td> | ||
3259 | <td class="filedate">12/11/2006 21:30:31 +0000</td> | ||
3260 | <td class="comment">MiniUPnP client source code</td> | ||
3261 | <td></td> | ||
3262 | </tr> | ||
3263 | <tr> | ||
3264 | <td class="filename"><a href='download.php?file=miniupnpd20061110.tar.gz'>miniupnpd20061110.tar.gz</a></td> | ||
3265 | <td class="filesize">27926</td> | ||
3266 | <td class="filedate">09/11/2006 23:35:02 +0000</td> | ||
3267 | <td class="comment">MiniUPnP daemon source code</td> | ||
3268 | <td></td> | ||
3269 | </tr> | ||
3270 | <tr> | ||
3271 | <td class="filename"><a href='download.php?file=miniupnpc20061110.tar.gz'>miniupnpc20061110.tar.gz</a></td> | ||
3272 | <td class="filesize">21009</td> | ||
3273 | <td class="filedate">09/11/2006 23:32:19 +0000</td> | ||
3274 | <td class="comment">MiniUPnP client source code</td> | ||
3275 | <td></td> | ||
3276 | </tr> | ||
3277 | <tr> | ||
3278 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20061101.zip'>upnpc-exe-win32-20061101.zip</a></td> | ||
3279 | <td class="filesize">10089</td> | ||
3280 | <td class="filedate">08/11/2006 20:35:09 +0000</td> | ||
3281 | <td class="comment">Windows executable</td> | ||
3282 | <td></td> | ||
3283 | </tr> | ||
3284 | <tr> | ||
3285 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20061020.zip'>upnpc-exe-win32-20061020.zip</a></td> | ||
3286 | <td class="filesize">9183</td> | ||
3287 | <td class="filedate">08/11/2006 20:35:08 +0000</td> | ||
3288 | <td class="comment">Windows executable</td> | ||
3289 | <td></td> | ||
3290 | </tr> | ||
3291 | <tr> | ||
3292 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20060909.zip'>upnpc-exe-win32-20060909.zip</a></td> | ||
3293 | <td class="filesize">9994</td> | ||
3294 | <td class="filedate">08/11/2006 20:35:07 +0000</td> | ||
3295 | <td class="comment">Windows executable</td> | ||
3296 | <td></td> | ||
3297 | </tr> | ||
3298 | <tr> | ||
3299 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20060801.zip'>upnpc-exe-win32-20060801.zip</a></td> | ||
3300 | <td class="filesize">10002</td> | ||
3301 | <td class="filedate">08/11/2006 20:35:06 +0000</td> | ||
3302 | <td class="comment">Windows executable</td> | ||
3303 | <td></td> | ||
3304 | </tr> | ||
3305 | <tr> | ||
3306 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20060711.zip'>upnpc-exe-win32-20060711.zip</a></td> | ||
3307 | <td class="filesize">13733</td> | ||
3308 | <td class="filedate">08/11/2006 20:35:05 +0000</td> | ||
3309 | <td class="comment">Windows executable</td> | ||
3310 | <td></td> | ||
3311 | </tr> | ||
3312 | <tr> | ||
3313 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20060709.zip'>upnpc-exe-win32-20060709.zip</a></td> | ||
3314 | <td class="filesize">13713</td> | ||
3315 | <td class="filedate">08/11/2006 20:35:04 +0000</td> | ||
3316 | <td class="comment">Windows executable</td> | ||
3317 | <td></td> | ||
3318 | </tr> | ||
3319 | <tr> | ||
3320 | <td class="filename"><a href='download.php?file=upnpc-exe-win32-20060704.zip'>upnpc-exe-win32-20060704.zip</a></td> | ||
3321 | <td class="filesize">13297</td> | ||
3322 | <td class="filedate">08/11/2006 20:35:03 +0000</td> | ||
3323 | <td class="comment">Windows executable</td> | ||
3324 | <td></td> | ||
3325 | </tr> | ||
3326 | <tr> | ||
3327 | <td class="filename"><a href='download.php?file=miniupnpc20061107.tar.gz'>miniupnpc20061107.tar.gz</a></td> | ||
3328 | <td class="filesize">20708</td> | ||
3329 | <td class="filedate">06/11/2006 23:36:57 +0000</td> | ||
3330 | <td class="comment">MiniUPnP client source code</td> | ||
3331 | <td></td> | ||
3332 | </tr> | ||
3333 | <tr> | ||
3334 | <td class="filename"><a href='download.php?file=miniupnpd20061107.tar.gz'>miniupnpd20061107.tar.gz</a></td> | ||
3335 | <td class="filesize">26992</td> | ||
3336 | <td class="filedate">06/11/2006 23:35:06 +0000</td> | ||
3337 | <td class="comment">MiniUPnP daemon source code</td> | ||
3338 | <td></td> | ||
3339 | </tr> | ||
3340 | <tr> | ||
3341 | <td class="filename"><a href='download.php?file=miniupnpc20061106.tar.gz'>miniupnpc20061106.tar.gz</a></td> | ||
3342 | <td class="filesize">20575</td> | ||
3343 | <td class="filedate">06/11/2006 17:02:15 +0000</td> | ||
3344 | <td class="comment">MiniUPnP client source code</td> | ||
3345 | <td></td> | ||
3346 | </tr> | ||
3347 | <tr> | ||
3348 | <td class="filename"><a href='download.php?file=miniupnpd20061106.tar.gz'>miniupnpd20061106.tar.gz</a></td> | ||
3349 | <td class="filesize">26597</td> | ||
3350 | <td class="filedate">06/11/2006 15:39:10 +0000</td> | ||
3351 | <td class="comment">MiniUPnP daemon source code</td> | ||
3352 | <td></td> | ||
3353 | </tr> | ||
3354 | <tr> | ||
3355 | <td class="filename"><a href='download.php?file=miniupnpc20061101.tar.gz'>miniupnpc20061101.tar.gz</a></td> | ||
3356 | <td class="filesize">20395</td> | ||
3357 | <td class="filedate">04/11/2006 18:16:15 +0000</td> | ||
3358 | <td class="comment">MiniUPnP client source code</td> | ||
3359 | <td></td> | ||
3360 | </tr> | ||
3361 | <tr> | ||
3362 | <td class="filename"><a href='download.php?file=miniupnpc20061031.tar.gz'>miniupnpc20061031.tar.gz</a></td> | ||
3363 | <td class="filesize">20396</td> | ||
3364 | <td class="filedate">04/11/2006 18:16:13 +0000</td> | ||
3365 | <td class="comment">MiniUPnP client source code</td> | ||
3366 | <td></td> | ||
3367 | </tr> | ||
3368 | <tr> | ||
3369 | <td class="filename"><a href='download.php?file=miniupnpc20061023.tar.gz'>miniupnpc20061023.tar.gz</a></td> | ||
3370 | <td class="filesize">20109</td> | ||
3371 | <td class="filedate">04/11/2006 18:16:12 +0000</td> | ||
3372 | <td class="comment">MiniUPnP client source code</td> | ||
3373 | <td></td> | ||
3374 | </tr> | ||
3375 | <tr> | ||
3376 | <td class="filename"><a href='download.php?file=miniupnpc20061020.tar.gz'>miniupnpc20061020.tar.gz</a></td> | ||
3377 | <td class="filesize">19739</td> | ||
3378 | <td class="filedate">04/11/2006 18:16:10 +0000</td> | ||
3379 | <td class="comment">MiniUPnP client source code</td> | ||
3380 | <td></td> | ||
3381 | </tr> | ||
3382 | <tr> | ||
3383 | <td class="filename"><a href='download.php?file=miniupnpc20060909.tar.gz'>miniupnpc20060909.tar.gz</a></td> | ||
3384 | <td class="filesize">19285</td> | ||
3385 | <td class="filedate">04/11/2006 18:16:09 +0000</td> | ||
3386 | <td class="comment">MiniUPnP client source code</td> | ||
3387 | <td></td> | ||
3388 | </tr> | ||
3389 | <tr> | ||
3390 | <td class="filename"><a href='download.php?file=miniupnpc20060731.tar.gz'>miniupnpc20060731.tar.gz</a></td> | ||
3391 | <td class="filesize">19032</td> | ||
3392 | <td class="filedate">04/11/2006 18:16:07 +0000</td> | ||
3393 | <td class="comment">MiniUPnP client source code</td> | ||
3394 | <td></td> | ||
3395 | </tr> | ||
3396 | <tr> | ||
3397 | <td class="filename"><a href='download.php?file=miniupnpc20060711.tar.gz'>miniupnpc20060711.tar.gz</a></td> | ||
3398 | <td class="filesize">19151</td> | ||
3399 | <td class="filedate">04/11/2006 18:16:06 +0000</td> | ||
3400 | <td class="comment">MiniUPnP client source code</td> | ||
3401 | <td></td> | ||
3402 | </tr> | ||
3403 | <tr> | ||
3404 | <td class="filename"><a href='download.php?file=miniupnpc20060709.tar.gz'>miniupnpc20060709.tar.gz</a></td> | ||
3405 | <td class="filesize">19080</td> | ||
3406 | <td class="filedate">04/11/2006 18:16:04 +0000</td> | ||
3407 | <td class="comment">MiniUPnP client source code</td> | ||
3408 | <td></td> | ||
3409 | </tr> | ||
3410 | <tr> | ||
3411 | <td class="filename"><a href='download.php?file=miniupnpc20060703.tar.gz'>miniupnpc20060703.tar.gz</a></td> | ||
3412 | <td class="filesize">17906</td> | ||
3413 | <td class="filedate">04/11/2006 18:16:03 +0000</td> | ||
3414 | <td class="comment">MiniUPnP client source code</td> | ||
3415 | <td></td> | ||
3416 | </tr> | ||
3417 | <tr> | ||
3418 | <td class="filename"><a href='download.php?file=miniupnpc-new20060630.tar.gz'>miniupnpc-new20060630.tar.gz</a></td> | ||
3419 | <td class="filesize">14840</td> | ||
3420 | <td class="filedate">04/11/2006 18:16:01 +0000</td> | ||
3421 | <td class="comment">João Paulo Barraca version of the upnp client</td> | ||
3422 | <td></td> | ||
3423 | </tr> | ||
3424 | <tr> | ||
3425 | <td class="filename"><a href='download.php?file=miniupnpd20061029.tar.gz'>miniupnpd20061029.tar.gz</a></td> | ||
3426 | <td class="filesize">24197</td> | ||
3427 | <td class="filedate">03/11/2006 13:40:30 +0000</td> | ||
3428 | <td class="comment">MiniUPnP daemon source code</td> | ||
3429 | <td></td> | ||
3430 | </tr> | ||
3431 | <tr> | ||
3432 | <td class="filename"><a href='download.php?file=miniupnpd20061027.tar.gz'>miniupnpd20061027.tar.gz</a></td> | ||
3433 | <td class="filesize">23904</td> | ||
3434 | <td class="filedate">03/11/2006 13:40:29 +0000</td> | ||
3435 | <td class="comment">MiniUPnP daemon source code</td> | ||
3436 | <td></td> | ||
3437 | </tr> | ||
3438 | <tr> | ||
3439 | <td class="filename"><a href='download.php?file=miniupnpd20061028.tar.gz'>miniupnpd20061028.tar.gz</a></td> | ||
3440 | <td class="filesize">24383</td> | ||
3441 | <td class="filedate">03/11/2006 13:40:29 +0000</td> | ||
3442 | <td class="comment">MiniUPnP daemon source code</td> | ||
3443 | <td></td> | ||
3444 | </tr> | ||
3445 | <tr> | ||
3446 | <td class="filename"><a href='download.php?file=miniupnpd20061018.tar.gz'>miniupnpd20061018.tar.gz</a></td> | ||
3447 | <td class="filesize">23051</td> | ||
3448 | <td class="filedate">03/11/2006 13:40:28 +0000</td> | ||
3449 | <td class="comment">MiniUPnP daemon source code</td> | ||
3450 | <td></td> | ||
3451 | </tr> | ||
3452 | <tr> | ||
3453 | <td class="filename"><a href='download.php?file=miniupnpd20061023.tar.gz'>miniupnpd20061023.tar.gz</a></td> | ||
3454 | <td class="filesize">23478</td> | ||
3455 | <td class="filedate">03/11/2006 13:40:28 +0000</td> | ||
3456 | <td class="comment">MiniUPnP daemon source code</td> | ||
3457 | <td></td> | ||
3458 | </tr> | ||
3459 | <tr> | ||
3460 | <td class="filename"><a href='download.php?file=miniupnpd20060930.tar.gz'>miniupnpd20060930.tar.gz</a></td> | ||
3461 | <td class="filesize">22832</td> | ||
3462 | <td class="filedate">03/11/2006 13:40:28 +0000</td> | ||
3463 | <td class="comment">MiniUPnP daemon source code</td> | ||
3464 | <td></td> | ||
3465 | </tr> | ||
3466 | <tr> | ||
3467 | <td class="filename"><a href='download.php?file=miniupnpd20060924.tar.gz'>miniupnpd20060924.tar.gz</a></td> | ||
3468 | <td class="filesize">22038</td> | ||
3469 | <td class="filedate">03/11/2006 13:40:27 +0000</td> | ||
3470 | <td class="comment">MiniUPnP daemon source code</td> | ||
3471 | <td></td> | ||
3472 | </tr> | ||
3473 | <tr> | ||
3474 | <td class="filename"><a href='download.php?file=miniupnpd20060919.tar.gz'>miniupnpd20060919.tar.gz</a></td> | ||
3475 | <td class="filesize">21566</td> | ||
3476 | <td class="filedate">03/11/2006 13:40:27 +0000</td> | ||
3477 | <td class="comment">MiniUPnP daemon source code</td> | ||
3478 | <td></td> | ||
3479 | </tr> | ||
3480 | <tr> | ||
3481 | <td class="filename"><a href='download.php?file=miniupnpd20060729.tar.gz'>miniupnpd20060729.tar.gz</a></td> | ||
3482 | <td class="filesize">19202</td> | ||
3483 | <td class="filedate">03/11/2006 13:40:26 +0000</td> | ||
3484 | <td class="comment">MiniUPnP daemon source code</td> | ||
3485 | <td></td> | ||
3486 | </tr> | ||
3487 | <tr> | ||
3488 | <td class="filename"><a href='download.php?file=miniupnpd20060909.tar.gz'>miniupnpd20060909.tar.gz</a></td> | ||
3489 | <td class="filesize">19952</td> | ||
3490 | <td class="filedate">03/11/2006 13:40:26 +0000</td> | ||
3491 | <td class="comment">MiniUPnP daemon source code</td> | ||
3492 | <td></td> | ||
3493 | </tr> | ||
3494 | </table> | ||
3495 | |||
3496 | <p><a href="..">Home</a></p> | ||
3497 | <p>Contact: miniupnp _AT_ free _DOT_ fr</p> | ||
3498 | <p align="center"> | ||
3499 | <a href="https://validator.w3.org/check?uri=referer"><img src="https://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Transitional" height="31" width="88" /></a> | ||
3500 | <a href="https://jigsaw.w3.org/css-validator/check/referer"><img style="border:0;width:88px;height:31px" src="https://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" /></a> | ||
3501 | <!-- | ||
3502 | <a href="https://freshmeat.net/projects/miniupnp"><img src="https://s3.amazonaws.com/entp-tender-production/assets/bc5be96f147ec8db3c10fc017f1f53889904ef5b/fm_logo_white_150_normal.png" border="0" alt="freshmeat.net" /></a> | ||
3503 | --> | ||
3504 | <!-- https://futuresimple.github.com/images/github_logo.png --> | ||
3505 | <!-- <a href="https://github.com/miniupnp/miniupnp"><img src="https://assets-cdn.github.com/images/modules/logos_page/GitHub-Logo.png" alt="github.com" height="31" /></a> --> | ||
3506 | <a href="https://github.com/miniupnp/miniupnp"><img style="position: absolute; top: 0; left: 0; border: 0;" src="https://github.blog/wp-content/uploads/2008/12/forkme_left_green_007200.png" alt="Fork me on GitHub" /></a> | ||
3507 | </p> | ||
3508 | |||
3509 | <script type="text/javascript"> | ||
3510 | var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); | ||
3511 | document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); | ||
3512 | </script> | ||
3513 | <script type="text/javascript"> | ||
3514 | try { | ||
3515 | var ua = 'UA-10295521'; | ||
3516 | if(window.location.hostname == 'miniupnp.free.fr') | ||
3517 | ua += '-1'; | ||
3518 | else if(window.location.hostname == 'miniupnp.tuxfamily.org') | ||
3519 | ua += '-2'; | ||
3520 | else ua = ''; | ||
3521 | if(ua != '') { | ||
3522 | var pageTracker = _gat._getTracker(ua); | ||
3523 | pageTracker._trackPageview(); | ||
3524 | } | ||
3525 | } catch(err) {}</script> | ||
3526 | </body> | ||
3527 | </html> | ||
3528 | |||
diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py index ed7a39a723..077472b8b3 100644 --- a/bitbake/lib/bb/tests/fetch.py +++ b/bitbake/lib/bb/tests/fetch.py | |||
@@ -7,7 +7,10 @@ | |||
7 | # | 7 | # |
8 | 8 | ||
9 | import contextlib | 9 | import contextlib |
10 | import shutil | ||
10 | import unittest | 11 | import unittest |
12 | import unittest.mock | ||
13 | import urllib.parse | ||
11 | import hashlib | 14 | import hashlib |
12 | import tempfile | 15 | import tempfile |
13 | import collections | 16 | import collections |
@@ -17,6 +20,7 @@ import tarfile | |||
17 | from bb.fetch2 import URI | 20 | from bb.fetch2 import URI |
18 | from bb.fetch2 import FetchMethod | 21 | from bb.fetch2 import FetchMethod |
19 | import bb | 22 | import bb |
23 | import bb.utils | ||
20 | from bb.tests.support.httpserver import HTTPService | 24 | from bb.tests.support.httpserver import HTTPService |
21 | 25 | ||
22 | def skipIfNoNetwork(): | 26 | def skipIfNoNetwork(): |
@@ -24,6 +28,18 @@ def skipIfNoNetwork(): | |||
24 | return unittest.skip("network test") | 28 | return unittest.skip("network test") |
25 | return lambda f: f | 29 | return lambda f: f |
26 | 30 | ||
31 | |||
32 | @contextlib.contextmanager | ||
33 | def hide_directory(directory): | ||
34 | """Hide the given directory and restore it after the context is left""" | ||
35 | temp_name = directory + ".bak" | ||
36 | os.rename(directory, temp_name) | ||
37 | try: | ||
38 | yield | ||
39 | finally: | ||
40 | os.rename(temp_name, directory) | ||
41 | |||
42 | |||
27 | class TestTimeout(Exception): | 43 | class TestTimeout(Exception): |
28 | # Indicate to pytest that this is not a test suite | 44 | # Indicate to pytest that this is not a test suite |
29 | __test__ = False | 45 | __test__ = False |
@@ -323,6 +339,21 @@ class URITest(unittest.TestCase): | |||
323 | 'params': {"downloadfilename" : "EGPL-T101.zip"}, | 339 | 'params': {"downloadfilename" : "EGPL-T101.zip"}, |
324 | 'query': {"9BE0BF6657": None}, | 340 | 'query': {"9BE0BF6657": None}, |
325 | 'relative': False | 341 | 'relative': False |
342 | }, | ||
343 | "file://example@.service": { | ||
344 | 'uri': 'file:example%40.service', | ||
345 | 'scheme': 'file', | ||
346 | 'hostname': '', | ||
347 | 'port': None, | ||
348 | 'hostport': '', | ||
349 | 'path': 'example@.service', | ||
350 | 'userinfo': '', | ||
351 | 'userinfo': '', | ||
352 | 'username': '', | ||
353 | 'password': '', | ||
354 | 'params': {}, | ||
355 | 'query': {}, | ||
356 | 'relative': True | ||
326 | } | 357 | } |
327 | 358 | ||
328 | } | 359 | } |
@@ -459,16 +490,16 @@ class FetcherTest(unittest.TestCase): | |||
459 | class MirrorUriTest(FetcherTest): | 490 | class MirrorUriTest(FetcherTest): |
460 | 491 | ||
461 | replaceuris = { | 492 | replaceuris = { |
462 | ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "http://somewhere.org/somedir/") | 493 | ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master", "git://.*/.*", "http://somewhere.org/somedir/") |
463 | : "http://somewhere.org/somedir/git2_git.invalid.infradead.org.mtd-utils.git.tar.gz", | 494 | : "http://somewhere.org/somedir/git2_git.invalid.infradead.org.mtd-utils.git.tar.gz", |
464 | ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http") | 495 | ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http") |
465 | : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http", | 496 | : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master;protocol=http", |
466 | ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http") | 497 | ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http") |
467 | : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http", | 498 | : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master;protocol=http", |
468 | ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/\\2;protocol=http") | 499 | ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/\\2;protocol=http") |
469 | : "git://somewhere.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http", | 500 | : "git://somewhere.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master;protocol=http", |
470 | ("git://someserver.org/bitbake;tag=1234567890123456789012345678901234567890", "git://someserver.org/bitbake", "git://git.openembedded.org/bitbake") | 501 | ("git://someserver.org/bitbake;tag=1234567890123456789012345678901234567890;branch=master", "git://someserver.org/bitbake", "git://git.openembedded.org/bitbake") |
471 | : "git://git.openembedded.org/bitbake;tag=1234567890123456789012345678901234567890", | 502 | : "git://git.openembedded.org/bitbake;tag=1234567890123456789012345678901234567890;branch=master", |
472 | ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache") | 503 | ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache") |
473 | : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz", | 504 | : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz", |
474 | ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache/") | 505 | ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache/") |
@@ -481,12 +512,12 @@ class MirrorUriTest(FetcherTest): | |||
481 | : "http://archive.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", | 512 | : "http://archive.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", |
482 | ("http://www.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", "http://.*/.*", "file:///somepath/downloads/") | 513 | ("http://www.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", "http://.*/.*", "file:///somepath/downloads/") |
483 | : "file:///somepath/downloads/subversion-1.7.1.tar.bz2", | 514 | : "file:///somepath/downloads/subversion-1.7.1.tar.bz2", |
484 | ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http") | 515 | ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http") |
485 | : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http", | 516 | : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master;protocol=http", |
486 | ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http") | 517 | ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http") |
487 | : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http", | 518 | : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master;protocol=http", |
488 | ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/MIRRORNAME;protocol=http") | 519 | ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master", "git://.*/.*", "git://somewhere.org/somedir/MIRRORNAME;protocol=http") |
489 | : "git://somewhere.org/somedir/git.invalid.infradead.org.foo.mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http", | 520 | : "git://somewhere.org/somedir/git.invalid.infradead.org.foo.mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master;protocol=http", |
490 | ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org") | 521 | ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org") |
491 | : "http://somewhere2.org/somefile_1.2.3.tar.gz", | 522 | : "http://somewhere2.org/somefile_1.2.3.tar.gz", |
492 | ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org/") | 523 | ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org/") |
@@ -502,6 +533,10 @@ class MirrorUriTest(FetcherTest): | |||
502 | : "file:///mirror/example/1.0.0/some-example-1.0.0.tgz;downloadfilename=some-example-1.0.0.tgz", | 533 | : "file:///mirror/example/1.0.0/some-example-1.0.0.tgz;downloadfilename=some-example-1.0.0.tgz", |
503 | ("https://somewhere.org/example-1.0.0.tgz;downloadfilename=some-example-1.0.0.tgz", "https://.*/.*", "file:///mirror/some-example-1.0.0.tgz") | 534 | ("https://somewhere.org/example-1.0.0.tgz;downloadfilename=some-example-1.0.0.tgz", "https://.*/.*", "file:///mirror/some-example-1.0.0.tgz") |
504 | : "file:///mirror/some-example-1.0.0.tgz;downloadfilename=some-example-1.0.0.tgz", | 535 | : "file:///mirror/some-example-1.0.0.tgz;downloadfilename=some-example-1.0.0.tgz", |
536 | ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master", r"git://(?!internal\.git\.server).*/.*", "http://somewhere.org/somedir/") | ||
537 | : "http://somewhere.org/somedir/git2_git.invalid.infradead.org.mtd-utils.git.tar.gz", | ||
538 | ("git://internal.git.server.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;branch=master", r"git://(?!internal\.git\.server).*/.*", "http://somewhere.org/somedir/") | ||
539 | : None, | ||
505 | 540 | ||
506 | #Renaming files doesn't work | 541 | #Renaming files doesn't work |
507 | #("http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz") : "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz" | 542 | #("http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz") : "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz" |
@@ -510,8 +545,7 @@ class MirrorUriTest(FetcherTest): | |||
510 | 545 | ||
511 | mirrorvar = "http://.*/.* file:///somepath/downloads/ " \ | 546 | mirrorvar = "http://.*/.* file:///somepath/downloads/ " \ |
512 | "git://someserver.org/bitbake git://git.openembedded.org/bitbake " \ | 547 | "git://someserver.org/bitbake git://git.openembedded.org/bitbake " \ |
513 | "https://.*/.* file:///someotherpath/downloads/ " \ | 548 | "https?://.*/.* file:///someotherpath/downloads/ " \ |
514 | "http://.*/.* file:///someotherpath/downloads/ " \ | ||
515 | "svn://svn.server1.com/ svn://svn.server2.com/" | 549 | "svn://svn.server1.com/ svn://svn.server2.com/" |
516 | 550 | ||
517 | def test_urireplace(self): | 551 | def test_urireplace(self): |
@@ -521,7 +555,7 @@ class MirrorUriTest(FetcherTest): | |||
521 | ud.setup_localpath(self.d) | 555 | ud.setup_localpath(self.d) |
522 | mirrors = bb.fetch2.mirror_from_string("%s %s" % (k[1], k[2])) | 556 | mirrors = bb.fetch2.mirror_from_string("%s %s" % (k[1], k[2])) |
523 | newuris, uds = bb.fetch2.build_mirroruris(ud, mirrors, self.d) | 557 | newuris, uds = bb.fetch2.build_mirroruris(ud, mirrors, self.d) |
524 | self.assertEqual([v], newuris) | 558 | self.assertEqual([v] if v else [], newuris) |
525 | 559 | ||
526 | def test_urilist1(self): | 560 | def test_urilist1(self): |
527 | fetcher = bb.fetch.FetchData("http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d) | 561 | fetcher = bb.fetch.FetchData("http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d) |
@@ -555,16 +589,16 @@ class MirrorUriTest(FetcherTest): | |||
555 | 'http://otherdownloads.yoctoproject.org/downloads/bitbake-1.0.tar.gz', | 589 | 'http://otherdownloads.yoctoproject.org/downloads/bitbake-1.0.tar.gz', |
556 | 'http://downloads2.yoctoproject.org/downloads/bitbake-1.0.tar.gz']) | 590 | 'http://downloads2.yoctoproject.org/downloads/bitbake-1.0.tar.gz']) |
557 | 591 | ||
558 | recmirrorvar = "https://.*/[^/]* http://AAAA/A/A/A/ " \ | 592 | recmirrorvar = "https://.*/[^/]* http://aaaa/A/A/A/ " \ |
559 | "https://.*/[^/]* https://BBBB/B/B/B/" | 593 | "https://.*/[^/]* https://bbbb/B/B/B/" |
560 | 594 | ||
561 | def test_recursive(self): | 595 | def test_recursive(self): |
562 | fetcher = bb.fetch.FetchData("https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d) | 596 | fetcher = bb.fetch.FetchData("https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d) |
563 | mirrors = bb.fetch2.mirror_from_string(self.recmirrorvar) | 597 | mirrors = bb.fetch2.mirror_from_string(self.recmirrorvar) |
564 | uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d) | 598 | uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d) |
565 | self.assertEqual(uris, ['http://AAAA/A/A/A/bitbake/bitbake-1.0.tar.gz', | 599 | self.assertEqual(uris, ['http://aaaa/A/A/A/bitbake/bitbake-1.0.tar.gz', |
566 | 'https://BBBB/B/B/B/bitbake/bitbake-1.0.tar.gz', | 600 | 'https://bbbb/B/B/B/bitbake/bitbake-1.0.tar.gz', |
567 | 'http://AAAA/A/A/A/B/B/bitbake/bitbake-1.0.tar.gz']) | 601 | 'http://aaaa/A/A/A/B/B/bitbake/bitbake-1.0.tar.gz']) |
568 | 602 | ||
569 | 603 | ||
570 | class GitDownloadDirectoryNamingTest(FetcherTest): | 604 | class GitDownloadDirectoryNamingTest(FetcherTest): |
@@ -687,7 +721,7 @@ class GitShallowTarballNamingTest(FetcherTest): | |||
687 | class CleanTarballTest(FetcherTest): | 721 | class CleanTarballTest(FetcherTest): |
688 | def setUp(self): | 722 | def setUp(self): |
689 | super(CleanTarballTest, self).setUp() | 723 | super(CleanTarballTest, self).setUp() |
690 | self.recipe_url = "git://git.openembedded.org/bitbake;protocol=https" | 724 | self.recipe_url = "git://git.openembedded.org/bitbake;protocol=https;branch=master" |
691 | self.recipe_tarball = "git2_git.openembedded.org.bitbake.tar.gz" | 725 | self.recipe_tarball = "git2_git.openembedded.org.bitbake.tar.gz" |
692 | 726 | ||
693 | self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '1') | 727 | self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '1') |
@@ -728,6 +762,7 @@ class FetcherLocalTest(FetcherTest): | |||
728 | os.makedirs(self.localsrcdir) | 762 | os.makedirs(self.localsrcdir) |
729 | touch(os.path.join(self.localsrcdir, 'a')) | 763 | touch(os.path.join(self.localsrcdir, 'a')) |
730 | touch(os.path.join(self.localsrcdir, 'b')) | 764 | touch(os.path.join(self.localsrcdir, 'b')) |
765 | touch(os.path.join(self.localsrcdir, 'c@d')) | ||
731 | os.makedirs(os.path.join(self.localsrcdir, 'dir')) | 766 | os.makedirs(os.path.join(self.localsrcdir, 'dir')) |
732 | touch(os.path.join(self.localsrcdir, 'dir', 'c')) | 767 | touch(os.path.join(self.localsrcdir, 'dir', 'c')) |
733 | touch(os.path.join(self.localsrcdir, 'dir', 'd')) | 768 | touch(os.path.join(self.localsrcdir, 'dir', 'd')) |
@@ -759,6 +794,10 @@ class FetcherLocalTest(FetcherTest): | |||
759 | tree = self.fetchUnpack(['file://a', 'file://dir/c']) | 794 | tree = self.fetchUnpack(['file://a', 'file://dir/c']) |
760 | self.assertEqual(tree, ['a', 'dir/c']) | 795 | self.assertEqual(tree, ['a', 'dir/c']) |
761 | 796 | ||
797 | def test_local_at(self): | ||
798 | tree = self.fetchUnpack(['file://c@d']) | ||
799 | self.assertEqual(tree, ['c@d']) | ||
800 | |||
762 | def test_local_backslash(self): | 801 | def test_local_backslash(self): |
763 | tree = self.fetchUnpack([r'file://backslash\x2dsystemd-unit.device']) | 802 | tree = self.fetchUnpack([r'file://backslash\x2dsystemd-unit.device']) |
764 | self.assertEqual(tree, [r'backslash\x2dsystemd-unit.device']) | 803 | self.assertEqual(tree, [r'backslash\x2dsystemd-unit.device']) |
@@ -1064,12 +1103,6 @@ class FetcherNetworkTest(FetcherTest): | |||
1064 | self.assertRaises(bb.fetch.FetchError, self.gitfetcher, url1, url2) | 1103 | self.assertRaises(bb.fetch.FetchError, self.gitfetcher, url1, url2) |
1065 | 1104 | ||
1066 | @skipIfNoNetwork() | 1105 | @skipIfNoNetwork() |
1067 | def test_gitfetch_tagandrev(self): | ||
1068 | # SRCREV is set but does not match rev= parameter | ||
1069 | url1 = url2 = "git://git.openembedded.org/bitbake;rev=270a05b0b4ba0959fe0624d2a4885d7b70426da5;tag=270a05b0b4ba0959fe0624d2a4885d7b70426da5;protocol=https" | ||
1070 | self.assertRaises(bb.fetch.FetchError, self.gitfetcher, url1, url2) | ||
1071 | |||
1072 | @skipIfNoNetwork() | ||
1073 | def test_gitfetch_usehead(self): | 1106 | def test_gitfetch_usehead(self): |
1074 | # Since self.gitfetcher() sets SRCREV we expect this to override | 1107 | # Since self.gitfetcher() sets SRCREV we expect this to override |
1075 | # `usehead=1' and instead fetch the specified SRCREV. See | 1108 | # `usehead=1' and instead fetch the specified SRCREV. See |
@@ -1103,7 +1136,7 @@ class FetcherNetworkTest(FetcherTest): | |||
1103 | @skipIfNoNetwork() | 1136 | @skipIfNoNetwork() |
1104 | def test_gitfetch_finds_local_repository_when_premirror_rewrites_the_recipe_url(self): | 1137 | def test_gitfetch_finds_local_repository_when_premirror_rewrites_the_recipe_url(self): |
1105 | realurl = "https://git.openembedded.org/bitbake" | 1138 | realurl = "https://git.openembedded.org/bitbake" |
1106 | recipeurl = "git://someserver.org/bitbake;protocol=https" | 1139 | recipeurl = "git://someserver.org/bitbake;protocol=https;branch=master" |
1107 | self.sourcedir = self.unpackdir.replace("unpacked", "sourcemirror.git") | 1140 | self.sourcedir = self.unpackdir.replace("unpacked", "sourcemirror.git") |
1108 | os.chdir(self.tempdir) | 1141 | os.chdir(self.tempdir) |
1109 | self.git(['clone', realurl, self.sourcedir], cwd=self.tempdir) | 1142 | self.git(['clone', realurl, self.sourcedir], cwd=self.tempdir) |
@@ -1258,7 +1291,6 @@ class FetcherNetworkTest(FetcherTest): | |||
1258 | 1291 | ||
1259 | class SVNTest(FetcherTest): | 1292 | class SVNTest(FetcherTest): |
1260 | def skipIfNoSvn(): | 1293 | def skipIfNoSvn(): |
1261 | import shutil | ||
1262 | if not shutil.which("svn"): | 1294 | if not shutil.which("svn"): |
1263 | return unittest.skip("svn not installed, tests being skipped") | 1295 | return unittest.skip("svn not installed, tests being skipped") |
1264 | 1296 | ||
@@ -1381,15 +1413,17 @@ class TrustedNetworksTest(FetcherTest): | |||
1381 | self.assertFalse(bb.fetch.trusted_network(self.d, url)) | 1413 | self.assertFalse(bb.fetch.trusted_network(self.d, url)) |
1382 | 1414 | ||
1383 | class URLHandle(unittest.TestCase): | 1415 | class URLHandle(unittest.TestCase): |
1384 | 1416 | # Quote password as per RFC3986 | |
1417 | password = urllib.parse.quote(r"!#$%^&*()-_={}[]\|:?,.<>~`", r"!$&'/()*+,;=") | ||
1385 | datatable = { | 1418 | datatable = { |
1386 | "http://www.google.com/index.html" : ('http', 'www.google.com', '/index.html', '', '', {}), | 1419 | "http://www.google.com/index.html" : ('http', 'www.google.com', '/index.html', '', '', {}), |
1387 | "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : ('cvs', 'cvs.handhelds.org', '/cvs', 'anoncvs', '', {'module': 'familiar/dist/ipkg'}), | 1420 | "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : ('cvs', 'cvs.handhelds.org', '/cvs', 'anoncvs', '', {'module': 'familiar/dist/ipkg'}), |
1388 | "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg" : ('cvs', 'cvs.handhelds.org', '/cvs', 'anoncvs', 'anonymous', collections.OrderedDict([('tag', 'V0-99-81'), ('module', 'familiar/dist/ipkg')])), | 1421 | "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg" : ('cvs', 'cvs.handhelds.org', '/cvs', 'anoncvs', 'anonymous', collections.OrderedDict([('tag', 'V0-99-81'), ('module', 'familiar/dist/ipkg')])), |
1389 | "git://git.openembedded.org/bitbake;branch=@foo;protocol=https" : ('git', 'git.openembedded.org', '/bitbake', '', '', {'branch': '@foo', 'protocol' : 'https'}), | 1422 | "git://git.openembedded.org/bitbake;branch=@foo;protocol=https" : ('git', 'git.openembedded.org', '/bitbake', '', '', {'branch': '@foo', 'protocol' : 'https'}), |
1390 | "file://somelocation;someparam=1": ('file', '', 'somelocation', '', '', {'someparam': '1'}), | 1423 | "file://somelocation;someparam=1": ('file', '', 'somelocation', '', '', {'someparam': '1'}), |
1424 | "file://example@.service": ('file', '', 'example@.service', '', '', {}), | ||
1391 | "https://somesite.com/somerepo.git;user=anyUser:idtoken=1234" : ('https', 'somesite.com', '/somerepo.git', '', '', {'user': 'anyUser:idtoken=1234'}), | 1425 | "https://somesite.com/somerepo.git;user=anyUser:idtoken=1234" : ('https', 'somesite.com', '/somerepo.git', '', '', {'user': 'anyUser:idtoken=1234'}), |
1392 | r'git://s.o-me_ONE:!#$%^&*()-_={}[]\|:?,.<>~`@git.openembedded.org/bitbake;branch=main;protocol=https': ('git', 'git.openembedded.org', '/bitbake', 's.o-me_ONE', r'!#$%^&*()-_={}[]\|:?,.<>~`', {'branch': 'main', 'protocol' : 'https'}), | 1426 | 'git://s.o-me_ONE:%s@git.openembedded.org/bitbake;branch=main;protocol=https' % password: ('git', 'git.openembedded.org', '/bitbake', 's.o-me_ONE', password, {'branch': 'main', 'protocol' : 'https'}), |
1393 | } | 1427 | } |
1394 | # we require a pathname to encodeurl but users can still pass such urls to | 1428 | # we require a pathname to encodeurl but users can still pass such urls to |
1395 | # decodeurl and we need to handle them | 1429 | # decodeurl and we need to handle them |
@@ -1407,6 +1441,8 @@ class URLHandle(unittest.TestCase): | |||
1407 | def test_encodeurl(self): | 1441 | def test_encodeurl(self): |
1408 | for k, v in self.datatable.items(): | 1442 | for k, v in self.datatable.items(): |
1409 | result = bb.fetch.encodeurl(v) | 1443 | result = bb.fetch.encodeurl(v) |
1444 | if result.startswith("file:"): | ||
1445 | result = urllib.parse.unquote(result) | ||
1410 | self.assertEqual(result, k) | 1446 | self.assertEqual(result, k) |
1411 | 1447 | ||
1412 | class FetchLatestVersionTest(FetcherTest): | 1448 | class FetchLatestVersionTest(FetcherTest): |
@@ -1427,12 +1463,12 @@ class FetchLatestVersionTest(FetcherTest): | |||
1427 | ("dtc", "git://git.yoctoproject.org/bbfetchtests-dtc.git;branch=master;protocol=https", "65cc4d2748a2c2e6f27f1cf39e07a5dbabd80ebf", "", "") | 1463 | ("dtc", "git://git.yoctoproject.org/bbfetchtests-dtc.git;branch=master;protocol=https", "65cc4d2748a2c2e6f27f1cf39e07a5dbabd80ebf", "", "") |
1428 | : "1.4.0", | 1464 | : "1.4.0", |
1429 | # combination version pattern | 1465 | # combination version pattern |
1430 | ("sysprof", "git://gitlab.gnome.org/GNOME/sysprof.git;protocol=https;branch=master", "cd44ee6644c3641507fb53b8a2a69137f2971219", "", "") | 1466 | ("sysprof", "git://git.yoctoproject.org/sysprof.git;protocol=https;branch=master", "cd44ee6644c3641507fb53b8a2a69137f2971219", "", "") |
1431 | : "1.2.0", | 1467 | : "1.2.0", |
1432 | ("u-boot-mkimage", "git://git.denx.de/u-boot.git;branch=master;protocol=git", "62c175fbb8a0f9a926c88294ea9f7e88eb898f6c", "", "") | 1468 | ("u-boot-mkimage", "git://source.denx.de/u-boot/u-boot.git;branch=master;protocol=https", "62c175fbb8a0f9a926c88294ea9f7e88eb898f6c", "", "") |
1433 | : "2014.01", | 1469 | : "2014.01", |
1434 | # version pattern "yyyymmdd" | 1470 | # version pattern "yyyymmdd" |
1435 | ("mobile-broadband-provider-info", "git://gitlab.gnome.org/GNOME/mobile-broadband-provider-info.git;protocol=https;branch=master", "4ed19e11c2975105b71b956440acdb25d46a347d", "", "") | 1471 | ("mobile-broadband-provider-info", "git://git.yoctoproject.org/mobile-broadband-provider-info.git;protocol=https;branch=master", "4ed19e11c2975105b71b956440acdb25d46a347d", "", "") |
1436 | : "20120614", | 1472 | : "20120614", |
1437 | # packages with a valid UPSTREAM_CHECK_GITTAGREGEX | 1473 | # packages with a valid UPSTREAM_CHECK_GITTAGREGEX |
1438 | # mirror of git://anongit.freedesktop.org/xorg/driver/xf86-video-omap since network issues interfered with testing | 1474 | # mirror of git://anongit.freedesktop.org/xorg/driver/xf86-video-omap since network issues interfered with testing |
@@ -1448,57 +1484,64 @@ class FetchLatestVersionTest(FetcherTest): | |||
1448 | : "0.28.0", | 1484 | : "0.28.0", |
1449 | } | 1485 | } |
1450 | 1486 | ||
1487 | WgetTestData = collections.namedtuple("WgetTestData", ["pn", "path", "pv", "check_uri", "check_regex"], defaults=[None, None, None]) | ||
1451 | test_wget_uris = { | 1488 | test_wget_uris = { |
1452 | # | 1489 | # |
1453 | # packages with versions inside directory name | 1490 | # packages with versions inside directory name |
1454 | # | 1491 | # |
1455 | # http://kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2 | 1492 | # http://kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2 |
1456 | ("util-linux", "/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2", "", "") | 1493 | WgetTestData("util-linux", "/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2") |
1457 | : "2.24.2", | 1494 | : "2.24.2", |
1458 | # http://www.abisource.com/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz | 1495 | # http://www.abisource.com/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz |
1459 | ("enchant", "/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz", "", "") | 1496 | WgetTestData("enchant", "/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz") |
1460 | : "1.6.0", | 1497 | : "1.6.0", |
1461 | # http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz | 1498 | # http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz |
1462 | ("cmake", "/files/v2.8/cmake-2.8.12.1.tar.gz", "", "") | 1499 | WgetTestData("cmake", "/files/v2.8/cmake-2.8.12.1.tar.gz") |
1463 | : "2.8.12.1", | 1500 | : "2.8.12.1", |
1464 | # https://download.gnome.org/sources/libxml2/2.9/libxml2-2.9.14.tar.xz | 1501 | # https://download.gnome.org/sources/libxml2/2.9/libxml2-2.9.14.tar.xz |
1465 | ("libxml2", "/software/libxml2/2.9/libxml2-2.9.14.tar.xz", "", "") | 1502 | WgetTestData("libxml2", "/software/libxml2/2.9/libxml2-2.9.14.tar.xz") |
1466 | : "2.10.3", | 1503 | : "2.10.3", |
1467 | # | 1504 | # |
1468 | # packages with versions only in current directory | 1505 | # packages with versions only in current directory |
1469 | # | 1506 | # |
1470 | # https://downloads.yoctoproject.org/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2 | 1507 | # https://downloads.yoctoproject.org/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2 |
1471 | ("eglic", "/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2", "", "") | 1508 | WgetTestData("eglic", "/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2") |
1472 | : "2.19", | 1509 | : "2.19", |
1473 | # https://downloads.yoctoproject.org/releases/gnu-config/gnu-config-20120814.tar.bz2 | 1510 | # https://downloads.yoctoproject.org/releases/gnu-config/gnu-config-20120814.tar.bz2 |
1474 | ("gnu-config", "/releases/gnu-config/gnu-config-20120814.tar.bz2", "", "") | 1511 | WgetTestData("gnu-config", "/releases/gnu-config/gnu-config-20120814.tar.bz2") |
1475 | : "20120814", | 1512 | : "20120814", |
1476 | # | 1513 | # |
1477 | # packages with "99" in the name of possible version | 1514 | # packages with "99" in the name of possible version |
1478 | # | 1515 | # |
1479 | # http://freedesktop.org/software/pulseaudio/releases/pulseaudio-4.0.tar.xz | 1516 | # http://freedesktop.org/software/pulseaudio/releases/pulseaudio-4.0.tar.xz |
1480 | ("pulseaudio", "/software/pulseaudio/releases/pulseaudio-4.0.tar.xz", "", "") | 1517 | WgetTestData("pulseaudio", "/software/pulseaudio/releases/pulseaudio-4.0.tar.xz") |
1481 | : "5.0", | 1518 | : "5.0", |
1482 | # http://xorg.freedesktop.org/releases/individual/xserver/xorg-server-1.15.1.tar.bz2 | 1519 | # http://xorg.freedesktop.org/releases/individual/xserver/xorg-server-1.15.1.tar.bz2 |
1483 | ("xserver-xorg", "/releases/individual/xserver/xorg-server-1.15.1.tar.bz2", "", "") | 1520 | WgetTestData("xserver-xorg", "/releases/individual/xserver/xorg-server-1.15.1.tar.bz2") |
1484 | : "1.15.1", | 1521 | : "1.15.1", |
1485 | # | 1522 | # |
1486 | # packages with valid UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX | 1523 | # packages with valid UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX |
1487 | # | 1524 | # |
1488 | # http://www.cups.org/software/1.7.2/cups-1.7.2-source.tar.bz2 | 1525 | # http://www.cups.org/software/1.7.2/cups-1.7.2-source.tar.bz2 |
1489 | # https://github.com/apple/cups/releases | 1526 | # https://github.com/apple/cups/releases |
1490 | ("cups", "/software/1.7.2/cups-1.7.2-source.tar.bz2", "/apple/cups/releases", r"(?P<name>cups\-)(?P<pver>((\d+[\.\-_]*)+))\-source\.tar\.gz") | 1527 | WgetTestData("cups", "/software/1.7.2/cups-1.7.2-source.tar.bz2", check_uri="/apple/cups/releases", check_regex=r"(?P<name>cups\-)(?P<pver>((\d+[\.\-_]*)+))\-source\.tar\.gz") |
1491 | : "2.0.0", | 1528 | : "2.0.0", |
1492 | # http://download.oracle.com/berkeley-db/db-5.3.21.tar.gz | 1529 | # http://download.oracle.com/berkeley-db/db-5.3.21.tar.gz |
1493 | # http://ftp.debian.org/debian/pool/main/d/db5.3/ | 1530 | # http://ftp.debian.org/debian/pool/main/d/db5.3/ |
1494 | ("db", "/berkeley-db/db-5.3.21.tar.gz", "/debian/pool/main/d/db5.3/", r"(?P<name>db5\.3_)(?P<pver>\d+(\.\d+)+).+\.orig\.tar\.xz") | 1531 | WgetTestData("db", "/berkeley-db/db-5.3.21.tar.gz", check_uri="/debian/pool/main/d/db5.3/", check_regex=r"(?P<name>db5\.3_)(?P<pver>\d+(\.\d+)+).+\.orig\.tar\.xz") |
1495 | : "5.3.10", | 1532 | : "5.3.10", |
1496 | # | 1533 | # |
1497 | # packages where the tarball compression changed in the new version | 1534 | # packages where the tarball compression changed in the new version |
1498 | # | 1535 | # |
1499 | # http://ftp.debian.org/debian/pool/main/m/minicom/minicom_2.7.1.orig.tar.gz | 1536 | # http://ftp.debian.org/debian/pool/main/m/minicom/minicom_2.7.1.orig.tar.gz |
1500 | ("minicom", "/debian/pool/main/m/minicom/minicom_2.7.1.orig.tar.gz", "", "") | 1537 | WgetTestData("minicom", "/debian/pool/main/m/minicom/minicom_2.7.1.orig.tar.gz") |
1501 | : "2.8", | 1538 | : "2.8", |
1539 | |||
1540 | # | ||
1541 | # packages where the path doesn't actually contain the filename, so downloadfilename should be respected | ||
1542 | # | ||
1543 | WgetTestData("miniupnpd", "/software/miniupnp/download.php?file=miniupnpd_2.1.20191006.tar.gz;downloadfilename=miniupnpd_2.1.20191006.tar.gz", pv="2.1.20191006", check_uri="/software/miniupnp/download.php", check_regex=r"miniupnpd-(?P<pver>\d+(\.\d+)+)\.tar") | ||
1544 | : "2.3.7", | ||
1502 | } | 1545 | } |
1503 | 1546 | ||
1504 | test_crate_uris = { | 1547 | test_crate_uris = { |
@@ -1510,52 +1553,57 @@ class FetchLatestVersionTest(FetcherTest): | |||
1510 | @skipIfNoNetwork() | 1553 | @skipIfNoNetwork() |
1511 | def test_git_latest_versionstring(self): | 1554 | def test_git_latest_versionstring(self): |
1512 | for k, v in self.test_git_uris.items(): | 1555 | for k, v in self.test_git_uris.items(): |
1513 | self.d.setVar("PN", k[0]) | 1556 | with self.subTest(pn=k[0]): |
1514 | self.d.setVar("SRCREV", k[2]) | 1557 | self.d.setVar("PN", k[0]) |
1515 | self.d.setVar("UPSTREAM_CHECK_GITTAGREGEX", k[3]) | 1558 | self.d.setVar("SRCREV", k[2]) |
1516 | ud = bb.fetch2.FetchData(k[1], self.d) | 1559 | self.d.setVar("UPSTREAM_CHECK_GITTAGREGEX", k[3]) |
1517 | pupver= ud.method.latest_versionstring(ud, self.d) | 1560 | ud = bb.fetch2.FetchData(k[1], self.d) |
1518 | verstring = pupver[0] | 1561 | pupver= ud.method.latest_versionstring(ud, self.d) |
1519 | self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0]) | 1562 | verstring = pupver[0] |
1520 | r = bb.utils.vercmp_string(v, verstring) | 1563 | self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0]) |
1521 | self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring)) | 1564 | r = bb.utils.vercmp_string(v, verstring) |
1522 | if k[4]: | 1565 | self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring)) |
1523 | r = bb.utils.vercmp_string(verstring, k[4]) | 1566 | if k[4]: |
1524 | self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], verstring, k[4])) | 1567 | r = bb.utils.vercmp_string(verstring, k[4]) |
1568 | self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], verstring, k[4])) | ||
1525 | 1569 | ||
1526 | def test_wget_latest_versionstring(self): | 1570 | def test_wget_latest_versionstring(self): |
1527 | testdata = os.path.dirname(os.path.abspath(__file__)) + "/fetch-testdata" | 1571 | testdata = os.path.dirname(os.path.abspath(__file__)) + "/fetch-testdata" |
1528 | server = HTTPService(testdata) | 1572 | server = HTTPService(testdata, host="127.0.0.1") |
1529 | server.start() | 1573 | server.start() |
1530 | port = server.port | 1574 | port = server.port |
1531 | try: | 1575 | try: |
1532 | for k, v in self.test_wget_uris.items(): | 1576 | for data, v in self.test_wget_uris.items(): |
1533 | self.d.setVar("PN", k[0]) | 1577 | with self.subTest(pn=data.pn): |
1534 | checkuri = "" | 1578 | self.d.setVar("PN", data.pn) |
1535 | if k[2]: | 1579 | self.d.setVar("PV", data.pv) |
1536 | checkuri = "http://localhost:%s/" % port + k[2] | 1580 | if data.check_uri: |
1537 | self.d.setVar("UPSTREAM_CHECK_URI", checkuri) | 1581 | checkuri = "http://127.0.0.1:%s/%s" % (port, data.check_uri) |
1538 | self.d.setVar("UPSTREAM_CHECK_REGEX", k[3]) | 1582 | self.d.setVar("UPSTREAM_CHECK_URI", checkuri) |
1539 | url = "http://localhost:%s/" % port + k[1] | 1583 | if data.check_regex: |
1540 | ud = bb.fetch2.FetchData(url, self.d) | 1584 | self.d.setVar("UPSTREAM_CHECK_REGEX", data.check_regex) |
1541 | pupver = ud.method.latest_versionstring(ud, self.d) | 1585 | |
1542 | verstring = pupver[0] | 1586 | url = "http://127.0.0.1:%s/%s" % (port, data.path) |
1543 | self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0]) | 1587 | ud = bb.fetch2.FetchData(url, self.d) |
1544 | r = bb.utils.vercmp_string(v, verstring) | 1588 | pupver = ud.method.latest_versionstring(ud, self.d) |
1545 | self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring)) | 1589 | verstring = pupver[0] |
1590 | self.assertTrue(verstring, msg="Could not find upstream version for %s" % data.pn) | ||
1591 | r = bb.utils.vercmp_string(v, verstring) | ||
1592 | self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (data.pn, v, verstring)) | ||
1546 | finally: | 1593 | finally: |
1547 | server.stop() | 1594 | server.stop() |
1548 | 1595 | ||
1549 | @skipIfNoNetwork() | 1596 | @skipIfNoNetwork() |
1550 | def test_crate_latest_versionstring(self): | 1597 | def test_crate_latest_versionstring(self): |
1551 | for k, v in self.test_crate_uris.items(): | 1598 | for k, v in self.test_crate_uris.items(): |
1552 | self.d.setVar("PN", k[0]) | 1599 | with self.subTest(pn=k[0]): |
1553 | ud = bb.fetch2.FetchData(k[1], self.d) | 1600 | self.d.setVar("PN", k[0]) |
1554 | pupver = ud.method.latest_versionstring(ud, self.d) | 1601 | ud = bb.fetch2.FetchData(k[1], self.d) |
1555 | verstring = pupver[0] | 1602 | pupver = ud.method.latest_versionstring(ud, self.d) |
1556 | self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0]) | 1603 | verstring = pupver[0] |
1557 | r = bb.utils.vercmp_string(v, verstring) | 1604 | self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0]) |
1558 | self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring)) | 1605 | r = bb.utils.vercmp_string(v, verstring) |
1606 | self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring)) | ||
1559 | 1607 | ||
1560 | class FetchCheckStatusTest(FetcherTest): | 1608 | class FetchCheckStatusTest(FetcherTest): |
1561 | test_wget_uris = ["https://downloads.yoctoproject.org/releases/sato/sato-engine-0.1.tar.gz", | 1609 | test_wget_uris = ["https://downloads.yoctoproject.org/releases/sato/sato-engine-0.1.tar.gz", |
@@ -1739,6 +1787,8 @@ class GitShallowTest(FetcherTest): | |||
1739 | if cwd is None: | 1787 | if cwd is None: |
1740 | cwd = self.gitdir | 1788 | cwd = self.gitdir |
1741 | actual_refs = self.git(['for-each-ref', '--format=%(refname)'], cwd=cwd).splitlines() | 1789 | actual_refs = self.git(['for-each-ref', '--format=%(refname)'], cwd=cwd).splitlines() |
1790 | # Resolve references into the same format as the comparision (needed by git 2.48 onwards) | ||
1791 | actual_refs = self.git(['rev-parse', '--symbolic-full-name'] + actual_refs, cwd=cwd).splitlines() | ||
1742 | full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs, cwd=cwd).splitlines() | 1792 | full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs, cwd=cwd).splitlines() |
1743 | self.assertEqual(sorted(set(full_expected)), sorted(set(actual_refs))) | 1793 | self.assertEqual(sorted(set(full_expected)), sorted(set(actual_refs))) |
1744 | 1794 | ||
@@ -1785,7 +1835,6 @@ class GitShallowTest(FetcherTest): | |||
1785 | def fetch_shallow(self, uri=None, disabled=False, keepclone=False): | 1835 | def fetch_shallow(self, uri=None, disabled=False, keepclone=False): |
1786 | """Fetch a uri, generating a shallow tarball, then unpack using it""" | 1836 | """Fetch a uri, generating a shallow tarball, then unpack using it""" |
1787 | fetcher, ud = self.fetch_and_unpack(uri) | 1837 | fetcher, ud = self.fetch_and_unpack(uri) |
1788 | assert os.path.exists(ud.clonedir), 'Git clone in DLDIR (%s) does not exist for uri %s' % (ud.clonedir, uri) | ||
1789 | 1838 | ||
1790 | # Confirm that the unpacked repo is unshallow | 1839 | # Confirm that the unpacked repo is unshallow |
1791 | if not disabled: | 1840 | if not disabled: |
@@ -1793,9 +1842,10 @@ class GitShallowTest(FetcherTest): | |||
1793 | 1842 | ||
1794 | # fetch and unpack, from the shallow tarball | 1843 | # fetch and unpack, from the shallow tarball |
1795 | bb.utils.remove(self.gitdir, recurse=True) | 1844 | bb.utils.remove(self.gitdir, recurse=True) |
1796 | bb.process.run('chmod u+w -R "%s"' % ud.clonedir) | 1845 | if os.path.exists(ud.clonedir): |
1797 | bb.utils.remove(ud.clonedir, recurse=True) | 1846 | bb.process.run('chmod u+w -R "%s"' % ud.clonedir) |
1798 | bb.utils.remove(ud.clonedir.replace('gitsource', 'gitsubmodule'), recurse=True) | 1847 | bb.utils.remove(ud.clonedir, recurse=True) |
1848 | bb.utils.remove(ud.clonedir.replace('gitsource', 'gitsubmodule'), recurse=True) | ||
1799 | 1849 | ||
1800 | # confirm that the unpacked repo is used when no git clone or git | 1850 | # confirm that the unpacked repo is used when no git clone or git |
1801 | # mirror tarball is available | 1851 | # mirror tarball is available |
@@ -1878,7 +1928,12 @@ class GitShallowTest(FetcherTest): | |||
1878 | self.add_empty_file('c') | 1928 | self.add_empty_file('c') |
1879 | self.assertRevCount(3, cwd=self.srcdir) | 1929 | self.assertRevCount(3, cwd=self.srcdir) |
1880 | 1930 | ||
1931 | # Clone without tarball | ||
1932 | self.d.setVar('BB_GIT_SHALLOW', '0') | ||
1933 | fetcher, ud = self.fetch() | ||
1934 | |||
1881 | # Clone and generate mirror tarball | 1935 | # Clone and generate mirror tarball |
1936 | self.d.setVar('BB_GIT_SHALLOW', '1') | ||
1882 | fetcher, ud = self.fetch() | 1937 | fetcher, ud = self.fetch() |
1883 | 1938 | ||
1884 | # Ensure we have a current mirror tarball, but an out of date clone | 1939 | # Ensure we have a current mirror tarball, but an out of date clone |
@@ -1890,6 +1945,7 @@ class GitShallowTest(FetcherTest): | |||
1890 | fetcher, ud = self.fetch() | 1945 | fetcher, ud = self.fetch() |
1891 | fetcher.unpack(self.d.getVar('WORKDIR')) | 1946 | fetcher.unpack(self.d.getVar('WORKDIR')) |
1892 | self.assertRevCount(1) | 1947 | self.assertRevCount(1) |
1948 | assert os.path.exists(os.path.join(self.d.getVar('WORKDIR'), 'git', 'c')) | ||
1893 | 1949 | ||
1894 | def test_shallow_single_branch_no_merge(self): | 1950 | def test_shallow_single_branch_no_merge(self): |
1895 | self.add_empty_file('a') | 1951 | self.add_empty_file('a') |
@@ -1987,7 +2043,7 @@ class GitShallowTest(FetcherTest): | |||
1987 | self.git('submodule update', cwd=self.srcdir) | 2043 | self.git('submodule update', cwd=self.srcdir) |
1988 | self.git('commit -m submodule -a', cwd=self.srcdir) | 2044 | self.git('commit -m submodule -a', cwd=self.srcdir) |
1989 | 2045 | ||
1990 | uri = 'gitsm://%s;protocol=file;subdir=${S}' % self.srcdir | 2046 | uri = 'gitsm://%s;protocol=file;subdir=${S};branch=master' % self.srcdir |
1991 | 2047 | ||
1992 | # Fetch once to generate the shallow tarball | 2048 | # Fetch once to generate the shallow tarball |
1993 | fetcher, ud = self.fetch(uri) | 2049 | fetcher, ud = self.fetch(uri) |
@@ -2028,70 +2084,17 @@ class GitShallowTest(FetcherTest): | |||
2028 | assert './.git/annex/' in bb.process.run('tar -tzf %s' % os.path.join(self.dldir, ud.mirrortarballs[0]))[0] | 2084 | assert './.git/annex/' in bb.process.run('tar -tzf %s' % os.path.join(self.dldir, ud.mirrortarballs[0]))[0] |
2029 | assert os.path.exists(os.path.join(self.gitdir, 'c')) | 2085 | assert os.path.exists(os.path.join(self.gitdir, 'c')) |
2030 | 2086 | ||
2031 | def test_shallow_multi_one_uri(self): | ||
2032 | # Create initial git repo | ||
2033 | self.add_empty_file('a') | ||
2034 | self.add_empty_file('b') | ||
2035 | self.git('checkout -b a_branch', cwd=self.srcdir) | ||
2036 | self.add_empty_file('c') | ||
2037 | self.add_empty_file('d') | ||
2038 | self.git('checkout master', cwd=self.srcdir) | ||
2039 | self.git('tag v0.0 a_branch', cwd=self.srcdir) | ||
2040 | self.add_empty_file('e') | ||
2041 | self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir) | ||
2042 | self.add_empty_file('f') | ||
2043 | self.assertRevCount(7, cwd=self.srcdir) | ||
2044 | |||
2045 | uri = self.d.getVar('SRC_URI').split()[0] | ||
2046 | uri = '%s;branch=master,a_branch;name=master,a_branch' % uri | ||
2047 | |||
2048 | self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0') | ||
2049 | self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0') | ||
2050 | self.d.setVar('SRCREV_master', '${AUTOREV}') | ||
2051 | self.d.setVar('SRCREV_a_branch', '${AUTOREV}') | ||
2052 | |||
2053 | self.fetch_shallow(uri) | ||
2054 | |||
2055 | self.assertRevCount(5) | ||
2056 | self.assertRefs(['master', 'origin/master', 'origin/a_branch']) | ||
2057 | |||
2058 | def test_shallow_multi_one_uri_depths(self): | ||
2059 | # Create initial git repo | ||
2060 | self.add_empty_file('a') | ||
2061 | self.add_empty_file('b') | ||
2062 | self.git('checkout -b a_branch', cwd=self.srcdir) | ||
2063 | self.add_empty_file('c') | ||
2064 | self.add_empty_file('d') | ||
2065 | self.git('checkout master', cwd=self.srcdir) | ||
2066 | self.add_empty_file('e') | ||
2067 | self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir) | ||
2068 | self.add_empty_file('f') | ||
2069 | self.assertRevCount(7, cwd=self.srcdir) | ||
2070 | |||
2071 | uri = self.d.getVar('SRC_URI').split()[0] | ||
2072 | uri = '%s;branch=master,a_branch;name=master,a_branch' % uri | ||
2073 | |||
2074 | self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0') | ||
2075 | self.d.setVar('BB_GIT_SHALLOW_DEPTH_master', '3') | ||
2076 | self.d.setVar('BB_GIT_SHALLOW_DEPTH_a_branch', '1') | ||
2077 | self.d.setVar('SRCREV_master', '${AUTOREV}') | ||
2078 | self.d.setVar('SRCREV_a_branch', '${AUTOREV}') | ||
2079 | |||
2080 | self.fetch_shallow(uri) | ||
2081 | |||
2082 | self.assertRevCount(4, ['--all']) | ||
2083 | self.assertRefs(['master', 'origin/master', 'origin/a_branch']) | ||
2084 | |||
2085 | def test_shallow_clone_preferred_over_shallow(self): | 2087 | def test_shallow_clone_preferred_over_shallow(self): |
2086 | self.add_empty_file('a') | 2088 | self.add_empty_file('a') |
2087 | self.add_empty_file('b') | 2089 | self.add_empty_file('b') |
2088 | 2090 | ||
2089 | # Fetch once to generate the shallow tarball | 2091 | # Fetch once to generate the shallow tarball |
2092 | self.d.setVar('BB_GIT_SHALLOW', '0') | ||
2090 | fetcher, ud = self.fetch() | 2093 | fetcher, ud = self.fetch() |
2091 | assert os.path.exists(os.path.join(self.dldir, ud.mirrortarballs[0])) | ||
2092 | 2094 | ||
2093 | # Fetch and unpack with both the clonedir and shallow tarball available | 2095 | # Fetch and unpack with both the clonedir and shallow tarball available |
2094 | bb.utils.remove(self.gitdir, recurse=True) | 2096 | bb.utils.remove(self.gitdir, recurse=True) |
2097 | self.d.setVar('BB_GIT_SHALLOW', '1') | ||
2095 | fetcher, ud = self.fetch_and_unpack() | 2098 | fetcher, ud = self.fetch_and_unpack() |
2096 | 2099 | ||
2097 | # The unpacked tree should *not* be shallow | 2100 | # The unpacked tree should *not* be shallow |
@@ -2199,7 +2202,7 @@ class GitShallowTest(FetcherTest): | |||
2199 | 2202 | ||
2200 | self.fetch_shallow() | 2203 | self.fetch_shallow() |
2201 | 2204 | ||
2202 | self.assertRevCount(5) | 2205 | self.assertRevCount(2) |
2203 | 2206 | ||
2204 | def test_shallow_invalid_revs(self): | 2207 | def test_shallow_invalid_revs(self): |
2205 | self.add_empty_file('a') | 2208 | self.add_empty_file('a') |
@@ -2218,7 +2221,10 @@ class GitShallowTest(FetcherTest): | |||
2218 | self.git('tag v0.0 master', cwd=self.srcdir) | 2221 | self.git('tag v0.0 master', cwd=self.srcdir) |
2219 | self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0') | 2222 | self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0') |
2220 | self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0') | 2223 | self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0') |
2221 | self.fetch_shallow() | 2224 | |
2225 | with self.assertRaises(bb.fetch2.FetchError), self.assertLogs("BitBake.Fetcher", level="ERROR") as cm: | ||
2226 | self.fetch_shallow() | ||
2227 | self.assertIn("fatal: no commits selected for shallow requests", cm.output[0]) | ||
2222 | 2228 | ||
2223 | def test_shallow_fetch_missing_revs_fails(self): | 2229 | def test_shallow_fetch_missing_revs_fails(self): |
2224 | self.add_empty_file('a') | 2230 | self.add_empty_file('a') |
@@ -2232,6 +2238,33 @@ class GitShallowTest(FetcherTest): | |||
2232 | self.assertIn("Unable to find revision v0.0 even from upstream", cm.output[0]) | 2238 | self.assertIn("Unable to find revision v0.0 even from upstream", cm.output[0]) |
2233 | 2239 | ||
2234 | @skipIfNoNetwork() | 2240 | @skipIfNoNetwork() |
2241 | def test_git_shallow_fetch_premirrors(self): | ||
2242 | url = "git://git.openembedded.org/bitbake;branch=master;protocol=https" | ||
2243 | |||
2244 | # Create a separate premirror directory within tempdir | ||
2245 | premirror = os.path.join(self.tempdir, "premirror") | ||
2246 | os.mkdir(premirror) | ||
2247 | |||
2248 | # Fetch a non-shallow clone into the premirror subdir | ||
2249 | self.d.setVar('BB_GIT_SHALLOW', '0') | ||
2250 | self.d.setVar("DL_DIR", premirror) | ||
2251 | fetcher, ud = self.fetch(url) | ||
2252 | |||
2253 | # Fetch a shallow clone from the premirror subdir with unpacking | ||
2254 | # using the original recipe URL and the premirror mapping | ||
2255 | self.d.setVar('BB_GIT_SHALLOW', '1') | ||
2256 | self.d.setVar("DL_DIR", self.dldir) | ||
2257 | self.d.setVar('BB_FETCH_PREMIRRORONLY', '1') | ||
2258 | self.d.setVar('BB_NO_NETWORK', '1') | ||
2259 | self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '0') | ||
2260 | self.d.setVar("PREMIRRORS", "git://.*/.* git://{0};protocol=file".format(premirror + "/git2/" + ud.host + ud.path.replace("/", "."))) | ||
2261 | fetcher = self.fetch_and_unpack(url) | ||
2262 | |||
2263 | # Verify that the unpacked sources are shallow clones | ||
2264 | self.assertRevCount(1) | ||
2265 | assert os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')) | ||
2266 | |||
2267 | @skipIfNoNetwork() | ||
2235 | def test_bitbake(self): | 2268 | def test_bitbake(self): |
2236 | self.git('remote add --mirror=fetch origin https://github.com/openembedded/bitbake', cwd=self.srcdir) | 2269 | self.git('remote add --mirror=fetch origin https://github.com/openembedded/bitbake', cwd=self.srcdir) |
2237 | self.git('config core.bare true', cwd=self.srcdir) | 2270 | self.git('config core.bare true', cwd=self.srcdir) |
@@ -2249,7 +2282,7 @@ class GitShallowTest(FetcherTest): | |||
2249 | revs = len(self.git('rev-list master').splitlines()) | 2282 | revs = len(self.git('rev-list master').splitlines()) |
2250 | self.assertNotEqual(orig_revs, revs) | 2283 | self.assertNotEqual(orig_revs, revs) |
2251 | self.assertRefs(['master', 'origin/master']) | 2284 | self.assertRefs(['master', 'origin/master']) |
2252 | self.assertRevCount(orig_revs - 1758) | 2285 | self.assertRevCount(orig_revs - 1760) |
2253 | 2286 | ||
2254 | def test_that_unpack_throws_an_error_when_the_git_clone_nor_shallow_tarball_exist(self): | 2287 | def test_that_unpack_throws_an_error_when_the_git_clone_nor_shallow_tarball_exist(self): |
2255 | self.add_empty_file('a') | 2288 | self.add_empty_file('a') |
@@ -2263,23 +2296,33 @@ class GitShallowTest(FetcherTest): | |||
2263 | self.assertIn("No up to date source found", context.exception.msg) | 2296 | self.assertIn("No up to date source found", context.exception.msg) |
2264 | self.assertIn("clone directory not available or not up to date", context.exception.msg) | 2297 | self.assertIn("clone directory not available or not up to date", context.exception.msg) |
2265 | 2298 | ||
2266 | @skipIfNoNetwork() | 2299 | def test_shallow_check_is_shallow(self): |
2267 | def test_that_unpack_does_work_when_using_git_shallow_tarball_but_tarball_is_not_available(self): | 2300 | self.add_empty_file('a') |
2268 | self.d.setVar('SRCREV', 'e5939ff608b95cdd4d0ab0e1935781ab9a276ac0') | 2301 | self.add_empty_file('b') |
2269 | self.d.setVar('BB_GIT_SHALLOW', '1') | ||
2270 | self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1') | ||
2271 | fetcher = bb.fetch.Fetch(["git://git.yoctoproject.org/fstests;branch=master;protocol=https"], self.d) | ||
2272 | fetcher.download() | ||
2273 | 2302 | ||
2274 | bb.utils.remove(self.dldir + "/*.tar.gz") | 2303 | # Fetch and unpack without the clonedir and *only* shallow tarball available |
2275 | fetcher.unpack(self.unpackdir) | 2304 | bb.utils.remove(self.gitdir, recurse=True) |
2305 | fetcher, ud = self.fetch_and_unpack() | ||
2306 | |||
2307 | # The unpacked tree *should* be shallow | ||
2308 | self.assertRevCount(1) | ||
2309 | assert os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')) | ||
2310 | |||
2311 | def test_shallow_succeeds_with_tag_containing_slash(self): | ||
2312 | self.add_empty_file('a') | ||
2313 | self.add_empty_file('b') | ||
2314 | self.git('tag t1/t2/t3', cwd=self.srcdir) | ||
2315 | self.assertRevCount(2, cwd=self.srcdir) | ||
2276 | 2316 | ||
2277 | dir = os.listdir(self.unpackdir + "/git/") | 2317 | srcrev = self.git('rev-parse HEAD', cwd=self.srcdir).strip() |
2278 | self.assertIn("fstests.doap", dir) | 2318 | self.d.setVar('SRCREV', srcrev) |
2319 | uri = self.d.getVar('SRC_URI').split()[0] | ||
2320 | uri = '%s;tag=t1/t2/t3' % uri | ||
2321 | self.fetch_shallow(uri) | ||
2322 | self.assertRevCount(1) | ||
2279 | 2323 | ||
2280 | class GitLfsTest(FetcherTest): | 2324 | class GitLfsTest(FetcherTest): |
2281 | def skipIfNoGitLFS(): | 2325 | def skipIfNoGitLFS(): |
2282 | import shutil | ||
2283 | if not shutil.which('git-lfs'): | 2326 | if not shutil.which('git-lfs'): |
2284 | return unittest.skip('git-lfs not installed') | 2327 | return unittest.skip('git-lfs not installed') |
2285 | return lambda f: f | 2328 | return lambda f: f |
@@ -2303,12 +2346,18 @@ class GitLfsTest(FetcherTest): | |||
2303 | self.git_init(cwd=self.srcdir) | 2346 | self.git_init(cwd=self.srcdir) |
2304 | self.commit_file('.gitattributes', '*.mp3 filter=lfs -text') | 2347 | self.commit_file('.gitattributes', '*.mp3 filter=lfs -text') |
2305 | 2348 | ||
2306 | def commit_file(self, filename, content): | 2349 | def commit(self, *, cwd=None): |
2307 | with open(os.path.join(self.srcdir, filename), "w") as f: | 2350 | cwd = cwd or self.srcdir |
2351 | self.git(["commit", "-m", "Change"], cwd=cwd) | ||
2352 | return self.git(["rev-parse", "HEAD"], cwd=cwd).strip() | ||
2353 | |||
2354 | def commit_file(self, filename, content, *, cwd=None): | ||
2355 | cwd = cwd or self.srcdir | ||
2356 | |||
2357 | with open(os.path.join(cwd, filename), "w") as f: | ||
2308 | f.write(content) | 2358 | f.write(content) |
2309 | self.git(["add", filename], cwd=self.srcdir) | 2359 | self.git(["add", filename], cwd=cwd) |
2310 | self.git(["commit", "-m", "Change"], cwd=self.srcdir) | 2360 | return self.commit(cwd=cwd) |
2311 | return self.git(["rev-parse", "HEAD"], cwd=self.srcdir).strip() | ||
2312 | 2361 | ||
2313 | def fetch(self, uri=None, download=True): | 2362 | def fetch(self, uri=None, download=True): |
2314 | uris = self.d.getVar('SRC_URI').split() | 2363 | uris = self.d.getVar('SRC_URI').split() |
@@ -2329,25 +2378,112 @@ class GitLfsTest(FetcherTest): | |||
2329 | return unpacked_lfs_file | 2378 | return unpacked_lfs_file |
2330 | 2379 | ||
2331 | @skipIfNoGitLFS() | 2380 | @skipIfNoGitLFS() |
2381 | def test_gitsm_lfs(self): | ||
2382 | """Test that the gitsm fetcher caches objects stored via LFS""" | ||
2383 | self.git(["lfs", "install", "--local"], cwd=self.srcdir) | ||
2384 | |||
2385 | def fetch_and_verify(revision, filename, content): | ||
2386 | self.d.setVar('SRCREV', revision) | ||
2387 | fetcher, ud = self.fetch() | ||
2388 | |||
2389 | with hide_directory(submoduledir), hide_directory(self.srcdir): | ||
2390 | workdir = self.d.getVar('WORKDIR') | ||
2391 | fetcher.unpack(workdir) | ||
2392 | |||
2393 | with open(os.path.join(workdir, "git", filename)) as f: | ||
2394 | self.assertEqual(f.read(), content) | ||
2395 | |||
2396 | # Create the git repository that will later be used as a submodule | ||
2397 | submoduledir = self.tempdir + "/submodule" | ||
2398 | bb.utils.mkdirhier(submoduledir) | ||
2399 | self.git_init(submoduledir) | ||
2400 | self.git(["lfs", "install", "--local"], cwd=submoduledir) | ||
2401 | self.commit_file('.gitattributes', '*.mp3 filter=lfs -text', cwd=submoduledir) | ||
2402 | |||
2403 | submodule_commit_1 = self.commit_file("a.mp3", "submodule version 1", cwd=submoduledir) | ||
2404 | _ = self.commit_file("a.mp3", "submodule version 2", cwd=submoduledir) | ||
2405 | |||
2406 | # Add the submodule to the repository at its current HEAD revision | ||
2407 | self.git(["-c", "protocol.file.allow=always", "submodule", "add", submoduledir, "submodule"], | ||
2408 | cwd=self.srcdir) | ||
2409 | base_commit_1 = self.commit() | ||
2410 | |||
2411 | # Let the submodule point at a different revision | ||
2412 | self.git(["checkout", submodule_commit_1], self.srcdir + "/submodule") | ||
2413 | self.git(["add", "submodule"], cwd=self.srcdir) | ||
2414 | base_commit_2 = self.commit() | ||
2415 | |||
2416 | # Add a LFS file to the repository | ||
2417 | base_commit_3 = self.commit_file("a.mp3", "version 1") | ||
2418 | # Update the added LFS file | ||
2419 | base_commit_4 = self.commit_file("a.mp3", "version 2") | ||
2420 | |||
2421 | self.d.setVar('SRC_URI', "gitsm://%s;protocol=file;lfs=1;branch=master" % self.srcdir) | ||
2422 | |||
2423 | # Verify that LFS objects referenced from submodules are fetched and checked out | ||
2424 | fetch_and_verify(base_commit_1, "submodule/a.mp3", "submodule version 2") | ||
2425 | # Verify that the repository inside the download cache of a submodile is extended with any | ||
2426 | # additional LFS objects needed when checking out a different revision. | ||
2427 | fetch_and_verify(base_commit_2, "submodule/a.mp3", "submodule version 1") | ||
2428 | # Verify that LFS objects referenced from the base repository are fetched and checked out | ||
2429 | fetch_and_verify(base_commit_3, "a.mp3", "version 1") | ||
2430 | # Verify that the cached repository is extended with any additional LFS objects required | ||
2431 | # when checking out a different revision. | ||
2432 | fetch_and_verify(base_commit_4, "a.mp3", "version 2") | ||
2433 | |||
2434 | @skipIfNoGitLFS() | ||
2435 | def test_gitsm_lfs_disabled(self): | ||
2436 | """Test that the gitsm fetcher does not use LFS when explicitly disabled""" | ||
2437 | self.git(["lfs", "install", "--local"], cwd=self.srcdir) | ||
2438 | |||
2439 | def fetch_and_verify(revision, filename, content): | ||
2440 | self.d.setVar('SRCREV', revision) | ||
2441 | fetcher, ud = self.fetch() | ||
2442 | |||
2443 | with hide_directory(submoduledir), hide_directory(self.srcdir): | ||
2444 | workdir = self.d.getVar('WORKDIR') | ||
2445 | fetcher.unpack(workdir) | ||
2446 | |||
2447 | with open(os.path.join(workdir, "git", filename)) as f: | ||
2448 | # Assume that LFS did not perform smudging when the expected content is | ||
2449 | # missing. | ||
2450 | self.assertNotEqual(f.read(), content) | ||
2451 | |||
2452 | # Create the git repository that will later be used as a submodule | ||
2453 | submoduledir = self.tempdir + "/submodule" | ||
2454 | bb.utils.mkdirhier(submoduledir) | ||
2455 | self.git_init(submoduledir) | ||
2456 | self.git(["lfs", "install", "--local"], cwd=submoduledir) | ||
2457 | self.commit_file('.gitattributes', '*.mp3 filter=lfs -text', cwd=submoduledir) | ||
2458 | |||
2459 | submodule_commit_1 = self.commit_file("a.mp3", "submodule version 1", cwd=submoduledir) | ||
2460 | |||
2461 | # Add the submodule to the repository at its current HEAD revision | ||
2462 | self.git(["-c", "protocol.file.allow=always", "submodule", "add", submoduledir, "submodule"], | ||
2463 | cwd=self.srcdir) | ||
2464 | base_commit_1 = self.commit() | ||
2465 | |||
2466 | # Add a LFS file to the repository | ||
2467 | base_commit_2 = self.commit_file("a.mp3", "version 1") | ||
2468 | |||
2469 | self.d.setVar('SRC_URI', "gitsm://%s;protocol=file;lfs=1;branch=master;lfs=0" % self.srcdir) | ||
2470 | |||
2471 | # Verify that LFS objects referenced from submodules are not fetched nor checked out | ||
2472 | fetch_and_verify(base_commit_1, "submodule/a.mp3", "submodule version 1") | ||
2473 | # Verify that the LFS objects referenced from the base repository are not fetched nor | ||
2474 | # checked out | ||
2475 | fetch_and_verify(base_commit_2, "a.mp3", "version 1") | ||
2476 | |||
2477 | @skipIfNoGitLFS() | ||
2332 | def test_fetch_lfs_on_srcrev_change(self): | 2478 | def test_fetch_lfs_on_srcrev_change(self): |
2333 | """Test if fetch downloads missing LFS objects when a different revision within an existing repository is requested""" | 2479 | """Test if fetch downloads missing LFS objects when a different revision within an existing repository is requested""" |
2334 | self.git(["lfs", "install", "--local"], cwd=self.srcdir) | 2480 | self.git(["lfs", "install", "--local"], cwd=self.srcdir) |
2335 | 2481 | ||
2336 | @contextlib.contextmanager | ||
2337 | def hide_upstream_repository(): | ||
2338 | """Hide the upstream repository to make sure that git lfs cannot pull from it""" | ||
2339 | temp_name = self.srcdir + ".bak" | ||
2340 | os.rename(self.srcdir, temp_name) | ||
2341 | try: | ||
2342 | yield | ||
2343 | finally: | ||
2344 | os.rename(temp_name, self.srcdir) | ||
2345 | |||
2346 | def fetch_and_verify(revision, filename, content): | 2482 | def fetch_and_verify(revision, filename, content): |
2347 | self.d.setVar('SRCREV', revision) | 2483 | self.d.setVar('SRCREV', revision) |
2348 | fetcher, ud = self.fetch() | 2484 | fetcher, ud = self.fetch() |
2349 | 2485 | ||
2350 | with hide_upstream_repository(): | 2486 | with hide_directory(self.srcdir): |
2351 | workdir = self.d.getVar('WORKDIR') | 2487 | workdir = self.d.getVar('WORKDIR') |
2352 | fetcher.unpack(workdir) | 2488 | fetcher.unpack(workdir) |
2353 | 2489 | ||
@@ -2399,8 +2535,6 @@ class GitLfsTest(FetcherTest): | |||
2399 | 2535 | ||
2400 | @skipIfNoGitLFS() | 2536 | @skipIfNoGitLFS() |
2401 | def test_lfs_enabled(self): | 2537 | def test_lfs_enabled(self): |
2402 | import shutil | ||
2403 | |||
2404 | uri = 'git://%s;protocol=file;lfs=1;branch=master' % self.srcdir | 2538 | uri = 'git://%s;protocol=file;lfs=1;branch=master' % self.srcdir |
2405 | self.d.setVar('SRC_URI', uri) | 2539 | self.d.setVar('SRC_URI', uri) |
2406 | 2540 | ||
@@ -2411,8 +2545,6 @@ class GitLfsTest(FetcherTest): | |||
2411 | 2545 | ||
2412 | @skipIfNoGitLFS() | 2546 | @skipIfNoGitLFS() |
2413 | def test_lfs_disabled(self): | 2547 | def test_lfs_disabled(self): |
2414 | import shutil | ||
2415 | |||
2416 | uri = 'git://%s;protocol=file;lfs=0;branch=master' % self.srcdir | 2548 | uri = 'git://%s;protocol=file;lfs=0;branch=master' % self.srcdir |
2417 | self.d.setVar('SRC_URI', uri) | 2549 | self.d.setVar('SRC_URI', uri) |
2418 | 2550 | ||
@@ -2421,58 +2553,76 @@ class GitLfsTest(FetcherTest): | |||
2421 | fetcher, ud = self.fetch() | 2553 | fetcher, ud = self.fetch() |
2422 | fetcher.unpack(self.d.getVar('WORKDIR')) | 2554 | fetcher.unpack(self.d.getVar('WORKDIR')) |
2423 | 2555 | ||
2424 | def test_lfs_enabled_not_installed(self): | 2556 | @skipIfNoGitLFS() |
2425 | import shutil | 2557 | def test_lfs_enabled_not_installed_during_unpack(self): |
2558 | uri = 'git://%s;protocol=file;lfs=1;branch=master' % self.srcdir | ||
2559 | self.d.setVar('SRC_URI', uri) | ||
2560 | |||
2561 | # Careful: suppress initial attempt at downloading | ||
2562 | fetcher, ud = self.fetch(uri=None, download=False) | ||
2426 | 2563 | ||
2564 | fetcher.download() | ||
2565 | # If git-lfs cannot be found, the unpack should throw an error | ||
2566 | with self.assertRaises(bb.fetch2.FetchError): | ||
2567 | with unittest.mock.patch("shutil.which", return_value=None): | ||
2568 | shutil.rmtree(self.gitdir, ignore_errors=True) | ||
2569 | fetcher.unpack(self.d.getVar('WORKDIR')) | ||
2570 | |||
2571 | def test_lfs_enabled_not_installed(self): | ||
2427 | uri = 'git://%s;protocol=file;lfs=1;branch=master' % self.srcdir | 2572 | uri = 'git://%s;protocol=file;lfs=1;branch=master' % self.srcdir |
2428 | self.d.setVar('SRC_URI', uri) | 2573 | self.d.setVar('SRC_URI', uri) |
2429 | 2574 | ||
2430 | # Careful: suppress initial attempt at downloading | 2575 | # Careful: suppress initial attempt at downloading |
2431 | fetcher, ud = self.fetch(uri=None, download=False) | 2576 | fetcher, ud = self.fetch(uri=None, download=False) |
2432 | 2577 | ||
2433 | # Artificially assert that git-lfs is not installed, so | 2578 | # If git-lfs cannot be found, the download should throw an error |
2434 | # we can verify a failure to unpack in it's absence. | 2579 | with unittest.mock.patch("shutil.which", return_value=None): |
2435 | old_find_git_lfs = ud.method._find_git_lfs | ||
2436 | try: | ||
2437 | # If git-lfs cannot be found, the unpack should throw an error | ||
2438 | with self.assertRaises(bb.fetch2.FetchError): | 2580 | with self.assertRaises(bb.fetch2.FetchError): |
2439 | fetcher.download() | 2581 | fetcher.download() |
2440 | ud.method._find_git_lfs = lambda d: False | ||
2441 | shutil.rmtree(self.gitdir, ignore_errors=True) | ||
2442 | fetcher.unpack(self.d.getVar('WORKDIR')) | ||
2443 | finally: | ||
2444 | ud.method._find_git_lfs = old_find_git_lfs | ||
2445 | 2582 | ||
2446 | def test_lfs_disabled_not_installed(self): | 2583 | def test_lfs_disabled_not_installed(self): |
2447 | import shutil | ||
2448 | |||
2449 | uri = 'git://%s;protocol=file;lfs=0;branch=master' % self.srcdir | 2584 | uri = 'git://%s;protocol=file;lfs=0;branch=master' % self.srcdir |
2450 | self.d.setVar('SRC_URI', uri) | 2585 | self.d.setVar('SRC_URI', uri) |
2451 | 2586 | ||
2452 | # Careful: suppress initial attempt at downloading | 2587 | # Careful: suppress initial attempt at downloading |
2453 | fetcher, ud = self.fetch(uri=None, download=False) | 2588 | fetcher, ud = self.fetch(uri=None, download=False) |
2454 | 2589 | ||
2455 | # Artificially assert that git-lfs is not installed, so | 2590 | # Even if git-lfs cannot be found, the download / unpack should be successful |
2456 | # we can verify a failure to unpack in it's absence. | 2591 | with unittest.mock.patch("shutil.which", return_value=None): |
2457 | old_find_git_lfs = ud.method._find_git_lfs | 2592 | fetcher.download() |
2458 | try: | 2593 | shutil.rmtree(self.gitdir, ignore_errors=True) |
2459 | # Even if git-lfs cannot be found, the unpack should be successful | 2594 | fetcher.unpack(self.d.getVar('WORKDIR')) |
2595 | |||
2596 | def test_lfs_enabled_not_installed_but_not_needed(self): | ||
2597 | srcdir = os.path.join(self.tempdir, "emptygit") | ||
2598 | bb.utils.mkdirhier(srcdir) | ||
2599 | self.git_init(srcdir) | ||
2600 | self.commit_file("test", "test content", cwd=srcdir) | ||
2601 | |||
2602 | uri = 'git://%s;protocol=file;lfs=1;branch=master' % srcdir | ||
2603 | self.d.setVar('SRC_URI', uri) | ||
2604 | |||
2605 | # Careful: suppress initial attempt at downloading | ||
2606 | fetcher, ud = self.fetch(uri=None, download=False) | ||
2607 | |||
2608 | # It shouldnt't matter that git-lfs cannot be found as the repository configuration does not | ||
2609 | # specify any LFS filters. | ||
2610 | with unittest.mock.patch("shutil.which", return_value=None): | ||
2460 | fetcher.download() | 2611 | fetcher.download() |
2461 | ud.method._find_git_lfs = lambda d: False | ||
2462 | shutil.rmtree(self.gitdir, ignore_errors=True) | 2612 | shutil.rmtree(self.gitdir, ignore_errors=True) |
2463 | fetcher.unpack(self.d.getVar('WORKDIR')) | 2613 | fetcher.unpack(self.d.getVar('WORKDIR')) |
2464 | finally: | ||
2465 | ud.method._find_git_lfs = old_find_git_lfs | ||
2466 | 2614 | ||
2467 | class GitURLWithSpacesTest(FetcherTest): | 2615 | class GitURLWithSpacesTest(FetcherTest): |
2468 | test_git_urls = { | 2616 | test_git_urls = { |
2469 | "git://tfs-example.org:22/tfs/example%20path/example.git;branch=master" : { | 2617 | "git://tfs-example.org:22/tfs/example%20path/example.git;branch=master" : { |
2470 | 'url': 'git://tfs-example.org:22/tfs/example%20path/example.git;branch=master', | 2618 | 'url': 'git://tfs-example.org:22/tfs/example%20path/example.git;branch=master', |
2619 | 'repo_url': 'git://tfs-example.org:22/tfs/example%20path/example.git', | ||
2471 | 'gitsrcname': 'tfs-example.org.22.tfs.example_path.example.git', | 2620 | 'gitsrcname': 'tfs-example.org.22.tfs.example_path.example.git', |
2472 | 'path': '/tfs/example path/example.git' | 2621 | 'path': '/tfs/example path/example.git' |
2473 | }, | 2622 | }, |
2474 | "git://tfs-example.org:22/tfs/example%20path/example%20repo.git;branch=master" : { | 2623 | "git://tfs-example.org:22/tfs/example%20path/example%20repo.git;branch=master" : { |
2475 | 'url': 'git://tfs-example.org:22/tfs/example%20path/example%20repo.git;branch=master', | 2624 | 'url': 'git://tfs-example.org:22/tfs/example%20path/example%20repo.git;branch=master', |
2625 | 'repo_url': 'git://tfs-example.org:22/tfs/example%20path/example%20repo.git', | ||
2476 | 'gitsrcname': 'tfs-example.org.22.tfs.example_path.example_repo.git', | 2626 | 'gitsrcname': 'tfs-example.org.22.tfs.example_path.example_repo.git', |
2477 | 'path': '/tfs/example path/example repo.git' | 2627 | 'path': '/tfs/example path/example repo.git' |
2478 | } | 2628 | } |
@@ -2495,6 +2645,7 @@ class GitURLWithSpacesTest(FetcherTest): | |||
2495 | self.assertEqual(ud.lockfile, os.path.join(self.dldir, "git2", ref['gitsrcname'] + '.lock')) | 2645 | self.assertEqual(ud.lockfile, os.path.join(self.dldir, "git2", ref['gitsrcname'] + '.lock')) |
2496 | self.assertEqual(ud.clonedir, os.path.join(self.dldir, "git2", ref['gitsrcname'])) | 2646 | self.assertEqual(ud.clonedir, os.path.join(self.dldir, "git2", ref['gitsrcname'])) |
2497 | self.assertEqual(ud.fullmirror, os.path.join(self.dldir, "git2_" + ref['gitsrcname'] + '.tar.gz')) | 2647 | self.assertEqual(ud.fullmirror, os.path.join(self.dldir, "git2_" + ref['gitsrcname'] + '.tar.gz')) |
2648 | self.assertEqual(ud.method._get_repo_url(ud), ref['repo_url']) | ||
2498 | 2649 | ||
2499 | class CrateTest(FetcherTest): | 2650 | class CrateTest(FetcherTest): |
2500 | @skipIfNoNetwork() | 2651 | @skipIfNoNetwork() |
@@ -2616,7 +2767,6 @@ class CrateTest(FetcherTest): | |||
2616 | 2767 | ||
2617 | class NPMTest(FetcherTest): | 2768 | class NPMTest(FetcherTest): |
2618 | def skipIfNoNpm(): | 2769 | def skipIfNoNpm(): |
2619 | import shutil | ||
2620 | if not shutil.which('npm'): | 2770 | if not shutil.which('npm'): |
2621 | return unittest.skip('npm not installed') | 2771 | return unittest.skip('npm not installed') |
2622 | return lambda f: f | 2772 | return lambda f: f |
@@ -2624,8 +2774,8 @@ class NPMTest(FetcherTest): | |||
2624 | @skipIfNoNpm() | 2774 | @skipIfNoNpm() |
2625 | @skipIfNoNetwork() | 2775 | @skipIfNoNetwork() |
2626 | def test_npm(self): | 2776 | def test_npm(self): |
2627 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2777 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2628 | fetcher = bb.fetch.Fetch([url], self.d) | 2778 | fetcher = bb.fetch.Fetch(urls, self.d) |
2629 | ud = fetcher.ud[fetcher.urls[0]] | 2779 | ud = fetcher.ud[fetcher.urls[0]] |
2630 | fetcher.download() | 2780 | fetcher.download() |
2631 | self.assertTrue(os.path.exists(ud.localpath)) | 2781 | self.assertTrue(os.path.exists(ud.localpath)) |
@@ -2638,9 +2788,9 @@ class NPMTest(FetcherTest): | |||
2638 | @skipIfNoNpm() | 2788 | @skipIfNoNpm() |
2639 | @skipIfNoNetwork() | 2789 | @skipIfNoNetwork() |
2640 | def test_npm_bad_checksum(self): | 2790 | def test_npm_bad_checksum(self): |
2641 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2791 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2642 | # Fetch once to get a tarball | 2792 | # Fetch once to get a tarball |
2643 | fetcher = bb.fetch.Fetch([url], self.d) | 2793 | fetcher = bb.fetch.Fetch(urls, self.d) |
2644 | ud = fetcher.ud[fetcher.urls[0]] | 2794 | ud = fetcher.ud[fetcher.urls[0]] |
2645 | fetcher.download() | 2795 | fetcher.download() |
2646 | self.assertTrue(os.path.exists(ud.localpath)) | 2796 | self.assertTrue(os.path.exists(ud.localpath)) |
@@ -2657,9 +2807,9 @@ class NPMTest(FetcherTest): | |||
2657 | @skipIfNoNpm() | 2807 | @skipIfNoNpm() |
2658 | @skipIfNoNetwork() | 2808 | @skipIfNoNetwork() |
2659 | def test_npm_premirrors(self): | 2809 | def test_npm_premirrors(self): |
2660 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2810 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2661 | # Fetch once to get a tarball | 2811 | # Fetch once to get a tarball |
2662 | fetcher = bb.fetch.Fetch([url], self.d) | 2812 | fetcher = bb.fetch.Fetch(urls, self.d) |
2663 | ud = fetcher.ud[fetcher.urls[0]] | 2813 | ud = fetcher.ud[fetcher.urls[0]] |
2664 | fetcher.download() | 2814 | fetcher.download() |
2665 | self.assertTrue(os.path.exists(ud.localpath)) | 2815 | self.assertTrue(os.path.exists(ud.localpath)) |
@@ -2679,7 +2829,7 @@ class NPMTest(FetcherTest): | |||
2679 | # while the fetcher object exists, which it does when we rename the | 2829 | # while the fetcher object exists, which it does when we rename the |
2680 | # download directory to "mirror" above. Thus we need a new fetcher to go | 2830 | # download directory to "mirror" above. Thus we need a new fetcher to go |
2681 | # with the now empty download directory. | 2831 | # with the now empty download directory. |
2682 | fetcher = bb.fetch.Fetch([url], self.d) | 2832 | fetcher = bb.fetch.Fetch(urls, self.d) |
2683 | ud = fetcher.ud[fetcher.urls[0]] | 2833 | ud = fetcher.ud[fetcher.urls[0]] |
2684 | fetcher.download() | 2834 | fetcher.download() |
2685 | self.assertTrue(os.path.exists(ud.localpath)) | 2835 | self.assertTrue(os.path.exists(ud.localpath)) |
@@ -2687,9 +2837,9 @@ class NPMTest(FetcherTest): | |||
2687 | @skipIfNoNpm() | 2837 | @skipIfNoNpm() |
2688 | @skipIfNoNetwork() | 2838 | @skipIfNoNetwork() |
2689 | def test_npm_premirrors_with_specified_filename(self): | 2839 | def test_npm_premirrors_with_specified_filename(self): |
2690 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2840 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2691 | # Fetch once to get a tarball | 2841 | # Fetch once to get a tarball |
2692 | fetcher = bb.fetch.Fetch([url], self.d) | 2842 | fetcher = bb.fetch.Fetch(urls, self.d) |
2693 | ud = fetcher.ud[fetcher.urls[0]] | 2843 | ud = fetcher.ud[fetcher.urls[0]] |
2694 | fetcher.download() | 2844 | fetcher.download() |
2695 | self.assertTrue(os.path.exists(ud.localpath)) | 2845 | self.assertTrue(os.path.exists(ud.localpath)) |
@@ -2709,8 +2859,8 @@ class NPMTest(FetcherTest): | |||
2709 | @skipIfNoNetwork() | 2859 | @skipIfNoNetwork() |
2710 | def test_npm_mirrors(self): | 2860 | def test_npm_mirrors(self): |
2711 | # Fetch once to get a tarball | 2861 | # Fetch once to get a tarball |
2712 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2862 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2713 | fetcher = bb.fetch.Fetch([url], self.d) | 2863 | fetcher = bb.fetch.Fetch(urls, self.d) |
2714 | ud = fetcher.ud[fetcher.urls[0]] | 2864 | ud = fetcher.ud[fetcher.urls[0]] |
2715 | fetcher.download() | 2865 | fetcher.download() |
2716 | self.assertTrue(os.path.exists(ud.localpath)) | 2866 | self.assertTrue(os.path.exists(ud.localpath)) |
@@ -2734,8 +2884,8 @@ class NPMTest(FetcherTest): | |||
2734 | @skipIfNoNpm() | 2884 | @skipIfNoNpm() |
2735 | @skipIfNoNetwork() | 2885 | @skipIfNoNetwork() |
2736 | def test_npm_destsuffix_downloadfilename(self): | 2886 | def test_npm_destsuffix_downloadfilename(self): |
2737 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0;destsuffix=foo/bar;downloadfilename=foo-bar.tgz' | 2887 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0;destsuffix=foo/bar;downloadfilename=foo-bar.tgz'] |
2738 | fetcher = bb.fetch.Fetch([url], self.d) | 2888 | fetcher = bb.fetch.Fetch(urls, self.d) |
2739 | fetcher.download() | 2889 | fetcher.download() |
2740 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'foo-bar.tgz'))) | 2890 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'foo-bar.tgz'))) |
2741 | fetcher.unpack(self.unpackdir) | 2891 | fetcher.unpack(self.unpackdir) |
@@ -2743,18 +2893,18 @@ class NPMTest(FetcherTest): | |||
2743 | self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json'))) | 2893 | self.assertTrue(os.path.exists(os.path.join(unpackdir, 'package.json'))) |
2744 | 2894 | ||
2745 | def test_npm_no_network_no_tarball(self): | 2895 | def test_npm_no_network_no_tarball(self): |
2746 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2896 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2747 | self.d.setVar('BB_NO_NETWORK', '1') | 2897 | self.d.setVar('BB_NO_NETWORK', '1') |
2748 | fetcher = bb.fetch.Fetch([url], self.d) | 2898 | fetcher = bb.fetch.Fetch(urls, self.d) |
2749 | with self.assertRaises(bb.fetch2.NetworkAccess): | 2899 | with self.assertRaises(bb.fetch2.NetworkAccess): |
2750 | fetcher.download() | 2900 | fetcher.download() |
2751 | 2901 | ||
2752 | @skipIfNoNpm() | 2902 | @skipIfNoNpm() |
2753 | @skipIfNoNetwork() | 2903 | @skipIfNoNetwork() |
2754 | def test_npm_no_network_with_tarball(self): | 2904 | def test_npm_no_network_with_tarball(self): |
2755 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2905 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2756 | # Fetch once to get a tarball | 2906 | # Fetch once to get a tarball |
2757 | fetcher = bb.fetch.Fetch([url], self.d) | 2907 | fetcher = bb.fetch.Fetch(urls, self.d) |
2758 | fetcher.download() | 2908 | fetcher.download() |
2759 | # Disable network access | 2909 | # Disable network access |
2760 | self.d.setVar('BB_NO_NETWORK', '1') | 2910 | self.d.setVar('BB_NO_NETWORK', '1') |
@@ -2767,8 +2917,8 @@ class NPMTest(FetcherTest): | |||
2767 | @skipIfNoNpm() | 2917 | @skipIfNoNpm() |
2768 | @skipIfNoNetwork() | 2918 | @skipIfNoNetwork() |
2769 | def test_npm_registry_alternate(self): | 2919 | def test_npm_registry_alternate(self): |
2770 | url = 'npm://skimdb.npmjs.com;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2920 | urls = ['npm://skimdb.npmjs.com;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2771 | fetcher = bb.fetch.Fetch([url], self.d) | 2921 | fetcher = bb.fetch.Fetch(urls, self.d) |
2772 | fetcher.download() | 2922 | fetcher.download() |
2773 | fetcher.unpack(self.unpackdir) | 2923 | fetcher.unpack(self.unpackdir) |
2774 | unpackdir = os.path.join(self.unpackdir, 'npm') | 2924 | unpackdir = os.path.join(self.unpackdir, 'npm') |
@@ -2777,8 +2927,8 @@ class NPMTest(FetcherTest): | |||
2777 | @skipIfNoNpm() | 2927 | @skipIfNoNpm() |
2778 | @skipIfNoNetwork() | 2928 | @skipIfNoNetwork() |
2779 | def test_npm_version_latest(self): | 2929 | def test_npm_version_latest(self): |
2780 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=latest' | 2930 | url = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=latest'] |
2781 | fetcher = bb.fetch.Fetch([url], self.d) | 2931 | fetcher = bb.fetch.Fetch(url, self.d) |
2782 | fetcher.download() | 2932 | fetcher.download() |
2783 | fetcher.unpack(self.unpackdir) | 2933 | fetcher.unpack(self.unpackdir) |
2784 | unpackdir = os.path.join(self.unpackdir, 'npm') | 2934 | unpackdir = os.path.join(self.unpackdir, 'npm') |
@@ -2787,46 +2937,46 @@ class NPMTest(FetcherTest): | |||
2787 | @skipIfNoNpm() | 2937 | @skipIfNoNpm() |
2788 | @skipIfNoNetwork() | 2938 | @skipIfNoNetwork() |
2789 | def test_npm_registry_invalid(self): | 2939 | def test_npm_registry_invalid(self): |
2790 | url = 'npm://registry.invalid.org;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2940 | urls = ['npm://registry.invalid.org;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2791 | fetcher = bb.fetch.Fetch([url], self.d) | 2941 | fetcher = bb.fetch.Fetch(urls, self.d) |
2792 | with self.assertRaises(bb.fetch2.FetchError): | 2942 | with self.assertRaises(bb.fetch2.FetchError): |
2793 | fetcher.download() | 2943 | fetcher.download() |
2794 | 2944 | ||
2795 | @skipIfNoNpm() | 2945 | @skipIfNoNpm() |
2796 | @skipIfNoNetwork() | 2946 | @skipIfNoNetwork() |
2797 | def test_npm_package_invalid(self): | 2947 | def test_npm_package_invalid(self): |
2798 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/invalid;version=1.0.0' | 2948 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/invalid;version=1.0.0'] |
2799 | fetcher = bb.fetch.Fetch([url], self.d) | 2949 | fetcher = bb.fetch.Fetch(urls, self.d) |
2800 | with self.assertRaises(bb.fetch2.FetchError): | 2950 | with self.assertRaises(bb.fetch2.FetchError): |
2801 | fetcher.download() | 2951 | fetcher.download() |
2802 | 2952 | ||
2803 | @skipIfNoNpm() | 2953 | @skipIfNoNpm() |
2804 | @skipIfNoNetwork() | 2954 | @skipIfNoNetwork() |
2805 | def test_npm_version_invalid(self): | 2955 | def test_npm_version_invalid(self): |
2806 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=invalid' | 2956 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example;version=invalid'] |
2807 | with self.assertRaises(bb.fetch2.ParameterError): | 2957 | with self.assertRaises(bb.fetch2.ParameterError): |
2808 | fetcher = bb.fetch.Fetch([url], self.d) | 2958 | fetcher = bb.fetch.Fetch(urls, self.d) |
2809 | 2959 | ||
2810 | @skipIfNoNpm() | 2960 | @skipIfNoNpm() |
2811 | @skipIfNoNetwork() | 2961 | @skipIfNoNetwork() |
2812 | def test_npm_registry_none(self): | 2962 | def test_npm_registry_none(self): |
2813 | url = 'npm://;package=@savoirfairelinux/node-server-example;version=1.0.0' | 2963 | urls = ['npm://;package=@savoirfairelinux/node-server-example;version=1.0.0'] |
2814 | with self.assertRaises(bb.fetch2.MalformedUrl): | 2964 | with self.assertRaises(bb.fetch2.MalformedUrl): |
2815 | fetcher = bb.fetch.Fetch([url], self.d) | 2965 | fetcher = bb.fetch.Fetch(urls, self.d) |
2816 | 2966 | ||
2817 | @skipIfNoNpm() | 2967 | @skipIfNoNpm() |
2818 | @skipIfNoNetwork() | 2968 | @skipIfNoNetwork() |
2819 | def test_npm_package_none(self): | 2969 | def test_npm_package_none(self): |
2820 | url = 'npm://registry.npmjs.org;version=1.0.0' | 2970 | urls = ['npm://registry.npmjs.org;version=1.0.0'] |
2821 | with self.assertRaises(bb.fetch2.MissingParameterError): | 2971 | with self.assertRaises(bb.fetch2.MissingParameterError): |
2822 | fetcher = bb.fetch.Fetch([url], self.d) | 2972 | fetcher = bb.fetch.Fetch(urls, self.d) |
2823 | 2973 | ||
2824 | @skipIfNoNpm() | 2974 | @skipIfNoNpm() |
2825 | @skipIfNoNetwork() | 2975 | @skipIfNoNetwork() |
2826 | def test_npm_version_none(self): | 2976 | def test_npm_version_none(self): |
2827 | url = 'npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example' | 2977 | urls = ['npm://registry.npmjs.org;package=@savoirfairelinux/node-server-example'] |
2828 | with self.assertRaises(bb.fetch2.MissingParameterError): | 2978 | with self.assertRaises(bb.fetch2.MissingParameterError): |
2829 | fetcher = bb.fetch.Fetch([url], self.d) | 2979 | fetcher = bb.fetch.Fetch(urls, self.d) |
2830 | 2980 | ||
2831 | def create_shrinkwrap_file(self, data): | 2981 | def create_shrinkwrap_file(self, data): |
2832 | import json | 2982 | import json |
@@ -2835,32 +2985,30 @@ class NPMTest(FetcherTest): | |||
2835 | bb.utils.mkdirhier(datadir) | 2985 | bb.utils.mkdirhier(datadir) |
2836 | with open(swfile, 'w') as f: | 2986 | with open(swfile, 'w') as f: |
2837 | json.dump(data, f) | 2987 | json.dump(data, f) |
2838 | # Also configure the S directory | ||
2839 | self.sdir = os.path.join(self.unpackdir, 'S') | ||
2840 | self.d.setVar('S', self.sdir) | ||
2841 | return swfile | 2988 | return swfile |
2842 | 2989 | ||
2843 | @skipIfNoNpm() | ||
2844 | @skipIfNoNetwork() | 2990 | @skipIfNoNetwork() |
2845 | def test_npmsw(self): | 2991 | def test_npmsw(self): |
2846 | swfile = self.create_shrinkwrap_file({ | 2992 | swfile = self.create_shrinkwrap_file({ |
2847 | 'dependencies': { | 2993 | 'packages': { |
2848 | 'array-flatten': { | 2994 | 'node_modules/array-flatten': { |
2849 | 'version': '1.1.1', | 2995 | 'version': '1.1.1', |
2850 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | 2996 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', |
2851 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=', | 2997 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=', |
2852 | 'dependencies': { | 2998 | 'dependencies': { |
2853 | 'content-type': { | 2999 | 'content-type': "1.0.4" |
2854 | 'version': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz', | 3000 | } |
2855 | 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==', | 3001 | }, |
2856 | 'dependencies': { | 3002 | 'node_modules/array-flatten/node_modules/content-type': { |
2857 | 'cookie': { | 3003 | 'version': '1.0.4', |
2858 | 'version': 'git+https://github.com/jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09', | 3004 | 'resolved': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz', |
2859 | 'from': 'git+https://github.com/jshttp/cookie.git' | 3005 | 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==', |
2860 | } | 3006 | 'dependencies': { |
2861 | } | 3007 | 'cookie': 'git+https://github.com/jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09' |
2862 | } | ||
2863 | } | 3008 | } |
3009 | }, | ||
3010 | 'node_modules/array-flatten/node_modules/content-type/node_modules/cookie': { | ||
3011 | 'resolved': 'git+https://github.com/jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09' | ||
2864 | } | 3012 | } |
2865 | } | 3013 | } |
2866 | }) | 3014 | }) |
@@ -2870,31 +3018,17 @@ class NPMTest(FetcherTest): | |||
2870 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz'))) | 3018 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz'))) |
2871 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git'))) | 3019 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git'))) |
2872 | fetcher.unpack(self.unpackdir) | 3020 | fetcher.unpack(self.unpackdir) |
2873 | self.assertTrue(os.path.exists(os.path.join(self.sdir, 'npm-shrinkwrap.json'))) | 3021 | self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'npm-shrinkwrap.json'))) |
2874 | self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'package.json'))) | 3022 | self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'node_modules', 'array-flatten', 'package.json'))) |
2875 | self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'package.json'))) | 3023 | self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'package.json'))) |
2876 | self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'node_modules', 'cookie', 'package.json'))) | 3024 | self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'node_modules', 'array-flatten', 'node_modules', 'content-type', 'node_modules', 'cookie', 'package.json'))) |
2877 | 3025 | ||
2878 | @skipIfNoNpm() | ||
2879 | @skipIfNoNetwork() | 3026 | @skipIfNoNetwork() |
2880 | def test_npmsw_git(self): | 3027 | def test_npmsw_git(self): |
2881 | swfile = self.create_shrinkwrap_file({ | 3028 | swfile = self.create_shrinkwrap_file({ |
2882 | 'dependencies': { | 3029 | 'packages': { |
2883 | 'cookie': { | 3030 | 'node_modules/cookie': { |
2884 | 'version': 'github:jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09', | 3031 | 'resolved': 'git+https://github.com/jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09' |
2885 | 'from': 'github:jshttp/cookie.git' | ||
2886 | } | ||
2887 | } | ||
2888 | }) | ||
2889 | fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) | ||
2890 | fetcher.download() | ||
2891 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git'))) | ||
2892 | |||
2893 | swfile = self.create_shrinkwrap_file({ | ||
2894 | 'dependencies': { | ||
2895 | 'cookie': { | ||
2896 | 'version': 'jshttp/cookie.git#aec1177c7da67e3b3273df96cf476824dbc9ae09', | ||
2897 | 'from': 'jshttp/cookie.git' | ||
2898 | } | 3032 | } |
2899 | } | 3033 | } |
2900 | }) | 3034 | }) |
@@ -2902,29 +3036,16 @@ class NPMTest(FetcherTest): | |||
2902 | fetcher.download() | 3036 | fetcher.download() |
2903 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git'))) | 3037 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'github.com.jshttp.cookie.git'))) |
2904 | 3038 | ||
2905 | swfile = self.create_shrinkwrap_file({ | ||
2906 | 'dependencies': { | ||
2907 | 'nodejs': { | ||
2908 | 'version': 'gitlab:gitlab-examples/nodejs.git#892a1f16725e56cc3a2cb0d677be42935c8fc262', | ||
2909 | 'from': 'gitlab:gitlab-examples/nodejs' | ||
2910 | } | ||
2911 | } | ||
2912 | }) | ||
2913 | fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) | ||
2914 | fetcher.download() | ||
2915 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'git2', 'gitlab.com.gitlab-examples.nodejs.git'))) | ||
2916 | |||
2917 | @skipIfNoNpm() | ||
2918 | @skipIfNoNetwork() | 3039 | @skipIfNoNetwork() |
2919 | def test_npmsw_dev(self): | 3040 | def test_npmsw_dev(self): |
2920 | swfile = self.create_shrinkwrap_file({ | 3041 | swfile = self.create_shrinkwrap_file({ |
2921 | 'dependencies': { | 3042 | 'packages': { |
2922 | 'array-flatten': { | 3043 | 'node_modules/array-flatten': { |
2923 | 'version': '1.1.1', | 3044 | 'version': '1.1.1', |
2924 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | 3045 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', |
2925 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' | 3046 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' |
2926 | }, | 3047 | }, |
2927 | 'content-type': { | 3048 | 'node_modules/content-type': { |
2928 | 'version': '1.0.4', | 3049 | 'version': '1.0.4', |
2929 | 'resolved': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz', | 3050 | 'resolved': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz', |
2930 | 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==', | 3051 | 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==', |
@@ -2943,12 +3064,11 @@ class NPMTest(FetcherTest): | |||
2943 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz'))) | 3064 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz'))) |
2944 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz'))) | 3065 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz'))) |
2945 | 3066 | ||
2946 | @skipIfNoNpm() | ||
2947 | @skipIfNoNetwork() | 3067 | @skipIfNoNetwork() |
2948 | def test_npmsw_destsuffix(self): | 3068 | def test_npmsw_destsuffix(self): |
2949 | swfile = self.create_shrinkwrap_file({ | 3069 | swfile = self.create_shrinkwrap_file({ |
2950 | 'dependencies': { | 3070 | 'packages': { |
2951 | 'array-flatten': { | 3071 | 'node_modules/array-flatten': { |
2952 | 'version': '1.1.1', | 3072 | 'version': '1.1.1', |
2953 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | 3073 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', |
2954 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' | 3074 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' |
@@ -2962,8 +3082,8 @@ class NPMTest(FetcherTest): | |||
2962 | 3082 | ||
2963 | def test_npmsw_no_network_no_tarball(self): | 3083 | def test_npmsw_no_network_no_tarball(self): |
2964 | swfile = self.create_shrinkwrap_file({ | 3084 | swfile = self.create_shrinkwrap_file({ |
2965 | 'dependencies': { | 3085 | 'packages': { |
2966 | 'array-flatten': { | 3086 | 'node_modules/array-flatten': { |
2967 | 'version': '1.1.1', | 3087 | 'version': '1.1.1', |
2968 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | 3088 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', |
2969 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' | 3089 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' |
@@ -2985,8 +3105,8 @@ class NPMTest(FetcherTest): | |||
2985 | self.d.setVar('BB_NO_NETWORK', '1') | 3105 | self.d.setVar('BB_NO_NETWORK', '1') |
2986 | # Fetch again | 3106 | # Fetch again |
2987 | swfile = self.create_shrinkwrap_file({ | 3107 | swfile = self.create_shrinkwrap_file({ |
2988 | 'dependencies': { | 3108 | 'packages': { |
2989 | 'array-flatten': { | 3109 | 'node_modules/array-flatten': { |
2990 | 'version': '1.1.1', | 3110 | 'version': '1.1.1', |
2991 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | 3111 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', |
2992 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' | 3112 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' |
@@ -2996,15 +3116,14 @@ class NPMTest(FetcherTest): | |||
2996 | fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) | 3116 | fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) |
2997 | fetcher.download() | 3117 | fetcher.download() |
2998 | fetcher.unpack(self.unpackdir) | 3118 | fetcher.unpack(self.unpackdir) |
2999 | self.assertTrue(os.path.exists(os.path.join(self.sdir, 'node_modules', 'array-flatten', 'package.json'))) | 3119 | self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'node_modules', 'array-flatten', 'package.json'))) |
3000 | 3120 | ||
3001 | @skipIfNoNpm() | ||
3002 | @skipIfNoNetwork() | 3121 | @skipIfNoNetwork() |
3003 | def test_npmsw_npm_reusability(self): | 3122 | def test_npmsw_npm_reusability(self): |
3004 | # Fetch once with npmsw | 3123 | # Fetch once with npmsw |
3005 | swfile = self.create_shrinkwrap_file({ | 3124 | swfile = self.create_shrinkwrap_file({ |
3006 | 'dependencies': { | 3125 | 'packages': { |
3007 | 'array-flatten': { | 3126 | 'node_modules/array-flatten': { |
3008 | 'version': '1.1.1', | 3127 | 'version': '1.1.1', |
3009 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | 3128 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', |
3010 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' | 3129 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' |
@@ -3021,13 +3140,12 @@ class NPMTest(FetcherTest): | |||
3021 | fetcher.unpack(self.unpackdir) | 3140 | fetcher.unpack(self.unpackdir) |
3022 | self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'npm', 'package.json'))) | 3141 | self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'npm', 'package.json'))) |
3023 | 3142 | ||
3024 | @skipIfNoNpm() | ||
3025 | @skipIfNoNetwork() | 3143 | @skipIfNoNetwork() |
3026 | def test_npmsw_bad_checksum(self): | 3144 | def test_npmsw_bad_checksum(self): |
3027 | # Try to fetch with bad checksum | 3145 | # Try to fetch with bad checksum |
3028 | swfile = self.create_shrinkwrap_file({ | 3146 | swfile = self.create_shrinkwrap_file({ |
3029 | 'dependencies': { | 3147 | 'packages': { |
3030 | 'array-flatten': { | 3148 | 'node_modules/array-flatten': { |
3031 | 'version': '1.1.1', | 3149 | 'version': '1.1.1', |
3032 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | 3150 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', |
3033 | 'integrity': 'sha1-gfNEp2hqgLTFKT6P3AsBYMgsBqg=' | 3151 | 'integrity': 'sha1-gfNEp2hqgLTFKT6P3AsBYMgsBqg=' |
@@ -3039,8 +3157,8 @@ class NPMTest(FetcherTest): | |||
3039 | fetcher.download() | 3157 | fetcher.download() |
3040 | # Fetch correctly to get a tarball | 3158 | # Fetch correctly to get a tarball |
3041 | swfile = self.create_shrinkwrap_file({ | 3159 | swfile = self.create_shrinkwrap_file({ |
3042 | 'dependencies': { | 3160 | 'packages': { |
3043 | 'array-flatten': { | 3161 | 'node_modules/array-flatten': { |
3044 | 'version': '1.1.1', | 3162 | 'version': '1.1.1', |
3045 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | 3163 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', |
3046 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' | 3164 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' |
@@ -3078,8 +3196,8 @@ class NPMTest(FetcherTest): | |||
3078 | # Fetch again | 3196 | # Fetch again |
3079 | self.assertFalse(os.path.exists(ud.localpath)) | 3197 | self.assertFalse(os.path.exists(ud.localpath)) |
3080 | swfile = self.create_shrinkwrap_file({ | 3198 | swfile = self.create_shrinkwrap_file({ |
3081 | 'dependencies': { | 3199 | 'packages': { |
3082 | 'array-flatten': { | 3200 | 'node_modules/array-flatten': { |
3083 | 'version': '1.1.1', | 3201 | 'version': '1.1.1', |
3084 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | 3202 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', |
3085 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' | 3203 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' |
@@ -3106,8 +3224,8 @@ class NPMTest(FetcherTest): | |||
3106 | # Fetch again with invalid url | 3224 | # Fetch again with invalid url |
3107 | self.assertFalse(os.path.exists(ud.localpath)) | 3225 | self.assertFalse(os.path.exists(ud.localpath)) |
3108 | swfile = self.create_shrinkwrap_file({ | 3226 | swfile = self.create_shrinkwrap_file({ |
3109 | 'dependencies': { | 3227 | 'packages': { |
3110 | 'array-flatten': { | 3228 | 'node_modules/array-flatten': { |
3111 | 'version': '1.1.1', | 3229 | 'version': '1.1.1', |
3112 | 'resolved': 'https://invalid', | 3230 | 'resolved': 'https://invalid', |
3113 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' | 3231 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' |
@@ -3118,6 +3236,28 @@ class NPMTest(FetcherTest): | |||
3118 | fetcher.download() | 3236 | fetcher.download() |
3119 | self.assertTrue(os.path.exists(ud.localpath)) | 3237 | self.assertTrue(os.path.exists(ud.localpath)) |
3120 | 3238 | ||
3239 | @skipIfNoNetwork() | ||
3240 | def test_npmsw_bundled(self): | ||
3241 | swfile = self.create_shrinkwrap_file({ | ||
3242 | 'packages': { | ||
3243 | 'node_modules/array-flatten': { | ||
3244 | 'version': '1.1.1', | ||
3245 | 'resolved': 'https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz', | ||
3246 | 'integrity': 'sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=' | ||
3247 | }, | ||
3248 | 'node_modules/content-type': { | ||
3249 | 'version': '1.0.4', | ||
3250 | 'resolved': 'https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz', | ||
3251 | 'integrity': 'sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==', | ||
3252 | 'inBundle': True | ||
3253 | } | ||
3254 | } | ||
3255 | }) | ||
3256 | fetcher = bb.fetch.Fetch(['npmsw://' + swfile], self.d) | ||
3257 | fetcher.download() | ||
3258 | self.assertTrue(os.path.exists(os.path.join(self.dldir, 'npm2', 'array-flatten-1.1.1.tgz'))) | ||
3259 | self.assertFalse(os.path.exists(os.path.join(self.dldir, 'npm2', 'content-type-1.0.4.tgz'))) | ||
3260 | |||
3121 | class GitSharedTest(FetcherTest): | 3261 | class GitSharedTest(FetcherTest): |
3122 | def setUp(self): | 3262 | def setUp(self): |
3123 | super(GitSharedTest, self).setUp() | 3263 | super(GitSharedTest, self).setUp() |
@@ -3145,6 +3285,72 @@ class GitSharedTest(FetcherTest): | |||
3145 | alt = os.path.join(self.unpackdir, 'git/.git/objects/info/alternates') | 3285 | alt = os.path.join(self.unpackdir, 'git/.git/objects/info/alternates') |
3146 | self.assertFalse(os.path.exists(alt)) | 3286 | self.assertFalse(os.path.exists(alt)) |
3147 | 3287 | ||
3288 | class GitTagVerificationTests(FetcherTest): | ||
3289 | |||
3290 | @skipIfNoNetwork() | ||
3291 | def test_tag_rev_match(self): | ||
3292 | # Test a url with rev= and tag= set works | ||
3293 | fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake;branch=2.8;protocol=https;rev=aa0e540fc31a1c26839efd2c7785a751ce24ebfb;tag=2.8.7"], self.d) | ||
3294 | fetcher.download() | ||
3295 | fetcher.unpack(self.unpackdir) | ||
3296 | |||
3297 | def test_annotated_tag_rev_match(self): | ||
3298 | # Test a url with rev= and tag= set works | ||
3299 | # rev is the annotated tag revision in this case | ||
3300 | fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake;branch=2.8;protocol=https;rev=6d363159e4b7dc566fc40d069b2615e61774a7d8;tag=2.8.7"], self.d) | ||
3301 | fetcher.download() | ||
3302 | fetcher.unpack(self.unpackdir) | ||
3303 | |||
3304 | @skipIfNoNetwork() | ||
3305 | def test_tag_rev_match2(self): | ||
3306 | # Test a url with SRCREV and tag= set works | ||
3307 | self.d.setVar('SRCREV', 'aa0e540fc31a1c26839efd2c7785a751ce24ebfb') | ||
3308 | fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake;branch=2.8;protocol=https;tag=2.8.7"], self.d) | ||
3309 | fetcher.download() | ||
3310 | fetcher.unpack(self.unpackdir) | ||
3311 | |||
3312 | @skipIfNoNetwork() | ||
3313 | def test_tag_rev_match3(self): | ||
3314 | # Test a url with SRCREV, rev= and tag= set works | ||
3315 | self.d.setVar('SRCREV', 'aa0e540fc31a1c26839efd2c7785a751ce24ebfb') | ||
3316 | fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake;branch=2.8;protocol=https;rev=aa0e540fc31a1c26839efd2c7785a751ce24ebfb;tag=2.8.7"], self.d) | ||
3317 | fetcher.download() | ||
3318 | fetcher.unpack(self.unpackdir) | ||
3319 | |||
3320 | @skipIfNoNetwork() | ||
3321 | def test_tag_rev_match4(self): | ||
3322 | # Test a url with SRCREV and rev= mismatching errors | ||
3323 | self.d.setVar('SRCREV', 'bade540fc31a1c26839efd2c7785a751ce24ebfb') | ||
3324 | with self.assertRaises(bb.fetch2.FetchError): | ||
3325 | fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake;branch=2.8;protocol=https;rev=aa0e540fc31a1c26839efd2c7785a751ce24ebfb;tag=2.8.7"], self.d) | ||
3326 | |||
3327 | @skipIfNoNetwork() | ||
3328 | def test_tag_rev_match5(self): | ||
3329 | # Test a url with SRCREV, rev= and tag= set works when using shallow clones | ||
3330 | self.d.setVar('BB_GIT_SHALLOW', '1') | ||
3331 | self.d.setVar('SRCREV', 'aa0e540fc31a1c26839efd2c7785a751ce24ebfb') | ||
3332 | fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake;branch=2.8;protocol=https;rev=aa0e540fc31a1c26839efd2c7785a751ce24ebfb;tag=2.8.7"], self.d) | ||
3333 | fetcher.download() | ||
3334 | fetcher.unpack(self.unpackdir) | ||
3335 | |||
3336 | @skipIfNoNetwork() | ||
3337 | def test_tag_rev_match6(self): | ||
3338 | # Test a url with SRCREV, rev= and a mismatched tag= when using shallow clones | ||
3339 | self.d.setVar('BB_GIT_SHALLOW', '1') | ||
3340 | fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake;branch=2.8;protocol=https;rev=aa0e540fc31a1c26839efd2c7785a751ce24ebfb;tag=2.8.6"], self.d) | ||
3341 | fetcher.download() | ||
3342 | with self.assertRaises(bb.fetch2.FetchError): | ||
3343 | fetcher.unpack(self.unpackdir) | ||
3344 | |||
3345 | @skipIfNoNetwork() | ||
3346 | def test_tag_rev_match7(self): | ||
3347 | # Test a url with SRCREV, rev= and a mismatched tag= | ||
3348 | self.d.setVar('SRCREV', 'aa0e540fc31a1c26839efd2c7785a751ce24ebfb') | ||
3349 | fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake;branch=2.8;protocol=https;rev=aa0e540fc31a1c26839efd2c7785a751ce24ebfb;tag=2.8.6"], self.d) | ||
3350 | fetcher.download() | ||
3351 | with self.assertRaises(bb.fetch2.FetchError): | ||
3352 | fetcher.unpack(self.unpackdir) | ||
3353 | |||
3148 | 3354 | ||
3149 | class FetchPremirroronlyLocalTest(FetcherTest): | 3355 | class FetchPremirroronlyLocalTest(FetcherTest): |
3150 | 3356 | ||
@@ -3227,58 +3433,6 @@ class FetchPremirroronlyLocalTest(FetcherTest): | |||
3227 | with self.assertRaises(bb.fetch2.NetworkAccess): | 3433 | with self.assertRaises(bb.fetch2.NetworkAccess): |
3228 | fetcher.download() | 3434 | fetcher.download() |
3229 | 3435 | ||
3230 | def test_mirror_tarball_multiple_branches(self): | ||
3231 | """ | ||
3232 | test if PREMIRRORS can handle multiple name/branches correctly | ||
3233 | both branches have required revisions | ||
3234 | """ | ||
3235 | self.make_git_repo() | ||
3236 | branch1rev = self.git_new_branch("testbranch1") | ||
3237 | branch2rev = self.git_new_branch("testbranch2") | ||
3238 | self.recipe_url = "git://git.fake.repo/bitbake;branch=testbranch1,testbranch2;protocol=https;name=branch1,branch2" | ||
3239 | self.d.setVar("SRCREV_branch1", branch1rev) | ||
3240 | self.d.setVar("SRCREV_branch2", branch2rev) | ||
3241 | fetcher = bb.fetch.Fetch([self.recipe_url], self.d) | ||
3242 | self.assertTrue(os.path.exists(self.mirrorfile), "Mirror file doesn't exist") | ||
3243 | fetcher.download() | ||
3244 | fetcher.unpack(os.path.join(self.tempdir, "unpacked")) | ||
3245 | unpacked = os.path.join(self.tempdir, "unpacked", "git", self.testfilename) | ||
3246 | self.assertTrue(os.path.exists(unpacked), "Repo has not been unpackaged properly!") | ||
3247 | with open(unpacked, 'r') as f: | ||
3248 | content = f.read() | ||
3249 | ## We expect to see testbranch1 in the file, not master, not testbranch2 | ||
3250 | self.assertTrue(content.find("testbranch1") != -1, "Wrong branch has been checked out!") | ||
3251 | |||
3252 | def test_mirror_tarball_multiple_branches_nobranch(self): | ||
3253 | """ | ||
3254 | test if PREMIRRORS can handle multiple name/branches correctly | ||
3255 | Unbalanced name/branches raises ParameterError | ||
3256 | """ | ||
3257 | self.make_git_repo() | ||
3258 | branch1rev = self.git_new_branch("testbranch1") | ||
3259 | branch2rev = self.git_new_branch("testbranch2") | ||
3260 | self.recipe_url = "git://git.fake.repo/bitbake;branch=testbranch1;protocol=https;name=branch1,branch2" | ||
3261 | self.d.setVar("SRCREV_branch1", branch1rev) | ||
3262 | self.d.setVar("SRCREV_branch2", branch2rev) | ||
3263 | with self.assertRaises(bb.fetch2.ParameterError): | ||
3264 | fetcher = bb.fetch.Fetch([self.recipe_url], self.d) | ||
3265 | |||
3266 | def test_mirror_tarball_multiple_branches_norev(self): | ||
3267 | """ | ||
3268 | test if PREMIRRORS can handle multiple name/branches correctly | ||
3269 | one of the branches specifies non existing SRCREV | ||
3270 | """ | ||
3271 | self.make_git_repo() | ||
3272 | branch1rev = self.git_new_branch("testbranch1") | ||
3273 | branch2rev = self.git_new_branch("testbranch2") | ||
3274 | self.recipe_url = "git://git.fake.repo/bitbake;branch=testbranch1,testbranch2;protocol=https;name=branch1,branch2" | ||
3275 | self.d.setVar("SRCREV_branch1", branch1rev) | ||
3276 | self.d.setVar("SRCREV_branch2", "0"*40) | ||
3277 | fetcher = bb.fetch.Fetch([self.recipe_url], self.d) | ||
3278 | self.assertTrue(os.path.exists(self.mirrorfile), "Mirror file doesn't exist") | ||
3279 | with self.assertRaises(bb.fetch2.NetworkAccess): | ||
3280 | fetcher.download() | ||
3281 | |||
3282 | 3436 | ||
3283 | class FetchPremirroronlyNetworkTest(FetcherTest): | 3437 | class FetchPremirroronlyNetworkTest(FetcherTest): |
3284 | 3438 | ||
@@ -3289,16 +3443,16 @@ class FetchPremirroronlyNetworkTest(FetcherTest): | |||
3289 | self.reponame = "fstests" | 3443 | self.reponame = "fstests" |
3290 | self.clonedir = os.path.join(self.tempdir, "git") | 3444 | self.clonedir = os.path.join(self.tempdir, "git") |
3291 | self.gitdir = os.path.join(self.tempdir, "git", "{}.git".format(self.reponame)) | 3445 | self.gitdir = os.path.join(self.tempdir, "git", "{}.git".format(self.reponame)) |
3292 | self.recipe_url = "git://git.yoctoproject.org/fstests;protocol=https" | 3446 | self.recipe_url = "git://git.yoctoproject.org/fstests;protocol=https;branch=master" |
3293 | self.d.setVar("BB_FETCH_PREMIRRORONLY", "1") | 3447 | self.d.setVar("BB_FETCH_PREMIRRORONLY", "1") |
3294 | self.d.setVar("BB_NO_NETWORK", "0") | 3448 | self.d.setVar("BB_NO_NETWORK", "0") |
3295 | self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n") | 3449 | self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n") |
3296 | 3450 | ||
3297 | def make_git_repo(self): | 3451 | def make_git_repo(self): |
3298 | import shutil | ||
3299 | self.mirrorname = "git2_git.yoctoproject.org.fstests.tar.gz" | 3452 | self.mirrorname = "git2_git.yoctoproject.org.fstests.tar.gz" |
3300 | os.makedirs(self.clonedir) | 3453 | os.makedirs(self.clonedir) |
3301 | self.git("clone --bare --shallow-since=\"01.01.2013\" {}".format(self.recipe_url), self.clonedir) | 3454 | self.git("clone --bare {}".format(self.recipe_url), self.clonedir) |
3455 | self.git("update-ref HEAD 15413486df1f5a5b5af699b6f3ba5f0984e52a9f", self.gitdir) | ||
3302 | bb.process.run('tar -czvf {} .'.format(os.path.join(self.mirrordir, self.mirrorname)), cwd = self.gitdir) | 3456 | bb.process.run('tar -czvf {} .'.format(os.path.join(self.mirrordir, self.mirrorname)), cwd = self.gitdir) |
3303 | shutil.rmtree(self.clonedir) | 3457 | shutil.rmtree(self.clonedir) |
3304 | 3458 | ||
@@ -3306,7 +3460,7 @@ class FetchPremirroronlyNetworkTest(FetcherTest): | |||
3306 | def test_mirror_tarball_updated(self): | 3460 | def test_mirror_tarball_updated(self): |
3307 | self.make_git_repo() | 3461 | self.make_git_repo() |
3308 | ## Upstream commit is in the mirror | 3462 | ## Upstream commit is in the mirror |
3309 | self.d.setVar("SRCREV", "49d65d53c2bf558ae6e9185af0f3af7b79d255ec") | 3463 | self.d.setVar("SRCREV", "15413486df1f5a5b5af699b6f3ba5f0984e52a9f") |
3310 | fetcher = bb.fetch.Fetch([self.recipe_url], self.d) | 3464 | fetcher = bb.fetch.Fetch([self.recipe_url], self.d) |
3311 | fetcher.download() | 3465 | fetcher.download() |
3312 | 3466 | ||
@@ -3314,7 +3468,7 @@ class FetchPremirroronlyNetworkTest(FetcherTest): | |||
3314 | def test_mirror_tarball_outdated(self): | 3468 | def test_mirror_tarball_outdated(self): |
3315 | self.make_git_repo() | 3469 | self.make_git_repo() |
3316 | ## Upstream commit not in the mirror | 3470 | ## Upstream commit not in the mirror |
3317 | self.d.setVar("SRCREV", "15413486df1f5a5b5af699b6f3ba5f0984e52a9f") | 3471 | self.d.setVar("SRCREV", "49d65d53c2bf558ae6e9185af0f3af7b79d255ec") |
3318 | fetcher = bb.fetch.Fetch([self.recipe_url], self.d) | 3472 | fetcher = bb.fetch.Fetch([self.recipe_url], self.d) |
3319 | with self.assertRaises(bb.fetch2.NetworkAccess): | 3473 | with self.assertRaises(bb.fetch2.NetworkAccess): |
3320 | fetcher.download() | 3474 | fetcher.download() |
@@ -3324,7 +3478,6 @@ class FetchPremirroronlyMercurialTest(FetcherTest): | |||
3324 | the test covers also basic hg:// clone (see fetch_and_create_tarball | 3478 | the test covers also basic hg:// clone (see fetch_and_create_tarball |
3325 | """ | 3479 | """ |
3326 | def skipIfNoHg(): | 3480 | def skipIfNoHg(): |
3327 | import shutil | ||
3328 | if not shutil.which('hg'): | 3481 | if not shutil.which('hg'): |
3329 | return unittest.skip('Mercurial not installed') | 3482 | return unittest.skip('Mercurial not installed') |
3330 | return lambda f: f | 3483 | return lambda f: f |
@@ -3371,7 +3524,7 @@ class FetchPremirroronlyBrokenTarball(FetcherTest): | |||
3371 | os.mkdir(self.mirrordir) | 3524 | os.mkdir(self.mirrordir) |
3372 | self.reponame = "bitbake" | 3525 | self.reponame = "bitbake" |
3373 | self.gitdir = os.path.join(self.tempdir, "git", self.reponame) | 3526 | self.gitdir = os.path.join(self.tempdir, "git", self.reponame) |
3374 | self.recipe_url = "git://git.fake.repo/bitbake;protocol=https" | 3527 | self.recipe_url = "git://git.fake.repo/bitbake;protocol=https;branch=master" |
3375 | self.d.setVar("BB_FETCH_PREMIRRORONLY", "1") | 3528 | self.d.setVar("BB_FETCH_PREMIRRORONLY", "1") |
3376 | self.d.setVar("BB_NO_NETWORK", "1") | 3529 | self.d.setVar("BB_NO_NETWORK", "1") |
3377 | self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n") | 3530 | self.d.setVar("PREMIRRORS", self.recipe_url + " " + "file://{}".format(self.mirrordir) + " \n") |
@@ -3380,10 +3533,223 @@ class FetchPremirroronlyBrokenTarball(FetcherTest): | |||
3380 | targz.write("This is not tar.gz file!") | 3533 | targz.write("This is not tar.gz file!") |
3381 | 3534 | ||
3382 | def test_mirror_broken_download(self): | 3535 | def test_mirror_broken_download(self): |
3383 | import sys | ||
3384 | self.d.setVar("SRCREV", "0"*40) | 3536 | self.d.setVar("SRCREV", "0"*40) |
3385 | fetcher = bb.fetch.Fetch([self.recipe_url], self.d) | 3537 | fetcher = bb.fetch.Fetch([self.recipe_url], self.d) |
3386 | with self.assertRaises(bb.fetch2.FetchError), self.assertLogs() as logs: | 3538 | with self.assertRaises(bb.fetch2.FetchError), self.assertLogs() as logs: |
3387 | fetcher.download() | 3539 | fetcher.download() |
3388 | output = "".join(logs.output) | 3540 | output = "".join(logs.output) |
3389 | self.assertFalse(" not a git repository (or any parent up to mount point /)" in output) | 3541 | self.assertFalse(" not a git repository (or any parent up to mount point /)" in output) |
3542 | |||
3543 | class GoModTest(FetcherTest): | ||
3544 | |||
3545 | @skipIfNoNetwork() | ||
3546 | def test_gomod_url(self): | ||
3547 | urls = ['gomod://github.com/Azure/azure-sdk-for-go/sdk/storage/azblob;version=v1.0.0;' | ||
3548 | 'sha256sum=9bb69aea32f1d59711701f9562d66432c9c0374205e5009d1d1a62f03fb4fdad'] | ||
3549 | |||
3550 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3551 | ud = fetcher.ud[urls[0]] | ||
3552 | self.assertEqual(ud.url, 'https://proxy.golang.org/github.com/%21azure/azure-sdk-for-go/sdk/storage/azblob/%40v/v1.0.0.zip') | ||
3553 | self.assertEqual(ud.parm['downloadfilename'], 'github.com.Azure.azure-sdk-for-go.sdk.storage.azblob@v1.0.0.zip') | ||
3554 | self.assertEqual(ud.parm['name'], 'github.com/Azure/azure-sdk-for-go/sdk/storage/azblob@v1.0.0') | ||
3555 | |||
3556 | fetcher.download() | ||
3557 | fetcher.unpack(self.unpackdir) | ||
3558 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3559 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'github.com/!azure/azure-sdk-for-go/sdk/storage/azblob/@v/v1.0.0.zip'))) | ||
3560 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'github.com/!azure/azure-sdk-for-go/sdk/storage/azblob/@v/v1.0.0.mod'))) | ||
3561 | self.assertEqual(bb.utils.sha256_file(os.path.join(downloaddir, 'github.com/!azure/azure-sdk-for-go/sdk/storage/azblob/@v/v1.0.0.mod')), | ||
3562 | '7873b8544842329b4f385a3aa6cf82cc2bc8defb41a04fa5291c35fd5900e873') | ||
3563 | |||
3564 | @skipIfNoNetwork() | ||
3565 | def test_gomod_url_go_mod_only(self): | ||
3566 | urls = ['gomod://github.com/Azure/azure-sdk-for-go/sdk/storage/azblob;version=v1.0.0;mod=1;' | ||
3567 | 'sha256sum=7873b8544842329b4f385a3aa6cf82cc2bc8defb41a04fa5291c35fd5900e873'] | ||
3568 | |||
3569 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3570 | ud = fetcher.ud[urls[0]] | ||
3571 | self.assertEqual(ud.url, 'https://proxy.golang.org/github.com/%21azure/azure-sdk-for-go/sdk/storage/azblob/%40v/v1.0.0.mod') | ||
3572 | self.assertEqual(ud.parm['downloadfilename'], 'github.com.Azure.azure-sdk-for-go.sdk.storage.azblob@v1.0.0.mod') | ||
3573 | self.assertEqual(ud.parm['name'], 'github.com/Azure/azure-sdk-for-go/sdk/storage/azblob@v1.0.0') | ||
3574 | |||
3575 | fetcher.download() | ||
3576 | fetcher.unpack(self.unpackdir) | ||
3577 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3578 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'github.com/!azure/azure-sdk-for-go/sdk/storage/azblob/@v/v1.0.0.mod'))) | ||
3579 | |||
3580 | @skipIfNoNetwork() | ||
3581 | def test_gomod_url_sha256sum_varflag(self): | ||
3582 | urls = ['gomod://gopkg.in/ini.v1;version=v1.67.0'] | ||
3583 | self.d.setVarFlag('SRC_URI', 'gopkg.in/ini.v1@v1.67.0.sha256sum', 'bd845dfc762a87a56e5a32a07770dc83e86976db7705d7f89c5dbafdc60b06c6') | ||
3584 | |||
3585 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3586 | ud = fetcher.ud[urls[0]] | ||
3587 | self.assertEqual(ud.url, 'https://proxy.golang.org/gopkg.in/ini.v1/%40v/v1.67.0.zip') | ||
3588 | self.assertEqual(ud.parm['downloadfilename'], 'gopkg.in.ini.v1@v1.67.0.zip') | ||
3589 | self.assertEqual(ud.parm['name'], 'gopkg.in/ini.v1@v1.67.0') | ||
3590 | |||
3591 | fetcher.download() | ||
3592 | fetcher.unpack(self.unpackdir) | ||
3593 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3594 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.zip'))) | ||
3595 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.mod'))) | ||
3596 | self.assertEqual(bb.utils.sha256_file(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.mod')), | ||
3597 | '13aedd85db8e555104108e0e613bb7e4d1242af7f27c15423dd9ab63b60b72a1') | ||
3598 | |||
3599 | @skipIfNoNetwork() | ||
3600 | def test_gomod_url_no_go_mod_in_module(self): | ||
3601 | urls = ['gomod://gopkg.in/ini.v1;version=v1.67.0;' | ||
3602 | 'sha256sum=bd845dfc762a87a56e5a32a07770dc83e86976db7705d7f89c5dbafdc60b06c6'] | ||
3603 | |||
3604 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3605 | ud = fetcher.ud[urls[0]] | ||
3606 | self.assertEqual(ud.url, 'https://proxy.golang.org/gopkg.in/ini.v1/%40v/v1.67.0.zip') | ||
3607 | self.assertEqual(ud.parm['downloadfilename'], 'gopkg.in.ini.v1@v1.67.0.zip') | ||
3608 | self.assertEqual(ud.parm['name'], 'gopkg.in/ini.v1@v1.67.0') | ||
3609 | |||
3610 | fetcher.download() | ||
3611 | fetcher.unpack(self.unpackdir) | ||
3612 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3613 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.zip'))) | ||
3614 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.mod'))) | ||
3615 | self.assertEqual(bb.utils.sha256_file(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.mod')), | ||
3616 | '13aedd85db8e555104108e0e613bb7e4d1242af7f27c15423dd9ab63b60b72a1') | ||
3617 | |||
3618 | @skipIfNoNetwork() | ||
3619 | def test_gomod_url_host_only(self): | ||
3620 | urls = ['gomod://go.opencensus.io;version=v0.24.0;' | ||
3621 | 'sha256sum=203a767d7f8e7c1ebe5588220ad168d1e15b14ae70a636de7ca9a4a88a7e0d0c'] | ||
3622 | |||
3623 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3624 | ud = fetcher.ud[urls[0]] | ||
3625 | self.assertEqual(ud.url, 'https://proxy.golang.org/go.opencensus.io/%40v/v0.24.0.zip') | ||
3626 | self.assertEqual(ud.parm['downloadfilename'], 'go.opencensus.io@v0.24.0.zip') | ||
3627 | self.assertEqual(ud.parm['name'], 'go.opencensus.io@v0.24.0') | ||
3628 | |||
3629 | fetcher.download() | ||
3630 | fetcher.unpack(self.unpackdir) | ||
3631 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3632 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'go.opencensus.io/@v/v0.24.0.zip'))) | ||
3633 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'go.opencensus.io/@v/v0.24.0.mod'))) | ||
3634 | self.assertEqual(bb.utils.sha256_file(os.path.join(downloaddir, 'go.opencensus.io/@v/v0.24.0.mod')), | ||
3635 | '0dc9ccc660ad21cebaffd548f2cc6efa27891c68b4fbc1f8a3893b00f1acec96') | ||
3636 | |||
3637 | class GoModGitTest(FetcherTest): | ||
3638 | |||
3639 | @skipIfNoNetwork() | ||
3640 | def test_gomodgit_url_repo(self): | ||
3641 | urls = ['gomodgit://golang.org/x/net;version=v0.9.0;' | ||
3642 | 'repo=go.googlesource.com/net;' | ||
3643 | 'srcrev=694cff8668bac64e0864b552bffc280cd27f21b1'] | ||
3644 | |||
3645 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3646 | ud = fetcher.ud[urls[0]] | ||
3647 | self.assertEqual(ud.host, 'go.googlesource.com') | ||
3648 | self.assertEqual(ud.path, '/net') | ||
3649 | self.assertEqual(ud.name, 'golang.org/x/net@v0.9.0') | ||
3650 | self.assertEqual(self.d.getVar('SRCREV_golang.org/x/net@v0.9.0'), '694cff8668bac64e0864b552bffc280cd27f21b1') | ||
3651 | |||
3652 | fetcher.download() | ||
3653 | self.assertTrue(os.path.exists(ud.localpath)) | ||
3654 | |||
3655 | fetcher.unpack(self.unpackdir) | ||
3656 | vcsdir = os.path.join(self.unpackdir, 'pkg/mod/cache/vcs') | ||
3657 | self.assertTrue(os.path.exists(os.path.join(vcsdir, 'ed42bd05533fd84ae290a5d33ebd3695a0a2b06131beebd5450825bee8603aca'))) | ||
3658 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3659 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'golang.org/x/net/@v/v0.9.0.zip'))) | ||
3660 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'golang.org/x/net/@v/v0.9.0.mod'))) | ||
3661 | self.assertEqual(bb.utils.sha256_file(os.path.join(downloaddir, 'golang.org/x/net/@v/v0.9.0.mod')), | ||
3662 | 'c5d6851ede50ec1c001afb763040194b68961bf06997e2605e8bf06dcd2aeb2e') | ||
3663 | |||
3664 | @skipIfNoNetwork() | ||
3665 | def test_gomodgit_url_subdir(self): | ||
3666 | urls = ['gomodgit://github.com/Azure/azure-sdk-for-go/sdk/storage/azblob;version=v1.0.0;' | ||
3667 | 'repo=github.com/Azure/azure-sdk-for-go;subdir=sdk/storage/azblob;' | ||
3668 | 'srcrev=ec928e0ed34db682b3f783d3739d1c538142e0c3'] | ||
3669 | |||
3670 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3671 | ud = fetcher.ud[urls[0]] | ||
3672 | self.assertEqual(ud.host, 'github.com') | ||
3673 | self.assertEqual(ud.path, '/Azure/azure-sdk-for-go') | ||
3674 | self.assertEqual(ud.parm['subpath'], 'sdk/storage/azblob') | ||
3675 | self.assertEqual(ud.name, 'github.com/Azure/azure-sdk-for-go/sdk/storage/azblob@v1.0.0') | ||
3676 | self.assertEqual(self.d.getVar('SRCREV_github.com/Azure/azure-sdk-for-go/sdk/storage/azblob@v1.0.0'), 'ec928e0ed34db682b3f783d3739d1c538142e0c3') | ||
3677 | |||
3678 | fetcher.download() | ||
3679 | self.assertTrue(os.path.exists(ud.localpath)) | ||
3680 | |||
3681 | fetcher.unpack(self.unpackdir) | ||
3682 | vcsdir = os.path.join(self.unpackdir, 'pkg/mod/cache/vcs') | ||
3683 | self.assertTrue(os.path.exists(os.path.join(vcsdir, 'd31d6145676ed3066ce573a8198f326dea5be45a43b3d8f41ce7787fd71d66b3'))) | ||
3684 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3685 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'github.com/!azure/azure-sdk-for-go/sdk/storage/azblob/@v/v1.0.0.zip'))) | ||
3686 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'github.com/!azure/azure-sdk-for-go/sdk/storage/azblob/@v/v1.0.0.mod'))) | ||
3687 | self.assertEqual(bb.utils.sha256_file(os.path.join(downloaddir, 'github.com/!azure/azure-sdk-for-go/sdk/storage/azblob/@v/v1.0.0.mod')), | ||
3688 | '7873b8544842329b4f385a3aa6cf82cc2bc8defb41a04fa5291c35fd5900e873') | ||
3689 | |||
3690 | @skipIfNoNetwork() | ||
3691 | def test_gomodgit_url_srcrev_var(self): | ||
3692 | urls = ['gomodgit://gopkg.in/ini.v1;version=v1.67.0'] | ||
3693 | self.d.setVar('SRCREV_gopkg.in/ini.v1@v1.67.0', 'b2f570e5b5b844226bbefe6fb521d891f529a951') | ||
3694 | |||
3695 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3696 | ud = fetcher.ud[urls[0]] | ||
3697 | self.assertEqual(ud.host, 'gopkg.in') | ||
3698 | self.assertEqual(ud.path, '/ini.v1') | ||
3699 | self.assertEqual(ud.name, 'gopkg.in/ini.v1@v1.67.0') | ||
3700 | self.assertEqual(ud.parm['srcrev'], 'b2f570e5b5b844226bbefe6fb521d891f529a951') | ||
3701 | |||
3702 | fetcher.download() | ||
3703 | fetcher.unpack(self.unpackdir) | ||
3704 | vcsdir = os.path.join(self.unpackdir, 'pkg/mod/cache/vcs') | ||
3705 | self.assertTrue(os.path.exists(os.path.join(vcsdir, 'b7879a4be9ba8598851b8278b14c4f71a8316be64913298d1639cce6bde59bc3'))) | ||
3706 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3707 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.zip'))) | ||
3708 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.mod'))) | ||
3709 | self.assertEqual(bb.utils.sha256_file(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.mod')), | ||
3710 | '13aedd85db8e555104108e0e613bb7e4d1242af7f27c15423dd9ab63b60b72a1') | ||
3711 | |||
3712 | @skipIfNoNetwork() | ||
3713 | def test_gomodgit_url_no_go_mod_in_module(self): | ||
3714 | urls = ['gomodgit://gopkg.in/ini.v1;version=v1.67.0;' | ||
3715 | 'srcrev=b2f570e5b5b844226bbefe6fb521d891f529a951'] | ||
3716 | |||
3717 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3718 | ud = fetcher.ud[urls[0]] | ||
3719 | self.assertEqual(ud.host, 'gopkg.in') | ||
3720 | self.assertEqual(ud.path, '/ini.v1') | ||
3721 | self.assertEqual(ud.name, 'gopkg.in/ini.v1@v1.67.0') | ||
3722 | self.assertEqual(self.d.getVar('SRCREV_gopkg.in/ini.v1@v1.67.0'), 'b2f570e5b5b844226bbefe6fb521d891f529a951') | ||
3723 | |||
3724 | fetcher.download() | ||
3725 | fetcher.unpack(self.unpackdir) | ||
3726 | vcsdir = os.path.join(self.unpackdir, 'pkg/mod/cache/vcs') | ||
3727 | self.assertTrue(os.path.exists(os.path.join(vcsdir, 'b7879a4be9ba8598851b8278b14c4f71a8316be64913298d1639cce6bde59bc3'))) | ||
3728 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3729 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.zip'))) | ||
3730 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.mod'))) | ||
3731 | self.assertEqual(bb.utils.sha256_file(os.path.join(downloaddir, 'gopkg.in/ini.v1/@v/v1.67.0.mod')), | ||
3732 | '13aedd85db8e555104108e0e613bb7e4d1242af7f27c15423dd9ab63b60b72a1') | ||
3733 | |||
3734 | @skipIfNoNetwork() | ||
3735 | def test_gomodgit_url_host_only(self): | ||
3736 | urls = ['gomodgit://go.opencensus.io;version=v0.24.0;' | ||
3737 | 'repo=github.com/census-instrumentation/opencensus-go;' | ||
3738 | 'srcrev=b1a01ee95db0e690d91d7193d037447816fae4c5'] | ||
3739 | |||
3740 | fetcher = bb.fetch2.Fetch(urls, self.d) | ||
3741 | ud = fetcher.ud[urls[0]] | ||
3742 | self.assertEqual(ud.host, 'github.com') | ||
3743 | self.assertEqual(ud.path, '/census-instrumentation/opencensus-go') | ||
3744 | self.assertEqual(ud.name, 'go.opencensus.io@v0.24.0') | ||
3745 | self.assertEqual(self.d.getVar('SRCREV_go.opencensus.io@v0.24.0'), 'b1a01ee95db0e690d91d7193d037447816fae4c5') | ||
3746 | |||
3747 | fetcher.download() | ||
3748 | fetcher.unpack(self.unpackdir) | ||
3749 | vcsdir = os.path.join(self.unpackdir, 'pkg/mod/cache/vcs') | ||
3750 | self.assertTrue(os.path.exists(os.path.join(vcsdir, 'aae3ac7b2122ed3345654e6327855e9682f4a5350d63e93dbcfc51c4419df0e1'))) | ||
3751 | downloaddir = os.path.join(self.unpackdir, 'pkg/mod/cache/download') | ||
3752 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'go.opencensus.io/@v/v0.24.0.zip'))) | ||
3753 | self.assertTrue(os.path.exists(os.path.join(downloaddir, 'go.opencensus.io/@v/v0.24.0.mod'))) | ||
3754 | self.assertEqual(bb.utils.sha256_file(os.path.join(downloaddir, 'go.opencensus.io/@v/v0.24.0.mod')), | ||
3755 | '0dc9ccc660ad21cebaffd548f2cc6efa27891c68b4fbc1f8a3893b00f1acec96') | ||
diff --git a/bitbake/lib/bb/tests/parse.py b/bitbake/lib/bb/tests/parse.py index 72d1962e7e..e3cba67ad4 100644 --- a/bitbake/lib/bb/tests/parse.py +++ b/bitbake/lib/bb/tests/parse.py | |||
@@ -75,6 +75,59 @@ unset B[flag] | |||
75 | self.assertEqual(d.getVarFlag("A","flag"), None) | 75 | self.assertEqual(d.getVarFlag("A","flag"), None) |
76 | self.assertEqual(d.getVar("B"), "2") | 76 | self.assertEqual(d.getVar("B"), "2") |
77 | 77 | ||
78 | defaulttest = """ | ||
79 | A = "set value" | ||
80 | A ??= "default value" | ||
81 | |||
82 | A[flag_set_vs_question] = "set flag" | ||
83 | A[flag_set_vs_question] ?= "question flag" | ||
84 | |||
85 | A[flag_set_vs_default] = "set flag" | ||
86 | A[flag_set_vs_default] ??= "default flag" | ||
87 | |||
88 | A[flag_question] ?= "question flag" | ||
89 | |||
90 | A[flag_default] ??= "default flag" | ||
91 | |||
92 | A[flag_question_vs_default] ?= "question flag" | ||
93 | A[flag_question_vs_default] ??= "default flag" | ||
94 | |||
95 | A[flag_default_vs_question] ??= "default flag" | ||
96 | A[flag_default_vs_question] ?= "question flag" | ||
97 | |||
98 | A[flag_set_question_default] = "set flag" | ||
99 | A[flag_set_question_default] ?= "question flag" | ||
100 | A[flag_set_question_default] ??= "default flag" | ||
101 | |||
102 | A[flag_set_default_question] = "set flag" | ||
103 | A[flag_set_default_question] ??= "default flag" | ||
104 | A[flag_set_default_question] ?= "question flag" | ||
105 | |||
106 | A[flag_set_twice] = "set flag first" | ||
107 | A[flag_set_twice] = "set flag second" | ||
108 | |||
109 | A[flag_question_twice] ?= "question flag first" | ||
110 | A[flag_question_twice] ?= "question flag second" | ||
111 | |||
112 | A[flag_default_twice] ??= "default flag first" | ||
113 | A[flag_default_twice] ??= "default flag second" | ||
114 | """ | ||
115 | def test_parse_defaulttest(self): | ||
116 | f = self.parsehelper(self.defaulttest) | ||
117 | d = bb.parse.handle(f.name, self.d)[''] | ||
118 | self.assertEqual(d.getVar("A"), "set value") | ||
119 | self.assertEqual(d.getVarFlag("A","flag_set_vs_question"), "set flag") | ||
120 | self.assertEqual(d.getVarFlag("A","flag_set_vs_default"), "set flag") | ||
121 | self.assertEqual(d.getVarFlag("A","flag_question"), "question flag") | ||
122 | self.assertEqual(d.getVarFlag("A","flag_default"), "default flag") | ||
123 | self.assertEqual(d.getVarFlag("A","flag_question_vs_default"), "question flag") | ||
124 | self.assertEqual(d.getVarFlag("A","flag_default_vs_question"), "question flag") | ||
125 | self.assertEqual(d.getVarFlag("A","flag_set_question_default"), "set flag") | ||
126 | self.assertEqual(d.getVarFlag("A","flag_set_default_question"), "set flag") | ||
127 | self.assertEqual(d.getVarFlag("A","flag_set_twice"), "set flag second") | ||
128 | self.assertEqual(d.getVarFlag("A","flag_question_twice"), "question flag first") | ||
129 | self.assertEqual(d.getVarFlag("A","flag_default_twice"), "default flag second") | ||
130 | |||
78 | exporttest = """ | 131 | exporttest = """ |
79 | A = "a" | 132 | A = "a" |
80 | export B = "b" | 133 | export B = "b" |
@@ -177,7 +230,19 @@ python () { | |||
177 | 230 | ||
178 | addtask_deltask = """ | 231 | addtask_deltask = """ |
179 | addtask do_patch after do_foo after do_unpack before do_configure before do_compile | 232 | addtask do_patch after do_foo after do_unpack before do_configure before do_compile |
180 | addtask do_fetch do_patch | 233 | addtask do_fetch2 do_patch2 |
234 | |||
235 | addtask do_myplaintask | ||
236 | addtask do_myplaintask2 | ||
237 | deltask do_myplaintask2 | ||
238 | addtask do_mytask# comment | ||
239 | addtask do_mytask2 # comment2 | ||
240 | addtask do_mytask3 | ||
241 | deltask do_mytask3# comment | ||
242 | deltask do_mytask4 # comment2 | ||
243 | |||
244 | # Ensure a missing task prefix on after works | ||
245 | addtask do_mytask5 after mytask | ||
181 | 246 | ||
182 | MYVAR = "do_patch" | 247 | MYVAR = "do_patch" |
183 | EMPTYVAR = "" | 248 | EMPTYVAR = "" |
@@ -185,17 +250,12 @@ deltask do_fetch ${MYVAR} ${EMPTYVAR} | |||
185 | deltask ${EMPTYVAR} | 250 | deltask ${EMPTYVAR} |
186 | """ | 251 | """ |
187 | def test_parse_addtask_deltask(self): | 252 | def test_parse_addtask_deltask(self): |
188 | import sys | ||
189 | 253 | ||
190 | with self.assertLogs() as logs: | 254 | f = self.parsehelper(self.addtask_deltask) |
191 | f = self.parsehelper(self.addtask_deltask) | 255 | d = bb.parse.handle(f.name, self.d)[''] |
192 | d = bb.parse.handle(f.name, self.d)[''] | ||
193 | 256 | ||
194 | output = "".join(logs.output) | 257 | self.assertSequenceEqual(['do_fetch2', 'do_patch2', 'do_myplaintask', 'do_mytask', 'do_mytask2', 'do_mytask5'], bb.build.listtasks(d)) |
195 | self.assertTrue("addtask contained multiple 'before' keywords" in output) | 258 | self.assertEqual(['do_mytask'], d.getVarFlag("do_mytask5", "deps")) |
196 | self.assertTrue("addtask contained multiple 'after' keywords" in output) | ||
197 | self.assertTrue('addtask ignored: " do_patch"' in output) | ||
198 | #self.assertTrue('dependent task do_foo for do_patch does not exist' in output) | ||
199 | 259 | ||
200 | broken_multiline_comment = """ | 260 | broken_multiline_comment = """ |
201 | # First line of comment \\ | 261 | # First line of comment \\ |
@@ -341,3 +401,65 @@ EXPORT_FUNCTIONS do_compile do_compilepython | |||
341 | self.assertIn("else", d.getVar("do_compilepython")) | 401 | self.assertIn("else", d.getVar("do_compilepython")) |
342 | check_function_flags(d) | 402 | check_function_flags(d) |
343 | 403 | ||
404 | export_function_unclosed_tab = """ | ||
405 | do_compile () { | ||
406 | bb.note("Something") | ||
407 | \t} | ||
408 | """ | ||
409 | export_function_unclosed_space = """ | ||
410 | do_compile () { | ||
411 | bb.note("Something") | ||
412 | } | ||
413 | """ | ||
414 | export_function_residue = """ | ||
415 | do_compile () { | ||
416 | bb.note("Something") | ||
417 | } | ||
418 | |||
419 | include \\ | ||
420 | """ | ||
421 | |||
422 | def test_unclosed_functions(self): | ||
423 | def test_helper(content, expected_error): | ||
424 | with tempfile.TemporaryDirectory() as tempdir: | ||
425 | recipename = tempdir + "/recipe_unclosed.bb" | ||
426 | with open(recipename, "w") as f: | ||
427 | f.write(content) | ||
428 | f.flush() | ||
429 | os.chdir(tempdir) | ||
430 | with self.assertRaises(bb.parse.ParseError) as error: | ||
431 | bb.parse.handle(recipename, bb.data.createCopy(self.d)) | ||
432 | self.assertIn(expected_error, str(error.exception)) | ||
433 | |||
434 | with tempfile.TemporaryDirectory() as tempdir: | ||
435 | test_helper(self.export_function_unclosed_tab, "Unparsed lines from unclosed function") | ||
436 | test_helper(self.export_function_unclosed_space, "Unparsed lines from unclosed function") | ||
437 | test_helper(self.export_function_residue, "Unparsed lines") | ||
438 | |||
439 | recipename_closed = tempdir + "/recipe_closed.bb" | ||
440 | with open(recipename_closed, "w") as in_file: | ||
441 | lines = self.export_function_unclosed_tab.split("\n") | ||
442 | lines[3] = "}" | ||
443 | in_file.write("\n".join(lines)) | ||
444 | in_file.flush() | ||
445 | bb.parse.handle(recipename_closed, bb.data.createCopy(self.d)) | ||
446 | |||
447 | special_character_assignment = """ | ||
448 | A+="a" | ||
449 | A+ = "b" | ||
450 | + = "c" | ||
451 | """ | ||
452 | ambigous_assignment = """ | ||
453 | += "d" | ||
454 | """ | ||
455 | def test_parse_special_character_assignment(self): | ||
456 | f = self.parsehelper(self.special_character_assignment) | ||
457 | d = bb.parse.handle(f.name, self.d)[''] | ||
458 | self.assertEqual(d.getVar("A"), " a") | ||
459 | self.assertEqual(d.getVar("A+"), "b") | ||
460 | self.assertEqual(d.getVar("+"), "c") | ||
461 | |||
462 | f = self.parsehelper(self.ambigous_assignment) | ||
463 | with self.assertRaises(bb.parse.ParseError) as error: | ||
464 | bb.parse.handle(f.name, self.d) | ||
465 | self.assertIn("Empty variable name in assignment", str(error.exception)) | ||
diff --git a/bitbake/lib/bb/tests/persist_data.py b/bitbake/lib/bb/tests/persist_data.py deleted file mode 100644 index f641b5acbc..0000000000 --- a/bitbake/lib/bb/tests/persist_data.py +++ /dev/null | |||
@@ -1,129 +0,0 @@ | |||
1 | # | ||
2 | # BitBake Test for lib/bb/persist_data/ | ||
3 | # | ||
4 | # Copyright (C) 2018 Garmin Ltd. | ||
5 | # | ||
6 | # SPDX-License-Identifier: GPL-2.0-only | ||
7 | # | ||
8 | |||
9 | import unittest | ||
10 | import bb.data | ||
11 | import bb.persist_data | ||
12 | import tempfile | ||
13 | import threading | ||
14 | |||
15 | class PersistDataTest(unittest.TestCase): | ||
16 | def _create_data(self): | ||
17 | return bb.persist_data.persist('TEST_PERSIST_DATA', self.d) | ||
18 | |||
19 | def setUp(self): | ||
20 | self.d = bb.data.init() | ||
21 | self.tempdir = tempfile.TemporaryDirectory() | ||
22 | self.d['PERSISTENT_DIR'] = self.tempdir.name | ||
23 | self.data = self._create_data() | ||
24 | self.items = { | ||
25 | 'A1': '1', | ||
26 | 'B1': '2', | ||
27 | 'C2': '3' | ||
28 | } | ||
29 | self.stress_count = 10000 | ||
30 | self.thread_count = 5 | ||
31 | |||
32 | for k,v in self.items.items(): | ||
33 | self.data[k] = v | ||
34 | |||
35 | def tearDown(self): | ||
36 | self.tempdir.cleanup() | ||
37 | |||
38 | def _iter_helper(self, seen, iterator): | ||
39 | with iter(iterator): | ||
40 | for v in iterator: | ||
41 | self.assertTrue(v in seen) | ||
42 | seen.remove(v) | ||
43 | self.assertEqual(len(seen), 0, '%s not seen' % seen) | ||
44 | |||
45 | def test_get(self): | ||
46 | for k, v in self.items.items(): | ||
47 | self.assertEqual(self.data[k], v) | ||
48 | |||
49 | self.assertIsNone(self.data.get('D')) | ||
50 | with self.assertRaises(KeyError): | ||
51 | self.data['D'] | ||
52 | |||
53 | def test_set(self): | ||
54 | for k, v in self.items.items(): | ||
55 | self.data[k] += '-foo' | ||
56 | |||
57 | for k, v in self.items.items(): | ||
58 | self.assertEqual(self.data[k], v + '-foo') | ||
59 | |||
60 | def test_delete(self): | ||
61 | self.data['D'] = '4' | ||
62 | self.assertEqual(self.data['D'], '4') | ||
63 | del self.data['D'] | ||
64 | self.assertIsNone(self.data.get('D')) | ||
65 | with self.assertRaises(KeyError): | ||
66 | self.data['D'] | ||
67 | |||
68 | def test_contains(self): | ||
69 | for k in self.items: | ||
70 | self.assertTrue(k in self.data) | ||
71 | self.assertTrue(self.data.has_key(k)) | ||
72 | self.assertFalse('NotFound' in self.data) | ||
73 | self.assertFalse(self.data.has_key('NotFound')) | ||
74 | |||
75 | def test_len(self): | ||
76 | self.assertEqual(len(self.data), len(self.items)) | ||
77 | |||
78 | def test_iter(self): | ||
79 | self._iter_helper(set(self.items.keys()), self.data) | ||
80 | |||
81 | def test_itervalues(self): | ||
82 | self._iter_helper(set(self.items.values()), self.data.itervalues()) | ||
83 | |||
84 | def test_iteritems(self): | ||
85 | self._iter_helper(set(self.items.items()), self.data.iteritems()) | ||
86 | |||
87 | def test_get_by_pattern(self): | ||
88 | self._iter_helper({'1', '2'}, self.data.get_by_pattern('_1')) | ||
89 | |||
90 | def _stress_read(self, data): | ||
91 | for i in range(self.stress_count): | ||
92 | for k in self.items: | ||
93 | data[k] | ||
94 | |||
95 | def _stress_write(self, data): | ||
96 | for i in range(self.stress_count): | ||
97 | for k, v in self.items.items(): | ||
98 | data[k] = v + str(i) | ||
99 | |||
100 | def _validate_stress(self): | ||
101 | for k, v in self.items.items(): | ||
102 | self.assertEqual(self.data[k], v + str(self.stress_count - 1)) | ||
103 | |||
104 | def test_stress(self): | ||
105 | self._stress_read(self.data) | ||
106 | self._stress_write(self.data) | ||
107 | self._validate_stress() | ||
108 | |||
109 | def test_stress_threads(self): | ||
110 | def read_thread(): | ||
111 | data = self._create_data() | ||
112 | self._stress_read(data) | ||
113 | |||
114 | def write_thread(): | ||
115 | data = self._create_data() | ||
116 | self._stress_write(data) | ||
117 | |||
118 | threads = [] | ||
119 | for i in range(self.thread_count): | ||
120 | threads.append(threading.Thread(target=read_thread)) | ||
121 | threads.append(threading.Thread(target=write_thread)) | ||
122 | |||
123 | for t in threads: | ||
124 | t.start() | ||
125 | self._stress_read(self.data) | ||
126 | for t in threads: | ||
127 | t.join() | ||
128 | self._validate_stress() | ||
129 | |||
diff --git a/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass b/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass index b57650d591..80b003b2b5 100644 --- a/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass +++ b/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass | |||
@@ -9,7 +9,7 @@ def stamptask(d): | |||
9 | with open(stampname, "a+") as f: | 9 | with open(stampname, "a+") as f: |
10 | f.write(d.getVar("BB_UNIHASH") + "\n") | 10 | f.write(d.getVar("BB_UNIHASH") + "\n") |
11 | 11 | ||
12 | if d.getVar("BB_CURRENT_MC") != "default": | 12 | if d.getVar("BB_CURRENT_MC") != "": |
13 | thistask = d.expand("${BB_CURRENT_MC}:${PN}:${BB_CURRENTTASK}") | 13 | thistask = d.expand("${BB_CURRENT_MC}:${PN}:${BB_CURRENTTASK}") |
14 | if thistask in d.getVar("SLOWTASKS").split(): | 14 | if thistask in d.getVar("SLOWTASKS").split(): |
15 | bb.note("Slowing task %s" % thistask) | 15 | bb.note("Slowing task %s" % thistask) |
diff --git a/bitbake/lib/bb/tests/runqueue-tests/recipes/g1.bb b/bitbake/lib/bb/tests/runqueue-tests/recipes/g1.bb new file mode 100644 index 0000000000..3c7dca0257 --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/recipes/g1.bb | |||
@@ -0,0 +1,2 @@ | |||
1 | do_build[mcdepends] = "mc::mc-1:h1:do_invalid" | ||
2 | |||
diff --git a/bitbake/lib/bb/tests/runqueue-tests/recipes/h1.bb b/bitbake/lib/bb/tests/runqueue-tests/recipes/h1.bb new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/recipes/h1.bb | |||
diff --git a/bitbake/lib/bb/tests/runqueue.py b/bitbake/lib/bb/tests/runqueue.py index cc87e8d6a8..74f5ded2e6 100644 --- a/bitbake/lib/bb/tests/runqueue.py +++ b/bitbake/lib/bb/tests/runqueue.py | |||
@@ -26,7 +26,7 @@ class RunQueueTests(unittest.TestCase): | |||
26 | a1_sstatevalid = "a1:do_package a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_package_write_rpm a1:do_populate_lic a1:do_populate_sysroot" | 26 | a1_sstatevalid = "a1:do_package a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_package_write_rpm a1:do_populate_lic a1:do_populate_sysroot" |
27 | b1_sstatevalid = "b1:do_package b1:do_package_qa b1:do_packagedata b1:do_package_write_ipk b1:do_package_write_rpm b1:do_populate_lic b1:do_populate_sysroot" | 27 | b1_sstatevalid = "b1:do_package b1:do_package_qa b1:do_packagedata b1:do_package_write_ipk b1:do_package_write_rpm b1:do_populate_lic b1:do_populate_sysroot" |
28 | 28 | ||
29 | def run_bitbakecmd(self, cmd, builddir, sstatevalid="", slowtasks="", extraenv=None, cleanup=False): | 29 | def run_bitbakecmd(self, cmd, builddir, sstatevalid="", slowtasks="", extraenv=None, cleanup=False, allowfailure=False): |
30 | env = os.environ.copy() | 30 | env = os.environ.copy() |
31 | env["BBPATH"] = os.path.realpath(os.path.join(os.path.dirname(__file__), "runqueue-tests")) | 31 | env["BBPATH"] = os.path.realpath(os.path.join(os.path.dirname(__file__), "runqueue-tests")) |
32 | env["BB_ENV_PASSTHROUGH_ADDITIONS"] = "SSTATEVALID SLOWTASKS TOPDIR" | 32 | env["BB_ENV_PASSTHROUGH_ADDITIONS"] = "SSTATEVALID SLOWTASKS TOPDIR" |
@@ -41,6 +41,8 @@ class RunQueueTests(unittest.TestCase): | |||
41 | output = subprocess.check_output(cmd, env=env, stderr=subprocess.STDOUT,universal_newlines=True, cwd=builddir) | 41 | output = subprocess.check_output(cmd, env=env, stderr=subprocess.STDOUT,universal_newlines=True, cwd=builddir) |
42 | print(output) | 42 | print(output) |
43 | except subprocess.CalledProcessError as e: | 43 | except subprocess.CalledProcessError as e: |
44 | if allowfailure: | ||
45 | return e.output | ||
44 | self.fail("Command %s failed with %s" % (cmd, e.output)) | 46 | self.fail("Command %s failed with %s" % (cmd, e.output)) |
45 | tasks = [] | 47 | tasks = [] |
46 | tasklog = builddir + "/task.log" | 48 | tasklog = builddir + "/task.log" |
@@ -314,6 +316,13 @@ class RunQueueTests(unittest.TestCase): | |||
314 | ["mc_2:a1:%s" % t for t in rerun_tasks] | 316 | ["mc_2:a1:%s" % t for t in rerun_tasks] |
315 | self.assertEqual(set(tasks), set(expected)) | 317 | self.assertEqual(set(tasks), set(expected)) |
316 | 318 | ||
319 | # Check that a multiconfig that doesn't exist rasies a correct error message | ||
320 | error_output = self.run_bitbakecmd(["bitbake", "g1"], tempdir, "", extraenv=extraenv, cleanup=True, allowfailure=True) | ||
321 | self.assertIn("non-existent task", error_output) | ||
322 | # If the word 'Traceback' or 'KeyError' is in the output we've regressed | ||
323 | self.assertNotIn("Traceback", error_output) | ||
324 | self.assertNotIn("KeyError", error_output) | ||
325 | |||
317 | self.shutdown(tempdir) | 326 | self.shutdown(tempdir) |
318 | 327 | ||
319 | def test_hashserv_single(self): | 328 | def test_hashserv_single(self): |
diff --git a/bitbake/lib/bb/tests/utils.py b/bitbake/lib/bb/tests/utils.py index c363f62d7d..48e61dfcea 100644 --- a/bitbake/lib/bb/tests/utils.py +++ b/bitbake/lib/bb/tests/utils.py | |||
@@ -130,6 +130,14 @@ class Checksum(unittest.TestCase): | |||
130 | checksum = bb.utils.sha256_file(f.name) | 130 | checksum = bb.utils.sha256_file(f.name) |
131 | self.assertEqual(checksum, "fcfbae8bf6b721dbb9d2dc6a9334a58f2031a9a9b302999243f99da4d7f12d0f") | 131 | self.assertEqual(checksum, "fcfbae8bf6b721dbb9d2dc6a9334a58f2031a9a9b302999243f99da4d7f12d0f") |
132 | 132 | ||
133 | def test_goh1(self): | ||
134 | import hashlib | ||
135 | with tempfile.NamedTemporaryFile() as f: | ||
136 | f.write(self.filler) | ||
137 | f.flush() | ||
138 | checksum = bb.utils.goh1_file(f.name) | ||
139 | self.assertEqual(checksum, "81191f04d4abf413e5badd234814e4202d9efa73e6f9437e9ddd6b8165b569ef") | ||
140 | |||
133 | class EditMetadataFile(unittest.TestCase): | 141 | class EditMetadataFile(unittest.TestCase): |
134 | _origfile = """ | 142 | _origfile = """ |
135 | # A comment | 143 | # A comment |