diff --git a/.pylintrc b/.pylintrc index 9f81ee15..72dccd7d 100644 --- a/.pylintrc +++ b/.pylintrc @@ -53,7 +53,7 @@ load-plugins= enable=RP0004 # Disable the message(s) with the given id(s). -disable=R0903,R0912,R0913,R0914,R0915,W0141,C0111,C0103,C0323,C0322,C0324,W0603,W0703,R0911,C0301,C0302,R0902,R0904,W0142,W0212,E1101,E1103,R0201,W0201,W0122,W0232,W0311,RP0001,RP0003,RP0101,RP0002,RP0401,RP0701,RP0801 +disable=R0903,R0912,R0913,R0914,R0915,W0141,C0111,C0103,C0323,C0322,C0324,W0603,W0703,R0911,C0301,C0302,R0902,R0904,W0142,W0212,E1101,E1103,R0201,W0201,W0122,W0232,RP0001,RP0003,RP0101,RP0002,RP0401,RP0701,RP0801 [REPORTS] diff --git a/color.py b/color.py index 33bc8779..d856313f 100644 --- a/color.py +++ b/color.py @@ -40,47 +40,47 @@ RESET = "\033[m" # pylint: disable=W1401 # backslash is not anomalous def is_color(s): - return s in COLORS + return s in COLORS def is_attr(s): - return s in ATTRS + return s in ATTRS def _Color(fg = None, bg = None, attr = None): - fg = COLORS[fg] - bg = COLORS[bg] - attr = ATTRS[attr] + fg = COLORS[fg] + bg = COLORS[bg] + attr = ATTRS[attr] - if attr >= 0 or fg >= 0 or bg >= 0: - need_sep = False - code = "\033[" #pylint: disable=W1401 + if attr >= 0 or fg >= 0 or bg >= 0: + need_sep = False + code = "\033[" #pylint: disable=W1401 - if attr >= 0: - code += chr(ord('0') + attr) - need_sep = True + if attr >= 0: + code += chr(ord('0') + attr) + need_sep = True - if fg >= 0: - if need_sep: - code += ';' - need_sep = True + if fg >= 0: + if need_sep: + code += ';' + need_sep = True - if fg < 8: - code += '3%c' % (ord('0') + fg) - else: - code += '38;5;%d' % fg + if fg < 8: + code += '3%c' % (ord('0') + fg) + else: + code += '38;5;%d' % fg - if bg >= 0: - if need_sep: - code += ';' - need_sep = True + if bg >= 0: + if need_sep: + code += ';' + need_sep = True - if bg < 8: - code += '4%c' % (ord('0') + bg) - else: - code += '48;5;%d' % bg - code += 'm' - else: - code = '' - return code + if bg < 8: + code += '4%c' % (ord('0') + bg) + else: + code += '48;5;%d' % bg + code += 'm' + else: + code = '' + return code class Coloring(object): diff --git a/git_config.py b/git_config.py index 6bb92003..108438f6 100644 --- a/git_config.py +++ b/git_config.py @@ -303,10 +303,10 @@ class GitConfig(object): for line in d.rstrip('\0').split('\0'): # pylint: disable=W1401 # Backslash is not anomalous if '\n' in line: - key, val = line.split('\n', 1) + key, val = line.split('\n', 1) else: - key = line - val = None + key = line + val = None if key in c: c[key].append(val) diff --git a/main.py b/main.py index 87e9c349..b5259870 100755 --- a/main.py +++ b/main.py @@ -275,17 +275,17 @@ class _UserAgentHandler(urllib.request.BaseHandler): return req def _AddPasswordFromUserInput(handler, msg, req): - # If repo could not find auth info from netrc, try to get it from user input - url = req.get_full_url() - user, password = handler.passwd.find_user_password(None, url) - if user is None: - print(msg) - try: - user = raw_input('User: ') - password = getpass.getpass() - except KeyboardInterrupt: - return - handler.passwd.add_password(None, url, user, password) + # If repo could not find auth info from netrc, try to get it from user input + url = req.get_full_url() + user, password = handler.passwd.find_user_password(None, url) + if user is None: + print(msg) + try: + user = raw_input('User: ') + password = getpass.getpass() + except KeyboardInterrupt: + return + handler.passwd.add_password(None, url, user, password) class _BasicAuthHandler(urllib.request.HTTPBasicAuthHandler): def http_error_401(self, req, fp, code, msg, headers): diff --git a/manifest_xml.py b/manifest_xml.py index bb93bca3..1b954561 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -67,7 +67,7 @@ class _XmlRemote(object): # urljoin will get confused if there is no scheme in the base url # ie, if manifestUrl is of the form if manifestUrl.find(':') != manifestUrl.find('/') - 1: - manifestUrl = 'gopher://' + manifestUrl + manifestUrl = 'gopher://' + manifestUrl url = urlparse.urljoin(manifestUrl, url) return re.sub(r'^gopher://', '', url) @@ -349,24 +349,24 @@ class XmlManifest(object): nodes = [] for node in manifest.childNodes: # pylint:disable=W0631 # We only get here if manifest is initialised - if node.nodeName == 'include': - name = self._reqatt(node, 'name') - fp = os.path.join(include_root, name) - if not os.path.isfile(fp): - raise ManifestParseError, \ - "include %s doesn't exist or isn't a file" % \ - (name,) - try: - nodes.extend(self._ParseManifestXml(fp, include_root)) - # should isolate this to the exact exception, but that's - # tricky. actual parsing implementation may vary. - except (KeyboardInterrupt, RuntimeError, SystemExit): - raise - except Exception as e: - raise ManifestParseError( - "failed parsing included manifest %s: %s", (name, e)) - else: - nodes.append(node) + if node.nodeName == 'include': + name = self._reqatt(node, 'name') + fp = os.path.join(include_root, name) + if not os.path.isfile(fp): + raise ManifestParseError, \ + "include %s doesn't exist or isn't a file" % \ + (name,) + try: + nodes.extend(self._ParseManifestXml(fp, include_root)) + # should isolate this to the exact exception, but that's + # tricky. actual parsing implementation may vary. + except (KeyboardInterrupt, RuntimeError, SystemExit): + raise + except Exception as e: + raise ManifestParseError( + "failed parsing included manifest %s: %s", (name, e)) + else: + nodes.append(node) return nodes def _ParseManifest(self, node_list): @@ -404,9 +404,9 @@ class XmlManifest(object): if node.nodeName == 'manifest-server': url = self._reqatt(node, 'url') if self._manifest_server is not None: - raise ManifestParseError( - 'duplicate manifest-server in %s' % - (self.manifestFile)) + raise ManifestParseError( + 'duplicate manifest-server in %s' % + (self.manifestFile)) self._manifest_server = url for node in itertools.chain(*node_list): diff --git a/project.py b/project.py index 22ac9efd..6507241c 100644 --- a/project.py +++ b/project.py @@ -585,14 +585,14 @@ class Project(object): return self._userident_email def _LoadUserIdentity(self): - u = self.bare_git.var('GIT_COMMITTER_IDENT') - m = re.compile("^(.*) <([^>]*)> ").match(u) - if m: - self._userident_name = m.group(1) - self._userident_email = m.group(2) - else: - self._userident_name = '' - self._userident_email = '' + u = self.bare_git.var('GIT_COMMITTER_IDENT') + m = re.compile("^(.*) <([^>]*)> ").match(u) + if m: + self._userident_name = m.group(1) + self._userident_email = m.group(2) + else: + self._userident_name = '' + self._userident_email = '' def GetRemote(self, name): """Get the configuration for a single remote. @@ -1381,14 +1381,14 @@ class Project(object): tag_name = None def CheckForSha1(): - try: - # if revision (sha or tag) is not present then following function - # throws an error. - self.bare_git.rev_parse('--verify', '%s^0' % self.revisionExpr) - return True - except GitError: - # There is no such persistent revision. We have to fetch it. - return False + try: + # if revision (sha or tag) is not present then following function + # throws an error. + self.bare_git.rev_parse('--verify', '%s^0' % self.revisionExpr) + return True + except GitError: + # There is no such persistent revision. We have to fetch it. + return False if current_branch_only: if ID_RE.match(self.revisionExpr) is not None: diff --git a/subcmds/sync.py b/subcmds/sync.py index a64f2c45..df64ab09 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py @@ -197,62 +197,62 @@ later is required to fix a server side protocol bug. help=SUPPRESS_HELP) def _FetchHelper(self, opt, project, lock, fetched, pm, sem, err_event): - """Main function of the fetch threads when jobs are > 1. + """Main function of the fetch threads when jobs are > 1. - Args: - opt: Program options returned from optparse. See _Options(). - project: Project object for the project to fetch. - lock: Lock for accessing objects that are shared amongst multiple - _FetchHelper() threads. - fetched: set object that we will add project.gitdir to when we're done - (with our lock held). - pm: Instance of a Project object. We will call pm.update() (with our - lock held). - sem: We'll release() this semaphore when we exit so that another thread - can be started up. - err_event: We'll set this event in the case of an error (after printing - out info about the error). - """ - # We'll set to true once we've locked the lock. - did_lock = False + Args: + opt: Program options returned from optparse. See _Options(). + project: Project object for the project to fetch. + lock: Lock for accessing objects that are shared amongst multiple + _FetchHelper() threads. + fetched: set object that we will add project.gitdir to when we're done + (with our lock held). + pm: Instance of a Project object. We will call pm.update() (with our + lock held). + sem: We'll release() this semaphore when we exit so that another thread + can be started up. + err_event: We'll set this event in the case of an error (after printing + out info about the error). + """ + # We'll set to true once we've locked the lock. + did_lock = False - # Encapsulate everything in a try/except/finally so that: - # - We always set err_event in the case of an exception. - # - We always make sure we call sem.release(). - # - We always make sure we unlock the lock if we locked it. + # Encapsulate everything in a try/except/finally so that: + # - We always set err_event in the case of an exception. + # - We always make sure we call sem.release(). + # - We always make sure we unlock the lock if we locked it. + try: try: - try: - start = time.time() - success = project.Sync_NetworkHalf( - quiet=opt.quiet, - current_branch_only=opt.current_branch_only, - clone_bundle=not opt.no_clone_bundle) - self._fetch_times.Set(project, time.time() - start) + start = time.time() + success = project.Sync_NetworkHalf( + quiet=opt.quiet, + current_branch_only=opt.current_branch_only, + clone_bundle=not opt.no_clone_bundle) + self._fetch_times.Set(project, time.time() - start) - # Lock around all the rest of the code, since printing, updating a set - # and Progress.update() are not thread safe. - lock.acquire() - did_lock = True + # Lock around all the rest of the code, since printing, updating a set + # and Progress.update() are not thread safe. + lock.acquire() + did_lock = True - if not success: - print('error: Cannot fetch %s' % project.name, file=sys.stderr) - if opt.force_broken: - print('warn: --force-broken, continuing to sync', - file=sys.stderr) - else: - raise _FetchError() + if not success: + print('error: Cannot fetch %s' % project.name, file=sys.stderr) + if opt.force_broken: + print('warn: --force-broken, continuing to sync', + file=sys.stderr) + else: + raise _FetchError() - fetched.add(project.gitdir) - pm.update() - except _FetchError: - err_event.set() - except: - err_event.set() - raise - finally: - if did_lock: - lock.release() - sem.release() + fetched.add(project.gitdir) + pm.update() + except _FetchError: + err_event.set() + except: + err_event.set() + raise + finally: + if did_lock: + lock.release() + sem.release() def _Fetch(self, projects, opt): fetched = set() @@ -379,36 +379,36 @@ later is required to fix a server side protocol bug. if path not in new_project_paths: # If the path has already been deleted, we don't need to do it if os.path.exists(self.manifest.topdir + '/' + path): - project = Project( - manifest = self.manifest, - name = path, - remote = RemoteSpec('origin'), - gitdir = os.path.join(self.manifest.topdir, - path, '.git'), - worktree = os.path.join(self.manifest.topdir, path), - relpath = path, - revisionExpr = 'HEAD', - revisionId = None, - groups = None) + project = Project( + manifest = self.manifest, + name = path, + remote = RemoteSpec('origin'), + gitdir = os.path.join(self.manifest.topdir, + path, '.git'), + worktree = os.path.join(self.manifest.topdir, path), + relpath = path, + revisionExpr = 'HEAD', + revisionId = None, + groups = None) - if project.IsDirty(): - print('error: Cannot remove project "%s": uncommitted changes' - 'are present' % project.relpath, file=sys.stderr) - print(' commit changes, then run sync again', - file=sys.stderr) - return -1 - else: - print('Deleting obsolete path %s' % project.worktree, - file=sys.stderr) - shutil.rmtree(project.worktree) - # Try deleting parent subdirs if they are empty - project_dir = os.path.dirname(project.worktree) - while project_dir != self.manifest.topdir: - try: - os.rmdir(project_dir) - except OSError: - break - project_dir = os.path.dirname(project_dir) + if project.IsDirty(): + print('error: Cannot remove project "%s": uncommitted changes' + 'are present' % project.relpath, file=sys.stderr) + print(' commit changes, then run sync again', + file=sys.stderr) + return -1 + else: + print('Deleting obsolete path %s' % project.worktree, + file=sys.stderr) + shutil.rmtree(project.worktree) + # Try deleting parent subdirs if they are empty + project_dir = os.path.dirname(project.worktree) + while project_dir != self.manifest.topdir: + try: + os.rmdir(project_dir) + except OSError: + break + project_dir = os.path.dirname(project_dir) new_project_paths.sort() fd = open(file_path, 'w') diff --git a/subcmds/upload.py b/subcmds/upload.py index a6ada337..219c5093 100644 --- a/subcmds/upload.py +++ b/subcmds/upload.py @@ -312,23 +312,23 @@ Gerrit Code Review: http://code.google.com/p/gerrit/ # Check if there are local changes that may have been forgotten if branch.project.HasChanges(): - key = 'review.%s.autoupload' % branch.project.remote.review - answer = branch.project.config.GetBoolean(key) + key = 'review.%s.autoupload' % branch.project.remote.review + answer = branch.project.config.GetBoolean(key) - # if they want to auto upload, let's not ask because it could be automated - if answer is None: - sys.stdout.write('Uncommitted changes in ' + branch.project.name + ' (did you forget to amend?). Continue uploading? (y/N) ') - a = sys.stdin.readline().strip().lower() - if a not in ('y', 'yes', 't', 'true', 'on'): - print("skipping upload", file=sys.stderr) - branch.uploaded = False - branch.error = 'User aborted' - continue + # if they want to auto upload, let's not ask because it could be automated + if answer is None: + sys.stdout.write('Uncommitted changes in ' + branch.project.name + ' (did you forget to amend?). Continue uploading? (y/N) ') + a = sys.stdin.readline().strip().lower() + if a not in ('y', 'yes', 't', 'true', 'on'): + print("skipping upload", file=sys.stderr) + branch.uploaded = False + branch.error = 'User aborted' + continue # Check if topic branches should be sent to the server during upload if opt.auto_topic is not True: - key = 'review.%s.uploadtopic' % branch.project.remote.review - opt.auto_topic = branch.project.config.GetBoolean(key) + key = 'review.%s.uploadtopic' % branch.project.remote.review + opt.auto_topic = branch.project.config.GetBoolean(key) branch.UploadForReview(people, auto_topic=opt.auto_topic, draft=opt.draft) branch.uploaded = True @@ -355,11 +355,11 @@ Gerrit Code Review: http://code.google.com/p/gerrit/ print() for branch in todo: - if branch.uploaded: - print('[OK ] %-15s %s' % ( - branch.project.relpath + '/', - branch.name), - file=sys.stderr) + if branch.uploaded: + print('[OK ] %-15s %s' % ( + branch.project.relpath + '/', + branch.name), + file=sys.stderr) if have_errors: sys.exit(1) diff --git a/tests/test_git_config.py b/tests/test_git_config.py index 5b1770e7..3d4b9970 100644 --- a/tests/test_git_config.py +++ b/tests/test_git_config.py @@ -4,49 +4,49 @@ import unittest import git_config def fixture(*paths): - """Return a path relative to test/fixtures. - """ - return os.path.join(os.path.dirname(__file__), 'fixtures', *paths) + """Return a path relative to test/fixtures. + """ + return os.path.join(os.path.dirname(__file__), 'fixtures', *paths) class GitConfigUnitTest(unittest.TestCase): - """Tests the GitConfig class. + """Tests the GitConfig class. + """ + def setUp(self): + """Create a GitConfig object using the test.gitconfig fixture. """ - def setUp(self): - """Create a GitConfig object using the test.gitconfig fixture. - """ - config_fixture = fixture('test.gitconfig') - self.config = git_config.GitConfig(config_fixture) + config_fixture = fixture('test.gitconfig') + self.config = git_config.GitConfig(config_fixture) - def test_GetString_with_empty_config_values(self): - """ - Test config entries with no value. + def test_GetString_with_empty_config_values(self): + """ + Test config entries with no value. - [section] - empty + [section] + empty - """ - val = self.config.GetString('section.empty') - self.assertEqual(val, None) + """ + val = self.config.GetString('section.empty') + self.assertEqual(val, None) - def test_GetString_with_true_value(self): - """ - Test config entries with a string value. + def test_GetString_with_true_value(self): + """ + Test config entries with a string value. - [section] - nonempty = true + [section] + nonempty = true - """ - val = self.config.GetString('section.nonempty') - self.assertEqual(val, 'true') + """ + val = self.config.GetString('section.nonempty') + self.assertEqual(val, 'true') - def test_GetString_from_missing_file(self): - """ - Test missing config file - """ - config_fixture = fixture('not.present.gitconfig') - config = git_config.GitConfig(config_fixture) - val = config.GetString('empty') - self.assertEqual(val, None) + def test_GetString_from_missing_file(self): + """ + Test missing config file + """ + config_fixture = fixture('not.present.gitconfig') + config = git_config.GitConfig(config_fixture) + val = config.GetString('empty') + self.assertEqual(val, None) if __name__ == '__main__': - unittest.main() + unittest.main()