| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -16,7 +16,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"""Tool for uploading diffs from a version control system to the codereview app.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Usage summary: upload.py [options] [-- diff_options]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Usage summary: upload.py [options] [-- diff_options] [path...]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Diff options are passed to the diff command of the underlying system.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -447,7 +447,8 @@ class HttpRpcServer(AbstractRpcServer):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    return opener
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				parser = optparse.OptionParser(usage="%prog [options] [-- diff_options]")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				parser = optparse.OptionParser(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    usage="%prog [options] [-- diff_options] [path...]")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				parser.add_option("-y", "--assume_yes", action="store_true",
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                  dest="assume_yes", default=False,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                  help="Assume that the answer to yes/no questions is 'yes'.")
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -457,7 +458,7 @@ group.add_option("-q", "--quiet", action="store_const", const=0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                 dest="verbose", help="Print errors only.")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				group.add_option("-v", "--verbose", action="store_const", const=2,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                 dest="verbose", default=1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                 help="Print info level logs (default).")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                 help="Print info level logs.")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				group.add_option("--noisy", action="store_const", const=3,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                 dest="verbose", help="Print all logs.")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				# Review server
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -555,7 +556,7 @@ def GetRpcServer(server, email=None, host_override=None, save_cookies=True,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  # If this is the dev_appserver, use fake authentication.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  host = (host_override or server).lower()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  if host == "localhost" or host.startswith("localhost:"):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  if re.match(r'(http://)?localhost([:/]|$)', host):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if email is None:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      email = "test@example.com"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      logging.info("Using debug user %s.  Override with --email" % email)
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -867,7 +868,7 @@ class SubversionVCS(VersionControlSystem):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    return self.svn_base
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  def _GuessBase(self, required):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    """Returns the SVN base URL.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    """Returns base URL for current diff.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    Args:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      required: If true, exits if the url can't be guessed, otherwise None is
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -875,36 +876,24 @@ class SubversionVCS(VersionControlSystem):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    """
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    info = RunShell(["svn", "info"])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    for line in info.splitlines():
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      words = line.split()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      if len(words) == 2 and words[0] == "URL:":
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        url = words[1]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      if line.startswith("URL: "):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        url = line.split()[1]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        username, netloc = urllib.splituser(netloc)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if username:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          logging.info("Removed username from base URL")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if netloc.endswith("svn.python.org"):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if netloc == "svn.python.org":
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            if path.startswith("/projects/"):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              path = path[9:]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          elif netloc != "pythondev@svn.python.org":
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ErrorExit("Unrecognized Python URL: %s" % url)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          base = "http://svn.python.org/view/*checkout*%s/" % path
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          logging.info("Guessed Python base = %s", base)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        elif netloc.endswith("svn.collab.net"):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if path.startswith("/repos/"):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            path = path[6:]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          base = "http://svn.collab.net/viewvc/*checkout*%s/" % path
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          logging.info("Guessed CollabNet base = %s", base)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        guess = ""
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if netloc == "svn.python.org" and scheme == "svn+ssh":
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          path = "projects" + path
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          scheme = "http"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          guess = "Python "
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        elif netloc.endswith(".googlecode.com"):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          path = path + "/"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          base = urlparse.urlunparse(("http", netloc, path, params,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                                      query, fragment))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          logging.info("Guessed Google Code base = %s", base)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        else:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          path = path + "/"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          base = urlparse.urlunparse((scheme, netloc, path, params,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                                      query, fragment))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          logging.info("Guessed base = %s", base)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          scheme = "http"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          guess = "Google Code "
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        path = path + "/"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        base = urlparse.urlunparse((scheme, netloc, path, params,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                                    query, fragment))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        logging.info("Guessed %sbase = %s", guess, base)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return base
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if required:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      ErrorExit("Can't find URL in output from svn info")
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -1185,7 +1174,10 @@ class GitVCS(VersionControlSystem):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  def GenerateDiff(self, extra_args):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    extra_args = extra_args[:]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if self.options.revision:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      extra_args = [self.options.revision] + extra_args
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      if ":" in self.options.revision:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        extra_args = self.options.revision.split(":", 1) + extra_args
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      else:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        extra_args = [self.options.revision] + extra_args
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # --no-ext-diff is broken in some versions of Git, so try to work around
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # this by overriding the environment (but there is still a problem if the
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -1267,8 +1259,6 @@ class MercurialVCS(VersionControlSystem):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    return filename[len(self.subdir):].lstrip(r"\/")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  def GenerateDiff(self, extra_args):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # If no file specified, restrict to the current subdir
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    extra_args = extra_args or ["."]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    cmd = ["hg", "diff", "--git", "-r", self.base_rev] + extra_args
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    data = RunShell(cmd, silent_ok=True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    svndiff = []
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -1319,13 +1309,12 @@ class MercurialVCS(VersionControlSystem):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # the working copy
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if out[0].startswith('%s: ' % relpath):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      out = out[1:]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if len(out) > 1:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    status, _ = out[0].split(' ', 1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if len(out) > 1 and status == "A":
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      # Moved/copied => considered as modified, use old filename to
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      # retrieve base contents
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      oldrelpath = out[1].strip()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      status = "M"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    else:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      status, _ = out[0].split(' ', 1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if ":" in self.base_rev:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      base_rev = self.base_rev.split(":", 1)[0]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    else:
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -1522,8 +1511,10 @@ def LoadSubversionAutoProperties():
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      - config file doesn't exist, or
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      - 'enable-auto-props' is not set to 'true-like-value' in [miscellany].
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  """
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  # Todo(hayato): Windows users might use different path for configuration file.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  subversion_config = os.path.expanduser("~/.subversion/config")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  if os.name == 'nt':
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    subversion_config = os.environ.get("APPDATA") + "\\Subversion\\config"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  else:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    subversion_config = os.path.expanduser("~/.subversion/config")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  if not os.path.exists(subversion_config):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    return {}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  config = ConfigParser.ConfigParser()
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |