Merge lp:~bzr-eclipse/bzr-xmloutput/xmlls-verbose-mode into lp:bzr-xmloutput

Proposed by Piotr Piastucki
Status: Needs review
Proposed branch: lp:~bzr-eclipse/bzr-xmloutput/xmlls-verbose-mode
Merge into: lp:bzr-xmloutput
Diff against target: 110 lines (+64/-6)
2 files modified
lsxml.py (+22/-5)
tests/test_ls_xml.py (+42/-1)
To merge this branch: bzr merge lp:~bzr-eclipse/bzr-xmloutput/xmlls-verbose-mode
Reviewer Review Type Date Requested Status
Guillermo Gonzalez Pending
Review via email: mp+183818@code.launchpad.net

Description of the change

This patch adds support for --verbose flag to xmlls command. Verbose output contains additional information about the most recent revision of each file listed by xmlls including: revision number, committer name and timestamp as shown below.
This enhancement is crucial to make text file decorator work efficiently in bzr-eclipse.

<item>
<id>xml_errors.py-20080619205226-dorz3pen7q1idbwj-1</id>
<kind>file</kind><path>xml_errors.py</path>
<status_kind>versioned</status_kind>
<log>
<revno>148.1.3</revno>
<committer>Jelmer Vernooij &lt;<email address hidden>&gt;</committer>
<timestamp>Wed 2010-12-15 19:27:12 +0100</timestamp>
</log>
</item>

To post a comment you must log in.
176. By Piotr Piastucki

Minor cleanup

Unmerged revisions

176. By Piotr Piastucki

Minor cleanup

175. By Piotr Piastucki

Add verbose mode to xmlls command
When --verbose flag is set xmlls will print additional information about the most recent revision of each file including:
revision number, timestamp and committer

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lsxml.py'
2--- lsxml.py 2013-07-04 21:31:29 +0000
3+++ lsxml.py 2013-09-04 11:13:44 +0000
4@@ -57,10 +57,13 @@
5 prefix = fs_path + '/'
6
7 if revision is not None:
8- tree = branch.repository.revision_tree(
9+ tree = r_tree = branch.repository.revision_tree(
10 revision[0].as_revision_id(branch))
11- elif tree is None:
12- tree = branch.basis_tree()
13+ else:
14+ if tree is None:
15+ tree = branch.basis_tree()
16+ if verbose:
17+ r_tree = branch.basis_tree()
18
19 tree.lock_read()
20 try:
21@@ -79,15 +82,29 @@
22 pattern = ''
23 if prefix:
24 fp = osutils.pathjoin(prefix, fp)
25+ verbosestr = ''
26 if fid is None:
27 fid = ''
28 else:
29+ if verbose:
30+ try:
31+ revid = r_tree.get_file_revision(fid)
32+ revno = branch.revision_id_to_dotted_revno(revid)
33+ if isinstance(revno, tuple):
34+ revno = '.'.join(map(str, revno))
35+ rev = branch.repository.get_revision(revid)
36+ date_str = osutils.format_date(rev.timestamp, rev.timezone or 0)
37+ verbosestr='<log><revno>%s</revno><committer>%s</committer><timestamp>%s</timestamp></log>' \
38+ % (revno, _escape_cdata(rev.committer), date_str)
39+ except:
40+ # e.g. newly added file not existing in any revision yet
41+ pass
42 fid = '<id>%s</id>' % _escape_cdata(fid)
43 fkind = '<kind>%s</kind>' % fkind
44 status_kind = '<status_kind>%s</status_kind>' % long_status_kind[fc]
45 fpath = '<path>%s</path>' % _escape_cdata(fp)
46- outstring = '<item>%s%s%s%s%s</item>' % (fid, fkind, fpath,
47- status_kind, pattern)
48+ outstring = '<item>%s%s%s%s%s%s</item>' % (fid, fkind, fpath,
49+ status_kind, pattern, verbosestr)
50 outf.write(outstring)
51 finally:
52 outf.write('</list>')
53
54=== modified file 'tests/test_ls_xml.py'
55--- tests/test_ls_xml.py 2013-08-26 18:53:37 +0000
56+++ tests/test_ls_xml.py 2013-09-04 11:13:44 +0000
57@@ -51,7 +51,12 @@
58 for item_elem in lst.findall('item'):
59 item = {}
60 for attr in item_elem:
61- item[attr.tag] = attr.text
62+ if attr.tag == 'log':
63+ for log_item_elem in attr:
64+ if log_item_elem.tag != 'timestamp':
65+ item['log.' + log_item_elem.tag] = log_item_elem.text
66+ else:
67+ item[attr.tag] = attr.text
68 items.append(item)
69 return items
70
71@@ -335,4 +340,40 @@
72 'status_kind': 'ignored'}]
73 self.assertEquals(expected_items, self.run_xmlls('--ignored ' + symlink))
74
75+ def test_lsxml_verbose(self):
76+ self.build_tree(['b', 'c', 'd', 'blah.pyo'])
77+ self.wt.add(['a', '.bzrignore'], ['a-id', 'bzrignore-id'])
78+ self.wt.commit('commit 1', committer='Paul')
79+ self.wt.add(['d'], ['d-id'])
80+ self.wt.commit('commit 2', committer='John')
81+ self.wt.add(['c'], ['c-id'])
82+ expected_items = [{'id': 'bzrignore-id',
83+ 'kind': 'file',
84+ 'log.committer': 'Paul',
85+ 'log.revno': '1',
86+ 'path': '.bzrignore',
87+ 'status_kind': 'versioned'},
88+ {'id': 'a-id',
89+ 'kind': 'file',
90+ 'log.committer': 'Paul',
91+ 'log.revno': '1',
92+ 'path': 'a',
93+ 'status_kind': 'versioned'},
94+ {'kind': 'file',
95+ 'path': 'b',
96+ 'status_kind': 'unknown'},
97+ {'kind': 'file',
98+ 'path': 'blah.pyo',
99+ 'status_kind': 'ignored'},
100+ {'id': 'c-id',
101+ 'kind': 'file',
102+ 'path': 'c',
103+ 'status_kind': 'versioned'},
104+ {'id': 'd-id',
105+ 'kind': 'file',
106+ 'log.committer': 'John',
107+ 'log.revno': '2',
108+ 'path': 'd',
109+ 'status_kind': 'versioned'}]
110+ self.assertEquals(expected_items, self.run_xmlls('--verbose'))
111

Subscribers

People subscribed via source and target branches

to all changes: