In other words, if I understand you correctly, you are saying that actually you 
NEED to do a complete rebuild on copy (or more especially, move)?


Yes, after copying or moving to a new location or renaming the project 
directory, the build process (if triggered anew) will start afresh and ignore 
the pickled data.

Because all the absolute paths in the output are no longer valid?


I was referring to pickled build environment, not output.  The HTML output has 
relative paths (afaik, and simply because otherwise it would be bad), and you 
can move it (else how would people deploy their docs...).  But if you have 
moved the project source yes any rebuild attempt even without any change to rst 
files will ignore saved build environment.

I tried this with minimal project having index.rst and a toctree including 3 files and 
after a "cp -a" which keeps mtimes:

loading pickled environment... failed
failed: source directory has changed
building [mo]: targets for 0 po files that are out of date
writing output...
building [html]: targets for 4 source files that are out of date
updating environment: [new config] 4 added, 0 changed, 0 removed

There is only one location in Sphinx code base where "source directory has 
changed" originates and it is the one I pointed to.

In which case, ycproject should not be worried about this, make is working as designed, 
and "fixing" his project will actually break it ...


I did not read carefully the thread, but yes I tend to agree !

Best,

Jean-François
PS: copy paste from Firefox introduced a spurious "Facts" after "try:" in this 
code snippet
It is not (of course) in original on  
https://www.sphinx-doc.org/en/master/_modules/sphinx/application.html (maybe I 
should have linked to github repo)

     def _load_existing_env(self, filename: str) -> BuildEnvironment:
         try:Facts
             with progress_message(__('loading pickled environment')):
                 with open(filename, 'rb') as f:
                     env = pickle.load(f)
                     env.setup(self)
                     self._fresh_env_used = False
         except Exception as err:
             logger.info(__('failed: %s'), err)
             env = self._create_fresh_env()
         return env


Cheers,
Wol

On 22/04/2023 08:11, jfbu wrote:
I have not read all the details, but the pickled environment contains the full 
path to the project.

And at https://www.sphinx-doc.org/en/master/_modules/sphinx/environment.html 
you can find the lines

     def setup(self, app: Sphinx) -> None:
         """Set up BuildEnvironment object."""
         if self.version and self.version != app.registry.get_envversion(app):
             raise BuildEnvironmentError(__('build environment version not 
current'))
         if self.srcdir and self.srcdir != app.srcdir:
             raise BuildEnvironmentError(__('source directory has changed'))

This BuildEnvironment.setup() is called from sphinx.application:
(see https://www.sphinx-doc.org/en/master/_modules/sphinx/application.html)

     def _load_existing_env(self, filename: str) -> BuildEnvironment:
         try:Facts
             with progress_message(__('loading pickled environment')):
                 with open(filename, 'rb') as f:
                     env = pickle.load(f)
                     env.setup(self)
                     self._fresh_env_used = False
         except Exception as err:
             logger.info(__('failed: %s'), err)
             env = self._create_fresh_env()
         return env

The environment "env" loaded from the pickled file carries the absolute path
to the former location.  On the other hand the app.srcdir above contains the
absolute path to the new location.

Hence after doing "cp -a originalproject copiedproject" one gets
on next build attempt in new directory:

     loading pickled environment... failed
     failed: source directory has changed

Also other files under _build/doctrees such as index.doctree contain
absolute paths






--
You received this message because you are subscribed to the Google Groups 
"sphinx-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sphinx-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sphinx-users/u20ago%24ed%241%40ciao.gmane.io.

Reply via email to