| 
					
				 | 
			
			
				@@ -243,7 +243,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         manifest = Manifest(key, repository) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         manifest.key = key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         manifest.write() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        repository.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        repository.commit(compact=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         with Cache(repository, key, manifest, warn_if_unencrypted=False): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             pass 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if key.tam_required: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1012,7 +1012,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         name = replace_placeholders(args.name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         archive.rename(name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         manifest.write() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        repository.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        repository.commit(compact=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         cache.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return self.exit_code 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1062,7 +1062,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             elif deleted: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 manifest.write() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 # note: might crash in compact() after committing the repo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                repository.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                repository.commit(compact=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 logger.info('Done. Run "borg check --repair" to clean up the mess.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 logger.warning('Aborted.') 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1078,7 +1078,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         stats, progress=args.progress, forced=args.forced) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if not dry_run: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 manifest.write() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                repository.commit(save_space=args.save_space) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                repository.commit(compact=False, save_space=args.save_space) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 cache.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if args.stats: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 log_multi(DASHES, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1387,7 +1387,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             pi.finish() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if to_delete and not args.dry_run: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 manifest.write() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                repository.commit(save_space=args.save_space) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                repository.commit(compact=False, save_space=args.save_space) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 cache.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if args.stats: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 log_multi(DASHES, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1414,7 +1414,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     print(format_archive(archive_info), '[%s]' % bin_to_hex(archive_info.id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 manifest.config[b'tam_required'] = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 manifest.write() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                repository.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                repository.commit(compact=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if not key.tam_required: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 key.tam_required = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 key.change_passphrase(key._passphrase) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1437,7 +1437,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     print('Key location:', key.find_key()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             manifest.config[b'tam_required'] = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             manifest.write() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            repository.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            repository.commit(compact=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             # mainly for upgrades from Attic repositories, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             # but also supports borg 0.xx -> 1.0 upgrade. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1500,7 +1500,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     logger.info('Skipped archive %s: Nothing to do. Archive was not processed.', name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if not args.dry_run: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             manifest.write() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            repository.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            repository.commit(compact=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             cache.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return self.exit_code 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1532,7 +1532,16 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             # that would be bad if somebody uses rsync with ignore-existing (or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             # any other mechanism relying on existing segment data not changing). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             # see issue #1867. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            repository.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            repository.commit(compact=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @with_repository(manifest=False, exclusive=True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def do_compact(self, args, repository): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """compact segment files in the repository""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # see the comment in do_with_lock about why we do it like this: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = repository.get(Manifest.MANIFEST_ID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        repository.put(Manifest.MANIFEST_ID, data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        repository.commit(compact=True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return EXIT_SUCCESS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @with_repository(exclusive=True, manifest=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def do_config(self, args, repository): 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1788,7 +1797,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             h = hashlib.sha256(data)  # XXX hardcoded 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             repository.put(h.digest(), data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             print("object %s put." % h.hexdigest()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        repository.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        repository.commit(compact=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return EXIT_SUCCESS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @with_repository(manifest=False, exclusive=True) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1808,7 +1817,7 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 except Repository.ObjectNotFound: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     print("object %s not found." % hex_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if modified: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            repository.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            repository.commit(compact=False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         print('Done.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return EXIT_SUCCESS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3686,6 +3695,19 @@ class Archiver: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         subparser.add_argument('args', metavar='ARGS', nargs=argparse.REMAINDER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                help='command arguments') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        compact_epilog = process_epilog(""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        This command frees repository space by compacting segments. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subparser = subparsers.add_parser('compact', parents=[common_parser], add_help=False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                          description=self.do_compact.__doc__, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                          epilog=compact_epilog, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                          formatter_class=argparse.RawDescriptionHelpFormatter, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                          help='compact segment files / free space in repo') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subparser.set_defaults(func=self.do_compact) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subparser.add_argument('location', metavar='REPOSITORY', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               type=location_validator(archive=False), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               help='repository to compact') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         config_epilog = process_epilog(""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         This command gets and sets options in a local repository or cache config file. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         For security reasons, this command only works on local repositories. 
			 |