Merge branch 'gl/cleanup' into gl/cleanup-next
* gl/cleanup: (160 commits) Convert memset(hash,0,20) to hashclr(hash). Convert memcpy(a,b,20) to hashcpy(a,b). Fix a comparison bug in diff-delta.c git-send-email: Don't set author_not_sender from Cc: lines Remove unnecessary forward declaration of unpack_entry. Verify we know how to read a pack before trying to using it. Add write_or_die(), a helper function Axe the last ent builtin-mv: readability patch git-mv: fix off-by-one error git-mv: special case destination "." builtin-mv: readability patch Indentation fix. Do not use memcmp(sha1_1, sha1_2, 20) with hardcoded length. gitweb: Uniquify version info output, add meta generator in page header Be nicer if git executable is not installed builtin-grep: remove unused debugging cruft. gitweb: Add support for per project git URLs [PATCH] git-mv: add more path normalization Remove the "delay writing to avoid runtime penalty of racy-git avoidance" ...
This commit is contained in:
commit
2ad6ba353a
3
.gitignore
vendored
3
.gitignore
vendored
@ -126,6 +126,7 @@ git-verify-tag
|
||||
git-whatchanged
|
||||
git-write-tree
|
||||
git-core-*/?*
|
||||
gitweb/gitweb.cgi
|
||||
test-date
|
||||
test-delta
|
||||
test-dump-cache-tree
|
||||
@ -141,7 +142,7 @@ config.mak
|
||||
autom4te.cache
|
||||
config.log
|
||||
config.status
|
||||
config.mak.in
|
||||
config.mak.autogen
|
||||
config.mak.append
|
||||
configure
|
||||
git-blame
|
||||
|
@ -36,6 +36,9 @@
|
||||
Turn off colored diff, even when the configuration file
|
||||
gives the default to color output.
|
||||
|
||||
--color-words::
|
||||
Show colored word diff, i.e. color words which have changed.
|
||||
|
||||
--no-renames::
|
||||
Turn off rename detection, even when the configuration
|
||||
file gives the default to do so.
|
||||
|
@ -11,7 +11,7 @@ SYNOPSIS
|
||||
[verse]
|
||||
'git-grep' [--cached]
|
||||
[-a | --text] [-I] [-i | --ignore-case] [-w | --word-regexp]
|
||||
[-v | --invert-match]
|
||||
[-v | --invert-match] [--full-name]
|
||||
[-E | --extended-regexp] [-G | --basic-regexp] [-F | --fixed-strings]
|
||||
[-n] [-l | --files-with-matches] [-L | --files-without-match]
|
||||
[-c | --count]
|
||||
@ -47,6 +47,12 @@ OPTIONS
|
||||
-v | --invert-match::
|
||||
Select non-matching lines.
|
||||
|
||||
--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.
|
||||
|
||||
-E | --extended-regexp | -G | --basic-regexp::
|
||||
Use POSIX extended/basic regexp for patterns. Default
|
||||
is to use basic regexp.
|
||||
|
@ -633,6 +633,9 @@ git Diffs
|
||||
|
||||
other
|
||||
~~~~~
|
||||
'GIT_PAGER'::
|
||||
This environment variable overrides `$PAGER`.
|
||||
|
||||
'GIT_TRACE'::
|
||||
If this variable is set git will print `trace:` messages on
|
||||
stderr telling about alias expansion, built-in command
|
||||
|
193
Documentation/technical/racy-git.txt
Normal file
193
Documentation/technical/racy-git.txt
Normal file
@ -0,0 +1,193 @@
|
||||
Use of index and Racy git problem
|
||||
=================================
|
||||
|
||||
Background
|
||||
----------
|
||||
|
||||
The index is one of the most important data structure in git.
|
||||
It represents a virtual working tree state by recording list of
|
||||
paths and their object names and serves as a staging area to
|
||||
write out the next tree object to be committed. The state is
|
||||
"virtual" in the sense that it does not necessarily have to, and
|
||||
often does not, match the files in the working tree.
|
||||
|
||||
There are cases git needs to examine the differences between the
|
||||
virtual working tree state in the index and the files in the
|
||||
working tree. The most obvious case is when the user asks `git
|
||||
diff` (or its low level implementation, `git diff-files`) or
|
||||
`git-ls-files --modified`. In addition, git internally checks
|
||||
if the files in the working tree is different from what are
|
||||
recorded in the index to avoid stomping on local changes in them
|
||||
during patch application, switching branches, and merging.
|
||||
|
||||
In order to speed up this comparison between the files in the
|
||||
working tree and the index entries, the index entries record the
|
||||
information obtained from the filesystem via `lstat(2)` system
|
||||
call when they were last updated. When checking if they differ,
|
||||
git first runs `lstat(2)` on the files and compare the result
|
||||
with this information (this is what was originally done by the
|
||||
`ce_match_stat()` function, which the current code does in
|
||||
`ce_match_stat_basic()` function). If some of these "cached
|
||||
stat information" fields do not match, git can tell that the
|
||||
files are modified without even looking at their contents.
|
||||
|
||||
Note: not all members in `struct stat` obtained via `lstat(2)`
|
||||
are used for this comparison. For example, `st_atime` obviously
|
||||
is not useful. Currently, git compares the file type (regular
|
||||
files vs symbolic links) and executable bits (only for regular
|
||||
files) from `st_mode` member, `st_mtime` and `st_ctime`
|
||||
timestamps, `st_uid`, `st_gid`, `st_ino`, and `st_size` members.
|
||||
With a `USE_STDEV` compile-time option, `st_dev` is also
|
||||
compared, but this is not enabled by default because this member
|
||||
is not stable on network filesystems. With `USE_NSEC`
|
||||
compile-time option, `st_mtim.tv_nsec` and `st_ctim.tv_nsec`
|
||||
members are also compared, but this is not enabled by default
|
||||
because the value of this member becomes meaningless once the
|
||||
inode is evicted from the inode cache on filesystems that do not
|
||||
store it on disk.
|
||||
|
||||
|
||||
Racy git
|
||||
--------
|
||||
|
||||
There is one slight problem with the optimization based on the
|
||||
cached stat information. Consider this sequence:
|
||||
|
||||
$ git update-index 'foo'
|
||||
: modify 'foo' in-place without changing its size
|
||||
|
||||
The first `update-index` computes the object name of the
|
||||
contents of file `foo` and updates the index entry for `foo`
|
||||
along with the `struct stat` information. If the modification
|
||||
that follows it happens very fast so that the file's `st_mtime`
|
||||
timestamp does not change, after this sequence, the cached stat
|
||||
information the index entry records still exactly match what you
|
||||
can obtain from the filesystem, but the file `foo` is modified.
|
||||
This way, git can incorrectly think files in the working tree
|
||||
are unmodified even though they actually are. This is called
|
||||
the "racy git" problem (discovered by Pasky), and the entries
|
||||
that appear clean when they may not be because of this problem
|
||||
are called "racily clean".
|
||||
|
||||
To avoid this problem, git does two things:
|
||||
|
||||
. When the cached stat information says the file has not been
|
||||
modified, and the `st_mtime` is the same as (or newer than)
|
||||
the timestamp of the index file itself (which is the time `git
|
||||
update-index foo` finished running in the above example), it
|
||||
also compares the contents with the object registered in the
|
||||
index entry to make sure they match.
|
||||
|
||||
. When the index file is updated that contains racily clean
|
||||
entries, cached `st_size` information is truncated to zero
|
||||
before writing a new version of the index file.
|
||||
|
||||
Because the index file itself is written after collecting all
|
||||
the stat information from updated paths, `st_mtime` timestamp of
|
||||
it is usually the same as or newer than any of the paths the
|
||||
index contains. And no matter how quick the modification that
|
||||
follows `git update-index foo` finishes, the resulting
|
||||
`st_mtime` timestamp on `foo` cannot get the timestamp earlier
|
||||
than the index file. Therefore, index entries that can be
|
||||
racily clean are limited to the ones that have the same
|
||||
timestamp as the index file itself.
|
||||
|
||||
The callers that want to check if an index entry matches the
|
||||
corresponding file in the working tree continue to call
|
||||
`ce_match_stat()`, but with this change, `ce_match_stat()` uses
|
||||
`ce_modified_check_fs()` to see if racily clean ones are
|
||||
actually clean after comparing the cached stat information using
|
||||
`ce_match_stat_basic()`.
|
||||
|
||||
The problem the latter solves is this sequence:
|
||||
|
||||
$ git update-index 'foo'
|
||||
: modify 'foo' in-place without changing its size
|
||||
: wait for enough time
|
||||
$ git update-index 'bar'
|
||||
|
||||
Without the latter, the timestamp of the index file gets a newer
|
||||
value, and falsely clean entry `foo` would not be caught by the
|
||||
timestamp comparison check done with the former logic anymore.
|
||||
The latter makes sure that the cached stat information for `foo`
|
||||
would never match with the file in the working tree, so later
|
||||
checks by `ce_match_stat_basic()` would report the index entry
|
||||
does not match the file and git does not have to fall back on more
|
||||
expensive `ce_modified_check_fs()`.
|
||||
|
||||
|
||||
Runtime penalty
|
||||
---------------
|
||||
|
||||
The runtime penalty of falling back to `ce_modified_check_fs()`
|
||||
from `ce_match_stat()` can be very expensive when there are many
|
||||
racily clean entries. An obvious way to artificially create
|
||||
this situation is to give the same timestamp to all the files in
|
||||
the working tree in a large project, run `git update-index` on
|
||||
them, and give the same timestamp to the index file:
|
||||
|
||||
$ date >.datestamp
|
||||
$ git ls-files | xargs touch -r .datestamp
|
||||
$ git ls-files | git update-index --stdin
|
||||
$ touch -r .datestamp .git/index
|
||||
|
||||
This will make all index entries racily clean. The linux-2.6
|
||||
project, for example, there are over 20,000 files in the working
|
||||
tree. On my Athron 64X2 3800+, after the above:
|
||||
|
||||
$ /usr/bin/time git diff-files
|
||||
1.68user 0.54system 0:02.22elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
|
||||
0inputs+0outputs (0major+67111minor)pagefaults 0swaps
|
||||
$ git update-index MAINTAINERS
|
||||
$ /usr/bin/time git diff-files
|
||||
0.02user 0.12system 0:00.14elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
|
||||
0inputs+0outputs (0major+935minor)pagefaults 0swaps
|
||||
|
||||
Running `git update-index` in the middle checked the racily
|
||||
clean entries, and left the cached `st_mtime` for all the paths
|
||||
intact because they were actually clean (so this step took about
|
||||
the same amount of time as the first `git diff-files`). After
|
||||
that, they are not racily clean anymore but are truly clean, so
|
||||
the second invocation of `git diff-files` fully took advantage
|
||||
of the cached stat information.
|
||||
|
||||
|
||||
Avoiding runtime penalty
|
||||
------------------------
|
||||
|
||||
In order to avoid the above runtime penalty, the recent "master"
|
||||
branch (post 1.4.2) has a code that makes sure the index file
|
||||
gets timestamp newer than the youngest files in the index when
|
||||
there are many young files with the same timestamp as the
|
||||
resulting index file would otherwise would have by waiting
|
||||
before finishing writing the index file out.
|
||||
|
||||
I suspect that in practice the situation where many paths in the
|
||||
index are all racily clean is quite rare. The only code paths
|
||||
that can record recent timestamp for large number of paths I
|
||||
know of are:
|
||||
|
||||
. Initial `git add .` of a large project.
|
||||
|
||||
. `git checkout` of a large project from an empty index into an
|
||||
unpopulated working tree.
|
||||
|
||||
Note: switching branches with `git checkout` keeps the cached
|
||||
stat information of existing working tree files that are the
|
||||
same between the current branch and the new branch, which are
|
||||
all older than the resulting index file, and they will not
|
||||
become racily clean. Only the files that are actually checked
|
||||
out can become racily clean.
|
||||
|
||||
In a large project where raciness avoidance cost really matters,
|
||||
however, the initial computation of all object names in the
|
||||
index takes more than one second, and the index file is written
|
||||
out after all that happens. Therefore the timestamp of the
|
||||
index file will be more than one seconds later than the the
|
||||
youngest file in the working tree. This means that in these
|
||||
cases there actually will not be any racily clean entry in
|
||||
the resulting index.
|
||||
|
||||
So in summary I think we should not worry about avoiding the
|
||||
runtime penalty and get rid of the "wait before finishing
|
||||
writing" code out.
|
2
INSTALL
2
INSTALL
@ -16,7 +16,7 @@ install" would not work.
|
||||
Alternatively you can use autoconf generated ./configure script to
|
||||
set up install paths (via config.mak.autogen), so you can write instead
|
||||
|
||||
$ autoconf ;# as yourself if ./configure doesn't exist yet
|
||||
$ make configure ;# as yourself
|
||||
$ ./configure --prefix=/usr ;# as yourself
|
||||
$ make all doc ;# as yourself
|
||||
# make install install-doc ;# as root
|
||||
|
136
Makefile
136
Makefile
@ -27,7 +27,7 @@ all:
|
||||
# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
|
||||
# do not support the 'size specifiers' introduced by C99, namely ll, hh,
|
||||
# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
|
||||
# some c compilers supported these specifiers prior to C99 as an extension.
|
||||
# some C compilers supported these specifiers prior to C99 as an extension.
|
||||
#
|
||||
# Define NO_STRCASESTR if you don't have strcasestr.
|
||||
#
|
||||
@ -121,6 +121,17 @@ template_dir = $(prefix)/share/git-core/templates/
|
||||
GIT_PYTHON_DIR = $(prefix)/share/git-core/python
|
||||
# DESTDIR=
|
||||
|
||||
# default configuration for gitweb
|
||||
GITWEB_CONFIG = gitweb_config.perl
|
||||
GITWEB_HOME_LINK_STR = projects
|
||||
GITWEB_SITENAME =
|
||||
GITWEB_PROJECTROOT = /pub/git
|
||||
GITWEB_BASE_URL =
|
||||
GITWEB_LIST =
|
||||
GITWEB_HOMETEXT = indextext.html
|
||||
GITWEB_CSS = gitweb.css
|
||||
GITWEB_LOGO = git-logo.png
|
||||
|
||||
export prefix bindir gitexecdir template_dir GIT_PYTHON_DIR
|
||||
|
||||
CC = gcc
|
||||
@ -173,33 +184,28 @@ SIMPLE_PROGRAMS = \
|
||||
|
||||
# ... and all the rest that could be moved out of bindir to gitexecdir
|
||||
PROGRAMS = \
|
||||
git-checkout-index$X \
|
||||
git-convert-objects$X git-fetch-pack$X git-fsck-objects$X \
|
||||
git-hash-object$X git-index-pack$X git-local-fetch$X \
|
||||
git-merge-base$X \
|
||||
git-merge-index$X git-mktag$X git-mktree$X git-pack-objects$X git-patch-id$X \
|
||||
git-merge-index$X git-mktag$X git-mktree$X git-patch-id$X \
|
||||
git-peek-remote$X git-receive-pack$X \
|
||||
git-send-pack$X git-shell$X \
|
||||
git-show-index$X git-ssh-fetch$X \
|
||||
git-ssh-upload$X git-unpack-file$X \
|
||||
git-unpack-objects$X git-update-server-info$X \
|
||||
git-update-server-info$X \
|
||||
git-upload-pack$X git-verify-pack$X \
|
||||
git-symbolic-ref$X \
|
||||
git-name-rev$X git-pack-redundant$X git-var$X \
|
||||
git-pack-redundant$X git-var$X \
|
||||
git-describe$X git-merge-tree$X git-blame$X git-imap-send$X \
|
||||
git-merge-recur$X
|
||||
git-merge-recur$X \
|
||||
$(EXTRA_PROGRAMS)
|
||||
|
||||
BUILT_INS = git-log$X git-whatchanged$X git-show$X git-update-ref$X \
|
||||
git-count-objects$X git-diff$X git-push$X git-mailsplit$X \
|
||||
git-grep$X git-add$X git-rm$X git-rev-list$X git-stripspace$X \
|
||||
git-check-ref-format$X git-rev-parse$X git-mailinfo$X \
|
||||
git-init-db$X git-tar-tree$X git-upload-tar$X git-format-patch$X \
|
||||
git-ls-files$X git-ls-tree$X git-get-tar-commit-id$X \
|
||||
git-read-tree$X git-commit-tree$X git-write-tree$X \
|
||||
git-apply$X git-show-branch$X git-diff-files$X git-update-index$X \
|
||||
git-diff-index$X git-diff-stages$X git-diff-tree$X git-cat-file$X \
|
||||
git-fmt-merge-msg$X git-prune$X git-mv$X git-prune-packed$X \
|
||||
git-repo-config$X
|
||||
# Empty...
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
BUILT_INS = \
|
||||
git-format-patch$X git-show$X git-whatchanged$X \
|
||||
git-get-tar-commit-id$X \
|
||||
$(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS))
|
||||
|
||||
# what 'all' will build and 'install' will install, in gitexecdir
|
||||
ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS)
|
||||
@ -228,7 +234,7 @@ LIB_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 dir.h path-list.h unpack-trees.h
|
||||
tree-walk.h log-tree.h dir.h path-list.h unpack-trees.h builtin.h
|
||||
|
||||
DIFF_OBJS = \
|
||||
diff.o diff-lib.o diffcore-break.o diffcore-order.o \
|
||||
@ -243,20 +249,51 @@ LIB_OBJS = \
|
||||
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 revision.o pager.o tree-walk.o xdiff-interface.o \
|
||||
alloc.o merge-file.o path-list.o unpack-trees.o $(DIFF_OBJS)
|
||||
write_or_die.o \
|
||||
alloc.o merge-file.o path-list.o help.o unpack-trees.o $(DIFF_OBJS)
|
||||
|
||||
BUILTIN_OBJS = \
|
||||
builtin-log.o builtin-help.o builtin-count.o builtin-diff.o builtin-push.o \
|
||||
builtin-grep.o builtin-add.o builtin-rev-list.o builtin-check-ref-format.o \
|
||||
builtin-rm.o builtin-init-db.o builtin-rev-parse.o \
|
||||
builtin-tar-tree.o builtin-upload-tar.o builtin-update-index.o \
|
||||
builtin-ls-files.o builtin-ls-tree.o builtin-write-tree.o \
|
||||
builtin-read-tree.o builtin-commit-tree.o builtin-mailinfo.o \
|
||||
builtin-apply.o builtin-show-branch.o builtin-diff-files.o \
|
||||
builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o \
|
||||
builtin-cat-file.o builtin-mailsplit.o builtin-stripspace.o \
|
||||
builtin-update-ref.o builtin-fmt-merge-msg.o builtin-prune.o \
|
||||
builtin-mv.o builtin-prune-packed.o builtin-repo-config.o
|
||||
builtin-add.o \
|
||||
builtin-apply.o \
|
||||
builtin-cat-file.o \
|
||||
builtin-checkout-index.o \
|
||||
builtin-check-ref-format.o \
|
||||
builtin-commit-tree.o \
|
||||
builtin-count-objects.o \
|
||||
builtin-diff.o \
|
||||
builtin-diff-files.o \
|
||||
builtin-diff-index.o \
|
||||
builtin-diff-stages.o \
|
||||
builtin-diff-tree.o \
|
||||
builtin-fmt-merge-msg.o \
|
||||
builtin-grep.o \
|
||||
builtin-init-db.o \
|
||||
builtin-log.o \
|
||||
builtin-ls-files.o \
|
||||
builtin-ls-tree.o \
|
||||
builtin-mailinfo.o \
|
||||
builtin-mailsplit.o \
|
||||
builtin-mv.o \
|
||||
builtin-name-rev.o \
|
||||
builtin-pack-objects.o \
|
||||
builtin-prune.o \
|
||||
builtin-prune-packed.o \
|
||||
builtin-push.o \
|
||||
builtin-read-tree.o \
|
||||
builtin-repo-config.o \
|
||||
builtin-rev-list.o \
|
||||
builtin-rev-parse.o \
|
||||
builtin-rm.o \
|
||||
builtin-show-branch.o \
|
||||
builtin-stripspace.o \
|
||||
builtin-symbolic-ref.o \
|
||||
builtin-tar-tree.o \
|
||||
builtin-unpack-objects.o \
|
||||
builtin-update-index.o \
|
||||
builtin-update-ref.o \
|
||||
builtin-upload-tar.o \
|
||||
builtin-verify-pack.o \
|
||||
builtin-write-tree.o
|
||||
|
||||
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
|
||||
LIBS = $(GITLIBS) -lz
|
||||
@ -297,15 +334,16 @@ ifeq ($(uname_S),SunOS)
|
||||
NEEDS_NSL = YesPlease
|
||||
SHELL_PATH = /bin/bash
|
||||
NO_STRCASESTR = YesPlease
|
||||
NO_STRLCPY = YesPlease
|
||||
ifeq ($(uname_R),5.8)
|
||||
NEEDS_LIBICONV = YesPlease
|
||||
NO_UNSETENV = YesPlease
|
||||
NO_SETENV = YesPlease
|
||||
NO_C99_FORMAT = YesPlease
|
||||
endif
|
||||
ifeq ($(uname_R),5.9)
|
||||
NO_UNSETENV = YesPlease
|
||||
NO_SETENV = YesPlease
|
||||
NO_C99_FORMAT = YesPlease
|
||||
endif
|
||||
INSTALL = ginstall
|
||||
TAR = gtar
|
||||
@ -524,7 +562,7 @@ LIB_OBJS += $(COMPAT_OBJS)
|
||||
export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir
|
||||
### Build rules
|
||||
|
||||
all: $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk
|
||||
all: $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk gitweb/gitweb.cgi
|
||||
|
||||
all:
|
||||
$(MAKE) -C templates
|
||||
@ -537,7 +575,7 @@ git$X: git.c common-cmds.h $(BUILTIN_OBJS) $(GITLIBS) GIT-CFLAGS
|
||||
$(ALL_CFLAGS) -o $@ $(filter %.c,$^) \
|
||||
$(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
|
||||
|
||||
builtin-help.o: common-cmds.h
|
||||
help.o: common-cmds.h
|
||||
|
||||
$(BUILT_INS): git$X
|
||||
rm -f $@ && ln git$X $@
|
||||
@ -582,6 +620,24 @@ git-status: git-commit
|
||||
cp $< $@+
|
||||
mv $@+ $@
|
||||
|
||||
gitweb/gitweb.cgi: gitweb/gitweb.perl
|
||||
rm -f $@ $@+
|
||||
sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \
|
||||
-e 's|++GIT_VERSION++|$(GIT_VERSION)|g' \
|
||||
-e 's|++GIT_BINDIR++|$(bindir)|g' \
|
||||
-e 's|++GITWEB_CONFIG++|$(GITWEB_CONFIG)|g' \
|
||||
-e 's|++GITWEB_HOME_LINK_STR++|$(GITWEB_HOME_LINK_STR)|g' \
|
||||
-e 's|++GITWEB_SITENAME++|$(GITWEB_SITENAME)|g' \
|
||||
-e 's|++GITWEB_PROJECTROOT++|$(GITWEB_PROJECTROOT)|g' \
|
||||
-e 's|++GITWEB_BASE_URL++|$(GITWEB_BASE_URL)|g' \
|
||||
-e 's|++GITWEB_LIST++|$(GITWEB_LIST)|g' \
|
||||
-e 's|++GITWEB_HOMETEXT++|$(GITWEB_HOMETEXT)|g' \
|
||||
-e 's|++GITWEB_CSS++|$(GITWEB_CSS)|g' \
|
||||
-e 's|++GITWEB_LOGO++|$(GITWEB_LOGO)|g' \
|
||||
$< >$@+
|
||||
chmod +x $@+
|
||||
mv $@+ $@
|
||||
|
||||
git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css
|
||||
rm -f $@ $@+
|
||||
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
|
||||
@ -592,10 +648,17 @@ git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css
|
||||
-e '/@@GITWEB_CGI@@/d' \
|
||||
-e '/@@GITWEB_CSS@@/r gitweb/gitweb.css' \
|
||||
-e '/@@GITWEB_CSS@@/d' \
|
||||
$@.sh | sed "s|/usr/bin/git|$(bindir)/git|" > $@+
|
||||
$@.sh > $@+
|
||||
chmod +x $@+
|
||||
mv $@+ $@
|
||||
|
||||
configure: configure.ac
|
||||
rm -f $@ $<+
|
||||
sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
|
||||
$< > $<+
|
||||
autoconf -o $@ $<+
|
||||
rm -f $<+
|
||||
|
||||
# These can record GIT_VERSION
|
||||
git$X git.spec \
|
||||
$(patsubst %.sh,%,$(SCRIPT_SH)) \
|
||||
@ -792,10 +855,11 @@ clean:
|
||||
rm -f $(ALL_PROGRAMS) $(BUILT_INS) git$X
|
||||
rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags
|
||||
rm -rf autom4te.cache
|
||||
rm -f config.log config.mak.autogen configure config.status config.cache
|
||||
rm -f configure config.log config.mak.autogen config.mak.append config.status config.cache
|
||||
rm -rf $(GIT_TARNAME) .doc-tmp-dir
|
||||
rm -f $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
|
||||
rm -f $(htmldocs).tar.gz $(manpages).tar.gz
|
||||
rm -f gitweb/gitweb.cgi
|
||||
$(MAKE) -C Documentation/ clean
|
||||
$(MAKE) -C templates clean
|
||||
$(MAKE) -C t/ clean
|
||||
|
17
blame.c
17
blame.c
@ -56,9 +56,9 @@ struct patch {
|
||||
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;
|
||||
static int num_get_patch;
|
||||
static int num_commits;
|
||||
static int patch_time;
|
||||
|
||||
struct blame_diff_state {
|
||||
struct xdiff_emit_state xm;
|
||||
@ -165,7 +165,7 @@ static int get_blob_sha1(struct tree *t, const char *pathname,
|
||||
blame_file = pathname;
|
||||
pathspec[0] = pathname;
|
||||
pathspec[1] = NULL;
|
||||
memset(blob_sha1, 0, sizeof(blob_sha1));
|
||||
hashclr(blob_sha1);
|
||||
read_tree_recursive(t, "", 0, 0, pathspec, get_blob_sha1_internal);
|
||||
|
||||
for (i = 0; i < 20; i++) {
|
||||
@ -176,7 +176,7 @@ static int get_blob_sha1(struct tree *t, const char *pathname,
|
||||
if (i == 20)
|
||||
return -1;
|
||||
|
||||
memcpy(sha1, blob_sha1, 20);
|
||||
hashcpy(sha1, blob_sha1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -191,7 +191,7 @@ static int get_blob_sha1_internal(const unsigned char *sha1, const char *base,
|
||||
strcmp(blame_file + baselen, pathname))
|
||||
return -1;
|
||||
|
||||
memcpy(blob_sha1, sha1, 20);
|
||||
hashcpy(blob_sha1, sha1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -351,10 +351,7 @@ static int fill_util_info(struct commit *commit)
|
||||
assert(util);
|
||||
assert(util->pathname);
|
||||
|
||||
if (get_blob_sha1(commit->tree, util->pathname, util->sha1))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
return !!get_blob_sha1(commit->tree, util->pathname, util->sha1);
|
||||
}
|
||||
|
||||
static void alloc_line_map(struct commit *commit)
|
||||
|
259
builtin-apply.c
259
builtin-apply.c
@ -28,17 +28,18 @@ static int prefix_length = -1;
|
||||
static int newfd = -1;
|
||||
|
||||
static int p_value = 1;
|
||||
static int allow_binary_replacement = 0;
|
||||
static int check_index = 0;
|
||||
static int write_index = 0;
|
||||
static int cached = 0;
|
||||
static int diffstat = 0;
|
||||
static int numstat = 0;
|
||||
static int summary = 0;
|
||||
static int check = 0;
|
||||
static int allow_binary_replacement;
|
||||
static int check_index;
|
||||
static int write_index;
|
||||
static int cached;
|
||||
static int diffstat;
|
||||
static int numstat;
|
||||
static int summary;
|
||||
static int check;
|
||||
static int apply = 1;
|
||||
static int no_add = 0;
|
||||
static int show_index_info = 0;
|
||||
static int apply_in_reverse;
|
||||
static int no_add;
|
||||
static int show_index_info;
|
||||
static int line_termination = '\n';
|
||||
static unsigned long p_context = -1;
|
||||
static const char apply_usage[] =
|
||||
@ -50,10 +51,10 @@ static enum whitespace_eol {
|
||||
error_on_whitespace,
|
||||
strip_whitespace,
|
||||
} new_whitespace = warn_on_whitespace;
|
||||
static int whitespace_error = 0;
|
||||
static int whitespace_error;
|
||||
static int squelch_whitespace_errors = 5;
|
||||
static int applied_after_stripping = 0;
|
||||
static const char *patch_input_file = NULL;
|
||||
static int applied_after_stripping;
|
||||
static const char *patch_input_file;
|
||||
|
||||
static void parse_whitespace_option(const char *option)
|
||||
{
|
||||
@ -108,6 +109,13 @@ static int max_change, max_len;
|
||||
*/
|
||||
static int linenr = 1;
|
||||
|
||||
/*
|
||||
* This represents one "hunk" from a patch, starting with
|
||||
* "@@ -oldpos,oldlines +newpos,newlines @@" marker. The
|
||||
* patch text is pointed at by patch, and its byte length
|
||||
* is stored in size. leading and trailing are the number
|
||||
* of context lines.
|
||||
*/
|
||||
struct fragment {
|
||||
unsigned long leading, trailing;
|
||||
unsigned long oldpos, oldlines;
|
||||
@ -117,12 +125,19 @@ struct fragment {
|
||||
struct fragment *next;
|
||||
};
|
||||
|
||||
/*
|
||||
* When dealing with a binary patch, we reuse "leading" field
|
||||
* to store the type of the binary hunk, either deflated "delta"
|
||||
* or deflated "literal".
|
||||
*/
|
||||
#define binary_patch_method leading
|
||||
#define BINARY_DELTA_DEFLATED 1
|
||||
#define BINARY_LITERAL_DEFLATED 2
|
||||
|
||||
struct patch {
|
||||
char *new_name, *old_name, *def_name;
|
||||
unsigned int old_mode, new_mode;
|
||||
int is_rename, is_copy, is_new, is_delete, is_binary, is_reverse;
|
||||
#define BINARY_DELTA_DEFLATED 1
|
||||
#define BINARY_LITERAL_DEFLATED 2
|
||||
int is_rename, is_copy, is_new, is_delete, is_binary;
|
||||
unsigned long deflate_origlen;
|
||||
int lines_added, lines_deleted;
|
||||
int score;
|
||||
@ -978,43 +993,70 @@ static inline int metadata_changes(struct patch *patch)
|
||||
patch->old_mode != patch->new_mode);
|
||||
}
|
||||
|
||||
static int parse_binary(char *buffer, unsigned long size, struct patch *patch)
|
||||
static char *inflate_it(const void *data, unsigned long size,
|
||||
unsigned long inflated_size)
|
||||
{
|
||||
/* We have read "GIT binary patch\n"; what follows is a line
|
||||
* that says the patch method (currently, either "deflated
|
||||
* literal" or "deflated delta") and the length of data before
|
||||
* deflating; a sequence of 'length-byte' followed by base-85
|
||||
* encoded data follows.
|
||||
z_stream stream;
|
||||
void *out;
|
||||
int st;
|
||||
|
||||
memset(&stream, 0, sizeof(stream));
|
||||
|
||||
stream.next_in = (unsigned char *)data;
|
||||
stream.avail_in = size;
|
||||
stream.next_out = out = xmalloc(inflated_size);
|
||||
stream.avail_out = inflated_size;
|
||||
inflateInit(&stream);
|
||||
st = inflate(&stream, Z_FINISH);
|
||||
if ((st != Z_STREAM_END) || stream.total_out != inflated_size) {
|
||||
free(out);
|
||||
return NULL;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
static struct fragment *parse_binary_hunk(char **buf_p,
|
||||
unsigned long *sz_p,
|
||||
int *status_p,
|
||||
int *used_p)
|
||||
{
|
||||
/* Expect a line that begins with binary patch method ("literal"
|
||||
* or "delta"), followed by the length of data before deflating.
|
||||
* a sequence of 'length-byte' followed by base-85 encoded data
|
||||
* should follow, terminated by a newline.
|
||||
*
|
||||
* Each 5-byte sequence of base-85 encodes up to 4 bytes,
|
||||
* and we would limit the patch line to 66 characters,
|
||||
* so one line can fit up to 13 groups that would decode
|
||||
* to 52 bytes max. The length byte 'A'-'Z' corresponds
|
||||
* to 1-26 bytes, and 'a'-'z' corresponds to 27-52 bytes.
|
||||
* The end of binary is signaled with an empty line.
|
||||
*/
|
||||
int llen, used;
|
||||
struct fragment *fragment;
|
||||
unsigned long size = *sz_p;
|
||||
char *buffer = *buf_p;
|
||||
int patch_method;
|
||||
unsigned long origlen;
|
||||
char *data = NULL;
|
||||
int hunk_size = 0;
|
||||
struct fragment *frag;
|
||||
|
||||
patch->fragments = fragment = xcalloc(1, sizeof(*fragment));
|
||||
|
||||
/* Grab the type of patch */
|
||||
llen = linelen(buffer, size);
|
||||
used = llen;
|
||||
linenr++;
|
||||
|
||||
*status_p = 0;
|
||||
|
||||
if (!strncmp(buffer, "delta ", 6)) {
|
||||
patch->is_binary = BINARY_DELTA_DEFLATED;
|
||||
patch->deflate_origlen = strtoul(buffer + 6, NULL, 10);
|
||||
patch_method = BINARY_DELTA_DEFLATED;
|
||||
origlen = strtoul(buffer + 6, NULL, 10);
|
||||
}
|
||||
else if (!strncmp(buffer, "literal ", 8)) {
|
||||
patch->is_binary = BINARY_LITERAL_DEFLATED;
|
||||
patch->deflate_origlen = strtoul(buffer + 8, NULL, 10);
|
||||
patch_method = BINARY_LITERAL_DEFLATED;
|
||||
origlen = strtoul(buffer + 8, NULL, 10);
|
||||
}
|
||||
else
|
||||
return error("unrecognized binary patch at line %d: %.*s",
|
||||
linenr-1, llen-1, buffer);
|
||||
return NULL;
|
||||
|
||||
linenr++;
|
||||
buffer += llen;
|
||||
while (1) {
|
||||
int byte_length, max_byte_length, newsize;
|
||||
@ -1043,21 +1085,79 @@ static int parse_binary(char *buffer, unsigned long size, struct patch *patch)
|
||||
if (max_byte_length < byte_length ||
|
||||
byte_length <= max_byte_length - 4)
|
||||
goto corrupt;
|
||||
newsize = fragment->size + byte_length;
|
||||
newsize = hunk_size + byte_length;
|
||||
data = xrealloc(data, newsize);
|
||||
if (decode_85(data + fragment->size,
|
||||
buffer + 1,
|
||||
byte_length))
|
||||
if (decode_85(data + hunk_size, buffer + 1, byte_length))
|
||||
goto corrupt;
|
||||
fragment->size = newsize;
|
||||
hunk_size = newsize;
|
||||
buffer += llen;
|
||||
size -= llen;
|
||||
}
|
||||
fragment->patch = data;
|
||||
return used;
|
||||
|
||||
frag = xcalloc(1, sizeof(*frag));
|
||||
frag->patch = inflate_it(data, hunk_size, origlen);
|
||||
if (!frag->patch)
|
||||
goto corrupt;
|
||||
free(data);
|
||||
frag->size = origlen;
|
||||
*buf_p = buffer;
|
||||
*sz_p = size;
|
||||
*used_p = used;
|
||||
frag->binary_patch_method = patch_method;
|
||||
return frag;
|
||||
|
||||
corrupt:
|
||||
return error("corrupt binary patch at line %d: %.*s",
|
||||
if (data)
|
||||
free(data);
|
||||
*status_p = -1;
|
||||
error("corrupt binary patch at line %d: %.*s",
|
||||
linenr-1, llen-1, buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int parse_binary(char *buffer, unsigned long size, struct patch *patch)
|
||||
{
|
||||
/* We have read "GIT binary patch\n"; what follows is a line
|
||||
* that says the patch method (currently, either "literal" or
|
||||
* "delta") and the length of data before deflating; a
|
||||
* sequence of 'length-byte' followed by base-85 encoded data
|
||||
* follows.
|
||||
*
|
||||
* When a binary patch is reversible, there is another binary
|
||||
* hunk in the same format, starting with patch method (either
|
||||
* "literal" or "delta") with the length of data, and a sequence
|
||||
* of length-byte + base-85 encoded data, terminated with another
|
||||
* empty line. This data, when applied to the postimage, produces
|
||||
* the preimage.
|
||||
*/
|
||||
struct fragment *forward;
|
||||
struct fragment *reverse;
|
||||
int status;
|
||||
int used, used_1;
|
||||
|
||||
forward = parse_binary_hunk(&buffer, &size, &status, &used);
|
||||
if (!forward && !status)
|
||||
/* there has to be one hunk (forward hunk) */
|
||||
return error("unrecognized binary patch at line %d", linenr-1);
|
||||
if (status)
|
||||
/* otherwise we already gave an error message */
|
||||
return status;
|
||||
|
||||
reverse = parse_binary_hunk(&buffer, &size, &status, &used_1);
|
||||
if (reverse)
|
||||
used += used_1;
|
||||
else if (status) {
|
||||
/* not having reverse hunk is not an error, but having
|
||||
* a corrupt reverse hunk is.
|
||||
*/
|
||||
free((void*) forward->patch);
|
||||
free(forward);
|
||||
return status;
|
||||
}
|
||||
forward->next = reverse;
|
||||
patch->fragments = forward;
|
||||
patch->is_binary = 1;
|
||||
return used;
|
||||
}
|
||||
|
||||
static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
|
||||
@ -1143,7 +1243,6 @@ static void reverse_patches(struct patch *p)
|
||||
swap(frag->newpos, frag->oldpos);
|
||||
swap(frag->newlines, frag->oldlines);
|
||||
}
|
||||
p->is_reverse = !p->is_reverse;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1363,8 +1462,7 @@ static int apply_line(char *output, const char *patch, int plen)
|
||||
return plen;
|
||||
}
|
||||
|
||||
static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag,
|
||||
int reverse, int inaccurate_eof)
|
||||
static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag, int inaccurate_eof)
|
||||
{
|
||||
int match_beginning, match_end;
|
||||
char *buf = desc->buffer;
|
||||
@ -1396,7 +1494,7 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag,
|
||||
if (len < size && patch[len] == '\\')
|
||||
plen--;
|
||||
first = *patch;
|
||||
if (reverse) {
|
||||
if (apply_in_reverse) {
|
||||
if (first == '-')
|
||||
first = '+';
|
||||
else if (first == '+')
|
||||
@ -1506,28 +1604,6 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag,
|
||||
return offset;
|
||||
}
|
||||
|
||||
static char *inflate_it(const void *data, unsigned long size,
|
||||
unsigned long inflated_size)
|
||||
{
|
||||
z_stream stream;
|
||||
void *out;
|
||||
int st;
|
||||
|
||||
memset(&stream, 0, sizeof(stream));
|
||||
|
||||
stream.next_in = (unsigned char *)data;
|
||||
stream.avail_in = size;
|
||||
stream.next_out = out = xmalloc(inflated_size);
|
||||
stream.avail_out = inflated_size;
|
||||
inflateInit(&stream);
|
||||
st = inflate(&stream, Z_FINISH);
|
||||
if ((st != Z_STREAM_END) || stream.total_out != inflated_size) {
|
||||
free(out);
|
||||
return NULL;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
static int apply_binary_fragment(struct buffer_desc *desc, struct patch *patch)
|
||||
{
|
||||
unsigned long dst_size;
|
||||
@ -1535,30 +1611,29 @@ static int apply_binary_fragment(struct buffer_desc *desc, struct patch *patch)
|
||||
void *data;
|
||||
void *result;
|
||||
|
||||
/* Binary patch is irreversible */
|
||||
if (patch->is_reverse)
|
||||
return error("cannot reverse-apply a binary patch to '%s'",
|
||||
/* Binary patch is irreversible without the optional second hunk */
|
||||
if (apply_in_reverse) {
|
||||
if (!fragment->next)
|
||||
return error("cannot reverse-apply a binary patch "
|
||||
"without the reverse hunk to '%s'",
|
||||
patch->new_name
|
||||
? patch->new_name : patch->old_name);
|
||||
|
||||
data = inflate_it(fragment->patch, fragment->size,
|
||||
patch->deflate_origlen);
|
||||
if (!data)
|
||||
return error("corrupt patch data");
|
||||
switch (patch->is_binary) {
|
||||
fragment = fragment;
|
||||
}
|
||||
data = (void*) fragment->patch;
|
||||
switch (fragment->binary_patch_method) {
|
||||
case BINARY_DELTA_DEFLATED:
|
||||
result = patch_delta(desc->buffer, desc->size,
|
||||
data,
|
||||
patch->deflate_origlen,
|
||||
fragment->size,
|
||||
&dst_size);
|
||||
free(desc->buffer);
|
||||
desc->buffer = result;
|
||||
free(data);
|
||||
break;
|
||||
case BINARY_LITERAL_DEFLATED:
|
||||
free(desc->buffer);
|
||||
desc->buffer = data;
|
||||
dst_size = patch->deflate_origlen;
|
||||
dst_size = fragment->size;
|
||||
break;
|
||||
}
|
||||
if (!desc->buffer)
|
||||
@ -1609,7 +1684,7 @@ static int apply_binary(struct buffer_desc *desc, struct patch *patch)
|
||||
}
|
||||
|
||||
get_sha1_hex(patch->new_sha1_prefix, sha1);
|
||||
if (!memcmp(sha1, null_sha1, 20)) {
|
||||
if (is_null_sha1(sha1)) {
|
||||
free(desc->buffer);
|
||||
desc->alloc = desc->size = 0;
|
||||
desc->buffer = NULL;
|
||||
@ -1657,8 +1732,7 @@ static int apply_fragments(struct buffer_desc *desc, struct patch *patch)
|
||||
return apply_binary(desc, patch);
|
||||
|
||||
while (frag) {
|
||||
if (apply_one_fragment(desc, frag, patch->is_reverse,
|
||||
patch->inaccurate_eof) < 0)
|
||||
if (apply_one_fragment(desc, frag, patch->inaccurate_eof) < 0)
|
||||
return error("patch failed: %s:%ld",
|
||||
name, frag->oldpos);
|
||||
frag = frag->next;
|
||||
@ -1842,11 +1916,6 @@ static int check_patch_list(struct patch *patch)
|
||||
return error;
|
||||
}
|
||||
|
||||
static inline int is_null_sha1(const unsigned char *sha1)
|
||||
{
|
||||
return !memcmp(sha1, null_sha1, 20);
|
||||
}
|
||||
|
||||
static void show_index_list(struct patch *list)
|
||||
{
|
||||
struct patch *patch;
|
||||
@ -2194,8 +2263,7 @@ static int use_patch(struct patch *p)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int apply_patch(int fd, const char *filename,
|
||||
int reverse, int inaccurate_eof)
|
||||
static int apply_patch(int fd, const char *filename, int inaccurate_eof)
|
||||
{
|
||||
unsigned long offset, size;
|
||||
char *buffer = read_patch_file(fd, &size);
|
||||
@ -2215,7 +2283,7 @@ static int apply_patch(int fd, const char *filename,
|
||||
nr = parse_chunk(buffer + offset, size, patch);
|
||||
if (nr < 0)
|
||||
break;
|
||||
if (reverse)
|
||||
if (apply_in_reverse)
|
||||
reverse_patches(patch);
|
||||
if (use_patch(patch)) {
|
||||
patch_stats(patch);
|
||||
@ -2278,7 +2346,6 @@ int cmd_apply(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
int i;
|
||||
int read_stdin = 1;
|
||||
int reverse = 0;
|
||||
int inaccurate_eof = 0;
|
||||
|
||||
const char *whitespace_option = NULL;
|
||||
@ -2289,7 +2356,7 @@ int cmd_apply(int argc, const char **argv, const char *prefix)
|
||||
int fd;
|
||||
|
||||
if (!strcmp(arg, "-")) {
|
||||
apply_patch(0, "<stdin>", reverse, inaccurate_eof);
|
||||
apply_patch(0, "<stdin>", inaccurate_eof);
|
||||
read_stdin = 0;
|
||||
continue;
|
||||
}
|
||||
@ -2367,7 +2434,7 @@ int cmd_apply(int argc, const char **argv, const char *prefix)
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "-R") || !strcmp(arg, "--reverse")) {
|
||||
reverse = 1;
|
||||
apply_in_reverse = 1;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--inaccurate-eof")) {
|
||||
@ -2390,12 +2457,12 @@ int cmd_apply(int argc, const char **argv, const char *prefix)
|
||||
usage(apply_usage);
|
||||
read_stdin = 0;
|
||||
set_default_whitespace_mode(whitespace_option);
|
||||
apply_patch(fd, arg, reverse, inaccurate_eof);
|
||||
apply_patch(fd, arg, inaccurate_eof);
|
||||
close(fd);
|
||||
}
|
||||
set_default_whitespace_mode(whitespace_option);
|
||||
if (read_stdin)
|
||||
apply_patch(0, "<stdin>", reverse, inaccurate_eof);
|
||||
apply_patch(0, "<stdin>", inaccurate_eof);
|
||||
if (whitespace_error) {
|
||||
if (squelch_whitespace_errors &&
|
||||
squelch_whitespace_errors < whitespace_error) {
|
||||
|
@ -9,24 +9,7 @@
|
||||
#include "tree.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static void flush_buffer(const char *buf, unsigned long size)
|
||||
{
|
||||
while (size > 0) {
|
||||
long ret = xwrite(1, buf, size);
|
||||
if (ret < 0) {
|
||||
/* Ignore epipe */
|
||||
if (errno == EPIPE)
|
||||
break;
|
||||
die("git-cat-file: %s", strerror(errno));
|
||||
} else if (!ret) {
|
||||
die("git-cat-file: disk full?");
|
||||
}
|
||||
size -= ret;
|
||||
buf += ret;
|
||||
}
|
||||
}
|
||||
|
||||
static int pprint_tag(const unsigned char *sha1, const char *buf, unsigned long size)
|
||||
static void pprint_tag(const unsigned char *sha1, const char *buf, unsigned long size)
|
||||
{
|
||||
/* the parser in tag.c is useless here. */
|
||||
const char *endp = buf + size;
|
||||
@ -42,7 +25,7 @@ static int pprint_tag(const unsigned char *sha1, const char *buf, unsigned long
|
||||
/* Found the tagger line. Copy out the contents
|
||||
* of the buffer so far.
|
||||
*/
|
||||
flush_buffer(buf, cp - buf);
|
||||
write_or_die(1, buf, cp - buf);
|
||||
|
||||
/*
|
||||
* Do something intelligent, like pretty-printing
|
||||
@ -61,18 +44,18 @@ static int pprint_tag(const unsigned char *sha1, const char *buf, unsigned long
|
||||
sp++;
|
||||
if (sp == cp) {
|
||||
/* give up */
|
||||
flush_buffer(tagger,
|
||||
write_or_die(1, tagger,
|
||||
cp - tagger);
|
||||
break;
|
||||
}
|
||||
while (sp < cp &&
|
||||
!('0' <= *sp && *sp <= '9'))
|
||||
sp++;
|
||||
flush_buffer(tagger, sp - tagger);
|
||||
write_or_die(1, tagger, sp - tagger);
|
||||
date = strtoul(sp, &ep, 10);
|
||||
tz = strtol(ep, NULL, 10);
|
||||
sp = show_date(date, tz);
|
||||
flush_buffer(sp, strlen(sp));
|
||||
write_or_die(1, sp, strlen(sp));
|
||||
xwrite(1, "\n", 1);
|
||||
break;
|
||||
}
|
||||
@ -90,8 +73,7 @@ static int pprint_tag(const unsigned char *sha1, const char *buf, unsigned long
|
||||
* remainder as is.
|
||||
*/
|
||||
if (cp < endp)
|
||||
flush_buffer(cp, endp - cp);
|
||||
return 0;
|
||||
write_or_die(1, cp, endp - cp);
|
||||
}
|
||||
|
||||
int cmd_cat_file(int argc, const char **argv, const char *prefix)
|
||||
@ -145,8 +127,10 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
|
||||
buf = read_sha1_file(sha1, type, &size);
|
||||
if (!buf)
|
||||
die("Cannot read object %s", argv[2]);
|
||||
if (!strcmp(type, tag_type))
|
||||
return pprint_tag(sha1, buf, size);
|
||||
if (!strcmp(type, tag_type)) {
|
||||
pprint_tag(sha1, buf, size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* otherwise just spit out the data */
|
||||
break;
|
||||
@ -161,6 +145,6 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
|
||||
if (!buf)
|
||||
die("git-cat-file %s: bad file", argv[2]);
|
||||
|
||||
flush_buffer(buf, size);
|
||||
write_or_die(1, buf, size);
|
||||
return 0;
|
||||
}
|
||||
|
@ -42,8 +42,6 @@
|
||||
#include "cache-tree.h"
|
||||
|
||||
#define CHECKOUT_ALL 4
|
||||
static const char *prefix;
|
||||
static int prefix_length;
|
||||
static int line_termination = '\n';
|
||||
static int checkout_stage; /* default to checkout stage0 */
|
||||
static int to_tempfile;
|
||||
@ -51,7 +49,7 @@ static char topath[4][MAXPATHLEN+1];
|
||||
|
||||
static struct checkout state;
|
||||
|
||||
static void write_tempfile_record (const char *name)
|
||||
static void write_tempfile_record(const char *name, int prefix_length)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -77,7 +75,7 @@ static void write_tempfile_record (const char *name)
|
||||
}
|
||||
}
|
||||
|
||||
static int checkout_file(const char *name)
|
||||
static int checkout_file(const char *name, int prefix_length)
|
||||
{
|
||||
int namelen = strlen(name);
|
||||
int pos = cache_name_pos(name, namelen);
|
||||
@ -106,7 +104,7 @@ static int checkout_file(const char *name)
|
||||
|
||||
if (did_checkout) {
|
||||
if (to_tempfile)
|
||||
write_tempfile_record(name);
|
||||
write_tempfile_record(name, prefix_length);
|
||||
return errs > 0 ? -1 : 0;
|
||||
}
|
||||
|
||||
@ -124,7 +122,7 @@ static int checkout_file(const char *name)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int checkout_all(void)
|
||||
static void checkout_all(const char *prefix, int prefix_length)
|
||||
{
|
||||
int i, errs = 0;
|
||||
struct cache_entry* last_ce = NULL;
|
||||
@ -141,7 +139,7 @@ static int checkout_all(void)
|
||||
if (last_ce && to_tempfile) {
|
||||
if (ce_namelen(last_ce) != ce_namelen(ce)
|
||||
|| memcmp(last_ce->name, ce->name, ce_namelen(ce)))
|
||||
write_tempfile_record(last_ce->name);
|
||||
write_tempfile_record(last_ce->name, prefix_length);
|
||||
}
|
||||
if (checkout_entry(ce, &state,
|
||||
to_tempfile ? topath[ce_stage(ce)] : NULL) < 0)
|
||||
@ -149,13 +147,12 @@ static int checkout_all(void)
|
||||
last_ce = ce;
|
||||
}
|
||||
if (last_ce && to_tempfile)
|
||||
write_tempfile_record(last_ce->name);
|
||||
write_tempfile_record(last_ce->name, prefix_length);
|
||||
if (errs)
|
||||
/* we have already done our error reporting.
|
||||
* exit with the same code as die().
|
||||
*/
|
||||
exit(128);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char checkout_cache_usage[] =
|
||||
@ -163,16 +160,16 @@ static const char checkout_cache_usage[] =
|
||||
|
||||
static struct lock_file lock_file;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int cmd_checkout_index(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
int i;
|
||||
int newfd = -1;
|
||||
int all = 0;
|
||||
int read_from_stdin = 0;
|
||||
int prefix_length;
|
||||
|
||||
state.base_dir = "";
|
||||
prefix = setup_git_directory();
|
||||
git_config(git_default_config);
|
||||
state.base_dir = "";
|
||||
prefix_length = prefix ? strlen(prefix) : 0;
|
||||
|
||||
if (read_cache() < 0) {
|
||||
@ -270,7 +267,7 @@ int main(int argc, char **argv)
|
||||
if (read_from_stdin)
|
||||
die("git-checkout-index: don't mix '--stdin' and explicit filenames");
|
||||
p = prefix_path(prefix, prefix_length, arg);
|
||||
checkout_file(p);
|
||||
checkout_file(p, prefix_length);
|
||||
if (p < arg || p > arg + strlen(arg))
|
||||
free((char*)p);
|
||||
}
|
||||
@ -292,7 +289,7 @@ int main(int argc, char **argv)
|
||||
else
|
||||
path_name = buf.buf;
|
||||
p = prefix_path(prefix, prefix_length, path_name);
|
||||
checkout_file(p);
|
||||
checkout_file(p, prefix_length);
|
||||
if (p < path_name || p > path_name + strlen(path_name))
|
||||
free((char *)p);
|
||||
if (path_name != buf.buf)
|
||||
@ -301,7 +298,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (all)
|
||||
checkout_all();
|
||||
checkout_all(prefix, prefix_length);
|
||||
|
||||
if (0 <= newfd &&
|
||||
(write_cache(newfd, active_cache, active_nr) ||
|
@ -69,7 +69,7 @@ static int new_parent(int idx)
|
||||
int i;
|
||||
unsigned char *sha1 = parent_sha1[idx];
|
||||
for (i = 0; i < idx; i++) {
|
||||
if (!memcmp(parent_sha1[i], sha1, 20)) {
|
||||
if (!hashcmp(parent_sha1[i], sha1)) {
|
||||
error("duplicate parent %s ignored", sha1_to_hex(sha1));
|
||||
return 0;
|
||||
}
|
||||
|
@ -47,12 +47,5 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
|
||||
if (rev.pending.nr ||
|
||||
rev.min_age != -1 || rev.max_age != -1)
|
||||
usage(diff_files_usage);
|
||||
/*
|
||||
* Backward compatibility wart - "diff-files -s" used to
|
||||
* defeat the common diff option "-s" which asked for
|
||||
* DIFF_FORMAT_NO_OUTPUT.
|
||||
*/
|
||||
if (rev.diffopt.output_format == DIFF_FORMAT_NO_OUTPUT)
|
||||
rev.diffopt.output_format = DIFF_FORMAT_RAW;
|
||||
return run_diff_files(&rev, silent);
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ static void diff_stages(int stage1, int stage2, const char **pathspec)
|
||||
else if (!two)
|
||||
diff_addremove(&diff_options, '-', ntohl(one->ce_mode),
|
||||
one->sha1, name, NULL);
|
||||
else if (memcmp(one->sha1, two->sha1, 20) ||
|
||||
else if (hashcmp(one->sha1, two->sha1) ||
|
||||
(one->ce_mode != two->ce_mode) ||
|
||||
diff_options.find_copies_harder)
|
||||
diff_change(&diff_options,
|
||||
|
@ -56,13 +56,6 @@ static int builtin_diff_files(struct rev_info *revs,
|
||||
if (revs->max_count < 0 &&
|
||||
(revs->diffopt.output_format & DIFF_FORMAT_PATCH))
|
||||
revs->combine_merges = revs->dense_combined_merges = 1;
|
||||
/*
|
||||
* Backward compatibility wart - "diff-files -s" used to
|
||||
* defeat the common diff option "-s" which asked for
|
||||
* DIFF_FORMAT_NO_OUTPUT.
|
||||
*/
|
||||
if (revs->diffopt.output_format == DIFF_FORMAT_NO_OUTPUT)
|
||||
revs->diffopt.output_format = DIFF_FORMAT_RAW;
|
||||
return run_diff_files(revs, silent);
|
||||
}
|
||||
|
||||
@ -75,9 +68,8 @@ static void stuff_change(struct diff_options *opt,
|
||||
{
|
||||
struct diff_filespec *one, *two;
|
||||
|
||||
if (memcmp(null_sha1, old_sha1, 20) &&
|
||||
memcmp(null_sha1, new_sha1, 20) &&
|
||||
!memcmp(old_sha1, new_sha1, 20))
|
||||
if (!is_null_sha1(old_sha1) && !is_null_sha1(new_sha1) &&
|
||||
!hashcmp(old_sha1, new_sha1))
|
||||
return;
|
||||
|
||||
if (opt->reverse_diff) {
|
||||
@ -200,7 +192,7 @@ static int builtin_diff_combined(struct rev_info *revs,
|
||||
parent = xmalloc(ents * sizeof(*parent));
|
||||
/* Again, the revs are all reverse */
|
||||
for (i = 0; i < ents; i++)
|
||||
memcpy(parent + i, ent[ents - 1 - i].item->sha1, 20);
|
||||
hashcpy((unsigned char*)parent + i, ent[ents - 1 - i].item->sha1);
|
||||
diff_tree_combined(parent[0], parent + 1, ents - 1,
|
||||
revs->dense_combined_merges, revs);
|
||||
return 0;
|
||||
@ -298,7 +290,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
|
||||
if (obj->type == OBJ_BLOB) {
|
||||
if (2 <= blobs)
|
||||
die("more than two blobs given: '%s'", name);
|
||||
memcpy(blob[blobs].sha1, obj->sha1, 20);
|
||||
hashcpy(blob[blobs].sha1, obj->sha1);
|
||||
blob[blobs].name = name;
|
||||
blobs++;
|
||||
continue;
|
||||
|
@ -8,7 +8,7 @@
|
||||
static const char *fmt_merge_msg_usage =
|
||||
"git-fmt-merge-msg [--summary] [--no-summary] [--file <file>]";
|
||||
|
||||
static int merge_summary = 0;
|
||||
static int merge_summary;
|
||||
|
||||
static int fmt_merge_msg_config(const char *key, const char *value)
|
||||
{
|
||||
|
120
builtin-grep.c
120
builtin-grep.c
@ -123,6 +123,7 @@ struct grep_opt {
|
||||
struct grep_pat *pattern_list;
|
||||
struct grep_pat **pattern_tail;
|
||||
struct grep_expr *pattern_expression;
|
||||
int prefix_length;
|
||||
regex_t regexp;
|
||||
unsigned linenum:1;
|
||||
unsigned invert:1;
|
||||
@ -136,6 +137,7 @@ struct grep_opt {
|
||||
#define GREP_BINARY_TEXT 2
|
||||
unsigned binary:2;
|
||||
unsigned extended:1;
|
||||
unsigned relative:1;
|
||||
int regflags;
|
||||
unsigned pre_context;
|
||||
unsigned post_context;
|
||||
@ -173,61 +175,12 @@ static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
static inline void indent(int in)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < in; i++) putchar(' ');
|
||||
}
|
||||
|
||||
static void dump_pattern_exp(struct grep_expr *x, int in)
|
||||
{
|
||||
switch (x->node) {
|
||||
case GREP_NODE_ATOM:
|
||||
indent(in);
|
||||
puts(x->u.atom->pattern);
|
||||
break;
|
||||
case GREP_NODE_NOT:
|
||||
indent(in);
|
||||
puts("--not");
|
||||
dump_pattern_exp(x->u.unary, in+1);
|
||||
break;
|
||||
case GREP_NODE_AND:
|
||||
dump_pattern_exp(x->u.binary.left, in+1);
|
||||
indent(in);
|
||||
puts("--and");
|
||||
dump_pattern_exp(x->u.binary.right, in+1);
|
||||
break;
|
||||
case GREP_NODE_OR:
|
||||
dump_pattern_exp(x->u.binary.left, in+1);
|
||||
indent(in);
|
||||
puts("--or");
|
||||
dump_pattern_exp(x->u.binary.right, in+1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void looking_at(const char *msg, struct grep_pat **list)
|
||||
{
|
||||
struct grep_pat *p = *list;
|
||||
fprintf(stderr, "%s: looking at ", msg);
|
||||
if (!p)
|
||||
fprintf(stderr, "empty\n");
|
||||
else
|
||||
fprintf(stderr, "<%s>\n", p->pattern);
|
||||
}
|
||||
#else
|
||||
#define looking_at(a,b) do {} while(0)
|
||||
#endif
|
||||
|
||||
static struct grep_expr *compile_pattern_expr(struct grep_pat **);
|
||||
static struct grep_expr *compile_pattern_atom(struct grep_pat **list)
|
||||
{
|
||||
struct grep_pat *p;
|
||||
struct grep_expr *x;
|
||||
|
||||
looking_at("atom", list);
|
||||
|
||||
p = *list;
|
||||
switch (p->token) {
|
||||
case GREP_PATTERN: /* atom */
|
||||
@ -255,8 +208,6 @@ static struct grep_expr *compile_pattern_not(struct grep_pat **list)
|
||||
struct grep_pat *p;
|
||||
struct grep_expr *x;
|
||||
|
||||
looking_at("not", list);
|
||||
|
||||
p = *list;
|
||||
switch (p->token) {
|
||||
case GREP_NOT:
|
||||
@ -279,8 +230,6 @@ static struct grep_expr *compile_pattern_and(struct grep_pat **list)
|
||||
struct grep_pat *p;
|
||||
struct grep_expr *x, *y, *z;
|
||||
|
||||
looking_at("and", list);
|
||||
|
||||
x = compile_pattern_not(list);
|
||||
p = *list;
|
||||
if (p && p->token == GREP_AND) {
|
||||
@ -304,8 +253,6 @@ static struct grep_expr *compile_pattern_or(struct grep_pat **list)
|
||||
struct grep_pat *p;
|
||||
struct grep_expr *x, *y, *z;
|
||||
|
||||
looking_at("or", list);
|
||||
|
||||
x = compile_pattern_and(list);
|
||||
p = *list;
|
||||
if (x && p && p->token != GREP_CLOSE_PAREN) {
|
||||
@ -323,8 +270,6 @@ static struct grep_expr *compile_pattern_or(struct grep_pat **list)
|
||||
|
||||
static struct grep_expr *compile_pattern_expr(struct grep_pat **list)
|
||||
{
|
||||
looking_at("expr", list);
|
||||
|
||||
return compile_pattern_or(list);
|
||||
}
|
||||
|
||||
@ -388,9 +333,7 @@ static int buffer_is_binary(const char *ptr, unsigned long size)
|
||||
{
|
||||
if (FIRST_FEW_BYTES < size)
|
||||
size = FIRST_FEW_BYTES;
|
||||
if (memchr(ptr, 0, size))
|
||||
return 1;
|
||||
return 0;
|
||||
return !!memchr(ptr, 0, size);
|
||||
}
|
||||
|
||||
static int fixmatch(const char *pattern, char *line, regmatch_t *match)
|
||||
@ -632,19 +575,40 @@ static int grep_buffer(struct grep_opt *opt, const char *name,
|
||||
return !!last_hit;
|
||||
}
|
||||
|
||||
static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, const char *name)
|
||||
static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, const char *name, int tree_name_len)
|
||||
{
|
||||
unsigned long size;
|
||||
char *data;
|
||||
char type[20];
|
||||
char *to_free = NULL;
|
||||
int hit;
|
||||
|
||||
data = read_sha1_file(sha1, type, &size);
|
||||
if (!data) {
|
||||
error("'%s': unable to read %s", name, sha1_to_hex(sha1));
|
||||
return 0;
|
||||
}
|
||||
if (opt->relative && opt->prefix_length) {
|
||||
static char name_buf[PATH_MAX];
|
||||
char *cp;
|
||||
int name_len = strlen(name) - opt->prefix_length + 1;
|
||||
|
||||
if (!tree_name_len)
|
||||
name += opt->prefix_length;
|
||||
else {
|
||||
if (ARRAY_SIZE(name_buf) <= name_len)
|
||||
cp = to_free = xmalloc(name_len);
|
||||
else
|
||||
cp = name_buf;
|
||||
memcpy(cp, name, tree_name_len);
|
||||
strcpy(cp + tree_name_len,
|
||||
name + tree_name_len + opt->prefix_length);
|
||||
name = cp;
|
||||
}
|
||||
}
|
||||
hit = grep_buffer(opt, name, data, size);
|
||||
free(data);
|
||||
free(to_free);
|
||||
return hit;
|
||||
}
|
||||
|
||||
@ -674,6 +638,8 @@ static int grep_file(struct grep_opt *opt, const char *filename)
|
||||
return 0;
|
||||
}
|
||||
close(i);
|
||||
if (opt->relative && opt->prefix_length)
|
||||
filename += opt->prefix_length;
|
||||
i = grep_buffer(opt, filename, data, st.st_size);
|
||||
free(data);
|
||||
return i;
|
||||
@ -720,7 +686,7 @@ static int external_grep(struct grep_opt *opt, const char **paths, int cached)
|
||||
char *argptr = randarg;
|
||||
struct grep_pat *p;
|
||||
|
||||
if (opt->extended)
|
||||
if (opt->extended || (opt->relative && opt->prefix_length))
|
||||
return -1;
|
||||
len = nr = 0;
|
||||
push_arg("grep");
|
||||
@ -845,7 +811,7 @@ static int grep_cache(struct grep_opt *opt, const char **paths, int cached)
|
||||
if (!pathspec_matches(paths, ce->name))
|
||||
continue;
|
||||
if (cached)
|
||||
hit |= grep_sha1(opt, ce->sha1, ce->name);
|
||||
hit |= grep_sha1(opt, ce->sha1, ce->name, 0);
|
||||
else
|
||||
hit |= grep_file(opt, ce->name);
|
||||
}
|
||||
@ -860,11 +826,12 @@ static int grep_tree(struct grep_opt *opt, const char **paths,
|
||||
int hit = 0;
|
||||
struct name_entry entry;
|
||||
char *down;
|
||||
char *path_buf = xmalloc(PATH_MAX + strlen(tree_name) + 100);
|
||||
int tn_len = strlen(tree_name);
|
||||
char *path_buf = xmalloc(PATH_MAX + tn_len + 100);
|
||||
|
||||
if (tree_name[0]) {
|
||||
int offset = sprintf(path_buf, "%s:", tree_name);
|
||||
down = path_buf + offset;
|
||||
if (tn_len) {
|
||||
tn_len = sprintf(path_buf, "%s:", tree_name);
|
||||
down = path_buf + tn_len;
|
||||
strcat(down, base);
|
||||
}
|
||||
else {
|
||||
@ -886,7 +853,7 @@ static int grep_tree(struct grep_opt *opt, const char **paths,
|
||||
if (!pathspec_matches(paths, down))
|
||||
;
|
||||
else if (S_ISREG(entry.mode))
|
||||
hit |= grep_sha1(opt, entry.sha1, path_buf);
|
||||
hit |= grep_sha1(opt, entry.sha1, path_buf, tn_len);
|
||||
else if (S_ISDIR(entry.mode)) {
|
||||
char type[20];
|
||||
struct tree_desc sub;
|
||||
@ -907,7 +874,7 @@ static int grep_object(struct grep_opt *opt, const char **paths,
|
||||
struct object *obj, const char *name)
|
||||
{
|
||||
if (obj->type == OBJ_BLOB)
|
||||
return grep_sha1(opt, obj->sha1, name);
|
||||
return grep_sha1(opt, obj->sha1, name, 0);
|
||||
if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) {
|
||||
struct tree_desc tree;
|
||||
void *data;
|
||||
@ -945,6 +912,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
||||
int i;
|
||||
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
opt.prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
|
||||
opt.relative = 1;
|
||||
opt.pattern_tail = &opt.pattern_list;
|
||||
opt.regflags = REG_NEWLINE;
|
||||
|
||||
@ -1118,6 +1087,10 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
die(emsg_missing_argument, arg);
|
||||
}
|
||||
if (!strcmp("--full-name", arg)) {
|
||||
opt.relative = 0;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp("--", arg)) {
|
||||
/* later processing wants to have this at argv[1] */
|
||||
argv--;
|
||||
@ -1176,8 +1149,15 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
||||
verify_filename(prefix, argv[j]);
|
||||
}
|
||||
|
||||
if (i < argc)
|
||||
if (i < argc) {
|
||||
paths = get_pathspec(prefix, argv + i);
|
||||
if (opt.prefix_length && opt.relative) {
|
||||
/* Make sure we do not get outside of paths */
|
||||
for (i = 0; paths[i]; i++)
|
||||
if (strncmp(prefix, paths[i], opt.prefix_length))
|
||||
die("git-grep: cannot generate relative filenames containing '..'");
|
||||
}
|
||||
}
|
||||
else if (prefix) {
|
||||
paths = xcalloc(2, sizeof(const char *));
|
||||
paths[0] = prefix;
|
||||
|
@ -12,21 +12,22 @@
|
||||
#include "dir.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static int abbrev = 0;
|
||||
static int show_deleted = 0;
|
||||
static int show_cached = 0;
|
||||
static int show_others = 0;
|
||||
static int show_stage = 0;
|
||||
static int show_unmerged = 0;
|
||||
static int show_modified = 0;
|
||||
static int show_killed = 0;
|
||||
static int show_valid_bit = 0;
|
||||
static int abbrev;
|
||||
static int show_deleted;
|
||||
static int show_cached;
|
||||
static int show_others;
|
||||
static int show_stage;
|
||||
static int show_unmerged;
|
||||
static int show_modified;
|
||||
static int show_killed;
|
||||
static int show_valid_bit;
|
||||
static int line_terminator = '\n';
|
||||
|
||||
static int prefix_len = 0, prefix_offset = 0;
|
||||
static const char **pathspec = NULL;
|
||||
static int error_unmatch = 0;
|
||||
static char *ps_matched = NULL;
|
||||
static int prefix_len;
|
||||
static int prefix_offset;
|
||||
static const char **pathspec;
|
||||
static int error_unmatch;
|
||||
static char *ps_matched;
|
||||
|
||||
static const char *tag_cached = "";
|
||||
static const char *tag_unmerged = "";
|
||||
|
@ -14,10 +14,10 @@ static int line_termination = '\n';
|
||||
#define LS_TREE_ONLY 2
|
||||
#define LS_SHOW_TREES 4
|
||||
#define LS_NAME_ONLY 8
|
||||
static int abbrev = 0;
|
||||
static int ls_options = 0;
|
||||
static int abbrev;
|
||||
static int ls_options;
|
||||
static const char **pathspec;
|
||||
static int chomp_prefix = 0;
|
||||
static int chomp_prefix;
|
||||
static const char *ls_tree_prefix;
|
||||
|
||||
static const char ls_tree_usage[] =
|
||||
|
@ -16,8 +16,8 @@
|
||||
|
||||
static FILE *cmitmsg, *patchfile, *fin, *fout;
|
||||
|
||||
static int keep_subject = 0;
|
||||
static const char *metainfo_charset = NULL;
|
||||
static int keep_subject;
|
||||
static const char *metainfo_charset;
|
||||
static char line[1000];
|
||||
static char date[1000];
|
||||
static char name[1000];
|
||||
@ -31,7 +31,7 @@ static char charset[256];
|
||||
|
||||
static char multipart_boundary[1000];
|
||||
static int multipart_boundary_len;
|
||||
static int patch_lines = 0;
|
||||
static int patch_lines;
|
||||
|
||||
static char *sanity_check(char *name, char *email)
|
||||
{
|
||||
|
111
builtin-mv.c
111
builtin-mv.c
@ -17,12 +17,19 @@ static const char builtin_mv_usage[] =
|
||||
static const char **copy_pathspec(const char *prefix, const char **pathspec,
|
||||
int count, int base_name)
|
||||
{
|
||||
int i;
|
||||
const char **result = xmalloc((count + 1) * sizeof(const char *));
|
||||
memcpy(result, pathspec, count * sizeof(const char *));
|
||||
result[count] = NULL;
|
||||
if (base_name) {
|
||||
int i;
|
||||
for (i = 0; i < count; i++) {
|
||||
int length = strlen(result[i]);
|
||||
if (length > 0 && result[i][length - 1] == '/') {
|
||||
char *without_slash = xmalloc(length);
|
||||
memcpy(without_slash, result[i], length - 1);
|
||||
without_slash[length - 1] = '\0';
|
||||
result[i] = without_slash;
|
||||
}
|
||||
if (base_name) {
|
||||
const char *last_slash = strrchr(result[i], '/');
|
||||
if (last_slash)
|
||||
result[i] = last_slash + 1;
|
||||
@ -107,7 +114,10 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
||||
modes = xcalloc(count, sizeof(enum update_mode));
|
||||
dest_path = copy_pathspec(prefix, argv + argc - 1, 1, 0);
|
||||
|
||||
if (!lstat(dest_path[0], &st) &&
|
||||
if (dest_path[0][0] == '\0')
|
||||
/* special case: "." was normalized to "" */
|
||||
destination = copy_pathspec(dest_path[0], argv + i, count, 1);
|
||||
else if (!lstat(dest_path[0], &st) &&
|
||||
S_ISDIR(st.st_mode)) {
|
||||
dest_path[0] = add_slash(dest_path[0]);
|
||||
destination = copy_pathspec(dest_path[0], argv + i, count, 1);
|
||||
@ -119,41 +129,43 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
||||
|
||||
/* Checking */
|
||||
for (i = 0; i < count; i++) {
|
||||
const char *src = source[i], *dst = destination[i];
|
||||
int length, src_is_dir;
|
||||
const char *bad = NULL;
|
||||
|
||||
if (show_only)
|
||||
printf("Checking rename of '%s' to '%s'\n",
|
||||
source[i], destination[i]);
|
||||
printf("Checking rename of '%s' to '%s'\n", src, dst);
|
||||
|
||||
if (lstat(source[i], &st) < 0)
|
||||
length = strlen(src);
|
||||
if (lstat(src, &st) < 0)
|
||||
bad = "bad source";
|
||||
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
const char *dir = source[i], *dest_dir = destination[i];
|
||||
int first, last, len = strlen(dir);
|
||||
|
||||
if (lstat(dest_dir, &st) == 0) {
|
||||
else if (!strncmp(src, dst, length) &&
|
||||
(dst[length] == 0 || dst[length] == '/')) {
|
||||
bad = "can not move directory into itself";
|
||||
} else if ((src_is_dir = S_ISDIR(st.st_mode))
|
||||
&& lstat(dst, &st) == 0)
|
||||
bad = "cannot move directory over file";
|
||||
goto next;
|
||||
}
|
||||
else if (src_is_dir) {
|
||||
int first, last;
|
||||
|
||||
modes[i] = WORKING_DIRECTORY;
|
||||
|
||||
first = cache_name_pos(source[i], len);
|
||||
first = cache_name_pos(src, length);
|
||||
if (first >= 0)
|
||||
die ("Huh? %s/ is in index?", dir);
|
||||
die ("Huh? %s/ is in index?", src);
|
||||
|
||||
first = -1 - first;
|
||||
for (last = first; last < active_nr; last++) {
|
||||
const char *path = active_cache[last]->name;
|
||||
if (strncmp(path, dir, len) || path[len] != '/')
|
||||
if (strncmp(path, src, length)
|
||||
|| path[length] != '/')
|
||||
break;
|
||||
}
|
||||
|
||||
if (last - first < 1)
|
||||
bad = "source directory is empty";
|
||||
else if (!bad) {
|
||||
int j, dst_len = strlen(dest_dir);
|
||||
else {
|
||||
int j, dst_len;
|
||||
|
||||
if (last - first > 0) {
|
||||
source = realloc(source,
|
||||
@ -167,24 +179,21 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
||||
* sizeof(enum update_mode));
|
||||
}
|
||||
|
||||
dest_dir = add_slash(dest_dir);
|
||||
dst = add_slash(dst);
|
||||
dst_len = strlen(dst) - 1;
|
||||
|
||||
for (j = 0; j < last - first; j++) {
|
||||
const char *path =
|
||||
active_cache[first + j]->name;
|
||||
source[count + j] = path;
|
||||
destination[count + j] =
|
||||
prefix_path(dest_dir, dst_len,
|
||||
path + len);
|
||||
prefix_path(dst, dst_len,
|
||||
path + length);
|
||||
modes[count + j] = INDEX;
|
||||
}
|
||||
count += last - first;
|
||||
}
|
||||
|
||||
goto next;
|
||||
}
|
||||
|
||||
if (!bad && lstat(destination[i], &st) == 0) {
|
||||
} else if (lstat(dst, &st) == 0) {
|
||||
bad = "destination exists";
|
||||
if (force) {
|
||||
/*
|
||||
@ -196,28 +205,17 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
||||
" will overwrite!\n",
|
||||
bad);
|
||||
bad = NULL;
|
||||
path_list_insert(destination[i],
|
||||
&overwritten);
|
||||
path_list_insert(dst, &overwritten);
|
||||
} else
|
||||
bad = "Cannot overwrite";
|
||||
}
|
||||
}
|
||||
|
||||
if (!bad &&
|
||||
!strncmp(destination[i], source[i], strlen(source[i])))
|
||||
bad = "can not move directory into itself";
|
||||
|
||||
if (!bad && cache_name_pos(source[i], strlen(source[i])) < 0)
|
||||
} else if (cache_name_pos(src, length) < 0)
|
||||
bad = "not under version control";
|
||||
|
||||
if (!bad) {
|
||||
if (path_list_has_path(&src_for_dst, destination[i]))
|
||||
else if (path_list_has_path(&src_for_dst, dst))
|
||||
bad = "multiple sources for the same target";
|
||||
else
|
||||
path_list_insert(destination[i], &src_for_dst);
|
||||
}
|
||||
path_list_insert(dst, &src_for_dst);
|
||||
|
||||
next:
|
||||
if (bad) {
|
||||
if (ignore_errors) {
|
||||
if (--count > 0) {
|
||||
@ -229,33 +227,32 @@ next:
|
||||
}
|
||||
} else
|
||||
die ("%s, source=%s, destination=%s",
|
||||
bad, source[i], destination[i]);
|
||||
bad, src, dst);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
const char *src = source[i], *dst = destination[i];
|
||||
enum update_mode mode = modes[i];
|
||||
if (show_only || verbose)
|
||||
printf("Renaming %s to %s\n",
|
||||
source[i], destination[i]);
|
||||
if (!show_only && modes[i] != INDEX &&
|
||||
rename(source[i], destination[i]) < 0 &&
|
||||
!ignore_errors)
|
||||
die ("renaming %s failed: %s",
|
||||
source[i], strerror(errno));
|
||||
printf("Renaming %s to %s\n", src, dst);
|
||||
if (!show_only && mode != INDEX &&
|
||||
rename(src, dst) < 0 && !ignore_errors)
|
||||
die ("renaming %s failed: %s", src, strerror(errno));
|
||||
|
||||
if (modes[i] == WORKING_DIRECTORY)
|
||||
if (mode == WORKING_DIRECTORY)
|
||||
continue;
|
||||
|
||||
if (cache_name_pos(source[i], strlen(source[i])) >= 0) {
|
||||
path_list_insert(source[i], &deleted);
|
||||
if (cache_name_pos(src, strlen(src)) >= 0) {
|
||||
path_list_insert(src, &deleted);
|
||||
|
||||
/* destination can be a directory with 1 file inside */
|
||||
if (path_list_has_path(&overwritten, destination[i]))
|
||||
path_list_insert(destination[i], &changed);
|
||||
if (path_list_has_path(&overwritten, dst))
|
||||
path_list_insert(dst, &changed);
|
||||
else
|
||||
path_list_insert(destination[i], &added);
|
||||
path_list_insert(dst, &added);
|
||||
} else
|
||||
path_list_insert(destination[i], &added);
|
||||
path_list_insert(dst, &added);
|
||||
}
|
||||
|
||||
if (show_only) {
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include <stdlib.h>
|
||||
#include "builtin.h"
|
||||
#include "cache.h"
|
||||
#include "commit.h"
|
||||
#include "tag.h"
|
||||
@ -74,7 +75,7 @@ copy_data:
|
||||
}
|
||||
}
|
||||
|
||||
static int tags_only = 0;
|
||||
static int tags_only;
|
||||
|
||||
static int name_ref(const char *path, const unsigned char *sha1)
|
||||
{
|
||||
@ -126,12 +127,11 @@ static const char* get_rev_name(struct object *o)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int cmd_name_rev(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct object_array revs = { 0, 0, NULL };
|
||||
int as_is = 0, all = 0, transform_stdin = 0;
|
||||
|
||||
setup_git_directory();
|
||||
git_config(git_default_config);
|
||||
|
||||
if (argc < 2)
|
@ -1,3 +1,4 @@
|
||||
#include "builtin.h"
|
||||
#include "cache.h"
|
||||
#include "object.h"
|
||||
#include "blob.h"
|
||||
@ -52,17 +53,17 @@ struct object_entry {
|
||||
*/
|
||||
|
||||
static unsigned char object_list_sha1[20];
|
||||
static int non_empty = 0;
|
||||
static int no_reuse_delta = 0;
|
||||
static int local = 0;
|
||||
static int incremental = 0;
|
||||
static int non_empty;
|
||||
static int no_reuse_delta;
|
||||
static int local;
|
||||
static int incremental;
|
||||
static struct object_entry **sorted_by_sha, **sorted_by_type;
|
||||
static struct object_entry *objects = NULL;
|
||||
static int nr_objects = 0, nr_alloc = 0, nr_result = 0;
|
||||
static struct object_entry *objects;
|
||||
static int nr_objects, nr_alloc, nr_result;
|
||||
static const char *base_name;
|
||||
static unsigned char pack_file_sha1[20];
|
||||
static int progress = 1;
|
||||
static volatile sig_atomic_t progress_update = 0;
|
||||
static volatile sig_atomic_t progress_update;
|
||||
static int window = 10;
|
||||
|
||||
/*
|
||||
@ -71,8 +72,8 @@ static int window = 10;
|
||||
* sorted_by_sha is also possible but this was easier to code and faster.
|
||||
* This hashtable is built after all the objects are seen.
|
||||
*/
|
||||
static int *object_ix = NULL;
|
||||
static int object_ix_hashsz = 0;
|
||||
static int *object_ix;
|
||||
static int object_ix_hashsz;
|
||||
|
||||
/*
|
||||
* Pack index for existing packs give us easy access to the offsets into
|
||||
@ -89,15 +90,15 @@ struct pack_revindex {
|
||||
struct packed_git *p;
|
||||
unsigned long *revindex;
|
||||
} *pack_revindex = NULL;
|
||||
static int pack_revindex_hashsz = 0;
|
||||
static int pack_revindex_hashsz;
|
||||
|
||||
/*
|
||||
* stats
|
||||
*/
|
||||
static int written = 0;
|
||||
static int written_delta = 0;
|
||||
static int reused = 0;
|
||||
static int reused_delta = 0;
|
||||
static int written;
|
||||
static int written_delta;
|
||||
static int reused;
|
||||
static int reused_delta;
|
||||
|
||||
static int pack_revindex_ix(struct packed_git *p)
|
||||
{
|
||||
@ -269,6 +270,22 @@ static unsigned long write_object(struct sha1file *f,
|
||||
* and we do not need to deltify it.
|
||||
*/
|
||||
|
||||
if (!entry->in_pack && !entry->delta) {
|
||||
unsigned char *map;
|
||||
unsigned long mapsize;
|
||||
map = map_sha1_file(entry->sha1, &mapsize);
|
||||
if (map && !legacy_loose_object(map)) {
|
||||
/* We can copy straight into the pack file */
|
||||
sha1write(f, map, mapsize);
|
||||
munmap(map, mapsize);
|
||||
written++;
|
||||
reused++;
|
||||
return mapsize;
|
||||
}
|
||||
if (map)
|
||||
munmap(map, mapsize);
|
||||
}
|
||||
|
||||
if (! to_reuse) {
|
||||
buf = read_sha1_file(entry->sha1, type, &size);
|
||||
if (!buf)
|
||||
@ -424,7 +441,7 @@ static int locate_object_entry_hash(const unsigned char *sha1)
|
||||
memcpy(&ui, sha1, sizeof(unsigned int));
|
||||
i = ui % object_ix_hashsz;
|
||||
while (0 < object_ix[i]) {
|
||||
if (!memcmp(sha1, objects[object_ix[i]-1].sha1, 20))
|
||||
if (!hashcmp(sha1, objects[object_ix[i] - 1].sha1))
|
||||
return i;
|
||||
if (++i == object_ix_hashsz)
|
||||
i = 0;
|
||||
@ -517,7 +534,7 @@ static int add_object_entry(const unsigned char *sha1, unsigned hash, int exclud
|
||||
entry = objects + idx;
|
||||
nr_objects = idx + 1;
|
||||
memset(entry, 0, sizeof(*entry));
|
||||
memcpy(entry->sha1, sha1, 20);
|
||||
hashcpy(entry->sha1, sha1);
|
||||
entry->hash = hash;
|
||||
|
||||
if (object_ix_hashsz * 3 <= nr_objects * 4)
|
||||
@ -590,7 +607,7 @@ static struct pbase_tree_cache *pbase_tree_get(const unsigned char *sha1)
|
||||
*/
|
||||
for (neigh = 0; neigh < 8; neigh++) {
|
||||
ent = pbase_tree_cache[my_ix];
|
||||
if (ent && !memcmp(ent->sha1, sha1, 20)) {
|
||||
if (ent && !hashcmp(ent->sha1, sha1)) {
|
||||
ent->ref++;
|
||||
return ent;
|
||||
}
|
||||
@ -632,7 +649,7 @@ static struct pbase_tree_cache *pbase_tree_get(const unsigned char *sha1)
|
||||
free(ent->tree_data);
|
||||
nent = ent;
|
||||
}
|
||||
memcpy(nent->sha1, sha1, 20);
|
||||
hashcpy(nent->sha1, sha1);
|
||||
nent->tree_data = data;
|
||||
nent->tree_size = size;
|
||||
nent->ref = 1;
|
||||
@ -772,7 +789,7 @@ static void add_preferred_base(unsigned char *sha1)
|
||||
return;
|
||||
|
||||
for (it = pbase_tree; it; it = it->next) {
|
||||
if (!memcmp(it->pcache.sha1, tree_sha1, 20)) {
|
||||
if (!hashcmp(it->pcache.sha1, tree_sha1)) {
|
||||
free(data);
|
||||
return;
|
||||
}
|
||||
@ -782,7 +799,7 @@ static void add_preferred_base(unsigned char *sha1)
|
||||
it->next = pbase_tree;
|
||||
pbase_tree = it;
|
||||
|
||||
memcpy(it->pcache.sha1, tree_sha1, 20);
|
||||
hashcpy(it->pcache.sha1, tree_sha1);
|
||||
it->pcache.tree_data = data;
|
||||
it->pcache.tree_size = size;
|
||||
}
|
||||
@ -914,7 +931,7 @@ static struct object_entry **create_sorted_list(entry_sort_t sort)
|
||||
|
||||
static int sha1_sort(const struct object_entry *a, const struct object_entry *b)
|
||||
{
|
||||
return memcmp(a->sha1, b->sha1, 20);
|
||||
return hashcmp(a->sha1, b->sha1);
|
||||
}
|
||||
|
||||
static struct object_entry **create_final_object_list(void)
|
||||
@ -1226,7 +1243,7 @@ static int git_pack_config(const char *k, const char *v)
|
||||
return git_default_config(k, v);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
SHA_CTX ctx;
|
||||
char line[40 + 1 + PATH_MAX + 2];
|
||||
@ -1235,7 +1252,6 @@ int main(int argc, char **argv)
|
||||
int num_preferred_base = 0;
|
||||
int i;
|
||||
|
||||
setup_git_directory();
|
||||
git_config(git_pack_config);
|
||||
|
||||
progress = isatty(2);
|
@ -11,7 +11,7 @@
|
||||
#include "cache-tree.h"
|
||||
|
||||
static const char prune_usage[] = "git-prune [-n]";
|
||||
static int show_only = 0;
|
||||
static int show_only;
|
||||
static struct rev_info revs;
|
||||
|
||||
static int prune_object(char *path, const char *filename, const unsigned char *sha1)
|
||||
|
@ -10,14 +10,14 @@
|
||||
|
||||
static const char push_usage[] = "git-push [--all] [--tags] [-f | --force] <repository> [<refspec>...]";
|
||||
|
||||
static int all = 0, tags = 0, force = 0, thin = 1;
|
||||
static const char *execute = NULL;
|
||||
static int all, tags, force, thin = 1;
|
||||
static const char *execute;
|
||||
|
||||
#define BUF_SIZE (2084)
|
||||
static char buffer[BUF_SIZE];
|
||||
|
||||
static const char **refspec = NULL;
|
||||
static int refspec_nr = 0;
|
||||
static const char **refspec;
|
||||
static int refspec_nr;
|
||||
|
||||
static void add_refspec(const char *ref)
|
||||
{
|
||||
@ -32,9 +32,7 @@ static int expand_one_ref(const char *ref, const unsigned char *sha1)
|
||||
/* Ignore the "refs/" at the beginning of the refname */
|
||||
ref += 5;
|
||||
|
||||
if (strncmp(ref, "tags/", 5))
|
||||
return 0;
|
||||
|
||||
if (!strncmp(ref, "tags/", 5))
|
||||
add_refspec(strdup(ref));
|
||||
return 0;
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include "unpack-trees.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static struct object_list *trees = NULL;
|
||||
static struct object_list *trees;
|
||||
|
||||
static int list_tree(unsigned char *sha1)
|
||||
{
|
||||
@ -53,7 +53,7 @@ static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree)
|
||||
struct name_entry entry;
|
||||
int cnt;
|
||||
|
||||
memcpy(it->sha1, tree->object.sha1, 20);
|
||||
hashcpy(it->sha1, tree->object.sha1);
|
||||
desc.buf = tree->buffer;
|
||||
desc.size = tree->size;
|
||||
cnt = 0;
|
||||
|
@ -5,14 +5,14 @@
|
||||
static const char git_config_set_usage[] =
|
||||
"git-repo-config [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --unset | --unset-all] name [value [value_regex]] | --list";
|
||||
|
||||
static char* key = NULL;
|
||||
static regex_t* key_regexp = NULL;
|
||||
static regex_t* regexp = NULL;
|
||||
static int show_keys = 0;
|
||||
static int use_key_regexp = 0;
|
||||
static int do_all = 0;
|
||||
static int do_not_match = 0;
|
||||
static int seen = 0;
|
||||
static char *key;
|
||||
static regex_t *key_regexp;
|
||||
static regex_t *regexp;
|
||||
static int show_keys;
|
||||
static int use_key_regexp;
|
||||
static int do_all;
|
||||
static int do_not_match;
|
||||
static int seen;
|
||||
static enum { T_RAW, T_INT, T_BOOL } type = T_RAW;
|
||||
|
||||
static int show_all_config(const char *key_, const char *value_)
|
||||
|
@ -39,9 +39,9 @@ static const char rev_list_usage[] =
|
||||
|
||||
static struct rev_info revs;
|
||||
|
||||
static int bisect_list = 0;
|
||||
static int show_timestamp = 0;
|
||||
static int hdr_termination = 0;
|
||||
static int bisect_list;
|
||||
static int show_timestamp;
|
||||
static int hdr_termination;
|
||||
static const char *header_prefix;
|
||||
|
||||
static void show_commit(struct commit *commit)
|
||||
|
@ -15,16 +15,16 @@
|
||||
#define DO_NONFLAGS 8
|
||||
static int filter = ~0;
|
||||
|
||||
static const char *def = NULL;
|
||||
static const char *def;
|
||||
|
||||
#define NORMAL 0
|
||||
#define REVERSED 1
|
||||
static int show_type = NORMAL;
|
||||
static int symbolic = 0;
|
||||
static int abbrev = 0;
|
||||
static int output_sq = 0;
|
||||
static int symbolic;
|
||||
static int abbrev;
|
||||
static int output_sq;
|
||||
|
||||
static int revs_count = 0;
|
||||
static int revs_count;
|
||||
|
||||
/*
|
||||
* Some arguments are relevant "revision" arguments,
|
||||
|
@ -8,9 +8,9 @@
|
||||
static const char show_branch_usage[] =
|
||||
"git-show-branch [--sparse] [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...]";
|
||||
|
||||
static int default_num = 0;
|
||||
static int default_alloc = 0;
|
||||
static const char **default_arg = NULL;
|
||||
static int default_num;
|
||||
static int default_alloc;
|
||||
static const char **default_arg;
|
||||
|
||||
#define UNINTERESTING 01
|
||||
|
||||
@ -378,7 +378,7 @@ static int append_head_ref(const char *refname, const unsigned char *sha1)
|
||||
/* If both heads/foo and tags/foo exists, get_sha1 would
|
||||
* get confused.
|
||||
*/
|
||||
if (get_sha1(refname + ofs, tmp) || memcmp(tmp, sha1, 20))
|
||||
if (get_sha1(refname + ofs, tmp) || hashcmp(tmp, sha1))
|
||||
ofs = 5;
|
||||
return append_ref(refname + ofs, sha1);
|
||||
}
|
||||
@ -442,7 +442,7 @@ static int rev_is_head(char *head_path, int headlen, char *name,
|
||||
{
|
||||
int namelen;
|
||||
if ((!head_path[0]) ||
|
||||
(head_sha1 && sha1 && memcmp(head_sha1, sha1, 20)))
|
||||
(head_sha1 && sha1 && hashcmp(head_sha1, sha1)))
|
||||
return 0;
|
||||
namelen = strlen(name);
|
||||
if ((headlen < namelen) ||
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include "builtin.h"
|
||||
#include "cache.h"
|
||||
|
||||
static const char git_symbolic_ref_usage[] =
|
||||
@ -17,9 +18,8 @@ static void check_symref(const char *HEAD)
|
||||
die("No such ref: %s", HEAD);
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
int cmd_symbolic_ref(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
setup_git_directory();
|
||||
git_config(git_default_config);
|
||||
switch (argc) {
|
||||
case 2:
|
@ -14,7 +14,7 @@
|
||||
#define BLOCKSIZE (RECORDSIZE * 20)
|
||||
|
||||
static const char tar_tree_usage[] =
|
||||
"git-tar-tree [--remote=<repo>] <ent> [basedir]";
|
||||
"git-tar-tree [--remote=<repo>] <tree-ish> [basedir]";
|
||||
|
||||
static char block[BLOCKSIZE];
|
||||
static unsigned long offset;
|
||||
@ -22,30 +22,11 @@ static unsigned long offset;
|
||||
static time_t archive_time;
|
||||
static int tar_umask;
|
||||
|
||||
/* tries hard to write, either succeeds or dies in the attempt */
|
||||
static void reliable_write(const void *data, unsigned long size)
|
||||
{
|
||||
const char *buf = data;
|
||||
|
||||
while (size > 0) {
|
||||
long ret = xwrite(1, buf, size);
|
||||
if (ret < 0) {
|
||||
if (errno == EPIPE)
|
||||
exit(0);
|
||||
die("git-tar-tree: %s", strerror(errno));
|
||||
} else if (!ret) {
|
||||
die("git-tar-tree: disk full?");
|
||||
}
|
||||
size -= ret;
|
||||
buf += ret;
|
||||
}
|
||||
}
|
||||
|
||||
/* writes out the whole block, but only if it is full */
|
||||
static void write_if_needed(void)
|
||||
{
|
||||
if (offset == BLOCKSIZE) {
|
||||
reliable_write(block, BLOCKSIZE);
|
||||
write_or_die(1, block, BLOCKSIZE);
|
||||
offset = 0;
|
||||
}
|
||||
}
|
||||
@ -70,7 +51,7 @@ static void write_blocked(const void *data, unsigned long size)
|
||||
write_if_needed();
|
||||
}
|
||||
while (size >= BLOCKSIZE) {
|
||||
reliable_write(buf, BLOCKSIZE);
|
||||
write_or_die(1, buf, BLOCKSIZE);
|
||||
size -= BLOCKSIZE;
|
||||
buf += BLOCKSIZE;
|
||||
}
|
||||
@ -94,10 +75,10 @@ static void write_trailer(void)
|
||||
{
|
||||
int tail = BLOCKSIZE - offset;
|
||||
memset(block + offset, 0, tail);
|
||||
reliable_write(block, BLOCKSIZE);
|
||||
write_or_die(1, block, BLOCKSIZE);
|
||||
if (tail < 2 * RECORDSIZE) {
|
||||
memset(block, 0, offset);
|
||||
reliable_write(block, BLOCKSIZE);
|
||||
write_or_die(1, block, BLOCKSIZE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include "builtin.h"
|
||||
#include "cache.h"
|
||||
#include "object.h"
|
||||
#include "delta.h"
|
||||
@ -94,7 +95,7 @@ static void add_delta_to_list(unsigned char *base_sha1, void *delta, unsigned lo
|
||||
{
|
||||
struct delta_info *info = xmalloc(sizeof(*info));
|
||||
|
||||
memcpy(info->base_sha1, base_sha1, 20);
|
||||
hashcpy(info->base_sha1, base_sha1);
|
||||
info->size = size;
|
||||
info->delta = delta;
|
||||
info->next = delta_list;
|
||||
@ -135,7 +136,7 @@ static void added_object(unsigned char *sha1, const char *type, void *data, unsi
|
||||
struct delta_info *info;
|
||||
|
||||
while ((info = *p) != NULL) {
|
||||
if (!memcmp(info->base_sha1, sha1, 20)) {
|
||||
if (!hashcmp(info->base_sha1, sha1)) {
|
||||
*p = info->next;
|
||||
p = &delta_list;
|
||||
resolve_delta(type, data, size, info->delta, info->size);
|
||||
@ -172,7 +173,7 @@ static int unpack_delta_entry(unsigned long delta_size)
|
||||
unsigned char base_sha1[20];
|
||||
int result;
|
||||
|
||||
memcpy(base_sha1, fill(20), 20);
|
||||
hashcpy(base_sha1, fill(20));
|
||||
use(20);
|
||||
|
||||
delta_data = get_data(delta_size);
|
||||
@ -260,12 +261,12 @@ static void unpack_all(void)
|
||||
die("unresolved deltas left after unpacking");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
int i;
|
||||
unsigned char sha1[20];
|
||||
|
||||
setup_git_directory();
|
||||
git_config(git_default_config);
|
||||
|
||||
quiet = !isatty(2);
|
||||
|
||||
@ -291,7 +292,7 @@ int main(int argc, char **argv)
|
||||
unpack_all();
|
||||
SHA1_Update(&ctx, buffer, offset);
|
||||
SHA1_Final(sha1, &ctx);
|
||||
if (memcmp(fill(20), sha1, 20))
|
||||
if (hashcmp(fill(20), sha1))
|
||||
die("final sha1 did not match");
|
||||
use(20);
|
||||
|
@ -23,7 +23,7 @@ static int allow_replace;
|
||||
static int info_only;
|
||||
static int force_remove;
|
||||
static int verbose;
|
||||
static int mark_valid_only = 0;
|
||||
static int mark_valid_only;
|
||||
#define MARK_VALID 1
|
||||
#define UNMARK_VALID 2
|
||||
|
||||
@ -142,7 +142,7 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
|
||||
size = cache_entry_size(len);
|
||||
ce = xcalloc(1, size);
|
||||
|
||||
memcpy(ce->sha1, sha1, 20);
|
||||
hashcpy(ce->sha1, sha1);
|
||||
memcpy(ce->name, path, len);
|
||||
ce->ce_flags = create_ce_flags(len, stage);
|
||||
ce->ce_mode = create_ce_mode(mode);
|
||||
@ -333,7 +333,7 @@ static struct cache_entry *read_one_ent(const char *which,
|
||||
size = cache_entry_size(namelen);
|
||||
ce = xcalloc(1, size);
|
||||
|
||||
memcpy(ce->sha1, sha1, 20);
|
||||
hashcpy(ce->sha1, sha1);
|
||||
memcpy(ce->name, path, namelen);
|
||||
ce->ce_flags = create_ce_flags(namelen, stage);
|
||||
ce->ce_mode = create_ce_mode(mode);
|
||||
@ -378,7 +378,7 @@ static int unresolve_one(const char *path)
|
||||
ret = -1;
|
||||
goto free_return;
|
||||
}
|
||||
if (!memcmp(ce_2->sha1, ce_3->sha1, 20) &&
|
||||
if (!hashcmp(ce_2->sha1, ce_3->sha1) &&
|
||||
ce_2->ce_mode == ce_3->ce_mode) {
|
||||
fprintf(stderr, "%s: identical in both, skipping.\n",
|
||||
path);
|
||||
@ -460,7 +460,7 @@ static int do_reupdate(int ac, const char **av,
|
||||
old = read_one_ent(NULL, head_sha1,
|
||||
ce->name, ce_namelen(ce), 0);
|
||||
if (old && ce->ce_mode == old->ce_mode &&
|
||||
!memcmp(ce->sha1, old->sha1, 20)) {
|
||||
!hashcmp(ce->sha1, old->sha1)) {
|
||||
free(old);
|
||||
continue; /* unchanged */
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
|
||||
|
||||
if (get_sha1(value, sha1))
|
||||
die("%s: not a valid SHA1", value);
|
||||
memset(oldsha1, 0, 20);
|
||||
hashclr(oldsha1);
|
||||
if (oldval && get_sha1(oldval, oldsha1))
|
||||
die("%s: not a valid old SHA1", oldval);
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include "builtin.h"
|
||||
#include "cache.h"
|
||||
#include "pack.h"
|
||||
|
||||
@ -47,28 +48,28 @@ static int verify_one_pack(const char *path, int verbose)
|
||||
|
||||
static const char verify_pack_usage[] = "git-verify-pack [-v] <pack>...";
|
||||
|
||||
int main(int ac, char **av)
|
||||
int cmd_verify_pack(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
int err = 0;
|
||||
int verbose = 0;
|
||||
int no_more_options = 0;
|
||||
int nothing_done = 1;
|
||||
|
||||
while (1 < ac) {
|
||||
if (!no_more_options && av[1][0] == '-') {
|
||||
if (!strcmp("-v", av[1]))
|
||||
while (1 < argc) {
|
||||
if (!no_more_options && argv[1][0] == '-') {
|
||||
if (!strcmp("-v", argv[1]))
|
||||
verbose = 1;
|
||||
else if (!strcmp("--", av[1]))
|
||||
else if (!strcmp("--", argv[1]))
|
||||
no_more_options = 1;
|
||||
else
|
||||
usage(verify_pack_usage);
|
||||
}
|
||||
else {
|
||||
if (verify_one_pack(av[1], verbose))
|
||||
if (verify_one_pack(argv[1], verbose))
|
||||
err = 1;
|
||||
nothing_done = 0;
|
||||
}
|
||||
ac--; av++;
|
||||
argc--; argv++;
|
||||
}
|
||||
|
||||
if (nothing_done)
|
@ -50,10 +50,10 @@ int write_tree(unsigned char *sha1, int missing_ok, const char *prefix)
|
||||
if (prefix) {
|
||||
struct cache_tree *subtree =
|
||||
cache_tree_find(active_cache_tree, prefix);
|
||||
memcpy(sha1, subtree->sha1, 20);
|
||||
hashcpy(sha1, subtree->sha1);
|
||||
}
|
||||
else
|
||||
memcpy(sha1, active_cache_tree->sha1, 20);
|
||||
hashcpy(sha1, active_cache_tree->sha1);
|
||||
|
||||
rollback_lock_file(lock_file);
|
||||
|
||||
|
98
builtin.h
98
builtin.h
@ -8,57 +8,57 @@ extern const char git_version_string[];
|
||||
extern const char git_usage_string[];
|
||||
|
||||
extern void help_unknown_cmd(const char *cmd);
|
||||
|
||||
extern int cmd_help(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_version(int argc, const char **argv, const char *prefix);
|
||||
|
||||
extern int cmd_whatchanged(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_show(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_log(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_format_patch(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_count_objects(int argc, const char **argv, const char *prefix);
|
||||
|
||||
extern int cmd_prune(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
|
||||
|
||||
extern int cmd_push(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_grep(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_rm(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_add(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_rev_list(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_init_db(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_tar_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_upload_tar(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_ls_files(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_ls_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_read_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_commit_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_apply(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff_files(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff_index(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff_stages(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_cat_file(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_update_index(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_update_ref(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_mv(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_repo_config(int argc, const char **argv, const char *prefix);
|
||||
|
||||
extern int cmd_write_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int mailinfo(FILE *in, FILE *out, int ks, const char *encoding, const char *msg, const char *patch);
|
||||
extern int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip);
|
||||
extern void stripspace(FILE *in, FILE *out);
|
||||
extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
|
||||
|
||||
extern int cmd_mailsplit(int argc, const char **argv, const char *prefix);
|
||||
extern int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip);
|
||||
|
||||
extern int cmd_add(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_apply(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_cat_file(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_checkout_index(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_commit_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_count_objects(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff_files(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff_index(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff_stages(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_format_patch(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_grep(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_help(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_init_db(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_log(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_ls_files(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_ls_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_mailinfo(int argc, const char **argv, const char *prefix);
|
||||
extern int mailinfo(FILE *in, FILE *out, int ks, const char *encoding, const char *msg, const char *patch);
|
||||
|
||||
extern int cmd_mailsplit(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_mv(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_name_rev(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_pack_objects(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_prune(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_push(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_read_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_repo_config(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_rev_list(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_rm(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_show(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
|
||||
extern void stripspace(FILE *in, FILE *out);
|
||||
extern int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_tar_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_unpack_objects(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_update_index(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_update_ref(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_upload_tar(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_version(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_whatchanged(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_write_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_verify_pack(int argc, const char **argv, const char *prefix);
|
||||
|
||||
#endif
|
||||
|
@ -335,7 +335,7 @@ static int update_one(struct cache_tree *it,
|
||||
offset += sprintf(buffer + offset,
|
||||
"%o %.*s", mode, entlen, path + baselen);
|
||||
buffer[offset++] = 0;
|
||||
memcpy(buffer + offset, sha1, 20);
|
||||
hashcpy((unsigned char*)buffer + offset, sha1);
|
||||
offset += 20;
|
||||
|
||||
#if DEBUG
|
||||
@ -412,7 +412,7 @@ static void *write_one(struct cache_tree *it,
|
||||
#endif
|
||||
|
||||
if (0 <= it->entry_count) {
|
||||
memcpy(buffer + *offset, it->sha1, 20);
|
||||
hashcpy((unsigned char*)buffer + *offset, it->sha1);
|
||||
*offset += 20;
|
||||
}
|
||||
for (i = 0; i < it->subtree_nr; i++) {
|
||||
@ -478,7 +478,7 @@ static struct cache_tree *read_one(const char **buffer, unsigned long *size_p)
|
||||
if (0 <= it->entry_count) {
|
||||
if (size < 20)
|
||||
goto free_return;
|
||||
memcpy(it->sha1, buf, 20);
|
||||
hashcpy(it->sha1, (unsigned char*)buf);
|
||||
buf += 20;
|
||||
size -= 20;
|
||||
}
|
||||
|
19
cache.h
19
cache.h
@ -211,6 +211,22 @@ extern char *sha1_pack_name(const unsigned char *sha1);
|
||||
extern char *sha1_pack_index_name(const unsigned char *sha1);
|
||||
extern const char *find_unique_abbrev(const unsigned char *sha1, int);
|
||||
extern const unsigned char null_sha1[20];
|
||||
static inline int is_null_sha1(const unsigned char *sha1)
|
||||
{
|
||||
return !memcmp(sha1, null_sha1, 20);
|
||||
}
|
||||
static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
|
||||
{
|
||||
return memcmp(sha1, sha2, 20);
|
||||
}
|
||||
static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src)
|
||||
{
|
||||
memcpy(sha_dst, sha_src, 20);
|
||||
}
|
||||
static inline void hashclr(unsigned char *hash)
|
||||
{
|
||||
memset(hash, 0, 20);
|
||||
}
|
||||
|
||||
int git_mkstemp(char *path, size_t n, const char *template);
|
||||
|
||||
@ -245,6 +261,8 @@ extern int move_temp_to_file(const char *tmpfile, char *filename);
|
||||
|
||||
extern int has_sha1_pack(const unsigned char *sha1);
|
||||
extern int has_sha1_file(const unsigned char *sha1);
|
||||
extern void *map_sha1_file(const unsigned char *sha1, unsigned long *);
|
||||
extern int legacy_loose_object(unsigned char *);
|
||||
|
||||
extern int has_pack_file(const unsigned char *sha1);
|
||||
extern int has_pack_index(const unsigned char *sha1);
|
||||
@ -379,6 +397,7 @@ extern char git_default_name[MAX_GITNAME];
|
||||
extern char git_commit_encoding[MAX_ENCODING_LENGTH];
|
||||
|
||||
extern int copy_fd(int ifd, int ofd);
|
||||
extern void write_or_die(int fd, const void *buf, size_t count);
|
||||
|
||||
/* Finish off pack transfer receiving end */
|
||||
extern int receive_unpack_pack(int fd[2], const char *me, int quiet, int);
|
||||
|
28
check-racy.c
Normal file
28
check-racy.c
Normal file
@ -0,0 +1,28 @@
|
||||
#include "cache.h"
|
||||
|
||||
int main(int ac, char **av)
|
||||
{
|
||||
int i;
|
||||
int dirty, clean, racy;
|
||||
|
||||
dirty = clean = racy = 0;
|
||||
read_cache();
|
||||
for (i = 0; i < active_nr; i++) {
|
||||
struct cache_entry *ce = active_cache[i];
|
||||
struct stat st;
|
||||
|
||||
if (lstat(ce->name, &st)) {
|
||||
error("lstat(%s): %s", ce->name, strerror(errno));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ce_match_stat(ce, &st, 0))
|
||||
dirty++;
|
||||
else if (ce_match_stat(ce, &st, 2))
|
||||
racy++;
|
||||
else
|
||||
clean++;
|
||||
}
|
||||
printf("dirty %d, clean %d, racy %d\n", dirty, clean, racy);
|
||||
return 0;
|
||||
}
|
@ -7,13 +7,6 @@
|
||||
#include "xdiff-interface.h"
|
||||
#include "log-tree.h"
|
||||
|
||||
static int uninteresting(struct diff_filepair *p)
|
||||
{
|
||||
if (diff_unmodified_pair(p))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent)
|
||||
{
|
||||
struct diff_queue_struct *q = &diff_queued_diff;
|
||||
@ -25,7 +18,7 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
|
||||
for (i = 0; i < q->nr; i++) {
|
||||
int len;
|
||||
const char *path;
|
||||
if (uninteresting(q->queue[i]))
|
||||
if (diff_unmodified_pair(q->queue[i]))
|
||||
continue;
|
||||
path = q->queue[i]->two->path;
|
||||
len = strlen(path);
|
||||
@ -38,9 +31,9 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
|
||||
memset(p->parent, 0,
|
||||
sizeof(p->parent[0]) * num_parent);
|
||||
|
||||
memcpy(p->sha1, q->queue[i]->two->sha1, 20);
|
||||
hashcpy(p->sha1, q->queue[i]->two->sha1);
|
||||
p->mode = q->queue[i]->two->mode;
|
||||
memcpy(p->parent[n].sha1, q->queue[i]->one->sha1, 20);
|
||||
hashcpy(p->parent[n].sha1, q->queue[i]->one->sha1);
|
||||
p->parent[n].mode = q->queue[i]->one->mode;
|
||||
p->parent[n].status = q->queue[i]->status;
|
||||
*tail = p;
|
||||
@ -57,14 +50,13 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
|
||||
const char *path;
|
||||
int len;
|
||||
|
||||
if (uninteresting(q->queue[i]))
|
||||
if (diff_unmodified_pair(q->queue[i]))
|
||||
continue;
|
||||
path = q->queue[i]->two->path;
|
||||
len = strlen(path);
|
||||
if (len == p->len && !memcmp(path, p->path, len)) {
|
||||
found = 1;
|
||||
memcpy(p->parent[n].sha1,
|
||||
q->queue[i]->one->sha1, 20);
|
||||
hashcpy(p->parent[n].sha1, q->queue[i]->one->sha1);
|
||||
p->parent[n].mode = q->queue[i]->one->mode;
|
||||
p->parent[n].status = q->queue[i]->status;
|
||||
break;
|
||||
@ -101,7 +93,7 @@ static char *grab_blob(const unsigned char *sha1, unsigned long *size)
|
||||
{
|
||||
char *blob;
|
||||
char type[20];
|
||||
if (!memcmp(sha1, null_sha1, 20)) {
|
||||
if (is_null_sha1(sha1)) {
|
||||
/* deleted blob */
|
||||
*size = 0;
|
||||
return xcalloc(1, 1);
|
||||
@ -609,7 +601,7 @@ static void dump_quoted_path(const char *prefix, const char *path,
|
||||
printf("%s\n", c_reset);
|
||||
}
|
||||
|
||||
static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
||||
static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
||||
int dense, struct rev_info *rev)
|
||||
{
|
||||
struct diff_options *opt = &rev->diffopt;
|
||||
@ -617,8 +609,8 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
||||
char *result, *cp;
|
||||
struct sline *sline; /* survived lines */
|
||||
int mode_differs = 0;
|
||||
int i, show_hunks, shown_header = 0;
|
||||
int working_tree_file = !memcmp(elem->sha1, null_sha1, 20);
|
||||
int i, show_hunks;
|
||||
int working_tree_file = is_null_sha1(elem->sha1);
|
||||
int abbrev = opt->full_index ? 40 : DEFAULT_ABBREV;
|
||||
mmfile_t result_file;
|
||||
|
||||
@ -695,8 +687,8 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
||||
for (i = 0; i < num_parent; i++) {
|
||||
int j;
|
||||
for (j = 0; j < i; j++) {
|
||||
if (!memcmp(elem->parent[i].sha1,
|
||||
elem->parent[j].sha1, 20)) {
|
||||
if (!hashcmp(elem->parent[i].sha1,
|
||||
elem->parent[j].sha1)) {
|
||||
reuse_combine_diff(sline, cnt, i, j);
|
||||
break;
|
||||
}
|
||||
@ -769,7 +761,6 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
||||
}
|
||||
free(sline[0].p_lno);
|
||||
free(sline);
|
||||
return shown_header;
|
||||
}
|
||||
|
||||
#define COLONS "::::::::::::::::::::::::::::::::"
|
||||
@ -837,12 +828,11 @@ void show_combined_diff(struct combine_diff_path *p,
|
||||
return;
|
||||
if (opt->output_format & (DIFF_FORMAT_RAW |
|
||||
DIFF_FORMAT_NAME |
|
||||
DIFF_FORMAT_NAME_STATUS)) {
|
||||
DIFF_FORMAT_NAME_STATUS))
|
||||
show_raw_diff(p, num_parent, rev);
|
||||
} else if (opt->output_format & DIFF_FORMAT_PATCH) {
|
||||
else if (opt->output_format & DIFF_FORMAT_PATCH)
|
||||
show_patch_diff(p, num_parent, dense, rev);
|
||||
}
|
||||
}
|
||||
|
||||
void diff_tree_combined(const unsigned char *sha1,
|
||||
const unsigned char parent[][20],
|
||||
@ -936,6 +926,7 @@ void diff_tree_combined_merge(const unsigned char *sha1,
|
||||
for (parents = commit->parents, num_parent = 0;
|
||||
parents;
|
||||
parents = parents->next, num_parent++)
|
||||
memcpy(parent + num_parent, parents->item->object.sha1, 20);
|
||||
hashcpy((unsigned char*)(parent + num_parent),
|
||||
parents->item->object.sha1);
|
||||
diff_tree_combined(sha1, parent, num_parent, dense, rev);
|
||||
}
|
||||
|
4
commit.c
4
commit.c
@ -123,7 +123,7 @@ static int commit_graft_pos(const unsigned char *sha1)
|
||||
while (lo < hi) {
|
||||
int mi = (lo + hi) / 2;
|
||||
struct commit_graft *graft = commit_graft[mi];
|
||||
int cmp = memcmp(sha1, graft->sha1, 20);
|
||||
int cmp = hashcmp(sha1, graft->sha1);
|
||||
if (!cmp)
|
||||
return mi;
|
||||
if (cmp < 0)
|
||||
@ -727,7 +727,7 @@ struct commit *pop_commit(struct commit_list **stack)
|
||||
|
||||
int count_parents(struct commit * commit)
|
||||
{
|
||||
int count = 0;
|
||||
int count;
|
||||
struct commit_list * parents = commit->parents;
|
||||
for (count = 0; parents; parents = parents->next,count++)
|
||||
;
|
||||
|
@ -22,3 +22,19 @@ VPATH = @srcdir@
|
||||
export exec_prefix mandir
|
||||
export srcdir VPATH
|
||||
|
||||
NO_PYTHON=@NO_PYTHON@
|
||||
NEEDS_SSL_WITH_CRYPTO=@NEEDS_SSL_WITH_CRYPTO@
|
||||
NO_OPENSSL=@NO_OPENSSL@
|
||||
NO_CURL=@NO_CURL@
|
||||
NO_EXPAT=@NO_EXPAT@
|
||||
NEEDS_LIBICONV=@NEEDS_LIBICONV@
|
||||
NEEDS_SOCKET=@NEEDS_SOCKET@
|
||||
NO_D_INO_IN_DIRENT=@NO_D_INO_IN_DIRENT@
|
||||
NO_D_TYPE_IN_DIRENT=@NO_D_TYPE_IN_DIRENT@
|
||||
NO_SOCKADDR_STORAGE=@NO_SOCKADDR_STORAGE@
|
||||
NO_IPV6=@NO_IPV6@
|
||||
NO_C99_FORMAT=@NO_C99_FORMAT@
|
||||
NO_STRCASESTR=@NO_STRCASESTR@
|
||||
NO_STRLCPY=@NO_STRLCPY@
|
||||
NO_SETENV=@NO_SETENV@
|
||||
|
||||
|
242
configure.ac
242
configure.ac
@ -2,7 +2,7 @@
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.59)
|
||||
AC_INIT([git], [1.4.2], [git@vger.kernel.org])
|
||||
AC_INIT([git], [@@GIT_VERSION@@], [git@vger.kernel.org])
|
||||
|
||||
AC_CONFIG_SRCDIR([git.c])
|
||||
|
||||
@ -19,6 +19,77 @@ echo "# ${config_append}. Generated by configure." > "${config_append}"
|
||||
# Append LINE to file ${config_append}
|
||||
AC_DEFUN([GIT_CONF_APPEND_LINE],
|
||||
[echo "$1" >> "${config_append}"])# GIT_CONF_APPEND_LINE
|
||||
#
|
||||
# GIT_ARG_SET_PATH(PROGRAM)
|
||||
# -------------------------
|
||||
# Provide --with-PROGRAM=PATH option to set PATH to PROGRAM
|
||||
AC_DEFUN([GIT_ARG_SET_PATH],
|
||||
[AC_ARG_WITH([$1],
|
||||
[AS_HELP_STRING([--with-$1=PATH],
|
||||
[provide PATH to $1])],
|
||||
[GIT_CONF_APPEND_PATH($1)],[])
|
||||
])# GIT_ARG_SET_PATH
|
||||
#
|
||||
# GIT_CONF_APPEND_PATH(PROGRAM)
|
||||
# ------------------------------
|
||||
# Parse --with-PROGRAM=PATH option to set PROGRAM_PATH=PATH
|
||||
# Used by GIT_ARG_SET_PATH(PROGRAM)
|
||||
AC_DEFUN([GIT_CONF_APPEND_PATH],
|
||||
[PROGRAM=m4_toupper($1); \
|
||||
if test "$withval" = "no"; then \
|
||||
AC_MSG_ERROR([You cannot use git without $1]); \
|
||||
else \
|
||||
if test "$withval" = "yes"; then \
|
||||
AC_MSG_WARN([You should provide path for --with-$1=PATH]); \
|
||||
else \
|
||||
GIT_CONF_APPEND_LINE(${PROGRAM}_PATH=$withval); \
|
||||
fi; \
|
||||
fi; \
|
||||
]) # GIT_CONF_APPEND_PATH
|
||||
#
|
||||
# GIT_PARSE_WITH(PACKAGE)
|
||||
# -----------------------
|
||||
# For use in AC_ARG_WITH action-if-found, for packages default ON.
|
||||
# * Set NO_PACKAGE=YesPlease for --without-PACKAGE
|
||||
# * Set PACKAGEDIR=PATH for --with-PACKAGE=PATH
|
||||
# * Unset NO_PACKAGE for --with-PACKAGE without ARG
|
||||
AC_DEFUN([GIT_PARSE_WITH],
|
||||
[PACKAGE=m4_toupper($1); \
|
||||
if test "$withval" = "no"; then \
|
||||
m4_toupper(NO_$1)=YesPlease; \
|
||||
elif test "$withval" = "yes"; then \
|
||||
m4_toupper(NO_$1)=; \
|
||||
else \
|
||||
m4_toupper(NO_$1)=; \
|
||||
GIT_CONF_APPEND_LINE(${PACKAGE}DIR=$withval); \
|
||||
fi \
|
||||
])# GIT_PARSE_WITH
|
||||
|
||||
|
||||
## Site configuration related to programs (before tests)
|
||||
## --with-PACKAGE[=ARG] and --without-PACKAGE
|
||||
#
|
||||
# Define SHELL_PATH to provide path to shell.
|
||||
GIT_ARG_SET_PATH(shell)
|
||||
#
|
||||
# Define PERL_PATH to provide path to Perl.
|
||||
GIT_ARG_SET_PATH(perl)
|
||||
#
|
||||
# Define NO_PYTHON if you want to lose all benefits of the recursive merge.
|
||||
# Define PYTHON_PATH to provide path to Python.
|
||||
AC_ARG_WITH(python,[AS_HELP_STRING([--with-python=PATH], [provide PATH to python])
|
||||
AS_HELP_STRING([--without-python], [don't use python scripts])],
|
||||
[if test "$withval" = "no"; then \
|
||||
NO_PYTHON=YesPlease; \
|
||||
elif test "$withval" = "yes"; then \
|
||||
NO_PYTHON=; \
|
||||
else \
|
||||
NO_PYTHON=; \
|
||||
PYTHON_PATH=$withval; \
|
||||
fi; \
|
||||
])
|
||||
AC_SUBST(NO_PYTHON)
|
||||
AC_SUBST(PYTHON_PATH)
|
||||
|
||||
|
||||
## Checks for programs.
|
||||
@ -30,6 +101,16 @@ AC_CHECK_TOOL(AR, ar, :)
|
||||
AC_CHECK_PROGS(TAR, [gtar tar])
|
||||
#
|
||||
# Define NO_PYTHON if you want to lose all benefits of the recursive merge.
|
||||
# Define PYTHON_PATH to provide path to Python.
|
||||
if test -z "$NO_PYTHON"; then
|
||||
if test -z "$PYTHON_PATH"; then
|
||||
AC_PATH_PROGS(PYTHON_PATH, [python python2.4 python2.3 python2])
|
||||
fi
|
||||
if test -n "$PYTHON_PATH"; then
|
||||
GIT_CONF_APPEND_LINE([PYTHON_PATH=@PYTHON_PATH@])
|
||||
NO_PYTHON=""
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
## Checks for libraries.
|
||||
@ -37,32 +118,43 @@ AC_MSG_NOTICE([CHECKS for libraries])
|
||||
#
|
||||
# Define NO_OPENSSL environment variable if you do not have OpenSSL.
|
||||
# Define NEEDS_SSL_WITH_CRYPTO if you need -lcrypto with -lssl (Darwin).
|
||||
AC_CHECK_LIB([ssl], [SHA1_Init],[],
|
||||
[AC_CHECK_LIB([crypto], [SHA1_INIT],
|
||||
[GIT_CONF_APPEND_LINE(NEEDS_SSL_WITH_CRYPTO=YesPlease)],
|
||||
[GIT_CONF_APPEND_LINE(NO_OPENSSL=YesPlease)])])
|
||||
AC_CHECK_LIB([crypto], [SHA1_Init],
|
||||
[NEEDS_SSL_WITH_CRYPTO=],
|
||||
[AC_CHECK_LIB([ssl], [SHA1_Init],
|
||||
[NEEDS_SSL_WITH_CRYPTO=YesPlease
|
||||
NEEDS_SSL_WITH_CRYPTO=],
|
||||
[NO_OPENSSL=YesPlease])])
|
||||
AC_SUBST(NEEDS_SSL_WITH_CRYPTO)
|
||||
AC_SUBST(NO_OPENSSL)
|
||||
#
|
||||
# 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://
|
||||
# transports.
|
||||
AC_CHECK_LIB([curl], [curl_global_init],[],
|
||||
[GIT_CONF_APPEND_LINE(NO_CURL=YesPlease)])
|
||||
AC_CHECK_LIB([curl], [curl_global_init],
|
||||
[NO_CURL=],
|
||||
[NO_CURL=YesPlease])
|
||||
AC_SUBST(NO_CURL)
|
||||
#
|
||||
# Define NO_EXPAT if you do not have expat installed. git-http-push is
|
||||
# not built, and you cannot push using http:// and https:// transports.
|
||||
AC_CHECK_LIB([expat], [XML_ParserCreate],[],
|
||||
[GIT_CONF_APPEND_LINE(NO_EXPAT=YesPlease)])
|
||||
AC_CHECK_LIB([expat], [XML_ParserCreate],
|
||||
[NO_EXPAT=],
|
||||
[NO_EXPAT=YesPlease])
|
||||
AC_SUBST(NO_EXPAT)
|
||||
#
|
||||
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
|
||||
AC_CHECK_LIB([c], [iconv],[],
|
||||
[AC_CHECK_LIB([iconv],[iconv],
|
||||
[GIT_CONF_APPEND_LINE(NEEDS_LIBICONV=YesPlease)],[])])
|
||||
AC_CHECK_LIB([c], [iconv],
|
||||
[NEEDS_LIBICONV=],
|
||||
[NEEDS_LIBICONV=YesPlease])
|
||||
AC_SUBST(NEEDS_LIBICONV)
|
||||
#
|
||||
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
|
||||
# Patrick Mauritz).
|
||||
AC_CHECK_LIB([c], [socket],[],
|
||||
[AC_CHECK_LIB([socket],[socket],
|
||||
[GIT_CONF_APPEND_LINE(NEEDS_SOCKET=YesPlease)],[])])
|
||||
AC_CHECK_LIB([c], [socket],
|
||||
[NEEDS_SOCKET=],
|
||||
[NEEDS_SOCKET=YesPlease])
|
||||
AC_SUBST(NEEDS_SOCKET)
|
||||
test -n "$NEEDS_SOCKET" && LIBS="$LIBS -lsocket"
|
||||
|
||||
|
||||
## Checks for header files.
|
||||
@ -72,21 +164,65 @@ AC_CHECK_LIB([c], [socket],[],
|
||||
AC_MSG_NOTICE([CHECKS for typedefs, structures, and compiler characteristics])
|
||||
#
|
||||
# Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent.
|
||||
AC_CHECK_MEMBER(struct dirent.d_ino,[],
|
||||
[GIT_CONF_APPEND_LINE(NO_D_INO_IN_DIRENT=YesPlease)],
|
||||
AC_CHECK_MEMBER(struct dirent.d_ino,
|
||||
[NO_D_INO_IN_DIRENT=],
|
||||
[NO_D_INO_IN_DIRENT=YesPlease],
|
||||
[#include <dirent.h>])
|
||||
AC_SUBST(NO_D_INO_IN_DIRENT)
|
||||
#
|
||||
# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
|
||||
# d_type in struct dirent (latest Cygwin -- will be fixed soonish).
|
||||
AC_CHECK_MEMBER(struct dirent.d_type,[],
|
||||
[GIT_CONF_APPEND_LINE(NO_D_TYPE_IN_DIRENT=YesPlease)],
|
||||
AC_CHECK_MEMBER(struct dirent.d_type,
|
||||
[NO_D_TYPE_IN_DIRENT=],
|
||||
[NO_D_TYPE_IN_DIRENT=YesPlease],
|
||||
[#include <dirent.h>])
|
||||
AC_SUBST(NO_D_TYPE_IN_DIRENT)
|
||||
#
|
||||
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
|
||||
# sockaddr_storage.
|
||||
AC_CHECK_TYPE(struct sockaddr_storage,[],
|
||||
[GIT_CONF_APPEND_LINE(NO_SOCKADDR_STORAGE=YesPlease)],
|
||||
[#include <netinet/in.h>])
|
||||
AC_CHECK_TYPE(struct sockaddr_storage,
|
||||
[NO_SOCKADDR_STORAGE=],
|
||||
[NO_SOCKADDR_STORAGE=YesPlease],[
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
])
|
||||
AC_SUBST(NO_SOCKADDR_STORAGE)
|
||||
#
|
||||
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
|
||||
AC_CHECK_TYPE([struct addrinfo],[
|
||||
AC_CHECK_FUNC([getaddrinfo],
|
||||
[NO_IPV6=],
|
||||
[NO_IPV6=YesPlease])
|
||||
],[NO_IPV6=YesPlease],[
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
])
|
||||
AC_SUBST(NO_IPV6)
|
||||
#
|
||||
# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
|
||||
# do not support the 'size specifiers' introduced by C99, namely ll, hh,
|
||||
# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
|
||||
# some C compilers supported these specifiers prior to C99 as an extension.
|
||||
AC_CACHE_CHECK(whether formatted IO functions support C99 size specifiers,
|
||||
ac_cv_c_c99_format,
|
||||
[# Actually git uses only %z (%zu) in alloc.c, and %t (%td) in mktag.c
|
||||
AC_RUN_IFELSE(
|
||||
[AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
|
||||
[[char buf[64];
|
||||
if (sprintf(buf, "%lld%hhd%jd%zd%td", (long long int)1, (char)2, (intmax_t)3, (size_t)4, (ptrdiff_t)5) != 5)
|
||||
exit(1);
|
||||
else if (strcmp(buf, "12345"))
|
||||
exit(2);]])],
|
||||
[ac_cv_c_c99_format=yes],
|
||||
[ac_cv_c_c99_format=no])
|
||||
])
|
||||
if test $ac_cv_c_c99_format = no; then
|
||||
NO_C99_FORMAT=YesPlease
|
||||
else
|
||||
NO_C99_FORMAT=
|
||||
fi
|
||||
AC_SUBST(NO_C99_FORMAT)
|
||||
|
||||
|
||||
## Checks for library functions.
|
||||
@ -94,21 +230,25 @@ AC_CHECK_TYPE(struct sockaddr_storage,[],
|
||||
AC_MSG_NOTICE([CHECKS for library functions])
|
||||
#
|
||||
# Define NO_STRCASESTR if you don't have strcasestr.
|
||||
AC_CHECK_FUNC(strcasestr,[],
|
||||
[GIT_CONF_APPEND_LINE(NO_STRCASESTR=YesPlease)])
|
||||
AC_CHECK_FUNC(strcasestr,
|
||||
[NO_STRCASESTR=],
|
||||
[NO_STRCASESTR=YesPlease])
|
||||
AC_SUBST(NO_STRCASESTR)
|
||||
#
|
||||
# Define NO_STRLCPY if you don't have strlcpy.
|
||||
AC_CHECK_FUNC(strlcpy,[],
|
||||
[GIT_CONF_APPEND_LINE(NO_STRLCPY=YesPlease)])
|
||||
AC_CHECK_FUNC(strlcpy,
|
||||
[NO_STRLCPY=],
|
||||
[NO_STRLCPY=YesPlease])
|
||||
AC_SUBST(NO_STRLCPY)
|
||||
#
|
||||
# Define NO_SETENV if you don't have setenv in the C library.
|
||||
AC_CHECK_FUNC(setenv,[],
|
||||
[GIT_CONF_APPEND_LINE(NO_SETENV=YesPlease)])
|
||||
AC_CHECK_FUNC(setenv,
|
||||
[NO_SETENV=],
|
||||
[NO_SETENV=YesPlease])
|
||||
AC_SUBST(NO_SETENV)
|
||||
#
|
||||
# Define NO_MMAP if you want to avoid mmap.
|
||||
#
|
||||
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
|
||||
#
|
||||
# Define NO_ICONV if your libc does not properly support iconv.
|
||||
|
||||
|
||||
@ -125,9 +265,11 @@ AC_CHECK_FUNC(setenv,[],
|
||||
# a missing newline at the end of the file.
|
||||
|
||||
|
||||
## Site configuration
|
||||
## Site configuration (override autodetection)
|
||||
## --with-PACKAGE[=ARG] and --without-PACKAGE
|
||||
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interopability
|
||||
AC_MSG_NOTICE([CHECKS for site configuration])
|
||||
#
|
||||
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability
|
||||
# tests. These tests take up a significant amount of the total test time
|
||||
# but are not needed unless you plan to talk to SVN repos.
|
||||
#
|
||||
@ -145,21 +287,51 @@ AC_CHECK_FUNC(setenv,[],
|
||||
# Define NO_OPENSSL environment variable if you do not have OpenSSL.
|
||||
# This also implies MOZILLA_SHA1.
|
||||
#
|
||||
# Define OPENSSLDIR=/foo/bar if your openssl header and library files are in
|
||||
# /foo/bar/include and /foo/bar/lib directories.
|
||||
AC_ARG_WITH(openssl,
|
||||
AS_HELP_STRING([--with-openssl],[use OpenSSL library (default is YES)])
|
||||
AS_HELP_STRING([], [ARG can be prefix for openssl library and headers]),\
|
||||
GIT_PARSE_WITH(openssl))
|
||||
#
|
||||
# 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://
|
||||
# transports.
|
||||
#
|
||||
# Define CURLDIR=/foo/bar if your curl header and library files are in
|
||||
# /foo/bar/include and /foo/bar/lib directories.
|
||||
AC_ARG_WITH(curl,
|
||||
AS_HELP_STRING([--with-curl],[support http(s):// transports (default is YES)])
|
||||
AS_HELP_STRING([], [ARG can be also prefix for curl library and headers]),
|
||||
GIT_PARSE_WITH(curl))
|
||||
#
|
||||
# Define NO_EXPAT if you do not have expat installed. git-http-push is
|
||||
# not built, and you cannot push using http:// and https:// transports.
|
||||
#
|
||||
# Define EXPATDIR=/foo/bar if your expat header and library files are in
|
||||
# /foo/bar/include and /foo/bar/lib directories.
|
||||
AC_ARG_WITH(expat,
|
||||
AS_HELP_STRING([--with-expat],
|
||||
[support git-push using http:// and https:// transports via WebDAV (default is YES)])
|
||||
AS_HELP_STRING([], [ARG can be also prefix for expat library and headers]),
|
||||
GIT_PARSE_WITH(expat))
|
||||
#
|
||||
# Define NO_FINK if you are building on Darwin/Mac OS X, have Fink
|
||||
# installed in /sw, but don't want GIT to link against any libraries
|
||||
# installed there. If defined you may specify your own (or Fink's)
|
||||
# include directories and library directories by defining CFLAGS
|
||||
# and LDFLAGS appropriately.
|
||||
#
|
||||
# Define NO_DARWIN_PORTS if you are building on Darwin/Mac OS X,
|
||||
# have DarwinPorts installed in /opt/local, but don't want GIT to
|
||||
# link against any libraries installed there. If defined you may
|
||||
# specify your own (or DarwinPort's) include directories and
|
||||
# library directories by defining CFLAGS and LDFLAGS appropriately.
|
||||
#
|
||||
# Define NO_MMAP if you want to avoid mmap.
|
||||
#
|
||||
# Define NO_PYTHON if you want to loose all benefits of the recursive merge.
|
||||
#
|
||||
|
||||
## --enable-FEATURE[=ARG] and --disable-FEATURE
|
||||
#
|
||||
# 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.
|
||||
|
23
connect.c
23
connect.c
@ -10,7 +10,7 @@
|
||||
#include <netdb.h>
|
||||
#include <signal.h>
|
||||
|
||||
static char *server_capabilities = NULL;
|
||||
static char *server_capabilities;
|
||||
|
||||
static int check_ref(const char *name, int len, unsigned int flags)
|
||||
{
|
||||
@ -77,7 +77,7 @@ struct ref **get_remote_heads(int in, struct ref **list,
|
||||
if (nr_match && !path_match(name, nr_match, match))
|
||||
continue;
|
||||
ref = xcalloc(1, sizeof(*ref) + len - 40);
|
||||
memcpy(ref->old_sha1, old_sha1, 20);
|
||||
hashcpy(ref->old_sha1, old_sha1);
|
||||
memcpy(ref->name, buffer + 41, len - 40);
|
||||
*list = ref;
|
||||
list = &ref->next;
|
||||
@ -208,7 +208,7 @@ static struct ref *try_explicit_object_name(const char *name)
|
||||
len = strlen(name) + 1;
|
||||
ref = xcalloc(1, sizeof(*ref) + len);
|
||||
memcpy(ref->name, name, len);
|
||||
memcpy(ref->new_sha1, sha1, 20);
|
||||
hashcpy(ref->new_sha1, sha1);
|
||||
return ref;
|
||||
}
|
||||
|
||||
@ -318,7 +318,7 @@ int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
|
||||
int len = strlen(src->name) + 1;
|
||||
dst_peer = xcalloc(1, sizeof(*dst_peer) + len);
|
||||
memcpy(dst_peer->name, src->name, len);
|
||||
memcpy(dst_peer->new_sha1, src->new_sha1, 20);
|
||||
hashcpy(dst_peer->new_sha1, src->new_sha1);
|
||||
link_dst_tail(dst_peer, dst_tail);
|
||||
}
|
||||
dst_peer->peer_ref = src;
|
||||
@ -493,8 +493,8 @@ static void git_tcp_connect(int fd[2], char *host)
|
||||
}
|
||||
|
||||
|
||||
static char *git_proxy_command = NULL;
|
||||
static const char *rhost_name = NULL;
|
||||
static char *git_proxy_command;
|
||||
static const char *rhost_name;
|
||||
static int rhost_len;
|
||||
|
||||
static int git_proxy_command_options(const char *var, const char *value)
|
||||
@ -737,14 +737,9 @@ int git_connect(int fd[2], char *url, const char *prog)
|
||||
|
||||
int finish_connect(pid_t pid)
|
||||
{
|
||||
int ret;
|
||||
|
||||
for (;;) {
|
||||
ret = waitpid(pid, NULL, 0);
|
||||
if (!ret)
|
||||
break;
|
||||
while (waitpid(pid, NULL, 0) < 0) {
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
return -1;
|
||||
}
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
@ -54,7 +54,7 @@
|
||||
(let* ((dir (file-name-directory file))
|
||||
(name (file-relative-name file dir)))
|
||||
(when dir (cd dir))
|
||||
(and (eq 0 (call-process "git" nil '(t nil) nil "ls-files" "-c" "-z" "--" name))
|
||||
(and (ignore-errors (eq 0 (call-process "git" nil '(t nil) nil "ls-files" "-c" "-z" "--" name)))
|
||||
(let ((str (buffer-string)))
|
||||
(and (> (length str) (length name))
|
||||
(string= (substring str 0 (1+ (length name))) (concat name "\0"))))))))
|
||||
|
@ -23,7 +23,7 @@ static struct entry * convert_entry(unsigned char *sha1);
|
||||
static struct entry *insert_new(unsigned char *sha1, int pos)
|
||||
{
|
||||
struct entry *new = xcalloc(1, sizeof(struct entry));
|
||||
memcpy(new->old_sha1, sha1, 20);
|
||||
hashcpy(new->old_sha1, sha1);
|
||||
memmove(convert + pos + 1, convert + pos, (nr_convert - pos) * sizeof(struct entry *));
|
||||
convert[pos] = new;
|
||||
nr_convert++;
|
||||
@ -39,7 +39,7 @@ static struct entry *lookup_entry(unsigned char *sha1)
|
||||
while (low < high) {
|
||||
int next = (low + high) / 2;
|
||||
struct entry *n = convert[next];
|
||||
int cmp = memcmp(sha1, n->old_sha1, 20);
|
||||
int cmp = hashcmp(sha1, n->old_sha1);
|
||||
if (!cmp)
|
||||
return n;
|
||||
if (cmp < 0) {
|
||||
@ -54,7 +54,7 @@ static struct entry *lookup_entry(unsigned char *sha1)
|
||||
static void convert_binary_sha1(void *buffer)
|
||||
{
|
||||
struct entry *entry = convert_entry(buffer);
|
||||
memcpy(buffer, entry->new_sha1, 20);
|
||||
hashcpy(buffer, entry->new_sha1);
|
||||
}
|
||||
|
||||
static void convert_ascii_sha1(void *buffer)
|
||||
@ -104,7 +104,7 @@ static int write_subdirectory(void *buffer, unsigned long size, const char *base
|
||||
if (!slash) {
|
||||
newlen += sprintf(new + newlen, "%o %s", mode, path);
|
||||
new[newlen++] = '\0';
|
||||
memcpy(new + newlen, (char *) buffer + len - 20, 20);
|
||||
hashcpy((unsigned char*)new + newlen, (unsigned char *) buffer + len - 20);
|
||||
newlen += 20;
|
||||
|
||||
used += len;
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include "cache.h"
|
||||
#include "csum-file.h"
|
||||
|
||||
static int sha1flush(struct sha1file *f, unsigned int count)
|
||||
static void sha1flush(struct sha1file *f, unsigned int count)
|
||||
{
|
||||
void *buf = f->buffer;
|
||||
|
||||
@ -21,7 +21,7 @@ static int sha1flush(struct sha1file *f, unsigned int count)
|
||||
count -= ret;
|
||||
if (count)
|
||||
continue;
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
if (!ret)
|
||||
die("sha1 file '%s' write error. Out of diskspace", f->name);
|
||||
@ -38,7 +38,7 @@ int sha1close(struct sha1file *f, unsigned char *result, int update)
|
||||
}
|
||||
SHA1_Final(f->buffer, &f->ctx);
|
||||
if (result)
|
||||
memcpy(result, f->buffer, 20);
|
||||
hashcpy(result, f->buffer);
|
||||
if (update)
|
||||
sha1flush(f, 20);
|
||||
if (close(f->fd))
|
||||
|
20
daemon.c
20
daemon.c
@ -22,24 +22,24 @@ static const char daemon_usage[] =
|
||||
" [--reuseaddr] [--detach] [--pid-file=file] [directory...]";
|
||||
|
||||
/* List of acceptable pathname prefixes */
|
||||
static char **ok_paths = NULL;
|
||||
static int strict_paths = 0;
|
||||
static char **ok_paths;
|
||||
static int strict_paths;
|
||||
|
||||
/* If this is set, git-daemon-export-ok is not required */
|
||||
static int export_all_trees = 0;
|
||||
static int export_all_trees;
|
||||
|
||||
/* Take all paths relative to this one if non-NULL */
|
||||
static char *base_path = NULL;
|
||||
static char *base_path;
|
||||
|
||||
/* If defined, ~user notation is allowed and the string is inserted
|
||||
* after ~user/. E.g. a request to git://host/~alice/frotz would
|
||||
* go to /home/alice/pub_git/frotz with --user-path=pub_git.
|
||||
*/
|
||||
static const char *user_path = NULL;
|
||||
static const char *user_path;
|
||||
|
||||
/* Timeout, and initial timeout */
|
||||
static unsigned int timeout = 0;
|
||||
static unsigned int init_timeout = 0;
|
||||
static unsigned int timeout;
|
||||
static unsigned int init_timeout;
|
||||
|
||||
static void logreport(int priority, const char *err, va_list params)
|
||||
{
|
||||
@ -333,12 +333,12 @@ static int execute(struct sockaddr *addr)
|
||||
static int max_connections = 25;
|
||||
|
||||
/* These are updated by the signal handler */
|
||||
static volatile unsigned int children_reaped = 0;
|
||||
static volatile unsigned int children_reaped;
|
||||
static pid_t dead_child[MAX_CHILDREN];
|
||||
|
||||
/* These are updated by the main loop */
|
||||
static unsigned int children_spawned = 0;
|
||||
static unsigned int children_deleted = 0;
|
||||
static unsigned int children_spawned;
|
||||
static unsigned int children_deleted;
|
||||
|
||||
static struct child {
|
||||
pid_t pid;
|
||||
|
@ -8,12 +8,12 @@
|
||||
static const char describe_usage[] =
|
||||
"git-describe [--all] [--tags] [--abbrev=<n>] <committish>*";
|
||||
|
||||
static int all = 0; /* Default to annotated tags only */
|
||||
static int tags = 0; /* But allow any tags if --tags is specified */
|
||||
static int all; /* Default to annotated tags only */
|
||||
static int tags; /* But allow any tags if --tags is specified */
|
||||
|
||||
static int abbrev = DEFAULT_ABBREV;
|
||||
|
||||
static int names = 0, allocs = 0;
|
||||
static int names, allocs;
|
||||
static struct commit_name {
|
||||
const struct commit *commit;
|
||||
int prio; /* annotated tag = 2, tag = 1, head = 0 */
|
||||
|
@ -152,7 +152,7 @@ struct delta_index * create_delta_index(const void *buf, unsigned long bufsize)
|
||||
initialization in create_delta(). */
|
||||
entries = (bufsize - 1) / RABIN_WINDOW;
|
||||
hsize = entries / 4;
|
||||
for (i = 4; (1 << i) < hsize && i < 31; i++);
|
||||
for (i = 4; (1u << i) < hsize && i < 31; i++);
|
||||
hsize = 1 << i;
|
||||
hmask = hsize - 1;
|
||||
|
||||
|
@ -48,7 +48,7 @@ int run_diff_files(struct rev_info *revs, int silent_on_removed)
|
||||
memcpy(dpath->path, ce->name, path_len);
|
||||
dpath->path[path_len] = '\0';
|
||||
dpath->mode = 0;
|
||||
memset(dpath->sha1, 0, 20);
|
||||
hashclr(dpath->sha1);
|
||||
memset(&(dpath->parent[0]), 0,
|
||||
sizeof(struct combine_diff_parent)*5);
|
||||
|
||||
@ -66,8 +66,7 @@ int run_diff_files(struct rev_info *revs, int silent_on_removed)
|
||||
if (2 <= stage) {
|
||||
int mode = ntohl(nce->ce_mode);
|
||||
num_compare_stages++;
|
||||
memcpy(dpath->parent[stage-2].sha1,
|
||||
nce->sha1, 20);
|
||||
hashcpy(dpath->parent[stage-2].sha1, nce->sha1);
|
||||
dpath->parent[stage-2].mode =
|
||||
canon_mode(mode);
|
||||
dpath->parent[stage-2].status =
|
||||
@ -215,7 +214,7 @@ static int show_modified(struct rev_info *revs,
|
||||
}
|
||||
|
||||
oldmode = old->ce_mode;
|
||||
if (mode == oldmode && !memcmp(sha1, old->sha1, 20) &&
|
||||
if (mode == oldmode && !hashcmp(sha1, old->sha1) &&
|
||||
!revs->diffopt.find_copies_harder)
|
||||
return 0;
|
||||
|
||||
|
205
diff.c
205
diff.c
@ -13,9 +13,9 @@
|
||||
|
||||
static int use_size_cache;
|
||||
|
||||
static int diff_detect_rename_default = 0;
|
||||
static int diff_detect_rename_default;
|
||||
static int diff_rename_limit_default = -1;
|
||||
static int diff_use_color_default = 0;
|
||||
static int diff_use_color_default;
|
||||
|
||||
/* "\033[1;38;5;2xx;48;5;2xxm\0" is 23 bytes */
|
||||
static char diff_colors[][24] = {
|
||||
@ -358,12 +358,152 @@ static int fill_mmfile(mmfile_t *mf, struct diff_filespec *one)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct diff_words_buffer {
|
||||
mmfile_t text;
|
||||
long alloc;
|
||||
long current; /* output pointer */
|
||||
int suppressed_newline;
|
||||
};
|
||||
|
||||
static void diff_words_append(char *line, unsigned long len,
|
||||
struct diff_words_buffer *buffer)
|
||||
{
|
||||
if (buffer->text.size + len > buffer->alloc) {
|
||||
buffer->alloc = (buffer->text.size + len) * 3 / 2;
|
||||
buffer->text.ptr = xrealloc(buffer->text.ptr, buffer->alloc);
|
||||
}
|
||||
line++;
|
||||
len--;
|
||||
memcpy(buffer->text.ptr + buffer->text.size, line, len);
|
||||
buffer->text.size += len;
|
||||
}
|
||||
|
||||
struct diff_words_data {
|
||||
struct xdiff_emit_state xm;
|
||||
struct diff_words_buffer minus, plus;
|
||||
};
|
||||
|
||||
static void print_word(struct diff_words_buffer *buffer, int len, int color,
|
||||
int suppress_newline)
|
||||
{
|
||||
const char *ptr;
|
||||
int eol = 0;
|
||||
|
||||
if (len == 0)
|
||||
return;
|
||||
|
||||
ptr = buffer->text.ptr + buffer->current;
|
||||
buffer->current += len;
|
||||
|
||||
if (ptr[len - 1] == '\n') {
|
||||
eol = 1;
|
||||
len--;
|
||||
}
|
||||
|
||||
fputs(diff_get_color(1, color), stdout);
|
||||
fwrite(ptr, len, 1, stdout);
|
||||
fputs(diff_get_color(1, DIFF_RESET), stdout);
|
||||
|
||||
if (eol) {
|
||||
if (suppress_newline)
|
||||
buffer->suppressed_newline = 1;
|
||||
else
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
|
||||
static void fn_out_diff_words_aux(void *priv, char *line, unsigned long len)
|
||||
{
|
||||
struct diff_words_data *diff_words = priv;
|
||||
|
||||
if (diff_words->minus.suppressed_newline) {
|
||||
if (line[0] != '+')
|
||||
putchar('\n');
|
||||
diff_words->minus.suppressed_newline = 0;
|
||||
}
|
||||
|
||||
len--;
|
||||
switch (line[0]) {
|
||||
case '-':
|
||||
print_word(&diff_words->minus, len, DIFF_FILE_OLD, 1);
|
||||
break;
|
||||
case '+':
|
||||
print_word(&diff_words->plus, len, DIFF_FILE_NEW, 0);
|
||||
break;
|
||||
case ' ':
|
||||
print_word(&diff_words->plus, len, DIFF_PLAIN, 0);
|
||||
diff_words->minus.current += len;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* this executes the word diff on the accumulated buffers */
|
||||
static void diff_words_show(struct diff_words_data *diff_words)
|
||||
{
|
||||
xpparam_t xpp;
|
||||
xdemitconf_t xecfg;
|
||||
xdemitcb_t ecb;
|
||||
mmfile_t minus, plus;
|
||||
int i;
|
||||
|
||||
minus.size = diff_words->minus.text.size;
|
||||
minus.ptr = xmalloc(minus.size);
|
||||
memcpy(minus.ptr, diff_words->minus.text.ptr, minus.size);
|
||||
for (i = 0; i < minus.size; i++)
|
||||
if (isspace(minus.ptr[i]))
|
||||
minus.ptr[i] = '\n';
|
||||
diff_words->minus.current = 0;
|
||||
|
||||
plus.size = diff_words->plus.text.size;
|
||||
plus.ptr = xmalloc(plus.size);
|
||||
memcpy(plus.ptr, diff_words->plus.text.ptr, plus.size);
|
||||
for (i = 0; i < plus.size; i++)
|
||||
if (isspace(plus.ptr[i]))
|
||||
plus.ptr[i] = '\n';
|
||||
diff_words->plus.current = 0;
|
||||
|
||||
xpp.flags = XDF_NEED_MINIMAL;
|
||||
xecfg.ctxlen = diff_words->minus.alloc + diff_words->plus.alloc;
|
||||
xecfg.flags = 0;
|
||||
ecb.outf = xdiff_outf;
|
||||
ecb.priv = diff_words;
|
||||
diff_words->xm.consume = fn_out_diff_words_aux;
|
||||
xdl_diff(&minus, &plus, &xpp, &xecfg, &ecb);
|
||||
|
||||
free(minus.ptr);
|
||||
free(plus.ptr);
|
||||
diff_words->minus.text.size = diff_words->plus.text.size = 0;
|
||||
|
||||
if (diff_words->minus.suppressed_newline) {
|
||||
putchar('\n');
|
||||
diff_words->minus.suppressed_newline = 0;
|
||||
}
|
||||
}
|
||||
|
||||
struct emit_callback {
|
||||
struct xdiff_emit_state xm;
|
||||
int nparents, color_diff;
|
||||
const char **label_path;
|
||||
struct diff_words_data *diff_words;
|
||||
};
|
||||
|
||||
static void free_diff_words_data(struct emit_callback *ecbdata)
|
||||
{
|
||||
if (ecbdata->diff_words) {
|
||||
/* flush buffers */
|
||||
if (ecbdata->diff_words->minus.text.size ||
|
||||
ecbdata->diff_words->plus.text.size)
|
||||
diff_words_show(ecbdata->diff_words);
|
||||
|
||||
if (ecbdata->diff_words->minus.text.ptr)
|
||||
free (ecbdata->diff_words->minus.text.ptr);
|
||||
if (ecbdata->diff_words->plus.text.ptr)
|
||||
free (ecbdata->diff_words->plus.text.ptr);
|
||||
free(ecbdata->diff_words);
|
||||
ecbdata->diff_words = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
const char *diff_get_color(int diff_use_color, enum color_diff ix)
|
||||
{
|
||||
if (diff_use_color)
|
||||
@ -398,6 +538,25 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
|
||||
else {
|
||||
int nparents = ecbdata->nparents;
|
||||
int color = DIFF_PLAIN;
|
||||
if (ecbdata->diff_words && nparents != 1)
|
||||
/* fall back to normal diff */
|
||||
free_diff_words_data(ecbdata);
|
||||
if (ecbdata->diff_words) {
|
||||
if (line[0] == '-') {
|
||||
diff_words_append(line, len,
|
||||
&ecbdata->diff_words->minus);
|
||||
return;
|
||||
} else if (line[0] == '+') {
|
||||
diff_words_append(line, len,
|
||||
&ecbdata->diff_words->plus);
|
||||
return;
|
||||
}
|
||||
if (ecbdata->diff_words->minus.text.size ||
|
||||
ecbdata->diff_words->plus.text.size)
|
||||
diff_words_show(ecbdata->diff_words);
|
||||
line++;
|
||||
len--;
|
||||
} else
|
||||
for (i = 0; i < nparents && len; i++) {
|
||||
if (line[i] == '-')
|
||||
color = DIFF_FILE_OLD;
|
||||
@ -745,9 +904,7 @@ static int mmfile_is_binary(mmfile_t *mf)
|
||||
long sz = mf->size;
|
||||
if (FIRST_FEW_BYTES < sz)
|
||||
sz = FIRST_FEW_BYTES;
|
||||
if (memchr(mf->ptr, 0, sz))
|
||||
return 1;
|
||||
return 0;
|
||||
return !!memchr(mf->ptr, 0, sz);
|
||||
}
|
||||
|
||||
static void builtin_diff(const char *name_a,
|
||||
@ -836,7 +993,12 @@ static void builtin_diff(const char *name_a,
|
||||
ecb.outf = xdiff_outf;
|
||||
ecb.priv = &ecbdata;
|
||||
ecbdata.xm.consume = fn_out_consume;
|
||||
if (o->color_diff_words)
|
||||
ecbdata.diff_words =
|
||||
xcalloc(1, sizeof(struct diff_words_data));
|
||||
xdl_diff(&mf1, &mf2, &xpp, &xecfg, &ecb);
|
||||
if (o->color_diff_words)
|
||||
free_diff_words_data(&ecbdata);
|
||||
}
|
||||
|
||||
free_ab_and_return:
|
||||
@ -939,8 +1101,8 @@ void fill_filespec(struct diff_filespec *spec, const unsigned char *sha1,
|
||||
{
|
||||
if (mode) {
|
||||
spec->mode = canon_mode(mode);
|
||||
memcpy(spec->sha1, sha1, 20);
|
||||
spec->sha1_valid = !!memcmp(sha1, null_sha1, 20);
|
||||
hashcpy(spec->sha1, sha1);
|
||||
spec->sha1_valid = !is_null_sha1(sha1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -978,7 +1140,7 @@ static int work_tree_matches(const char *name, const unsigned char *sha1)
|
||||
if ((lstat(name, &st) < 0) ||
|
||||
!S_ISREG(st.st_mode) || /* careful! */
|
||||
ce_match_stat(ce, &st, 0) ||
|
||||
memcmp(sha1, ce->sha1, 20))
|
||||
hashcmp(sha1, ce->sha1))
|
||||
return 0;
|
||||
/* we return 1 only when we can stat, it is a regular file,
|
||||
* stat information matches, and sha1 recorded in the cache
|
||||
@ -1006,7 +1168,7 @@ static struct sha1_size_cache *locate_size_cache(unsigned char *sha1,
|
||||
while (last > first) {
|
||||
int cmp, next = (last + first) >> 1;
|
||||
e = sha1_size_cache[next];
|
||||
cmp = memcmp(e->sha1, sha1, 20);
|
||||
cmp = hashcmp(e->sha1, sha1);
|
||||
if (!cmp)
|
||||
return e;
|
||||
if (cmp < 0) {
|
||||
@ -1032,7 +1194,7 @@ static struct sha1_size_cache *locate_size_cache(unsigned char *sha1,
|
||||
sizeof(*sha1_size_cache));
|
||||
e = xmalloc(sizeof(struct sha1_size_cache));
|
||||
sha1_size_cache[first] = e;
|
||||
memcpy(e->sha1, sha1, 20);
|
||||
hashcpy(e->sha1, sha1);
|
||||
e->size = size;
|
||||
return e;
|
||||
}
|
||||
@ -1354,7 +1516,7 @@ static void diff_fill_sha1_info(struct diff_filespec *one)
|
||||
}
|
||||
}
|
||||
else
|
||||
memset(one->sha1, 0, 20);
|
||||
hashclr(one->sha1);
|
||||
}
|
||||
|
||||
static void run_diff(struct diff_filepair *p, struct diff_options *o)
|
||||
@ -1417,7 +1579,7 @@ static void run_diff(struct diff_filepair *p, struct diff_options *o)
|
||||
;
|
||||
}
|
||||
|
||||
if (memcmp(one->sha1, two->sha1, 20)) {
|
||||
if (hashcmp(one->sha1, two->sha1)) {
|
||||
int abbrev = o->full_index ? 40 : DEFAULT_ABBREV;
|
||||
|
||||
len += snprintf(msg + len, sizeof(msg) - len,
|
||||
@ -1515,6 +1677,19 @@ void diff_setup(struct diff_options *options)
|
||||
|
||||
int diff_setup_done(struct diff_options *options)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
if (options->output_format & DIFF_FORMAT_NAME)
|
||||
count++;
|
||||
if (options->output_format & DIFF_FORMAT_NAME_STATUS)
|
||||
count++;
|
||||
if (options->output_format & DIFF_FORMAT_CHECKDIFF)
|
||||
count++;
|
||||
if (options->output_format & DIFF_FORMAT_NO_OUTPUT)
|
||||
count++;
|
||||
if (count > 1)
|
||||
die("--name-only, --name-status, --check and -s are mutually exclusive");
|
||||
|
||||
if (options->find_copies_harder)
|
||||
options->detect_rename = DIFF_DETECT_COPY;
|
||||
|
||||
@ -1697,6 +1872,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
|
||||
options->xdl_opts |= XDF_IGNORE_WHITESPACE;
|
||||
else if (!strcmp(arg, "-b") || !strcmp(arg, "--ignore-space-change"))
|
||||
options->xdl_opts |= XDF_IGNORE_WHITESPACE_CHANGE;
|
||||
else if (!strcmp(arg, "--color-words"))
|
||||
options->color_diff = options->color_diff_words = 1;
|
||||
else if (!strcmp(arg, "--no-renames"))
|
||||
options->detect_rename = 0;
|
||||
else
|
||||
@ -1921,7 +2098,7 @@ int diff_unmodified_pair(struct diff_filepair *p)
|
||||
* dealing with a change.
|
||||
*/
|
||||
if (one->sha1_valid && two->sha1_valid &&
|
||||
!memcmp(one->sha1, two->sha1, sizeof(one->sha1)))
|
||||
!hashcmp(one->sha1, two->sha1))
|
||||
return 1; /* no change */
|
||||
if (!one->sha1_valid && !two->sha1_valid)
|
||||
return 1; /* both look at the same file on the filesystem. */
|
||||
@ -2060,7 +2237,7 @@ static void diff_resolve_rename_copy(void)
|
||||
if (!p->status)
|
||||
p->status = DIFF_STATUS_RENAMED;
|
||||
}
|
||||
else if (memcmp(p->one->sha1, p->two->sha1, 20) ||
|
||||
else if (hashcmp(p->one->sha1, p->two->sha1) ||
|
||||
p->one->mode != p->two->mode)
|
||||
p->status = DIFF_STATUS_MODIFIED;
|
||||
else {
|
||||
|
3
diff.h
3
diff.h
@ -46,7 +46,8 @@ struct diff_options {
|
||||
full_index:1,
|
||||
silent_on_remove:1,
|
||||
find_copies_harder:1,
|
||||
color_diff:1;
|
||||
color_diff:1,
|
||||
color_diff_words:1;
|
||||
int context;
|
||||
int break_opt;
|
||||
int detect_rename;
|
||||
|
@ -56,7 +56,7 @@ static int should_break(struct diff_filespec *src,
|
||||
return 0; /* leave symlink rename alone */
|
||||
|
||||
if (src->sha1_valid && dst->sha1_valid &&
|
||||
!memcmp(src->sha1, dst->sha1, 20))
|
||||
!hashcmp(src->sha1, dst->sha1))
|
||||
return 0; /* they are the same */
|
||||
|
||||
if (diff_populate_filespec(src, 0) || diff_populate_filespec(dst, 0))
|
||||
|
@ -101,7 +101,7 @@ static int is_exact_match(struct diff_filespec *src,
|
||||
int contents_too)
|
||||
{
|
||||
if (src->sha1_valid && dst->sha1_valid &&
|
||||
!memcmp(src->sha1, dst->sha1, 20))
|
||||
!hashcmp(src->sha1, dst->sha1))
|
||||
return 1;
|
||||
if (!contents_too)
|
||||
return 0;
|
||||
|
@ -33,7 +33,7 @@ static int dump_cache_tree(struct cache_tree *it,
|
||||
}
|
||||
else {
|
||||
dump_one(it, pfx, "");
|
||||
if (memcmp(it->sha1, ref->sha1, 20) ||
|
||||
if (hashcmp(it->sha1, ref->sha1) ||
|
||||
ref->entry_count != it->entry_count ||
|
||||
ref->subtree_nr != it->subtree_nr) {
|
||||
dump_one(ref, pfx, "#(ref) ");
|
||||
|
@ -13,14 +13,14 @@ char git_default_email[MAX_GITNAME];
|
||||
char git_default_name[MAX_GITNAME];
|
||||
int use_legacy_headers = 1;
|
||||
int trust_executable_bit = 1;
|
||||
int assume_unchanged = 0;
|
||||
int prefer_symlink_refs = 0;
|
||||
int log_all_ref_updates = 0;
|
||||
int assume_unchanged;
|
||||
int prefer_symlink_refs;
|
||||
int log_all_ref_updates;
|
||||
int warn_ambiguous_refs = 1;
|
||||
int repository_format_version = 0;
|
||||
int repository_format_version;
|
||||
char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8";
|
||||
int shared_repository = PERM_UMASK;
|
||||
const char *apply_default_whitespace = NULL;
|
||||
const char *apply_default_whitespace;
|
||||
int zlib_compression_level = Z_DEFAULT_COMPRESSION;
|
||||
int pager_in_use;
|
||||
int pager_use_color = 1;
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
extern char **environ;
|
||||
static const char *builtin_exec_path = GIT_EXEC_PATH;
|
||||
static const char *current_exec_path = NULL;
|
||||
static const char *current_exec_path;
|
||||
|
||||
void git_set_exec_path(const char *exec_path)
|
||||
{
|
||||
|
@ -44,9 +44,8 @@ static int finish_pack(const char *pack_tmp_name, const char *me)
|
||||
|
||||
for (;;) {
|
||||
int status, code;
|
||||
int retval = waitpid(pid, &status, 0);
|
||||
|
||||
if (retval < 0) {
|
||||
if (waitpid(pid, &status, 0) < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
error("waitpid failed (%s)", strerror(errno));
|
||||
|
@ -24,8 +24,8 @@ static const char *exec = "git-upload-pack";
|
||||
*/
|
||||
#define MAX_IN_VAIN 256
|
||||
|
||||
static struct commit_list *rev_list = NULL;
|
||||
static int non_common_revs = 0, multi_ack = 0, use_thin_pack = 0, use_sideband;
|
||||
static struct commit_list *rev_list;
|
||||
static int non_common_revs, multi_ack, use_thin_pack, use_sideband;
|
||||
|
||||
static void rev_list_push(struct commit *commit, int mark)
|
||||
{
|
||||
@ -250,7 +250,7 @@ done:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static struct commit_list *complete = NULL;
|
||||
static struct commit_list *complete;
|
||||
|
||||
static int mark_complete(const char *path, const unsigned char *sha1)
|
||||
{
|
||||
@ -404,7 +404,7 @@ static int everything_local(struct ref **refs, int nr_match, char **match)
|
||||
continue;
|
||||
}
|
||||
|
||||
memcpy(ref->new_sha1, local, 20);
|
||||
hashcpy(ref->new_sha1, local);
|
||||
if (!verbose)
|
||||
continue;
|
||||
fprintf(stderr,
|
||||
|
2
fetch.c
2
fetch.c
@ -84,7 +84,7 @@ static int process_commit(struct commit *commit)
|
||||
if (commit->object.flags & COMPLETE)
|
||||
return 0;
|
||||
|
||||
memcpy(current_commit_sha1, commit->object.sha1, 20);
|
||||
hashcpy(current_commit_sha1, commit->object.sha1);
|
||||
|
||||
pull_say("walk %s\n", sha1_to_hex(commit->object.sha1));
|
||||
|
||||
|
@ -14,12 +14,12 @@
|
||||
#define REACHABLE 0x0001
|
||||
#define SEEN 0x0002
|
||||
|
||||
static int show_root = 0;
|
||||
static int show_tags = 0;
|
||||
static int show_unreachable = 0;
|
||||
static int check_full = 0;
|
||||
static int check_strict = 0;
|
||||
static int keep_cache_objects = 0;
|
||||
static int show_root;
|
||||
static int show_tags;
|
||||
static int show_unreachable;
|
||||
static int check_full;
|
||||
static int check_strict;
|
||||
static int keep_cache_objects;
|
||||
static unsigned char head_sha1[20];
|
||||
|
||||
#ifdef NO_D_INO_IN_DIRENT
|
||||
@ -356,7 +356,7 @@ static void add_sha1_list(unsigned char *sha1, unsigned long ino)
|
||||
int nr;
|
||||
|
||||
entry->ino = ino;
|
||||
memcpy(entry->sha1, sha1, 20);
|
||||
hashcpy(entry->sha1, sha1);
|
||||
nr = sha1_list.nr;
|
||||
if (nr == MAX_SHA1_ENTRIES) {
|
||||
fsck_sha1_list();
|
||||
@ -366,13 +366,13 @@ static void add_sha1_list(unsigned char *sha1, unsigned long ino)
|
||||
sha1_list.nr = ++nr;
|
||||
}
|
||||
|
||||
static int fsck_dir(int i, char *path)
|
||||
static void fsck_dir(int i, char *path)
|
||||
{
|
||||
DIR *dir = opendir(path);
|
||||
struct dirent *de;
|
||||
|
||||
if (!dir)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
while ((de = readdir(dir)) != NULL) {
|
||||
char name[100];
|
||||
@ -398,10 +398,9 @@ static int fsck_dir(int i, char *path)
|
||||
fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name);
|
||||
}
|
||||
closedir(dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int default_refs = 0;
|
||||
static int default_refs;
|
||||
|
||||
static int fsck_handle_ref(const char *refname, const unsigned char *sha1)
|
||||
{
|
||||
@ -453,7 +452,7 @@ static int fsck_head_link(void)
|
||||
if (strncmp(git_refs_heads_master + pfxlen, "refs/heads/", 11))
|
||||
return error("HEAD points to something strange (%s)",
|
||||
git_refs_heads_master + pfxlen);
|
||||
if (!memcmp(null_sha1, sha1, 20))
|
||||
if (is_null_sha1(sha1))
|
||||
return error("HEAD: not a valid git pointer");
|
||||
return 0;
|
||||
}
|
||||
|
@ -510,7 +510,7 @@ foreach my $t (@files) {
|
||||
if ($2 eq $from) {
|
||||
next if ($suppress_from);
|
||||
}
|
||||
else {
|
||||
elsif ($1 eq 'From') {
|
||||
$author_not_sender = $2;
|
||||
}
|
||||
printf("(mbox) Adding cc: %s from line '%s'\n",
|
||||
|
90
git.c
90
git.c
@ -92,7 +92,7 @@ static int handle_options(const char*** argv, int* argc)
|
||||
}
|
||||
|
||||
static const char *alias_command;
|
||||
static char *alias_string = NULL;
|
||||
static char *alias_string;
|
||||
|
||||
static int git_alias_config(const char *var, const char *value)
|
||||
{
|
||||
@ -213,8 +213,8 @@ static int handle_alias(int *argcp, const char ***argv)
|
||||
|
||||
const char git_version_string[] = GIT_VERSION;
|
||||
|
||||
#define NEEDS_PREFIX 1
|
||||
#define USE_PAGER 2
|
||||
#define RUN_SETUP (1<<0)
|
||||
#define USE_PAGER (1<<1)
|
||||
|
||||
static void handle_internal_command(int argc, const char **argv, char **envp)
|
||||
{
|
||||
@ -224,47 +224,53 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
||||
int (*fn)(int, const char **, const char *);
|
||||
int option;
|
||||
} commands[] = {
|
||||
{ "version", cmd_version },
|
||||
{ "help", cmd_help },
|
||||
{ "log", cmd_log, NEEDS_PREFIX | USE_PAGER },
|
||||
{ "whatchanged", cmd_whatchanged, NEEDS_PREFIX | USE_PAGER },
|
||||
{ "show", cmd_show, NEEDS_PREFIX | USE_PAGER },
|
||||
{ "push", cmd_push, NEEDS_PREFIX },
|
||||
{ "format-patch", cmd_format_patch, NEEDS_PREFIX },
|
||||
{ "count-objects", cmd_count_objects },
|
||||
{ "diff", cmd_diff, NEEDS_PREFIX },
|
||||
{ "grep", cmd_grep, NEEDS_PREFIX },
|
||||
{ "rm", cmd_rm, NEEDS_PREFIX },
|
||||
{ "add", cmd_add, NEEDS_PREFIX },
|
||||
{ "rev-list", cmd_rev_list, NEEDS_PREFIX },
|
||||
{ "init-db", cmd_init_db },
|
||||
{ "get-tar-commit-id", cmd_get_tar_commit_id },
|
||||
{ "upload-tar", cmd_upload_tar },
|
||||
{ "check-ref-format", cmd_check_ref_format },
|
||||
{ "ls-files", cmd_ls_files, NEEDS_PREFIX },
|
||||
{ "ls-tree", cmd_ls_tree, NEEDS_PREFIX },
|
||||
{ "tar-tree", cmd_tar_tree, NEEDS_PREFIX },
|
||||
{ "read-tree", cmd_read_tree, NEEDS_PREFIX },
|
||||
{ "commit-tree", cmd_commit_tree, NEEDS_PREFIX },
|
||||
{ "add", cmd_add, RUN_SETUP },
|
||||
{ "apply", cmd_apply },
|
||||
{ "show-branch", cmd_show_branch, NEEDS_PREFIX },
|
||||
{ "diff-files", cmd_diff_files, NEEDS_PREFIX },
|
||||
{ "diff-index", cmd_diff_index, NEEDS_PREFIX },
|
||||
{ "diff-stages", cmd_diff_stages, NEEDS_PREFIX },
|
||||
{ "diff-tree", cmd_diff_tree, NEEDS_PREFIX },
|
||||
{ "cat-file", cmd_cat_file, NEEDS_PREFIX },
|
||||
{ "rev-parse", cmd_rev_parse, NEEDS_PREFIX },
|
||||
{ "write-tree", cmd_write_tree, NEEDS_PREFIX },
|
||||
{ "mailsplit", cmd_mailsplit },
|
||||
{ "cat-file", cmd_cat_file, RUN_SETUP },
|
||||
{ "checkout-index", cmd_checkout_index, RUN_SETUP },
|
||||
{ "check-ref-format", cmd_check_ref_format },
|
||||
{ "commit-tree", cmd_commit_tree, RUN_SETUP },
|
||||
{ "count-objects", cmd_count_objects },
|
||||
{ "diff", cmd_diff, RUN_SETUP },
|
||||
{ "diff-files", cmd_diff_files, RUN_SETUP },
|
||||
{ "diff-index", cmd_diff_index, RUN_SETUP },
|
||||
{ "diff-stages", cmd_diff_stages, RUN_SETUP },
|
||||
{ "diff-tree", cmd_diff_tree, RUN_SETUP },
|
||||
{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
|
||||
{ "format-patch", cmd_format_patch, RUN_SETUP },
|
||||
{ "get-tar-commit-id", cmd_get_tar_commit_id },
|
||||
{ "grep", cmd_grep, RUN_SETUP },
|
||||
{ "help", cmd_help },
|
||||
{ "init-db", cmd_init_db },
|
||||
{ "log", cmd_log, RUN_SETUP | USE_PAGER },
|
||||
{ "ls-files", cmd_ls_files, RUN_SETUP },
|
||||
{ "ls-tree", cmd_ls_tree, RUN_SETUP },
|
||||
{ "mailinfo", cmd_mailinfo },
|
||||
{ "stripspace", cmd_stripspace },
|
||||
{ "update-index", cmd_update_index, NEEDS_PREFIX },
|
||||
{ "update-ref", cmd_update_ref, NEEDS_PREFIX },
|
||||
{ "fmt-merge-msg", cmd_fmt_merge_msg, NEEDS_PREFIX },
|
||||
{ "prune", cmd_prune, NEEDS_PREFIX },
|
||||
{ "mv", cmd_mv, NEEDS_PREFIX },
|
||||
{ "prune-packed", cmd_prune_packed, NEEDS_PREFIX },
|
||||
{ "mailsplit", cmd_mailsplit },
|
||||
{ "mv", cmd_mv, RUN_SETUP },
|
||||
{ "name-rev", cmd_name_rev, RUN_SETUP },
|
||||
{ "pack-objects", cmd_pack_objects, RUN_SETUP },
|
||||
{ "prune", cmd_prune, RUN_SETUP },
|
||||
{ "prune-packed", cmd_prune_packed, RUN_SETUP },
|
||||
{ "push", cmd_push, RUN_SETUP },
|
||||
{ "read-tree", cmd_read_tree, RUN_SETUP },
|
||||
{ "repo-config", cmd_repo_config },
|
||||
{ "rev-list", cmd_rev_list, RUN_SETUP },
|
||||
{ "rev-parse", cmd_rev_parse, RUN_SETUP },
|
||||
{ "rm", cmd_rm, RUN_SETUP },
|
||||
{ "show-branch", cmd_show_branch, RUN_SETUP },
|
||||
{ "show", cmd_show, RUN_SETUP | USE_PAGER },
|
||||
{ "stripspace", cmd_stripspace },
|
||||
{ "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
|
||||
{ "tar-tree", cmd_tar_tree, RUN_SETUP },
|
||||
{ "unpack-objects", cmd_unpack_objects, RUN_SETUP },
|
||||
{ "update-index", cmd_update_index, RUN_SETUP },
|
||||
{ "update-ref", cmd_update_ref, RUN_SETUP },
|
||||
{ "upload-tar", cmd_upload_tar },
|
||||
{ "version", cmd_version },
|
||||
{ "whatchanged", cmd_whatchanged, RUN_SETUP | USE_PAGER },
|
||||
{ "write-tree", cmd_write_tree, RUN_SETUP },
|
||||
{ "verify-pack", cmd_verify_pack },
|
||||
};
|
||||
int i;
|
||||
|
||||
@ -281,7 +287,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
||||
continue;
|
||||
|
||||
prefix = NULL;
|
||||
if (p->option & NEEDS_PREFIX)
|
||||
if (p->option & RUN_SETUP)
|
||||
prefix = setup_git_directory();
|
||||
if (p->option & USE_PAGER)
|
||||
setup_pager();
|
||||
|
@ -5,5 +5,33 @@ The one working on:
|
||||
|
||||
From the git version 1.4.0 gitweb is bundled with git.
|
||||
|
||||
Any comment/question/concern to:
|
||||
|
||||
How to configure gitweb for your local system:
|
||||
|
||||
You can specify the following configuration variables when building GIT:
|
||||
* GITWEB_SITENAME
|
||||
Shown in the title of all generated pages, defaults to the servers name.
|
||||
* GITWEB_PROJECTROOT
|
||||
The root directory for all projects shown by gitweb.
|
||||
* GITWEB_LIST
|
||||
points to a directory to scan for projects (defaults to project root)
|
||||
or to a file for explicit listing of projects.
|
||||
* GITWEB_HOMETEXT
|
||||
points to an .html file which is included on the gitweb project
|
||||
overview page.
|
||||
* GITWEB_CSS
|
||||
Points to the location where you put gitweb.css on your web server.
|
||||
* GITWEB_LOGO
|
||||
Points to the location where you put git-logo.png on your web server.
|
||||
* GITWEB_CONFIG
|
||||
This file will be loaded using 'require'. If the environment
|
||||
$GITWEB_CONFIG is set when gitweb.cgi is executed the file in the
|
||||
environment variable will be loaded instead of the file
|
||||
specified when gitweb.cgi was created.
|
||||
|
||||
Originally written by:
|
||||
Kay Sievers <kay.sievers@vrfy.org>
|
||||
|
||||
Any comment/question/concern to:
|
||||
Git mailing list <git@vger.kernel.org>
|
||||
|
||||
|
BIN
gitweb/git-logo.png
Normal file
BIN
gitweb/git-logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 208 B |
@ -117,9 +117,14 @@ div.list_head {
|
||||
|
||||
a.list {
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
table.tags a.list {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
a.list:hover {
|
||||
text-decoration: underline;
|
||||
color: #880000;
|
||||
@ -171,6 +176,10 @@ tr.dark {
|
||||
background-color: #f6f6f0;
|
||||
}
|
||||
|
||||
tr.dark2 {
|
||||
background-color: #f6f6f0;
|
||||
}
|
||||
|
||||
tr.dark:hover {
|
||||
background-color: #edece6;
|
||||
}
|
||||
@ -181,12 +190,16 @@ td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
td.link {
|
||||
td.link, td.selflink {
|
||||
padding: 2px 5px;
|
||||
font-family: sans-serif;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
td.selflink {
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
td.sha1 {
|
||||
font-family: monospace;
|
||||
}
|
||||
@ -196,6 +209,10 @@ td.error {
|
||||
background-color: yellow;
|
||||
}
|
||||
|
||||
td.current_head {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
table.diff_tree span.file_status.new {
|
||||
color: #008000;
|
||||
}
|
||||
@ -209,6 +226,10 @@ table.diff_tree span.file_status.mode_chnge {
|
||||
color: #777777;
|
||||
}
|
||||
|
||||
table.diff_tree span.file_status.copied {
|
||||
color: #70a070;
|
||||
}
|
||||
|
||||
/* age2: 60*60*24*2 <= age */
|
||||
table.project_list td.age2, table.blame td.age2 {
|
||||
font-style: italic;
|
||||
@ -309,15 +330,30 @@ a.rss_logo:hover {
|
||||
background-color: #ee5500;
|
||||
}
|
||||
|
||||
span.tag {
|
||||
span.refs span {
|
||||
padding: 0px 4px;
|
||||
font-size: 10px;
|
||||
font-weight: normal;
|
||||
background-color: #ffffaa;
|
||||
border: 1px solid;
|
||||
background-color: #ffaaff;
|
||||
border-color: #ffccff #ff00ee #ff00ee #ffccff;
|
||||
}
|
||||
|
||||
span.refs span.ref {
|
||||
background-color: #aaaaff;
|
||||
border-color: #ccccff #0033cc #0033cc #ccccff;
|
||||
}
|
||||
|
||||
span.refs span.tag {
|
||||
background-color: #ffffaa;
|
||||
border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
|
||||
}
|
||||
|
||||
span.refs span.head {
|
||||
background-color: #aaffaa;
|
||||
border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
|
||||
}
|
||||
|
||||
span.atnight {
|
||||
color: #cc0000;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -14,7 +14,7 @@
|
||||
static int term_columns(void)
|
||||
{
|
||||
char *col_string = getenv("COLUMNS");
|
||||
int n_cols = 0;
|
||||
int n_cols;
|
||||
|
||||
if (col_string && (n_cols = atoi(col_string)) > 0)
|
||||
return n_cols;
|
16
http-fetch.c
16
http-fetch.c
@ -36,10 +36,10 @@ enum XML_Status {
|
||||
#define PREV_BUF_SIZE 4096
|
||||
#define RANGE_HEADER_SIZE 30
|
||||
|
||||
static int commits_on_stdin = 0;
|
||||
static int commits_on_stdin;
|
||||
|
||||
static int got_alternates = -1;
|
||||
static int corrupt_object_found = 0;
|
||||
static int corrupt_object_found;
|
||||
|
||||
static struct curl_slist *no_pragma_header;
|
||||
|
||||
@ -52,7 +52,7 @@ struct alt_base
|
||||
struct alt_base *next;
|
||||
};
|
||||
|
||||
static struct alt_base *alt = NULL;
|
||||
static struct alt_base *alt;
|
||||
|
||||
enum object_request_state {
|
||||
WAITING,
|
||||
@ -114,7 +114,7 @@ struct remote_ls_ctx
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct object_request *object_queue_head = NULL;
|
||||
static struct object_request *object_queue_head;
|
||||
|
||||
static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb,
|
||||
void *data)
|
||||
@ -301,7 +301,7 @@ static void finish_object_request(struct object_request *obj_req)
|
||||
unlink(obj_req->tmpfile);
|
||||
return;
|
||||
}
|
||||
if (memcmp(obj_req->sha1, obj_req->real_sha1, 20)) {
|
||||
if (hashcmp(obj_req->sha1, obj_req->real_sha1)) {
|
||||
unlink(obj_req->tmpfile);
|
||||
return;
|
||||
}
|
||||
@ -393,7 +393,7 @@ void prefetch(unsigned char *sha1)
|
||||
char *filename = sha1_file_name(sha1);
|
||||
|
||||
newreq = xmalloc(sizeof(*newreq));
|
||||
memcpy(newreq->sha1, sha1, 20);
|
||||
hashcpy(newreq->sha1, sha1);
|
||||
newreq->repo = alt;
|
||||
newreq->url = NULL;
|
||||
newreq->local = -1;
|
||||
@ -1070,7 +1070,7 @@ static int fetch_object(struct alt_base *repo, unsigned char *sha1)
|
||||
int ret = 0;
|
||||
struct object_request *obj_req = object_queue_head;
|
||||
|
||||
while (obj_req != NULL && memcmp(obj_req->sha1, sha1, 20))
|
||||
while (obj_req != NULL && hashcmp(obj_req->sha1, sha1))
|
||||
obj_req = obj_req->next;
|
||||
if (obj_req == NULL)
|
||||
return error("Couldn't find request for %s in the queue", hex);
|
||||
@ -1109,7 +1109,7 @@ static int fetch_object(struct alt_base *repo, unsigned char *sha1)
|
||||
} else if (obj_req->zret != Z_STREAM_END) {
|
||||
corrupt_object_found++;
|
||||
ret = error("File %s (%s) corrupt", hex, obj_req->url);
|
||||
} else if (memcmp(obj_req->sha1, obj_req->real_sha1, 20)) {
|
||||
} else if (hashcmp(obj_req->sha1, obj_req->real_sha1)) {
|
||||
ret = error("File %s has bad hash", hex);
|
||||
} else if (obj_req->rename < 0) {
|
||||
ret = error("unable to write sha1 filename %s",
|
||||
|
74
http-push.c
74
http-push.c
@ -70,18 +70,18 @@ enum XML_Status {
|
||||
/* We allow "recursive" symbolic refs. Only within reason, though */
|
||||
#define MAXDEPTH 5
|
||||
|
||||
static int pushing = 0;
|
||||
static int aborted = 0;
|
||||
static int pushing;
|
||||
static int aborted;
|
||||
static signed char remote_dir_exists[256];
|
||||
|
||||
static struct curl_slist *no_pragma_header;
|
||||
static struct curl_slist *default_headers;
|
||||
|
||||
static int push_verbosely = 0;
|
||||
static int push_all = 0;
|
||||
static int force_all = 0;
|
||||
static int push_verbosely;
|
||||
static int push_all;
|
||||
static int force_all;
|
||||
|
||||
static struct object_list *objects = NULL;
|
||||
static struct object_list *objects;
|
||||
|
||||
struct repo
|
||||
{
|
||||
@ -94,7 +94,7 @@ struct repo
|
||||
struct remote_lock *locks;
|
||||
};
|
||||
|
||||
static struct repo *remote = NULL;
|
||||
static struct repo *remote;
|
||||
|
||||
enum transfer_state {
|
||||
NEED_FETCH,
|
||||
@ -134,7 +134,7 @@ struct transfer_request
|
||||
struct transfer_request *next;
|
||||
};
|
||||
|
||||
static struct transfer_request *request_queue_head = NULL;
|
||||
static struct transfer_request *request_queue_head;
|
||||
|
||||
struct xml_ctx
|
||||
{
|
||||
@ -745,7 +745,7 @@ static void finish_request(struct transfer_request *request)
|
||||
SHA1_Final(request->real_sha1, &request->c);
|
||||
if (request->zret != Z_STREAM_END) {
|
||||
unlink(request->tmpfile);
|
||||
} else if (memcmp(request->obj->sha1, request->real_sha1, 20)) {
|
||||
} else if (hashcmp(request->obj->sha1, request->real_sha1)) {
|
||||
unlink(request->tmpfile);
|
||||
} else {
|
||||
request->rename =
|
||||
@ -1874,7 +1874,7 @@ static int one_local_ref(const char *refname, const unsigned char *sha1)
|
||||
struct ref *ref;
|
||||
int len = strlen(refname) + 1;
|
||||
ref = xcalloc(1, sizeof(*ref) + len);
|
||||
memcpy(ref->new_sha1, sha1, 20);
|
||||
hashcpy(ref->new_sha1, sha1);
|
||||
memcpy(ref->name, refname, len);
|
||||
*local_tail = ref;
|
||||
local_tail = &ref->next;
|
||||
@ -1909,7 +1909,7 @@ static void one_remote_ref(char *refname)
|
||||
}
|
||||
|
||||
ref = xcalloc(1, sizeof(*ref) + len);
|
||||
memcpy(ref->old_sha1, remote_sha1, 20);
|
||||
hashcpy(ref->old_sha1, remote_sha1);
|
||||
memcpy(ref->name, refname, len);
|
||||
*remote_tail = ref;
|
||||
remote_tail = &ref->next;
|
||||
@ -2164,7 +2164,7 @@ static void fetch_symref(const char *path, char **symref, unsigned char *sha1)
|
||||
if (*symref != NULL)
|
||||
free(*symref);
|
||||
*symref = NULL;
|
||||
memset(sha1, 0, 20);
|
||||
hashclr(sha1);
|
||||
|
||||
if (buffer.posn == 0)
|
||||
return;
|
||||
@ -2182,49 +2182,11 @@ static void fetch_symref(const char *path, char **symref, unsigned char *sha1)
|
||||
|
||||
static int verify_merge_base(unsigned char *head_sha1, unsigned char *branch_sha1)
|
||||
{
|
||||
int pipe_fd[2];
|
||||
pid_t merge_base_pid;
|
||||
char line[PATH_MAX + 20];
|
||||
unsigned char merge_sha1[20];
|
||||
int verified = 0;
|
||||
struct commit *head = lookup_commit(head_sha1);
|
||||
struct commit *branch = lookup_commit(branch_sha1);
|
||||
struct commit_list *merge_bases = get_merge_bases(head, branch, 1);
|
||||
|
||||
if (pipe(pipe_fd) < 0)
|
||||
die("Verify merge base: pipe failed");
|
||||
|
||||
merge_base_pid = fork();
|
||||
if (!merge_base_pid) {
|
||||
static const char *args[] = {
|
||||
"merge-base",
|
||||
"-a",
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
args[2] = strdup(sha1_to_hex(head_sha1));
|
||||
args[3] = sha1_to_hex(branch_sha1);
|
||||
|
||||
dup2(pipe_fd[1], 1);
|
||||
close(pipe_fd[0]);
|
||||
close(pipe_fd[1]);
|
||||
execv_git_cmd(args);
|
||||
die("merge-base setup failed");
|
||||
}
|
||||
if (merge_base_pid < 0)
|
||||
die("merge-base fork failed");
|
||||
|
||||
dup2(pipe_fd[0], 0);
|
||||
close(pipe_fd[0]);
|
||||
close(pipe_fd[1]);
|
||||
while (fgets(line, sizeof(line), stdin) != NULL) {
|
||||
if (get_sha1_hex(line, merge_sha1))
|
||||
die("expected sha1, got garbage:\n %s", line);
|
||||
if (!memcmp(branch_sha1, merge_sha1, 20)) {
|
||||
verified = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return verified;
|
||||
return (merge_bases && !merge_bases->next && merge_bases->item == branch);
|
||||
}
|
||||
|
||||
static int delete_remote_branch(char *pattern, int force)
|
||||
@ -2454,7 +2416,7 @@ int main(int argc, char **argv)
|
||||
|
||||
if (!ref->peer_ref)
|
||||
continue;
|
||||
if (!memcmp(ref->old_sha1, ref->peer_ref->new_sha1, 20)) {
|
||||
if (!hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) {
|
||||
if (push_verbosely || 1)
|
||||
fprintf(stderr, "'%s': up-to-date\n", ref->name);
|
||||
continue;
|
||||
@ -2483,7 +2445,7 @@ int main(int argc, char **argv)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
memcpy(ref->new_sha1, ref->peer_ref->new_sha1, 20);
|
||||
hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
|
||||
if (is_zero_sha1(ref->new_sha1)) {
|
||||
error("cannot happen anymore");
|
||||
rc = -3;
|
||||
|
16
index-pack.c
16
index-pack.c
@ -82,7 +82,7 @@ static void parse_pack_header(void)
|
||||
SHA1_Init(&ctx);
|
||||
SHA1_Update(&ctx, pack_base, pack_size - 20);
|
||||
SHA1_Final(sha1, &ctx);
|
||||
if (memcmp(sha1, pack_base + pack_size - 20, 20))
|
||||
if (hashcmp(sha1, pack_base + pack_size - 20))
|
||||
die("packfile '%s' SHA1 mismatch", pack_name);
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@ static void *unpack_raw_entry(unsigned long offset,
|
||||
case OBJ_DELTA:
|
||||
if (pos + 20 >= pack_limit)
|
||||
bad_object(offset, "object extends past end of pack");
|
||||
memcpy(delta_base, pack_base + pos, 20);
|
||||
hashcpy(delta_base, pack_base + pos);
|
||||
pos += 20;
|
||||
/* fallthru */
|
||||
case OBJ_COMMIT:
|
||||
@ -189,7 +189,7 @@ static int find_delta(const unsigned char *base_sha1)
|
||||
struct delta_entry *delta = &deltas[next];
|
||||
int cmp;
|
||||
|
||||
cmp = memcmp(base_sha1, delta->base_sha1, 20);
|
||||
cmp = hashcmp(base_sha1, delta->base_sha1);
|
||||
if (!cmp)
|
||||
return next;
|
||||
if (cmp < 0) {
|
||||
@ -210,9 +210,9 @@ static int find_deltas_based_on_sha1(const unsigned char *base_sha1,
|
||||
|
||||
if (first < 0)
|
||||
return -1;
|
||||
while (first > 0 && !memcmp(deltas[first-1].base_sha1, base_sha1, 20))
|
||||
while (first > 0 && !hashcmp(deltas[first - 1].base_sha1, base_sha1))
|
||||
--first;
|
||||
while (last < end && !memcmp(deltas[last+1].base_sha1, base_sha1, 20))
|
||||
while (last < end && !hashcmp(deltas[last + 1].base_sha1, base_sha1))
|
||||
++last;
|
||||
*first_index = first;
|
||||
*last_index = last;
|
||||
@ -278,7 +278,7 @@ static int compare_delta_entry(const void *a, const void *b)
|
||||
{
|
||||
const struct delta_entry *delta_a = a;
|
||||
const struct delta_entry *delta_b = b;
|
||||
return memcmp(delta_a->base_sha1, delta_b->base_sha1, 20);
|
||||
return hashcmp(delta_a->base_sha1, delta_b->base_sha1);
|
||||
}
|
||||
|
||||
static void parse_pack_objects(void)
|
||||
@ -304,7 +304,7 @@ static void parse_pack_objects(void)
|
||||
if (obj->type == OBJ_DELTA) {
|
||||
struct delta_entry *delta = &deltas[nr_deltas++];
|
||||
delta->obj = obj;
|
||||
memcpy(delta->base_sha1, base_sha1, 20);
|
||||
hashcpy(delta->base_sha1, base_sha1);
|
||||
} else
|
||||
sha1_object(data, data_size, obj->type, obj->sha1);
|
||||
free(data);
|
||||
@ -350,7 +350,7 @@ static int sha1_compare(const void *_a, const void *_b)
|
||||
{
|
||||
struct object_entry *a = *(struct object_entry **)_a;
|
||||
struct object_entry *b = *(struct object_entry **)_b;
|
||||
return memcmp(a->sha1, b->sha1, 20);
|
||||
return hashcmp(a->sha1, b->sha1);
|
||||
}
|
||||
|
||||
static void write_index_file(const char *index_name, unsigned char *sha1)
|
||||
|
@ -5,10 +5,10 @@
|
||||
#include "commit.h"
|
||||
#include "fetch.h"
|
||||
|
||||
static int use_link = 0;
|
||||
static int use_symlink = 0;
|
||||
static int use_link;
|
||||
static int use_symlink;
|
||||
static int use_filecopy = 1;
|
||||
static int commits_on_stdin = 0;
|
||||
static int commits_on_stdin;
|
||||
|
||||
static const char *path; /* "Remote" git repository */
|
||||
|
||||
@ -16,7 +16,7 @@ void prefetch(unsigned char *sha1)
|
||||
{
|
||||
}
|
||||
|
||||
static struct packed_git *packs = NULL;
|
||||
static struct packed_git *packs;
|
||||
|
||||
static void setup_index(unsigned char *sha1)
|
||||
{
|
||||
|
44
log-tree.c
44
log-tree.c
@ -19,7 +19,7 @@ static int append_signoff(char *buf, int buf_sz, int at, const char *signoff)
|
||||
char *cp = buf;
|
||||
|
||||
/* Do we have enough space to add it? */
|
||||
if (buf_sz - at <= strlen(signed_off_by) + signoff_len + 2)
|
||||
if (buf_sz - at <= strlen(signed_off_by) + signoff_len + 3)
|
||||
return at;
|
||||
|
||||
/* First see if we already have the sign-off by the signer */
|
||||
@ -34,6 +34,48 @@ static int append_signoff(char *buf, int buf_sz, int at, const char *signoff)
|
||||
return at; /* we already have him */
|
||||
}
|
||||
|
||||
/* Does the last line already end with "^[-A-Za-z]+: [^@]+@"?
|
||||
* If not, add a blank line to separate the message from
|
||||
* the run of Signed-off-by: and Acked-by: lines.
|
||||
*/
|
||||
{
|
||||
char ch;
|
||||
int seen_colon, seen_at, seen_name, seen_head, not_signoff;
|
||||
seen_colon = 0;
|
||||
seen_at = 0;
|
||||
seen_name = 0;
|
||||
seen_head = 0;
|
||||
not_signoff = 0;
|
||||
cp = buf + at;
|
||||
while (buf <= --cp && (ch = *cp) == '\n')
|
||||
;
|
||||
while (!not_signoff && buf <= cp && (ch = *cp--) != '\n') {
|
||||
if (!seen_at) {
|
||||
if (ch == '@')
|
||||
seen_at = 1;
|
||||
continue;
|
||||
}
|
||||
if (!seen_colon) {
|
||||
if (ch == '@')
|
||||
not_signoff = 1;
|
||||
else if (ch == ':')
|
||||
seen_colon = 1;
|
||||
else
|
||||
seen_name = 1;
|
||||
continue;
|
||||
}
|
||||
if (('A' <= ch && ch <= 'Z') ||
|
||||
('a' <= ch && ch <= 'z') ||
|
||||
ch == '-') {
|
||||
seen_head = 1;
|
||||
continue;
|
||||
}
|
||||
not_signoff = 1;
|
||||
}
|
||||
if (not_signoff || !seen_head || !seen_name)
|
||||
buf[at++] = '\n';
|
||||
}
|
||||
|
||||
strcpy(buf + at, signed_off_by);
|
||||
at += strlen(signed_off_by);
|
||||
strcpy(buf + at, signoff);
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include "cache.h"
|
||||
#include "commit.h"
|
||||
|
||||
static int show_all = 0;
|
||||
static int show_all;
|
||||
|
||||
static int merge_base(struct commit *rev1, struct commit *rev2)
|
||||
{
|
||||
|
@ -4,14 +4,15 @@
|
||||
|
||||
#include "cache.h"
|
||||
|
||||
static const char *pgm = NULL;
|
||||
static const char *pgm;
|
||||
static const char *arguments[8];
|
||||
static int one_shot, quiet;
|
||||
static int err;
|
||||
|
||||
static void run_program(void)
|
||||
{
|
||||
int pid = fork(), status;
|
||||
pid_t pid = fork();
|
||||
int status;
|
||||
|
||||
if (pid < 0)
|
||||
die("unable to fork");
|
||||
|
@ -152,7 +152,7 @@ static int same_entry(struct name_entry *a, struct name_entry *b)
|
||||
{
|
||||
return a->sha1 &&
|
||||
b->sha1 &&
|
||||
!memcmp(a->sha1, b->sha1, 20) &&
|
||||
!hashcmp(a->sha1, b->sha1) &&
|
||||
a->mode == b->mode;
|
||||
}
|
||||
|
||||
|
5
mktree.c
5
mktree.c
@ -30,7 +30,7 @@ static void append_to_tree(unsigned mode, unsigned char *sha1, char *path)
|
||||
ent = entries[used++] = xmalloc(sizeof(**entries) + len + 1);
|
||||
ent->mode = mode;
|
||||
ent->len = len;
|
||||
memcpy(ent->sha1, sha1, 20);
|
||||
hashcpy(ent->sha1, sha1);
|
||||
memcpy(ent->name, path, len+1);
|
||||
}
|
||||
|
||||
@ -49,7 +49,6 @@ static void write_tree(unsigned char *sha1)
|
||||
int i;
|
||||
|
||||
qsort(entries, used, sizeof(*entries), ent_compare);
|
||||
size = 100;
|
||||
for (size = i = 0; i < used; i++)
|
||||
size += 32 + entries[i]->len;
|
||||
buffer = xmalloc(size);
|
||||
@ -65,7 +64,7 @@ static void write_tree(unsigned char *sha1)
|
||||
offset += sprintf(buffer + offset, "%o ", ent->mode);
|
||||
offset += sprintf(buffer + offset, "%s", ent->name);
|
||||
buffer[offset++] = 0;
|
||||
memcpy(buffer + offset, ent->sha1, 20);
|
||||
hashcpy((unsigned char*)buffer + offset, ent->sha1);
|
||||
offset += 20;
|
||||
}
|
||||
write_sha1_file(buffer, offset, tree_type, sha1);
|
||||
|
4
object.c
4
object.c
@ -58,7 +58,7 @@ struct object *lookup_object(const unsigned char *sha1)
|
||||
|
||||
i = hashtable_index(sha1);
|
||||
while ((obj = obj_hash[i]) != NULL) {
|
||||
if (!memcmp(sha1, obj->sha1, 20))
|
||||
if (!hashcmp(sha1, obj->sha1))
|
||||
break;
|
||||
i++;
|
||||
if (i == obj_hash_size)
|
||||
@ -91,7 +91,7 @@ void created_object(const unsigned char *sha1, struct object *obj)
|
||||
obj->used = 0;
|
||||
obj->type = OBJ_NONE;
|
||||
obj->flags = 0;
|
||||
memcpy(obj->sha1, sha1, 20);
|
||||
hashcpy(obj->sha1, sha1);
|
||||
|
||||
if (obj_hash_size - 1 <= nr_objs * 2)
|
||||
grow_object_hash();
|
||||
|
@ -29,10 +29,10 @@ static int verify_packfile(struct packed_git *p)
|
||||
pack_base = p->pack_base;
|
||||
SHA1_Update(&ctx, pack_base, pack_size - 20);
|
||||
SHA1_Final(sha1, &ctx);
|
||||
if (memcmp(sha1, (char *) pack_base + pack_size - 20, 20))
|
||||
if (hashcmp(sha1, (unsigned char *)pack_base + pack_size - 20))
|
||||
return error("Packfile %s SHA1 mismatch with itself",
|
||||
p->pack_name);
|
||||
if (memcmp(sha1, (char *) index_base + index_size - 40, 20))
|
||||
if (hashcmp(sha1, (unsigned char *)index_base + index_size - 40))
|
||||
return error("Packfile %s SHA1 mismatch with idx",
|
||||
p->pack_name);
|
||||
|
||||
@ -135,7 +135,7 @@ int verify_pack(struct packed_git *p, int verbose)
|
||||
SHA1_Init(&ctx);
|
||||
SHA1_Update(&ctx, index_base, index_size - 20);
|
||||
SHA1_Final(sha1, &ctx);
|
||||
if (memcmp(sha1, (char *) index_base + index_size - 20, 20))
|
||||
if (hashcmp(sha1, (unsigned char *)index_base + index_size - 20))
|
||||
ret = error("Packfile index for %s SHA1 mismatch",
|
||||
p->pack_name);
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
static const char pack_redundant_usage[] =
|
||||
"git-pack-redundant [ --verbose ] [ --alt-odb ] < --all | <.pack filename> ...>";
|
||||
|
||||
static int load_all_packs = 0, verbose = 0, alt_odb = 0;
|
||||
static int load_all_packs, verbose, alt_odb;
|
||||
|
||||
struct llist_item {
|
||||
struct llist_item *next;
|
||||
@ -37,7 +37,7 @@ struct pll {
|
||||
struct pack_list *pl;
|
||||
};
|
||||
|
||||
static struct llist_item *free_nodes = NULL;
|
||||
static struct llist_item *free_nodes;
|
||||
|
||||
static inline void llist_item_put(struct llist_item *item)
|
||||
{
|
||||
@ -139,7 +139,7 @@ static inline struct llist_item *llist_insert_sorted_unique(struct llist *list,
|
||||
|
||||
l = (hint == NULL) ? list->front : hint;
|
||||
while (l) {
|
||||
int cmp = memcmp(l->sha1, sha1, 20);
|
||||
int cmp = hashcmp(l->sha1, sha1);
|
||||
if (cmp > 0) { /* we insert before this entry */
|
||||
return llist_insert(list, prev, sha1);
|
||||
}
|
||||
@ -162,7 +162,7 @@ redo_from_start:
|
||||
l = (hint == NULL) ? list->front : hint;
|
||||
prev = NULL;
|
||||
while (l) {
|
||||
int cmp = memcmp(l->sha1, sha1, 20);
|
||||
int cmp = hashcmp(l->sha1, sha1);
|
||||
if (cmp > 0) /* not in list, since sorted */
|
||||
return prev;
|
||||
if(!cmp) { /* found */
|
||||
@ -256,7 +256,7 @@ static void cmp_two_packs(struct pack_list *p1, struct pack_list *p2)
|
||||
while (p1_off <= p1->pack->index_size - 3 * 20 &&
|
||||
p2_off <= p2->pack->index_size - 3 * 20)
|
||||
{
|
||||
int cmp = memcmp(p1_base + p1_off, p2_base + p2_off, 20);
|
||||
int cmp = hashcmp(p1_base + p1_off, p2_base + p2_off);
|
||||
/* cmp ~ p1 - p2 */
|
||||
if (cmp == 0) {
|
||||
p1_hint = llist_sorted_remove(p1->unique_objects,
|
||||
@ -351,16 +351,16 @@ static size_t sizeof_union(struct packed_git *p1, struct packed_git *p2)
|
||||
{
|
||||
size_t ret = 0;
|
||||
int p1_off, p2_off;
|
||||
char *p1_base, *p2_base;
|
||||
unsigned char *p1_base, *p2_base;
|
||||
|
||||
p1_off = p2_off = 256 * 4 + 4;
|
||||
p1_base = (char *)p1->index_base;
|
||||
p2_base = (char *)p2->index_base;
|
||||
p1_base = (unsigned char *)p1->index_base;
|
||||
p2_base = (unsigned char *)p2->index_base;
|
||||
|
||||
while (p1_off <= p1->index_size - 3 * 20 &&
|
||||
p2_off <= p2->index_size - 3 * 20)
|
||||
{
|
||||
int cmp = memcmp(p1_base + p1_off, p2_base + p2_off, 20);
|
||||
int cmp = hashcmp(p1_base + p1_off, p2_base + p2_off);
|
||||
/* cmp ~ p1 - p2 */
|
||||
if (cmp == 0) {
|
||||
ret++;
|
||||
|
4
pager.c
4
pager.c
@ -15,10 +15,12 @@ void setup_pager(void)
|
||||
{
|
||||
pid_t pid;
|
||||
int fd[2];
|
||||
const char *pager = getenv("PAGER");
|
||||
const char *pager = getenv("GIT_PAGER");
|
||||
|
||||
if (!isatty(1))
|
||||
return;
|
||||
if (!pager)
|
||||
pager = getenv("PAGER");
|
||||
if (!pager)
|
||||
pager = "less";
|
||||
else if (!*pager || !strcmp(pager, "cat"))
|
||||
|
@ -47,7 +47,7 @@ static void generate_id_list(void)
|
||||
|
||||
if (!get_sha1_hex(p, n)) {
|
||||
flush_current_id(patchlen, sha1, &ctx);
|
||||
memcpy(sha1, n, 20);
|
||||
hashcpy(sha1, n);
|
||||
patchlen = 0;
|
||||
continue;
|
||||
}
|
||||
|
54
read-cache.c
54
read-cache.c
@ -18,16 +18,16 @@
|
||||
#define CACHE_EXT(s) ( (s[0]<<24)|(s[1]<<16)|(s[2]<<8)|(s[3]) )
|
||||
#define CACHE_EXT_TREE 0x54524545 /* "TREE" */
|
||||
|
||||
struct cache_entry **active_cache = NULL;
|
||||
struct cache_entry **active_cache;
|
||||
static time_t index_file_timestamp;
|
||||
unsigned int active_nr = 0, active_alloc = 0, active_cache_changed = 0;
|
||||
unsigned int active_nr, active_alloc, active_cache_changed;
|
||||
|
||||
struct cache_tree *active_cache_tree = NULL;
|
||||
struct cache_tree *active_cache_tree;
|
||||
|
||||
int cache_errno = 0;
|
||||
int cache_errno;
|
||||
|
||||
static void *cache_mmap = NULL;
|
||||
static size_t cache_mmap_size = 0;
|
||||
static void *cache_mmap;
|
||||
static size_t cache_mmap_size;
|
||||
|
||||
/*
|
||||
* This only updates the "non-critical" parts of the directory
|
||||
@ -60,7 +60,7 @@ static int ce_compare_data(struct cache_entry *ce, struct stat *st)
|
||||
if (fd >= 0) {
|
||||
unsigned char sha1[20];
|
||||
if (!index_fd(sha1, fd, st, 0, NULL))
|
||||
match = memcmp(sha1, ce->sha1, 20);
|
||||
match = hashcmp(sha1, ce->sha1);
|
||||
/* index_fd() closed the file descriptor already */
|
||||
}
|
||||
return match;
|
||||
@ -169,9 +169,11 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
|
||||
return changed;
|
||||
}
|
||||
|
||||
int ce_match_stat(struct cache_entry *ce, struct stat *st, int ignore_valid)
|
||||
int ce_match_stat(struct cache_entry *ce, struct stat *st, int options)
|
||||
{
|
||||
unsigned int changed;
|
||||
int ignore_valid = options & 01;
|
||||
int assume_racy_is_modified = options & 02;
|
||||
|
||||
/*
|
||||
* If it's marked as always valid in the index, it's
|
||||
@ -200,8 +202,12 @@ int ce_match_stat(struct cache_entry *ce, struct stat *st, int ignore_valid)
|
||||
*/
|
||||
if (!changed &&
|
||||
index_file_timestamp &&
|
||||
index_file_timestamp <= ntohl(ce->ce_mtime.sec))
|
||||
index_file_timestamp <= ntohl(ce->ce_mtime.sec)) {
|
||||
if (assume_racy_is_modified)
|
||||
changed |= DATA_CHANGED;
|
||||
else
|
||||
changed |= ce_modified_check_fs(ce, st);
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
@ -738,7 +744,7 @@ static int verify_hdr(struct cache_header *hdr, unsigned long size)
|
||||
SHA1_Init(&c);
|
||||
SHA1_Update(&c, hdr, size - 20);
|
||||
SHA1_Final(sha1, &c);
|
||||
if (memcmp(sha1, (char *) hdr + size - 20, 20))
|
||||
if (hashcmp(sha1, (unsigned char *)hdr + size - 20))
|
||||
return error("bad index file sha1 signature");
|
||||
return 0;
|
||||
}
|
||||
@ -857,6 +863,18 @@ int discard_cache()
|
||||
static unsigned char write_buffer[WRITE_BUFFER_SIZE];
|
||||
static unsigned long write_buffer_len;
|
||||
|
||||
static int ce_write_flush(SHA_CTX *context, int fd)
|
||||
{
|
||||
unsigned int buffered = write_buffer_len;
|
||||
if (buffered) {
|
||||
SHA1_Update(context, write_buffer, buffered);
|
||||
if (write(fd, write_buffer, buffered) != buffered)
|
||||
return -1;
|
||||
write_buffer_len = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ce_write(SHA_CTX *context, int fd, void *data, unsigned int len)
|
||||
{
|
||||
while (len) {
|
||||
@ -867,8 +885,8 @@ static int ce_write(SHA_CTX *context, int fd, void *data, unsigned int len)
|
||||
memcpy(write_buffer + buffered, data, partial);
|
||||
buffered += partial;
|
||||
if (buffered == WRITE_BUFFER_SIZE) {
|
||||
SHA1_Update(context, write_buffer, WRITE_BUFFER_SIZE);
|
||||
if (write(fd, write_buffer, WRITE_BUFFER_SIZE) != WRITE_BUFFER_SIZE)
|
||||
write_buffer_len = buffered;
|
||||
if (ce_write_flush(context, fd))
|
||||
return -1;
|
||||
buffered = 0;
|
||||
}
|
||||
@ -884,10 +902,8 @@ static int write_index_ext_header(SHA_CTX *context, int fd,
|
||||
{
|
||||
ext = htonl(ext);
|
||||
sz = htonl(sz);
|
||||
if ((ce_write(context, fd, &ext, 4) < 0) ||
|
||||
(ce_write(context, fd, &sz, 4) < 0))
|
||||
return -1;
|
||||
return 0;
|
||||
return ((ce_write(context, fd, &ext, 4) < 0) ||
|
||||
(ce_write(context, fd, &sz, 4) < 0)) ? -1 : 0;
|
||||
}
|
||||
|
||||
static int ce_flush(SHA_CTX *context, int fd)
|
||||
@ -909,9 +925,7 @@ static int ce_flush(SHA_CTX *context, int fd)
|
||||
/* Append the SHA1 signature at the end */
|
||||
SHA1_Final(write_buffer + left, context);
|
||||
left += 20;
|
||||
if (write(fd, write_buffer, left) != left)
|
||||
return -1;
|
||||
return 0;
|
||||
return (write(fd, write_buffer, left) != left) ? -1 : 0;
|
||||
}
|
||||
|
||||
static void ce_smudge_racily_clean_entry(struct cache_entry *ce)
|
||||
@ -940,7 +954,7 @@ static void ce_smudge_racily_clean_entry(struct cache_entry *ce)
|
||||
* $ echo filfre >nitfol
|
||||
* $ git-update-index --add nitfol
|
||||
*
|
||||
* but it does not. Whe the second update-index runs,
|
||||
* but it does not. When the second update-index runs,
|
||||
* it notices that the entry "frotz" has the same timestamp
|
||||
* as index, and if we were to smudge it by resetting its
|
||||
* size to zero here, then the object name recorded
|
||||
|
@ -8,10 +8,10 @@ static const char receive_pack_usage[] = "git-receive-pack <git-dir>";
|
||||
|
||||
static const char *unpacker[] = { "unpack-objects", NULL };
|
||||
|
||||
static int report_status = 0;
|
||||
static int report_status;
|
||||
|
||||
static char capabilities[] = "report-status";
|
||||
static int capabilities_sent = 0;
|
||||
static int capabilities_sent;
|
||||
|
||||
static int show_ref(const char *path, const unsigned char *sha1)
|
||||
{
|
||||
@ -40,7 +40,7 @@ struct command {
|
||||
char ref_name[FLEX_ARRAY]; /* more */
|
||||
};
|
||||
|
||||
static struct command *commands = NULL;
|
||||
static struct command *commands;
|
||||
|
||||
static int is_all_zeroes(const char *hex)
|
||||
{
|
||||
@ -247,8 +247,8 @@ static void read_head_info(void)
|
||||
report_status = 1;
|
||||
}
|
||||
cmd = xmalloc(sizeof(struct command) + len - 80);
|
||||
memcpy(cmd->old_sha1, old_sha1, 20);
|
||||
memcpy(cmd->new_sha1, new_sha1, 20);
|
||||
hashcpy(cmd->old_sha1, old_sha1);
|
||||
hashcpy(cmd->new_sha1, new_sha1);
|
||||
memcpy(cmd->ref_name, line + 82, len - 81);
|
||||
cmd->error_string = "n/a (unpacker error)";
|
||||
cmd->next = NULL;
|
||||
|
10
refs.c
10
refs.c
@ -29,7 +29,7 @@ const char *resolve_ref(const char *path, unsigned char *sha1, int reading)
|
||||
if (lstat(path, &st) < 0) {
|
||||
if (reading || errno != ENOENT)
|
||||
return NULL;
|
||||
memset(sha1, 0, 20);
|
||||
hashclr(sha1);
|
||||
return path;
|
||||
}
|
||||
|
||||
@ -281,7 +281,7 @@ static struct ref_lock *verify_lock(struct ref_lock *lock,
|
||||
unlock_ref(lock);
|
||||
return NULL;
|
||||
}
|
||||
if (memcmp(lock->old_sha1, old_sha1, 20)) {
|
||||
if (hashcmp(lock->old_sha1, old_sha1)) {
|
||||
error("Ref %s is at %s but expected %s", lock->ref_file,
|
||||
sha1_to_hex(lock->old_sha1), sha1_to_hex(old_sha1));
|
||||
unlock_ref(lock);
|
||||
@ -411,7 +411,7 @@ int write_ref_sha1(struct ref_lock *lock,
|
||||
|
||||
if (!lock)
|
||||
return -1;
|
||||
if (!lock->force_write && !memcmp(lock->old_sha1, sha1, 20)) {
|
||||
if (!lock->force_write && !hashcmp(lock->old_sha1, sha1)) {
|
||||
unlock_ref(lock);
|
||||
return 0;
|
||||
}
|
||||
@ -475,7 +475,7 @@ int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1)
|
||||
die("Log %s is corrupt.", logfile);
|
||||
if (get_sha1_hex(rec + 41, sha1))
|
||||
die("Log %s is corrupt.", logfile);
|
||||
if (memcmp(logged_sha1, sha1, 20)) {
|
||||
if (hashcmp(logged_sha1, sha1)) {
|
||||
tz = strtoul(tz_c, NULL, 10);
|
||||
fprintf(stderr,
|
||||
"warning: Log %s has gap after %s.\n",
|
||||
@ -489,7 +489,7 @@ int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1)
|
||||
else {
|
||||
if (get_sha1_hex(rec + 41, logged_sha1))
|
||||
die("Log %s is corrupt.", logfile);
|
||||
if (memcmp(logged_sha1, sha1, 20)) {
|
||||
if (hashcmp(logged_sha1, sha1)) {
|
||||
tz = strtoul(tz_c, NULL, 10);
|
||||
fprintf(stderr,
|
||||
"warning: Log %s unexpectedly ended on %s.\n",
|
||||
|
@ -496,7 +496,7 @@ static int add_parents_only(struct rev_info *revs, const char *arg, int flags)
|
||||
it = get_reference(revs, arg, sha1, 0);
|
||||
if (it->type != OBJ_TAG)
|
||||
break;
|
||||
memcpy(sha1, ((struct tag*)it)->tagged->sha1, 20);
|
||||
hashcpy(sha1, ((struct tag*)it)->tagged->sha1);
|
||||
}
|
||||
if (it->type != OBJ_COMMIT)
|
||||
return 0;
|
||||
|
@ -25,15 +25,15 @@ int run_command_v_opt(int argc, const char **argv, int flags)
|
||||
}
|
||||
for (;;) {
|
||||
int status, code;
|
||||
int retval = waitpid(pid, &status, 0);
|
||||
pid_t waiting = waitpid(pid, &status, 0);
|
||||
|
||||
if (retval < 0) {
|
||||
if (waiting < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
error("waitpid failed (%s)", strerror(retval));
|
||||
error("waitpid failed (%s)", strerror(errno));
|
||||
return -ERR_RUN_COMMAND_WAITPID;
|
||||
}
|
||||
if (retval != pid)
|
||||
if (waiting != pid)
|
||||
return -ERR_RUN_COMMAND_WAITPID_WRONG_PID;
|
||||
if (WIFSIGNALED(status))
|
||||
return -ERR_RUN_COMMAND_WAITPID_SIGNAL;
|
||||
|
17
send-pack.c
17
send-pack.c
@ -9,10 +9,10 @@ static const char send_pack_usage[] =
|
||||
"git-send-pack [--all] [--exec=git-receive-pack] <remote> [<head>...]\n"
|
||||
" --all and explicit <head> specification are mutually exclusive.";
|
||||
static const char *exec = "git-receive-pack";
|
||||
static int verbose = 0;
|
||||
static int send_all = 0;
|
||||
static int force_update = 0;
|
||||
static int use_thin_pack = 0;
|
||||
static int verbose;
|
||||
static int send_all;
|
||||
static int force_update;
|
||||
static int use_thin_pack;
|
||||
|
||||
static int is_zero_sha1(const unsigned char *sha1)
|
||||
{
|
||||
@ -111,7 +111,7 @@ static void rev_list(int fd, struct ref *refs)
|
||||
exec_rev_list(refs);
|
||||
}
|
||||
|
||||
static int pack_objects(int fd, struct ref *refs)
|
||||
static void pack_objects(int fd, struct ref *refs)
|
||||
{
|
||||
pid_t rev_list_pid;
|
||||
|
||||
@ -126,7 +126,6 @@ static int pack_objects(int fd, struct ref *refs)
|
||||
* We don't wait for the rev-list pipeline in the parent:
|
||||
* we end up waiting for the other end instead
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void unmark_and_free(struct commit_list *list, unsigned int mark)
|
||||
@ -186,7 +185,7 @@ static int one_local_ref(const char *refname, const unsigned char *sha1)
|
||||
struct ref *ref;
|
||||
int len = strlen(refname) + 1;
|
||||
ref = xcalloc(1, sizeof(*ref) + len);
|
||||
memcpy(ref->new_sha1, sha1, 20);
|
||||
hashcpy(ref->new_sha1, sha1);
|
||||
memcpy(ref->name, refname, len);
|
||||
*local_tail = ref;
|
||||
local_tail = &ref->next;
|
||||
@ -266,7 +265,7 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
|
||||
char old_hex[60], *new_hex;
|
||||
if (!ref->peer_ref)
|
||||
continue;
|
||||
if (!memcmp(ref->old_sha1, ref->peer_ref->new_sha1, 20)) {
|
||||
if (!hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) {
|
||||
if (verbose)
|
||||
fprintf(stderr, "'%s': up-to-date\n", ref->name);
|
||||
continue;
|
||||
@ -311,7 +310,7 @@ static int send_pack(int in, int out, int nr_refspec, char **refspec)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
memcpy(ref->new_sha1, ref->peer_ref->new_sha1, 20);
|
||||
hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
|
||||
if (is_zero_sha1(ref->new_sha1)) {
|
||||
error("cannot happen anymore");
|
||||
ret = -3;
|
||||
|
84
sha1_file.c
84
sha1_file.c
@ -22,7 +22,7 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
const unsigned char null_sha1[20] = { 0, };
|
||||
const unsigned char null_sha1[20];
|
||||
|
||||
static unsigned int sha1_file_open_flag = O_NOATIME;
|
||||
|
||||
@ -463,6 +463,7 @@ int use_packed_git(struct packed_git *p)
|
||||
int fd;
|
||||
struct stat st;
|
||||
void *map;
|
||||
struct pack_header *hdr;
|
||||
|
||||
pack_mapped += p->pack_size;
|
||||
while (PACK_MAX_SZ < pack_mapped && unuse_one_packed_git())
|
||||
@ -482,13 +483,24 @@ int use_packed_git(struct packed_git *p)
|
||||
die("packfile %s cannot be mapped.", p->pack_name);
|
||||
p->pack_base = map;
|
||||
|
||||
/* Check if we understand this pack file. If we don't we're
|
||||
* likely too old to handle it.
|
||||
*/
|
||||
hdr = map;
|
||||
if (hdr->hdr_signature != htonl(PACK_SIGNATURE))
|
||||
die("packfile %s isn't actually a pack.", p->pack_name);
|
||||
if (!pack_version_ok(hdr->hdr_version))
|
||||
die("packfile %s is version %i and not supported"
|
||||
" (try upgrading GIT to a newer version)",
|
||||
p->pack_name, ntohl(hdr->hdr_version));
|
||||
|
||||
/* Check if the pack file matches with the index file.
|
||||
* this is cheap.
|
||||
*/
|
||||
if (memcmp((char*)(p->index_base) + p->index_size - 40,
|
||||
(char *) p->pack_base + p->pack_size - 20,
|
||||
20)) {
|
||||
|
||||
if (hashcmp((unsigned char *)(p->index_base) +
|
||||
p->index_size - 40,
|
||||
(unsigned char *)p->pack_base +
|
||||
p->pack_size - 20)) {
|
||||
die("packfile %s does not match index.", p->pack_name);
|
||||
}
|
||||
}
|
||||
@ -528,7 +540,7 @@ struct packed_git *add_packed_git(char *path, int path_len, int local)
|
||||
p->pack_use_cnt = 0;
|
||||
p->pack_local = local;
|
||||
if ((path_len > 44) && !get_sha1_hex(path + path_len - 44, sha1))
|
||||
memcpy(p->sha1, sha1, 20);
|
||||
hashcpy(p->sha1, sha1);
|
||||
return p;
|
||||
}
|
||||
|
||||
@ -559,7 +571,7 @@ struct packed_git *parse_pack_index_file(const unsigned char *sha1, char *idx_pa
|
||||
p->pack_base = NULL;
|
||||
p->pack_last_used = 0;
|
||||
p->pack_use_cnt = 0;
|
||||
memcpy(p->sha1, sha1, 20);
|
||||
hashcpy(p->sha1, sha1);
|
||||
return p;
|
||||
}
|
||||
|
||||
@ -643,11 +655,10 @@ int check_sha1_signature(const unsigned char *sha1, void *map, unsigned long siz
|
||||
SHA1_Update(&c, header, 1+sprintf(header, "%s %lu", type, size));
|
||||
SHA1_Update(&c, map, size);
|
||||
SHA1_Final(real_sha1, &c);
|
||||
return memcmp(sha1, real_sha1, 20) ? -1 : 0;
|
||||
return hashcmp(sha1, real_sha1) ? -1 : 0;
|
||||
}
|
||||
|
||||
static void *map_sha1_file_internal(const unsigned char *sha1,
|
||||
unsigned long *size)
|
||||
void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
|
||||
{
|
||||
struct stat st;
|
||||
void *map;
|
||||
@ -684,10 +695,26 @@ static void *map_sha1_file_internal(const unsigned char *sha1,
|
||||
return map;
|
||||
}
|
||||
|
||||
int legacy_loose_object(unsigned char *map)
|
||||
{
|
||||
unsigned int word;
|
||||
|
||||
/*
|
||||
* Is it a zlib-compressed buffer? If so, the first byte
|
||||
* must be 0x78 (15-bit window size, deflated), and the
|
||||
* first 16-bit word is evenly divisible by 31
|
||||
*/
|
||||
word = (map[0] << 8) + map[1];
|
||||
if (map[0] == 0x78 && !(word % 31))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz)
|
||||
{
|
||||
unsigned char c;
|
||||
unsigned int word, bits;
|
||||
unsigned int bits;
|
||||
unsigned long size;
|
||||
static const char *typename[8] = {
|
||||
NULL, /* OBJ_EXT */
|
||||
@ -703,13 +730,7 @@ static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned lon
|
||||
stream->next_out = buffer;
|
||||
stream->avail_out = bufsiz;
|
||||
|
||||
/*
|
||||
* Is it a zlib-compressed buffer? If so, the first byte
|
||||
* must be 0x78 (15-bit window size, deflated), and the
|
||||
* first 16-bit word is evenly divisible by 31
|
||||
*/
|
||||
word = (map[0] << 8) + map[1];
|
||||
if (map[0] == 0x78 && !(word % 31)) {
|
||||
if (legacy_loose_object(map)) {
|
||||
inflateInit(stream);
|
||||
return inflate(stream, 0);
|
||||
}
|
||||
@ -932,7 +953,7 @@ int check_reuse_pack_delta(struct packed_git *p, unsigned long offset,
|
||||
ptr = unpack_object_header(p, ptr, kindp, sizep);
|
||||
if (*kindp != OBJ_DELTA)
|
||||
goto done;
|
||||
memcpy(base, (char *) p->pack_base + ptr, 20);
|
||||
hashcpy(base, (unsigned char *) p->pack_base + ptr);
|
||||
status = 0;
|
||||
done:
|
||||
unuse_packed_git(p);
|
||||
@ -960,7 +981,7 @@ void packed_object_info_detail(struct pack_entry *e,
|
||||
if (p->pack_size <= offset + 20)
|
||||
die("pack file %s records an incomplete delta base",
|
||||
p->pack_name);
|
||||
memcpy(base_sha1, pack, 20);
|
||||
hashcpy(base_sha1, pack);
|
||||
do {
|
||||
struct pack_entry base_ent;
|
||||
unsigned long junk;
|
||||
@ -1036,9 +1057,6 @@ static int packed_object_info(struct pack_entry *entry,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* forward declaration for a mutually recursive function */
|
||||
static void *unpack_entry(struct pack_entry *, char *, unsigned long *);
|
||||
|
||||
static void *unpack_delta_entry(unsigned char *base_sha1,
|
||||
unsigned long delta_size,
|
||||
unsigned long left,
|
||||
@ -1183,7 +1201,7 @@ int nth_packed_object_sha1(const struct packed_git *p, int n,
|
||||
void *index = p->index_base + 256;
|
||||
if (n < 0 || num_packed_objects(p) <= n)
|
||||
return -1;
|
||||
memcpy(sha1, (char *) index + (24 * n) + 4, 20);
|
||||
hashcpy(sha1, (unsigned char *) index + (24 * n) + 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1197,10 +1215,10 @@ int find_pack_entry_one(const unsigned char *sha1,
|
||||
|
||||
do {
|
||||
int mi = (lo + hi) / 2;
|
||||
int cmp = memcmp((char *) index + (24 * mi) + 4, sha1, 20);
|
||||
int cmp = hashcmp((unsigned char *)index + (24 * mi) + 4, sha1);
|
||||
if (!cmp) {
|
||||
e->offset = ntohl(*((unsigned int *) ((char *) index + (24 * mi))));
|
||||
memcpy(e->sha1, sha1, 20);
|
||||
hashcpy(e->sha1, sha1);
|
||||
e->p = p;
|
||||
return 1;
|
||||
}
|
||||
@ -1246,7 +1264,7 @@ int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep
|
||||
z_stream stream;
|
||||
char hdr[128];
|
||||
|
||||
map = map_sha1_file_internal(sha1, &mapsize);
|
||||
map = map_sha1_file(sha1, &mapsize);
|
||||
if (!map) {
|
||||
struct pack_entry e;
|
||||
|
||||
@ -1291,7 +1309,7 @@ void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size
|
||||
|
||||
if (find_pack_entry(sha1, &e))
|
||||
return read_packed_sha1(sha1, type, size);
|
||||
map = map_sha1_file_internal(sha1, &mapsize);
|
||||
map = map_sha1_file(sha1, &mapsize);
|
||||
if (map) {
|
||||
buf = unpack_sha1_file(map, mapsize, type, size);
|
||||
munmap(map, mapsize);
|
||||
@ -1313,7 +1331,7 @@ void *read_object_with_reference(const unsigned char *sha1,
|
||||
unsigned long isize;
|
||||
unsigned char actual_sha1[20];
|
||||
|
||||
memcpy(actual_sha1, sha1, 20);
|
||||
hashcpy(actual_sha1, sha1);
|
||||
while (1) {
|
||||
int ref_length = -1;
|
||||
const char *ref_type = NULL;
|
||||
@ -1324,7 +1342,7 @@ void *read_object_with_reference(const unsigned char *sha1,
|
||||
if (!strcmp(type, required_type)) {
|
||||
*size = isize;
|
||||
if (actual_sha1_return)
|
||||
memcpy(actual_sha1_return, actual_sha1, 20);
|
||||
hashcpy(actual_sha1_return, actual_sha1);
|
||||
return buffer;
|
||||
}
|
||||
/* Handle references */
|
||||
@ -1519,7 +1537,7 @@ int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned cha
|
||||
*/
|
||||
filename = write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen);
|
||||
if (returnsha1)
|
||||
memcpy(returnsha1, sha1, 20);
|
||||
hashcpy(returnsha1, sha1);
|
||||
if (has_sha1_file(sha1))
|
||||
return 0;
|
||||
fd = open(filename, O_RDONLY);
|
||||
@ -1629,7 +1647,7 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1)
|
||||
{
|
||||
int retval;
|
||||
unsigned long objsize;
|
||||
void *buf = map_sha1_file_internal(sha1, &objsize);
|
||||
void *buf = map_sha1_file(sha1, &objsize);
|
||||
|
||||
if (buf) {
|
||||
retval = write_buffer(fd, buf, objsize);
|
||||
@ -1706,7 +1724,7 @@ int write_sha1_from_fd(const unsigned char *sha1, int fd, char *buffer,
|
||||
unlink(tmpfile);
|
||||
return error("File %s corrupted", sha1_to_hex(sha1));
|
||||
}
|
||||
if (memcmp(sha1, real_sha1, 20)) {
|
||||
if (hashcmp(sha1, real_sha1)) {
|
||||
unlink(tmpfile);
|
||||
return error("File %s has bad hash", sha1_to_hex(sha1));
|
||||
}
|
||||
|
32
sha1_name.c
32
sha1_name.c
@ -84,7 +84,7 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne
|
||||
int cmp;
|
||||
|
||||
nth_packed_object_sha1(p, mid, now);
|
||||
cmp = memcmp(match, now, 20);
|
||||
cmp = hashcmp(match, now);
|
||||
if (!cmp) {
|
||||
first = mid;
|
||||
break;
|
||||
@ -103,10 +103,10 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne
|
||||
!match_sha(len, match, next)) {
|
||||
/* unique within this pack */
|
||||
if (!found) {
|
||||
memcpy(found_sha1, now, 20);
|
||||
hashcpy(found_sha1, now);
|
||||
found++;
|
||||
}
|
||||
else if (memcmp(found_sha1, now, 20)) {
|
||||
else if (hashcmp(found_sha1, now)) {
|
||||
found = 2;
|
||||
break;
|
||||
}
|
||||
@ -120,7 +120,7 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne
|
||||
}
|
||||
}
|
||||
if (found == 1)
|
||||
memcpy(sha1, found_sha1, 20);
|
||||
hashcpy(sha1, found_sha1);
|
||||
return found;
|
||||
}
|
||||
|
||||
@ -140,13 +140,13 @@ static int find_unique_short_object(int len, char *canonical,
|
||||
if (1 < has_unpacked || 1 < has_packed)
|
||||
return SHORT_NAME_AMBIGUOUS;
|
||||
if (has_unpacked != has_packed) {
|
||||
memcpy(sha1, (has_packed ? packed_sha1 : unpacked_sha1), 20);
|
||||
hashcpy(sha1, (has_packed ? packed_sha1 : unpacked_sha1));
|
||||
return 0;
|
||||
}
|
||||
/* Both have unique ones -- do they match? */
|
||||
if (memcmp(packed_sha1, unpacked_sha1, 20))
|
||||
if (hashcmp(packed_sha1, unpacked_sha1))
|
||||
return SHORT_NAME_AMBIGUOUS;
|
||||
memcpy(sha1, packed_sha1, 20);
|
||||
hashcpy(sha1, packed_sha1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -159,7 +159,7 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
|
||||
|
||||
if (len < MINIMUM_ABBREV)
|
||||
return -1;
|
||||
memset(res, 0, 20);
|
||||
hashclr(res);
|
||||
memset(canonical, 'x', 40);
|
||||
for (i = 0; i < len ;i++) {
|
||||
unsigned char c = name[i];
|
||||
@ -191,7 +191,7 @@ const char *find_unique_abbrev(const unsigned char *sha1, int len)
|
||||
int status, is_null;
|
||||
static char hex[41];
|
||||
|
||||
is_null = !memcmp(sha1, null_sha1, 20);
|
||||
is_null = is_null_sha1(sha1);
|
||||
memcpy(hex, sha1_to_hex(sha1), 40);
|
||||
if (len == 40 || !len)
|
||||
return hex;
|
||||
@ -320,13 +320,13 @@ static int get_parent(const char *name, int len,
|
||||
if (parse_commit(commit))
|
||||
return -1;
|
||||
if (!idx) {
|
||||
memcpy(result, commit->object.sha1, 20);
|
||||
hashcpy(result, commit->object.sha1);
|
||||
return 0;
|
||||
}
|
||||
p = commit->parents;
|
||||
while (p) {
|
||||
if (!--idx) {
|
||||
memcpy(result, p->item->object.sha1, 20);
|
||||
hashcpy(result, p->item->object.sha1);
|
||||
return 0;
|
||||
}
|
||||
p = p->next;
|
||||
@ -347,9 +347,9 @@ static int get_nth_ancestor(const char *name, int len,
|
||||
|
||||
if (!commit || parse_commit(commit) || !commit->parents)
|
||||
return -1;
|
||||
memcpy(sha1, commit->parents->item->object.sha1, 20);
|
||||
hashcpy(sha1, commit->parents->item->object.sha1);
|
||||
}
|
||||
memcpy(result, sha1, 20);
|
||||
hashcpy(result, sha1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -401,7 +401,7 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
|
||||
o = deref_tag(o, name, sp - name - 2);
|
||||
if (!o || (!o->parsed && !parse_object(o->sha1)))
|
||||
return -1;
|
||||
memcpy(sha1, o->sha1, 20);
|
||||
hashcpy(sha1, o->sha1);
|
||||
}
|
||||
else {
|
||||
/* At this point, the syntax look correct, so
|
||||
@ -413,7 +413,7 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
|
||||
if (!o || (!o->parsed && !parse_object(o->sha1)))
|
||||
return -1;
|
||||
if (o->type == expected_type) {
|
||||
memcpy(sha1, o->sha1, 20);
|
||||
hashcpy(sha1, o->sha1);
|
||||
return 0;
|
||||
}
|
||||
if (o->type == OBJ_TAG)
|
||||
@ -520,7 +520,7 @@ int get_sha1(const char *name, unsigned char *sha1)
|
||||
memcmp(ce->name, cp, namelen))
|
||||
break;
|
||||
if (ce_stage(ce) == stage) {
|
||||
memcpy(sha1, ce->sha1, 20);
|
||||
hashcpy(sha1, ce->sha1);
|
||||
return 0;
|
||||
}
|
||||
pos++;
|
||||
|
10
ssh-fetch.c
10
ssh-fetch.c
@ -17,7 +17,7 @@
|
||||
static int fd_in;
|
||||
static int fd_out;
|
||||
|
||||
static unsigned char remote_version = 0;
|
||||
static unsigned char remote_version;
|
||||
static unsigned char local_version = 1;
|
||||
|
||||
static ssize_t force_write(int fd, void *buffer, size_t length)
|
||||
@ -36,9 +36,9 @@ static ssize_t force_write(int fd, void *buffer, size_t length)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int prefetches = 0;
|
||||
static int prefetches;
|
||||
|
||||
static struct object_list *in_transit = NULL;
|
||||
static struct object_list *in_transit;
|
||||
static struct object_list **end_of_transit = &in_transit;
|
||||
|
||||
void prefetch(unsigned char *sha1)
|
||||
@ -59,7 +59,7 @@ void prefetch(unsigned char *sha1)
|
||||
}
|
||||
|
||||
static char conn_buf[4096];
|
||||
static size_t conn_buf_posn = 0;
|
||||
static size_t conn_buf_posn;
|
||||
|
||||
int fetch(unsigned char *sha1)
|
||||
{
|
||||
@ -67,7 +67,7 @@ int fetch(unsigned char *sha1)
|
||||
signed char remote;
|
||||
struct object_list *temp;
|
||||
|
||||
if (memcmp(sha1, in_transit->item->sha1, 20)) {
|
||||
if (hashcmp(sha1, in_transit->item->sha1)) {
|
||||
/* we must have already fetched it to clean the queue */
|
||||
return has_sha1_file(sha1) ? 0 : -1;
|
||||
}
|
||||
|
@ -15,9 +15,9 @@
|
||||
#include <string.h>
|
||||
|
||||
static unsigned char local_version = 1;
|
||||
static unsigned char remote_version = 0;
|
||||
static unsigned char remote_version;
|
||||
|
||||
static int verbose = 0;
|
||||
static int verbose;
|
||||
|
||||
static int serve_object(int fd_in, int fd_out) {
|
||||
ssize_t size;
|
||||
|
46
t/t4116-apply-reverse.sh
Executable file
46
t/t4116-apply-reverse.sh
Executable file
@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2005 Junio C Hamano
|
||||
#
|
||||
|
||||
test_description='git-apply in reverse
|
||||
|
||||
'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success setup '
|
||||
|
||||
for i in a b c d e f g h i j k l m n; do echo $i; done >file1 &&
|
||||
tr "[ijk]" '\''[\0\1\2]'\'' <file1 >file2 &&
|
||||
|
||||
git add file1 file2 &&
|
||||
git commit -m initial &&
|
||||
git tag initial &&
|
||||
|
||||
for i in a b c g h i J K L m o n p q; do echo $i; done >file1 &&
|
||||
tr "[mon]" '\''[\0\1\2]'\'' <file1 >file2 &&
|
||||
|
||||
git commit -a -m second &&
|
||||
|
||||
git diff --binary -R initial >patch
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'apply in forward' '
|
||||
|
||||
git apply --index --binary patch &&
|
||||
git diff initial >diff &&
|
||||
diff -u /dev/null diff
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'apply in reverse' '
|
||||
|
||||
git apply --reverse --binary --index patch &&
|
||||
git diff >diff &&
|
||||
diff -u /dev/null diff
|
||||
|
||||
'
|
||||
|
||||
test_done
|
@ -59,6 +59,10 @@ test_expect_success \
|
||||
git-diff-tree -r -M --name-status HEAD^ HEAD | \
|
||||
grep -E "^R100.+path0/README.+path2/README"'
|
||||
|
||||
test_expect_success \
|
||||
'succeed when source is a prefix of destination' \
|
||||
'git-mv path2/COPYING path2/COPYING-renamed'
|
||||
|
||||
test_expect_success \
|
||||
'moving whole subdirectory into subdirectory' \
|
||||
'git-mv path2 path1'
|
||||
@ -78,4 +82,8 @@ test_expect_failure \
|
||||
'do not move directory over existing directory' \
|
||||
'mkdir path0 && mkdir path0/path2 && git-mv path2 path0'
|
||||
|
||||
test_expect_success \
|
||||
'move into "."' \
|
||||
'git-mv path1/path2/ .'
|
||||
|
||||
test_done
|
||||
|
@ -3,7 +3,7 @@
|
||||
# Copyright (c) 2006 Junio C Hamano
|
||||
#
|
||||
|
||||
test_description='git grep -w
|
||||
test_description='git grep various.
|
||||
'
|
||||
|
||||
. ./test-lib.sh
|
||||
@ -19,7 +19,9 @@ test_expect_success setup '
|
||||
echo x x xx x >x &&
|
||||
echo y yy >y &&
|
||||
echo zzz > z &&
|
||||
git add file x y z &&
|
||||
mkdir t &&
|
||||
echo test >t/t &&
|
||||
git add file x y z t/t &&
|
||||
git commit -m initial
|
||||
'
|
||||
|
||||
@ -80,6 +82,31 @@ do
|
||||
diff expected actual
|
||||
fi
|
||||
'
|
||||
|
||||
test_expect_success "grep $L (t-1)" '
|
||||
echo "${HC}t/t:1:test" >expected &&
|
||||
git grep -n -e test $H >actual &&
|
||||
diff expected actual
|
||||
'
|
||||
|
||||
test_expect_success "grep $L (t-2)" '
|
||||
echo "${HC}t:1:test" >expected &&
|
||||
(
|
||||
cd t &&
|
||||
git grep -n -e test $H
|
||||
) >actual &&
|
||||
diff expected actual
|
||||
'
|
||||
|
||||
test_expect_success "grep $L (t-3)" '
|
||||
echo "${HC}t/t:1:test" >expected &&
|
||||
(
|
||||
cd t &&
|
||||
git grep --full-name -n -e test $H
|
||||
) >actual &&
|
||||
diff expected actual
|
||||
'
|
||||
|
||||
done
|
||||
|
||||
test_done
|
||||
|
@ -11,4 +11,8 @@
|
||||
# This example catches duplicate Signed-off-by lines.
|
||||
|
||||
test "" = "$(grep '^Signed-off-by: ' "$1" |
|
||||
sort | uniq -c | sed -e '/^[ ]*1 /d')"
|
||||
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
|
||||
echo >&2 Duplicate Signed-off-by lines.
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user