Skip to content

Commit 6158bce

Browse files
committed
feat: add a cli option o force using locally changed files
This is a port of: https://hg.mozilla.org/mozilla-central/rev/0c6f696169f0
1 parent c4b19c5 commit 6158bce

File tree

2 files changed

+61
-12
lines changed

2 files changed

+61
-12
lines changed

src/taskgraph/main.py

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def get_taskgraph_generator(root, parameters):
121121
return TaskGraphGenerator(root_dir=root, parameters=parameters)
122122

123123

124-
def format_taskgraph(options, parameters, logfile=None):
124+
def format_taskgraph(options, parameters, overrides, logfile=None):
125125
import taskgraph
126126
from taskgraph.parameters import parameters_loader
127127

@@ -139,7 +139,7 @@ def format_taskgraph(options, parameters, logfile=None):
139139
if isinstance(parameters, str):
140140
parameters = parameters_loader(
141141
parameters,
142-
overrides={"target-kinds": options.get("target_kinds")},
142+
overrides=overrides,
143143
strict=False,
144144
)
145145

@@ -173,7 +173,7 @@ def dump_output(out, path=None, params_spec=None):
173173
print(out + "\n", file=fh)
174174

175175

176-
def generate_taskgraph(options, parameters, logdir):
176+
def generate_taskgraph(options, parameters, overrides, logdir):
177177
from taskgraph.parameters import Parameters
178178

179179
def logfile(spec):
@@ -189,14 +189,16 @@ def logfile(spec):
189189
# tracebacks a little more readable and avoids additional process overhead.
190190
if len(parameters) == 1:
191191
spec = parameters[0]
192-
out = format_taskgraph(options, spec, logfile(spec))
192+
out = format_taskgraph(options, spec, overrides, logfile(spec))
193193
dump_output(out, options["output_file"])
194194
return 0
195195

196196
futures = {}
197197
with ProcessPoolExecutor(max_workers=options["max_workers"]) as executor:
198198
for spec in parameters:
199-
f = executor.submit(format_taskgraph, options, spec, logfile(spec))
199+
f = executor.submit(
200+
format_taskgraph, options, spec, overrides, logfile(spec)
201+
)
200202
futures[f] = spec
201203

202204
returncode = 0
@@ -293,6 +295,15 @@ def logfile(spec):
293295
"generations will happen from the same invocation (one per parameters "
294296
"specified).",
295297
)
298+
@argument(
299+
"--force-local-files-changed",
300+
default=False,
301+
action="store_true",
302+
help="Compute the 'files-changed' parameter from local version control, "
303+
"even when explicitly using a parameter set that already has it defined. "
304+
"Note that this is already the default behaviour when no parameters are "
305+
"specified.",
306+
)
296307
@argument(
297308
"--no-optimize",
298309
dest="optimize",
@@ -367,9 +378,11 @@ def show_taskgraph(options):
367378
diffdir = None
368379
output_file = options["output_file"]
369380

370-
if options["diff"]:
381+
if options["diff"] or options["force_local_files_changed"]:
371382
repo = get_repository(os.getcwd())
372383

384+
if options["diff"]:
385+
assert repo is not None
373386
if not repo.working_directory_clean():
374387
print(
375388
"abort: can't diff taskgraph with dirty working directory",
@@ -393,15 +406,22 @@ def show_taskgraph(options):
393406
)
394407
print(f"Generating {options['graph_attr']} @ {cur_rev}", file=sys.stderr)
395408

409+
overrides = {
410+
"target-kinds": options.get("target_kinds"),
411+
}
396412
parameters: List[Any[str, Parameters]] = options.pop("parameters")
397413
if not parameters:
398-
overrides = {
399-
"target-kinds": options.get("target_kinds"),
400-
}
401414
parameters = [
402415
parameters_loader(None, strict=False, overrides=overrides)
403416
] # will use default values
404417

418+
# This is the default behaviour anyway, so no need to re-compute.
419+
options["force_local_files_changed"] = False
420+
421+
elif options["force_local_files_changed"]:
422+
assert repo is not None
423+
overrides["files-changed"] = sorted(repo.get_changed_files("AM"))
424+
405425
for param in parameters[:]:
406426
if isinstance(param, str) and os.path.isdir(param):
407427
parameters.remove(param)
@@ -427,7 +447,7 @@ def show_taskgraph(options):
427447
# to setup its `mach` based logging.
428448
setup_logging()
429449

430-
ret = generate_taskgraph(options, parameters, logdir)
450+
ret = generate_taskgraph(options, parameters, overrides, logdir)
431451

432452
if options["diff"]:
433453
assert diffdir is not None
@@ -451,7 +471,7 @@ def show_taskgraph(options):
451471
diffdir, f"{options['graph_attr']}_{base_rev_file}"
452472
)
453473
print(f"Generating {options['graph_attr']} @ {base_rev}", file=sys.stderr)
454-
ret |= generate_taskgraph(options, parameters, logdir)
474+
ret |= generate_taskgraph(options, parameters, overrides, logdir)
455475
finally:
456476
repo.update(cur_rev)
457477

test/test_main.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# http://creativecommons.org/publicdomain/zero/1.0/
33

44
import os
5+
import sys
56
from pathlib import Path
67
from textwrap import dedent
78

@@ -48,7 +49,7 @@ def fake_get_taskgraph_generator(*args):
4849
("morphed", ["_fake-t-0", "_fake-t-1"]),
4950
),
5051
)
51-
def test_show_taskgraph(run_taskgraph, capsys, attr, expected):
52+
def test_show_taskgraph_attr(run_taskgraph, capsys, attr, expected):
5253
res = run_taskgraph([attr])
5354
assert res == 0
5455

@@ -72,6 +73,34 @@ def test_show_taskgraph_parallel(run_taskgraph):
7273
assert res == 1
7374

7475

76+
def test_show_taskgraph_force_local_files_changed(mocker, run_taskgraph):
77+
repo = mocker.MagicMock()
78+
repo.get_changed_files.return_value = ["foo.txt"]
79+
80+
m = mocker.MagicMock()
81+
m.get_repository.return_value = repo
82+
mocker.patch.dict(sys.modules, {"taskgraph.util.vcs": m})
83+
84+
res = run_taskgraph(["full"])
85+
assert res == 0
86+
assert not repo.get_changed_files.called
87+
88+
res = run_taskgraph(["full", "--force-local-files-changed"])
89+
assert res == 0
90+
assert not repo.get_changed_files.called
91+
92+
res = run_taskgraph(
93+
[
94+
"full",
95+
"--force-local-files-changed",
96+
"-p",
97+
"taskcluster/test/params/mc-onpush.yml",
98+
]
99+
)
100+
assert res == 0
101+
assert repo.get_changed_files.call_count == 1
102+
103+
75104
def test_tasks_regex(run_taskgraph, capsys):
76105
run_taskgraph(["full", "--tasks=_.*-t-1"])
77106
out, _ = capsys.readouterr()

0 commit comments

Comments
 (0)