From 82747423937fa5c65b7f33af496505a3f77bedc8 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 15 Dec 2009 13:36:05 -0800 Subject: [PATCH] codereview: add golang-dev@googlegroups.com automatically in "hg mail". also, avoid "empty list means all modified files in client" bug R=gri, cw CC=golang-dev https://golang.org/cl/174072 --- lib/codereview/codereview.py | 73 ++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 40 deletions(-) diff --git a/lib/codereview/codereview.py b/lib/codereview/codereview.py index f5bb8fcd234..78eb6c63f53 100644 --- a/lib/codereview/codereview.py +++ b/lib/codereview/codereview.py @@ -90,6 +90,10 @@ if __name__ == "__main__": sys.exit(2) +server = "codereview.appspot.com" +server_url_base = None +defaultcc = [ "golang-dev@googlegroups.com" ] + ####################################################################### # Change list parsing. # @@ -101,6 +105,13 @@ if __name__ == "__main__": # Also, the existence of the cl.nnnnnn file marks this repository # as the one where the change list lives. +emptydiff = """Index: ~rietveld~placeholder~ +=================================================================== +diff --git a/~rietveld~placeholder~ b/~rietveld~placeholder~ +new file mode 100644 +""" + + class CL(object): def __init__(self, name): self.name = name @@ -191,6 +202,8 @@ class CL(object): return s def Upload(self, ui, repo, send_mail=False, gofmt=True, gofmt_just_warn=False): + if not self.files: + ui.warn("no files in change list\n") if ui.configbool("codereview", "force_gofmt", True) and gofmt: CheckGofmt(ui, repo, self.files, just_warn=gofmt_just_warn) os.chdir(repo.root) @@ -209,14 +222,18 @@ class CL(object): # but RealMain doesn't have the most reusable interface. if self.name != "new": form_fields.append(("issue", self.name)) - vcs = GuessVCS(upload_options) - data = vcs.GenerateDiff(self.files) - files = vcs.GetBaseFiles(data) - if len(data) > MAX_UPLOAD_SIZE: - uploaded_diff_file = [] - form_fields.append(("separate_patches", "1")) + vcs = None + if self.files: + vcs = GuessVCS(upload_options) + data = vcs.GenerateDiff(self.files) + files = vcs.GetBaseFiles(data) + if len(data) > MAX_UPLOAD_SIZE: + uploaded_diff_file = [] + form_fields.append(("separate_patches", "1")) + else: + uploaded_diff_file = [("data", "data.diff", data)] else: - uploaded_diff_file = [("data", "data.diff", data)] + uploaded_diff_file = [("data", "data.diff", emptydiff)] ctype, body = EncodeMultipartFormData(form_fields, uploaded_diff_file) response_body = MySend("/upload", body, content_type=ctype) patchset = None @@ -235,7 +252,8 @@ class CL(object): self.url = server_url_base + self.name if not uploaded_diff_file: patches = UploadSeparatePatches(issue, rpc, patchset, data, upload_options) - vcs.UploadBaseFiles(issue, rpc, patches, patchset, upload_options, files) + if vcs: + vcs.UploadBaseFiles(issue, rpc, patches, patchset, upload_options, files) if send_mail: MySend("/" + issue + "/mail", payload="") self.web = True @@ -563,7 +581,7 @@ def EditCL(ui, repo, cl): # For use by submit, etc. (NOT by change) # Get change list number or list of files from command line. # If files are given, make a new change list. -def CommandLineCL(ui, repo, pats, opts): +def CommandLineCL(ui, repo, pats, opts, defaultcc=None): if len(pats) > 0 and GoodCLName(pats[0]): if len(pats) != 1: return None, "cannot specify change number and file names" @@ -582,6 +600,8 @@ def CommandLineCL(ui, repo, pats, opts): cl.reviewer = Add(cl.reviewer, SplitCommaSpace(opts.get('reviewer'))) if opts.get('cc'): cl.cc = Add(cl.cc, SplitCommaSpace(opts.get('cc'))) + if defaultcc: + cl.cc = Add(cl.cc, defaultcc) if cl.name == "new": if opts.get('message'): cl.desc = opts.get('message') @@ -607,6 +627,8 @@ def ReplacementForCmdutilMatch(repo, pats=[], opts={}, globbed=False, default='r cl, err = LoadCL(repo.ui, repo, clname, web=False) if err != '': raise util.Abort("loading CL " + clname + ": " + err) + if cl.files == None: + raise util.Abort("no files in CL " + clname) files = Add(files, cl.files) pats = Sub(pats, taken) + ['path:'+f for f in files] return original_match(repo, pats=pats, opts=opts, globbed=globbed, default=default) @@ -647,10 +669,6 @@ def CheckGofmt(ui, repo, files, just_warn=False): ####################################################################### # Mercurial commands -server = "codereview.appspot.com" - -server_url_base = None - # every command must take a ui and and repo as arguments. # opts is a dict where you can find other command line flags # @@ -904,11 +922,11 @@ def mail(ui, repo, *pats, **opts): Uploads a patch to the code review server and then sends mail to the reviewer and CC list asking for a review. """ - cl, err = CommandLineCL(ui, repo, pats, opts) + cl, err = CommandLineCL(ui, repo, pats, opts, defaultcc=defaultcc) if err != "": return err cl.Upload(ui, repo, gofmt_just_warn=True) - if not cl.reviewer: + if not cl.reviewer and not cl.cc: return "no reviewers listed in CL" pmsg = "Hello " + JoinComma(cl.reviewer) if cl.cc: @@ -1281,12 +1299,6 @@ cmdtable = { ####################################################################### # Wrappers around upload.py for interacting with Rietveld -emptydiff = """Index: ~rietveld~placeholder~ -=================================================================== -diff --git a/~rietveld~placeholder~ b/~rietveld~placeholder~ -new file mode 100644 -""" - # HTML form parser class FormParser(HTMLParser): def __init__(self): @@ -1515,25 +1527,6 @@ def GetSettings(issue): f['description'] = MySend("/"+issue+"/description", force_auth=False) return f -def CreateIssue(subject, desc): - form_fields = [ - ("content_upload", "1"), -# ("user", upload_options.email), - ("reviewers", ''), - ("cc", ''), - ("description", desc), - ("base_hashes", ""), - ("subject", subject), - ] - uploaded_diff_file = [ - ("data", "data.diff", emptydiff), - ] - ctype, body = EncodeMultipartFormData(form_fields, uploaded_diff_file) - response = MySend("/upload", body, content_type=ctype) - if response != "": - print >>sys.stderr, "Error creating issue:\n" + response - sys.exit(2) - def EditDesc(issue, subject=None, desc=None, reviewers=None, cc=None, closed=None): form_fields = GetForm("/" + issue + "/edit") if subject is not None: