Prevent long subjects in reviews causing spurious blank lines

If the last field of the review being listed exceeds the width of the
console, then using whitespace padding will result in sufficient spacing
being added to all other line that will appear as spurious blank lines
if they were otherwise less than the console width.

Instead of:

 1234  master  <subject>

 5678  master  <really-long-subject-that-
 wraps-to-next-line>

Display:

 1234  master  <subject>
 5678  master  <really-long-subject-that-
 wraps-to-next-line>

Change-Id: I290f652f803cf3938a1bdb72c20c85969dbb3319
This commit is contained in:
Darragh Bailey 2014-06-21 17:18:38 +01:00
parent 28104e4ecd
commit aa3d861126
3 changed files with 75 additions and 3 deletions

View File

@ -797,12 +797,16 @@ def list_reviews(remote):
review_field_color = ("", "", "")
color_reset = ""
review_field_format = ["%*s", "%*s", "%*s"]
review_field_justify = [+1, +1, -1] # -1 is justify to right
review_field_justify = [+1, +1, -1] # +1 is justify to right
review_list = [[r[f] for f in REVIEW_FIELDS] for r in reviews]
review_field_width = dict()
for i in FIELDS:
# assume last field is longest and may exceed the console width in which
# case using the maximum value will result in extra blank lines appearing
# after each entry even when only one field exceeds the console width
for i in FIELDS[:-1]:
review_field_width[i] = max(len(r[i]) for r in review_list)
review_field_width[len(FIELDS) - 1] = 1
review_field_format = " ".join([
review_field_color[i] +

View File

@ -0,0 +1,68 @@
# -*- coding: utf8 -*-
# Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Use of io.StringIO in python =< 2.7 requires all strings handled to be
# unicode. See if StringIO.StringIO is available first
try:
import StringIO as io
except ImportError:
import io
import textwrap
import mock
import testtools
import git_review
class GitReviewConsole(testtools.TestCase):
"""Class for testing the console output of git-review."""
reviews = [
{
'number': '1010101',
'branch': 'master',
'subject': 'A simple short subject'
}, {
'number': '9877',
'branch': 'stable/codeword',
'subject': 'A longer and slightly more wordy subject'
}, {
'number': '12345',
'branch': 'master',
'subject': 'A ridiculously long subject that can exceed the '
'normal console width, just need to ensure the '
'max width is short enough'
}]
@mock.patch('git_review.cmd.query_reviews')
@mock.patch('git_review.cmd.get_remote_url', mock.MagicMock)
@mock.patch('git_review.cmd._has_color', False)
def test_list_reviews_no_blanks(self, mock_query):
mock_query.return_value = self.reviews
with mock.patch('sys.stdout', new_callable=io.StringIO) as output:
git_review.cmd.list_reviews(None)
console_output = output.getvalue().split('\n')
wrapper = textwrap.TextWrapper(replace_whitespace=False,
drop_whitespace=False)
for text in console_output:
for line in wrapper.wrap(text):
self.assertEqual(line.isspace(), False,
"Extra blank lines appearing between reviews"
"in console output")

View File

@ -1,6 +1,6 @@
hacking>=0.9.2,<0.10
discover
mock
fixtures>=0.3.14
testrepository>=0.0.18
testtools>=0.9.34