Changeset 77351180a5cf…
Parent 105bd3eb46a4…
by Kevin Gessner <kevin@fogcreek.com>
Changes to one file · Browse files at 77351180a5cf Showing diff from parent 105bd3eb46a4 Diff from another changeset...
|
@@ -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
|
Loading...