diff options
Diffstat (limited to 'subcmds/manifest.py')
-rw-r--r-- | subcmds/manifest.py | 230 |
1 files changed, 137 insertions, 93 deletions
diff --git a/subcmds/manifest.py b/subcmds/manifest.py index f4602a59..f72df348 100644 --- a/subcmds/manifest.py +++ b/subcmds/manifest.py | |||
@@ -20,12 +20,12 @@ from command import PagedCommand | |||
20 | 20 | ||
21 | 21 | ||
22 | class Manifest(PagedCommand): | 22 | class Manifest(PagedCommand): |
23 | COMMON = False | 23 | COMMON = False |
24 | helpSummary = "Manifest inspection utility" | 24 | helpSummary = "Manifest inspection utility" |
25 | helpUsage = """ | 25 | helpUsage = """ |
26 | %prog [-o {-|NAME.xml}] [-m MANIFEST.xml] [-r] | 26 | %prog [-o {-|NAME.xml}] [-m MANIFEST.xml] [-r] |
27 | """ | 27 | """ |
28 | _helpDescription = """ | 28 | _helpDescription = """ |
29 | 29 | ||
30 | With the -o option, exports the current manifest for inspection. | 30 | With the -o option, exports the current manifest for inspection. |
31 | The manifest and (if present) local_manifests/ are combined | 31 | The manifest and (if present) local_manifests/ are combined |
@@ -40,92 +40,136 @@ when the manifest was generated. The 'dest-branch' attribute is set | |||
40 | to indicate the remote ref to push changes to via 'repo upload'. | 40 | to indicate the remote ref to push changes to via 'repo upload'. |
41 | """ | 41 | """ |
42 | 42 | ||
43 | @property | 43 | @property |
44 | def helpDescription(self): | 44 | def helpDescription(self): |
45 | helptext = self._helpDescription + '\n' | 45 | helptext = self._helpDescription + "\n" |
46 | r = os.path.dirname(__file__) | 46 | r = os.path.dirname(__file__) |
47 | r = os.path.dirname(r) | 47 | r = os.path.dirname(r) |
48 | with open(os.path.join(r, 'docs', 'manifest-format.md')) as fd: | 48 | with open(os.path.join(r, "docs", "manifest-format.md")) as fd: |
49 | for line in fd: | 49 | for line in fd: |
50 | helptext += line | 50 | helptext += line |
51 | return helptext | 51 | return helptext |
52 | 52 | ||
53 | def _Options(self, p): | 53 | def _Options(self, p): |
54 | p.add_option('-r', '--revision-as-HEAD', | 54 | p.add_option( |
55 | dest='peg_rev', action='store_true', | 55 | "-r", |
56 | help='save revisions as current HEAD') | 56 | "--revision-as-HEAD", |
57 | p.add_option('-m', '--manifest-name', | 57 | dest="peg_rev", |
58 | help='temporary manifest to use for this sync', metavar='NAME.xml') | 58 | action="store_true", |
59 | p.add_option('--suppress-upstream-revision', dest='peg_rev_upstream', | 59 | help="save revisions as current HEAD", |
60 | default=True, action='store_false', | 60 | ) |
61 | help='if in -r mode, do not write the upstream field ' | 61 | p.add_option( |
62 | '(only of use if the branch names for a sha1 manifest are ' | 62 | "-m", |
63 | 'sensitive)') | 63 | "--manifest-name", |
64 | p.add_option('--suppress-dest-branch', dest='peg_rev_dest_branch', | 64 | help="temporary manifest to use for this sync", |
65 | default=True, action='store_false', | 65 | metavar="NAME.xml", |
66 | help='if in -r mode, do not write the dest-branch field ' | 66 | ) |
67 | '(only of use if the branch names for a sha1 manifest are ' | 67 | p.add_option( |
68 | 'sensitive)') | 68 | "--suppress-upstream-revision", |
69 | p.add_option('--json', default=False, action='store_true', | 69 | dest="peg_rev_upstream", |
70 | help='output manifest in JSON format (experimental)') | 70 | default=True, |
71 | p.add_option('--pretty', default=False, action='store_true', | 71 | action="store_false", |
72 | help='format output for humans to read') | 72 | help="if in -r mode, do not write the upstream field " |
73 | p.add_option('--no-local-manifests', default=False, action='store_true', | 73 | "(only of use if the branch names for a sha1 manifest are " |
74 | dest='ignore_local_manifests', help='ignore local manifests') | 74 | "sensitive)", |
75 | p.add_option('-o', '--output-file', | 75 | ) |
76 | dest='output_file', | 76 | p.add_option( |
77 | default='-', | 77 | "--suppress-dest-branch", |
78 | help='file to save the manifest to. (Filename prefix for multi-tree.)', | 78 | dest="peg_rev_dest_branch", |
79 | metavar='-|NAME.xml') | 79 | default=True, |
80 | 80 | action="store_false", | |
81 | def _Output(self, opt): | 81 | help="if in -r mode, do not write the dest-branch field " |
82 | # If alternate manifest is specified, override the manifest file that we're using. | 82 | "(only of use if the branch names for a sha1 manifest are " |
83 | if opt.manifest_name: | 83 | "sensitive)", |
84 | self.manifest.Override(opt.manifest_name, False) | 84 | ) |
85 | 85 | p.add_option( | |
86 | for manifest in self.ManifestList(opt): | 86 | "--json", |
87 | output_file = opt.output_file | 87 | default=False, |
88 | if output_file == '-': | 88 | action="store_true", |
89 | fd = sys.stdout | 89 | help="output manifest in JSON format (experimental)", |
90 | else: | 90 | ) |
91 | if manifest.path_prefix: | 91 | p.add_option( |
92 | output_file = f'{opt.output_file}:{manifest.path_prefix.replace("/", "%2f")}' | 92 | "--pretty", |
93 | fd = open(output_file, 'w') | 93 | default=False, |
94 | 94 | action="store_true", | |
95 | manifest.SetUseLocalManifests(not opt.ignore_local_manifests) | 95 | help="format output for humans to read", |
96 | 96 | ) | |
97 | if opt.json: | 97 | p.add_option( |
98 | print('warning: --json is experimental!', file=sys.stderr) | 98 | "--no-local-manifests", |
99 | doc = manifest.ToDict(peg_rev=opt.peg_rev, | 99 | default=False, |
100 | peg_rev_upstream=opt.peg_rev_upstream, | 100 | action="store_true", |
101 | peg_rev_dest_branch=opt.peg_rev_dest_branch) | 101 | dest="ignore_local_manifests", |
102 | 102 | help="ignore local manifests", | |
103 | json_settings = { | 103 | ) |
104 | # JSON style guide says Uunicode characters are fully allowed. | 104 | p.add_option( |
105 | 'ensure_ascii': False, | 105 | "-o", |
106 | # We use 2 space indent to match JSON style guide. | 106 | "--output-file", |
107 | 'indent': 2 if opt.pretty else None, | 107 | dest="output_file", |
108 | 'separators': (',', ': ') if opt.pretty else (',', ':'), | 108 | default="-", |
109 | 'sort_keys': True, | 109 | help="file to save the manifest to. (Filename prefix for " |
110 | } | 110 | "multi-tree.)", |
111 | fd.write(json.dumps(doc, **json_settings)) | 111 | metavar="-|NAME.xml", |
112 | else: | 112 | ) |
113 | manifest.Save(fd, | 113 | |
114 | peg_rev=opt.peg_rev, | 114 | def _Output(self, opt): |
115 | peg_rev_upstream=opt.peg_rev_upstream, | 115 | # If alternate manifest is specified, override the manifest file that |
116 | peg_rev_dest_branch=opt.peg_rev_dest_branch) | 116 | # we're using. |
117 | if output_file != '-': | 117 | if opt.manifest_name: |
118 | fd.close() | 118 | self.manifest.Override(opt.manifest_name, False) |
119 | if manifest.path_prefix: | 119 | |
120 | print(f'Saved {manifest.path_prefix} submanifest to {output_file}', | 120 | for manifest in self.ManifestList(opt): |
121 | file=sys.stderr) | 121 | output_file = opt.output_file |
122 | else: | 122 | if output_file == "-": |
123 | print(f'Saved manifest to {output_file}', file=sys.stderr) | 123 | fd = sys.stdout |
124 | 124 | else: | |
125 | 125 | if manifest.path_prefix: | |
126 | def ValidateOptions(self, opt, args): | 126 | output_file = ( |
127 | if args: | 127 | f"{opt.output_file}:" |
128 | self.Usage() | 128 | f'{manifest.path_prefix.replace("/", "%2f")}' |
129 | 129 | ) | |
130 | def Execute(self, opt, args): | 130 | fd = open(output_file, "w") |
131 | self._Output(opt) | 131 | |
132 | manifest.SetUseLocalManifests(not opt.ignore_local_manifests) | ||
133 | |||
134 | if opt.json: | ||
135 | print("warning: --json is experimental!", file=sys.stderr) | ||
136 | doc = manifest.ToDict( | ||
137 | peg_rev=opt.peg_rev, | ||
138 | peg_rev_upstream=opt.peg_rev_upstream, | ||
139 | peg_rev_dest_branch=opt.peg_rev_dest_branch, | ||
140 | ) | ||
141 | |||
142 | json_settings = { | ||
143 | # JSON style guide says Unicode characters are fully | ||
144 | # allowed. | ||
145 | "ensure_ascii": False, | ||
146 | # We use 2 space indent to match JSON style guide. | ||
147 | "indent": 2 if opt.pretty else None, | ||
148 | "separators": (",", ": ") if opt.pretty else (",", ":"), | ||
149 | "sort_keys": True, | ||
150 | } | ||
151 | fd.write(json.dumps(doc, **json_settings)) | ||
152 | else: | ||
153 | manifest.Save( | ||
154 | fd, | ||
155 | peg_rev=opt.peg_rev, | ||
156 | peg_rev_upstream=opt.peg_rev_upstream, | ||
157 | peg_rev_dest_branch=opt.peg_rev_dest_branch, | ||
158 | ) | ||
159 | if output_file != "-": | ||
160 | fd.close() | ||
161 | if manifest.path_prefix: | ||
162 | print( | ||
163 | f"Saved {manifest.path_prefix} submanifest to " | ||
164 | f"{output_file}", | ||
165 | file=sys.stderr, | ||
166 | ) | ||
167 | else: | ||
168 | print(f"Saved manifest to {output_file}", file=sys.stderr) | ||
169 | |||
170 | def ValidateOptions(self, opt, args): | ||
171 | if args: | ||
172 | self.Usage() | ||
173 | |||
174 | def Execute(self, opt, args): | ||
175 | self._Output(opt) | ||