diff options
Diffstat (limited to 'lib/python2.7/site-packages/buildbot_slave-0.8.8-py2.7.egg/buildslave/commands/git.py')
-rw-r--r-- | lib/python2.7/site-packages/buildbot_slave-0.8.8-py2.7.egg/buildslave/commands/git.py | 218 |
1 files changed, 0 insertions, 218 deletions
diff --git a/lib/python2.7/site-packages/buildbot_slave-0.8.8-py2.7.egg/buildslave/commands/git.py b/lib/python2.7/site-packages/buildbot_slave-0.8.8-py2.7.egg/buildslave/commands/git.py deleted file mode 100644 index abef42ba..00000000 --- a/lib/python2.7/site-packages/buildbot_slave-0.8.8-py2.7.egg/buildslave/commands/git.py +++ /dev/null @@ -1,218 +0,0 @@ -# This file is part of Buildbot. Buildbot is free software: you can -# redistribute it and/or modify it under the terms of the GNU General Public -# License as published by the Free Software Foundation, version 2. -# -# 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. -# -# Copyright Buildbot Team Members - -import os - -from twisted.internet import defer - -from buildslave.commands.base import SourceBaseCommand -from buildslave import runprocess -from buildslave.commands.base import AbandonChain - - -class Git(SourceBaseCommand): - """Git specific VC operation. In addition to the arguments - handled by SourceBaseCommand, this command reads the following keys: - - ['repourl'] (required): the upstream GIT repository string - ['branch'] (optional): which version (i.e. branch or tag) - to retrieve. Default: "master". - ['submodules'] (optional): whether to initialize and update - submodules. Default: False. - ['ignore_ignores'] (optional): ignore ignores when purging changes - (default true) - ['reference'] (optional): use this reference repository - to fetch objects. - ['gerrit_branch'] (optional): which virtual branch to retrieve. - ['progress'] (optional): have git output progress markers, - avoiding timeouts for long fetches; - requires Git 1.7.2 or later. - ['shallow'] (optional): if true, use shallow clones that do not - also fetch history - """ - - header = "git operation" - - def setup(self, args): - SourceBaseCommand.setup(self, args) - self.repourl = args['repourl'] - self.branch = args.get('branch') - if not self.branch: - self.branch = "master" - self.sourcedata = "%s %s\n" % (self.repourl, self.branch) - self.submodules = args.get('submodules') - self.ignore_ignores = args.get('ignore_ignores', True) - self.reference = args.get('reference', None) - self.gerrit_branch = args.get('gerrit_branch', None) - - def _fullSrcdir(self): - return os.path.join(self.builder.basedir, self.srcdir) - - def sourcedirIsUpdateable(self): - return os.path.isdir(os.path.join(self._fullSrcdir(), ".git")) - - def _dovccmd(self, command, cb=None, stopOnFail=True, **kwargs): - git = self.getCommand("git") - c = runprocess.RunProcess(self.builder, [git] + command, self._fullSrcdir(), - sendRC=False, timeout=self.timeout, - maxTime=self.maxTime, logEnviron=self.logEnviron, - usePTY=False, **kwargs) - self.command = c - d = c.start() - if cb: - if stopOnFail: - d.addCallback(self._abandonOnFailure) - d.addCallback(cb) - return d - - def sourcedataMatches(self): - # If the repourl matches the sourcedata file, then we can say that the - # sourcedata matches. We can ignore branch changes, since Git can work - # with many branches fetched, and we deal with it properly in - # doVCUpdate. So, basically, as long as the file exists, consider it - # to match - try: - self.readSourcedata() - except IOError: - return False - return True - - def _cleanSubmodules(self, res): - command = ['submodule', 'foreach', 'git', 'clean', '-f', '-d'] - if self.ignore_ignores: - command.append('-x') - return self._dovccmd(command) - - def _updateSubmodules(self, res): - return self._dovccmd(['submodule', 'update'], self._cleanSubmodules) - - def _initSubmodules(self, res): - if self.submodules: - return self._dovccmd(['submodule', 'init'], self._updateSubmodules) - else: - return defer.succeed(0) - - def _didHeadCheckout(self, res): - # Rename branch, so that the repo will have the expected branch name - # For further information about this, see the commit message - command = ['branch', '-M', self.branch] - return self._dovccmd(command, self._initSubmodules, False) - - def _didFetch(self, res): - if self.revision: - head = self.revision - else: - head = 'FETCH_HEAD' - - # That is not sufficient. git will leave unversioned files and empty - # directories. Clean them up manually in _didReset. - command = ['reset', '--hard', head] - return self._dovccmd(command, self._didHeadCheckout) - - def maybeNotDoVCFallback(self, res): - # If we were unable to find the branch/SHA on the remote, - # clobbering the repo won't help any, so just abort the chain - if hasattr(self.command, 'stderr'): - if "Couldn't find remote ref" in self.command.stderr: - raise AbandonChain(-1) - - # Update first runs "git clean", removing local changes, - # if the branch to be checked out has changed. This, combined - # with the later "git reset" equates clobbering the repo, - # but it's much more efficient. - def doVCUpdate(self): - try: - # Check to see if our branch has changed - diffbranch = self.sourcedata != self.readSourcedata() - except IOError: - diffbranch = False - if diffbranch or self.sourcedirIsPatched(): - command = ['clean', '-f', '-d'] - if self.ignore_ignores: - command.append('-x') - return self._dovccmd(command, self._didClean) - return self._didClean(None) - - def _doFetch(self, dummy, branch): - # The plus will make sure the repo is moved to the branch's - # head even if it is not a simple "fast-forward" - command = ['fetch', '-t', self.repourl, '+%s' % branch] - # If the 'progress' option is set, tell git fetch to output - # progress information to the log. This can solve issues with - # long fetches killed due to lack of output, but only works - # with Git 1.7.2 or later. - if self.args.get('progress'): - command.append('--progress') - self.sendStatus({"header": "fetching branch %s from %s\n" - % (branch, self.repourl)}) - return self._dovccmd(command, self._didFetch, keepStderr=True) - - def _didClean(self, dummy): - branch = self.gerrit_branch or self.branch - - # After a clean, try to use the given revision if we have one. - if self.revision: - # We know what revision we want. See if we have it. - d = self._dovccmd(['reset', '--hard', self.revision], - self._initSubmodules) - # If we are unable to reset to the specified version, we - # must do a fetch first and retry. - d.addErrback(self._doFetch, branch) - return d - else: - # No known revision, go grab the latest. - return self._doFetch(None, branch) - - def _didInit(self, res): - # If we have a reference repository specified, we need to also set that - # up after the 'git init'. - if self.reference: - git_alts_path = os.path.join(self._fullSrcdir(), '.git', 'objects', 'info', 'alternates') - git_alts_content = os.path.join(self.reference, 'objects') - self.setFileContents(git_alts_path, git_alts_content) - return self.doVCUpdate() - - def doVCFull(self): - git = self.getCommand("git") - - # If they didn't ask for a specific revision, we can get away with a - # shallow clone. - if not self.args.get('revision') and self.args.get('shallow'): - cmd = [git, 'clone', '--depth', '1'] - # If we have a reference repository, pass it to the clone command - if self.reference: - cmd.extend(['--reference', self.reference]) - cmd.extend([self.repourl, self._fullSrcdir()]) - c = runprocess.RunProcess(self.builder, cmd, self.builder.basedir, - sendRC=False, timeout=self.timeout, - maxTime=self.maxTime, logEnviron=self.logEnviron, - usePTY=False) - self.command = c - cmdexec = c.start() - cmdexec.addCallback(self._didInit) - return cmdexec - else: - os.makedirs(self._fullSrcdir()) - return self._dovccmd(['init'], self._didInit) - - def parseGotRevision(self): - command = ['rev-parse', 'HEAD'] - def _parse(res): - hash = self.command.stdout.strip() - if len(hash) != 40: - return None - return hash - return self._dovccmd(command, _parse, keepStdout=True) - |