"""
BitBake 'Fetch' git annex implementation
"""

# Copyright (C) 2014 Otavio Salvador
# Copyright (C) 2014 O.S. Systems Software LTDA.
#
# SPDX-License-Identifier: GPL-2.0-only
#

import bb
from   bb.fetch.git import Git
from   bb.fetch import runfetchcmd

class GitANNEX(Git):
    def supports(self, ud, d):
        """
        Check to see if a given url can be fetched with git.
        """
        return ud.type in ['gitannex']

    def urldata_init(self, ud, d):
        super(GitANNEX, self).urldata_init(ud, d)
        if ud.shallow:
            ud.shallow_extra_refs += ['refs/heads/git-annex', 'refs/heads/synced/*']

    def uses_annex(self, ud, d, wd):
        for name in ud.names:
            try:
                runfetchcmd(ud.basecmd + ['rev-list', 'git-annex'], d, quiet=True, workdir=wd)
                return True
            except bb.fetch.FetchError:
                pass

        return False

    def update_annex(self, ud, d, wd):
        try:
            runfetchcmd(ud.basecmd + ['annex', 'get', '--all'], d, quiet=True, workdir=wd)
        except bb.fetch.FetchError:
            return False
        runfetchcmd(['chmod', 'u+w', '-R', '%s/annex' % ud.clonedir], d, quiet=True, workdir=wd)

        return True

    def download(self, ud, d):
        Git.download(self, ud, d)

        if not ud.shallow or ud.localpath != ud.fullshallow:
            if self.uses_annex(ud, d, ud.clonedir):
                self.update_annex(ud, d, ud.clonedir)

    def clone_shallow_local(self, ud, dest, d):
        super(GitANNEX, self).clone_shallow_local(ud, dest, d)

        try:
            runfetchcmd(ud.basecmd + ['annex', 'init'], d, workdir=dest)
        except bb.fetch.FetchError:
            pass

        if self.uses_annex(ud, d, dest):
            runfetchcmd(ud.basecmd + ['annex', 'get'], d, workdir=dest)
            runfetchcmd(['chmod', 'u+w', '-R',  '%s/.git/annex' % dest], d, quiet=True, workdir=dest)

    def unpack(self, ud, destdir, d):
        Git.unpack(self, ud, destdir, d)

        try:
            runfetchcmd(ud.basecmd + ['annex' ,'init'], d, workdir=ud.destdir)
        except bb.fetch.FetchError:
            pass

        annex = self.uses_annex(ud, d, ud.destdir)
        if annex:
            runfetchcmd(ud.basecmd + ['annex', 'get'], d, workdir=ud.destdir)
            runfetchcmd(['chmod', 'u+w', '-R',  '%s/.git/annex' % ud.destdir], d, quiet=True, workdir=ud.destdir)

