def _from_lines(klass, line_iter): stanza = rio.read_patch_stanza(line_iter) patch_lines = list(line_iter) if len(patch_lines) == 0: patch = None patch_type = None else: patch = ''.join(patch_lines) try: bundle_serializer.read_bundle(StringIO(patch)) except (errors.NotABundle, errors.BundleNotSupported, errors.BadBundle): patch_type = 'diff' else: patch_type = 'bundle' time, timezone = timestamp.parse_patch_date(stanza.get('timestamp')) kwargs = {} for key in ('revision_id', 'testament_sha1', 'target_branch', 'source_branch', 'message'): try: kwargs[key] = stanza.get(key) except KeyError: pass kwargs['revision_id'] = kwargs['revision_id'].encode('utf-8') return MergeDirective(time=time, timezone=timezone, patch_type=patch_type, patch=patch, **kwargs)
def run(self, location, verbose=False): from bzrlib.bundle.serializer import read_bundle from bzrlib.bundle import read_mergeable_from_url from bzrlib import osutils term_encoding = osutils.get_terminal_encoding() bundle_info = read_mergeable_from_url(location) if isinstance(bundle_info, merge_directive._BaseMergeDirective): bundle_file = StringIO(bundle_info.get_raw_bundle()) bundle_info = read_bundle(bundle_file) else: if verbose: raise errors.BzrCommandError('--verbose requires a merge' ' directive') reader_method = getattr(bundle_info, 'get_bundle_reader', None) if reader_method is None: raise errors.BzrCommandError('Bundle format not supported') by_kind = {} file_ids = set() for bytes, parents, repo_kind, revision_id, file_id\ in reader_method().iter_records(): by_kind.setdefault(repo_kind, []).append( (bytes, parents, repo_kind, revision_id, file_id)) if file_id is not None: file_ids.add(file_id) self.outf.write('Records\n') for kind, records in sorted(by_kind.iteritems()): multiparent = sum(1 for b, m, k, r, f in records if len(m.get('parents', [])) > 1) self.outf.write('%s: %d (%d multiparent)\n' % \ (kind, len(records), multiparent)) self.outf.write('unique files: %d\n' % len(file_ids)) self.outf.write('\n') nicks = set() committers = set() for revision in bundle_info.real_revisions: if 'branch-nick' in revision.properties: nicks.add(revision.properties['branch-nick']) committers.add(revision.committer) self.outf.write('Revisions\n') self.outf.write(('nicks: %s\n' % ', '.join(sorted(nicks))).encode( term_encoding, 'replace')) self.outf.write( ('committers: \n%s\n' % '\n'.join(sorted(committers)).encode(term_encoding, 'replace'))) if verbose: self.outf.write('\n') bundle_file.seek(0) line = bundle_file.readline() line = bundle_file.readline() content = bundle_file.read().decode('bz2') self.outf.write("Decoded contents\n") self.outf.write(content) self.outf.write('\n')
def run(self, location, verbose=False): from bzrlib.bundle.serializer import read_bundle from bzrlib.bundle import read_mergeable_from_url from bzrlib import osutils term_encoding = osutils.get_terminal_encoding() bundle_info = read_mergeable_from_url(location) if isinstance(bundle_info, merge_directive.BaseMergeDirective): bundle_file = StringIO(bundle_info.get_raw_bundle()) bundle_info = read_bundle(bundle_file) else: if verbose: raise errors.BzrCommandError(gettext( '--verbose requires a merge directive')) reader_method = getattr(bundle_info, 'get_bundle_reader', None) if reader_method is None: raise errors.BzrCommandError(gettext('Bundle format not supported')) by_kind = {} file_ids = set() for bytes, parents, repo_kind, revision_id, file_id\ in reader_method().iter_records(): by_kind.setdefault(repo_kind, []).append( (bytes, parents, repo_kind, revision_id, file_id)) if file_id is not None: file_ids.add(file_id) self.outf.write(gettext('Records\n')) for kind, records in sorted(by_kind.iteritems()): multiparent = sum(1 for b, m, k, r, f in records if len(m.get('parents', [])) > 1) self.outf.write(gettext('{0}: {1} ({2} multiparent)\n').format( kind, len(records), multiparent)) self.outf.write(gettext('unique files: %d\n') % len(file_ids)) self.outf.write('\n') nicks = set() committers = set() for revision in bundle_info.real_revisions: if 'branch-nick' in revision.properties: nicks.add(revision.properties['branch-nick']) committers.add(revision.committer) self.outf.write(gettext('Revisions\n')) self.outf.write((gettext('nicks: %s\n') % ', '.join(sorted(nicks))).encode(term_encoding, 'replace')) self.outf.write((gettext('committers: \n%s\n') % '\n'.join(sorted(committers)).encode(term_encoding, 'replace'))) if verbose: self.outf.write('\n') bundle_file.seek(0) line = bundle_file.readline() line = bundle_file.readline() content = bundle_file.read().decode('bz2') self.outf.write(gettext("Decoded contents\n")) self.outf.write(content) self.outf.write('\n')
def install_revisions(self, target_repo): """Install revisions and return the target revision""" if not target_repo.has_revision(self.revision_id): if self.patch_type == 'bundle': info = bundle_serializer.read_bundle( StringIO(self.get_raw_bundle())) # We don't use the bundle's target revision, because # MergeDirective.revision_id is authoritative. try: info.install_revisions(target_repo, stream_input=False) except errors.RevisionNotPresent: # At least one dependency isn't present. Try installing # missing revisions from the submit branch try: submit_branch = \ _mod_branch.Branch.open(self.target_branch) except errors.NotBranchError: raise errors.TargetNotBranch(self.target_branch) missing_revisions = [] bundle_revisions = set(r.revision_id for r in info.real_revisions) for revision in info.real_revisions: for parent_id in revision.parent_ids: if (parent_id not in bundle_revisions and not target_repo.has_revision(parent_id)): missing_revisions.append(parent_id) # reverse missing revisions to try to get heads first unique_missing = [] unique_missing_set = set() for revision in reversed(missing_revisions): if revision in unique_missing_set: continue unique_missing.append(revision) unique_missing_set.add(revision) for missing_revision in unique_missing: target_repo.fetch(submit_branch.repository, missing_revision) info.install_revisions(target_repo, stream_input=False) else: source_branch = _mod_branch.Branch.open(self.source_branch) target_repo.fetch(source_branch.repository, self.revision_id) return self.revision_id
def assertSendSucceeds(self, args, revs=None, with_warning=False): if with_warning: err_re = self._default_errors else: err_re = [] if revs is None: revs = self._default_sent_revs out, err = self.run_send(args, err_re=err_re) if len(revs) == 1: bundling_revs = "Bundling %d revision.\n" % len(revs) else: bundling_revs = "Bundling %d revisions.\n" % len(revs) if with_warning: self.assertContainsRe(err, self._default_additional_warning) self.assertEndsWith(err, bundling_revs) else: self.assertEquals(bundling_revs, err) md = merge_directive.MergeDirective.from_lines(StringIO(out)) self.assertEqual("parent", md.base_revision_id) br = serializer.read_bundle(StringIO(md.get_raw_bundle())) self.assertEqual(set(revs), set(r.revision_id for r in br.revisions))
def assertSendSucceeds(self, args, revs=None, with_warning=False): if with_warning: err_re = self._default_errors else: err_re = [] if revs is None: revs = self._default_sent_revs out, err = self.run_send(args, err_re=err_re) if len(revs) == 1: bundling_revs = 'Bundling %d revision.\n' % len(revs) else: bundling_revs = 'Bundling %d revisions.\n' % len(revs) if with_warning: self.assertContainsRe(err, self._default_additional_warning) self.assertEndsWith(err, bundling_revs) else: self.assertEqual(bundling_revs, err) md = merge_directive.MergeDirective.from_lines(StringIO(out)) self.assertEqual('parent', md.base_revision_id) br = serializer.read_bundle(StringIO(md.get_raw_bundle())) self.assertEqual(set(revs), set(r.revision_id for r in br.revisions))
def assertBundleContains(self, revs, args, cmd=None, wd="branch"): md = self.get_MD(args, cmd=cmd, wd=wd) br = serializer.read_bundle(StringIO(md.get_raw_bundle())) self.assertEqual(set(revs), set(r.revision_id for r in br.revisions))
def read_bundle(fileobj): md = merge_directive.MergeDirective.from_lines(fileobj.readlines()) return serializer.read_bundle(StringIO(md.get_raw_bundle()))
def assertBundleContains(self, revs, args, cmd=None, wd='branch'): md = self.get_MD(args, cmd=cmd, wd=wd) br = serializer.read_bundle(StringIO(md.get_raw_bundle())) self.assertEqual(set(revs), set(r.revision_id for r in br.revisions))