237 return path or loc |
237 return path or loc |
238 |
238 |
239 def pushbuffer(self): |
239 def pushbuffer(self): |
240 self._buffers.append([]) |
240 self._buffers.append([]) |
241 |
241 |
242 def popbuffer(self): |
242 def popbuffer(self, labeled=False): |
|
243 '''pop the last buffer and return the buffered output |
|
244 |
|
245 If labeled is True, any labels associated with buffered |
|
246 output will be handled. By default, this has no effect |
|
247 on the output returned, but extensions and GUI tools may |
|
248 handle this argument and returned styled output. If output |
|
249 is being buffered so it can be captured and parsed or |
|
250 processed, labeled should not be set to True. |
|
251 ''' |
243 return "".join(self._buffers.pop()) |
252 return "".join(self._buffers.pop()) |
244 |
253 |
245 def write(self, *args): |
254 def write(self, *args, **opts): |
|
255 '''write args to output |
|
256 |
|
257 By default, this method simply writes to the buffer or stdout, |
|
258 but extensions or GUI tools may override this method, |
|
259 write_err(), popbuffer(), and label() to style output from |
|
260 various parts of hg. |
|
261 |
|
262 An optional keyword argument, "label", can be passed in. |
|
263 This should be a string containing label names separated by |
|
264 space. Label names take the form of "topic.type". For example, |
|
265 ui.debug() issues a label of "ui.debug". |
|
266 |
|
267 When labeling output for a specific command, a label of |
|
268 "cmdname.type" is recommended. For example, status issues |
|
269 a label of "status.modified" for modified files. |
|
270 ''' |
246 if self._buffers: |
271 if self._buffers: |
247 self._buffers[-1].extend([str(a) for a in args]) |
272 self._buffers[-1].extend([str(a) for a in args]) |
248 else: |
273 else: |
249 for a in args: |
274 for a in args: |
250 sys.stdout.write(str(a)) |
275 sys.stdout.write(str(a)) |
251 |
276 |
252 def write_err(self, *args): |
277 def write_err(self, *args, **opts): |
253 try: |
278 try: |
254 if not getattr(sys.stdout, 'closed', False): |
279 if not getattr(sys.stdout, 'closed', False): |
255 sys.stdout.flush() |
280 sys.stdout.flush() |
256 for a in args: |
281 for a in args: |
257 sys.stderr.write(str(a)) |
282 sys.stderr.write(str(a)) |
333 return default |
358 return default |
334 try: |
359 try: |
335 return getpass.getpass(prompt or _('password: ')) |
360 return getpass.getpass(prompt or _('password: ')) |
336 except EOFError: |
361 except EOFError: |
337 raise util.Abort(_('response expected')) |
362 raise util.Abort(_('response expected')) |
338 def status(self, *msg): |
363 def status(self, *msg, **opts): |
|
364 '''write status message to output (if ui.quiet is False) |
|
365 |
|
366 This adds an output label of "ui.status". |
|
367 ''' |
339 if not self.quiet: |
368 if not self.quiet: |
340 self.write(*msg) |
369 opts['label'] = opts.get('label', '') + ' ui.status' |
341 def warn(self, *msg): |
370 self.write(*msg, **opts) |
342 self.write_err(*msg) |
371 def warn(self, *msg, **opts): |
343 def note(self, *msg): |
372 '''write warning message to output (stderr) |
|
373 |
|
374 This adds an output label of "ui.warning". |
|
375 ''' |
|
376 opts['label'] = opts.get('label', '') + ' ui.warning' |
|
377 self.write_err(*msg, **opts) |
|
378 def note(self, *msg, **opts): |
|
379 '''write note to output (if ui.verbose is True) |
|
380 |
|
381 This adds an output label of "ui.note". |
|
382 ''' |
344 if self.verbose: |
383 if self.verbose: |
345 self.write(*msg) |
384 opts['label'] = opts.get('label', '') + ' ui.note' |
346 def debug(self, *msg): |
385 self.write(*msg, **opts) |
|
386 def debug(self, *msg, **opts): |
|
387 '''write debug message to output (if ui.debugflag is True) |
|
388 |
|
389 This adds an output label of "ui.debug". |
|
390 ''' |
347 if self.debugflag: |
391 if self.debugflag: |
348 self.write(*msg) |
392 opts['label'] = opts.get('label', '') + ' ui.debug' |
|
393 self.write(*msg, **opts) |
349 def edit(self, text, user): |
394 def edit(self, text, user): |
350 (fd, name) = tempfile.mkstemp(prefix="hg-editor-", suffix=".txt", |
395 (fd, name) = tempfile.mkstemp(prefix="hg-editor-", suffix=".txt", |
351 text=True) |
396 text=True) |
352 try: |
397 try: |
353 f = os.fdopen(fd, "w") |
398 f = os.fdopen(fd, "w") |
415 pct = 100.0 * pos / total |
460 pct = 100.0 * pos / total |
416 self.debug('%s:%s %s/%s%s (%4.2f%%)\n' |
461 self.debug('%s:%s %s/%s%s (%4.2f%%)\n' |
417 % (topic, item, pos, total, unit, pct)) |
462 % (topic, item, pos, total, unit, pct)) |
418 else: |
463 else: |
419 self.debug('%s:%s %s%s\n' % (topic, item, pos, unit)) |
464 self.debug('%s:%s %s%s\n' % (topic, item, pos, unit)) |
|
465 |
|
466 def label(self, msg, label): |
|
467 '''style msg based on supplied label |
|
468 |
|
469 Like ui.write(), this just returns msg unchanged, but extensions |
|
470 and GUI tools can override it to allow styling output without |
|
471 writing it. |
|
472 |
|
473 ui.write(s, 'label') is equivalent to |
|
474 ui.write(ui.label(s, 'label')). |
|
475 ''' |
|
476 return msg |