From b73de8bdb18a2066a36d650cb34a035fd3e837da Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Apr 21 2017 07:51:46 +0000 Subject: [PATCH 1/2] Improve the logging situation Place a logging configuration dictionary in pagure's configuration file, use module specific logger and drop the use of the logger object shared between modules. Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/__init__.py b/pagure/__init__.py index fcb673c..42a5012 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -18,6 +18,7 @@ __api_version__ = '0.12' import datetime # noqa: E402 import logging # noqa: E402 +import logging.config # noqa: E402 import os # noqa: E402 import re # noqa: E402 import urlparse # noqa: E402 @@ -38,7 +39,7 @@ else: import pagure.exceptions # noqa: E402 # Create the application. -APP = MultiStaticFlask(__name__) +APP = MultiStaticFlask('pagure') if perfrepo: # Do this as early as possible. @@ -55,6 +56,8 @@ APP.config.from_object('pagure.default_config') if 'PAGURE_CONFIG' in os.environ: APP.config.from_envvar('PAGURE_CONFIG') +logging.config.dictConfig(APP.config.get('LOGGING') or {'version': 1}) + if APP.config.get('THEME_TEMPLATE_FOLDER', False): # Jinja can be told to look for templates in different folders @@ -145,7 +148,7 @@ if APP.config.get('PAGURE_AUTH', None) in ['fas', 'openid']: is_admin=is_admin(), ) except pagure.exceptions.PagureException as err: - LOG.debug(err) + APP.logger.debug(err) # Remove the old groups for group in groups - fas_groups: try: @@ -158,13 +161,12 @@ if APP.config.get('PAGURE_AUTH', None) in ['fas', 'openid']: force=True, ) except pagure.exceptions.PagureException as err: - LOG.debug(err) + APP.logger.debug(err) SESSION.commit() except SQLAlchemyError as err: SESSION.rollback() - LOG.debug(err) - LOG.exception(err) + APP.logger.exception(err) flask.flash( 'Could not set up you as a user properly, please contact ' 'an admin', 'error') @@ -197,14 +199,6 @@ if not APP.debug: from_email=APP.config.get('FROM_EMAIL', 'pagure@fedoraproject.org') )) -# Send classic logs into syslog -SHANDLER = logging.StreamHandler() -SHANDLER.setLevel(APP.config.get('LOG_LEVEL', 'INFO')) -APP.logger.addHandler(SHANDLER) - -LOG = APP.logger -LOG.setLevel(APP.config.get('LOG_LEVEL', 'INFO')) -pagure.lib.set_log(LOG) APP.wsgi_app = pagure.proxy.ReverseProxied(APP.wsgi_app) @@ -689,7 +683,7 @@ def get_remote_repo_path(remote_git, branch_from, loop=False): pygit2.clone_repository( remote_git, repopath, checkout_branch=branch_from) except Exception as err: - LOG.exception(err) + APP.logger.exception(err) flask.abort( 500, 'The following error was raised when trying to clone the ' @@ -700,16 +694,17 @@ def get_remote_repo_path(remote_git, branch_from, loop=False): try: repo.pull(branch=branch_from, force=True) except pygit2.GitError as err: - LOG.debug('Error pull the repo: %s -- error: %s' % (repopath, err)) + APP.logger.debug( + 'Error pull the repo: %s -- error: %s' % (repopath, err)) if str(err).lower() != 'no content-type header in response': - LOG.exception(err) + APP.logger.exception(err) flask.abort( 500, 'The following error was raised when trying to pull the ' 'changes from the remote: %s' % str(err) ) except pagure.exceptions.PagureException as err: - LOG.exception(err) + APP.logger.exception(err) flask.abort(500, str(err)) return repopath diff --git a/pagure/default_config.py b/pagure/default_config.py index 4501d19..b151e2b 100644 --- a/pagure/default_config.py +++ b/pagure/default_config.py @@ -258,3 +258,45 @@ USER_NAMESPACE = False EXCLUDE_GROUP_INDEX = [] TRIGGER_CI = ['pretty please pagure-ci rebuild'] + + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'standard': { + 'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s' + }, + }, + 'handlers': { + 'console': { + 'level': 'INFO', + 'formatter': 'standard', + 'class': 'logging.StreamHandler', + 'stream': 'ext://sys.stdout', + }, + }, + # The root logger configuration; this is a catch-all configuration + # that applies to all log messages not handled by a different logger + 'root': { + 'level': 'INFO', + 'handlers': ['console'], + }, + 'loggers': { + 'pagure': { + 'handlers': ['console'], + 'level': 'INFO', + 'propagate': False + }, + 'flask': { + 'handlers': ['console'], + 'level': 'INFO', + 'propagate': False + }, + 'sqlalchemy': { + 'handlers': ['console'], + 'level': 'WARN', + 'propagate': False + }, + } +} diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index ef279c4..6753843 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -22,6 +22,7 @@ except ImportError: import json import datetime +import logging import markdown import os import shutil @@ -56,7 +57,7 @@ from pagure.lib import model REDIS = None PAGURE_CI = None -LOG = None +_log = logging.getLogger(__name__) def set_redis(host, port, dbname): @@ -72,12 +73,6 @@ def set_pagure_ci(services): PAGURE_CI = services -def set_log(logger): - """ Set a logger that can be used in this module. """ - global LOG - LOG = logger - - def get_user(session, key): """ Searches for a user in the database for a given username or email. """ @@ -3400,7 +3395,7 @@ def text2markdown(text, extended=True, readme=False): try: text = md_processor.convert(text) except Exception: - LOG.debug( + _log.debug( 'A markdown error occured while processing: ``%s``', str(text)) return clean_input(text) diff --git a/pagure/lib/git.py b/pagure/lib/git.py index d4f7e00..4831a7f 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -17,6 +17,7 @@ import datetime import hashlib import json +import logging import os import shutil import subprocess @@ -36,6 +37,9 @@ from pagure.lib import model from pagure.lib.repo import PagureRepo +_log = logging.getLogger(__name__) + + def commit_to_patch(repo_obj, commits): ''' For a given commit (PyGit2 commit object) of a specified git repo, returns a string representation of the changes the commit did in a @@ -88,6 +92,7 @@ def write_gitolite_acls(session, configfile): ''' Generate the configuration file for gitolite for all projects on the forge. ''' + _log.info('Write down the gitolite configuration file') global_pr_only = pagure.APP.config.get('PR_ONLY', False) config = [] groups = {} @@ -97,6 +102,7 @@ def write_gitolite_acls(session, configfile): model.Project.id ) for project in query.all(): + _log.debug(' Processing project: %s', project.fullname) for group in project.committer_groups: if group.group_name not in groups: groups[group.group_name] = [ @@ -154,6 +160,7 @@ def _get_gitolite_command(): """ Return the gitolite command to run based on the info in the configuration file. """ + _log.info('Compiling the gitolite configuration') gitolite_folder = pagure.APP.config.get('GITOLITE_HOME', None) gitolite_version = pagure.APP.config.get('GITOLITE_VERSION', 3) if gitolite_folder: @@ -172,12 +179,14 @@ def _get_gitolite_command(): raise pagure.exceptions.PagureException( 'Non-supported gitolite version "%s"' % gitolite_version ) + _log.debug('Command: %s', cmd) return cmd def generate_gitolite_acls(): """ Generate the gitolite configuration file for all repos """ + _log.info('Refresh gitolite configuration') pagure.lib.git.write_gitolite_acls( pagure.SESSION, pagure.APP.config['GITOLITE_CONFIG']) @@ -200,6 +209,7 @@ def update_git(obj, repo, repofolder): changes commit them and push them back to the original repo. """ + _log.info('Update the git repo: %s for: %s', repo.path, obj) if not repofolder: return @@ -298,6 +308,8 @@ def clean_git(obj, repo, repofolder): if not repofolder: return + _log.info('Update the git repo: %s to remove: %s', repo.path, obj) + # Get the fork repopath = os.path.join(repofolder, repo.path) @@ -800,6 +812,9 @@ def add_file_to_git(repo, issue, ticketfolder, user, filename, filestream): :arg filestream: the actual content of the file ''' + _log.info( + 'Addinf file: %s to the git repo: %s', + repo.path, werkzeug.secure_filename(filename)) if not ticketfolder: return @@ -913,6 +928,7 @@ def update_file_in_git( :arg user: the user object with its username and email ''' + _log.info('Updating file: %s in the repo: %s', filename, repo.path) # Get the fork repopath = pagure.get_repo_path(repo) @@ -1170,6 +1186,13 @@ def merge_pull_request( session, request, username, request_folder, domerge=True): ''' Merge the specified pull-request. ''' + if domerge: + _log.info( + '%s asked to merge the pull-request: %s', username, request) + else: + _log.info( + '%s asked to diff the pull-request: %s', username, request) + if request.remote: # Get the fork repopath = pagure.get_remote_repo_path( @@ -1185,18 +1208,21 @@ def merge_pull_request( # Clone the original repo into a temp folder newpath = tempfile.mkdtemp(prefix='pagure-pr-merge') + _log.info(' working directory: %s', newpath) new_repo = pygit2.clone_repository(parentpath, newpath) # Update the start and stop commits in the DB, one last time diff_commits = diff_pull_request( session, request, fork_obj, PagureRepo(parentpath), requestfolder=request_folder, with_diff=False) + _log.info(' %s commit to merge', len(diff_commits)) if request.project.settings.get( 'Enforce_signed-off_commits_in_pull-request', False): for commit in diff_commits: if 'signed-off-by' not in commit.message.lower(): shutil.rmtree(newpath) + _log.info(' Missing a required: signed-off-by: Bailing') raise pagure.exceptions.PagureException( 'This repo enforces that all commits are ' 'signed off by their author. ') @@ -1205,6 +1231,7 @@ def merge_pull_request( branch_ref = get_branch_ref(new_repo, request.branch) if not branch_ref: shutil.rmtree(newpath) + _log.info(' Target branch could not be found') raise pagure.exceptions.BranchNotFoundException( 'Branch %s could not be found in the repo %s' % ( request.branch, request.project.fullname @@ -1215,6 +1242,7 @@ def merge_pull_request( branch = get_branch_ref(fork_obj, request.branch_from) if not branch: shutil.rmtree(newpath) + _log.info(' Branch of origin could not be found') raise pagure.exceptions.BranchNotFoundException( 'Branch %s could not be found in the repo %s' % ( request.branch_from, request.project_from.fullname @@ -1227,14 +1255,17 @@ def merge_pull_request( # Add the fork as remote repo reponame = '%s_%s' % (request.user.user, request.uid) + _log.info(' Adding remote: %s pointing to: %s', reponame, repopath) remote = new_repo.create_remote(reponame, repopath) # Fetch the commits remote.fetch() merge = new_repo.merge(repo_commit.oid) + _log.debug(' Merge: %s', merge) if merge is None: mergecode = new_repo.merge_analysis(repo_commit.oid)[0] + _log.debug(' Mergecode: %s', mergecode) refname = '%s:refs/heads/%s' % (branch_ref.name, request.branch) if ( @@ -1244,6 +1275,7 @@ def merge_pull_request( mergecode & pygit2.GIT_MERGE_ANALYSIS_UP_TO_DATE)): if domerge: + _log.info(' PR up to date, closing it') pagure.lib.close_pull_request( session, request, username, requestfolder=request_folder) @@ -1252,12 +1284,14 @@ def merge_pull_request( session.commit() except SQLAlchemyError as err: # pragma: no cover session.rollback() + _log.exception(' Could not merge the PR in the DB') pagure.APP.logger.exception(err) raise pagure.exceptions.PagureException( 'Could not close this pull-request') raise pagure.exceptions.PagureException( 'Nothing to do, changes were already merged') else: + _log.info(' PR up to date, reporting it') request.merge_status = 'NO_CHANGE' session.commit() shutil.rmtree(newpath) @@ -1270,6 +1304,7 @@ def merge_pull_request( mergecode & pygit2.GIT_MERGE_ANALYSIS_FASTFORWARD)): if domerge: + _log.info(' PR merged using fast-forward') head = new_repo.lookup_reference('HEAD').get_object() if not request.project.settings.get('always_merge', False): if merge is not None: @@ -1292,11 +1327,13 @@ def merge_pull_request( tree, [head.hex, repo_commit.oid.hex]) + _log.info(' New head: %s', commit) PagureRepo.push(ori_remote, refname) fork_obj.run_hook( head.hex, commit, 'refs/heads/%s' % request.branch, username) else: + _log.info(' PR merged using fast-forward, reporting it') request.merge_status = 'FFORWARD' session.commit() shutil.rmtree(newpath) @@ -1306,16 +1343,23 @@ def merge_pull_request( tree = None try: tree = new_repo.index.write_tree() - except pygit2.GitError: + except pygit2.GitError as err: + _log.exception( + ' Could not write down the new tree: merge conflicts') + pagure.APP.logger.exception( + ' Could not write down the new tree: merge conflicts') shutil.rmtree(newpath) if domerge: + _log.info(' Merge conflict: Bailing') raise pagure.exceptions.PagureException('Merge conflicts!') else: + _log.info(' Merge conflict, reporting it') request.merge_status = 'CONFLICTS' session.commit() return 'CONFLICTS' if domerge: + _log.info(' Writing down merge commit') head = new_repo.lookup_reference('HEAD').get_object() user_obj = pagure.lib.get_user(session, username) author = pygit2.Signature( @@ -1329,24 +1373,28 @@ def merge_pull_request( tree, [head.hex, repo_commit.oid.hex]) + _log.info(' New head: %s', commit) PagureRepo.push(ori_remote, refname) fork_obj.run_hook( head.hex, commit, 'refs/heads/%s' % request.branch, username) else: + _log.info(' PR can be merged with a merge commit, reporting it') request.merge_status = 'MERGE' session.commit() shutil.rmtree(newpath) return 'MERGE' # Update status + _log.info(' Closing the PR in the DB') pagure.lib.close_pull_request( session, request, username, requestfolder=request_folder, ) try: # Reset the merge_status of all opened PR to refresh their cache + _log.info(' Clear the cached merged status of the other PRs') pagure.lib.reset_status_pull_request(session, request.project) session.commit() except SQLAlchemyError as err: # pragma: no cover diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 5312c86..36ab1b1 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -30,7 +30,7 @@ import pagure.exceptions import pagure.lib import pagure.lib.git import pagure.forms -from pagure import APP, SESSION, LOG, login_required, __get_file_in_tree +from pagure import APP, SESSION, login_required, __get_file_in_tree def _get_parent_repo_path(repo): @@ -562,7 +562,7 @@ def pull_request_drop_comment( flask.flash('Comment removed') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - LOG.error(err) + APP.logger.error(err) flask.flash( 'Could not remove the comment: %s' % commentid, 'error') @@ -632,7 +632,7 @@ def pull_request_edit_comment( flask.flash(message) except SQLAlchemyError, err: # pragma: no cover SESSION.rollback() - LOG.error(err) + APP.logger.error(err) if is_js: return 'error' else: diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index e90937b..7f5d493 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -35,7 +35,7 @@ import pagure.exceptions import pagure.lib import pagure.lib.encoding_utils import pagure.forms -from pagure import (APP, SESSION, LOG, __get_file_in_tree, +from pagure import (APP, SESSION, __get_file_in_tree, login_required, authenticated, urlpattern) @@ -136,7 +136,7 @@ def update_issue(repo, issueid, username=None, namespace=None): except SQLAlchemyError as err: # pragma: no cover is_js = False SESSION.rollback() - LOG.error(err) + APP.logger.error(err) if not is_js: flask.flash( 'Could not remove the comment: %s' % commentid, @@ -428,7 +428,7 @@ def edit_tag(repo, tag, username=None, namespace=None): flask.flash(msg) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - LOG.error(err) + APP.logger.error(err) flask.flash('Could not edit tag: %s' % tag, 'error') return flask.redirect(flask.url_for( @@ -575,7 +575,7 @@ def remove_tag(repo, username=None, namespace=None): flask.flash(msg) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - LOG.error(err) + APP.logger.error(err) flask.flash( 'Could not remove tag: %s' % ','.join(tags), 'error') @@ -1373,7 +1373,7 @@ def view_issue_raw_file( ktc.to_bytes(data)) except pagure.exceptions.PagureException: # We cannot decode the file, so bail but warn the admins - LOG.exception('File could not be decoded') + APP.logger.exception('File could not be decoded') if encoding: mimetype += '; charset={encoding}'.format(encoding=encoding) @@ -1437,7 +1437,7 @@ def edit_comment_issue( flask.flash(message) except SQLAlchemyError, err: # pragma: no cover SESSION.rollback() - LOG.error(err) + APP.logger.error(err) if is_js: return 'error' flask.flash( diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 5449f31..e7c5d1a 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -49,7 +49,7 @@ import pagure.lib.plugins import pagure.forms import pagure import pagure.ui.plugins -from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, +from pagure import (APP, SESSION, __get_file_in_tree, login_required, admin_session_timedout) from pagure.lib import encoding_utils @@ -492,7 +492,7 @@ def view_file(repo, identifier, filename, username=None, namespace=None): Image.open(StringIO(content.data)) output_type = 'image' except IOError as err: - LOG.debug( + APP.logger.debug( 'Failed to load image %s, error: %s', filename, err ) output_type = 'binary' @@ -658,7 +658,7 @@ def view_raw_file( encoding = encoding_utils.guess_encoding(ktc.to_bytes(data)) except pagure.exceptions.PagureException: # We cannot decode the file, so bail but warn the admins - LOG.exception('File could not be decoded') + APP.logger.exception('File could not be decoded') if encoding: mimetype += '; charset={encoding}'.format(encoding=encoding) @@ -699,7 +699,7 @@ def view_blame_file(repo, filename, username=None, namespace=None): content = encoding_utils.decode(content.data) except pagure.exceptions.PagureException: # We cannot decode the file, so bail but warn the admins - LOG.exception('File could not be decoded') + APP.logger.exception('File could not be decoded') flask.abort(500, 'File could not be decoded') lexer = TextLexer() diff --git a/tests/__init__.py b/tests/__init__.py index 7267906..e45f43c 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -48,9 +48,13 @@ FAITOUT_URL = 'http://faitout.fedorainfracloud.org/' if os.environ.get('FAITOUT_URL'): FAITOUT_URL = os.environ.get('FAITOUT_URL') HERE = os.path.join(os.path.dirname(os.path.abspath(__file__))) -LOG = logging.getLogger("pagure") +LOG = logging.getLogger(__name__) LOG.setLevel(logging.DEBUG) +PAGLOG = logging.getLogger('pagure') +PAGLOG.setLevel(logging.CRITICAL) +PAGLOG.handlers = [] + LOG.info('BUILD_ID: %s', os.environ.get('BUILD_ID')) if os.environ.get('BUILD_ID')or os.environ.get('FAITOUT_URL'): @@ -67,7 +71,7 @@ if os.environ.get('BUILD_ID')or os.environ.get('FAITOUT_URL'): pass # Remove the log handlers for the tests -pagure.LOG.handlers = [] +pagure.APP.logger.handlers = [] @contextmanager def user_set(APP, user): diff --git a/tests/test_pagure_flask_ui_old_commit.py b/tests/test_pagure_flask_ui_old_commit.py index 4dc6d07..a1c0968 100644 --- a/tests/test_pagure_flask_ui_old_commit.py +++ b/tests/test_pagure_flask_ui_old_commit.py @@ -63,7 +63,6 @@ class PagureFlaskRepoOldUrltests(tests.Modeltests): pagure.APP.config['EMAIL_SEND'] = False pagure.APP.config['OLD_VIEW_COMMIT_ENABLED'] = False - pagure.LOG.handlers = [] def test_view_commit_old(self): """ Test the view_commit_old endpoint. """ From 4635b56f32cab399362c6f34eeed9c0e1d6efaa5 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Apr 21 2017 09:22:20 +0000 Subject: [PATCH 2/2] Use custom logger on all module so we can configure finely the logging And be consistent in the variable name use for it Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure-ci/pagure_ci_server.py b/pagure-ci/pagure_ci_server.py index 5e931c6..afc4f2a 100644 --- a/pagure-ci/pagure_ci_server.py +++ b/pagure-ci/pagure_ci_server.py @@ -25,7 +25,7 @@ import trollius import trollius_redis -LOG = logging.getLogger(__name__) +_log = logging.getLogger(__name__) if 'PAGURE_CONFIG' not in os.environ \ and os.path.exists('/etc/pagure/pagure.cfg'): @@ -59,7 +59,7 @@ def handle_messages(): # Inside a while loop, wait for incoming events. while True: reply = yield trollius.From(subscriber.next_published()) - LOG.info( + _log.info( 'Received: %s on channel: %s', repr(reply.value), reply.channel) data = json.loads(reply.value) @@ -67,19 +67,19 @@ def handle_messages(): pr_id = data['pr']['id'] pr_uid = data['pr']['uid'] branch = data['pr']['branch_from'] - LOG.info('Looking for PR: %s', pr_uid) + _log.info('Looking for PR: %s', pr_uid) session = pagure.lib.create_session(pagure.APP.config['DB_URL']) request = pagure.lib.get_request_by_uid(session, pr_uid) - LOG.info('PR retrieved: %s', request) + _log.info('PR retrieved: %s', request) if not request: - LOG.warning( + _log.warning( 'No request could be found from the message %s', data) session.close() continue - LOG.info( + _log.info( "Trigger on %s PR #%s from %s: %s", request.project.fullname, pr_id, request.project_from.fullname, branch) @@ -91,7 +91,7 @@ def handle_messages(): repo = '%s/%s' % ( pagure.APP.config['GIT_URL_GIT'].rstrip('/'), request.project_from.path) - LOG.info( + _log.info( 'Triggering the build at: %s, for repo: %s', url, repo) requests.post( url, @@ -103,10 +103,10 @@ def handle_messages(): } ) else: - LOG.warning('Un-supported CI type') + _log.warning('Un-supported CI type') session.close() - LOG.info('Ready for another') + _log.info('Ready for another') def main(): @@ -124,9 +124,9 @@ def main(): except trollius.ConnectionResetError: pass - LOG.info("End Connection") + _log.info("End Connection") loop.close() - LOG.info("End") + _log.info("End") if __name__ == '__main__': @@ -136,7 +136,7 @@ if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) # setup console logging - LOG.setLevel(logging.DEBUG) + _log.setLevel(logging.DEBUG) shellhandler = logging.StreamHandler() shellhandler.setLevel(logging.DEBUG) @@ -146,5 +146,5 @@ if __name__ == '__main__': aslog.setLevel(logging.DEBUG) shellhandler.setFormatter(formatter) - LOG.addHandler(shellhandler) + _log.addHandler(shellhandler) main() diff --git a/pagure/docs_server.py b/pagure/docs_server.py index 136a52f..ee58ea6 100644 --- a/pagure/docs_server.py +++ b/pagure/docs_server.py @@ -45,7 +45,7 @@ SHANDLER = logging.StreamHandler() SHANDLER.setLevel(APP.config.get('log_level', 'INFO')) APP.logger.addHandler(SHANDLER) -LOG = APP.logger +_log = logging.getLogger(__name__) TMPL_HTML = ''' @@ -185,7 +185,7 @@ def view_docs(repo, username=None, namespace=None, filename=None): except pagure.exceptions.FileNotFoundException as err: flask.flash(err.message, 'error') except Exception as err: - LOG.exception(err) + _log.exception(err) flask.abort(500, 'Unkown error encountered and reported') mimetype = None diff --git a/pagure/hooks/files/pagure_hook.py b/pagure/hooks/files/pagure_hook.py index d88bdd5..e28f5b9 100755 --- a/pagure/hooks/files/pagure_hook.py +++ b/pagure/hooks/files/pagure_hook.py @@ -5,6 +5,7 @@ relates to an issue. """ +import logging import os import sys @@ -22,6 +23,8 @@ import pagure.exceptions # noqa: E402 import pagure.lib.link # noqa: E402 +_log = logging.getLogger(__name__) + abspath = os.path.abspath(os.environ['GIT_DIR']) @@ -86,7 +89,7 @@ def relates_commit(commitid, issue, app_url=None): print err except SQLAlchemyError as err: # pragma: no cover pagure.SESSION.rollback() - pagure.APP.logger.exception(err) + _log.exception(err) def fixes_relation(commitid, relation, app_url=None): @@ -131,7 +134,7 @@ def fixes_relation(commitid, relation, app_url=None): print err except SQLAlchemyError as err: # pragma: no cover pagure.SESSION.rollback() - pagure.LOG.exception(err) + _log.exception(err) try: if relation.isa == 'issue': @@ -154,7 +157,7 @@ def fixes_relation(commitid, relation, app_url=None): except SQLAlchemyError as err: # pragma: no cover pagure.SESSION.rollback() print 'ERROR', err - pagure.LOG.exception(err) + _log.exception(err) def run_as_post_receive_hook(): diff --git a/pagure/lib/model.py b/pagure/lib/model.py index 5c68750..0c5d0bd 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -43,7 +43,7 @@ CONVENTION = { BASE = declarative_base(metadata=MetaData(naming_convention=CONVENTION)) -ERROR_LOG = logging.getLogger('pagure.model') +_log = logging.getLogger(__name__) # hit w/ all the id field we use # pylint: disable=invalid-name @@ -114,7 +114,7 @@ def create_default_status(session, acls=None): session.commit() except SQLAlchemyError: # pragma: no cover session.rollback() - ERROR_LOG.debug('Status %s could not be added', ticket_stat) + _log.debug('Status %s could not be added', ticket_stat) for status in ['Open', 'Closed', 'Merged']: pr_stat = StatusPullRequest(status=status) @@ -123,7 +123,7 @@ def create_default_status(session, acls=None): session.commit() except SQLAlchemyError: # pragma: no cover session.rollback() - ERROR_LOG.debug('Status %s could not be added', pr_stat) + _log.debug('Status %s could not be added', pr_stat) for grptype in ['user', 'admin']: grp_type = PagureGroupType(group_type=grptype) @@ -132,7 +132,7 @@ def create_default_status(session, acls=None): session.commit() except SQLAlchemyError: # pragma: no cover session.rollback() - ERROR_LOG.debug('Type %s could not be added', grptype) + _log.debug('Type %s could not be added', grptype) for acl in sorted(acls) or {}: item = ACL( @@ -144,7 +144,7 @@ def create_default_status(session, acls=None): session.commit() except SQLAlchemyError: # pragma: no cover session.rollback() - ERROR_LOG.debug('ACL %s could not be added', acl) + _log.debug('ACL %s could not be added', acl) for access in ['ticket', 'commit', 'admin']: access_obj = AccessLevels(access=access) @@ -153,7 +153,7 @@ def create_default_status(session, acls=None): session.commit() except SQLAlchemyError: session.rollback() - ERROR_LOG.debug('Access level %s could not be added', access) + _log.debug('Access level %s could not be added', access) class AccessLevels(BASE): diff --git a/pagure/lib/notify.py b/pagure/lib/notify.py index f7b2fd7..c6a2777 100644 --- a/pagure/lib/notify.py +++ b/pagure/lib/notify.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2016 - Copyright Red Hat Inc + (c) 2014-2017 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -17,6 +17,7 @@ from __future__ import print_function import datetime import hashlib import json +import logging import urlparse import re import smtplib @@ -30,6 +31,9 @@ from email.header import Header from email.mime.text import MIMEText +_log = logging.getLogger(__name__) + + REPLY_MSG = 'To reply, visit the link below' if pagure.APP.config['EVENTSOURCE_SOURCE']: REPLY_MSG += ' or just reply to this email' @@ -286,7 +290,7 @@ def send_email(text, subject, to_mail, [mailto], msg.as_string()) except smtplib.SMTPException as err: - pagure.LOG.exception(err) + _log.exception(err) if smtp: smtp.quit() return msg diff --git a/pagure/lib/repo.py b/pagure/lib/repo.py index ef3c11b..851c360 100644 --- a/pagure/lib/repo.py +++ b/pagure/lib/repo.py @@ -1,13 +1,14 @@ # -*- coding: utf-8 -*- """ - (c) 2015-2016 - Copyright Red Hat Inc + (c) 2015-2017 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon """ +import logging import os import subprocess @@ -17,6 +18,9 @@ import pagure import pagure.exceptions +_log = logging.getLogger(__name__) + + def get_pygit2_version(): ''' Return pygit2 version as a tuple of integers. This is needed for correct version comparison. @@ -74,7 +78,7 @@ class PagureRepo(pygit2.Repository): raise pagure.exceptions.GitConflictsException( 'Pulling remote changes leads to a conflict') else: - pagure.LOG.debug( + _log.debug( 'Un-expected merge result: %s' % ( pygit2.GIT_MERGE_ANALYSIS_NORMAL)) raise AssertionError('Unknown merge analysis result') diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 2fded03..563180b 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -10,6 +10,7 @@ """ import datetime +import logging from math import ceil import flask @@ -24,6 +25,9 @@ from pagure import (APP, SESSION, login_required, authenticated, admin_session_timedout) +_log = logging.getLogger(__name__) + + @APP.route('/browse/projects', endpoint='browse_projects') @APP.route('/browse/projects/', endpoint='browse_projects') @APP.route('/') @@ -631,7 +635,7 @@ def remove_user_email(): flask.flash('Email removed') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Email could not be removed', 'error') return flask.redirect(flask.url_for('.user_settings')) @@ -666,7 +670,7 @@ def add_user_email(): flask.flash(str(err), 'error') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Email could not be added', 'error') return flask.render_template( @@ -711,7 +715,7 @@ def set_default_email(): flask.flash('Default email set to: %s' % email) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Default email could not be set', 'error') return flask.redirect(flask.url_for('.user_settings')) @@ -743,7 +747,7 @@ def reconfirm_email(): flask.flash(str(err), 'error') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Confirmation email could not be re-sent', 'error') return flask.redirect(flask.url_for('.user_settings')) @@ -772,7 +776,7 @@ def confirm_email(token): flask.flash( 'Could not set the account as active in the db, ' 'please report this error to an admin', 'error') - APP.logger.exception(err) + _log.exception(err) return flask.redirect(flask.url_for('.user_settings')) @@ -824,7 +828,7 @@ def add_api_user_token(): return flask.redirect(flask.url_for('.user_settings')) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('API key could not be added', 'error') # When form is displayed after an empty submission, show an error. @@ -868,7 +872,7 @@ def revoke_api_user_token(token_id): flask.flash('Token revoked') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Token could not be revoked, please contact an admin', 'error') diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 36ab1b1..35afc8c 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -16,10 +16,11 @@ # pylint: disable=too-many-lines -import flask +import logging import os from math import ceil +import flask import filelock import pygit2 from sqlalchemy.exc import SQLAlchemyError @@ -33,6 +34,9 @@ import pagure.forms from pagure import APP, SESSION, login_required, __get_file_in_tree +_log = logging.getLogger(__name__) + + def _get_parent_repo_path(repo): """ Return the path of the parent git repository corresponding to the provided Repository object from the DB. @@ -224,7 +228,7 @@ def request_pull(repo, requestid, username=None, namespace=None): namespace=namespace)) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Could not update this pull-request in the database', 'error') @@ -309,7 +313,7 @@ def request_pull_patch(repo, requestid, username=None, namespace=None): namespace=namespace)) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Could not update this pull-request in the database', 'error') @@ -375,7 +379,7 @@ def request_pull_edit(repo, requestid, username=None, namespace=None): flask.flash('Pull request edited!') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Could not edit this pull-request in the database', 'error') @@ -463,14 +467,14 @@ def pull_request_add_comment( flask.flash(message) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) if is_js: return 'error' else: flask.flash(str(err), 'error') except filelock.Timeout as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) if is_js: return 'error' else: @@ -562,7 +566,7 @@ def pull_request_drop_comment( flask.flash('Comment removed') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.error(err) + _log.error(err) flask.flash( 'Could not remove the comment: %s' % commentid, 'error') @@ -632,7 +636,7 @@ def pull_request_edit_comment( flask.flash(message) except SQLAlchemyError, err: # pragma: no cover SESSION.rollback() - APP.logger.error(err) + _log.error(err) if is_js: return 'error' else: @@ -640,7 +644,7 @@ def pull_request_edit_comment( 'Could not edit the comment: %s' % commentid, 'error') except filelock.Timeout as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) if is_js: return 'error' else: @@ -790,13 +794,13 @@ def cancel_request_pull(repo, requestid, username=None, namespace=None): flask.flash('Pull request canceled!') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Could not update this pull-request in the database', 'error') except filelock.Timeout as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'We could not save all the info, please try again', 'error') @@ -857,11 +861,11 @@ def set_assignee_requests(repo, requestid, username=None, namespace=None): flask.flash(err.message, 'error') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash(str(err), 'error') except filelock.Timeout as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'We could not save all the info, please try again', 'error') @@ -1011,7 +1015,7 @@ def new_request_pull( SESSION.commit() except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Could not register this pull-request in the database', 'error') @@ -1037,7 +1041,7 @@ def new_request_pull( flask.flash(str(err), 'error') except filelock.Timeout as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'We could not save all the info, please try again', 'error') @@ -1191,7 +1195,7 @@ def new_remote_request_pull(repo, username=None, namespace=None): flask.flash('Request created') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Could not register this pull-request in ' 'the database', 'error') diff --git a/pagure/ui/groups.py b/pagure/ui/groups.py index b365ad1..df4b3f5 100644 --- a/pagure/ui/groups.py +++ b/pagure/ui/groups.py @@ -8,8 +8,9 @@ """ -import flask +import logging +import flask from sqlalchemy.exc import SQLAlchemyError import pagure @@ -18,6 +19,9 @@ import pagure.lib import pagure.lib.git +_log = logging.getLogger(__name__) + + @pagure.APP.route('/groups/') @pagure.APP.route('/groups') def group_lists(): @@ -93,10 +97,9 @@ def view_group(group): 'Could not add user `%s` to group `%s`.' % ( username, group.group_name), 'error') - pagure.APP.logger.debug( + _log.exception( 'Could not add user `%s` to group `%s`.' % ( username, group.group_name)) - pagure.APP.logger.exception(err) member = False if pagure.authenticated(): @@ -156,9 +159,8 @@ def edit_group(group): flask.flash( 'Could not edit group `%s`.' % (group.group_name), 'error') - pagure.APP.logger.debug( + _log.exception( 'Could not edit group `%s`.' % (group.group_name)) - pagure.APP.logger.exception(err) elif flask.request.method == 'GET': form.display_name.data = group.display_name form.description.data = group.description @@ -207,10 +209,9 @@ def group_user_delete(user, group): 'Could not remove user `%s` from the group `%s`.' % ( user.user, group), 'error') - pagure.APP.logger.debug( + _log.exception( 'Could not remove user `%s` from the group `%s`.' % ( user.user, group)) - pagure.APP.logger.exception(err) return flask.redirect(flask.url_for('.view_group', group=group)) @@ -314,8 +315,7 @@ def add_group(): except SQLAlchemyError as err: # pragma: no cover pagure.SESSION.rollback() flask.flash('Could not create group.') - pagure.APP.logger.debug('Could not create group.') - pagure.APP.logger.exception(err) + _log.exception('Could not create group.') return flask.render_template( 'add_group.html', diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 7f5d493..32c44fe 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -15,12 +15,13 @@ import datetime -import flask +import logging import os import re from collections import defaultdict from math import ceil +import flask import filelock import pygit2 import werkzeug.datastructures @@ -39,6 +40,8 @@ from pagure import (APP, SESSION, __get_file_in_tree, login_required, authenticated, urlpattern) +_log = logging.getLogger(__name__) + # URLs @@ -136,7 +139,7 @@ def update_issue(repo, issueid, username=None, namespace=None): except SQLAlchemyError as err: # pragma: no cover is_js = False SESSION.rollback() - APP.logger.error(err) + _log.error(err) if not is_js: flask.flash( 'Could not remove the comment: %s' % commentid, @@ -340,12 +343,12 @@ def update_issue(repo, issueid, username=None, namespace=None): except SQLAlchemyError as err: # pragma: no cover is_js = False SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash(str(err), 'error') except filelock.Timeout as err: # pragma: no cover is_js = False SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'We could not save all the info, please try again', 'error') @@ -428,7 +431,7 @@ def edit_tag(repo, tag, username=None, namespace=None): flask.flash(msg) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.error(err) + _log.error(err) flask.flash('Could not edit tag: %s' % tag, 'error') return flask.redirect(flask.url_for( @@ -575,7 +578,7 @@ def remove_tag(repo, username=None, namespace=None): flask.flash(msg) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.error(err) + _log.error(err) flask.flash( 'Could not remove tag: %s' % ','.join(tags), 'error') @@ -943,7 +946,7 @@ def new_issue(repo, username=None, namespace=None): flask.flash(str(err), 'error') except filelock.Timeout as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'We could not save all the info, please try again', 'error') @@ -1092,7 +1095,7 @@ def delete_issue(repo, issueid, username=None, namespace=None): namespace=namespace)) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Could not delete the issue', 'error') return flask.redirect(flask.url_for( @@ -1212,7 +1215,7 @@ def edit_issue(repo, issueid, username=None, namespace=None): flask.flash(str(err), 'error') except filelock.Timeout as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'We could not save all the info, please try again', 'error') @@ -1278,7 +1281,7 @@ def upload_issue(repo, issueid, username=None, namespace=None): ) except filelock.Timeout as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'We could not save all the info, please try again', 'error') @@ -1373,7 +1376,7 @@ def view_issue_raw_file( ktc.to_bytes(data)) except pagure.exceptions.PagureException: # We cannot decode the file, so bail but warn the admins - APP.logger.exception('File could not be decoded') + _log.exception('File could not be decoded') if encoding: mimetype += '; charset={encoding}'.format(encoding=encoding) @@ -1437,14 +1440,14 @@ def edit_comment_issue( flask.flash(message) except SQLAlchemyError, err: # pragma: no cover SESSION.rollback() - APP.logger.error(err) + _log.error(err) if is_js: return 'error' flask.flash( 'Could not edit the comment: %s' % commentid, 'error') except filelock.Timeout as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'We could not save all the info, please try again', 'error') diff --git a/pagure/ui/login.py b/pagure/ui/login.py index cdb6757..bee6ae7 100644 --- a/pagure/ui/login.py +++ b/pagure/ui/login.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2016 - Copyright Red Hat Inc + (c) 2014-2017 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -10,6 +10,7 @@ """ import datetime +import logging import urlparse import flask @@ -24,6 +25,9 @@ from pagure import APP, SESSION, login_required from pagure.lib.login import generate_hashed_value, check_password +_log = logging.getLogger(__name__) + + @APP.route('/user/new/', methods=['GET', 'POST']) @APP.route('/user/new', methods=['GET', 'POST']) def new_user(): @@ -62,11 +66,10 @@ def new_user(): flask.flash( 'User created, please check your email to activate the ' 'account') - except SQLAlchemyError as err: # pragma: no cover + except SQLAlchemyError: # pragma: no cover SESSION.rollback() flask.flash('Could not create user.') - APP.logger.debug('Could not create user.') - APP.logger.exception(err) + _log.exception('Could not create user.') return flask.redirect(flask.url_for('auth_login')) @@ -97,7 +100,7 @@ def do_login(): form.password.data, user_obj.password, seed=APP.config.get('PASSWORD_SEED', None)) except pagure.exceptions.PagureException as err: - APP.logger.exception(err) + _log.exception(err) flask.flash('Username or password of invalid format.', 'error') return flask.redirect(flask.url_for('auth_login')) @@ -137,7 +140,7 @@ def do_login(): flask.flash( 'Could not set the session in the db, ' 'please report this error to an admin', 'error') - APP.logger.exception(err) + _log.exception(err) return flask.redirect(next_url) else: @@ -165,7 +168,7 @@ def confirm_user(token): flask.flash( 'Could not set the account as active in the db, ' 'please report this error to an admin', 'error') - APP.logger.exception(err) + _log.exception(err) return flask.redirect(flask.url_for('index')) @@ -204,13 +207,12 @@ def lost_password(): send_lostpassword_email(user_obj) flask.flash( 'Check your email to finish changing your password') - except SQLAlchemyError as err: # pragma: no cover + except SQLAlchemyError: # pragma: no cover SESSION.rollback() flask.flash( 'Could not set the token allowing changing a password.', 'error') - APP.logger.debug('Password lost change - Error setting token.') - APP.logger.exception(err) + _log.exception('Password lost change - Error setting token.') return flask.redirect(flask.url_for('auth_login')) @@ -248,12 +250,11 @@ def reset_password(token): SESSION.commit() flask.flash( 'Password changed') - except SQLAlchemyError as err: # pragma: no cover + except SQLAlchemyError: # pragma: no cover SESSION.rollback() flask.flash('Could not set the new password.', 'error') - APP.logger.debug( + _log.exception( 'Password lost change - Error setting password.') - APP.logger.exception(err) return flask.redirect(flask.url_for('auth_login')) @@ -288,7 +289,7 @@ def change_password(): form.old_password.data, user_obj.password, seed=APP.config.get('PASSWORD_SEED', None)) except pagure.exceptions.PagureException as err: - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Could not update your password, either user or password ' 'could not be checked', 'error') @@ -308,12 +309,11 @@ def change_password(): SESSION.commit() flask.flash( 'Password changed') - except SQLAlchemyError as err: # pragma: no cover + except SQLAlchemyError: # pragma: no cover SESSION.rollback() flask.flash('Could not set the new password.', 'error') - APP.logger.debug( + _log.exception( 'Password change - Error setting new password.') - APP.logger.exception(err) return flask.redirect(flask.url_for('auth_login')) @@ -435,7 +435,7 @@ def _check_session_cookie(): flask.flash( 'Could not prolong the session in the db, ' 'please report this error to an admin', 'error') - APP.logger.exception(err) + _log.exception(err) flask.g.fas_session_id = session_id flask.g.fas_user = user diff --git a/pagure/ui/plugins.py b/pagure/ui/plugins.py index 363a4b3..6447ab6 100644 --- a/pagure/ui/plugins.py +++ b/pagure/ui/plugins.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2016 - Copyright Red Hat Inc + (c) 2014-2017 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -11,8 +11,9 @@ # pylint: disable=too-many-branches -import flask +import logging +import flask from sqlalchemy.exc import SQLAlchemyError import pagure.exceptions @@ -23,6 +24,9 @@ from pagure import APP, SESSION, login_required from pagure.exceptions import FileNotFoundException +_log = logging.getLogger(__name__) + + @APP.route('//settings//', methods=('GET', 'POST')) @APP.route('//settings/', methods=('GET', 'POST')) @APP.route('///settings//', methods=('GET', 'POST')) @@ -114,8 +118,7 @@ def view_plugin(repo, plugin, username=None, namespace=None, full=True): SESSION.flush() except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.debug('Could not add plugin %s', plugin.name) - APP.logger.exception(err) + _log.exception('Could not add plugin %s', plugin.name) flask.flash( 'Could not add plugin %s, please contact an admin' % plugin.name) @@ -139,14 +142,14 @@ def view_plugin(repo, plugin, username=None, namespace=None, full=True): plugin.install(repo, dbobj) flask.flash('Hook %s activated' % plugin.name) except FileNotFoundException as err: - pagure.APP.logger.exception(err) + _log.exception(err) flask.abort(404, 'No git repo found') else: try: plugin.remove(repo) flask.flash('Hook %s deactivated' % plugin.name) except FileNotFoundException as err: - pagure.APP.logger.exception(err) + _log.exception(err) flask.abort(404, 'No git repo found') SESSION.commit() diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index e7c5d1a..5a2c3c7 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -19,8 +19,10 @@ import datetime import json +import logging import shutil import os +from cStringIO import StringIO from math import ceil import flask @@ -28,7 +30,6 @@ import pygit2 import kitchen.text.converters as ktc import werkzeug -from cStringIO import StringIO from PIL import Image from pygments import highlight from pygments.formatters import HtmlFormatter @@ -54,6 +55,9 @@ from pagure import (APP, SESSION, __get_file_in_tree, login_required, from pagure.lib import encoding_utils +_log = logging.getLogger(__name__) + + @APP.route('/.git') @APP.route('//.git') @APP.route('/fork//.git') @@ -492,7 +496,7 @@ def view_file(repo, identifier, filename, username=None, namespace=None): Image.open(StringIO(content.data)) output_type = 'image' except IOError as err: - APP.logger.debug( + _log.debug( 'Failed to load image %s, error: %s', filename, err ) output_type = 'binary' @@ -658,7 +662,7 @@ def view_raw_file( encoding = encoding_utils.guess_encoding(ktc.to_bytes(data)) except pagure.exceptions.PagureException: # We cannot decode the file, so bail but warn the admins - APP.logger.exception('File could not be decoded') + _log.exception('File could not be decoded') if encoding: mimetype += '; charset={encoding}'.format(encoding=encoding) @@ -699,7 +703,7 @@ def view_blame_file(repo, filename, username=None, namespace=None): content = encoding_utils.decode(content.data) except pagure.exceptions.PagureException: # We cannot decode the file, so bail but warn the admins - APP.logger.exception('File could not be decoded') + _log.exception('File could not be decoded') flask.abort(500, 'File could not be decoded') lexer = TextLexer() @@ -959,7 +963,7 @@ def new_release(repo, username=None, namespace=None): except pagure.exceptions.PagureException as err: flask.flash(str(err), 'error') except Exception as err: # pragma: no cover - APP.logger.exception(err) + _log.exception(err) flask.flash('Upload failed', 'error') return flask.redirect(flask.url_for( 'view_tags', repo=repo.name, username=username, @@ -1378,7 +1382,7 @@ def change_ref_head(repo, username=None, namespace=None): repo_obj.set_head(reference.name) flask.flash('Default branch updated to %s' % branchname) except Exception as err: # pragma: no cover - APP.logger.exception(err) + _log.exception(err) return flask.redirect(flask.url_for( 'view_settings', username=username, repo=repo.name, @@ -1416,7 +1420,7 @@ def delete_repo(repo, username=None, namespace=None): SESSION.commit() except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Could not delete the project', 'error') repopath = os.path.join(APP.config['GIT_FOLDER'], repo.path) @@ -1430,7 +1434,7 @@ def delete_repo(repo, username=None, namespace=None): shutil.rmtree(ticketpath) shutil.rmtree(requestpath) except (OSError, IOError) as err: - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Could not delete all the repos from the system', 'error') @@ -1475,7 +1479,7 @@ def new_repo_hook_token(repo, username=None, namespace=None): flask.flash('New hook token generated') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Could not generate a new token for this project', 'error') return flask.redirect(flask.url_for( @@ -1535,7 +1539,7 @@ def remove_deploykey(repo, keyid, username=None, namespace=None): flask.flash('Deploy key removed') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Deploy key could not be removed', 'error') return flask.redirect(flask.url_for( @@ -1593,7 +1597,7 @@ def remove_user(repo, userid, username=None, namespace=None): flask.flash('User removed') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('User could not be removed', 'error') return flask.redirect(flask.url_for( @@ -1656,7 +1660,7 @@ def add_deploykey(repo, username=None, namespace=None): flask.flash(msg, 'error') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Deploy key could not be added', 'error') return flask.render_template( @@ -1734,7 +1738,7 @@ def add_user(repo, username=None, namespace=None): flask.flash(msg, 'error') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('User could not be added', 'error') access_levels = pagure.lib.get_access_levels(SESSION) @@ -1801,7 +1805,7 @@ def remove_group_project(repo, groupid, username=None, namespace=None): flask.flash('Group removed') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Group could not be removed', 'error') return flask.redirect(flask.url_for( @@ -1878,7 +1882,7 @@ def add_group_project(repo, username=None, namespace=None): flask.flash(msg, 'error') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('Group could not be added', 'error') access_levels = pagure.lib.get_access_levels(SESSION) @@ -2006,7 +2010,7 @@ def add_token(repo, username=None, namespace=None): namespace=namespace)) except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash('User could not be added', 'error') # When form is displayed after an empty submission, show an error. @@ -2067,7 +2071,7 @@ def revoke_api_token(repo, token_id, username=None, namespace=None): flask.flash('Token revoked') except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() - APP.logger.exception(err) + _log.exception(err) flask.flash( 'Token could not be revoked, please contact an admin', 'error') @@ -2138,7 +2142,7 @@ def edit_file(repo, branchname, filename, username=None, namespace=None): namespace=namespace, branchname=form.branch.data) ) except pagure.exceptions.PagureException as err: # pragma: no cover - APP.logger.exception(err) + _log.exception(err) flask.flash('Commit could not be done', 'error') data = form.content.data elif flask.request.method == 'GET': @@ -2195,7 +2199,7 @@ def delete_branch(repo, branchname, username=None, namespace=None): branch.delete() flask.flash('Branch `%s` deleted' % branchname) except pygit2.GitError as err: - APP.logger.exception(err) + _log.exception(err) flask.flash('Could not delete `%s`' % branchname, 'error') return flask.redirect(flask.url_for( diff --git a/tests/test_pagure_flask_docs.py b/tests/test_pagure_flask_docs.py index 0715734..52cdbd4 100644 --- a/tests/test_pagure_flask_docs.py +++ b/tests/test_pagure_flask_docs.py @@ -38,7 +38,6 @@ class PagureFlaskDocstests(tests.Modeltests): """ Set up the environnment, ran before every tests. """ super(PagureFlaskDocstests, self).setUp() - pagure.docs_server.LOG.handlers = [] pagure.docs_server.APP.config['TESTING'] = True pagure.docs_server.SESSION = self.session