[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#859799: tracker.d.o: do src:pkg → pkg redirect



Control: tag -1 patch

Here is a first patch.

-- 
PEB
diff --git a/distro_tracker/core/models.py b/distro_tracker/core/models.py
index bcbb37a..b220ea9 100644
--- a/distro_tracker/core/models.py
+++ b/distro_tracker/core/models.py
@@ -503,14 +503,34 @@ def get_web_package(package_name):
     :param package_name: The name for which a package should be found.
     :type package_name: string
     """
-    if SourcePackageName.objects.exists_with_name(package_name):
+
+    (
+        package_name,
+        [
+            search_source,
+            search_pseudo,
+            search_binary,
+            search_pname,
+        ],
+    ) = __package_search_helper(package_name)
+
+    if (
+            search_source and
+            SourcePackageName.objects.exists_with_name(package_name)
+    ):
         return SourcePackageName.objects.get(name=package_name)
-    elif PseudoPackageName.objects.exists_with_name(package_name):
+    elif (
+            search_pseudo and
+            PseudoPackageName.objects.exists_with_name(package_name)
+    ):
         return PseudoPackageName.objects.get(name=package_name)
-    elif BinaryPackageName.objects.exists_with_name(package_name):
+    elif (
+            search_binary and
+            BinaryPackageName.objects.exists_with_name(package_name)
+    ):
         binary_package = BinaryPackageName.objects.get(name=package_name)
         return binary_package.main_source_package_name
-    elif PackageName.objects.exists_with_name(package_name):
+    elif search_pname and PackageName.objects.exists_with_name(package_name):
         pkg = PackageName.objects.get(name=package_name)
         # This is not a current source or binary package, but if it has
         # associated news, then it's likely a former source package where we can
@@ -521,6 +541,43 @@ def get_web_package(package_name):
     return None
 
 
+def __package_search_helper(package_name):
+    """
+    Utility function that helps to decide where the tracker should search
+    for `package_name`. If package_name starts with 'src:' or 'bin:',
+    then narrows the search to the specific representations. If not,
+    then searches everywhere. Returns a tuple with the stripped package
+    name and a list of places to search.
+
+    :rtype: `tuple`
+
+    :param package_name: The name for which a package should be found.
+    :type package_name: string
+    """
+
+    search_source = True
+    search_pseudo = True
+    search_binary = True
+    search_pname = True
+
+    if package_name.startswith("src:"):
+        package_name = package_name.replace("src:", "")
+        search_pseudo = search_binary = search_pname = False
+    if package_name.startswith("bin:"):
+        package_name = package_name.replace("bin:", "")
+        search_source = search_pseudo = search_pname = False
+
+    return (
+        package_name,
+        [
+            search_source,
+            search_pseudo,
+            search_binary,
+            search_pname,
+        ]
+    )
+
+
 class SubscriptionManager(models.Manager):
     """
     A custom :class:`Manager <django.db.models.Manager>` for the

Attachment: signature.asc
Description: PGP signature


Reply to: