| Index: third_party/upload.py
|
| diff --git a/third_party/upload.py b/third_party/upload.py
|
| index 2dde68ee7a8ca146014822037f45d2f291d1e8de..3a72955207154012de6513620196f5666ef6a471 100755
|
| --- a/third_party/upload.py
|
| +++ b/third_party/upload.py
|
| @@ -103,22 +103,18 @@ VCS_CVS = "CVS"
|
| VCS_UNKNOWN = "Unknown"
|
|
|
| VCS = [
|
| -{
|
| - 'name': VCS_MERCURIAL,
|
| - 'aliases': ['hg', 'mercurial'],
|
| -}, {
|
| - 'name': VCS_SUBVERSION,
|
| - 'aliases': ['svn', 'subversion'],
|
| -}, {
|
| - 'name': VCS_PERFORCE,
|
| - 'aliases': ['p4', 'perforce'],
|
| -}, {
|
| - 'name': VCS_GIT,
|
| - 'aliases': ['git'],
|
| -}, {
|
| - 'name': VCS_CVS,
|
| - 'aliases': ['cvs'],
|
| -}]
|
| + {'name': VCS_MERCURIAL,
|
| + 'aliases': ['hg', 'mercurial']},
|
| + {'name': VCS_SUBVERSION,
|
| + 'aliases': ['svn', 'subversion'],},
|
| + {'name': VCS_PERFORCE,
|
| + 'aliases': ['p4', 'perforce']},
|
| + {'name': VCS_GIT,
|
| + 'aliases': ['git']},
|
| + {'name': VCS_CVS,
|
| + 'aliases': ['cvs']},
|
| + ]
|
| +
|
|
|
| VCS_SHORT_NAMES = [] # hg, svn, ...
|
| VCS_ABBREVIATIONS = {} # alias: name, ...
|
| @@ -218,7 +214,7 @@ def StatusUpdate(msg):
|
|
|
| def ErrorExit(msg):
|
| """Print an error message to stderr and exit."""
|
| - print >>sys.stderr, msg
|
| + print >> sys.stderr, msg
|
| sys.exit(1)
|
|
|
|
|
| @@ -381,41 +377,41 @@ class AbstractRpcServer(object):
|
| try:
|
| auth_token = self._GetAuthToken(credentials[0], credentials[1])
|
| except ClientLoginError, e:
|
| - print >>sys.stderr, ''
|
| + print >> sys.stderr, ''
|
| if e.reason == "BadAuthentication":
|
| if e.info == "InvalidSecondFactor":
|
| - print >>sys.stderr, (
|
| + print >> sys.stderr, (
|
| "Use an application-specific password instead "
|
| "of your regular account password.\n"
|
| "See http://www.google.com/"
|
| "support/accounts/bin/answer.py?answer=185833")
|
| else:
|
| - print >>sys.stderr, "Invalid username or password."
|
| + print >> sys.stderr, "Invalid username or password."
|
| elif e.reason == "CaptchaRequired":
|
| - print >>sys.stderr, (
|
| + print >> sys.stderr, (
|
| "Please go to\n"
|
| "https://www.google.com/accounts/DisplayUnlockCaptcha\n"
|
| "and verify you are a human. Then try again.\n"
|
| "If you are using a Google Apps account the URL is:\n"
|
| "https://www.google.com/a/yourdomain.com/UnlockCaptcha")
|
| elif e.reason == "NotVerified":
|
| - print >>sys.stderr, "Account not verified."
|
| + print >> sys.stderr, "Account not verified."
|
| elif e.reason == "TermsNotAgreed":
|
| - print >>sys.stderr, "User has not agreed to TOS."
|
| + print >> sys.stderr, "User has not agreed to TOS."
|
| elif e.reason == "AccountDeleted":
|
| - print >>sys.stderr, "The user account has been deleted."
|
| + print >> sys.stderr, "The user account has been deleted."
|
| elif e.reason == "AccountDisabled":
|
| - print >>sys.stderr, "The user account has been disabled."
|
| + print >> sys.stderr, "The user account has been disabled."
|
| break
|
| elif e.reason == "ServiceDisabled":
|
| - print >>sys.stderr, ("The user's access to the service has been "
|
| + print >> sys.stderr, ("The user's access to the service has been "
|
| "disabled.")
|
| elif e.reason == "ServiceUnavailable":
|
| - print >>sys.stderr, "The service is not available; try again later."
|
| + print >> sys.stderr, "The service is not available; try again later."
|
| else:
|
| # Unknown error.
|
| raise
|
| - print >>sys.stderr, ''
|
| + print >> sys.stderr, ''
|
| continue
|
| self._GetAuthCookie(auth_token)
|
| return
|
| @@ -462,7 +458,7 @@ class AbstractRpcServer(object):
|
| for header, value in extra_headers.items():
|
| req.add_header(header, value)
|
| try:
|
| - f = self.opener.open(req)
|
| + f = self.opener.open(req, timeout=70)
|
| response = f.read()
|
| f.close()
|
| return response
|
| @@ -543,37 +539,37 @@ class HttpRpcServer(AbstractRpcServer):
|
|
|
|
|
| class CondensedHelpFormatter(optparse.IndentedHelpFormatter):
|
| - """Frees more horizontal space by removing indentation from group
|
| - options and collapsing arguments between short and long, e.g.
|
| - '-o ARG, --opt=ARG' to -o --opt ARG"""
|
| -
|
| - def format_heading(self, heading):
|
| - return "%s:\n" % heading
|
| -
|
| - def format_option(self, option):
|
| - self.dedent()
|
| - res = optparse.HelpFormatter.format_option(self, option)
|
| - self.indent()
|
| - return res
|
| -
|
| - def format_option_strings(self, option):
|
| - self.set_long_opt_delimiter(" ")
|
| - optstr = optparse.HelpFormatter.format_option_strings(self, option)
|
| - optlist = optstr.split(", ")
|
| - if len(optlist) > 1:
|
| - if option.takes_value():
|
| - # strip METAVAR from all but the last option
|
| - optlist = [x.split()[0] for x in optlist[:-1]] + optlist[-1:]
|
| - optstr = " ".join(optlist)
|
| - return optstr
|
| + """Frees more horizontal space by removing indentation from group
|
| + options and collapsing arguments between short and long, e.g.
|
| + '-o ARG, --opt=ARG' to -o --opt ARG"""
|
| +
|
| + def format_heading(self, heading):
|
| + return "%s:\n" % heading
|
| +
|
| + def format_option(self, option):
|
| + self.dedent()
|
| + res = optparse.HelpFormatter.format_option(self, option)
|
| + self.indent()
|
| + return res
|
| +
|
| + def format_option_strings(self, option):
|
| + self.set_long_opt_delimiter(" ")
|
| + optstr = optparse.HelpFormatter.format_option_strings(self, option)
|
| + optlist = optstr.split(", ")
|
| + if len(optlist) > 1:
|
| + if option.takes_value():
|
| + # strip METAVAR from all but the last option
|
| + optlist = [x.split()[0] for x in optlist[:-1]] + optlist[-1:]
|
| + optstr = " ".join(optlist)
|
| + return optstr
|
|
|
|
|
| parser = optparse.OptionParser(
|
| - usage=("%prog [options] [-- diff_options] [path...]\n"
|
| - "See also: http://code.google.com/p/rietveld/wiki/UploadPyUsage"),
|
| - add_help_option=False,
|
| - formatter=CondensedHelpFormatter()
|
| -)
|
| + usage=("%prog [options] [-- diff_options] [path...]\n"
|
| + "See also: http://code.google.com/p/rietveld/wiki/UploadPyUsage"),
|
| + add_help_option=False,
|
| + formatter=CondensedHelpFormatter()
|
| + )
|
| parser.add_option("-h", "--help", action="store_true",
|
| help="Show this help message and exit.")
|
| parser.add_option("-y", "--assume_yes", action="store_true",
|
| @@ -681,8 +677,11 @@ group.add_option("--emulate_svn_auto_props", action="store_true",
|
| group = parser.add_option_group("Git-specific options")
|
| group.add_option("--git_similarity", action="store", dest="git_similarity",
|
| metavar="SIM", type="int", default=50,
|
| - help=("Set the minimum similarity index for detecting renames "
|
| - "and copies. See `git diff -C`. (default 50)."))
|
| + help=("Set the minimum similarity percentage for detecting "
|
| + "renames and copies. See `git diff -C`. (default 50)."))
|
| +group.add_option("--git_only_search_patch", action="store_false", default=True,
|
| + dest='git_find_copies_harder',
|
| + help="Removes --find-copies-harder when seaching for copies")
|
| group.add_option("--git_no_find_copies", action="store_false", default=True,
|
| dest="git_find_copies",
|
| help=("Prevents git from looking for copies (default off)."))
|
| @@ -1010,7 +1009,7 @@ use_shell = sys.platform.startswith("win")
|
| def RunShellWithReturnCodeAndStderr(command, print_output=False,
|
| universal_newlines=True,
|
| env=os.environ):
|
| - """Executes a command and returns the output from stdout, stderr and the return code.
|
| + """Run a command and return output from stdout, stderr and the return code.
|
|
|
| Args:
|
| command: Command to execute.
|
| @@ -1041,7 +1040,7 @@ def RunShellWithReturnCodeAndStderr(command, print_output=False,
|
| p.wait()
|
| errout = p.stderr.read()
|
| if print_output and errout:
|
| - print >>sys.stderr, errout
|
| + print >> sys.stderr, errout
|
| p.stdout.close()
|
| p.stderr.close()
|
| return output, errout, p.returncode
|
| @@ -1049,7 +1048,7 @@ def RunShellWithReturnCodeAndStderr(command, print_output=False,
|
| def RunShellWithReturnCode(command, print_output=False,
|
| universal_newlines=True,
|
| env=os.environ):
|
| - """Executes a command and returns the output from stdout and the return code."""
|
| + """Run a command and return output from stdout and the return code."""
|
| out, err, retcode = RunShellWithReturnCodeAndStderr(command, print_output,
|
| universal_newlines, env)
|
| return out, retcode
|
| @@ -1224,7 +1223,8 @@ class VersionControlSystem(object):
|
| mimetype = mimetypes.guess_type(filename)[0]
|
| if not mimetype:
|
| return False
|
| - return mimetype.startswith("image/") and not mimetype.startswith("image/svg")
|
| + return (mimetype.startswith("image/") and
|
| + not mimetype.startswith("image/svg"))
|
|
|
| def IsBinaryData(self, data):
|
| """Returns true if data contains a null byte."""
|
| @@ -1270,21 +1270,21 @@ class SubversionVCS(VersionControlSystem):
|
| """
|
| url = self._GetInfo("URL")
|
| if url:
|
| - scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
|
| - guess = ""
|
| - # TODO(anatoli) - repository specific hacks should be handled by server
|
| - if netloc == "svn.python.org" and scheme == "svn+ssh":
|
| - path = "projects" + path
|
| - scheme = "http"
|
| - guess = "Python "
|
| - elif netloc.endswith(".googlecode.com"):
|
| - scheme = "http"
|
| - guess = "Google Code "
|
| - path = path + "/"
|
| - base = urlparse.urlunparse((scheme, netloc, path, params,
|
| - query, fragment))
|
| - LOGGER.info("Guessed %sbase = %s", guess, base)
|
| - return base
|
| + scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
|
| + guess = ""
|
| + # TODO(anatoli) - repository specific hacks should be handled by server
|
| + if netloc == "svn.python.org" and scheme == "svn+ssh":
|
| + path = "projects" + path
|
| + scheme = "http"
|
| + guess = "Python "
|
| + elif netloc.endswith(".googlecode.com"):
|
| + scheme = "http"
|
| + guess = "Google Code "
|
| + path = path + "/"
|
| + base = urlparse.urlunparse((scheme, netloc, path, params,
|
| + query, fragment))
|
| + LOGGER.info("Guessed %sbase = %s", guess, base)
|
| + return base
|
| if required:
|
| ErrorExit("Can't find URL in output from svn info")
|
| return None
|
| @@ -1339,9 +1339,10 @@ class SubversionVCS(VersionControlSystem):
|
| }
|
|
|
| def repl(m):
|
| - if m.group(2):
|
| - return "$%s::%s$" % (m.group(1), " " * len(m.group(3)))
|
| - return "$%s$" % m.group(1)
|
| + if m.group(2):
|
| + return "$%s::%s$" % (m.group(1), " " * len(m.group(3)))
|
| + return "$%s$" % m.group(1)
|
| +
|
| keywords = [keyword
|
| for name in keyword_str.split(" ")
|
| for keyword in svn_keywords.get(name, [])]
|
| @@ -1394,7 +1395,8 @@ class SubversionVCS(VersionControlSystem):
|
| if returncode:
|
| # Directory might not yet exist at start revison
|
| # svn: Unable to find repository location for 'abc' in revision nnn
|
| - if re.match('^svn: Unable to find repository location for .+ in revision \d+', err):
|
| + if re.match('^svn: Unable to find repository location '
|
| + 'for .+ in revision \d+', err):
|
| old_files = ()
|
| else:
|
| ErrorExit("Failed to get status for %s:\n%s" % (filename, err))
|
| @@ -1616,16 +1618,18 @@ class GitVCS(VersionControlSystem):
|
| # append a diff (with rename detection), without deletes.
|
| cmd = [
|
| "git", "diff", "--no-color", "--no-ext-diff", "--full-index",
|
| - "--ignore-submodules",
|
| + "--ignore-submodules", "--src-prefix=a/", "--dst-prefix=b/",
|
| ]
|
| diff = RunShell(
|
| cmd + ["--no-renames", "--diff-filter=D"] + extra_args,
|
| env=env, silent_ok=True)
|
| + assert 0 <= self.options.git_similarity <= 100
|
| if self.options.git_find_copies:
|
| - similarity_options = ["--find-copies-harder", "-l100000",
|
| - "-C%s" % self.options.git_similarity ]
|
| + similarity_options = ["-l100000", "-C%d%%" % self.options.git_similarity]
|
| + if self.options.git_find_copies_harder:
|
| + similarity_options.append("--find-copies-harder")
|
| else:
|
| - similarity_options = ["-M%s" % self.options.git_similarity ]
|
| + similarity_options = ["-M%d%%" % self.options.git_similarity ]
|
| diff += RunShell(
|
| cmd + ["--diff-filter=AMCRT"] + similarity_options + extra_args,
|
| env=env, silent_ok=True)
|
| @@ -2086,7 +2090,7 @@ class PerforceVCS(VersionControlSystem):
|
| line_count = len(diffData.file_body.splitlines())
|
| diffData.change_summary = "@@ -0,0 +1"
|
| if line_count > 1:
|
| - diffData.change_summary += ",%d" % line_count
|
| + diffData.change_summary += ",%d" % line_count
|
| diffData.change_summary += " @@"
|
| diffData.prefix = "+"
|
| return diffData
|
|
|