def _help_commands_to_text(topic): """Generate the help text for the list of commands""" out = [] if topic == 'hidden-commands': hidden = True else: hidden = False names = set(_mod_commands.builtin_command_names()) # to eliminate duplicates names.update(_mod_commands.plugin_command_names()) commands = ((n, _mod_commands.get_cmd_object(n)) for n in names) shown_commands = [(n, o) for n, o in commands if o.hidden == hidden] max_name = max(len(n) for n, o in shown_commands) indent = ' ' * (max_name + 1) width = osutils.terminal_width() - 1 for cmd_name, cmd_object in sorted(shown_commands): plugin_name = cmd_object.plugin_name() if plugin_name is None: plugin_name = '' else: plugin_name = ' [%s]' % plugin_name cmd_help = cmd_object.help() if cmd_help: firstline = cmd_help.split('\n', 1)[0] else: firstline = '' helpstring = '%-*s %s%s' % (max_name, cmd_name, firstline, plugin_name) lines = textwrap.wrap(helpstring, subsequent_indent=indent, width=width) for line in lines: out.append(line + '\n') return ''.join(out)
def _help_commands_to_text(topic): """Generate the help text for the list of commands""" out = [] if topic == 'hidden-commands': hidden = True else: hidden = False names = set( _mod_commands.builtin_command_names()) # to eliminate duplicates names.update(_mod_commands.plugin_command_names()) commands = ((n, _mod_commands.get_cmd_object(n)) for n in names) shown_commands = [(n, o) for n, o in commands if o.hidden == hidden] max_name = max(len(n) for n, o in shown_commands) indent = ' ' * (max_name + 1) width = osutils.terminal_width() - 1 for cmd_name, cmd_object in sorted(shown_commands): plugin_name = cmd_object.plugin_name() if plugin_name is None: plugin_name = '' else: plugin_name = ' [%s]' % plugin_name cmd_help = cmd_object.help() if cmd_help: firstline = cmd_help.split('\n', 1)[0] else: firstline = '' helpstring = '%-*s %s%s' % (max_name, cmd_name, firstline, plugin_name) lines = textwrap.wrap(helpstring, subsequent_indent=indent, width=width) for line in lines: out.append(line + '\n') return ''.join(out)
def __init__(self, **kwargs): from bzrlib.osutils import terminal_width _BaseProgressBar.__init__(self, **kwargs) self.spin_pos = 0 self.width = terminal_width() self.last_updates = [] self._max_last_updates = 10 self.child_fraction = 0 self._have_output = False
def __init__(self, width=None, **kwargs): if width is None: width = (osutils.terminal_width() or osutils.default_terminal_width) - 1 ambi_width = kwargs.pop('ambiguous_width', 1) if ambi_width == 1: self._east_asian_doublewidth = 'FW' elif ambi_width == 2: self._east_asian_doublewidth = 'FWA' else: raise ValueError("ambiguous_width should be 1 or 2") # No drop_whitespace param before Python 2.6 it was always dropped if sys.version_info < (2, 6): self.drop_whitespace = kwargs.pop("drop_whitespace", True) if not self.drop_whitespace: raise ValueError("TextWrapper version must drop whitespace") textwrap.TextWrapper.__init__(self, width, **kwargs)
def _help_commands_to_text(topic): """Generate the help text for the list of commands""" out = [] if topic == 'hidden-commands': hidden = True else: hidden = False names = list(_mod_commands.all_command_names()) commands = ((n, _mod_commands.get_cmd_object(n)) for n in names) shown_commands = [(n, o) for n, o in commands if o.hidden == hidden] max_name = max(len(n) for n, o in shown_commands) indent = ' ' * (max_name + 1) width = osutils.terminal_width() if width is None: width = osutils.default_terminal_width # we need one extra space for terminals that wrap on last char width = width - 1 for cmd_name, cmd_object in sorted(shown_commands): plugin_name = cmd_object.plugin_name() if plugin_name is None: plugin_name = '' else: plugin_name = ' [%s]' % plugin_name cmd_help = cmd_object.help() if cmd_help: firstline = cmd_help.split('\n', 1)[0] else: firstline = '' helpstring = '%-*s %s%s' % (max_name, cmd_name, firstline, plugin_name) lines = utextwrap.wrap( helpstring, subsequent_indent=indent, width=width, break_long_words=False) for line in lines: out.append(line + '\n') return ''.join(out)
def show_pending_merges(new, to_file, short=False): """Write out a display of pending merges in a working tree.""" parents = new.get_parent_ids() if len(parents) < 2: return # we need one extra space for terminals that wrap on last char term_width = osutils.terminal_width() - 1 if short: first_prefix = 'P ' sub_prefix = 'P. ' else: first_prefix = ' ' sub_prefix = ' ' pending = parents[1:] branch = new.branch last_revision = parents[0] if not short: to_file.write('pending merges:\n') graph = branch.repository.get_graph() other_revisions = [last_revision] log_formatter = log.LineLogFormatter(to_file) for merge in pending: try: rev = branch.repository.get_revisions([merge])[0] except errors.NoSuchRevision: # If we are missing a revision, just print out the revision id to_file.write(first_prefix + '(ghost) ' + merge + '\n') other_revisions.append(merge) continue # Log the merge, as it gets a slightly different formatting log_message = log_formatter.log_string(None, rev, term_width - len(first_prefix)) to_file.write(first_prefix + log_message + '\n') # Find all of the revisions in the merge source, which are not in the # last committed revision. merge_extra = graph.find_unique_ancestors(merge, other_revisions) other_revisions.append(merge) merge_extra.discard(_mod_revision.NULL_REVISION) # Get a handle to all of the revisions we will need try: revisions = dict( (rev.revision_id, rev) for rev in branch.repository.get_revisions(merge_extra)) except errors.NoSuchRevision: # One of the sub nodes is a ghost, check each one revisions = {} for revision_id in merge_extra: try: rev = branch.repository.get_revisions([revision_id])[0] except errors.NoSuchRevision: revisions[revision_id] = None else: revisions[revision_id] = rev # Display the revisions brought in by this merge. rev_id_iterator = _get_sorted_revisions( merge, merge_extra, branch.repository.get_parent_map(merge_extra)) # Skip the first node num, first, depth, eom = rev_id_iterator.next() if first != merge: raise AssertionError('Somehow we misunderstood how' ' iter_topo_order works %s != %s' % (first, merge)) for num, sub_merge, depth, eom in rev_id_iterator: rev = revisions[sub_merge] if rev is None: to_file.write(sub_prefix + '(ghost) ' + sub_merge + '\n') continue log_message = log_formatter.log_string( None, revisions[sub_merge], term_width - len(sub_prefix)) to_file.write(sub_prefix + log_message + '\n')
def test_bzr(self): from os import chdir, mkdir from os.path import exists progress = self.log progress("basic branch creation") mkdir('branch1') chdir('branch1') self.run_bzr('init') self.assertIsSameRealPath(self.run_bzr('root')[0].rstrip(), osutils.pathjoin(self.test_dir, 'branch1')) progress("status of new file") f = file('test.txt', 'wt') f.write('hello world!\n') f.close() self.assertEquals(self.run_bzr('unknowns')[0], 'test.txt\n') out = self.run_bzr("status")[0] self.assertEquals(out, 'unknown:\n test.txt\n') f = file('test2.txt', 'wt') f.write('goodbye cruel world...\n') f.close() out = self.run_bzr("status test.txt")[0] self.assertEquals(out, "unknown:\n test.txt\n") out = self.run_bzr("status")[0] self.assertEquals(out, ("unknown:\n" " test.txt\n" " test2.txt\n")) os.unlink('test2.txt') progress("command aliases") out = self.run_bzr("st")[0] self.assertEquals(out, ("unknown:\n" " test.txt\n")) out = self.run_bzr("stat")[0] self.assertEquals(out, ("unknown:\n" " test.txt\n")) progress("command help") self.run_bzr("help st") self.run_bzr("help") self.run_bzr("help commands") self.run_bzr("help slartibartfast", retcode=3) out = self.run_bzr("help ci")[0] out.index('Aliases: ci, checkin\n') f = file('hello.txt', 'wt') f.write('some nice new content\n') f.close() self.run_bzr("add hello.txt") f = file('msg.tmp', 'wt') f.write('this is my new commit\nand it has multiple lines, for fun') f.close() self.run_bzr('commit -F msg.tmp') self.assertEquals(self.run_bzr('revno')[0], '1\n') self.run_bzr('export -r 1 export-1.tmp') self.run_bzr('export export.tmp') self.run_bzr('log') self.run_bzr('log -v') self.run_bzr('log -v --forward') self.run_bzr('log -m', retcode=3) log_out = self.run_bzr('log -m commit')[0] self.assert_("this is my new commit\n and" in log_out) self.assert_("rename nested" not in log_out) self.assert_('revision-id' not in log_out) self.assert_('revision-id' in self.run_bzr('log --show-ids -m commit')[0]) log_out = self.run_bzr('log --line')[0] # determine the widest line we want max_width = osutils.terminal_width() if max_width is not None: for line in log_out.splitlines(): self.assert_(len(line) <= max_width - 1, len(line)) self.assert_("this is my new commit and" not in log_out) self.assert_("this is my new commit" in log_out) progress("file with spaces in name") mkdir('sub directory') with file('sub directory/file with spaces ', 'wt') as f: f.write('see how this works\n') self.run_bzr('add .') self.run_bzr('diff', retcode=1) self.run_bzr('commit -m add-spaces') self.run_bzr('check') self.run_bzr('log') self.run_bzr('log --forward') self.run_bzr('info') if osutils.has_symlinks(): progress("symlinks") mkdir('symlinks') chdir('symlinks') self.run_bzr('init') os.symlink("NOWHERE1", "link1") self.run_bzr('add link1') self.assertEquals(self.run_bzr('unknowns')[0], '') self.run_bzr(['commit', '-m', '1: added symlink link1']) mkdir('d1') self.run_bzr('add d1') self.assertEquals(self.run_bzr('unknowns')[0], '') os.symlink("NOWHERE2", "d1/link2") self.assertEquals(self.run_bzr('unknowns')[0], 'd1/link2\n') # is d1/link2 found when adding d1 self.run_bzr('add d1') self.assertEquals(self.run_bzr('unknowns')[0], '') os.symlink("NOWHERE3", "d1/link3") self.assertEquals(self.run_bzr('unknowns')[0], 'd1/link3\n') self.run_bzr(['commit', '-m', '2: added dir, symlink']) self.run_bzr('rename d1 d2') self.run_bzr('move d2/link2 .') self.run_bzr('move link1 d2') self.assertEquals(os.readlink("./link2"), "NOWHERE2") self.assertEquals(os.readlink("d2/link1"), "NOWHERE1") self.run_bzr('add d2/link3') self.run_bzr('diff', retcode=1) self.run_bzr(['commit', '-m', '3: rename of dir, move symlinks, add link3']) os.unlink("link2") os.symlink("TARGET 2", "link2") os.unlink("d2/link1") os.symlink("TARGET 1", "d2/link1") self.run_bzr('diff', retcode=1) self.assertEquals(self.run_bzr("relpath d2/link1")[0], "d2/link1\n") self.run_bzr(['commit', '-m', '4: retarget of two links']) self.run_bzr('remove --keep d2/link1') self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '5: remove d2/link1']) # try with the rm alias self.run_bzr('add d2/link1') self.run_bzr(['commit', '-m', '6: add d2/link1']) self.run_bzr('rm --keep d2/link1') self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '7: remove d2/link1']) os.mkdir("d1") self.run_bzr('add d1') self.run_bzr('rename d2/link3 d1/link3new') self.assertEquals(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '8: remove d2/link1, move/rename link3']) self.run_bzr('check') self.run_bzr('export -r 1 exp1.tmp') chdir("exp1.tmp") self.assertEquals(listdir_sorted("."), [ "link1" ]) self.assertEquals(os.readlink("link1"), "NOWHERE1") chdir("..") self.run_bzr('export -r 2 exp2.tmp') chdir("exp2.tmp") self.assertEquals(listdir_sorted("."), [ "d1", "link1" ]) chdir("..") self.run_bzr('export -r 3 exp3.tmp') chdir("exp3.tmp") self.assertEquals(listdir_sorted("."), [ "d2", "link2" ]) self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ]) self.assertEquals(os.readlink("d2/link1"), "NOWHERE1") self.assertEquals(os.readlink("link2") , "NOWHERE2") chdir("..") self.run_bzr('export -r 4 exp4.tmp') chdir("exp4.tmp") self.assertEquals(listdir_sorted("."), [ "d2", "link2" ]) self.assertEquals(os.readlink("d2/link1"), "TARGET 1") self.assertEquals(os.readlink("link2") , "TARGET 2") self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ]) chdir("..") self.run_bzr('export -r 5 exp5.tmp') chdir("exp5.tmp") self.assertEquals(listdir_sorted("."), [ "d2", "link2" ]) self.assert_(os.path.islink("link2")) self.assert_(listdir_sorted("d2")== [ "link3" ]) chdir("..") self.run_bzr('export -r 8 exp6.tmp') chdir("exp6.tmp") self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"]) self.assertEquals(listdir_sorted("d1"), [ "link3new" ]) self.assertEquals(listdir_sorted("d2"), []) self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3") chdir("..") else: progress("skipping symlink tests")
def show_pending_merges(new, to_file, short=False, verbose=False): """Write out a display of pending merges in a working tree.""" parents = new.get_parent_ids() if len(parents) < 2: return term_width = osutils.terminal_width() if term_width is not None: # we need one extra space for terminals that wrap on last char term_width = term_width - 1 if short: first_prefix = 'P ' sub_prefix = 'P. ' else: first_prefix = ' ' sub_prefix = ' ' def show_log_message(rev, prefix): if term_width is None: width = term_width else: width = term_width - len(prefix) log_message = log_formatter.log_string(None, rev, width, prefix=prefix) to_file.write(log_message + '\n') pending = parents[1:] branch = new.branch last_revision = parents[0] if not short: if verbose: to_file.write('pending merges:\n') else: to_file.write('pending merge tips:' ' (use -v to see all merge revisions)\n') graph = branch.repository.get_graph() other_revisions = [last_revision] log_formatter = log.LineLogFormatter(to_file) for merge in pending: try: rev = branch.repository.get_revisions([merge])[0] except errors.NoSuchRevision: # If we are missing a revision, just print out the revision id to_file.write(first_prefix + '(ghost) ' + merge + '\n') other_revisions.append(merge) continue # Log the merge, as it gets a slightly different formatting show_log_message(rev, first_prefix) if not verbose: continue # Find all of the revisions in the merge source, which are not in the # last committed revision. merge_extra = graph.find_unique_ancestors(merge, other_revisions) other_revisions.append(merge) merge_extra.discard(_mod_revision.NULL_REVISION) # Get a handle to all of the revisions we will need try: revisions = dict((rev.revision_id, rev) for rev in branch.repository.get_revisions(merge_extra)) except errors.NoSuchRevision: # One of the sub nodes is a ghost, check each one revisions = {} for revision_id in merge_extra: try: rev = branch.repository.get_revisions([revision_id])[0] except errors.NoSuchRevision: revisions[revision_id] = None else: revisions[revision_id] = rev # Display the revisions brought in by this merge. rev_id_iterator = _get_sorted_revisions(merge, merge_extra, branch.repository.get_parent_map(merge_extra)) # Skip the first node num, first, depth, eom = rev_id_iterator.next() if first != merge: raise AssertionError('Somehow we misunderstood how' ' iter_topo_order works %s != %s' % (first, merge)) for num, sub_merge, depth, eom in rev_id_iterator: rev = revisions[sub_merge] if rev is None: to_file.write(sub_prefix + '(ghost) ' + sub_merge + '\n') continue show_log_message(revisions[sub_merge], sub_prefix)
def test_bzr(self): from os import chdir, mkdir from os.path import exists progress = self.log progress("basic branch creation") mkdir('branch1') chdir('branch1') self.run_bzr('init') self.assertIsSameRealPath( self.run_bzr('root')[0].rstrip(), osutils.pathjoin(self.test_dir, 'branch1')) progress("status of new file") f = file('test.txt', 'wt') f.write('hello world!\n') f.close() self.assertEqual(self.run_bzr('unknowns')[0], 'test.txt\n') out = self.run_bzr("status")[0] self.assertEqual(out, 'unknown:\n test.txt\n') f = file('test2.txt', 'wt') f.write('goodbye cruel world...\n') f.close() out = self.run_bzr("status test.txt")[0] self.assertEqual(out, "unknown:\n test.txt\n") out = self.run_bzr("status")[0] self.assertEqual(out, ("unknown:\n" " test.txt\n" " test2.txt\n")) os.unlink('test2.txt') progress("command aliases") out = self.run_bzr("st")[0] self.assertEqual(out, ("unknown:\n" " test.txt\n")) out = self.run_bzr("stat")[0] self.assertEqual(out, ("unknown:\n" " test.txt\n")) progress("command help") self.run_bzr("help st") self.run_bzr("help") self.run_bzr("help commands") self.run_bzr("help slartibartfast", retcode=3) out = self.run_bzr("help ci")[0] out.index('Aliases: ci, checkin\n') f = file('hello.txt', 'wt') f.write('some nice new content\n') f.close() self.run_bzr("add hello.txt") f = file('msg.tmp', 'wt') f.write('this is my new commit\nand it has multiple lines, for fun') f.close() self.run_bzr('commit -F msg.tmp') self.assertEqual(self.run_bzr('revno')[0], '1\n') self.run_bzr('export -r 1 export-1.tmp') self.run_bzr('export export.tmp') self.run_bzr('log') self.run_bzr('log -v') self.run_bzr('log -v --forward') self.run_bzr('log -m', retcode=3) log_out = self.run_bzr('log -m commit')[0] self.assertTrue("this is my new commit\n and" in log_out) self.assertTrue("rename nested" not in log_out) self.assertTrue('revision-id' not in log_out) self.assertTrue( 'revision-id' in self.run_bzr('log --show-ids -m commit')[0]) log_out = self.run_bzr('log --line')[0] # determine the widest line we want max_width = osutils.terminal_width() if max_width is not None: for line in log_out.splitlines(): self.assertTrue(len(line) <= max_width - 1, len(line)) self.assertTrue("this is my new commit and" not in log_out) self.assertTrue("this is my new commit" in log_out) progress("file with spaces in name") mkdir('sub directory') with file('sub directory/file with spaces ', 'wt') as f: f.write('see how this works\n') self.run_bzr('add .') self.run_bzr('diff', retcode=1) self.run_bzr('commit -m add-spaces') self.run_bzr('check') self.run_bzr('log') self.run_bzr('log --forward') self.run_bzr('info') if osutils.has_symlinks(): progress("symlinks") mkdir('symlinks') chdir('symlinks') self.run_bzr('init') os.symlink("NOWHERE1", "link1") self.run_bzr('add link1') self.assertEqual(self.run_bzr('unknowns')[0], '') self.run_bzr(['commit', '-m', '1: added symlink link1']) mkdir('d1') self.run_bzr('add d1') self.assertEqual(self.run_bzr('unknowns')[0], '') os.symlink("NOWHERE2", "d1/link2") self.assertEqual(self.run_bzr('unknowns')[0], 'd1/link2\n') # is d1/link2 found when adding d1 self.run_bzr('add d1') self.assertEqual(self.run_bzr('unknowns')[0], '') os.symlink("NOWHERE3", "d1/link3") self.assertEqual(self.run_bzr('unknowns')[0], 'd1/link3\n') self.run_bzr(['commit', '-m', '2: added dir, symlink']) self.run_bzr('rename d1 d2') self.run_bzr('move d2/link2 .') self.run_bzr('move link1 d2') self.assertEqual(os.readlink("./link2"), "NOWHERE2") self.assertEqual(os.readlink("d2/link1"), "NOWHERE1") self.run_bzr('add d2/link3') self.run_bzr('diff', retcode=1) self.run_bzr( ['commit', '-m', '3: rename of dir, move symlinks, add link3']) os.unlink("link2") os.symlink("TARGET 2", "link2") os.unlink("d2/link1") os.symlink("TARGET 1", "d2/link1") self.run_bzr('diff', retcode=1) self.assertEqual(self.run_bzr("relpath d2/link1")[0], "d2/link1\n") self.run_bzr(['commit', '-m', '4: retarget of two links']) self.run_bzr('remove --keep d2/link1') self.assertEqual(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '5: remove d2/link1']) # try with the rm alias self.run_bzr('add d2/link1') self.run_bzr(['commit', '-m', '6: add d2/link1']) self.run_bzr('rm --keep d2/link1') self.assertEqual(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr(['commit', '-m', '7: remove d2/link1']) os.mkdir("d1") self.run_bzr('add d1') self.run_bzr('rename d2/link3 d1/link3new') self.assertEqual(self.run_bzr('unknowns')[0], 'd2/link1\n') self.run_bzr( ['commit', '-m', '8: remove d2/link1, move/rename link3']) self.run_bzr('check') self.run_bzr('export -r 1 exp1.tmp') chdir("exp1.tmp") self.assertEqual(listdir_sorted("."), ["link1"]) self.assertEqual(os.readlink("link1"), "NOWHERE1") chdir("..") self.run_bzr('export -r 2 exp2.tmp') chdir("exp2.tmp") self.assertEqual(listdir_sorted("."), ["d1", "link1"]) chdir("..") self.run_bzr('export -r 3 exp3.tmp') chdir("exp3.tmp") self.assertEqual(listdir_sorted("."), ["d2", "link2"]) self.assertEqual(listdir_sorted("d2"), ["link1", "link3"]) self.assertEqual(os.readlink("d2/link1"), "NOWHERE1") self.assertEqual(os.readlink("link2"), "NOWHERE2") chdir("..") self.run_bzr('export -r 4 exp4.tmp') chdir("exp4.tmp") self.assertEqual(listdir_sorted("."), ["d2", "link2"]) self.assertEqual(os.readlink("d2/link1"), "TARGET 1") self.assertEqual(os.readlink("link2"), "TARGET 2") self.assertEqual(listdir_sorted("d2"), ["link1", "link3"]) chdir("..") self.run_bzr('export -r 5 exp5.tmp') chdir("exp5.tmp") self.assertEqual(listdir_sorted("."), ["d2", "link2"]) self.assertTrue(os.path.islink("link2")) self.assertTrue(listdir_sorted("d2") == ["link3"]) chdir("..") self.run_bzr('export -r 8 exp6.tmp') chdir("exp6.tmp") self.assertEqual(listdir_sorted("."), ["d1", "d2", "link2"]) self.assertEqual(listdir_sorted("d1"), ["link3new"]) self.assertEqual(listdir_sorted("d2"), []) self.assertEqual(os.readlink("d1/link3new"), "NOWHERE3") chdir("..") else: progress("skipping symlink tests")
def __init__(self, *args, **kwargs): super(LineLogFormatter, self).__init__(*args, **kwargs) self._max_chars = terminal_width() - 1