summaryrefslogtreecommitdiff
path: root/lorry
diff options
context:
space:
mode:
authorLars Wirzenius <lars.wirzenius@codethink.co.uk>2011-10-27 15:44:04 +0100
committerLars Wirzenius <lars.wirzenius@codethink.co.uk>2011-10-27 15:44:04 +0100
commitca3399feecb7a8985d24f66c3b9e74ad10afc022 (patch)
tree85a01dd226f89f4309754724d9c629707321541f /lorry
parent1229fab620a2bb558a370e76891324efde3f7e69 (diff)
downloadlorry-ca3399feecb7a8985d24f66c3b9e74ad10afc022.tar.gz
Rename to use new project name
Diffstat (limited to 'lorry')
-rwxr-xr-xlorry146
1 files changed, 146 insertions, 0 deletions
diff --git a/lorry b/lorry
new file mode 100755
index 0000000..4dc35e0
--- /dev/null
+++ b/lorry
@@ -0,0 +1,146 @@
+#!/usr/bin/python
+# Copyright (C) 2011 Codethink Limited
+#
+# This program 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 of the License.
+#
+# 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 cliapp
+import json
+import logging
+import os
+
+
+__version__ = '0.0'
+
+
+class Detritus(cliapp.Application):
+
+ def add_settings(self):
+ self.settings.string(['working-area', 'w'],
+ 'use DIR as the working area (for holding '
+ 'intermediate git repositories, etc)',
+ metavar='DIR')
+ self.settings.string(['gitorious-base-url'],
+ 'prefix project names with URL when constructing '
+ 'the git URL on Gitorious (default: %default)',
+ metavar='URL',
+ default='git@gitorious.org:baserock-morphs')
+ self.settings.boolean(['pull-only'],
+ 'only pull from upstreams, do not push to '
+ 'gitorious')
+ self.settings.boolean(['verbose', 'v'],
+ 'report what is going on to stdout')
+
+ def process_args(self, args):
+ for arg in args:
+ self.progress('Processing spec file %s' % arg)
+ with open(arg) as f:
+ specs = json.load(f)
+ for name in sorted(specs.keys()):
+ self.gitify(name, specs[name])
+ self.progress('Done')
+
+ def gitify(self, name, spec):
+ self.progress('Getting %s from %s' % (name, spec['url']))
+ table = {
+ 'bzr': self.gitify_bzr,
+ 'cvs': self.gitify_cvs,
+ 'git': self.mirror_git,
+ 'svn': self.gitify_svn,
+ }
+ vcstype = spec['type']
+ if vcstype not in table:
+ raise cliapp.AppException('Unknown VCS type %s' % vcstype)
+ dirname = self.dirname(name)
+ if not os.path.exists(dirname):
+ os.mkdir(dirname)
+ gitdir = os.path.join(dirname, 'git')
+ table[vcstype](dirname, gitdir, spec)
+ if not self.settings['pull-only']:
+ self.push_to_gitorious(name, gitdir)
+
+ def mirror_git(self, dirname, gitdir, spec):
+ if not os.path.exists(gitdir):
+ self.progress('.. doing initial clone')
+ self.run_program(['git', 'clone', spec['url'], gitdir])
+ else:
+ self.progress('.. updating existing clone')
+ self.run_program(['git', 'pull'], cwd=gitdir)
+
+ def gitify_bzr(self, dirname, gitdir, spec):
+ self.progress('.. fast-exporting from bzr')
+ export = os.path.join(dirname, 'fast-export')
+ self.run_program(['bzr', 'fast-export', '--quiet',
+ spec['url'], export])
+ if not os.path.exists(gitdir):
+ self.progress('.. creating git repo')
+ os.mkdir(gitdir)
+ self.run_program(['git', 'init', '.'], cwd=gitdir)
+ self.progress('.. reading fast-export data')
+ with open(export) as f:
+ data = f.read()
+ self.progress('.. fast-importing into git')
+ self.run_program(['git', 'fast-import'], stdin=data, cwd=gitdir)
+
+ def gitify_svn(self, dirname, gitdir, spec):
+ if not os.path.exists(gitdir):
+ self.progress('.. doing initial clone')
+ os.mkdir(gitdir)
+ self.run_program(['git', 'svn', 'clone', spec['url'], gitdir])
+ else:
+ self.progress('.. updating existing clone')
+ self.run_program(['git', 'svn', 'rebase'], cwd=gitdir)
+
+ def gitify_cvs(self, dirname, gitdir, spec):
+ self.run_program(['git', 'cvsimport', '-d', spec['url'],
+ '-C', gitdir, spec['module']])
+
+ def push_to_gitorious(self, project_name, gitdir):
+ out = self.run_program(['git', 'remote', 'show'], cwd=gitdir)
+ if 'gitorious' not in out.splitlines():
+ self.progress('.. adding gitorious as a remote')
+ url = ('%s/%s.git' %
+ (self.settings['gitorious-base-url'], project_name))
+ self.run_program(['git', 'remote', 'add', 'gitorious', url],
+ cwd=gitdir)
+
+ self.progress('.. pushing to gitorious')
+ self.run_program(['git', 'push', 'gitorious', 'master'], cwd=gitdir)
+
+ def run_program(self, argv, **kwargs):
+ exit, out, err = self.runcmd_unchecked(argv, **kwargs)
+ logging.debug('Command: %s\nExit: %s\nStdout:\n%sStderr:\n%s' %
+ (argv, exit, self.indent(out), self.indent(err)))
+ if exit != 0:
+ raise Exception('%s failed (exit code %s):\n%s' %
+ (' '.join(argv), exit, self.indent(err)))
+ return out
+
+ def indent(self, string):
+ return ''.join(' %s\n' % line for line in string.splitlines())
+
+ def dirname(self, project_name):
+ assert '/' not in project_name
+ assert '\0' not in project_name
+ return os.path.join(self.settings['working-area'], project_name)
+
+ def progress(self, msg):
+ logging.debug(msg)
+ if self.settings['verbose']:
+ self.output.write('%s\n' % msg)
+
+
+if __name__ == '__main__':
+ Detritus(version=__version__).run()
+