llvm_tools: check for uncommited changes before cherry-picks

Exit when uncommited changes in chromiumos-overlay repo is detected.

BUG=chromium:1057428

TEST=local tests.

Change-Id: I6dacfb67028036b415672c8fba622b49c4ae8b76
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/2321560
Tested-by: Jian Cai <jiancai@google.com>
Reviewed-by: George Burgess <gbiv@chromium.org>
Reviewed-by: Luis Lozano <llozano@chromium.org>
diff --git a/llvm_tools/cherrypick_cl.py b/llvm_tools/cherrypick_cl.py
index 78330d1..9e30672 100755
--- a/llvm_tools/cherrypick_cl.py
+++ b/llvm_tools/cherrypick_cl.py
@@ -170,32 +170,34 @@
       help='Automatically create a CL if specified')
   args = parser.parse_args()
 
-  llvm_config = git_llvm_rev.LLVMConfig(
-      remote='origin', dir=get_llvm_hash.GetAndUpdateLLVMProjectInLLVMTools())
-
   llvm_symlink = chroot.ConvertChrootPathsToAbsolutePaths(
       args.chroot_path,
       chroot.GetChrootEbuildPaths(args.chroot_path, ['sys-devel/llvm']))[0]
+  llvm_symlink_dir = os.path.dirname(llvm_symlink)
+
+  git_status = subprocess.check_output(['git', 'status', '-s'],
+                                       cwd=llvm_symlink_dir,
+                                       encoding='utf-8')
+  if git_status:
+    raise ValueError('Uncommited changes detected in %s' %
+                     os.path.dirname(os.path.dirname(llvm_symlink_dir)))
+
   start_sha = args.start_sha
   if start_sha == 'llvm':
-    start_sha = parse_ebuild_for_assignment(
-        os.path.dirname(llvm_symlink), 'LLVM_HASH')
+    start_sha = parse_ebuild_for_assignment(llvm_symlink_dir, 'LLVM_HASH')
   elif start_sha == 'llvm-next':
-    start_sha = parse_ebuild_for_assignment(
-        os.path.dirname(llvm_symlink), 'LLVM_NEXT_HASH')
+    start_sha = parse_ebuild_for_assignment(llvm_symlink_dir, 'LLVM_NEXT_HASH')
   logging.info('Base llvm hash == %s', start_sha)
 
+  llvm_config = git_llvm_rev.LLVMConfig(
+      remote='origin', dir=get_llvm_hash.GetAndUpdateLLVMProjectInLLVMTools())
+
   start_sha = resolve_llvm_ref(llvm_config.dir, start_sha)
   start_rev = git_llvm_rev.translate_sha_to_rev(llvm_config, start_sha)
 
   if args.create_cl:
     branch = 'cherry-pick'
-    symlink = os.path.dirname(
-        chroot.GetChrootEbuildPaths(args.chroot_path, ['sys-devel/llvm'])[0])
-    symlink = chroot.ConvertChrootPathsToAbsolutePaths(args.chroot_path,
-                                                       [symlink])[0]
-    symlink_dir = os.path.dirname(symlink)
-    git.CreateBranch(symlink_dir, branch)
+    git.CreateBranch(llvm_symlink_dir, branch)
     symlinks_to_uprev = []
     commit_messages = [
         'llvm: cherry-pick CLs from upstream\n',
@@ -221,9 +223,9 @@
       relative_patches_dir = 'cherry' if package == 'llvm' else ''
       patches_dir = os.path.join(symlink_dir, 'files', relative_patches_dir)
       logging.info('Cherrypicking %s (%s) into %s', rev, sha, package)
+
       add_cherrypick(patches_json_path, patches_dir, relative_patches_dir,
                      start_rev, llvm_config.dir, rev, sha, package)
-
     if args.create_cl:
       symlinks_to_uprev.extend(symlinks)
       commit_messages.extend([
@@ -240,8 +242,8 @@
     for symlink in symlinks_to_uprev:
       update_chromeos_llvm_hash.UprevEbuildSymlink(symlink)
     subprocess.check_output(['git', 'add', '--all'], cwd=symlink_dir)
-    git.UploadChanges(symlink_dir, branch, commit_messages)
-    git.DeleteBranch(symlink_dir, branch)
+    git.UploadChanges(llvm_symlink_dir, branch, commit_messages)
+    git.DeleteBranch(llvm_symlink_dir, branch)
 
 
 if __name__ == '__main__':