Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Unified Diff: scm.py

Issue 3307016: Change scm.SVN.Capture (Closed)
Patch Set: patchset 4 was wrong Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: scm.py
diff --git a/scm.py b/scm.py
index 9cbcc35d49037d884d0ef08d2f60f0ca3f921e98..fadf7f3bedc46c623490ca974cc57538453945dc 100644
--- a/scm.py
+++ b/scm.py
@@ -306,21 +306,12 @@ class SVN(object):
current_version = None
@staticmethod
- def Capture(args, in_directory=None, print_error=True):
- """Runs svn, capturing output sent to stdout as a string.
+ def Capture(args, **kwargs):
+ """Always redirect stderr.
- Args:
- args: A sequence of command line parameters to be passed to svn.
- in_directory: The directory where svn is to be run.
-
- Returns:
- The output sent to stdout as a string.
- """
- stderr = None
- if not print_error:
- stderr = subprocess.PIPE
- return gclient_utils.Popen(['svn'] + args, cwd=in_directory,
- stdout=subprocess.PIPE, stderr=stderr).communicate()[0]
+ Throws an exception if non-0 is returned."""
+ return gclient_utils.CheckCall(['svn'] + args, print_error=False,
+ **kwargs)[0]
@staticmethod
def RunAndGetFileList(verbose, args, cwd, file_list, stdout=None):
@@ -425,15 +416,11 @@ class SVN(object):
break
@staticmethod
- def CaptureInfo(relpath, in_directory=None, print_error=True):
+ def CaptureInfo(cwd):
"""Returns a dictionary from the svn info output for the given file.
- Args:
- relpath: The directory where the working copy resides relative to
- the directory given by in_directory.
- in_directory: The directory where svn is to be run.
- """
- output = SVN.Capture(["info", "--xml", relpath], in_directory, print_error)
+ Throws an exception if svn info fails."""
+ output = SVN.Capture(['info', '--xml', cwd])
dom = gclient_utils.ParseXML(output)
result = {}
if dom:
@@ -468,24 +455,13 @@ class SVN(object):
return result
@staticmethod
- def CaptureHeadRevision(url):
- """Get the head revision of a SVN repository.
-
- Returns:
- Int head revision
- """
- info = SVN.Capture(["info", "--xml", url], os.getcwd())
- dom = xml.dom.minidom.parseString(info)
- return dom.getElementsByTagName('entry')[0].getAttribute('revision')
-
- @staticmethod
- def CaptureBaseRevision(cwd):
+ def CaptureRevision(cwd):
"""Get the base revision of a SVN repository.
Returns:
Int base revision
"""
- info = SVN.Capture(["info", "--xml"], cwd)
+ info = SVN.Capture(['info', '--xml'], cwd=cwd)
dom = xml.dom.minidom.parseString(info)
return dom.getElementsByTagName('entry')[0].getAttribute('revision')
@@ -539,8 +515,9 @@ class SVN(object):
if xml_item_status in status_letter:
statuses[0] = status_letter[xml_item_status]
else:
- raise Exception('Unknown item status "%s"; please implement me!' %
- xml_item_status)
+ raise gclient_utils.Error(
+ 'Unknown item status "%s"; please implement me!' %
+ xml_item_status)
# Col 1
xml_props_status = wc_status[0].getAttribute('props')
if xml_props_status == 'modified':
@@ -551,8 +528,9 @@ class SVN(object):
xml_props_status == 'normal'):
pass
else:
- raise Exception('Unknown props status "%s"; please implement me!' %
- xml_props_status)
+ raise gclient_utils.Error(
+ 'Unknown props status "%s"; please implement me!' %
+ xml_props_status)
# Col 2
if wc_status[0].getAttribute('wc-locked') == 'true':
statuses[2] = 'L'
@@ -592,12 +570,10 @@ class SVN(object):
is not set on the file. If the file is not under version control, the
empty string is also returned.
"""
- output = SVN.Capture(["propget", property_name, filename])
- if (output.startswith("svn: ") and
- output.endswith("is not under version control")):
- return ""
- else:
- return output
+ try:
+ return SVN.Capture(['propget', property_name, filename])
+ except gclient_utils.Error:
+ return ''
@staticmethod
def DiffItem(filename, full_move=False, revision=None):
@@ -662,7 +638,7 @@ class SVN(object):
else:
if info.get("Node Kind") != "directory":
# svn diff on a mv/cp'd file outputs nothing if there was no change.
- data = SVN.Capture(command, None)
+ data = SVN.Capture(command)
if not data:
# We put in an empty Index entry so upload.py knows about them.
data = "Index: %s\n" % filename.replace(os.sep, '/')
@@ -670,7 +646,7 @@ class SVN(object):
else:
if info.get("Node Kind") != "directory":
# Normal simple case.
- data = SVN.Capture(command, None)
+ data = SVN.Capture(command)
# Otherwise silently ignore directories.
return data
@@ -761,14 +737,15 @@ class SVN(object):
@staticmethod
def GetEmail(repo_root):
"""Retrieves the svn account which we assume is an email address."""
- infos = SVN.CaptureInfo(repo_root)
- uuid = infos.get('UUID')
- root = infos.get('Repository Root')
- if not root:
+ try:
+ infos = SVN.CaptureInfo(repo_root)
+ except gclient_utils.Error:
return None
# Should check for uuid but it is incorrectly saved for https creds.
+ root = infos['Repository Root']
realm = root.rsplit('/', 1)[0]
+ uuid = infos['UUID']
if root.startswith('https') or not uuid:
regexp = re.compile(r'<%s:\d+>.*' % realm)
else:
@@ -820,15 +797,16 @@ class SVN(object):
The directory is returned as an absolute path.
"""
directory = os.path.abspath(directory)
- infos = SVN.CaptureInfo(directory, print_error=False)
- cur_dir_repo_root = infos.get("Repository Root")
- if not cur_dir_repo_root:
+ try:
+ cur_dir_repo_root = SVN.CaptureInfo(directory)['Repository Root']
+ except gclient_utils.Error:
return None
-
while True:
parent = os.path.dirname(directory)
- if (SVN.CaptureInfo(parent, print_error=False).get(
- "Repository Root") != cur_dir_repo_root):
+ try:
+ if SVN.CaptureInfo(parent)['Repository Root'] != cur_dir_repo_root:
+ break
+ except gclient_utils.Error:
break
directory = parent
return GetCasedPath(directory)
« no previous file with comments | « gclient_scm.py ('k') | tests/gclient_scm_test.py » ('j') | tests/gclient_scm_test.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698