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 <halcanary@google.com>
Reviewed-by: Leon Scroggins <scroggo@google.com>
This commit is contained in:
Hal Canary 2019-11-15 10:23:30 -05:00 committed by Skia Commit-Bot
parent 22a04cde64
commit 11c45d64dc

59
gn/copy_git_directory.py Executable file
View File

@ -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)