I might be tempted to squish up `versions_with_branch` and `versions_without_branch`:

```
def empty_file_versions(self, versions, date):
    versions = self.filter_versions(versions, lambda x: x[1] < date)
    return (len(versions) == 5 and self.filter_versions(all_versions, 'mkbranchversion', date)) or
        (len(versions) == 3 and filter(lambda x: x[0] == 'mkelemversion', versions))
```