xref: /OK3568_Linux_fs/yocto/poky/bitbake/lib/bb/fetch2/gitannex.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun"""
2*4882a593SmuzhiyunBitBake 'Fetch' git annex implementation
3*4882a593Smuzhiyun"""
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun# Copyright (C) 2014 Otavio Salvador
6*4882a593Smuzhiyun# Copyright (C) 2014 O.S. Systems Software LTDA.
7*4882a593Smuzhiyun#
8*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only
9*4882a593Smuzhiyun#
10*4882a593Smuzhiyun
11*4882a593Smuzhiyunimport bb
12*4882a593Smuzhiyunfrom   bb.fetch2.git import Git
13*4882a593Smuzhiyunfrom   bb.fetch2 import runfetchcmd
14*4882a593Smuzhiyun
15*4882a593Smuzhiyunclass GitANNEX(Git):
16*4882a593Smuzhiyun    def supports(self, ud, d):
17*4882a593Smuzhiyun        """
18*4882a593Smuzhiyun        Check to see if a given url can be fetched with git.
19*4882a593Smuzhiyun        """
20*4882a593Smuzhiyun        return ud.type in ['gitannex']
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun    def urldata_init(self, ud, d):
23*4882a593Smuzhiyun        super(GitANNEX, self).urldata_init(ud, d)
24*4882a593Smuzhiyun        if ud.shallow:
25*4882a593Smuzhiyun            ud.shallow_extra_refs += ['refs/heads/git-annex', 'refs/heads/synced/*']
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun    def uses_annex(self, ud, d, wd):
28*4882a593Smuzhiyun        for name in ud.names:
29*4882a593Smuzhiyun            try:
30*4882a593Smuzhiyun                runfetchcmd("%s rev-list git-annex" % (ud.basecmd), d, quiet=True, workdir=wd)
31*4882a593Smuzhiyun                return True
32*4882a593Smuzhiyun            except bb.fetch.FetchError:
33*4882a593Smuzhiyun                pass
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun        return False
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun    def update_annex(self, ud, d, wd):
38*4882a593Smuzhiyun        try:
39*4882a593Smuzhiyun            runfetchcmd("%s annex get --all" % (ud.basecmd), d, quiet=True, workdir=wd)
40*4882a593Smuzhiyun        except bb.fetch.FetchError:
41*4882a593Smuzhiyun            return False
42*4882a593Smuzhiyun        runfetchcmd("chmod u+w -R %s/annex" % (ud.clonedir), d, quiet=True, workdir=wd)
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun        return True
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun    def download(self, ud, d):
47*4882a593Smuzhiyun        Git.download(self, ud, d)
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun        if not ud.shallow or ud.localpath != ud.fullshallow:
50*4882a593Smuzhiyun            if self.uses_annex(ud, d, ud.clonedir):
51*4882a593Smuzhiyun                self.update_annex(ud, d, ud.clonedir)
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun    def clone_shallow_local(self, ud, dest, d):
54*4882a593Smuzhiyun        super(GitANNEX, self).clone_shallow_local(ud, dest, d)
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun        try:
57*4882a593Smuzhiyun            runfetchcmd("%s annex init" % ud.basecmd, d, workdir=dest)
58*4882a593Smuzhiyun        except bb.fetch.FetchError:
59*4882a593Smuzhiyun            pass
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun        if self.uses_annex(ud, d, dest):
62*4882a593Smuzhiyun            runfetchcmd("%s annex get" % ud.basecmd, d, workdir=dest)
63*4882a593Smuzhiyun            runfetchcmd("chmod u+w -R %s/.git/annex" % (dest), d, quiet=True, workdir=dest)
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun    def unpack(self, ud, destdir, d):
66*4882a593Smuzhiyun        Git.unpack(self, ud, destdir, d)
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun        try:
69*4882a593Smuzhiyun            runfetchcmd("%s annex init" % (ud.basecmd), d, workdir=ud.destdir)
70*4882a593Smuzhiyun        except bb.fetch.FetchError:
71*4882a593Smuzhiyun            pass
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun        annex = self.uses_annex(ud, d, ud.destdir)
74*4882a593Smuzhiyun        if annex:
75*4882a593Smuzhiyun            runfetchcmd("%s annex get" % (ud.basecmd), d, workdir=ud.destdir)
76*4882a593Smuzhiyun            runfetchcmd("chmod u+w -R %s/.git/annex" % (ud.destdir), d, quiet=True, workdir=ud.destdir)
77*4882a593Smuzhiyun
78