Commit graph

472 commits

Author SHA1 Message Date
Avery Pennarun
2b4fe812e2 Some renaming and comments to try to clarify builder and jobserver.
The code is still a bit spaghetti-like, especialy when it comes to
redo-unlocked, but at least the new names are slightly more
comprehensible.
2018-12-11 04:17:27 +00:00
Avery Pennarun
4d2b4cfccb Make calls to logs.setup() explicit in each cmd.
Further reducing magic implicit behaviour to make code easier to
follow.
2018-12-11 02:35:11 +00:00
Avery Pennarun
474e12eed8 Fix minimal/do and tests when built in a path containing spaces.
Basically all just missing quotes around shell strings that use $PWD.
Most paths inside a project, since redo uses relative paths, only need
to worry when project-internal directories or filenames have spaces in
them.

Reported-by: Jeff Stearns <jeff.stearns@gmail.com>
2018-12-11 01:22:29 +00:00
Avery Pennarun
539a26d264 Minor copyediting of index.md. 2018-12-10 05:03:20 +00:00
Avery Pennarun
2b7da63c66 Fix a few lagging doc references to old-style build+test layout. 2018-12-10 04:33:57 +00:00
Avery Pennarun
bd8dbfb487 Switch to module-relative import syntax.
Now that the python scripts are all in a "redo" python module, we can
use the "new style" (ahem) package-relative imports.  This appeases
pylint, plus avoids confusion in case more than one package has
similarly-named modules.
2018-12-05 02:34:36 -05:00
Avery Pennarun
0b648521fd Move setproctitle() stuff into title.py.
This removes another instance of magical code running at module import
time.  And the process title wasn't really part of the state database
anyway.

Unfortunately this uncovered a bug: the recent change to use
'python -S' makes it not find the setproctitle module if installed.

My goodness, I hate the horrible python easy_install module gunk that
makes startup linearly slower the more modules you have installed,
whether you import them or not, if you don't use -S.  But oh well,
we're stuck with it for now.
2018-12-05 02:28:34 -05:00
Avery Pennarun
9b6d1eeb6e env and env_init: Eliminate weird auto-initialization of globals.
Merge the two files into env, and make each command explicitly call the
function that sets it up in the way that's needed for that command.

This means we can finally just import all the modules at the top of
each file, without worrying about import order.  Phew.

While we're here, remove the weird auto-appending-'all'-to-targets
feature in env.init().  Instead, do it explicitly, and only from redo and
redo-ifchange, only if is_toplevel and no other targets are given.
2018-12-05 02:27:04 -05:00
Avery Pennarun
75b5352511 test.do: allow docs to build in parallel with tests.
Previously, we'd try to build all the critical stuff first, and then
run the tests.  Nowadays, it takes a little longer to build the docs
(especially some of the docs/cookbook/ stuff), and this isn't needed to
run the tests, so let's allow them to parallelize.
2018-12-05 02:27:04 -05:00
Avery Pennarun
99188bef0d Rename redo/python -> redo/py.
This avoids a name overlap with the system-installed copy of python.
Since redo adds the redo/ dir to the $PATH before running .do files,
python.do might see its own previously-created target instead of the
"real" python when testing, and create an infinite loop by accident.
2018-12-05 02:27:04 -05:00
Avery Pennarun
f1305b49eb Move env.{add,get}_lock() into cycles.py, and rename.
They really aren't locks at all, they're a cycle detector.  Also rename
REDO_LOCKS to a more meaningful REDO_CYCLES.  And we'll move the
CyclicDependencyError exception in here as well, instead of state.py
where it doesn't really belong.
2018-12-05 02:26:58 -05:00
Avery Pennarun
ded14507b0 Rename vars{,_init}.py -> env{,_init}.py.
This fixes some pylint 'redefined builtins' warnings.  While I was
here, I fixed the others too by renaming a few local variables.
2018-12-05 02:26:49 -05:00
Avery Pennarun
65cf1c9854 Rename jwack.py -> jobserver.py.
I'm not really sure why I called it jwack.  I think it was kind of a
wack jobserver(tm).  But nowadays most of the wack-ness is gone.
2018-12-05 00:22:10 -05:00
Avery Pennarun
6e96395d48 redo/version: fix pylint warning. 2018-12-05 00:22:10 -05:00
Avery Pennarun
f6fe00db5c Directory reorg: move code into redo/, generate binaries in bin/.
It's time to start preparing for a version of redo that doesn't work
unless we build it first (because it will rely on C modules, and
eventually be rewritten in C altogether).

