From 11c45d64dcadcf25e31d8bd679834b5c158a8b64 Mon Sep 17 00:00:00 2001 From: Hal Canary Date: Fri, 15 Nov 2019 10:23:30 -0500 Subject: [PATCH] GN tool: copy_git_directory.py script Motivation: to be used by android roller (android_skia_checkout.go) to keep third_party/libgif updated to where DEPS points third_party/external/libgif at. No-Try: true Bug: skia:9654 Change-Id: I18273dfc7da215b6081ffd454edfa1651791b6df Reviewed-on: https://skia-review.googlesource.com/c/skia/+/254896 Commit-Queue: Hal Canary Reviewed-by: Leon Scroggins --- gn/copy_git_directory.py | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 gn/copy_git_directory.py diff --git a/gn/copy_git_directory.py b/gn/copy_git_directory.py new file mode 100755 index 0000000000..acf17b07b0 --- /dev/null +++ b/gn/copy_git_directory.py @@ -0,0 +1,59 @@ +#! /usr/bin/env python +# Copyright 2019 Google LLC. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import shutil +import subprocess +import sys + +def copy_git_directory(src, dst, out=None): + ''' + Makes a copy of `src` directory in `dst` directory. If files already exist + and are identical, do not touch them. If extra files or directories exist, + remove them. Assume that `src` is a git directory so that `git ls-files` can + be used to enumerate files. This has the added benefit of ignoring files + not tracked by git. Also, if out is not None, write summary of actions to out. + If `dst` is a top-level git directory, the `.git` directory will be removed. + ''' + assert os.path.isdir(src) + if not os.path.isdir(dst): + os.makedirs(dst) + ls_files = subprocess.check_output(['git', 'ls-files', '-z', '.'], cwd=src) + src_files = set(p for p in ls_files.split('\0') if p) + abs_src = os.path.abspath(src) + cwd = os.getcwd() + try: + os.chdir(dst) + def output(out, sym, dst, path): + if out: + out.write('%s %s%s%s\n' % (sym, dst, os.sep, path)) + for dirpath, dirnames, filenames in os.walk('.', topdown=False): + for filename in filenames: + path = os.path.normpath(os.path.join(dirpath, filename)) + if path not in src_files: + output(out, '-', dst, path) + os.remove(path) + for filename in dirnames: + path = os.path.normpath(os.path.join(dirpath, filename)) + if not os.listdir(path): # Remove empty subfolders. + output(out, '-', dst, path + os.sep) + os.rmdir(path) + for path in src_files: + src_path = os.path.join(abs_src, path) + if os.path.exists(path): + with open(path) as f1: + with open(src_path) as f2: + if f1.read() == f2.read(): + continue + output(out, '+', dst, path) + shutil.copy2(src_path, path) + finally: + os.chdir(cwd) + +if __name__ == '__main__': + if len(sys.argv) != 3: + sys.stderr.write('\nUsage:\n %s SRC_DIR DST_DIR\n\n' % sys.argv[0]) + sys.exit(1) + copy_git_directory(sys.argv[1], sys.argv[2], sys.stdout)