| Akaros Contribution Policies |
| =========================== |
| **2019-03-14** Barret Rhoden (`brho`) |
| |
| Interested in contributing to Akaros? This document covers coding standards, |
| version control usage, and other contribution policies. |
| |
| Contents |
| --------------------------- |
| + Licensing |
| + Contribution Philosophy |
| + Contribution Steps |
| + Coding Standard |
| + Git Workflow |
| - Setup |
| - A Basic Commit |
| - A Bigger Change: Several Commits! |
| - Someone Changed origin/master; My Branch is Now Old |
| - Oh No, I Committed and Pushed Something I Want to Change |
| - Crap, Someone Reset a Branch I was Tracking! |
| - What Happens When Two People `push -f` |
| - Before You Submit Patches: checkpatch |
| - How To Submit Patches: adt |
| - How To Submit Patches: git send-email |
| - How To Submit Patches: git request-pull |
| |
| |
| Licensing |
| --------------------------- |
| By contributing to Akaros, you are agreeing with the Developer Certificate of |
| Origin (found in [Documentation/Developer_Certificate_of_Origin](Developer_Certificate_of_Origin) |
| and at <http://developercertificate.org/>). |
| |
| All contributions of any sort, including code from other projects, must be |
| compatible with the GPLv2. |
| |
| All new code should be licensed "GPLv2 or later". |
| |
| You (or your employer) may retain the copyright to your contributions, if |
| applicable. We do not require copyright assignment. |
| |
| Your git 'Sign-off' indicates your agreement with these rules. |
| |
| |
| Contribution Philosophy |
| --------------------------- |
| "Do the right thing." If you've discovered a problem, figure out how to fix it |
| and fix it right. You do not need to solve every problem, but think a little |
| and don't be short-sighted. (Grep the codebase for TODO.) For example, if you |
| want to disable the legacy USB devices, then go ahead. You do not need to |
| write an entire USB stack, but you should expect that stack to be written in |
| the future. |
| |
| You 'own' your patches and changes, meaning both that they are your |
| responsibility and you are free to pursue a solution in your own way. You must |
| be happy with your commits; I must be ok with them. If you're happy with |
| something half-assed, then you're in the wrong line of work. |
| |
| Expect push-back on various things and plan on reworking your commits. We |
| should be able to reach a good solution through discussion and, on occasion, |
| arguments. |
| |
| Discussion and arguments about patches and technical content is fine. |
| Attacking people is not. |
| |
| |
| Contribution Steps |
| --------------------------- |
| Contributing to Akaros is much like contributing to the Linux kernel. |
| |
| The short version of adding code to Akaros: |
| + Email the list early and often |
| + Send-email or push to your own repo/branch and request-pull |
| + Get someone (brho) to shepherd your work |
| + Fix up your commits until they are merged |
| |
| Contact the list before starting on a major project. I may already have plans |
| or initial thoughts on the matter, and someone on the list can provide advice. |
| Likewise, don't break long term plans or be too invasive for no reason. |
| Otherwise, I might not accept the change at all. |
| |
| The end goal for a major change is to have a sane series of patches that |
| applies cleanly to `origin/master`. Sane, means there are not a lot of "oh wait, |
| this patch is wrong, reverting". The patch series should tell a story of |
| getting from A to B, where each patch is easily reviewable. |
| |
| If your change is minor, like a bug fix, then feel free to just fix it and |
| submit the patch; you don't need to ask before fixing a bug. |
| |
| Before you submit your patch, run scripts/checkpatch.pl on it. Checkpatch has |
| both false positives and false negatives, but at least run it and fix the |
| obviously incorrect changes. Email the mailing list if you have any questions. |
| See below for how to use checkpatch. |
| |
| To submit your patchset, you have two options: git send-email or git |
| request-pull. Send-email will take each of your patches and send it to the |
| mailing list. Request-pull requires you to push your work to a branch in your |
| own repo (probably on github), and it will output a block of text. You then |
| email that output to the mailing list with a suitable subject. See below for |
| how to do a send-email or request-pull. |
| |
| Once your patches or request-pull has been emailed to the list, someone, usually |
| me, will shepherd your work, providing feedback and TODOs. The TODOs usually |
| consist of fixing commits, such that your patchset does not introduce errors at |
| intermediate patches. This means you will need to rewrite commits and git's |
| history. It is not enough to just add an extra commit on top of broken patches |
| in your patchset. (See below for some git commands and examples). |
| |
| After you fixed a patchset, you send-email or request pull again, and you do so |
| in response to your original email. For request-pull, this is easy: you just |
| hit reply to the first message. For send-email, you use the --in-reply-to= |
| option. |
| |
| In general, I prefer not to merge, but it may be necessary based on the age of |
| the changed branch. If we scale out and have various submaintainers, we'll |
| merge those branches into the main repo. But at this point, the `brho:origin/` |
| repo is a 'leaf' (the one and only leaf). We'll hold off on merging until we |
| have many leaves. |
| |
| If you bring in code from another project: |
| + First add the code, unaltered if possible, in a single commit. That commit |
| must say where you got the code from, such as a URL, project name and version, |
| etc. Do not add the .c files to Kbuild yet. Otherwise, you'll break the build. |
| |
| + Run spatch and clang-format, if applicable, in a single commit. It's much |
| easier to diagnose problems if spatch and reformatting was done before any |
| other changes. Sometimes these tools fail. Just fix up any mistakes in this |
| commit. |
| |
| + Add your own changes, such that it compiles. This is the point where you add |
| the .c files to Kbuild so that we actually build the files. |
| |
| |
| A few final notes: |
| + You must sign-off your commits. |
| |
| + Your commits should be of a reasonable size. Try to isolate your commits to |
| logically consistent, easily verifiable changes. Each commit should compile, |
| but you don't want to change everything in one commit. |
| |
| + If a patch relied on spatch, provide the commands or scripts used in the |
| commit message. If the script is likely to be useful beyond your patch, then |
| put it in scripts/spatch/ so we can reuse it or learn from it. |
| |
| + Remember that someone other than yourself has to look at each of these |
| commits. |
| |
| |
| Coding Standard |
| --------------------------- |
| We use the Linux kernel coding style. When in doubt, do what they do. |
| |
| + If you are bringing in code from another project other than Linux, such as |
| Plan 9, consider running clang-format on it. We have a format file in the |
| root of the Akaros repo. clang-format isn't perfect, but it's close enough. |
| We do this for Plan 9 code, which we heavily internalize, but if the code is |
| a library (random, crypto, zlib) that we won't touch, then just leave it as |
| is. That makes it easier to update the library. |
| |
| + You'll note that old code may lack the correct style, especially due to the |
| large bodies of code from other systems involved. Typically, we fix it when |
| fixing the code for other reasons, so that git blame points at the most |
| recent relevant change. |
| |
| + We can do major reformatting commits and have git blame ignore them. Talk |
| with brho before doing major reformatting. |
| |
| + Indentation is done with tabs, 8-spaces wide. |
| |
| + No spaces after the name of a function in a call. For example, |
| `printk("hello")` not `printk ("hello")`. |
| |
| + Functions that take no arguments are declared `f(void)` not `f()`. |
| |
| + Function names are all lower-case, separated by underscores. |
| |
| + One space after commas. For example `foo(x, y, z)`, not `foo(x,y,z)`. |
| |
| + One space after keywords `if`, `for`, `while`, `switch`. For example, |
| `if (x)` not `if(x)`. |
| |
| + Space before braces. For example, `if (x) {` not `if (x){`. |
| |
| + For `if/while/etc`, the opening brace is on the same line as the `if`. If you |
| have just one line, no brace is necessary. If you have an `if / else` clause, |
| and one of them has braces, put braces on both. An `else` line should start |
| with a brace. |
| |
| + You can use tabs or spaces for indentation, so long as the spaces follow the |
| tabs and they are not intermixed. Older code used tabs for indentation, and |
| spaces for formatting/aligning. Using spaces for alignment was easier when |
| we changed from four-space tabs to eight-space tabs. That style is also |
| eaiser for some scenarios and editors. Don't worry too much about it. |
| |
| + Preprocessor macros are usually upper-case. Try to avoid using macros |
| unless necessary (I prefer static inlines). |
| |
| + Pointer declarations have the `*` on the variable: `void *x`, not `void* x`. |
| |
| + Multi-word names are lower_case_with_underscores. Keep your names short, |
| especially for local variables. |
| |
| + 'Permanent' comments in are C `/* ... */` comments. Only use C++ style (`//`) |
| for temporary commenting-out, such as if you want to not call a function. |
| If you want to block out large chunks of code, use `#if 0 ... #endif` |
| |
| + In a function definition, the function name should NOT start a new line. Old |
| code incorrectly does this, and should be changed over time. |
| |
| + Feel free to use `goto`, especially in functions that have cleanup before |
| they exit, or in other places that enhance readability. |
| |
| + 80 characters per line. When you wrap, try to line things up so they make |
| sense, such as space-indenting so function arguments line up vertically. |
| |
| + Do not `typedef` structs. You can `typedef` function pointers when convenient. |
| Keep in mind that typedefs require people to look up the real type when they |
| analyze the code. |
| |
| + Try to avoid making lots of separate files or extravagant directory |
| hierarchies. Keep in mind that people will need to work with and find these |
| files (even via tab completion, it can be a pain). |
| |
| + Consider aligning the members of structs with multiple values. I often align |
| the members (not the types) at 40 chars. This is a stylistic choice. |
| |
| Git Workflow |
| ------------------------------------ |
| Git allows us to do a lot of cool things. One of its primary purposes is to |
| provide a means for us to review each others code. In this section, I'll |
| describe how I use git to make changes to Akaros and send those changes to the |
| mailing list. |
| |
| There are a bunch of scripts and tools in scripts/git/. I'll use some of them |
| below. |
| |
| ### Setup |
| |
| First off, visualizing the git tree is extremely useful. I use: |
| |
| `$ gitk --all &` |
| |
| If you only have a terminal, you can use git log for a similar effect: |
| |
| `$ git log --graph --full-history --all --color --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m"` |
| |
| That's pretty crazy, so I have the following in my `~/.gitconfig` |
| |
| ``` |
| [alias] |
| gr = log --graph --full-history --all --color --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m" |
| grs = log --graph --full-history --all --color --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m" --simplify-by-decoration |
| ``` |
| |
| With those aliases, I only need to do `git gr`. |
| |
| |
| ### A Basic Commit |
| |
| Let's say you want to make a minor change to say, the kernel monitor. To start |
| things off, make sure you are up to date. |
| |
| ``` |
| $ git checkout master # make sure you're on master |
| $ git fetch # grab the latest from origin/ |
| $ git merge origin/master |
| ``` |
| |
| Many people simply do a git pull to get the latest. I tend to fetch, then |
| merge manually after glancing at the stream of changes. If you ever see a |
| (XCC) in one of the commit messages, then you may need to rebuild your |
| toolchain. |
| |
| Time to make our change. Let's make a branch called `monitor-change`: |
| |
| `$ git checkout -b monitor-change` |
| |
| Edit, compile, and test a change, say in `kern/src/monitor.c` |
| |
| `$ git add -p kern/src/monitor.c` |
| |
| The `-p` flag allows you to incrementally add and review each diff chunk. It's |
| very useful for committing only what you want from a set of changes in your |
| working directory. |
| |
| `$ git status` |
| |
| Take a look at things before you commit; see if you missed any files or added |
| anything you don't want. |
| |
| `$ git commit -s` |
| |
| The -s is to append your "Signed-off-by" line. |
| |
| Write a descriptive message, with a short, one-line summary first. e.g. |
| |
| ``` |
| commit 52cc9b19c6edfc183276b1ebf24af9baea4d20d2 |
| Author: Barret Rhoden <brho@cs.berkeley.edu> |
| Date: Mon Jan 19 18:36:07 2015 -0500 |
| |
| Fixes kernel argument checking in "m" |
| |
| Need at least one argument before dereferencing. |
| |
| Also, debugcmd is pretty handy. |
| ``` |
| |
| Oh wait, say you messed up the commit message or some part of the code. You |
| can make the change and amend the commit. |
| |
| ``` |
| $ vi kern/src/monitor.c |
| $ git add -p kern/src/monitor.c |
| $ git commit --amend # can also change the commit message |
| ``` |
| |
| Now that you are happy, push it. |
| |
| `$ git push origin monitor-change` |
| |
| Email the mailing list or your nearest shepherd, and we'll take a look! |
| |
| |
| ### A Bigger Change: Several Commits! |
| |
| Say you are working on the monitor, and you realize your change is quite large |
| and probably should be several smaller, logically consistent commits. |
| |
| You may have already added some of the changes to the index. To reset the |
| index (what git will commit in the next commit): |
| |
| `$ git reset HEAD` |
| |
| Now, your changes are unstaged. Confirm with: |
| |
| `$ git status` |
| |
| Now you want to add some, but not all, of your changes to `monitor.c`: |
| |
| `$ git add -p kern/src/monitor.c kern/src/other_files_too.c` |
| |
| Select only the changes you want, then commit: |
| |
| `$ git commit -s # write message` |
| |
| Then make further commits: |
| |
| ``` |
| $ git add -p kern/src/monitor ; git commit -s |
| $ git add -p kern/src/monitor ; git commit -s |
| |
| $ git push origin monitor-change |
| ``` |
| |
| |
| ### Someone Changed origin/master; My Branch is Now Old |
| |
| Typically, we want branches to descend from `origin/master`. But if multiple |
| people are working at a time, someone will fall behind. With git, dealing with |
| this situation is extremely easy. You just need to rebase your current branch |
| on the new master. |
| |
| Say you are on the branch `monitor-change`, and `origin/master` has updated. |
| Here's a reasonable workflow to deal with this situation: |
| |
| ``` |
| $ git fetch # notice origin/master changed |
| $ git checkout master # switch to master |
| $ git merge origin/master # fast-forward merge - straight line of commits |
| ``` |
| |
| Master is now up to date. `git pull --rebase` does this too, though I prefer to |
| always fetch first. |
| |
| ``` |
| $ git checkout monitor-change # needed if you aren't on monitor-change |
| $ git rebase master |
| ``` |
| |
| Now monitor-change descends from the latest master. |
| |
| A short-cut for the last two commands is: |
| |
| `$ git rebase master monitor-change` |
| |
| The last parameter is simply an implied `git checkout`. |
| |
| Don't forget to recompile and skim the log from the master update. If you |
| already pushed your branch to the repo, you'll want to update that branch. |
| |
| `$ git push -f origin monitor-change` |
| |
| The `-f` replaces the `origin/monitor-change` with your `monitor-change`. See |
| below for more on `-f`. |
| |
| If you don't want to bother with maintaining your master right now, you can cut |
| it down to a few steps (assuming you are on `SOMEBRANCH`): |
| |
| ``` |
| $ git fetch |
| $ git rebase origin/master |
| $ git push -f origin/SOMEBRANCH |
| ``` |
| |
| |
| ### Oh No, I Committed and Pushed Something I Want to Change |
| |
| Fear not, adjusting git's history is very easy, and we do it all the time on |
| branches other than origin/master. |
| |
| Let's say you have a string of commits, e.g.: (edited from my `git gr`) |
| |
| ``` |
| * 876d5b0 (HEAD, vmmcp, origin/vmmcp) VMM: handle EPT page faults |
| * f926c02 Fixes VMR creating off-by-one |
| * f62dd6c VMM: Removes the epte_t from pte_t Crap - bugs! |
| * 08e42d6 VMM: Call EPT ops for every KPT op |
| * d76b4c6 Redefines PTE present vs mapped Crap - debug prints! |
| * ddb9fa7 x86: EPT and KPT are contiguous |
| * 1234567 (master, origin/master) Some Other Commit |
| ``` |
| |
| You're working on the `vmmcp` branch, and you realize that `d76b4c6` adds a |
| bunch of debug `printk`s in it and that there is a bug in `HEAD` that you |
| introduced in `f62dd6c`. |
| |
| The lousy option would be to make a new commit on top of `876d5b0 (HEAD)` that |
| removes the prints and fixes the bugs. The problem with this is that there is |
| no reason for people to even know those existed in the first place, and by |
| leaving the bugs and `printk`s in old code you only increase the load on your |
| shepherd. |
| |
| Not to worry, you can use `git rebase -i` to interactively replay the commits |
| from `master..vmmcp` and rewrite the commits along the way. |
| |
| First up, make sure you are on `vmmcp` and do a `git rebase -i`. |
| |
| ``` |
| $ git checkout vmmcp |
| $ git rebase -i master |
| ``` |
| |
| This will replay all commits from (`1234567`, `876d5b0`] (not including |
| `1234567`) on top of `master` (`1234567`). Check out `git help rebase` for |
| more info, including some nifty diagrams. In short, that `rebase` command is |
| the shorthand for: |
| |
| `$ git rebase -i --onto master master vmmcp` |
| |
| The `rebase` command `-i` option (interactive) will pop open an editor, where |
| you can change the order of commits, squash multiple commits into a single |
| commit, or stop and edit the commit. Note that commits are presented in the |
| order in which they will be committed, which is the opposite of `gitk` and `git |
| gr`, where the newest commit is on top. |
| |
| Let's edit the commit `d76b4c6` (change '`pick`' to '`e`'). Save and exit, and |
| the rebase will proceed. When git hits that commit, it will stop and you can |
| amend your commit. |
| |
| ``` |
| $ vi somefile # make your changes |
| $ git add -p somefile # add them to the index (building a commit) |
| $ git commit --amend # amend your *old* commit (d76b4c6) |
| $ git status # see how you are doing |
| $ git rebase --continue |
| ``` |
| |
| Now check it out in `gitk` or `git gr`. It's like your debug `printk`s never |
| existed. |
| |
| Another approach is to build a temporary commit and use it as a fixup commit. |
| Let's do that to fix the bug in `f62dd6c`. |
| |
| ``` |
| $ git checkout vmmcp # start from the top of the tree |
| $ vi somefile # make your changes |
| $ git add -p somefile # stage the changes |
| $ git commit -m WIP-fixes-vmm-bug |
| ``` |
| |
| You now have something like: |
| |
| ``` |
| * 13a95cc (HEAD, vmmcp) WIP-fixes-vmm-bug |
| * 876d5b0 (origin/vmmcp) VMM: handle EPT page faults |
| * f926c02 Fixes VMR creating off-by-one |
| * f62dd6c VMM: Removes the epte_t from pte_t Crap - bugs! |
| * 08e42d6 VMM: Call EPT ops for every KPT op |
| * d76b4c6 Redefines PTE present vs mapped Crap - debug prints! |
| * ddb9fa7 x86: EPT and KPT are contiguous |
| * 1234567 (master, origin/master) Some Other Commit |
| ``` |
| |
| Clearly you don't want that WIP commit (WIP = work in progress). Let's rebase! |
| |
| `$ git rebase -i master` |
| |
| Reorder the commits so that the WIP happens after `f62dd6c`, and change the |
| WIP's command from '`pick`' to '`f`'. |
| |
| Assuming everything applies cleanly, you're done. The WIP approach is even |
| easier than the `rebase` with `amend`. I use it when a change applies to both |
| the current tip as well as the faulty commit. |
| |
| You can even use `git rebase` to logically reorder commits so that together, the |
| 'story' is more cohesive. |
| |
| But wait, your version of `vmmcp` differs from `origin/vmmcp`! The repo's |
| `vmmcp` branch still looks like the old one. You need to `push -f` to force |
| the repo's branch to agree with yours: |
| |
| `$ git push -f origin vmmcp` |
| |
| This will destroy the original `origin/vmmcp` and replace it with your `vmmcp`. |
| Anyone who was tracking `origin/vmmcp` will need to reset their branch. Do not |
| do this to `origin/master`. |
| |
| Just remember: `gitk`, `git rebase`, and `git commit --amend` are your friends. |
| |
| |
| ### Crap, Someone Reset a Branch I was Tracking! |
| |
| Say you were working on `origin/vmmcp` while someone else did the steps from the |
| previous section. You do a `git fetch` and see that you differ! |
| |
| If you don't have any changes from the original `origin/vmmcp`, then you can |
| simply: |
| |
| ``` |
| $ git checkout vmmcp |
| $ git reset --hard origin/vmmcp |
| ``` |
| |
| This throws away any differences between your tree and `origin/vmmcp`, in |
| essence making it replicate the current state of `origin/vmmcp`. If you had |
| any changes, you just lost them. Yikes! If in doubt, you can make a temp |
| branch before doing anything dangerous with reset. |
| |
| `$ git branch temp # keeps a pointer called 'temp' to the current tip` |
| |
| Say you do have changes. Now what? If they are just diffs, but not commits, |
| you can stash them, then replay the changes on the new `vmmcp` branch: |
| |
| ``` |
| $ git stash |
| $ git reset --hard origin/vmmcp |
| $ git stash pop # might not apply cleanly |
| ``` |
| |
| If you did have commits, you'll want to rebase. You are trying to rebase the |
| commits from your old `vmmcp` branch to the new one: |
| |
| `$ git rebase --onto origin/vmmcp PREVIOUS-ORIGIN-VMMCP` |
| |
| You'll need to look at `gitk`, `git log`, `git gr`, or whatever to find the |
| commit name (SHA1) of the original `origin/vmmcp` (before you fetched). For |
| this reason, you could have a branch called vmmcp-mine for all of your changes, |
| and keep your branch `vmmcp` around to just track `origin/vmmcp`. This is what |
| many people do with `master`: it only tracks `origin/master`, and all changes |
| happen on separate branches. |
| |
| Note that you can probably just do a: |
| |
| `$ git rebase origin/vmmcp` |
| |
| and git will figure out and exclude which commits you have in common with |
| `origin/vmmcp` from the rebase. Check your results in `gitk` or `git gr`. |
| |
| This can be rather tricky, which is part of the reason why you shouldn't reset |
| branches that other people rely on (e.g. `origin/master`). It's fine for small |
| group or individual work. |
| |
| Just remember: `gitk` and `git rebase` are your friends. |
| |
| |
| ### What Happens When Two People `push -f` |
| |
| Whoever pushes most recently is the one to clobber the branch. The previous |
| person's commits would only exist in that person's personal repo! Yikes! |
| |
| In general, don't clobber (`push -f`) other people's branches without |
| coordinating first. I reset my origin branches all the time. I won't usually |
| reset other people's branches without checking with them. |
| |
| If clobbering repo branches is a problem, you can always create your own repo |
| branch; branches are very cheap and easy. |
| |
| To delete a remote branch, say after it is merged into `origin/master`: |
| |
| `$ git push -f origin :BRANCH-NAME` |
| |
| The : is part of the "refspec"; whatever is on the left is the source (in this |
| case, nothing). Check out `git help push` for more info. |
| |
| Again, these techinques work well with small groups, but not for big branches |
| like `origin/master`. |
| |
| |
| ### Before You Submit Patches: checkpatch |
| |
| scripts/checkpatch.pl is modified from Linux's checkpatch and takes a patchfile as input. I wrote a wrapper script for it that operates on a branch: scripts/git/git-checkpatch. I have it in my path, so I can call it like a git subcommand: |
| |
| ``` |
| $ git checkpatch master..my_branch_head |
| ``` |
| |
| That will generate the patches from master..my_branch_head and run checkpatch |
| on each of them in series. If you don't have the git scripts in your path, |
| you'll have to do something like: |
| |
| ``` |
| $ ./scripts/git/git-checkpatch master..my_branch_head |
| ``` |
| |
| Some developers have a checkpatch pre-commit hook. It's a personal preference. This [site](http://blog.vmsplice.net/2011/03/how-to-automatically-run-checkpatchpl.html) suggests the following: |
| ``` |
| $ cat >.git/hooks/pre-commit |
| #!/bin/bash |
| exec git diff --cached | scripts/checkpatch.pl --no-signoff -q - |
| ^D |
| $ chmod 755 .git/hooks/pre-commit |
| ``` |
| If checkpatch throws false-positives, then you'll have to bypass the precommit hook with a -n. |
| |
| For more info on checkpatch, check out http://www.tuxradar.com/content/newbies-guide-hacking-linux-kernel. We use it just like Linux. |
| |
| |
| ### How To Submit Patches: adt |
| |
| adt is a script that sends patches to our gerrit repository for a review. |
| It allows you to send patches for review from the command line, but the |
| resulting code review is done on our gerrit page. |
| |
| First, visit https://akaros-review.googlesource.com and sign in with a gmail |
| account to make sure it creates an account for you. |
| |
| Next, make sure that you have a remote setup for gerrit. |
| |
| ``` |
| git remote add gerrit https://akaros.googlesource.com/akaros |
| ``` |
| |
| Next, make sure that you have the gerrit hooks installed. This will generate a |
| Change-ID when you do a commit. If you do this, ignore the checkpatch error |
| about gerrit Change-IDs. |
| |
| ``` |
| # Install Gerrit Git hooks |
| curl -Lo .git/hooks/commit-msg https://akaros-review.googlesource.com/tools/hooks/commit-msg |
| chmod +x .git/hooks/commit-msg |
| ``` |
| |
| Next, suppose you have a branch that contains changes you want to push up, |
| called vmm. You first do a rebase on top of brho/master, to ensure that your |
| changes are up to date. |
| |
| ``` |
| git pull --rebase brho master |
| ``` |
| |
| To send the patches up for review, you can then do: |
| |
| ``` |
| scripts/git/adt mail -m dcross,ganshun@google.com,rminnich,brho -t mytopic |
| ``` |
| |
| The three current flags for adt are as follows: |
| -m specifies your reviewers for this patch, |
| |
| -cc specifies people you want to be cc'ed on this set of commits. |
| |
| -t specifies the topic for this set of commits. If this flag is not provided, |
| the local current branch name will be used as the topic. |
| |
| ### How To Submit Patches: git send-email |
| |
| git send-email is a simple way to send patches. It works from the command line |
| and you don't need a github account or remote repo. |
| |
| Akaros is no different than Linux or any of a number of projects in our use of |
| send-email. For a good overview, check out: |
| https://www.freedesktop.org/wiki/Software/PulseAudio/HowToUseGitSendEmail/. |
| |
| Here's the basics for Akaros: |
| |
| Use the config stub for sendemail in scripts/git/config to send emails to the mailing list. |
| |
| If your patchset consists of more than one patch, use the --cover-letter option. |
| This will send an introductory email, called PATCH 0/n, in which you explain |
| your patch a bit. If you have just one patch, you don't need to bother with a |
| cover letter. Make the subject and message for the cover letter reasonably |
| descriptive of your overall change. |
| |
| If you have a remote branch tracking your patchset and are not overwhelmed with |
| git commands yet, you can put the output of scripts/git/pre-se.sh in the |
| cover-letter email. This provides a convenient github link to browse the changes. |
| |
| If you are using send-email to send new versions of a patch, do it in-reply-to |
| your original email. See git help send-email for an example. |
| |
| Here's an example. Say I have a branch called 'vmm' and want to send the patches from master to it: |
| |
| ``` |
| $ git send-email --cover-letter master..vmm |
| ``` |
| That sent emails to the mailing list, thanks to the config setting for sendemail. |
| For your first time, you can send-email to yourself instead: |
| |
| ``` |
| $ git send-email --to=you@gmail.com --cover-letter master..vmm |
| ``` |
| |
| If you want to send a single patch from the tip of the vmm branch: |
| |
| ``` |
| $ git send-email -1 vmm |
| ``` |
| |
| For more info, check out: |
| + git help send-email |
| + https://www.freedesktop.org/wiki/Software/PulseAudio/HowToUseGitSendEmail/ |
| + http://www.tuxradar.com/content/newbies-guide-hacking-linux-kernel |
| |
| |
| ### How To Submit Patches: git request-pull |
| |
| If you have a github account or any place where you can push a branch, you can |
| use request-pull to submit a patchset. We also have a custom version of |
| request-pull that adds extra info into the output: |
| scripts/git/git-akaros-request-pull. |
| |
| The usage is simple. Make sure your branch is up to date on your repo, then do |
| a request-pull. 'FROM' is the point from which your branch diverges from the |
| Akaros mainline. Usually, it'll be 'master'. |
| |
| ``` |
| $ git push REPO BRANCH |
| $ git akaros-request-pull FROM REPO BRANCH |
| ``` |
| |
| Here's how I would do a request-pull for my example 'vmm' branch: |
| |
| ``` |
| $ git akaros-request-pull master origin vmm |
| ``` |
| |
| Then copy-paste the output into an email and send it to the mailing list. |
| |
| If you don't have scripts/git/ in your PATH, you can either: |
| |
| ``` |
| $ ./scripts/git/git-akaros-request-pull master origin vmm |
| ``` |