To get rolling, remove the old-style symlinks to the main programs, and
rename those programs from redo-*.py to redo/cmd_*.py.  We'll also move
all library functions into the redo/ dir, which is a more python-style
naming convention.

Previously, install.do was generating wrappers for installing in
/usr/bin, which extend sys.path and then import+run the right file.
This made "installed" redo work quite differently from running redo
inside its source tree.  Instead, let's always generate the wrappers in
bin/, and not make anything executable except those wrappers.

Since we're generating wrappers anyway, let's actually auto-detect the
right version of python for the running system; distros can't seem to
agree on what to call their python2 binaries (sigh). We'll fill in the
right #! shebang lines.  Since we're doing that, we can stop using
/usr/bin/env, which will a) make things slightly faster, and b) let us
use "python -S", which tells python not to load a bunch of extra crap
we're not using, thus improving startup times.

Annoyingly, we now have to build redo using minimal/do, then run the
tests using bin/redo.  To make this less annoying, we add a toplevel
./do script that knows the right steps, and a Makefile (whee!) for
people who are used to typing 'make' and 'make test' and 'make clean'.
2018-12-04 02:53:40 -05:00
Avery Pennarun
5bc7c861b6 minimal/do: use "#!/usr/bin/env sh" instead of "#!/bin/sh"
This way you can force it to use redo-sh, so that it can pass
shelltest.od.
2018-12-04 02:52:23 -05:00
Avery Pennarun
8911a222bf minimal/do: reminder that nowadays incremental mode is default. 2018-12-04 02:43:58 -05:00
Avery Pennarun
df44dc54a2 jwack: _cheatfds error when run from toplevel make -j.
Also added a new unit test to confirm that 'make' behaviour works as
expected, with and without parallelism.
2018-12-04 02:43:58 -05:00
Avery Pennarun
5abf78059f t/351-deps-forget: forgot skip-if-minimal-do.
minimal/do doesn't really understand dependencies at all, to say
nothing of forgetting targets and converting them to sources.
2018-12-04 02:43:58 -05:00
Avery Pennarun
2d17be11ed sh.do: explicitly check /bin/sh instead of sh.
Because our experiment involves creating a file called redo/sh, and the
redo directory (or some other version of redo's dirctory) might be on
the path, just testing 'sh' is actually wrong: we might end up with
some earlier version of redo-sh.

Instead, specifically for sh, always demand that we test /bin/sh.
2018-12-04 02:43:58 -05:00
Avery Pennarun
07163d81cf shelltest.od: detect some weird zsh problems.
This seems to only affect old zsh on MacOS.  But we want to catch it
anyway, because it caused t/351-deps-forget to fail in a weird way on
that version of zsh.

Shells really suck.
2018-12-04 02:43:58 -05:00
Avery Pennarun
02f307578b Oops, broken 'install.do' target after pylint fixes. 2018-12-03 21:15:31 -05:00
Avery Pennarun
280cf6f3aa Add Roadmap.md. 2018-12-03 01:45:36 -05:00
Avery Pennarun
e1327540fb Move into the 21st century by fixing some pylint warnings. 2018-12-03 00:11:27 -05:00
Avery Pennarun
1966a0fac7 If using --log or -j > 1, disable stdin.
Parallelism and redo-log cause lots of confusion for any rules that try
to ask the user for questions, so disable it altogether.

Arguably, we should just disable stdin all the time, but maybe it's
still occasionally useful (even though you have to pass --no-log to get
it back).
2018-12-02 22:57:04 -05:00
Avery Pennarun
70f1557413 redo.py: split redo-log options into their own section.
This makes it a little more clear which things change the output format
vs changing redo functionality.
2018-12-02 22:36:13 -05:00
Avery Pennarun
2b0d34f0ed More fixes for converting missing targets -> sources.
I attempted to fix this in commit c06d1fba40, but it was apparently
incomplete and not all cases were covered by tests.

Let's add a much more thorough test by going through every possible
combination and making sure redo-{sources,targets,ood} all work as
expected, that the "you modified it" warning does or does not show up
when expected, and that dependencies are rebuilt the number of times we
expect.
2018-12-02 19:39:29 -05:00
Avery Pennarun
f25ebd6ccc Docs: format inline <code> blocks better.
It seems like we're using these differently than most readthedocs.org
users.  Remove the borders and padding so they work better inline, and
prevent confusing word wraps.
2018-11-29 14:59:38 -05:00
Avery Pennarun
2e84c1bc02 Docs/cookbook: add an R + latex example.
This shows how to dynamically generate a plot in R+ggplot2, then embed
it into a latex document, and compile it to pdf, all with proper
autodependencies.
2018-11-28 17:33:03 -05:00
Avery Pennarun
461ef57b26 Docs/cookbook: build from toplevel 'test' instead of toplevel 'all'.
The cookbook examples are interesting as redo tests, but don't need to
be built in order to build redo.
2018-11-28 12:55:49 -05:00
Avery Pennarun
caa86ac4bd Docs: results of more proofreading. 2018-11-26 18:09:36 -05:00
Avery Pennarun
d9d70c4c44 Even more doc cleanups. 2018-11-26 17:45:16 -05:00
Avery Pennarun
4008ce4a91 Change license to Apache 2.0.
Mailing list discussion was here:
https://groups.google.com/forum/#!topic/redo-list/wLMZMxtn4wo

Several more contributors replied to me personally to say that they
don't have a problem with the change (and several consider the change
to be an improvement).

