diff mbox

[U-Boot,07/17] buildman: Allow specifying a range of commits to build

Message ID 1417480447-5763-8-git-send-email-sjg@chromium.org
State Accepted
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass Dec. 2, 2014, 12:33 a.m. UTC
Adjust the -b flag to permit a range expression as well as a branch.

Signed-off-by: Simon Glass <sjg@chromium.org>
Suggested-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
---

 tools/buildman/README     | 11 +++++++++++
 tools/buildman/control.py | 19 +++++++++++++++----
 tools/patman/gitutil.py   | 24 +++++++++++++++++++-----
 3 files changed, 45 insertions(+), 9 deletions(-)

Comments

Daniel Schwierzeck Dec. 14, 2014, 5:30 p.m. UTC | #1
Hi Simon,

On 02.12.2014 01:33, Simon Glass wrote:
> Adjust the -b flag to permit a range expression as well as a branch.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> Suggested-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>

works great, thanks.

Tested-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>

> ---
> 
>  tools/buildman/README     | 11 +++++++++++
>  tools/buildman/control.py | 19 +++++++++++++++----
>  tools/patman/gitutil.py   | 24 +++++++++++++++++++-----
>  3 files changed, 45 insertions(+), 9 deletions(-)
> 
> diff --git a/tools/buildman/README b/tools/buildman/README
> index db1ec68..0500ce5 100644
> --- a/tools/buildman/README
> +++ b/tools/buildman/README
> @@ -699,6 +699,17 @@ build the selected boards and display build status as it runs (i.e. -v is
>  enabled automatically). Use -e to see errors/warnings as well.
>  
>  
> +Building Ranges
> +===============
> +
> +You can build a range of commits by specifying a range instead of a branch
> +when using the -b flag. For example:
> +
> +    upstream/master..us-buildman
> +
> +will build commits in us-buildman that are not in upstream/master.
> +
> +
>  Other options
>  =============
>  
> diff --git a/tools/buildman/control.py b/tools/buildman/control.py
> index 331b4f9..6a6743e 100644
> --- a/tools/buildman/control.py
> +++ b/tools/buildman/control.py
> @@ -123,14 +123,22 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
>      # problems introduced by the first commit on the branch.
>      col = terminal.Color()
>      count = options.count
> +    has_range = options.branch and '..' in options.branch
>      if count == -1:
>          if not options.branch:
>              count = 1
>          else:
> -            count, msg = gitutil.CountCommitsInBranch(options.git_dir,
> -                                                      options.branch)
> +            if has_range:
> +                count, msg = gitutil.CountCommitsInRange(options.git_dir,
> +                                                         options.branch)
> +            else:
> +                count, msg = gitutil.CountCommitsInBranch(options.git_dir,
> +                                                          options.branch)
>              if count is None:
>                  sys.exit(col.Color(col.RED, msg))
> +            elif count == 0:
> +                sys.exit(col.Color(col.RED, "Range '%s' has no commits" %
> +                                   options.branch))
>              if msg:
>                  print col.Color(col.YELLOW, msg)
>              count += 1   # Build upstream commit also
> @@ -172,8 +180,11 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
>      # to overwrite earlier ones by setting allow_overwrite=True
>      if options.branch:
>          if count == -1:
> -            range_expr = gitutil.GetRangeInBranch(options.git_dir,
> -                                                  options.branch)
> +            if has_range:
> +                range_expr = options.branch
> +            else:
> +                range_expr = gitutil.GetRangeInBranch(options.git_dir,
> +                                                      options.branch)
>              upstream_commit = gitutil.GetUpstream(options.git_dir,
>                                                    options.branch)
>              series = patchstream.GetMetaDataForList(upstream_commit,
> diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py
> index 34c6b04..cc5a55a 100644
> --- a/tools/patman/gitutil.py
> +++ b/tools/patman/gitutil.py
> @@ -154,6 +154,24 @@ def GetRangeInBranch(git_dir, branch, include_upstream=False):
>      rstr = '%s%s..%s' % (upstream, '~' if include_upstream else '', branch)
>      return rstr, msg
>  
> +def CountCommitsInRange(git_dir, range_expr):
> +    """Returns the number of commits in the given range.
> +
> +    Args:
> +        git_dir: Directory containing git repo
> +        range_expr: Range to check
> +    Return:
> +        Number of patches that exist in the supplied rangem or None if none
> +        were found
> +    """
> +    pipe = [LogCmd(range_expr, git_dir=git_dir, oneline=True)]
> +    result = command.RunPipe(pipe, capture=True, capture_stderr=True,
> +                             raise_on_error=False)
> +    if result.return_code:
> +        return None, "Range '%s' not found or is invalid" % range_expr
> +    patch_count = len(result.stdout.splitlines())
> +    return patch_count, None
> +
>  def CountCommitsInBranch(git_dir, branch, include_upstream=False):
>      """Returns the number of commits in the given branch.
>  
> @@ -167,11 +185,7 @@ def CountCommitsInBranch(git_dir, branch, include_upstream=False):
>      range_expr, msg = GetRangeInBranch(git_dir, branch, include_upstream)
>      if not range_expr:
>          return None, msg
> -    pipe = [LogCmd(range_expr, git_dir=git_dir, oneline=True),
> -            ['wc', '-l']]
> -    result = command.RunPipe(pipe, capture=True, oneline=True)
> -    patch_count = int(result.stdout)
> -    return patch_count, msg
> +    return CountCommitsInRange(git_dir, range_expr)
>  
>  def CountCommits(commit_range):
>      """Returns the number of commits in the given range.
>
diff mbox

Patch

diff --git a/tools/buildman/README b/tools/buildman/README
index db1ec68..0500ce5 100644
--- a/tools/buildman/README
+++ b/tools/buildman/README
@@ -699,6 +699,17 @@  build the selected boards and display build status as it runs (i.e. -v is
 enabled automatically). Use -e to see errors/warnings as well.
 
 
+Building Ranges
+===============
+
+You can build a range of commits by specifying a range instead of a branch
+when using the -b flag. For example:
+
+    upstream/master..us-buildman
+
+will build commits in us-buildman that are not in upstream/master.
+
+
 Other options
 =============
 
diff --git a/tools/buildman/control.py b/tools/buildman/control.py
index 331b4f9..6a6743e 100644
--- a/tools/buildman/control.py
+++ b/tools/buildman/control.py
@@ -123,14 +123,22 @@  def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
     # problems introduced by the first commit on the branch.
     col = terminal.Color()
     count = options.count
+    has_range = options.branch and '..' in options.branch
     if count == -1:
         if not options.branch:
             count = 1
         else:
-            count, msg = gitutil.CountCommitsInBranch(options.git_dir,
-                                                      options.branch)
+            if has_range:
+                count, msg = gitutil.CountCommitsInRange(options.git_dir,
+                                                         options.branch)
+            else:
+                count, msg = gitutil.CountCommitsInBranch(options.git_dir,
+                                                          options.branch)
             if count is None:
                 sys.exit(col.Color(col.RED, msg))
+            elif count == 0:
+                sys.exit(col.Color(col.RED, "Range '%s' has no commits" %
+                                   options.branch))
             if msg:
                 print col.Color(col.YELLOW, msg)
             count += 1   # Build upstream commit also
@@ -172,8 +180,11 @@  def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
     # to overwrite earlier ones by setting allow_overwrite=True
     if options.branch:
         if count == -1:
-            range_expr = gitutil.GetRangeInBranch(options.git_dir,
-                                                  options.branch)
+            if has_range:
+                range_expr = options.branch
+            else:
+                range_expr = gitutil.GetRangeInBranch(options.git_dir,
+                                                      options.branch)
             upstream_commit = gitutil.GetUpstream(options.git_dir,
                                                   options.branch)
             series = patchstream.GetMetaDataForList(upstream_commit,
diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py
index 34c6b04..cc5a55a 100644
--- a/tools/patman/gitutil.py
+++ b/tools/patman/gitutil.py
@@ -154,6 +154,24 @@  def GetRangeInBranch(git_dir, branch, include_upstream=False):
     rstr = '%s%s..%s' % (upstream, '~' if include_upstream else '', branch)
     return rstr, msg
 
+def CountCommitsInRange(git_dir, range_expr):
+    """Returns the number of commits in the given range.
+
+    Args:
+        git_dir: Directory containing git repo
+        range_expr: Range to check
+    Return:
+        Number of patches that exist in the supplied rangem or None if none
+        were found
+    """
+    pipe = [LogCmd(range_expr, git_dir=git_dir, oneline=True)]
+    result = command.RunPipe(pipe, capture=True, capture_stderr=True,
+                             raise_on_error=False)
+    if result.return_code:
+        return None, "Range '%s' not found or is invalid" % range_expr
+    patch_count = len(result.stdout.splitlines())
+    return patch_count, None
+
 def CountCommitsInBranch(git_dir, branch, include_upstream=False):
     """Returns the number of commits in the given branch.
 
@@ -167,11 +185,7 @@  def CountCommitsInBranch(git_dir, branch, include_upstream=False):
     range_expr, msg = GetRangeInBranch(git_dir, branch, include_upstream)
     if not range_expr:
         return None, msg
-    pipe = [LogCmd(range_expr, git_dir=git_dir, oneline=True),
-            ['wc', '-l']]
-    result = command.RunPipe(pipe, capture=True, oneline=True)
-    patch_count = int(result.stdout)
-    return patch_count, msg
+    return CountCommitsInRange(git_dir, range_expr)
 
 def CountCommits(commit_range):
     """Returns the number of commits in the given range.