Compare commits

...

866 Commits

Author SHA1 Message Date
4baff50551 GIT 1.3.0
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-18 13:15:18 -07:00
8f2b72a936 Add git-annotate(1) and git-blame(1)
[jc: with entries in git.txt]

Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-18 12:06:55 -07:00
f56ef54174 diff --stat: make sure to set recursive.
Just like "patch" format always needs recursive, "diffstat"
format does not make sense without setting recursive.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-18 11:29:33 -07:00
08ddd4f764 git-svnimport symlink support
added svn:special symlink support for access methods other than
direct-http

Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
Acked-by: Matthias Urlichs <smurf@smurf.noris.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-18 02:26:52 -07:00
2855d58079 packed_object_info_detail(): check for corrupt packfile.
Serge E. Hallyn noticed that we compute how many input bytes are
still left, but did not use it for sanity checking.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-17 17:46:07 -07:00
bb996614de cleanups: remove unused variable from exec_cmd.c
Not sure whether it should be removed, or whether
execv_git_cmd() should return it rather than -1 at bottom.

Signed-off-by: Serge E. Hallyn <serue@us.ibm.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-17 15:06:40 -07:00
dafc88b136 cleanups: prevent leak of two strduped strings in config.c
Config_filename and lockfile are strduped and then leaked in
git_config_set_multivar.

Signed-off-by: Serge E. Hallyn <serue@us.ibm.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-17 15:06:37 -07:00
ecc13e73cf cleanups: Remove impossible case in quote.c
The switch is inside an if statement which is false if
the character is ' '.  Either the if should be <=' '
instead of <' ', or the case should be removed as it could
be misleading.

Signed-off-by: Serge E. Hallyn <serue@us.ibm.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-17 15:06:25 -07:00
310f8b5b6d cleanups: Remove unused vars from combine-diff.c
Mod_type in particular sure looks like it wants to be used, but isn't.

Signed-off-by: Serge E. Hallyn <serue@us.ibm.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-17 15:06:16 -07:00
da2a95b2a8 cleanups: Fix potential bugs in connect.c
The strncmp for ACK was ACK does not include the final space.
Presumably either we should either remove the trailing space,
or compare 4 chars (as this patch does).

'path' is sometimes strdup'ed, but never freed.

Signed-off-by: Serge E. Hallyn <serue@us.ibm.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-17 15:05:33 -07:00
6feba7cb74 Merge branch 'jc/boundary'
* jc/boundary:
  rev-list --boundary: show boundary commits even when limited otherwise.
2006-04-17 15:03:11 -07:00
e190bc5543 Merge branch 'jc/bottomless'
* jc/bottomless:
  rev-list --bisect: limit list before bisecting.
2006-04-17 15:03:10 -07:00
360204c324 Allow empty lines in info/grafts
In addition to the existing comment support, that just allows the user
to use a convention that works pretty much everywhere else.

Signed-off-by: Yann Dirson <ydirson@altern.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-17 14:17:50 -07:00
1b65a5aa44 rev-list --boundary: show boundary commits even when limited otherwise.
The boundary commits are shown for UI like gitk to draw them as
soon as topo-order sorting allows, and should not be omitted by
get_revision() filtering logic.  As long as their immediate
child commits are shown, we should not filter them out.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-16 22:05:38 -07:00
e6bfaf3e33 Makefile fixups.
Signed-off-by: A Large Angry SCM <gitzilla@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-16 20:42:37 -07:00
1a17ee22a2 Merge git://git.kernel.org/pub/scm/gitk/gitk
* git://git.kernel.org/pub/scm/gitk/gitk:
  gitk: Fix bug caused by missing commitlisted elements
2006-04-16 18:59:30 -07:00
e7da347520 gitk: Fix bug caused by missing commitlisted elements
This bug was reported by Yann Dirson, and results in an 'Error:
expected boolean value but got ""' dialog when scrolling to the bottom
of the graph under some circumstances.  The issue is that git-rev-list
isn't outputting all the boundary commits when it is asked for commits
affecting only certain files.  We already cope with that by adding the
missing boundary commits in addextraid, but there we weren't adding a
0 to the end of the commitlisted list when we added the extra id to
the end of the displayorder list.

This fixes it by appending 0 to commitlisted in addextraid, thus keeping
commitlisted and displayorder in sync.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-04-17 10:27:59 +10:00
5bc4ce5896 reading $GIT_DIR/info/graft - skip comments correctly.
Noticed by Yann Dirson.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-16 14:24:56 -07:00
402461aab1 pager: do not fork a pager if PAGER is set to empty.
This skips an extra pipe, and helps debugging tremendously.

[jc: PAGER=cat is a questionable hack and should be done as a separate
patch. ]

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-16 01:40:04 -07:00
2935327394 diff-options: add --patch-with-stat
With this option, git prepends a diffstat in front of the patch.

Since I really, really do not know what a diffstat of a combined diff
("merge diff") should look like, the diffstat is not generated for these.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-15 19:30:27 -07:00
cbdda02404 diff-files --stat: do not dump core with unmerged index.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-15 19:22:48 -07:00
1cd95087c3 Support "git cmd --help" syntax
The "--help" argument is special, in that it is (along with "--version")
in that is taken by the "git" program itself rather than the sub-command,
and thus we've had the syntax "git --help cmd".

However, as anybody who has ever used CVS or some similar devil-spawn
program, it's confusing as h*ll when options before the sub-command act
differently from options after the sub-command, so this quick hack just
makes it acceptable to do "git cmd --help" instead, and get the exact same
result.

It may be hacky, but it's simple and does the trick.

Of course, this does not help if you use one of the non-builtin commands
without using the "git" helper. Ie you won't be getting a man-page just
because you do "git-rev-list --help". Don't expect us to be quite _that_
helpful.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-15 18:17:46 -07:00
6f4780f9df diff --stat: do not do its own three-dashes.
I missed that "git-diff-* --stat" spits out three-dash separator
on its own without being asked.  Remove it.

When we output commit log followed by diff, perhaps --patch-with-stat,
for downstream consumer, we _would_ want the three-dash between
the message and the diff material, but that logic belongs to the
caller, not diff generator.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-15 14:06:42 -07:00
5069b1cf61 diff-tree: typefix.
Recent diff_tree_setup_paths() update made it take a second
argument of type "struct diff_options", but we passed another
struct that happenes to have that type at the beginning by
mistake.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-15 03:22:00 -07:00
42b5c78845 GIT v1.3.0-rc4
I've merged everything I think is ready for 1.3.0, so this is
the final round -- hopefully I can release this with minimum
last-minute fixup as v1.3.0 early next week.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-14 23:21:34 -07:00
170abc81a0 Merge branch 'dl/xdiff'
* dl/xdiff:
  xdiff: post-process hunks to make them consistent.
2006-04-14 22:58:17 -07:00
afcb536f28 Merge branch 'js/diffstat'
* js/diffstat:
  diff --stat: no need to ask funcnames nor context.
  diff-options: add --stat (take 2)
  diff-options: add --stat (take 2)
2006-04-14 21:55:23 -07:00
a3cc31fb05 Merge branch 'jc/fix5500'
* jc/fix5500:
  t5500: test fix
2006-04-14 21:55:22 -07:00
4e1dc64009 rev-list --bisect: limit list before bisecting.
I noticed bisect does not work well without both good and bad.
Running this script in git.git repository would give you quite
different results:

	#!/bin/sh
        initial=e83c5163316f89bfbde7d9ab23ca2e25604af290

        mid0=`git rev-list --bisect ^$initial --all`

        git rev-list $mid0 | wc -l
        git rev-list ^$mid0 --all | wc -l

        mid1=`git rev-list --bisect --all`

        git rev-list $mid1 | wc -l
        git rev-list ^$mid1 --all | wc -l

The $initial commit is the very first commit you made.  The
first midpoint bisects things evenly as designed, but the latter
does not.

The reason I got interested in this was because I was wondering
if something like the following would help people converting a
huge repository from foreign SCM, or preparing a repository to
be fetched over plain dumb HTTP only:

        #!/bin/sh

        N=4
        P=.git/objects/pack
        bottom=

        while test 0 \< $N
        do
                N=$((N-1))
                if test -z "$bottom"
                then
                        newbottom=`git rev-list --bisect --all`
                else
                        newbottom=`git rev-list --bisect ^$bottom --all`
                fi
                if test -z "$bottom"
                then
                        rev_list="$newbottom"
                elif test 0 = $N
                then
                        rev_list="^$bottom --all"
                else
                        rev_list="^$bottom $newbottom"
                fi
                p=$(git rev-list --unpacked --objects $rev_list |
                    git pack-objects $P/pack)
                git show-index <$P/pack-$p.idx | wc -l
                bottom=$newbottom
        done

The idea is to pack older half of the history to one pack, then
older half of the remaining history to another, to continue a
few times, using finer granularity as we get closer to the tip.

This may not matter, since for a truly huge history, running
bisect number of times could be quite time consuming, and we
might be better off running "git rev-list --all" once into a
temporary file, and manually pick cut-off points from the
resulting list of commits.  After all we are talking about
"approximately half" for such an usage, and older history does
not matter much.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-14 21:52:50 -07:00
40c2fe003c Clean up trailing whitespace when pretty-printing commits
Partly because we've messed up and now have some commits with trailing
whitespace, but partly because this also just simplifies the code, let's
remove trailing whitespace from the end when pretty-printing commits.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-14 21:46:08 -07:00
cad1ed9535 "git cmd -h" for shell scripts.
Wrappers that use sh-setup took --help but not -h.  Noticed by
Sébastien Pierre.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-14 15:54:51 -07:00
e51c3b5006 git-log <diff-options> <paths> documentation
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-14 12:59:09 -07:00
e3a125a94d Retire git-log.sh (take #4)
Noticed by Johannes.  We do not install it anymore, but still have
been shipping the source, which was crazy.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-14 12:48:45 -07:00
5cf7e21fbc stripspace: incomplete line fix (take #2)
This fixes f4ee3eb689 breakage, which
added an extra trailing blank line after stripping trailing blank lines
by mistake.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-14 12:41:51 -07:00
7f732c632f t5500: test fix
Relying on eye-candy progress bar was fragile to begin with.
Run fetch-pack with -k option, and count the objects that are in
the pack that were transferred from the other end.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 22:28:06 -07:00
84981f9ad9 diff --stat: no need to ask funcnames nor context.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 21:35:54 -07:00
dfdcb558ec Fix-up previous expr changes.
The regexp on the right hand side of expr : operator somehow was
broken.

	expr 'z+pu:refs/tags/ko-pu' : 'z\+\(.*\)'

does not strip '+'; write 'z+\(.*\)' instead.

We probably should switch to shell based substring post 1.3.0;
that's not bashism but just POSIX anyway.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 19:05:38 -07:00
ece634d147 diff-options: add --stat (take 2)
... and a fix for an invalid free():


Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 16:50:02 -07:00
295ba2fb89 xdiff: post-process hunks to make them consistent. 2006-04-13 16:48:45 -07:00
d75f7952ef diff-options: add --stat (take 2)
Now, you can say "git diff --stat" (to get an idea how many changes are
uncommitted), or "git log --stat".

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 16:48:24 -07:00
f327dbced2 Shell utilities: Guard against expr' magic tokens.
Some words, e.g., `match', are special to expr(1), and cause strange
parsing effects.  Track down all uses of expr and mangle the arguments
so that this isn't a problem.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 16:45:48 -07:00
2283645b85 t3600-rm: skip failed-remove test when we cannot make an unremovable file.
When running t3600-rm test under fakeroot (or as root), we
cannot make a file unremovable with "chmod a-w .".  Detect this
case early and skip that test.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 11:57:57 -07:00
f43ba60e2c Use less memory in "git log"
This trivially avoids keeping the commit message data around after we
don't need it any more, avoiding a continually growing "git log" memory
footprint.

It's not a huge deal, but it's somewhat noticeable. For the current kernel
tree, doing a full "git log" I got

 - before: /usr/bin/time git log > /dev/null
	0.81user 0.02system 0:00.84elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
	0inputs+0outputs (0major+8851minor)pagefaults 0swaps

 - after: /usr/bin/time git log > /dev/null
	0.79user 0.03system 0:00.83elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
	0inputs+0outputs (0major+5039minor)pagefaults 0swaps

ie the touched pages dropped from 8851 to 5039. For the historic kernel
archive, the numbers are 18357->11037 minor page faults.

We could/should in theory free the commits themselves, but that's really a
lot harder, since during revision traversal we may hit the same commit
twice through different children having it as a parent, even after we've
shown it once (when that happens, we'll silently ignore it next time, but
we still need the "struct commit" to know).

And as the commit message data is clearly the biggest part of the commit,
this is the really easy 60% solution.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 11:26:56 -07:00
d53352422b git-log: do not output excess blank line between commits
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 00:26:21 -07:00
8c989ec528 Makefile: $(MAKE) check-docs
This target lists undocumented commands, and/or whose document
is not referenced from the main git documentation.

For now, there are some exceptions I added primarily because I
lack the energy to document them myself:

 - merge backends (we should really document them)
 - ssh-push/ssh-pull (does anybody still use them?)
 - annotate and blame (maybe after one of them eats the other ;-)

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 00:21:47 -07:00
c16e30c088 Documentation: add a couple of missing docs.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-13 00:21:06 -07:00
02376287ff Merge branch 'jc/combine' into next
* jc/combine:
  stripspace: make sure not to leave an incomplete line.
  git-commit: do not muck with commit message when no_edit is set.
  When showing a commit message, do not lose an incomplete line.
  Retire t5501-old-fetch-and-upload test.
  combine-diff: type fix.
2006-04-12 13:24:48 -07:00
3103c00520 Merge branch 'master' into jc/combine
* master:
  stripspace: make sure not to leave an incomplete line.
  git-commit: do not muck with commit message when no_edit is set.
  When showing a commit message, do not lose an incomplete line.
  Retire t5501-old-fetch-and-upload test.
2006-04-12 13:24:04 -07:00
8bc7574b63 combine-diff: type fix.
The variable hunk_end points at a line number, which is
represented as unsigned long by all the other variables.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-12 13:23:50 -07:00
f4ee3eb689 stripspace: make sure not to leave an incomplete line.
When dealing with a commit log message for human consumption, it
never makes sense to keep a log that ends with an incomplete
line, so make it a part of the clean-up process done by
git-stripspace.

Acked-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-12 13:10:27 -07:00
475443c848 git-commit: do not muck with commit message when no_edit is set.
Spotted by Linus and Darrin Thompson.  When we took a commit
message from -F <file> with an incomplete line, we appended "git
status" output, which ended up attaching a lone "#" at the end.

We still need the "do we have anything to commit?" check by
running "status" (which has to know what to do in different
cases with -i/-o/-a), but there is no point appending its output
to the proposed commit message given by the user.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-12 11:45:18 -07:00
684958ae61 When showing a commit message, do not lose an incomplete line. 2006-04-12 11:31:23 -07:00
5ca64e488f Retire t5501-old-fetch-and-upload test.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-11 16:35:39 -07:00
72c159f642 Merge branch 'jc/combine' into next
* jc/combine:
  combine-diff: fix hunks at the end (take #2).
  combine-diff: do not lose hunks with only deletion at end.
2006-04-11 14:34:59 -07:00
4da8cbc234 Merge branch 'jc/diff' into next
* jc/diff:
  blame and friends: adjust to multiple pathspec change.
  git log --full-diff
  tree-diff: do not assume we use only one pathspec
2006-04-11 14:34:53 -07:00
740659519e combine-diff: fix hunks at the end (take #2).
The previous round showed the delete-only hunks at the end, but
forgot to mark them interesting when they were.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-11 14:31:31 -07:00
8a470ebfa1 combine-diff: do not lose hunks with only deletion at end.
We used to lose hunks that appear at the end and have only
deletion.  This makes sure that the record beyond the end of
file (which holds such deletions) is examined.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-11 12:06:27 -07:00
b5b1442ac3 Merge branch 'ds/index' into next
* ds/index:
  Replace index() with strchr().
  Solaris 9 also wants our own unsetenv/setenv.
  Retire git-log.sh (take #3)
2006-04-11 11:52:36 -07:00
55275b3812 Merge branch 'jc/withraw' into next
* jc/withraw:
  Separate the raw diff and patch with a newline
  Document --patch-with-raw
2006-04-11 11:52:01 -07:00
ef9e58c826 Replace index() with strchr().
strchr() is more portable than index() and is used everywhere in
git already.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-11 11:45:37 -07:00
40d88d4fa3 Solaris 9 also wants our own unsetenv/setenv.
[jc: the original had "index() is evil" but that should be a
separate patch.]
2006-04-11 11:42:26 -07:00
f94fbbee90 Retire git-log.sh (take #3)
Do not install built-in commands as separate files -- use
hardlinks instead.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-11 11:29:36 -07:00
90c1b08c7d Separate the raw diff and patch with a newline
More friendly for human reading I believe, and possibly friendlier to some
parsers (although only by an epsilon).

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-11 11:17:50 -07:00
5c91da25d7 Document --patch-with-raw
Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-11 11:16:51 -07:00
8fcd4218c6 Merge branch 'eb/apply' into next
* eb/apply:
  Implement limited context matching in git-apply.
2006-04-10 19:45:30 -07:00
6b32ee2381 Merge branch 'jc/withraw' into next
* jc/withraw:
  diff-* --patch-with-raw
  Retire git-log.sh (take#2)
  Retire git-log.sh
  Retire diffcore-pathspec.
  Improve the git-diff-tree -c/-cc documentation
2006-04-10 19:44:35 -07:00
86ff1d2012 diff-* --patch-with-raw
This new flag outputs the diff-raw output and diff-patch output
at the same time.  Requested by Cogito.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-10 19:44:18 -07:00
4749588713 Implement limited context matching in git-apply.
Ok this really should be the good version.  The option
handling has been reworked to be automation safe.

Currently to import the -mm tree I have to work around
git-apply by using patch.  Because some of Andrews
patches in quilt will only apply with fuzz.

I started out implementing a --fuzz option and then I realized
fuzz is not a very safe concept for an automated system.  What
you really want is a minimum number of context lines that must
match.  This allows policy to be set without knowing how many
lines of context a patch actually provides.   By default
the policy remains to match all provided lines of context.

Allowng git-apply to match a restricted set of context makes
it much easier to import the -mm tree into git.  I am still only
processing  1.5 to 1.6 patches a second for the 692 patches in
2.6.17-rc1-mm2 is still painful but it does help.

If I just loop through all of Andrews patches in order
and run git-apply --index -C1 I process the entire patchset
in 1m53s or about 6 patches per second.  So running
git-mailinfo, git-write-tree, git-commit-tree, and
git-update-ref everytime has a measurable impact,
and shows things can be speeded up even more.

All of these timings were taking on my poor 700Mhz Athlon
with 512MB of ram.  So people with fast machiens should
see much better performance.

When a match is found after the number of context are reduced a
warning is generated.  Since this is a rare event and possibly
dangerous this seems to make sense.  Unless you are patching
a single file the error message is a little bit terse at
the moment, but it should be easy to go back and fix.

I have also updated the documentation for git-apply to reflect
the new -C option that sets the minimum number of context
lines that must match.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-10 19:44:08 -07:00
944e3a88fe Retire git-log.sh (take#2)
... and install a replacement properly.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-10 19:40:59 -07:00
c4e05b1a22 blame and friends: adjust to multiple pathspec change.
This makes things that include revision.h build again.

Blame is also built, but I am not sure how well it works (or how
well it worked to begin with) -- it was relying on tree-diff to
be using whatever pathspec was used the last time, which smells
a bit suspicious.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-10 19:17:31 -07:00
91730800e9 Retire git-log.sh
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-10 17:52:17 -07:00
477f2b4131 git log --full-diff
Without this flag, "git log -p paths..." shows commits that
touch the specified paths, and diffs about the same specified
paths.  With this, the full diff is shown for commits that touch
the specified paths.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-10 16:45:19 -07:00
a8baa7b9f5 tree-diff: do not assume we use only one pathspec
The way tree-diff was set up assumed we would use only one set
of pathspec during the entire life of the program.  Move the
pathspec related static variables out to diff_options structure
so that we can filter commits with one set of paths while show
the actual diffs using different set of paths.

I suspect this breaks blame.c, and makes "git log paths..." to
default to the --full-diff, the latter of which is dealt with
the next commit.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-10 16:45:19 -07:00
6d46a23bf6 Merge branch 'master' into jc/diff
* master:
  Make "--parents" logs also be incremental
  Retire diffcore-pathspec.
  Improve the git-diff-tree -c/-cc documentation
2006-04-10 16:44:59 -07:00
5910e99775 Merge branch 'lt/rev'
* lt/rev:
  Make "--parents" logs also be incremental
2006-04-10 15:58:41 -07:00
77882f60d9 Retire diffcore-pathspec.
Nobody except diff-stages used it -- the callers instead filtered
the input to diffcore themselves.  Make diff-stages do that as
well and retire diffcore-pathspec.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-10 15:57:24 -07:00
a13ba129cd Improve the git-diff-tree -c/-cc documentation
This tries to clarify the -c/-cc documentation and clean up the style and
grammar.

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-09 11:11:19 -07:00
910a5916b4 Merge branch 'jc/diff' into next
* jc/diff:
  git log [diff-tree options]...
  log-tree: separate major part of diff-tree.
2006-04-09 02:07:33 -07:00
52b70d56bd git log [diff-tree options]...
And this makes "git log" to take common diff-tree options, so
that it can be used as "git whatchanged".

The recent revision walker updates by Linus to make path
limiting low-latency helps this quite a bit.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-09 01:59:03 -07:00
5f1c3f07b7 log-tree: separate major part of diff-tree.
This separates out the part that deals with one-commit diff-tree
(and --stdin form) into a separate log-tree module.

There are two goals with this.  The more important one is to be
able to make this part available to "git log --diff", so that we
can have a native "git whatchanged" command.  Another is to
simplify the commit log generation part simpler.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-09 01:35:13 -07:00
3381c790e5 Make "--parents" logs also be incremental
The parent rewriting feature caused us to create the whole history in one
go, and then simplify it later, because of how rewrite_parents() had been
written. However, with a little tweaking, it's perfectly possible to do
even that one incrementally.

Right now, this doesn't really much matter, because every user of
"--parents" will probably generally _also_ use "--topo-order", which will
cause the old non-incremental behaviour anyway. However, I'm hopeful that
we could make even the topological sort incremental, or at least
_partially_ so (for example, make it incremental up to the first merge).

In the meantime, this at least moves things in the right direction, and
removes a strange special case.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-08 23:37:21 -07:00
0ed49a3ed9 xdiff/xdiffi.c: fix warnings about possibly uninitialized variables
Compiling this module gave the following warnings (some double dutch!):

xdiff/xdiffi.c: In functie 'xdl_recs_cmp':
xdiff/xdiffi.c:298: let op: 'spl.i1' may be used uninitialized in this function
xdiff/xdiffi.c:298: let op: 'spl.i2' may be used uninitialized in this function
xdiff/xdiffi.c:219: let op: 'fbest1' may be used uninitialized in this function
xdiff/xdiffi.c:219: let op: 'bbest1' may be used uninitialized in this function

A superficial tracking of their usage, without deeper knowledge about the
algorithm, indeed confirms that there are code paths on which these
variables will be used uninitialized. In practice these code paths might never
be reached, but then these fixes will not change the algorithm. If these
code paths are ever reached we now at least have a predictable outcome. And
should the very small performance impact of these initializations be
noticeable, then they should at least be replaced by comments why certain
code paths will never be reached.

Some extra initializations in this patch now fix the warnings.
2006-04-08 23:35:22 -07:00
fc5807190e diffcore-rename: fix merging back a broken pair.
When a broken pair is matched up by rename detector to be merged
back, we do not want to say it is "dissimilar" with the
similarity index.  The output should just say they were changed,
taking the break score left by the earlier diffcore-break run if
any.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-08 20:32:41 -07:00
a041d94f29 diff: fix output of total-rewrite diff.
We did not read in the file data before emitting the
total-rewrite diff.  Noticed by Pasky.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-08 20:32:40 -07:00
f0853837d6 git-log: match rev-list --abbrev and --abbrev-commit
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-08 20:32:40 -07:00
ad0b46bf4a Merge branch 'master' into next
* master:
  GIT 1.3.0-rc3
2006-04-07 18:03:07 -07:00
a0a01958d7 GIT 1.3.0-rc3
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-07 18:02:40 -07:00
a906ce6aa7 Merge branch 'kh/svn'
* kh/svn:
  git-svnimport: Don't assume that copied files haven't changed
2006-04-07 18:01:55 -07:00
90238fbe43 Merge branch 'jc/thinpack'
* jc/thinpack:
  Thin pack generation: optimization.
2006-04-07 18:00:16 -07:00
9f2700cacd Merge branch 'jc/date'
* jc/date:
  date parsing: be friendlier to our European friends.
2006-04-07 18:00:06 -07:00
028e0491c0 Merge branch 'nh/http'
* nh/http:
  Fix compile with expat, but an old curl version
  http-fetch: add optional DAV-based pack list
2006-04-07 17:59:36 -07:00
f1fffec77e Merge branch 'ew/rev-abbrev'
* ew/rev-abbrev:
  rev-list --abbrev-commit
2006-04-07 17:59:10 -07:00
45fa7608bd Merge branch 'jc/blame'
* jc/blame:
  blame -S <ancestry-file>
  Match ofs/cnt types in diff interface.
  blame: use built-in xdiff
  combine-diff: move the code to parse hunk-header into common library.
  combine-diff: refactor built-in xdiff interface.
  combine-diff: use built-in xdiff.
2006-04-07 17:57:46 -07:00
1b25fd191d Merge branch 'master' into next
* master:
  gitk: Fix incorrect invocation of getmergediffline
  [PATCH] gitk: Fix searching for filenames in gitk
  count-delta: match get_delta_hdr_size() changes.
  check patch_delta bounds more carefully
2006-04-07 16:53:06 -07:00
d69dc373cb Merge git://git.kernel.org/pub/scm/gitk/gitk
* git://git.kernel.org/pub/scm/gitk/gitk:
  gitk: Fix incorrect invocation of getmergediffline
  [PATCH] gitk: Fix searching for filenames in gitk
2006-04-07 16:52:59 -07:00
ce18135d86 Merge branch 'maint'
* maint:
  count-delta: match get_delta_hdr_size() changes.
  check patch_delta bounds more carefully
2006-04-07 16:51:55 -07:00
98cf815607 count-delta: match get_delta_hdr_size() changes.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-07 16:48:09 -07:00
8960844a78 check patch_delta bounds more carefully
Let's avoid going south with invalid delta data.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-07 16:31:20 -07:00
0ba9ea97e2 Merge branch 'jc/thinpack' into next
* jc/thinpack:
  Thin pack generation: optimization.
2006-04-07 02:13:20 -07:00
fcedc5a986 Merge branch 'ew/rev-abbrev' into next
* ew/rev-abbrev:
  rev-list --abbrev-commit
2006-04-07 02:12:55 -07:00
dd4bca39ec Merge branch 'jc/blame' into next
* jc/blame:
  blame -S <ancestry-file>
  Match ofs/cnt types in diff interface.
2006-04-07 02:12:48 -07:00
38b525e09f Merge branch 'kh/svn' into next
* kh/svn:
  git-svnimport: Don't assume that copied files haven't changed
  Add Documentation/technical/pack-format.txt
  Added Packing Heursitics IRC writeup.
  Add documentation for git-imap-send.
2006-04-07 02:12:18 -07:00
e67c66251a git-svnimport: Don't assume that copied files haven't changed
Don't assume that a file that SVN claims was copied from somewhere
else is bit-for-bit identical with its parent, since SVN allows
changes to copied files before they are committed.

Without this fix, such copy-modify-commit operations causes the
imported file to lack the "modify" part -- that is, we get subtle data
corruption.

Signed-off-by: Karl Hasselström <kha@treskal.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-07 02:11:33 -07:00
5c51c98502 rev-list --abbrev-commit
This should make --pretty=oneline a whole lot more readable for
people using 80-column terminals.  Originally from Eric Wong.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-07 02:09:18 -07:00
5379a5c5ee Thin pack generation: optimization.
Jens Axboe noticed that recent "git push" has become very slow
since we made --thin transfer the default.

Thin pack generation to push a handful revisions that touch
relatively small number of paths out of huge tree was stupid; it
registered _everything_ from the excluded revisions.  As a
result, "Counting objects" phase was unnecessarily expensive.

This changes the logic to register the blobs and trees from
excluded revisions only for paths we are actually going to send
to the other end.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-07 02:08:38 -07:00
9760662f1a Add Documentation/technical/pack-format.txt
... along with the previous one, pack-heuristics, by popular
demand.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-07 02:07:40 -07:00
b116b297a8 Added Packing Heursitics IRC writeup.
Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-07 02:06:18 -07:00
5040f17eba blame -S <ancestry-file>
This adds the -S <ancestry-file> option to blame, which is
needed by the CVS server emulation.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-07 01:59:51 -07:00
a0fd31463b Match ofs/cnt types in diff interface.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-06 22:29:55 -07:00
454a35b847 Add documentation for git-imap-send.
Signed-off-by: Mike McCormack <mike@codeweavers.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 20:48:40 -07:00
2db70f684a Merge branch 'master' into next
* master:
  blame.c: fix completely broken ancestry traversal.
2006-04-05 18:22:19 -07:00
ba3c93743a blame.c: fix completely broken ancestry traversal.
Recent revision.c updates completely broken the assignment of
blames by not rewriting commit->parents field unless explicitly
asked to by the caller.  The caller needs to set revs.parents.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 18:21:17 -07:00
c5a4c4debe gitk: Fix incorrect invocation of getmergediffline
Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-04-06 10:20:03 +10:00
3754354125 [PATCH] gitk: Fix searching for filenames in gitk
findcont should not accept any arguments.

Signed-off-by: Pavel Roskin <proski@gnu.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-04-06 10:19:23 +10:00
9cda21defb Merge branch 'jc/date' into next
* jc/date:
  date parsing: be friendlier to our European friends.
  Tweaks to make asciidoc play nice.
  git-commit: document --amend
  Avoid a crash if realloc returns a different pointer.
  Avoid a divide by zero if there's no messages to send.
  [PATCH] Provide configurable UI font for gitk
  [PATCH] gitk: Use git wrapper to run git-ls-remote.
  [PATCH] gitk: add key bindings for selecting first and last commit
  gitk: Add a help menu item to display key bindings
  [PATCH] gitk: allow goto heads
  gitk: replace parent and children arrays with lists
2006-04-05 15:47:29 -07:00
38035cf4a5 date parsing: be friendlier to our European friends.
This does three things, only applies to cases where the user
manually tries to override the author/commit time by environment
variables, with non-ISO, non-2822 format date-string:

 - Refuses to use the interpretation to put the date in the
   future; recent kernel history has a commit made with
   10/03/2006 which is recorded as October 3rd.

 - Adds '.' as the possible year-month-date separator.  We
   learned from our European friends on the #git channel that
   dd.mm.yyyy is the norm there.

 - When the separator is '.', we prefer dd.mm.yyyy over
   mm.dd.yyyy; otherwise mm/dd/yy[yy] takes precedence over
   dd/mm/yy[yy].

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 15:47:17 -07:00
6cbd5d7d79 Tweaks to make asciidoc play nice.
Once the content has been generated, the formatting elves can reorder
it to be pretty...

Signed-off-by: Francis Daly <francis@daoine.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 15:46:54 -07:00
1b83ace35e Merge branch 'jc/blame' into next
* jc/blame:
  blame: use built-in xdiff
2006-04-05 14:26:00 -07:00
806d097e6b Merge branch 'nh/http' into next
* nh/http:
  Fix compile with expat, but an old curl version
2006-04-05 14:25:57 -07:00
f2f880f537 blame: use built-in xdiff
This removes the last use of external diff from core git suite.
Also addresses the use of index() -- elsewhere we tend to use
strchr().

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 14:25:25 -07:00
ae5d8470f6 git-commit: document --amend
The "--amend" option is used to amend the tip of the current branch. This
documentation text was copied straight from the commit that implemented it.

Some minor format tweaks for asciidoc were taken from work by Francis Daly
in commit b0d08a5.. It looks good now also in the html page.

[jc: amended further to follow the recommendation by Francis in
commit 3070b60].

Signed-off-by: Marco Roeland <marco.roeland@xs4all.nl>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 14:07:21 -07:00
3ffe0c245f Merge branch 'jc/clone'
* jc/clone:
  git-clone: fix handling of upsteram whose HEAD does not point at master.
2006-04-05 14:06:50 -07:00
9b6891f651 Merge branch 'pb/regex'
* pb/regex:
  On some platforms, certain headers need to be included before regex.h
  Support for pickaxe matching regular expressions
2006-04-05 14:06:26 -07:00
34c5a9e284 Avoid a crash if realloc returns a different pointer.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 13:00:07 -07:00
1cd88cc9e6 Avoid a divide by zero if there's no messages to send.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 13:00:03 -07:00
459a21bd35 Fix compile with expat, but an old curl version
With an old curl version, git-http-push is not compiled. But git-http-fetch
still needs to be linked with expat if NO_EXPAT is not defined.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 12:49:56 -07:00
521a3f6767 Merge git://git.kernel.org/pub/scm/gitk/gitk
* git://git.kernel.org/pub/scm/gitk/gitk:
  [PATCH] Provide configurable UI font for gitk
  [PATCH] gitk: Use git wrapper to run git-ls-remote.
  [PATCH] gitk: add key bindings for selecting first and last commit
  gitk: Add a help menu item to display key bindings
  [PATCH] gitk: allow goto heads
  gitk: replace parent and children arrays with lists
2006-04-05 12:45:17 -07:00
d6102b53c8 Merge branch 'jc/combine' into next
* jc/combine:
  combine-diff: move the code to parse hunk-header into common library.
2006-04-05 12:25:03 -07:00
c1e335a43f combine-diff: move the code to parse hunk-header into common library.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 12:22:35 -07:00
b4196cf70a Merge branches 'master' and 'jc/combine' into next
* master:
  Add git-clean command
  diff_flush(): leakfix.
  parse_date(): fix parsing 03/10/2006

* jc/combine:
  combine-diff: refactor built-in xdiff interface.
2006-04-05 02:58:14 -07:00
c3b831bd84 Add git-clean command
This command removes untracked files from the working tree.  This
implementation is based on cg-clean with some simplifications.  The
documentation is included.

[jc: with trivial documentation fix, noticed by Jakub Narebski]

Signed-off-by: Pavel Roskin <proski@gnu.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 02:51:27 -07:00
12d81ce598 Merge branch 'fix'
* fix:
  diff_flush(): leakfix.
  parse_date(): fix parsing 03/10/2006
2006-04-05 02:50:54 -07:00
7d6c447145 diff_flush(): leakfix.
We were leaking filepairs when output-format was set to
NO_OUTPUT.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 02:48:41 -07:00
d9ea73e056 combine-diff: refactor built-in xdiff interface.
This refactors the line-by-line callback mechanism used in
combine-diff so that other programs can reuse it more easily.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-05 02:09:58 -07:00
fa0cdab537 parse_date(): fix parsing 03/10/2006
The comment associated with the date parsing code for three
numbers separated with slashes or dashes implied we wanted to
interpret using this order:

	yyyy-mm-dd
	yyyy-dd-mm
	mm-dd-yy
	dd-mm-yy

However, the actual code had the last two wrong, and making it
prefer dd-mm-yy format over mm-dd-yy.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 23:00:18 -07:00
110cb41cbf Merge branch 'nh/http' into next
* nh/http:
  http-fetch: add optional DAV-based pack list
  cvsimport: use git-update-ref when updating
2006-04-04 18:13:54 -07:00
8d9fbe57b3 http-fetch: add optional DAV-based pack list
If git is not built with NO_EXPAT, this patch changes git-http-fetch to
attempt using DAV to get a list of remote packs and fall back to using
objects/info/packs if the DAV request fails.

Signed-off-by: Nick Hengeveld <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 18:06:35 -07:00
4840be66b1 [PATCH] Provide configurable UI font for gitk
This makes the font used in the UI elements of gitk configurable in the
same way the other fonts are. The default fonts used in the Xft build of
tk8.5 are particularily horrific, making this change more important
there.

Signed-off-by: Keith Packard <keithp@neko.keithp.com>
Acked-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-04-05 10:29:47 +10:00
ce08872259 [PATCH] gitk: Use git wrapper to run git-ls-remote.
For some reason, the Cygwin Tcl's `exec' command has trouble running
scripts.  Fix this by using the C `git' wrapper.  Other GIT programs run
by gitk are written in C already, so we don't need to incur a
performance hit of going via the wrapper (which I'll bet isn't pretty
under Cygwin).

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Acked-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-04-05 10:28:34 +10:00
6e5f7203de [PATCH] gitk: add key bindings for selecting first and last commit
For a keyboard addict like me some keys are still missing from
gitk. Especially a key to select a commit when no commit is selected,
like just after startup. While we're at it, complete the bindings for
moving the view seperately from the selected line. Currently, the up
and down keys act on the selected line while pageup and pagedown act
on the commits viewed.

The idea is to have to normal keys change the selected line:
  - Home selects first commit
  - End selects last commit
  - Up selects previous commit
  - Down selects next commit
  - PageUp moves selected line one page up
  - PageDown moves selected line one page down
...and together with the Control key, it moves the commits view:
  - Control-Home views first page of commits
  - Control-End views last page of commits
  - Control-Up moves commit view one line up
  - Control-Down moves commit view one line down
  - Control-PageUp moves commit view one page up
  - Control-PageDown moves commit view one page down

Signed-off-By: Rutger Nijlunsing <gitk@tux.tmfweb.nl>

and with some cleanups and simplifications...
Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-04-05 10:24:03 +10:00
afb28f239f Merge branch 'pb/regex' into next
* pb/regex:
  On some platforms, certain headers need to be included before regex.h
2006-04-04 17:15:02 -07:00
46b8dec038 On some platforms, certain headers need to be included before regex.h
Happily, these are already included in cache.h, which is included anyway...
so: change the order of includes.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 17:14:06 -07:00
42277bc81c cvsimport: use git-update-ref when updating
This simplifies code, and also fixes a subtle bug: when importing in a
shared repository, where another user last imported from CVS, cvsimport
used to complain that it could not open <branch> for update.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 17:13:25 -07:00
4e95e1f738 gitk: Add a help menu item to display key bindings
Suggested by Paul Schulz.  I made it a separate entry under the Help
menu rather than putting it in the About box, though.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-04-05 09:39:51 +10:00
e100712968 [PATCH] gitk: allow goto heads
This patch allows you to enter a head name in the SHA1 id: field.

It also removes some unnecessary global declarations.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-04-05 09:14:02 +10:00
ca3874a470 Merge branch 'jc/combine' into next
* jc/combine:
  combine-diff: use built-in xdiff.
  GIT 1.3.0-rc2
  Set HTTP user agent to git/GIT_VERSION
  git-ls-remote: send no-cache header when fetching info/refs
2006-04-04 15:00:34 -07:00
f23fc773a2 combine-diff: use built-in xdiff.
Now there is no GNU diff invocations, except the one from
blame.c

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 14:53:43 -07:00
fc4c4cd21c GIT 1.3.0-rc2
Bunch of cleanups with a few notable enhancements since
1.3.0-rc1:

 - revision traversal infrastructure is updated so that
   existence of paths limiters and/or --max-age does not cause
   it to call limit_list().  This helps the latency working with
   the command quite a bit.

 - comes with updated gitk.

One notable fix is to make sure that the IO is restarted upon
signal even on platforms whose default signal semantics is not
to do so.  This is the fix for the notorious "clone is broken
since 1.2.2 on Solaris" problem.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 14:52:53 -07:00
3d9c54d7b3 Merge in xdiff cleanup pieces 2006-04-04 14:43:57 -07:00
20fc9bc5e4 Set HTTP user agent to git/GIT_VERSION
Useful for diagnostics/troubleshooting to know which client versions are
hitting your server.

Signed-off-by: Nick Hengeveld <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 14:42:47 -07:00
7fa8ddd6e2 git-ls-remote: send no-cache header when fetching info/refs
Proxies should not cache this file as it can cause a client to end up with
a stale version, as reported here:

http://marc.theaimsgroup.com/?l=git&m=114407944125389

Signed-off-by: Nick Hengeveld <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 14:36:22 -07:00
46e48c3604 Merge branch 'pb/regex' into next
* pb/regex:
  Support for pickaxe matching regular expressions
2006-04-04 13:45:29 -07:00
d01d8c6782 Support for pickaxe matching regular expressions
git-diff-* --pickaxe-regex will change the -S pickaxe to match
POSIX extended regular expressions instead of fixed strings.

The regex.h library is a rather stupid interface and I like pcre too, but
with any luck it will be everywhere we will want to run Git on, it being
POSIX.2 and all. I'm not sure if we can expect platforms like AIX to
conform to POSIX.2 or if win32 has regex.h. We might add a flag to
Makefile if there is a portability trouble potential.

Signed-off-by: Petr Baudis <pasky@suse.cz>
2006-04-04 13:44:15 -07:00
810e152375 Merge branch 'pe/cleanup'
* pe/cleanup:
  Replace xmalloc+memset(0) with xcalloc.
  Use blob_, commit_, tag_, and tree_type throughout.
2006-04-04 13:43:00 -07:00
4c61b7d15a Merge branch 'lt/fix-sol-pack'
* lt/fix-sol-pack:
  Use sigaction and SA_RESTART in read-tree.c; add option in Makefile.
  safe_fgets() - even more anal fgets()
  pack-objects: be incredibly anal about stdio semantics
  Fix Solaris stdio signal handling stupidities
2006-04-04 13:42:02 -07:00
00cbdec981 Merge branch 'pe/cleanup' into next
* pe/cleanup:
  Replace xmalloc+memset(0) with xcalloc.
  Use blob_, commit_, tag_, and tree_type throughout.
2006-04-04 00:23:36 -07:00
b411fda15d Merge early part of 'jc/combine' branch 2006-04-04 00:21:50 -07:00
90321c106c Replace xmalloc+memset(0) with xcalloc.
Signed-off-by: Peter Eriksen <s022018@student.dtu.dk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 00:11:19 -07:00
8e44025925 Use blob_, commit_, tag_, and tree_type throughout.
This replaces occurences of "blob", "commit", "tag", and "tree",
where they're really used as type specifiers, which we already
have defined global constants for.

Signed-off-by: Peter Eriksen <s022018@student.dtu.dk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 00:11:19 -07:00
ca557afff9 Clean-up trivially redundant diff.
Also corrects the line numbers in unified output when using
zero lines context.
2006-04-04 00:11:09 -07:00
fc9957b005 contrib/git-svn: handle array values correctly
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 00:09:47 -07:00
5f2f424002 contrib/git-svn: make sure our git-svn is up-to-date for test
Bugs like the last one could've been avoided if it weren't for
this...

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 00:09:45 -07:00
5941a9e9d8 contrib/git-svn: ensure repo-config returns a value before using it
fetching from repos without an authors-file defined was broken.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-04 00:09:42 -07:00
7941602983 Merge branch 'lt/fix-sol-pack' into next
* lt/fix-sol-pack:
  Use sigaction and SA_RESTART in read-tree.c; add option in Makefile.
  safe_fgets() - even more anal fgets()
2006-04-03 23:43:16 -07:00
72fdfb50f7 Use sigaction and SA_RESTART in read-tree.c; add option in Makefile.
Might as well ape the sigaction change in read-tree.c to avoid
the same potential problems.  The fprintf status output will
be overwritten in a second, so don't bother guarding it.  Do
move the fputc after disabling SIGALRM to ensure we go to the
next line, though.

Also add a NO_SA_RESTART option in the Makefile in case someone
doesn't have SA_RESTART but does restart (maybe older HP/UX?).
We want the builder to chose this specifically in case the
system both lacks SA_RESTART and does not restart stdio calls;
a compat #define in git-compat-utils.h would silently allow
broken systems.

Signed-off-by: Jason Riedy <ejr@cs.berkeley.edu>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-03 23:42:25 -07:00
687dd75c95 safe_fgets() - even more anal fgets()
This is from Linus -- the previous round forgot to clear error
after EINTR case.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-03 23:42:25 -07:00
1bdbb57407 Merge branch 'jc/clone' into next
* jc/clone:
  git-clone: fix handling of upsteram whose HEAD does not point at master.
  fix repacking with lots of tags
  Documentation: revise top of git man page
2006-04-02 22:23:49 -07:00
c72112e6e1 git-clone: fix handling of upsteram whose HEAD does not point at master.
When cloning from a remote repository that has master, main, and
origin branches _and_ with the HEAD pointing at main branch, we
did quite confused things during clone.  So this cleans things
up.  The behaviour is a bit different between separate remotes/
layout and the mixed branches layout.

The newer layout with $GIT_DIR/refs/remotes/$origin/, things are
simpler and more transparent:

 - remote branches are copied to refs/remotes/$origin/.

 - HEAD points at the branch with the same name as the remote
   HEAD points at, and starts at where the remote HEAD points at.

 - $GIT_DIR/remotes/$origin file is set up to fetch all remote
   branches, and merge the branch HEAD pointed at at the time of
   the cloning.

Everything-in-refs/heads layout was the more confused one, but
cleaned up like this:

 - remote branches are copied to refs/heads, but the branch
   "$origin" is not copied, instead a copy of the branch the
   remote HEAD points at is created there.

 - HEAD points at the branch with the same name as the remote
   HEAD points at, and starts at where the remote HEAD points at.

 - $GIT_DIR/remotes/$origin file is set up to fetch all remote
   branches except "$origin", and merge the branch HEAD pointed
   at at the time of the cloning.

With this, the remote has master, main and origin, and its HEAD
points at main, you could:

	git clone $URL --origin upstream

to use refs/heads/upstream as the tracking branch for remote
"main", and your primary working branch will also be "main".
"master" and "origin" are used to track the corresponding remote
branches and with this setup they do not have any special meaning.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-02 22:22:27 -07:00
40e907bff2 fix repacking with lots of tags
Use git-rev-list's --all instead of git-rev-parse's to keep from
hitting the shell's argument list length limits when repacking
with lots of tags.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-02 21:25:57 -07:00
23091e954c Documentation: revise top of git man page
I'm afraid I'll be accused of trying to suck all the jokes and the
personality out of the git documentation.  I'm not!  Really!

That said, "man git" is one of the first things a new user is likely try,
and it seems a little cruel to start off with a somewhat obscure joke
about the architecture of git.

So instead I'm trying for a relatively straightforward description of what
git does, and what features distinguish it from other systems, together
with immediate links to introductory documentation.

I also did some minor reorganization in an attempt to clarify the
classification of commands.  And revised a bit for conciseness (as is
obvious from the diffstat--hopefully I didn't cut anything important).

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-02 21:17:32 -07:00
f0c979f4db Merge branch 'lt/fix-sol-pack' into next
* lt/fix-sol-pack:
  pack-objects: be incredibly anal about stdio semantics
  Fix Solaris stdio signal handling stupidities

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-02 13:54:28 -07:00
da93d12b00 pack-objects: be incredibly anal about stdio semantics
This is the "letter of the law" version of using fgets() properly in the
face of incredibly broken stdio implementations.  We can work around the
Solaris breakage with SA_RESTART, but in case anybody else is ever that
stupid, here's the "safe" (read: "insanely anal") way to use fgets.

It probably goes without saying that I'm not terribly impressed by
Solaris libc.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-02 13:46:27 -07:00
fb7a6531e6 Fix Solaris stdio signal handling stupidities
This uses sigaction() to install the SIGALRM handler with SA_RESTART, so
that Solaris stdio doesn't break completely when a signal interrupts a
read.

Thanks to Jason Riedy for confirming the silly Solaris signal behaviour.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-02 13:41:56 -07:00
ec26b4d6b0 Fix sparse warnings about non-ANSI function prototypes
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-02 12:58:47 -07:00
5142db6912 Fix sparse warnings about usage of 0 instead of NULL
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-02 12:58:46 -07:00
139faba8f5 Remove useless pointer update
buf is not used afterwards.  The compiler optimized the dead store out
anyway, but let's clean the source, too.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-02 12:58:45 -07:00
79b2c75e04 gitk: replace parent and children arrays with lists
This will make it easier to switch between views efficiently, and
turns out to be slightly faster as well.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-04-02 20:47:40 +10:00
20b1d700c9 contrib/git-svn: documentation updates
contrib/git-svn/git-svn.txt:
	added git-repo-config key names for options
	fixed quoting of "git-svn-HEAD" in the manpage
	use preformatted text for examples

contrib/git-svn/Makefile:
	add target to generate HTML:
		http://git-svn.yhbt.net/git-svn.html

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-01 21:57:55 -08:00
53909056da contrib/git-svn: accept configuration via repo-config
repo-config keys are any of the long option names minus the '-'
characters

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-01 21:57:52 -08:00
bbbc8c3a8d revision: --max-age alone does not need limit_list() anymore.
This makes git log --since=7.days to be streamable.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-01 19:13:22 -08:00
5306968660 revision: simplify argument parsing.
This just moves code around to consolidate the part that sets
revs->limited to one place based on various flags.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-01 18:56:16 -08:00
22c31bf183 revision: --topo-order and --unpacked
Now, using --unpacked without limit_list() does not make much
sense, but this is parallel to the earlier --max-age fix.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-01 18:55:56 -08:00
be7db6e574 revision: Fix --topo-order and --max-age with reachability limiting.
What ends up not working very well at all is the combination of
"--topo-order" and the output filter in get_revision. It will
return NULL when we see the first commit out of date-order, even
if we have other commits coming.

So we really should do the "past the date order" thing in
get_revision() only if we have _not_ done it already in
limit_list().

Something like this.

The easiest way to test this is with just

	gitk --since=3.days.ago

on the kernel tree. Without this patch, it tends to be pretty obviously
broken.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-04-01 18:16:53 -08:00
2a0925be35 Make path-limiting be incremental when possible.
This makes git-rev-list able to do path-limiting without having to parse
all of history before it starts showing the results.

This makes things like "git log -- pathname" much more pleasant to use.

This is actually a pretty small patch, and the biggest part of it is
purely cleanups (turning the "goto next" statements into "continue"), but
it's conceptually a lot bigger than it looks.

What it does is that if you do a path-limited revision list, and you do
_not_ ask for pseudo-parenthood information, it won't do all the
path-limiting up-front, but instead do it incrementally in
"get_revision()".

This is an absolutely huge deal for anything like "git log -- <pathname>",
but also for some things that we don't do yet - like the "find where
things changed" logic I've described elsewhere, where we want to find the
previous revision that changed a file.

The reason I put "RFC" in the subject line is that while I've validated it
various ways, like doing

	git-rev-list HEAD -- drivers/char/ | md5sum

before-and-after on the kernel archive, it's "git-rev-list" after all. In
other words, it's that really really subtle and complex central piece of
software. So while I think this is important and should go in asap, I also
think it should get lots of testing and eyeballs looking at the code.

Btw, don't even bother testing this with the git archive. git itself is so
small that parsing the whole revision history for it takes about a second
even with path limiting. The thing that _really_ shows this off is doing

	git log drivers/

on the kernel archive, or even better, on the _historic_ kernel archive.

With this change, the response is instantaneous (although seeking to the
end of the result will obviously take as long as it ever did). Before this
change, the command would think about the result for tens of seconds - or
even minutes, in the case of the bigger old kernel archive - before
starting to output the results.

NOTE NOTE NOTE! Using path limiting with things like "gitk", which uses
the "--parents" flag to actually generate a pseudo-history of the
resulting commits won't actually see the improvement in interactivity,
since that forces git-rev-list to do the whole-history thing after all.

MAYBE we can fix that too at some point, but I won't promise anything.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-31 16:24:48 -08:00
7b0c996679 Move "--parent" parsing into generic revision.c library code
Not only do we do it in both rev-list.c and git.c, the revision walking
code will soon want to know whether we should rewrite parenthood
information or not.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-31 16:24:48 -08:00
8eef8e09ce Makefile: many programs now depend on xdiff/lib.a having been built.
The dependency was not properly updated when we added this
library, breaking parallel build with $(MAKE) -j.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-31 16:23:46 -08:00
4c0fea0f11 rev-list --boundary: fix re-injecting boundary commits.
Marco reported that

	$ git rev-list --boundary --topo-order --parents 5aa44d5..ab57c8d

misses these two boundary commits.

        c649657501
        eb38cc689e

Indeed, we can see that gitk shows these two commits at the
bottom, because the --boundary code failed to output them.

The code did not check to avoid pushing the same uninteresting
commit twice to the result list.  I am not sure why this fixes
the reported problem, but this seems to fix it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-30 23:59:19 -08:00
b4a081b428 Merge git://git.kernel.org/pub/scm/gitk/gitk
* git://git.kernel.org/pub/scm/gitk/gitk:
  gitk: Better workaround for arrows on diagonal line segments
  gitk: Allow top panes to scroll horizontally with mouse button 2
  gitk: Prevent parent link from overwriting commit headline
  gitk: Show diffs for boundary commits
  gitk: Use the new --boundary flag to git-rev-list
2006-03-30 16:27:03 -08:00
879e8b1aad gitk: Better workaround for arrows on diagonal line segments
Instead of adding extra padding to create a vertical line segment at
the lower end of a line that has an arrow, this now just draws a very
short vertical line segment at the lower end.  This alternative
workaround for the Tk8.4 behaviour (not drawing arrows on diagonal
line segments) doesn't have the problem of making the graph very wide
when people do a lot of merges in a row (hi Junio :).

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-31 10:45:14 +11:00
13ccd6d4f2 contrib/git-svn: force GIT_DIR to an absolute path
We chdir internally, so we need a consistent GIT_DIR variable.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-30 15:40:38 -08:00
ef5b4eabb6 git-clone: exit early if repo isn't specified
git-clone without a repo isn't useful at all.  print message and get
out asap.

This patch also move the variable 'local' to where other variables are
initialized.

Signed-off-by: Yasushi SHOJI <yashi@atmark-techno.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-30 15:31:21 -08:00
98a4fef3f2 Make git-clone to take long double-dashed origin option (--origin)
git-clone currently take option '-o' to specify origin.  this patch
makes git-clone to take double-dashed option '--origin' and other
abbreviations in addtion to the current single-dashed option.

[jc: with minor fixups]

Signed-off-by: Yasushi SHOJI <yashi@atmark-techno.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-30 15:31:03 -08:00
be0cd0981f gitk: Allow top panes to scroll horizontally with mouse button 2
Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-31 09:55:11 +11:00
f340844962 gitk: Prevent parent link from overwriting commit headline
When I made drawlineseg responsible for drawing the link to the first
child rather than drawparentlinks, that meant that the right-most X
value computed by drawparentlinks didn't include those first-child
links, and thus the first-child link could go over the top of the
commit headline.  This fixes it.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-31 09:54:24 +11:00
7b5ff7e7d7 gitk: Show diffs for boundary commits
With this we run git-diff-tree on a commit even if we think it has
no parents, either because it really has no parents or because it
is a boundary commit.  This means that gitk shows the diff for a
boundary commit when it is selected.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-30 20:50:40 +11:00
1b0c7174a1 tree/diff header cleanup.
Introduce tree-walk.[ch] and move "struct tree_desc" and
associated functions from various places.

Rename DIFF_FILE_CANON_MODE(mode) macro to canon_mode(mode) and
move it to cache.h.  This macro returns the canonicalized
st_mode value in the host byte order for files, symlinks and
directories -- to be compared with a tree_desc entry.
create_ce_mode(mode) in cache.h is similar but is intended to be
used for index entries (so it does not work for directories) and
returns the value in the network byte order.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-29 23:54:13 -08:00
e464f4c311 assume unchanged git: diff-index fix.
When the executable bit is untrustworthy and when we are
comparing the tree with the working tree, we tried to reuse the
mode bits recorded in the index incorrectly (the computation was
bogus on little endian architectures).  Just use mode from index
when it is a regular file.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-29 23:53:05 -08:00
16c1ff968a gitk: Use the new --boundary flag to git-rev-list
With this, we can show the boundary (open-circle) commits immediately
after their last child, which looks much better than putting all the
boundary commits at the bottom of the graph.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-30 18:43:51 +11:00
0c8b106b02 revision.c "..B" syntax: constness fix
The earlier change to make "..B" to mean "HEAD..B" (aka ^HEAD B)
has constness gotcha GCC complains.  Fix it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-29 23:30:52 -08:00
ce4a706388 revision arguments: ..B means HEAD..B, just like A.. means A..HEAD
For consistency reasons, we should probably allow that to be written as
just "..branch", the same way we can write "branch.." to mean "everything
in HEAD but not in "branch".

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-29 19:41:37 -08:00
384e99a4a9 rev-list --boundary
With the new --boundary flag, the output from rev-list includes
the UNINTERESING commits at the boundary, which are usually not
shown.  Their object names are prefixed with '-'.

For example, with this graph:

              C side
             /
	A---B---D master

You would get something like this:

	$ git rev-list --boundary --header --parents side..master
	D B
        tree D^{tree}
        parent B
        ... log message for commit D here ...
        \0-B A
        tree B^{tree}
        parent A
        ... log message for commit B here ...
        \0

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-28 17:29:21 -08:00
9181ca2c2b rev-list: memory usage reduction.
We do not need to track object refs, neither we need to save commit
unless we are doing verbose header.  A lot of traversal happens
inside prepare_revision_walk() these days so setting things up before
calling that function is necessary.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Acked-by: Linus Torvalds <torvalds@osdl.org>
2006-03-28 17:29:09 -08:00
5cdeae71ea rev-list --no-merges: argument parsing fix.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-28 00:04:50 -08:00
acb7257729 xdiff: Show function names in hunk headers.
The speed of the built-in diff generator is nice; but the function names
shown by `diff -p' are /really/ nice.  And I hate having to choose.  So,
we hack xdiff to find the function names and print them.

xdiff has grown a flag to say whether to dig up the function names.  The
builtin_diff function passes this flag unconditionally.  I suppose it
could parse GIT_DIFF_OPTS, but it doesn't at the moment.  I've also
reintroduced the `function name' into the test suite, from which it was
removed in commit 3ce8f089.

The function names are parsed by a particularly stupid algorithm at the
moment: it just tries to find a line in the `old' file, from before the
start of the hunk, whose first character looks plausible.  Still, it's
most definitely a start.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-27 18:43:51 -08:00
9c48666aa0 Add ALL_LDFLAGS to the git target.
For some reason, I need ALL_LDFLAGS in the git target only on
AIX.  Once it builds, only one test "fails" on AIX 5.1 with
1.3.0.rc1, t5500-fetch-pack.sh, but it looks like it's some
odd tool problem in the tester + my setup and not a real bug.

Signed-off-by: Jason Riedy <ejr@cs.berkeley.edu>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-27 17:55:20 -08:00
dff86e282f GIT 1.3.0 rc1
All of the things that were not in the "master" branch were
either cooked long enough in "next" without causing problems
(e.g. insanely fast rename detector or true built-in diff) or
isolated in a specific subsystem (e.g. tar-tree and svnimport).

So I am clearing the deck to prepare for a 1.3.0.  Remaining
wrinkles, if any, will be ironed in the "master" branch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-27 16:08:29 -08:00
65b5e41e24 Merge branch ak/svn 2006-03-27 16:03:36 -08:00
ac93bfc3b6 Merge branch 'lt/diffgen' into next
* lt/diffgen:
  add clean and ignore rules for xdiff/
  Remove dependency on a file named "-lz"
2006-03-26 23:44:28 -08:00
d93067d9c7 Merge branch 'master' into next
* master:
  Optionally do not list empty directories in git-ls-files --others
  Document git-rebase behavior on conflicts.
  Fix error handling for nonexistent names
2006-03-26 23:44:14 -08:00
3467fec516 add clean and ignore rules for xdiff/
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-26 23:41:22 -08:00
b0a3de4231 Optionally do not list empty directories in git-ls-files --others
Without the --directory flag, git-ls-files wouldn't ever list directories,
producing no output for empty directories, which is good since they cannot
be added and they bear no content, even untracked one (if Git ever starts
tracking directories on their own, this should obviously change since the
content notion will change).

With the --directory flag however, git-ls-files would list even empty
directories. This may be good in some situations but sometimes you want to
prevent that. This patch adds a --no-empty-directory option which makes
git-ls-files omit empty directories.

Signed-off-by: Petr Baudis <pasky@suse.cz>
2006-03-26 19:08:24 -08:00
8978d043c3 Document git-rebase behavior on conflicts. 2006-03-26 19:07:43 -08:00
54c261f90f Remove dependency on a file named "-lz"
By changing the dependency "$(LIB_H)" to "$(LIBS)", at least one version
of make thought that a file named "-lz" would be needed.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-26 19:07:08 -08:00
fb18a2edf7 Fix error handling for nonexistent names
When passing in a pathname pattern without the "--" separator on the
command line, we verify that the pathnames in question exist. However,
there were two bugs in that verification:

 - git-rev-parse would only check the first pathname, and silently allow
   any invalid subsequent pathname, whether it existed or not (which
   defeats the purpose of the check, and is also inconsistent with what
   git-rev-list actually does)

 - git-rev-list (and "git log" etc) would check each filename, but if the
   check failed, it would print the error using the first one, i.e.:

	[torvalds@g5 git]$ git log Makefile bad-file
	fatal: 'Makefile': No such file or directory

   instead of saying that it's 'bad-file' that doesn't exist.

This fixes both bugs.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-26 19:06:17 -08:00
f4e96f97e8 Merge branch 'jc/thin' into next
* jc/thin:
  git-push: make --thin pack transfer the default.
  gitk: Fix two bugs reported by users
  gitk: Improve appearance of first child links
  gitk: Make downward-pointing arrows end in vertical line segment
  gitk: Don't change cursor at end of layout if find in progress
  gitk: Make commitdata an array rather than a list
  gitk: Fix display of diff lines beginning with --- or +++
  [PATCH] gitk: Make error_popup react to Return
  gitk: Fix a bug in drawing the selected line as a thick line
  gitk: Further speedups
  gitk: Various speed improvements
  gitk: Fix Update menu item
  gitk: Fix clicks on arrows on line ends
  gitk: New improved gitk
  contrib/git-svn: stabilize memory usage for big fetches
2006-03-26 00:24:03 -08:00
84f11a4335 git-push: make --thin pack transfer the default.
Just in case it has problems, you can say "git push --no-thin".

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-26 00:23:52 -08:00
be1295d16a Merge branches 'jc/clone' and 'jc/name'
* jc/clone:
  git-clone: typofix.
  clone: record the remote primary branch with remotes/$origin/HEAD
  revamp git-clone (take #2).
  revamp git-clone.
  fetch,parse-remote,fmt-merge-msg: refs/remotes/* support

* jc/name:
  sha1_name: make core.warnambiguousrefs the default.
  sha1_name: warning ambiguous refs.
  get_sha1_basic(): try refs/... and finally refs/remotes/$foo/HEAD
  core.warnambiguousrefs: warns when "name" is used and both "name" branch and tag exists.
2006-03-26 00:22:53 -08:00
692c7fc9cb Merge branch 'jc/merge'
* jc/merge:
  git-merge knows some strategies want to skip trivial merges
2006-03-26 00:22:48 -08:00
b9aa1f9e9d Merge branch 'lt/diffgen' into next
* lt/diffgen:
  true built-in diff: run everything in-core.
2006-03-26 00:15:44 -08:00
a7cfb4a43f git-svnimport: if a limit is specified, respect it
git-svnimport will import the same revision over and over again if a
limit (-l <rev>) has been specified. Instead if that revision has already
been processed, exit with an up-to-date message.

Signed-off-by: Anand Kumria <wildfire@progsoc.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-26 00:15:01 -08:00
9086a18cb8 Merge git://git.kernel.org/pub/scm/gitk/gitk
* git://git.kernel.org/pub/scm/gitk/gitk:
  gitk: Fix two bugs reported by users
  gitk: Improve appearance of first child links
  gitk: Make downward-pointing arrows end in vertical line segment
  gitk: Don't change cursor at end of layout if find in progress
  gitk: Make commitdata an array rather than a list
  gitk: Fix display of diff lines beginning with --- or +++
  [PATCH] gitk: Make error_popup react to Return
  gitk: Fix a bug in drawing the selected line as a thick line
  gitk: Further speedups
  gitk: Various speed improvements
  gitk: Fix Update menu item
  gitk: Fix clicks on arrows on line ends
  gitk: New improved gitk
2006-03-26 00:13:25 -08:00
cebff98dbe true built-in diff: run everything in-core.
This stops using temporary files when we are using the built-in
diff (including the complete rewrite).

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 23:27:01 -08:00
0382318424 contrib/git-svn: stabilize memory usage for big fetches
We should be safely able to import histories with thousands
of revisions without hogging up lots of memory.

With this, we lose the ability to autocorrect mistakes when
people specify revisions in reverse, but it's probably no longer
a problem since we only have one method of log parsing nowadays.

I've added an extra check to ensure that revision numbers do
increment.

Also, increment the version number to 0.11.0.  I really should
just call it 1.0 soon...

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 21:23:54 -08:00
dad7230a1c Merge branch 'ew/email' into next
* ew/email:
  send-email: lazy-load Email::Valid and make it optional
  send-email: try to order messages in email clients more correctly
  send-email: Change from Mail::Sendmail to Net::SMTP
  send-email: use built-in time() instead of /bin/date '+%s'
2006-03-25 17:44:09 -08:00
9acf322d69 Merge branch 'lt/diffgen' into next
* lt/diffgen:
  built-in diff: minimum tweaks
  builtin-diff: \No newline at end of file.
  Use a *real* built-in diff generator
2006-03-25 17:44:01 -08:00
48d6e97afe Merge branch 'rs/tar-tree' into next
* rs/tar-tree:
  tar-tree: Use the prefix field of a tar header
  tar-tree: Remove obsolete code
  tar-tree: Use write_entry() to write the archive contents
  tar-tree: Introduce write_entry()
  tar-tree: Use SHA1 of root tree for the basedir
  git-apply: safety fixes
  Removed bogus "<snap>" identifier.
  Clarify and expand some hook documentation.
  commit-tree: check return value from write_sha1_file()
  send-email: Identify author at the top when sending e-mail
  Format tweaks for asciidoc.
2006-03-25 17:43:22 -08:00
567ffeb772 send-email: lazy-load Email::Valid and make it optional
It's not installed on enough machines, and is overkill most of
the time.  We'll fallback to a very basic regexp just in case,
but nothing like the monster regexp Email::Valid has to offer :)

Small cleanup from Merlyn.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 17:41:23 -08:00
a5370b16c3 send-email: try to order messages in email clients more correctly
If --no-chain-reply-to is set, patches may not always be ordered
correctly in email clients.  This patch makes sure each email
sent from a different second.

I chose to start with a time (slightly) in the past because
those are probably more likely in real-world usage and spam
filters might be more tolerant of them.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 17:41:22 -08:00
4bc87a28be send-email: Change from Mail::Sendmail to Net::SMTP
Net::SMTP is in the base Perl distribution, so users are more
likely to have it.  Net::SMTP also allows reusing the SMTP
connection, so sending multiple emails is faster.

[jc: tweaked X-Mailer further while we are at it.]

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 17:41:06 -08:00
72095d5c37 send-email: use built-in time() instead of /bin/date '+%s'
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:50:57 -08:00
3ce8f08944 built-in diff: minimum tweaks
This fixes up a couple of minor issues with the real built-in
diff to be more usable:

 - Omit ---/+++ header unless we emit diff output;

 - Detect and punt binary diff like GNU does;

 - Honor GIT_DIFF_OPTS minimally (only -u<number> and
   --unified=<number> are currently supported);

 - Omit line count of 1 from "@@ -l,k +m,n @@" hunk header
   (i.e. when k == 1 or n == 1)

 - Adjust testsuite for the lack of -p support.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:50:00 -08:00
621c53cc08 builtin-diff: \No newline at end of file.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:49:59 -08:00
3443546f6e Use a *real* built-in diff generator
This uses a simplified libxdiff setup to generate unified diffs _without_
doing  fork/execve of GNU "diff".

This has several huge advantages, for example:

Before:

	[torvalds@g5 linux]$ time git diff v2.6.16.. > /dev/null

	real    0m24.818s
	user    0m13.332s
	sys     0m8.664s

After:

	[torvalds@g5 linux]$ time git diff v2.6.16.. > /dev/null

	real    0m4.563s
	user    0m2.944s
	sys     0m1.580s

and the fact that this should be a lot more portable (ie we can ignore all
the issues with doing fork/execve under Windows).

Perhaps even more importantly, this allows us to do diffs without actually
ever writing out the git file contents to a temporary file (and without
any of the shell quoting issues on filenames etc etc).

NOTE! THIS PATCH DOES NOT DO THAT OPTIMIZATION YET! I was lazy, and the
current "diff-core" code actually will always write the temp-files,
because it used to be something that you simply had to do. So this current
one actually writes a temp-file like before, and then reads it into memory
again just to do the diff. Stupid.

But if this basic infrastructure is accepted, we can start switching over
diff-core to not write temp-files, which should speed things up even
further, especially when doing big tree-to-tree diffs.

Now, in the interest of full disclosure, I should also point out a few
downsides:

 - the libxdiff algorithm is different, and I bet GNU diff has gotten a
   lot more testing. And the thing is, generating a diff is not an exact
   science - you can get two different diffs (and you will), and they can
   both be perfectly valid. So it's not possible to "validate" the
   libxdiff output by just comparing it against GNU diff.

 - GNU diff does some nice eye-candy, like trying to figure out what the
   last function was, and adding that information to the "@@ .." line.
   libxdiff doesn't do that.

 - The libxdiff thing has some known deficiencies. In particular, it gets
   the "\No newline at end of file" case wrong. So this is currently for
   the experimental branch only. I hope Davide will help fix it.

That said, I think the huge performance advantage, and the fact that it
integrates better is definitely worth it. But it should go into a
development branch at least due to the missing newline issue.

Technical note: this is based on libxdiff-0.17, but I did some surgery to
get rid of the extraneous fat - stuff that git doesn't need, and seriously
cutting down on mmfile_t, which had much more capabilities than the diff
algorithm either needed or used. In this version, "mmfile_t" is just a
trivial <pointer,length> tuple.

That said, I tried to keep the differences to simple removals, so that you
can do a diff between this and the libxdiff origin, and you'll basically
see just things getting deleted. Even the mmfile_t simplifications are
left in a state where the diffs should be readable.

Apologies to Davide, whom I'd love to get feedback on this all from (I
wrote my own "fill_mmfile()" for the new simpler mmfile_t format: the old
complex format had a helper function for that, but I did my surgery with
the goal in mind that eventually we _should_ just do

	mmfile_t mf;

	buf = read_sha1_file(sha1, type, &size);
	mf->ptr = buf;
	mf->size = size;
	.. use "mf" directly ..

which was really a nightmare with the old "helpful" mmfile_t, and really
is that easy with the new cut-down interfaces).

[ Btw, as any hawk-eye can see from the diff, this was actually generated
  with itself, so it is "self-hosting". That's about all the testing it
  has gotten, along with the above kernel diff, which eye-balls correctly,
  but shows the newline issue when you double-check it with "git-apply" ]

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:49:58 -08:00
4c691724f1 tar-tree: Use the prefix field of a tar header
... to store parts of the path, if possible.  This allows us to avoid
writing extended headers in certain cases (long pathes can only be
split at '/' chars).

Also adds a file to the test repo with a 100 chars long directory name.
Even old versions of tar that don't understand POSIX extended headers
should be able to handle this testcase.

Btw.: The longest path in the kernel tree currently has 70 chars.
Together with a 30 chars long prefix this would already cross the
field limit of 100 chars.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:40:34 -08:00
86da1c567d tar-tree: Remove obsolete code
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:37:08 -08:00
cb0c6df6f5 tar-tree: Use write_entry() to write the archive contents
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:36:54 -08:00
ae64bbc18c tar-tree: Introduce write_entry()
... and use it initially to write global extended header records.
Improvements compared to the old write_header():

  - Uses a struct ustar_header instead of hardcoded offsets.
  - Takes one struct strbuf as path argument instead of a (basedir,
    prefix, name) tuple.
  - Not only writes the tar header, but also the contents of the
    file, if any.
  - Does not write directly into the ring buffer.  This allows the
    code to be layed out more naturally, because there is no more
    ordering constraint.  Before we had to first finish writing the
    extended header, now we can construct the extended and normal
    headers in parallel.
  - The typeflag parameter has been replaced by (reasonable) magic
    values.  path == NULL indicates an extended header, additionally
    sha1 == NULL means it is a global extended header.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:35:43 -08:00
2c6df2d5d1 tar-tree: Use SHA1 of root tree for the basedir
... instead of the made-up "0".

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:34:37 -08:00
c150462824 git-apply: safety fixes
This was triggered by me testing the "@@" numbering shorthand by GNU
patch, which not only showed that git-apply thought it meant the number
was duplicated (when it means that the second number is 1), but my tests
showed than when git-apply mis-understood the number, it would then not
raise an alarm about it if the patch ended early.

Now, this doesn't actually _matter_, since with a three-line context, the
only case that "x,1" will be shorthanded to "x" is when x itself is 1 (in
which case git-apply got it right), but the fact that git-apply would also
silently accept truncated patches was a missed opportunity for additional
sanity-checking.

So make git-apply refuse to look at a patch fragment that ends early.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-25 16:34:05 -08:00
6a1640ffc6 Removed bogus "<snap>" identifier.
Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-24 22:24:06 -08:00
6250ad1e7a Clarify and expand some hook documentation.
Clarify update and post-update hooks.
Made a few references to the hooks documentation.

Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-24 22:24:02 -08:00
7561d9f544 commit-tree: check return value from write_sha1_file()
... found by Matthias Kestenholz.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-24 22:23:25 -08:00
88d9405600 Merge branch 'jc/name' into next
* jc/name:
  sha1_name: make core.warnambiguousrefs the default.
  sha1_name: warning ambiguous refs.
2006-03-23 23:52:42 -08:00
79f558a5fc Merge branch 'jc/cvsimport'
* jc/cvsimport:
  cvsimport: fix reading from rev-parse
  cvsimport: honor -i and non -i upon subsequent imports
2006-03-23 23:49:07 -08:00
bdaa085f8c Merge branch 'jc/pull'
* jc/pull:
  git-pull: reword "impossible to fast-forward" message.
  git-pull: further safety while on tracking branch.
2006-03-23 23:47:32 -08:00
9bc8b776c5 Merge branch 'jc/fetch'
* jc/fetch:
  fetch: exit non-zero when fast-forward check fails.
2006-03-23 23:46:06 -08:00
8a8e623514 send-email: Identify author at the top when sending e-mail
git-send-email did not check if the sender is the same as the
patch author.  Follow the "From: at the beginning" convention to
propagate the patch author correctly.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-23 23:43:52 -08:00
1b371f567d sha1_name: make core.warnambiguousrefs the default.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-23 23:42:40 -08:00
84a9b58c42 sha1_name: warning ambiguous refs.
This makes sure that many commands that take refs on the command
line to honor core.warnambiguousrefs configuration.  Earlier,
the commands affected by this patch did not read the
configuration file.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-23 23:41:18 -08:00
b0d08a504b Format tweaks for asciidoc.
Some documentation "options" were followed by independent preformatted
paragraphs. Now they are associated plain text paragraphs. The
difference is clear in the generated html.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-22 11:06:19 -08:00
dcd0409fc5 Merge branch 'jc/pull' into next
* jc/pull:
  git-pull: reword "impossible to fast-forward" message.
  git-pull: further safety while on tracking branch.
2006-03-22 01:57:24 -08:00
8323124afe git-pull: reword "impossible to fast-forward" message.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-22 01:57:11 -08:00
cf46e7b899 git-pull: further safety while on tracking branch.
Running 'git pull' while on the tracking branch has a built-in
safety valve to fast-forward the index and working tree to match
the branch head, but it errs on the safe side too cautiously.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-22 01:09:43 -08:00
8ff8eea016 Merge branch 'jc/revlist' into next
* jc/revlist:
  rev-list --timestamp
  git-apply: do not barf when updating an originally empty file.
  http-push.c: squelch C90 warnings.
  fix field width/precision warnings in blame.c
2006-03-22 00:52:41 -08:00
ac5a85181a Merge branch 'jc/clone' into next
* jc/clone:
  git-clone: typofix.
2006-03-22 00:52:36 -08:00
4c2e98d6ce git-clone: typofix.
The traditional one created refs/origin by mistake, not
refs/heads/origin.  Also it mistakenly failed to prevent
$origin from being listed twice in remotes/origin file.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-22 00:50:32 -08:00
dc68c4fff4 rev-list --timestamp
This prefixes the raw commit timestamp to the output.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-22 00:22:00 -08:00
3103cf9e1e git-apply: do not barf when updating an originally empty file.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-22 00:21:07 -08:00
8c9e7947c2 http-push.c: squelch C90 warnings.
If you write code after declarations in a block, gcc scolds you
with "warning: ISO C90 forbids mixed declarations and code".

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-21 15:50:18 -08:00
2928390774 fix field width/precision warnings in blame.c
Using "size_t" values for printf field width/precision upsets gcc, it
wants to see an "int".

Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-21 15:39:44 -08:00
7a1d9d14c8 gitk: Fix two bugs reported by users
The first was a simple typo where I put $yc instead of [yc $row].
The second was that I broke the logic for keeping up with fast
movement through the commits, e.g. when you select a commit and then
press down-arrow and let it autorepeat.  That got broken when I
changed the merge diff display to use git-diff-tree --cc.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-22 10:21:45 +11:00
d293b28127 Merge branch 'jc/clone' into next
* jc/clone:
  clone: record the remote primary branch with remotes/$origin/HEAD
2006-03-21 02:04:50 -08:00
5a6696a0ed Merge branch 'jc/name' into next
* jc/name:
  get_sha1_basic(): try refs/... and finally refs/remotes/$foo/HEAD
2006-03-21 02:04:46 -08:00
5ceb05f82e clone: record the remote primary branch with remotes/$origin/HEAD
This matches c51d13692d commit to
record the primary branch of the remote with a symbolic ref
remotes/$origin/HEAD.  The user can later change it to point at
different branch to change the meaning of "$origin" shorthand.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-21 02:02:46 -08:00
c51d13692d get_sha1_basic(): try refs/... and finally refs/remotes/$foo/HEAD
This implements the suggestion by Jeff King to use
refs/remotes/$foo/HEAD to interpret a shorthand "$foo" to mean
the primary branch head of a tracked remote.  clone needs to be
told about this convention as well.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-21 01:42:04 -08:00
f1250edff5 Merge branch 'jc/name' into next
* jc/name:
  core.warnambiguousrefs: warns when "name" is used and both "name" branch and tag exists.
  contrib/git-svn: allow rebuild to work on non-linear remote heads
  http-push: don't assume char is signed
  http-push: add support for deleting remote branches
  Be verbose when !initial commit
  Fix multi-paragraph list items in OPTIONS section
  http-fetch: nicer warning for a server with unreliable 404 status
2006-03-21 00:15:21 -08:00
83c137928c Merge branch 'jc/clone' into next
* jc/clone:
  revamp git-clone (take #2).
2006-03-21 00:15:15 -08:00
47874d6d9a revamp git-clone (take #2).
This builds on top of the previous one.

 * --use-separate-remote uses .git/refs/remotes/$origin/
   directory to keep track of the upstream branches.

 * The $origin above defaults to "origin" as usual, but the
   existing "-o $origin" option can be used to override it.

I am not yet convinced if we should make "$origin" the synonym to
"refs/remotes/$origin/$name" where $name is the primary branch
name of $origin upstream, nor if so how we should decide which
upstream branch is the primary one, but that is more or less
orthogonal to what the clone does here.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-21 00:14:13 -08:00
2f8acdb38e core.warnambiguousrefs: warns when "name" is used and both "name" branch and tag exists.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-20 23:34:17 -08:00
ac74905064 contrib/git-svn: allow rebuild to work on non-linear remote heads
Because committing back to an SVN repository from different
machines can result in different lineages, two different
repositories running git-svn can result in different commit
SHA1s (but of the same tree).  Sometimes trees that are tracked
independently are merged together (usually via children),
resulting in non-unique git-svn-id: lines in rev-list.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-20 23:31:19 -08:00
a3c57c9adb http-push: don't assume char is signed
Declare remote_dir_exists[] as signed char to be sure that values of -1
are valid.

Signed-off-by: Nick Hengeveld <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-20 14:38:58 -08:00
3dfaf7bcfd http-push: add support for deleting remote branches
Processes new command-line arguments -d and -D to remove a remote branch
if the following conditions are met:
- one branch name is present on the command line
- the specified branch name matches exactly one remote branch name
- the remote HEAD is a symref
- the specified branch is not the remote HEAD
- the remote HEAD resolves to an object that exists locally (-d only)
- the specified branch resolves to an object that exists locally (-d only)
- the specified branch is an ancestor of the remote HEAD (-d only)

Signed-off-by: Nick Hengeveld <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-20 14:38:47 -08:00
1fa7a68f4b Be verbose when !initial commit
verbose option in git-commit.sh lead us to run git-diff-index, which
needs a commit-ish we are making diff against.  When we are commiting
the fist set, we obviously don't have any commit-ish in the repo.  So
we just skip the git-diff-index run.

It might be possible to produce diff against empty but do we need
that?

Signed-off-by: Yasushi SHOJI <yashi@atmark-techno.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-20 14:37:59 -08:00
3070b603ab Fix multi-paragraph list items in OPTIONS section
This patch makes the html docs right, makes the asciidoc docs a bit odd
but consistent with what is there already, and makes the manpages look
OK using docbook-xsl 1.68, but miss a paragraph separator when using 1.69.

For the manpages, current is like

       -A <author_file>
              Read a file with lines on the form

              username = User's Full Name <email@addr.es>

              and use "User's Full Name <email@addr.es>" as the GIT

With this patch, docbook-xsl v1.68 looks like

       -A <author_file>
              Read a file with lines on the form

                      username = User's Full Name <email@addr.es>

              and use "User's Full Name <email@addr.es>" as the GIT author and

while docbook-xsl v1.69 becomes

       -A <author_file>
              Read a file with lines on the form

                        username = User's Full Name <email@addr.es>
              and use "User's Full Name <email@addr.es>" as the GIT author and

The extra indentation is to keep the v1.69 manpage looking sane.
2006-03-20 14:37:33 -08:00
bb52807916 http-fetch: nicer warning for a server with unreliable 404 status
When a repository otherwise properly prepared is served by a
dumb HTTP server that sends "No such page" output with 200
status for human consumption to a request for a page that does
not exist, the users will get an alarming "File X corrupt" error
message.  Hint that they might be dealing with such a server at
the end and suggest running fsck-objects to check if the result
is OK (the pack-fallback code does the right thing in this case
so unless a loose object file was actually corrupt the result
should check OK).

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-20 14:07:59 -08:00
e2fc650eef Merge branch 'jc/merge' into next
* jc/merge:
  git-merge knows some strategies want to skip trivial merges
  generate-cmdlist: style cleanups.
  Add missing semicolon to sed command.
  unpack_delta_entry(): reduce memory footprint.
  git.el: Added a function to diff against the other heads in a merge.
  git.el: Get the default user name and email from the repository config.
  git.el: More robust handling of subprocess errors when returning strings.
2006-03-20 00:51:07 -08:00
1656313297 Merge branch 'jc/clone' into next
* jc/clone:
  revamp git-clone.
2006-03-20 00:50:58 -08:00
6ea23343ce git-merge knows some strategies want to skip trivial merges
Most notably "ours".  Also this makes sure we do not record
duplicated parents on the parent list of the resulting commit.

This is based on Mark Wooding's work, but does not change the UI
nor introduce new flags.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-20 00:50:37 -08:00
dfeff66ed9 revamp git-clone.
This does two things.

 * A new flag --reference can be used to name a local repository
   that is to be used as an alternate.  This is in response to
   an inquiry by James Cloos in the message on the list
   <m3r74ykue7.fsf@lugabout.cloos.reno.nv.us>.

 * A new flag --use-separate-remote stops contaminating local
   branch namespace by upstream branch names.  The upstream
   branch heads are copied in .git/refs/remotes/ instead of
   .git/refs/heads/ and .git/remotes/origin file is set up to
   reflect this as well.  It requires to have fetch/pull update
   to understand .git/refs/remotes by Eric Wong to further
   update the repository cloned this way.

For the former change, git-fetch-pack is taught a new flag --all
to fetch from all the remote heads.  Nobody uses the git-clone-pack
with this change, so we could deprecate the command, but removal
of the command will be left to a separate round.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-20 00:21:10 -08:00
fd662dd500 generate-cmdlist: style cleanups.
Instead of giving multiple commands concatenated with semicolon
to sed, write them on separate lines.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-19 23:54:45 -08:00
ad52e7708d Add missing semicolon to sed command.
generate-cmdlist.sh is giving errors messages from sed on Mac OS
10.4 due to a missing semicolon.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-19 16:38:24 -08:00
67686d9504 unpack_delta_entry(): reduce memory footprint.
Currently we unpack the delta data from the pack and then unpack
the base object to apply that delta data to it.  When getting an
object that is deeply deltified, we can reduce memory footprint
by unpacking the base object first and then unpacking the delta
data, because we will need to keep at most one delta data in
memory that way.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-19 13:43:42 -08:00
2b1c0ef2e5 git.el: Added a function to diff against the other heads in a merge.
git-diff-file-merge-head generates a diff against the first merge
head, or with a prefix argument against the nth head. Bound to `d h'
by default.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-19 12:30:14 -08:00
75a8180d4b git.el: Get the default user name and email from the repository config.
If user name or email are not set explicitly, get them from the
user.name and user.email configuration values before falling back to
the Emacs defaults.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-19 12:30:07 -08:00
9de83169d3 git.el: More robust handling of subprocess errors when returning strings.
Make sure that functions that call a git process and return a string
always return nil when the subprocess failed.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-19 12:30:01 -08:00
b7986ce884 Merge branch 'master' into next
* master:
  Makefile: Add TAGS and tags targets
  ls-files: Don't require exclude files to end with a newline.
2006-03-18 14:58:20 -08:00
f81e7c626f Makefile: Add TAGS and tags targets
Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-18 14:01:46 -08:00
451d7b47f1 ls-files: Don't require exclude files to end with a newline.
Without this patch, the last line of an exclude file is silently
ignored if it doesn't end with a newline.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-18 14:01:37 -08:00
eb447a126c gitk: Improve appearance of first child links
The point where the line for a parent joins to the first child
shown is visually different from the lines to the other children,
because the line doesn't branch, but terminates at the child.
Because of this, we now treat the first child a little differently
in the optimizer, and we draw its link in drawlineseg rather
than drawparentlinks.  This improves the appearance of the graph.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-18 23:11:37 +11:00
2fc27528f6 Merge branch 'master' into next
* master:
  git-pull: run repo-config with dash form.
2006-03-18 02:08:10 -08:00
f5ef535ff5 git-pull: run repo-config with dash form.
... as discussed on the list for consistency.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-18 02:07:59 -08:00
c534c4ba7e Merge branch 'jc/cvsimport' into next
* jc/cvsimport:
  cvsimport: fix reading from rev-parse
2006-03-18 02:05:22 -08:00
cb9594e28c cvsimport: fix reading from rev-parse
The updated code reads the tip of the current branch before and
after the import runs, but forgot to chomp what we read from the
command.  The read-tree command did not them with the trailing
LF.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-18 02:05:02 -08:00
d8d2df08f6 gitk: Make downward-pointing arrows end in vertical line segment
It seems Tk 8.4 can't draw arrows on diagonal line segments.  This
adds code to the optimizer to make the last bit of a line go vertically
before being terminated with an arrow pointing downwards, so that
it will be drawn correctly by Tk 8.4.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-18 20:42:46 +11:00
8a414ad50c Merge branch 'jc/empty'
* jc/empty:
  revision traversal: --remove-empty fix (take #2).
  revision traversal: --remove-empty fix.

Conflicts:

	revision.c (adjust for the updates by Fredrik)
2006-03-18 00:43:47 -08:00
f4171a19f0 gitk: Don't change cursor at end of layout if find in progress
If the user is doing a find in files or patches, which changed the
cursor to a watch, don't change it back to a pointer when we reach
the end of laying out the graph.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-18 16:02:51 +11:00
c816a6bc5a Merge branch 'master' into next
* master:
  3% tighter packs for free
  Rewrite synopsis to clarify the two primary uses of git-checkout.
  Fix minor typo.
  Reference git-commit-tree for env vars.
  Clarify git-rebase example commands.
  Document the default source of template files.
  Call out the two different uses of git-branch and fix a typo.
  Add git-show reference
2006-03-17 20:43:15 -08:00
5a1fb2ca92 3% tighter packs for free
This patch makes for 3.4% smaller pack with the git repository, and
a bit more than 3% smaller pack with the kernel repository.

And so with _no_ measurable CPU difference.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 20:42:39 -08:00
71bb10336f Rewrite synopsis to clarify the two primary uses of git-checkout.
Fix a few typo/grammar problems.

Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 20:42:38 -08:00
beb8e13437 Fix minor typo.
Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 20:42:36 -08:00
5bfc4f23bc Reference git-commit-tree for env vars.
Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 20:42:35 -08:00
228382aee4 Clarify git-rebase example commands.
Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 20:42:33 -08:00
81ea3ce2ac Document the default source of template files.
Also explain a bit more about how the template option works.

Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 20:42:31 -08:00
dd1811199e Call out the two different uses of git-branch and fix a typo.
Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 20:42:30 -08:00
55258b5c20 Add git-show reference
Signed-off-by: Jon Loeliger <jdl@jdl.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 20:42:28 -08:00
f7a3e8d254 gitk: Make commitdata an array rather than a list
This turns out to be slightly simpler and faster, and will make
things a little easier when we do multiple view support.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-18 10:04:48 +11:00
8d707b6293 Merge branch 'jc/cvsimport' into next
* jc/cvsimport:
  cvsimport: honor -i and non -i upon subsequent imports
2006-03-17 14:11:17 -08:00
d3c4519a72 Merge branch 'jc/fetch' into next
* jc/fetch:
  fetch: exit non-zero when fast-forward check fails.
2006-03-17 14:11:10 -08:00
35a9f5d91e Merge branch 'ew/abbrev' into next
* ew/abbrev:
  ls-files: add --abbrev[=<n>] option
  ls-tree: add --abbrev[=<n>] option
  blame: Fix git-blame <directory>
  blame: Nicer output
2006-03-17 14:11:00 -08:00
a9698bb22f fetch: exit non-zero when fast-forward check fails.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 14:10:36 -08:00
ad0cae4cb9 ls-files: add --abbrev[=<n>] option
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 14:10:24 -08:00
cb85bfe5df ls-tree: add --abbrev[=<n>] option
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 14:10:24 -08:00
8a5f2eac52 cvsimport: honor -i and non -i upon subsequent imports
Documentation says -i is "import only", so without it,
subsequent import should update the current branch and working
tree files in a sensible way.

"A sensible way" defined by this commit is "act as if it is a
git pull from foreign repository which happens to be CVS not
git".  So:

 - If importing into the current branch (note that cvsimport
   requires the tracking branch is pristine -- you checked out
   the tracking branch but it is your responsibility not to make
   your own commits there), fast forward the branch head and
   match the index and working tree using two-way merge, just
   like "git pull" does.

 - If importing into a separate tracking branch, update that
   branch head, and merge it into your current branch, again,
   just like "git pull" does.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 14:10:16 -08:00
53dc463627 blame: Fix git-blame <directory>
Before this patch git-blame <directory> gave non-sensible output. (It
assigned blame to some random file in <directory>) Abort with an error
message instead.

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 14:09:18 -08:00
88a8b79556 blame: Nicer output
As pointed out by Junio, it may be dangerous to cut off people's names
after 15 bytes. If the name is encoded in an encoding which uses more
than one byte per code point we may end up with outputting garbage.
Instead of trying to do something smart, just output the entire name.
We don't gain much screen space by chopping it off anyway.

Furthermore, only output the file name if we actually found any
renames.

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-17 14:09:10 -08:00
f2cb4004fd Merge branch 'master' into next
* master:
  fix imap-send for OSX
  Let merge set the default strategy.
2006-03-15 16:15:23 -08:00
6169858d19 fix imap-send for OSX
This patch works... I've been using it to stay current.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-15 16:14:54 -08:00
c8e2db00f9 Let merge set the default strategy.
If the user does not set a merge strategy for git-pull,
let git-merge calculate a default strategy.

[jc: with minor stylistic tweaks]

Signed-off-by: Mark Hollomon <markhollomon@comcast.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-15 16:14:33 -08:00
64ecb6247f Merge branch 'lt/diff' into next
* lt/diff:
  diffcore-delta: 64-byte-or-EOL ultrafast replacement (hash fix).
2006-03-15 13:19:52 -08:00
e31c9f241a diffcore-delta: 64-byte-or-EOL ultrafast replacement (hash fix).
The rotating 64-bit number was not really rotating, and worse
yet ulong was longer than 64-bit on 64-bit architectures X-<.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-15 13:19:27 -08:00
d7da67148b Merge branch 'master' into next
* master:
  Fix broken slot reuse when fetching alternates
2006-03-15 09:12:18 -08:00
c982647310 Fix broken slot reuse when fetching alternates
When fetching alternates, http-fetch may reuse the slot to fetch non-http
alternates if http-alternates does not exist.  When doing so, it now needs
to update the slot's finished status so run_active_slot waits for the
non-http alternates request to finish.

Signed-off-by: Nick Hengeveld <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-15 09:10:41 -08:00
d09a0a3cb8 Merge branch 'lt/diff' into next
* lt/diff:
  diffcore-delta: 64-byte-or-EOL ultrafast replacement.
2006-03-15 00:38:47 -08:00
3c7ceba4f1 diffcore-delta: 64-byte-or-EOL ultrafast replacement.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-15 00:37:57 -08:00
ea75cb7284 Merge branch 'jc/pack'
* jc/pack:
  pack-objects: simplify "thin" pack.
  verify-pack -v: show delta-chain histogram.
2006-03-13 00:04:10 -08:00
41ce93bea4 Merge branch 'jc/fsck'
* jc/fsck:
  fsck-objects: Remove --standalone
2006-03-13 00:04:05 -08:00
2e158bee7a Merge branch 'nh/http'
* nh/http:
  http-push: cleanup
  http-push: support for updating remote info/refs
  http-push: improve remote lock management
  http-push: refactor remote file/directory processing
  HTTP slot reuse fixes
  http-push: fix revision walk
2006-03-13 00:01:57 -08:00
4a6c77cc0a Merge branch 'fk/blame'
* fk/blame:
  blame: Rename detection (take 2)
  rev-lib: Make it easy to do rename tracking (take 2)
  Make it possible to not clobber object.util in sort_in_topological_order (take 2)
2006-03-13 00:01:52 -08:00
cf1e6d1ec5 Merge branch 'jc/diff' into next
* jc/diff:
  Fix up diffcore-rename scoring
2006-03-12 23:45:42 -08:00
90bd932c81 Fix up diffcore-rename scoring
The "score" calculation for diffcore-rename was totally broken.

It scaled "score" as

	score = src_copied * MAX_SCORE / dst->size;

which means that you got a 100% similarity score even if src and dest were
different, if just every byte of dst was copied from src, even if source
was much larger than dst (eg we had copied 85% of the bytes, but _deleted_
the remaining 15%).

That's clearly bogus. We should do the score calculation relative not to
the destination size, but to the max size of the two.

This seems to fix it.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-12 23:02:00 -08:00
2593a410e0 Merge branch 'jc/diff' into next
* jc/diff:
  diffcore-delta: tweak hashbase value.
2006-03-12 20:42:35 -08:00
fc66d213f8 diffcore-delta: tweak hashbase value.
This tweaks the maximum hashvalue we use to hash the string into
without making the maximum size of the hashtable can grow from
the current limit.  With this, the renames detected becomes a
bit more precise without incurring additional paging cost.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-12 20:42:12 -08:00
7be14b49ac Merge branch 'jc/diff' into next
* jc/diff:
  diffcore-delta: make the hash a bit denser.
2006-03-12 17:27:32 -08:00
a7e71bb489 Merge branch 'jc/empty' into next
* jc/empty:
  revision traversal: --remove-empty fix (take #2).
2006-03-12 17:27:23 -08:00
2821104db7 diffcore-delta: make the hash a bit denser.
To reduce wasted memory, wait until the hash fills up more
densely before we rehash.  This reduces the working set size a
bit further.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-12 17:26:32 -08:00
c348f31ab9 revision traversal: --remove-empty fix (take #2).
Marco Costalba reports that --remove-empty omits the commit that
created paths we are interested in.  try_to_simplify_commit()
logic was dropping a parent we introduced those paths against,
which I think is not what we meant.  Instead, this makes such
parent parentless.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-12 17:06:57 -08:00
3dcf2d0e00 Merge branch 'jc/empty' into next
* jc/empty:
  revision traversal: --remove-empty fix.
  annotate-tests: override VISUAL when running tests.
2006-03-12 13:43:36 -08:00
a41e109c4b revision traversal: --remove-empty fix.
Marco Costalba reports that --remove-empty omits the commit that
created paths we are interested in.  try_to_simplify_commit()
logic was dropping a parent we introduced those paths against,
which I think is not what we meant.  Instead, this marks such
parent uninteresting.  The traversal does not go beyond that
parent as advertised, but we still say that the current commit
changed things from that parent.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-12 13:39:31 -08:00
8c3222079a annotate-tests: override VISUAL when running tests.
The tests hang for me waiting for Emacs with its output directed
somewhere strage, because I hedged my bets and set both EDITOR and
VISUAL to run Emacs.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-12 11:50:23 -08:00
28f7533f70 Merge branch 'master' into next
* master:
  imap-send: Add missing #include for macosx
  git-diff: -p disables rename detection.
  imap-send: cleanup execl() call to use NULL sentinel instead of 0
  annotate.perl triggers rpm bug
2006-03-12 03:29:11 -08:00
514236aa5a Merge branch 'jc/diff' into next
* jc/diff:
  diffcore-rename: somewhat optimized.
2006-03-12 03:29:09 -08:00
2d33501689 imap-send: Add missing #include for macosx
There is a compile error without that.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-12 03:28:20 -08:00
c06c79667c diffcore-rename: somewhat optimized.
This changes diffcore-rename to reuse statistics information
gathered during similarity estimation, and updates the hashtable
implementation used to keep track of the statistics to be
denser.  This seems to give better performance.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-12 03:22:10 -08:00
42efbf6d8a git-diff: -p disables rename detection. 2006-03-11 17:44:10 -08:00
8e7f9035b8 imap-send: cleanup execl() call to use NULL sentinel instead of 0
Some versions of gcc check that calls to the exec() family have the proper
sentinel for variadic calls. This should be (char *) NULL according to the
man page. Although for all other purposes the 0 is equivalent, gcc
nevertheless does emit a warning for 0 and not for NULL. This also makes the
usage consistent throughout git.

The whitespace in function calls throughout imap-send.c has its own style,
so I left it that way.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-11 02:00:35 -08:00
be767c9172 annotate.perl triggers rpm bug
RPM, at least on Fedora boxes, automatically creates a
dependency for any perl "use" lines, and one of the help text
lines unfortunately begins like this:

    -S, --rev-file revs-file
            use revs from revs-file instead of calling git-rev-list

RPM gets confused and creates a false dependecy for the
nonexistent perl package "revs".  Obviously this creates a
problem when someone goes to install the git-core rpm.

Since other help sentences all start with capital letter, make
this one match them by upcasing "Use".  As a side effect, RPM
stops getting confused.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-11 00:03:30 -08:00
c827a84c69 Merge branch 'nh/http' into next
* nh/http:
  http-push: cleanup
  http-push: support for updating remote info/refs
  http-push: improve remote lock management
  http-push: refactor remote file/directory processing
  HTTP slot reuse fixes
  http-push: fix revision walk
2006-03-10 23:02:23 -08:00
1a703cba6d http-push: cleanup
More consistent usage string, condense push output, remove extra slashes
in URLs, fix unused variables, include HTTP method name in failure
messages.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 23:01:56 -08:00
197e8951ab http-push: support for updating remote info/refs
If info/refs exists on the remote, get a lock on info/refs, make sure that
there is a local copy of the object referenced in each remote ref (in case
someone else added a tag we don't have locally), do all the refspec updates,
and generate and send an updated info/refs file.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 23:01:54 -08:00
512d632cf2 http-push: improve remote lock management
Associate the remote locks with the remote repo, add a function to check
and refresh all current locks.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 23:01:52 -08:00
3030baa7f0 http-push: refactor remote file/directory processing
Replace single-use functions with one that can get a list of remote
collections and pass file/directory information to user-defined functions
for processing.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 23:01:50 -08:00
baa7b67d09 HTTP slot reuse fixes
Incorporate into http-push a fix related to accessing slot results after
the slot was reused, and fix a case in run_active_slot where a
finished slot wasn't detected if the slot was reused.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 23:01:48 -08:00
5241bfe6d1 http-push: fix revision walk
The revision walk was not including tags because setup_revisions zeroes out
the revs flags.  Pass --objects so it picks up all the necessary bits.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 23:01:45 -08:00
9937cbf491 Merge branch 'ew/remote' into next
* ew/remote:
  fetch,parse-remote,fmt-merge-msg: refs/remotes/* support
2006-03-10 22:33:06 -08:00
c301a0d2cf Merge branch 'fk/blame' into next
* fk/blame:
  blame: Rename detection (take 2)
  rev-lib: Make it easy to do rename tracking (take 2)
  Make it possible to not clobber object.util in sort_in_topological_order (take 2)
  Add git-imap-send, derived from isync 1.0.1.
  repack: prune loose objects when -d is given
  try_to_simplify_commit(): do not skip inspecting tree change at boundary.
  Fix t1200 test for breakage caused by removal of full-stop at the end of fast-forward message.
  Describe how to add extra mail header lines in mail generated by git-format-patch.
  Document the --attach flag.
  allow double click on current HEAD id after git-pull
2006-03-10 22:32:59 -08:00
687b8be8bb fetch,parse-remote,fmt-merge-msg: refs/remotes/* support
We can now easily fetch and merge things from heads in the
refs/remotes/ hierarchy in remote repositories.

The refs/remotes/ hierarchy is likely to become the standard for
tracking foreign SCMs, as well as the location of Pull: targets
for tracking remote branches in newly cloned repositories.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 22:31:20 -08:00
27e7304567 blame: Rename detection (take 2)
Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 22:22:20 -08:00
8efdc326c9 rev-lib: Make it easy to do rename tracking (take 2)
prune_fn in the rev_info structure is called in place of
try_to_simplify_commit. This makes it possible to do rename tracking
with a custom try_to_simplify_commit-like function.

This commit also introduces init_revisions which initialises the rev_info
structure with default values.

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 22:22:00 -08:00
6b6dcfc297 Make it possible to not clobber object.util in sort_in_topological_order (take 2)
Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 22:11:14 -08:00
f2561fda36 Add git-imap-send, derived from isync 1.0.1.
git-imap-send drops a patch series generated by git-format-patch into an
IMAP folder. This allows patch submitters to send patches through their
own mail program.

git-imap-send uses the following values from the GIT repository
configuration:

The target IMAP folder:

[imap]
         Folder = "INBOX.Drafts"

A command to open an ssh tunnel to the imap mail server.

[imap]
         Tunnel = "ssh -q user@imap.server.com /usr/bin/imapd ./Maildir
2> /dev/null"

[imap]
         Host = imap.server.com
         User = bob
         Password = pwd
         Port = 143
2006-03-10 22:09:24 -08:00
2d0048e681 repack: prune loose objects when -d is given
[jc: the request originally came from Martin Atukunda, which was
 improved further by Alex Riesen]

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 22:07:23 -08:00
f3219fbbba try_to_simplify_commit(): do not skip inspecting tree change at boundary.
When git-rev-list (and git-log) collapsed ancestry chain to
commits that touch specified paths, we failed to inspect and
notice tree changes when we are about to hit uninteresting
parent.  This resulted in "git rev-list since.. -- file" to
always show the child commit after the lower bound, even if it
does not touch the file.  This commit fixes it.

Thanks for Catalin for reporting this.

See also:
	461cf59f89

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-10 21:59:37 -08:00
eb0e0024b7 Fix t1200 test for breakage caused by removal of full-stop at the end of fast-forward message.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 22:51:21 -08:00
96ce6d2607 Describe how to add extra mail header lines in mail generated by git-format-patch. 2006-03-09 22:01:10 -08:00
a15a44ef6e Document the --attach flag. 2006-03-09 22:01:00 -08:00
180b0d7483 allow double click on current HEAD id after git-pull
Double click on to current HEAD commit id is not possible,
the dot has to go.

[jc: by popular requests.]

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 18:13:19 -08:00
b8cfe290a8 Merge branch 'jc/fsck' into next
* jc/fsck:
  fsck-objects: Remove --standalone
  refs.c::do_for_each_ref(): Finish error message lines with "\n"
  Nicer output from 'git'
  Use #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
  Remove trailing dot after short description
  Fix some inconsistencies in the docs
  contrib/git-svn: fix a harmless warning on rebuild (with old repos)
  contrib/git-svn: remove the --no-stop-on-copy flag
  contrib/git-svn: fix svn compat and fetch args
  Don't recurse into parents marked uninteresting.
  diff-delta: bound hash list length to avoid O(m*n) behavior
  test-delta needs zlib to compile
  git-fmt-merge-msg cleanup
2006-03-09 13:10:50 -08:00
7aaa715d0a fsck-objects: Remove --standalone
The fsck-objects command (back then it was called fsck-cache)
used to complain if objects referred to by files in .git/refs/
or objects stored in files under .git/objects/??/ were not found
as stand-alone SHA1 files (i.e.  found in alternate object pools
or packed archives stored under .git/objects/pack).  Back then,
packs and alternates were new curiosity and having everything as
loose objects were the norm.

When we adjusted the behaviour of fsck-cache to consider objects
found in packs are OK, we introduced the --standalone flag as a
backward compatibility measure.

It still correctly checks if your repository is complete and
consists only of loose objects, so in that sense it is doing the
"right" thing, but checking that is pointless these days.  This
commit removes --standalone flag.

See also:

	23676d407c
	8a498a05c3

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 13:10:31 -08:00
f61c2c970c refs.c::do_for_each_ref(): Finish error message lines with "\n"
We used fprintf() to show an error message without terminating
it with LF; use error() for that.

cf. c401cb48e7

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 12:59:16 -08:00
a87cd02ce0 Nicer output from 'git'
[jc: with suggestions by Jan-Benedict Glaw]

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 12:03:14 -08:00
b4f2a6ac92 Use #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 11:58:05 -08:00
7bd7f2804d Remove trailing dot after short description
Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 11:44:11 -08:00
5001422d30 Fix some inconsistencies in the docs
Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 11:43:58 -08:00
779b144625 contrib/git-svn: fix a harmless warning on rebuild (with old repos)
It's only for repositories that were imported with very early
versions of git-svn.  Unfortunately, some of those repos are out
in the wild already, so fix this warning.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 10:10:30 -08:00
7317ed906a contrib/git-svn: remove the --no-stop-on-copy flag
Output a big warning if somebody actually has a pre-1.0 version
of svn that doesn't support it.

Thanks to Yann Dirson for reminding me it still existed
and attempting to re-enable it :)

I think I subconciously removed support for it earlier...

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 10:10:18 -08:00
1d52aba839 contrib/git-svn: fix svn compat and fetch args
'svn info' doesn't work with URLs in svn <= 1.1.  Now we
only run svn info in local directories.

As a side effect, this should also work better for 'init' off
directories that are no longer in the latest revision of the
repository.

svn checkout -r<revision> arguments are fixed.
Newer versions of svn (1.2.x) seem to need URL@REV as well as
-rREV to checkout a particular revision...

Add an example in the manpage of how to track directory that has
been moved since its initial revision.

A huge thanks to Yann Dirson for the bug reporting and testing
my original patch.  Thanks also to Junio C Hamano for suggesting
a safer way to use git-rev-parse.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 10:04:58 -08:00
d2c4af7373 Don't recurse into parents marked uninteresting.
revision.c:make_parents_uninteresting() is exponential with the number
of merges in the tree. That's fine -- unless some other part of git
already has pulled the whole commit tree into memory ...

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 01:49:07 -08:00
c13c6bf758 diff-delta: bound hash list length to avoid O(m*n) behavior
The diff-delta code can exhibit O(m*n) behavior with some patological
data set where most hash entries end up in the same hash bucket.

To prevent this, a limit is imposed to the number of entries that can
exist in the same hash bucket.

Because of the above the code is a tiny bit more expensive on average,
even if some small optimizations were added as well to atenuate the
overhead. But the problematic samples used to diagnoze the issue are now
orders of magnitude less expensive to process with only a slight loss in
compression.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 01:35:14 -08:00
3d99a7f4fa test-delta needs zlib to compile
Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-09 01:35:07 -08:00
bbe60241ae git-fmt-merge-msg cleanup
Since I've started using the "merge.summary" flag in my repo, my merge
messages look nicer, but I dislike how I get notifications of merges
within merges.

So I'd suggest this trivial change..

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-08 18:27:15 -08:00
2acc35b087 Merge branch 'master' into next
* master:
  repo-config: give value_ a sane default so regexec won't segfault
  Update http-push functionality
  cvsimport: Remove master-updating code
2006-03-07 17:07:40 -08:00
f067a13745 repo-config: give value_ a sane default so regexec won't segfault
Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-07 17:06:10 -08:00
aa1dbc9897 Update http-push functionality
This brings http-push functionality more in line with the ssh/git version,
by borrowing bits from send-pack and rev-list to process refspecs and
revision history in more standard ways.  Also, the status of remote objects
is determined using PROPFIND requests for the object directory rather than
HEAD requests for each object - while it may be less efficient for small
numbers of objects, this approach is able to get the status of all remote
loose objects in a maximum of 256 requests.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-07 17:03:21 -08:00
a541211ef4 cvsimport: Remove master-updating code
The code which tried to update the master branch was somewhat broken.
=> People should do that manually, with "git merge".

Signed-off-by: Matthias Urlichs <smurf@smurf.noris.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-07 17:00:45 -08:00
b06bc2a078 gitk: Fix display of diff lines beginning with --- or +++
Lines in a diff beginning with --- or +++ were not being displayed
at all.  Thanks to Robert Fitzsimons for pointing out the obvious
fix, that lines beginning with --- or +++ are only to be suppressed
in the diff header.  I also took the opportunity to replace a regexp
call with a couple of string compare calls, which should be faster.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-08 09:15:32 +11:00
e4a0e2aac0 Merge branch 'master' into next
* master:
  Merge branch 'sp/checkout'
  Merge branch 'fd/asciidoc'
  Allow format-patch to attach patches
  Allow adding arbitary lines in the mail header generated by format-patch.
2006-03-06 20:58:41 -08:00
2dcdb4c697 Merge branch 'sp/checkout'
* sp/checkout:
  Add --temp and --stage=all options to checkout-index.
2006-03-06 20:58:17 -08:00
9c3592cf3c Merge branch 'jc/pack' into next
* jc/pack:
  pack-objects: simplify "thin" pack.
2006-03-06 20:56:52 -08:00
3ca1fff611 Merge branch 'fd/asciidoc'
* fd/asciidoc:
  Tweak asciidoc output to work with broken docbook-xsl
2006-03-06 20:51:23 -08:00
19bb732728 Allow format-patch to attach patches
The --attach patch to git-format-patch to attach patches instead of
inlining them.  Some mailers linewrap inlined patches (eg. Mozilla).

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-06 17:04:53 -08:00
00333ca35c Allow adding arbitary lines in the mail header generated by format-patch.
Entries may be added to the config file as follows:

[format]
         headers = "Organization: CodeWeavers\nTo: wine-patches
<wine-patches@winehq.org>\n"

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-06 17:04:07 -08:00
70ca1a3f85 pack-objects: simplify "thin" pack.
There was a misguided logic to overly prefer using objects that
we are not going to pack as the base object.  This was
unnecessary.  It does not matter to the unpacking side where the
base object is -- it matters more to make the resulting delta
smaller.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-06 03:03:56 -08:00
806b8198cd Merge branch 'master' into next
* master:
  annotate-blame: tests incomplete lines.
  blame: unbreak "diff -U 0".
2006-03-06 00:41:47 -08:00
1242642c46 annotate-blame: tests incomplete lines.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-06 00:41:17 -08:00
690e307f54 blame: unbreak "diff -U 0".
The commit 604c86d15b changed the
original "diff -u0" to "diff -u -U 0" for portability.

A big mistake without proper testing.

The form "diff -u -U 0" shows the default 3-line contexts,
because -u and -U 0 contradicts with each other; "diff -U 0" (or
its longhand "diff --unified=0") is what we meant.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-06 00:32:50 -08:00
3bcd59a546 Merge branch 'fd/asciidoc' into next
* fd/asciidoc:
  Tweak asciidoc output to work with broken docbook-xsl
  annotate-blame test: add evil merge.
  annotate-blame test: don't "source", but say "."
  annotate/blame tests updates.
  annotate: Support annotation of files on other revisions.
  git/Documentation: fix SYNOPSIS style bugs
  blame: avoid "diff -u0".
  git-blame: Use the same tests for git-blame as for git-annotate
  blame and annotate: show localtime with timezone.
  blame: avoid -lm by not using log().
  git-blame: Make the output human readable
  get_revision(): do not dig deeper when we know we are at the end.
  documentation: add 'see also' sections to git-rm and git-add
  contrib/emacs/Makefile: Provide tool for byte-compiling files.
  gitignore: Ignore some more boring things.
2006-03-05 22:38:22 -08:00
e920b56557 Tweak asciidoc output to work with broken docbook-xsl
docbook-xsl v1.68 incorrectly converts "<screen>" from docbook to
manpage by not rendering it verbatim. v1.69 handles it correctly, but
not many current popular distributions ship with it.

asciidoc by default converts "listingblock" to "<screen>". This change
causes asciidoc in git to convert "listingblock" to "<literallayout>", which
both old and new docbook-xsl handle correctly.

The difference can be seen in any manpage which includes a multi-line
example, such as git-branch.

[jc: the original patch was an disaster for html backends, so I made
 it apply only to docbook backends. ]

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 22:38:12 -08:00
ce5b6e7111 annotate-blame test: add evil merge.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 22:37:15 -08:00
8ad02bc964 annotate-blame test: don't "source", but say "."
Just I am old fashioned.  Source inclusion in bourne shell is
"." (dot), not "source" -- that's csh.

[jc: yes I know bash groks it, but I am old fashioned.]

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 22:10:26 -08:00
92a903acfd annotate/blame tests updates.
This rewrites the result check code a bit.  The earlier one
using awk was splitting columns at any whitespace, which
confused lines attributed incorrectly to the merge made by the
default author "A U Thor <author@example.com>" with lines
attributed to author "A".

The latest test by Ryan to add the "starting from older commit"
test is also included, with another older commit test.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 22:09:15 -08:00
5fcab3d7db annotate: Support annotation of files on other revisions.
This is a bug fix, and cleans up one or two other things spotted during the
course of tracking down the main bug here.

[jc: the part that updates test-suite is split out to the next
 one. Also I dropped "use Data::Dumper;" which seemed leftover
 from debugging session.]

Signed-off-by: Ryan Anderson <ryan@michonline.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 22:01:28 -08:00
6013f17d88 Merge part of 'jc/pack' into 'next' 2006-03-05 17:05:08 -08:00
bd494fc76b git/Documentation: fix SYNOPSIS style bugs
This trivial patch fixes SYNOPSIS style bugs.

Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 17:02:02 -08:00
604c86d15b blame: avoid "diff -u0".
As Linus suggests, use "diff -u -U 0" instead.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 16:02:44 -08:00
8752d11d60 git-blame: Use the same tests for git-blame as for git-annotate
Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 16:02:44 -08:00
cfea8e077b blame and annotate: show localtime with timezone.
Earlier they showed gmtime and timezone, which was inconsistent
with the way our commits and tags are pretty-printed.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 16:02:44 -08:00
a0fb95e319 blame: avoid -lm by not using log().
... as suggested on the list.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 16:02:44 -08:00
ea4c7f9bf6 git-blame: Make the output human readable
The default output mode is slightly different from git-annotate's.
However, git-annotate's output mode can be obtained by using the
'-c' flag.

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 14:49:58 -08:00
ea5ed3abce get_revision(): do not dig deeper when we know we are at the end.
This resurrects the special casing for "rev-list -n 1" which
avoided reading parents unnecessarily.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 13:35:41 -08:00
872d001f7f documentation: add 'see also' sections to git-rm and git-add
Pair up git-add and git-rm by adding a 'see also' section that
references the opposite command to each of their documentation files.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 13:33:13 -08:00
8911db70f8 contrib/emacs/Makefile: Provide tool for byte-compiling files.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 11:32:49 -08:00
0aee3d6d4e gitignore: Ignore some more boring things.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 11:26:18 -08:00
473ab1659b verify-pack -v: show delta-chain histogram.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 11:22:01 -08:00
ee5c78434a Merge branch 'master' into next
* master:
  Const tightening.
  Documentation/Makefile: Some `git-*.txt' files aren't manpages.
  cvsserver: updated documentation
2006-03-05 02:49:34 -08:00
9201c70742 Const tightening.
Mark Wooding noticed there was a type mismatch warning in git.c; this
patch does things slightly differently (mostly tightening const) and
was what I was holding onto, waiting for the setup-revisions change
to be merged into the master branch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 02:47:29 -08:00
4a5d693950 Documentation/Makefile: Some `git-*.txt' files aren't manpages.
In particular, git-tools.txt isn't a manpage, and my Asciidoc gets upset
by it.  The simplest fix is to Remove articles from the list of manpages
the Makefile.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 02:32:13 -08:00
b30cc0daaf cvsserver: updated documentation
... and stripped trailing whitespace to appease the Gods...

Signed-off-by: Martin Langhoff <martin@catalyst.net.nz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 02:22:53 -08:00
6c2711e70c Merge branch 'sp/checkout' into next
* sp/checkout:
  Add --temp and --stage=all options to checkout-index.
  cosmetics: change from 'See-Also' to 'See Also'
  git-commit --amend: allow empty commit.
2006-03-05 00:59:07 -08:00
de84f99c12 Add --temp and --stage=all options to checkout-index.
Sometimes it is convient for a Porcelain to be able to checkout all
unmerged files in all stages so that an external merge tool can be
executed by the Porcelain or the end-user.  Using git-unpack-file
on each stage individually incurs a rather high penalty due to the
need to fork for each file version obtained.  git-checkout-index -a
--stage=all will now do the same thing, but faster.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 00:58:13 -08:00
46444f514b cosmetics: change from 'See-Also' to 'See Also'
Changes the documentation that uses 'See-Also' to the more common
'See Also' form.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 00:57:37 -08:00
8588452ceb git-commit --amend: allow empty commit.
When amending a commit only to update the commit log message, git-status
would rightly say "Nothing to commit."  Do not let this prevent commit to
be made.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-05 00:57:01 -08:00
a5abcd094b Merge branch 'jc/diff' into next
* jc/diff:
  Merge jc/diff leftover bits.
2006-03-04 16:21:38 -08:00
3ab8532b07 Merge branch 'master' into next
* master:
  Cauterize dropped or duplicate bits from next.
  Merge part of 'sp/checkout'
2006-03-04 16:21:33 -08:00
1c7fee5d08 Cauterize dropped or duplicate bits from next.
I am very sorry to do this, but without this funky octopus, "git
log --no-merges master..next" will show commits already merged
into "master" forever.

There are some commits on the next branch (which is never to be
rewound) that are reverts of other commits on the next branch.
They are to revert the finer grained delta experiments that
turned out to have undesirable performance effects.  Also there
are some other commits that were first done as a merge into
"next" (a pull request based on next) and then cherry picked
into master.  Since they are not going to be merged into
"master" ever, they will stay forever in "log master..next".

Yuck.

So this commit records the fact that the commits currently shown
by "git log --no-merges master..next" to be merged into "master"
are already in the master, either because they really are (in
the case of git-cvsserver bits, which needed cherry-picking into
"master"), or because they are fully reverted in "next" (in the
case of finer-grained delta bits).

Here is the way I made this commit:

 (1) Inspect "gitk --no-merges --parents master..next"

     This shows what git thinks are missing from master.  It
     shows chain of commits that are already merged and chain of
     commits whose net effect should amount to a no-op.

     Look at each commits and make sure they are either unwanted
     or already merged by cherry-picking.

 (2) Record the tip of branches that I do not want.  In this
     case, the following were unwanted:

     cfcbd3427e cvsserver
     c436eb8cf1 diff-delta
     38fd0721d0 diff-delta
     f0bcd511ee cvsserver
     2b8d9347aa diff-delta

 (3) Shorten the list by finding independent ones from the
     above.

     $ git show-branch --independent $the $above $tips
     
     cfcbd3427e
     c436eb8cf1

 (4) Checkout "master" and cauterize them with "ours" strategy:

     $ git merge -s ours "`cat $this-file`" HEAD cfcbd3 c436eb
2006-03-04 16:18:43 -08:00
ce2a34188b Merge jc/diff leftover bits. 2006-03-04 15:49:26 -08:00
d10ed827bc Merge part of 'sp/checkout' 2006-03-04 14:58:11 -08:00
b463ceb885 Merge branch 'master' into next
* master:
  AsciiDoc fix for tutorial
  git.el: Added customize support for all parameters.
  git.el: Added support for Signed-off-by.
  git.el: Automatically update .gitignore status.
  git.el: Set default directory before running the status mode setup hooks.
  git.el: Portability fixes for XEmacs and Emacs CVS.
  contrib/emacs: Add an Emacs VC backend.
2006-03-04 13:53:27 -08:00
2eb063c933 AsciiDoc fix for tutorial
RE \^.+\^ becomes <sup>. Not wanted here

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:50:04 -08:00
a79656e6af git.el: Added customize support for all parameters.
Also fixed quoting of git-log-msg-separator.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:47:02 -08:00
45033ad9e3 git.el: Added support for Signed-off-by.
If `git-append-signed-off-by' is non-nil, automatically append a
sign-off line to the log message when editing it.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:46:52 -08:00
b23761d9ac git.el: Automatically update .gitignore status.
Update .gitignore files in the status list as they are created or
modified.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:46:20 -08:00
a944652c05 git.el: Set default directory before running the status mode setup hooks.
Also set the list-buffers-directory variable for nicer buffer list
display.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:46:13 -08:00
18e3e99e3d git.el: Portability fixes for XEmacs and Emacs CVS.
Fixed octal constants for XEmacs.
Added highlighting support in log-edit buffer for Emacs CVS.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:45:58 -08:00
486a974acc contrib/emacs: Add an Emacs VC backend.
Add a basic Emacs VC backend. It currently supports the following
commands: checkin, checkout, diff, log, revert, and annotate. There is
only limited support for working with revisions other than HEAD.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:45:37 -08:00
cc44185f1f Merge branch 'jc/diff' into next
* jc/diff:
  diffcore-delta: make change counter to byte oriented again.
  diffcore-break: similarity estimator fix.
  count-delta: no need for this anymore.
2006-03-04 13:39:31 -08:00
ba23bbc8ef diffcore-delta: make change counter to byte oriented again.
The textual line oriented change counter was fun but was not
very effective.  It tended to overcount the changes.  This one
changes it to a simple N-letter substring based implementation.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:34:50 -08:00
4d0f39cecf diffcore-break: similarity estimator fix.
This is a companion patch to the previous fix to diffcore-rename.
The merging-back process should use a logic similar to what is used
there.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:26:36 -08:00
f5948cfe67 count-delta: no need for this anymore.
This is a companion patch to e29e1147e4
which made diffcore similarity estimator independent from the packfile
deltifier.  There is no reason for us to be counting the xdelta anymore.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-04 13:26:36 -08:00
8d6afc116a Merge branch 'master' into next
* master:
  Merge branch 'fk/blame'
  Merge branch 'lt/rev-list'
2006-03-04 13:23:24 -08:00
f2fea68a0f Merge branch 'fk/blame'
* fk/blame:
  git-blame, take 2
  Merge part of 'lt/rev-list' into 'fk/blame'
  Add git-blame, a tool for assigning blame.
2006-03-04 13:22:01 -08:00
21dbe12c76 Merge branch 'lt/rev-list'
* lt/rev-list:
  setup_revisions(): handle -n<n> and -<n> internally.
  git-log (internal): more options.
  git-log (internal): add approxidate.
  Rip out merge-order and make "git log <paths>..." work again.
  Tie it all together: "git log"
  Introduce trivial new pager.c helper infrastructure
  git-rev-list libification: rev-list walking
  Splitting rev-list into revisions lib, end of beginning.
  rev-list split: minimum fixup.
  First cut at libifying revlist generation
2006-03-04 13:21:17 -08:00
41094b8eeb Merge tag 'ko-next' into next
I just rebuilt my 'next' branch from scratch, based on master without
the delta topics that were there.  This would rewind the head which is
a no-no.  This merges the original 'next' back in, to finish the "reverting"
of these two topic branches.
nothing to commit
2006-03-04 00:41:39 -08:00
859ab4c87a Merge part of 'sp/checkout' 2006-03-04 00:32:25 -08:00
c339e8e2cb Merge branch 'fk/blame' into next
* fk/blame:
  git-blame, take 2
  Merge part of 'lt/rev-list' into 'fk/blame'
  Add git-blame, a tool for assigning blame.
2006-03-04 00:31:46 -08:00
6aba8fa865 Merge branch 'lt/rev-list' into next
* lt/rev-list:
  setup_revisions(): handle -n<n> and -<n> internally.
  git-log (internal): more options.
  git-log (internal): add approxidate.
  Rip out merge-order and make "git log <paths>..." work again.
  Tie it all together: "git log"
  Introduce trivial new pager.c helper infrastructure
  git-rev-list libification: rev-list walking
  Splitting rev-list into revisions lib, end of beginning.
  rev-list split: minimum fixup.
  First cut at libifying revlist generation
2006-03-04 00:31:38 -08:00
5aad948f65 Merge branch 'jc/diff' into next
* jc/diff:
  diffcore-rename: similarity estimator fix.
  diffcore-delta: stop using deltifier for packing.
2006-03-04 00:31:28 -08:00
ed19f36722 Add a Documentation/git-tools.txt
A brief survey of useful git tools, including third-party
and external projects.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 23:29:56 -08:00
91a6bf4682 cvsserver: anonymous cvs via pserver support
git-cvsserver now knows how to do the pserver auth chat when the user
is anonymous. To get it to work, add a line to your inetd.conf like

  cvspserver stream tcp nowait nobody git-cvsserver pserver

(On some inetd implementations you may have to put the pserver parameter twice.)

Commits are blocked. Naively, git-cvsserver assumes non-malicious users. Please
review the code before setting this up on an internet-accessible server.

NOTE: the <nobody> user above will need write access to the .git directory
to maintain the sqlite database. Updating of the sqlite database should be
put in an update hook to avoid this problem, so that it is maintained by
users with write access.
2006-03-04 20:30:04 +13:00
061ad5f4de Merge branch 'master' into next
* master:
  Merge branch 'tl/anno'
  cvsserver: better error messages
  cvsserver: nested directory creation fixups for Eclipse clients
  Merge branch 'maint'
  tar-tree: file/dirmode fix.
2006-03-03 22:29:32 -08:00
8bc63c9ad4 Merge branch 'tl/anno'
* tl/anno:
  annotate should number lines starting with 1
2006-03-03 22:29:17 -08:00
cdb6760e6f cvsserver: better error messages
We now have different error messages when the repo is not found vs repo is
not configured to allow gitcvs. Should help users during initial checkouts.

Signed-off-by: Martin Langhoff <martin@catalyst.net.nz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 22:28:04 -08:00
6be32d4791 cvsserver: nested directory creation fixups for Eclipse clients
To create nested directories without (or before) sending file entries
is rather tricky. Most clients just work. Eclipse, however, expects
a very specific sequence of events. With this patch, cvsserver meets
those expectations.

Note: we may want to reuse prepdir() in req_update -- should move it
outside of req_co. Right now prepdir() is tied to how req_co() works.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 21:37:31 -08:00
be972922d0 Merge branch 'maint'
* maint:
  tar-tree: file/dirmode fix.
2006-03-03 21:36:52 -08:00
473d404b53 tar-tree: file/dirmode fix.
This fixes two bugs introduced when we switched to generic tree
traversal code.

 (1) directory mode recorded silently became 0755, not 0777

 (2) if passed a tree object (not a commit), it emitted an
     alarming error message (but proceeded anyway).

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 21:36:38 -08:00
fe041ad68d Merge branch 'tl/anno' into next
* tl/anno:
  annotate should number lines starting with 1
  contrib/git-svn: fix a copied-tree bug in an overzealous assertion
  show-branch --topics: omit more uninteresting commits.
  workaround fat/ntfs deficiencies for t3600-rm.sh (git-rm)
  git-mv: fix moves into a subdir from outside
  send-email: accept --no-signed-off-by-cc as the documentation states
  contrib/git-svn: better documenting of CLI switches
  contrib/git-svn: add --id/-i=$GIT_SVN_ID command-line switch
  contrib/git-svn: avoid re-reading the repository uuid, it never changes
  contrib/git-svn: create a more recent master if one does not exist
  contrib/git-svn: cleanup option parsing
  contrib/git-svn: allow --authors-file to be specified
  contrib/git-svn: strip 'git-svn-id:' when commiting to SVN
  contrib/git-svn: several small bug fixes and changes
  contrib/git-svn: add -b/--branch switch for branch detection
  Prevent --index-info from ignoring -z.
  manpages: insert two missing [verse] markers for multi-line SYNOPSIS
  gitview: pass the missing argument _show_clicked_cb.
  Fix test case for some sed
  git-branch: add -r switch to list refs/remotes/*
2006-03-03 15:09:17 -08:00
c6d4217ebc annotate should number lines starting with 1
C programmers are well used to counting from zero, but every
other text file tool starts counting from 1.

Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 15:09:04 -08:00
ce4c8b24a1 contrib/git-svn: fix a copied-tree bug in an overzealous assertion
I thought passing --stop-on-copy to svn would save us from all
the trouble svn-arch-mirror had with directory (project) copies.
I was wrong, there was one thing I overlooked.

If a tree was moved from /foo/trunk to /bar/foo/trunk with no
other changes in r10, but the last change was done in r5, the
Last Changed Rev (from svn info) in /bar/foo/trunk will still be
r5, even though the copy in the repository didn't exist until
r10.

Now, if we ever detect that the Last Changed Rev isn't what
we're expecting, we'll run svn diff and only croak if there are
differences between them.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 15:07:12 -08:00
f794c23466 show-branch --topics: omit more uninteresting commits.
When inspecting contents of topic branches for yet-to-be-merged
commits, a commit that is in the release/master branch is
uninteresting.  Previous round still showed them, especially,
the ones before a topic branch that was forked from the
release/master later than other topic branches.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 14:34:40 -08:00
d51fac5310 workaround fat/ntfs deficiencies for t3600-rm.sh (git-rm)
Signed-off-by: Alex Riesen <ariesen@harmanbecker.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:28:33 -08:00
90924d55c5 git-mv: fix moves into a subdir from outside
git-mv needs to be run from the base directory so that
the check if a file is under revision also covers files
outside of a subdirectory. Previously, e.g. in the git repo,

  cd Documentation; git-mv ../README .

produced the error

  Error: '../README' not under version control

The test is extended for this case; it previously only tested
one direction.

Signed-off-by: Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:28:28 -08:00
8e69b31e0d send-email: accept --no-signed-off-by-cc as the documentation states
--no-signed-off-cc is still supported, for backwards compatibility

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:28:12 -08:00
448c81b495 contrib/git-svn: better documenting of CLI switches
Also, fix a asciidoc formatting error

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:27:30 -08:00
6f0783cf94 contrib/git-svn: add --id/-i=$GIT_SVN_ID command-line switch
I ended up using GIT_SVN_ID far more than I ever thought I
would.  Typing less is good.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:27:29 -08:00
1ca72aef45 contrib/git-svn: avoid re-reading the repository uuid, it never changes
If it does change, we're screwed anyways as SVN will refuse to
commit or update.  We also never access more than one SVN
repository per-invocation, so we can store it as a global, too.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:27:27 -08:00
7f60b22860 contrib/git-svn: create a more recent master if one does not exist
In a new repository, the initial fetch creates a master branch
if one does not exist so HEAD has something to point to.

It now creates a master at the end of the initial fetch run,
pointing to the latest revision.  Previously it pointed to the
first revision imported, which is generally less useful.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:27:25 -08:00
eeb0abe047 contrib/git-svn: cleanup option parsing
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:27:22 -08:00
a9612be245 contrib/git-svn: allow --authors-file to be specified
Syntax is compatible with git-svnimport and git-cvsimport:

	normalperson = Eric Wong <normalperson@yhbt.net>

If this option is specified and git-svn encounters an SVN
committer name that it cannot parse, it git-svn will abort.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:27:20 -08:00
df746c5a81 contrib/git-svn: strip 'git-svn-id:' when commiting to SVN
We regenerate and use git-svn-id: whenever we fetch or otherwise
commit to remotes/git-svn.  We don't actually know what revision
number we'll commit to SVN at commit time, so this is useless.
It won't throw off things like 'rebuild', though, which knows to
only use the last instance of git-svn-id: in a log message

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:27:18 -08:00
ac8e0b910c contrib/git-svn: several small bug fixes and changes
* Fixed manually-edited commit messages not going to
   remotes/git-svn on sequential commits after the sequential
   commit optimization.
 * format help correctly after adding 'show-ignore'
 * sha1_short regexp matches down to 4 hex characters
   (from git-rev-parse --short documentation)
 * Print the first line of the commit message when we commit to
   SVN next to the sha1.
 * Document 'T' (type change) in the comments

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:27:14 -08:00
69f0d91e49 contrib/git-svn: add -b/--branch switch for branch detection
I've said I don't like branches in Subversion, and I still don't.
This is a bit more flexible, though, as the argument for -b is any
arbitrary git head/tag reference.

This makes some things easier:
 * Importing git history into a brand new SVN branch.
 * Tracking multiple SVN branches via GIT_SVN_ID, even from multiple
   repositories.
 * Adding tags from SVN (still need to use GIT_SVN_ID, though).
 * Even merge tracking is supported, if and only the heads end up with
   100% equivalent tree objects.  This is more stricter but more robust
   and foolproof than parsing commit messages, imho.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-03 11:27:10 -08:00
a41c175d6f Prevent --index-info from ignoring -z.
If git-update-index --index-info -z is used only the first
record given to the process will actually be updated as
the -z option is ignored until after all index records
have been read and processed.  This meant that multiple
null terminated records were seen as a single record which
was lacking a trailing LF, however since the first record
ended in a null the C string handling functions ignored the
trailing garbage.  So --index-info should be required to be
the last command line option, much as --stdin is required
to be the last command line option.  Because --index-info
implies --stdin this isn't an issue as the user shouldn't
be passing --stdin when also passing --index-info.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 23:07:42 -08:00
c7569b1e00 manpages: insert two missing [verse] markers for multi-line SYNOPSIS
Found with:

	for i in *.txt; do
		grep -A 2 "SYNOPSIS" "$i" | grep -q "^\[verse\]$" && continue
		multiline=$(grep -A 3 "SYNOPSIS" "$i" | tail -n 1)
		test -n "$multiline" && echo "$i: $multiline"
	done

Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 23:07:34 -08:00
9645da330f gitview: pass the missing argument _show_clicked_cb.
In our last update to use the encoding while showing the commit
diff we added a new argument to this function. But we missed
updating all the callers.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 23:07:01 -08:00
d5dddccaa0 Fix test case for some sed
Some versions of sed lack the "-i" option.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 23:06:47 -08:00
fd8fc4ade5 git-branch: add -r switch to list refs/remotes/*
If we decide to use refs/remotes/, having a convenient way to
list them would be nice.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 23:06:04 -08:00
cd1333db4f Merge branch 'cvsserver' of http://locke.catalyst.net.nz/git/git-martinlanghoff; branch 'ml/cvsserver' into next
* 'cvsserver' of http://locke.catalyst.net.nz/git/git-martinlanghoff:
  cvsserver: fix checkouts with -d <somedir>
  cvsserver: checkout faster by sending files in a sensible order

* ml/cvsserver:
  cvsserver: fix checkouts with -d <somedir>
  cvsserver: checkout faster by sending files in a sensible order
2006-03-02 23:00:45 -08:00
e74ee784c7 cvsserver: fix checkouts with -d <somedir>
A recent Eclipse compat fix broke checkouts with -d. Fix it so that the server
sends the correct module name instead of the destination directory name.
2006-03-02 22:56:28 -08:00
501c7372c7 cvsserver: checkout faster by sending files in a sensible order
Just by sending the files in an ordered fashion, clients can process them
much faster. And we can optimize our check of whether we created this
directory already -- faster.

Timings for a checkout on a commandline cvs client for a project with
~13K files totalling ~100MB:

Unsorted:
  603.12 real        16.89 user        42.88 sys

Sorted:
  298.19 real        26.37 user        42.42 sys
2006-03-02 22:56:27 -08:00
539d84fe0a Merge branch 'jc/delta' into next
* jc/delta:
  diff-delta: cull collided hash bucket more aggressively.
2006-03-02 22:13:11 -08:00
d4c9982f8e Merge branch 'jc/diff' into next
* jc/diff:
  diffcore-rename: similarity estimator fix.
2006-03-02 22:13:08 -08:00
1706306a54 diffcore-rename: similarity estimator fix.
The "similarity" logic was giving added material way too much
negative weight.  What we wanted to see was how similar the
post-change image was compared to the pre-change image, so the
natural definition of similarity is how much common things are
there, relative to the post-change image's size.

This simplifies things a lot.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 22:12:33 -08:00
262cc77dab Merge branch 'fk/blame' into next
* fk/blame:
  git-blame, take 2
  Merge part of 'lt/rev-list' into 'fk/blame'
2006-03-02 21:15:56 -08:00
6f85a78df6 Merge branch 'lt/rev-list' into next
* lt/rev-list:
  setup_revisions(): handle -n<n> and -<n> internally.
2006-03-02 21:15:52 -08:00
810e300d4c Merge branch 'master' into next
* master:
  Merge branch 'jc/diff'
  git-commit: make sure we protect against races.
  git-commit --amend
  show-branch --topics
  GIT-VERSION-GEN: squelch unneeded error from "cat version"
  Merge branch 'ml/cvsserver'
  annotate: resurrect raw timestamps.
  Documentation: rev-list --objects-edge
  Documentation: read-tree --aggressive
  war on whitespaces: documentation.
2006-03-02 21:15:26 -08:00
0825f96cd0 Merge branch 'jc/diff'
* jc/diff:
  diffcore-delta: stop using deltifier for packing.
2006-03-02 21:15:06 -08:00
b8310152bc git-commit: make sure we protect against races.
An earlier commit 8098a178b2
accidentally lost race protection from git-commit command.
This commit reinstates it.  When something else updates HEAD
pointer while you were editing your commit message, the command
would notice and abort the commit.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 21:13:24 -08:00
b4019f0456 git-commit --amend
The new flag is used to amend the tip of the current branch.  Prepare
the tree object you would want to replace the latest commit as usual
(this includes the usual -i/-o and explicit paths), and the commit log
editor is seeded with the commit message from the tip of the current
branch.  The commit you create replaces the current tip -- if it was a
merge, it will have the parents of the current tip as parents -- so the
current top commit is discarded.

It is a rough equivalent for:

	$ git reset --soft HEAD^
	$ ... do something else to come up with the right tree ...
	$ git commit -c ORIG_HEAD

but can be used to amend a merge commit.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 21:08:33 -08:00
cfcbd3427e cvsserver: fix checkouts with -d <somedir>
A recent Eclipse compat fix broke checkouts with -d. Fix it so that the server
sends the correct module name instead of the destination directory name.
2006-03-03 16:57:03 +13:00
5398fed966 cvsserver: checkout faster by sending files in a sensible order
Just by sending the files in an ordered fashion, clients can process them
much faster. And we can optimize our check of whether we created this
directory already -- faster.

Timings for a checkout on a commandline cvs client for a project with
~13K files totalling ~100MB:

Unsorted:
  603.12 real        16.89 user        42.88 sys

Sorted:
  298.19 real        26.37 user        42.42 sys
2006-03-03 16:38:03 +13:00
d320a5437f show-branch --topics
This adds a new flag, --topics, to help managing topic
branches.  When you have topic branches forked some time ago
from your primary line of development, show-branch would show
many "uninteresting" things that happend on the primary line of
development when trying to see what are still not merged from
the topic branches.

With this flag, the first ref given to show-branch is taken as
the primary branch, and the rest are taken as the topic
branches.  Output from the command is modified so that commits
only on the primary branch are not shown.  In other words,

	$ git show-branch --topics master topic1 topic2 ...

shows an (almost) equivalent of

	$ git rev-list ^master topic1 topic2 ...

The major differences are that (1) you can tell which commits
are on which branch, and (2) the commit at the fork point is
shown.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 17:16:08 -08:00
0b8b051cd5 GIT-VERSION-GEN: squelch unneeded error from "cat version"
Now this is really a corner case, but if you have the git source
tree from somewhere other than the official tarball, you do not
have version file.  And if git-describe does not work for you
(maybe you do not have git yet), we spilled an error message
from "cat version".

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 16:42:39 -08:00
64bc6e3db5 setup_revisions(): handle -n<n> and -<n> internally.
This moves the handling of max-count shorthand from the internal
implementation of "git log" to setup_revisions() so other users
of setup_revisions() can use it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 15:24:01 -08:00
fc675b8cd5 git-blame, take 2
Here is an updated version of git-blame. The main changes compared to
the first version are:

* Use the new revision.h interface to do the revision walking
* Do the right thing in a lot of more cases than before. In particular
  parallel development tracks are hopefully handled sanely.
* Lots of clean-up

It still won't follow file renames though.

There are still some differences in the output between git-blame and
git-annotate. For example, in 'Makefile' git-blame assigns lines
354-358 to 455a7f3275 and git-annotate
assigns the same lines to 79a9d8ea0d.

I think git-blame is correct in this case. This patterns occur in
several other places, git-annotate seems to sometimes assign lines to
merge commits when the lines actually changed in some other commit
which precedes the merge.

[jc: I have conned Ryan into doing test cases, so that it would
help development and fixes on both implementations.  Let the
battle begin! ;-) ]

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 15:10:39 -08:00
c40610422e Merge part of 'lt/rev-list' into 'fk/blame'
Now blame will depend on the new revision walker infrastructure,
we need to make it depend on earlier parts of Linus' rev-list
topic branch, hence this merge.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 15:10:05 -08:00
9f841cf1fb [PATCH] gitk: Make error_popup react to Return
The error popup window can be now closed not only by clicking
the button, but also by pressing Return.

Signed-Off-By: Martin Mares <mj@ucw.cz>

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-03 09:56:32 +11:00
0cd5da56fa Merge branch 'ml/cvsserver'
* ml/cvsserver:
  cvsserver: Eclipse compat -- now "compare with latest from HEAD" works
  cvsserver: Checkout correctly on Eclipse
2006-03-02 14:19:33 -08:00
c934a8a3a3 gitk: Fix a bug in drawing the selected line as a thick line
If you clicked on a line, so that it was drawn double-thickness,
and then scrolled to bring on-screen a child that hadn't previously
been drawn, the lines from it to the selected line were drawn
single-thickness.  This fixes it so they are drawn double-thickness.
This also removes an unnecessary setting of phase in drawrest.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-02 23:00:44 +11:00
8ed1648415 gitk: Further speedups
Now we don't parse the commits as we are reading them, we just put
commit data on a list as a blob, and instead parse the commit when
we need the various parts of it, such as when a commit is drawn on
the canvas.  This makes searching a bit more interesting: now we
scan through the commit blobs doing a string or regexp match to find
commits that might match, then for those that might match, we parse
the commit info (if it isn't already parsed) and do the matching
for the various fields as before.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-03-02 22:56:44 +11:00
d920e18f53 annotate: resurrect raw timestamps.
For scripted use this is quite useful.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 01:50:09 -08:00
ec579767e7 Documentation: rev-list --objects-edge
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 01:11:31 -08:00
afaa8d66ab Documentation: read-tree --aggressive
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 01:11:05 -08:00
8273c79ae2 war on whitespaces: documentation.
We were missing the --whitespace option in the usage string for
git-apply and git-am, so this commit adds them.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 00:52:59 -08:00
df45467ec9 Merge branch 'master' into next
* master:
  contrib/git-svn: use refs/remotes/git-svn instead of git-svn-HEAD
  Merge branch 'maint'
  read-tree --aggressive: remove deleted entry from the working tree.
  Merge branch 'jc/tag'
  Merge part of 'jc/diff'
2006-03-02 00:02:27 -08:00
2beb3cdd18 contrib/git-svn: use refs/remotes/git-svn instead of git-svn-HEAD
After reading a lengthy discussion on the list, I've come to the
conclusion that creating a 'remotes' directory in refs isn't
such a bad idea.

You can still branch from it by specifying remotes/git-svn (not
needing the leading 'refs/'), and the documentation has been
updated to reflect that.

The 'git-svn' part of the ref can of course be set to whatever
you want by using the GIT_SVN_ID environment variable, as
before.

I'm using refs/remotes/git-svn, and not going with something
like refs/remotes/git-svn/HEAD as it's redundant for Subversion
where there's zero distinction between branches and directories.

Run git-svn rebuild --upgrade to upgrade your repository to use
the new head.  git-svn-HEAD must be manually deleted for safety
reasons.

Side note: if you ever (and I hope you never) want to run
git-update-refs on a 'remotes/' ref, make sure you have the
'refs/' prefix as you don't want to be clobbering your
'remotes/' in $GIT_DIR (where remote URLs are stored).

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-02 00:01:36 -08:00
2486927d2e Merge branch 'maint'
* maint:
  read-tree --aggressive: remove deleted entry from the working tree.
2006-03-01 23:20:31 -08:00
1142038098 read-tree --aggressive: remove deleted entry from the working tree.
When both heads deleted, or our side deleted while the other
side did not touch, we did not have to update the working tree.

However, we forgot to remove existing working tree file when we
did not touch and the other side did.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 23:20:01 -08:00
0c1fc940ee Merge branch 'ml/cvsserver' into next
* ml/cvsserver:
  cvsserver: Eclipse compat -- now "compare with latest from HEAD" works
2006-03-01 22:27:06 -08:00
70e1cca388 Merge branch 'jc/tag'
* jc/tag:
  Pretty-print tagger dates.
2006-03-01 22:17:44 -08:00
379156e1dc Merge part of 'jc/diff' 2006-03-01 22:15:38 -08:00
b485db9896 Merge branch 'np/delta' into next
* np/delta:
  diff-delta: allow reusing of the reference buffer index
  diff-delta: bound hash list length to avoid O(m*n) behavior
  diff-delta: produce optimal pack data
  Merge branch 'kh/svnimport'
  Merge branch 'js/refs'
  annotate: fix -S parameter to take a string
  annotate: Add a basic set of test cases.
  annotate: handle \No newline at end of file.
  gitview: Use horizontal scroll bar in the tree view
2006-03-01 22:08:12 -08:00
38fd0721d0 diff-delta: allow reusing of the reference buffer index
When a reference buffer is used multiple times then its index can be
computed only once and reused multiple times.  This patch adds an extra
pointer to a pointer argument (from_index) to diff_delta() for this.

If from_index is NULL then everything is like before.

If from_index is non NULL and *from_index is NULL then the index is
created and its location stored to *from_index.  In this case the caller
has the responsibility to free the memory pointed to by *from_index.

If from_index and *from_index are non NULL then the index is reused as
is.

This currently saves about 10% of CPU time to repack the git archive.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 21:53:22 -08:00
5bb86b82ba diff-delta: bound hash list length to avoid O(m*n) behavior
The diff-delta code can exhibit O(m*n) behavior with some patological
data set where most hash entries end up in the same hash bucket.

The latest code rework reduced the block size making it particularly
vulnerable to this issue, but the issue was always there and can be
triggered regardless of the block size.

This patch does two things:

1) the hashing has been reworked to offer a better distribution to
   atenuate the problem a bit, and

2) a limit is imposed to the number of entries that can exist in the
   same hash bucket.

Because of the above the code is a bit more expensive on average, but
the problematic samples used to diagnoze the issue are now orders of
magnitude less expensive to process with only a slight loss in
compression.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 21:51:14 -08:00
cc5c59a30c diff-delta: produce optimal pack data
Indexing based on adler32 has a match precision based on the block size
(currently 16).  Lowering the block size would produce smaller deltas
but the indexing memory and computing cost increases significantly.

For optimal delta result the indexing block size should be 3 with an
increment of 1 (instead of 16 and 16).  With such low params the adler32
becomes a clear overhead increasing the time for git-repack by a factor
of 3.  And with such small blocks the adler 32 is not very useful as the
whole of the block bits can be used directly.

This patch replaces the adler32 with an open coded index value based on
3 characters directly.  This gives sufficient bits for hashing and
allows for optimal delta with reasonable CPU cycles.

The resulting packs are 6% smaller on average.  The increase in CPU time
is about 25%.  But this cost is now hidden by the delta reuse patch
while the saving on data transfers is always there.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 21:51:00 -08:00
5343cf1082 Merge branch 'kh/svnimport'
* kh/svnimport:
  Save username -> Full Name <email@addr.es> map file
2006-03-01 21:46:01 -08:00
b6b626fad7 Merge branch 'js/refs'
* js/refs:
  Warn about invalid refs
2006-03-01 21:45:56 -08:00
ec58db15a9 cvsserver: Eclipse compat -- now "compare with latest from HEAD" works
The Eclipse client uses cvs update when that menu option is triggered.
And doesn't like the standard cvs update response. Give it *exactly* what
it wants.

And hope the other clients don't lose the plot too badly.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 21:41:58 -08:00
009315499e annotate: fix -S parameter to take a string
In the conversion to Getopt::Long, the -S / --rev-list parameter stopped
working. We need to tell Getopt::Long that it is a string.

As a bonus, the open() now does some useful error handling.

Signed-off-by: Martin Langhoff <martin@catalyst.net.nz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 21:33:27 -08:00
7c3ecb65ee annotate: Add a basic set of test cases.
Signed-off-by: Ryan Anderson <ryan@michonline.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 21:32:20 -08:00
e5971d7d13 annotate: handle \No newline at end of file.
Signed-off-by: Ryan Anderson <ryan@michonline.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 21:32:17 -08:00
5aa44d50f4 gitview: Use horizontal scroll bar in the tree view
Earlier we set up the window to never scroll
horizontally, which made it harder to use on a narrow screen.
This patch allows scrollbar to be used as needed by Gtk

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 21:32:00 -08:00
09a278e6b9 Merge branch 'ml/cvsserver' into next
* ml/cvsserver:
  cvsserver: Checkout correctly on Eclipse
2006-03-01 17:45:09 -08:00
c8c4f22025 cvsserver: Checkout correctly on Eclipse
Initial checkouts were failing to create Entries files under Eclipse.
Eclipse was waiting for two non-standard directory-resets to prepare for a new
directory from the server.

This patch is tricky, because the same directory resets tend to confuse other
clients. It's taken a bit of fiddling to get the commandline cvs client and
Eclipse to get a good, clean checkout.

Signed-off-by: Martin Langhoff <martin@catalyst.net.nz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 17:44:58 -08:00
ed50804e54 Merge branch 'jc/tag' into next
* jc/tag:
  Pretty-print tagger dates.
2006-03-01 17:43:02 -08:00
3bddd7dbba Pull GIT 1.2.4 fixes from master 2006-03-01 17:42:30 -08:00
2b74cffa91 Re-fix compilation warnings.
Commit 8fcf1ad9c6 has a
combination of double cast and Andreas' switch to using
unsigned long ... just the latter is sufficient (and a lot less
ugly than using the double cast).

Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 17:42:00 -08:00
1114b68f25 Merge branch 'jc/diff' into next
* jc/diff:
  diffcore-delta: stop using deltifier for packing.
2006-03-01 17:09:50 -08:00
2495ca0447 Up to date with GIT 1.2.4 fixes 2006-03-01 17:07:42 -08:00
a0f15fa502 Pretty-print tagger dates.
We can show commit objects with human readable dates using
various --pretty options, but there was no way to do so with
tags.  This introduces two such ways:

$ git-cat-file -p v1.2.3

shows the tag object with tagger dates in human readable format.

$ git-verify-tag --verbose v1.2.3

uses it to show the contents of the tag object as well as doing
GPG verification.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 17:06:20 -08:00
e1a0c8b148 Merge branch 'lt/fix-apply' into maint
* lt/fix-apply:
  git-am: --whitespace=x option.
  git-apply: war on whitespace -- finishing touches.
  git-apply --whitespace=nowarn
  apply --whitespace: configuration option.
  apply: squelch excessive errors and --whitespace=error-all
  apply --whitespace fixes and enhancements.
  The war on trailing whitespace
2006-03-01 17:06:12 -08:00
145c9a60ad Merge branch 'lt/apply'
* lt/apply:
  git-am: --whitespace=x option.
  git-apply: war on whitespace -- finishing touches.
  git-apply --whitespace=nowarn
  apply --whitespace: configuration option.
  apply: squelch excessive errors and --whitespace=error-all
  apply --whitespace fixes and enhancements.
  The war on trailing whitespace
2006-03-01 17:05:57 -08:00
6be65bbc95 Merge early parts of 'np/delta' branch 2006-03-01 16:55:51 -08:00
4d569a2c42 Merge git-mv fixes from 'maint' 2006-03-01 12:16:25 -08:00
9e7c73de0b git-mv: fixes for path handling
Moving a directory ending in a slash was not working as the
destination was not calculated correctly.
E.g. in the git repo,

 git-mv t/ Documentation

gave the error

 Error: destination 'Documentation' already exists

To get rid of this problem, strip trailing slashes from all arguments.
The comment in cg-mv made me curious about this issue; Pasky, thanks!
As result, the workaround in cg-mv is not needed any more.

Also, another bug was shown by cg-mv. When moving files outside of
a subdirectory, it typically calls git-mv with something like

 git-mv Documentation/git.txt Documentation/../git-mv.txt

which triggers the following error from git-update-index:

 Ignoring path Documentation/../git-mv.txt

The result is a moved file, removed from git revisioning, but not
added again. To fix this, the paths have to be normalized not have ".."
in the middle. This was already done in git-mv, but only for
a better visual appearance :(

Signed-off-by: Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 12:13:46 -08:00
5e6f85f6c1 git-mv: Allow -h without repo & fix error message
This fixes "git-mv -h" to output the usage without the need
to be in a git repository.
Additionally:
- fix confusing error message when only one arg was given
- fix typo in error message

Signed-off-by: Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 12:13:44 -08:00
573464319f Allow git-mv to accept ./ in paths.
Signed-off-by: Junio C Hamano <junkio@cox.net>
(cherry picked from 9a0e6731c6 commit)
2006-03-01 12:12:53 -08:00
feffaddce0 combine-diff: Honour -z option correctly.
Combined diffs don't null terminate things in the same way as standard
diffs.  This is presumably wrong.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
(cherry picked from 6baf0484ef commit)
2006-03-01 04:09:41 -08:00
b9003c06a8 combine-diff: Honour --full-index.
For some reason, combined diffs don't honour the --full-index flag when
emitting patches.  Fix this.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
(cherry picked from e70c6b3574 commit)
2006-03-01 04:09:40 -08:00
a64dd34d8c diffcore-break: micro-optimize by avoiding delta between identical files.
We did not check if we have the same file on both sides when
computing break score.  This is usually not a problem, but if
the user said --find-copies-harde with -B, we ended up trying a
delta between the same data even when we know the SHA1 hash of
both sides match.

Signed-off-by: Junio C Hamano <junkio@cox.net>
(cherry picked from aeecd23ae2 commit)
2006-03-01 04:08:12 -08:00
2b443e0fc3 Merge branch 'lt/rev-list' into next
* lt/rev-list:
  git-log (internal): more options.
  git-log (internal): add approxidate.
2006-03-01 03:17:13 -08:00
7ae0b0cb65 git-log (internal): more options.
This ports the following options from rev-list based git-log
implementation:

 * -<n>, -n<n>, and -n <n>.  I am still wondering if we want
    this natively supported by setup_revisions(), which already
    takes --max-count.  We may want to move them in the next
    round.  Also I am not sure if we can get away with not
    setting revs->limited when we set max-count.  The latest
    rev-list.c and revision.c in this series do not, so I left
    them as they are.

 * --pretty and --pretty=<fmt>.

 * --abbrev=<n> and --no-abbrev.

The previous commit already handles time-based limiters
(--since, --until and friends).  The remaining things that
rev-list based git-log happens to do are not useful in a pure
log-viewing purposes, and not ported:

 * --bisect (obviously).

 * --header.  I am actually in favor of doing the NUL
   terminated record format, but rev-list based one always
   passed --pretty, which defeated this option.  Maybe next
   round.

 * --parents.  I do not think of a reason a log viewer wants
   this.  The flag is primarily for feeding squashed history
   via pipe to downstream tools.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 03:16:34 -08:00
fd751667a2 git-log (internal): add approxidate.
Next will be the pretty-print format.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 03:16:34 -08:00
1025fe51bf Merge branch 'lt/rev-list' into next
* lt/rev-list:
  Rip out merge-order and make "git log <paths>..." work again.
  Tie it all together: "git log"
  Introduce trivial new pager.c helper infrastructure
  git-rev-list libification: rev-list walking

blame.c #include's epoch.h; it needed to be killed.
2006-03-01 02:55:56 -08:00
c436eb8cf1 diff-delta: cull collided hash bucket more aggressively.
This tries to limit collided hash buckets by removing identical
three-byte prefix from the same hashbucket.
2006-03-01 01:57:45 -08:00
765ac8ec46 Rip out merge-order and make "git log <paths>..." work again.
Well, assuming breaking --merge-order is fine, here's a patch (on top of
the other ones) that makes

	git log <filename>

actually work, as far as I can tell.

I didn't add the logic for --before/--after flags, but that should be
pretty trivial, and is independent of this anyway.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 01:45:50 -08:00
213523f46c Merge part of 'jc/diff' into next 2006-03-01 01:36:29 -08:00
d54000ca3e Merge part of 'sp/checkout' into next 2006-03-01 01:35:51 -08:00
f64c429ff7 Merge branch 'lt/apply' into next
* lt/apply:
  git-am: --whitespace=x option.
2006-03-01 01:35:00 -08:00
dcf7e417c6 Merge branch 'js/refs' into next
* js/refs:
  Warn about invalid refs
2006-03-01 01:34:00 -08:00
6ecc321ba5 Merge branch 'cvsserver' of http://locke.catalyst.net.nz/git/git-martinlanghoff; branch 'master' into next
Conflicts:

	Documentation/git-cvsserver.txt
	git-cvsserver.perl

Originally Martin's tree was based on "next", which meant that all
the other things that I am not ready to push out to "master" were
contained in it.  His changes looked good, and I wanted to have them
in "master".

So, here is what I did:

 - fetch Martin's tree into a temporary topic branch.
   $ git fetch $URL $remote:ml/cvsserver
   $ git checkout ml/cvsserver

 - rebase it on top of "master".
   $ git rebase --onto master next

 - pull that master into "next", recording Martin's head as well.
   $ git pull --append . master

Since I have apply.whitespace=strip in my configuration file, the
rebased cvsserver changes have trailing whitespaces introduced by
Martin's tree cleansed out.  Hence the above conflicts.

The reason I made this octopus is to make sure that next time Martin
pulls from my "next" branch, it results in a fast forward.  There is
no reason to force him do the same conflict resolution I did with this
merge.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 01:33:23 -08:00
9debe63d10 Teach git-checkout-index to read filenames from stdin.
Since git-checkout-index is often used from scripts which
may have a stream of filenames they wish to checkout it is
more convenient to use --stdin than xargs.  On platforms
where fork performance is currently sub-optimal and
the length of a command line is limited (*cough* Cygwin
*cough*) running a single git-checkout-index process for
a large number of files beats spawning it multiple times
from xargs.

File names are still accepted on the command line if
--stdin is not supplied.  Nothing is performed if no files
are supplied on the command line or by stdin.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 01:15:31 -08:00
c401cb48e7 Warn about invalid refs
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-03-01 01:15:12 -08:00
858cbfbabe cvsserver: Eclipse compat - browsing 'modules' (heads in our case) works
Eclipse CVS clients have an odd way of perusing the top level of
the repository, by calling update on module "". So reproduce cvs'
odd behaviour in the interest of compatibility.

It makes it much easier to get a checkout when using Eclipse.
2006-03-01 01:10:27 -08:00
7172aabb4b cvsserver: Eclipse compat fixes - implement Questionable, alias rlog, add a space after the U
A few things to satisfy Eclipse's strange habits as a cvs client:

- Implement Questionable
- Aliased rlog to log, but more work may be needed
- Add a space after the U that indicates updated
2006-03-01 01:10:26 -08:00
ee75d4cd31 cvsserver: add notes on how to get a checkout under Eclipse 2006-03-01 01:10:26 -08:00
f0bcd511ee cvsserver: Eclipse compat - browsing 'modules' (heads in our case) works
Eclipse CVS clients have an odd way of perusing the top level of
the repository, by calling update on module "". So reproduce cvs'
odd behaviour in the interest of compatibility.

It makes it much easier to get a checkout when using Eclipse.
2006-03-01 21:07:55 +13:00
5793aa1cc0 cvsserver: Eclipse compat fixes - implement Questionable, alias rlog, add a space after the U
A few things to satisfy Eclipse's strange habits as a cvs client:

- Implement Questionable
- Aliased rlog to log, but more work may be needed
- Add a space after the U that indicates updated
2006-03-01 21:07:55 +13:00
49cc27bb46 cvsserver: add notes on how to get a checkout under Eclipse 2006-03-01 21:07:40 +13:00
12cbbdc40b git-am: --whitespace=x option.
This is passed down to git-apply to override the built-in
default and per-repository configuration at runtime.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 22:38:40 -08:00
8c31cb822f git-am: --whitespace=x option.
This is passed down to git-apply to override the built-in
default and per-repository configuration at runtime.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 22:34:57 -08:00
e29e1147e4 diffcore-delta: stop using deltifier for packing.
This switches the change estimation logic used by break, rename
and copy detection from delta packing code to a more line
oriented one.  This way, thee performance-density tradeoff by
delta packing code can be made without worrying about breaking
the rename detection.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 20:20:04 -08:00
65416758cd diffcore-rename: split out the delta counting code.
This is to rework diffcore break/rename/copy detection code
so that it does not affected when deltifier code gets improved.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 20:20:04 -08:00
aeecd23ae2 diffcore-break: micro-optimize by avoiding delta between identical files.
We did not check if we have the same file on both sides when
computing break score.  This is usually not a problem, but if
the user said --find-copies-harde with -B, we ended up trying a
delta between the same data even when we know the SHA1 hash of
both sides match.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 20:19:47 -08:00
70b006b971 Tie it all together: "git log"
This is what the previous diffs all built up to.

We can do "git log" as a trivial small helper function inside git.c,
because the infrastructure is all there for us to use as a library.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 14:49:34 -08:00
f67b45f862 Introduce trivial new pager.c helper infrastructure
This introduces the new function

	void setup_pager(void);

to set up output to be written through a pager applocation.

All in preparation for doing the simple scripts in C.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 14:49:32 -08:00
a4a88b2bab git-rev-list libification: rev-list walking
This actually moves the "meat" of the revision walking from rev-list.c
to the new library code in revision.h. It introduces the new functions

	void prepare_revision_walk(struct rev_info *revs);
	struct commit *get_revision(struct rev_info *revs);

to prepare and then walk the revisions that we have.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 14:49:29 -08:00
e3601e8bb7 Darwin: Ignore missing /sw/lib
When on Darwin platforms don't include Fink or DarwinPorts
into the link path unless the related library directory
is actually present.  The linker on MacOS 10.4 complains
if it is given a directory which does not exist.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 11:02:13 -08:00
d82343b938 gitview: Set the default width of graph cell
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 11:02:10 -08:00
0852694ba4 gitview: Some window layout changes.
This makes menubar look nice

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 11:02:08 -08:00
3abe217a5b gitview: Select the text color based on whether the entry in highlighted. Use standard font.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 11:02:02 -08:00
8f7d0cecf4 gitk: Various speed improvements
This rearranges the code a little to eliminate some procedure calls
and reduce the number of globals accessed.  It makes rowidlist and
rowoffsets lists rather than arrays, and removes the lineid array,
since $lineid($l) was the same as [lindex $displayorder $l], and the
latter is a little faster.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-02-28 22:10:19 +11:00
56248c5a5c git-apply: war on whitespace -- finishing touches.
This changes the default --whitespace policy to nowarn when we
are only getting --stat, --summary etc. IOW when not applying
the patch.  When applying the patch, the default is warn (spit
out warning message but apply the patch).

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 01:17:14 -08:00
d00e0f8101 Merge part of np/delta 2006-02-28 01:15:29 -08:00
a369bbfcc0 Merge branch 'lt/apply' into next
* lt/apply:
  git-apply: war on whitespace -- finishing touches.
  git-apply --whitespace=nowarn
2006-02-28 01:14:56 -08:00
f21d672615 git-apply: war on whitespace -- finishing touches.
This changes the default --whitespace policy to nowarn when we
are only getting --stat, --summary etc. IOW when not applying
the patch.  When applying the patch, the default is warn (spit
out warning message but apply the patch).

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-28 01:12:52 -08:00
2b8d9347aa diff-delta: bound hash list length to avoid O(m*n) behavior
The diff-delta code can exhibit O(m*n) behavior with some patological
data set where most hash entries end up in the same hash bucket.

The latest code rework reduced the block size making it particularly
vulnerable to this issue, but the issue was always there and can be
triggered regardless of the block size.

This patch does two things:

1) the hashing has been reworked to offer a better distribution to
   atenuate the problem a bit, and

2) a limit is imposed to the number of entries that can exist in the
   same hash bucket.

Because of the above the code is a bit more expensive on average, but
the problematic samples used to diagnoze the issue are now orders of
magnitude less expensive to process with only a slight loss in
compression.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 21:38:01 -08:00
bec2a69fe4 Revert "Revert "diff-delta: produce optimal pack data"" 2006-02-27 21:37:56 -08:00
5c0d46eb3d git-apply --whitespace=nowarn
Andrew insists --whitespace=warn should be the default, and I
tend to agree.  This introduces --whitespace=warn, so if your
project policy is more lenient, you can squelch them by having
apply.whitespace=nowarn in your configuration file.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 17:36:00 -08:00
383e20b614 apply --whitespace: configuration option.
The new configuration option apply.whitespace can take one of
"warn", "error", "error-all", or "strip".  When git-apply is run
to apply the patch to the index, they are used as the default
value if there is no command line --whitespace option.

Andrew can now tell people who feed him git trees to update to
this version and say:

	git repo-config apply.whitespace error

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 17:36:00 -08:00
59aa256204 apply: squelch excessive errors and --whitespace=error-all
This by default makes --whitespace=warn, error, and strip to
warn only the first 5 additions of trailing whitespaces.  A new
option --whitespace=error-all can be used to view all of them
before applying.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 17:35:59 -08:00
5c7b580c94 apply --whitespace fixes and enhancements.
In addition to fixing obvious command line parsing bugs in the
previous round, this changes the following:

 * Adds "--whitespace=strip".  This applies after stripping the
   new trailing whitespaces introduced to the patch.

 * The output error message format is changed to say
   "patch-filename:linenumber:contents of the line".  This makes
   it similar to typical compiler error message format, and
   helps C-x ` (next-error) in Emacs compilation buffer.

 * --whitespace=error and --whitespace=warn do not stop at the
   first error.  We might want to limit the output to say first
   20 such lines to prevent cluttering, but on the other hand if
   you are willing to hand-fix after inspecting them, getting
   everything with a single run might be easier to work with.
   After all, somebody has to do the clean-up work somewhere.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 17:35:59 -08:00
1187df57c2 The war on trailing whitespace
On Sat, 25 Feb 2006, Andrew Morton wrote:
>
> I'd suggest a) git will simply refuse to apply such a patch unless given a
> special `forcing' flag, b) even when thus forced, it will still warn and c)
> with a different flag, it will strip-then-apply, without generating a
> warning.

This doesn't do the "strip-then-apply" thing, but it allows you to make
git-apply generate a warning or error on extraneous whitespace.

Use --whitespace=warn to warn, and (surprise, surprise) --whitespace=error
to make it a fatal error to have whitespace at the end.

Totally untested, of course. But it compiles, so it must be fine.

HOWEVER! Note that this literally will check every single patch-line with
"+" at the beginning. Which means that if you fix a simple typo, and the
line had a space at the end before, and you didn't remove it, that's still
considered a "new line with whitespace at the end", even though obviously
the line wasn't really new.

I assume this is what you wanted, and there isn't really any sane
alternatives (you could make the warning activate only for _pure_
additions with no deletions at all in that hunk, but that sounds a bit
insane).

		Linus
2006-02-27 17:35:59 -08:00
621603b76a git-apply --whitespace=nowarn
Andrew insists --whitespace=warn should be the default, and I
tend to agree.  This introduces --whitespace=warn, so if your
project policy is more lenient, you can squelch them by having
apply.whitespace=nowarn in your configuration file.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 17:34:26 -08:00
aa81d97476 gitk: Fix Update menu item
This just does the simple thing of resetting everything, reading all
the commits, and redoing the whole layout from scratch.  Hopefully
things are now fast enough that this simple approach is acceptable.
Also, this fits in better with future plans for adding the ability
to restrict the tree to just a few files and then expand back to
the whole tree.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-02-28 11:27:12 +11:00
6d5e6fff52 Merge branch 'master' into next
* master:
  Merge part of kh/svnimport branch into master
  contrib/git-svn: correct commit example in manpage
  contrib/git-svn: tell the user to not modify git-svn-HEAD directly
  gitview: Remove trailing white space
  gitview: Fix the encoding related bug
  git-format-patch: Always add a blank line between headers and body.
  combine-diff: Honour -z option correctly.
  combine-diff: Honour --full-index.
2006-02-27 15:54:36 -08:00
bfea9fc499 Merge branch 'lt/rev-list' into next
* lt/rev-list:
  Splitting rev-list into revisions lib, end of beginning.
2006-02-27 15:48:17 -08:00
27a3f33945 Merge branch 'lt/apply' into next
* lt/apply:
  apply --whitespace: configuration option.
  apply: squelch excessive errors and --whitespace=error-all
2006-02-27 15:48:13 -08:00
6490603b1b Merge branch 'kh/svnimport' into next
* kh/svnimport:
  Save username -> Full Name <email@addr.es> map file
  Let git-svnimport's author file use same syntax as git-cvsimport's
2006-02-27 15:48:06 -08:00
f3a4ec48e4 Merge part of kh/svnimport branch into master 2006-02-27 15:46:39 -08:00
7be737680f contrib/git-svn: correct commit example in manpage
Thanks to Nicolas Vilz <niv@iaglans.de> for noticing this.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 15:27:51 -08:00
d3cac2c95a Save username -> Full Name <email@addr.es> map file
When the user specifies a username -> Full Name <email@addr.es> map
file with the -A option, save a copy of that file as
$git_dir/svn-authors. When running git-svnimport with an existing GIT
directory, use $git_dir/svn-authors (if it exists) unless a file was
explicitly specified with -A.

Signed-off-by: Karl Hasselström <kha@treskal.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 15:27:24 -08:00
80804d0af8 Let git-svnimport's author file use same syntax as git-cvsimport's
git-cvsimport uses a username => Full Name <email@addr.es> mapping
file with this syntax:

  kha=Karl Hasselström <kha@treskal.com>

Since there is no reason to use another format for git-svnimport, use
the same format.

Signed-off-by: Karl Hasselström <kha@treskal.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 15:27:21 -08:00
f634248052 gitk: Fix clicks on arrows on line ends
With the new representation of the graph lines, this turns out
much simpler now.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-02-28 10:02:03 +11:00
2ae1c53b51 apply --whitespace: configuration option.
The new configuration option apply.whitespace can take one of
"warn", "error", "error-all", or "strip".  When git-apply is run
to apply the patch to the index, they are used as the default
value if there is no command line --whitespace option.

Andrew can now tell people who feed him git trees to update to
this version and say:

	git repo-config apply.whitespace error

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 14:47:45 -08:00
fc96b7c9ba apply: squelch excessive errors and --whitespace=error-all
This by default makes --whitespace=warn, error, and strip to
warn only the first 5 additions of trailing whitespaces.  A new
option --whitespace=error-all can be used to view all of them
before applying.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 14:16:30 -08:00
b705ba43c6 contrib/git-svn: tell the user to not modify git-svn-HEAD directly
As a rule, interface branches to different SCMs should never be modified
directly by the user.  They are used exclusively for talking to the
foreign SCM.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 12:55:16 -08:00
d9a83684c4 Splitting rev-list into revisions lib, end of beginning.
This makes the rewrite easier to validate in that revision flag
parsing and warlking part are now all in rev_info structure.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 11:10:16 -08:00
c447f10f99 gitview: Remove trailing white space
Do the cleanup using Dave jones vim script

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 11:01:58 -08:00
68d55b83a5 gitview: Fix the encoding related bug
Get the encoding information from repository and convert it to utf-8 before
passing to gtk.TextBuffer.set_text. gtk.TextBuffer.set_text work only with utf-8

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 11:01:54 -08:00
f891cb3fd6 git-format-patch: Always add a blank line between headers and body.
If the second line of the commit message isn't empty, git-format-patch
needs to add an empty line in order to generate a properly formatted
mail. Otherwise git-rebase drops the rest of the commit message.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 11:01:47 -08:00
6baf0484ef combine-diff: Honour -z option correctly.
Combined diffs don't null terminate things in the same way as standard
diffs.  This is presumably wrong.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 11:01:22 -08:00
e70c6b3574 combine-diff: Honour --full-index.
For some reason, combined diffs don't honour the --full-index flag when
emitting patches.  Fix this.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-27 11:01:05 -08:00
6c1413a17e Merge branch 'kh/svnimport' into next
* kh/svnimport:
  svnimport: Read author names and emails from a file
2006-02-26 21:55:16 -08:00
0a26233859 Merge branch 'lt/apply' into next
* lt/apply:
  apply --whitespace fixes and enhancements.
  The war on trailing whitespace
  svnimport: Convert the svn:ignore property
  svnimport: Convert executable flag
  svnimport: Mention -r in usage summary
  Make git diff-generation use a simpler spawn-like interface
2006-02-26 21:55:08 -08:00
b5767dd660 apply --whitespace fixes and enhancements.
In addition to fixing obvious command line parsing bugs in the
previous round, this changes the following:

 * Adds "--whitespace=strip".  This applies after stripping the
   new trailing whitespaces introduced to the patch.

 * The output error message format is changed to say
   "patch-filename:linenumber:contents of the line".  This makes
   it similar to typical compiler error message format, and
   helps C-x ` (next-error) in Emacs compilation buffer.

 * --whitespace=error and --whitespace=warn do not stop at the
   first error.  We might want to limit the output to say first
   20 such lines to prevent cluttering, but on the other hand if
   you are willing to hand-fix after inspecting them, getting
   everything with a single run might be easier to work with.
   After all, somebody has to do the clean-up work somewhere.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 21:54:14 -08:00
19bfcd5a14 The war on trailing whitespace
On Sat, 25 Feb 2006, Andrew Morton wrote:
>
> I'd suggest a) git will simply refuse to apply such a patch unless given a
> special `forcing' flag, b) even when thus forced, it will still warn and c)
> with a different flag, it will strip-then-apply, without generating a
> warning.

This doesn't do the "strip-then-apply" thing, but it allows you to make
git-apply generate a warning or error on extraneous whitespace.

Use --whitespace=warn to warn, and (surprise, surprise) --whitespace=error
to make it a fatal error to have whitespace at the end.

Totally untested, of course. But it compiles, so it must be fine.

HOWEVER! Note that this literally will check every single patch-line with
"+" at the beginning. Which means that if you fix a simple typo, and the
line had a space at the end before, and you didn't remove it, that's still
considered a "new line with whitespace at the end", even though obviously
the line wasn't really new.

I assume this is what you wanted, and there isn't really any sane
alternatives (you could make the warning activate only for _pure_
additions with no deletions at all in that hunk, but that sounds a bit
insane).

		Linus
2006-02-26 21:54:14 -08:00
ef556367c2 Merge branch 'lt/rev-list' into next
* lt/rev-list:
  rev-list split: minimum fixup.
2006-02-26 21:53:56 -08:00
36610b24f1 svnimport: Read author names and emails from a file
Read a file with lines on the form

  username User's Full Name <email@addres.org>

and use "User's Full Name <email@addres.org>" as the GIT author and
committer for Subversion commits made by "username". If encountering a
commit made by a user not in the list, abort.

Signed-off-by: Karl Hasselström <kha@treskal.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 21:34:42 -08:00
c55f3fff35 svnimport: Convert the svn:ignore property
Put the value of the svn:ignore property in a regular file when
converting a Subversion repository to GIT. The Subversion and GIT
ignore syntaxes are similar enough that it often just works to set the
filename to .gitignore and do nothing else.

Signed-off-by: Karl Hasselström <kha@treskal.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 21:34:42 -08:00
4802426ddb svnimport: Convert executable flag
Convert the svn:executable property to file mode 755 when converting
an SVN repository to GIT.

Signed-off-by: Karl Hasselström <kha@treskal.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 21:34:42 -08:00
525c0d713c svnimport: Mention -r in usage summary
I added the -r option to git-svnimport some time ago, but forgot to
update the usage summary in the documentation.

Signed-off-by: Karl Hasselström <kha@treskal.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 21:34:41 -08:00
d9cfb964c7 rev-list split: minimum fixup.
This fixes "the other end has commit X but since then we tagged
that commit with tag T, and he says he wants T -- what is the
list of objects we need to send him?" question:

	git-rev-list --objects ^X T

We ended up sending everything since the beginning of time X-<.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 21:19:14 -08:00
8676eb4313 Make git diff-generation use a simpler spawn-like interface
Instead of depending of fork() and execve() and doing things in between
the two, make the git diff functions do everything up front, and then do
a single "spawn_prog()" invocation to run the actual external diff
program (if any is even needed).

This actually ends up simplifying the code, and should make it much
easier to make it efficient under broken operating systems (read: Windows).

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 16:21:27 -08:00
b5233a6195 Merge branch 'lt/rev-list' into next
* lt/rev-list:
  First cut at libifying revlist generation
  Merge branch 'maint'
  sample hooks template.
  Teach the "git" command to handle some commands internally
  Use setenv(), fix warnings
  contrib/git-svn: version 0.10.0
  contrib/git-svn: optimize sequential commits to svn
  contrib/git-svn: add show-ignore command
  annotate: Use qx{} for pipes on activestate.
  annotate: Convert all -| calls to use a helper open_pipe().
  annotate: Handle dirty state and arbitrary revisions.
  git-fetch: print the new and old ref when fast-forwarding
2006-02-26 15:33:49 -08:00
ae563542bf First cut at libifying revlist generation
This really just splits things up partially, and creates the
interface to set things up by parsing the command line.

No real code changes so far, although the parsing of filenames is a bit
stricter. In particular, if there is a "--", then we do not accept any
filenames before it, and if there isn't any "--", then we check that _all_
paths listed are valid, not just the first one.

The new argument parsing automatically also gives us "--default" and
"--not" handling as in git-rev-parse.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 15:33:27 -08:00
ac5f7c62c2 Merge branch 'maint'
* maint:
  sample hooks template.
2006-02-26 15:25:52 -08:00
a204756a45 sample hooks template.
These two sample hooks try to detect and use the corresponding
commit hook from the same repository.  However, they forgot to
set up GIT_DIR for their own use, so was not in effect.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 15:16:41 -08:00
231af8322a Teach the "git" command to handle some commands internally
This is another patch in the "prepare to do more in C" series, where the
git wrapper command is taught about the notion of handling some
functionality internally.

Right now, the only internal commands are "version" and "help", but the
point being that we can now easily extend it to handle some of the trivial
scripts internally. Things like "git log" and "git diff" wouldn't need
separate external scripts any more.

This also implies that to support the old "git-log" and "git-diff" syntax,
the "git" wrapper now automatically looks at the name it was executed as,
and if it is "git-xxxx", it will assume that it is to internally do what
"git xxxx" would do.

In other words, you can (once you implement an internal command) soft- or
hard-link that command to the "git" wrapper command, and it will do the
right thing, whether you use the "git xxxx" or the "git-xxxx" format.

There's one other change: the search order for external programs is
modified slightly, so that the first entry remains GIT_EXEC_DIR, but the
second entry is the same directory as the git wrapper itself was executed
out of - if we can figure it out from argv[0], of course.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 15:10:37 -08:00
962554c616 Use setenv(), fix warnings
- Fix -Wundef -Wold-style-definition warnings
  - Make pll_free() static

[jc: original patch by Timo had another unrelated bits:

  - Use setenv() instead of putenv()

 I'm postponing that part for now.]

Signed-off-by: Timo Hirvonen <tihirvon@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 15:06:45 -08:00
3c0b7511cd contrib/git-svn: version 0.10.0
New features deserve an increment of the minor version.  This will very
likely become 1.0.0 unless release-critical bugs are found.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 15:04:59 -08:00
e17512f3de contrib/git-svn: optimize sequential commits to svn
Avoid running 'svn up' to a previous revision if we know the
revision we just committed is the first descendant of the
revision we came from.

This reduces the time to do a series of commits by about 25%.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 15:02:45 -08:00
8f22562c6b contrib/git-svn: add show-ignore command
Recursively finds and lists the svn:ignore property on
directories.  The output is suitable for appending to the
$GIT_DIR/info/exclude file.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 14:55:13 -08:00
f60d46911d annotate: Use qx{} for pipes on activestate.
Note: This needs someone to tell me what the value of $^O is on ActiveState.

Signed-off-by: Ryan Anderson <ryan@michonline.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 14:45:22 -08:00
6b3e21d603 annotate: Convert all -| calls to use a helper open_pipe().
When we settle on a solution for ActiveState's forking issues, all
compatibility checks can be handled inside this one function.

Also, fixed an abuse of global variables in the process of cleaning this up.

Signed-off-by: Ryan Anderson <ryan@michonline.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 14:45:05 -08:00
87475f4dfc annotate: Handle dirty state and arbitrary revisions.
Also, use Getopt::Long and only process each rev once.

(Thanks to Morten Welinder for spotting the performance problems.)

Signed-off-by: Ryan Anderson <ryan@michonline.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-26 14:43:55 -08:00
9d7f73d43f git-fetch: print the new and old ref when fast-forwarding
Signed-off-by: Lukas Sandström <lukass@etek.chalmers.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-25 12:03:18 -08:00
ab57c8dd2a Merge branch 'master' into next
* master:
  fix warning from pack-objects.c
  Merge branches 'jc/rev-list' and 'jc/pack-thin'
  gitview: Fix the graph display .
2006-02-24 23:47:48 -08:00
8fcf1ad9c6 fix warning from pack-objects.c
When compiling on ia64 I get this warning (from gcc 3.4.3):

gcc -o pack-objects.o -c -g -O2 -Wall -DSHA1_HEADER='<openssl/sha.h>'  pack-objects.c
pack-objects.c: In function `pack_revindex_ix':
pack-objects.c:94: warning: cast from pointer to integer of different size

A double cast (first to long, then to int) shuts gcc up, but is there
a better way?

[jc: Andreas Ericsson suggests to use ulong instead. ]

Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-24 22:17:20 -08:00
f0b0af1b04 Merge branches 'jc/rev-list' and 'jc/pack-thin'
* jc/rev-list:
  rev-list --objects: use full pathname to help hashing.
  rev-list --objects-edge: remove duplicated edge commit output.
  rev-list --objects-edge

* jc/pack-thin:
  pack-objects: hash basename and direname a bit differently.
  pack-objects: allow "thin" packs to exceed depth limits
  pack-objects: use full pathname to help hashing with "thin" pack.
  pack-objects: thin pack micro-optimization.
  Use thin pack transfer in "git fetch".
  Add git-push --thin.
  send-pack --thin: use "thin pack" delta transfer.
  Thin pack - create packfile with missing delta base.

Conflicts:

	pack-objects.c (taking "next")
	send-pack.c (taking "next")
2006-02-24 21:55:23 -08:00
d55e0fff1f Merge branch 'master' into next
* master:
  Merge branches 'jc/rev-list' and 'jc/pack-thin'
  gitview: Code cleanup
  Add missing programs to ignore list
  git ls files recursively show ignored files
  Build and install git-mailinfo.
  gitview: Bump the rev
  gitview: Fix DeprecationWarning
2006-02-24 19:01:02 -08:00
52e8a6e9bf Merge branches 'jc/rev-list' and 'jc/pack-thin'
* jc/rev-list:
  rev-list --objects: use full pathname to help hashing.
  rev-list --objects-edge: remove duplicated edge commit output.
  rev-list --objects-edge

* jc/pack-thin:
  pack-objects: hash basename and direname a bit differently.
  pack-objects: allow "thin" packs to exceed depth limits
  pack-objects: use full pathname to help hashing with "thin" pack.
  pack-objects: thin pack micro-optimization.
  Use thin pack transfer in "git fetch".
  Add git-push --thin.
  send-pack --thin: use "thin pack" delta transfer.
  Thin pack - create packfile with missing delta base.

Conflicts:

	pack-objects.c (manual adjustment for thin pack needed)
	send-pack.c
2006-02-24 18:55:25 -08:00
1509bd9e69 gitview: Fix the graph display .
This fix all the known issue with the graph display
The bug need to be explained graphically

                                 |
                                 a
This line need not be there ---->| \
                                 b  |
                                 | /
                                 c

c is parent of a and all a,b and c are placed on the same line and b is child of c
With my last checkin I added  a seperate line to indicate that a is
connected to c. But then we had the line connecting a and b which should
not be ther. This changes fixes the same bug

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-24 17:27:46 -08:00
9e4f522da7 gitview: Code cleanup
Rearrange the code little bit so that it is easier to read

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-24 17:27:39 -08:00
6ee9240f63 Add missing programs to ignore list
Added recently added programs to the default exclude list.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-24 16:16:39 -08:00
1e3584053d git ls files recursively show ignored files
Make git-ls-files --others --ignored recurse into non-excluded
subdirectories.

Typically when asking git-ls-files to display all files which are
ignored by one or more exclude patterns one would want it to recurse
into subdirectories which are not themselves excluded to see if
there are any excluded files contained within those subdirectories.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-24 16:16:34 -08:00
43f72af1bc Build and install git-mailinfo.
The merge 712b1dd389 was done
incorrectly, and lost this program from Makefile.

Big thanks go to Tony Luck for noticing it, and Linus for
diagnosing it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-24 16:16:10 -08:00
20d23f554d gitview: Bump the rev
Make the 0.7 release

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-24 03:14:44 -08:00
8b42f5ae54 gitview: Fix DeprecationWarning
DeprecationWarning: integer argument expected, got float

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-24 03:14:34 -08:00
1b1ad31aa8 Merge branch 'master' into next
* master:
  Merge fixes early for next maint series.
  Merge branch 'fix' into maint
  git-am: do not allow empty commits by mistake.
2006-02-24 02:22:01 -08:00
a68de9592e Merge fixes early for next maint series. 2006-02-24 02:21:28 -08:00
6d5129ac09 Merge branch 'fix' into maint
* fix:
  git-am: do not allow empty commits by mistake.
2006-02-24 02:21:00 -08:00
7465ef5155 Merge branches 'jc/rev-list' and 'jc/pack-thin' into next
* jc/rev-list:
  rev-list --objects: use full pathname to help hashing.

* jc/pack-thin:
  pack-objects: hash basename and direname a bit differently.
  pack-objects: allow "thin" packs to exceed depth limits
  pack-objects: use full pathname to help hashing with "thin" pack.
2006-02-24 01:56:38 -08:00
4b953cdc04 Merge fix bits from jc/rev-list 2006-02-24 01:33:57 -08:00
5ca5396c9e Merge branch 'np/delta' into next
* np/delta:
  Revert "diff-delta: produce optimal pack data"
  Tweak break/merge score to adjust to the new delta generation code.
  count-delta: fix counting of copied source.
2006-02-24 01:30:04 -08:00
eae3fe5e50 Revert "diff-delta: produce optimal pack data"
This reverts 6b7d25d97b commit.

It turns out that the new algorithm has a really bad corner
case, that literally spends minutes for inputs that takes less
than a quater seconds to delta with the old algorithm.  The
resulting delta is 50% smaller which is admirable, but the
performance degradation is simply unacceptable for unconditional
use.

Some example cases are these blobs in Linux 2.6 repository:

    4917ec509720a42846d513addc11cbd25e0e3c4f
    9af06ba723df75fed49f7ccae5b6c9c34bc5115f
    dfc9cd58dc065d17030d875d3fea6e7862ede143

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-24 01:29:00 -08:00
e6a933bdb7 Merge fixes from master 2006-02-24 01:14:41 -08:00
eeef7135fe pack-objects: hash basename and direname a bit differently.
...so that "Makefile"s from different revs are sorted together,
separate from "t/Makefile"s, but close enough.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 23:51:01 -08:00
e646de0d14 rev-list --objects: use full pathname to help hashing.
This helps to group the same files from different revs together,
while spreading files with the same basename in different
directories, to help pack-object.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 23:44:42 -08:00
eb38cc689e rev-list --objects-edge: remove duplicated edge commit output.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 23:44:15 -08:00
b76f6b6278 pack-objects: allow "thin" packs to exceed depth limits
When creating a new pack to be used in .git/objects/pack/
directory, we carefully count the depth of deltified objects to
be reused, so that the generated pack does not to exceed the
specified depth limit for runtime efficiency.  However, when we
are generating a thin pack that does not contain base objects,
such a pack can only be used during network transfer that is
expanded on the other end upon reception, so being careful and
artificially cutting the delta chain does not buy us anything
except increased bandwidth requirement.  This patch disables the
delta chain depth limit check when reusing an existing delta.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 23:04:52 -08:00
3efaa937a5 Merge branch 'ar/win'
* ar/win:
  PATCH: simplify calls to git programs in git-fmt-merge-msg
2006-02-23 22:35:55 -08:00
aa01568dc7 Merge branch 'jc/send-insane-refs'
* jc/send-insane-refs:
  send-pack: do not give up when remote has insanely large number of refs.
2006-02-23 22:34:39 -08:00
816c02ce8e Merge fixes early for next maint series. 2006-02-23 22:27:03 -08:00
7bd1527d2d Merge branches 'jc/fix-co-candy', 'jc/fix-rename-leak' and 'ar/fix-win' into maint
* jc/fix-co-candy:
  checkout - eye candy.

* jc/fix-rename-leak:
  diffcore-rename: plug memory leak.

* ar/fix-win:
  fix t5600-clone-fail-cleanup.sh on windows
2006-02-23 22:25:32 -08:00
1d3d03bbea Merge branch 'ak/gitview'
* ak/gitview:
  gitview: Display the lines joining commit nodes clearly.
2006-02-23 22:20:30 -08:00
3fe5489a25 gitview: Display the lines joining commit nodes clearly.
Since i wanted to limit the graph box size i was resetting
the window after an index of 5. This result in line joining
commit nodes to pass over nodes which are not related. The
changes fixes the same

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 22:17:42 -08:00
6d28644d69 git-am: do not allow empty commits by mistake.
Running "git-am --resolved" without doing anything can create an empty
commit. Prevent it.

Thanks for Eric W. Biederman for spotting this.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 22:14:47 -08:00
581845f0b8 Tweak break/merge score to adjust to the new delta generation code.
This lowers the default merge threshold score to 75% from
earlier 80%.  The break threshold stays the same at 50% for now,
but we might want to revisit it (and the rename detection limit
as well).

 * break score: this much edit (both insertion of new material
   and deletion of old material) needs to be there in the file
   before we consider this _might_ be a rewrite and break the
   filepair.

 * merge score: after a filepair is broken by the above criteria
   and goes through rename detection, if their pieces did not
   match with other files as rename/copy, we merge them back
   into one as if nothing happened.  If the filepair had at
   least this much deletion of old material, however, we say
   this is completely rewritten with dissimilarity index X% when
   we do so.

The updated delta code by Nico is so good that what we earlier
thought to be complete rewrite now reuses a lot more from the
source material (reducing the counted "delete"), so this
adjustment is needed to keep the perceived behaviour similar to
what we had earlier.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 17:03:37 -08:00
c86e8568d8 count-delta: fix counting of copied source.
The previous one wrongly coalesced a span with the next one
even though the span being added does not reach it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 15:50:18 -08:00
a92c73eccc PATCH: simplify calls to git programs in git-fmt-merge-msg
It also makes it work on ActiveState Perl.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 03:49:09 -08:00
edd3ebfe27 fix t5600-clone-fail-cleanup.sh on windows
In windows you cannot remove current or opened directory,
an opened file, a running program, a loaded library, etc...

[jc: signoffs?  With a minor quoting fix.]

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 03:47:15 -08:00
207a1f3ce9 Merge part of pack-thin branch 2006-02-23 03:00:59 -08:00
d2540f0203 Merge branch 'np/delta' into next
* np/delta:
  count-delta: tweak counting of copied source material.
  diff-delta: produce optimal pack data
2006-02-23 02:59:24 -08:00
907380eeff count-delta: tweak counting of copied source material.
With the finer grained delta algorithm, count-delta algorithm
started overcounting copied source material, since the new delta
output tends to reuse the same source range more than once and
more aggressively.  This broke an earlier assumption that the
number of bytes copied out from the source buffer is a good
approximation how much source material is actually remaining in
the result.

This uses fairly inefficient algorithm to keep track of ranges
of source material that are actually copied out to the
destination buffer.  With this tweak, the obvious rename/break
detection tests in the testsuite start to work again.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-23 02:58:37 -08:00
1d6b38cc76 pack-objects: use full pathname to help hashing with "thin" pack.
This uses the same hashing algorithm to the "preferred base
tree" objects and the incoming pathnames, to group the same
files from different revs together, while spreading files with
the same basename in different directories.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 23:07:20 -08:00
b925410d10 pack-objects: thin pack micro-optimization.
Since we sort objects by type, hash, preferredness and then
size, after we have a delta against preferred base, there is no
point trying a delta with non-preferred base.  This seems to
save expensive calls to diff-delta and it also seems to save the
output space as well.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 21:45:45 -08:00
63c2fcefd8 Merge branches 'maint', 'jc/fix-co-candy' and 'jc/fix-rename-leak' into next
* maint:
  Give no terminating LF to error() function.

* jc/fix-co-candy:
  checkout - eye candy.

* jc/fix-rename-leak:
  diffcore-rename: plug memory leak.
2006-02-22 19:46:59 -08:00
09a5d72d8e diffcore-rename: plug memory leak.
Spotted by Nicolas Pitre.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 19:45:48 -08:00
98214e96be Merge branch 'ml/cvs'
* ml/cvs:
  Introducing git-cvsserver -- a CVS emulator for git.
2006-02-22 19:20:55 -08:00
ab8c9fe256 Merge branch 'ra/anno'
* ra/anno:
  Use Ryan's git-annotate instead of jsannotate
  Add git-annotate, a tool for assigning blame.
2006-02-22 19:20:08 -08:00
bd2afde8a3 Give no terminating LF to error() function.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 19:10:26 -08:00
744633cbf2 checkout - eye candy.
This implements "eye candy" similar to the pack-object/unpack-object
to entertain users while a large tree is being checked out after
a clone or a pull.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 19:04:06 -08:00
f6b39fe779 Merge branch 'cw/remove' into next
* cw/remove:
  git-rm: Fix to properly handle files with spaces, tabs, newlines, etc.
  Add new git-rm command with documentation
2006-02-22 17:15:01 -08:00
3844cdc8f1 git-rm: Fix to properly handle files with spaces, tabs, newlines, etc.
New tests are added to the git-rm test case to cover this as well.

Signed-off-by: Carl Worth <cworth@cworth.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 17:10:42 -08:00
d4a1cab541 Add new git-rm command with documentation
This adds a git-rm command which provides convenience similar to
git-add, (and a bit more since it takes care of the rm as well if
given -f).

Like git-add, git-rm expands the given path names through
git-ls-files. This means it only acts on files listed in the
index. And it does act recursively on directories by default, (no -r
needed as in the case of rm itself). When it recurses, it does not
remove empty directories that are left behind.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 17:10:42 -08:00
597888adc6 Merge master to get fixes up to GIT 1.2.3 2006-02-22 16:38:21 -08:00
2cf3be1d31 Merge fixes up to GIT 1.2.3 2006-02-22 16:15:42 -08:00
6dc78e696b git-fetch: follow tag only when tracking remote branch.
Unless --no-tags flag was given, git-fetch tried to always
follow remote tags that point at the commits we picked up.

It is not very useful to pick up tags from remote unless storing
the fetched branch head in a local tracking branch.  This is
especially true if the fetch is done to merge the remote branch
into our current branch as one-shot basis (i.e. "please pull"),
and is even harmful if the remote repository has many irrelevant
tags.

This proposed update disables the automated tag following unless
we are storing the a fetched branch head in a local tracking
branch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 16:04:08 -08:00
183bdb2ccc pack-objects eye-candy: finishing touches.
This updates the progress output to match "every one second or
every percent whichever comes early" used by unpack-objects, as
discussed on the list.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 16:02:59 -08:00
5e8dc750ee also adds progress when actually writing a pack
If that pack is big, it takes significant time to write and might
benefit from some more eye candies as well.  This is however disabled
when the pack is written to stdout since in that case the output is
usually piped into unpack_objects which already does its own progress
reporting.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 14:51:58 -08:00
b2504a0d2f nicer eye candies for pack-objects
This provides a stable and simpler progress reporting mechanism that
updates progress as often as possible but accurately not updating more
than once a second.  The deltification phase is also made more
interesting to watch (since repacking a big repository and only seeing a
dot appear once every many seconds is rather boring and doesn't provide
much food for anticipation).

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 13:15:26 -08:00
d64e6b0429 Keep Porcelainish from failing by broken ident after making changes.
"empty ident not allowed" error makes commit-tree fail, so we
are already safer in that we would not end up with commit
objects that have bogus names on the author or committer fields.
However, before commit-tree is called there are already changes
made to the index file and the working tree.  The operation can
be resumed after fixing the environment problem, but when this
triggers to a newcomer with unusable gecos, the first question
becomes "what did I lose and how would I recover".

This patch modifies some Porcelainish commands to verify
GIT_COMMITTER_IDENT as soon as we know we are going to make some
commits before doing much damage to prevent confusion.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 13:14:57 -08:00
589e4f93c7 Delay "empty ident" errors until they really matter.
Previous one warned people upfront to encourage fixing their
environment early, but some people just use repositories and git
tools read-only without making any changes, and in such a case
there is not much point insisting on them having a usable ident.

This round attempts to move the error until either "git-var"
asks for the ident explicitly or "commit-tree" wants to use it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 13:14:57 -08:00
2fb4a21074 Make "empty ident" error message a bit more helpful.
It appears that some people who did not care about having bogus
names in their own commit messages are bitten by the recent
change to require a sane environment [*1*].

While it was a good idea to prevent people from using bogus
names to create commits and doing sign-offs, the error message
is not very informative.  This patch attempts to warn things
upfront and hint people how to fix their environments.

[Footnote]

*1* The thread is this one.

    http://marc.theaimsgroup.com/?t=113868084800004

    Especially this message.

    http://marc.theaimsgroup.com/?m=113932830015032

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 13:14:57 -08:00
15b4d577ae pack-objects: avoid delta chains that are too long.
This tries to rework the solution for the excess delta chain
problem. An earlier commit worked it around ``cheaply'', but
repeated repacking risks unbound growth of delta chains.

This version counts the length of delta chain we are reusing
from the existing pack, and makes sure a base object that has
sufficiently long delta chain does not get deltified.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 13:14:57 -08:00
4181bda156 git-repack: allow passing a couple of flags to pack-objects.
A new flag -q makes underlying pack-objects less chatty.
A new flag -f forces delta to be recomputed from scratch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 13:14:57 -08:00
ab7cd7bb8c pack-objects: finishing touches.
This introduces --no-reuse-delta option to disable reusing of
existing delta, which is a large part of the optimization
introduced by this series.  This may become necessary if
repeated repacking makes delta chain too long.  With this, the
output of the command becomes identical to that of the older
implementation.  But the performance suffers greatly.

It still allows reusing non-deltified representations; there is
no point uncompressing and recompressing the whole text.

It also adds a couple more statistics output, while squelching
it under -q flag, which the last round forgot to do.

  $ time old-git-pack-objects --stdout >/dev/null <RL
  Generating pack...
  Done counting 184141 objects.
  Packing 184141 objects....................
  real    12m8.530s       user    11m1.450s       sys     0m57.920s
  $ time git-pack-objects --stdout >/dev/null <RL
  Generating pack...
  Done counting 184141 objects.
  Packing 184141 objects.....................
  Total 184141, written 184141 (delta 138297), reused 178833 (delta 134081)
  real    0m59.549s       user    0m56.670s       sys     0m2.400s
  $ time git-pack-objects --stdout --no-reuse-delta >/dev/null <RL
  Generating pack...
  Done counting 184141 objects.
  Packing 184141 objects.....................
  Total 184141, written 184141 (delta 134833), reused 47904 (delta 0)
  real    11m13.830s      user    9m45.240s       sys     0m44.330s

There is one remaining issue when --no-reuse-delta option is not
used.  It can create delta chains that are deeper than specified.

    A<--B<--C<--D   E   F   G

Suppose we have a delta chain A to D (A is stored in full either
in a pack or as a loose object. B is depth1 delta relative to A,
C is depth2 delta relative to B...) with loose objects E, F, G.
And we are going to pack all of them.

B, C and D are left as delta against A, B and C respectively.
So A, E, F, and G are examined for deltification, and let's say
we decided to keep E expanded, and store the rest as deltas like
this:

    E<--F<--G<--A

Oops.  We ended up making D a bit too deep, didn't we?  B, C and
D form a chain on top of A!

This is because we did not know what the final depth of A would
be, when we checked objects and decided to keep the existing
delta.  Unfortunately, deferring the decision until just before
the deltification is not an option.  To be able to make B, C,
and D candidates for deltification with the rest, we need to
know the type and final unexpanded size of them, but the major
part of the optimization comes from the fact that we do not read
the delta data to do so -- getting the final size is quite an
expensive operation.

To prevent this from happening, we should keep A from being
deltified.  But how would we tell that, cheaply?

To do this most precisely, after check_object() runs, each
object that is used as the base object of some existing delta
needs to be marked with the maximum depth of the objects we
decided to keep deltified (in this case, D is depth 3 relative
to A, so if no other delta chain that is longer than 3 based on
A exists, mark A with 3).  Then when attempting to deltify A, we
would take that number into account to see if the final delta
chain that leads to D becomes too deep.

However, this is a bit cumbersome to compute, so we would cheat
and reduce the maximum depth for A arbitrarily to depth/4 in
this implementation.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 13:14:57 -08:00
3f9ac8d259 pack-objects: reuse data from existing packs.
When generating a new pack, notice if we have already needed
objects in existing packs.  If an object is stored deltified,
and its base object is also what we are going to pack, then
reuse the existing deltified representation unconditionally,
bypassing all the expensive find_deltas() and try_deltas()
calls.

Also, notice if what we are going to write out exactly match
what is already in an existing pack (either deltified or just
compressed).  In such a case, we can just copy it instead of
going through the usual uncompressing & recompressing cycle.

Without this patch, in linux-2.6 repository with about 1500
loose objects and a single mega pack:

    $ git-rev-list --objects v2.6.16-rc3 >RL
    $ wc -l RL
    184141 RL
    $ time git-pack-objects p <RL
    Generating pack...
    Done counting 184141 objects.
    Packing 184141 objects....................
    a1fc7b3e537fcb9b3c46b7505df859f0a11e79d2

    real    12m4.323s
    user    11m2.560s
    sys     0m55.950s

With this patch, the same input:

    $ time ../git.junio/git-pack-objects q <RL
    Generating pack...
    Done counting 184141 objects.
    Packing 184141 objects.....................
    a1fc7b3e537fcb9b3c46b7505df859f0a11e79d2
    Total 184141, written 184141, reused 182441

    real    1m2.608s
    user    0m55.090s
    sys     0m1.830s

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 13:14:56 -08:00
26125f6b9b detect broken alternates.
The real problem triggered an earlier fix was that an alternate
entry was pointing at a removed directory.  Complaining on
object/pack directory that cannot be opendir-ed produces noise
in an ancient repository that does not have object/pack
directory and has never been packed.

Detect the real user error and report it.  Also if opendir
failed for other reasons (e.g. no read permissions), report that
as well.

Spotted by Andrew Vasquez <andrew.vasquez@qlogic.com>.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 11:16:38 -08:00
d27d5b3c5b gitview: ls-remote invocation shellquote safety.
This will allow you to point GIT_DIR at directories with funny names.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 03:47:20 -08:00
a35ed7cbd1 Merge branch 'ml/cvs' into next
* ml/cvs:
  Introducing git-cvsserver -- a CVS emulator for git.
2006-02-22 02:17:56 -08:00
3fda8c4cc7 Introducing git-cvsserver -- a CVS emulator for git.
git-cvsserver is highly functional. However, not all methods are implemented,
and for those methods that are implemented, not all switches are implemented.
All the common read operations are implemented, and add/remove/commit are
supported.

Testing has been done using both the CLI CVS client, and the Eclipse CVS
plugin. Most functionality works fine with both of these clients.

Currently git-cvsserver only works over SSH connections, see the
Documentation for more details on how to configure your client. It
does not support pserver for anonymous access but it should not be
hard to implement. Anonymous access will need tighter input validation.

In our very informal tests, it seems to be significantly faster than a real
CVS server.

This utility depends on a version of git-cvsannotate that supports -S and on
DBD::SQLite.

Licensed under GPLv2. Copyright The Open University UK.

Authors: Martyn Smith <martyn@catalyst.net.nz>
         Martin Langhoff <martin@catalyst.net.nz>

Signed-off-by: Martin Langhoff <martin@catalyst.net.nz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 02:17:07 -08:00
52670c9730 Merge branch 'ra/anno' into next
* ra/anno:
  Use Ryan's git-annotate instead of jsannotate
2006-02-22 02:07:20 -08:00
4788d11a0d Use Ryan's git-annotate instead of jsannotate
Since Ryan's git-annotate is much faster, and has support for renames,
it is likely it goes into the mainstream git soon. Adapt it a little to
work with gitcvs, and actually use it.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 02:06:42 -08:00
eb6b1cfcca Merge branch 'jc/send-insane-refs' into next
* jc/send-insane-refs:
  send-pack: do not give up when remote has insanely large number of refs.
  rev-list.c: fix non-grammatical comments.
2006-02-22 01:48:49 -08:00
797656e58d send-pack: do not give up when remote has insanely large number of refs.
Stephen C. Tweedie noticed that we give up running rev-list when
we see too many refs on the remote side.  Limit the number of
negative references we give to rev-list and continue.

Not sending any negative references to rev-list is very bad --
we may be pushing a ref that is new to the other end.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 01:47:32 -08:00
5031985034 rev-list.c: fix non-grammatical comments.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 01:27:02 -08:00
882e4dc183 Merge part of np/delta 2006-02-22 00:57:43 -08:00
8e1454b5ad diff-delta: big code simplification
This is much smaller and hopefully clearer code now.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 00:36:09 -08:00
6b7d25d97b diff-delta: produce optimal pack data
Indexing based on adler32 has a match precision based on the block size
(currently 16).  Lowering the block size would produce smaller deltas
but the indexing memory and computing cost increases significantly.

For optimal delta result the indexing block size should be 3 with an
increment of 1 (instead of 16 and 16).  With such low params the adler32
becomes a clear overhead increasing the time for git-repack by a factor
of 3.  And with such small blocks the adler 32 is not very useful as the
whole of the block bits can be used directly.

This patch replaces the adler32 with an open coded index value based on
3 characters directly.  This gives sufficient bits for hashing and
allows for optimal delta with reasonable CPU cycles.

The resulting packs are 6% smaller on average.  The increase in CPU time
is about 25%.  But this cost is now hidden by the delta reuse patch
while the saving on data transfers is always there.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 00:36:09 -08:00
fe474b588b diff-delta: fold two special tests into one plus cleanups
Testing for realloc and size limit can be done with only one test per
loop. Make it so and fix a theoretical off-by-one comparison error in
the process.

The output buffer memory allocation is also bounded by max_size when
specified.

Finally make some variable unsigned to allow the handling of files up to
4GB in size instead of 2GB.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 00:36:09 -08:00
cac251d0bc relax delta selection filtering in pack-objects
This change provides a 8% saving on the pack size with a 4% CPU time
increase for git-repack -a on the current git archive.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-22 00:36:09 -08:00
d9ad59e763 Merge git://git.kernel.org/pub/scm/gitk/gitk
* git://git.kernel.org/pub/scm/gitk/gitk:
  gitk: Make "find" on "Files" work again.
2006-02-22 00:35:18 -08:00
752b0fe287 Merge branch 'fix'
* fix:
  git-push: Update documentation to describe the no-refspec behavior.
  format-patch: pretty-print timestamp correctly.
  git-add: Add support for --, documentation, and test.
2006-02-22 00:35:07 -08:00
6b98579bab Merge branch 'jc/perl'
* jc/perl:
  cvsimport: avoid open "-|" list form for Perl 5.6
  svnimport: avoid open "-|" list form for Perl 5.6
  send-email: avoid open "-|" list form for Perl 5.6
  rerere: avoid open "-|" list form for Perl 5.6
  fmt-merge-msg: avoid open "-|" list form for Perl 5.6
2006-02-21 22:51:21 -08:00
155d12912f Merge branch 'jc/pack-reuse'
* jc/pack-reuse:
  pack-objects: avoid delta chains that are too long.
  git-repack: allow passing a couple of flags to pack-objects.
  pack-objects: finishing touches.
  pack-objects: reuse data from existing packs.
2006-02-21 22:38:43 -08:00
ee072260db Merge branch 'jc/nostat'
* jc/nostat:
  cache_name_compare() compares name and stage, nothing else.
  "assume unchanged" git: documentation.
  ls-files: split "show-valid-bit" into a different option.
  "Assume unchanged" git: --really-refresh fix.
  ls-files: debugging aid for CE_VALID changes.
  "Assume unchanged" git: do not set CE_VALID with --refresh
  "Assume unchanged" git
2006-02-21 22:33:21 -08:00
712b1dd389 Merge branch 'js/portable'
* js/portable:
  Fix "gmake -j"
  Really honour NO_PYTHON
  avoid makefile override warning
  Fixes for ancient versions of GNU make
2006-02-21 22:28:40 -08:00
aa064743fa git-push: Update documentation to describe the no-refspec behavior.
It turns out that the git-push documentation didn't describe what it
would do when not given a refspec, (not on the command line, nor in a
remotes file). This is fairly important for the user who is trying to
understand operations such as:

	git clone git://something/some/where
	# hack, hack, hack
	git push origin

I tracked the mystery behavior down to git-send-pack and lifted the
relevant portion of its documentation up to git-push, (namely that all
refs existing both locally and remotely are updated).

Signed-off-by: Carl Worth <cworth@cworth.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 22:11:50 -08:00
d800795613 gitview: Use monospace font to draw the branch and tag name
This patch address the below:
Use monospace font to draw branch and tag name
set the font size to 13.
Make the graph column resizable. This helps to accommodate large tag names

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 18:38:11 -08:00
5301eee92c gitview: Read tag and branch information using git ls-remote
This fix the below bug

Junio C Hamano <junkio@cox.net> writes:

>
> It does not work in my repository, since you do not seem to
> handle branch and tag names with slashes in them.  All of my
> topic branches live in directories with two-letter names
> (e.g. ak/gitview).

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 18:38:11 -08:00
c8af25ca01 git-ls-files: Fix, document, and add test for --error-unmatch option.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 18:37:36 -08:00
d0080b3cda Fix typo in git-rebase.sh.
s/upsteram/upstream in git-rebase.sh.

Signed-off-by: Jason Riedy <ejr@cs.berkeley.edu>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 18:25:34 -08:00
5508a61663 New test to verify that when git-clone fails it cleans up the new directory.
Signed-off-by: Carl Worth <cworth@cworth.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 18:18:25 -08:00
00fd12392c Merge branch 'pj/portable'
* pj/portable:
  Makefile tweaks: Solaris 9+ dont need iconv / move up uname variables
2006-02-21 18:16:29 -08:00
fab5de7936 format-patch: pretty-print timestamp correctly.
Perl is not C and does not truncate the division result.  Arghh!

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 18:13:32 -08:00
69a60af5d0 git-rebase: Clarify usage statement and copy it into the actual documentation.
I found a paper thin man page for git-rebase, but was quite happy to
see something much more useful in the usage statement of the script
when I went there to find out how this thing worked. Here it is
cleaned up slightly and expanded a bit into the actual documentation.

Signed-off-by: Carl Worth <cworth@cworth.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 17:45:32 -08:00
60ace8790f git-add: Add support for --, documentation, and test.
This adds support to git-add to allow the common -- to separate
command-line options and file names. It adds documentation and a new
git-add test case as well.

[jc: this should apply to 1.2.X maintenance series, so I reworked
 git-ls-files --error-unmatch test. ]

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 17:33:43 -08:00
b992933853 Fix "gmake -j"
In my attempt to port git to IRIX, I broke it. Sorry.

Signed-off-by: Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 16:48:10 -08:00
77e56ac4cc Merge branch 'fk/blame' into next
* fk/blame:
  Add git-blame, a tool for assigning blame.
2006-02-21 01:08:21 -08:00
deddce6f7b Merge branch 'pj/portable' into next
* pj/portable:
  Makefile tweaks: Solaris 9+ dont need iconv / move up uname variables
  Merge part of jc/portable branch
  git-mktree: reverse of git-ls-tree.
  Merge branch 'lt/merge-tree'
  Merge branch 'jc/ident'
  cherry-pick/revert: error-help message rewording.
  Fix fmt-merge-msg counting.
2006-02-21 01:07:57 -08:00
e15f545155 Makefile tweaks: Solaris 9+ dont need iconv / move up uname variables
- Solaris 9 and up do not need -liconv, so NEEDS_LIBICONV should be set
   only for S8.
- Move the declaration of the uname variables to early in the Makefile
   so they can be referenced by prefix and gitexecdir variables.
- gitexecdir defaults to being same as bindir, it might as well reference
   that variable.

[jc: corrupt patch, sneakily tried to remove inclusion of GIT-VERSION-FILE
 I do not know why I am applying this...]

Signed-off-by: Paul Jakma <paul@quagga.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 00:55:00 -08:00
cbfb73d73f Add git-blame, a tool for assigning blame.
I have also been working on a blame program. The algorithm is pretty
much the one described by Junio in his blame.perl. My variant doesn't
handle renames, but it shouldn't be too hard to add that. The output
is minimal, just the line number followed by the commit SHA1.

An interesting observation is that the output from my git-blame and
your git-annotate doesn't match on all files in the git
repository. One example where several lines differ is read-cache.c. I
haven't investigated it further to find out which one is correct.

The code should be considered as a work in progress. It certainly has
a couple of rough edges. The output looks fairly sane on the few files
I have tested it on, but it wouldn't be too surprising if it gets some
cases wrong.

[jc: adding it to pu for wider comments. I did minimum
whitespace fixups but it still needs an indent run and
-Wdeclaration-after-statement fixups.]

Signed-off-by: Fredrik Kuivinen <freku045@student.liu.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 00:54:34 -08:00
6643688867 Merge part of jc/portable branch 2006-02-21 00:52:18 -08:00
83f50539a9 git-mktree: reverse of git-ls-tree.
This reads data in the format a (non recursive) ls-tree outputs
and writes a tree object to the object database.  The created
tree object name is output to the standard output.

For convenience, the input data does not need to be sorted; the
command sorts the input lines internally.

By request from Tommi Virtanen.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 00:50:05 -08:00
8cf828b43c Merge branch 'lt/merge-tree'
* lt/merge-tree:
  git-merge-tree: generalize the "traverse <n> trees in sync" functionality
  Handling large files with GIT
  Handling large files with GIT
2006-02-21 00:49:38 -08:00
6ead3972f5 Merge branch 'jc/ident'
* jc/ident:
  Keep Porcelainish from failing by broken ident after making changes.
  Delay "empty ident" errors until they really matter.
  Make "empty ident" error message a bit more helpful.
2006-02-21 00:46:07 -08:00
0f73e92ab7 cherry-pick/revert: error-help message rewording.
It said "after fixing up, commit the result using -F .msg", but
it was not clear for new people how "fix up" should be done.
Hint "git-update-index <path>".

We could recommend "git commit -a -F .msg" instead, but I am
hesitant to give that suggestion in the blind -- you could do a
cherry-pick, revert or a merge in general in a dirty working
tree as long as local modifications do not overlap with the
merge, but using "commit -a" would include them in the result.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-21 00:28:04 -08:00
d37a1ed7f2 Fix fmt-merge-msg counting.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 19:26:21 -08:00
98968450b2 Merge branch 'jc/perl' into next
* jc/perl:
  cvsimport: avoid open "-|" list form for Perl 5.6
  svnimport: avoid open "-|" list form for Perl 5.6
  send-email: avoid open "-|" list form for Perl 5.6
  rerere: avoid open "-|" list form for Perl 5.6
  fmt-merge-msg: avoid open "-|" list form for Perl 5.6
2006-02-20 14:25:50 -08:00
0c82a398ec Merge branch 'ra/anno' into next
* ra/anno:
  Add git-annotate, a tool for assigning blame.
  git-svn: 0.9.1: add --version and copyright/license (GPL v2+) information
  contrib/git-svn: add Makefile, test, and associated ignores
  git-svn: fix several corner-case and rare bugs with 'commit'
  contrib/git-svn.txt: add a note about renamed/copied directory support
  git-svn: change ; to && in addremove()
  git-svn: remove any need for the XML::Simple dependency
  git-svn: Allow for more argument types for commit (from..to)
  git-svn: allow --find-copies-harder and -l<num> to be passed on commit
  git-svn: fix a typo in defining the --no-stop-on-copy option
2006-02-20 14:25:46 -08:00
dd27478f09 cvsimport: avoid open "-|" list form for Perl 5.6
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 14:24:06 -08:00
7ae0dc015d svnimport: avoid open "-|" list form for Perl 5.6
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 14:24:05 -08:00
e415907d6c send-email: avoid open "-|" list form for Perl 5.6
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 14:23:51 -08:00
fedd273b75 rerere: avoid open "-|" list form for Perl 5.6
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 14:21:15 -08:00
2a86ec46da fmt-merge-msg: avoid open "-|" list form for Perl 5.6
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 14:21:10 -08:00
c65e898754 Add git-annotate, a tool for assigning blame.
Signed-off-by: Ryan Anderson <ryan@michonline.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:35:42 -08:00
551ce28fe1 git-svn: 0.9.1: add --version and copyright/license (GPL v2+) information
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:32:42 -08:00
96a40b27c9 contrib/git-svn: add Makefile, test, and associated ignores
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:32:42 -08:00
cf52b8f063 git-svn: fix several corner-case and rare bugs with 'commit'
None of these were really show-stoppers (or even triggered)
on most of the trees I've tracked.

* Node change prevention for identically named nodes.  This is
  a limitation of SVN, but we find the error and exit before
  it's passed to SVN so we don't dirty our working tree when our
  commit fails.  git-svn will exit with an error code 1 if any
  of the following conditions are found:

  1.  a directory is removed and a file of the same name of the
      removed directory is created
  1a. a file has its parent directory removed and the file is
      takes the name of the removed parent directory::
          baz/zzz    =>  baz
  2.  a file is removed and a directory of the same name of the
      removed file is created.
  2a. a file is moved into a deeper directory that shares the
      previous name of the file::
          dir/$file  =>  dir/file/$file

  Since SVN cannot handle these cases, the user will have to
  manually split the commit into several parts.

* --rmdir now handles nested/deep removals. If dir/a/b/c/d/e/file
  is removed, and everything else is in the dir/ hierarchy is
  otherwise empty, then dir/ will be deleted when file is deleted
  from svn and --rmdir specified.

* Always assert that we have written the tree we want to write
  on commits.  This helped me find several bugs in the symlink
  handling code (which as been fixed).

* Several symlink handling fixes.  We now refuse to set
  permissions on symlinks.  We also always unlink a file
  if we're going to overwrite it.

* Apply changes in a pre-determined order, so we always have
  rename from locations handy before we delete them.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:32:41 -08:00
bbe0c9b8d8 contrib/git-svn.txt: add a note about renamed/copied directory support
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:32:41 -08:00
472ee9e3d6 git-svn: change ; to && in addremove()
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:32:41 -08:00
ce6f351903 git-svn: remove any need for the XML::Simple dependency
XML::Simple was originally required back when I made svn-arch-mirror
because I needed to explictly track renames with Arch.  Then I carried
it over to git-svn because I was afraid somebody could commit an svn
log message that could throw off a non-XML log parser.  Then I noticed
the <n> lines column in the header.  So, no more XML :)

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:32:41 -08:00
8de010ad28 git-svn: Allow for more argument types for commit (from..to)
Allow 'from..to' notation from the command line.

More liberal sha1 parsing when reading from stdin no longer requires the
sha1 to be the first character, so a leading 'commit ' string is OK.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:32:41 -08:00
72942938bf git-svn: allow --find-copies-harder and -l<num> to be passed on commit
Both of these options are passed directly to git-diff-tree when
committing to a SVN repository.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:32:40 -08:00
a18b632762 git-svn: fix a typo in defining the --no-stop-on-copy option
Just a typo, I doubt anybody would use (and I highly recommend not
using) this option anyways.  But you never know...

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 13:32:40 -08:00
5be4eabf90 Merge branch 'jc/pack-thin' into next
* jc/pack-thin:
  Use thin pack transfer in "git fetch".
  Add git-push --thin.
2006-02-20 00:45:38 -08:00
b19696c2e7 Use thin pack transfer in "git fetch".
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 00:38:39 -08:00
a79a276360 Add git-push --thin.
Maybe we would want to make this default before it graduates to
the master branch, but in the meantime to help testing things,
this allows you to say "git push --thin destination".

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-20 00:09:41 -08:00
bb837eccf4 Merge branch 'jc/pack-thin' into next
* jc/pack-thin:
  send-pack --thin: use "thin pack" delta transfer.
  Thin pack - create packfile with missing delta base.
2006-02-19 22:28:46 -08:00
2245be3e7a send-pack --thin: use "thin pack" delta transfer.
The new flag loosens the usual "self containedness" requirment
of packfiles, and sends deltified representation of objects when
we know the other side has the base objects needed to unpack
them.  This would help reducing the transfer size.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-19 22:28:04 -08:00
7a979d99ba Thin pack - create packfile with missing delta base.
This goes together with "rev-list --object-edge" change, to feed
pack-objects list of edge commits in addition to the usual
object list.  Upon seeing such list, pack-objects loosens the
usual "self contained delta" constraints, and can produce delta
against blobs and trees contained in the edge commits without
storing the delta base objects themselves.

The resulting packfile is not usable in .git/object/packs, but
is a good way to implement "delta-only" transfer.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-19 22:27:39 -08:00
8c0db2f519 Merge branch 'jc/rev-list' into next
* jc/rev-list:
  rev-list --objects-edge
  Merge branch 'jc/merge-msg'
  Merge branch 'jc/mv'
  Documentation: fix typo in rev-parse --short option description.
2006-02-19 21:37:10 -08:00
c649657501 rev-list --objects-edge
This new flag is similar to --objects, but causes rev-list to
show list of "uninteresting" commits that appear on the edge
commit prefixed with '-'.

Downstream pack-objects will be changed to take these as hints
to use the trees and blobs contained with them as base objects
of resulting pack, producing an incomplete (not self-contained)
pack.

Such a pack cannot be used in .git/objects/pack (it is prevented
by git-index-pack erroring out if it is fed to git-fetch-pack -k
or git-clone-pack), but would be useful when transferring only
small changes to huge blobs.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-19 21:35:55 -08:00
21a02335f8 Merge branch 'js/portable' into next
* js/portable:
  Really honour NO_PYTHON
  avoid makefile override warning
  Fixes for ancient versions of GNU make
2006-02-19 21:19:39 -08:00
73be17f0b3 Merge branch 'jc/merge-msg'
* jc/merge-msg:
  fmt-merge-msg: do not add excess newline at the end.
  fmt-merge-msg: say which branch things were merged into unless 'master'
2006-02-19 21:18:17 -08:00
1561a9b662 Merge branch 'jc/mv'
* jc/mv:
  Allow git-mv to accept ./ in paths.
2006-02-19 21:17:59 -08:00
2e12a089ff Merge branch 'jc/merge-msg' into next
* jc/merge-msg:
  fmt-merge-msg: do not add excess newline at the end.
2006-02-19 21:17:06 -08:00
a15f43312f fmt-merge-msg: do not add excess newline at the end.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-19 21:14:56 -08:00
a348ab702a Really honour NO_PYTHON
Do not even test for subprocess (trying to execute python).

Signed-off-by: Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-19 16:55:38 -08:00
2a3763ef3d avoid makefile override warning
Signed-off-by: Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-19 16:55:38 -08:00
5102349cc0 Documentation: fix typo in rev-parse --short option description.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-19 10:23:17 -08:00
9f1afe05c3 gitk: New improved gitk
This is a new version of gitk which is much faster and has much better
graph layout.  It achieves the speed by only drawing the parts of the
canvases that are actually visible.  It also draws the commits in the
order that git-rev-list produces them, so if you use -d, you need to
have a recent enough git-rev-list that understands the --date-order
flag.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-02-19 22:44:47 +11:00
0d27c3f699 Merge branch 'jc/mv' into next
* jc/mv:
  Allow git-mv to accept ./ in paths.
  Merge fixes up to GIT 1.2.2
  Fix retries in git-cvsimport
  archimport: remove files from the index before adding/updating
2006-02-18 23:43:54 -08:00
9a0e6731c6 Allow git-mv to accept ./ in paths.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 23:42:03 -08:00
1a9366c0d4 Merge part of js/portable into next 2006-02-18 23:19:33 -08:00
39c015c556 Fixes for ancient versions of GNU make
Some versions of GNU make do not understand $(call), and have problems to
interpret rules like this:

some_target: CFLAGS += -Dsome=defs

[jc: simplified substitution a bit. ]

Signed-off-by: Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 23:17:01 -08:00
abb7c7b31c Optionally work without python
In some setups (notably server setups) you do not need that dependency.
Gracefully handle the absence of python when NO_PYTHON is defined.

Signed-off-by: Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 23:16:09 -08:00
9121a1a1a0 Merge branch 'jc/ident' into next
* jc/ident:
  Keep Porcelainish from failing by broken ident after making changes.
  Delay "empty ident" errors until they really matter.
2006-02-18 23:15:13 -08:00
8cd52c3ca9 Merge branch 'jc/merge-msg' into next
* jc/merge-msg:
  fmt-merge-msg: say which branch things were merged into unless 'master'
  Add an Emacs interface in contrib.
2006-02-18 23:15:12 -08:00
709a9e5771 Merge fixes up to GIT 1.2.2 2006-02-18 22:55:42 -08:00
2b020455f9 fmt-merge-msg: say which branch things were merged into unless 'master'
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 22:37:02 -08:00
e3b59a44f6 Keep Porcelainish from failing by broken ident after making changes.
"empty ident not allowed" error makes commit-tree fail, so we
are already safer in that we would not end up with commit
objects that have bogus names on the author or committer fields.
However, before commit-tree is called there are already changes
made to the index file and the working tree.  The operation can
be resumed after fixing the environment problem, but when this
triggers to a newcomer with unusable gecos, the first question
becomes "what did I lose and how would I recover".

This patch modifies some Porcelainish commands to verify
GIT_COMMITTER_IDENT as soon as we know we are going to make some
commits before doing much damage to prevent confusion.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 20:51:26 -08:00
749be728d4 Delay "empty ident" errors until they really matter.
Previous one warned people upfront to encourage fixing their
environment early, but some people just use repositories and git
tools read-only without making any changes, and in such a case
there is not much point insisting on them having a usable ident.

This round attempts to move the error until either "git-var"
asks for the ident explicitly or "commit-tree" wants to use it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 20:31:05 -08:00
39ba7d5464 Fix retries in git-cvsimport
Fixed a couple of bugs in recovering from broken connections:

The _line() method now returns undef correctly when the connection
is broken instead of falling off the function and returning garbage.

Retries are now reported to stderr and the eventual partially
downloaded file is discarded instead of being appended to.

The "Server gone away" test has been removed, because it was
reachable only if the garbage return bug bit.

Signed-off-by: Martin Mares <mj@ucw.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 16:19:00 -08:00
3ff903bfb9 archimport: remove files from the index before adding/updating
This fixes a bug when importing where a directory gets removed/renamed
but is immediately replaced by a file of the same name in the same
changeset.

This fix only applies to the accurate (default) strategy the moment.

This patch should also fix the fast strategy if/when it is updated
to handle the cases that would've triggered this bug.

This bug was originally found in git-svn, but I remembered I did the
same thing with archimport as well.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 11:21:16 -08:00
711fc8f660 Add an Emacs interface in contrib.
This is an Emacs interface for git. The user interface is modeled on
pcl-cvs. It has been developed on Emacs 21 and will probably need some
tweaking to work on XEmacs.

The basic command is 'M-x git-status' which displays a buffer listing
modified files in the selected project tree. In that buffer the
following features are supported:

  - add/remove files
  - list unknown files
  - commit marked files
  - manage .gitignore
  - commit merges based on MERGE_HEAD
  - revert files to the HEAD version
  - resolve conflicts with smerge or ediff
  - diff files against HEAD/base/mine/other or combined diff
  - get a log of the revisions for specified files

There are plenty of unimplemented features too, see the TODO list at
the top of the file...

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 10:57:15 -08:00
290252e063 Merge branch 'fix'
* fix:
  Make git-reset delete empty directories
2006-02-18 01:26:14 -08:00
9c92f563be Merge branch 'jc/ident'
* jc/ident:
  Make "empty ident" error message a bit more helpful.
  Merge branch 'jc/topo'
  Merge branch 'jc/rebase-limit'
  gitview: typofix
  git-svn: remove files from the index before adding/updating
2006-02-18 01:24:54 -08:00
925f918769 Make "empty ident" error message a bit more helpful.
It appears that some people who did not care about having bogus
names in their own commit messages are bitten by the recent
change to require a sane environment [*1*].

While it was a good idea to prevent people from using bogus
names to create commits and doing sign-offs, the error message
is not very informative.  This patch attempts to warn things
upfront and hint people how to fix their environments.

[Footnote]

*1* The thread is this one.

    http://marc.theaimsgroup.com/?t=113868084800004

    Especially this message.

    http://marc.theaimsgroup.com/?m=113932830015032

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-18 01:24:38 -08:00
62a4417b57 Merge branch 'jc/topo'
* jc/topo:
  topo-order: make --date-order optional.
2006-02-18 01:24:10 -08:00
8fa40aa915 Merge branch 'jc/rebase-limit'
* jc/rebase-limit:
  rebase: allow rebasing onto different base.
2006-02-18 01:24:01 -08:00
c4d133a2b8 gitview: typofix
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
2006-02-18 01:22:42 -08:00
0870321548 git-svn: remove files from the index before adding/updating
This fixes a bug when importing where a directory gets removed/renamed
but is immediately replaced by a file of the same name in the same
revision.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
2006-02-18 01:22:39 -08:00
772d8a3b63 Make git-reset delete empty directories
When git-reset --hard is used and a subdirectory becomes
empty (as it contains no tracked files in the target tree)
the empty subdirectory should be removed.  This matches
the behavior of git-checkout-index and git-read-tree -m
which would not have created the subdirectory or would
have deleted it when updating the working directory.

Subdirectories which are not empty will be left behind.
This may happen if the subdirectory still contains object
files from the user's build process (for example).

[jc: simplified the logic a bit, while keeping the test script.]
2006-02-17 23:52:57 -08:00
416b3cb430 Merge branch 'jc/pack-reuse'
* jc/pack-reuse:
  pack-objects: avoid delta chains that are too long.
2006-02-17 22:05:40 -08:00
e4c9327a77 pack-objects: avoid delta chains that are too long.
This tries to rework the solution for the excess delta chain
problem. An earlier commit worked it around ``cheaply'', but
repeated repacking risks unbound growth of delta chains.

This version counts the length of delta chain we are reusing
from the existing pack, and makes sure a base object that has
sufficiently long delta chain does not get deltified.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 21:48:48 -08:00
9b1320a99e Merge branch 'js/portable'
* js/portable:
  Support Irix
  Optionally support old diffs
  Fix cpio call
  SubmittingPatches: note on whitespaces
  Add a README for gitview
  Add contrib/README.
  git-tag: -l to list tags (usability).
2006-02-17 17:34:51 -08:00
0f4aa3993d Merge branch 'fix'
* fix:
  Document --short and --git-dir in git-rev-parse(1)
  git-rev-parse: Fix --short= option parsing
  Prevent git-upload-pack segfault if object cannot be found
  Abstract test_create_repo out for use in tests.
  Trap exit to clean up created directory if clone fails.
2006-02-17 17:34:31 -08:00
735d80b3bf Document --short and --git-dir in git-rev-parse(1)
Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
2006-02-17 17:33:12 -08:00
44de0da4f9 git-rev-parse: Fix --short= option parsing
Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
2006-02-17 17:33:11 -08:00
289c4b36e3 Support Irix
Signed-off-by: Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 16:32:43 -08:00
5b5d4d9e1b Optionally support old diffs
Some versions of diff do not correctly detect a missing new-line at the end
of the file under certain circumstances.

When defining NO_ACCURATE_DIFF, work around this bug.

Signed-off-by: Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 16:32:41 -08:00
8e1618f961 Fix cpio call
To some cpio's, -a and -m options are mutually exclusive. Use only -m.

Signed-off-by: Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 16:30:57 -08:00
b5b16990f8 Prevent git-upload-pack segfault if object cannot be found
Signed-off-by: Carl Worth <cworth@cworth.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 16:20:51 -08:00
eedf8f97e5 Abstract test_create_repo out for use in tests.
Signed-off-by: Carl Worth <cworth@cworth.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 16:16:53 -08:00
41ff7a1076 Trap exit to clean up created directory if clone fails.
Signed-off-by: Carl Worth <cworth@cworth.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 16:16:49 -08:00
45d2b286ac SubmittingPatches: note on whitespaces
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 16:15:26 -08:00
020e3c1ee6 Add a README for gitview
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 13:34:13 -08:00
0c0fab2da4 Add contrib/README.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 13:33:14 -08:00
b867c7c23a git-tag: -l to list tags (usability).
git-tag -l lists all tags, and git-tag -l <pattern> filters the
result with <pattern>.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 04:04:39 -08:00
07e8ab9be9 Merge branch 'jc/pack-reuse'
* jc/pack-reuse:
  git-repack: allow passing a couple of flags to pack-objects.
  pack-objects: finishing touches.
  pack-objects: reuse data from existing packs.
  Add contrib/gitview from Aneesh.
  git-svn: ensure fetch always works chronologically.
  git-svn: fix revision order when XML::Simple is not loaded
  Introducing contrib/git-svn.
  Allow building Git in systems without iconv
2006-02-17 02:12:19 -08:00
cec2be76d9 git-repack: allow passing a couple of flags to pack-objects.
A new flag -q makes underlying pack-objects less chatty.
A new flag -f forces delta to be recomputed from scratch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 02:11:38 -08:00
ca5381d43e pack-objects: finishing touches.
This introduces --no-reuse-delta option to disable reusing of
existing delta, which is a large part of the optimization
introduced by this series.  This may become necessary if
repeated repacking makes delta chain too long.  With this, the
output of the command becomes identical to that of the older
implementation.  But the performance suffers greatly.

It still allows reusing non-deltified representations; there is
no point uncompressing and recompressing the whole text.

It also adds a couple more statistics output, while squelching
it under -q flag, which the last round forgot to do.

  $ time old-git-pack-objects --stdout >/dev/null <RL
  Generating pack...
  Done counting 184141 objects.
  Packing 184141 objects....................
  real    12m8.530s       user    11m1.450s       sys     0m57.920s
  $ time git-pack-objects --stdout >/dev/null <RL
  Generating pack...
  Done counting 184141 objects.
  Packing 184141 objects.....................
  Total 184141, written 184141 (delta 138297), reused 178833 (delta 134081)
  real    0m59.549s       user    0m56.670s       sys     0m2.400s
  $ time git-pack-objects --stdout --no-reuse-delta >/dev/null <RL
  Generating pack...
  Done counting 184141 objects.
  Packing 184141 objects.....................
  Total 184141, written 184141 (delta 134833), reused 47904 (delta 0)
  real    11m13.830s      user    9m45.240s       sys     0m44.330s

There is one remaining issue when --no-reuse-delta option is not
used.  It can create delta chains that are deeper than specified.

    A<--B<--C<--D   E   F   G

Suppose we have a delta chain A to D (A is stored in full either
in a pack or as a loose object. B is depth1 delta relative to A,
C is depth2 delta relative to B...) with loose objects E, F, G.
And we are going to pack all of them.

B, C and D are left as delta against A, B and C respectively.
So A, E, F, and G are examined for deltification, and let's say
we decided to keep E expanded, and store the rest as deltas like
this:

    E<--F<--G<--A

Oops.  We ended up making D a bit too deep, didn't we?  B, C and
D form a chain on top of A!

This is because we did not know what the final depth of A would
be, when we checked objects and decided to keep the existing
delta.  Unfortunately, deferring the decision until just before
the deltification is not an option.  To be able to make B, C,
and D candidates for deltification with the rest, we need to
know the type and final unexpanded size of them, but the major
part of the optimization comes from the fact that we do not read
the delta data to do so -- getting the final size is quite an
expensive operation.

To prevent this from happening, we should keep A from being
deltified.  But how would we tell that, cheaply?

To do this most precisely, after check_object() runs, each
object that is used as the base object of some existing delta
needs to be marked with the maximum depth of the objects we
decided to keep deltified (in this case, D is depth 3 relative
to A, so if no other delta chain that is longer than 3 based on
A exists, mark A with 3).  Then when attempting to deltify A, we
would take that number into account to see if the final delta
chain that leads to D becomes too deep.

However, this is a bit cumbersome to compute, so we would cheat
and reduce the maximum depth for A arbitrarily to depth/4 in
this implementation.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 02:11:38 -08:00
a49dd05fd0 pack-objects: reuse data from existing packs.
When generating a new pack, notice if we have already needed
objects in existing packs.  If an object is stored deltified,
and its base object is also what we are going to pack, then
reuse the existing deltified representation unconditionally,
bypassing all the expensive find_deltas() and try_deltas()
calls.

Also, notice if what we are going to write out exactly match
what is already in an existing pack (either deltified or just
compressed).  In such a case, we can just copy it instead of
going through the usual uncompressing & recompressing cycle.

Without this patch, in linux-2.6 repository with about 1500
loose objects and a single mega pack:

    $ git-rev-list --objects v2.6.16-rc3 >RL
    $ wc -l RL
    184141 RL
    $ time git-pack-objects p <RL
    Generating pack...
    Done counting 184141 objects.
    Packing 184141 objects....................
    a1fc7b3e537fcb9b3c46b7505df859f0a11e79d2

    real    12m4.323s
    user    11m2.560s
    sys     0m55.950s

With this patch, the same input:

    $ time ../git.junio/git-pack-objects q <RL
    Generating pack...
    Done counting 184141 objects.
    Packing 184141 objects.....................
    a1fc7b3e537fcb9b3c46b7505df859f0a11e79d2
    Total 184141, written 184141, reused 182441

    real    1m2.608s
    user    0m55.090s
    sys     0m1.830s

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 02:11:38 -08:00
8cb711c8a5 Add contrib/gitview from Aneesh.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 02:10:31 -08:00
defc649229 git-svn: ensure fetch always works chronologically.
We run svn log against a URL without a working copy for the first fetch,
so we end up a log that's sorted from highest to lowest.  That's bad, we
always want lowest to highest.  Just default to --revision 0:HEAD now if
-r isn't specified for the first fetch.

Also sort the revisions after we get them just in case somebody
accidentally reverses the argument to --revision for whatever reason.

Thanks again to Emmanuel Guerin for helping me find this.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 01:01:24 -08:00
1c6bbbf37b git-svn: fix revision order when XML::Simple is not loaded
Thanks to Emmanuel Guerin for finding the bug.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-17 01:01:20 -08:00
9101625d9f Merge branch 'lt/merge-tree'
* lt/merge-tree:
  git-merge-tree: generalize the "traverse <n> trees in sync" functionality
  Handling large files with GIT
  Handling large files with GIT
2006-02-16 01:57:39 -08:00
b3466cd8e2 Merge branch 'jc/topo'
* jc/topo:
  topo-order: make --date-order optional.
2006-02-16 01:57:33 -08:00
3397f9df53 Introducing contrib/git-svn. 2006-02-16 01:56:43 -08:00
b6e56eca8a Allow building Git in systems without iconv
Systems using some uClibc versions do not properly support
iconv stuff. This patch allows Git to be built on those
systems by passing NO_ICONV=YesPlease to make. The only
drawback is mailinfo won't do charset conversion in those
systems.

Signed-off-by: Fernando J. Pereda <ferdy@gentoo.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-16 01:42:58 -08:00
164dcb97f0 git-merge-tree: generalize the "traverse <n> trees in sync" functionality
It's actually very useful for other things too. Notably, we could do the
combined diff a lot more efficiently with this.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-15 23:39:11 -08:00
01df529722 Handling large files with GIT
On Tue, 14 Feb 2006, Linus Torvalds wrote:
>
> Here, btw, is the trivial diff to turn my previous "tree-resolve" into a
> "resolve tree relative to the current branch".

Gaah. It was trivial, and it happened to work fine for my test-case, but
when I started looking at not doing that extremely aggressive subdirectory
merging, that showed a few other issues...

So in case people want to try, here's a third patch. Oh, and it's against
my _original_ path, not incremental to the middle one (ie both patches two
and three are against patch #1, it's not a nice series).

Now I'm really done, and won't be sending out any more patches today.
Sorry for the noise.

		Linus

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-15 23:35:40 -08:00
492e0759bf Handling large files with GIT
On Tue, 14 Feb 2006, Junio C Hamano wrote:

> Linus Torvalds <torvalds@osdl.org> writes:
>
> > If somebody is interested in making the "lots of filename changes" case go
> > fast, I'd be more than happy to walk them through what they'd need to
> > change. I'm just not horribly motivated to do it myself. Hint, hint.
>
> In case anybody is wondering, I share the same feeling.  I
> cannot say I'd be "more than happy to" clean up potential
> breakages during the development of such changes, but if the
> change eventually would help certain use cases, I can be
> persuaded to help debugging such a mess ;-).

Actually, I got interested in seeing how hard this is, and wrote a simple
first cut at doing a tree-optimized merger.

Let me shout a bit first:

  THIS IS WORKING CODE, BUT BE CAREFUL: IT'S A TECHNOLOGY DEMONSTRATION
  RATHER THAN THE FINAL PRODUCT!

With that out of the way, let me descibe what this does (and then describe
the missing parts).

This is basically a three-way merge that works entirely on the "tree"
level, rather than on the index. A lot of the _concepts_ are the same,
though, and if you're familiar with the results of an index merge, some of
the output will make more sense.

You give it three trees: the base tree (tree 0), and the two branches to
be merged (tree 1 and tree 2 respectively). It will then walk these three
trees, and resolve them as it goes along.

The interesting part is:
 - it can resolve whole sub-directories in one go, without actually even
   looking recursively at them. A whole subdirectory will resolve the same
   way as any individual files will (although that may need some
   modification, see later).
 - if it has a "content conflict", for subdirectories that means "try to
   do a recursive tree merge", while for non-subdirectories it's just a
   content conflict and we'll output the stage 1/2/3 information.
 - a successful merge will output a single stage 0 ("merged") entry,
   potentially for a whole subdirectory.
 - it outputs all the resolve information on stdout, so something like the
   recursive resolver can pretty easily parse it all.

Now, the caveats:
 - we probably need to be more careful about subdirectory resolves. The
   trivial case (both branches have the exact same subdirectory) is a
   trivial resolve, but the other cases ("branch1 matches base, branch2 is
   different" probably can't be silently just resolved to the "branch2"
   subdirectory state, since it might involve renames into - or out of -
   that subdirectory)
 - we do not track the current index file at all, so this does not do the
   "check that index matches branch1" logic that the three-way merge in
   git-read-tree does. The theory is that we'd do a full three-way merge
   (ignoring the index and working directory), and then to update the
   working tree, we'd do a two-way "git-read-tree branch1->result"
 - I didn't actually make it do all the trivial resolve cases that
   git-read-tree does. It's a technology demonstration.

Finally (a more serious caveat):
 - doing things through stdout may end up being so expensive that we'd
   need to do something else. In particular, it's likely that I should
   not actually output the "merge results", but instead output a "merge
   results as they _differ_ from branch1"

However, I think this patch is already interesting enough that people who
are interested in merging trees might want to look at it. Please keep in
mind that tech _demo_ part, and in particular, keep in mind the final
"serious caveat" part.

In many ways, the really _interesting_ part of a merge is not the result,
but how it _changes_ the branch we're merging into. That's particularly
important as it should hopefully also mean that the output size for any
reasonable case is minimal (and tracks what we actually need to do to the
current state to create the final result).

The code very much is organized so that doing the result as a "diff
against branch1" should be quite easy/possible. I was actually going to do
it, but I decided that it probably makes the output harder to read. I
dunno.

Anyway, let's think about this kind of approach.. Note how the code itself
is actually quite small and short, although it's prbably pretty "dense".

As an interesting test-case, I'd suggest this merge in the kernel:

	git-merge-tree $(git-merge-base 4cbf876 7d2babc) 4cbf876 7d2babc

which resolves beautifully (there are no actual file-level conflicts), and
you can look at the output of that command to start thinking about what
it does.

The interesting part (perhaps) is that timing that command for me shows
that it takes all of 0.004 seconds.. (the git-merge-base thing takes
considerably more ;)

The point is, we _can_ do the actual merge part really really quickly.

		Linus

PS. Final note: when I say that it is "WORKING CODE", that is obviously by
my standards. IOW, I tested it once and it gave reasonable results - so it
must be perfect.

Whether it works for anybody else, or indeed for any other test-case, is
not my problem ;)

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-15 23:35:40 -08:00
4c8725f16a topo-order: make --date-order optional.
This adds --date-order to rev-list; it 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.

The same flag is also added to show-branch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-15 22:12:06 -08:00
bf0a25560b Merge master to get fixes up to 1.2.1 2006-02-15 19:45:03 -08:00
be97bd1b88 Merge branch 'jc/add'
* jc/add:
  Detect misspelled pathspec to git-add
2006-02-15 19:42:15 -08:00
5f906b1c34 Merge fixes up to 1.2.1 2006-02-15 19:39:21 -08:00
f8f135c9ba packed objects: minor cleanup
The delta depth is unsigned.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-15 13:03:27 -08:00
abd54c2c39 Merge branch 'jc/add'
* jc/add:
  Detect misspelled pathspec to git-add
  ls-files --error-unmatch pathspec error reporting fix.
2006-02-15 01:58:26 -08:00
45e48120bb Detect misspelled pathspec to git-add
This is in the same spirit as an earlier patch for git-commit.
It does an extra ls-files to avoid complaining when a fully
tracked directory name is given on the command line (otherwise
--others restriction would say the pathspec does not match).

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-15 01:56:55 -08:00
6becd7da87 ls-files --error-unmatch pathspec error reporting fix.
Earlier patch mistakenly used prefix_len when it meant
prefix_offset.  The latter is to strip the leading directories
when run from a subdirectory.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-15 01:10:13 -08:00
cfba73c842 Merge branch 'jc/rebase-limit'
* jc/rebase-limit:
  rebase: allow rebasing onto different base.
2006-02-14 17:56:48 -08:00
29cd1fa451 Merge branch 'fix'
* fix:
  checkout: fix dirty-file display.
2006-02-14 17:56:07 -08:00
becb6a658c Merge branch 'master'
* master:
  Merge branch 'kh/svn'
  git-svnimport: -r adds svn revision number to commit messages
  Merge branch 'jc/commit'
  commit: detect misspelled pathspec while making a partial commit.
  combine-diff: diff-files fix (#2)
  combine-diff: diff-files fix.
  Merge branch 'jc/rebase'
  Merge branch 'ra/email'
2006-02-14 17:56:02 -08:00
e8a1a11d4e Merge branch 'kh/svn'
* kh/svn:
  git-svnimport: -r adds svn revision number to commit messages
2006-02-14 17:51:50 -08:00
756e3ee0c6 Merge branch 'jc/commit'
* jc/commit:
  commit: detect misspelled pathspec while making a partial commit.
  combine-diff: diff-files fix (#2)
  combine-diff: diff-files fix.
2006-02-14 17:51:02 -08:00
9b6c66e05c Merge branch 'jc/rebase'
* jc/rebase:
  rebase: allow a hook to refuse rebasing.
2006-02-14 17:49:00 -08:00
709fb393ca Merge branch 'ra/email'
* ra/email:
  send-email: Add --cc
  send-email: Add some options for controlling how addresses are automatically added to the cc: list.
2006-02-14 17:46:41 -08:00
e646c9c8c0 rebase: allow rebasing onto different base.
This allows you to rewrite history a bit more flexibly, by
separating the other branch name and new branch point.  By
default, the new branch point is the same as the tip of the
other branch as before, but you can specify where you graft the
rebased branch onto.

When you have this ancestry graph:

          A---B---C topic
         /
    D---E---F---G master

	$ git rebase --onto master~1 master topic

would rewrite the history to look like this:

	      A'\''--B'\''--C'\'' topic
	     /
    D---E---F---G master

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-14 16:10:49 -08:00
bba319b5ce commit: detect misspelled pathspec while making a partial commit.
When you say "git commit Documentaiton" to make partial commit
for the files only in that directory, we did not detect that as
a misspelled pathname and attempted to commit index without
change.  If nothing matched, there is no harm done, but if the
index gets modified otherwise by having another valid pathspec
or after an explicit update-index, a user will not notice
without paying attention to the "git status" preview.

This introduces --error-unmatch option to ls-files, and uses it
to detect this common user error.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-14 14:48:22 -08:00
0a48a344c6 git-svnimport: -r adds svn revision number to commit messages
New -r flag for prepending the corresponding Subversion revision
number to each commit message.

Signed-off-by: Karl Hasselström <kha@treskal.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-14 01:30:43 -08:00
65520c8e50 Merge branch 'master'
* master:
  Merge some proposed fixes
  s/SHELL/SHELL_PATH/ in Makefile
  bisect: remove BISECT_NAMES after done.
  Documentation: git-ls-files asciidocco.
  Documentation: git-commit in 1.2.X series defaults to --include.
  Merge branch 'pb/bisect'
2006-02-13 23:44:41 -08:00
6a9b87972f Merge some proposed fixes
Conflicts:

	Documentation/git-commit.txt - taking the post 1.2.0 semantics.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-13 23:34:58 -08:00
057f98eda1 Merge branch 'pb/bisect'
* pb/bisect:
  Properly git-bisect reset after bisecting from non-master head
2006-02-13 23:26:53 -08:00
45dcab31ee Merge branch 'ra/email'
* ra/email:
  send-email: Add --cc
  send-email: Add some options for controlling how addresses are automatically added to the cc: list.
2006-02-13 02:38:57 -08:00
862e5dccbd Merge branch 'jc/commit'
* jc/commit:
  git-commit: Now --only semantics is the default.
2006-02-13 02:38:20 -08:00
77abf6db91 Merge branch 'jc/rebase'
* jc/rebase:
  rebase: allow a hook to refuse rebasing.
2006-02-13 02:38:16 -08:00
eac6c04ca5 Merge branch 'jc/nostat'
* jc/nostat:
  cache_name_compare() compares name and stage, nothing else.
2006-02-13 02:38:12 -08:00
da140f8bbf send-email: Add --cc
Since Junio used this in an example, and I've personally tried to use it, I
suppose the option should actually exist.

Signed-off-by: Ryan Anderson <ryan@michonline.com>
2006-02-13 03:32:10 -05:00
a985d595ad send-email: Add some options for controlling how addresses are automatically added to the cc: list.
Signed-off-by: Ryan Anderson <ryan@michonline.com>
2006-02-13 03:32:01 -05:00
9a111c91b0 rebase: allow a hook to refuse rebasing.
This lets a hook to interfere a rebase and help prevent certain
branches from being rebased by mistake.  A sample hook to show
how to prevent a topic branch that has already been merged into
publish branch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-13 00:17:33 -08:00
4170a19587 git-commit: Now --only semantics is the default.
This changes the "git commit paths..." to default to --only
semantics from traditional --include semantics, as agreed on the
list.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-12 23:55:07 -08:00
7b80be150c cache_name_compare() compares name and stage, nothing else.
The code was a bit unclear in expressing what it wants to compare.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-12 23:46:25 -08:00
e76d1bec04 Merge branch 'master'
* master:
  GIT 1.2.0
  Fix "test: unexpected operator" on bsd
2006-02-12 13:15:12 -08:00
eafaa043cd Merge branch 'pb/bisect'
* pb/bisect:
  Properly git-bisect reset after bisecting from non-master head
  git-commit: show dirtiness including index.
  Make pack-objects chattier.
2006-02-12 13:09:08 -08:00
810255fd12 Properly git-bisect reset after bisecting from non-master head
git-bisect reset without an argument would return to master even
if the bisecting started at a non-master branch. This patch makes
it save the original branch name to .git/head-name and restore it
afterwards.

This is also compatible with Cogito and cg-seek, so cg-status will
show that we are seeked on the bisect branch and cg-reset will
properly restore the original branch.

git-bisect start will refuse to work if it is not on a bisect but
.git/head-name exists; this is to protect against conflicts with
other seeking tools.

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-12 13:07:02 -08:00
16ee902015 Merge branch 'master'
* master:
  avoid echo -e, there are systems where it does not work
  fix "test: 2: unexpected operator" on bsd
  Fix object re-hashing
  hashtable-based objects: minimum fixups.
  Use a hashtable for objects instead of a sorted list
2006-02-12 11:36:54 -08:00
cfac3f3fa7 Merge branch 'master'
* master:
  Add howto about separating topics.
  Merge branch 'pb/repo'
  Add support for explicit type specifiers when calling git-repo-config
  Merge branch 'jc/fixdiff'
  diff-tree: do not default to -c
  Avoid using "git-var -l" until it gets fixed.
  t5500: adjust to change in pack-object reporting behaviour.
  Only call git-rerere if $GIT_DIR/rr-cache exists.
  Use a relative path for SVN importing
  fetch-clone progress: finishing touches.
  Fix fetch-clone in the presense of signals
  Make "git clone" pack-fetching download statistics better
  Make "git clone" less of a deathly quiet experience
2006-02-12 05:03:40 -08:00
bff606b8e9 Merge branch 'jc/nostat'
* jc/nostat:
  "assume unchanged" git: documentation.
  ls-files: split "show-valid-bit" into a different option.
2006-02-12 04:15:50 -08:00
f9666adfea "assume unchanged" git: documentation.
This updates documentation to describe the "assume unchanged"
behaviour.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-12 01:48:47 -08:00
8bb2e03b9d ls-files: split "show-valid-bit" into a different option.
To preserve compatibility with scripts that expect uppercase
letters to be shown, do not make '-t' to unconditionally show
the valid bit.  Introduce '-v' option for that.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-12 01:47:57 -08:00
69c57a8d87 Merge branch 'master'
* master:
  Define GIT_(AUTHOR|COMMITTER)_(NAME|EMAIL) to known values.
  Merge branch 'lt/diff-tree'
  git-commit -v: have patch at the end.
2006-02-10 19:12:57 -08:00
b82b0082db Merge branch 'master'
* master:
  rev-list: default to abbreviate merge parent names under --pretty.
  delta micro optimization
  count-delta.c: comment fixes
  Merge branch 'jc/empty-commit'
2006-02-10 11:57:08 -08:00
f732d0b857 Merge branch 'lt/diff-tree'
* lt/diff-tree:
  combine-diff: Record diff status a bit more faithfully
  find_unique_abbrev() simplification.
2006-02-10 06:51:28 -08:00
94c6eb3e88 Merge branch 'jc/status'
* jc/status:
  git-status -v
2006-02-10 00:55:34 -08:00
3acfbd7cf8 Merge branch 'master'
* master:
  Merge branch 'jc/ls-files-o'
  count-delta.c: Match the delta data semantics change in version 3.
  remove delta-against-self bit
  stat() for existence in safe_create_leading_directories()
  call git_config() after setup_git_directory()
  Add --diff-filter= documentation paragraph
2006-02-09 22:19:21 -08:00
bd6a9e885a Merge branch 'lt/diff-tree'
* lt/diff-tree:
  combine-diff: move formatting logic to show_combined_diff()
  combined-diff: use diffcore before intersecting paths.
  diff-tree -c raw output
2006-02-09 21:10:52 -08:00
69d47bdd6c gitk: Make "find" on "Files" work again.
It was broken by the change to supply just the child id to
git-diff-tree rather than both child and parent.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2006-02-10 10:29:26 +11:00
0509ef3d21 Merge branch 'jc/nostat'
* jc/nostat:
  "Assume unchanged" git: --really-refresh fix.
2006-02-09 00:55:45 -08:00
b92b2ce94e "Assume unchanged" git: --really-refresh fix.
The earlier round failed to make --really-refresh to mark
up-to-date index entry to valid again due to a trivial thinko.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-09 00:55:17 -08:00
9a9d58520d Merge branch 'jc/ls-files-o'
* jc/ls-files-o:
  ls-files: honour per-directory ignore file from higher directories.
2006-02-09 00:21:27 -08:00
3c91b216ab Merge branches 'jc/nostat' and 'jc/empty-commit'
* jc/nostat:
  ls-files: debugging aid for CE_VALID changes.
  "Assume unchanged" git: do not set CE_VALID with --refresh
  "Assume unchanged" git

* jc/empty-commit:
  t6000: fix a careless test library add-on.
  Do not allow empty name or email.
2006-02-08 21:56:05 -08:00
2bcab24080 ls-files: debugging aid for CE_VALID changes.
This is not really part of the proposed updates for CE_VALID,
but with this change, ls-files -t shows CE_VALID paths with
lowercase tag letters instead of the usual uppercase.  Useful
for checking out what is going on.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-08 21:54:52 -08:00
8b9b0f3af7 "Assume unchanged" git: do not set CE_VALID with --refresh
When working with automatic assume-unchanged mode using
core.ignorestat, setting CE_VALID after --refresh makes things
more cumbersome to use.  Consider this scenario:

 (1) the working tree is on a filesystem with slow lstat(2).
     The user sets core.ignorestat = true.

 (2) "git checkout" to switch to a different branch (or initial
     checkout) updates all paths and the index starts out with
     "all clean".

 (3) The user knows she wants to edit certain paths.  She uses
     update-index --no-assume-unchanged (we could call it --edit;
     the name is inmaterial) to mark these paths and starts
     editing.

 (4) After editing half of the paths marked to be edited, she
     runs "git status".  This runs "update-index --refresh" to
     reduce the false hits from diff-files.

 (5) Now the other half of the paths, since she has not changed
     them, are found to match the index, and CE_VALID is set on
     them again.

For this reason, this commit makes update-index --refresh not to
set CE_VALID even after the path without CE_VALID are verified
to be up to date.  The user still can run --really-refresh to
force lstat() to match the index entries to the reality.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-08 21:54:48 -08:00
5f73076c1a "Assume unchanged" git
This adds "assume unchanged" logic, started by this message in the list
discussion recently:

	<Pine.LNX.4.64.0601311807470.7301@g5.osdl.org>

This is a workaround for filesystems that do not have lstat()
that is quick enough for the index mechanism to take advantage
of.  On the paths marked as "assumed to be unchanged", the user
needs to explicitly use update-index to register the object name
to be in the next commit.

You can use two new options to update-index to set and reset the
CE_VALID bit:

	git-update-index --assume-unchanged path...
	git-update-index --no-assume-unchanged path...

These forms manipulate only the CE_VALID bit; it does not change
the object name recorded in the index file.  Nor they add a new
entry to the index.

When the configuration variable "core.ignorestat = true" is set,
the index entries are marked with CE_VALID bit automatically
after:

 - update-index to explicitly register the current object name to the
   index file.

 - when update-index --refresh finds the path to be up-to-date.

 - when tools like read-tree -u and apply --index update the working
   tree file and register the current object name to the index file.

The flag is dropped upon read-tree that does not check out the index
entry.  This happens regardless of the core.ignorestat settings.

Index entries marked with CE_VALID bit are assumed to be
unchanged most of the time.  However, there are cases that
CE_VALID bit is ignored for the sake of safety and usability:

 - while "git-read-tree -m" or git-apply need to make sure
   that the paths involved in the merge do not have local
   modifications.  This sacrifices performance for safety.

 - when git-checkout-index -f -q -u -a tries to see if it needs
   to checkout the paths.  Otherwise you can never check
   anything out ;-).

 - when git-update-index --really-refresh (a new flag) tries to
   see if the index entry is up to date.  You can start with
   everything marked as CE_VALID and run this once to drop
   CE_VALID bit for paths that are modified.

Most notably, "update-index --refresh" honours CE_VALID and does
not actively stat, so after you modified a file in the working
tree, update-index --refresh would not notice until you tell the
index about it with "git-update-index path" or "git-update-index
--no-assume-unchanged path".

This version is not expected to be perfect.  I think diff
between index and/or tree and working files may need some
adjustment, and there probably needs other cases we should
automatically unmark paths that are marked to be CE_VALID.

But the basics seem to work, and ready to be tested by people
who asked for this feature.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-02-08 21:54:42 -08:00
285 changed files with 24634 additions and 6014 deletions

12
.gitignore vendored
View File

@ -2,6 +2,7 @@ GIT-VERSION-FILE
git
git-add
git-am
git-annotate
git-apply
git-applymbox
git-applypatch
@ -14,6 +15,7 @@ git-checkout
git-checkout-index
git-cherry
git-cherry-pick
git-clean
git-clone
git-clone-pack
git-commit
@ -22,6 +24,7 @@ git-convert-objects
git-count-objects
git-cvsexportcommit
git-cvsimport
git-cvsserver
git-daemon
git-diff
git-diff-files
@ -40,6 +43,7 @@ git-grep
git-hash-object
git-http-fetch
git-http-push
git-imap-send
git-index-pack
git-init-db
git-local-fetch
@ -53,6 +57,7 @@ git-mailsplit
git-merge
git-merge-base
git-merge-index
git-merge-tree
git-merge-octopus
git-merge-one-file
git-merge-ours
@ -60,6 +65,7 @@ git-merge-recursive
git-merge-resolve
git-merge-stupid
git-mktag
git-mktree
git-name-rev
git-mv
git-pack-redundant
@ -84,6 +90,7 @@ git-resolve
git-rev-list
git-rev-parse
git-revert
git-rm
git-send-email
git-send-pack
git-sh-setup
@ -116,12 +123,13 @@ git-write-tree
git-core-*/?*
test-date
test-delta
common-cmds.h
*.tar.gz
*.dsc
*.deb
git-core.spec
*.exe
libgit.a
*.o
*.[ao]
*.py[co]
config.mak
git-blame

View File

@ -1,4 +1,7 @@
MAN1_TXT=$(wildcard git-*.txt) gitk.txt
MAN1_TXT= \
$(filter-out $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
$(wildcard git-*.txt)) \
gitk.txt
MAN7_TXT=git.txt
DOC_HTML=$(patsubst %.txt,%.html,$(MAN1_TXT) $(MAN7_TXT))
@ -11,6 +14,7 @@ ARTICLES += howto-index
ARTICLES += repository-layout
ARTICLES += hooks
ARTICLES += everyday
ARTICLES += git-tools
# with their own formatting rules.
SP_ARTICLES = glossary howto/revert-branch-rebase

View File

@ -4,8 +4,8 @@ it for the core GIT to make sure people understand what they are
doing when they write "Signed-off-by" line.
But the patch submission requirements are a lot more relaxed
here, because the core GIT is thousand times smaller ;-). So
here is only the relevant bits.
here on the technical/contents front, because the core GIT is
thousand times smaller ;-). So here is only the relevant bits.
(1) Make separate commits for logically separate changes.
@ -18,13 +18,19 @@ repository. It is a good discipline.
Describe the technical detail of the change(s).
If your description starts to get long, that's a sign that you
If your description starts to get too long, that's a sign that you
probably need to split up your commit to finer grained pieces.
Oh, another thing. I am picky about whitespaces. Make sure your
changes do not trigger errors with the sample pre-commit hook shipped
in templates/hooks--pre-commit.
(2) Generate your patch using git/cogito out of your commits.
git diff tools generate unidiff which is the preferred format.
(2) Generate your patch using git tools out of your commits.
git based diff tools (git, Cogito, and StGIT included) generate
unidiff which is the preferred format.
You do not have to be afraid to use -M option to "git diff" or
"git format-patch", if your patch involves file renames. The
receiving end can handle them just fine.
@ -33,20 +39,22 @@ Please make sure your patch does not include any extra files
which do not belong in a patch submission. Make sure to review
your patch after generating it, to ensure accuracy. Before
sending out, please make sure it cleanly applies to the "master"
branch head.
branch head. If you are preparing a work based on "next" branch,
that is fine, but please mark it as such.
(3) Sending your patches.
People on the git mailing list needs to be able to read and
People on the git mailing list need to be able to read and
comment on the changes you are submitting. It is important for
a developer to be able to "quote" your changes, using standard
e-mail tools, so that they may comment on specific portions of
your code. For this reason, all patches should be submitting
e-mail "inline". WARNING: Be wary of your MUAs word-wrap
corrupting your patch. Do not cut-n-paste your patch.
your code. For this reason, all patches should be submited
"inline". WARNING: Be wary of your MUAs word-wrap
corrupting your patch. Do not cut-n-paste your patch; you can
lose tabs that way if you are not careful.
It is common convention to prefix your subject line with
It is a common convention to prefix your subject line with
[PATCH]. This lets people easily distinguish patches from other
e-mail discussions.

View File

@ -18,6 +18,16 @@ ifdef::backend-docbook[]
{0#</citerefentry>}
endif::backend-docbook[]
ifdef::backend-docbook[]
# "unbreak" docbook-xsl v1.68 for manpages. v1.69 works with or without this.
[listingblock]
<example><title>{title}</title>
<literallayout>
|
</literallayout>
{title#}</example>
endif::backend-docbook[]
ifdef::backend-xhtml11[]
[gitlink-inlinemacro]
<a href="{target}.html">{target}{0?({0})}</a>

View File

@ -4,6 +4,15 @@
-u::
Synonym for "-p".
--patch-with-raw::
Generate patch but keep also the default raw diff output.
--stat::
Generate a diffstat instead of a patch.
--patch-with-stat::
Generate patch and prepend its diffstat.
-z::
\0 line termination on output
@ -69,6 +78,10 @@
changeset, not just the files that contain the change
in <string>.
--pickaxe-regex::
Make the <string> not a plain string but an extended POSIX
regex to match.
-O<orderfile>::
Output the patch in the order specified in the
<orderfile>, which has one shell glob pattern per line.

View File

@ -3,11 +3,11 @@ git-add(1)
NAME
----
git-add - Add files to the index file.
git-add - Add files to the index file
SYNOPSIS
--------
'git-add' [-n] [-v] <file>...
'git-add' [-n] [-v] [--] <file>...
DESCRIPTION
-----------
@ -26,6 +26,11 @@ OPTIONS
-v::
Be verbose.
--::
This option can be used to separate command-line options from
the list of files, (useful when filenames might be mistaken
for command-line options).
DISCUSSION
----------
@ -60,6 +65,9 @@ git-add git-*.sh::
(i.e. you are listing the files explicitly), it does not
add `subdir/git-foo.sh` to the index.
See Also
--------
gitlink:git-rm[1]
Author
------

View File

@ -9,7 +9,8 @@ git-am - Apply a series of patches in a mailbox
SYNOPSIS
--------
[verse]
'git-am' [--signoff] [--dotest=<dir>] [--utf8] [--binary] [--3way] <mbox>...
'git-am' [--signoff] [--dotest=<dir>] [--utf8] [--binary] [--3way]
[--interactive] [--whitespace=<option>] <mbox>...
'git-am' [--skip | --resolved]
DESCRIPTION
@ -46,6 +47,10 @@ OPTIONS
Skip the current patch. This is only meaningful when
restarting an aborted patch.
--whitespace=<option>::
This flag is passed to the `git-apply` program that applies
the patch.
--interactive::
Run interactively, just like git-applymbox.
@ -80,7 +85,7 @@ names.
SEE ALSO
--------
gitlink:git-applymbox[1], gitlink:git-applypatch[1].
gitlink:git-applymbox[1], gitlink:git-applypatch[1], gitlink:git-apply[1].
Author

View File

@ -0,0 +1,44 @@
git-annotate(1)
===============
NAME
----
git-annotate - Annotate file lines with commit info
SYNOPSIS
--------
git-annotate [options] file [revision]
DESCRIPTION
-----------
Annotates each line in the given file with information from the commit
which introduced the line. Optionally annotate from a given revision.
OPTIONS
-------
-l, --long::
Show long rev (Defaults off).
-t, --time::
Show raw timestamp (Defaults off).
-r, --rename::
Follow renames (Defaults on).
-S, --rev-file <revs-file>::
Use revs from revs-file instead of calling git-rev-list.
-h, --help::
Show help message.
SEE ALSO
--------
gitlink:git-blame[1]
AUTHOR
------
Written by Ryan Anderson <ryan@michonline.com>.
GIT
---
Part of the gitlink:git[7] suite

View File

@ -11,6 +11,7 @@ SYNOPSIS
[verse]
'git-apply' [--stat] [--numstat] [--summary] [--check] [--index] [--apply]
[--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM]
[-CNUM] [--whitespace=<nowarn|warn|error|error-all|strip>]
[<patch>...]
DESCRIPTION
@ -72,6 +73,12 @@ OPTIONS
Remove <n> leading slashes from traditional diff paths. The
default is 1.
-C<n>::
Ensure at least <n> lines of surrounding context match before
and after each change. When fewer lines of surrounding
context exist they all most match. By default no context is
ever ignored.
--apply::
If you use any of the options marked ``Turns off
"apply"'' above, git-apply reads and outputs the
@ -97,6 +104,35 @@ OPTIONS
result. This allows binary files to be patched in a
very limited way.
--whitespace=<option>::
When applying a patch, detect a new or modified line
that ends with trailing whitespaces (this includes a
line that solely consists of whitespaces). By default,
the command outputs warning messages and applies the
patch.
When `git-apply` is used for statistics and not applying a
patch, it defaults to `nowarn`.
You can use different `<option>` to control this
behaviour:
+
* `nowarn` turns off the trailing whitespace warning.
* `warn` outputs warnings for a few such errors, but applies the
patch (default).
* `error` outputs warnings for a few such errors, and refuses
to apply the patch.
* `error-all` is similar to `error` but shows all errors.
* `strip` outputs warnings for a few such errors, strips out the
trailing whitespaces and applies the patch.
Configuration
-------------
apply.whitespace::
When no `--whitespace` flag is given from the command
line, this configuration item is used as the default.
Author
------
Written by Linus Torvalds <torvalds@osdl.org>

View File

@ -3,7 +3,7 @@ git-applypatch(1)
NAME
----
git-applypatch - Apply one patch extracted from an e-mail.
git-applypatch - Apply one patch extracted from an e-mail
SYNOPSIS

View File

@ -9,7 +9,7 @@ git-archimport - Import an Arch repository into git
SYNOPSIS
--------
[verse]
`git-archimport` [-h] [-v] [-o] [-a] [-f] [-T] [-D depth] [-t tempdir]
'git-archimport' [-h] [-v] [-o] [-a] [-f] [-T] [-D depth] [-t tempdir]
<archive/branch> [ <archive/branch> ]
DESCRIPTION

View File

@ -0,0 +1,42 @@
git-blame(1)
============
NAME
----
git-blame - Blame file lines on commits
SYNOPSIS
--------
git-blame file [options] file [revision]
DESCRIPTION
-----------
Annotates each line in the given file with information from the commit
which introduced the line. Start annotation from the given revision.
OPTIONS
-------
-c, --compability::
Use the same output mode as git-annotate (Default: off).
-l, --long::
Show long rev (Defaults off).
-S, --rev-file <revs-file>::
Use revs from revs-file instead of calling git-rev-list.
-h, --help::
Show help message.
SEE ALSO
--------
gitlink:git-annotate[1]
AUTHOR
------
Written by Fredrik Kuivinen <freku045@student.liu.se>.
GIT
---
Part of the gitlink:git[7] suite

View File

@ -3,20 +3,24 @@ git-branch(1)
NAME
----
git-branch - Create a new branch, or remove an old one.
git-branch - Create a new branch, or remove an old one
SYNOPSIS
--------
'git-branch' [(-d | -D) <branchname>] | [[-f] <branchname> [<start-point>]]
[verse]
'git-branch' [[-f] <branchname> [<start-point>]]
'git-branch' (-d | -D) <branchname>
DESCRIPTION
-----------
If no argument is provided, show available branches and mark current
branch with star. Otherwise, create a new branch of name <branchname>.
If a starting point is also specified, that will be where the branch is
created, otherwise it will be created at the current HEAD.
With a `-d` or `-D` option, `<branchname>` will be deleted.
OPTIONS
-------
-d::
@ -39,7 +43,7 @@ OPTIONS
Examples
~~~~~~~~
Start development off of a know tag::
Start development off of a known tag::
+
------------
$ git clone git://git.kernel.org/pub/scm/.../linux-2.6 my2.6

View File

@ -3,7 +3,7 @@ git-check-ref-format(1)
NAME
----
git-check-ref-format - Make sure ref name is well formed.
git-check-ref-format - Make sure ref name is well formed
SYNOPSIS
--------

View File

@ -10,7 +10,10 @@ SYNOPSIS
--------
[verse]
'git-checkout-index' [-u] [-q] [-a] [-f] [-n] [--prefix=<string>]
[--stage=<number>] [--] <file>...
[--stage=<number>|all]
[--temp]
[-z] [--stdin]
[--] [<file>]\*
DESCRIPTION
-----------
@ -41,9 +44,24 @@ OPTIONS
When creating files, prepend <string> (usually a directory
including a trailing /)
--stage=<number>::
--stage=<number>|all::
Instead of checking out unmerged entries, copy out the
files from named stage. <number> must be between 1 and 3.
Note: --stage=all automatically implies --temp.
--temp::
Instead of copying the files to the working directory
write the content to temporary files. The temporary name
associations will be written to stdout.
--stdin::
Instead of taking list of paths from the command line,
read list of paths from the standard input. Paths are
separated by LF (i.e. one path per line) by default.
-z::
Only meaningful with `--stdin`; paths are separated with
NUL character instead of LF.
--::
Do not interpret any more arguments as options.
@ -64,13 +82,58 @@ $ find . -name '*.h' -print0 | xargs -0 git-checkout-index -f --
which will force all existing `*.h` files to be replaced with their
cached copies. If an empty command line implied "all", then this would
force-refresh everything in the index, which was not the point.
force-refresh everything in the index, which was not the point. But
since git-checkout-index accepts --stdin it would be faster to use:
----------------
$ find . -name '*.h' -print0 | git-checkout-index -f -z --stdin
----------------
The `--` is just a good idea when you know the rest will be filenames;
it will prevent problems with a filename of, for example, `-a`.
Using `--` is probably a good policy in scripts.
Using --temp or --stage=all
---------------------------
When `--temp` is used (or implied by `--stage=all`)
`git-checkout-index` will create a temporary file for each index
entry being checked out. The index will not be updated with stat
information. These options can be useful if the caller needs all
stages of all unmerged entries so that the unmerged files can be
processed by an external merge tool.
A listing will be written to stdout providing the association of
temporary file names to tracked path names. The listing format
has two variations:
. tempname TAB path RS
+
The first format is what gets used when `--stage` is omitted or
is not `--stage=all`. The field tempname is the temporary file
name holding the file content and path is the tracked path name in
the index. Only the requested entries are output.
. stage1temp SP stage2temp SP stage3tmp TAB path RS
+
The second format is what gets used when `--stage=all`. The three
stage temporary fields (stage1temp, stage2temp, stage3temp) list the
name of the temporary file if there is a stage entry in the index
or `.` if there is no stage entry. Paths which only have a stage 0
entry will always be omitted from the output.
In both formats RS (the record separator) is newline by default
but will be the null byte if -z was passed on the command line.
The temporary file names are always safe strings; they will never
contain directory separators or whitespace characters. The path
field is always relative to the current directory and the temporary
file names are always relative to the top level directory.
If the object being copied out to a temporary file is a symbolic
link the content of the link will be written to a normal file. It is
up to the end-user or the Porcelain to make use of this information.
EXAMPLES
--------
To update and refresh only the files already checked out::

View File

@ -3,19 +3,22 @@ git-checkout(1)
NAME
----
git-checkout - Checkout and switch to a branch.
git-checkout - Checkout and switch to a branch
SYNOPSIS
--------
'git-checkout' [-f] [-b <new_branch>] [-m] [<branch>] [<paths>...]
[verse]
'git-checkout' [-f] [-b <new_branch>] [-m] [<branch>]
'git-checkout' [-m] [<branch>] <paths>...
DESCRIPTION
-----------
When <paths> are not given, this command switches branches, by
When <paths> are not given, this command switches branches by
updating the index and working tree to reflect the specified
branch, <branch>, and updating HEAD to be <branch> or, if
specified, <new_branch>.
specified, <new_branch>. Using -b will cause <new_branch> to
be created.
When <paths> are given, this command does *not* switch
branches. It updates the named paths in the working tree from
@ -29,17 +32,17 @@ given paths before updating the working tree.
OPTIONS
-------
-f::
Force an re-read of everything.
Force a re-read of everything.
-b::
Create a new branch and start it at <branch>.
-m::
If you have local modifications to a file that is
different between the current branch and the branch you
are switching to, the command refuses to switch
branches, to preserve your modifications in context.
With this option, a three-way merge between the current
If you have local modifications to one or more files that
are different between the current branch and the branch to
which you are switching, the command refuses to switch
branches in order to preserve your modifications in context.
However, with this option, a three-way merge between the current
branch, your working tree contents, and the new branch
is done, and you will be on the new branch.
+
@ -82,7 +85,7 @@ $ git checkout -- hello.c
------------
. After working in a wrong branch, switching to the correct
branch you would want to is done with:
branch would be done using:
+
------------
$ git checkout mytopic

View File

@ -3,7 +3,7 @@ git-cherry-pick(1)
NAME
----
git-cherry-pick - Apply the change introduced by an existing commit.
git-cherry-pick - Apply the change introduced by an existing commit
SYNOPSIS
--------

View File

@ -3,7 +3,7 @@ git-cherry(1)
NAME
----
git-cherry - Find commits not merged upstream.
git-cherry - Find commits not merged upstream
SYNOPSIS
--------

View File

@ -0,0 +1,50 @@
git-clean(1)
============
NAME
----
git-clean - Remove untracked files from the working tree
SYNOPSIS
--------
[verse]
'git-clean' [-d] [-n] [-q] [-x | -X]
DESCRIPTION
-----------
Removes files unknown to git. This allows to clean the working tree
from files that are not under version control. If the '-x' option is
specified, ignored files are also removed, allowing to remove all
build products.
OPTIONS
-------
-d::
Remove untracked directories in addition to untracked files.
-n::
Don't actually remove anything, just show what would be done.
-q::
Be quiet, only report errors, but not the files that are
successfully removed.
-x::
Don't use the ignore rules. This allows removing all untracked
files, including build products. This can be used (possibly in
conjunction with gitlink:git-reset[1]) to create a pristine
working directory to test a clean build.
-X::
Remove only files ignored by git. This may be useful to rebuild
everything from scratch, but keep manually created files.
Author
------
Written by Pavel Roskin <proski@gnu.org>
GIT
---
Part of the gitlink:git[7] suite

View File

@ -3,7 +3,7 @@ git-clone-pack(1)
NAME
----
git-clone-pack - Clones a repository by receiving packed objects.
git-clone-pack - Clones a repository by receiving packed objects
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-clone(1)
NAME
----
git-clone - Clones a repository.
git-clone - Clones a repository
SYNOPSIS

View File

@ -9,7 +9,8 @@ SYNOPSIS
--------
[verse]
'git-commit' [-a] [-s] [-v] [(-c | -C) <commit> | -F <file> | -m <msg>]
[-e] [--author <author>] [--] [[-i | -o ]<file>...]
[--no-verify] [--amend] [-e] [--author <author>]
[--] [[-i | -o ]<file>...]
DESCRIPTION
-----------
@ -18,6 +19,10 @@ Updates the index file for given paths, or all modified files if
VISUAL and EDITOR environment variables to edit the commit log
message.
Several environment variable are used during commits. They are
documented in gitlink:git-commit-tree[1].
This command can run `commit-msg`, `pre-commit`, and
`post-commit` hooks. See link:hooks.html[hooks] for more
information.
@ -67,6 +72,28 @@ OPTIONS
commit log message unmodified. This option lets you
further edit the message taken from these sources.
--amend::
Used to amend the tip of the current branch. Prepare the tree
object you would want to replace the latest commit as usual
(this includes the usual -i/-o and explicit paths), and the
commit log editor is seeded with the commit message from the
tip of the current branch. The commit you create replaces the
current tip -- if it was a merge, it will have the parents of
the current tip as parents -- so the current top commit is
discarded.
+
--
It is a rough equivalent for:
------
$ git reset --soft HEAD^
$ ... do something else to come up with the right tree ...
$ git commit -c ORIG_HEAD
------
but can be used to amend a merge commit.
--
-i|--include::
Instead of committing only the files specified on the
command line, update them in the index file and then
@ -85,27 +112,12 @@ OPTIONS
<file>...::
Files to be committed. The meaning of these is
different between `--include` and `--only`. Without
either, it defaults `--include` semantics.
either, it defaults `--only` semantics.
If you make a commit and then found a mistake immediately after
that, you can recover from it with gitlink:git-reset[1].
WARNING
-------
The 1.2.0 and its maintenance series 1.2.X will keep the
traditional `--include` semantics as the default when neither
`--only` nor `--include` is specified and `paths...` are given.
This *will* change during the development towards 1.3.0 in the
'master' branch of `git.git` repository. If you are using this
command in your scripts, and you depend on the traditional
`--include` semantics, please update them to explicitly ask for
`--include` semantics. Also if you are used to making partial
commit using `--include` semantics, please train your fingers to
say `git commit --include paths...` (or `git commit -i paths...`).
Discussion
----------
@ -121,7 +133,7 @@ even the command is invoked from a subdirectory.
That is, update the specified paths to the index and then commit
the whole tree.
`git commit --only paths...` largely bypasses the index file and
`git commit paths...` largely bypasses the index file and
commits only the changes made to the specified paths. It has
however several safety valves to prevent confusion.

View File

@ -3,7 +3,7 @@ git-count-objects(1)
NAME
----
git-count-objects - Reports on unpacked objects.
git-count-objects - Reports on unpacked objects
SYNOPSIS
--------

View File

@ -22,6 +22,12 @@ repository, or incrementally import into an existing one.
Splitting the CVS log into patch sets is done by 'cvsps'.
At least version 2.1 is required.
You should *never* do any work of your own on the branches that are
created by git-cvsimport. The initial import will create and populate a
"master" branch from the CVS repository's main branch which you're free
to work with; after that, you need to 'git merge' incremental imports, or
any CVS branches, yourself.
OPTIONS
-------
-d <CVSROOT>::
@ -93,21 +99,24 @@ If you need to pass multiple options, separate them with a comma.
CVS by default uses the unix username when writing its
commit logs. Using this option and an author-conv-file
in this format
+
---------
exon=Andreas Ericsson <ae@op5.se>
spawn=Simon Pawn <spawn@frog-pond.org>
git-cvsimport will make it appear as those authors had
their GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL set properly
all along.
For convenience, this data is saved to $GIT_DIR/cvs-authors
each time the -A option is provided and read from that same
file each time git-cvsimport is run.
It is not recommended to use this feature if you intend to
export changes back to CVS again later with
git-link[1]::git-cvsexportcommit.
---------
+
git-cvsimport will make it appear as those authors had
their GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL set properly
all along.
+
For convenience, this data is saved to $GIT_DIR/cvs-authors
each time the -A option is provided and read from that same
file each time git-cvsimport is run.
+
It is not recommended to use this feature if you intend to
export changes back to CVS again later with
git-link[1]::git-cvsexportcommit.
OUTPUT
------

View File

@ -0,0 +1,148 @@
git-cvsserver(1)
================
NAME
----
git-cvsserver - A CVS server emulator for git
SYNOPSIS
--------
[verse]
export CVS_SERVER=git-cvsserver
'cvs' -d :ext:user@server/path/repo.git co <HEAD_name>
DESCRIPTION
-----------
This application is a CVS emulation layer for git.
It is highly functional. However, not all methods are implemented,
and for those methods that are implemented,
not all switches are implemented.
Testing has been done using both the CLI CVS client, and the Eclipse CVS
plugin. Most functionality works fine with both of these clients.
LIMITATIONS
-----------
Currently cvsserver works over SSH connections for read/write clients, and
over pserver for anonymous CVS access.
CVS clients cannot tag, branch or perform GIT merges.
INSTALLATION
------------
1. If you are going to offer anonymous CVS access via pserver, add a line in
/etc/inetd.conf like
cvspserver stream tcp nowait nobody git-cvsserver pserver
Note: In some cases, you need to pass the 'pserver' argument twice for
git-cvsserver to see it. So the line would look like
cvspserver stream tcp nowait nobody git-cvsserver pserver pserver
No special setup is needed for SSH access, other than having GIT tools
in the PATH. If you have clients that do not accept the CVS_SERVER
env variable, you can rename git-cvsserver to cvs.
2. For each repo that you want accessible from CVS you need to edit config in
the repo and add the following section.
[gitcvs]
enabled=1
# optional for debugging
logfile=/path/to/logfile
Note: you need to ensure each user that is going to invoke git-cvsserver has
write access to the log file and to the git repository. When offering anon
access via pserver, this means that the nobody user should have write access
to at least the sqlite database at the root of the repository.
3. On the client machine you need to set the following variables.
CVSROOT should be set as per normal, but the directory should point at the
appropriate git repo. For example:
For SSH access, CVS_SERVER should be set to git-cvsserver
Example:
export CVSROOT=:ext:user@server:/var/git/project.git
export CVS_SERVER=git-cvsserver
4. For SSH clients that will make commits, make sure their .bashrc file
sets the GIT_AUTHOR and GIT_COMMITTER variables.
5. Clients should now be able to check out the project. Use the CVS 'module'
name to indicate what GIT 'head' you want to check out. Example:
cvs co -d project-master master
Eclipse CVS Client Notes
------------------------
To get a checkout with the Eclipse CVS client:
1. Select "Create a new project -> From CVS checkout"
2. Create a new location. See the notes below for details on how to choose the
right protocol.
3. Browse the 'modules' available. It will give you a list of the heads in
the repository. You will not be able to browse the tree from there. Only
the heads.
4. Pick 'HEAD' when it asks what branch/tag to check out. Untick the
"launch commit wizard" to avoid committing the .project file.
Protocol notes: If you are using anonymous acces via pserver, just select that.
Those using SSH access should choose the 'ext' protocol, and configure 'ext'
access on the Preferences->Team->CVS->ExtConnection pane. Set CVS_SERVER to
'git-cvsserver'. Not that password support is not good when using 'ext',
you will definitely want to have SSH keys setup.
Alternatively, you can just use the non-standard extssh protocol that Eclipse
offer. In that case CVS_SERVER is ignored, and you will have to replace
the cvs utility on the server with git-cvsserver or manipulate your .bashrc
so that calling 'cvs' effectively calls git-cvsserver.
Clients known to work
---------------------
CVS 1.12.9 on Debian
CVS 1.11.17 on MacOSX (from Fink package)
Eclipse 3.0, 3.1.2 on MacOSX (see Eclipse CVS Client Notes)
TortoiseCVS
Operations supported
--------------------
All the operations required for normal use are supported, including
checkout, diff, status, update, log, add, remove, commit.
Legacy monitoring operations are not supported (edit, watch and related).
Exports and tagging (tags and branches) are not supported at this stage.
The server will set the -k mode to binary when relevant. In proper GIT
tradition, the contents of the files are always respected.
No keyword expansion or newline munging is supported.
Dependencies
------------
git-cvsserver depends on DBD::SQLite.
Copyright and Authors
---------------------
This program is copyright The Open University UK - 2006.
Authors: Martyn Smith <martyn@catalyst.net.nz>
Martin Langhoff <martin@catalyst.net.nz>
with ideas and patches from participants of the git-list <git@vger.kernel.org>.
Documentation
--------------
Documentation by Martyn Smith <martyn@catalyst.net.nz> and Martin Langhoff <martin@catalyst.net.nz> Matthias Urlichs <smurf@smurf.noris.de>.
GIT
---
Part of the gitlink:git[7] suite

View File

@ -3,7 +3,7 @@ git-daemon(1)
NAME
----
git-daemon - A really simple server for git repositories.
git-daemon - A really simple server for git repositories
SYNOPSIS
--------

View File

@ -3,7 +3,7 @@ git-describe(1)
NAME
----
git-describe - Show the most recent tag that is reachable from a commit.
git-describe - Show the most recent tag that is reachable from a commit
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-diff-stages(1)
NAME
----
git-diff-stages - Compares content and mode of blobs between stages in an unmerged index file.
git-diff-stages - Compares content and mode of blobs between stages in an unmerged index file
SYNOPSIS

View File

@ -60,7 +60,8 @@ separated with a single space are given.
-m::
By default, "git-diff-tree --stdin" does not show
differences for merge commits. With this flag, it shows
differences to that commit from all of its parents.
differences to that commit from all of its parents. See
also '-c'.
-s::
By default, "git-diff-tree --stdin" shows differences,
@ -81,19 +82,25 @@ separated with a single space are given.
git-diff-tree outputs a line with the commit ID when
applicable. This flag suppressed the commit ID output.
-c,--cc::
These flags change the way a merge commit is displayed
-c::
This flag changes the way a merge commit is displayed
(which means it is useful only when the command is given
one <tree-ish>, or '--stdin'). It shows the differences
from each of the parents to the merge result
simultaneously, instead of showing pairwise diff between
a parent and the result one at a time, which '-m' option
output does. '--cc' further compresses the output by
omiting hunks that show differences from only one
from each of the parents to the merge result simultaneously
instead of showing pairwise diff between a parent and the
result one at a time (which is what the '-m' option does).
Furthermore, it lists only files which were modified
from all parents.
-cc::
This flag changes the way a merge commit patch is displayed,
in a similar way to the '-c' option. It implies the '-c'
and '-p' options and further compresses the patch output
by omitting hunks that show differences from only one
parent, or show the same change from all but one parent
for an Octopus merge. When this optimization makes all
hunks disappear, the commit itself and the commit log
message is not shown, just like any other "empty diff" cases.
message is not shown, just like in any other "empty diff" case.
--always::
Show the commit itself and the commit log message even

View File

@ -3,7 +3,7 @@ git-diff(1)
NAME
----
git-diff - Show changes between commits, commit and working tree, etc.
git-diff - Show changes between commits, commit and working tree, etc
SYNOPSIS

View File

@ -3,12 +3,12 @@ git-fetch-pack(1)
NAME
----
git-fetch-pack - Receive missing objects from another repository.
git-fetch-pack - Receive missing objects from another repository
SYNOPSIS
--------
git-fetch-pack [-q] [-k] [--exec=<git-upload-pack>] [<host>:]<directory> [<refs>...]
'git-fetch-pack' [-q] [-k] [--exec=<git-upload-pack>] [<host>:]<directory> [<refs>...]
DESCRIPTION
-----------

View File

@ -3,7 +3,7 @@ git-fetch(1)
NAME
----
git-fetch - Download objects and a head from another repository.
git-fetch - Download objects and a head from another repository
SYNOPSIS

View File

@ -3,13 +3,13 @@ git-format-patch(1)
NAME
----
git-format-patch - Prepare patches for e-mail submission.
git-format-patch - Prepare patches for e-mail submission
SYNOPSIS
--------
[verse]
'git-format-patch' [-n | -k] [-o <dir> | --stdout] [-s] [-c]
'git-format-patch' [-n | -k] [-o <dir> | --stdout] [--attach] [-s] [-c]
[--diff-options] <his> [<mine>]
DESCRIPTION
@ -60,6 +60,18 @@ OPTIONS
standard output, instead of saving them into a file per
patch and implies --mbox.
--attach::
Create attachments instead of inlining patches.
CONFIGURATION
-------------
You can specify extra mail header lines to be added to each
message in the repository configuration as follows:
[format]
headers = "Organization: git-foo\n"
EXAMPLES
--------

View File

@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git-fsck-objects' [--tags] [--root] [--unreachable] [--cache]
[--standalone | --full] [--strict] [<object>*]
[--full] [--strict] [<object>*]
DESCRIPTION
-----------
@ -38,21 +38,14 @@ index file and all SHA1 references in .git/refs/* as heads.
Consider any object recorded in the index also as a head node for
an unreachability trace.
--standalone::
Limit checks to the contents of GIT_OBJECT_DIRECTORY
($GIT_DIR/objects), making sure that it is consistent and
complete without referring to objects found in alternate
object pools listed in GIT_ALTERNATE_OBJECT_DIRECTORIES,
nor packed git archives found in $GIT_DIR/objects/pack;
cannot be used with --full.
--full::
Check not just objects in GIT_OBJECT_DIRECTORY
($GIT_DIR/objects), but also the ones found in alternate
object pools listed in GIT_ALTERNATE_OBJECT_DIRECTORIES,
object pools listed in GIT_ALTERNATE_OBJECT_DIRECTORIES
or $GIT_DIR/objects/info/alternates,
and in packed git archives found in $GIT_DIR/objects/pack
and corresponding pack subdirectories in alternate
object pools; cannot be used with --standalone.
object pools.
--strict::
Enable more strict checking, namely to catch a file mode

View File

@ -3,7 +3,7 @@ git-get-tar-commit-id(1)
NAME
----
git-get-tar-commit-id - Extract commit ID from an archive created using git-tar-tree.
git-get-tar-commit-id - Extract commit ID from an archive created using git-tar-tree
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-grep(1)
NAME
----
git-grep - print lines matching a pattern
git-grep - Print lines matching a pattern
SYNOPSIS
@ -24,13 +24,13 @@ OPTIONS
<option>...::
Either an option to pass to `grep` or `git-ls-files`.
The following are the specific `git-ls-files` options
that may be given: `-o`, `--cached`, `--deleted`, `--others`,
`--killed`, `--ignored`, `--modified`, `--exclude=*`,
`--exclude-from=*`, and `--exclude-per-directory=*`.
All other options will be passed to `grep`.
+
The following are the specific `git-ls-files` options
that may be given: `-o`, `--cached`, `--deleted`, `--others`,
`--killed`, `--ignored`, `--modified`, `--exclude=\*`,
`--exclude-from=\*`, and `--exclude-per-directory=\*`.
+
All other options will be passed to `grep`.
<pattern>::
The pattern to look for. The first non option is taken

View File

@ -3,7 +3,7 @@ git-hash-object(1)
NAME
----
git-hash-object - Computes object ID and optionally creates a blob from a file.
git-hash-object - Computes object ID and optionally creates a blob from a file
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-http-push(1)
NAME
----
git-http-push - Push missing objects using HTTP/DAV.
git-http-push - Push missing objects using HTTP/DAV
SYNOPSIS

View File

@ -0,0 +1,60 @@
git-imap-send(1)
================
NAME
----
git-imap-send - Dump a mailbox from stdin into an imap folder
SYNOPSIS
--------
'git-imap-send'
DESCRIPTION
-----------
This command uploads a mailbox generated with git-format-patch
into an imap drafts folder. This allows patches to be sent as
other email is sent with mail clients that cannot read mailbox
files directly.
Typical usage is something like:
git-format-patch --signoff --stdout --attach origin | git-imap-send
CONFIGURATION
-------------
git-imap-send requires the following values in the repository
configuration file (shown with examples):
[imap]
Folder = "INBOX.Drafts"
[imap]
Tunnel = "ssh -q user@server.com /usr/bin/imapd ./Maildir 2> /dev/null"
[imap]
Host = imap.server.com
User = bob
Password = pwd
Port = 143
BUGS
----
Doesn't handle lines starting with "From " in the message body.
Author
------
Derived from isync 1.0.1 by Mike McCormack.
Documentation
--------------
Documentation by Mike McCormack
GIT
---
Part of the gitlink:git[7] suite

View File

@ -14,7 +14,8 @@ SYNOPSIS
OPTIONS
-------
--template=<template_directory>::
Provide the directory in from which templates will be used.
Provide the directory from which templates will be used.
The default template directory is `/usr/share/git-core/templates`.
--shared::
Specify that the git repository is to be shared amongst several users.
@ -22,9 +23,17 @@ OPTIONS
DESCRIPTION
-----------
This simply creates an empty git repository - basically a `.git` directory
and `.git/object/??/`, `.git/refs/heads` and `.git/refs/tags` directories,
and links `.git/HEAD` symbolically to `.git/refs/heads/master`.
This command creates an empty git repository - basically a `.git` directory
with subdirectories for `objects`, `refs/heads`, `refs/tags`, and
templated files.
An initial `HEAD` file that references the HEAD of the master branch
is also created.
If `--template=<template_directory>` is specified, `<template_directory>`
is used as the source of the template files rather than the default.
The template files include some directory structure, some suggested
"exclude patterns", and copies of non-executing "hook" files. The
suggested patterns and hook files are all modifiable and extensible.
If the `$GIT_DIR` environment variable is set then it specifies a path
to use instead of `./.git` for the base of the repository.
@ -38,7 +47,6 @@ repository. When specifying `--shared` the config variable "core.sharedRepositor
is set to 'true' so that directories under `$GIT_DIR` are made group writable
(and g+sx, since the git group may be not the primary group of all users).
Running `git-init-db` in an existing repository is safe. It will not overwrite
things that are already there. The primary reason for rerunning `git-init-db`
is to pick up newly added templates.

View File

@ -12,11 +12,16 @@ SYNOPSIS
DESCRIPTION
-----------
Shows the commit logs. This command internally invokes
'git-rev-list', and the command line options are passed to that
command.
Shows the commit logs.
The command takes options applicable to the gitlink::git-rev-list[1]
command to control what is shown and how, and options applicable to
the gitlink::git-diff-tree[1] commands to control how the change
each commit introduces are shown.
This manual page describes only the most frequently used
options.
This manual page describes only the most frequently used options.
OPTIONS
-------
@ -29,6 +34,12 @@ OPTIONS
<since>..<until>::
Show only commits between the named two commits.
-p::
Show the change the commit introduces in a patch form.
<paths>...::
Show only commits that affect the specified paths.
Examples
--------
@ -47,6 +58,11 @@ git log --since="2 weeks ago" -- gitk::
The "--" is necessary to avoid confusion with the *branch* named
'gitk'
git log -r --name-status release..test::
Show the commits that are in the "test" branch but not yet
in the "release" branch, along with the list of paths
each commit modifies.
Author
------

View File

@ -3,7 +3,7 @@ git-lost-found(1)
NAME
----
git-lost-found - Recover lost refs that luckily have not yet been pruned.
git-lost-found - Recover lost refs that luckily have not yet been pruned
SYNOPSIS
--------

View File

@ -8,13 +8,15 @@ git-ls-files - Information about files in the index/working directory
SYNOPSIS
--------
'git-ls-files' [-z] [-t]
[verse]
'git-ls-files' [-z] [-t] [-v]
(--[cached|deleted|others|ignored|stage|unmerged|killed|modified])\*
(-[c|d|o|i|s|u|k|m])\*
[-x <pattern>|--exclude=<pattern>]
[-X <file>|--exclude-from=<file>]
[--exclude-per-directory=<file>]
[--full-name] [--] [<file>]\*
[--exclude-per-directory=<file>]
[--error-unmatch]
[--full-name] [--abbrev] [--] [<file>]\*
DESCRIPTION
-----------
@ -50,6 +52,9 @@ OPTIONS
If a whole directory is classified as "other", show just its
name (with a trailing slash) and not its whole contents.
--no-empty-directory::
Do not list empty directories. Has no effect without --directory.
-u|--unmerged::
Show unmerged files in the output (forces --stage)
@ -72,6 +77,10 @@ OPTIONS
read additional exclude patterns that apply only to the
directory and its subdirectories in <file>.
--error-unmatch::
If any <file> does not appear in the index, treat this as an
error (return 1).
-t::
Identify the file status with the following tags (followed by
a space) at the start of each line:
@ -82,12 +91,21 @@ OPTIONS
K:: to be killed
?:: other
-v::
Similar to `-t`, but use lowercase letters for files
that are marked as 'always matching index'.
--full-name::
When run from a subdirectory, the command usually
outputs paths relative to the current directory. This
option forces paths to be output relative to the project
top directory.
--abbrev[=<n>]::
Instead of showing the full 40-byte hexadecimal object
lines, show only handful hexdigits prefix.
Non default number of digits can be specified with --abbrev=<n>.
--::
Do not interpret any more arguments as options.

View File

@ -3,7 +3,7 @@ git-ls-remote(1)
NAME
----
git-ls-remote - Look at references other repository has.
git-ls-remote - Look at references other repository has
SYNOPSIS

View File

@ -3,12 +3,14 @@ git-ls-tree(1)
NAME
----
git-ls-tree - Lists the contents of a tree object.
git-ls-tree - Lists the contents of a tree object
SYNOPSIS
--------
'git-ls-tree' [-d] [-r] [-t] [-z] [--name-only] [--name-status] <tree-ish> [paths...]
'git-ls-tree' [-d] [-r] [-t] [-z]
[--name-only] [--name-status] [--full-name] [--abbrev=[<n>]]
<tree-ish> [paths...]
DESCRIPTION
-----------
@ -40,6 +42,11 @@ OPTIONS
--name-status::
List only filenames (instead of the "long" output), one per line.
--abbrev[=<n>]::
Instead of showing the full 40-byte hexadecimal object
lines, show only handful hexdigits prefix.
Non default number of digits can be specified with --abbrev=<n>.
paths::
When paths are given, show them (note that this isn't really raw
pathnames, but rather a list of patterns to match). Otherwise

View File

@ -3,7 +3,7 @@ git-mailinfo(1)
NAME
----
git-mailinfo - Extracts patch from a single e-mail message.
git-mailinfo - Extracts patch from a single e-mail message
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-mailsplit(1)
NAME
----
git-mailsplit - Totally braindamaged mbox splitter program.
git-mailsplit - Totally braindamaged mbox splitter program
SYNOPSIS
--------

View File

@ -0,0 +1,37 @@
git-merge-tree(1)
=================
NAME
----
git-merge-tree - Show three-way merge without touching index
SYNOPSIS
--------
'git-merge-tree' <base-tree> <branch1> <branch2>
DESCRIPTION
-----------
Reads three treeish, and output trivial merge results and
conflicting stages to the standard output. This is similar to
what three-way read-tree -m does, but instead of storing the
results in the index, the command outputs the entries to the
standard output.
This is meant to be used by higher level scripts to compute
merge results outside index, and stuff the results back into the
index. For this reason, the output from the command omits
entries that match <branch1> tree.
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
Documentation
--------------
Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
GIT
---
Part of the gitlink:git[7] suite

View File

@ -0,0 +1,35 @@
git-mktree(1)
=============
NAME
----
git-mktree - Build a tree-object from ls-tree formatted text
SYNOPSIS
--------
'git-mktree' [-z]
DESCRIPTION
-----------
Reads standard input in non-recursive `ls-tree` output format,
and creates a tree object. The object name of the tree object
built is written to the standard output.
OPTIONS
-------
-z::
Read the NUL-terminated `ls-tree -z` output instead.
Author
------
Written by Junio C Hamano <junkio@cox.net>
Documentation
--------------
Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
GIT
---
Part of the gitlink:git[7] suite

View File

@ -3,7 +3,7 @@ git-mv(1)
NAME
----
git-mv - Script used to move or rename a file, directory or symlink.
git-mv - Move or rename a file, directory or symlink
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-name-rev(1)
NAME
----
git-name-rev - Find symbolic names for given revs.
git-name-rev - Find symbolic names for given revs
SYNOPSIS

View File

@ -3,12 +3,15 @@ git-pack-objects(1)
NAME
----
git-pack-objects - Create a packed archive of objects.
git-pack-objects - Create a packed archive of objects
SYNOPSIS
--------
'git-pack-objects' [--non-empty] [--local] [--incremental] [--window=N] [--depth=N] {--stdout | base-name} < object-list
[verse]
'git-pack-objects' [-q] [--no-reuse-delta] [--non-empty]
[--local] [--incremental] [--window=N] [--depth=N]
{--stdout | base-name} < object-list
DESCRIPTION
@ -32,6 +35,10 @@ Placing both in the pack/ subdirectory of $GIT_OBJECT_DIRECTORY (or
any of the directories on $GIT_ALTERNATE_OBJECT_DIRECTORIES)
enables git to read from such an archive.
In a packed archive, an object is either stored as a compressed
whole, or as a difference from some other object. The latter is
often called a delta.
OPTIONS
-------
@ -74,6 +81,18 @@ base-name::
Only create a packed archive if it would contain at
least one object.
-q::
This flag makes the command not to report its progress
on the standard error stream.
--no-reuse-delta::
When creating a packed archive in a repository that
has existing packs, the command reuses existing deltas.
This sometimes results in a slightly suboptimal pack.
This flag tells the command not to reuse existing deltas
but compute them from scratch.
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
@ -82,7 +101,7 @@ Documentation
-------------
Documentation by Junio C Hamano
See-Also
See Also
--------
gitlink:git-repack[1]
gitlink:git-prune-packed[1]

View File

@ -3,12 +3,12 @@ git-pack-redundant(1)
NAME
----
git-pack-redundant - Program used to find redundant pack files.
git-pack-redundant - Program used to find redundant pack files
SYNOPSIS
--------
'git-pack-redundant [ --verbose ] [ --alt-odb ] < --all | .pack filename ... >'
'git-pack-redundant' [ --verbose ] [ --alt-odb ] < --all | .pack filename ... >
DESCRIPTION
-----------
@ -46,7 +46,7 @@ Documentation
--------------
Documentation by Lukas Sandström <lukass@etek.chalmers.se>
See-Also
See Also
--------
gitlink:git-pack-objects[1]
gitlink:git-repack[1]

View File

@ -3,7 +3,7 @@ git-patch-id(1)
NAME
----
git-patch-id - Generate a patch ID.
git-patch-id - Generate a patch ID
SYNOPSIS
--------

View File

@ -3,7 +3,7 @@ git-peek-remote(1)
NAME
----
git-peek-remote - Lists the references in a remote repository.
git-peek-remote - Lists the references in a remote repository
SYNOPSIS

View File

@ -40,7 +40,7 @@ Documentation
--------------
Documentation by Ryan Anderson <ryan@michonline.com>
See-Also
See Also
--------
gitlink:git-pack-objects[1]
gitlink:git-repack[1]

View File

@ -3,7 +3,7 @@ git-pull(1)
NAME
----
git-pull - Pull and merge from another repository.
git-pull - Pull and merge from another repository
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-push(1)
NAME
----
git-push - Update remote refs along with associated objects.
git-push - Update remote refs along with associated objects
SYNOPSIS
@ -43,6 +43,12 @@ to fast forward the remote ref that matches <dst>. If
the optional plus `+` is used, the remote ref is updated
even if it does not result in a fast forward update.
+
Note: If no explicit refspec is found, (that is neither
on the command line nor in any Push line of the
corresponding remotes file---see below), then all the
refs that exist both on the local side and on the remote
side are updated.
+
Some short-cut notations are also supported.
+
* `tag <tag>` means the same as `refs/tags/<tag>:refs/tags/<tag>`.

View File

@ -8,7 +8,7 @@ git-read-tree - Reads tree information into the index
SYNOPSIS
--------
'git-read-tree' (<tree-ish> | [[-m | --reset] [-u | -i]] <tree-ish1> [<tree-ish2> [<tree-ish3>]])
'git-read-tree' (<tree-ish> | [[-m [--aggressive]| --reset] [-u | -i]] <tree-ish1> [<tree-ish2> [<tree-ish3>]])
DESCRIPTION
@ -50,6 +50,19 @@ OPTIONS
trees that are not directly related to the current
working tree status into a temporary index file.
--aggressive::
Usually a three-way merge by `git-read-tree` resolves
the merge for really trivial cases and leaves other
cases unresolved in the index, so that Porcelains can
implement different merge policies. This flag makes the
command to resolve a few more cases internally:
+
* when one side removes a path and the other side leaves the path
unmodified. The resolution is to remove that path.
* when both sides remove a path. The resolution is to remove that path.
* when both sides adds a path identically. The resolution
is to add that path.
<tree-ish#>::
The id of the tree object(s) to be read/merged.

View File

@ -3,22 +3,74 @@ git-rebase(1)
NAME
----
git-rebase - Rebase local commits to new upstream head.
git-rebase - Rebase local commits to new upstream head
SYNOPSIS
--------
'git-rebase' <upstream> [<head>]
'git-rebase' [--onto <newbase>] <upstream> [<branch>]
DESCRIPTION
-----------
Rebases local commits to the new head of the upstream tree.
git-rebase applies to <upstream> (or optionally to <newbase>) commits
from <branch> that do not appear in <upstream>. When <branch> is not
specified it defaults to the current branch (HEAD).
When git-rebase is complete, <branch> will be updated to point to the
newly created line of commit objects, so the previous line will not be
accessible unless there are other references to it already.
Assume the following history exists and the current branch is "topic":
A---B---C topic
/
D---E---F---G master
From this point, the result of either of the following commands:
git-rebase master
git-rebase master topic
would be:
A'--B'--C' topic
/
D---E---F---G master
While, starting from the same point, the result of either of the following
commands:
git-rebase --onto master~1 master
git-rebase --onto master~1 master topic
would be:
A'--B'--C' topic
/
D---E---F---G master
In case of conflict, git-rebase will stop at the first problematic commit
and leave conflict markers in the tree. After resolving the conflict manually
and updating the index with the desired resolution, you can continue the
rebasing process with
git am --resolved --3way
Alternatively, you can undo the git-rebase with
git reset --hard ORIG_HEAD
rm -r .dotest
OPTIONS
-------
<newbase>::
Starting point at which to create the new commits. If the
--onto option is not specified, the starting point is
<upstream>.
<upstream>::
Upstream branch to compare against.
<head>::
<branch>::
Working branch; defaults to HEAD.
Author

View File

@ -3,7 +3,7 @@ git-relink(1)
NAME
----
git-relink - Hardlink common objects in local repositories.
git-relink - Hardlink common objects in local repositories
SYNOPSIS
--------

View File

@ -9,7 +9,7 @@ objects into pack files.
SYNOPSIS
--------
'git-repack' [-a] [-d] [-l] [-n]
'git-repack' [-a] [-d] [-f] [-l] [-n] [-q]
DESCRIPTION
-----------
@ -43,6 +43,14 @@ OPTIONS
Pass the `--local` option to `git pack-objects`, see
gitlink:git-pack-objects[1].
-f::
Pass the `--no-reuse-delta` option to `git pack-objects`, see
gitlink:git-pack-objects[1].
-q::
Pass the `-q` option to `git pack-objects`, see
gitlink:git-pack-objects[1].
-n::
Do not update the server information with
`git update-server-info`.
@ -55,7 +63,7 @@ Documentation
--------------
Documentation by Ryan Anderson <ryan@michonline.com>
See-Also
See Also
--------
gitlink:git-pack-objects[1]
gitlink:git-prune-packed[1]

View File

@ -3,11 +3,12 @@ git-repo-config(1)
NAME
----
git-repo-config - Get and set options in .git/config.
git-repo-config - Get and set options in .git/config
SYNOPSIS
--------
[verse]
'git-repo-config' [type] name [value [value_regex]]
'git-repo-config' [type] --replace-all name [value [value_regex]]
'git-repo-config' [type] --get name [value_regex]

View File

@ -3,7 +3,7 @@ git-request-pull(1)
NAME
----
git-request-pull - Generates a summary of pending changes.
git-request-pull - Generates a summary of pending changes
SYNOPSIS
--------

View File

@ -3,7 +3,7 @@ git-reset(1)
NAME
----
git-reset - Reset current HEAD to the specified state.
git-reset - Reset current HEAD to the specified state
SYNOPSIS
--------

View File

@ -16,9 +16,9 @@ SYNOPSIS
[ \--no-merges ]
[ \--remove-empty ]
[ \--all ]
[ [ \--merge-order [ \--show-breaks ] ] | [ \--topo-order ] ]
[ \--topo-order ]
[ \--parents ]
[ \--objects [ \--unpacked ] ]
[ [\--objects | \--objects-edge] [ \--unpacked ] ]
[ \--pretty | \--header ]
[ \--bisect ]
<commit>... [ \-- <paths>... ]
@ -53,6 +53,14 @@ OPTIONS
which I need to download if I have the commit object 'bar', but
not 'foo'".
--objects-edge::
Similar to `--objects`, but also print the IDs of
excluded commits refixed with a `-` character. This is
used by `git-pack-objects` to build 'thin' pack, which
records objects in deltified form based on objects
contained in these excluded commits to reduce network
traffic.
--unpacked::
Only useful with `--objects`; print the object IDs that
are not in packs.
@ -94,57 +102,10 @@ OPTIONS
topological order (i.e. descendant commits are shown
before their parents).
--merge-order::
When specified the commit history is decomposed into a unique
sequence of minimal, non-linear epochs and maximal, linear epochs.
Non-linear epochs are then linearised by sorting them into merge
order, which is described below.
+
Maximal, linear epochs correspond to periods of sequential development.
Minimal, non-linear epochs correspond to periods of divergent development
followed by a converging merge. The theory of epochs is described in more
detail at
link:http://blackcubes.dyndns.org/epoch/[http://blackcubes.dyndns.org/epoch/].
+
The merge order for a non-linear epoch is defined as a linearisation for which
the following invariants are true:
+
1. if a commit P is reachable from commit N, commit P sorts after commit N
in the linearised list.
2. if Pi and Pj are any two parents of a merge M (with i < j), then any
commit N, such that N is reachable from Pj but not reachable from Pi,
sorts before all commits reachable from Pi.
+
Invariant 1 states that later commits appear before earlier commits they are
derived from.
+
Invariant 2 states that commits unique to "later" parents in a merge, appear
before all commits from "earlier" parents of a merge.
--show-breaks::
Each item of the list is output with a 2-character prefix consisting
of one of: (|), (^), (=) followed by a space.
+
Commits marked with (=) represent the boundaries of minimal, non-linear epochs
and correspond either to the start of a period of divergent development or to
the end of such a period.
+
Commits marked with (|) are direct parents of commits immediately preceding
the marked commit in the list.
+
Commits marked with (^) are not parents of the immediately preceding commit.
These "breaks" represent necessary discontinuities implied by trying to
represent an arbitrary DAG in a linear form.
+
`--show-breaks` is only valid if `--merge-order` is also specified.
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
Original *--merge-order* logic by Jon Seymour <jon.seymour@gmail.com>
Documentation
--------------
Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.

View File

@ -3,7 +3,7 @@ git-rev-parse(1)
NAME
----
git-rev-parse - Pick out and massage parameters.
git-rev-parse - Pick out and massage parameters
SYNOPSIS
@ -77,6 +77,14 @@ OPTIONS
path of the top-level directory relative to the current
directory (typically a sequence of "../", or an empty string).
--git-dir::
Show `$GIT_DIR` if defined else show the path to the .git directory.
--short, --short=number::
Instead of outputting the full SHA1 values of object names try to
abbriviate them to a shorter unique name. When no length is specified
7 is used. The minimum length is 4.
--since=datestring, --after=datestring::
Parses the date string, and outputs corresponding
--max-age= parameter for git-rev-list command.

View File

@ -3,7 +3,7 @@ git-revert(1)
NAME
----
git-revert - Revert an existing commit.
git-revert - Revert an existing commit
SYNOPSIS
--------

92
Documentation/git-rm.txt Normal file
View File

@ -0,0 +1,92 @@
git-rm(1)
=========
NAME
----
git-rm - Remove files from the working tree and from the index
SYNOPSIS
--------
'git-rm' [-f] [-n] [-v] [--] <file>...
DESCRIPTION
-----------
A convenience wrapper for git-update-index --remove. For those coming
from cvs, git-rm provides an operation similar to "cvs rm" or "cvs
remove".
OPTIONS
-------
<file>...::
Files to remove from the index and optionally, from the
working tree as well.
-f::
Remove files from the working tree as well as from the index.
-n::
Don't actually remove the file(s), just show if they exist in
the index.
-v::
Be verbose.
--::
This option can be used to separate command-line options from
the list of files, (useful when filenames might be mistaken
for command-line options).
DISCUSSION
----------
The list of <file> given to the command is fed to `git-ls-files`
command to list files that are registered in the index and
are not ignored/excluded by `$GIT_DIR/info/exclude` file or
`.gitignore` file in each directory. This means two things:
. You can put the name of a directory on the command line, and the
command will remove all files in it and its subdirectories (the
directories themselves are never removed from the working tree);
. Giving the name of a file that is not in the index does not
remove that file.
EXAMPLES
--------
git-rm Documentation/\\*.txt::
Removes all `\*.txt` files from the index that are under the
`Documentation` directory and any of its subdirectories. The
files are not removed from the working tree.
+
Note that the asterisk `\*` is quoted from the shell in this
example; this lets the command include the files from
subdirectories of `Documentation/` directory.
git-rm -f git-*.sh::
Remove all git-*.sh scripts that are in the index. The files
are removed from the index, and (because of the -f option),
from the working tree as well. Because this example lets the
shell expand the asterisk (i.e. you are listing the files
explicitly), it does not remove `subdir/git-foo.sh`.
See Also
--------
gitlink:git-add[1]
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
Documentation
--------------
Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
GIT
---
Part of the gitlink:git[7] suite

View File

@ -24,6 +24,9 @@ OPTIONS
-------
The options available are:
--cc::
Specify a starting "Cc:" value for each email.
--chain-reply-to, --no-chain-reply-to::
If this is set, each email will be sent as a reply to the previous
email sent. If disabled with "--no-chain-reply-to", all emails after
@ -48,6 +51,9 @@ The options available are:
Only necessary if --compose is also set. If --compose
is not set, this will be prompted for.
--no-signed-off-by-cc::
Do not add emails foudn in Signed-off-by: lines to the cc list.
--quiet::
Make git-send-email less verbose. One line per email should be
all that is output.
@ -61,6 +67,10 @@ The options available are:
Only necessary if --compose is also set. If --compose
is not set, this will be prompted for.
--suppress-from::
Do not add the From: address to the cc: list, if it shows up in a From:
line.
--to::
Specify the primary recipient of the emails generated.
Generally, this will be the upstream maintainer of the

View File

@ -3,7 +3,7 @@ git-send-pack(1)
NAME
----
git-send-pack - Push missing objects packed.
git-send-pack - Push missing objects packed
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-sh-setup(1)
NAME
----
git-sh-setup - Common git shell script setup code.
git-sh-setup - Common git shell script setup code
SYNOPSIS
--------

View File

@ -8,7 +8,7 @@ git-shell - Restricted login shell for GIT over SSH only
SYNOPSIS
--------
'git-shell -c <command> <argument>'
'git-shell' -c <command> <argument>
DESCRIPTION
-----------

View File

@ -3,12 +3,12 @@ git-shortlog(1)
NAME
----
git-shortlog - Summarize 'git log' output.
git-shortlog - Summarize 'git log' output
SYNOPSIS
--------
'git-log --pretty=short | git shortlog'
git-log --pretty=short | 'git-shortlog'
DESCRIPTION
-----------

View File

@ -3,14 +3,14 @@ git-show-branch(1)
NAME
----
git-show-branch - Show branches and their commits.
git-show-branch - Show branches and their commits
SYNOPSIS
--------
[verse]
git-show-branch [--all] [--heads] [--tags] [--topo-order] [--current]
[--more=<n> | --list | --independent | --merge-base]
[--no-name | --sha1-name] [<rev> | <glob>]...
'git-show-branch' [--all] [--heads] [--tags] [--topo-order] [--current]
[--more=<n> | --list | --independent | --merge-base]
[--no-name | --sha1-name] [<rev> | <glob>]...
DESCRIPTION
-----------
@ -141,7 +141,7 @@ it, having the following in the configuration file may help:
------------
With this,`git show-branch` without extra parameters would show
With this, `git show-branch` without extra parameters would show
only the primary branches. In addition, if you happen to be on
your topic branch, it is shown as well.

View File

@ -3,7 +3,7 @@ git-show(1)
NAME
----
git-show - Show one commit with difference it introduces.
git-show - Show one commit with difference it introduces
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-status(1)
NAME
----
git-status - Show working tree status.
git-status - Show working tree status
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-stripspace(1)
NAME
----
git-stripspace - Filter out empty lines.
git-stripspace - Filter out empty lines
SYNOPSIS

View File

@ -9,11 +9,13 @@ git-svnimport - Import a SVN repository into git
SYNOPSIS
--------
[verse]
'git-svnimport' [ -o <branch-for-HEAD> ] [ -h ] [ -v ] [ -d | -D ]
[ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_rev]
[ -b branch_subdir ] [ -T trunk_subdir ] [ -t tag_subdir ]
[ -s start_chg ] [ -m ] [ -M regex ]
<SVN_repository_URL> [ <path> ]
[ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_rev]
[ -b branch_subdir ] [ -T trunk_subdir ] [ -t tag_subdir ]
[ -s start_chg ] [ -m ] [ -r ] [ -M regex ]
[ -I <ignorefile_name> ] [ -A <author_file> ]
<SVN_repository_URL> [ <path> ]
DESCRIPTION
@ -61,6 +63,34 @@ When importing incrementally, you might need to edit the .git/svn2git file.
the git repository. Use this option if you want to import into a
different branch.
-r::
Prepend 'rX: ' to commit messages, where X is the imported
subversion revision.
-I <ignorefile_name>::
Import the svn:ignore directory property to files with this
name in each directory. (The Subversion and GIT ignore
syntaxes are similar enough that using the Subversion patterns
directly with "-I .gitignore" will almost always just work.)
-A <author_file>::
Read a file with lines on the form
+
------
username = User's Full Name <email@addr.es>
------
+
and use "User's Full Name <email@addr.es>" as the GIT
author and committer for Subversion commits made by
"username". If encountering a commit made by a user not in the
list, abort.
+
For convenience, this data is saved to $GIT_DIR/svn-authors
each time the -A option is provided, and read from that same
file each time git-svnimport is run with an existing GIT
repository without -A.
-m::
Attempt to detect merges based on the commit message. This option
will enable default regexes that try to capture the name source

View File

@ -3,16 +3,18 @@ git-tag(1)
NAME
----
git-tag - Create a tag object signed with GPG
git-tag - Create a tag object signed with GPG
SYNOPSIS
--------
[verse]
'git-tag' [-a | -s | -u <key-id>] [-f | -d] [-m <msg>] <name> [<head>]
'git-tag' -l [<pattern>]
DESCRIPTION
-----------
Adds a 'tag' reference in .git/refs/tags/
Adds a 'tag' reference in `.git/refs/tags/`
Unless `-f` is given, the tag must not yet exist in
`.git/refs/tags/` directory.
@ -32,6 +34,9 @@ GnuPG key for signing.
`-d <tag>` deletes the tag.
`-l <pattern>` lists tags that match the given pattern (or all
if no pattern is given).
OPTIONS
-------
-a::
@ -49,6 +54,9 @@ OPTIONS
-d::
Delete an existing tag with the given name
-l <pattern>::
List tags that match the given pattern (or all if no pattern is given).
-m <msg>::
Use the given tag message (instead of prompting)

View File

@ -0,0 +1,97 @@
A short git tools survey
========================
Introduction
------------
Apart from git contrib/ area there are some others third-party tools
you may want to look.
This document presents a brief summary of each tool and the corresponding
link.
Alternative/Augmentative Procelains
-----------------------------------
- *Cogito* (http://www.kernel.org/pub/software/scm/cogito/)
Cogito is a version control system layered on top of the git tree history
storage system. It aims at seamless user interface and ease of use,
providing generally smoother user experience than the "raw" Core GIT
itself and indeed many other version control systems.
- *pg* (http://www.spearce.org/category/projects/scm/pg/)
pg is a shell script wrapper around GIT to help the user manage a set of
patches to files. pg is somewhat like quilt or StGIT, but it does have a
slightly different feature set.
- *StGit* (http://www.procode.org/stgit/)
Stacked GIT provides a quilt-like patch management functionality in the
GIT environment. You can easily manage your patches in the scope of GIT
until they get merged upstream.
History Viewers
---------------
- *gitk* (shipped with git-core)
gitk is a simple TK GUI for browsing history of GIT repositories easily.
- *gitview* (contrib/)
gitview is a GTK based repository browser for git
- *gitweb* (ftp://ftp.kernel.org/pub/software/scm/gitweb/)
GITweb provides full-fledged web interface for GIT repositories.
- *qgit* (http://digilander.libero.it/mcostalba/)
QGit is a git/StGIT GUI viewer built on Qt/C++. QGit could be used
to browse history and directory tree, view annotated files, commit
changes cherry picking single files or applying patches.
Currently it is the fastest and most feature rich among the git
viewers and commit tools.
Foreign SCM interface
---------------------
- *git-svn* (contrib/)
git-svn is a simple conduit for changesets between a single Subversion
branch and git.
- *quilt2git / git2quilt* (http://home-tj.org/wiki/index.php/Misc)
These utilities convert patch series in a quilt repository and commit
series in git back and forth.
Others
------
- *(h)gct* (http://www.cyd.liu.se/users/~freku045/gct/)
Commit Tool or (h)gct is a GUI enabled commit tool for git and
Mercurial (hg). It allows the user to view diffs, select which files
to committed (or ignored / reverted) write commit messages and
perform the commit itself.
- *git.el* (contrib/)
This is an Emacs interface for git. The user interface is modeled on
pcl-cvs. It has been developed on Emacs 21 and will probably need some
tweaking to work on XEmacs.

View File

@ -3,7 +3,7 @@ git-unpack-objects(1)
NAME
----
git-unpack-objects - Unpack objects from a packed archive.
git-unpack-objects - Unpack objects from a packed archive
SYNOPSIS

View File

@ -8,11 +8,14 @@ git-update-index - Modifies the index or directory cache
SYNOPSIS
--------
[verse]
'git-update-index'
[--add] [--remove | --force-remove] [--replace]
[--refresh [-q] [--unmerged] [--ignore-missing]]
[--cacheinfo <mode> <object> <file>]\*
[--chmod=(+|-)x]
[--assume-unchanged | --no-assume-unchanged]
[--really-refresh]
[--info-only] [--index-info]
[-z] [--stdin]
[--verbose]
@ -65,6 +68,18 @@ OPTIONS
--chmod=(+|-)x::
Set the execute permissions on the updated files.
--assume-unchanged, --no-assume-unchanged::
When these flags are specified, the object name recorded
for the paths are not updated. Instead, these options
sets and unsets the "assume unchanged" bit for the
paths. When the "assume unchanged" bit is on, git stops
checking the working tree files for possible
modifications, so you need to manually unset the bit to
tell git when you change the working tree file. This is
sometimes helpful when working with a big project on a
filesystem that has very slow lstat(2) system call
(e.g. cifs).
--info-only::
Do not create objects in the object database for all
<file> arguments that follow this flag; just insert
@ -193,6 +208,37 @@ $ git ls-files -s
------------
Using "assume unchanged" bit
----------------------------
Many operations in git depend on your filesystem to have an
efficient `lstat(2)` implementation, so that `st_mtime`
information for working tree files can be cheaply checked to see
if the file contents have changed from the version recorded in
the index file. Unfortunately, some filesystems have
inefficient `lstat(2)`. If your filesystem is one of them, you
can set "assume unchanged" bit to paths you have not changed to
cause git not to do this check. Note that setting this bit on a
path does not mean git will check the contents of the file to
see if it has changed -- it makes git to omit any checking and
assume it has *not* changed. When you make changes to working
tree files, you have to explicitly tell git about it by dropping
"assume unchanged" bit, either before or after you modify them.
In order to set "assume unchanged" bit, use `--assume-unchanged`
option. To unset, use `--no-assume-unchanged`.
The command looks at `core.ignorestat` configuration variable. When
this is true, paths updated with `git-update-index paths...` and
paths updated with other git commands that update both index and
working tree (e.g. `git-apply --index`, `git-checkout-index -u`,
and `git-read-tree -u`) are automatically marked as "assume
unchanged". Note that "assume unchanged" bit is *not* set if
`git-update-index --refresh` finds the working tree file matches
the index (use `git-update-index --really-refresh` if you want
to mark them as "assume unchanged").
Examples
--------
To update and refresh only the files already checked out:
@ -201,6 +247,35 @@ To update and refresh only the files already checked out:
$ git-checkout-index -n -f -a && git-update-index --ignore-missing --refresh
----------------
On an inefficient filesystem with `core.ignorestat` set:
------------
$ git update-index --really-refresh <1>
$ git update-index --no-assume-unchanged foo.c <2>
$ git diff --name-only <3>
$ edit foo.c
$ git diff --name-only <4>
M foo.c
$ git update-index foo.c <5>
$ git diff --name-only <6>
$ edit foo.c
$ git diff --name-only <7>
$ git update-index --no-assume-unchanged foo.c <8>
$ git diff --name-only <9>
M foo.c
<1> forces lstat(2) to set "assume unchanged" bits for paths
that match index.
<2> mark the path to be edited.
<3> this does lstat(2) and finds index matches the path.
<4> this does lstat(2) and finds index does not match the path.
<5> registering the new version to index sets "assume unchanged" bit.
<6> and it is assumed unchanged.
<7> even after you edit it.
<8> you can tell about the change after the fact.
<9> now it checks with lstat(2) and finds it has been changed.
------------
Configuration
-------------
@ -213,6 +288,9 @@ in the index and the file mode on the filesystem if they differ only on
executable bit. On such an unfortunate filesystem, you may
need to use `git-update-index --chmod=`.
The command looks at `core.ignorestat` configuration variable. See
'Using "assume unchanged" bit' section above.
See Also
--------

View File

@ -7,7 +7,7 @@ git-update-ref - update the object name stored in a ref safely
SYNOPSIS
--------
`git-update-ref` <ref> <newvalue> [<oldvalue>]
'git-update-ref' <ref> <newvalue> [<oldvalue>]
DESCRIPTION
-----------

View File

@ -3,7 +3,7 @@ git-upload-pack(1)
NAME
----
git-upload-pack - Send missing objects packed.
git-upload-pack - Send missing objects packed
SYNOPSIS

View File

@ -8,7 +8,7 @@ git-var - Print the git users identity
SYNOPSIS
--------
git-var [ -l | <variable> ]
'git-var' [ -l | <variable> ]
DESCRIPTION
-----------

View File

@ -3,7 +3,7 @@ git-verify-pack(1)
NAME
----
git-verify-pack - Validate packed git archive files.
git-verify-pack - Validate packed git archive files
SYNOPSIS

View File

@ -3,7 +3,7 @@ git-verify-tag(1)
NAME
----
git-verify-tag - Check the GPG signature of tag.
git-verify-tag - Check the GPG signature of tag
SYNOPSIS
--------

View File

@ -3,7 +3,7 @@ git-whatchanged(1)
NAME
----
git-whatchanged - Show logs with difference each commit introduces.
git-whatchanged - Show logs with difference each commit introduces
SYNOPSIS
@ -47,9 +47,9 @@ OPTIONS
By default, differences for merge commits are not shown.
With this flag, show differences to that commit from all
of its parents.
However, it is not very useful in general, although it
*is* useful on a file-by-file basis.
+
However, it is not very useful in general, although it
*is* useful on a file-by-file basis.
Examples
--------

View File

@ -12,77 +12,65 @@ SYNOPSIS
DESCRIPTION
-----------
'git' is both a program and a directory content tracker system.
The program 'git' is just a wrapper to reach the core git programs
(or a potty if you like, as it's not exactly porcelain but still
brings your stuff to the plumbing).
Git is a fast, scalable, distributed revision control system with an
unusually rich command set that provides both high-level operations
and full access to internals.
See this link:tutorial.html[tutorial] to get started, then see
link:everyday.html[Everyday Git] for a useful minimum set of commands, and
"man git-commandname" for documentation of each command. CVS users may
also want to read link:cvs-migration.html[CVS migration].
OPTIONS
-------
--version::
prints the git suite version that the 'git' program came from.
Prints the git suite version that the 'git' program came from.
--help::
prints the synopsis and a list of available commands.
If a git command is named this option will bring up the
man-page for that command.
Prints the synopsis and a list of the most commonly used
commands. If a git command is named this option will bring up
the man-page for that command. If the option '--all' or '-a' is
given then all available commands are printed.
--exec-path::
path to wherever your core git programs are installed.
Path to wherever your core git programs are installed.
This can also be controlled by setting the GIT_EXEC_PATH
environment variable. If no path is given 'git' will print
the current setting and then exit.
NOT LEARNING CORE GIT COMMANDS
------------------------------
FURTHER DOCUMENTATION
---------------------
This manual is intended to give complete background information
and internal workings of git, which may be too much for most
people. The <<Discussion>> section below contains much useful
definition and clarification - read that first.
See the references above to get started using git. The following is
probably more detail than necessary for a first-time user.
If you are interested in using git to manage (version control)
projects, use link:tutorial.html[The Tutorial] to get you started,
and then link:everyday.html[Everyday GIT] as a guide to the
minimum set of commands you need to know for day-to-day work.
Most likely, that will get you started, and you can go a long
way without knowing the low level details too much.
The <<Discussion,Discussion>> section below and the
link:core-tutorial.html[Core tutorial] both provide introductions to the
underlying git architecture.
The link:core-tutorial.html[Core tutorial] document covers how things
internally work.
See also the link:howto-index.html[howto] documents for some useful
examples.
If you are migrating from CVS, link:cvs-migration.html[cvs
migration] document may be helpful after you finish the
tutorial.
GIT COMMANDS
------------
After you get the general feel from the tutorial and this
overview page, you may want to take a look at the
link:howto-index.html[howto] documents.
We divide git into high level ("porcelain") commands and low level
("plumbing") commands.
Low-level commands (plumbing)
-----------------------------
CORE GIT COMMANDS
-----------------
Although git includes its
own porcelain layer, its low-level commands are sufficient to support
development of alternative porcelains. Developers of such porcelains
might start by reading about gitlink:git-update-index[1] and
gitlink:git-read-tree[1].
If you are writing your own Porcelain, you need to be familiar
with most of the low level commands --- I suggest starting from
gitlink:git-update-index[1] and gitlink:git-read-tree[1].
Commands Overview
-----------------
The git commands can helpfully be split into those that manipulate
the repository, the index and the files in the working tree, those that
interrogate and compare them, and those that moves objects and
references between repositories.
In addition, git itself comes with a spartan set of porcelain
commands. They are usable but are not meant to compete with real
Porcelains.
There are also some ancillary programs that can be viewed as useful
aids for using the core commands but which are unlikely to be used by
SCMs layered over git.
We divide the low-level commands into commands that manipulate objects (in
the repository, index, and working tree), commands that interrogate and
compare objects, and commands that move objects and references between
repositories.
Manipulation commands
~~~~~~~~~~~~~~~~~~~~~
@ -112,6 +100,9 @@ gitlink:git-merge-index[1]::
gitlink:git-mktag[1]::
Creates a tag object.
gitlink:git-mktree[1]::
Build a tree-object from ls-tree formatted text.
gitlink:git-pack-objects[1]::
Creates a packed archive of objects.
@ -247,8 +238,14 @@ gitlink:git-upload-pack[1]::
what are asked for.
Porcelain-ish Commands
----------------------
High-level commands (porcelain)
-------------------------------
We separate the porcelain commands into the main commands and some
ancillary user utilities.
Main porcelain commands
~~~~~~~~~~~~~~~~~~~~~~~
gitlink:git-add[1]::
Add paths to the index.
@ -271,6 +268,9 @@ gitlink:git-checkout[1]::
gitlink:git-cherry-pick[1]::
Cherry-pick the effect of an existing commit.
gitlink:git-clean[1]::
Remove untracked files from the working tree.
gitlink:git-clone[1]::
Clones a repository into a new directory.
@ -325,9 +325,15 @@ gitlink:git-resolve[1]::
gitlink:git-revert[1]::
Revert an existing commit.
gitlink:git-rm[1]::
Remove files from the working tree and from the index.
gitlink:git-shortlog[1]::
Summarizes 'git log' output.
gitlink:git-show[1]::
Show one commit log and its diff.
gitlink:git-show-branch[1]::
Show branches and their commits.
@ -342,7 +348,7 @@ gitlink:git-whatchanged[1]::
Ancillary Commands
------------------
~~~~~~~~~~~~~~~~~~
Manipulators:
gitlink:git-applypatch[1]::
@ -360,6 +366,9 @@ gitlink:git-cvsimport[1]::
gitlink:git-cvsexportcommit[1]::
Export a single commit to a CVS checkout.
gitlink:git-cvsserver[1]::
A CVS server emulator for git.
gitlink:git-lost-found[1]::
Recover lost refs that luckily have not yet been pruned.
@ -390,6 +399,12 @@ gitlink:git-update-ref[1]::
Interrogators:
gitlink:git-annotate[1]::
Annotate file lines with commit info.
gitlink:git-blame[1]::
Blame file lines on commits.
gitlink:git-check-ref-format[1]::
Make sure ref name is well formed.
@ -402,9 +417,15 @@ gitlink:git-count-objects[1]::
gitlink:git-daemon[1]::
A really simple server for git repositories.
gitlink:git-fmt-merge-msg[1]::
Produce a merge commit message.
gitlink:git-get-tar-commit-id[1]::
Extract commit ID from an archive created using git-tar-tree.
gitlink:git-imap-send[1]::
Dump a mailbox from stdin into an imap folder.
gitlink:git-mailinfo[1]::
Extracts patch and authorship information from a single
e-mail message, optionally transliterating the commit
@ -414,6 +435,9 @@ gitlink:git-mailsplit[1]::
A stupid program to split UNIX mbox format mailbox into
individual pieces of e-mail.
gitlink:git-merge-tree[1]::
Show three-way merge without touching index.
gitlink:git-patch-id[1]::
Compute unique ID for a patch.
@ -517,16 +541,14 @@ HEAD::
a valid head 'name'
(i.e. the contents of `$GIT_DIR/refs/heads/<head>`).
<snap>::
a valid snapshot 'name'
(i.e. the contents of `$GIT_DIR/refs/snap/<snap>`).
File/Directory Structure
------------------------
Please see link:repository-layout.html[repository layout] document.
Read link:hooks.html[hooks] for more details about each hook.
Higher level SCMs may provide and manage additional information in the
`$GIT_DIR`.

View File

@ -97,16 +97,31 @@ send out a commit notification e-mail.
update
------
This hook is invoked by `git-receive-pack`, which is invoked
when a `git push` is done against the repository. It takes
three parameters, name of the ref being updated, old object name
stored in the ref, and the new objectname to be stored in the
ref. Exiting with non-zero status from this hook prevents
`git-receive-pack` from updating the ref.
This hook is invoked by `git-receive-pack` on the remote repository,
which is happens when a `git push` is done on a local repository.
Just before updating the ref on the remote repository, the update hook
is invoked. It's exit status determins the success or failure of
the ref update.
This can be used to prevent 'forced' update on certain refs by
The hook executes once for each ref to be updated, and takes
three parameters:
- the name of the ref being updated,
- the old object name stored in the ref,
- and the new objectname to be stored in the ref.
A zero exit from the update hook allows the ref to be updated.
Exiting with a non-zero status prevents `git-receive-pack`
from updating the ref.
This hook can be used to prevent 'forced' update on certain refs by
making sure that the object name is a commit object that is a
descendant of the commit object named by the old object name.
That is, to enforce a "fast forward only" policy.
It could also be used to log the old..new status. However, it
does not know the entire set of branches, so it would end up
firing one e-mail per ref when used naively, though.
Another use suggested on the mailing list is to use this hook to
implement access control which is finer grained than the one
based on filesystem group.
@ -115,20 +130,30 @@ The standard output of this hook is sent to /dev/null; if you
want to report something to the git-send-pack on the other end,
you can redirect your output to your stderr.
post-update
-----------
This hook is invoked by `git-receive-pack`, which is invoked
when a `git push` is done against the repository. It takes
variable number of parameters; each of which is the name of ref
that was actually updated.
This hook is invoked by `git-receive-pack` on the remote repository,
which is happens when a `git push` is done on a local repository.
It executes on the remote repository once after all the refs have
been updated.
It takes a variable number of parameters, each of which is the
name of ref that was actually updated.
This hook is meant primarily for notification, and cannot affect
the outcome of `git-receive-pack`.
The post-update hook can tell what are the heads that were pushed,
but it does not know what their original and updated values are,
so it is a poor place to do log old..new.
The default post-update hook, when enabled, runs
`git-update-server-info` to keep the information used by dumb
transport up-to-date.
transports (eg, http) up-to-date. If you are publishing
a git repository that is accessible via http, you should
probably enable this hook.
The standard output of this hook is sent to /dev/null; if you
want to report something to the git-send-pack on the other end,

View File

@ -89,6 +89,8 @@ hooks::
commands. A handful of sample hooks are installed when
`git init-db` is run, but all of them are disabled by
default. To enable, they need to be made executable.
Read link:hooks.html[hooks] for more details about
each hook.
index::
The current index file for the repository. It is

View File

@ -0,0 +1,111 @@
GIT pack format
===============
= pack-*.pack file has the following format:
- The header appears at the beginning and consists of the following:
4-byte signature
4-byte version number (network byte order)
4-byte number of objects contained in the pack (network byte order)
Observation: we cannot have more than 4G versions ;-) and
more than 4G objects in a pack.
- The header is followed by number of object entries, each of
which looks like this:
(undeltified representation)
n-byte type and length (4-bit type, (n-1)*7+4-bit length)
compressed data
(deltified representation)
n-byte type and length (4-bit type, (n-1)*7+4-bit length)
20-byte base object name
compressed delta data
Observation: length of each object is encoded in a variable
length format and is not constrained to 32-bit or anything.
- The trailer records 20-byte SHA1 checksum of all of the above.
= pack-*.idx file has the following format:
- The header consists of 256 4-byte network byte order
integers. N-th entry of this table records the number of
objects in the corresponding pack, the first byte of whose
object name are smaller than N. This is called the
'first-level fan-out' table.
Observation: we would need to extend this to an array of
8-byte integers to go beyond 4G objects per pack, but it is
not strictly necessary.
- The header is followed by sorted 28-byte entries, one entry
per object in the pack. Each entry is:
4-byte network byte order integer, recording where the
object is stored in the packfile as the offset from the
beginning.
20-byte object name.
Observation: we would definitely need to extend this to
8-byte integer plus 20-byte object name to handle a packfile
that is larger than 4GB.
- The file is concluded with a trailer:
A copy of the 20-byte SHA1 checksum at the end of
corresponding packfile.
20-byte SHA1-checksum of all of the above.
Pack Idx file:
idx
+--------------------------------+
| fanout[0] = 2 |-.
+--------------------------------+ |
| fanout[1] | |
+--------------------------------+ |
| fanout[2] | |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| fanout[255] | |
+--------------------------------+ |
main | offset | |
index | object name 00XXXXXXXXXXXXXXXX | |
table +--------------------------------+ |
| offset | |
| object name 00XXXXXXXXXXXXXXXX | |
+--------------------------------+ |
.-| offset |<+
| | object name 01XXXXXXXXXXXXXXXX |
| +--------------------------------+
| | offset |
| | object name 01XXXXXXXXXXXXXXXX |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | offset |
| | object name FFXXXXXXXXXXXXXXXX |
| +--------------------------------+
trailer | | packfile checksum |
| +--------------------------------+
| | idxfile checksum |
| +--------------------------------+
.-------.
|
Pack file entry: <+
packed object header:
1-byte type (upper 4-bit)
size0 (lower 4-bit)
n-byte sizeN (as long as MSB is set, each 7-bit)
size0..sizeN form 4+7+7+..+7 bit integer, size0
is the most significant part.
packed object data:
If it is not DELTA, then deflated bytes (the size above
is the size before compression).
If it is DELTA, then
20-byte base object name SHA1 (the size above is the
size of the delta data that follows).
delta data, deflated.

View File

@ -0,0 +1,466 @@
Concerning Git's Packing Heuristics
===================================
Oh, here's a really stupid question:
Where do I go
to learn the details
of git's packing heuristics?
Be careful what you ask!
Followers of the git, please open the git IRC Log and turn to
February 10, 2006.
It's a rare occasion, and we are joined by the King Git Himself,
Linus Torvalds (linus). Nathaniel Smith, (njs`), has the floor
and seeks enlightenment. Others are present, but silent.
Let's listen in!
<njs`> Oh, here's a really stupid question -- where do I go to
learn the details of git's packing heuristics? google avails
me not, reading the source didn't help a lot, and wading
through the whole mailing list seems less efficient than any
of that.
It is a bold start! A plea for help combined with a simultaneous
tri-part attack on some of the tried and true mainstays in the quest
for enlightenment. Brash accusations of google being useless. Hubris!
Maligning the source. Heresy! Disdain for the mailing list archives.
Woe.
<pasky> yes, the packing-related delta stuff is somewhat
mysterious even for me ;)
Ah! Modesty after all.
<linus> njs, I don't think the docs exist. That's something where
I don't think anybody else than me even really got involved.
Most of the rest of git others have been busy with (especially
Junio), but packing nobody touched after I did it.
It's cryptic, yet vague. Linus in style for sure. Wise men
interpret this as an apology. A few argue it is merely a
statement of fact.
<njs`> I guess the next step is "read the source again", but I
have to build up a certain level of gumption first :-)
Indeed! On both points.
<linus> The packing heuristic is actually really really simple.
Bait...
<linus> But strange.
And switch. That ought to do it!
<linus> Remember: git really doesn't follow files. So what it does is
- generate a list of all objects
- sort the list according to magic heuristics
- walk the list, using a sliding window, seeing if an object
can be diffed against another object in the window
- write out the list in recency order
The traditional understatement:
<njs`> I suspect that what I'm missing is the precise definition of
the word "magic"
The traditional insight:
<pasky> yes
And Bable-like confusion flowed.
<njs`> oh, hmm, and I'm not sure what this sliding window means either
<pasky> iirc, it appeared to me to be just the sha1 of the object
when reading the code casually ...
... which simply doesn't sound as a very good heuristics, though ;)
<njs`> .....and recency order. okay, I think it's clear I didn't
even realize how much I wasn't realizing :-)
Ah, grasshopper! And thus the enlightenment begins anew.
<linus> The "magic" is actually in theory totally arbitrary.
ANY order will give you a working pack, but no, it's not
ordered by SHA1.
Before talking about the ordering for the sliding delta
window, let's talk about the recency order. That's more
important in one way.
<njs`> Right, but if all you want is a working way to pack things
together, you could just use cat and save yourself some
trouble...
Waaait for it....
<linus> The recency ordering (which is basically: put objects
_physically_ into the pack in the order that they are
"reachable" from the head) is important.
<njs`> okay
<linus> It's important because that's the thing that gives packs
good locality. It keeps the objects close to the head (whether
they are old or new, but they are _reachable_ from the head)
at the head of the pack. So packs actually have absolutely
_wonderful_ IO patterns.
Read that again, because it is important.
<linus> But recency ordering is totally useless for deciding how
to actually generate the deltas, so the delta ordering is
something else.
The delta ordering is (wait for it):
- first sort by the "basename" of the object, as defined by
the name the object was _first_ reached through when
generating the object list
- within the same basename, sort by size of the object
- but always sort different types separately (commits first).
That's not exactly it, but it's very close.
<njs`> The "_first_ reached" thing is not too important, just you
need some way to break ties since the same objects may be
reachable many ways, yes?
And as if to clarify:
<linus> The point is that it's all really just any random
heuristic, and the ordering is totally unimportant for
correctness, but it helps a lot if the heuristic gives
"clumping" for things that are likely to delta well against
each other.
It is an important point, so secretly, I did my own research and have
included my results below. To be fair, it has changed some over time.
And through the magic of Revisionistic History, I draw upon this entry
from The Git IRC Logs on my father's birthday, March 1:
<gitster> The quote from the above linus should be rewritten a
bit (wait for it):
- first sort by type. Different objects never delta with
each other.
- then sort by filename/dirname. hash of the basename
occupies the top BITS_PER_INT-DIR_BITS bits, and bottom
DIR_BITS are for the hash of leading path elements.
- then if we are doing "thin" pack, the objects we are _not_
going to pack but we know about are sorted earlier than
other objects.
- and finally sort by size, larger to smaller.
In one swell-foop, clarification and obscurification! Nonetheless,
authoritative. Cryptic, yet concise. It even solicits notions of
quotes from The Source Code. Clearly, more study is needed.
<gitster> That's the sort order. What this means is:
- we do not delta different object types.
- we prefer to delta the objects with the same full path, but
allow files with the same name from different directories.
- we always prefer to delta against objects we are not going
to send, if there are some.
- we prefer to delta against larger objects, so that we have
lots of removals.
The penultimate rule is for "thin" packs. It is used when
the other side is known to have such objects.
There it is again. "Thin" packs. I'm thinking to myself, "What
is a 'thin' pack?" So I ask:
<jdl> What is a "thin" pack?
<gitster> Use of --objects-edge to rev-list as the upstream of
pack-objects. The pack transfer protocol negotiates that.
Woo hoo! Cleared that _right_ up!
<gitster> There are two directions - push and fetch.
There! Did you see it? It is not '"push" and "pull"'! How often the
confusion has started here. So casually mentioned, too!
<gitster> For push, git-send-pack invokes git-receive-pack on the
other end. The receive-pack says "I have up to these commits".
send-pack looks at them, and computes what are missing from
the other end. So "thin" could be the default there.
In the other direction, fetch, git-fetch-pack and
git-clone-pack invokes git-upload-pack on the other end
(via ssh or by talking to the daemon).
There are two cases: fetch-pack with -k and clone-pack is one,
fetch-pack without -k is the other. clone-pack and fetch-pack
with -k will keep the downloaded packfile without expanded, so
we do not use thin pack transfer. Otherwise, the generated
pack will have delta without base object in the same pack.
But fetch-pack without -k will explode the received pack into
individual objects, so we automatically ask upload-pack to
give us a thin pack if upload-pack supports it.
OK then.
Uh.
Let's return to the previous conversation still in progress.
<njs`> and "basename" means something like "the tail of end of
path of file objects and dir objects, as per basename(3), and
we just declare all commit and tag objects to have the same
basename" or something?
Luckily, that too is a point that gitster clarified for us!
If I might add, the trick is to make files that _might_ be similar be
located close to each other in the hash buckets based on their file
names. It used to be that "foo/Makefile", "bar/baz/quux/Makefile" and
"Makefile" all landed in the same bucket due to their common basename,
"Makefile". However, now they land in "close" buckets.
The algorithm allows not just for the _same_ bucket, but for _close_
buckets to be considered delta candidates. The rationale is
essentially that files, like Makefiles, often have very similar
content no matter what directory they live in.
<linus> I played around with different delta algorithms, and with
making the "delta window" bigger, but having too big of a
sliding window makes it very expensive to generate the pack:
you need to compare every object with a _ton_ of other objects.
There are a number of other trivial heuristics too, which
basically boil down to "don't bother even trying to delta this
pair" if we can tell before-hand that the delta isn't worth it
(due to size differences, where we can take a previous delta
result into account to decide that "ok, no point in trying
that one, it will be worse").
End result: packing is actually very size efficient. It's
somewhat CPU-wasteful, but on the other hand, since you're
really only supposed to do it maybe once a month (and you can
do it during the night), nobody really seems to care.
Nice Engineering Touch, there. Find when it doesn't matter, and
proclaim it a non-issue. Good style too!
<njs`> So, just to repeat to see if I'm following, we start by
getting a list of the objects we want to pack, we sort it by
this heuristic (basically lexicographically on the tuple
(type, basename, size)).
Then we walk through this list, and calculate a delta of
each object against the last n (tunable paramater) objects,
and pick the smallest of these deltas.
Vastly simplified, but the essence is there!
<linus> Correct.
<njs`> And then once we have picked a delta or fulltext to
represent each object, we re-sort by recency, and write them
out in that order.
<linus> Yup. Some other small details:
And of course there is the "Other Shoe" Factor too.
<linus> - We limit the delta depth to another magic value (right
now both the window and delta depth magic values are just "10")
<njs`> Hrm, my intuition is that you'd end up with really _bad_ IO
patterns, because the things you want are near by, but to
actually reconstruct them you may have to jump all over in
random ways.
<linus> - When we write out a delta, and we haven't yet written
out the object it is a delta against, we write out the base
object first. And no, when we reconstruct them, we actually
get nice IO patterns, because:
- larger objects tend to be "more recent" (Linus' law: files grow)
- we actively try to generate deltas from a larger object to a
smaller one
- this means that the top-of-tree very seldom has deltas
(ie deltas in _practice_ are "backwards deltas")
Again, we should reread that whole paragraph. Not just because
Linus has slipped Linus's Law in there on us, but because it is
important. Let's make sure we clarify some of the points here:
<njs`> So the point is just that in practice, delta order and
recency order match each other quite well.
<linus> Yes. There's another nice side to this (and yes, it was
designed that way ;):
- the reason we generate deltas against the larger object is
actually a big space saver too!
<njs`> Hmm, but your last comment (if "we haven't yet written out
the object it is a delta against, we write out the base object
first"), seems like it would make these facts mostly
irrelevant because even if in practice you would not have to
wander around much, in fact you just brute-force say that in
the cases where you might have to wander, don't do that :-)
<linus> Yes and no. Notice the rule: we only write out the base
object first if the delta against it was more recent. That
means that you can actually have deltas that refer to a base
object that is _not_ close to the delta object, but that only
happens when the delta is needed to generate an _old_ object.
<linus> See?
Yeah, no. I missed that on the first two or three readings myself.
<linus> This keeps the front of the pack dense. The front of the
pack never contains data that isn't relevant to a "recent"
object. The size optimization comes from our use of xdelta
(but is true for many other delta algorithms): removing data
is cheaper (in size) than adding data.
When you remove data, you only need to say "copy bytes n--m".
In contrast, in a delta that _adds_ data, you have to say "add
these bytes: 'actual data goes here'"
*** njs` has quit: Read error: 104 (Connection reset by peer)
<linus> Uhhuh. I hope I didn't blow njs` mind.
*** njs` has joined channel #git
<pasky> :)
The silent observers are amused. Of course.
And as if njs` was expected to be omniscient:
<linus> njs - did you miss anything?
OK, I'll spell it out. That's Geek Humor. If njs` was not actually
connected for a little bit there, how would he know if missed anything
while he was disconnected? He's a benevolent dictator with a sense of
humor! Well noted!
<njs`> Stupid router. Or gremlins, or whatever.
It's a cheap shot at Cisco. Take 'em when you can.
<njs`> Yes and no. Notice the rule: we only write out the base
object first if the delta against it was more recent.
I'm getting lost in all these orders, let me re-read :-)
So the write-out order is from most recent to least recent?
(Conceivably it could be the opposite way too, I'm not sure if
we've said) though my connection back at home is logging, so I
can just read what you said there :-)
And for those of you paying attention, the Omniscient Trick has just
been detailed!
<linus> Yes, we always write out most recent first
For the other record:
<pasky> njs`: http://pastebin.com/547965
The 'net never forgets, so that should be good until the end of time.
<njs`> And, yeah, I got the part about deeper-in-history stuff
having worse IO characteristics, one sort of doesn't care.
<linus> With the caveat that if the "most recent" needs an older
object to delta against (hey, shrinking sometimes does
happen), we write out the old object with the delta.
<njs`> (if only it happened more...)
<linus> Anyway, the pack-file could easily be denser still, but
because it's used both for streaming (the git protocol) and
for on-disk, it has a few pessimizations.
Actually, it is a made-up word. But it is a made-up word being
used as setup for a later optimization, which is a real word:
<linus> In particular, while the pack-file is then compressed,
it's compressed just one object at a time, so the actual
compression factor is less than it could be in theory. But it
means that it's all nice random-access with a simple index to
do "object name->location in packfile" translation.
<njs`> I'm assuming the real win for delta-ing large->small is
more homogenous statistics for gzip to run over?
(You have to put the bytes in one place or another, but
putting them in a larger blob wins on compression)
Actually, what is the compression strategy -- each delta
individually gzipped, the whole file gzipped, somewhere in
between, no compression at all, ....?
Right.
Reality IRC sets in. For example:
<pasky> I'll read the rest in the morning, I really have to go
sleep or there's no hope whatsoever for me at the today's
exam... g'nite all.
Heh.
<linus> pasky: g'nite
<njs`> pasky: 'luck
<linus> Right: large->small matters exactly because of compression
behaviour. If it was non-compressed, it probably wouldn't make
any difference.
<njs`> yeah
<linus> Anyway: I'm not even trying to claim that the pack-files
are perfect, but they do tend to have a nice balance of
density vs ease-of use.
Gasp! OK, saved. That's a fair Engineering trade off. Close call!
In fact, Linus reflects on some Basic Engineering Fundamentals,
design options, etc.
<linus> More importantly, they allow git to still _conceptually_
never deal with deltas at all, and be a "whole object" store.
Which has some problems (we discussed bad huge-file
behaviour on the git lists the other day), but it does mean
that the basic git concepts are really really simple and
straightforward.
It's all been quite stable.
Which I think is very much a result of having very simple
basic ideas, so that there's never any confusion about what's
going on.
Bugs happen, but they are "simple" bugs. And bugs that
actually get some object store detail wrong are almost always
so obious that they never go anywhere.
<njs`> Yeah.
Nuff said.
<linus> Anyway. I'm off for bed. It's not 6AM here, but I've got
three kids, and have to get up early in the morning to send
them off. I need my beauty sleep.
<njs`> :-)
<njs`> appreciate the infodump, I really was failing to find the
details on git packs :-)
And now you know the rest of the story.

View File

@ -309,7 +309,7 @@ git diff HEAD^^ HEAD^
-------------------------------------
shows the difference between that previous state and the state two
commits ago. Also, HEAD~5 can be used as a shorthand for HEAD^^^^^,
commits ago. Also, HEAD~5 can be used as a shorthand for HEAD{caret}{caret}{caret}{caret}{caret},
and more generally HEAD~n can refer to the nth previous commit.
Commits representing merges have more than one parent, and you can
specify which parent to follow in that case; see

View File

@ -1,14 +1,17 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
DEF_VER=v1.2.GIT
DEF_VER=v1.3.GIT
# First try git-describe, then see if there is a version file
# (included in release tarballs), then default
if VN=$(git-describe --abbrev=4 HEAD 2>/dev/null); then
VN=$(echo "$VN" | sed -e 's/-/./g');
else
elif test -f version
then
VN=$(cat version) || VN="$DEF_VER"
else
VN="$DEF_VER"
fi
VN=$(expr "$VN" : v*'\(.*\)')

View File

@ -40,9 +40,7 @@ Issues of note:
If you don't have openssl, you can use one of the SHA1 libraries
that come with git (git includes the one from Mozilla, and has
its own PowerPC-optimized one too - see the Makefile), and you
can avoid the bignum support by excising git-rev-list support
for "--merge-order" (by hand).
its own PowerPC and ARM optimized ones too - see the Makefile).
- "libcurl" and "curl" executable. git-http-fetch and
git-fetch use them. If you do not use http

257
Makefile
View File

@ -6,8 +6,8 @@ all:
# on non-x86 architectures (e.g. PowerPC), while the OpenSSL version (default
# choice) has very fast version optimized for i586.
#
# Define NO_OPENSSL environment variable if you do not have OpenSSL. You will
# miss out git-rev-list --merge-order. This also implies MOZILLA_SHA1.
# Define NO_OPENSSL environment variable if you do not have OpenSSL.
# This also implies MOZILLA_SHA1.
#
# Define NO_CURL if you do not have curl installed. git-http-pull and
# git-http-push are not built, and you cannot use http:// and https://
@ -53,6 +53,13 @@ all:
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
# Define NO_ICONV if your libc does not properly support iconv.
#
# Define NO_ACCURATE_DIFF if your diff program at least sometimes misses
# a missing newline at the end of the file.
#
# Define NO_PYTHON if you want to loose all benefits of the recursive merge.
#
# Define COLLISION_CHECK below if you believe that SHA1's
# 1461501637330902918203684832716283019655932542976 hashes do not give you
# sufficient guarantee that no collisions between objects will ever happen.
@ -70,6 +77,12 @@ GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
@$(SHELL_PATH) ./GIT-VERSION-GEN
-include GIT-VERSION-FILE
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
uname_P := $(shell sh -c 'uname -p 2>/dev/null || echo not')
# CFLAGS and LDFLAGS are for the users to override from the command line.
CFLAGS = -g -O2 -Wall
@ -80,7 +93,7 @@ STRIP ?= strip
prefix = $(HOME)
bindir = $(prefix)/bin
gitexecdir = $(prefix)/bin
gitexecdir = $(bindir)
template_dir = $(prefix)/share/git-core/templates/
GIT_PYTHON_DIR = $(prefix)/share/git-core/python
# DESTDIR=
@ -101,13 +114,13 @@ SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
SCRIPT_SH = \
git-add.sh git-bisect.sh git-branch.sh git-checkout.sh \
git-cherry.sh git-clone.sh git-commit.sh \
git-cherry.sh git-clean.sh git-clone.sh git-commit.sh \
git-count-objects.sh git-diff.sh git-fetch.sh \
git-format-patch.sh git-log.sh git-ls-remote.sh \
git-format-patch.sh git-ls-remote.sh \
git-merge-one-file.sh git-parse-remote.sh \
git-prune.sh git-pull.sh git-push.sh git-rebase.sh \
git-repack.sh git-request-pull.sh git-reset.sh \
git-resolve.sh git-revert.sh git-sh-setup.sh \
git-resolve.sh git-revert.sh git-rm.sh git-sh-setup.sh \
git-tag.sh git-verify-tag.sh git-whatchanged.sh \
git-applymbox.sh git-applypatch.sh git-am.sh \
git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
@ -117,6 +130,7 @@ SCRIPT_SH = \
SCRIPT_PERL = \
git-archimport.perl git-cvsimport.perl git-relink.perl \
git-shortlog.perl git-fmt-merge-msg.perl git-rerere.perl \
git-annotate.perl git-cvsserver.perl \
git-svnimport.perl git-mv.perl git-cvsexportcommit.perl
SCRIPT_PYTHON = \
@ -127,9 +141,9 @@ SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
$(patsubst %.py,%,$(SCRIPT_PYTHON)) \
git-cherry-pick git-show git-status
# The ones that do not have to link with lcrypto nor lz.
# The ones that do not have to link with lcrypto, lz nor xdiff.
SIMPLE_PROGRAMS = \
git-get-tar-commit-id$X git-mailinfo$X git-mailsplit$X \
git-get-tar-commit-id$X git-mailsplit$X \
git-stripspace$X git-daemon$X
# ... and all the rest that could be moved out of bindir to gitexecdir
@ -139,9 +153,9 @@ PROGRAMS = \
git-convert-objects$X git-diff-files$X \
git-diff-index$X git-diff-stages$X \
git-diff-tree$X git-fetch-pack$X git-fsck-objects$X \
git-hash-object$X git-index-pack$X git-init-db$X \
git-local-fetch$X git-ls-files$X git-ls-tree$X git-merge-base$X \
git-merge-index$X git-mktag$X git-pack-objects$X git-patch-id$X \
git-hash-object$X git-index-pack$X git-init-db$X git-local-fetch$X \
git-ls-files$X git-ls-tree$X git-mailinfo$X git-merge-base$X \
git-merge-index$X git-mktag$X git-mktree$X git-pack-objects$X git-patch-id$X \
git-peek-remote$X git-prune-packed$X git-read-tree$X \
git-receive-pack$X git-rev-list$X git-rev-parse$X \
git-send-pack$X git-show-branch$X git-shell$X \
@ -151,7 +165,9 @@ PROGRAMS = \
git-upload-pack$X git-verify-pack$X git-write-tree$X \
git-update-ref$X git-symbolic-ref$X git-check-ref-format$X \
git-name-rev$X git-pack-redundant$X git-repo-config$X git-var$X \
git-describe$X
git-describe$X git-merge-tree$X git-blame$X git-imap-send$X
BUILT_INS = git-log$X
# what 'all' will build and 'install' will install, in gitexecdir
ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS)
@ -174,34 +190,31 @@ PYMODULES = \
gitMergeCommon.py
LIB_FILE=libgit.a
XDIFF_LIB=xdiff/lib.a
LIB_H = \
blob.h cache.h commit.h count-delta.h csum-file.h delta.h \
diff.h epoch.h object.h pack.h pkt-line.h quote.h refs.h \
run-command.h strbuf.h tag.h tree.h git-compat-util.h
blob.h cache.h commit.h csum-file.h delta.h \
diff.h object.h pack.h pkt-line.h quote.h refs.h \
run-command.h strbuf.h tag.h tree.h git-compat-util.h revision.h \
tree-walk.h log-tree.h
DIFF_OBJS = \
diff.o diffcore-break.o diffcore-order.o diffcore-pathspec.o \
diffcore-pickaxe.o diffcore-rename.o tree-diff.o combine-diff.o
diff.o diffcore-break.o diffcore-order.o \
diffcore-pickaxe.o diffcore-rename.o tree-diff.o combine-diff.o \
diffcore-delta.o log-tree.o
LIB_OBJS = \
blob.o commit.o connect.o count-delta.o csum-file.o \
blob.o commit.o connect.o csum-file.o \
date.o diff-delta.o entry.o exec_cmd.o ident.o index.o \
object.o pack-check.o patch-delta.o path.o pkt-line.o \
quote.o read-cache.o refs.o run-command.o \
server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \
tag.o tree.o usage.o config.o environment.o ctype.o copy.o \
fetch-clone.o \
fetch-clone.o revision.o pager.o tree-walk.o xdiff-interface.o \
$(DIFF_OBJS)
LIBS = $(LIB_FILE)
LIBS += -lz
# Shell quote;
# Result of this needs to be placed inside ''
shq = $(subst ','\'',$(1))
# This has surrounding ''
shellquote = '$(call shq,$(1))'
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
LIBS = $(GITLIBS) -lz
#
# Platform specific tweaks
@ -210,28 +223,32 @@ shellquote = '$(call shq,$(1))'
# We choose to avoid "if .. else if .. else .. endif endif"
# because maintaining the nesting to match is a pain. If
# we had "elif" things would have been much nicer...
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
ifeq ($(uname_S),Darwin)
NEEDS_SSL_WITH_CRYPTO = YesPlease
NEEDS_LIBICONV = YesPlease
## fink
ALL_CFLAGS += -I/sw/include
ALL_LDFLAGS += -L/sw/lib
ifeq ($(shell test -d /sw/lib && echo y),y)
ALL_CFLAGS += -I/sw/include
ALL_LDFLAGS += -L/sw/lib
endif
## darwinports
ALL_CFLAGS += -I/opt/local/include
ALL_LDFLAGS += -L/opt/local/lib
ifeq ($(shell test -d /opt/local/lib && echo y),y)
ALL_CFLAGS += -I/opt/local/include
ALL_LDFLAGS += -L/opt/local/lib
endif
endif
ifeq ($(uname_S),SunOS)
NEEDS_SOCKET = YesPlease
NEEDS_NSL = YesPlease
NEEDS_LIBICONV = YesPlease
SHELL_PATH = /bin/bash
NO_STRCASESTR = YesPlease
ifeq ($(uname_R),5.8)
NEEDS_LIBICONV = YesPlease
NO_UNSETENV = YesPlease
NO_SETENV = YesPlease
endif
ifeq ($(uname_R),5.9)
NO_UNSETENV = YesPlease
NO_SETENV = YesPlease
endif
@ -271,6 +288,16 @@ ifeq ($(uname_S),AIX)
NO_STRCASESTR=YesPlease
NEEDS_LIBICONV=YesPlease
endif
ifeq ($(uname_S),IRIX64)
NO_IPV6=YesPlease
NO_SETENV=YesPlease
NO_STRCASESTR=YesPlease
NO_SOCKADDR_STORAGE=YesPlease
SHELL_PATH=/usr/gnu/bin/bash
ALL_CFLAGS += -DPATH_MAX=1024
# for now, build 32-bit version
ALL_LDFLAGS += -L/usr/lib32
endif
ifneq (,$(findstring arm,$(uname_M)))
ARM_SHA1 = YesPlease
endif
@ -280,8 +307,10 @@ endif
ifdef WITH_OWN_SUBPROCESS_PY
PYMODULES += compat/subprocess.py
else
ifneq ($(shell $(PYTHON_PATH) -c 'import subprocess;print"OK"' 2>/dev/null),OK)
PYMODULES += compat/subprocess.py
ifeq ($(NO_PYTHON),)
ifneq ($(shell $(PYTHON_PATH) -c 'import subprocess;print"OK"' 2>/dev/null),OK)
PYMODULES += compat/subprocess.py
endif
endif
endif
@ -301,14 +330,15 @@ ifndef NO_CURL
curl_check := $(shell (echo 070908; curl-config --vernum) | sort -r | sed -ne 2p)
ifeq "$(curl_check)" "070908"
ifndef NO_EXPAT
EXPAT_LIBEXPAT = -lexpat
PROGRAMS += git-http-push$X
endif
endif
ifndef NO_EXPAT
EXPAT_LIBEXPAT = -lexpat
endif
endif
ifndef NO_OPENSSL
LIB_OBJS += epoch.o
OPENSSL_LIBSSL = -lssl
ifdef OPENSSLDIR
# Again this may be problematic -- gcc does not always want -R.
@ -380,6 +410,10 @@ else
endif
endif
ifdef NO_ICONV
ALL_CFLAGS += -DNO_ICONV
endif
ifdef PPC_SHA1
SHA1_HEADER = "ppc/sha1.h"
LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
@ -397,13 +431,30 @@ else
endif
endif
endif
ifdef NO_ACCURATE_DIFF
ALL_CFLAGS += -DNO_ACCURATE_DIFF
endif
ALL_CFLAGS += -DSHA1_HEADER=$(call shellquote,$(SHA1_HEADER)) $(COMPAT_CFLAGS)
# Shell quote (do not use $(call) to accomodate ancient setups);
SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
GIT_PYTHON_DIR_SQ = $(subst ','\'',$(GIT_PYTHON_DIR))
ALL_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' $(COMPAT_CFLAGS)
LIB_OBJS += $(COMPAT_OBJS)
export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir
### Build rules
all: $(ALL_PROGRAMS) git$X gitk
all: $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk
all:
$(MAKE) -C templates
@ -411,29 +462,37 @@ all:
strip: $(PROGRAMS) git$X
$(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X
git$X: git.c $(LIB_FILE)
git$X: git.c common-cmds.h $(GITLIBS)
$(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
$(CFLAGS) $(COMPAT_CFLAGS) -o $@ $(filter %.c,$^) $(LIB_FILE)
$(ALL_CFLAGS) -o $@ $(filter %.c,$^) \
$(ALL_LDFLAGS) $(LIBS)
$(BUILT_INS): git$X
rm -f $@ && ln git$X $@
common-cmds.h: Documentation/git-*.txt
./generate-cmdlist.sh > $@
$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
rm -f $@
sed -e '1s|#!.*/sh|#!$(call shq,$(SHELL_PATH))|' \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
-e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
-e 's/@@NO_CURL@@/$(NO_CURL)/g' \
-e 's/@@NO_PYTHON@@/$(NO_PYTHON)/g' \
$@.sh >$@
chmod +x $@
$(patsubst %.perl,%,$(SCRIPT_PERL)) : % : %.perl
rm -f $@
sed -e '1s|#!.*perl|#!$(call shq,$(PERL_PATH))|' \
sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \
-e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
$@.perl >$@
chmod +x $@
$(patsubst %.py,%,$(SCRIPT_PYTHON)) : % : %.py
rm -f $@
sed -e '1s|#!.*python|#!$(call shq,$(PYTHON_PATH))|' \
-e 's|@@GIT_PYTHON_PATH@@|$(call shq,$(GIT_PYTHON_DIR))|g' \
sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
-e 's|@@GIT_PYTHON_PATH@@|$(GIT_PYTHON_DIR_SQ)|g' \
-e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
$@.py >$@
chmod +x $@
@ -459,46 +518,85 @@ git$X git.spec \
%.o: %.S
$(CC) -o $*.o -c $(ALL_CFLAGS) $<
exec_cmd.o: ALL_CFLAGS += -DGIT_EXEC_PATH=\"$(gitexecdir)\"
exec_cmd.o: exec_cmd.c
$(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
git-%$X: %.o $(LIB_FILE)
http.o: http.c
$(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $<
ifdef NO_EXPAT
http-fetch.o: http-fetch.c
$(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_EXPAT $<
endif
git-%$X: %.o $(GITLIBS)
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
git-mailinfo$X : SIMPLE_LIB += $(LIB_4_ICONV)
$(SIMPLE_PROGRAMS) : $(LIB_FILE)
$(SIMPLE_PROGRAMS) : git-%$X : %.o
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIB_FILE) $(SIMPLE_LIB)
git-http-fetch$X: fetch.o http.o
git-http-push$X: http.o
git-mailinfo$X: mailinfo.o $(LIB_FILE)
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIB_FILE) $(SIMPLE_LIB) $(LIB_4_ICONV)
git-local-fetch$X: fetch.o
git-ssh-fetch$X: rsh.o fetch.o
git-ssh-upload$X: rsh.o
git-ssh-pull$X: rsh.o fetch.o
git-ssh-push$X: rsh.o
git-http-fetch$X: LIBS += $(CURL_LIBCURL)
git-http-push$X: LIBS += $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
git-rev-list$X: LIBS += $(OPENSSL_LIBSSL)
git-imap-send$X: imap-send.o $(LIB_FILE)
git-http-fetch$X: fetch.o http.o http-fetch.o $(LIB_FILE)
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
git-http-push$X: revision.o http.o http-push.o $(LIB_FILE)
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
git-rev-list$X: rev-list.o $(LIB_FILE)
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIBS) $(OPENSSL_LIBSSL)
init-db.o: init-db.c
$(CC) -c $(ALL_CFLAGS) \
-DDEFAULT_GIT_TEMPLATE_DIR=$(call shellquote,"$(template_dir)") $*.c
-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $*.c
$(LIB_OBJS): $(LIB_H)
$(patsubst git-%$X,%.o,$(PROGRAMS)): $(LIB_H)
$(patsubst git-%$X,%.o,$(PROGRAMS)): $(GITLIBS)
$(DIFF_OBJS): diffcore.h
$(LIB_FILE): $(LIB_OBJS)
$(AR) rcs $@ $(LIB_OBJS)
XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o
$(XDIFF_LIB): $(XDIFF_OBJS)
$(AR) rcs $@ $(XDIFF_OBJS)
doc:
$(MAKE) -C Documentation all
TAGS:
rm -f TAGS
find . -name '*.[hcS]' -print | xargs etags -a
tags:
rm -f tags
find . -name '*.[hcS]' -print | xargs ctags -a
### Testing rules
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.
export NO_PYTHON
test: all
$(MAKE) -C t/ all
@ -506,7 +604,7 @@ test-date$X: test-date.c date.o ctype.o
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) test-date.c date.o ctype.o
test-delta$X: test-delta.c diff-delta.o patch-delta.o
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $^
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $^ -lz
check:
for i in *.c; do sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i || exit; done
@ -516,13 +614,14 @@ check:
### Installation rules
install: all
$(INSTALL) -d -m755 $(call shellquote,$(DESTDIR)$(bindir))
$(INSTALL) -d -m755 $(call shellquote,$(DESTDIR)$(gitexecdir))
$(INSTALL) $(ALL_PROGRAMS) $(call shellquote,$(DESTDIR)$(gitexecdir))
$(INSTALL) git$X gitk $(call shellquote,$(DESTDIR)$(bindir))
$(INSTALL) -d -m755 '$(DESTDIR_SQ)$(bindir_SQ)'
$(INSTALL) -d -m755 '$(DESTDIR_SQ)$(gitexecdir_SQ)'
$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
$(INSTALL) git$X gitk '$(DESTDIR_SQ)$(bindir_SQ)'
$(MAKE) -C templates install
$(INSTALL) -d -m755 $(call shellquote,$(DESTDIR)$(GIT_PYTHON_DIR))
$(INSTALL) $(PYMODULES) $(call shellquote,$(DESTDIR)$(GIT_PYTHON_DIR))
$(INSTALL) -d -m755 '$(DESTDIR_SQ)$(GIT_PYTHON_DIR_SQ)'
$(INSTALL) $(PYMODULES) '$(DESTDIR_SQ)$(GIT_PYTHON_DIR_SQ)'
$(foreach p,$(BUILT_INS), rm -f '$(DESTDIR_SQ)$(bindir_SQ)/$p' && ln '$(DESTDIR_SQ)$(bindir_SQ)/git$X' '$(DESTDIR_SQ)$(bindir_SQ)/$p' ;)
install-doc:
$(MAKE) -C Documentation install
@ -552,9 +651,10 @@ rpm: dist
### Cleaning rules
clean:
rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o $(LIB_FILE)
rm -f $(ALL_PROGRAMS) git$X
rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo
rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \
$(LIB_FILE) $(XDIFF_LIB)
rm -f $(ALL_PROGRAMS) $(BUILT_INS) git$X
rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags
rm -rf $(GIT_TARNAME)
rm -f $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
$(MAKE) -C Documentation/ clean
@ -563,5 +663,24 @@ clean:
rm -f GIT-VERSION-FILE
.PHONY: all install clean strip
.PHONY: .FORCE-GIT-VERSION-FILE
.PHONY: .FORCE-GIT-VERSION-FILE TAGS tags
### Check documentation
#
check-docs::
@for v in $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk; \
do \
case "$$v" in \
git-merge-octopus | git-merge-ours | git-merge-recursive | \
git-merge-resolve | git-merge-stupid | \
git-ssh-pull | git-ssh-push ) continue ;; \
esac ; \
test -f "Documentation/$$v.txt" || \
echo "no doc: $$v"; \
grep -q "^gitlink:$$v\[[0-9]\]::" Documentation/git.txt || \
case "$$v" in \
git) ;; \
*) echo "no link: $$v";; \
esac ; \
done | sort

312
apply.c
View File

@ -9,6 +9,7 @@
#include <fnmatch.h>
#include "cache.h"
#include "quote.h"
#include "blob.h"
// --check turns on checking that the working tree matches the
// files that are being modified, but doesn't apply the patch
@ -31,8 +32,59 @@ static int apply = 1;
static int no_add = 0;
static int show_index_info = 0;
static int line_termination = '\n';
static unsigned long p_context = -1;
static const char apply_usage[] =
"git-apply [--stat] [--numstat] [--summary] [--check] [--index] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM] <patch>...";
"git-apply [--stat] [--numstat] [--summary] [--check] [--index] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM] [-CNUM] [--whitespace=<nowarn|warn|error|error-all|strip>] <patch>...";
static enum whitespace_eol {
nowarn_whitespace,
warn_on_whitespace,
error_on_whitespace,
strip_whitespace,
} new_whitespace = warn_on_whitespace;
static int whitespace_error = 0;
static int squelch_whitespace_errors = 5;
static int applied_after_stripping = 0;
static const char *patch_input_file = NULL;
static void parse_whitespace_option(const char *option)
{
if (!option) {
new_whitespace = warn_on_whitespace;
return;
}
if (!strcmp(option, "warn")) {
new_whitespace = warn_on_whitespace;
return;
}
if (!strcmp(option, "nowarn")) {
new_whitespace = nowarn_whitespace;
return;
}
if (!strcmp(option, "error")) {
new_whitespace = error_on_whitespace;
return;
}
if (!strcmp(option, "error-all")) {
new_whitespace = error_on_whitespace;
squelch_whitespace_errors = 0;
return;
}
if (!strcmp(option, "strip")) {
new_whitespace = strip_whitespace;
return;
}
die("unrecognized whitespace option '%s'", option);
}
static void set_default_whitespace_mode(const char *whitespace_option)
{
if (!whitespace_option && !apply_default_whitespace) {
new_whitespace = (apply
? warn_on_whitespace
: nowarn_whitespace);
}
}
/*
* For "diff-stat" like behaviour, we keep track of the biggest change
@ -49,6 +101,7 @@ static int max_change, max_len;
static int linenr = 1;
struct fragment {
unsigned long leading, trailing;
unsigned long oldpos, oldlines;
unsigned long newpos, newlines;
const char *patch;
@ -601,7 +654,7 @@ static int parse_git_header(char *line, int len, unsigned int size, struct patch
len = linelen(line, size);
if (!len || line[len-1] != '\n')
break;
for (i = 0; i < sizeof(optable) / sizeof(optable[0]); i++) {
for (i = 0; i < ARRAY_SIZE(optable); i++) {
const struct opentry *p = optable + i;
int oplen = strlen(p->str);
if (len < oplen || memcmp(p->str, line, oplen))
@ -643,7 +696,7 @@ static int parse_range(const char *line, int len, int offset, const char *expect
line += digits;
len -= digits;
*p2 = *p1;
*p2 = 1;
if (*line == ',') {
digits = parse_num(line+1, p2);
if (!digits)
@ -766,12 +819,15 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
int added, deleted;
int len = linelen(line, size), offset;
unsigned long oldlines, newlines;
unsigned long leading, trailing;
offset = parse_fragment_header(line, len, fragment);
if (offset < 0)
return -1;
oldlines = fragment->oldlines;
newlines = fragment->newlines;
leading = 0;
trailing = 0;
if (patch->is_new < 0) {
patch->is_new = !oldlines;
@ -784,7 +840,7 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
patch->new_name = NULL;
}
if (patch->is_new != !oldlines)
if (patch->is_new && oldlines)
return error("new file depends on old contents");
if (patch->is_delete != !newlines) {
if (newlines)
@ -809,14 +865,38 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
case ' ':
oldlines--;
newlines--;
if (!deleted && !added)
leading++;
trailing++;
break;
case '-':
deleted++;
oldlines--;
trailing = 0;
break;
case '+':
/*
* We know len is at least two, since we have a '+' and
* we checked that the last character was a '\n' above.
* That is, an addition of an empty line would check
* the '+' here. Sneaky...
*/
if ((new_whitespace != nowarn_whitespace) &&
isspace(line[len-2])) {
whitespace_error++;
if (squelch_whitespace_errors &&
squelch_whitespace_errors <
whitespace_error)
;
else {
fprintf(stderr, "Adds trailing whitespace.\n%s:%d:%.*s\n",
patch_input_file,
linenr, len-2, line+1);
}
}
added++;
newlines--;
trailing = 0;
break;
/* We allow "\ No newline at end of file". Depending
@ -832,6 +912,11 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
break;
}
}
if (oldlines || newlines)
return -1;
fragment->leading = leading;
fragment->trailing = trailing;
/* If a fragment ends with an incomplete line, we failed to include
* it in the above loop because we hit oldlines == newlines == 0
* before seeing it.
@ -853,8 +938,7 @@ static int parse_single_patch(char *line, unsigned long size, struct patch *patc
struct fragment *fragment;
int len;
fragment = xmalloc(sizeof(*fragment));
memset(fragment, 0, sizeof(*fragment));
fragment = xcalloc(1, sizeof(*fragment));
len = parse_fragment(line, size, patch, fragment);
if (len <= 0)
die("corrupt patch at line %d", linenr);
@ -1016,7 +1100,7 @@ static int read_old_data(struct stat *st, const char *path, void *buf, unsigned
}
}
static int find_offset(const char *buf, unsigned long size, const char *fragment, unsigned long fragsize, int line)
static int find_offset(const char *buf, unsigned long size, const char *fragment, unsigned long fragsize, int line, int *lines)
{
int i;
unsigned long start, backwards, forwards;
@ -1077,6 +1161,7 @@ static int find_offset(const char *buf, unsigned long size, const char *fragment
n = (i >> 1)+1;
if (i & 1)
n = -n;
*lines = n;
return try;
}
@ -1086,12 +1171,61 @@ static int find_offset(const char *buf, unsigned long size, const char *fragment
return -1;
}
static void remove_first_line(const char **rbuf, int *rsize)
{
const char *buf = *rbuf;
int size = *rsize;
unsigned long offset;
offset = 0;
while (offset <= size) {
if (buf[offset++] == '\n')
break;
}
*rsize = size - offset;
*rbuf = buf + offset;
}
static void remove_last_line(const char **rbuf, int *rsize)
{
const char *buf = *rbuf;
int size = *rsize;
unsigned long offset;
offset = size - 1;
while (offset > 0) {
if (buf[--offset] == '\n')
break;
}
*rsize = offset + 1;
}
struct buffer_desc {
char *buffer;
unsigned long size;
unsigned long alloc;
};
static int apply_line(char *output, const char *patch, int plen)
{
/* plen is number of bytes to be copied from patch,
* starting at patch+1 (patch[0] is '+'). Typically
* patch[plen] is '\n'.
*/
int add_nl_to_tail = 0;
if ((new_whitespace == strip_whitespace) &&
1 < plen && isspace(patch[plen-1])) {
if (patch[plen] == '\n')
add_nl_to_tail = 1;
plen--;
while (0 < plen && isspace(patch[plen]))
plen--;
applied_after_stripping++;
}
memcpy(output, patch + 1, plen);
if (add_nl_to_tail)
output[plen++] = '\n';
return plen;
}
static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
{
char *buf = desc->buffer;
@ -1099,7 +1233,10 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
int offset, size = frag->size;
char *old = xmalloc(size);
char *new = xmalloc(size);
const char *oldlines, *newlines;
int oldsize = 0, newsize = 0;
unsigned long leading, trailing;
int pos, lines;
while (size > 0) {
int len = linelen(patch, size);
@ -1127,10 +1264,9 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
break;
/* Fall-through for ' ' */
case '+':
if (*patch != '+' || !no_add) {
memcpy(new + newsize, patch + 1, plen);
newsize += plen;
}
if (*patch != '+' || !no_add)
newsize += apply_line(new + newsize, patch,
plen);
break;
case '@': case '\\':
/* Ignore it, we already handled it */
@ -1142,22 +1278,66 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
size -= len;
}
offset = find_offset(buf, desc->size, old, oldsize, frag->newpos);
if (offset >= 0) {
int diff = newsize - oldsize;
unsigned long size = desc->size + diff;
unsigned long alloc = desc->alloc;
#ifdef NO_ACCURATE_DIFF
if (oldsize > 0 && old[oldsize - 1] == '\n' &&
newsize > 0 && new[newsize - 1] == '\n') {
oldsize--;
newsize--;
}
#endif
if (size > alloc) {
alloc = size + 8192;
desc->alloc = alloc;
buf = xrealloc(buf, alloc);
desc->buffer = buf;
oldlines = old;
newlines = new;
leading = frag->leading;
trailing = frag->trailing;
lines = 0;
pos = frag->newpos;
for (;;) {
offset = find_offset(buf, desc->size, oldlines, oldsize, pos, &lines);
if (offset >= 0) {
int diff = newsize - oldsize;
unsigned long size = desc->size + diff;
unsigned long alloc = desc->alloc;
/* Warn if it was necessary to reduce the number
* of context lines.
*/
if ((leading != frag->leading) || (trailing != frag->trailing))
fprintf(stderr, "Context reduced to (%ld/%ld) to apply fragment at %d\n",
leading, trailing, pos + lines);
if (size > alloc) {
alloc = size + 8192;
desc->alloc = alloc;
buf = xrealloc(buf, alloc);
desc->buffer = buf;
}
desc->size = size;
memmove(buf + offset + newsize, buf + offset + oldsize, size - offset - newsize);
memcpy(buf + offset, newlines, newsize);
offset = 0;
break;
}
/* Am I at my context limits? */
if ((leading <= p_context) && (trailing <= p_context))
break;
/* Reduce the number of context lines
* Reduce both leading and trailing if they are equal
* otherwise just reduce the larger context.
*/
if (leading >= trailing) {
remove_first_line(&oldlines, &oldsize);
remove_first_line(&newlines, &newsize);
pos--;
leading--;
}
if (trailing > leading) {
remove_last_line(&oldlines, &oldsize);
remove_last_line(&newlines, &newsize);
trailing--;
}
desc->size = size;
memmove(buf + offset + newsize, buf + offset + oldsize, size - offset - newsize);
memcpy(buf + offset, new, newsize);
offset = 0;
}
free(old);
@ -1196,7 +1376,7 @@ static int apply_fragments(struct buffer_desc *desc, struct patch *patch)
* applies to.
*/
write_sha1_file_prepare(desc->buffer, desc->size,
"blob", sha1, hdr, &hdrlen);
blob_type, sha1, hdr, &hdrlen);
if (strcmp(sha1_to_hex(sha1), patch->old_sha1_prefix))
return error("the patch applies to '%s' (%s), "
"which does not match the "
@ -1304,12 +1484,13 @@ static int check_patch(struct patch *patch)
costate.not_new = 0;
costate.refresh_cache = 1;
if (checkout_entry(active_cache[pos],
&costate) ||
&costate,
NULL) ||
lstat(old_name, &st))
return -1;
}
changed = ce_match_stat(active_cache[pos], &st);
changed = ce_match_stat(active_cache[pos], &st, 1);
if (changed)
return error("%s: does not match index",
old_name);
@ -1550,15 +1731,14 @@ static void add_index_file(const char *path, unsigned mode, void *buf, unsigned
if (!write_index)
return;
ce = xmalloc(ce_size);
memset(ce, 0, ce_size);
ce = xcalloc(1, ce_size);
memcpy(ce->name, path, namelen);
ce->ce_mode = create_ce_mode(mode);
ce->ce_flags = htons(namelen);
if (lstat(path, &st) < 0)
die("unable to stat newly created file %s", path);
fill_stat_cache_info(ce, &st);
if (write_sha1_file(buf, size, "blob", ce->sha1) < 0)
if (write_sha1_file(buf, size, blob_type, ce->sha1) < 0)
die("unable to create backing store for newly created file %s", path);
if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0)
die("unable to add cache entry for %s", path);
@ -1691,7 +1871,7 @@ static int use_patch(struct patch *p)
return 1;
}
static int apply_patch(int fd)
static int apply_patch(int fd, const char *filename)
{
int newfd;
unsigned long offset, size;
@ -1699,6 +1879,7 @@ static int apply_patch(int fd)
struct patch *list = NULL, **listp = &list;
int skipped_patch = 0;
patch_input_file = filename;
if (!buffer)
return -1;
offset = 0;
@ -1706,8 +1887,7 @@ static int apply_patch(int fd)
struct patch *patch;
int nr;
patch = xmalloc(sizeof(*patch));
memset(patch, 0, sizeof(*patch));
patch = xcalloc(1, sizeof(*patch));
nr = parse_chunk(buffer + offset, size, patch);
if (nr < 0)
break;
@ -1725,6 +1905,9 @@ static int apply_patch(int fd)
}
newfd = -1;
if (whitespace_error && (new_whitespace == error_on_whitespace))
apply = 0;
write_index = check_index && apply;
if (write_index)
newfd = hold_index_file_for_update(&cache_file, get_index_file());
@ -1761,17 +1944,29 @@ static int apply_patch(int fd)
return 0;
}
static int git_apply_config(const char *var, const char *value)
{
if (!strcmp(var, "apply.whitespace")) {
apply_default_whitespace = strdup(value);
return 0;
}
return git_default_config(var, value);
}
int main(int argc, char **argv)
{
int i;
int read_stdin = 1;
const char *whitespace_option = NULL;
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
char *end;
int fd;
if (!strcmp(arg, "-")) {
apply_patch(0);
apply_patch(0, "<stdin>");
read_stdin = 0;
continue;
}
@ -1831,11 +2026,24 @@ int main(int argc, char **argv)
line_termination = 0;
continue;
}
if (!strncmp(arg, "-C", 2)) {
p_context = strtoul(arg + 2, &end, 0);
if (*end != '\0')
die("unrecognized context count '%s'", arg + 2);
continue;
}
if (!strncmp(arg, "--whitespace=", 13)) {
whitespace_option = arg + 13;
parse_whitespace_option(arg + 13);
continue;
}
if (check_index && prefix_length < 0) {
prefix = setup_git_directory();
prefix_length = prefix ? strlen(prefix) : 0;
git_config(git_default_config);
git_config(git_apply_config);
if (!whitespace_option && apply_default_whitespace)
parse_whitespace_option(apply_default_whitespace);
}
if (0 < prefix_length)
arg = prefix_filename(prefix, prefix_length, arg);
@ -1844,10 +2052,38 @@ int main(int argc, char **argv)
if (fd < 0)
usage(apply_usage);
read_stdin = 0;
apply_patch(fd);
set_default_whitespace_mode(whitespace_option);
apply_patch(fd, arg);
close(fd);
}
set_default_whitespace_mode(whitespace_option);
if (read_stdin)
apply_patch(0);
apply_patch(0, "<stdin>");
if (whitespace_error) {
if (squelch_whitespace_errors &&
squelch_whitespace_errors < whitespace_error) {
int squelched =
whitespace_error - squelch_whitespace_errors;
fprintf(stderr, "warning: squelched %d whitespace error%s\n",
squelched,
squelched == 1 ? "" : "s");
}
if (new_whitespace == error_on_whitespace)
die("%d line%s add%s trailing whitespaces.",
whitespace_error,
whitespace_error == 1 ? "" : "s",
whitespace_error == 1 ? "s" : "");
if (applied_after_stripping)
fprintf(stderr, "warning: %d line%s applied after"
" stripping trailing whitespaces.\n",
applied_after_stripping,
applied_after_stripping == 1 ? "" : "s");
else if (whitespace_error)
fprintf(stderr, "warning: %d line%s add%s trailing"
" whitespaces.\n",
whitespace_error,
whitespace_error == 1 ? "" : "s",
whitespace_error == 1 ? "s" : "");
}
return 0;
}

907
blame.c Normal file
View File

@ -0,0 +1,907 @@
/*
* Copyright (C) 2006, Fredrik Kuivinen <freku045@student.liu.se>
*/
#include <assert.h>
#include <time.h>
#include <sys/time.h>
#include <math.h>
#include "cache.h"
#include "refs.h"
#include "tag.h"
#include "commit.h"
#include "tree.h"
#include "blob.h"
#include "diff.h"
#include "diffcore.h"
#include "revision.h"
#include "xdiff-interface.h"
#define DEBUG 0
static const char blame_usage[] = "[-c] [-l] [--] file [commit]\n"
" -c, --compability Use the same output mode as git-annotate (Default: off)\n"
" -l, --long Show long commit SHA1 (Default: off)\n"
" -h, --help This message";
static struct commit **blame_lines;
static int num_blame_lines;
static char* blame_contents;
static int blame_len;
struct util_info {
int *line_map;
unsigned char sha1[20]; /* blob sha, not commit! */
char *buf;
unsigned long size;
int num_lines;
const char* pathname;
void* topo_data;
};
struct chunk {
int off1, len1; // ---
int off2, len2; // +++
};
struct patch {
struct chunk *chunks;
int num;
};
static void get_blob(struct commit *commit);
/* Only used for statistics */
static int num_get_patch = 0;
static int num_commits = 0;
static int patch_time = 0;
struct blame_diff_state {
struct xdiff_emit_state xm;
struct patch *ret;
};
static void process_u0_diff(void *state_, char *line, unsigned long len)
{
struct blame_diff_state *state = state_;
struct chunk *chunk;
if (len < 4 || line[0] != '@' || line[1] != '@')
return;
if (DEBUG)
printf("chunk line: %.*s", (int)len, line);
state->ret->num++;
state->ret->chunks = xrealloc(state->ret->chunks,
sizeof(struct chunk) * state->ret->num);
chunk = &state->ret->chunks[state->ret->num - 1];
assert(!strncmp(line, "@@ -", 4));
if (parse_hunk_header(line, len,
&chunk->off1, &chunk->len1,
&chunk->off2, &chunk->len2)) {
state->ret->num--;
return;
}
if (chunk->len1 == 0)
chunk->off1++;
if (chunk->len2 == 0)
chunk->off2++;
if (chunk->off1 > 0)
chunk->off1--;
if (chunk->off2 > 0)
chunk->off2--;
assert(chunk->off1 >= 0);
assert(chunk->off2 >= 0);
}
static struct patch *get_patch(struct commit *commit, struct commit *other)
{
struct blame_diff_state state;
xpparam_t xpp;
xdemitconf_t xecfg;
mmfile_t file_c, file_o;
xdemitcb_t ecb;
struct util_info *info_c = (struct util_info *)commit->object.util;
struct util_info *info_o = (struct util_info *)other->object.util;
struct timeval tv_start, tv_end;
get_blob(commit);
file_c.ptr = info_c->buf;
file_c.size = info_c->size;
get_blob(other);
file_o.ptr = info_o->buf;
file_o.size = info_o->size;
gettimeofday(&tv_start, NULL);
xpp.flags = XDF_NEED_MINIMAL;
xecfg.ctxlen = 0;
xecfg.flags = 0;
ecb.outf = xdiff_outf;
ecb.priv = &state;
memset(&state, 0, sizeof(state));
state.xm.consume = process_u0_diff;
state.ret = xmalloc(sizeof(struct patch));
state.ret->chunks = NULL;
state.ret->num = 0;
xdl_diff(&file_c, &file_o, &xpp, &xecfg, &ecb);
gettimeofday(&tv_end, NULL);
patch_time += 1000000 * (tv_end.tv_sec - tv_start.tv_sec) +
tv_end.tv_usec - tv_start.tv_usec;
num_get_patch++;
return state.ret;
}
static void free_patch(struct patch *p)
{
free(p->chunks);
free(p);
}
static int get_blob_sha1_internal(unsigned char *sha1, const char *base,
int baselen, const char *pathname,
unsigned mode, int stage);
static unsigned char blob_sha1[20];
static const char* blame_file;
static int get_blob_sha1(struct tree *t, const char *pathname,
unsigned char *sha1)
{
int i;
const char *pathspec[2];
blame_file = pathname;
pathspec[0] = pathname;
pathspec[1] = NULL;
memset(blob_sha1, 0, sizeof(blob_sha1));
read_tree_recursive(t, "", 0, 0, pathspec, get_blob_sha1_internal);
for (i = 0; i < 20; i++) {
if (blob_sha1[i] != 0)
break;
}
if (i == 20)
return -1;
memcpy(sha1, blob_sha1, 20);
return 0;
}
static int get_blob_sha1_internal(unsigned char *sha1, const char *base,
int baselen, const char *pathname,
unsigned mode, int stage)
{
if (S_ISDIR(mode))
return READ_TREE_RECURSIVE;
if (strncmp(blame_file, base, baselen) ||
strcmp(blame_file + baselen, pathname))
return -1;
memcpy(blob_sha1, sha1, 20);
return -1;
}
static void get_blob(struct commit *commit)
{
struct util_info *info = commit->object.util;
char type[20];
if (info->buf)
return;
info->buf = read_sha1_file(info->sha1, type, &info->size);
assert(!strcmp(type, blob_type));
}
/* For debugging only */
static void print_patch(struct patch *p)
{
int i;
printf("Num chunks: %d\n", p->num);
for (i = 0; i < p->num; i++) {
printf("%d,%d %d,%d\n", p->chunks[i].off1, p->chunks[i].len1,
p->chunks[i].off2, p->chunks[i].len2);
}
}
#if DEBUG
/* For debugging only */
static void print_map(struct commit *cmit, struct commit *other)
{
struct util_info *util = cmit->object.util;
struct util_info *util2 = other->object.util;
int i;
int max =
util->num_lines >
util2->num_lines ? util->num_lines : util2->num_lines;
int num;
for (i = 0; i < max; i++) {
printf("i: %d ", i);
num = -1;
if (i < util->num_lines) {
num = util->line_map[i];
printf("%d\t", num);
} else
printf("\t");
if (i < util2->num_lines) {
int num2 = util2->line_map[i];
printf("%d\t", num2);
if (num != -1 && num2 != num)
printf("---");
} else
printf("\t");
printf("\n");
}
}
#endif
// p is a patch from commit to other.
static void fill_line_map(struct commit *commit, struct commit *other,
struct patch *p)
{
struct util_info *util = commit->object.util;
struct util_info *util2 = other->object.util;
int *map = util->line_map;
int *map2 = util2->line_map;
int cur_chunk = 0;
int i1, i2;
if (p->num && DEBUG)
print_patch(p);
if (DEBUG)
printf("num lines 1: %d num lines 2: %d\n", util->num_lines,
util2->num_lines);
for (i1 = 0, i2 = 0; i1 < util->num_lines; i1++, i2++) {
struct chunk *chunk = NULL;
if (cur_chunk < p->num)
chunk = &p->chunks[cur_chunk];
if (chunk && chunk->off1 == i1) {
if (DEBUG && i2 != chunk->off2)
printf("i2: %d off2: %d\n", i2, chunk->off2);
assert(i2 == chunk->off2);
i1--;
i2--;
if (chunk->len1 > 0)
i1 += chunk->len1;
if (chunk->len2 > 0)
i2 += chunk->len2;
cur_chunk++;
} else {
if (i2 >= util2->num_lines)
break;
if (map[i1] != map2[i2] && map[i1] != -1) {
if (DEBUG)
printf("map: i1: %d %d %p i2: %d %d %p\n",
i1, map[i1],
i1 != -1 ? blame_lines[map[i1]] : NULL,
i2, map2[i2],
i2 != -1 ? blame_lines[map2[i2]] : NULL);
if (map2[i2] != -1 &&
blame_lines[map[i1]] &&
!blame_lines[map2[i2]])
map[i1] = map2[i2];
}
if (map[i1] == -1 && map2[i2] != -1)
map[i1] = map2[i2];
}
if (DEBUG > 1)
printf("l1: %d l2: %d i1: %d i2: %d\n",
map[i1], map2[i2], i1, i2);
}
}
static int map_line(struct commit *commit, int line)
{
struct util_info *info = commit->object.util;
assert(line >= 0 && line < info->num_lines);
return info->line_map[line];
}
static struct util_info* get_util(struct commit *commit)
{
struct util_info *util = commit->object.util;
if (util)
return util;
util = xmalloc(sizeof(struct util_info));
util->buf = NULL;
util->size = 0;
util->line_map = NULL;
util->num_lines = -1;
util->pathname = NULL;
commit->object.util = util;
return util;
}
static int fill_util_info(struct commit *commit)
{
struct util_info *util = commit->object.util;
assert(util);
assert(util->pathname);
if (get_blob_sha1(commit->tree, util->pathname, util->sha1))
return 1;
else
return 0;
}
static void alloc_line_map(struct commit *commit)
{
struct util_info *util = commit->object.util;
int i;
if (util->line_map)
return;
get_blob(commit);
util->num_lines = 0;
for (i = 0; i < util->size; i++) {
if (util->buf[i] == '\n')
util->num_lines++;
}
if(util->buf[util->size - 1] != '\n')
util->num_lines++;
util->line_map = xmalloc(sizeof(int) * util->num_lines);
for (i = 0; i < util->num_lines; i++)
util->line_map[i] = -1;
}
static void init_first_commit(struct commit* commit, const char* filename)
{
struct util_info* util = commit->object.util;
int i;
util->pathname = filename;
if (fill_util_info(commit))
die("fill_util_info failed");
alloc_line_map(commit);
util = commit->object.util;
for (i = 0; i < util->num_lines; i++)
util->line_map[i] = i;
}
static void process_commits(struct rev_info *rev, const char *path,
struct commit** initial)
{
int i;
struct util_info* util;
int lines_left;
int *blame_p;
int *new_lines;
int new_lines_len;
struct commit* commit = get_revision(rev);
assert(commit);
init_first_commit(commit, path);
util = commit->object.util;
num_blame_lines = util->num_lines;
blame_lines = xmalloc(sizeof(struct commit *) * num_blame_lines);
blame_contents = util->buf;
blame_len = util->size;
for (i = 0; i < num_blame_lines; i++)
blame_lines[i] = NULL;
lines_left = num_blame_lines;
blame_p = xmalloc(sizeof(int) * num_blame_lines);
new_lines = xmalloc(sizeof(int) * num_blame_lines);
do {
struct commit_list *parents;
int num_parents;
struct util_info *util;
if (DEBUG)
printf("\nProcessing commit: %d %s\n", num_commits,
sha1_to_hex(commit->object.sha1));
if (lines_left == 0)
return;
num_commits++;
memset(blame_p, 0, sizeof(int) * num_blame_lines);
new_lines_len = 0;
num_parents = 0;
for (parents = commit->parents;
parents != NULL; parents = parents->next)
num_parents++;
if(num_parents == 0)
*initial = commit;
if (fill_util_info(commit))
continue;
alloc_line_map(commit);
util = commit->object.util;
for (parents = commit->parents;
parents != NULL; parents = parents->next) {
struct commit *parent = parents->item;
struct patch *patch;
if (parse_commit(parent) < 0)
die("parse_commit error");
if (DEBUG)
printf("parent: %s\n",
sha1_to_hex(parent->object.sha1));
if (fill_util_info(parent)) {
num_parents--;
continue;
}
patch = get_patch(parent, commit);
alloc_line_map(parent);
fill_line_map(parent, commit, patch);
for (i = 0; i < patch->num; i++) {
int l;
for (l = 0; l < patch->chunks[i].len2; l++) {
int mapped_line =
map_line(commit, patch->chunks[i].off2 + l);
if (mapped_line != -1) {
blame_p[mapped_line]++;
if (blame_p[mapped_line] == num_parents)
new_lines[new_lines_len++] = mapped_line;
}
}
}
free_patch(patch);
}
if (DEBUG)
printf("parents: %d\n", num_parents);
for (i = 0; i < new_lines_len; i++) {
int mapped_line = new_lines[i];
if (blame_lines[mapped_line] == NULL) {
blame_lines[mapped_line] = commit;
lines_left--;
if (DEBUG)
printf("blame: mapped: %d i: %d\n",
mapped_line, i);
}
}
} while ((commit = get_revision(rev)) != NULL);
}
static int compare_tree_path(struct rev_info* revs,
struct commit* c1, struct commit* c2)
{
int ret;
const char* paths[2];
struct util_info* util = c2->object.util;
paths[0] = util->pathname;
paths[1] = NULL;
diff_tree_setup_paths(get_pathspec(revs->prefix, paths),
&revs->diffopt);
ret = rev_compare_tree(revs, c1->tree, c2->tree);
diff_tree_release_paths(&revs->diffopt);
return ret;
}
static int same_tree_as_empty_path(struct rev_info *revs, struct tree* t1,
const char* path)
{
int ret;
const char* paths[2];
paths[0] = path;
paths[1] = NULL;
diff_tree_setup_paths(get_pathspec(revs->prefix, paths),
&revs->diffopt);
ret = rev_same_tree_as_empty(revs, t1);
diff_tree_release_paths(&revs->diffopt);
return ret;
}
static const char* find_rename(struct commit* commit, struct commit* parent)
{
struct util_info* cutil = commit->object.util;
struct diff_options diff_opts;
const char *paths[1];
int i;
if (DEBUG) {
printf("find_rename commit: %s ",
sha1_to_hex(commit->object.sha1));
puts(sha1_to_hex(parent->object.sha1));
}
diff_setup(&diff_opts);
diff_opts.recursive = 1;
diff_opts.detect_rename = DIFF_DETECT_RENAME;
paths[0] = NULL;
diff_tree_setup_paths(paths, &diff_opts);
if (diff_setup_done(&diff_opts) < 0)
die("diff_setup_done failed");
diff_tree_sha1(commit->tree->object.sha1, parent->tree->object.sha1,
"", &diff_opts);
diffcore_std(&diff_opts);
for (i = 0; i < diff_queued_diff.nr; i++) {
struct diff_filepair *p = diff_queued_diff.queue[i];
if (p->status == 'R' && !strcmp(p->one->path, cutil->pathname)) {
if (DEBUG)
printf("rename %s -> %s\n", p->one->path, p->two->path);
return p->two->path;
}
}
return 0;
}
static void simplify_commit(struct rev_info *revs, struct commit *commit)
{
struct commit_list **pp, *parent;
if (!commit->tree)
return;
if (!commit->parents) {
struct util_info* util = commit->object.util;
if (!same_tree_as_empty_path(revs, commit->tree,
util->pathname))
commit->object.flags |= TREECHANGE;
return;
}
pp = &commit->parents;
while ((parent = *pp) != NULL) {
struct commit *p = parent->item;
if (p->object.flags & UNINTERESTING) {
pp = &parent->next;
continue;
}
parse_commit(p);
switch (compare_tree_path(revs, p, commit)) {
case REV_TREE_SAME:
parent->next = NULL;
commit->parents = parent;
get_util(p)->pathname = get_util(commit)->pathname;
return;
case REV_TREE_NEW:
{
struct util_info* util = commit->object.util;
if (revs->remove_empty_trees &&
same_tree_as_empty_path(revs, p->tree,
util->pathname)) {
const char* new_name = find_rename(commit, p);
if (new_name) {
struct util_info* putil = get_util(p);
if (!putil->pathname)
putil->pathname = strdup(new_name);
} else {
*pp = parent->next;
continue;
}
}
}
/* fallthrough */
case REV_TREE_DIFFERENT:
pp = &parent->next;
if (!get_util(p)->pathname)
get_util(p)->pathname =
get_util(commit)->pathname;
continue;
}
die("bad tree compare for commit %s",
sha1_to_hex(commit->object.sha1));
}
commit->object.flags |= TREECHANGE;
}
struct commit_info
{
char* author;
char* author_mail;
unsigned long author_time;
char* author_tz;
};
static void get_commit_info(struct commit* commit, struct commit_info* ret)
{
int len;
char* tmp;
static char author_buf[1024];
tmp = strstr(commit->buffer, "\nauthor ") + 8;
len = strchr(tmp, '\n') - tmp;
ret->author = author_buf;
memcpy(ret->author, tmp, len);
tmp = ret->author;
tmp += len;
*tmp = 0;
while(*tmp != ' ')
tmp--;
ret->author_tz = tmp+1;
*tmp = 0;
while(*tmp != ' ')
tmp--;
ret->author_time = strtoul(tmp, NULL, 10);
*tmp = 0;
while(*tmp != ' ')
tmp--;
ret->author_mail = tmp + 1;
*tmp = 0;
}
static const char* format_time(unsigned long time, const char* tz_str)
{
static char time_buf[128];
time_t t = time;
int minutes, tz;
struct tm *tm;
tz = atoi(tz_str);
minutes = tz < 0 ? -tz : tz;
minutes = (minutes / 100)*60 + (minutes % 100);
minutes = tz < 0 ? -minutes : minutes;
t = time + minutes * 60;
tm = gmtime(&t);
strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S ", tm);
strcat(time_buf, tz_str);
return time_buf;
}
static void topo_setter(struct commit* c, void* data)
{
struct util_info* util = c->object.util;
util->topo_data = data;
}
static void* topo_getter(struct commit* c)
{
struct util_info* util = c->object.util;
return util->topo_data;
}
static int read_ancestry(const char *graft_file,
unsigned char **start_sha1)
{
FILE *fp = fopen(graft_file, "r");
char buf[1024];
if (!fp)
return -1;
while (fgets(buf, sizeof(buf), fp)) {
/* The format is just "Commit Parent1 Parent2 ...\n" */
int len = strlen(buf);
struct commit_graft *graft = read_graft_line(buf, len);
register_commit_graft(graft, 0);
if (!*start_sha1)
*start_sha1 = graft->sha1;
}
fclose(fp);
return 0;
}
int main(int argc, const char **argv)
{
int i;
struct commit *initial = NULL;
unsigned char sha1[20], *sha1_p = NULL;
const char *filename = NULL, *commit = NULL;
char filename_buf[256];
int sha1_len = 8;
int compability = 0;
int options = 1;
struct commit* start_commit;
const char* args[10];
struct rev_info rev;
struct commit_info ci;
const char *buf;
int max_digits;
int longest_file, longest_author;
int found_rename;
const char* prefix = setup_git_directory();
git_config(git_default_config);
for(i = 1; i < argc; i++) {
if(options) {
if(!strcmp(argv[i], "-h") ||
!strcmp(argv[i], "--help"))
usage(blame_usage);
else if(!strcmp(argv[i], "-l") ||
!strcmp(argv[i], "--long")) {
sha1_len = 40;
continue;
} else if(!strcmp(argv[i], "-c") ||
!strcmp(argv[i], "--compability")) {
compability = 1;
continue;
} else if(!strcmp(argv[i], "-S")) {
if (i + 1 < argc &&
!read_ancestry(argv[i + 1], &sha1_p)) {
compability = 1;
i++;
continue;
}
usage(blame_usage);
} else if(!strcmp(argv[i], "--")) {
options = 0;
continue;
} else if(argv[i][0] == '-')
usage(blame_usage);
else
options = 0;
}
if(!options) {
if(!filename)
filename = argv[i];
else if(!commit)
commit = argv[i];
else
usage(blame_usage);
}
}
if(!filename)
usage(blame_usage);
if (commit && sha1_p)
usage(blame_usage);
else if(!commit)
commit = "HEAD";
if(prefix)
sprintf(filename_buf, "%s%s", prefix, filename);
else
strcpy(filename_buf, filename);
filename = filename_buf;
if (!sha1_p) {
if (get_sha1(commit, sha1))
die("get_sha1 failed, commit '%s' not found", commit);
sha1_p = sha1;
}
start_commit = lookup_commit_reference(sha1_p);
get_util(start_commit)->pathname = filename;
if (fill_util_info(start_commit)) {
printf("%s not found in %s\n", filename, commit);
return 1;
}
init_revisions(&rev);
rev.remove_empty_trees = 1;
rev.topo_order = 1;
rev.prune_fn = simplify_commit;
rev.topo_setter = topo_setter;
rev.topo_getter = topo_getter;
rev.parents = 1;
rev.limited = 1;
commit_list_insert(start_commit, &rev.commits);
args[0] = filename;
args[1] = NULL;
diff_tree_setup_paths(args, &rev.diffopt);
prepare_revision_walk(&rev);
process_commits(&rev, filename, &initial);
buf = blame_contents;
for (max_digits = 1, i = 10; i <= num_blame_lines + 1; max_digits++)
i *= 10;
longest_file = 0;
longest_author = 0;
found_rename = 0;
for (i = 0; i < num_blame_lines; i++) {
struct commit *c = blame_lines[i];
struct util_info* u;
if (!c)
c = initial;
u = c->object.util;
if (!found_rename && strcmp(filename, u->pathname))
found_rename = 1;
if (longest_file < strlen(u->pathname))
longest_file = strlen(u->pathname);
get_commit_info(c, &ci);
if (longest_author < strlen(ci.author))
longest_author = strlen(ci.author);
}
for (i = 0; i < num_blame_lines; i++) {
struct commit *c = blame_lines[i];
struct util_info* u;
if (!c)
c = initial;
u = c->object.util;
get_commit_info(c, &ci);
fwrite(sha1_to_hex(c->object.sha1), sha1_len, 1, stdout);
if(compability) {
printf("\t(%10s\t%10s\t%d)", ci.author,
format_time(ci.author_time, ci.author_tz), i+1);
} else {
if (found_rename)
printf(" %-*.*s", longest_file, longest_file,
u->pathname);
printf(" (%-*.*s %10s %*d) ",
longest_author, longest_author, ci.author,
format_time(ci.author_time, ci.author_tz),
max_digits, i+1);
}
if(i == num_blame_lines - 1) {
fwrite(buf, blame_len - (buf - blame_contents),
1, stdout);
if(blame_contents[blame_len-1] != '\n')
putc('\n', stdout);
} else {
char* next_buf = strchr(buf, '\n') + 1;
fwrite(buf, next_buf - buf, 1, stdout);
buf = next_buf;
}
}
if (DEBUG) {
printf("num get patch: %d\n", num_get_patch);
printf("num commits: %d\n", num_commits);
printf("patch time: %f\n", patch_time / 1000000.0);
printf("initial: %s\n", sha1_to_hex(initial->object.sha1));
}
return 0;
}

Some files were not shown because too many files have changed in this diff Show More