all: update for Git

- rewrite .gitignore to use git patterns
- mv hg(1) to git(1) and rewrite
- add lib/git/commit-msg.hook
- add skeleton codereview script
- update codereview(1)

Change-Id: I061cd8e4de77ebbd6037a7c5d1582cd1d986f62f
This commit is contained in:
Russ Cox 2014-11-16 18:58:40 -05:00
parent 58d8f6c7ba
commit 95fee1d42e
5 changed files with 421 additions and 119 deletions

38
.gitignore vendored
View file

@ -1,27 +1,23 @@
(^|/)CVS($|/) plan9.log
(^|/)\.hg($|/) plan9-reverse.log
(^|/)\.hgtags($|/) state
^plan9.log$ state.old
^plan9-reverse.log$ state.journal
^state$ *.o
^state.old$ *.a
^state.journal$ man/man?/*.html
\.o$ src/**/o.*
\.a$ y.tab.[ch]
^man/man[0-9]+/.*\.html$ src/cmd/rc/x.tab.h
^src/.*/o\.[^/]+$ unix/*.tgz
y.tab.[ch]$ bin/
^src/cmd/rc/x.tab.h$ log/
^unix/.*\.tgz$ dict/
^bin/ postscript/font/
^log/ *.orig
^dict/
^postscript/font/
\.orig$
config config
install.log install.log
install.sum install.sum
last-change last-change
lib/codereview/codereview.pyc
src/cmd/awk/y.output src/cmd/awk/y.output
src/cmd/devdraw/latin1.h src/cmd/devdraw/latin1.h

View file

@ -1,2 +1,142 @@
#!/bin/sh #!/usr/local/plan9/bin/rc
$PLAN9/bin/codereview.py -r rsc --cc codebot --send_mail "$@"
git=git
show=false
fn gitshow {
echo '%' git $*
git $*
}
if(! ~ $#* 0 && ~ $1 -v) {
git=gitshow
show=true
shift
}
if(~ $#* 0) {
echo 'usage: codereview <command> <args>' >[1=2]
exit usage
}
if(~ $#PLAN9 0) {
PLAN9=/usr/local/plan9
}
if(! test -d $PLAN9/lib/git) {
echo 'codereview: cannot find $PLAN9/lib/git' >[1=2]
exit git
}
if(! test -e $PLAN9/.git/hooks/commit-msg) {
if($show) {
echo '% ln -s ../../lib/git/commit-msg.hook $PLAN9/.git/hooks/commit-msg'
}
ln -s ../../lib/git/commit-msg.hook $PLAN9/.git/hooks/commit-msg
}
switch($1) {
case help
9 man 1 codereview
case pending
shift
if(! ~ $#* 0) {
echo 'usage: codereview pending' >[1=2]
exit usage
}
$git branch --list
case create
shift
if(! ~ $#* 1) {
echo 'usage: codereview create branchname' >[1=2]
exit usage
}
branch=$1
if(! git branch -l | 9 grep '\* master$') {
echo 'codereview: create not on master branch; use codereview commit' >[1=2]
exit master
}
if($show) {
echo '% git branch '$branch' && git commit || git branch -d '$branch >[1=2]
}
git branch $branch && git commit $* || git branch -d $branch
case commit
shift
if(git branch -l | 9 grep '\* master$') {
echo 'codereview: commit on master branch; use codereview create <branchname>' >[1=2]
exit master
}
if(~ `{git merge-base HEAD HEAD} `{git merge-base HEAD master}) {
# first commit on branch, somehow.
$git commit $*
exit $status
}
$git commit --amend $*
exit $status
case upload
if(git branch -l | 9 grep '\* master$') {
echo 'codereview: upload on master branch' >[1=2]
exit master
}
if(~ `{git merge-base HEAD HEAD} `{git merge-base HEAD master}) {
# no commit on branch
echo 'codereview: no commits yet on this feature branch' >[1=2]
exit commit
}
if(! 9 grep 'machine plan9port-review.googlesource.com' $HOME/.netrc >/dev/null >[2=1]) {
echo 'codereview: warning: cannot find plan9port-review in netrc' >[1=2]
}
$git push https://plan9port-review.googlesource.com/plan9 HEAD:refs/for/master >[2=1] | 9 sed 's/.* //'
case sync
shift
if(! ~ $#* 0) {
echo 'usage: codereview sync' >[1=2]
exit usage
}
$git fetch -q
branch=`{git branch -l | 9 sed -n 's/^\* //p'}
if(~ $branch master) {
$git merge -q --ff-only origin/master
exit $status
}
if(~ `{git merge-base HEAD HEAD} `{git merge-base HEAD master}) {
# no commit on branch
git merge -q --ff-only origin/master
exit $status
}
# Exactly this commit in master. Fast-forward from master and delete this branch.
if(git branch -r --contains HEAD | 9 grep '^ *origin/master$') {
$git checkout -q master
$git merge -q --ff-only origin/master
$git branch -q -d $branch
exit $status
}
changeid=`{git log -n 1 | 9 sed -n 's/^ Change-Id: //p'}
if(~ $#changeid 0) {
echo 'codereview: cannot find change id'
exit changeid
}
if(git log --grep 'Change-Id: '$changeid origin/master | 9 grep .) {
# Something like this got submitted.
$git checkout -q master
$git merge -q --ff-only origin/master
echo 'Change submitted but perhaps not identical to your copy.' >[1=2]
echo 'To remove old copy:' git branch -d $branch >[1=2]
exit 1
}
if(git branch -r --contains master | 9 grep '^ *origin/master$')
$git branch -f master origin/master
$git rebase -q origin/master
case *
echo 'codereview: unrecognized command '$1 >[1=2]
exit usage
}

104
lib/git/commit-msg.hook Executable file
View file

@ -0,0 +1,104 @@
#!/bin/sh
# From Gerrit Code Review 2.2.1
#
# Part of Gerrit Code Review (http://code.google.com/p/gerrit/)
#
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
CHANGE_ID_AFTER="Bug|Issue"
MSG="$1"
# Check for, and add if missing, a unique Change-Id
#
add_ChangeId() {
clean_message=`sed -e '
/^diff --git a\/.*/{
s///
q
}
/^Signed-off-by:/d
/^#/d
' "$MSG" | git stripspace`
if test -z "$clean_message"
then
return
fi
if grep -i '^Change-Id:' "$MSG" >/dev/null
then
return
fi
id=`_gen_ChangeId`
perl -e '
$MSG = shift;
$id = shift;
$CHANGE_ID_AFTER = shift;
undef $/;
open(I, $MSG); $_ = <I>; close I;
s|^diff --git a/.*||ms;
s|^#.*$||mg;
exit unless $_;
@message = split /\n/;
$haveFooter = 0;
$startFooter = @message;
for($line = @message - 1; $line >= 0; $line--) {
$_ = $message[$line];
if (/^[a-zA-Z0-9-]+:/ && !m,^[a-z0-9-]+://,) {
$haveFooter++;
next;
}
next if /^[ []/;
$startFooter = $line if ($haveFooter && /^\r?$/);
last;
}
@footer = @message[$startFooter+1..@message];
@message = @message[0..$startFooter];
push(@footer, "") unless @footer;
for ($line = 0; $line < @footer; $line++) {
$_ = $footer[$line];
next if /^($CHANGE_ID_AFTER):/i;
last;
}
splice(@footer, $line, 0, "Change-Id: I$id");
$_ = join("\n", @message, @footer);
open(O, ">$MSG"); print O; close O;
' "$MSG" "$id" "$CHANGE_ID_AFTER"
}
_gen_ChangeIdInput() {
echo "tree `git write-tree`"
if parent=`git rev-parse HEAD^0 2>/dev/null`
then
echo "parent $parent"
fi
echo "author `git var GIT_AUTHOR_IDENT`"
echo "committer `git var GIT_COMMITTER_IDENT`"
echo
printf '%s' "$clean_message"
}
_gen_ChangeId() {
_gen_ChangeIdInput |
git hash-object -t commit --stdin
}
add_ChangeId

