diff mbox series

patchtest: fix failure when oe-core repo is in detached HEAD

Message ID 20251002131024.48843-1-naftaly.ralamboarivony@smile.fr
State New
Headers show
Series patchtest: fix failure when oe-core repo is in detached HEAD | expand

Commit Message

naftaly.ralamboarivony@smile.fr Oct. 2, 2025, 1:10 p.m. UTC
From: Naftaly RALAMBOARIVONY <naftaly.ralamboarivony@smile.fr>

Patchtest fails when oe-core git repo is in a "detached HEAD" state:

Error log:

> File "/usr/lib/python3/dist-packages/git/repo/base.py", line 881, in
active_branch return self.head.reference ^^^^^^^^^^^^^^^^^^^

> File "/usr/lib/python3/dist-packages/git/refs/symbolic.py", line 311, in
_get_reference raise TypeError("%s is a detached symbolic reference as it
points to %r" % (self, sha)) TypeError: HEAD is a detached symbolic reference
as it points to '3dd31d3b29730fa1130645d76bb71914ac036335' None

In this case, no current branch is available for the clean operation.

To fix this, updates the checkout logic:
- if a current branch is available, use it,
- otherwise, fall back to the commit pointed to by HEAD.

This ensures that the script works correctly even when HEAD is detached.

Signed-off-by: Naftaly RALAMBOARIVONY <naftaly.ralamboarivony@smile.fr>
---
 meta/lib/patchtest/repo.py | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

Trevor Gamblin Oct. 2, 2025, 2:57 p.m. UTC | #1
On 2025-10-02 09:10, naftaly.ralamboarivony via lists.openembedded.org 
wrote:
> From: Naftaly RALAMBOARIVONY <naftaly.ralamboarivony@smile.fr>
>
> Patchtest fails when oe-core git repo is in a "detached HEAD" state:
>
> Error log:
>
>> File "/usr/lib/python3/dist-packages/git/repo/base.py", line 881, in
> active_branch return self.head.reference ^^^^^^^^^^^^^^^^^^^
>
>> File "/usr/lib/python3/dist-packages/git/refs/symbolic.py", line 311, in
> _get_reference raise TypeError("%s is a detached symbolic reference as it
> points to %r" % (self, sha)) TypeError: HEAD is a detached symbolic reference
> as it points to '3dd31d3b29730fa1130645d76bb71914ac036335' None
>
> In this case, no current branch is available for the clean operation.
>
> To fix this, updates the checkout logic:
> - if a current branch is available, use it,
> - otherwise, fall back to the commit pointed to by HEAD.
>
> This ensures that the script works correctly even when HEAD is detached.
>
> Signed-off-by: Naftaly RALAMBOARIVONY <naftaly.ralamboarivony@smile.fr>
Thanks for this. LGTM.
> ---
>   meta/lib/patchtest/repo.py | 9 +++++++--
>   1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/meta/lib/patchtest/repo.py b/meta/lib/patchtest/repo.py
> index 2cdd6736e4..6a7d7d2d3b 100644
> --- a/meta/lib/patchtest/repo.py
> +++ b/meta/lib/patchtest/repo.py
> @@ -21,7 +21,12 @@ class PatchTestRepo(object):
>           self.repodir = repodir
>           self.repo = git.Repo.init(repodir)
>           self.patch = mbox.PatchSeries(patch)
> -        self.current_branch = self.repo.active_branch.name
> +
> +        if self.repo.head.is_detached:
> +            self.current_commit = self.repo.head.commit.hexsha
> +            self.current_branch = None
> +        else:
> +            self.current_branch = self.repo.active_branch.name
>   
>           # targeted branch defined on the patch may be invalid, so make sure there
>           # is a corresponding remote branch
> @@ -80,6 +85,6 @@ class PatchTestRepo(object):
>               self._patchmerged = True
>   
>       def clean(self):
> -        self.repo.git.execute(['git', 'checkout', self.current_branch])
> +        self.repo.git.execute(['git', 'checkout', self.current_branch if self.current_branch else self.current_commit])
>           self.repo.git.execute(['git', 'branch', '-D', self._workingbranch])
>           self._patchmerged = False
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#224357): https://lists.openembedded.org/g/openembedded-core/message/224357
> Mute This Topic: https://lists.openembedded.org/mt/115551792/7611679
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [tgamblin@baylibre.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Yoann Congal Oct. 2, 2025, 3:15 p.m. UTC | #2
Le jeu. 2 oct. 2025 à 15:10, naftaly.ralamboarivony via
lists.openembedded.org <naftaly.ralamboarivony=
smile.fr@lists.openembedded.org> a écrit :

> From: Naftaly RALAMBOARIVONY <naftaly.ralamboarivony@smile.fr>
>
> Patchtest fails when oe-core git repo is in a "detached HEAD" state:
>
> Error log:
>
> > File "/usr/lib/python3/dist-packages/git/repo/base.py", line 881, in
> active_branch return self.head.reference ^^^^^^^^^^^^^^^^^^^
>
> > File "/usr/lib/python3/dist-packages/git/refs/symbolic.py", line 311, in
> _get_reference raise TypeError("%s is a detached symbolic reference as it
> points to %r" % (self, sha)) TypeError: HEAD is a detached symbolic
> reference
> as it points to '3dd31d3b29730fa1130645d76bb71914ac036335' None
>
> In this case, no current branch is available for the clean operation.
>
> To fix this, updates the checkout logic:
> - if a current branch is available, use it,
> - otherwise, fall back to the commit pointed to by HEAD.
>
> This ensures that the script works correctly even when HEAD is detached.
>
> Signed-off-by: Naftaly RALAMBOARIVONY <naftaly.ralamboarivony@smile.fr>
>

 Reviewed-by: Yoann Congal <yoann.congal@smile.fr>


> ---
>  meta/lib/patchtest/repo.py | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/meta/lib/patchtest/repo.py b/meta/lib/patchtest/repo.py
> index 2cdd6736e4..6a7d7d2d3b 100644
> --- a/meta/lib/patchtest/repo.py
> +++ b/meta/lib/patchtest/repo.py
> @@ -21,7 +21,12 @@ class PatchTestRepo(object):
>          self.repodir = repodir
>          self.repo = git.Repo.init(repodir)
>          self.patch = mbox.PatchSeries(patch)
> -        self.current_branch = self.repo.active_branch.name
> +
> +        if self.repo.head.is_detached:
> +            self.current_commit = self.repo.head.commit.hexsha
> +            self.current_branch = None
> +        else:
> +            self.current_branch = self.repo.active_branch.name
>
>          # targeted branch defined on the patch may be invalid, so make
> sure there
>          # is a corresponding remote branch
> @@ -80,6 +85,6 @@ class PatchTestRepo(object):
>              self._patchmerged = True
>
>      def clean(self):
> -        self.repo.git.execute(['git', 'checkout', self.current_branch])
> +        self.repo.git.execute(['git', 'checkout', self.current_branch if
> self.current_branch else self.current_commit])
>          self.repo.git.execute(['git', 'branch', '-D',
> self._workingbranch])
>          self._patchmerged = False
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#224357):
> https://lists.openembedded.org/g/openembedded-core/message/224357
> Mute This Topic: https://lists.openembedded.org/mt/115551792/4316185
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> yoann.congal@smile.fr]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
diff mbox series

Patch

diff --git a/meta/lib/patchtest/repo.py b/meta/lib/patchtest/repo.py
index 2cdd6736e4..6a7d7d2d3b 100644
--- a/meta/lib/patchtest/repo.py
+++ b/meta/lib/patchtest/repo.py
@@ -21,7 +21,12 @@  class PatchTestRepo(object):
         self.repodir = repodir
         self.repo = git.Repo.init(repodir)
         self.patch = mbox.PatchSeries(patch)
-        self.current_branch = self.repo.active_branch.name
+
+        if self.repo.head.is_detached:
+            self.current_commit = self.repo.head.commit.hexsha
+            self.current_branch = None
+        else:
+            self.current_branch = self.repo.active_branch.name
 
         # targeted branch defined on the patch may be invalid, so make sure there
         # is a corresponding remote branch
@@ -80,6 +85,6 @@  class PatchTestRepo(object):
             self._patchmerged = True
 
     def clean(self):
-        self.repo.git.execute(['git', 'checkout', self.current_branch])
+        self.repo.git.execute(['git', 'checkout', self.current_branch if self.current_branch else self.current_commit])
         self.repo.git.execute(['git', 'branch', '-D', self._workingbranch])
         self._patchmerged = False