aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/markdown/Subprojects.md3
-rw-r--r--docs/markdown/snippets/subprojects_update.md8
-rwxr-xr-xmesonbuild/msubprojects.py44
3 files changed, 35 insertions, 20 deletions
diff --git a/docs/markdown/Subprojects.md b/docs/markdown/Subprojects.md
index 3fbfd5b..7cb04e0 100644
--- a/docs/markdown/Subprojects.md
+++ b/docs/markdown/Subprojects.md
@@ -310,7 +310,8 @@ To pull latest version of all your subprojects at once, just run the command:
- If the wrap file comes from wrapdb, the latest version of the wrap file will
be pulled and used next time meson reconfigure the project. This can be
triggered using `meson --reconfigure`. Previous source tree is not deleted, to
- prevent from any loss of local changes.
+ prevent from any loss of local changes. *Since 0.58.0* If `--reset` is
+ specified, the source tree is deleted and new source is extracted.
- If subproject is currently in detached mode, a checkout of the revision from
wrap file is performed. *Since 0.56.0* a rebase is also performed in case the
revision already existed locally but was outdated. If `--reset` is specified,
diff --git a/docs/markdown/snippets/subprojects_update.md b/docs/markdown/snippets/subprojects_update.md
new file mode 100644
index 0000000..d576bc8
--- /dev/null
+++ b/docs/markdown/snippets/subprojects_update.md
@@ -0,0 +1,8 @@
+## `meson subprojects update --reset` now re-extract tarballs
+
+When using `--reset` option, the source tree of `[wrap-file]` subprojects is now
+deleted and re-extracted from cached tarballs, or re-downloaded. This is because
+Meson has no way to know if the source tree or the wrap file has been modified,
+and `--reset` should guarantee that latest code is being used on next reconfigure.
+
+Use `--reset` with caution if you do local changes on non-git subprojects.
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