The overwhelming majority of everything in the redo repo was written by
me, so I have the right to change the license unilaterally anyway,
subject to a few rules.  Since the new license actually removes
licensing/usage restrictions for everyone, this should be no problem.
2018-11-26 17:04:31 -05:00
Avery Pennarun
3b305edc7e Cookbook: add an example of using default.do for text processing. 2018-11-26 15:24:41 -05:00
Avery Pennarun
d663c9b67d First cookbook example for the docs: Hello World in C. 2018-11-24 14:36:02 -05:00
Avery Pennarun
d664099c9d Undo commit 95680ed: "Switch to using a separate lockfile per target."
This was required for old versions of MacOS X, but the bug has now been
fixed, so let's de-clutter the .redo directory by reducing to a single
lock file instead of one per fid.

This reverts commit 08b05fd72f92fa0061b3d082b391151b43cd7497.
2018-11-23 19:55:32 -05:00
Avery Pennarun
c06d1fba40 {ood,sources,targets}: fix relative paths; turn missing targets into sources.
When we check dependencies and a previously-is_generated dependency
existed before, but no longer does, forget that it was is_generated.
This slightly improves the situation where as a project evolves, a file
that used to be a target gets removed, and then later is re-added as a
static source file.  (It doesn't fix the other variant, where a file is
changed from target to source in a single atomic change, and is never
missing.  That one will be trickier to handle.)

While adding a test for this behaviour, I discovered that redo-sources,
redo-targets, and redo-ood were reporting their output relative to
STARTDIR instead of relative to $PWD, so fix that too.
2018-11-23 19:18:43 -05:00
Avery Pennarun
5596b9fae3 Better comment in t/flush-cache, and a avoid a (rare) unit test error.
flush-cache reduces the failed_runid by 1 each time, and it runs
multiple times per 'redo test'.  if failed_runid goes to zero, it would
be treated as success ("no failure") rather than a real failure at
runid 0.
2018-11-21 21:00:36 -05:00
Avery Pennarun
637f63423a Flush state data for a target before printing meta('do') for it.
Extremely rarely, if that target had not yet previously been added to
the redo database, redo-log would manage to run before the database got
flushed, and then it would complain that the file is "not known to
redo" and abort.

I had to run "git clean -fdx; redo -j11 test" in a loop several hundred
times before this race condition triggered, but it did trigger eventually.
2018-11-21 20:59:17 -05:00
Avery Pennarun
0ce8ceddcb Run mkdocs only after generating the rest of the doc files.
This avoids a mkdocs bug where mkdocs will (rarely) see redo temp files
in its directory list, but they're gone by the time it tries to open
them, so it aborts with an exception.
2018-11-21 20:59:17 -05:00
Avery Pennarun
672b748394 Further improve handling of symlink targets/deps.
In commit redo-0.11-4-g34669fb, we changed os.stat into os.lstat to
avoid false positives in the "manual override" detector: a .do file
that generates $3 as a symlink would trigger manual override if the
*target* of that symlink ever changed, which is incorrect.

Unfortunately using os.lstat() leads to a different problem: if X
depends on Y and Y is a symlink to Z, then X would not be rebuilt when
Z changes, which is clearly wrong.

