Index: trychange.py |
=================================================================== |
--- trychange.py (revision 104320) |
+++ trychange.py (working copy) |
@@ -91,12 +91,26 @@ |
return re.sub(r'[^\w#-]', '_', name) |
+def _FindRepoCheckoutRoot(path): |
+ """Returns the nearest higher-level repo dir from the specified path. |
+ |
+ Args: |
+ path: The path to use. Defaults to cwd. |
+ """ |
+ path = os.path.abspath(path) |
+ while path != '/': |
M-A Ruel
2011/10/10 18:16:06
I'd like it to be windows-compatible, so I'd use s
rcui1
2011/10/11 19:42:34
Done.
|
+ if os.path.isdir(os.path.join(path, '.repo')): |
+ return path |
+ path = os.path.dirname(path) |
+ return None |
+ |
+ |
class SCM(object): |
"""Simplistic base class to implement one function: ProcessOptions.""" |
def __init__(self, options, path, file_list): |
items = path.split('@') |
assert len(items) <= 2 |
- self.checkout_root = items[0] |
+ self.checkout_root = os.path.abspath(items[0]) |
items.append(None) |
self.diff_against = items[1] |
self.options = options |
@@ -109,7 +123,7 @@ |
self.options.files = None |
self.codereview_settings = None |
self.codereview_settings_file = 'codereview.settings' |
- self.gclient_root = None |
+ self.toplevel_root = None |
def GetFileNames(self): |
"""Return the list of files in the diff.""" |
@@ -152,36 +166,37 @@ |
if v and getattr(self.options, k) is None: |
setattr(self.options, k, v) |
- def _GclientStyleSettings(self): |
- """Find the root, assuming a gclient-style checkout.""" |
- if not self.options.no_gclient and not self.options.root: |
- root = self.checkout_root |
- self.gclient_root = gclient_utils.FindGclientRoot(root) |
- if self.gclient_root: |
- logging.info('Found .gclient at %s' % self.gclient_root) |
- self.options.root = gclient_utils.PathDifference(self.gclient_root, |
- root) |
- |
def AutomagicalSettings(self): |
"""Determines settings based on supported code review and checkout tools. |
""" |
- self._GclientStyleSettings() |
+ # If user did not provide toplevel root, try to find gclient root first. |
+ if not self.toplevel_root and not self.options.no_gclient: |
+ self.toplevel_root = gclient_utils.FindGclientRoot(self.checkout_root) |
+ if self.toplevel_root: |
+ logging.info('Found .gclient at %s' % self.toplevel_root) |
M-A Ruel
2011/10/10 18:16:06
If you want, add:
assert os.path.abspath(self.topl
rcui1
2011/10/11 19:42:34
Done.
|
+ |
+ # If still no toplevel root found, try to find repo-managed chromium root |
+ if not self.toplevel_root: |
+ repo_root = _FindRepoCheckoutRoot(self.checkout_root) |
+ if repo_root: |
+ chromium_root = os.path.join(repo_root, |
M-A Ruel
2011/10/10 18:16:06
weird alignment, also I've refrained from hardcodi
rcui1
2011/10/11 19:42:34
Done.
|
+ 'chromium') |
+ if self.checkout_root.startswith(chromium_root): |
+ self.toplevel_root = chromium_root |
+ logging.info('Found chromium checkout root at %s' |
+ % self.toplevel_root) |
+ |
+ if self.toplevel_root and not self.options.root: |
+ self.options.root = gclient_utils.PathDifference(self.toplevel_root, |
+ self.checkout_root) |
+ |
self._GclStyleSettings() |
def ReadRootFile(self, filename): |
- if not self.options.root: |
- filepath = os.path.join(self.checkout_root, filename) |
- if os.path.isfile(filepath): |
- logging.info('Found %s at %s' % (filename, self.checkout_root)) |
- return gclient_utils.FileRead(filepath) |
- return None |
- cur = os.path.abspath(self.checkout_root) |
- if self.gclient_root: |
- root = os.path.abspath(self.gclient_root) |
- else: |
- root = gclient_utils.FindGclientRoot(cur) |
- if not root: |
- root = cur |
+ root = cur = os.path.abspath(self.checkout_root) |
M-A Ruel
2011/10/10 18:16:06
self.checkout_root is guaranteed to be abspath so
rcui1
2011/10/11 19:42:34
Done.
|
+ if self.toplevel_root: |
+ root = os.path.abspath(self.toplevel_root) |
M-A Ruel
2011/10/10 18:16:06
If you also abspath toplevel_root, then you can do
rcui1
2011/10/11 19:42:34
I think the logic is pretty clear as it is.
On 20
|
+ |
assert cur.startswith(root), (root, cur) |
while cur.startswith(root): |
filepath = os.path.join(cur, filename) |
@@ -319,6 +334,7 @@ |
values['target'] = options.target |
if options.project: |
values['project'] = options.project |
+ |
M-A Ruel
2011/10/10 18:16:06
bof, I'd revert this line
rcui1
2011/10/11 19:42:34
Done.
|
return values |