View file

@ -2,70 +2,154 @@
.SH NAME .SH NAME
codereview \- review of submitted changes (experimental) codereview \- review of submitted changes (experimental)
.SH SYNOPSIS .SH SYNOPSIS
.B hg .B git
.B diff .B diff
.B HEAD
.I path ... .I path ...
.PP .PP
.B codereview .B codereview
.I path ... [
.B -v
]
.B create
.I name
[
.B -a
]
.PP .PP
.B codereview .B codereview
.B -i [
.I issue .B -v
.I path ... ]
.B commit
[
.B -a
]
.PP
.B codereview
[
.B -v
]
.B upload
.PP
.B codereview
[
.B -v
]
.B pending
.PP
.B codereview
[
.B -v
]
.B sync
.SH DESCRIPTION .SH DESCRIPTION
.I Codereview .I Codereview
uploads suggested changes to the code review server manages the review and submission of changes to the Plan 9 from User Space project.
.I codereview.appspot.com
and sends email to reviewers.
It must be used from within a Plan 9 from User Space tree It must be used from within a Plan 9 from User Space tree
checked out via Mercurial checked out via Git
(see (see
.IR hg (1)). .IR git (1)).
.PP .PP
A developer makes changes to a local copy of the tree A developer makes changes to a local copy of the tree,
and reviews them locally using reviews them by using
.I hg .I git
.I diff . .I diff
When the changes are ready for external review, the .IR HEAD
developer creates a review issue by running and then commits them to a ``feature branch''
using
.I codereview .I codereview
naming the files to be reviewed. .IR create .
.I Codereview .I Git
prompts for a Google Accounts user name requires that changes be added to a ``staging area'' before the initial commit,
and password to log in to using commands such as
.I http://codereview.appspot.com/ .I git
and create a new review issue. .I add
Once created, it prints a line like and
.EX .I git
Issue created. URL: http://codereview.appspot.com/96161 .IR rm .
.EE The
among other output. .B -a
.PP option causes
The reviewer will likely respond with comments
and suggestions for improving the submission.
After making the changes, reupload by repeating
the
.I codereview .I codereview
command with the .I create
.B -i to add all local modifications to the staging area as part of the initial commit.
option to specify the issue number .PP
(in the above example, 96161). Once a feature branch is created, files can still be edited, but they must then be
incorporated into the change by using
.I codereview
.IR commit .
.PP
If other changes have been committed since the feature branch was created,
.I codereview
.I sync
will update it to be based on the most recent copy of the repository.
.PP
When the code is ready for review,
.I codereview
.I upload
uploads the change to
.HR https://plan9port-review.googlesource.com/
for review.
In order to upload,
.I git
must have access to a
.I $HOME/.netrc
that contains a password obtained from
.HR https://plan9port-review.googlesource.com/#/settings/http-password .
.PP
The most likely initial result of a code review is suggestions for
improving the code.
After making those changes, repeat the
.I codereview
.I commit
and
.I codereview
.I upload
steps.
.PP
Once the code is ready, it will be submitted by the reviewer using the web interface.
At that point,
.I codereview
.I sync
.PP .PP
Once the reviewer accepts the changes, they will be applied
automatically using the patch uploaded to the review server.
To update the local tree, run
.I hg
.I pull
with the
.B -u
option.
.SH SEE ALSO
.HR http://codereview.appspot.com/
.SH BUGS
The The
.I codereview .I codereview
command should be replaced by a proper Mercurial extension. .I pending
command lists the active feature branches.
.PP .PP
Making changes to the repository via patches All the
discards the executable bit on new shell scripts. .I codereview
commands take a leading
.B -v
option, which causes them to print
.I git
commands being executed.
This can be useful for debugging
.IR codereview .
.PP
The
.I codereview
command depends on a
.I git
``commit hook''
script being in place to add
.L Change-Id
lines to the commit messages.
.I Codereview
installs the hook at startup, if necessary,
by adding a symbolic link from
.B $PLAN9/.git/hooks/commit-msg
to
.BR $PLAN9/lib/git/commit-msg.hook .
.SH SEE ALSO
.IR git (1),
.HR http://plan9port-review.googlesource.com/
.SH BUGS
.I Git
is too complicated to use.
The
.I codereview
script helps, but a working understanding of
.I git
is still required.

