If you have both self.options.change_batch_size and self.options.maximum set, missingChanges does unnecessary work.
It first creates a copy of the 'changes' list by indexing into it with self.options.change_batch_size. Then, if you also have maximum set, it repeats that step with self.options.change_batch_size.maximum. It appears that the intention is for self.options.maximum to act as an override; if so, we could avoid the second list copy by restructuring that code to be an else-if block, where it checks for self.options.maximum first, e.g.
maxChanges = 0
if self.options.maximum:
maxChanges = self.options.maximum
elif self.options.change_batch_size:
maxChanges = self.options.change_batch_size
if maxChanges > 0:
changes = changes[:maxChanges]
Err, not sure why some parts of this are bolded...