| 
					
				 | 
			
			
				@@ -11,7 +11,6 @@ from borgmatic.config import convert, generate, legacy, validate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 DEFAULT_SOURCE_CONFIG_FILENAME = '/etc/borgmatic/config' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-# TODO: Fold excludes into the YAML config file. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 DEFAULT_SOURCE_EXCLUDES_FILENAME = '/etc/borgmatic/excludes' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 DEFAULT_DESTINATION_CONFIG_FILENAME = '/etc/borgmatic/config.yaml' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -21,16 +20,27 @@ def parse_arguments(*arguments): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Given command-line arguments with which this script was invoked, parse the arguments and return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     them as an ArgumentParser instance. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ''' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    parser = ArgumentParser(description='Convert a legacy INI-style borgmatic configuration file to YAML. Does not preserve comments.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser = ArgumentParser( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        description=''' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Convert legacy INI-style borgmatic configuration and excludes files to a single YAML 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            configuration file. Note that this replaces any comments from the source files. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ''' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     parser.add_argument( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        '-s', '--source', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        dest='source_filename', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        '-s', '--source-config', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        dest='source_config_filename', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         default=DEFAULT_SOURCE_CONFIG_FILENAME, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         help='Source INI-style configuration filename. Default: {}'.format(DEFAULT_SOURCE_CONFIG_FILENAME), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     parser.add_argument( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        '-d', '--destination', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        dest='destination_filename', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        '-e', '--source-excludes', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        dest='source_excludes_filename', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        default=DEFAULT_SOURCE_EXCLUDES_FILENAME if os.path.exists(DEFAULT_SOURCE_EXCLUDES_FILENAME) else None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        help='Excludes filename', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parser.add_argument( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        '-d', '--destination-config', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        dest='destination_config_filename', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         default=DEFAULT_DESTINATION_CONFIG_FILENAME, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         help='Destination YAML configuration filename. Default: {}'.format(DEFAULT_DESTINATION_CONFIG_FILENAME), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -41,12 +51,17 @@ def parse_arguments(*arguments): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def main():  # pragma: no cover 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         args = parse_arguments(*sys.argv[1:]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        source_config = legacy.parse_configuration(args.source_filename, legacy.CONFIG_FORMAT) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         schema = yaml.round_trip_load(open(validate.schema_filename()).read()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        source_config = legacy.parse_configuration(args.source_config_filename, legacy.CONFIG_FORMAT) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        source_excludes = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            open(args.source_excludes_filename).read().splitlines() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if args.source_excludes_filename 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        destination_config = convert.convert_legacy_parsed_config(source_config, schema) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        destination_config = convert.convert_legacy_parsed_config(source_config, source_excludes, schema) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        generate.write_configuration(args.destination_filename, destination_config) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        generate.write_configuration(args.destination_config_filename, destination_config) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # TODO: As a backstop, check that the written config can actually be read and parsed, and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # that it matches the destination config data structure that was written. 
			 |