View file

@ -1,42 +1,34 @@
.TH HG 1 .TH HG 1
.SH NAME .SH NAME
hg, cvs \- introduction to using plan9port Mercurial repository git, hg, cvs \- introduction to using plan9port Git repository
.SH SYNOPSIS .SH SYNOPSIS
.B hg .B git
.B clone .B clone
.B http://code.swtch.com/plan9port .B http://code.swtch.com/plan9port
.B plan9 .B plan9
.PP .PP
.B hg .B git
.B pull .B pull
.B -u
.PP .PP
.B hg .B git
.B diff .B diff
[
.B -r
.I revision .I revision
]
[ [
.I path ... .I path ...
] ]
.PP .PP
.B hg .B gitk
.B serve
.PP
.B hg
.B view
.PP .PP
.B web .B web
.B http://code.swtch.com/plan9port .B http://code.swtch.com/plan9port
.SH DESCRIPTION .SH DESCRIPTION
The master source tree for Plan 9 from User Space is maintained The master source tree for Plan 9 from User Space is maintained
using the source control system Mercurial using the source control system Git
as a substitute for Plan 9's as a substitute for Plan 9's
\fIreplica\fR(8) and dump file system. \fIreplica\fR(8) and dump file system.
.PP .PP
The first argument to The first argument to
.I hg .I git
is a command, which determines the form of the rest of the command line. is a command, which determines the form of the rest of the command line.
.PP .PP
The The
@ -45,67 +37,53 @@ command downloads a copy of the tree into the directory
.BR plan9 , .BR plan9 ,
which it will create. which it will create.
After After
.B hg .B git
.BR clone , .BR clone ,
the other commands listed the other commands listed
should be run within the should be run within the
.B plan9 .B plan9
directory tree. directory tree.
.PP .PP
Unlike CVS, Mercurial downloads the entire revision history Git downloads the entire revision history
of Plan 9 from User Space of Plan 9 from User Space
in addition to the current tree. in addition to the current tree.
.PP .PP
.I Hg .I Git
.I pull .I pull
incorporates changes from the master repository incorporates changes from the master repository
into the local revision history. into the local revision history and applies them to the
The current file tree.
.B -u
flag applies these changes to the current file tree.
.PP .PP
.I Hg .I Git
.I diff .I diff
runs Unix's runs Unix's
.IR diff (1) .IR diff (1)
to compare the files in the local tree with the corresponding to compare the files in the local tree with the corresponding
files in the revision history. files in the revision history.
By default it compares against the version that was most recently
incorporated into the local tree.
The
.B -r
flag specifies an alternate version to compare against.
The special revision The special revision
.B tip .B HEAD
refers to the most recent version on the server. refers to the most recent version in the version history.
.PP .PP
.I Hg .I Gitk
.I serve
starts an HTTP server serving information about
the local repository at the address
.BR http://localhost:8000/ .
.PP
.I Hg
.I view
starts an interactive history viewer. starts an interactive history viewer.
.PP .PP
The Mercurial tree can be inspected on the web at The Git tree can be inspected on the web at
.HR http://code.swtch.com/plan9port/ "" . .HR http://code.swtch.com/plan9port/ "" .
.SH FILES .SH FILES
.TP .TP
.B \*9/.hg .B \*9/.git
directory containing Mercurial local repository directory containing Mercurial local repository
.TP .TP
.B .hgignore .B .gitignore
list of files and wildcards to exclude from Mercurial operations list of files and wildcards to exclude from Git operations
.SH SEE ALSO .SH SEE ALSO
.IR codereview (1) .IR codereview (1)
.PP .PP
Unix's Unix's
\fIhg\fR(1), \fIgit\fR(1),
.HR http://www.selenic.com/mercurial/wiki/ .HR http://git-scm.com/doc
.PP .PP
.HR http://code.swtch.com/plan9port/ .HR http://code.swtch.com/plan9port/
.SH BUGS .SH BUGS
Plan 9 from User Space is no longer accessible using CVS; Plan 9 from User Space is no longer accessible using CVS or Mercurial;
you must use Mercurial. you must use Git.