Implement duplicate following for launchpad.
[jelmer/bts-link.git] / remote / launchpad.py
index da1a0ddc9845005e7bfc2c68d1522ffce8720a9f..b399b30919dead0877a02489adae7f09c5c0c232 100644 (file)
@@ -42,9 +42,11 @@ class LaunchpadTask:
 class LaunchpadBug:
     def __init__(self, text):
         bug = rfc822.Message(text)
-        self.duplicate_of = bug.get("duplicate-of", None)
-        if self.duplicate_of == "":
+        dupestr = bug.get("duplicate-of", None)
+        if dupestr == "":
             self.duplicate_of = None
+        else:
+            self.duplicate_of = int(dupestr)
         self.id = int(bug["bug"])
         self.tasks = {}
 
@@ -57,8 +59,7 @@ class LaunchpadBug:
 
 
 class RemoteLaunchpadData:
-    def __init__(self, uri, id):
-
+    def __init__(self, uri, id=None):
         text = urllib.urlopen(urlparse.urljoin(uri+"/", "+text"))
         # Two forms of URLs supported:
         if uri.split("/")[-2] == "+bug":
@@ -70,10 +71,16 @@ class RemoteLaunchpadData:
         self.resolution = None
 
         lp_bug = LaunchpadBug(text)
+        if id is not None and int(id) != lp_bug.id:
+            raise ParseExn(uri, "Expected id %s, got %d" % (id, lp_bug.id))
         self.id = lp_bug.id
 
         if lp_bug.duplicate_of is not None:
-            raise DupeExn(uri)
+            dupe_uri = "%s/%d" % ("/".join(uri.split("/")[:-1]), 
+                                  lp_bug.duplicate_of)
+            self.duplicate = RemoteLaunchpadData(dupe_uri)
+        else:
+            self.duplicate = None
 
         if product is None: 
             if len(lp_bug.tasks) != 1: