comparison piecrust/publishing/base.py @ 954:d709429f02eb

publish: Add more options for logging, better feedback when it fails.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 05 Oct 2017 21:30:25 -0700
parents 13e8b50a2113
children
comparison
equal deleted inserted replaced
953:e04f2ad5f931 954:d709429f02eb
68 def __init__(self, appfactory, app): 68 def __init__(self, appfactory, app):
69 self.appfactory = appfactory 69 self.appfactory = appfactory
70 self.app = app 70 self.app = app
71 71
72 def run(self, target, 72 def run(self, target,
73 force=False, preview=False, extra_args=None, log_file=None): 73 force=False, preview=False, extra_args=None,
74 log_file=None, log_debug_info=False, append_log_file=False):
74 start_time = time.perf_counter() 75 start_time = time.perf_counter()
75 76
76 # Get publisher for this target. 77 # Get publisher for this target.
77 pub = self.app.getPublisher(target) 78 pub = self.app.getPublisher(target)
78 if pub is None: 79 if pub is None:
85 # Setup logging stuff. 86 # Setup logging stuff.
86 hdlr = None 87 hdlr = None
87 root_logger = logging.getLogger() 88 root_logger = logging.getLogger()
88 if log_file and not preview: 89 if log_file and not preview:
89 logger.debug("Adding file handler for: %s" % log_file) 90 logger.debug("Adding file handler for: %s" % log_file)
90 hdlr = logging.FileHandler(log_file, mode='w', encoding='utf8') 91 mode = 'w'
92 if append_log_file:
93 mode = 'a'
94 hdlr = logging.FileHandler(log_file, mode=mode, encoding='utf8')
91 root_logger.addHandler(hdlr) 95 root_logger.addHandler(hdlr)
96
97 if log_debug_info:
98 _log_debug_info(target, force, preview, extra_args)
99
92 if not preview: 100 if not preview:
93 logger.info("Deploying to %s" % target) 101 logger.info("Deploying to %s" % target)
94 else: 102 else:
95 logger.info("Previewing deployment to %s" % target) 103 logger.info("Previewing deployment to %s" % target)
96 104
120 logger.debug( 128 logger.debug(
121 "Running publish target '%s' with publisher: %s" % 129 "Running publish target '%s' with publisher: %s" %
122 (target, pub.PUBLISHER_NAME)) 130 (target, pub.PUBLISHER_NAME))
123 pub_start_time = time.perf_counter() 131 pub_start_time = time.perf_counter()
124 132
133 success = False
125 ctx = PublishingContext() 134 ctx = PublishingContext()
126 ctx.bake_out_dir = bake_out_dir 135 ctx.bake_out_dir = bake_out_dir
127 ctx.bake_records = records 136 ctx.bake_records = records
128 ctx.was_baked = was_baked 137 ctx.was_baked = was_baked
129 ctx.preview = preview 138 ctx.preview = preview
130 ctx.args = extra_args 139 ctx.args = extra_args
131 try: 140 try:
132 pub.run(ctx) 141 success = pub.run(ctx)
133 except Exception as ex: 142 except Exception as ex:
134 raise PublishingError( 143 raise PublishingError(
135 "Error publishing to target: %s" % target) from ex 144 "Error publishing to target: %s" % target) from ex
136 finally: 145 finally:
137 if hdlr: 146 if hdlr:
139 hdlr.close() 148 hdlr.close()
140 149
141 logger.info(format_timed( 150 logger.info(format_timed(
142 pub_start_time, "Ran publisher %s" % pub.PUBLISHER_NAME)) 151 pub_start_time, "Ran publisher %s" % pub.PUBLISHER_NAME))
143 152
144 logger.info(format_timed(start_time, 'Deployed to %s' % target)) 153 if success:
154 logger.info(format_timed(start_time, 'Deployed to %s' % target))
155 return 0
156 else:
157 logger.error(format_timed(start_time, 'Failed to deploy to %s' %
158 target))
159 return 1
145 160
146 161
147 def find_publisher_class(app, name, is_scheme=False): 162 def find_publisher_class(app, name, is_scheme=False):
148 attr_name = 'PUBLISHER_SCHEME' if is_scheme else 'PUBLISHER_NAME' 163 attr_name = 'PUBLISHER_SCHEME' if is_scheme else 'PUBLISHER_NAME'
149 for pub_cls in app.plugin_loader.getPublishers(): 164 for pub_cls in app.plugin_loader.getPublishers():
157 pub_cls = find_publisher_class(app, scheme, True) 172 pub_cls = find_publisher_class(app, scheme, True)
158 if pub_cls: 173 if pub_cls:
159 return pub_cls.PUBLISHER_NAME 174 return pub_cls.PUBLISHER_NAME
160 return None 175 return None
161 176
177
178 def _log_debug_info(target, force, preview, extra_args):
179 import os
180 import sys
181
182 logger.info("---- DEBUG INFO START ----")
183 logger.info("System:")
184 logger.info(" sys.argv=%s" % sys.argv)
185 logger.info(" sys.base_exec_prefix=%s" % sys.base_exec_prefix)
186 logger.info(" sys.base_prefix=%s" % sys.base_prefix)
187 logger.info(" sys.exec_prefix=%s" % sys.exec_prefix)
188 logger.info(" sys.executable=%s" % sys.executable)
189 logger.info(" sys.path=%s" % sys.path)
190 logger.info(" sys.platform=%s" % sys.platform)
191 logger.info(" sys.prefix=%s" % sys.prefix)
192 logger.info("Environment:")
193 logger.info(" cwd=%s" % os.getcwd())
194 logger.info(" pid=%s" % os.getpid())
195 logger.info("Variables:")
196 for k, v in os.environ.items():
197 logger.info(" %s=%s" % (k, v))
198 logger.info("---- DEBUG INFO END ----")
199