diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2021-03-16 10:22:54 -0400 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2021-03-28 23:24:01 +0300 |
commit | 1ad469342b32fab04e217354790d6c4385f01056 (patch) | |
tree | f14ab2e3cbf40b11ec94b8bd52a237dca2261840 /mesonbuild/msubprojects.py | |
parent | 23c706add1f4345877a4d5a905777a2b4694669a (diff) | |
download | meson-1ad469342b32fab04e217354790d6c4385f01056.zip meson-1ad469342b32fab04e217354790d6c4385f01056.tar.gz meson-1ad469342b32fab04e217354790d6c4385f01056.tar.bz2 |
msubprojects: wrap-file should be re-extracted with --reset
When using --reset we should guarantee that next reconfigure will pick
the latest code. For wrap-file we have no way to know if the revision
changed, so we have to delete the source tree and extract again.
It is unlikely that user has local changes in non-git subprojects, and
--reset is known to be dangerous.
Diffstat (limited to 'mesonbuild/msubprojects.py')
-rwxr-xr-x | mesonbuild/msubprojects.py | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/mesonbuild/msubprojects.py b/mesonbuild/msubprojects.py index fbd5dfc..d038fa7 100755 --- a/mesonbuild/msubprojects.py +++ b/mesonbuild/msubprojects.py @@ -9,40 +9,44 @@ from .wrap import wraptool ALL_TYPES_STRING = ', '.join(ALL_TYPES) -def update_wrapdb_file(wrap, repo_dir, options): +def update_wrapdb_file(wrap): patch_url = wrap.get('patch_url') branch, revision = wraptool.parse_patch_url(patch_url) new_branch, new_revision = wraptool.get_latest_version(wrap.name) - if new_branch == branch and new_revision == revision: - mlog.log(' -> Up to date.') - return True - wraptool.update_wrap_file(wrap.filename, wrap.name, new_branch, new_revision) - msg = [' -> New wrap file downloaded.'] - # Meson reconfigure won't use the new wrap file as long as the source - # directory exists. We don't delete it ourself to avoid data loss in case - # user has changes in their copy. - if os.path.isdir(repo_dir): - msg += ['To use it, delete', mlog.bold(repo_dir), 'and run', mlog.bold('meson --reconfigure')] - mlog.log(*msg) - return True + if new_branch != branch or new_revision != revision: + wraptool.update_wrap_file(wrap.filename, wrap.name, new_branch, new_revision) + mlog.log(' -> New wrap file downloaded.') def update_file(r, wrap, repo_dir, options): patch_url = wrap.values.get('patch_url', '') if patch_url.startswith(API_ROOT): - return update_wrapdb_file(wrap, repo_dir, options) - elif not os.path.isdir(repo_dir): + update_wrapdb_file(wrap) + if not os.path.isdir(repo_dir): # The subproject is not needed, or it is a tarball extracted in # 'libfoo-1.0' directory and the version has been bumped and the new # directory is 'libfoo-2.0'. In that case forcing a meson # reconfigure will download and use the new tarball. - mlog.log(' -> Subproject has not been checked out. Run', mlog.bold('meson --reconfigure'), 'to fetch it if needed.') + mlog.log(' -> Not used.') + return True + elif options.reset: + # Delete existing directory and redownload. It is possible that nothing + # changed but we have no way to know. Hopefully tarballs are still + # cached. + windows_proof_rmtree(repo_dir) + try: + r.resolve(wrap.name, 'meson') + mlog.log(' -> New version extracted') + return True + except WrapException as e: + mlog.log(' ->', mlog.red(str(e))) + return False else: # The subproject has not changed, or the new source and/or patch # tarballs should be extracted in the same directory than previous # version. - mlog.log(' -> Subproject has not changed, or the new source/patch needs to be extracted on the same location.\n' + - ' In that case, delete', mlog.bold(repo_dir), 'and run', mlog.bold('meson --reconfigure')) - return True + mlog.log(' -> Subproject has not changed, or the new source/patch needs to be extracted on the same location.') + mlog.log(' Pass --reset option to delete directory and redownload.') + return False def git_output(cmd, workingdir): return quiet_git(cmd, workingdir, check=True)[1] @@ -260,6 +264,8 @@ def update(r, wrap, repo_dir, options): return update_hg(r, wrap, repo_dir, options) elif wrap.type == 'svn': return update_svn(r, wrap, repo_dir, options) + elif wrap.type is None: + mlog.log(' -> Cannot update subproject with no wrap file') else: mlog.log(' -> Cannot update', wrap.type, 'subproject') return True |