From da9eaa53f95f58e59165ee277ee017349588d2ba Mon Sep 17 00:00:00 2001 From: Joshua Deare Date: Tue, 25 Jun 2013 16:39:01 -0700 Subject: [PATCH 01/91] added nil datastore tags to XMLName now if a struct is put in datastore it won't be bloated with needless XMLName field --- omaha/omaha.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/omaha/omaha.go b/omaha/omaha.go index 098bde3..86710d6 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -12,7 +12,7 @@ import ( ) type Request struct { - XMLName xml.Name `xml:"request"` + XMLName xml.Name `xml:"request" datastore:"-"` Os Os `xml:"os"` Apps []*App `xml:"app"` Protocol string `xml:"protocol,attr"` @@ -43,7 +43,7 @@ func (r *Request) AddApp(id string, version string) *App { /* Response */ type Response struct { - XMLName xml.Name `xml:"response"` + XMLName xml.Name `xml:"response" datastore:"-"` DayStart DayStart `xml:"daystart"` Apps []*App `xml:"app"` Protocol string `xml:"protocol,attr"` @@ -67,7 +67,7 @@ func (r *Response) AddApp(id string) *App { } type App struct { - XMLName xml.Name `xml:"app"` + XMLName xml.Name `xml:"app" datastore"-"` Ping *Ping `xml:"ping"` UpdateCheck *UpdateCheck `xml:"updatecheck"` Events []*Event `xml:"event"` @@ -103,7 +103,7 @@ func (a *App) AddEvent() *Event { } type UpdateCheck struct { - XMLName xml.Name `xml:"updatecheck"` + XMLName xml.Name `xml:"updatecheck" datastore:"-"` Urls *Urls `xml:"urls"` Manifest *Manifest `xml:"manifest"` TargetVersionPrefix string `xml:"targetversionprefix,attr,omitempty"` @@ -126,13 +126,13 @@ func (u *UpdateCheck) AddManifest(version string) *Manifest { } type Ping struct { - XMLName xml.Name `xml:"ping"` + XMLName xml.Name `xml:"ping" datastore:"-"` LastReportDays string `xml:"r,attr,omitempty"` Status string `xml:"status,attr,omitempty"` } type Os struct { - XMLName xml.Name `xml:"os"` + XMLName xml.Name `xml:"os" datastore:"-"` Platform string `xml:"platform,attr,omitempty"` Version string `xml:"version,attr,omitempty"` Sp string `xml:"sp,attr,omitempty"` @@ -145,36 +145,36 @@ func NewOs(platform string, version string, sp string, arch string) *Os { } type Event struct { - XMLName xml.Name `xml:"event"` + XMLName xml.Name `xml:"event" datastore:"-"` Type string `xml:"eventtype,attr,omitempty"` Result string `xml:"eventresult,attr,omitempty"` PreviousVersion string `xml:"previousversion,attr,omitempty"` } type Urls struct { - XMLName xml.Name `xml:"urls"` + XMLName xml.Name `xml:"urls" datastore:"-"` Urls []Url `xml:"url"` } type Url struct { - XMLName xml.Name `xml:"url"` + XMLName xml.Name `xml:"url" datastore:"-"` CodeBase string `xml:"codebase,attr"` } type Manifest struct { - XMLName xml.Name `xml:"manifest"` + XMLName xml.Name `xml:"manifest" datastore:"-"` Packages Packages `xml:"packages"` Actions Actions `xml:"actions"` Version string `xml:"version,attr"` } type Packages struct { - XMLName xml.Name `xml:"packages"` + XMLName xml.Name `xml:"packages" datastore:"-"` Packages []Package `xml:"package"` } type Package struct { - XMLName xml.Name `xml:"package"` + XMLName xml.Name `xml:"package" datastore:"-"` Hash string `xml:"hash,attr"` Name string `xml:"name,attr"` Size string `xml:"size,attr"` @@ -188,12 +188,12 @@ func (m *Manifest) AddPackage(hash string, name string, size string, required bo } type Actions struct { - XMLName xml.Name `xml:"actions"` + XMLName xml.Name `xml:"actions" datastore:"-"` Actions []*Action `xml:"action"` } type Action struct { - XMLName xml.Name `xml:"action"` + XMLName xml.Name `xml:"action" datastore:"-"` Event string `xml:"event,attr"` ChromeOSVersion string `xml:"ChromeOSVersion,attr"` Sha256 string `xml:"sha256,attr"` From d68e528e596f81d362bd950c74ed48652033110a Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Wed, 26 Jun 2013 10:23:06 -0700 Subject: [PATCH 02/91] feat(omaha): add disablebackoff field to action another extension added by the the chromeos update engine --- omaha/omaha.go | 1 + omaha/omaha_test.go | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/omaha/omaha.go b/omaha/omaha.go index 86710d6..54183be 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -199,6 +199,7 @@ type Action struct { Sha256 string `xml:"sha256,attr"` NeedsAdmin bool `xml:"needsadmin,attr"` IsDelta bool `xml:"IsDelta,attr"` + DisablePayloadBackoff bool `xml:"DisablePayloadBackoff,attr,omitempty"` } func (m *Manifest) AddAction(event string) *Action { diff --git a/omaha/omaha_test.go b/omaha/omaha_test.go index ca43c41..594d69c 100644 --- a/omaha/omaha_test.go +++ b/omaha/omaha_test.go @@ -61,6 +61,7 @@ func ExampleOmaha_NewResponse() { a.Sha256 = "0VAlQW3RE99SGtSB5R4m08antAHO8XDoBMKDyxQT/Mg=" a.NeedsAdmin = false a.IsDelta = true + a.DisablePayloadBackoff = true if raw, err := xml.MarshalIndent(response, "", " "); err != nil { fmt.Println(err) @@ -84,7 +85,7 @@ func ExampleOmaha_NewResponse() { // // // - // + // // // // From 60265ef0fcfcc26169b4cddb1ec05e21b7a01b47 Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Wed, 26 Jun 2013 10:24:43 -0700 Subject: [PATCH 03/91] fix(omaha): create section for update_engine extensions add this comment section just so it is a littlemore clear what is going on. --- omaha/omaha.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/omaha/omaha.go b/omaha/omaha.go index 54183be..36c1e1e 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -195,6 +195,8 @@ type Actions struct { type Action struct { XMLName xml.Name `xml:"action" datastore:"-"` Event string `xml:"event,attr"` + + // Extensions added by update_engine ChromeOSVersion string `xml:"ChromeOSVersion,attr"` Sha256 string `xml:"sha256,attr"` NeedsAdmin bool `xml:"needsadmin,attr"` From 94018ed30588d53aaa4ea3c993b52e98524e9622 Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Wed, 26 Jun 2013 15:53:31 -0700 Subject: [PATCH 04/91] feat(omaha): add more update_engine extensions --- omaha/omaha.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/omaha/omaha.go b/omaha/omaha.go index 36c1e1e..24cb4e6 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -193,15 +193,18 @@ type Actions struct { } type Action struct { - XMLName xml.Name `xml:"action" datastore:"-"` - Event string `xml:"event,attr"` + XMLName xml.Name `xml:"action" datastore:"-"` + Event string `xml:"event,attr"` // Extensions added by update_engine - ChromeOSVersion string `xml:"ChromeOSVersion,attr"` - Sha256 string `xml:"sha256,attr"` - NeedsAdmin bool `xml:"needsadmin,attr"` - IsDelta bool `xml:"IsDelta,attr"` - DisablePayloadBackoff bool `xml:"DisablePayloadBackoff,attr,omitempty"` + ChromeOSVersion string `xml:"ChromeOSVersion,attr"` + Sha256 string `xml:"sha256,attr"` + NeedsAdmin bool `xml:"needsadmin,attr"` + IsDelta bool `xml:"IsDelta,attr"` + DisablePayloadBackoff bool `xml:"DisablePayloadBackoff,attr,omitempty"` + MetadataSignatureRsa string `xml:"MetadataSignatureRsa,attr,omitempty"` + MetadataSize string `xml:"MetadataSize,attr,omitempty"` + Deadline string `xml:"deadline,attr,omitempty"` } func (m *Manifest) AddAction(event string) *Action { From 2315500129c2e1c5b105aa58bf13ddd0172200b8 Mon Sep 17 00:00:00 2001 From: Joshua Deare Date: Fri, 28 Jun 2013 22:48:55 -0700 Subject: [PATCH 05/91] terminated XMLName from appearing in json when we need json encoding(putting AppRequestLogs into bigquery) we don't want the XMLName tag adding on needless data --- omaha/omaha.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/omaha/omaha.go b/omaha/omaha.go index 24cb4e6..9a3d427 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -43,7 +43,7 @@ func (r *Request) AddApp(id string, version string) *App { /* Response */ type Response struct { - XMLName xml.Name `xml:"response" datastore:"-"` + XMLName xml.Name `xml:"response" datastore:"-" json:"-"` DayStart DayStart `xml:"daystart"` Apps []*App `xml:"app"` Protocol string `xml:"protocol,attr"` @@ -67,7 +67,7 @@ func (r *Response) AddApp(id string) *App { } type App struct { - XMLName xml.Name `xml:"app" datastore"-"` + XMLName xml.Name `xml:"app" datastore"-" json:"-"` Ping *Ping `xml:"ping"` UpdateCheck *UpdateCheck `xml:"updatecheck"` Events []*Event `xml:"event"` @@ -103,7 +103,7 @@ func (a *App) AddEvent() *Event { } type UpdateCheck struct { - XMLName xml.Name `xml:"updatecheck" datastore:"-"` + XMLName xml.Name `xml:"updatecheck" datastore:"-" json:"-"` Urls *Urls `xml:"urls"` Manifest *Manifest `xml:"manifest"` TargetVersionPrefix string `xml:"targetversionprefix,attr,omitempty"` @@ -126,13 +126,13 @@ func (u *UpdateCheck) AddManifest(version string) *Manifest { } type Ping struct { - XMLName xml.Name `xml:"ping" datastore:"-"` + XMLName xml.Name `xml:"ping" datastore:"-" json:"-"` LastReportDays string `xml:"r,attr,omitempty"` Status string `xml:"status,attr,omitempty"` } type Os struct { - XMLName xml.Name `xml:"os" datastore:"-"` + XMLName xml.Name `xml:"os" datastore:"-" json:"-"` Platform string `xml:"platform,attr,omitempty"` Version string `xml:"version,attr,omitempty"` Sp string `xml:"sp,attr,omitempty"` @@ -145,36 +145,36 @@ func NewOs(platform string, version string, sp string, arch string) *Os { } type Event struct { - XMLName xml.Name `xml:"event" datastore:"-"` + XMLName xml.Name `xml:"event" datastore:"-" json:"-"` Type string `xml:"eventtype,attr,omitempty"` Result string `xml:"eventresult,attr,omitempty"` PreviousVersion string `xml:"previousversion,attr,omitempty"` } type Urls struct { - XMLName xml.Name `xml:"urls" datastore:"-"` + XMLName xml.Name `xml:"urls" datastore:"-" json:"-"` Urls []Url `xml:"url"` } type Url struct { - XMLName xml.Name `xml:"url" datastore:"-"` + XMLName xml.Name `xml:"url" datastore:"-" json:"-"` CodeBase string `xml:"codebase,attr"` } type Manifest struct { - XMLName xml.Name `xml:"manifest" datastore:"-"` + XMLName xml.Name `xml:"manifest" datastore:"-" json:"-"` Packages Packages `xml:"packages"` Actions Actions `xml:"actions"` Version string `xml:"version,attr"` } type Packages struct { - XMLName xml.Name `xml:"packages" datastore:"-"` + XMLName xml.Name `xml:"packages" datastore:"-" json:"-"` Packages []Package `xml:"package"` } type Package struct { - XMLName xml.Name `xml:"package" datastore:"-"` + XMLName xml.Name `xml:"package" datastore:"-" json:"-"` Hash string `xml:"hash,attr"` Name string `xml:"name,attr"` Size string `xml:"size,attr"` @@ -188,12 +188,12 @@ func (m *Manifest) AddPackage(hash string, name string, size string, required bo } type Actions struct { - XMLName xml.Name `xml:"actions" datastore:"-"` + XMLName xml.Name `xml:"actions" datastore:"-" json:"-"` Actions []*Action `xml:"action"` } type Action struct { - XMLName xml.Name `xml:"action" datastore:"-"` + XMLName xml.Name `xml:"action" datastore:"-" json:"-"` Event string `xml:"event,attr"` // Extensions added by update_engine From 5d21f061f7465f6ea22a4d31fbd3069879824d0b Mon Sep 17 00:00:00 2001 From: Joshua Deare Date: Mon, 1 Jul 2013 13:17:08 -0700 Subject: [PATCH 06/91] added json omitempty tags bigquery was throwing errors without these due to null defined fields --- omaha/omaha.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/omaha/omaha.go b/omaha/omaha.go index 9a3d427..df35207 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -70,7 +70,7 @@ type App struct { XMLName xml.Name `xml:"app" datastore"-" json:"-"` Ping *Ping `xml:"ping"` UpdateCheck *UpdateCheck `xml:"updatecheck"` - Events []*Event `xml:"event"` + Events []*Event `xml:"event" json:",omitempty"` Id string `xml:"appid,attr,omitempty"` Version string `xml:"version,attr,omitempty"` NextVersion string `xml:"nextversion,attr,omitempty"` @@ -153,7 +153,7 @@ type Event struct { type Urls struct { XMLName xml.Name `xml:"urls" datastore:"-" json:"-"` - Urls []Url `xml:"url"` + Urls []Url `xml:"url" json:",omitempty"` } type Url struct { @@ -170,7 +170,7 @@ type Manifest struct { type Packages struct { XMLName xml.Name `xml:"packages" datastore:"-" json:"-"` - Packages []Package `xml:"package"` + Packages []Package `xml:"package" json:",omitempty"` } type Package struct { @@ -189,7 +189,7 @@ func (m *Manifest) AddPackage(hash string, name string, size string, required bo type Actions struct { XMLName xml.Name `xml:"actions" datastore:"-" json:"-"` - Actions []*Action `xml:"action"` + Actions []*Action `xml:"action" json:",omitempty"` } type Action struct { From 5140f37b408b1a1d60eec188090f0a90e94bc733 Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Tue, 2 Jul 2013 09:41:53 -0700 Subject: [PATCH 07/91] feat(omaha): add Track field this is another update_engine extension. Add it. --- fixtures/update-engine/update/request.xml | 2 +- omaha/omaha.go | 1 + omaha/omaha_test.go | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/fixtures/update-engine/update/request.xml b/fixtures/update-engine/update/request.xml index 6510544..c1f8243 100644 --- a/fixtures/update-engine/update/request.xml +++ b/fixtures/update-engine/update/request.xml @@ -1,7 +1,7 @@ - + diff --git a/omaha/omaha.go b/omaha/omaha.go index 24cb4e6..387ed88 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -77,6 +77,7 @@ type App struct { Lang string `xml:"lang,attr,omitempty"` Client string `xml:"client,attr,omitempty"` InstallAge string `xml:"installage,attr,omitempty"` + Track string `xml:"track,attr,omitempty"` FromTrack string `xml:"from_track,attr,omitempty"` Status string `xml:"status,attr,omitempty"` } diff --git a/omaha/omaha_test.go b/omaha/omaha_test.go index 594d69c..2b98a9a 100644 --- a/omaha/omaha_test.go +++ b/omaha/omaha_test.go @@ -40,6 +40,10 @@ func TestOmahaRequestUpdateCheck(t *testing.T) { t.Error("developer-build") } + if v.Apps[0].Track != "dev-channel" { + t.Error("dev-channel") + } + if v.Apps[0].Events[0].Type != "3" { t.Error("developer-build") } From ac9df07313c988b1f59f2a1239260d3c7aae9de5 Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Tue, 2 Jul 2013 09:47:19 -0700 Subject: [PATCH 08/91] chore(omaha): group the update engine extensions together --- omaha/omaha.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/omaha/omaha.go b/omaha/omaha.go index 387ed88..e15e95b 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -77,9 +77,11 @@ type App struct { Lang string `xml:"lang,attr,omitempty"` Client string `xml:"client,attr,omitempty"` InstallAge string `xml:"installage,attr,omitempty"` + Status string `xml:"status,attr,omitempty"` + + // update engine extensions Track string `xml:"track,attr,omitempty"` FromTrack string `xml:"from_track,attr,omitempty"` - Status string `xml:"status,attr,omitempty"` } func NewApp(id string) *App { From 528535f63e4f8fb419c2d4e5fd776a7d072f05bd Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Tue, 9 Jul 2013 11:48:57 -0700 Subject: [PATCH 09/91] feat(omaha): add a bootid field the bootid field will be used by CoreOS to uniquely identify a boot of an instance. --- fixtures/update-engine/update/request.xml | 2 +- omaha/omaha.go | 3 +++ omaha/omaha_test.go | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fixtures/update-engine/update/request.xml b/fixtures/update-engine/update/request.xml index c1f8243..b5e4982 100644 --- a/fixtures/update-engine/update/request.xml +++ b/fixtures/update-engine/update/request.xml @@ -1,7 +1,7 @@ - + diff --git a/omaha/omaha.go b/omaha/omaha.go index a6ccd75..a66af8a 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -82,6 +82,9 @@ type App struct { // update engine extensions Track string `xml:"track,attr,omitempty"` FromTrack string `xml:"from_track,attr,omitempty"` + + // coreos update engine extensions + BootId string `xml:"bootid,attr,omitempty"` } func NewApp(id string) *App { diff --git a/omaha/omaha_test.go b/omaha/omaha_test.go index 2b98a9a..287aeab 100644 --- a/omaha/omaha_test.go +++ b/omaha/omaha_test.go @@ -28,6 +28,10 @@ func TestOmahaRequestUpdateCheck(t *testing.T) { t.Error("Expected an App Id") } + if v.Apps[0].BootId != "{7D52A1CC-7066-40F0-91C7-7CB6A871BFDE}" { + t.Error("Expected a Boot Id") + } + if v.Apps[0].UpdateCheck == nil { t.Error("Expected an UpdateCheck") } From 05776eb33db0f7fa0832171baa15fdd1436c2fdb Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Tue, 9 Jul 2013 17:31:48 -0700 Subject: [PATCH 10/91] README: add a link to the go docs --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 9226396..bb019b7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ +# Go Omaha + Implementation of the omaha protocol in Go. https://code.google.com/p/omaha/ +## Docs + +http://godoc.org/github.com/coreos/go-omaha/omaha + [![Build Status](https://travis-ci.org/coreos/go-omaha.png)](https://travis-ci.org/coreos/go-omaha) From 5ad4a720767a0d79042e60a067c7899b7a7683ab Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Tue, 3 Sep 2013 16:20:46 -0700 Subject: [PATCH 11/91] fix(omaha): go fmt --- omaha/omaha.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/omaha/omaha.go b/omaha/omaha.go index a66af8a..416c89c 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -80,8 +80,8 @@ type App struct { Status string `xml:"status,attr,omitempty"` // update engine extensions - Track string `xml:"track,attr,omitempty"` - FromTrack string `xml:"from_track,attr,omitempty"` + Track string `xml:"track,attr,omitempty"` + FromTrack string `xml:"from_track,attr,omitempty"` // coreos update engine extensions BootId string `xml:"bootid,attr,omitempty"` From ddc4c22205ec33055da87de617b9255b1d3eb0a3 Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Tue, 3 Sep 2013 16:21:08 -0700 Subject: [PATCH 12/91] feat(omaha): add oem and previousbootid Add two new extensions for coreos --- fixtures/update-engine/update/request.xml | 2 +- omaha/omaha.go | 4 +++- omaha/omaha_test.go | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fixtures/update-engine/update/request.xml b/fixtures/update-engine/update/request.xml index b5e4982..f413143 100644 --- a/fixtures/update-engine/update/request.xml +++ b/fixtures/update-engine/update/request.xml @@ -1,7 +1,7 @@ - + diff --git a/omaha/omaha.go b/omaha/omaha.go index 416c89c..5bf8091 100644 --- a/omaha/omaha.go +++ b/omaha/omaha.go @@ -84,7 +84,9 @@ type App struct { FromTrack string `xml:"from_track,attr,omitempty"` // coreos update engine extensions - BootId string `xml:"bootid,attr,omitempty"` + BootId string `xml:"bootid,attr,omitempty"` + PreviousBootId string `xml:"previousbootid,attr,omitempty"` + Oem string `xml:"oem,attr,omitempty"` } func NewApp(id string) *App { diff --git a/omaha/omaha_test.go b/omaha/omaha_test.go index 287aeab..2cecac8 100644 --- a/omaha/omaha_test.go +++ b/omaha/omaha_test.go @@ -32,6 +32,14 @@ func TestOmahaRequestUpdateCheck(t *testing.T) { t.Error("Expected a Boot Id") } + if v.Apps[0].PreviousBootId != "{8BDE4C4D-9083-4D61-B41C-3253212C0C37}" { + t.Error("Expected a Previous Boot Id") + } + + if v.Apps[0].Oem != "ec3000" { + t.Error("Expected an OEM") + } + if v.Apps[0].UpdateCheck == nil { t.Error("Expected an UpdateCheck") } From 054de85da2173bb7857ed08032375fb643efeeac Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Sun, 19 Jan 2014 12:25:11 -0800 Subject: [PATCH 13/91] feat(*): initial commit --- CONTRIBUTING.md | 124 +++++++++++++++++++++++++++++ LICENSE | 202 ++++++++++++++++++++++++++++++++++++++++++++++++ NOTICE | 5 ++ 3 files changed, 331 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 NOTICE diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e58bf88 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,124 @@ +# How to contribute + +CoreOS projects are Apache 2.0 licensed and accept contributions via Github +pull requests. This document outlines some of the conventions on commit +message formatting, contact points for developers and other resources to make +getting your contribution accepted. + +# Certificate of Origin + +By contributing to this project you agree to the Developer Certificate of +Origin (DCO). This document was created by the Linux Kernel community and is a +simple statement that you, as a contributor, have the legal right to make the +contribution. + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + + +# Email and chat + +- Email: [coreos-dev](https://groups.google.com/forum/#!forum/coreos-dev) +- IRC: #[coreos](irc://irc.freenode.org:6667/#coreos) IRC channel on freenode.org + +## Getting Started + +- Fork the repository on GitHub +- Read the README.md for build instructions + +## Contribution flow + +This is a rough outline of what a contributor's workflow looks like: + +- Create a topic branch from where you want to base your work. This is usually master. +- Make commits of logical units. +- Make sure your commit messages are in the proper format, see below +- Push your changes to a topic branch in your fork of the repository. +- Submit a pull request + +Thanks for you contributions! + +### Format of the commit message + +We follow a rough convention for commit messages borrowed from Angularjs. This +is an example of a commit: + +``` + feat(scripts/test-cluster): add a cluster test command + + this uses tmux to setup a test cluster that you can easily kill and + start for debugging. +``` + +To make it more formal it looks something like this: + +``` +(): + + + +