Index: sdk_build/pylib/git.py |
diff --git a/sdk_build/pylib/git.py b/sdk_build/pylib/git.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fa09880cdec27e773ced8e52086b9452ca7b5f00 |
--- /dev/null |
+++ b/sdk_build/pylib/git.py |
@@ -0,0 +1,69 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Git support functions.""" |
+ |
+ |
+from errors import FatalError |
+import fnmatch |
+import os.path |
+import subprocess |
+ |
+ |
+def Git(subcommand, *args): |
+ """Runs "git <subcommand> <args...>" and returns the output, including |
+ standard error. Raises |OSError| if it fails to run git at all and |
+ |subprocess.CalledProcessError| if the command returns failure (nonzero).""" |
+ |
+ return subprocess.check_output( |
+ ('git', subcommand) + args, stderr=subprocess.STDOUT) |
+ |
+ |
+def SanityCheckGit(): |
+ """Does a sanity check that git is available and the current working directory |
+ is in a git repository (exits with an error message on failure).""" |
+ |
+ try: |
+ Git("status") |
+ except OSError: |
+ FatalError("failed to run git -- is it in your PATH?") |
+ except subprocess.CalledProcessError: |
+ FatalError("\"git status\" failed -- is %s in a git repository?" % |
+ os.getcwd()) |
+ |
+ |
+def IsGitTreeDirty(): |
+ """Checks if the tree looks dirty (returning true if it is).""" |
+ |
+ try: |
+ Git("diff-index", "--quiet", "HEAD") |
+ except subprocess.CalledProcessError: |
+ return True |
+ return False |
+ |
+ |
+def GitLsFiles(path, recursive=True, exclude_file_patterns=None, |
+ exclude_path_patterns=None): |
+ """Returns a list of files under the given path (the filenames will include |
+ the full path). If |recursive| is true (the default), then this list will |
+ include all files (recursively); if not, it will only include the files "at" |
+ the exact path. |exclude_file_patterns| may be a list of shell-style wildcards |
+ of filenames to exclude. Similarly, |exclude_path_patterns| may be a list of |
+ shell-style wildcards of paths to exclude (note: to make it easier to match |
+ subtrees, a trailing '/' is added to the path for matching purposes).""" |
+ |
+ # Files are "null-terminated". This results in an extra empty string at the |
+ # end. "Luckily", in the empty case, we also get an empty string. |
+ result = Git("ls-files", "-z", path).split("\0")[:-1] |
+ if not recursive: |
+ result = [f for f in result if os.path.dirname(f) == path] |
+ if exclude_file_patterns: |
+ for p in exclude_file_patterns: |
+ result = [f for f in result |
+ if not fnmatch.fnmatch(os.path.basename(f), p)] |
+ if exclude_path_patterns: |
+ for p in exclude_path_patterns: |
+ result = [f for f in result |
+ if not fnmatch.fnmatch(os.path.dirname(f) + "/", p)] |
+ return result |