Source code for src.system

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#  Copyright (C) 2010-2013  CEA/DEN
#
#  This library is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2.1 of the License.
#
#  This library 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
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA

'''
In this file : all functions that do a system call, 
like open a browser or an editor, or call a git command
'''

import subprocess
import os
import tarfile

from . import printcolors

[docs]def show_in_editor(editor, filePath, logger): '''open filePath using editor. :param editor str: The editor to use. :param filePath str: The path to the file to open. ''' # default editor is vi if editor is None or len(editor) == 0: editor = 'vi' if '%s' not in editor: editor += ' %s' try: # launch cmd using subprocess.Popen cmd = editor % filePath logger.write('Launched command:\n' + cmd + '\n', 5) p = subprocess.Popen(cmd, shell=True) p.communicate() except: logger.write(printcolors.printcError(_("Unable to edit file %s\n") % filePath), 1)
[docs]def git_extract(from_what, tag, where, logger, environment=None): '''Extracts sources from a git repository. :param from_what str: The remote git repository. :param tag str: The tag. :param where str: The path where to extract. :param logger Logger: The logger instance to use. :param environment src.environment.Environ: The environment to source when extracting. :return: True if the extraction is successful :rtype: boolean ''' if not where.exists(): where.make() if tag == "master" or tag == "HEAD": command = "git clone %(remote)s %(where)s" % \ { 'remote': from_what, 'tag': tag, 'where': str(where) } else: # NOTICE: this command only works with recent version of git # because --work-tree does not work with an absolute path where_git = os.path.join( str(where), ".git" ) command = "rmdir %(where)s && git clone %(remote)s %(where)s && " + \ "git --git-dir=%(where_git)s --work-tree=%(where)s checkout %(tag)s" command = command % {'remote': from_what, 'tag': tag, 'where': str(where), 'where_git': where_git } logger.write(command + "\n", 5) logger.logTxtFile.write("\n" + command + "\n") logger.logTxtFile.flush() res = subprocess.call(command, cwd=str(where.dir()), env=environment.environ.environ, shell=True, stdout=logger.logTxtFile, stderr=subprocess.STDOUT) return (res == 0)
[docs]def archive_extract(from_what, where, logger): '''Extracts sources from an archive. :param from_what str: The path to the archive. :param where str: The path where to extract. :param logger Logger: The logger instance to use. :return: True if the extraction is successful :rtype: boolean ''' try: archive = tarfile.open(from_what) for i in archive.getmembers(): archive.extract(i, path=str(where)) return True, os.path.commonprefix(archive.getnames()) except Exception as exc: logger.write("archive_extract: %s\n" % exc) return False, None
[docs]def cvs_extract(protocol, user, server, base, tag, product, where, logger, checkout=False, environment=None): '''Extracts sources from a cvs repository. :param protocol str: The cvs protocol. :param user str: The user to be used. :param server str: The remote cvs server. :param base str: . :param tag str: The tag. :param product str: The product. :param where str: The path where to extract. :param logger Logger: The logger instance to use. :param checkout boolean: If true use checkout cvs. :param environment src.environment.Environ: The environment to source when extracting. :return: True if the extraction is successful :rtype: boolean ''' opttag = '' if tag is not None and len(tag) > 0: opttag = '-r ' + tag cmd = 'export' if checkout: cmd = 'checkout' elif len(opttag) == 0: opttag = '-DNOW' if len(protocol) > 0: root = "%s@%s:%s" % (user, server, base) command = "cvs -d :%(protocol)s:%(root)s %(command)s -d %(where)s %(tag)s %(product)s" % \ { 'protocol': protocol, 'root': root, 'where': str(where.base()), 'tag': opttag, 'product': product, 'command': cmd } else: command = "cvs -d %(root)s %(command)s -d %(where)s %(tag)s %(base)s/%(product)s" % \ { 'root': server, 'base': base, 'where': str(where.base()), 'tag': opttag, 'product': product, 'command': cmd } logger.write(command + "\n", 5) if not where.dir().exists(): where.dir().make() logger.logTxtFile.write("\n" + command + "\n") logger.logTxtFile.flush() res = subprocess.call(command, cwd=str(where.dir()), env=environment.environ.environ, shell=True, stdout=logger.logTxtFile, stderr=subprocess.STDOUT) return (res == 0)
[docs]def svn_extract(user, from_what, tag, where, logger, checkout=False, environment=None): '''Extracts sources from a svn repository. :param user str: The user to be used. :param from_what str: The remote git repository. :param tag str: The tag. :param where str: The path where to extract. :param logger Logger: The logger instance to use. :param checkout boolean: If true use checkout svn. :param environment src.environment.Environ: The environment to source when extracting. :return: True if the extraction is successful :rtype: boolean ''' if not where.exists(): where.make() if checkout: command = "svn checkout --username %(user)s %(remote)s %(where)s" % \ { 'remote': from_what, 'user' : user, 'where': str(where) } else: command = "" if os.path.exists(str(where)): command = "/bin/rm -rf %(where)s && " % \ { 'remote': from_what, 'where': str(where) } if tag == "master": command += "svn export --username %(user)s %(remote)s %(where)s" % \ { 'remote': from_what, 'user' : user, 'where': str(where) } else: command += "svn export -r %(tag)s --username %(user)s %(remote)s %(where)s" % \ { 'tag' : tag, 'remote': from_what, 'user' : user, 'where': str(where) } logger.logTxtFile.write(command + "\n") logger.write(command + "\n", 5) logger.logTxtFile.write("\n" + command + "\n") logger.logTxtFile.flush() res = subprocess.call(command, cwd=str(where.dir()), env=environment.environ.environ, shell=True, stdout=logger.logTxtFile, stderr=subprocess.STDOUT) return (res == 0)