git-update: provides a check status option
authorStéphane Cerveau <scerveau@collabora.com>
Wed, 19 Feb 2020 15:18:39 +0000 (16:18 +0100)
committerStéphane Cerveau <scerveau@collabora.com>
Wed, 19 Feb 2020 20:53:05 +0000 (21:53 +0100)
Add --check-status to git-update python script
to provide the list of subprojects with their
git status (branch and state).

git-update

index 0138fd9..8c223d3 100755 (executable)
@@ -50,7 +50,7 @@ def ensure_revision_if_necessary(repo_dir, revision):
     return revision
 
 
-def update_subprojects(repos_commits, no_interaction=False):
+def update_subprojects(manifest, no_interaction=False, check_status=False):
     subprojects_dir = os.path.join(SCRIPTDIR, "subprojects")
     for repo_name in os.listdir(subprojects_dir):
         repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name))
@@ -58,13 +58,32 @@ def update_subprojects(repos_commits, no_interaction=False):
             continue
 
         revision, args = repos_commits.get(repo_name, [None, []])
-        if not update_repo(repo_name, repo_dir, revision, no_interaction, args):
-            return False
+        if not update_repo(repo_name, repo_dir, revision, no_interaction, args, check_status=check_status):
+          return False
 
     return True
 
+def repo_status(commit_message):
+    status = "clean"
+    for message in commit_message:
+      if message.startswith('??'):
+        status = "%sclean but untracked files%s" % (Colors.WARNING,Colors.ENDC)
+      elif message.startswith(' M'):
+        status = "%shas local modificationss%s" % (Colors.WARNING,Colors.ENDC)
+        break;
+    return status
+
+def check_repo_status(repo_name, worktree_dir):
+    branch_message = git("status", repository_path=worktree_dir).split("\n")
+    commit_message = git("status", "--porcelain", repository_path=worktree_dir).split("\n")
+
+    print(u"%s%s%s - %s - %s" % (Colors.HEADER, repo_name, Colors.ENDC,
+                                    branch_message[0].strip(), repo_status(commit_message)))
+    return True
 
-def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0):
+def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0, check_status=False):
+    if check_status:
+      return check_repo_status(repo_name, repo_dir)
     revision = ensure_revision_if_necessary(repo_dir, revision)
     git("config", "rebase.autoStash", "true", repository_path=repo_dir)
     try:
@@ -149,6 +168,10 @@ if __name__ == "__main__":
                         default=False,
                         action='store_true',
                         help="Do not allow interaction with the user.")
+    parser.add_argument("--check-status",
+                        default=False,
+                        action='store_true',
+                        help="Check repositories status only.")
     parser.add_argument("--manifest",
                         default=None,
                         help="Use a android repo manifest to sync repositories"
@@ -168,13 +191,12 @@ if __name__ == "__main__":
         repos_commits = {}
 
     revision, args = repos_commits.get('gst-build', [None, []])
-    if not update_repo('gst-build', SCRIPTDIR, revision, options.no_interaction, args):
+    if not update_repo('gst-build', SCRIPTDIR, None, options.no_interaction, args, check_status=options.check_status):
         exit(1)
-
-    if not update_subprojects(repos_commits, options.no_interaction):
+    if not update_subprojects(options.manifest, options.no_interaction, check_status=options.check_status):
         exit(1)
-
-    update_cargo(options.builddir)
+    if not options.check_status:
+      update_cargo(options.builddir)
 
     if options.builddir:
         ninja = accept_command(["ninja", "ninja-build"])