Merge branch 'maint-1.7.11' into maint

* maint-1.7.11:
  Prepare for 1.7.11.6
  Make the ciabot scripts completely self-configuring in the normal case.
  Improved documentation for the ciabot scripts.
  man: git pull -r is a short for --rebase
  gitcli: describe abbreviation of long options
  rev-list docs: clarify --topo-order description
  Documentation/CodingGuidelines: spell out more shell guidelines
  Documentation: do not mention .git/refs/* directories
  tests: Introduce test_seq
This commit is contained in:
Junio C Hamano 2012-08-24 12:34:19 -07:00
commit 871e293c9a
19 changed files with 232 additions and 49 deletions

View file

@ -76,11 +76,19 @@ For shell scripts specifically (not exhaustive):
- We do not use Process Substitution <(list) or >(list).
- Do not write control structures on a single line with semicolon.
"then" should be on the next line for if statements, and "do"
should be on the next line for "while" and "for".
- We prefer "test" over "[ ... ]".
- We do not write the noiseword "function" in front of shell
functions.
- We prefer a space between the function name and the parentheses. The
opening "{" should also be on the same line.
E.g.: my_function () {
- As to use of grep, stick to a subset of BRE (namely, no \{m,n\},
[::], [==], nor [..]) for portability.

View file

@ -0,0 +1,34 @@
Git v1.7.11.6 Release Notes
===========================
Fixes since v1.7.11.5
---------------------
This is primarily documentation and low-impact code clarification.
- "ciabot" script (in contrib/) has been updated with extensive
documentation.
- The "--rebase" option to "git pull" can be abbreviated to "-r",
but we didn't document it.
- It was generally understood that "--long-option"s to many of our
subcommands can be abbreviated to the unique prefix, but it was not
easy to find it described for new readers of the documentation set.
- The "--topo-order", "--date-order" (and the lack of either means
the default order) options to "rev-list" and "log" family of
commands were poorly described in the documentation.
- Older parts of the documentation described as if having a regular
file in .git/refs/ hierarchy were the only way to have branches and
tags, which is not true for quite some time.
- A utility shell function test_seq has been added as a replacement
for the 'seq' utility found on some platforms.
- Fallback 'getpass' implementation made unportable use of stdio API.
- "git commit --amend" let the user edit the log message and then
died when the human-readable committer name was given
insufficiently by getpwent(3).

View file

@ -36,12 +36,12 @@ OPTIONS
--all::
Instead of using only the annotated tags, use any ref
found in `.git/refs/`. This option enables matching
found in `refs/` namespace. This option enables matching
any known branch, remote-tracking branch, or lightweight tag.
--tags::
Instead of using only the annotated tags, use any tag
found in `.git/refs/tags`. This option enables matching
found in `refs/tags` namespace. This option enables matching
a lightweight (non-annotated) tag.
--contains::

View file

@ -32,7 +32,8 @@ changes, which would normally have no effect. Nevertheless, this may be
useful in the future for compensating for some git bugs or such,
therefore such a usage is permitted.
*NOTE*: This command honors `.git/info/grafts` and `.git/refs/replace/`.
*NOTE*: This command honors `.git/info/grafts` file and refs in
the `refs/replace/` namespace.
If you have any grafts or replacement refs defined, running this command
will make them permanent.

View file

@ -23,8 +23,8 @@ OPTIONS
An object to treat as the head of an unreachability trace.
+
If no objects are given, 'git fsck' defaults to using the
index file, all SHA1 references in .git/refs/*, and all reflogs (unless
--no-reflogs is given) as heads.
index file, all SHA1 references in `refs` namespace, and all reflogs
(unless --no-reflogs is given) as heads.
--unreachable::
Print out objects that exist but that aren't reachable from any

View file

@ -48,7 +48,8 @@ $ gitk $(cd .git/lost-found/commit && echo ??*)
------------
After making sure you know which the object is the tag you are looking
for, you can reconnect it to your regular .git/refs hierarchy.
for, you can reconnect it to your regular `refs` hierarchy by using
the `update-ref` command.
------------
$ git cat-file -t 1ef2b196

View file

@ -14,7 +14,8 @@ DESCRIPTION
-----------
Traditionally, tips of branches and tags (collectively known as
'refs') were stored one file per ref under `$GIT_DIR/refs`
'refs') were stored one file per ref in a (sub)directory
under `$GIT_DIR/refs`
directory. While many branch tips tend to be updated often,
most tags and some branch tips are never updated. When a
repository has hundreds or thousands of tags, this
@ -22,13 +23,14 @@ one-file-per-ref format both wastes storage and hurts
performance.
This command is used to solve the storage and performance
problem by stashing the refs in a single file,
problem by storing the refs in a single file,
`$GIT_DIR/packed-refs`. When a ref is missing from the
traditional `$GIT_DIR/refs` hierarchy, it is looked up in this
traditional `$GIT_DIR/refs` directory hierarchy, it is looked
up in this
file and used if found.
Subsequent updates to branches always create new files under
`$GIT_DIR/refs` hierarchy.
`$GIT_DIR/refs` directory hierarchy.
A recommended practice to deal with a repository with too many
refs is to pack its refs with `--all --prune` once, and
@ -57,6 +59,15 @@ a repository with many branches of historical interests.
The command usually removes loose refs under `$GIT_DIR/refs`
hierarchy after packing them. This option tells it not to.
BUGS
----
Older documentation written before the packed-refs mechanism was
introduced may still say things like ".git/refs/heads/<branch> file
exists" when it means "branch <branch> exists".
GIT
---
Part of the linkgit:git[1] suite

View file

@ -101,6 +101,7 @@ include::merge-options.txt[]
:git-pull: 1
-r::
--rebase::
Rebase the current branch on top of the upstream branch after
fetching. If there is a remote-tracking branch corresponding to

View file

@ -14,14 +14,13 @@ SYNOPSIS
DESCRIPTION
-----------
Adds a 'replace' reference in `.git/refs/replace/`
Adds a 'replace' reference in `refs/replace/` namespace.
The name of the 'replace' reference is the SHA1 of the object that is
replaced. The content of the 'replace' reference is the SHA1 of the
replacement object.
Unless `-f` is given, the 'replace' reference must not yet exist in
`.git/refs/replace/` directory.
Unless `-f` is given, the 'replace' reference must not yet exist.
Replacement references will be used by default by all git commands
except those doing reachability traversal (prune, pack transfer and

View file

@ -20,11 +20,10 @@ SYNOPSIS
DESCRIPTION
-----------
Add a tag reference in `.git/refs/tags/`, unless `-d/-l/-v` is given
Add a tag reference in `refs/tags/`, unless `-d/-l/-v` is given
to delete, list or verify tags.
Unless `-f` is given, the tag to be created must not yet exist in the
`.git/refs/tags/` directory.
Unless `-f` is given, the named tag must not yet exist.
If one of `-a`, `-s`, or `-u <key-id>` is passed, the command
creates a 'tag' object, and requires a tag message. Unless

View file

@ -62,6 +62,14 @@ scripting git:
`git log -1 HEAD` but write `git log -1 HEAD --`; the former will not work
if you happen to have a file called `HEAD` in the work tree.
* many commands allow a long option "--option" to be abbreviated
only to their unique prefix (e.g. if there is no other option
whose name begins with "opt", you may be able to spell "--opt" to
invoke the "--option" flag), but you should fully spell them out
when writing your scripts; later versions of Git may introduce a
new option whose name shares the same prefix, e.g. "--optimize",
to make a short prefix that used to be unique no longer unique.
ENHANCED OPTION PARSER
----------------------

View file

@ -578,16 +578,33 @@ Commit Ordering
By default, the commits are shown in reverse chronological order.
--topo-order::
This option makes them appear in topological order (i.e.
descendant commits are shown before their parents).
--date-order::
Show no parents before all of its children are shown, but
otherwise show commits in the commit timestamp order.
This option is similar to '--topo-order' in the sense that no
parent comes before all of its children, but otherwise things
are still ordered in the commit timestamp order.
--topo-order::
Show no parents before all of its children are shown, and
avoid showing commits on multiple lines of history
intermixed.
+
For example, in a commit history like this:
+
----------------------------------------------------------------
---1----2----4----7
\ \
3----5----6----8---
----------------------------------------------------------------
+
where the numbers denote the order of commit timestamps, `git
rev-list` and friends with `--date-order` show the commits in the
timestamp order: 8 7 6 5 4 3 2 1.
+
With `--topo-order`, they would show 8 6 5 3 7 4 2 1 (or 8 7 4 2 6 5
3 1); some older commits are shown before newer ones in order to
avoid showing the commits from two parallel development track mixed
together.
--reverse::

54
contrib/ciabot/INSTALL Normal file
View file

@ -0,0 +1,54 @@
= Installation instructions =
Two scripts are included. The Python one (ciabot.py) is faster and
more capable; the shell one (ciabot.sh) is a fallback in case Python
gives your git hosting site indigestion. (I know of no such sites.)
It is no longer necessary to modify the script in order to put it
in place; in fact, this is now discouraged. It is entirely
configurable with the following git config variables:
ciabot.project = name of the project
ciabot.repo = name of the project repo for gitweb/cgit purposes
ciabot.xmlrpc = if true, ship notifications via XML-RPC
ciabot.revformat = format in which the revision is shown
The revformat variable may have the following values
raw -> full hex ID of commit
short -> first 12 chars of hex ID
describe -> describe relative to last tag, falling back to short
ciabot.project defaults to the directory name of the repository toplevel.
ciabot.repo defaults to ciabot.project lowercased.
ciabot.xmlrpc defaults to True
ciabot.revformat defaults to 'describe'.
This means that in the normal case you need not do any configuration at all,
however setting ciabot.project will allow the hook to run slightly faster.
Once you've set these variables, try your script with -n to see the
notification message dumped to stdout and verify that it looks sane.
To live-test these scripts, your project needs to have been registered with
the CIA site. Here are the steps:
1. Open an IRC window on irc://freenode/commits or your registered
project IRC channel.
2. Run ciabot.py and/or ciabot.sh from any directory under git
control.
You should see a notification on the channel for your most recent commit.
After verifying correct function, install one of these scripts either
in a post-commit hook or in an update hook.
In post-commit, run it without arguments. It will query for
current HEAD and the latest commit ID to get the information it
needs.
In update, call it with a refname followed by a list of commits:
You want to reverse the order git rev-list emits because it lists
from most recent to oldest.
/path/to/ciabot.py ${refname} $(git rev-list ${oldhead}..${newhead} | tac)

View file

@ -8,5 +8,4 @@ You probably want the Python version; it's faster, more capable, and
better documented. The shell version is maintained only as a fallback
for use on hosting sites that don't permit Python hook scripts.
You will find installation instructions for each script in its comment
header.
See the file INSTALL for installation instructions.

View file

@ -10,11 +10,9 @@
# usage: ciabot.py [-V] [-n] [-p projectname] [refname [commits...]]
#
# This script is meant to be run either in a post-commit hook or in an
# update hook. If there's nothing unusual about your hosting setup,
# you can specify the project name and repo with config variables and
# avoid having to modify this script. Try it with -n to see the
# notification mail dumped to stdout and verify that it looks
# sane. With -V it dumps its version and exits.
# update hook. Try it with -n to see the notification mail dumped to
# stdout and verify that it looks sane. With -V it dumps its version
# and exits.
#
# In post-commit, run it without arguments. It will query for
# current HEAD and the latest commit ID to get the information it
@ -27,12 +25,17 @@
# /path/to/ciabot.py ${refname} $(git rev-list ${oldhead}..${newhead} | tac)
#
# Configuration variables affecting this script:
# ciabot.project = name of the project (required)
#
# ciabot.project = name of the project
# ciabot.repo = name of the project repo for gitweb/cgit purposes
# ciabot.xmlrpc = if true (default), ship notifications via XML-RPC
# ciabot.revformat = format in which the revision is shown
#
# The ciabot.repo value defaults to ciabot.project lowercased.
# ciabot.project defaults to the directory name of the repository toplevel.
# ciabot.repo defaults to ciabot.project lowercased.
#
# This means that in the normal case you need not do any configuration at all,
# but setting the project name will speed it up slightly.
#
# The revformat variable may have the following values
# raw -> full hex ID of commit
@ -102,7 +105,7 @@
# Identify the generator script.
# Should only change when the script itself gets a new home and maintainer.
generator = "http://www.catb.org/~esr/ciabot.py"
version = "3.5"
version = "3.6"
def do(command):
return commands.getstatusoutput(command)[1]
@ -192,10 +195,17 @@ def report(refname, merged, xmlrpc=True):
print "ciabot.py: version", version
sys.exit(0)
# Cough and die if user has not specified a project
# The project variable defaults to the name of the repository toplevel.
if not project:
sys.stderr.write("ciabot.py: no project specified, bailing out.\n")
sys.exit(1)
here = os.getcwd()
while True:
if os.path.exists(os.path.join(here, ".git")):
project = os.path.basename(here)
break
elif here == '/':
sys.stderr.write("ciabot.py: no .git below root!\n")
sys.exit(1)
here = os.path.dirname(here)
if not repo:
repo = project.lower()

View file

@ -21,11 +21,9 @@
# usage: ciabot.sh [-V] [-n] [-p projectname] [refname commit]
#
# This script is meant to be run either in a post-commit hook or in an
# update hook. If there's nothing unusual about your hosting setup,
# you can specify the project name and repo with config variables and
# avoid having to modify this script. Try it with -n to see the
# notification mail dumped to stdout and verify that it looks
# sane. With -V it dumps its version and exits.
# update hook. Try it with -n to see the notification mail dumped to
# stdout and verify that it looks sane. With -V it dumps its version
# and exits.
#
# In post-commit, run it without arguments. It will query for
# current HEAD and the latest commit ID to get the information it
@ -44,11 +42,16 @@
# most recent to least - better to ship notifactions from oldest to newest.
#
# Configuration variables affecting this script:
# ciabot.project = name of the project (makes -p option unnecessary)
#
# ciabot.project = name of the project
# ciabot.repo = name of the project repo for gitweb/cgit purposes
# ciabot.revformat = format in which the revision is shown
#
# The ciabot.repo defaults to ciabot.project lowercased.
# ciabot.project defaults to the directory name of the repository toplevel.
# ciabot.repo defaults to ciabot.project lowercased.
#
# This means that in the normal case you need not do any configuration at all,
# but setting the project name will speed it up slightly.
#
# The revformat variable may have the following values
# raw -> full hex ID of commit
@ -64,10 +67,27 @@
# shpped from an update in their actual order.)
#
# The project as known to CIA. You can also hardwire this or set it with a
# -p option.
# The project as known to CIA. You can set this with a -p option,
# or let it default to the directory name of the repo toplevel.
project=$(git config --get ciabot.project)
if [ -z $project ]
then
here=`pwd`;
while :; do
if [ -d $here/.git ]
then
project=`basename $here`
break
elif [ $here = '/' ]
then
echo "ciabot.sh: no .git below root!"
exit 1
fi
here=`dirname $here`
done
fi
# Name of the repo for gitweb/cgit purposes
repo=$(git config --get ciabot.repo)
[ -z $repo] && repo=$(echo "${project}" | tr '[A-Z]' '[a-z]')
@ -100,7 +120,7 @@ urlprefix="http://${host}/cgi-bin/cgit.cgi/${repo}/commit/?id="
# Identify the script. The 'generator' variable should change only
# when the script itself gets a new home and maintainer.
generator="http://www.catb.org/~esr/ciabot/ciabot.sh"
version=3.4
version=3.5
# Addresses for the e-mail
from="CIABOT-NOREPLY@${hostname}"

View file

@ -163,7 +163,7 @@ test_perf () {
else
echo "perf $test_count - $1:"
fi
for i in $(seq 1 $GIT_PERF_REPEAT_COUNT); do
for i in $(test_seq 1 $GIT_PERF_REPEAT_COUNT); do
say >&3 "running: $2"
if test_run_perf_ "$2"
then

View file

@ -114,7 +114,7 @@ test -n "$GIT_TEST_LONG" && test_set_prereq EXPENSIVE
test_expect_success EXPENSIVE 'create 50,000 tags in the repo' '
(
cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
for i in `seq 50000`
for i in `test_seq 50000`
do
echo "commit refs/heads/too-many-refs"
echo "mark :$i"

View file

@ -530,6 +530,27 @@ test_cmp() {
$GIT_TEST_CMP "$@"
}
# Print a sequence of numbers or letters in increasing order. This is
# similar to GNU seq(1), but the latter might not be available
# everywhere (and does not do letters). It may be used like:
#
# for i in `test_seq 100`; do
# for j in `test_seq 10 20`; do
# for k in `test_seq a z`; do
# echo $i-$j-$k
# done
# done
# done
test_seq () {
case $# in
1) set 1 "$@" ;;
2) ;;
*) error "bug in the test script: not 1 or 2 parameters to test_seq" ;;
esac
"$PERL_PATH" -le 'print for $ARGV[0]..$ARGV[1]' -- "$@"
}
# This function can be used to schedule some commands to be run
# unconditionally at the end of the test to restore sanity:
#