The fix is twofold:

1. read_stamp() should change on changes to both the link itself,
   *and* the target of the link.

2. We shouldn't mark a target as overridden under so many situations.
   We'll use *only* the primary mtime of the os.lstat(), not all the
   other bits in the stamp.

Step 2 fixes a few other false positives also.  For example, if you
'cp -a' a whole tree to another location, the st_ino of all the targets
will change, which would trigger a mass of "manual override" warnings.
Although a change in inode is sufficient to count an input as having
changed (just to be extra safe), it should *not* be considered a manual
override.  Now we can distinguish between the two.

Because the stamp format has changed, update the SCHEMA_VER field.  I
should have done this every other time I changed the stamp format, but
I forgot.  Sorry.  That leads to spurious "manually modified" warnings
after upgrading redo.
2018-11-21 16:28:14 -05:00
Avery Pennarun
69890d0c57 Documentation: add link to github search; clarify .do.do question. 2018-11-21 07:11:46 -05:00
Avery Pennarun
85cd0a1e08 redo-log: missing switch from python -> python2.
The python2 pull request and the redo-log patches were on separate
branches, so we missed one conversion.
2018-11-20 15:42:06 -05:00
Avery Pennarun
2391f980be When running redo-unlock, remove duplicate dependencies.
It's fairly harmless to pass duplicate dependencies to redo-unlock
(since it'll only check them once each anyway), but ultimately not
useful.
2018-11-20 10:06:46 -05:00
Avery Pennarun
1b616ddcbb Improved documentation.
Removed the Cookbook link for now, since it's empty.
2018-11-20 09:50:37 -05:00
Avery Pennarun
4842996b5b Merge branch 'redo-log'
* redo-log:
  redo-log: add man page.
  redo-log: add automated tests, and fix some path bugs revealed by them.
  redo-log: fix stdout vs stderr; don't recapture if .do script redirects stderr.
  redo-log: don't show status line until >1.0 seconds after starting.
  Add --color and --no-color options.
  redo-log: --debug-pids works properly again.
  Split --raw-logs into --no-pretty and --no-log options.
  redo-log: prioritize the "foreground" process.
  redo-log: correctly indent first level of recursion.
  Raw logs contain @@REDO lines instead of formatted data.
  redo-log: status line should use actual terminal width.
  redo-log: capture and linearize the output of redo builds.
  Use signal.setitimer instead of signal.alarm.
2018-11-19 19:33:04 -05:00
Avery Pennarun
6ad0b032d4 redo-log: add man page. 2018-11-19 19:32:50 -05:00
Avery Pennarun
4edb6f78e0 redo-log: add automated tests, and fix some path bugs revealed by them.
When a log for X was saying it wanted to refer to Y, we used a relative
path, but it was sometimes relative to the wrong starting location, so
redo-log couldn't find it later.

Two examples:

 - if default.o.do is handling builds for a/b/x.o, and default.o.do
   does 'redo a/b/x.h', the log for x.o should refer to ./x.h, not
   a/b/x.h.

 - if foo.do is handling builds for foo, and it does
   "cd a/b && redo x", the log for foo should refer to a/b/x, not just
   x.
2018-11-19 18:58:36 -05:00
Avery Pennarun
7165b342f5 redo-log: fix stdout vs stderr; don't recapture if .do script redirects stderr.
redo-log should log to stdout, because when you ask for the specific
logs from a run, the logs are the output you requested.  redo-log's
stderr should be about any errors retrieving that output.

On the other hand, when you run redo, the logs are literally the stderr
of the build steps, which are incidental to the main job (building
things).  So that should be send to stderr.  Previously, we were
sending to stderr when --no-log, but stdout when --log, which is
totally wrong.

Also, adding redo-log had the unexpected result that if a .do script
redirected the stderr of a sub-redo or redo-ifchange to a file or pipe,
the output would be eaten by redo-log instead of the intended output.
So a test runner like this:

	self.test:
		redo self.runtest 2>&1 | grep ERROR

would not work; the self.runtest output would be sent to redo's log
buffer (and from there, probably printed to the toplevel redo's stderr)
rather than passed along to grep.
2018-11-19 16:27:41 -05:00
Avery Pennarun
02220d4318 t/110-compile and t/111-example: skip if no C compiler installed.
It's nice to validate "real" use with a C compiler, but silly to
completely fail validation just because a C compiler is missing.
2018-11-19 15:46:22 -05:00