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

Unified Diff: watchlists.py

Issue 118432: Add watchlists to 'gcl upload'... (Closed) Base URL: svn://chrome-svn/chrome/trunk/tools/depot_tools/
Patch Set: '' Created 11 years, 6 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
« no previous file with comments | « gcl.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: watchlists.py
===================================================================
--- watchlists.py (revision 0)
+++ watchlists.py (revision 0)
@@ -0,0 +1,117 @@
+#!/usr/bin/python
+# Copyright (c) 2009 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Watchlists
+
+Watchlists is a mechanism that allow a developer (a "watcher") to watch over
+portions of code that he is interested in. A "watcher" will be cc-ed to
+changes that modify that portion of code, thereby giving him an opportunity
+to make comments on codereview.chromium.org even before the change is
+committed.
+Refer: http://dev.chromium.org/developers/contributing-code/watchlists
+
+When invoked directly from the base of a repository, this script lists out
+the watchers for files given on the command line. This is useful to verify
+changes to WATCHLISTS files.
+"""
+
+import logging
+import os
+import re
+import sys
+
+
+class Watchlists(object):
+ """Manage Watchlists.
+
+ This class provides mechanism to load watchlists for a repo and identify
+ watchers.
+ Usage:
+ wl = Watchlists("/path/to/repo/root")
+ watchers = wl.GetWatchersForPaths(["/path/to/file1",
+ "/path/to/file2",])
+ """
+
+ _RULES = "WATCHLISTS"
+ _RULES_FILENAME = _RULES
+ _repo_root = None
+ _defns = {} # Definitions
+ _watchlists = {} # name to email mapping
+
+ def __init__(self, repo_root):
+ self._repo_root = repo_root
+ self._LoadWatchlistRules()
+
+ def _GetRulesFilePath(self):
+ return os.path.join(self._repo_root, self._RULES_FILENAME)
+
+ def _HasWatchlistsFile(self):
+ """Determine if watchlists are available for this repo."""
+ return os.path.exists(self._GetRulesFilePath())
+
+ def _LoadWatchlistRules(self):
+ if not self._HasWatchlistsFile():
+ return
+ watchlists_file = open(self._GetRulesFilePath())
+ contents = watchlists_file.read()
+ watchlists_file.close()
+
+ watchlists_data = None
+ try:
+ watchlists_data = eval(contents, {'__builtins__': None}, None)
+ except SyntaxError, e:
+ logging.error("Cannot parse %s. %s" % (self._GetRulesFilePath(), e))
+ return
+
+ defns = watchlists_data.get("WATCHLIST_DEFINITIONS")
+ if not defns:
+ logging.error("WATCHLIST_DEFINITIONS not defined in %s" %
+ self._GetRulesFilePath())
+ return
+ watchlists = watchlists_data.get("WATCHLISTS")
+ if not watchlists:
+ logging.error("WATCHLISTS not defined in %s" % self._GetRulesFilePath())
+ return
+ self._defns = defns
+ self._watchlists = watchlists
+
+ # Verify that all watchlist names are defined
+ for name in watchlists:
+ if name not in defns:
+ logging.error("%s not defined in %s" % (name, self._GetRulesFilePath()))
+
+ def GetWatchersForPaths(self, paths):
+ """Fetch the list of watchers for |paths|
+
+ Args:
+ paths: [path1, path2, ...]
+
+ Returns:
+ [u1@chromium.org, u2@gmail.com, ...]
+ """
+ watchers = set() # A set, to avoid duplicates
+ for path in paths:
+ for name, rule in self._defns.iteritems():
+ if name not in self._watchlists: continue
+ rex_str = rule.get('filepath')
+ if not rex_str: continue
+ if re.search(rex_str, path):
+ map(watchers.add, self._watchlists[name])
+ return list(watchers)
+
+
+def main(argv):
+ # Confirm that watchlists can be parsed and spew out the watchers
+ if len(argv) < 2:
+ print "Usage (from the base of repo):"
+ print " %s [file-1] [file-2] ...." % argv[0]
+ return 1
+ wl = Watchlists(os.getcwd())
+ watchers = wl.GetWatchersForPaths(argv[1:])
+ print watchers
+
+
+if __name__ == '__main__':
+ main(sys.argv)
Property changes on: watchlists.py
___________________________________________________________________
Name: svn:executable
+ *
« no previous file with comments | « gcl.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698