commit:     8ef7ab63c0fbd294b37e851bce709336a1bd6e5a
Author:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
AuthorDate: Mon Oct 17 07:23:21 2022 +0000
Commit:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Mon Oct 17 07:45:33 2022 +0000
URL:        
https://gitweb.gentoo.org/proj/pkgcore/pkgcheck.git/commit/?id=8ef7ab63

network: fix results misattributed with same URL

When a URL is collected from multiple different attributes, the results
weren't updating the selected attribute, which resulted in wrong report.

Resolves: https://github.com/pkgcore/pkgcheck/issues/403
Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>

 src/pkgcheck/checks/network.py                     | 12 ++++++----
 .../MetadataUrlCheck/RedirectedUrl/expected.json   |  2 ++
 .../MetadataUrlCheck/RedirectedUrl/metadata.xml    |  2 ++
 .../MetadataUrlCheck/RedirectedUrl/responses.py    | 28 ++++++++++++++++------
 4 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/src/pkgcheck/checks/network.py b/src/pkgcheck/checks/network.py
index cfe76687..cad8e536 100644
--- a/src/pkgcheck/checks/network.py
+++ b/src/pkgcheck/checks/network.py
@@ -167,7 +167,7 @@ class _UrlCheck(NetworkCheck):
             result = DeadUrl(attr, url, str(e), pkg=pkg)
         return result
 
-    def task_done(self, pkg, future):
+    def task_done(self, pkg, attr, future):
         """Determine the result of a given URL verification task."""
         exc = future.exception()
         if exc is not None:
@@ -180,8 +180,10 @@ class _UrlCheck(NetworkCheck):
         result = future.result()
         if result is not None:
             if pkg is not None:
-                # recreate result object with different pkg target
-                result = result._create(**result._attrs, pkg=pkg)
+                # recreate result object with different pkg target and attr
+                attrs = result._attrs.copy()
+                attrs['attr'] = attr
+                result = result._create(**attrs, pkg=pkg)
             self.results_q.put([result])
 
     def _get_urls(self, pkg):
@@ -198,10 +200,10 @@ class _UrlCheck(NetworkCheck):
         future = futures.get(url)
         if future is None:
             future = executor.submit(func, attr, url, **kwargs)
-            future.add_done_callback(partial(self.task_done, None))
+            future.add_done_callback(partial(self.task_done, None, None))
             futures[url] = future
         else:
-            future.add_done_callback(partial(self.task_done, kwargs['pkg']))
+            future.add_done_callback(partial(self.task_done, kwargs['pkg'], 
attr))
 
     def schedule(self, pkg, executor, futures):
         """Schedule verification methods to run in separate threads for all 
flagged URLs."""

diff --git 
a/testdata/data/repos/network/MetadataUrlCheck/RedirectedUrl/expected.json 
b/testdata/data/repos/network/MetadataUrlCheck/RedirectedUrl/expected.json
index 789b87d2..ef65eafc 100644
--- a/testdata/data/repos/network/MetadataUrlCheck/RedirectedUrl/expected.json
+++ b/testdata/data/repos/network/MetadataUrlCheck/RedirectedUrl/expected.json
@@ -1 +1,3 @@
 {"__class__": "RedirectedUrl", "category": "MetadataUrlCheck", "package": 
"RedirectedUrl", "version": "0", "attr": "metadata.xml: changelog", "url": 
"https://github.com/pkgcore/pkgcheck/changelog";, "new_url": 
"https://github.com/pkgcore/pkgcheck/news"}
+{"__class__": "RedirectedUrl", "category": "MetadataUrlCheck", "package": 
"RedirectedUrl", "version": "0", "attr": "metadata.xml: remote-id", "url": 
"https://github.com/pkgcore/pkgcheck";, "new_url": 
"https://github.com/pkgcore/pkgcheck/"}
+{"__class__": "RedirectedUrl", "category": "MetadataUrlCheck", "package": 
"RedirectedUrl", "version": "0", "attr": "metadata.xml: doc", "url": 
"https://github.com/pkgcore/pkgcheck";, "new_url": 
"https://github.com/pkgcore/pkgcheck/"}

diff --git a/testdata/repos/network/MetadataUrlCheck/RedirectedUrl/metadata.xml 
b/testdata/repos/network/MetadataUrlCheck/RedirectedUrl/metadata.xml
index 429b3b6b..97b42470 100644
--- a/testdata/repos/network/MetadataUrlCheck/RedirectedUrl/metadata.xml
+++ b/testdata/repos/network/MetadataUrlCheck/RedirectedUrl/metadata.xml
@@ -2,6 +2,8 @@
 <!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd";>
 <pkgmetadata>
        <upstream>
+               <remote-id type="github">pkgcore/pkgcheck</remote-id>
+               <doc>https://github.com/pkgcore/pkgcheck</doc>
                
<changelog>https://github.com/pkgcore/pkgcheck/changelog</changelog>
        </upstream>
 </pkgmetadata>

diff --git a/testdata/repos/network/MetadataUrlCheck/RedirectedUrl/responses.py 
b/testdata/repos/network/MetadataUrlCheck/RedirectedUrl/responses.py
index 560443ee..0c4e3565 100644
--- a/testdata/repos/network/MetadataUrlCheck/RedirectedUrl/responses.py
+++ b/testdata/repos/network/MetadataUrlCheck/RedirectedUrl/responses.py
@@ -9,11 +9,25 @@ r_hist.url = 'https://github.com/pkgcore/pkgcheck/changelog'
 r_hist.headers = {'location': 'https://github.com/pkgcore/pkgcheck/news'}
 r_hist.raw = io.StringIO()
 
-r = Response()
-r.status_code = 200
-r.reason = 'OK'
-r.url = 'https://github.com/pkgcore/pkgcheck/changelog'
-r.raw = io.StringIO()
-r.history = [r_hist]
+r1 = Response()
+r1.status_code = 200
+r1.reason = 'OK'
+r1.url = 'https://github.com/pkgcore/pkgcheck/changelog'
+r1.raw = io.StringIO()
+r1.history = [r_hist]
 
-responses = [r]
+r_hist = Response()
+r_hist.status_code = 301
+r_hist.reason = 'Moved Permanently'
+r_hist.url = 'https://github.com/pkgcore/pkgcheck'
+r_hist.headers = {'location': 'https://github.com/pkgcore/pkgcheck/'}
+r_hist.raw = io.StringIO()
+
+r2 = Response()
+r2.status_code = 301
+r2.reason = 'OK'
+r2.url = 'https://github.com/pkgcore/pkgcheck'
+r2.raw = io.StringIO()
+r2.history = [r_hist]
+
+responses = [r1, r2]

Reply via email to