Kiln » Kiln Extensions
Clone URL:  
Pushed to 2 repositories · View In Graph Contained in tip

Kiln 2.9.25 extensions

Changeset 77351180a5cf

Parent 105bd3eb46a4

by Profile picture of User 276Kevin Gessner <kevin@fogcreek.com>

Changes to one file · Browse files at 77351180a5cf Showing diff from parent 105bd3eb46a4 Diff from another changeset...

Change 1 of 4 Show Entire File kiln.py Stacked
 
95
96
97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
99
100
 
153
154
155
156
 
157
158
159
 
628
629
630
 
631
632
633
634
635
636
637
638
639
 
 
 
 
 
640
641
642
 
718
719
720
721
722
 
 
723
724
725
726
727
728
729
730
731
 
 
732
733
734
 
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
 
200
201
202
 
203
204
205
206
 
675
676
677
678
679
 
 
 
680
681
 
 
 
682
683
684
685
686
687
688
689
 
765
766
767
 
 
768
769
770
771
 
 
 
 
 
 
 
772
773
774
775
776
@@ -95,6 +95,53 @@
  def __str__(self):   return '\n'.join('%s: %s' % (k, v) for k, v in self.errors.items())   +class Review(dict): + def __init__(self, json, ui=None, token=None, baseurl=None): + self.ui = ui + self.token = token + self.baseurl = baseurl + self.update(json) + + @property + def version(self): + return 2 if 'sReview' in self else 1 + + @property + def key(self): + return str(self['sReview'] if self.version == 2 else self['ixReview']) + + def belongs_to(self, ixRepo): + return ixRepo in self['ixRepos'] if self.version == 2 else self['ixRepo'] == ixRepo + + def associate(self, ixRepo, revs): + if self.version == 1: + params = { + 'token': self.token, + 'ixBug': self.key, + 'revs': revs, + } + call_api(self.ui, self.baseurl, 'Api/1.0/Repo/%d/CaseAssociation/Create' % ixRepo, params, post=True) + else: + params = { + 'token': self.token, + 'revs': revs, + 'ixRepo': ixRepo, + } + call_api(self.ui, self.baseurl, 'Api/2.0/Review/%s/Association/Create' % self.key, params, post=True) + return urljoin(self.baseurl, 'Review', self.key) + + @classmethod + def get_reviews(klass, ui, token, baseurl, ixRepo): + review_lists = call_api(ui, baseurl, 'Api/2.0/Reviews', dict(token=token)) + reviews = {} + for key, review_list in review_lists.iteritems(): + if not key.startswith('reviews'): continue + for review in review_list: + review = Review(review, ui, token, baseurl) + if not review.belongs_to(ixRepo): continue + reviews[review.key.lower()] = review + return reviews +  def urljoin(*components):   url = components[0]   for next in components[1:]: @@ -153,7 +200,7 @@
  obj = json.load(fd)   except Exception:   ui.debug(_('kiln: traceback: %s\n') % traceback.format_exc()) - raise util.Abort(_('kiln: an error occurred while trying to reach %s\n') % url) + raise util.Abort(_('kiln: an error occurred while trying to reach %s') % url)     if isinstance(obj, dict) and 'errors' in obj:   if 'token' in params and obj['errors'][0]['codeError'] == 'InvalidToken': @@ -628,15 +675,15 @@
    token = get_token(ui, baseurl)   kiln_repo = get_repo_record(repo, url, token) + reviews = Review.get_reviews(repo.ui, token, baseurl, kiln_repo['ixRepo'])   - review_lists = call_api(repo.ui, baseurl, 'Api/1.0/Reviews', dict(token=token)) - reviews = filter(lambda r: r['ixRepo'] == kiln_repo['ixRepo'], review_lists['reviewsOpenedByMe'] + review_lists['reviewsReviewedByMe']) - reviews = sorted(reviews, key=lambda r: r['ixReview'])   choices = []   ui.write(_('\n')) - for r in reviews: - ui.write(encode_out(_('%d - %s\n') % (r['ixReview'], r['sTitle']))) - choices.append(str(r['ixReview'])) + for review_key in sorted(reviews.iterkeys()): + review = reviews[review_key] + title = re.sub('\s+', ' ', review['sTitle']) + ui.write(encode_out(_('%s - %s\n') % (review_key, title))) + choices.append(review_key)     choices.extend(['n', 'q', '?'])   while True: @@ -718,17 +765,12 @@
  'sTitle': '(Multiple changesets)' if len(revs) > 1 else repo[revs[0]].description(),   'sDescription': 'Review created from push.'   } - r = call_api(repo.ui, baseurl, 'Api/1.0/Review/Create', params, post=True) - ui.write(_('new review created: %s\n' % urljoin(baseurl, 'Review', str(r['ixReview'])))) + r = Review(call_api(repo.ui, baseurl, 'Api/2.0/Review/Create', params, post=True)) + ui.write(_('new review created: %s\n' % urljoin(baseurl, 'Review', r.key)))   else:   # Associate changeset(s) with an existing review. - params = { - 'token': token, - 'ixBug': int(choice), - 'revs': revs - } - call_api(repo.ui, baseurl, 'Api/1.0/Repo/%d/CaseAssociation/Create' % kiln_repo['ixRepo'], params, post=True) - ui.write(_('updated review: %s\n' % urljoin(baseurl, 'Review', choice))) + url = reviews[choice].associate(kiln_repo['ixRepo'], revs) + ui.write(_('updated review: %s\n' % url))    def dummy_command(ui, repo, dest=None, **opts):   '''dummy command to pass to guess_path() for hg kiln