summaryrefslogtreecommitdiffstats
path: root/subcmds/diff.py
diff options
context:
space:
mode:
Diffstat (limited to 'subcmds/diff.py')
-rw-r--r--subcmds/diff.py53
1 files changed, 39 insertions, 14 deletions
diff --git a/subcmds/diff.py b/subcmds/diff.py
index fa41e70e..00a7ec29 100644
--- a/subcmds/diff.py
+++ b/subcmds/diff.py
@@ -1,5 +1,3 @@
1# -*- coding:utf-8 -*-
2#
3# Copyright (C) 2008 The Android Open Source Project 1# Copyright (C) 2008 The Android Open Source Project
4# 2#
5# Licensed under the Apache License, Version 2.0 (the "License"); 3# Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,10 +12,14 @@
14# See the License for the specific language governing permissions and 12# See the License for the specific language governing permissions and
15# limitations under the License. 13# limitations under the License.
16 14
17from command import PagedCommand 15import functools
16import io
17
18from command import DEFAULT_LOCAL_JOBS, PagedCommand
19
18 20
19class Diff(PagedCommand): 21class Diff(PagedCommand):
20 common = True 22 COMMON = True
21 helpSummary = "Show changes between commit and working tree" 23 helpSummary = "Show changes between commit and working tree"
22 helpUsage = """ 24 helpUsage = """
23%prog [<project>...] 25%prog [<project>...]
@@ -26,19 +28,42 @@ The -u option causes '%prog' to generate diff output with file paths
26relative to the repository root, so the output can be applied 28relative to the repository root, so the output can be applied
27to the Unix 'patch' command. 29to the Unix 'patch' command.
28""" 30"""
31 PARALLEL_JOBS = DEFAULT_LOCAL_JOBS
29 32
30 def _Options(self, p): 33 def _Options(self, p):
31 def cmd(option, opt_str, value, parser):
32 setattr(parser.values, option.dest, list(parser.rargs))
33 while parser.rargs:
34 del parser.rargs[0]
35 p.add_option('-u', '--absolute', 34 p.add_option('-u', '--absolute',
36 dest='absolute', action='store_true', 35 dest='absolute', action='store_true',
37 help='Paths are relative to the repository root') 36 help='paths are relative to the repository root')
37
38 def _ExecuteOne(self, absolute, project):
39 """Obtains the diff for a specific project.
40
41 Args:
42 absolute: Paths are relative to the root.
43 project: Project to get status of.
44
45 Returns:
46 The status of the project.
47 """
48 buf = io.StringIO()
49 ret = project.PrintWorkTreeDiff(absolute, output_redir=buf)
50 return (ret, buf.getvalue())
38 51
39 def Execute(self, opt, args): 52 def Execute(self, opt, args):
40 ret = 0 53 all_projects = self.GetProjects(args)
41 for project in self.GetProjects(args): 54
42 if not project.PrintWorkTreeDiff(opt.absolute): 55 def _ProcessResults(_pool, _output, results):
43 ret = 1 56 ret = 0
44 return ret 57 for (state, output) in results:
58 if output:
59 print(output, end='')
60 if not state:
61 ret = 1
62 return ret
63
64 return self.ExecuteInParallel(
65 opt.jobs,
66 functools.partial(self._ExecuteOne, opt.absolute),
67 all_projects,
68 callback=_ProcessResults,
69 ordered=True)