|
@@ -1576,6 +1576,13 @@ class Archiver:
|
|
|
print("object %s not found [info from chunks cache]." % hex_id)
|
|
|
return EXIT_SUCCESS
|
|
|
|
|
|
+ def do_debug_convert_profile(self, args):
|
|
|
+ """convert Borg profile to Python profile"""
|
|
|
+ import marshal
|
|
|
+ with args.output, args.input:
|
|
|
+ marshal.dump(msgpack.unpack(args.input, use_list=False, encoding='utf-8'), args.output)
|
|
|
+ return EXIT_SUCCESS
|
|
|
+
|
|
|
@with_repository(lock=False, manifest=False)
|
|
|
def do_break_lock(self, args, repository):
|
|
|
"""Break the repository lock (e.g. in case it was left by a dead borg."""
|
|
@@ -2050,7 +2057,7 @@ class Archiver:
|
|
|
action='store_true', default=False,
|
|
|
help='treat part files like normal files (e.g. to list/extract them)')
|
|
|
add_common_option('--debug-profile', dest='debug_profile', default=None, metavar='FILE',
|
|
|
- help='Write Python profile in msgpack format into FILE. For local use a cProfile-'
|
|
|
+ help='Write execution profile in Borg format into FILE. For local use a Python-'
|
|
|
'compatible file can be generated by suffixing FILE with ".pyprof".')
|
|
|
|
|
|
parser = argparse.ArgumentParser(prog=self.prog, description='Borg - Deduplicated Backups',
|
|
@@ -3390,6 +3397,20 @@ class Archiver:
|
|
|
subparser.add_argument('ids', metavar='IDs', nargs='+', type=str,
|
|
|
help='hex object ID(s) to show refcounts for')
|
|
|
|
|
|
+ debug_convert_profile_epilog = process_epilog("""
|
|
|
+ Convert a Borg profile to a Python cProfile compatible profile.
|
|
|
+ """)
|
|
|
+ subparser = debug_parsers.add_parser('convert-profile', parents=[common_parser], add_help=False,
|
|
|
+ description=self.do_debug_convert_profile.__doc__,
|
|
|
+ epilog=debug_convert_profile_epilog,
|
|
|
+ formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
|
+ help='convert Borg profile to Python profile (debug)')
|
|
|
+ subparser.set_defaults(func=self.do_debug_convert_profile)
|
|
|
+ subparser.add_argument('input', metavar='INPUT', type=argparse.FileType('rb'),
|
|
|
+ help='Borg profile')
|
|
|
+ subparser.add_argument('output', metavar='OUTPUT', type=argparse.FileType('wb'),
|
|
|
+ help='Output file')
|
|
|
+
|
|
|
benchmark_epilog = process_epilog("These commands do various benchmarks.")
|
|
|
|
|
|
subparser = subparsers.add_parser('benchmark', parents=[mid_common_parser], add_help=False,
|
|
@@ -3551,7 +3572,7 @@ class Archiver:
|
|
|
import marshal
|
|
|
logger.debug('Writing execution profile to %s', args.debug_profile)
|
|
|
# Open the file early, before running the main program, to avoid
|
|
|
- # a very late crash in case the specified path is invalid
|
|
|
+ # a very late crash in case the specified path is invalid.
|
|
|
with open(args.debug_profile, 'wb') as fd:
|
|
|
profiler = cProfile.Profile()
|
|
|
variables = dict(locals())
|