Hi, Is there any interest to commit this patch?
I've been using it successfully with following versions: 1.8.18, 1.10.1, 1.10.2, 1.12.0 (well, with a small difference now in lib/bb/fetch/__init__.py since 1.12.0) I could also extend the usermanual.xml with kind regards, Fabrice Aeschbacher > -----Ursprüngliche Nachricht----- > Von: [email protected] > [mailto:[email protected]] Im Auftrag von > Aeschbacher, Fabrice > Gesendet: Dienstag, 15. Februar 2011 11:32 > An: [email protected] > Betreff: [Bitbake-dev] [PATCH] add clearcase fetcher > > Please find below a patch adding a clearcase fetcher to bitbake. > > Usage: see comments in clearcase.py > > Review / comments are welcome > > Signed-off-by: Fabrice Aeschbacher <[email protected]> > --- > lib/bb/fetch/__init__.py | 2 ++ > lib/bb/fetch/clearcase.py | 267 > +++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 269 insertions(+), 0 deletions(-) > create mode 100644 lib/bb/fetch/clearcase.py > > diff --git a/lib/bb/fetch/__init__.py b/lib/bb/fetch/__init__.py > index f7b06f3..e034078 100644 > --- a/lib/bb/fetch/__init__.py > +++ b/lib/bb/fetch/__init__.py > @@ -769,6 +769,7 @@ import bzr > import hg > import osc > import repo > +import clearcase > > methods.append(local.Local()) > methods.append(wget.Wget()) > @@ -782,3 +783,4 @@ methods.append(bzr.Bzr()) > methods.append(hg.Hg()) > methods.append(osc.Osc()) > methods.append(repo.Repo()) > +methods.append(clearcase.Clearcase()) > diff --git a/lib/bb/fetch/clearcase.py b/lib/bb/fetch/clearcase.py > new file mode 100644 > index 0000000..486206c > --- /dev/null > +++ b/lib/bb/fetch/clearcase.py > @@ -0,0 +1,267 @@ > +# ex:ts=4:sw=4:sts=4:et > +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- > + > +""" > +BitBake 'Fetch' implementation for clearcase. > + > + > +The clearcase fetcher is used to retrieve files from a > ClearCase repository > + > +Usage: > + > + > SRC_URI="ccase://cc.server.org/trunk;vob=myvob;module=app/dir1 > ;label=MYLABEL_1.0;proto=http" > +or: > + > SRC_URI="ccrc://cc.server.org/trunk;vob=myvob;module=app/dir1; > label=MYLABEL_1.0;proto=http" > + > +The fetcher uses following clearcase client: > + - if SRC_URI="ccase://..." => use native client (cleartool) > + - if SRC_URI="ccrc://..." => use remote client (rcleartool) > + > +Supported options: > + > + vob (required) The name of the clearcase VOB > + Creates following load rule in the view config spec: > + load /<vob> > + > + module Load only this sub-directory from the VOB by > + creating following load rule in the view config spec: > + load /<vob>/<module> > + > + label Download this label (default: LATEST) > + > + proto http or https > + > + file single file (value ignored) > + > + > +Related variables: > + > + CCASE_USERNAME The username to access the ClearCase > server (ccrc only) > + CCASE_PASSWORD The password to access the ClearCase > server (ccrc only) > + > + > +Note (ccrc only): CCASE_USERNAME and CCASE_PASSWORD must be > exported and added > +to BB_ENV_EXTRAWHITE, or bitbake will ignore them > + > + > +""" > + > +# This program is free software; you can redistribute it > and/or modify > +# it under the terms of the GNU General Public License version 2 as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public > License along > +# with this program; if not, write to the Free Software > Foundation, Inc., > +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > +# > + > +import os, sys, shutil > +import bb > +from bb import data > +from bb.fetch import Fetch > +from bb.fetch import FetchError > +from bb.fetch import MissingParameterError > +from bb.fetch import runfetchcmd > + > + > +class Clearcase(Fetch): > + def supports(self, url, ud, d): > + """ > + Check to see if a given url can be fetched with Clearcase. > + """ > + return ud.type in ['ccase', 'ccrc'] > + > + def debug(self, msg): > + bb.msg.debug(1, bb.msg.domain.Fetcher, msg) > + > + def note(self, msg): > + bb.msg.note(1, bb.msg.domain.Fetcher, msg) > + > + def warn(self, msg): > + bb.msg.warn(1, msg) > + > + def error(self, msg): > + bb.msg.error(1, bb.msg.domain.Fetcher, msg) > + > + > + def localpath(self, url, ud, d): > + > + if ud.type == 'ccrc': > + self.username = data.getVar("CCASE_USERNAME", d, True) > + self.password = data.getVar("CCASE_PASSWORD", d, True) > + self.ccrccli = data.getVar("CCRCCLI", d, True) > + > + if not self.username: > + raise MissingParameterError("CCASE_USERNAME > environment variable not defined") > + > + if not self.password: > + self.warn("CCASE_PASSWORD environment > variable not defined") > + > + if not self.ccrccli: > + self.ccrccli = "/opt/rational/ccrccli" > + self.warn("CCRCCLI environment variable not > defined, using default (%s)" % self.ccrccli) > + > + ud.proto = "http" > + if 'proto' in ud.parm: > + ud.proto = ud.parm['proto'] > + > + ud.vob = "" > + if 'vob' in ud.parm: > + ud.vob = ud.parm['vob'] > + > + ud.module = "" > + if 'module' in ud.parm: > + ud.module = ud.parm['module'] > + > + ud.label = "LATEST" > + if 'label' in ud.parm: > + ud.label = ud.parm['label'] > + > + ud.file = False > + if 'file' in ud.parm: > + ud.file = True > + > + ud.server = "%s://%s%s" % (ud.proto, ud.host, ud.path) > + ud.viewname = "bitbake_%s_%s" % (ud.type, str(os.getpid())) > + ud.csname = "config_spec_%s" % str(os.getpid()) > + > + ud.ccasedir = os.path.join(data.getVar("DL_DIR", > d, True), ud.type) > + ud.viewdir = os.path.join(ud.ccasedir, ud.viewname) > + ud.configspec = > os.path.join(data.expand('${WORKDIR}', d), ud.csname) > + > + if ud.file: > + ud.localfile = "ccase_" + ud.label + > "_" + os.path.basename(ud.module) > + else: > + ud.localfile = ud.vob + "_" + ud.label > + ".tar.gz" > + > + self.debug("username = %s" % self.username) > +# self.debug("password = %s" % self.password) > + self.debug("host = %s" % ud.host) > + self.debug("path = %s" % ud.path) > + self.debug("server = %s" % ud.server) > + self.debug("proto = %s" % ud.proto) > + self.debug("type = %s" % ud.type) > + self.debug("vob = %s" % ud.vob) > + self.debug("module = %s" % ud.module) > + self.debug("label = %s" % ud.label) > + self.debug("ccasedir = %s" % ud.ccasedir) > + self.debug("viewdir = %s" % ud.viewdir) > + self.debug("viewname = %s" % ud.viewname) > + self.debug("configspec = %s" % ud.configspec) > + self.debug("localfile = %s" % ud.localfile) > + > + return os.path.join(data.getVar("DL_DIR", d, True), > ud.localfile) > + > + > + def _build_ccase_command(self, ud, command): > + """ > + Build up a commandline based on ud > + command is: mkview, edcs, rmview > + """ > + > + if ud.type == 'ccrc': > + basecmd = "CCRCCLI=%s rcleartool %s" % > (self.ccrccli, command) > + elif ud.type == 'ccase': > + basecmd = "cleartool %s" % (command) > + else: > + raise FetchError("Invalid client type: %s" % ud.type) > + > + options = [] > + > + if ud.type == 'ccrc': > + options.append("-username '%s'" % self.username) > + options.append("-password '%s'" % self.password) > + options.append("-server '%s'" % ud.server) > + > + if command is 'mkview': > + if ud.type == 'ccrc': > + options.append("-tag %s" % ud.viewname) > + options.append(ud.viewdir) > + elif ud.type == 'ccase': > + options.append("-snapshot -tag %s > -colocated_server %s" % (ud.viewname, ud.viewdir)) > + > + elif command is 'rmview': > + options.append("-force") > + if ud.type == 'ccrc': > + options.append("-tag %s" % ud.viewname) > + elif ud.type == 'ccase': > + options.append("%s" % ud.viewdir) > + > + elif command is 'edcs': > + basecmd = "export EDITOR='cp %s '; echo 'yes' | > %s" % (ud.configspec, basecmd) > + > + else: > + raise FetchError("Invalid ccase (rcleartool) > command %s" % command) > + > + ccasecmd = "%s %s" % (basecmd, " ".join(options)) > + self.debug("ccasecmd = %s" % ccasecmd) > + return ccasecmd > + > + > + def _create_configspec(self, ud): > + """ > + Create config spec file (ud.configspec) for ccase view > + """ > + try: > + f = open(ud.configspec, 'w') > + f.write("element * CHECKEDOUT\n") > + f.write("element /%s /main/LATEST\n" % ud.vob) > + f.write("element * %s\n" % ud.label) > + f.write("load /%s\n" % os.path.join(ud.vob, ud.module)) > + f.close() > + except: > + self.error("error creating %s" % ud.configspec) > + pass > + > + def go(self, loc, ud, d): > + """Fetch files""" > + > + # create directory $DL_DIR/ccase > + bb.mkdirhier(ud.ccasedir) > + # create directory $WORKDIR [ TODO: is this mandatory here? ] > + bb.mkdirhier(data.expand('${WORKDIR}', d)) > + > + # Create config spec for clearcase view > + self._create_configspec(ud) > + > + # Make view > + cmd = self._build_ccase_command(ud, 'mkview'); > + self.note("clearcase: creating view [VOB=%s label=%s > view=%s]" % (ud.vob, ud.label, ud.viewname)) > + runfetchcmd(cmd, d, True) > + > + try: > + # edit config spec => fetch files > + os.chdir(ud.viewdir) > + cmd = self._build_ccase_command(ud, 'edcs'); > + self.note("clearcase: fetching data [VOB=%s > label=%s view=%s]" % (ud.vob, ud.label, ud.viewname)) > + runfetchcmd(cmd, d, True) > + > + if ud.file: > + cmd = "cp %s %s" % > (os.path.join(ud.vob, ud.module), ud.localpath) > + else: > + # create tarfile > + cmd = "tar -zcf %s %s" % > (ud.localpath, ud.vob) > + > + self.debug("clearcase: creating > download file: %s" % cmd) > + > + runfetchcmd(cmd, d, True) > + os.chdir(ud.ccasedir) > + > + finally: > + try: > + # Remove view > + cmd = self._build_ccase_command(ud, 'rmview'); > + self.note("clearcase: cleaning up [VOB=%s > label=%s view=%s]" % (ud.vob, ud.label, ud.viewname)) > + runfetchcmd(cmd, d, True) > + > + finally: > + # Cleanup > + cmd = "rm -rf %s" % ud.viewdir > + runfetchcmd(cmd, d, True) > + > + return True > -- > 1.7.2.3 > _______________________________________________ > Bitbake-dev mailing list > [email protected] > https://lists.berlios.de/mailman/listinfo/bitbake-dev > _______________________________________________ Bitbake-dev mailing list [email protected] https://lists.berlios.de/mailman/listinfo/bitbake-dev
