mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #3475 from tianon/travis
Add Travis CI configuration to validate DCO and gofmt
This commit is contained in:
commit
859856b3e4
5 changed files with 113 additions and 0 deletions
22
.travis.yml
Normal file
22
.travis.yml
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Note: right now we don't use go-specific features of travis.
|
||||
# Later we might automate "go test" etc. (or do it inside a docker container...?)
|
||||
|
||||
language: go
|
||||
|
||||
go: 1.2
|
||||
|
||||
# Disable the normal go build.
|
||||
install: true
|
||||
|
||||
before_script:
|
||||
- env | sort
|
||||
- sudo apt-get update -qq
|
||||
- sudo apt-get install -qq python-yaml
|
||||
- git remote add upstream git://github.com/dotcloud/docker.git
|
||||
- git fetch upstream +refs/heads/master:refs/remotes/upstream/master
|
||||
|
||||
script:
|
||||
- hack/travis/dco.py
|
||||
- hack/travis/gofmt.py
|
||||
|
||||
# vim:set sw=2 ts=2:
|
|
@ -2,6 +2,7 @@ Solomon Hykes <solomon@dotcloud.com> (@shykes)
|
|||
Guillaume Charmes <guillaume@dotcloud.com> (@creack)
|
||||
Victor Vieux <victor@dotcloud.com> (@vieux)
|
||||
Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
|
||||
.travis.yml: Tianon Gravi <admwiggin@gmail.com> (@tianon)
|
||||
api.go: Victor Vieux <victor@dotcloud.com> (@vieux)
|
||||
Dockerfile: Tianon Gravi <admwiggin@gmail.com> (@tianon)
|
||||
Makefile: Tianon Gravi <admwiggin@gmail.com> (@tianon)
|
||||
|
|
41
hack/travis/dco.py
Executable file
41
hack/travis/dco.py
Executable file
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/env python
|
||||
import re
|
||||
import subprocess
|
||||
import yaml
|
||||
|
||||
from env import commit_range
|
||||
|
||||
commit_format = '-%n hash: %h%n author: %aN <%aE>%n message: |%n%w(0,2,2)%B'
|
||||
|
||||
gitlog = subprocess.check_output([
|
||||
'git', 'log', '--reverse',
|
||||
'--format=format:'+commit_format,
|
||||
'..'.join(commit_range), '--',
|
||||
])
|
||||
|
||||
commits = yaml.load(gitlog)
|
||||
if not commits:
|
||||
exit(0) # what? how can we have no commits?
|
||||
|
||||
DCO = 'Docker-DCO-1.0-Signed-off-by:'
|
||||
|
||||
p = re.compile(r'^{0} ([^<]+) <([^<>@]+@[^<>]+)> \(github: (\S+)\)$'.format(re.escape(DCO)), re.MULTILINE|re.UNICODE)
|
||||
|
||||
failed_commits = 0
|
||||
|
||||
for commit in commits:
|
||||
m = p.search(commit['message'])
|
||||
if not m:
|
||||
print 'Commit {1} does not have a properly formatted "{0}" marker.'.format(DCO, commit['hash'])
|
||||
failed_commits += 1
|
||||
continue # print ALL the commits that don't have a proper DCO
|
||||
|
||||
(name, email, github) = m.groups()
|
||||
|
||||
# TODO verify that "github" is the person who actually made this commit via the GitHub API
|
||||
|
||||
if failed_commits > 0:
|
||||
exit(failed_commits)
|
||||
|
||||
print 'All commits have a valid "{0}" marker.'.format(DCO)
|
||||
exit(0)
|
21
hack/travis/env.py
Normal file
21
hack/travis/env.py
Normal file
|
@ -0,0 +1,21 @@
|
|||
import os
|
||||
import subprocess
|
||||
|
||||
if 'TRAVIS' not in os.environ:
|
||||
print 'TRAVIS is not defined; this should run in TRAVIS. Sorry.'
|
||||
exit(127)
|
||||
|
||||
if os.environ['TRAVIS_PULL_REQUEST'] != 'false':
|
||||
commit_range = [os.environ['TRAVIS_BRANCH'], 'FETCH_HEAD']
|
||||
else:
|
||||
try:
|
||||
subprocess.check_call([
|
||||
'git', 'log', '-1', '--format=format:',
|
||||
os.environ['TRAVIS_COMMIT_RANGE'], '--',
|
||||
])
|
||||
commit_range = os.environ['TRAVIS_COMMIT_RANGE'].split('...')
|
||||
if len(commit_range) == 1: # if it didn't split, it must have been separated by '..' instead
|
||||
commit_range = commit_range[0].split('..')
|
||||
except subprocess.CalledProcessError:
|
||||
print 'TRAVIS_COMMIT_RANGE is invalid. This seems to be a force push. We will just assume it must be against upstream master and compare all commits in between.'
|
||||
commit_range = ['upstream/master', 'HEAD']
|
28
hack/travis/gofmt.py
Executable file
28
hack/travis/gofmt.py
Executable file
|
@ -0,0 +1,28 @@
|
|||
#!/usr/bin/env python
|
||||
import subprocess
|
||||
|
||||
from env import commit_range
|
||||
|
||||
files = subprocess.check_output([
|
||||
'git', 'diff', '--diff-filter=ACMR',
|
||||
'--name-only', '...'.join(commit_range), '--',
|
||||
])
|
||||
|
||||
exit_status = 0
|
||||
|
||||
for filename in files.split('\n'):
|
||||
if filename.endswith('.go'):
|
||||
try:
|
||||
out = subprocess.check_output(['gofmt', '-s', '-l', filename])
|
||||
if out != '':
|
||||
print out,
|
||||
exit_status = 1
|
||||
except subprocess.CalledProcessError:
|
||||
exit_status = 1
|
||||
|
||||
if exit_status != 0:
|
||||
print 'Reformat the files listed above with "gofmt -s -w" and try again.'
|
||||
exit(exit_status)
|
||||
|
||||
print 'All files pass gofmt.'
|
||||
exit(0)
|
Loading…
Add table
Reference in a new issue