cli: add --mi-version to print produced MI version
[deliverable/lttng-analyses.git] / lttnganalyses / cli / command.py
index bdf371eea6f0c0f838954d0a79883c9bde3a4ff4..602d7dd722d5baa05e184b4897dadc530925d72f 100644 (file)
@@ -72,7 +72,10 @@ class Command:
         except KeyboardInterrupt:
             sys.exit(0)
 
-    def _error(self, msg, exit_code=1):
+    def _mi_error(self, msg, code=None):
+        print(json.dumps(mi.get_error(msg, code)))
+
+    def _non_mi_error(self, msg):
         try:
             import termcolor
 
@@ -81,6 +84,13 @@ class Command:
             pass
 
         print(msg, file=sys.stderr)
+
+    def _error(self, msg, code, exit_code=1):
+        if self._mi_mode:
+            self._mi_error(msg)
+        else:
+            self._non_mi_error(msg)
+
         sys.exit(exit_code)
 
     def _gen_error(self, msg, exit_code=1):
@@ -162,6 +172,8 @@ class Command:
             self._gen_error('Failed to open ' + self._args.path, -1)
         self._handles = handles
         self._traces = traces
+        self._ts_begin = traces.timestamp_begin
+        self._ts_end = traces.timestamp_end
         self._process_date_args()
         self._read_tracer_version()
         if not self._args.skip_validation:
@@ -215,7 +227,12 @@ class Command:
         )
 
     def _check_lost_events(self):
-        self._print('Checking the trace for lost events...')
+        msg = 'Checking the trace for lost events...'
+        self._print(msg)
+
+        if self._mi_mode and self._args.output_progress:
+            mi.print_progress(0, msg)
+
         try:
             subprocess.check_output('babeltrace "%s"' % self._args.path,
                                     shell=True)
@@ -235,18 +252,47 @@ class Command:
 
         self._mi_print()
 
+    def _pb_setup(self):
+        if self._args.no_progress:
+            return
+
+        ts_end = self._ts_end
+
+        if self._analysis_conf.end_ts is not None:
+            ts_end = self._analysis_conf.end_ts
+
+        if self._mi_mode:
+            cls = progressbar.MiProgress
+        else:
+            cls = progressbar.FancyProgressBar
+
+        self._progress = cls(self._ts_begin, ts_end, self._args.path,
+                             self._args.progress_use_size)
+
+    def _pb_update(self, event):
+        if self._args.no_progress:
+            return
+
+        self._progress.update(event)
+
+    def _pb_finish(self):
+        if self._args.no_progress:
+            return
+
+        self._progress.finalize()
+
     def _run_analysis(self):
         self._pre_analysis()
-        progressbar.progressbar_setup(self)
+        self._pb_setup()
 
         for event in self._traces.events:
-            progressbar.progressbar_update(self)
+            self._pb_update(event)
             self._analysis.process_event(event)
             if self._analysis.ended:
                 break
             self._automaton.process_event(event)
 
-        progressbar.progressbar_finish(self)
+        self._pb_finish()
         self._analysis.end()
         self._post_analysis()
 
@@ -347,8 +393,10 @@ class Command:
                 args.freq_uniform = True
 
         if self._mi_mode:
-            # force no progress in MI mode
-            args.no_progress = True
+            # print MI version if required
+            if args.mi_version:
+                print(mi.get_version_string())
+                sys.exit(0)
 
             # print MI metadata if required
             if args.metadata:
@@ -401,15 +449,21 @@ class Command:
                         'CPU IDs')
         ap.add_argument('--timerange', type=str, help='time range: '
                                                       '[begin,end]')
+        ap.add_argument('--progress-use-size', action='store_true',
+                        help='use trace size to approximate progress')
         ap.add_argument('-V', '--version', action='version',
                         version='LTTng Analyses v' + __version__)
 
         # MI mode-dependent arguments
         if self._mi_mode:
+            ap.add_argument('--mi-version', action='store_true',
+                            help='Print MI version')
             ap.add_argument('--metadata', action='store_true',
-                            help='Show analysis\'s metadata')
+                            help='Print analysis\' metadata')
             ap.add_argument('path', metavar='<path/to/trace>',
                             help='trace path', nargs='*')
+            ap.add_argument('--output-progress', action='store_true',
+                            help='Print progress indication lines')
         else:
             ap.add_argument('--no-progress', action='store_true',
                             help='Don\'t display the progress bar')
@@ -420,6 +474,13 @@ class Command:
         self._add_arguments(ap)
 
         args = ap.parse_args()
+
+        if self._mi_mode:
+            args.no_progress = True
+
+            if args.output_progress:
+                args.no_progress = False
+
         self._validate_transform_common_args(args)
         self._validate_transform_args(args)
         self._args = args
@@ -516,8 +577,8 @@ class Command:
                 # it always is in older versions of babeltrace. In
                 # that case, the test is simply skipped and an invalid
                 # --end value will cause an empty analysis
-                if self._traces.timestamp_begin is not None and \
-                   end_ts < self._traces.timestamp_begin:
+                if self._ts_begin is not None and \
+                   end_ts < self._ts_begin:
                     self._cmdline_error(
                         '--end timestamp before beginning of trace')
 
This page took 0.026301 seconds and 5 git commands to generate.