Opened 6 weeks ago

Last modified 3 weeks ago

#35669 closed Cleanup/optimization

Improve `RuntimeError: Max post-process passes exceeded.` error — at Initial Version

Reported by: Michael Owned by:
Component: contrib.staticfiles Version: 5.1
Severity: Normal Keywords: collect static errors
Cc: Michael Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: yes UI/UX: no

Description

Having just spend 3 hours trying to debug a collect static issue, to prevent others wasting so much time, I recommend printing the files that caused max depth to be exceeded, often when a file references itself it causes recursion, but the only clue it currently prints is 'All' which does not narrow done the problem. The proposed change prints the problem files only that keep chaning and can't be resolved:

I recommend changing from:

# contrib/staticfiles/storage.py line 313: in def post_process(self, paths, dry_run=False, **options):
        unresolved_paths = []
        for i in range(self.max_post_process_passes):
            substitutions = False
            for name, hashed_name, processed, subst in self._post_process(
                paths, adjustable_paths, hashed_files
            ):
                # Overwrite since hashed_name may be newer.
                processed_adjustable_paths[name] = (name, hashed_name, processed)
                if subst and i == self.max_post_process_passes - 1:
                    unresolved_paths.append(name)
                substitutions = substitutions or subst

            if not substitutions:
                break

        if substitutions:
            problem_paths_str = ", ".join(unresolved_paths) if unresolved_paths else "All"
            yield problem_paths_str, None, RuntimeError("Max post-process passes exceeded.")

I recommend changing to:

# contrib/staticfiles/storage.py line 313: in def post_process(self, paths, dry_run=False, **options):
        unresolved_paths = []                                            # < -- add this line 1/5
        for i in range(self.max_post_process_passes):
            substitutions = False
            for name, hashed_name, processed, subst in self._post_process(
                paths, adjustable_paths, hashed_files
            ):
                # Overwrite since hashed_name may be newer.
                processed_adjustable_paths[name] = (name, hashed_name, processed)
                if subst and i == self.max_post_process_passes - 1:      # < -- add this line 2/5
                    unresolved_paths.append(name)                        # < -- add this line 3/5
                substitutions = substitutions or subst

            if not substitutions:
                break

        if substitutions:
            problem_paths_str = ", ".join(unresolved_paths) if unresolved_paths else "All"     # < -- add this line 4/5
            yield problem_paths_str, None, RuntimeError("Max post-process passes exceeded.")   # < -- change this line 5/5

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top