mirror of
https://github.com/reddit-archive/reddit.git
synced 2026-01-29 16:58:21 -05:00
load_controllers is the safe place to do imports of things that rely on `g` et al being in the correct state. It was not being called in paster shell or run which meant that any hooks defined in a module that relies on `g` at module scope (e.g. things importing model or controller code) would not be connected in those contexts.
116 lines
4.2 KiB
Python
116 lines
4.2 KiB
Python
# The contents of this file are subject to the Common Public Attribution
|
|
# License Version 1.0. (the "License"); you may not use this file except in
|
|
# compliance with the License. You may obtain a copy of the License at
|
|
# http://code.reddit.com/LICENSE. The License is based on the Mozilla Public
|
|
# License Version 1.1, but Sections 14 and 15 have been added to cover use of
|
|
# software over a computer network and provide for limited attribution for the
|
|
# Original Developer. In addition, Exhibit A has been modified to be consistent
|
|
# with Exhibit B.
|
|
#
|
|
# Software distributed under the License is distributed on an "AS IS" basis,
|
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
|
# the specific language governing rights and limitations under the License.
|
|
#
|
|
# The Original Code is reddit.
|
|
#
|
|
# The Original Developer is the Initial Developer. The Initial Developer of
|
|
# the Original Code is reddit Inc.
|
|
#
|
|
# All portions of the code written by reddit are Copyright (c) 2006-2013 reddit
|
|
# Inc. All Rights Reserved.
|
|
###############################################################################
|
|
|
|
import paste.deploy.config
|
|
import paste.fixture
|
|
from paste.registry import RegistryManager
|
|
from paste.script import command
|
|
from paste.deploy import appconfig
|
|
from r2.config.environment import load_environment
|
|
from paste.script.pluginlib import find_egg_info_dir
|
|
from pylons.wsgiapp import PylonsApp
|
|
|
|
from r2.config.middleware import RedditApp
|
|
|
|
#from pylons.commands import ShellCommand, ControllerCommand, \
|
|
# RestControllerCommand
|
|
|
|
import os, sys
|
|
#
|
|
# commands that will be available by running paste with this app
|
|
#
|
|
|
|
class RunCommand(command.Command):
|
|
max_args = 2
|
|
min_args = 1
|
|
|
|
usage = "CONFIGFILE CMDFILE.py"
|
|
summary = "Executed CMDFILE with pylons support"
|
|
group_name = "Reddit"
|
|
|
|
|
|
parser = command.Command.standard_parser(verbose=True)
|
|
parser.add_option('-c', '--command',
|
|
dest='command',
|
|
help="execute command in module")
|
|
parser.add_option("", "--proctitle",
|
|
dest="proctitle",
|
|
help="set the title seen by ps and top")
|
|
|
|
def command(self):
|
|
try:
|
|
if self.options.proctitle:
|
|
import setproctitle
|
|
setproctitle.setproctitle("paster " + self.options.proctitle)
|
|
except ImportError:
|
|
pass
|
|
|
|
here_dir = os.getcwd()
|
|
|
|
is_standalone = self.args[0].lower() == 'standalone'
|
|
if is_standalone:
|
|
load_environment(setup_globals=False)
|
|
else:
|
|
config_name = 'config:%s' % self.args[0]
|
|
|
|
conf = appconfig(config_name, relative_to=here_dir)
|
|
conf.global_conf['running_as_script'] = True
|
|
conf.update(dict(app_conf=conf.local_conf,
|
|
global_conf=conf.global_conf))
|
|
paste.deploy.config.CONFIG.push_thread_config(conf)
|
|
|
|
load_environment(conf.global_conf, conf.local_conf)
|
|
|
|
# Load locals and populate with objects for use in shell
|
|
sys.path.insert(0, here_dir)
|
|
|
|
# Load the wsgi app first so that everything is initialized right
|
|
if not is_standalone:
|
|
wsgiapp = RegistryManager(RedditApp())
|
|
else:
|
|
# in standalone mode we don't have an ini so we can't use
|
|
# RedditApp since it imports all the fancy controllers.
|
|
wsgiapp = RegistryManager(PylonsApp())
|
|
test_app = paste.fixture.TestApp(wsgiapp)
|
|
|
|
# Query the test app to setup the environment
|
|
tresponse = test_app.get('/_test_vars')
|
|
request_id = int(tresponse.body)
|
|
|
|
# Disable restoration during test_app requests
|
|
test_app.pre_request_hook = lambda self: \
|
|
paste.registry.restorer.restoration_end()
|
|
test_app.post_request_hook = lambda self: \
|
|
paste.registry.restorer.restoration_begin(request_id)
|
|
|
|
# Restore the state of the Pylons special objects
|
|
# (StackedObjectProxies)
|
|
paste.registry.restorer.restoration_begin(request_id)
|
|
|
|
loaded_namespace = {}
|
|
|
|
if self.args[1:]:
|
|
execfile(self.args[1], loaded_namespace)
|
|
|
|
if self.options.command:
|
|
exec self.options.command in loaded_namespace
|