Index: trychange.py |
diff --git a/trychange.py b/trychange.py |
index ee5f0eddcddd5725259b09ac71e678231eb3f568..cf3d45929e65d9aa636e5310567b4f0e91285afa 100755 |
--- a/trychange.py |
+++ b/trychange.py |
@@ -8,14 +8,13 @@ to the server by HTTP. |
""" |
import datetime |
+import errno |
import getpass |
import logging |
import optparse |
import os |
import posixpath |
import shutil |
-import socket |
-import subprocess |
import sys |
import tempfile |
import urllib |
@@ -120,7 +119,7 @@ class SCM(object): |
def GclientStyleSettings(self): |
"""Find the root, assuming a gclient-style checkout.""" |
if not self.options.no_gclient and not self.options.root: |
- root = self.GetLocalRoot() |
+ root = self.checkout_root |
gclient_root = gclient_utils.FindGclientRoot(root) |
if gclient_root: |
self.options.root = gclient_utils.PathDifference(gclient_root, root) |
@@ -131,6 +130,9 @@ class SCM(object): |
self.GclStyleSettings() |
self.GclientStyleSettings() |
+ def ReadRootFile(self, filename): |
+ raise NotImplementedError() |
+ |
class SVN(SCM): |
"""Gathers the options and diff for a subversion checkout.""" |
@@ -140,6 +142,7 @@ class SVN(SCM): |
if not self.options.email: |
# Assumes the svn credential is an email address. |
self.options.email = scm.SVN.GetEmail(self.checkout_root) |
+ logging.info("SVN(%s)" % self.checkout_root) |
def ReadRootFile(self, filename): |
try: |
@@ -175,10 +178,6 @@ class SVN(SCM): |
os.chdir(previous_cwd) |
return scm.SVN.GenerateDiff(self.files, self.checkout_root, full_move=True) |
- def GetLocalRoot(self): |
- """Return the path of the repository root.""" |
- return self.checkout_root |
- |
class GIT(SCM): |
"""Gathers the options and diff for a git checkout.""" |
@@ -189,6 +188,7 @@ class GIT(SCM): |
self.options.name = scm.GIT.GetPatchName(self.checkout_root) |
if not self.options.email: |
self.options.email = scm.GIT.GetEmail(self.checkout_root) |
+ logging.info("GIT(%s)" % self.checkout_root) |
def ReadRootFile(self, filename): |
try: |
@@ -200,10 +200,6 @@ class GIT(SCM): |
logging.debug('%s:\nNone' % filename) |
return None |
- def GetLocalRoot(self): |
- """Return the path of the repository root.""" |
- return self.checkout_root |
- |
def GenerateDiff(self): |
# For now, ignores self.files |
return scm.GIT.GenerateDiff(self.checkout_root, full_move=True) |
@@ -355,13 +351,13 @@ def PrintSuccess(options): |
print(text) |
-def GuessVCS(options, cwd): |
+def GuessVCS(options, path): |
"""Helper to guess the version control system. |
NOTE: Very similar to upload.GuessVCS. Doesn't look for hg since we don't |
support it yet. |
- This examines the current directory, guesses which SCM we're using, and |
+ This examines the path directory, guesses which SCM we're using, and |
returns an instance of the appropriate class. Exit with an error if we can't |
figure it out. |
@@ -369,19 +365,22 @@ def GuessVCS(options, cwd): |
A SCM instance. Exits if the SCM can't be guessed. |
""" |
__pychecker__ = 'no-returnvalues' |
+ logging.info("GuessVCS(%s)" % path) |
# Subversion has a .svn in all working directories. |
- if os.path.isdir(os.path.join(cwd, '.svn')): |
- logging.info("GuessVCS(%s) = Subversion" % cwd) |
- return SVN(options, cwd) |
+ if os.path.isdir(os.path.join(path, '.svn')): |
+ return SVN(options, path) |
# Git has a command to test if you're in a git tree. |
# Try running it, but don't die if we don't have git installed. |
try: |
- gclient_utils.CheckCall(["git", "rev-parse", "--is-inside-work-tree"], cwd) |
- logging.info("GuessVCS(%s) = Git" % cwd) |
- return GIT(options, cwd) |
+ gclient_utils.CheckCall(["git", "rev-parse", "--is-inside-work-tree"], |
+ path) |
+ return GIT(options, path) |
except gclient_utils.CheckCallError, e: |
- if e.retcode != 2: # ENOENT -- they don't have git installed. |
+ if e.retcode != errno.ENOENT and e.retcode != 128: |
+ # ENOENT == 2 = they don't have git installed. |
+ # 128 = git error code when not in a repo. |
+ logging.warn(e.retcode) |
raise |
raise NoTryServerAccess("Could not guess version control system. " |
"Are you in a working copy directory?") |
@@ -461,9 +460,9 @@ def TryChange(argv, |
group.add_option("--root", |
help="Root to use for the patch; base subdirectory for " |
"patch created in a subdirectory") |
- group.add_option("--patchlevel", type='int', metavar="LEVEL", |
+ group.add_option("-p", "--patchlevel", type='int', metavar="LEVEL", |
help="Used as -pN parameter to patch") |
- group.add_option("--sub_rep", action="append", default=[], |
+ group.add_option("-s", "--sub_rep", action="append", default=[], |
help="Subcheckout to use in addition. This is mainly " |
"useful for gclient-style checkouts.") |
group.add_option("--no_gclient", action="store_true", |
@@ -476,9 +475,9 @@ def TryChange(argv, |
const=_SendChangeHTTP, |
dest="send_patch", |
help="Use HTTP to talk to the try server [default]") |
- group.add_option("--host", |
+ group.add_option("-H", "--host", |
help="Host address") |
- group.add_option("--port", |
+ group.add_option("-P", "--port", |
help="HTTP port") |
group.add_option("--proxy", |
help="HTTP proxy") |
@@ -490,7 +489,7 @@ def TryChange(argv, |
const=_SendChangeSVN, |
dest="send_patch", |
help="Use SVN to talk to the try server") |
- group.add_option("--svn_repo", |
+ group.add_option("-S", "--svn_repo", |
metavar="SVN_URL", |
help="SVN url to use to write the changes in; --use_svn is " |
"implied when using --svn_repo") |
@@ -500,14 +499,15 @@ def TryChange(argv, |
if len(args) == 1 and args[0] == 'help': |
parser.print_help() |
- if options.verbose == 0: |
- logging.basicConfig(level=logging.ERROR) |
- elif options.verbose == 1: |
- logging.basicConfig(level=logging.WARNING) |
- elif options.verbose == 2: |
- logging.basicConfig(level=logging.INFO) |
- elif options.verbose > 2: |
- logging.basicConfig(level=logging.DEBUG) |
+ if not swallow_exception: |
+ if options.verbose == 0: |
+ logging.basicConfig(level=logging.ERROR) |
+ elif options.verbose == 1: |
+ logging.basicConfig(level=logging.WARNING) |
+ elif options.verbose == 2: |
+ logging.basicConfig(level=logging.INFO) |
+ elif options.verbose > 2: |
+ logging.basicConfig(level=logging.DEBUG) |
try: |
# Always include os.getcwd() in the checkout settings. |
@@ -515,10 +515,11 @@ def TryChange(argv, |
checkouts.append(GuessVCS(options, os.getcwd())) |
checkouts[0].AutomagicalSettings() |
for item in options.sub_rep: |
- checkout = GuessVCS(options, item) |
- if checkout.GetLocalRoot() in [c.GetLocalRoot() for c in checkouts]: |
+ checkout = GuessVCS(options, os.path.join(checkouts[0].checkout_root, |
+ item)) |
+ if checkout.checkout_root in [c.checkout_root for c in checkouts]: |
parser.error('Specified the root %s two times.' % |
- checkout.GetLocalRoot()) |
+ checkout.checkout_root) |
checkouts.append(checkout) |
can_http = options.port and options.host |
@@ -539,12 +540,12 @@ def TryChange(argv, |
options.diff = gclient_utils.FileRead(options.diff, 'rb') |
else: |
# Use this as the base. |
- root = checkouts[0].GetLocalRoot() |
+ root = checkouts[0].checkout_root |
diffs = [] |
for checkout in checkouts: |
diff = checkout.GenerateDiff().splitlines(True) |
# Munge it. |
- path_diff = gclient_utils.PathDifference(root, checkout.GetLocalRoot()) |
+ path_diff = gclient_utils.PathDifference(root, checkout.checkout_root) |
for i in range(len(diff)): |
if diff[i].startswith('--- ') or diff[i].startswith('+++ '): |
diff[i] = diff[i][0:4] + posixpath.join(path_diff, diff[i][4:]) |
@@ -560,7 +561,7 @@ def TryChange(argv, |
root_presubmit = checkouts[0].ReadRootFile('PRESUBMIT.py') |
options.bot = presubmit_support.DoGetTrySlaves( |
checkouts[0].GetFileNames(), |
- checkouts[0].GetLocalRoot(), |
+ checkouts[0].checkout_root, |
root_presubmit, |
False, |
sys.stdout) |