예제 #1
0
 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)
예제 #2
0
 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)
예제 #3
0
    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')
예제 #4
0
    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')
예제 #5
0
 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
예제 #6
0
 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
예제 #7
0
 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))
예제 #8
0
 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))
예제 #9
0
 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))
예제 #10
0
def read_bundle(fileobj):
    md = merge_directive.MergeDirective.from_lines(fileobj.readlines())
    return serializer.read_bundle(StringIO(md.get_raw_bundle()))
예제 #11
0
 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))