summaryrefslogtreecommitdiffstats
path: root/llvm/utils/git-svn/git-llvm
diff options
context:
space:
mode:
authorJames Y Knight <jyknight@google.com>2018-11-29 16:46:34 +0000
committerJames Y Knight <jyknight@google.com>2018-11-29 16:46:34 +0000
commit3c24bd09bb2de3f8d3c03c7ec02c066d1bc49d6f (patch)
tree5479be29864754a5ce0bf8035ceb281f9087e7f4 /llvm/utils/git-svn/git-llvm
parent515b91cdefcb0c02ab06443ec2aca01ff02a993c (diff)
downloadbcm5719-llvm-3c24bd09bb2de3f8d3c03c7ec02c066d1bc49d6f.tar.gz
bcm5719-llvm-3c24bd09bb2de3f8d3c03c7ec02c066d1bc49d6f.zip
git-llvm: Fix incremental population of svn tree.
"svn update --depth=..." is, annoyingly, not a specification of the desired depth, but rather a _limit_ added on top of the "sticky" depth in the working-directory. However, if the directory doesn't exist yet, then it sets the sticky depth of the new directory entries. Unfortunately, the svn command-line has no way of expanding the depth of a directory from "empty" to "files", without also removing any already-expanded subdirectories. The way you're supposed to increase the depth of an existing directory is via --set-depth, but --set-depth=files will also remove any subdirs which were already requested. This change avoids getting into the state of ever needing to increase the depth of an existing directory from "empty" to "files" in the first place, by: 1. Use svn update --depth=files, not --depth=immediates. The latter has the effect of checking out the subdirectories and marking them as depth=empty. The former excludes sub-directories from the list of entries, which avoids the problem. 2. Explicitly populate missing parent directories. Using --parents seemed nice and easy, but it marks the parent dirs as depth=empty. Instead, check out parents explicitly if they're missing. llvm-svn: 347883
Diffstat (limited to 'llvm/utils/git-svn/git-llvm')
-rwxr-xr-xllvm/utils/git-svn/git-llvm23
1 files changed, 21 insertions, 2 deletions
diff --git a/llvm/utils/git-svn/git-llvm b/llvm/utils/git-svn/git-llvm
index ea55fe46140..53c0b24ae2c 100755
--- a/llvm/utils/git-svn/git-llvm
+++ b/llvm/utils/git-svn/git-llvm
@@ -265,6 +265,14 @@ def split_subrepo(f):
else:
return '', f
+def get_all_parent_dirs(name):
+ parts = []
+ head, tail = os.path.split(name)
+ while head:
+ parts.append(head)
+ head, tail = os.path.split(head)
+ return parts
+
def svn_push_one_rev(svn_repo, rev, dry_run):
files = git('diff-tree', '--no-commit-id', '--name-only', '-r',
rev).split('\n')
@@ -289,9 +297,20 @@ def svn_push_one_rev(svn_repo, rev, dry_run):
svn_dirs_to_update.add(
os.path.dirname(os.path.join(svn_sr_path, f)))
+ # We also need to svn update any parent directories which are not yet present
+ parent_dirs = set()
+ for dir in svn_dirs_to_update:
+ parent_dirs.update(get_all_parent_dirs(dir))
+ parent_dirs = set(dir for dir in parent_dirs
+ if not os.path.exists(os.path.join(svn_repo, dir)))
+ svn_dirs_to_update.update(parent_dirs)
+
+ # Sort by length to ensure that the parent directories are passed to svn
+ # before child directories.
+ sorted_dirs_to_update = sorted(svn_dirs_to_update, key=len)
+
# SVN update only in the affected directories.
- svn(svn_repo, 'update', '--depth=immediates', '--parents',
- *svn_dirs_to_update)
+ svn(svn_repo, 'update', '--depth=files', *sorted_dirs_to_update)
for sr, files in iteritems(subrepo_files):
svn_sr_path = os.path.join(svn_repo, GIT_TO_SVN_DIR[sr])
OpenPOWER on IntegriCloud