[bitbake-devel] [PATCH] git: Use merge-base instead of log for testing if a commit is present

Martin Jansa martin.jansa at gmail.com
Mon Nov 18 18:32:13 UTC 2013


On Mon, Nov 18, 2013 at 05:17:16PM +0000, Richard Purdie wrote:
> The current use of git log to check if a given revision is present can be
> a little fragile.
> 
> For example if revision X was on branch A, and then later added to branch
> B, the update checks would not notice this since they just check for X
> being in the repository.
> 
> We also had some autobuilder corruption where an older packed-refs file
> was copied over a new repository containing newer pack files. There
> was no update to the refs file since the revision was present but
> not accessible in any branch.
> 
> The correct fix is to check that the required revisions are present
> on the specific branches. This patch does this using merge-base.

I guess that merge-base is probably faster or easier to use, but did you
consider using git branch --contains?

e.g. checking if selected branch is in
git branch --contains ud.revisions[name]

I'm asking only because I'm using "git branch --contains" in some
scripts and maybe there is good reason I should rewrite them to use git
merge-base instead.

Thanks

> Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
> ---
> diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py
> index 6175e4c..99230c1 100644
> --- a/bitbake/lib/bb/fetch2/git.py
> +++ b/bitbake/lib/bb/fetch2/git.py
> @@ -150,7 +150,7 @@ class Git(FetchMethod):
>              return True
>          os.chdir(ud.clonedir)
>          for name in ud.names:
> -            if not self._contains_ref(ud.revisions[name], d):
> +            if not self._contains_ref(ud.revisions[name], ud.branches[name], d):
>                  return True
>          if ud.write_tarballs and not os.path.exists(ud.fullmirror):
>              return True
> @@ -197,7 +197,7 @@ class Git(FetchMethod):
>          # Update the checkout if needed
>          needupdate = False
>          for name in ud.names:
> -            if not self._contains_ref(ud.revisions[name], d):
> +            if not self._contains_ref(ud.revisions[name], ud.branches[name], d):
>                  needupdate = True
>          if needupdate:
>              try: 
> @@ -281,13 +281,14 @@ class Git(FetchMethod):
>      def supports_srcrev(self):
>          return True
>  
> -    def _contains_ref(self, tag, d):
> +    def _contains_ref(self, tag, branch, d):
>          basecmd = data.getVar("FETCHCMD_git", d, True) or "git"
> -        cmd = "%s log --pretty=oneline -n 1 %s -- 2> /dev/null | wc -l" % (basecmd, tag)
> -        output = runfetchcmd(cmd, d, quiet=True)
> -        if len(output.split()) > 1:
> -            raise bb.fetch2.FetchError("The command '%s' gave output with more then 1 line unexpectedly, output: '%s'" % (cmd, output))
> -        return output.split()[0] != "0"
> +        cmd = "%s merge-base --is-ancestorlog %s %s" % (basecmd, tag, branch)
> +        try:
> +            output = runfetchcmd(cmd, d, quiet=True)
> +        except bb.fetch2.FetchError:
> +            return False
> +        return True
>  
>      def _revision_key(self, url, ud, d, name):
>          """
> 
> 
> _______________________________________________
> bitbake-devel mailing list
> bitbake-devel at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/bitbake-devel

-- 
Martin 'JaMa' Jansa     jabber: Martin.Jansa at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.openembedded.org/pipermail/bitbake-devel/attachments/20131118/429395af/attachment-0002.sig>


More information about the bitbake-devel mailing list