mirror of
https://github.com/git/git.git
synced 2026-03-13 10:23:30 +01:00
Merge git://repo.or.cz/alt-git.git
This commit is contained in:
@@ -1,3 +1,30 @@
|
||||
Checklist (and a short version for the impatient):
|
||||
|
||||
- make commits of logical units
|
||||
- check for unnecessary whitespace with "git diff --check"
|
||||
before committing
|
||||
- do not check in commented out code or unneeded files
|
||||
- provide a meaningful commit message
|
||||
- the first line of the commit message should be a short
|
||||
description and should skip the full stop
|
||||
- if you want your work included in git.git, add a
|
||||
"Signed-off-by: Your Name <your@email.com>" line to the
|
||||
commit message (or just use the option "-s" when
|
||||
committing) to confirm that you agree to the Developer's
|
||||
Certificate of Origin
|
||||
- do not PGP sign your patch
|
||||
- use "git format-patch -M" to create the patch
|
||||
- do not attach your patch, but read in the mail
|
||||
body, unless you cannot teach your mailer to
|
||||
leave the formatting of the patch alone.
|
||||
- be careful doing cut & paste into your mailer, not to
|
||||
corrupt whitespaces.
|
||||
- provide additional information (which is unsuitable for
|
||||
the commit message) between the "---" and the diffstat
|
||||
- send the patch to the list _and_ the maintainer
|
||||
|
||||
Long version:
|
||||
|
||||
I started reading over the SubmittingPatches document for Linux
|
||||
kernel, primarily because I wanted to have a document similar to
|
||||
it for the core GIT to make sure people understand what they are
|
||||
|
||||
@@ -10,7 +10,7 @@ SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git-archimport' [-h] [-v] [-o] [-a] [-f] [-T] [-D depth] [-t tempdir]
|
||||
<archive/branch> [ <archive/branch> ]
|
||||
<archive/branch>[:<git-branch>] ...
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@@ -39,6 +39,19 @@ directory. To follow the development of a project that uses Arch, rerun
|
||||
`git-archimport` with the same parameters as the initial import to perform
|
||||
incremental imports.
|
||||
|
||||
While git-archimport will try to create sensible branch names for the
|
||||
archives that it imports, it is also possible to specify git branch names
|
||||
manually. To do so, write a git branch name after each <archive/branch>
|
||||
parameter, separated by a colon. This way, you can shorten the Arch
|
||||
branch names and convert Arch jargon to git jargon, for example mapping a
|
||||
"PROJECT--devo--VERSION" branch to "master".
|
||||
|
||||
Associating multiple Arch branches to one git branch is possible; the
|
||||
result will make the most sense only if no commits are made to the first
|
||||
branch, after the second branch is created. Still, this is useful to
|
||||
convert Arch repositories that had been rotated periodically.
|
||||
|
||||
|
||||
MERGES
|
||||
------
|
||||
Patch merge data from Arch is used to mark merges in git as well. git
|
||||
@@ -73,7 +86,9 @@ OPTIONS
|
||||
Use this for compatibility with old-style branch names used by
|
||||
earlier versions of git-archimport. Old-style branch names
|
||||
were category--branch, whereas new-style branch names are
|
||||
archive,category--branch--version.
|
||||
archive,category--branch--version. In both cases, names given
|
||||
on the command-line will override the automatically-generated
|
||||
ones.
|
||||
|
||||
-D <depth>::
|
||||
Follow merge ancestry and attempt to import trees that have been
|
||||
|
||||
@@ -8,8 +8,9 @@ git-commit - Record changes to the repository
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git-commit' [-a] [-s] [-v] [(-c | -C) <commit> | -F <file> | -m <msg> |
|
||||
--amend] [--no-verify] [-e] [--author <author>]
|
||||
'git-commit' [-a | --interactive] [-s] [-v]
|
||||
[(-c | -C) <commit> | -F <file> | -m <msg> | --amend]
|
||||
[--no-verify] [-e] [--author <author>]
|
||||
[--] [[-i | -o ]<file>...]
|
||||
|
||||
DESCRIPTION
|
||||
@@ -35,6 +36,10 @@ methods:
|
||||
before, and to automatically "rm" files that have been
|
||||
removed from the working tree, and perform the actual commit.
|
||||
|
||||
5. by using the --interactive switch with the 'commit' command to decide one
|
||||
by one which files should be part of the commit, before finalizing the
|
||||
operation. Currently, this is done by invoking `git-add --interactive`.
|
||||
|
||||
The gitlink:git-status[1] command can be used to obtain a
|
||||
summary of what is included by any of the above for the next
|
||||
commit by giving the same set of parameters you would give to
|
||||
|
||||
@@ -16,6 +16,8 @@ SYNOPSIS
|
||||
'git-config' [--global] [type] --get-all name [value_regex]
|
||||
'git-config' [--global] [type] --unset name [value_regex]
|
||||
'git-config' [--global] [type] --unset-all name [value_regex]
|
||||
'git-config' [--global] [type] --rename-section old_name new_name
|
||||
'git-config' [--global] [type] --remove-section name
|
||||
'git-config' [--global] -l | --list
|
||||
|
||||
DESCRIPTION
|
||||
@@ -74,6 +76,12 @@ OPTIONS
|
||||
--global::
|
||||
Use global ~/.gitconfig file rather than the repository .git/config.
|
||||
|
||||
--remove-section::
|
||||
Remove the given section from the configuration file.
|
||||
|
||||
--rename-section::
|
||||
Rename the given section to a new name.
|
||||
|
||||
--unset::
|
||||
Remove the line matching the key from config file.
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ git-diff - Show changes between commits, commit and working tree, etc
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
'git-diff' [ --diff-options ] <commit>{0,2} [--] [<path>...]
|
||||
'git-diff' [<common diff options>] <commit>{0,2} [--] [<path>...]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
@@ -62,7 +62,18 @@ OPTIONS
|
||||
Dumps the internal marks table to <file> when complete.
|
||||
Marks are written one per line as `:markid SHA-1`.
|
||||
Frontends can use this file to validate imports after they
|
||||
have been completed.
|
||||
have been completed, or to save the marks table across
|
||||
incremental runs. As <file> is only opened and truncated
|
||||
at checkpoint (or completion) the same path can also be
|
||||
safely given to \--import-marks.
|
||||
|
||||
--import-marks=<file>::
|
||||
Before processing any input, load the marks specified in
|
||||
<file>. The input file must exist, must be readable, and
|
||||
must use the same format as produced by \--export-marks.
|
||||
Multiple options may be supplied to import more than one
|
||||
set of marks. If a mark is defined to different values,
|
||||
the last file wins.
|
||||
|
||||
--export-pack-edges=<file>::
|
||||
After creating a packfile, print a line of data to
|
||||
@@ -451,7 +462,7 @@ in octal. Git only supports the following modes:
|
||||
In both formats `<path>` is the complete path of the file to be added
|
||||
(if not already existing) or modified (if already existing).
|
||||
|
||||
A `<path>` string must use UNIX-style directory seperators (forward
|
||||
A `<path>` string must use UNIX-style directory separators (forward
|
||||
slash `/`), may contain any byte other than `LF`, and must not
|
||||
start with double quote (`"`).
|
||||
|
||||
@@ -461,8 +472,8 @@ quoting should be used, e.g. `"path/with\n and \" in it"`.
|
||||
The value of `<path>` must be in canoncial form. That is it must not:
|
||||
|
||||
* contain an empty directory component (e.g. `foo//bar` is invalid),
|
||||
* end with a directory seperator (e.g. `foo/` is invalid),
|
||||
* start with a directory seperator (e.g. `/foo` is invalid),
|
||||
* end with a directory separator (e.g. `foo/` is invalid),
|
||||
* start with a directory separator (e.g. `/foo` is invalid),
|
||||
* contain the special component `.` or `..` (e.g. `foo/./bar` and
|
||||
`foo/../bar` are invalid).
|
||||
|
||||
|
||||
@@ -9,8 +9,9 @@ git-format-patch - Prepare patches for e-mail submission
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git-format-patch' [-n | -k] [-o <dir> | --stdout] [--attach] [--thread]
|
||||
[-s | --signoff] [--diff-options] [--start-number <n>]
|
||||
'git-format-patch' [-n | -k] [-o <dir> | --stdout] [--thread]
|
||||
[--attach[=<boundary>] | --inline[=<boundary>]]
|
||||
[-s | --signoff] [<common diff options>] [--start-number <n>]
|
||||
[--in-reply-to=Message-Id] [--suffix=.<sfx>]
|
||||
[--ignore-if-in-upstream]
|
||||
<since>[..<until>]
|
||||
@@ -46,6 +47,8 @@ reference.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
include::diff-options.txt[]
|
||||
|
||||
-o|--output-directory <dir>::
|
||||
Use <dir> to store the resulting files, instead of the
|
||||
current working directory.
|
||||
@@ -68,8 +71,15 @@ OPTIONS
|
||||
Print all commits to the standard output in mbox format,
|
||||
instead of creating a file for each one.
|
||||
|
||||
--attach::
|
||||
Create attachments instead of inlining patches.
|
||||
--attach[=<boundary>]::
|
||||
Create multipart/mixed attachment, the first part of
|
||||
which is the commit message and the patch itself in the
|
||||
second part, with "Content-Disposition: attachment".
|
||||
|
||||
--inline[=<boundary>]::
|
||||
Create multipart/mixed attachment, the first part of
|
||||
which is the commit message and the patch itself in the
|
||||
second part, with "Content-Disposition: inline".
|
||||
|
||||
--thread::
|
||||
Add In-Reply-To and References headers to make the second and
|
||||
|
||||
@@ -25,62 +25,127 @@ The command allows for creation and fast forwarding of sha1 refs
|
||||
local end receive-pack runs, but to the user who is sitting at
|
||||
the send-pack end, it is updating the remote. Confused?)
|
||||
|
||||
Before each ref is updated, if $GIT_DIR/hooks/update file exists
|
||||
and executable, it is called with three parameters:
|
||||
|
||||
$GIT_DIR/hooks/update refname sha1-old sha1-new
|
||||
|
||||
The refname parameter is relative to $GIT_DIR; e.g. for the
|
||||
master head this is "refs/heads/master". Two sha1 are the
|
||||
object names for the refname before and after the update. Note
|
||||
that the hook is called before the refname is updated, so either
|
||||
sha1-old is 0{40} (meaning there is no such ref yet), or it
|
||||
should match what is recorded in refname.
|
||||
|
||||
The hook should exit with non-zero status if it wants to
|
||||
disallow updating the named ref. Otherwise it should exit with
|
||||
zero.
|
||||
|
||||
Using this hook, it is easy to generate mails on updates to
|
||||
the local repository. This example script sends a mail with
|
||||
the commits pushed to the repository:
|
||||
|
||||
#!/bin/sh
|
||||
# mail out commit update information.
|
||||
if expr "$2" : '0*$' >/dev/null
|
||||
then
|
||||
echo "Created a new ref, with the following commits:"
|
||||
git-rev-list --pretty "$2"
|
||||
else
|
||||
echo "New commits:"
|
||||
git-rev-list --pretty "$3" "^$2"
|
||||
fi |
|
||||
mail -s "Changes to ref $1" commit-list@mydomain
|
||||
exit 0
|
||||
|
||||
Another hook $GIT_DIR/hooks/post-update, if exists and
|
||||
executable, is called with the list of refs that have been
|
||||
updated. This can be used to implement repository wide cleanup
|
||||
task if needed. The exit code from this hook invocation is
|
||||
ignored; the only thing left for git-receive-pack to do at that
|
||||
point is to exit itself anyway. This hook can be used, for
|
||||
example, to run "git-update-server-info" if the repository is
|
||||
packed and is served via a dumb transport.
|
||||
|
||||
#!/bin/sh
|
||||
exec git-update-server-info
|
||||
|
||||
There are other real-world examples of using update and
|
||||
post-update hooks found in the Documentation/howto directory.
|
||||
|
||||
git-receive-pack honours the receive.denyNonFastforwards flag, which
|
||||
tells it if updates to a ref should be denied if they are not fast-forwards.
|
||||
git-receive-pack honours the receive.denyNonFastForwards config
|
||||
option, which tells it if updates to a ref should be denied if they
|
||||
are not fast-forwards.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
<directory>::
|
||||
The repository to sync into.
|
||||
|
||||
pre-receive Hook
|
||||
----------------
|
||||
Before any ref is updated, if $GIT_DIR/hooks/pre-receive file exists
|
||||
and is executable, it will be invoked once, with three parameters
|
||||
per ref to be updated:
|
||||
|
||||
$GIT_DIR/hooks/pre-receive (refname sha1-old sha1-new)+
|
||||
|
||||
The refname parameter is relative to $GIT_DIR; e.g. for the master
|
||||
head this is "refs/heads/master". The two sha1 arguments after
|
||||
each refname are the object names for the refname before and after
|
||||
the update. Refs to be created will have sha1-old equal to 0{40},
|
||||
while refs to be deleted will have sha1-new equal to 0{40}, otherwise
|
||||
sha1-old and sha1-new should be valid objects in the repository.
|
||||
|
||||
This hook is called before any refname is updated and before any
|
||||
fast-forward checks are performed.
|
||||
|
||||
If the pre-receive hook exits with a non-zero exit status no updates
|
||||
will be performed, and the update, post-receive and post-update
|
||||
hooks will not be invoked either. This can be useful to quickly
|
||||
bail out if the update is not to be supported.
|
||||
|
||||
update Hook
|
||||
-----------
|
||||
Before each ref is updated, if $GIT_DIR/hooks/update file exists
|
||||
and is executable, it is invoked once per ref, with three parameters:
|
||||
|
||||
$GIT_DIR/hooks/update refname sha1-old sha1-new
|
||||
|
||||
The refname parameter is relative to $GIT_DIR; e.g. for the master
|
||||
head this is "refs/heads/master". The two sha1 arguments are
|
||||
the object names for the refname before and after the update.
|
||||
Note that the hook is called before the refname is updated,
|
||||
so either sha1-old is 0{40} (meaning there is no such ref yet),
|
||||
or it should match what is recorded in refname.
|
||||
|
||||
The hook should exit with non-zero status if it wants to disallow
|
||||
updating the named ref. Otherwise it should exit with zero.
|
||||
|
||||
Successful execution (a zero exit status) of this hook does not
|
||||
ensure the ref will actully be updated, it is only a prerequisite.
|
||||
As such it is not a good idea to send notices (e.g. email) from
|
||||
this hook. Consider using the post-receive hook instead.
|
||||
|
||||
post-receive Hook
|
||||
-----------------
|
||||
After all refs were updated (or attempted to be updated), if any
|
||||
ref update was successful, and if $GIT_DIR/hooks/post-receive
|
||||
file exists and is executable, it will be invoke once with three
|
||||
parameters for each successfully updated ref:
|
||||
|
||||
$GIT_DIR/hooks/post-receive (refname sha1-old sha1-new)+
|
||||
|
||||
The refname parameter is relative to $GIT_DIR; e.g. for the master
|
||||
head this is "refs/heads/master". The two sha1 arguments after
|
||||
each refname are the object names for the refname before and after
|
||||
the update. Refs that were created will have sha1-old equal to
|
||||
0{40}, while refs that were deleted will have sha1-new equal to
|
||||
0{40}, otherwise sha1-old and sha1-new should be valid objects in
|
||||
the repository.
|
||||
|
||||
Using this hook, it is easy to generate mails describing the updates
|
||||
to the repository. This example script sends one mail message per
|
||||
ref listing the commits pushed to the repository:
|
||||
|
||||
#!/bin/sh
|
||||
# mail out commit update information.
|
||||
while test $# -gt 0
|
||||
do
|
||||
if expr "$2" : '0*$' >/dev/null
|
||||
then
|
||||
echo "Created a new ref, with the following commits:"
|
||||
git-rev-list --pretty "$2"
|
||||
else
|
||||
echo "New commits:"
|
||||
git-rev-list --pretty "$3" "^$2"
|
||||
fi |
|
||||
mail -s "Changes to ref $1" commit-list@mydomain
|
||||
shift; shift; shift; # discard this ref's args
|
||||
done
|
||||
exit 0
|
||||
|
||||
The exit code from this hook invocation is ignored, however a
|
||||
non-zero exit code will generate an error message.
|
||||
|
||||
Note that it is possible for refname to not have sha1-new when this
|
||||
hook runs. This can easily occur if another user modifies the ref
|
||||
after it was updated by receive-pack, but before the hook was able
|
||||
to evaluate it. It is recommended that hooks rely on sha1-new
|
||||
rather than the current value of refname.
|
||||
|
||||
post-update Hook
|
||||
----------------
|
||||
After all other processing, if at least one ref was updated, and
|
||||
if $GIT_DIR/hooks/post-update file exists and is executable, then
|
||||
post-update will called with the list of refs that have been updated.
|
||||
This can be used to implement any repository wide cleanup tasks.
|
||||
|
||||
The exit code from this hook invocation is ignored; the only thing
|
||||
left for git-receive-pack to do at that point is to exit itself
|
||||
anyway.
|
||||
|
||||
This hook can be used, for example, to run "git-update-server-info"
|
||||
if the repository is packed and is served via a dumb transport.
|
||||
|
||||
#!/bin/sh
|
||||
exec git-update-server-info
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
|
||||
@@ -241,6 +241,12 @@ Identifier Terminology
|
||||
operate on a <tree> object but automatically dereferences
|
||||
<commit> and <tag> objects that point at a <tree>.
|
||||
|
||||
<commit-ish>::
|
||||
Indicates a commit or tag object name. A
|
||||
command that takes a <commit-ish> argument ultimately wants to
|
||||
operate on a <commit> object but automatically dereferences
|
||||
<tag> objects that point at a <commit>.
|
||||
|
||||
<type>::
|
||||
Indicates that an object type is required.
|
||||
Currently one of: `blob`, `tree`, `commit`, or `tag`.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
T="$1"
|
||||
|
||||
for h in *.html *.txt howto/*.txt howto/*.html RelNotes-*.txt
|
||||
for h in *.html *.txt howto/*.txt howto/*.html RelNotes-*.txt *.css
|
||||
do
|
||||
if test -f "$T/$h" &&
|
||||
diff -u -I'Last updated [0-9][0-9]-[A-Z][a-z][a-z]-' "$T/$h" "$h"
|
||||
|
||||
@@ -48,7 +48,7 @@ This list is sorted alphabetically:
|
||||
';
|
||||
|
||||
@keys=sort {uc($a) cmp uc($b)} keys %terms;
|
||||
$pattern='(\b(?<!link:git-)'.join('\b|\b(?<!link:git-)',reverse @keys).'\b)';
|
||||
$pattern='(\b(?<!link:git-)'.join('\b|\b(?<!-)',reverse @keys).'\b)';
|
||||
foreach $key (@keys) {
|
||||
$terms{$key}=~s/$pattern/sprintf "<<ref_".no_spaces($1).",$1>>";/eg;
|
||||
print '[[ref_'.no_spaces($key).']]'.$key."::\n"
|
||||
|
||||
@@ -437,11 +437,14 @@ We will sometimes represent git history using diagrams like the one
|
||||
below. Commits are shown as "o", and the links between them with
|
||||
lines drawn with - / and \. Time goes left to right:
|
||||
|
||||
|
||||
................................................
|
||||
o--o--o <-- Branch A
|
||||
/
|
||||
o--o--o <-- master
|
||||
\
|
||||
o--o--o <-- Branch B
|
||||
................................................
|
||||
|
||||
If we need to talk about a particular commit, the character "o" may
|
||||
be replaced with another letter or number.
|
||||
@@ -601,8 +604,8 @@ a new stanza:
|
||||
$ cat .git/config
|
||||
...
|
||||
[remote "linux-nfs"]
|
||||
url = git://linux-nfs.org/~bfields/git.git
|
||||
fetch = +refs/heads/*:refs/remotes/linux-nfs-read/*
|
||||
url = git://linux-nfs.org/pub/nfs-2.6.git
|
||||
fetch = +refs/heads/*:refs/remotes/linux-nfs/*
|
||||
...
|
||||
-------------------------------------------------
|
||||
|
||||
@@ -1133,17 +1136,9 @@ modified in two different ways in the remote branch and the local
|
||||
branch--then you are warned; the output may look something like this:
|
||||
|
||||
-------------------------------------------------
|
||||
$ git pull . next
|
||||
Trying really trivial in-index merge...
|
||||
fatal: Merge requires file-level merging
|
||||
Nope.
|
||||
Merging HEAD with 77976da35a11db4580b80ae27e8d65caf5208086
|
||||
Merging:
|
||||
15e2162 world
|
||||
77976da goodbye
|
||||
found 1 common ancestor(s):
|
||||
d122ed4 initial
|
||||
Auto-merging file.txt
|
||||
$ git merge next
|
||||
100% (4/4) done
|
||||
Auto-merged file.txt
|
||||
CONFLICT (content): Merge conflict in file.txt
|
||||
Automatic merge failed; fix conflicts and then commit the result.
|
||||
-------------------------------------------------
|
||||
@@ -1439,7 +1434,7 @@ modifying the working directory, you can do that with
|
||||
gitlink:git-show[1]:
|
||||
|
||||
-------------------------------------------------
|
||||
$ git show HEAD^ path/to/file
|
||||
$ git show HEAD^:path/to/file
|
||||
-------------------------------------------------
|
||||
|
||||
which will display the given version of the file.
|
||||
@@ -1936,25 +1931,29 @@ $ git commit
|
||||
You have performed no merges into mywork, so it is just a simple linear
|
||||
sequence of patches on top of "origin":
|
||||
|
||||
|
||||
................................................
|
||||
o--o--o <-- origin
|
||||
\
|
||||
o--o--o <-- mywork
|
||||
................................................
|
||||
|
||||
Some more interesting work has been done in the upstream project, and
|
||||
"origin" has advanced:
|
||||
|
||||
................................................
|
||||
o--o--O--o--o--o <-- origin
|
||||
\
|
||||
a--b--c <-- mywork
|
||||
................................................
|
||||
|
||||
At this point, you could use "pull" to merge your changes back in;
|
||||
the result would create a new merge commit, like this:
|
||||
|
||||
|
||||
................................................
|
||||
o--o--O--o--o--o <-- origin
|
||||
\ \
|
||||
a--b--c--m <-- mywork
|
||||
................................................
|
||||
|
||||
However, if you prefer to keep the history in mywork a simple series of
|
||||
commits without any merges, you may instead choose to use
|
||||
@@ -1971,9 +1970,11 @@ point at the latest version of origin, then apply each of the saved
|
||||
patches to the new mywork. The result will look like:
|
||||
|
||||
|
||||
................................................
|
||||
o--o--O--o--o--o <-- origin
|
||||
\
|
||||
a'--b'--c' <-- mywork
|
||||
................................................
|
||||
|
||||
In the process, it may discover conflicts. In that case it will stop
|
||||
and allow you to fix the conflicts; after fixing conflicts, use "git
|
||||
@@ -2081,24 +2082,30 @@ The primary problem with rewriting the history of a branch has to do
|
||||
with merging. Suppose somebody fetches your branch and merges it into
|
||||
their branch, with a result something like this:
|
||||
|
||||
................................................
|
||||
o--o--O--o--o--o <-- origin
|
||||
\ \
|
||||
t--t--t--m <-- their branch:
|
||||
................................................
|
||||
|
||||
Then suppose you modify the last three commits:
|
||||
|
||||
................................................
|
||||
o--o--o <-- new head of origin
|
||||
/
|
||||
o--o--O--o--o--o <-- old head of origin
|
||||
................................................
|
||||
|
||||
If we examined all this history together in one repository, it will
|
||||
look like:
|
||||
|
||||
................................................
|
||||
o--o--o <-- new head of origin
|
||||
/
|
||||
o--o--O--o--o--o <-- old head of origin
|
||||
\ \
|
||||
t--t--t--m <-- their branch:
|
||||
................................................
|
||||
|
||||
Git has no way of knowing that the new head is an updated version of
|
||||
the old head; it treats this situation exactly the same as it would if
|
||||
@@ -2159,9 +2166,11 @@ commit. Git calls this process a "fast forward".
|
||||
|
||||
A fast forward looks something like this:
|
||||
|
||||
................................................
|
||||
o--o--o--o <-- old head of the branch
|
||||
\
|
||||
o--o--o <-- new head of the branch
|
||||
................................................
|
||||
|
||||
|
||||
In some cases it is possible that the new head will *not* actually be
|
||||
@@ -2169,11 +2178,11 @@ a descendant of the old head. For example, the developer may have
|
||||
realized she made a serious mistake, and decided to backtrack,
|
||||
resulting in a situation like:
|
||||
|
||||
................................................
|
||||
o--o--o--o--a--b <-- old head of the branch
|
||||
\
|
||||
o--o--o <-- new head of the branch
|
||||
|
||||
|
||||
................................................
|
||||
|
||||
In this case, "git fetch" will fail, and print out a warning.
|
||||
|
||||
|
||||
108
Makefile
108
Makefile
@@ -1,6 +1,8 @@
|
||||
# The default target of this Makefile is...
|
||||
all:
|
||||
|
||||
# Define V=1 to have a more verbose compile.
|
||||
#
|
||||
# Define NO_OPENSSL environment variable if you do not have OpenSSL.
|
||||
# This also implies MOZILLA_SHA1.
|
||||
#
|
||||
@@ -180,7 +182,7 @@ SCRIPT_SH = \
|
||||
git-merge-one-file.sh git-parse-remote.sh \
|
||||
git-pull.sh git-rebase.sh \
|
||||
git-repack.sh git-request-pull.sh git-reset.sh \
|
||||
git-revert.sh git-sh-setup.sh \
|
||||
git-sh-setup.sh \
|
||||
git-tag.sh git-verify-tag.sh \
|
||||
git-applymbox.sh git-applypatch.sh git-am.sh \
|
||||
git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
|
||||
@@ -197,7 +199,7 @@ SCRIPT_PERL = \
|
||||
|
||||
SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
|
||||
$(patsubst %.perl,%,$(SCRIPT_PERL)) \
|
||||
git-cherry-pick git-status git-instaweb
|
||||
git-status git-instaweb
|
||||
|
||||
# ... and all the rest that could be moved out of bindir to gitexecdir
|
||||
PROGRAMS = \
|
||||
@@ -222,7 +224,7 @@ EXTRA_PROGRAMS =
|
||||
BUILT_INS = \
|
||||
git-format-patch$X git-show$X git-whatchanged$X git-cherry$X \
|
||||
git-get-tar-commit-id$X git-init$X git-repo-config$X \
|
||||
git-fsck-objects$X \
|
||||
git-fsck-objects$X git-cherry-pick$X \
|
||||
$(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS))
|
||||
|
||||
# what 'all' will build and 'install' will install, in gitexecdir
|
||||
@@ -315,6 +317,7 @@ BUILTIN_OBJS = \
|
||||
builtin-rerere.o \
|
||||
builtin-rev-list.o \
|
||||
builtin-rev-parse.o \
|
||||
builtin-revert.o \
|
||||
builtin-rm.o \
|
||||
builtin-runstatus.o \
|
||||
builtin-shortlog.o \
|
||||
@@ -629,6 +632,31 @@ ifdef NO_PERL_MAKEMAKER
|
||||
export NO_PERL_MAKEMAKER
|
||||
endif
|
||||
|
||||
QUIET_SUBDIR0 = $(MAKE) -C # space to separate -C and subdir
|
||||
QUIET_SUBDIR1 =
|
||||
|
||||
ifneq ($(findstring $(MAKEFLAGS),w),w)
|
||||
PRINT_DIR = --no-print-directory
|
||||
else # "make -w"
|
||||
NO_SUBDIR = :
|
||||
endif
|
||||
|
||||
ifneq ($(findstring $(MAKEFLAGS),s),s)
|
||||
ifndef V
|
||||
QUIET_CC = @echo ' ' CC $@;
|
||||
QUIET_AR = @echo ' ' AR $@;
|
||||
QUIET_LINK = @echo ' ' LINK $@;
|
||||
QUIET_BUILT_IN = @echo ' ' BUILTIN $@;
|
||||
QUIET_GEN = @echo ' ' GEN $@;
|
||||
QUIET_SUBDIR0 = @subdir=
|
||||
QUIET_SUBDIR1 = ;$(NO_SUBDIR) echo ' ' SUBDIR $$subdir; \
|
||||
$(MAKE) $(PRINT_DIR) -C $$subdir
|
||||
export V
|
||||
export QUIET_GEN
|
||||
export QUIET_BUILT_IN
|
||||
endif
|
||||
endif
|
||||
|
||||
# Shell quote (do not use $(call) to accommodate ancient setups);
|
||||
|
||||
SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
|
||||
@@ -660,44 +688,43 @@ export prefix gitexecdir TAR INSTALL DESTDIR SHELL_PATH template_dir
|
||||
all: $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk gitweb/gitweb.cgi
|
||||
|
||||
all:
|
||||
$(MAKE) -C git-gui all
|
||||
$(MAKE) -C perl PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' all
|
||||
$(MAKE) -C templates NOEXECTEMPL='$(NOEXECTEMPL)'
|
||||
$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) all
|
||||
$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' all
|
||||
$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) NOEXECTEMPL='$(NOEXECTEMPL)'
|
||||
|
||||
strip: $(PROGRAMS) git$X
|
||||
$(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X
|
||||
|
||||
git$X: git.c common-cmds.h $(BUILTIN_OBJS) $(GITLIBS) GIT-CFLAGS
|
||||
$(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
|
||||
$(QUIET_LINK)$(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
|
||||
$(ALL_CFLAGS) -o $@ $(filter %.c,$^) \
|
||||
$(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
|
||||
|
||||
help.o: common-cmds.h
|
||||
|
||||
$(BUILT_INS): git$X
|
||||
rm -f $@ && ln git$X $@
|
||||
$(QUIET_BUILT_IN)rm -f $@ && ln git$X $@
|
||||
|
||||
common-cmds.h: Documentation/git-*.txt
|
||||
./generate-cmdlist.sh > $@+
|
||||
mv $@+ $@
|
||||
$(QUIET_GEN)./generate-cmdlist.sh > $@+ && mv $@+ $@
|
||||
|
||||
$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
|
||||
rm -f $@ $@+
|
||||
$(QUIET_GEN)rm -f $@ $@+ && \
|
||||
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
|
||||
-e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
|
||||
-e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
|
||||
-e 's/@@NO_CURL@@/$(NO_CURL)/g' \
|
||||
$@.sh >$@+
|
||||
chmod +x $@+
|
||||
$@.sh >$@+ && \
|
||||
chmod +x $@+ && \
|
||||
mv $@+ $@
|
||||
|
||||
$(patsubst %.perl,%,$(SCRIPT_PERL)): perl/perl.mak
|
||||
|
||||
perl/perl.mak: GIT-CFLAGS
|
||||
$(MAKE) -C perl PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' $(@F)
|
||||
$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' $(@F)
|
||||
|
||||
$(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl
|
||||
rm -f $@ $@+
|
||||
$(QUIET_GEN)rm -f $@ $@+ && \
|
||||
INSTLIBDIR=`$(MAKE) -C perl -s --no-print-directory instlibdir` && \
|
||||
sed -e '1{' \
|
||||
-e ' s|#!.*perl|#!$(PERL_PATH_SQ)|' \
|
||||
@@ -708,20 +735,15 @@ $(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl
|
||||
-e '}' \
|
||||
-e 's|@@INSTLIBDIR@@|'"$$INSTLIBDIR"'|g' \
|
||||
-e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
|
||||
$@.perl >$@+
|
||||
chmod +x $@+
|
||||
mv $@+ $@
|
||||
|
||||
git-cherry-pick: git-revert
|
||||
cp $< $@+
|
||||
$@.perl >$@+ && \
|
||||
chmod +x $@+ && \
|
||||
mv $@+ $@
|
||||
|
||||
git-status: git-commit
|
||||
cp $< $@+
|
||||
mv $@+ $@
|
||||
$(QUIET_GEN)cp $< $@+ && mv $@+ $@
|
||||
|
||||
gitweb/gitweb.cgi: gitweb/gitweb.perl
|
||||
rm -f $@ $@+
|
||||
$(QUIET_GEN)rm -f $@ $@+ && \
|
||||
sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \
|
||||
-e 's|++GIT_VERSION++|$(GIT_VERSION)|g' \
|
||||
-e 's|++GIT_BINDIR++|$(bindir)|g' \
|
||||
@@ -739,12 +761,12 @@ gitweb/gitweb.cgi: gitweb/gitweb.perl
|
||||
-e 's|++GITWEB_FAVICON++|$(GITWEB_FAVICON)|g' \
|
||||
-e 's|++GITWEB_SITE_HEADER++|$(GITWEB_SITE_HEADER)|g' \
|
||||
-e 's|++GITWEB_SITE_FOOTER++|$(GITWEB_SITE_FOOTER)|g' \
|
||||
$< >$@+
|
||||
chmod +x $@+
|
||||
$< >$@+ && \
|
||||
chmod +x $@+ && \
|
||||
mv $@+ $@
|
||||
|
||||
git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css
|
||||
rm -f $@ $@+
|
||||
$(QUIET_GEN)rm -f $@ $@+ && \
|
||||
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
|
||||
-e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
|
||||
-e 's/@@NO_CURL@@/$(NO_CURL)/g' \
|
||||
@@ -752,15 +774,15 @@ 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 > $@+
|
||||
chmod +x $@+
|
||||
$@.sh > $@+ && \
|
||||
chmod +x $@+ && \
|
||||
mv $@+ $@
|
||||
|
||||
configure: configure.ac
|
||||
rm -f $@ $<+
|
||||
$(QUIET_GEN)rm -f $@ $<+ && \
|
||||
sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
|
||||
$< > $<+
|
||||
autoconf -o $@ $<+
|
||||
$< > $<+ && \
|
||||
autoconf -o $@ $<+ && \
|
||||
rm -f $<+
|
||||
|
||||
# These can record GIT_VERSION
|
||||
@@ -770,25 +792,25 @@ git$X git.spec \
|
||||
: GIT-VERSION-FILE
|
||||
|
||||
%.o: %.c GIT-CFLAGS
|
||||
$(CC) -o $*.o -c $(ALL_CFLAGS) $<
|
||||
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
|
||||
%.o: %.S
|
||||
$(CC) -o $*.o -c $(ALL_CFLAGS) $<
|
||||
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
|
||||
|
||||
exec_cmd.o: exec_cmd.c GIT-CFLAGS
|
||||
$(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
|
||||
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
|
||||
builtin-init-db.o: builtin-init-db.c GIT-CFLAGS
|
||||
$(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $<
|
||||
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $<
|
||||
|
||||
http.o: http.c GIT-CFLAGS
|
||||
$(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $<
|
||||
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $<
|
||||
|
||||
ifdef NO_EXPAT
|
||||
http-fetch.o: http-fetch.c http.h GIT-CFLAGS
|
||||
$(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_EXPAT $<
|
||||
$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_EXPAT $<
|
||||
endif
|
||||
|
||||
git-%$X: %.o $(GITLIBS)
|
||||
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
|
||||
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
|
||||
|
||||
ssh-pull.o: ssh-fetch.c
|
||||
ssh-push.o: ssh-upload.c
|
||||
@@ -802,11 +824,11 @@ git-imap-send$X: imap-send.o $(LIB_FILE)
|
||||
|
||||
http.o http-fetch.o http-push.o: http.h
|
||||
git-http-fetch$X: fetch.o http.o http-fetch.o $(GITLIBS)
|
||||
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
|
||||
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
|
||||
$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
|
||||
|
||||
git-http-push$X: revision.o http.o http-push.o $(GITLIBS)
|
||||
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
|
||||
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
|
||||
$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
|
||||
|
||||
$(LIB_OBJS) $(BUILTIN_OBJS) fetch.o: $(LIB_H)
|
||||
@@ -814,7 +836,7 @@ $(patsubst git-%$X,%.o,$(PROGRAMS)): $(LIB_H) $(wildcard */*.h)
|
||||
$(DIFF_OBJS): diffcore.h
|
||||
|
||||
$(LIB_FILE): $(LIB_OBJS)
|
||||
rm -f $@ && $(AR) rcs $@ $(LIB_OBJS)
|
||||
$(QUIET_AR)rm -f $@ && $(AR) rcs $@ $(LIB_OBJS)
|
||||
|
||||
XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \
|
||||
xdiff/xmerge.o
|
||||
@@ -822,7 +844,7 @@ $(XDIFF_OBJS): xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \
|
||||
xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
|
||||
|
||||
$(XDIFF_LIB): $(XDIFF_OBJS)
|
||||
rm -f $@ && $(AR) rcs $@ $(XDIFF_OBJS)
|
||||
$(QUIET_AR)rm -f $@ && $(AR) rcs $@ $(XDIFF_OBJS)
|
||||
|
||||
|
||||
perl/Makefile: perl/Git.pm perl/Makefile.PL GIT-CFLAGS
|
||||
|
||||
@@ -1981,7 +1981,7 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry *
|
||||
}
|
||||
}
|
||||
else if (patch->old_name) {
|
||||
size = st->st_size;
|
||||
size = xsize_t(st->st_size);
|
||||
alloc = size + 8192;
|
||||
buf = xmalloc(alloc);
|
||||
if (read_old_data(st, patch->old_name, &buf, &alloc, &size))
|
||||
|
||||
@@ -1244,26 +1244,26 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
|
||||
*/
|
||||
struct commit_info
|
||||
{
|
||||
char *author;
|
||||
char *author_mail;
|
||||
const char *author;
|
||||
const char *author_mail;
|
||||
unsigned long author_time;
|
||||
char *author_tz;
|
||||
const char *author_tz;
|
||||
|
||||
/* filled only when asked for details */
|
||||
char *committer;
|
||||
char *committer_mail;
|
||||
const char *committer;
|
||||
const char *committer_mail;
|
||||
unsigned long committer_time;
|
||||
char *committer_tz;
|
||||
const char *committer_tz;
|
||||
|
||||
char *summary;
|
||||
const char *summary;
|
||||
};
|
||||
|
||||
/*
|
||||
* Parse author/committer line in the commit object buffer
|
||||
*/
|
||||
static void get_ac_line(const char *inbuf, const char *what,
|
||||
int bufsz, char *person, char **mail,
|
||||
unsigned long *time, char **tz)
|
||||
int bufsz, char *person, const char **mail,
|
||||
unsigned long *time, const char **tz)
|
||||
{
|
||||
int len;
|
||||
char *tmp, *endp;
|
||||
@@ -1280,7 +1280,7 @@ static void get_ac_line(const char *inbuf, const char *what,
|
||||
if (bufsz <= len) {
|
||||
error_out:
|
||||
/* Ugh */
|
||||
person = *mail = *tz = "(unknown)";
|
||||
*mail = *tz = "(unknown)";
|
||||
*time = 0;
|
||||
return;
|
||||
}
|
||||
@@ -1963,7 +1963,7 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con
|
||||
die("Cannot lstat %s", path);
|
||||
read_from = path;
|
||||
}
|
||||
fin_size = st.st_size;
|
||||
fin_size = xsize_t(st.st_size);
|
||||
buf = xmalloc(fin_size+1);
|
||||
mode = canon_mode(st.st_mode);
|
||||
switch (st.st_mode & S_IFMT) {
|
||||
|
||||
@@ -289,12 +289,13 @@ static void print_ref_list(int kinds, int detached, int verbose, int abbrev)
|
||||
detached = (detached && (kinds & REF_LOCAL_BRANCH));
|
||||
if (detached) {
|
||||
struct ref_item item;
|
||||
item.name = "(no branch)";
|
||||
item.name = xstrdup("(no branch)");
|
||||
item.kind = REF_LOCAL_BRANCH;
|
||||
hashcpy(item.sha1, head_sha1);
|
||||
if (strlen(item.name) > ref_list.maxwidth)
|
||||
ref_list.maxwidth = strlen(item.name);
|
||||
print_ref_item(&item, ref_list.maxwidth, verbose, abbrev, 1);
|
||||
free(item.name);
|
||||
}
|
||||
|
||||
for (i = 0; i < ref_list.index; i++) {
|
||||
|
||||
@@ -263,6 +263,11 @@ static void show_object(struct object_array_entry *p)
|
||||
write_or_die(1, "\n", 1);
|
||||
}
|
||||
|
||||
static void show_edge(struct commit *commit)
|
||||
{
|
||||
; /* nothing to do */
|
||||
}
|
||||
|
||||
static int create_bundle(struct bundle_header *header, const char *path,
|
||||
int argc, const char **argv)
|
||||
{
|
||||
@@ -341,6 +346,7 @@ static int create_bundle(struct bundle_header *header, const char *path,
|
||||
dup2(in, 1);
|
||||
close(in);
|
||||
prepare_revision_walk(&revs);
|
||||
mark_edges_uninteresting(revs.commits, &revs, show_edge);
|
||||
traverse_commit_list(&revs, show_commit, show_object);
|
||||
close(1);
|
||||
while (waitpid(pid, &status, 0) < 0)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "cache.h"
|
||||
|
||||
static const char git_config_set_usage[] =
|
||||
"git-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --list";
|
||||
"git-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --remove-section name | --list";
|
||||
|
||||
static char *key;
|
||||
static regex_t *key_regexp;
|
||||
@@ -168,6 +168,19 @@ int cmd_config(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else if (!strcmp(argv[1], "--remove-section")) {
|
||||
int ret;
|
||||
if (argc != 3)
|
||||
usage(git_config_set_usage);
|
||||
ret = git_config_rename_section(argv[2], NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret == 0) {
|
||||
fprintf(stderr, "No such section!\n");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
break;
|
||||
argc--;
|
||||
|
||||
@@ -45,9 +45,9 @@ static void count_objects(DIR *d, char *path, int len, int verbose,
|
||||
bad = 1;
|
||||
else
|
||||
#ifndef NO_ST_BLOCKS
|
||||
(*loose_size) += st.st_blocks;
|
||||
(*loose_size) += xsize_t(st.st_blocks);
|
||||
#else
|
||||
(*loose_size) += (st.st_size+511)/512;
|
||||
(*loose_size) += xsize_t((st.st_size+511)/512);
|
||||
#endif
|
||||
}
|
||||
if (bad) {
|
||||
|
||||
@@ -301,7 +301,7 @@ static const char *find_wholine(const char *who, int wholen, const char *buf, un
|
||||
return "";
|
||||
}
|
||||
|
||||
static char *copy_line(const char *buf)
|
||||
static const char *copy_line(const char *buf)
|
||||
{
|
||||
const char *eol = strchr(buf, '\n');
|
||||
char *line;
|
||||
@@ -315,7 +315,7 @@ static char *copy_line(const char *buf)
|
||||
return line;
|
||||
}
|
||||
|
||||
static char *copy_name(const char *buf)
|
||||
static const char *copy_name(const char *buf)
|
||||
{
|
||||
const char *eol = strchr(buf, '\n');
|
||||
const char *eoname = strstr(buf, " <");
|
||||
@@ -330,7 +330,7 @@ static char *copy_name(const char *buf)
|
||||
return line;
|
||||
}
|
||||
|
||||
static char *copy_email(const char *buf)
|
||||
static const char *copy_email(const char *buf)
|
||||
{
|
||||
const char *email = strchr(buf, '<');
|
||||
const char *eoemail = strchr(email, '>');
|
||||
|
||||
@@ -18,6 +18,9 @@ static int check_full;
|
||||
static int check_strict;
|
||||
static int keep_cache_objects;
|
||||
static unsigned char head_sha1[20];
|
||||
static int errors_found;
|
||||
#define ERROR_OBJECT 01
|
||||
#define ERROR_REACHABLE 02
|
||||
|
||||
#ifdef NO_D_INO_IN_DIRENT
|
||||
#define SORT_DIRENT 0
|
||||
@@ -40,6 +43,7 @@ static int objerror(struct object *obj, const char *err, ...)
|
||||
{
|
||||
va_list params;
|
||||
va_start(params, err);
|
||||
errors_found |= ERROR_OBJECT;
|
||||
objreport(obj, "error", err, params);
|
||||
va_end(params);
|
||||
return -1;
|
||||
@@ -67,9 +71,10 @@ static void check_reachable_object(struct object *obj)
|
||||
* do a full fsck
|
||||
*/
|
||||
if (!obj->parsed) {
|
||||
if (has_sha1_file(obj->sha1))
|
||||
if (has_sha1_pack(obj->sha1, NULL))
|
||||
return; /* it is in pack - forget about it */
|
||||
printf("missing %s %s\n", typename(obj->type), sha1_to_hex(obj->sha1));
|
||||
errors_found |= ERROR_REACHABLE;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -88,6 +93,7 @@ static void check_reachable_object(struct object *obj)
|
||||
typename(obj->type), sha1_to_hex(obj->sha1));
|
||||
printf(" to %7s %s\n",
|
||||
typename(ref->type), sha1_to_hex(ref->sha1));
|
||||
errors_found |= ERROR_REACHABLE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -346,8 +352,11 @@ static int fsck_tag(struct tag *tag)
|
||||
static int fsck_sha1(unsigned char *sha1)
|
||||
{
|
||||
struct object *obj = parse_object(sha1);
|
||||
if (!obj)
|
||||
return error("%s: object corrupt or missing", sha1_to_hex(sha1));
|
||||
if (!obj) {
|
||||
errors_found |= ERROR_OBJECT;
|
||||
return error("%s: object corrupt or missing",
|
||||
sha1_to_hex(sha1));
|
||||
}
|
||||
if (obj->flags & SEEN)
|
||||
return 0;
|
||||
obj->flags |= SEEN;
|
||||
@@ -359,8 +368,10 @@ static int fsck_sha1(unsigned char *sha1)
|
||||
return fsck_commit((struct commit *) obj);
|
||||
if (obj->type == OBJ_TAG)
|
||||
return fsck_tag((struct tag *) obj);
|
||||
|
||||
/* By now, parse_object() would've returned NULL instead. */
|
||||
return objerror(obj, "unknown type '%d' (internal fsck error)", obj->type);
|
||||
return objerror(obj, "unknown type '%d' (internal fsck error)",
|
||||
obj->type);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -576,11 +587,16 @@ static int fsck_cache_tree(struct cache_tree *it)
|
||||
return err;
|
||||
}
|
||||
|
||||
static const char fsck_usage[] =
|
||||
"git-fsck [--tags] [--root] [[--unreachable] [--cache] [--full] "
|
||||
"[--strict] <head-sha1>*]";
|
||||
|
||||
int cmd_fsck(int argc, char **argv, const char *prefix)
|
||||
{
|
||||
int i, heads;
|
||||
|
||||
track_object_refs = 1;
|
||||
errors_found = 0;
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
const char *arg = argv[i];
|
||||
@@ -610,7 +626,7 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
|
||||
continue;
|
||||
}
|
||||
if (*arg == '-')
|
||||
usage("git-fsck [--tags] [--root] [[--unreachable] [--cache] [--full] [--strict] <head-sha1>*]");
|
||||
usage(fsck_usage);
|
||||
}
|
||||
|
||||
fsck_head_link();
|
||||
@@ -632,7 +648,7 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
|
||||
verify_pack(p, 0);
|
||||
|
||||
for (p = packed_git; p; p = p->next) {
|
||||
int num = num_packed_objects(p);
|
||||
uint32_t i, num = num_packed_objects(p);
|
||||
for (i = 0; i < num; i++) {
|
||||
unsigned char sha1[20];
|
||||
nth_packed_object_sha1(p, i, sha1);
|
||||
@@ -690,5 +706,5 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
|
||||
}
|
||||
|
||||
check_connectivity();
|
||||
return 0;
|
||||
return errors_found;
|
||||
}
|
||||
|
||||
@@ -122,6 +122,8 @@ static int grep_file(struct grep_opt *opt, const char *filename)
|
||||
struct stat st;
|
||||
int i;
|
||||
char *data;
|
||||
size_t sz;
|
||||
|
||||
if (lstat(filename, &st) < 0) {
|
||||
err_ret:
|
||||
if (errno != ENOENT)
|
||||
@@ -132,11 +134,12 @@ static int grep_file(struct grep_opt *opt, const char *filename)
|
||||
return 0; /* empty file -- no grep hit */
|
||||
if (!S_ISREG(st.st_mode))
|
||||
return 0;
|
||||
sz = xsize_t(st.st_size);
|
||||
i = open(filename, O_RDONLY);
|
||||
if (i < 0)
|
||||
goto err_ret;
|
||||
data = xmalloc(st.st_size + 1);
|
||||
if (st.st_size != read_in_full(i, data, st.st_size)) {
|
||||
data = xmalloc(sz + 1);
|
||||
if (st.st_size != read_in_full(i, data, sz)) {
|
||||
error("'%s': short read %s", filename, strerror(errno));
|
||||
close(i);
|
||||
free(data);
|
||||
@@ -145,11 +148,12 @@ static int grep_file(struct grep_opt *opt, const char *filename)
|
||||
close(i);
|
||||
if (opt->relative && opt->prefix_length)
|
||||
filename += opt->prefix_length;
|
||||
i = grep_buffer(opt, filename, data, st.st_size);
|
||||
i = grep_buffer(opt, filename, data, sz);
|
||||
free(data);
|
||||
return i;
|
||||
}
|
||||
|
||||
#ifdef __unix__
|
||||
static int exec_grep(int argc, const char **argv)
|
||||
{
|
||||
pid_t pid;
|
||||
@@ -298,6 +302,7 @@ static int external_grep(struct grep_opt *opt, const char **paths, int cached)
|
||||
}
|
||||
return hit;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int grep_cache(struct grep_opt *opt, const char **paths, int cached)
|
||||
{
|
||||
|
||||
@@ -482,10 +482,22 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
|
||||
memcpy(add_signoff, committer, endpos - committer + 1);
|
||||
add_signoff[endpos - committer + 1] = 0;
|
||||
}
|
||||
else if (!strcmp(argv[i], "--attach"))
|
||||
else if (!strcmp(argv[i], "--attach")) {
|
||||
rev.mime_boundary = git_version_string;
|
||||
else if (!prefixcmp(argv[i], "--attach="))
|
||||
rev.no_inline = 1;
|
||||
}
|
||||
else if (!prefixcmp(argv[i], "--attach=")) {
|
||||
rev.mime_boundary = argv[i] + 9;
|
||||
rev.no_inline = 1;
|
||||
}
|
||||
else if (!strcmp(argv[i], "--inline")) {
|
||||
rev.mime_boundary = git_version_string;
|
||||
rev.no_inline = 0;
|
||||
}
|
||||
else if (!prefixcmp(argv[i], "--inline=")) {
|
||||
rev.mime_boundary = argv[i] + 9;
|
||||
rev.no_inline = 0;
|
||||
}
|
||||
else if (!strcmp(argv[i], "--ignore-if-in-upstream"))
|
||||
ignore_if_in_upstream = 1;
|
||||
else if (!strcmp(argv[i], "--thread"))
|
||||
|
||||
@@ -545,10 +545,10 @@ static int decode_b_segment(char *in, char *ot, char *ep)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void convert_to_utf8(char *line, char *charset)
|
||||
static void convert_to_utf8(char *line, const char *charset)
|
||||
{
|
||||
static char latin_one[] = "latin1";
|
||||
char *input_charset = *charset ? charset : latin_one;
|
||||
static const char latin_one[] = "latin1";
|
||||
const char *input_charset = *charset ? charset : latin_one;
|
||||
char *out = reencode_string(line, metainfo_charset, input_charset);
|
||||
|
||||
if (!out)
|
||||
|
||||
@@ -23,7 +23,7 @@ git-pack-objects [{ -q | --progress | --all-progress }] \n\
|
||||
struct object_entry {
|
||||
unsigned char sha1[20];
|
||||
unsigned long size; /* uncompressed size */
|
||||
unsigned long offset; /* offset into the final pack file;
|
||||
off_t offset; /* offset into the final pack file;
|
||||
* nonzero if already written.
|
||||
*/
|
||||
unsigned int depth; /* delta depth */
|
||||
@@ -35,7 +35,7 @@ struct object_entry {
|
||||
#define in_pack_header_size delta_size /* only when reusing pack data */
|
||||
struct object_entry *delta; /* delta base object */
|
||||
struct packed_git *in_pack; /* already in pack */
|
||||
unsigned int in_pack_offset;
|
||||
off_t in_pack_offset;
|
||||
struct object_entry *delta_child; /* deltified objects who bases me */
|
||||
struct object_entry *delta_sibling; /* other deltified objects who
|
||||
* uses the same base as me
|
||||
@@ -68,7 +68,7 @@ static int allow_ofs_delta;
|
||||
|
||||
static struct object_entry **sorted_by_sha, **sorted_by_type;
|
||||
static struct object_entry *objects;
|
||||
static int nr_objects, nr_alloc, nr_result;
|
||||
static uint32_t nr_objects, nr_alloc, nr_result;
|
||||
static const char *base_name;
|
||||
static unsigned char pack_file_sha1[20];
|
||||
static int progress = 1;
|
||||
@@ -101,7 +101,7 @@ static int object_ix_hashsz;
|
||||
* get the object sha1 from the main index.
|
||||
*/
|
||||
struct revindex_entry {
|
||||
unsigned int offset;
|
||||
off_t offset;
|
||||
unsigned int nr;
|
||||
};
|
||||
struct pack_revindex {
|
||||
@@ -114,10 +114,8 @@ static int pack_revindex_hashsz;
|
||||
/*
|
||||
* stats
|
||||
*/
|
||||
static int written;
|
||||
static int written_delta;
|
||||
static int reused;
|
||||
static int reused_delta;
|
||||
static uint32_t written, written_delta;
|
||||
static uint32_t reused, reused_delta;
|
||||
|
||||
static int pack_revindex_ix(struct packed_git *p)
|
||||
{
|
||||
@@ -185,7 +183,7 @@ static void prepare_pack_revindex(struct pack_revindex *rix)
|
||||
}
|
||||
|
||||
static struct revindex_entry * find_packed_object(struct packed_git *p,
|
||||
unsigned int ofs)
|
||||
off_t ofs)
|
||||
{
|
||||
int num;
|
||||
int lo, hi;
|
||||
@@ -213,15 +211,14 @@ static struct revindex_entry * find_packed_object(struct packed_git *p,
|
||||
die("internal error: pack revindex corrupt");
|
||||
}
|
||||
|
||||
static unsigned long find_packed_object_size(struct packed_git *p,
|
||||
unsigned long ofs)
|
||||
static off_t find_packed_object_size(struct packed_git *p, off_t ofs)
|
||||
{
|
||||
struct revindex_entry *entry = find_packed_object(p, ofs);
|
||||
return entry[1].offset - ofs;
|
||||
}
|
||||
|
||||
static unsigned char *find_packed_object_name(struct packed_git *p,
|
||||
unsigned long ofs)
|
||||
off_t ofs)
|
||||
{
|
||||
struct revindex_entry *entry = find_packed_object(p, ofs);
|
||||
return (unsigned char *)(p->index_base + 256) + 24 * entry->nr + 4;
|
||||
@@ -278,8 +275,8 @@ static int encode_header(enum object_type type, unsigned long size, unsigned cha
|
||||
*/
|
||||
static int check_pack_inflate(struct packed_git *p,
|
||||
struct pack_window **w_curs,
|
||||
unsigned long offset,
|
||||
unsigned long len,
|
||||
off_t offset,
|
||||
off_t len,
|
||||
unsigned long expect)
|
||||
{
|
||||
z_stream stream;
|
||||
@@ -305,8 +302,8 @@ static int check_pack_inflate(struct packed_git *p,
|
||||
static void copy_pack_data(struct sha1file *f,
|
||||
struct packed_git *p,
|
||||
struct pack_window **w_curs,
|
||||
unsigned long offset,
|
||||
unsigned long len)
|
||||
off_t offset,
|
||||
off_t len)
|
||||
{
|
||||
unsigned char *in;
|
||||
unsigned int avail;
|
||||
@@ -314,7 +311,7 @@ static void copy_pack_data(struct sha1file *f,
|
||||
while (len) {
|
||||
in = use_pack(p, w_curs, offset, &avail);
|
||||
if (avail > len)
|
||||
avail = len;
|
||||
avail = (unsigned int)len;
|
||||
sha1write(f, in, avail);
|
||||
offset += avail;
|
||||
len -= avail;
|
||||
@@ -371,14 +368,15 @@ static int revalidate_loose_object(struct object_entry *entry,
|
||||
return check_loose_inflate(map, mapsize, size);
|
||||
}
|
||||
|
||||
static unsigned long write_object(struct sha1file *f,
|
||||
static off_t write_object(struct sha1file *f,
|
||||
struct object_entry *entry)
|
||||
{
|
||||
unsigned long size;
|
||||
enum object_type type;
|
||||
void *buf;
|
||||
unsigned char header[10];
|
||||
unsigned hdrlen, datalen;
|
||||
unsigned hdrlen;
|
||||
off_t datalen;
|
||||
enum object_type obj_type;
|
||||
int to_reuse = 0;
|
||||
|
||||
@@ -441,7 +439,7 @@ static unsigned long write_object(struct sha1file *f,
|
||||
* encoding of the relative offset for the delta
|
||||
* base from this object's position in the pack.
|
||||
*/
|
||||
unsigned long ofs = entry->offset - entry->delta->offset;
|
||||
off_t ofs = entry->offset - entry->delta->offset;
|
||||
unsigned pos = sizeof(header) - 1;
|
||||
header[pos] = ofs & 127;
|
||||
while (ofs >>= 7)
|
||||
@@ -462,7 +460,7 @@ static unsigned long write_object(struct sha1file *f,
|
||||
else {
|
||||
struct packed_git *p = entry->in_pack;
|
||||
struct pack_window *w_curs = NULL;
|
||||
unsigned long offset;
|
||||
off_t offset;
|
||||
|
||||
if (entry->delta) {
|
||||
obj_type = (allow_ofs_delta && entry->delta->offset) ?
|
||||
@@ -472,7 +470,7 @@ static unsigned long write_object(struct sha1file *f,
|
||||
hdrlen = encode_header(obj_type, entry->size, header);
|
||||
sha1write(f, header, hdrlen);
|
||||
if (obj_type == OBJ_OFS_DELTA) {
|
||||
unsigned long ofs = entry->offset - entry->delta->offset;
|
||||
off_t ofs = entry->offset - entry->delta->offset;
|
||||
unsigned pos = sizeof(header) - 1;
|
||||
header[pos] = ofs & 127;
|
||||
while (ofs >>= 7)
|
||||
@@ -500,9 +498,9 @@ static unsigned long write_object(struct sha1file *f,
|
||||
return hdrlen + datalen;
|
||||
}
|
||||
|
||||
static unsigned long write_one(struct sha1file *f,
|
||||
static off_t write_one(struct sha1file *f,
|
||||
struct object_entry *e,
|
||||
unsigned long offset)
|
||||
off_t offset)
|
||||
{
|
||||
if (e->offset || e->preferred_base)
|
||||
/* offset starts from header size and cannot be zero
|
||||
@@ -518,9 +516,9 @@ static unsigned long write_one(struct sha1file *f,
|
||||
|
||||
static void write_pack_file(void)
|
||||
{
|
||||
int i;
|
||||
uint32_t i;
|
||||
struct sha1file *f;
|
||||
unsigned long offset;
|
||||
off_t offset;
|
||||
struct pack_header hdr;
|
||||
unsigned last_percent = 999;
|
||||
int do_progress = progress;
|
||||
@@ -533,7 +531,7 @@ static void write_pack_file(void)
|
||||
f = sha1create("%s-%s.%s", base_name,
|
||||
sha1_to_hex(object_list_sha1), "pack");
|
||||
if (do_progress)
|
||||
fprintf(stderr, "Writing %d objects.\n", nr_result);
|
||||
fprintf(stderr, "Writing %u objects.\n", nr_result);
|
||||
|
||||
hdr.hdr_signature = htonl(PACK_SIGNATURE);
|
||||
hdr.hdr_version = htonl(PACK_VERSION);
|
||||
@@ -558,13 +556,13 @@ static void write_pack_file(void)
|
||||
fputc('\n', stderr);
|
||||
done:
|
||||
if (written != nr_result)
|
||||
die("wrote %d objects while expecting %d", written, nr_result);
|
||||
die("wrote %u objects while expecting %u", written, nr_result);
|
||||
sha1close(f, pack_file_sha1, 1);
|
||||
}
|
||||
|
||||
static void write_index_file(void)
|
||||
{
|
||||
int i;
|
||||
uint32_t i;
|
||||
struct sha1file *f = sha1create("%s-%s.%s", base_name,
|
||||
sha1_to_hex(object_list_sha1), "idx");
|
||||
struct object_entry **list = sorted_by_sha;
|
||||
@@ -633,7 +631,7 @@ static struct object_entry *locate_object_entry(const unsigned char *sha1)
|
||||
|
||||
static void rehash_objects(void)
|
||||
{
|
||||
int i;
|
||||
uint32_t i;
|
||||
struct object_entry *oe;
|
||||
|
||||
object_ix_hashsz = nr_objects * 3;
|
||||
@@ -670,16 +668,16 @@ static unsigned name_hash(const char *name)
|
||||
|
||||
static int add_object_entry(const unsigned char *sha1, unsigned hash, int exclude)
|
||||
{
|
||||
unsigned int idx = nr_objects;
|
||||
uint32_t idx = nr_objects;
|
||||
struct object_entry *entry;
|
||||
struct packed_git *p;
|
||||
unsigned int found_offset = 0;
|
||||
off_t found_offset = 0;
|
||||
struct packed_git *found_pack = NULL;
|
||||
int ix, status = 0;
|
||||
|
||||
if (!exclude) {
|
||||
for (p = packed_git; p; p = p->next) {
|
||||
unsigned long offset = find_pack_entry_one(sha1, p);
|
||||
off_t offset = find_pack_entry_one(sha1, p);
|
||||
if (offset) {
|
||||
if (incremental)
|
||||
return 0;
|
||||
@@ -696,9 +694,8 @@ static int add_object_entry(const unsigned char *sha1, unsigned hash, int exclud
|
||||
goto already_added;
|
||||
|
||||
if (idx >= nr_alloc) {
|
||||
unsigned int needed = (idx + 1024) * 3 / 2;
|
||||
objects = xrealloc(objects, needed * sizeof(*entry));
|
||||
nr_alloc = needed;
|
||||
nr_alloc = (idx + 1024) * 3 / 2;
|
||||
objects = xrealloc(objects, nr_alloc * sizeof(*entry));
|
||||
}
|
||||
entry = objects + idx;
|
||||
nr_objects = idx + 1;
|
||||
@@ -718,7 +715,7 @@ static int add_object_entry(const unsigned char *sha1, unsigned hash, int exclud
|
||||
|
||||
already_added:
|
||||
if (progress_update) {
|
||||
fprintf(stderr, "Counting objects...%d\r", nr_objects);
|
||||
fprintf(stderr, "Counting objects...%u\r", nr_objects);
|
||||
progress_update = 0;
|
||||
}
|
||||
if (exclude)
|
||||
@@ -981,17 +978,17 @@ static void check_object(struct object_entry *entry)
|
||||
if (entry->in_pack && !entry->preferred_base) {
|
||||
struct packed_git *p = entry->in_pack;
|
||||
struct pack_window *w_curs = NULL;
|
||||
unsigned long left = p->pack_size - entry->in_pack_offset;
|
||||
unsigned long size, used;
|
||||
unsigned int avail;
|
||||
unsigned char *buf;
|
||||
struct object_entry *base_entry = NULL;
|
||||
|
||||
buf = use_pack(p, &w_curs, entry->in_pack_offset, NULL);
|
||||
buf = use_pack(p, &w_curs, entry->in_pack_offset, &avail);
|
||||
|
||||
/* We want in_pack_type even if we do not reuse delta.
|
||||
* There is no point not reusing non-delta representations.
|
||||
*/
|
||||
used = unpack_object_header_gently(buf, left,
|
||||
used = unpack_object_header_gently(buf, avail,
|
||||
&entry->in_pack_type, &size);
|
||||
|
||||
/* Check if it is delta, and the base is also an object
|
||||
@@ -1000,7 +997,7 @@ static void check_object(struct object_entry *entry)
|
||||
*/
|
||||
if (!no_reuse_delta) {
|
||||
unsigned char c, *base_name;
|
||||
unsigned long ofs;
|
||||
off_t ofs;
|
||||
unsigned long used_0;
|
||||
/* there is at least 20 bytes left in the pack */
|
||||
switch (entry->in_pack_type) {
|
||||
@@ -1081,7 +1078,7 @@ static unsigned int check_delta_limit(struct object_entry *me, unsigned int n)
|
||||
|
||||
static void get_object_details(void)
|
||||
{
|
||||
int i;
|
||||
uint32_t i;
|
||||
struct object_entry *entry;
|
||||
|
||||
prepare_pack_ix();
|
||||
@@ -1120,7 +1117,7 @@ static int sort_comparator(const void *_a, const void *_b)
|
||||
static struct object_entry **create_sorted_list(entry_sort_t sort)
|
||||
{
|
||||
struct object_entry **list = xmalloc(nr_objects * sizeof(struct object_entry *));
|
||||
int i;
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < nr_objects; i++)
|
||||
list[i] = objects + i;
|
||||
@@ -1137,7 +1134,7 @@ static int sha1_sort(const struct object_entry *a, const struct object_entry *b)
|
||||
static struct object_entry **create_final_object_list(void)
|
||||
{
|
||||
struct object_entry **list;
|
||||
int i, j;
|
||||
uint32_t i, j;
|
||||
|
||||
for (i = nr_result = 0; i < nr_objects; i++)
|
||||
if (!objects[i].preferred_base)
|
||||
@@ -1279,20 +1276,20 @@ static void progress_interval(int signum)
|
||||
|
||||
static void find_deltas(struct object_entry **list, int window, int depth)
|
||||
{
|
||||
int i, idx;
|
||||
uint32_t i = nr_objects, idx = 0, processed = 0;
|
||||
unsigned int array_size = window * sizeof(struct unpacked);
|
||||
struct unpacked *array = xmalloc(array_size);
|
||||
unsigned processed = 0;
|
||||
struct unpacked *array;
|
||||
unsigned last_percent = 999;
|
||||
|
||||
if (!nr_objects)
|
||||
return;
|
||||
array = xmalloc(array_size);
|
||||
memset(array, 0, array_size);
|
||||
i = nr_objects;
|
||||
idx = 0;
|
||||
if (progress)
|
||||
fprintf(stderr, "Deltifying %d objects.\n", nr_result);
|
||||
fprintf(stderr, "Deltifying %u objects.\n", nr_result);
|
||||
|
||||
while (--i >= 0) {
|
||||
struct object_entry *entry = list[i];
|
||||
do {
|
||||
struct object_entry *entry = list[--i];
|
||||
struct unpacked *n = array + idx;
|
||||
int j;
|
||||
|
||||
@@ -1325,7 +1322,7 @@ static void find_deltas(struct object_entry **list, int window, int depth)
|
||||
|
||||
j = window;
|
||||
while (--j > 0) {
|
||||
unsigned int other_idx = idx + j;
|
||||
uint32_t other_idx = idx + j;
|
||||
struct unpacked *m;
|
||||
if (other_idx >= window)
|
||||
other_idx -= window;
|
||||
@@ -1345,7 +1342,7 @@ static void find_deltas(struct object_entry **list, int window, int depth)
|
||||
idx++;
|
||||
if (idx >= window)
|
||||
idx = 0;
|
||||
}
|
||||
} while (i > 0);
|
||||
|
||||
if (progress)
|
||||
fputc('\n', stderr);
|
||||
@@ -1386,7 +1383,7 @@ static int reuse_cached_pack(unsigned char *sha1)
|
||||
}
|
||||
|
||||
if (progress)
|
||||
fprintf(stderr, "Reusing %d objects pack %s\n", nr_objects,
|
||||
fprintf(stderr, "Reusing %u objects pack %s\n", nr_objects,
|
||||
sha1_to_hex(sha1));
|
||||
|
||||
if (pack_to_stdout) {
|
||||
@@ -1537,7 +1534,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
||||
struct object_entry **list;
|
||||
int use_internal_rev_list = 0;
|
||||
int thin = 0;
|
||||
int i;
|
||||
uint32_t i;
|
||||
const char **rp_av;
|
||||
int rp_ac_alloc = 64;
|
||||
int rp_ac;
|
||||
@@ -1670,7 +1667,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
|
||||
if (progress)
|
||||
fprintf(stderr, "Done counting %d objects.\n", nr_objects);
|
||||
fprintf(stderr, "Done counting %u objects.\n", nr_objects);
|
||||
sorted_by_sha = create_final_object_list();
|
||||
if (non_empty && !nr_result)
|
||||
return 0;
|
||||
@@ -1683,7 +1680,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
SHA1_Final(object_list_sha1, &ctx);
|
||||
if (progress && (nr_objects != nr_result))
|
||||
fprintf(stderr, "Result has %d objects.\n", nr_result);
|
||||
fprintf(stderr, "Result has %u objects.\n", nr_result);
|
||||
|
||||
if (reuse_cached_pack(object_list_sha1))
|
||||
;
|
||||
@@ -1704,7 +1701,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
}
|
||||
if (progress)
|
||||
fprintf(stderr, "Total %d (delta %d), reused %d (delta %d)\n",
|
||||
fprintf(stderr, "Total %u (delta %u), reused %u (delta %u)\n",
|
||||
written, written_delta, reused, reused_delta);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -336,7 +336,7 @@ static int do_push(const char *repo)
|
||||
argv[dest_argc] = NULL;
|
||||
if (verbose)
|
||||
fprintf(stderr, "Pushing to %s\n", dest);
|
||||
err = run_command_v(argv);
|
||||
err = run_command_v_opt(argv, 0);
|
||||
if (!err)
|
||||
continue;
|
||||
switch (err) {
|
||||
|
||||
404
builtin-revert.c
Normal file
404
builtin-revert.c
Normal file
@@ -0,0 +1,404 @@
|
||||
#include "cache.h"
|
||||
#include "builtin.h"
|
||||
#include "object.h"
|
||||
#include "commit.h"
|
||||
#include "tag.h"
|
||||
#include "wt-status.h"
|
||||
#include "run-command.h"
|
||||
#include "exec_cmd.h"
|
||||
#include "utf8.h"
|
||||
|
||||
/*
|
||||
* This implements the builtins revert and cherry-pick.
|
||||
*
|
||||
* Copyright (c) 2007 Johannes E. Schindelin
|
||||
*
|
||||
* Based on git-revert.sh, which is
|
||||
*
|
||||
* Copyright (c) 2005 Linus Torvalds
|
||||
* Copyright (c) 2005 Junio C Hamano
|
||||
*/
|
||||
|
||||
static const char *revert_usage = "git-revert [--edit | --no-edit] [-n] <commit-ish>";
|
||||
|
||||
static const char *cherry_pick_usage = "git-cherry-pick [--edit] [-n] [-r] [-x] <commit-ish>";
|
||||
|
||||
static int edit;
|
||||
static int replay;
|
||||
enum { REVERT, CHERRY_PICK } action;
|
||||
static int no_commit;
|
||||
static struct commit *commit;
|
||||
static int needed_deref;
|
||||
|
||||
static const char *me;
|
||||
|
||||
#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
|
||||
|
||||
static void parse_options(int argc, const char **argv)
|
||||
{
|
||||
const char *usage_str = action == REVERT ?
|
||||
revert_usage : cherry_pick_usage;
|
||||
unsigned char sha1[20];
|
||||
const char *arg;
|
||||
int i;
|
||||
|
||||
if (argc < 2)
|
||||
usage(usage_str);
|
||||
|
||||
for (i = 1; i < argc - 1; i++) {
|
||||
arg = argv[i];
|
||||
if (!strcmp(arg, "-n") || !strcmp(arg, "--no-commit"))
|
||||
no_commit = 1;
|
||||
else if (!strcmp(arg, "-e") || !strcmp(arg, "--edit"))
|
||||
edit = 1;
|
||||
else if (!strcmp(arg, "--no-edit"))
|
||||
edit = 0;
|
||||
else if (!strcmp(arg, "-x") || !strcmp(arg, "--i-really-want-"
|
||||
"to-expose-my-private-commit-object-name"))
|
||||
replay = 0;
|
||||
else if (strcmp(arg, "-r"))
|
||||
usage(usage_str);
|
||||
}
|
||||
|
||||
arg = argv[argc - 1];
|
||||
if (get_sha1(arg, sha1))
|
||||
die ("Cannot find '%s'", arg);
|
||||
commit = (struct commit *)parse_object(sha1);
|
||||
if (!commit)
|
||||
die ("Could not find %s", sha1_to_hex(sha1));
|
||||
if (commit->object.type == OBJ_TAG) {
|
||||
commit = (struct commit *)
|
||||
deref_tag((struct object *)commit, arg, strlen(arg));
|
||||
needed_deref = 1;
|
||||
}
|
||||
if (commit->object.type != OBJ_COMMIT)
|
||||
die ("'%s' does not point to a commit", arg);
|
||||
}
|
||||
|
||||
static char *get_oneline(const char *message)
|
||||
{
|
||||
char *result;
|
||||
const char *p = message, *abbrev, *eol;
|
||||
int abbrev_len, oneline_len;
|
||||
|
||||
if (!p)
|
||||
die ("Could not read commit message of %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
while (*p && (*p != '\n' || p[1] != '\n'))
|
||||
p++;
|
||||
|
||||
if (*p) {
|
||||
p += 2;
|
||||
for (eol = p + 1; *eol && *eol != '\n'; eol++)
|
||||
; /* do nothing */
|
||||
} else
|
||||
eol = p;
|
||||
abbrev = find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV);
|
||||
abbrev_len = strlen(abbrev);
|
||||
oneline_len = eol - p;
|
||||
result = xmalloc(abbrev_len + 5 + oneline_len);
|
||||
memcpy(result, abbrev, abbrev_len);
|
||||
memcpy(result + abbrev_len, "... ", 4);
|
||||
memcpy(result + abbrev_len + 4, p, oneline_len);
|
||||
result[abbrev_len + 4 + oneline_len] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
char *get_encoding(const char *message)
|
||||
{
|
||||
const char *p = message, *eol;
|
||||
|
||||
if (!p)
|
||||
die ("Could not read commit message of %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
while (*p && *p != '\n') {
|
||||
for (eol = p + 1; *eol && *eol != '\n'; eol++)
|
||||
; /* do nothing */
|
||||
if (!prefixcmp(p, "encoding ")) {
|
||||
char *result = xmalloc(eol - 8 - p);
|
||||
strlcpy(result, p + 9, eol - 8 - p);
|
||||
return result;
|
||||
}
|
||||
p = eol;
|
||||
if (*p == '\n')
|
||||
p++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct lock_file msg_file;
|
||||
static int msg_fd;
|
||||
|
||||
static void add_to_msg(const char *string)
|
||||
{
|
||||
int len = strlen(string);
|
||||
if (write_in_full(msg_fd, string, len) < 0)
|
||||
die ("Could not write to .msg");
|
||||
}
|
||||
|
||||
static void add_message_to_msg(const char *message)
|
||||
{
|
||||
const char *p = message;
|
||||
while (*p && (*p != '\n' || p[1] != '\n'))
|
||||
p++;
|
||||
|
||||
if (!*p)
|
||||
add_to_msg(sha1_to_hex(commit->object.sha1));
|
||||
|
||||
p += 2;
|
||||
add_to_msg(p);
|
||||
return;
|
||||
}
|
||||
|
||||
static void set_author_ident_env(const char *message)
|
||||
{
|
||||
const char *p = message;
|
||||
if (!p)
|
||||
die ("Could not read commit message of %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
while (*p && *p != '\n') {
|
||||
const char *eol;
|
||||
|
||||
for (eol = p; *eol && *eol != '\n'; eol++)
|
||||
; /* do nothing */
|
||||
if (!prefixcmp(p, "author ")) {
|
||||
char *line, *pend, *email, *timestamp;
|
||||
|
||||
p += 7;
|
||||
line = xmalloc(eol + 1 - p);
|
||||
memcpy(line, p, eol - p);
|
||||
line[eol - p] = '\0';
|
||||
email = strchr(line, '<');
|
||||
if (!email)
|
||||
die ("Could not extract author email from %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
if (email == line)
|
||||
pend = line;
|
||||
else
|
||||
for (pend = email; pend != line + 1 &&
|
||||
isspace(pend[-1]); pend--);
|
||||
; /* do nothing */
|
||||
*pend = '\0';
|
||||
email++;
|
||||
timestamp = strchr(email, '>');
|
||||
if (!timestamp)
|
||||
die ("Could not extract author email from %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
*timestamp = '\0';
|
||||
for (timestamp++; *timestamp && isspace(*timestamp);
|
||||
timestamp++)
|
||||
; /* do nothing */
|
||||
setenv("GIT_AUTHOR_NAME", line, 1);
|
||||
setenv("GIT_AUTHOR_EMAIL", email, 1);
|
||||
setenv("GIT_AUTHOR_DATE", timestamp, 1);
|
||||
free(line);
|
||||
return;
|
||||
}
|
||||
p = eol;
|
||||
if (*p == '\n')
|
||||
p++;
|
||||
}
|
||||
die ("No author information found in %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
}
|
||||
|
||||
static int merge_recursive(const char *base_sha1,
|
||||
const char *head_sha1, const char *head_name,
|
||||
const char *next_sha1, const char *next_name)
|
||||
{
|
||||
char buffer[256];
|
||||
const char *argv[6];
|
||||
|
||||
sprintf(buffer, "GITHEAD_%s", head_sha1);
|
||||
setenv(buffer, head_name, 1);
|
||||
sprintf(buffer, "GITHEAD_%s", next_sha1);
|
||||
setenv(buffer, next_name, 1);
|
||||
|
||||
/*
|
||||
* This three way merge is an interesting one. We are at
|
||||
* $head, and would want to apply the change between $commit
|
||||
* and $prev on top of us (when reverting), or the change between
|
||||
* $prev and $commit on top of us (when cherry-picking or replaying).
|
||||
*/
|
||||
argv[0] = "merge-recursive";
|
||||
argv[1] = base_sha1;
|
||||
argv[2] = "--";
|
||||
argv[3] = head_sha1;
|
||||
argv[4] = next_sha1;
|
||||
argv[5] = NULL;
|
||||
|
||||
return run_command_v_opt(argv, RUN_COMMAND_NO_STDIN | RUN_GIT_CMD);
|
||||
}
|
||||
|
||||
static int revert_or_cherry_pick(int argc, const char **argv)
|
||||
{
|
||||
unsigned char head[20];
|
||||
struct commit *base, *next;
|
||||
int i;
|
||||
char *oneline, *encoding, *reencoded_message = NULL;
|
||||
const char *message;
|
||||
|
||||
git_config(git_default_config);
|
||||
me = action == REVERT ? "revert" : "cherry-pick";
|
||||
setenv(GIT_REFLOG_ACTION, me, 0);
|
||||
parse_options(argc, argv);
|
||||
|
||||
/* this is copied from the shell script, but it's never triggered... */
|
||||
if (action == REVERT && replay)
|
||||
die("revert is incompatible with replay");
|
||||
|
||||
if (no_commit) {
|
||||
/*
|
||||
* We do not intend to commit immediately. We just want to
|
||||
* merge the differences in.
|
||||
*/
|
||||
if (write_tree(head, 0, NULL))
|
||||
die ("Your index file is unmerged.");
|
||||
} else {
|
||||
struct wt_status s;
|
||||
|
||||
if (get_sha1("HEAD", head))
|
||||
die ("You do not have a valid HEAD");
|
||||
wt_status_prepare(&s);
|
||||
if (s.commitable || s.workdir_dirty)
|
||||
die ("Dirty index: cannot %s", me);
|
||||
discard_cache();
|
||||
}
|
||||
|
||||
if (!commit->parents)
|
||||
die ("Cannot %s a root commit", me);
|
||||
if (commit->parents->next)
|
||||
die ("Cannot %s a multi-parent commit.", me);
|
||||
if (!(message = commit->buffer))
|
||||
die ("Cannot get commit message for %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
|
||||
/*
|
||||
* "commit" is an existing commit. We would want to apply
|
||||
* the difference it introduces since its first parent "prev"
|
||||
* on top of the current HEAD if we are cherry-pick. Or the
|
||||
* reverse of it if we are revert.
|
||||
*/
|
||||
|
||||
msg_fd = hold_lock_file_for_update(&msg_file, ".msg", 1);
|
||||
|
||||
encoding = get_encoding(message);
|
||||
if (!encoding)
|
||||
encoding = "utf-8";
|
||||
if (!git_commit_encoding)
|
||||
git_commit_encoding = "utf-8";
|
||||
if ((reencoded_message = reencode_string(message,
|
||||
git_commit_encoding, encoding)))
|
||||
message = reencoded_message;
|
||||
|
||||
oneline = get_oneline(message);
|
||||
|
||||
if (action == REVERT) {
|
||||
base = commit;
|
||||
next = commit->parents->item;
|
||||
add_to_msg("Revert ");
|
||||
add_to_msg(find_unique_abbrev(commit->object.sha1,
|
||||
DEFAULT_ABBREV));
|
||||
add_to_msg(oneline);
|
||||
add_to_msg("\nThis reverts commit ");
|
||||
add_to_msg(sha1_to_hex(commit->object.sha1));
|
||||
add_to_msg(".\n");
|
||||
} else {
|
||||
base = commit->parents->item;
|
||||
next = commit;
|
||||
set_author_ident_env(message);
|
||||
add_message_to_msg(message);
|
||||
if (!replay) {
|
||||
add_to_msg("(cherry picked from commit ");
|
||||
add_to_msg(sha1_to_hex(commit->object.sha1));
|
||||
add_to_msg(")\n");
|
||||
}
|
||||
}
|
||||
if (needed_deref) {
|
||||
add_to_msg("(original 'git ");
|
||||
add_to_msg(me);
|
||||
add_to_msg("' arguments: ");
|
||||
for (i = 0; i < argc; i++) {
|
||||
if (i)
|
||||
add_to_msg(" ");
|
||||
add_to_msg(argv[i]);
|
||||
}
|
||||
add_to_msg(")\n");
|
||||
}
|
||||
|
||||
if (merge_recursive(sha1_to_hex(base->object.sha1),
|
||||
sha1_to_hex(head), "HEAD",
|
||||
sha1_to_hex(next->object.sha1), oneline) ||
|
||||
write_tree(head, 0, NULL)) {
|
||||
const char *target = git_path("MERGE_MSG");
|
||||
add_to_msg("\nConflicts:\n\n");
|
||||
read_cache();
|
||||
for (i = 0; i < active_nr;) {
|
||||
struct cache_entry *ce = active_cache[i++];
|
||||
if (ce_stage(ce)) {
|
||||
add_to_msg("\t");
|
||||
add_to_msg(ce->name);
|
||||
add_to_msg("\n");
|
||||
while (i < active_nr && !strcmp(ce->name,
|
||||
active_cache[i]->name))
|
||||
i++;
|
||||
}
|
||||
}
|
||||
if (close(msg_fd) || commit_lock_file(&msg_file) < 0)
|
||||
die ("Error wrapping up .msg");
|
||||
unlink(target);
|
||||
if (rename(".msg", target))
|
||||
die ("Could not move .msg to %s", target);
|
||||
fprintf(stderr, "Automatic %s failed. "
|
||||
"After resolving the conflicts,\n"
|
||||
"mark the corrected paths with 'git-add <paths>'\n"
|
||||
"and commit the result.\n", me);
|
||||
if (action == CHERRY_PICK) {
|
||||
fprintf(stderr, "When commiting, use the option "
|
||||
"'-c %s' to retain authorship and message.\n",
|
||||
find_unique_abbrev(commit->object.sha1,
|
||||
DEFAULT_ABBREV));
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
if (close(msg_fd) || commit_lock_file(&msg_file) < 0)
|
||||
die ("Error wrapping up .msg");
|
||||
fprintf(stderr, "Finished one %s.\n", me);
|
||||
|
||||
/*
|
||||
*
|
||||
* If we are cherry-pick, and if the merge did not result in
|
||||
* hand-editing, we will hit this commit and inherit the original
|
||||
* author date and name.
|
||||
* If we are revert, or if our cherry-pick results in a hand merge,
|
||||
* we had better say that the current user is responsible for that.
|
||||
*/
|
||||
|
||||
if (!no_commit) {
|
||||
if (edit)
|
||||
return execl_git_cmd("commit", "-n", "-F", ".msg",
|
||||
"-e", NULL);
|
||||
else
|
||||
return execl_git_cmd("commit", "-n", "-F", ".msg",
|
||||
NULL);
|
||||
}
|
||||
if (reencoded_message)
|
||||
free(reencoded_message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cmd_revert(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
if (isatty(0))
|
||||
edit = 1;
|
||||
action = REVERT;
|
||||
return revert_or_cherry_pick(argc, argv);
|
||||
}
|
||||
|
||||
int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
replay = 1;
|
||||
action = CHERRY_PICK;
|
||||
return revert_or_cherry_pick(argc, argv);
|
||||
}
|
||||
@@ -217,13 +217,13 @@ static void get_from_rev(struct rev_info *rev, struct path_list *list)
|
||||
|
||||
prepare_revision_walk(rev);
|
||||
while ((commit = get_revision(rev)) != NULL) {
|
||||
char *author = NULL, *oneline, *buffer;
|
||||
const char *author = NULL, *oneline, *buffer;
|
||||
int authorlen = authorlen, onelinelen;
|
||||
|
||||
/* get author and oneline */
|
||||
for (buffer = commit->buffer; buffer && *buffer != '\0' &&
|
||||
*buffer != '\n'; ) {
|
||||
char *eol = strchr(buffer, '\n');
|
||||
const char *eol = strchr(buffer, '\n');
|
||||
|
||||
if (eol == NULL)
|
||||
eol = buffer + strlen(buffer);
|
||||
|
||||
@@ -721,7 +721,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
|
||||
}
|
||||
|
||||
for (i = 0; i < reflog; i++) {
|
||||
char *logmsg, *msg, *m;
|
||||
char *logmsg, *m;
|
||||
const char *msg;
|
||||
unsigned long timestamp;
|
||||
int tz;
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ 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_cherry(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_cherry_pick(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_describe(int argc, const char **argv, const char *prefix);
|
||||
@@ -60,6 +61,7 @@ extern int cmd_config(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_rerere(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_revert(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_rm(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_runstatus(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_shortlog(int argc, const char **argv, const char *prefix);
|
||||
|
||||
17
cache.h
17
cache.h
@@ -282,7 +282,6 @@ char *enter_repo(char *path, int strict);
|
||||
|
||||
/* Read and unpack a sha1 file into memory, write memory to a sha1 file */
|
||||
extern int sha1_object_info(const unsigned char *, unsigned long *);
|
||||
extern void * unpack_sha1_file(void *map, unsigned long mapsize, enum object_type *type, unsigned long *size);
|
||||
extern void * read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size);
|
||||
extern int hash_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *sha1);
|
||||
extern int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *return_sha1);
|
||||
@@ -384,7 +383,7 @@ extern struct packed_git {
|
||||
} *packed_git;
|
||||
|
||||
struct pack_entry {
|
||||
unsigned int offset;
|
||||
off_t offset;
|
||||
unsigned char sha1[20];
|
||||
struct packed_git *p;
|
||||
};
|
||||
@@ -423,15 +422,15 @@ extern struct packed_git *find_sha1_pack(const unsigned char *sha1,
|
||||
struct packed_git *packs);
|
||||
|
||||
extern void pack_report(void);
|
||||
extern unsigned char* use_pack(struct packed_git *, struct pack_window **, unsigned long, unsigned int *);
|
||||
extern unsigned char* use_pack(struct packed_git *, struct pack_window **, off_t, unsigned int *);
|
||||
extern void unuse_pack(struct pack_window **);
|
||||
extern struct packed_git *add_packed_git(char *, int, int);
|
||||
extern int num_packed_objects(const struct packed_git *p);
|
||||
extern int nth_packed_object_sha1(const struct packed_git *, int, unsigned char*);
|
||||
extern unsigned long find_pack_entry_one(const unsigned char *, struct packed_git *);
|
||||
extern void *unpack_entry(struct packed_git *, unsigned long, enum object_type *, unsigned long *);
|
||||
extern uint32_t num_packed_objects(const struct packed_git *p);
|
||||
extern int nth_packed_object_sha1(const struct packed_git *, uint32_t, unsigned char*);
|
||||
extern off_t find_pack_entry_one(const unsigned char *, struct packed_git *);
|
||||
extern void *unpack_entry(struct packed_git *, off_t, enum object_type *, unsigned long *);
|
||||
extern unsigned long unpack_object_header_gently(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep);
|
||||
extern const char *packed_object_info_detail(struct packed_git *, unsigned long, unsigned long *, unsigned long *, unsigned int *, unsigned char *);
|
||||
extern const char *packed_object_info_detail(struct packed_git *, off_t, unsigned long *, unsigned long *, unsigned int *, unsigned char *);
|
||||
|
||||
/* Dumb servers support */
|
||||
extern int update_server_info(int);
|
||||
@@ -452,7 +451,7 @@ extern char git_default_email[MAX_GITNAME];
|
||||
extern char git_default_name[MAX_GITNAME];
|
||||
|
||||
extern char *git_commit_encoding;
|
||||
extern char *git_log_output_encoding;
|
||||
extern const char *git_log_output_encoding;
|
||||
|
||||
extern int copy_fd(int ifd, int ofd);
|
||||
extern int read_in_full(int fd, void *buf, size_t count);
|
||||
|
||||
@@ -684,7 +684,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
||||
goto deleted_file;
|
||||
|
||||
if (S_ISLNK(st.st_mode)) {
|
||||
size_t len = st.st_size;
|
||||
size_t len = xsize_t(st.st_size);
|
||||
result_size = len;
|
||||
result = xmalloc(len + 1);
|
||||
if (result_size != readlink(elem->path, result, len)) {
|
||||
@@ -697,7 +697,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
||||
}
|
||||
else if (0 <= (fd = open(elem->path, O_RDONLY)) &&
|
||||
!fstat(fd, &st)) {
|
||||
size_t len = st.st_size;
|
||||
size_t len = xsize_t(st.st_size);
|
||||
size_t sz = 0;
|
||||
int is_file, i;
|
||||
|
||||
|
||||
21
commit.c
21
commit.c
@@ -651,7 +651,7 @@ static char *get_header(const struct commit *commit, const char *key)
|
||||
}
|
||||
}
|
||||
|
||||
static char *replace_encoding_header(char *buf, char *encoding)
|
||||
static char *replace_encoding_header(char *buf, const char *encoding)
|
||||
{
|
||||
char *encoding_header = strstr(buf, "\nencoding ");
|
||||
char *end_of_encoding_header;
|
||||
@@ -694,29 +694,26 @@ static char *replace_encoding_header(char *buf, char *encoding)
|
||||
}
|
||||
|
||||
static char *logmsg_reencode(const struct commit *commit,
|
||||
char *output_encoding)
|
||||
const char *output_encoding)
|
||||
{
|
||||
static const char *utf8 = "utf-8";
|
||||
const char *use_encoding;
|
||||
char *encoding;
|
||||
char *out;
|
||||
char *utf8 = "utf-8";
|
||||
|
||||
if (!*output_encoding)
|
||||
return NULL;
|
||||
encoding = get_header(commit, "encoding");
|
||||
if (!encoding)
|
||||
encoding = utf8;
|
||||
if (!strcmp(encoding, output_encoding))
|
||||
use_encoding = encoding ? encoding : utf8;
|
||||
if (!strcmp(use_encoding, output_encoding))
|
||||
out = strdup(commit->buffer);
|
||||
else
|
||||
out = reencode_string(commit->buffer,
|
||||
output_encoding, encoding);
|
||||
output_encoding, use_encoding);
|
||||
if (out)
|
||||
out = replace_encoding_header(out, output_encoding);
|
||||
|
||||
if (encoding != utf8)
|
||||
free(encoding);
|
||||
if (!out)
|
||||
return NULL;
|
||||
free(encoding);
|
||||
return out;
|
||||
}
|
||||
|
||||
@@ -917,7 +914,7 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt,
|
||||
const char *msg = commit->buffer;
|
||||
int plain_non_ascii = 0;
|
||||
char *reencoded;
|
||||
char *encoding;
|
||||
const char *encoding;
|
||||
|
||||
if (fmt == CMIT_FMT_USERFORMAT)
|
||||
return format_commit_message(commit, msg, buf, space);
|
||||
|
||||
88
config.c
88
config.c
@@ -431,7 +431,7 @@ static struct {
|
||||
int do_not_match;
|
||||
regex_t* value_regex;
|
||||
int multi_replace;
|
||||
off_t offset[MAX_MATCHES];
|
||||
size_t offset[MAX_MATCHES];
|
||||
enum { START, SECTION_SEEN, SECTION_END_SEEN, KEY_SEEN } state;
|
||||
int seen;
|
||||
} store;
|
||||
@@ -579,11 +579,11 @@ static int store_write_pair(int fd, const char* key, const char* value)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int find_beginning_of_line(const char* contents, int size,
|
||||
int offset_, int* found_bracket)
|
||||
static ssize_t find_beginning_of_line(const char* contents, size_t size,
|
||||
size_t offset_, int* found_bracket)
|
||||
{
|
||||
int equal_offset = size, bracket_offset = size;
|
||||
int offset;
|
||||
size_t equal_offset = size, bracket_offset = size;
|
||||
ssize_t offset;
|
||||
|
||||
for (offset = offset_-2; offset > 0
|
||||
&& contents[offset] != '\n'; offset--)
|
||||
@@ -727,7 +727,8 @@ int git_config_set_multivar(const char* key, const char* value,
|
||||
} else {
|
||||
struct stat st;
|
||||
char* contents;
|
||||
int i, copy_begin, copy_end, new_line = 0;
|
||||
size_t contents_sz, copy_begin, copy_end;
|
||||
int i, new_line = 0;
|
||||
|
||||
if (value_regex == NULL)
|
||||
store.value_regex = NULL;
|
||||
@@ -784,7 +785,8 @@ int git_config_set_multivar(const char* key, const char* value,
|
||||
}
|
||||
|
||||
fstat(in_fd, &st);
|
||||
contents = xmmap(NULL, st.st_size, PROT_READ,
|
||||
contents_sz = xsize_t(st.st_size);
|
||||
contents = xmmap(NULL, contents_sz, PROT_READ,
|
||||
MAP_PRIVATE, in_fd, 0);
|
||||
close(in_fd);
|
||||
|
||||
@@ -793,12 +795,12 @@ int git_config_set_multivar(const char* key, const char* value,
|
||||
|
||||
for (i = 0, copy_begin = 0; i < store.seen; i++) {
|
||||
if (store.offset[i] == 0) {
|
||||
store.offset[i] = copy_end = st.st_size;
|
||||
store.offset[i] = copy_end = contents_sz;
|
||||
} else if (store.state != KEY_SEEN) {
|
||||
copy_end = store.offset[i];
|
||||
} else
|
||||
copy_end = find_beginning_of_line(
|
||||
contents, st.st_size,
|
||||
contents, contents_sz,
|
||||
store.offset[i]-2, &new_line);
|
||||
|
||||
/* write the first part of the config */
|
||||
@@ -825,13 +827,13 @@ int git_config_set_multivar(const char* key, const char* value,
|
||||
}
|
||||
|
||||
/* write the rest of the config */
|
||||
if (copy_begin < st.st_size)
|
||||
if (copy_begin < contents_sz)
|
||||
if (write_in_full(fd, contents + copy_begin,
|
||||
st.st_size - copy_begin) <
|
||||
st.st_size - copy_begin)
|
||||
contents_sz - copy_begin) <
|
||||
contents_sz - copy_begin)
|
||||
goto write_err_out;
|
||||
|
||||
munmap(contents, st.st_size);
|
||||
munmap(contents, contents_sz);
|
||||
unlink(config_filename);
|
||||
}
|
||||
|
||||
@@ -861,9 +863,37 @@ write_err_out:
|
||||
|
||||
}
|
||||
|
||||
static int section_name_match (const char *buf, const char *name)
|
||||
{
|
||||
int i = 0, j = 0, dot = 0;
|
||||
for (; buf[i] && buf[i] != ']'; i++) {
|
||||
if (!dot && isspace(buf[i])) {
|
||||
dot = 1;
|
||||
if (name[j++] != '.')
|
||||
break;
|
||||
for (i++; isspace(buf[i]); i++)
|
||||
; /* do nothing */
|
||||
if (buf[i] != '"')
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
if (buf[i] == '\\' && dot)
|
||||
i++;
|
||||
else if (buf[i] == '"' && dot) {
|
||||
for (i++; isspace(buf[i]); i++)
|
||||
; /* do_nothing */
|
||||
break;
|
||||
}
|
||||
if (buf[i] != name[j++])
|
||||
break;
|
||||
}
|
||||
return (buf[i] == ']' && name[j] == 0);
|
||||
}
|
||||
|
||||
/* if new_name == NULL, the section is removed instead */
|
||||
int git_config_rename_section(const char *old_name, const char *new_name)
|
||||
{
|
||||
int ret = 0;
|
||||
int ret = 0, remove = 0;
|
||||
char *config_filename;
|
||||
struct lock_file *lock = xcalloc(sizeof(struct lock_file), 1);
|
||||
int out_fd;
|
||||
@@ -894,31 +924,12 @@ int git_config_rename_section(const char *old_name, const char *new_name)
|
||||
; /* do nothing */
|
||||
if (buf[i] == '[') {
|
||||
/* it's a section */
|
||||
int j = 0, dot = 0;
|
||||
for (i++; buf[i] && buf[i] != ']'; i++) {
|
||||
if (!dot && isspace(buf[i])) {
|
||||
dot = 1;
|
||||
if (old_name[j++] != '.')
|
||||
break;
|
||||
for (i++; isspace(buf[i]); i++)
|
||||
; /* do nothing */
|
||||
if (buf[i] != '"')
|
||||
break;
|
||||
if (section_name_match (&buf[i+1], old_name)) {
|
||||
ret++;
|
||||
if (new_name == NULL) {
|
||||
remove = 1;
|
||||
continue;
|
||||
}
|
||||
if (buf[i] == '\\' && dot)
|
||||
i++;
|
||||
else if (buf[i] == '"' && dot) {
|
||||
for (i++; isspace(buf[i]); i++)
|
||||
; /* do_nothing */
|
||||
break;
|
||||
}
|
||||
if (buf[i] != old_name[j++])
|
||||
break;
|
||||
}
|
||||
if (buf[i] == ']' && old_name[j] == 0) {
|
||||
/* old_name matches */
|
||||
ret++;
|
||||
store.baselen = strlen(new_name);
|
||||
if (!store_write_section(out_fd, new_name)) {
|
||||
ret = write_error();
|
||||
@@ -926,7 +937,10 @@ int git_config_rename_section(const char *old_name, const char *new_name)
|
||||
}
|
||||
continue;
|
||||
}
|
||||
remove = 0;
|
||||
}
|
||||
if (remove)
|
||||
continue;
|
||||
length = strlen(buf);
|
||||
if (write_in_full(out_fd, buf, length) != length) {
|
||||
ret = write_error();
|
||||
|
||||
@@ -891,36 +891,77 @@ and returns the process output as a string."
|
||||
(with-current-buffer log-edit-parent-buffer
|
||||
(git-get-filenames (git-marked-files-state 'added 'deleted 'modified))))
|
||||
|
||||
(defun git-append-sign-off (name email)
|
||||
"Append a Signed-off-by entry to the current buffer, avoiding duplicates."
|
||||
(let ((sign-off (format "Signed-off-by: %s <%s>" name email))
|
||||
(case-fold-search t))
|
||||
(goto-char (point-min))
|
||||
(unless (re-search-forward (concat "^" (regexp-quote sign-off)) nil t)
|
||||
(goto-char (point-min))
|
||||
(unless (re-search-forward "^Signed-off-by: " nil t)
|
||||
(setq sign-off (concat "\n" sign-off)))
|
||||
(goto-char (point-max))
|
||||
(insert sign-off "\n"))))
|
||||
|
||||
(defun git-setup-log-buffer (buffer &optional author-name author-email subject date msg)
|
||||
"Setup the log buffer for a commit."
|
||||
(unless git-status (error "Not in git-status buffer."))
|
||||
(let ((merge-heads (git-get-merge-heads))
|
||||
(dir default-directory)
|
||||
(committer-name (git-get-committer-name))
|
||||
(committer-email (git-get-committer-email))
|
||||
(sign-off git-append-signed-off-by))
|
||||
(with-current-buffer buffer
|
||||
(cd dir)
|
||||
(erase-buffer)
|
||||
(insert
|
||||
(propertize
|
||||
(format "Author: %s <%s>\n%s%s"
|
||||
(or author-name committer-name)
|
||||
(or author-email committer-email)
|
||||
(if date (format "Date: %s\n" date) "")
|
||||
(if merge-heads
|
||||
(format "Parent: %s\n%s\n"
|
||||
(git-rev-parse "HEAD")
|
||||
(mapconcat (lambda (str) (concat "Parent: " str)) merge-heads "\n"))
|
||||
""))
|
||||
'face 'git-header-face)
|
||||
(propertize git-log-msg-separator 'face 'git-separator-face)
|
||||
"\n")
|
||||
(when subject (insert subject "\n\n"))
|
||||
(cond (msg (insert msg "\n"))
|
||||
((file-readable-p ".dotest/msg")
|
||||
(insert-file-contents ".dotest/msg"))
|
||||
((file-readable-p ".git/MERGE_MSG")
|
||||
(insert-file-contents ".git/MERGE_MSG")))
|
||||
; delete empty lines at end
|
||||
(goto-char (point-min))
|
||||
(when (re-search-forward "\n+\\'" nil t)
|
||||
(replace-match "\n" t t))
|
||||
(when sign-off (git-append-sign-off committer-name committer-email)))))
|
||||
|
||||
(defun git-commit-file ()
|
||||
"Commit the marked file(s), asking for a commit message."
|
||||
(interactive)
|
||||
(unless git-status (error "Not in git-status buffer."))
|
||||
(let ((buffer (get-buffer-create "*git-commit*"))
|
||||
(merge-heads (git-get-merge-heads))
|
||||
(dir default-directory)
|
||||
(coding-system (git-get-commits-coding-system))
|
||||
(sign-off git-append-signed-off-by))
|
||||
(with-current-buffer buffer
|
||||
(when (eq 0 (buffer-size))
|
||||
(cd dir)
|
||||
(erase-buffer)
|
||||
(insert
|
||||
(propertize
|
||||
(format "Author: %s <%s>\n%s"
|
||||
(git-get-committer-name) (git-get-committer-email)
|
||||
(if merge-heads
|
||||
(format "Parent: %s\n%s\n"
|
||||
(git-rev-parse "HEAD")
|
||||
(mapconcat (lambda (str) (concat "Parent: " str)) merge-heads "\n"))
|
||||
""))
|
||||
'face 'git-header-face)
|
||||
(propertize git-log-msg-separator 'face 'git-separator-face)
|
||||
"\n")
|
||||
(cond ((file-readable-p ".git/MERGE_MSG")
|
||||
(insert-file-contents ".git/MERGE_MSG"))
|
||||
(sign-off
|
||||
(insert (format "\n\nSigned-off-by: %s <%s>\n"
|
||||
(git-get-committer-name) (git-get-committer-email)))))))
|
||||
author-name author-email subject date)
|
||||
(when (eq 0 (buffer-size buffer))
|
||||
(when (file-readable-p ".dotest/info")
|
||||
(with-temp-buffer
|
||||
(insert-file-contents ".dotest/info")
|
||||
(goto-char (point-min))
|
||||
(when (re-search-forward "^Author: \\(.*\\)\nEmail: \\(.*\\)$" nil t)
|
||||
(setq author-name (match-string 1))
|
||||
(setq author-email (match-string 2)))
|
||||
(goto-char (point-min))
|
||||
(when (re-search-forward "^Subject: \\(.*\\)$" nil t)
|
||||
(setq subject (match-string 1)))
|
||||
(goto-char (point-min))
|
||||
(when (re-search-forward "^Date: \\(.*\\)$" nil t)
|
||||
(setq date (match-string 1)))))
|
||||
(git-setup-log-buffer buffer author-name author-email subject date))
|
||||
(log-edit #'git-do-commit nil #'git-log-edit-files buffer)
|
||||
(setq font-lock-keywords (font-lock-compile-keywords git-log-edit-font-lock-keywords))
|
||||
(setq buffer-file-coding-system coding-system)
|
||||
|
||||
@@ -132,7 +132,7 @@ static void convert_tree(void *buffer, unsigned long size, unsigned char *result
|
||||
unsigned long orig_size = size;
|
||||
|
||||
while (size) {
|
||||
int len = 1+strlen(buffer);
|
||||
size_t len = 1+strlen(buffer);
|
||||
|
||||
convert_binary_sha1((char *) buffer + len);
|
||||
|
||||
|
||||
42
diff-lib.c
42
diff-lib.c
@@ -30,22 +30,28 @@ static int read_directory(const char *path, struct path_list *list)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_mode(const char *path, int *mode)
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
if (!path || !strcmp(path, "/dev/null"))
|
||||
*mode = 0;
|
||||
else if (!strcmp(path, "-"))
|
||||
*mode = ntohl(create_ce_mode(0666));
|
||||
else if (stat(path, &st))
|
||||
return error("Could not access '%s'", path);
|
||||
else
|
||||
*mode = st.st_mode;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int queue_diff(struct diff_options *o,
|
||||
const char *name1, const char *name2)
|
||||
{
|
||||
struct stat st;
|
||||
int mode1 = 0, mode2 = 0;
|
||||
|
||||
if (name1) {
|
||||
if (stat(name1, &st))
|
||||
return error("Could not access '%s'", name1);
|
||||
mode1 = st.st_mode;
|
||||
}
|
||||
if (name2) {
|
||||
if (stat(name2, &st))
|
||||
return error("Could not access '%s'", name2);
|
||||
mode2 = st.st_mode;
|
||||
}
|
||||
if (get_mode(name1, &mode1) || get_mode(name2, &mode2))
|
||||
return -1;
|
||||
|
||||
if (mode1 && mode2 && S_ISDIR(mode1) != S_ISDIR(mode2))
|
||||
return error("file/directory conflict: %s, %s", name1, name2);
|
||||
@@ -224,7 +230,7 @@ int setup_diff_no_index(struct rev_info *revs,
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i < argc; i++)
|
||||
if (argv[i][0] != '-')
|
||||
if (argv[i][0] != '-' || argv[i][1] == '\0')
|
||||
break;
|
||||
else if (!strcmp(argv[i], "--")) {
|
||||
i++;
|
||||
@@ -254,9 +260,15 @@ int setup_diff_no_index(struct rev_info *revs,
|
||||
|
||||
revs->diffopt.paths = xcalloc(2, sizeof(char*));
|
||||
for (i = 0; i < 2; i++) {
|
||||
const char *p;
|
||||
p = prefix_filename(prefix, len, argv[argc - 2 + i]);
|
||||
revs->diffopt.paths[i] = xstrdup(p);
|
||||
const char *p = argv[argc - 2 + i];
|
||||
/*
|
||||
* stdin should be spelled as '-'; if you have
|
||||
* path that is '-', spell it as ./-.
|
||||
*/
|
||||
p = (strcmp(p, "-")
|
||||
? xstrdup(prefix_filename(prefix, len, p))
|
||||
: p);
|
||||
revs->diffopt.paths[i] = p;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
42
diff.c
42
diff.c
@@ -1365,6 +1365,32 @@ static struct sha1_size_cache *locate_size_cache(unsigned char *sha1,
|
||||
return e;
|
||||
}
|
||||
|
||||
static int populate_from_stdin(struct diff_filespec *s)
|
||||
{
|
||||
#define INCREMENT 1024
|
||||
char *buf;
|
||||
unsigned long size;
|
||||
int got;
|
||||
|
||||
size = 0;
|
||||
buf = NULL;
|
||||
while (1) {
|
||||
buf = xrealloc(buf, size + INCREMENT);
|
||||
got = xread(0, buf + size, INCREMENT);
|
||||
if (!got)
|
||||
break; /* EOF */
|
||||
if (got < 0)
|
||||
return error("error while reading from stdin %s",
|
||||
strerror(errno));
|
||||
size += got;
|
||||
}
|
||||
s->should_munmap = 0;
|
||||
s->data = buf;
|
||||
s->size = size;
|
||||
s->should_free = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* While doing rename detection and pickaxe operation, we may need to
|
||||
* grab the data for the blob (or file) for our own in-core comparison.
|
||||
@@ -1390,6 +1416,9 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
|
||||
char *buf;
|
||||
unsigned long size;
|
||||
|
||||
if (!strcmp(s->path, "-"))
|
||||
return populate_from_stdin(s);
|
||||
|
||||
if (lstat(s->path, &st) < 0) {
|
||||
if (errno == ENOENT) {
|
||||
err_empty:
|
||||
@@ -1400,7 +1429,7 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
s->size = st.st_size;
|
||||
s->size = xsize_t(st.st_size);
|
||||
if (!s->size)
|
||||
goto empty;
|
||||
if (size_only)
|
||||
@@ -1516,12 +1545,13 @@ static void prepare_temp_file(const char *name,
|
||||
if (S_ISLNK(st.st_mode)) {
|
||||
int ret;
|
||||
char buf[PATH_MAX + 1]; /* ought to be SYMLINK_MAX */
|
||||
size_t sz = xsize_t(st.st_size);
|
||||
if (sizeof(buf) <= st.st_size)
|
||||
die("symlink too long: %s", name);
|
||||
ret = readlink(name, buf, st.st_size);
|
||||
ret = readlink(name, buf, sz);
|
||||
if (ret < 0)
|
||||
die("readlink(%s)", name);
|
||||
prep_temp_blob(temp, buf, st.st_size,
|
||||
prep_temp_blob(temp, buf, sz,
|
||||
(one->sha1_valid ?
|
||||
one->sha1 : null_sha1),
|
||||
(one->sha1_valid ?
|
||||
@@ -1684,6 +1714,10 @@ static void diff_fill_sha1_info(struct diff_filespec *one)
|
||||
if (DIFF_FILE_VALID(one)) {
|
||||
if (!one->sha1_valid) {
|
||||
struct stat st;
|
||||
if (!strcmp(one->path, "-")) {
|
||||
hashcpy(one->sha1, null_sha1);
|
||||
return;
|
||||
}
|
||||
if (lstat(one->path, &st) < 0)
|
||||
die("stat %s", one->path);
|
||||
if (index_path(one->sha1, one->path, &st, 0))
|
||||
@@ -2133,7 +2167,7 @@ static int parse_num(const char **cp_p)
|
||||
/* user says num divided by scale and we say internally that
|
||||
* is MAX_SCORE * num / scale.
|
||||
*/
|
||||
return (num >= scale) ? MAX_SCORE : (MAX_SCORE * num / scale);
|
||||
return (int)((num >= scale) ? MAX_SCORE : (MAX_SCORE * num / scale));
|
||||
}
|
||||
|
||||
int diff_scoreopt_parse(const char *opt)
|
||||
|
||||
@@ -89,7 +89,7 @@ static int should_break(struct diff_filespec *src,
|
||||
* merge the surviving pair together if the score is
|
||||
* less than the minimum, after rename/copy runs.
|
||||
*/
|
||||
*merge_score_p = src_removed * MAX_SCORE / src->size;
|
||||
*merge_score_p = (int)(src_removed * MAX_SCORE / src->size);
|
||||
|
||||
/* Extent of damage, which counts both inserts and
|
||||
* deletes.
|
||||
|
||||
@@ -14,6 +14,7 @@ static void prepare_order(const char *orderfile)
|
||||
void *map;
|
||||
char *cp, *endp;
|
||||
struct stat st;
|
||||
size_t sz;
|
||||
|
||||
if (order)
|
||||
return;
|
||||
@@ -25,11 +26,12 @@ static void prepare_order(const char *orderfile)
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
map = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
|
||||
sz = xsize_t(st.st_size);
|
||||
map = mmap(NULL, sz, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
|
||||
close(fd);
|
||||
if (map == MAP_FAILED)
|
||||
return;
|
||||
endp = (char *) map + st.st_size;
|
||||
endp = (char *) map + sz;
|
||||
for (pass = 0; pass < 2; pass++) {
|
||||
cnt = 0;
|
||||
cp = map;
|
||||
|
||||
@@ -172,7 +172,8 @@ static int estimate_similarity(struct diff_filespec *src,
|
||||
return 0; /* error but caught downstream */
|
||||
|
||||
|
||||
delta_limit = base_size * (MAX_SCORE-minimum_score) / MAX_SCORE;
|
||||
delta_limit = (unsigned long)
|
||||
(base_size * (MAX_SCORE-minimum_score) / MAX_SCORE);
|
||||
if (diffcore_count_changes(src->data, src->size,
|
||||
dst->data, dst->size,
|
||||
&src->cnt_data, &dst->cnt_data,
|
||||
@@ -186,7 +187,7 @@ static int estimate_similarity(struct diff_filespec *src,
|
||||
if (!dst->size)
|
||||
score = 0; /* should not happen */
|
||||
else
|
||||
score = src_copied * MAX_SCORE / max_size;
|
||||
score = (int)(src_copied * MAX_SCORE / max_size);
|
||||
return score;
|
||||
}
|
||||
|
||||
@@ -297,7 +298,7 @@ void diffcore_rename(struct diff_options *options)
|
||||
struct diff_filespec *one = rename_src[j].one;
|
||||
if (!is_exact_match(one, two, contents_too))
|
||||
continue;
|
||||
record_rename_pair(i, j, MAX_SCORE);
|
||||
record_rename_pair(i, j, (int)MAX_SCORE);
|
||||
rename_count++;
|
||||
break; /* we are done with this entry */
|
||||
}
|
||||
|
||||
4
dir.c
4
dir.c
@@ -130,13 +130,13 @@ static int add_excludes_from_file_1(const char *fname,
|
||||
{
|
||||
struct stat st;
|
||||
int fd, i;
|
||||
long size;
|
||||
size_t size;
|
||||
char *buf, *entry;
|
||||
|
||||
fd = open(fname, O_RDONLY);
|
||||
if (fd < 0 || fstat(fd, &st) < 0)
|
||||
goto err;
|
||||
size = st.st_size;
|
||||
size = xsize_t(st.st_size);
|
||||
if (size == 0) {
|
||||
close(fd);
|
||||
return 0;
|
||||
|
||||
@@ -21,7 +21,7 @@ int log_all_ref_updates = -1; /* unspecified */
|
||||
int warn_ambiguous_refs = 1;
|
||||
int repository_format_version;
|
||||
char *git_commit_encoding;
|
||||
char *git_log_output_encoding;
|
||||
const char *git_log_output_encoding;
|
||||
int shared_repository = PERM_UMASK;
|
||||
const char *apply_default_whitespace;
|
||||
int zlib_compression_level = Z_DEFAULT_COMPRESSION;
|
||||
|
||||
120
fast-import.c
120
fast-import.c
@@ -133,10 +133,6 @@ Format of STDIN stream:
|
||||
#define PACK_ID_BITS 16
|
||||
#define MAX_PACK_ID ((1<<PACK_ID_BITS)-1)
|
||||
|
||||
#ifndef PRIuMAX
|
||||
#define PRIuMAX "llu"
|
||||
#endif
|
||||
|
||||
struct object_entry
|
||||
{
|
||||
struct object_entry *next;
|
||||
@@ -220,7 +216,8 @@ struct branch
|
||||
const char *name;
|
||||
struct tree_entry branch_tree;
|
||||
uintmax_t last_commit;
|
||||
unsigned int pack_id;
|
||||
unsigned active : 1;
|
||||
unsigned pack_id : PACK_ID_BITS;
|
||||
unsigned char sha1[20];
|
||||
};
|
||||
|
||||
@@ -252,7 +249,7 @@ typedef enum {
|
||||
|
||||
/* Configured limits on output */
|
||||
static unsigned long max_depth = 10;
|
||||
static unsigned long max_packsize = (1LL << 32) - 1;
|
||||
static off_t max_packsize = (1LL << 32) - 1;
|
||||
static int force_update;
|
||||
|
||||
/* Stats and misc. counters */
|
||||
@@ -528,6 +525,7 @@ static struct branch *new_branch(const char *name)
|
||||
b->table_next_branch = branch_table[hc];
|
||||
b->branch_tree.versions[0].mode = S_IFDIR;
|
||||
b->branch_tree.versions[1].mode = S_IFDIR;
|
||||
b->active = 0;
|
||||
b->pack_id = MAX_PACK_ID;
|
||||
branch_table[hc] = b;
|
||||
branch_count++;
|
||||
@@ -755,7 +753,7 @@ static char *create_index(void)
|
||||
static char *keep_pack(char *curr_index_name)
|
||||
{
|
||||
static char name[PATH_MAX];
|
||||
static char *keep_msg = "fast-import";
|
||||
static const char *keep_msg = "fast-import";
|
||||
int keep_fd;
|
||||
|
||||
chmod(pack_data->pack_name, 0444);
|
||||
@@ -1373,16 +1371,33 @@ static void dump_marks_helper(FILE *f,
|
||||
|
||||
static void dump_marks(void)
|
||||
{
|
||||
if (mark_file)
|
||||
{
|
||||
FILE *f = fopen(mark_file, "w");
|
||||
if (f) {
|
||||
dump_marks_helper(f, 0, marks);
|
||||
fclose(f);
|
||||
} else
|
||||
failure |= error("Unable to write marks file %s: %s",
|
||||
mark_file, strerror(errno));
|
||||
static struct lock_file mark_lock;
|
||||
int mark_fd;
|
||||
FILE *f;
|
||||
|
||||
if (!mark_file)
|
||||
return;
|
||||
|
||||
mark_fd = hold_lock_file_for_update(&mark_lock, mark_file, 0);
|
||||
if (mark_fd < 0) {
|
||||
failure |= error("Unable to write marks file %s: %s",
|
||||
mark_file, strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
f = fdopen(mark_fd, "w");
|
||||
if (!f) {
|
||||
rollback_lock_file(&mark_lock);
|
||||
failure |= error("Unable to write marks file %s: %s",
|
||||
mark_file, strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
dump_marks_helper(f, 0, marks);
|
||||
fclose(f);
|
||||
if (commit_lock_file(&mark_lock))
|
||||
failure |= error("Unable to write marks file %s: %s",
|
||||
mark_file, strerror(errno));
|
||||
}
|
||||
|
||||
static void read_next_command(void)
|
||||
@@ -1529,7 +1544,7 @@ static void unload_one_branch(void)
|
||||
{
|
||||
while (cur_active_branches
|
||||
&& cur_active_branches >= max_active_branches) {
|
||||
unsigned long min_commit = ULONG_MAX;
|
||||
uintmax_t min_commit = ULONG_MAX;
|
||||
struct branch *e, *l = NULL, *p = NULL;
|
||||
|
||||
for (e = active_branches; e; e = e->active_next_branch) {
|
||||
@@ -1547,6 +1562,7 @@ static void unload_one_branch(void)
|
||||
e = active_branches;
|
||||
active_branches = e->active_next_branch;
|
||||
}
|
||||
e->active = 0;
|
||||
e->active_next_branch = NULL;
|
||||
if (e->branch_tree.tree) {
|
||||
release_tree_content_recursive(e->branch_tree.tree);
|
||||
@@ -1559,10 +1575,13 @@ static void unload_one_branch(void)
|
||||
static void load_branch(struct branch *b)
|
||||
{
|
||||
load_tree(&b->branch_tree);
|
||||
b->active_next_branch = active_branches;
|
||||
active_branches = b;
|
||||
cur_active_branches++;
|
||||
branch_load_count++;
|
||||
if (!b->active) {
|
||||
b->active = 1;
|
||||
b->active_next_branch = active_branches;
|
||||
active_branches = b;
|
||||
cur_active_branches++;
|
||||
branch_load_count++;
|
||||
}
|
||||
}
|
||||
|
||||
static void file_change_m(struct branch *b)
|
||||
@@ -1746,7 +1765,14 @@ static struct hash_list *cmd_merge(unsigned int *count)
|
||||
if (oe->type != OBJ_COMMIT)
|
||||
die("Mark :%" PRIuMAX " not a commit", idnum);
|
||||
hashcpy(n->sha1, oe->sha1);
|
||||
} else if (get_sha1(from, n->sha1))
|
||||
} else if (!get_sha1(from, n->sha1)) {
|
||||
unsigned long size;
|
||||
char *buf = read_object_with_reference(n->sha1,
|
||||
commit_type, &size, n->sha1);
|
||||
if (!buf || size < 46)
|
||||
die("Not a valid commit: %s", from);
|
||||
free(buf);
|
||||
} else
|
||||
die("Invalid ref name or SHA1 expression: %s", from);
|
||||
|
||||
n->next = NULL;
|
||||
@@ -1967,6 +1993,40 @@ static void cmd_checkpoint(void)
|
||||
read_next_command();
|
||||
}
|
||||
|
||||
static void import_marks(const char *input_file)
|
||||
{
|
||||
char line[512];
|
||||
FILE *f = fopen(input_file, "r");
|
||||
if (!f)
|
||||
die("cannot read %s: %s", input_file, strerror(errno));
|
||||
while (fgets(line, sizeof(line), f)) {
|
||||
uintmax_t mark;
|
||||
char *end;
|
||||
unsigned char sha1[20];
|
||||
struct object_entry *e;
|
||||
|
||||
end = strchr(line, '\n');
|
||||
if (line[0] != ':' || !end)
|
||||
die("corrupt mark line: %s", line);
|
||||
*end = 0;
|
||||
mark = strtoumax(line + 1, &end, 10);
|
||||
if (!mark || end == line + 1
|
||||
|| *end != ' ' || get_sha1(end + 1, sha1))
|
||||
die("corrupt mark line: %s", line);
|
||||
e = find_object(sha1);
|
||||
if (!e) {
|
||||
enum object_type type = sha1_object_info(sha1, NULL);
|
||||
if (type < 0)
|
||||
die("object not found: %s", sha1_to_hex(sha1));
|
||||
e = insert_object(sha1);
|
||||
e->type = type;
|
||||
e->pack_id = MAX_PACK_ID;
|
||||
}
|
||||
insert_mark(mark, e);
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
static const char fast_import_usage[] =
|
||||
"git-fast-import [--date-format=f] [--max-pack-size=n] [--depth=n] [--active-branches=n] [--export-marks=marks.file]";
|
||||
|
||||
@@ -1975,6 +2035,12 @@ int main(int argc, const char **argv)
|
||||
int i, show_stats = 1;
|
||||
|
||||
git_config(git_default_config);
|
||||
alloc_objects(object_entry_alloc);
|
||||
strbuf_init(&command_buf);
|
||||
atom_table = xcalloc(atom_table_sz, sizeof(struct atom_str*));
|
||||
branch_table = xcalloc(branch_table_sz, sizeof(struct branch*));
|
||||
avail_tree_table = xcalloc(avail_tree_table_sz, sizeof(struct avail_tree_content*));
|
||||
marks = pool_calloc(1, sizeof(struct mark_set));
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
const char *a = argv[i];
|
||||
@@ -1998,6 +2064,8 @@ int main(int argc, const char **argv)
|
||||
max_depth = strtoul(a + 8, NULL, 0);
|
||||
else if (!prefixcmp(a, "--active-branches="))
|
||||
max_active_branches = strtoul(a + 18, NULL, 0);
|
||||
else if (!prefixcmp(a, "--import-marks="))
|
||||
import_marks(a + 15);
|
||||
else if (!prefixcmp(a, "--export-marks="))
|
||||
mark_file = a + 15;
|
||||
else if (!prefixcmp(a, "--export-pack-edges=")) {
|
||||
@@ -2018,14 +2086,6 @@ int main(int argc, const char **argv)
|
||||
if (i != argc)
|
||||
usage(fast_import_usage);
|
||||
|
||||
alloc_objects(object_entry_alloc);
|
||||
strbuf_init(&command_buf);
|
||||
|
||||
atom_table = xcalloc(atom_table_sz, sizeof(struct atom_str*));
|
||||
branch_table = xcalloc(branch_table_sz, sizeof(struct branch*));
|
||||
avail_tree_table = xcalloc(avail_tree_table_sz, sizeof(struct avail_tree_content*));
|
||||
marks = pool_calloc(1, sizeof(struct mark_set));
|
||||
|
||||
start_packfile();
|
||||
for (;;) {
|
||||
read_next_command();
|
||||
|
||||
@@ -89,7 +89,11 @@ usage if $opt_h;
|
||||
# values associated with keys:
|
||||
# =1 - Arch version / git 'branch' detected via abrowse on a limit
|
||||
# >1 - Arch version / git 'branch' of an auxiliary branch we've merged
|
||||
my %arch_branches = map { $_ => 1 } @ARGV;
|
||||
my %arch_branches = map { my $branch = $_; $branch =~ s/:[^:]*$//; $branch => 1 } @ARGV;
|
||||
|
||||
# $branch_name_map:
|
||||
# maps arch branches to git branch names
|
||||
my %branch_name_map = map { m/^(.*):([^:]*)$/; $1 => $2 } grep { m/:/ } @ARGV;
|
||||
|
||||
$ENV{'TMPDIR'} = $opt_t if $opt_t; # $ENV{TMPDIR} will affect tempdir() calls:
|
||||
my $tmp = tempdir('git-archimport-XXXXXX', TMPDIR => 1, CLEANUP => 1);
|
||||
@@ -104,6 +108,7 @@ unless (-d $git_dir) { # initial import needs empty directory
|
||||
closedir DIR
|
||||
}
|
||||
|
||||
my $default_archive; # default Arch archive
|
||||
my %reachable = (); # Arch repositories we can access
|
||||
my %unreachable = (); # Arch repositories we can't access :<
|
||||
my @psets = (); # the collection
|
||||
@@ -303,7 +308,34 @@ sub old_style_branchname {
|
||||
return $ret;
|
||||
}
|
||||
|
||||
*git_branchname = $opt_o ? *old_style_branchname : *tree_dirname;
|
||||
*git_default_branchname = $opt_o ? *old_style_branchname : *tree_dirname;
|
||||
|
||||
# retrieve default archive, since $branch_name_map keys might not include it
|
||||
sub get_default_archive {
|
||||
if (!defined $default_archive) {
|
||||
$default_archive = safe_pipe_capture($TLA,'my-default-archive');
|
||||
chomp $default_archive;
|
||||
}
|
||||
return $default_archive;
|
||||
}
|
||||
|
||||
sub git_branchname {
|
||||
my $revision = shift;
|
||||
my $name = extract_versionname($revision);
|
||||
|
||||
if (exists $branch_name_map{$name}) {
|
||||
return $branch_name_map{$name};
|
||||
|
||||
} elsif ($name =~ m#^([^/]*)/(.*)$#
|
||||
&& $1 eq get_default_archive()
|
||||
&& exists $branch_name_map{$2}) {
|
||||
# the names given in the command-line lacked the archive.
|
||||
return $branch_name_map{$2};
|
||||
|
||||
} else {
|
||||
return git_default_branchname($revision);
|
||||
}
|
||||
}
|
||||
|
||||
sub process_patchset_accurate {
|
||||
my $ps = shift;
|
||||
@@ -333,19 +365,23 @@ sub process_patchset_accurate {
|
||||
if ($ps->{tag} && (my $branchpoint = eval { ptag($ps->{tag}) })) {
|
||||
|
||||
# find where we are supposed to branch from
|
||||
system('git-checkout','-f','-b',$ps->{branch},
|
||||
$branchpoint) == 0 or die "$! $?\n";
|
||||
|
||||
if (! -e "$git_dir/refs/heads/$ps->{branch}") {
|
||||
system('git-branch',$ps->{branch},$branchpoint) == 0 or die "$! $?\n";
|
||||
|
||||
# We trust Arch with the fact that this is just a tag,
|
||||
# and it does not affect the state of the tree, so
|
||||
# we just tag and move on. If the user really wants us
|
||||
# to consolidate more branches into one, don't tag because
|
||||
# the tag name would be already taken.
|
||||
tag($ps->{id}, $branchpoint);
|
||||
ptag($ps->{id}, $branchpoint);
|
||||
print " * Tagged $ps->{id} at $branchpoint\n";
|
||||
}
|
||||
system('git-checkout','-f',$ps->{branch}) == 0 or die "$! $?\n";
|
||||
|
||||
# remove any old stuff that got leftover:
|
||||
my $rm = safe_pipe_capture('git-ls-files','--others','-z');
|
||||
rmtree(split(/\0/,$rm)) if $rm;
|
||||
|
||||
# If we trust Arch with the fact that this is just
|
||||
# a tag, and it does not affect the state of the tree
|
||||
# then we just tag and move on
|
||||
tag($ps->{id}, $branchpoint);
|
||||
ptag($ps->{id}, $branchpoint);
|
||||
print " * Tagged $ps->{id} at $branchpoint\n";
|
||||
return 0;
|
||||
} else {
|
||||
warn "Tagging from unknown id unsupported\n" if $ps->{tag};
|
||||
@@ -385,14 +421,19 @@ sub process_patchset_fast {
|
||||
unless $branchpoint;
|
||||
|
||||
# find where we are supposed to branch from
|
||||
system('git-checkout','-b',$ps->{branch},$branchpoint);
|
||||
if (! -e "$git_dir/refs/heads/$ps->{branch}") {
|
||||
system('git-branch',$ps->{branch},$branchpoint) == 0 or die "$! $?\n";
|
||||
|
||||
# If we trust Arch with the fact that this is just
|
||||
# a tag, and it does not affect the state of the tree
|
||||
# then we just tag and move on
|
||||
tag($ps->{id}, $branchpoint);
|
||||
ptag($ps->{id}, $branchpoint);
|
||||
print " * Tagged $ps->{id} at $branchpoint\n";
|
||||
# We trust Arch with the fact that this is just a tag,
|
||||
# and it does not affect the state of the tree, so
|
||||
# we just tag and move on. If the user really wants us
|
||||
# to consolidate more branches into one, don't tag because
|
||||
# the tag name would be already taken.
|
||||
tag($ps->{id}, $branchpoint);
|
||||
ptag($ps->{id}, $branchpoint);
|
||||
print " * Tagged $ps->{id} at $branchpoint\n";
|
||||
}
|
||||
system('git-checkout',$ps->{branch}) == 0 or die "$! $?\n";
|
||||
return 0;
|
||||
}
|
||||
die $! if $?;
|
||||
@@ -830,8 +871,9 @@ sub tag {
|
||||
if ($opt_o) {
|
||||
$tag =~ s|/|--|g;
|
||||
} else {
|
||||
# don't use subdirs for tags yet, it could screw up other porcelains
|
||||
$tag =~ s|/|,|g;
|
||||
my $patchname = $tag;
|
||||
$patchname =~ s/.*--//;
|
||||
$tag = git_branchname ($tag) . '--' . $patchname;
|
||||
}
|
||||
|
||||
if ($commit) {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Copyright (c) 2005 Linus Torvalds
|
||||
# Copyright (c) 2006 Junio C Hamano
|
||||
|
||||
USAGE='[-a] [-s] [-v] [--no-verify] [-m <message> | -F <logfile> | (-C|-c) <commit> | --amend] [-u] [-e] [--author <author>] [[-i | -o] <path>...]'
|
||||
USAGE='[-a | --interactive] [-s] [-v] [--no-verify] [-m <message> | -F <logfile> | (-C|-c) <commit> | --amend] [-u] [-e] [--author <author>] [[-i | -o] <path>...]'
|
||||
SUBDIRECTORY_OK=Yes
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
@@ -71,6 +71,7 @@ trap '
|
||||
|
||||
all=
|
||||
also=
|
||||
interactive=
|
||||
only=
|
||||
logfile=
|
||||
use_commit=
|
||||
@@ -131,6 +132,11 @@ do
|
||||
also=t
|
||||
shift
|
||||
;;
|
||||
--int|--inte|--inter|--intera|--interac|--interact|--interacti|\
|
||||
--interactiv|--interactive)
|
||||
interactive=t
|
||||
shift
|
||||
;;
|
||||
-o|--o|--on|--onl|--only)
|
||||
only=t
|
||||
shift
|
||||
@@ -304,12 +310,14 @@ case "$#,$also,$only,$amend" in
|
||||
;;
|
||||
esac
|
||||
unset only
|
||||
case "$all,$also,$#" in
|
||||
t,t,*)
|
||||
die "Cannot use -a and -i at the same time." ;;
|
||||
case "$all,$interactive,$also,$#" in
|
||||
*t,*t,*)
|
||||
die "Cannot use -a, --interactive or -i at the same time." ;;
|
||||
t,,[1-9]*)
|
||||
die "Paths with -a does not make sense." ;;
|
||||
,t,0)
|
||||
,t,[1-9]*)
|
||||
die "Paths with --interactive does not make sense." ;;
|
||||
,,t,0)
|
||||
die "No paths with -i does not make sense." ;;
|
||||
esac
|
||||
|
||||
@@ -344,6 +352,9 @@ t,)
|
||||
) || exit
|
||||
;;
|
||||
,)
|
||||
if test "$interactive" = t; then
|
||||
git add --interactive || exit
|
||||
fi
|
||||
case "$#" in
|
||||
0)
|
||||
;; # commit as-is
|
||||
@@ -622,6 +633,9 @@ else
|
||||
fi
|
||||
ret="$?"
|
||||
rm -f "$GIT_DIR/COMMIT_MSG" "$GIT_DIR/COMMIT_EDITMSG" "$GIT_DIR/SQUASH_MSG"
|
||||
|
||||
cd_to_toplevel
|
||||
|
||||
if test -d "$GIT_DIR/rr-cache"
|
||||
then
|
||||
git-rerere
|
||||
|
||||
@@ -73,6 +73,10 @@
|
||||
#define PATH_MAX 4096
|
||||
#endif
|
||||
|
||||
#ifndef PRIuMAX
|
||||
#define PRIuMAX "llu"
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define NORETURN __attribute__((__noreturn__))
|
||||
#else
|
||||
@@ -257,6 +261,11 @@ static inline ssize_t xwrite(int fd, const void *buf, size_t len)
|
||||
}
|
||||
}
|
||||
|
||||
static inline size_t xsize_t(off_t len)
|
||||
{
|
||||
return (size_t)len;
|
||||
}
|
||||
|
||||
static inline int has_extension(const char *filename, const char *ext)
|
||||
{
|
||||
size_t len = strlen(filename);
|
||||
|
||||
@@ -957,12 +957,12 @@ sub req_update
|
||||
{
|
||||
$log->info("Merged successfully");
|
||||
print "M M $filename\n";
|
||||
$log->debug("Update-existing $dirpart");
|
||||
$log->debug("Merged $dirpart");
|
||||
|
||||
# Don't want to actually _DO_ the update if -n specified
|
||||
unless ( $state->{globaloptions}{-n} )
|
||||
{
|
||||
print "Update-existing $dirpart\n";
|
||||
print "Merged $dirpart\n";
|
||||
$log->debug($state->{CVSROOT} . "/$state->{module}/$filename");
|
||||
print $state->{CVSROOT} . "/$state->{module}/$filename\n";
|
||||
my $kopts = kopts_from_path($filepart);
|
||||
@@ -978,7 +978,7 @@ sub req_update
|
||||
# Don't want to actually _DO_ the update if -n specified
|
||||
unless ( $state->{globaloptions}{-n} )
|
||||
{
|
||||
print "Update-existing $dirpart\n";
|
||||
print "Merged $dirpart\n";
|
||||
print $state->{CVSROOT} . "/$state->{module}/$filename\n";
|
||||
my $kopts = kopts_from_path($filepart);
|
||||
print "/$filepart/1.$meta->{revision}/+/$kopts/\n";
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
all::
|
||||
|
||||
# Define V=1 to have a more verbose compile.
|
||||
#
|
||||
|
||||
GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
|
||||
@$(SHELL_PATH) ./GIT-VERSION-GEN
|
||||
-include GIT-VERSION-FILE
|
||||
@@ -19,27 +22,32 @@ ifndef INSTALL
|
||||
INSTALL = install
|
||||
endif
|
||||
|
||||
ifndef V
|
||||
QUIET_GEN = @echo ' ' GEN $@;
|
||||
QUIET_BUILT_IN = @echo ' ' BUILTIN $@;
|
||||
endif
|
||||
|
||||
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
|
||||
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
|
||||
SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
|
||||
|
||||
git-gui: git-gui.sh GIT-VERSION-FILE CREDITS-FILE
|
||||
rm -f $@ $@+
|
||||
$(QUIET_GEN)rm -f $@ $@+ && \
|
||||
sed -n \
|
||||
-e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
|
||||
-e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
|
||||
-e '1,/^set gitgui_credits /p' \
|
||||
$@.sh >$@+
|
||||
cat CREDITS-FILE >>$@+
|
||||
sed -e '1,/^set gitgui_credits /d' $@.sh >>$@+
|
||||
chmod +x $@+
|
||||
$@.sh >$@+ && \
|
||||
cat CREDITS-FILE >>$@+ && \
|
||||
sed -e '1,/^set gitgui_credits /d' $@.sh >>$@+ && \
|
||||
chmod +x $@+ && \
|
||||
mv $@+ $@
|
||||
|
||||
CREDITS-FILE: CREDITS-GEN .FORCE-CREDITS-FILE
|
||||
$(SHELL_PATH) ./CREDITS-GEN
|
||||
$(QUIET_GEN)$(SHELL_PATH) ./CREDITS-GEN
|
||||
|
||||
$(GITGUI_BUILT_INS): git-gui
|
||||
rm -f $@ && ln git-gui $@
|
||||
$(QUIET_BUILT_IN)rm -f $@ && ln git-gui $@
|
||||
|
||||
all:: $(ALL_PROGRAMS)
|
||||
|
||||
|
||||
@@ -1267,6 +1267,24 @@ proc commit_committree {fd_wt curHEAD msg} {
|
||||
return
|
||||
}
|
||||
|
||||
# -- Verify this wasn't an empty change.
|
||||
#
|
||||
if {$commit_type eq {normal}} {
|
||||
set old_tree [git rev-parse "$PARENT^{tree}"]
|
||||
if {$tree_id eq $old_tree} {
|
||||
info_popup {No changes to commit.
|
||||
|
||||
No files were modified by this commit and it
|
||||
was not a merge commit.
|
||||
|
||||
A rescan will be automatically started now.
|
||||
}
|
||||
unlock_index
|
||||
rescan {set ui_status_value {No changes to commit.}}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
# -- Build the message.
|
||||
#
|
||||
set msg_p [gitdir COMMIT_EDITMSG]
|
||||
@@ -1281,14 +1299,8 @@ proc commit_committree {fd_wt curHEAD msg} {
|
||||
# -- Create the commit.
|
||||
#
|
||||
set cmd [list git commit-tree $tree_id]
|
||||
set parents [concat $PARENT $MERGE_HEAD]
|
||||
if {[llength $parents] > 0} {
|
||||
foreach p $parents {
|
||||
lappend cmd -p $p
|
||||
}
|
||||
} else {
|
||||
# git commit-tree writes to stderr during initial commit.
|
||||
lappend cmd 2>/dev/null
|
||||
foreach p [concat $PARENT $MERGE_HEAD] {
|
||||
lappend cmd -p $p
|
||||
}
|
||||
lappend cmd <$msg_p
|
||||
if {[catch {set cmt_id [eval exec $cmd]} err]} {
|
||||
@@ -5256,6 +5268,12 @@ if {[is_enabled branch]} {
|
||||
-font font_ui
|
||||
lappend disable_on_lock [list .mbar.branch entryconf \
|
||||
[.mbar.branch index last] -state]
|
||||
|
||||
.mbar.branch add command -label {Reset...} \
|
||||
-command do_reset_hard \
|
||||
-font font_ui
|
||||
lappend disable_on_lock [list .mbar.branch entryconf \
|
||||
[.mbar.branch index last] -state]
|
||||
}
|
||||
|
||||
# -- Commit Menu
|
||||
@@ -5330,6 +5348,34 @@ if {[is_enabled multicommit] || [is_enabled singlecommit]} {
|
||||
[list .mbar.commit entryconf [.mbar.commit index last] -state]
|
||||
}
|
||||
|
||||
# -- Merge Menu
|
||||
#
|
||||
if {[is_enabled branch]} {
|
||||
menu .mbar.merge
|
||||
.mbar.merge add command -label {Local Merge...} \
|
||||
-command do_local_merge \
|
||||
-font font_ui
|
||||
lappend disable_on_lock \
|
||||
[list .mbar.merge entryconf [.mbar.merge index last] -state]
|
||||
.mbar.merge add command -label {Abort Merge...} \
|
||||
-command do_reset_hard \
|
||||
-font font_ui
|
||||
lappend disable_on_lock \
|
||||
[list .mbar.merge entryconf [.mbar.merge index last] -state]
|
||||
|
||||
}
|
||||
|
||||
# -- Transport Menu
|
||||
#
|
||||
if {[is_enabled transport]} {
|
||||
menu .mbar.fetch
|
||||
|
||||
menu .mbar.push
|
||||
.mbar.push add command -label {Push...} \
|
||||
-command do_push_anywhere \
|
||||
-font font_ui
|
||||
}
|
||||
|
||||
if {[is_MacOSX]} {
|
||||
# -- Apple Menu (Mac OS X only)
|
||||
#
|
||||
@@ -5502,28 +5548,6 @@ pack .branch.l1 -side left
|
||||
pack .branch.cb -side left -fill x
|
||||
pack .branch -side top -fill x
|
||||
|
||||
if {[is_enabled branch]} {
|
||||
menu .mbar.merge
|
||||
.mbar.merge add command -label {Local Merge...} \
|
||||
-command do_local_merge \
|
||||
-font font_ui
|
||||
lappend disable_on_lock \
|
||||
[list .mbar.merge entryconf [.mbar.merge index last] -state]
|
||||
.mbar.merge add command -label {Abort Merge...} \
|
||||
-command do_reset_hard \
|
||||
-font font_ui
|
||||
lappend disable_on_lock \
|
||||
[list .mbar.merge entryconf [.mbar.merge index last] -state]
|
||||
|
||||
|
||||
menu .mbar.fetch
|
||||
|
||||
menu .mbar.push
|
||||
.mbar.push add command -label {Push...} \
|
||||
-command do_push_anywhere \
|
||||
-font font_ui
|
||||
}
|
||||
|
||||
# -- Main Window Layout
|
||||
#
|
||||
panedwindow .vpane -orient vertical
|
||||
|
||||
197
git-revert.sh
197
git-revert.sh
@@ -1,197 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2005 Linus Torvalds
|
||||
# Copyright (c) 2005 Junio C Hamano
|
||||
#
|
||||
|
||||
case "$0" in
|
||||
*-revert* )
|
||||
test -t 0 && edit=-e
|
||||
replay=
|
||||
me=revert
|
||||
USAGE='[--edit | --no-edit] [-n] <commit-ish>' ;;
|
||||
*-cherry-pick* )
|
||||
replay=t
|
||||
edit=
|
||||
me=cherry-pick
|
||||
USAGE='[--edit] [-n] [-r] [-x] <commit-ish>' ;;
|
||||
* )
|
||||
echo >&2 "What are you talking about?"
|
||||
exit 1 ;;
|
||||
esac
|
||||
|
||||
SUBDIRECTORY_OK=Yes ;# we will cd up
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
cd_to_toplevel
|
||||
|
||||
no_commit=
|
||||
while case "$#" in 0) break ;; esac
|
||||
do
|
||||
case "$1" in
|
||||
-n|--n|--no|--no-|--no-c|--no-co|--no-com|--no-comm|\
|
||||
--no-commi|--no-commit)
|
||||
no_commit=t
|
||||
;;
|
||||
-e|--e|--ed|--edi|--edit)
|
||||
edit=-e
|
||||
;;
|
||||
--n|--no|--no-|--no-e|--no-ed|--no-edi|--no-edit)
|
||||
edit=
|
||||
;;
|
||||
-r)
|
||||
: no-op ;;
|
||||
-x|--i-really-want-to-expose-my-private-commit-object-name)
|
||||
replay=
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
set_reflog_action "$me"
|
||||
|
||||
test "$me,$replay" = "revert,t" && usage
|
||||
|
||||
case "$no_commit" in
|
||||
t)
|
||||
# We do not intend to commit immediately. We just want to
|
||||
# merge the differences in.
|
||||
head=$(git-write-tree) ||
|
||||
die "Your index file is unmerged."
|
||||
;;
|
||||
*)
|
||||
head=$(git-rev-parse --verify HEAD) ||
|
||||
die "You do not have a valid HEAD"
|
||||
files=$(git-diff-index --cached --name-only $head) || exit
|
||||
if [ "$files" ]; then
|
||||
die "Dirty index: cannot $me (dirty: $files)"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
rev=$(git-rev-parse --verify "$@") &&
|
||||
commit=$(git-rev-parse --verify "$rev^0") ||
|
||||
die "Not a single commit $@"
|
||||
prev=$(git-rev-parse --verify "$commit^1" 2>/dev/null) ||
|
||||
die "Cannot run $me a root commit"
|
||||
git-rev-parse --verify "$commit^2" >/dev/null 2>&1 &&
|
||||
die "Cannot run $me a multi-parent commit."
|
||||
|
||||
encoding=$(git config i18n.commitencoding || echo UTF-8)
|
||||
|
||||
# "commit" is an existing commit. We would want to apply
|
||||
# the difference it introduces since its first parent "prev"
|
||||
# on top of the current HEAD if we are cherry-pick. Or the
|
||||
# reverse of it if we are revert.
|
||||
|
||||
case "$me" in
|
||||
revert)
|
||||
git show -s --pretty=oneline --encoding="$encoding" $commit |
|
||||
sed -e '
|
||||
s/^[^ ]* /Revert "/
|
||||
s/$/"/
|
||||
'
|
||||
echo
|
||||
echo "This reverts commit $commit."
|
||||
test "$rev" = "$commit" ||
|
||||
echo "(original 'git revert' arguments: $@)"
|
||||
base=$commit next=$prev
|
||||
;;
|
||||
|
||||
cherry-pick)
|
||||
pick_author_script='
|
||||
/^author /{
|
||||
s/'\''/'\''\\'\'\''/g
|
||||
h
|
||||
s/^author \([^<]*\) <[^>]*> .*$/\1/
|
||||
s/'\''/'\''\'\'\''/g
|
||||
s/.*/GIT_AUTHOR_NAME='\''&'\''/p
|
||||
|
||||
g
|
||||
s/^author [^<]* <\([^>]*\)> .*$/\1/
|
||||
s/'\''/'\''\'\'\''/g
|
||||
s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p
|
||||
|
||||
g
|
||||
s/^author [^<]* <[^>]*> \(.*\)$/\1/
|
||||
s/'\''/'\''\'\'\''/g
|
||||
s/.*/GIT_AUTHOR_DATE='\''&'\''/p
|
||||
|
||||
q
|
||||
}'
|
||||
|
||||
logmsg=`git show -s --pretty=raw --encoding="$encoding" "$commit"`
|
||||
set_author_env=`echo "$logmsg" |
|
||||
LANG=C LC_ALL=C sed -ne "$pick_author_script"`
|
||||
eval "$set_author_env"
|
||||
export GIT_AUTHOR_NAME
|
||||
export GIT_AUTHOR_EMAIL
|
||||
export GIT_AUTHOR_DATE
|
||||
|
||||
echo "$logmsg" |
|
||||
sed -e '1,/^$/d' -e 's/^ //'
|
||||
case "$replay" in
|
||||
'')
|
||||
echo "(cherry picked from commit $commit)"
|
||||
test "$rev" = "$commit" ||
|
||||
echo "(original 'git cherry-pick' arguments: $@)"
|
||||
;;
|
||||
esac
|
||||
base=$prev next=$commit
|
||||
;;
|
||||
|
||||
esac >.msg
|
||||
|
||||
eval GITHEAD_$head=HEAD
|
||||
eval GITHEAD_$next='`git show -s \
|
||||
--pretty=oneline --encoding="$encoding" "$commit" |
|
||||
sed -e "s/^[^ ]* //"`'
|
||||
export GITHEAD_$head GITHEAD_$next
|
||||
|
||||
# This three way merge is an interesting one. We are at
|
||||
# $head, and would want to apply the change between $commit
|
||||
# and $prev on top of us (when reverting), or the change between
|
||||
# $prev and $commit on top of us (when cherry-picking or replaying).
|
||||
|
||||
git-merge-recursive $base -- $head $next &&
|
||||
result=$(git-write-tree 2>/dev/null) || {
|
||||
mv -f .msg "$GIT_DIR/MERGE_MSG"
|
||||
{
|
||||
echo '
|
||||
Conflicts:
|
||||
'
|
||||
git ls-files --unmerged |
|
||||
sed -e 's/^[^ ]* / /' |
|
||||
uniq
|
||||
} >>"$GIT_DIR/MERGE_MSG"
|
||||
echo >&2 "Automatic $me failed. After resolving the conflicts,"
|
||||
echo >&2 "mark the corrected paths with 'git-add <paths>'"
|
||||
echo >&2 "and commit the result."
|
||||
case "$me" in
|
||||
cherry-pick)
|
||||
echo >&2 "You may choose to use the following when making"
|
||||
echo >&2 "the commit:"
|
||||
echo >&2 "$set_author_env"
|
||||
esac
|
||||
exit 1
|
||||
}
|
||||
echo >&2 "Finished one $me."
|
||||
|
||||
# If we are cherry-pick, and if the merge did not result in
|
||||
# hand-editing, we will hit this commit and inherit the original
|
||||
# author date and name.
|
||||
# If we are revert, or if our cherry-pick results in a hand merge,
|
||||
# we had better say that the current user is responsible for that.
|
||||
|
||||
case "$no_commit" in
|
||||
'')
|
||||
git-commit -n -F .msg $edit
|
||||
rm -f .msg
|
||||
;;
|
||||
esac
|
||||
2
git.c
2
git.c
@@ -238,6 +238,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
||||
{ "checkout-index", cmd_checkout_index, RUN_SETUP },
|
||||
{ "check-ref-format", cmd_check_ref_format },
|
||||
{ "cherry", cmd_cherry, RUN_SETUP },
|
||||
{ "cherry-pick", cmd_cherry_pick, RUN_SETUP | NOT_BARE },
|
||||
{ "commit-tree", cmd_commit_tree, RUN_SETUP },
|
||||
{ "config", cmd_config },
|
||||
{ "count-objects", cmd_count_objects, RUN_SETUP },
|
||||
@@ -276,6 +277,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
||||
{ "rerere", cmd_rerere, RUN_SETUP },
|
||||
{ "rev-list", cmd_rev_list, RUN_SETUP },
|
||||
{ "rev-parse", cmd_rev_parse, RUN_SETUP },
|
||||
{ "revert", cmd_revert, RUN_SETUP | NOT_BARE },
|
||||
{ "rm", cmd_rm, RUN_SETUP | NOT_BARE },
|
||||
{ "runstatus", cmd_runstatus, RUN_SETUP | NOT_BARE },
|
||||
{ "shortlog", cmd_shortlog, RUN_SETUP | USE_PAGER },
|
||||
|
||||
@@ -591,7 +591,7 @@ sub esc_html ($;%) {
|
||||
my %opts = @_;
|
||||
|
||||
$str = to_utf8($str);
|
||||
$str = escapeHTML($str);
|
||||
$str = $cgi->escapeHTML($str);
|
||||
if ($opts{'-nbsp'}) {
|
||||
$str =~ s/ / /g;
|
||||
}
|
||||
@@ -605,7 +605,7 @@ sub esc_path {
|
||||
my %opts = @_;
|
||||
|
||||
$str = to_utf8($str);
|
||||
$str = escapeHTML($str);
|
||||
$str = $cgi->escapeHTML($str);
|
||||
if ($opts{'-nbsp'}) {
|
||||
$str =~ s/ / /g;
|
||||
}
|
||||
@@ -1974,17 +1974,17 @@ sub git_print_page_path {
|
||||
$fullname .= ($fullname ? '/' : '') . $dir;
|
||||
print $cgi->a({-href => href(action=>"tree", file_name=>$fullname,
|
||||
hash_base=>$hb),
|
||||
-title => esc_html($fullname)}, esc_path($dir));
|
||||
-title => $fullname}, esc_path($dir));
|
||||
print " / ";
|
||||
}
|
||||
if (defined $type && $type eq 'blob') {
|
||||
print $cgi->a({-href => href(action=>"blob_plain", file_name=>$file_name,
|
||||
hash_base=>$hb),
|
||||
-title => esc_html($name)}, esc_path($basename));
|
||||
-title => $name}, esc_path($basename));
|
||||
} elsif (defined $type && $type eq 'tree') {
|
||||
print $cgi->a({-href => href(action=>"tree", file_name=>$file_name,
|
||||
hash_base=>$hb),
|
||||
-title => esc_html($name)}, esc_path($basename));
|
||||
-title => $name}, esc_path($basename));
|
||||
print " / ";
|
||||
} else {
|
||||
print esc_path($basename);
|
||||
|
||||
@@ -753,7 +753,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
|
||||
const char *keep_name, const char *keep_msg,
|
||||
unsigned char *sha1)
|
||||
{
|
||||
char *report = "pack";
|
||||
const char *report = "pack";
|
||||
char name[PATH_MAX];
|
||||
int err;
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ int interpolate(char *result, int reslen,
|
||||
const char *src = orig;
|
||||
char *dest = result;
|
||||
int newlen = 0;
|
||||
char *name, *value;
|
||||
const char *name, *value;
|
||||
int namelen, valuelen;
|
||||
int i;
|
||||
char c;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
struct interp {
|
||||
char *name;
|
||||
const char *name;
|
||||
char *value;
|
||||
};
|
||||
|
||||
|
||||
10
log-tree.c
10
log-tree.c
@@ -186,7 +186,7 @@ void show_log(struct rev_info *opt, const char *sep)
|
||||
snprintf(subject_buffer, sizeof(subject_buffer) - 1,
|
||||
"%s"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: multipart/mixed;\n"
|
||||
"Content-Type: multipart/mixed;"
|
||||
" boundary=\"%s%s\"\n"
|
||||
"\n"
|
||||
"This is a multi-part message in MIME "
|
||||
@@ -202,13 +202,15 @@ void show_log(struct rev_info *opt, const char *sep)
|
||||
|
||||
snprintf(buffer, sizeof(buffer) - 1,
|
||||
"--%s%s\n"
|
||||
"Content-Type: text/x-patch;\n"
|
||||
"Content-Type: text/x-patch;"
|
||||
" name=\"%s.diff\"\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Content-Disposition: inline;\n"
|
||||
"Content-Disposition: %s;"
|
||||
" filename=\"%s.diff\"\n\n",
|
||||
mime_boundary_leader, opt->mime_boundary,
|
||||
sha1, sha1);
|
||||
sha1,
|
||||
opt->no_inline ? "attachment" : "inline",
|
||||
sha1);
|
||||
opt->diffopt.stat_sep = buffer;
|
||||
}
|
||||
} else if (opt->commit_format != CMIT_FMT_USERFORMAT) {
|
||||
|
||||
29
pack-check.c
29
pack-check.c
@@ -4,12 +4,13 @@
|
||||
static int verify_packfile(struct packed_git *p,
|
||||
struct pack_window **w_curs)
|
||||
{
|
||||
unsigned long index_size = p->index_size;
|
||||
off_t index_size = p->index_size;
|
||||
void *index_base = p->index_base;
|
||||
SHA_CTX ctx;
|
||||
unsigned char sha1[20];
|
||||
unsigned long offset = 0, pack_sig = p->pack_size - 20;
|
||||
int nr_objects, err, i;
|
||||
off_t offset = 0, pack_sig = p->pack_size - 20;
|
||||
uint32_t nr_objects, i;
|
||||
int err;
|
||||
|
||||
/* Note that the pack header checks are actually performed by
|
||||
* use_pack when it first opens the pack file. If anything
|
||||
@@ -23,7 +24,7 @@ static int verify_packfile(struct packed_git *p,
|
||||
unsigned char *in = use_pack(p, w_curs, offset, &remaining);
|
||||
offset += remaining;
|
||||
if (offset > pack_sig)
|
||||
remaining -= offset - pack_sig;
|
||||
remaining -= (unsigned int)(offset - pack_sig);
|
||||
SHA1_Update(&ctx, in, remaining);
|
||||
}
|
||||
SHA1_Final(sha1, &ctx);
|
||||
@@ -40,11 +41,12 @@ static int verify_packfile(struct packed_git *p,
|
||||
* we do not do scan-streaming check on the pack file.
|
||||
*/
|
||||
nr_objects = num_packed_objects(p);
|
||||
for (i = err = 0; i < nr_objects; i++) {
|
||||
for (i = 0, err = 0; i < nr_objects; i++) {
|
||||
unsigned char sha1[20];
|
||||
void *data;
|
||||
enum object_type type;
|
||||
unsigned long size, offset;
|
||||
unsigned long size;
|
||||
off_t offset;
|
||||
|
||||
if (nth_packed_object_sha1(p, i, sha1))
|
||||
die("internal error pack-check nth-packed-object");
|
||||
@@ -74,8 +76,7 @@ static int verify_packfile(struct packed_git *p,
|
||||
|
||||
static void show_pack_info(struct packed_git *p)
|
||||
{
|
||||
int nr_objects, i;
|
||||
unsigned int chain_histogram[MAX_CHAIN];
|
||||
uint32_t nr_objects, i, chain_histogram[MAX_CHAIN];
|
||||
|
||||
nr_objects = num_packed_objects(p);
|
||||
memset(chain_histogram, 0, sizeof(chain_histogram));
|
||||
@@ -85,7 +86,7 @@ static void show_pack_info(struct packed_git *p)
|
||||
const char *type;
|
||||
unsigned long size;
|
||||
unsigned long store_size;
|
||||
unsigned long offset;
|
||||
off_t offset;
|
||||
unsigned int delta_chain_length;
|
||||
|
||||
if (nth_packed_object_sha1(p, i, sha1))
|
||||
@@ -99,9 +100,11 @@ static void show_pack_info(struct packed_git *p)
|
||||
base_sha1);
|
||||
printf("%s ", sha1_to_hex(sha1));
|
||||
if (!delta_chain_length)
|
||||
printf("%-6s %lu %lu\n", type, size, offset);
|
||||
printf("%-6s %lu %"PRIuMAX"\n",
|
||||
type, size, (uintmax_t)offset);
|
||||
else {
|
||||
printf("%-6s %lu %lu %u %s\n", type, size, offset,
|
||||
printf("%-6s %lu %"PRIuMAX" %u %s\n",
|
||||
type, size, (uintmax_t)offset,
|
||||
delta_chain_length, sha1_to_hex(base_sha1));
|
||||
if (delta_chain_length < MAX_CHAIN)
|
||||
chain_histogram[delta_chain_length]++;
|
||||
@@ -123,7 +126,7 @@ static void show_pack_info(struct packed_git *p)
|
||||
|
||||
int verify_pack(struct packed_git *p, int verbose)
|
||||
{
|
||||
unsigned long index_size = p->index_size;
|
||||
off_t index_size = p->index_size;
|
||||
void *index_base = p->index_base;
|
||||
SHA_CTX ctx;
|
||||
unsigned char sha1[20];
|
||||
@@ -132,7 +135,7 @@ int verify_pack(struct packed_git *p, int verbose)
|
||||
ret = 0;
|
||||
/* Verify SHA1 sum of the index file */
|
||||
SHA1_Init(&ctx);
|
||||
SHA1_Update(&ctx, index_base, index_size - 20);
|
||||
SHA1_Update(&ctx, index_base, (unsigned int)(index_size - 20));
|
||||
SHA1_Final(sha1, &ctx);
|
||||
if (hashcmp(sha1, (unsigned char *)index_base + index_size - 20))
|
||||
ret = error("Packfile index for %s SHA1 mismatch",
|
||||
|
||||
@@ -396,9 +396,9 @@ static size_t get_pack_redundancy(struct pack_list *pl)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline size_t pack_set_bytecount(struct pack_list *pl)
|
||||
static inline off_t pack_set_bytecount(struct pack_list *pl)
|
||||
{
|
||||
size_t ret = 0;
|
||||
off_t ret = 0;
|
||||
while (pl) {
|
||||
ret += pl->pack->pack_size;
|
||||
ret += pl->pack->index_size;
|
||||
@@ -413,7 +413,7 @@ static void minimize(struct pack_list **min)
|
||||
*non_unique = NULL, *min_perm = NULL;
|
||||
struct pll *perm, *perm_all, *perm_ok = NULL, *new_perm;
|
||||
struct llist *missing;
|
||||
size_t min_perm_size = (size_t)-1, perm_size;
|
||||
off_t min_perm_size = 0, perm_size;
|
||||
int n;
|
||||
|
||||
pl = local_packs;
|
||||
@@ -461,7 +461,7 @@ static void minimize(struct pack_list **min)
|
||||
perm = perm_ok;
|
||||
while (perm) {
|
||||
perm_size = pack_set_bytecount(perm->pl);
|
||||
if (min_perm_size > perm_size) {
|
||||
if (!min_perm_size || min_perm_size > perm_size) {
|
||||
min_perm_size = perm_size;
|
||||
min_perm = perm->pl;
|
||||
}
|
||||
|
||||
2
path.c
2
path.c
@@ -263,7 +263,7 @@ char *enter_repo(char *path, int strict)
|
||||
|
||||
if (access("objects", X_OK) == 0 && access("refs", X_OK) == 0 &&
|
||||
validate_headref("HEAD") == 0) {
|
||||
putenv("GIT_DIR=.");
|
||||
setenv("GIT_DIR", ".", 1);
|
||||
check_repository_format();
|
||||
return path;
|
||||
}
|
||||
|
||||
@@ -6,11 +6,15 @@ makfile:=perl.mak
|
||||
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
|
||||
prefix_SQ = $(subst ','\'',$(prefix))
|
||||
|
||||
ifndef V
|
||||
QUIET = @
|
||||
endif
|
||||
|
||||
all install instlibdir: $(makfile)
|
||||
$(MAKE) -f $(makfile) $@
|
||||
$(QUIET)$(MAKE) -f $(makfile) $@
|
||||
|
||||
clean:
|
||||
test -f $(makfile) && $(MAKE) -f $(makfile) $@ || exit 0
|
||||
$(QUIET)test -f $(makfile) && $(MAKE) -f $(makfile) $@ || exit 0
|
||||
$(RM) ppport.h
|
||||
$(RM) $(makfile)
|
||||
$(RM) $(makfile).old
|
||||
@@ -33,7 +37,7 @@ $(makfile): ../GIT-CFLAGS Makefile
|
||||
echo ' echo $(instdir_SQ)' >> $@
|
||||
else
|
||||
$(makfile): Makefile.PL ../GIT-CFLAGS
|
||||
'$(PERL_PATH_SQ)' $< PREFIX='$(prefix_SQ)'
|
||||
$(QUIET_GEN)'$(PERL_PATH_SQ)' $< PREFIX='$(prefix_SQ)'
|
||||
endif
|
||||
|
||||
# this is just added comfort for calling make directly in perl dir
|
||||
|
||||
@@ -66,7 +66,7 @@ static int ce_compare_data(struct cache_entry *ce, struct stat *st)
|
||||
return match;
|
||||
}
|
||||
|
||||
static int ce_compare_link(struct cache_entry *ce, unsigned long expected_size)
|
||||
static int ce_compare_link(struct cache_entry *ce, size_t expected_size)
|
||||
{
|
||||
int match = -1;
|
||||
char *target;
|
||||
@@ -101,7 +101,7 @@ static int ce_modified_check_fs(struct cache_entry *ce, struct stat *st)
|
||||
return DATA_CHANGED;
|
||||
break;
|
||||
case S_IFLNK:
|
||||
if (ce_compare_link(ce, st->st_size))
|
||||
if (ce_compare_link(ce, xsize_t(st->st_size)))
|
||||
return DATA_CHANGED;
|
||||
break;
|
||||
default:
|
||||
@@ -797,7 +797,7 @@ int read_cache_from(const char *path)
|
||||
}
|
||||
|
||||
if (!fstat(fd, &st)) {
|
||||
cache_mmap_size = st.st_size;
|
||||
cache_mmap_size = xsize_t(st.st_size);
|
||||
errno = EINVAL;
|
||||
if (cache_mmap_size >= sizeof(struct cache_header) + 20)
|
||||
cache_mmap = xmmap(NULL, cache_mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
|
||||
|
||||
144
receive-pack.c
144
receive-pack.c
@@ -67,18 +67,47 @@ struct command {
|
||||
|
||||
static struct command *commands;
|
||||
|
||||
static char update_hook[] = "hooks/update";
|
||||
static const char update_hook[] = "hooks/update";
|
||||
static const char pre_receive_hook[] = "hooks/pre-receive";
|
||||
static const char post_receive_hook[] = "hooks/post-receive";
|
||||
|
||||
static int run_update_hook(const char *refname,
|
||||
char *old_hex, char *new_hex)
|
||||
static int run_hook(const char *hook_name,
|
||||
struct command *first_cmd,
|
||||
int single)
|
||||
{
|
||||
int code;
|
||||
struct command *cmd;
|
||||
int argc, code;
|
||||
const char **argv;
|
||||
|
||||
if (access(update_hook, X_OK) < 0)
|
||||
for (argc = 0, cmd = first_cmd; cmd; cmd = cmd->next) {
|
||||
if (!cmd->error_string)
|
||||
argc += 3;
|
||||
if (single)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!argc || access(hook_name, X_OK) < 0)
|
||||
return 0;
|
||||
code = run_command_opt(RUN_COMMAND_NO_STDIN
|
||||
| RUN_COMMAND_STDOUT_TO_STDERR,
|
||||
update_hook, refname, old_hex, new_hex, NULL);
|
||||
|
||||
argv = xmalloc(sizeof(*argv) * (2 + argc));
|
||||
argv[0] = hook_name;
|
||||
for (argc = 1, cmd = first_cmd; cmd; cmd = cmd->next) {
|
||||
if (!cmd->error_string) {
|
||||
argv[argc++] = xstrdup(cmd->ref_name);
|
||||
argv[argc++] = xstrdup(sha1_to_hex(cmd->old_sha1));
|
||||
argv[argc++] = xstrdup(sha1_to_hex(cmd->new_sha1));
|
||||
}
|
||||
if (single)
|
||||
break;
|
||||
}
|
||||
argv[argc] = NULL;
|
||||
|
||||
code = run_command_v_opt(argv,
|
||||
RUN_COMMAND_NO_STDIN | RUN_COMMAND_STDOUT_TO_STDERR);
|
||||
while (--argc > 0)
|
||||
free((char*)argv[argc]);
|
||||
free(argv);
|
||||
|
||||
switch (code) {
|
||||
case 0:
|
||||
return 0;
|
||||
@@ -91,37 +120,31 @@ static int run_update_hook(const char *refname,
|
||||
case -ERR_RUN_COMMAND_WAITPID_WRONG_PID:
|
||||
return error("waitpid is confused");
|
||||
case -ERR_RUN_COMMAND_WAITPID_SIGNAL:
|
||||
return error("%s died of signal", update_hook);
|
||||
return error("%s died of signal", hook_name);
|
||||
case -ERR_RUN_COMMAND_WAITPID_NOEXIT:
|
||||
return error("%s died strangely", update_hook);
|
||||
return error("%s died strangely", hook_name);
|
||||
default:
|
||||
error("%s exited with error code %d", update_hook, -code);
|
||||
error("%s exited with error code %d", hook_name, -code);
|
||||
return -code;
|
||||
}
|
||||
}
|
||||
|
||||
static int update(struct command *cmd)
|
||||
static const char *update(struct command *cmd)
|
||||
{
|
||||
const char *name = cmd->ref_name;
|
||||
unsigned char *old_sha1 = cmd->old_sha1;
|
||||
unsigned char *new_sha1 = cmd->new_sha1;
|
||||
char new_hex[41], old_hex[41];
|
||||
struct ref_lock *lock;
|
||||
|
||||
cmd->error_string = NULL;
|
||||
if (!prefixcmp(name, "refs/") && check_ref_format(name + 5)) {
|
||||
cmd->error_string = "funny refname";
|
||||
return error("refusing to create funny ref '%s' locally",
|
||||
name);
|
||||
error("refusing to create funny ref '%s' locally", name);
|
||||
return "funny refname";
|
||||
}
|
||||
|
||||
strcpy(new_hex, sha1_to_hex(new_sha1));
|
||||
strcpy(old_hex, sha1_to_hex(old_sha1));
|
||||
|
||||
if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
|
||||
cmd->error_string = "bad pack";
|
||||
return error("unpack should have generated %s, "
|
||||
"but I can't find it!", new_hex);
|
||||
error("unpack should have generated %s, "
|
||||
"but I can't find it!", sha1_to_hex(new_sha1));
|
||||
return "bad pack";
|
||||
}
|
||||
if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
|
||||
!is_null_sha1(old_sha1) &&
|
||||
@@ -136,32 +159,39 @@ static int update(struct command *cmd)
|
||||
if (!hashcmp(old_sha1, ent->item->object.sha1))
|
||||
break;
|
||||
free_commit_list(bases);
|
||||
if (!ent)
|
||||
return error("denying non-fast forward;"
|
||||
" you should pull first");
|
||||
if (!ent) {
|
||||
error("denying non-fast forward %s"
|
||||
" (you should pull first)", name);
|
||||
return "non-fast forward";
|
||||
}
|
||||
}
|
||||
if (run_update_hook(name, old_hex, new_hex)) {
|
||||
cmd->error_string = "hook declined";
|
||||
return error("hook declined to update %s", name);
|
||||
if (run_hook(update_hook, cmd, 1)) {
|
||||
error("hook declined to update %s", name);
|
||||
return "hook declined";
|
||||
}
|
||||
|
||||
if (is_null_sha1(new_sha1)) {
|
||||
if (delete_ref(name, old_sha1)) {
|
||||
cmd->error_string = "failed to delete";
|
||||
return error("failed to delete %s", name);
|
||||
error("failed to delete %s", name);
|
||||
return "failed to delete";
|
||||
}
|
||||
fprintf(stderr, "%s: %s -> deleted\n", name, old_hex);
|
||||
fprintf(stderr, "%s: %s -> deleted\n", name,
|
||||
sha1_to_hex(old_sha1));
|
||||
return NULL; /* good */
|
||||
}
|
||||
else {
|
||||
lock = lock_any_ref_for_update(name, old_sha1);
|
||||
if (!lock) {
|
||||
cmd->error_string = "failed to lock";
|
||||
return error("failed to lock %s", name);
|
||||
error("failed to lock %s", name);
|
||||
return "failed to lock";
|
||||
}
|
||||
write_ref_sha1(lock, new_sha1, "push");
|
||||
fprintf(stderr, "%s: %s -> %s\n", name, old_hex, new_hex);
|
||||
if (write_ref_sha1(lock, new_sha1, "push")) {
|
||||
return "failed to write"; /* error() already called */
|
||||
}
|
||||
fprintf(stderr, "%s: %s -> %s\n", name,
|
||||
sha1_to_hex(old_sha1), sha1_to_hex(new_sha1));
|
||||
return NULL; /* good */
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char update_post_hook[] = "hooks/post-update";
|
||||
@@ -172,14 +202,14 @@ static void run_update_post_hook(struct command *cmd)
|
||||
int argc;
|
||||
const char **argv;
|
||||
|
||||
if (access(update_post_hook, X_OK) < 0)
|
||||
return;
|
||||
for (argc = 1, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
|
||||
for (argc = 0, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
|
||||
if (cmd_p->error_string)
|
||||
continue;
|
||||
argc++;
|
||||
}
|
||||
argv = xmalloc(sizeof(*argv) * (1 + argc));
|
||||
if (!argc || access(update_post_hook, X_OK) < 0)
|
||||
return;
|
||||
argv = xmalloc(sizeof(*argv) * (2 + argc));
|
||||
argv[0] = update_post_hook;
|
||||
|
||||
for (argc = 1, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
|
||||
@@ -196,19 +226,30 @@ static void run_update_post_hook(struct command *cmd)
|
||||
| RUN_COMMAND_STDOUT_TO_STDERR);
|
||||
}
|
||||
|
||||
/*
|
||||
* This gets called after(if) we've successfully
|
||||
* unpacked the data payload.
|
||||
*/
|
||||
static void execute_commands(void)
|
||||
static void execute_commands(const char *unpacker_error)
|
||||
{
|
||||
struct command *cmd = commands;
|
||||
|
||||
if (unpacker_error) {
|
||||
while (cmd) {
|
||||
cmd->error_string = "n/a (unpacker error)";
|
||||
cmd = cmd->next;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (run_hook(pre_receive_hook, commands, 0)) {
|
||||
while (cmd) {
|
||||
cmd->error_string = "pre-receive hook declined";
|
||||
cmd = cmd->next;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
while (cmd) {
|
||||
update(cmd);
|
||||
cmd->error_string = update(cmd);
|
||||
cmd = cmd->next;
|
||||
}
|
||||
run_update_post_hook(commands);
|
||||
}
|
||||
|
||||
static void read_head_info(void)
|
||||
@@ -244,7 +285,7 @@ static void read_head_info(void)
|
||||
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->error_string = NULL;
|
||||
cmd->next = NULL;
|
||||
*p = cmd;
|
||||
p = &cmd->next;
|
||||
@@ -439,12 +480,13 @@ int main(int argc, char **argv)
|
||||
|
||||
if (!delete_only(commands))
|
||||
unpack_status = unpack();
|
||||
if (!unpack_status)
|
||||
execute_commands();
|
||||
execute_commands(unpack_status);
|
||||
if (pack_lockfile)
|
||||
unlink(pack_lockfile);
|
||||
if (report_status)
|
||||
report(unpack_status);
|
||||
run_hook(post_receive_hook, commands, 0);
|
||||
run_update_post_hook(commands);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
10
refs.c
10
refs.c
@@ -939,6 +939,8 @@ static int log_ref_write(const char *ref_name, const unsigned char *old_sha1,
|
||||
log_file, strerror(errno));
|
||||
}
|
||||
|
||||
adjust_shared_perm(log_file);
|
||||
|
||||
msglen = 0;
|
||||
if (msg) {
|
||||
/* clean up the message and make sure it is a single line */
|
||||
@@ -1094,6 +1096,7 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *
|
||||
unsigned long date;
|
||||
unsigned char logged_sha1[20];
|
||||
void *log_mapped;
|
||||
size_t mapsz;
|
||||
|
||||
logfile = git_path("logs/%s", ref);
|
||||
logfd = open(logfile, O_RDONLY, 0);
|
||||
@@ -1102,7 +1105,8 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *
|
||||
fstat(logfd, &st);
|
||||
if (!st.st_size)
|
||||
die("Log %s is empty.", logfile);
|
||||
log_mapped = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, logfd, 0);
|
||||
mapsz = xsize_t(st.st_size);
|
||||
log_mapped = xmmap(NULL, mapsz, PROT_READ, MAP_PRIVATE, logfd, 0);
|
||||
logdata = log_mapped;
|
||||
close(logfd);
|
||||
|
||||
@@ -1155,7 +1159,7 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *
|
||||
logfile, show_rfc2822_date(date, tz));
|
||||
}
|
||||
}
|
||||
munmap(log_mapped, st.st_size);
|
||||
munmap(log_mapped, mapsz);
|
||||
return 0;
|
||||
}
|
||||
lastrec = rec;
|
||||
@@ -1174,7 +1178,7 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *
|
||||
die("Log %s is corrupt.", logfile);
|
||||
if (msg)
|
||||
*msg = ref_msg(logdata, logend);
|
||||
munmap(log_mapped, st.st_size);
|
||||
munmap(log_mapped, mapsz);
|
||||
|
||||
if (cutoff_time)
|
||||
*cutoff_time = date;
|
||||
|
||||
@@ -74,6 +74,7 @@ struct rev_info {
|
||||
const char *add_signoff;
|
||||
const char *extra_headers;
|
||||
const char *log_reencode;
|
||||
int no_inline;
|
||||
|
||||
/* Filter by commit log message */
|
||||
struct grep_opt *grep_filter;
|
||||
|
||||
@@ -49,48 +49,3 @@ int run_command_v_opt(const char **argv, int flags)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int run_command_v(const char **argv)
|
||||
{
|
||||
return run_command_v_opt(argv, 0);
|
||||
}
|
||||
|
||||
static int run_command_va_opt(int opt, const char *cmd, va_list param)
|
||||
{
|
||||
int argc;
|
||||
const char *argv[MAX_RUN_COMMAND_ARGS];
|
||||
const char *arg;
|
||||
|
||||
argv[0] = (char*) cmd;
|
||||
argc = 1;
|
||||
while (argc < MAX_RUN_COMMAND_ARGS) {
|
||||
arg = argv[argc++] = va_arg(param, char *);
|
||||
if (!arg)
|
||||
break;
|
||||
}
|
||||
if (MAX_RUN_COMMAND_ARGS <= argc)
|
||||
return error("too many args to run %s", cmd);
|
||||
return run_command_v_opt(argv, opt);
|
||||
}
|
||||
|
||||
int run_command_opt(int opt, const char *cmd, ...)
|
||||
{
|
||||
va_list params;
|
||||
int r;
|
||||
|
||||
va_start(params, cmd);
|
||||
r = run_command_va_opt(opt, cmd, params);
|
||||
va_end(params);
|
||||
return r;
|
||||
}
|
||||
|
||||
int run_command(const char *cmd, ...)
|
||||
{
|
||||
va_list params;
|
||||
int r;
|
||||
|
||||
va_start(params, cmd);
|
||||
r = run_command_va_opt(0, cmd, params);
|
||||
va_end(params);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#ifndef RUN_COMMAND_H
|
||||
#define RUN_COMMAND_H
|
||||
|
||||
#define MAX_RUN_COMMAND_ARGS 256
|
||||
enum {
|
||||
ERR_RUN_COMMAND_FORK = 10000,
|
||||
ERR_RUN_COMMAND_EXEC,
|
||||
@@ -15,8 +14,5 @@ enum {
|
||||
#define RUN_GIT_CMD 2 /*If this is to be git sub-command */
|
||||
#define RUN_COMMAND_STDOUT_TO_STDERR 4
|
||||
int run_command_v_opt(const char **argv, int opt);
|
||||
int run_command_v(const char **argv);
|
||||
int run_command_opt(int opt, const char *cmd, ...);
|
||||
int run_command(const char *cmd, ...);
|
||||
|
||||
#endif
|
||||
|
||||
4
setup.c
4
setup.c
@@ -218,12 +218,12 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
||||
}
|
||||
|
||||
#ifdef __MINGW32__
|
||||
if (!getcwd(cwd, sizeof(cwd)) || !(cwd[0] == '/' || cwd[1] == ':'))
|
||||
if (!getcwd(cwd, sizeof(cwd)-1) || !(cwd[0] == '/' || cwd[1] == ':'))
|
||||
die("Unable to read current working directory");
|
||||
if (cwd[1] == ':')
|
||||
minoffset = 2;
|
||||
#else
|
||||
if (!getcwd(cwd, sizeof(cwd)) || cwd[0] != '/')
|
||||
if (!getcwd(cwd, sizeof(cwd)-1) || cwd[0] != '/')
|
||||
die("Unable to read current working directory");
|
||||
#endif
|
||||
|
||||
|
||||
160
sha1_file.c
160
sha1_file.c
@@ -357,6 +357,7 @@ static void link_alt_odb_entries(const char *alt, const char *ep, int sep,
|
||||
static void read_info_alternates(const char * relative_base, int depth)
|
||||
{
|
||||
char *map;
|
||||
size_t mapsz;
|
||||
struct stat st;
|
||||
char path[PATH_MAX];
|
||||
int fd;
|
||||
@@ -369,12 +370,13 @@ static void read_info_alternates(const char * relative_base, int depth)
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
map = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
mapsz = xsize_t(st.st_size);
|
||||
map = xmmap(NULL, mapsz, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
close(fd);
|
||||
|
||||
link_alt_odb_entries(map, map + st.st_size, '\n', relative_base, depth);
|
||||
link_alt_odb_entries(map, map + mapsz, '\n', relative_base, depth);
|
||||
|
||||
munmap(map, st.st_size);
|
||||
munmap(map, mapsz);
|
||||
}
|
||||
|
||||
void prepare_alt_odb(void)
|
||||
@@ -438,13 +440,14 @@ void pack_report()
|
||||
pack_mapped, peak_pack_mapped);
|
||||
}
|
||||
|
||||
static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
|
||||
void **idx_map_)
|
||||
static int check_packed_git_idx(const char *path,
|
||||
unsigned long *idx_size_,
|
||||
void **idx_map_)
|
||||
{
|
||||
void *idx_map;
|
||||
uint32_t *index;
|
||||
unsigned long idx_size;
|
||||
int nr, i;
|
||||
size_t idx_size;
|
||||
uint32_t nr, i;
|
||||
int fd = open(path, O_RDONLY);
|
||||
struct stat st;
|
||||
if (fd < 0)
|
||||
@@ -453,7 +456,11 @@ static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
idx_size = st.st_size;
|
||||
idx_size = xsize_t(st.st_size);
|
||||
if (idx_size < 4 * 256 + 20 + 20) {
|
||||
close(fd);
|
||||
return error("index file %s is too small", path);
|
||||
}
|
||||
idx_map = xmmap(NULL, idx_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
close(fd);
|
||||
|
||||
@@ -461,25 +468,25 @@ static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
|
||||
*idx_map_ = idx_map;
|
||||
*idx_size_ = idx_size;
|
||||
|
||||
/* check index map */
|
||||
if (idx_size < 4*256 + 20 + 20)
|
||||
return error("index file %s is too small", path);
|
||||
|
||||
/* a future index format would start with this, as older git
|
||||
* binaries would fail the non-monotonic index check below.
|
||||
* give a nicer warning to the user if we can.
|
||||
*/
|
||||
if (index[0] == htonl(PACK_IDX_SIGNATURE))
|
||||
if (index[0] == htonl(PACK_IDX_SIGNATURE)) {
|
||||
munmap(idx_map, idx_size);
|
||||
return error("index file %s is a newer version"
|
||||
" and is not supported by this binary"
|
||||
" (try upgrading GIT to a newer version)",
|
||||
path);
|
||||
}
|
||||
|
||||
nr = 0;
|
||||
for (i = 0; i < 256; i++) {
|
||||
unsigned int n = ntohl(index[i]);
|
||||
if (n < nr)
|
||||
uint32_t n = ntohl(index[i]);
|
||||
if (n < nr) {
|
||||
munmap(idx_map, idx_size);
|
||||
return error("non-monotonic index %s", path);
|
||||
}
|
||||
nr = n;
|
||||
}
|
||||
|
||||
@@ -490,8 +497,10 @@ static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
|
||||
* - 20-byte SHA1 of the packfile
|
||||
* - 20-byte SHA1 file checksum
|
||||
*/
|
||||
if (idx_size != 4*256 + nr * 24 + 20 + 20)
|
||||
if (idx_size != 4*256 + nr * 24 + 20 + 20) {
|
||||
munmap(idx_map, idx_size);
|
||||
return error("wrong index file size in %s", path);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -632,7 +641,7 @@ static int open_packed_git(struct packed_git *p)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int in_window(struct pack_window *win, unsigned long offset)
|
||||
static int in_window(struct pack_window *win, off_t offset)
|
||||
{
|
||||
/* We must promise at least 20 bytes (one hash) after the
|
||||
* offset is available from this window, otherwise the offset
|
||||
@@ -647,7 +656,7 @@ static int in_window(struct pack_window *win, unsigned long offset)
|
||||
|
||||
unsigned char* use_pack(struct packed_git *p,
|
||||
struct pack_window **w_cursor,
|
||||
unsigned long offset,
|
||||
off_t offset,
|
||||
unsigned int *left)
|
||||
{
|
||||
struct pack_window *win = *w_cursor;
|
||||
@@ -672,11 +681,13 @@ unsigned char* use_pack(struct packed_git *p,
|
||||
}
|
||||
if (!win) {
|
||||
size_t window_align = packed_git_window_size / 2;
|
||||
off_t len;
|
||||
win = xcalloc(1, sizeof(*win));
|
||||
win->offset = (offset / window_align) * window_align;
|
||||
win->len = p->pack_size - win->offset;
|
||||
if (win->len > packed_git_window_size)
|
||||
win->len = packed_git_window_size;
|
||||
len = p->pack_size - win->offset;
|
||||
if (len > packed_git_window_size)
|
||||
len = packed_git_window_size;
|
||||
win->len = (size_t)len;
|
||||
pack_mapped += win->len;
|
||||
while (packed_git_limit < pack_mapped
|
||||
&& unuse_one_window(p))
|
||||
@@ -705,7 +716,7 @@ unsigned char* use_pack(struct packed_git *p,
|
||||
}
|
||||
offset -= win->offset;
|
||||
if (left)
|
||||
*left = win->len - offset;
|
||||
*left = win->len - xsize_t(offset);
|
||||
return win->base + offset;
|
||||
}
|
||||
|
||||
@@ -881,9 +892,9 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
|
||||
*/
|
||||
sha1_file_open_flag = 0;
|
||||
}
|
||||
map = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
*size = xsize_t(st.st_size);
|
||||
map = xmmap(NULL, *size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
close(fd);
|
||||
*size = st.st_size;
|
||||
return map;
|
||||
}
|
||||
|
||||
@@ -966,11 +977,12 @@ static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned lon
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size)
|
||||
static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size, const unsigned char *sha1)
|
||||
{
|
||||
int bytes = strlen(buffer) + 1;
|
||||
unsigned char *buf = xmalloc(1+size);
|
||||
unsigned long n;
|
||||
int status = Z_OK;
|
||||
|
||||
n = stream->total_out - bytes;
|
||||
if (n > size)
|
||||
@@ -980,12 +992,22 @@ static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size
|
||||
if (bytes < size) {
|
||||
stream->next_out = buf + bytes;
|
||||
stream->avail_out = size - bytes;
|
||||
while (inflate(stream, Z_FINISH) == Z_OK)
|
||||
/* nothing */;
|
||||
while (status == Z_OK)
|
||||
status = inflate(stream, Z_FINISH);
|
||||
}
|
||||
buf[size] = 0;
|
||||
inflateEnd(stream);
|
||||
return buf;
|
||||
if ((status == Z_OK || status == Z_STREAM_END) && !stream->avail_in) {
|
||||
inflateEnd(stream);
|
||||
return buf;
|
||||
}
|
||||
|
||||
if (status < 0)
|
||||
error("corrupt loose object '%s'", sha1_to_hex(sha1));
|
||||
else if (stream->avail_in)
|
||||
error("garbage at end of loose object '%s'",
|
||||
sha1_to_hex(sha1));
|
||||
free(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1039,7 +1061,7 @@ static int parse_sha1_header(const char *hdr, unsigned long *sizep)
|
||||
return *hdr ? -1 : type_from_string(type);
|
||||
}
|
||||
|
||||
void * unpack_sha1_file(void *map, unsigned long mapsize, enum object_type *type, unsigned long *size)
|
||||
static void *unpack_sha1_file(void *map, unsigned long mapsize, enum object_type *type, unsigned long *size, const unsigned char *sha1)
|
||||
{
|
||||
int ret;
|
||||
z_stream stream;
|
||||
@@ -1049,17 +1071,17 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, enum object_type *type
|
||||
if (ret < Z_OK || (*type = parse_sha1_header(hdr, size)) < 0)
|
||||
return NULL;
|
||||
|
||||
return unpack_sha1_rest(&stream, hdr, *size);
|
||||
return unpack_sha1_rest(&stream, hdr, *size, sha1);
|
||||
}
|
||||
|
||||
static unsigned long get_delta_base(struct packed_git *p,
|
||||
static off_t get_delta_base(struct packed_git *p,
|
||||
struct pack_window **w_curs,
|
||||
unsigned long *curpos,
|
||||
off_t *curpos,
|
||||
enum object_type type,
|
||||
unsigned long delta_obj_offset)
|
||||
off_t delta_obj_offset)
|
||||
{
|
||||
unsigned char *base_info = use_pack(p, w_curs, *curpos, NULL);
|
||||
unsigned long base_offset;
|
||||
off_t base_offset;
|
||||
|
||||
/* use_pack() assured us we have [base_info, base_info + 20)
|
||||
* as a range that we can look at without walking off the
|
||||
@@ -1095,17 +1117,17 @@ static unsigned long get_delta_base(struct packed_git *p,
|
||||
}
|
||||
|
||||
/* forward declaration for a mutually recursive function */
|
||||
static int packed_object_info(struct packed_git *p, unsigned long offset,
|
||||
static int packed_object_info(struct packed_git *p, off_t offset,
|
||||
unsigned long *sizep);
|
||||
|
||||
static int packed_delta_info(struct packed_git *p,
|
||||
struct pack_window **w_curs,
|
||||
unsigned long curpos,
|
||||
off_t curpos,
|
||||
enum object_type type,
|
||||
unsigned long obj_offset,
|
||||
off_t obj_offset,
|
||||
unsigned long *sizep)
|
||||
{
|
||||
unsigned long base_offset;
|
||||
off_t base_offset;
|
||||
|
||||
base_offset = get_delta_base(p, w_curs, &curpos, type, obj_offset);
|
||||
type = packed_object_info(p, base_offset, NULL);
|
||||
@@ -1155,7 +1177,7 @@ static int packed_delta_info(struct packed_git *p,
|
||||
|
||||
static int unpack_object_header(struct packed_git *p,
|
||||
struct pack_window **w_curs,
|
||||
unsigned long *curpos,
|
||||
off_t *curpos,
|
||||
unsigned long *sizep)
|
||||
{
|
||||
unsigned char *base;
|
||||
@@ -1179,14 +1201,15 @@ static int unpack_object_header(struct packed_git *p,
|
||||
}
|
||||
|
||||
const char *packed_object_info_detail(struct packed_git *p,
|
||||
unsigned long obj_offset,
|
||||
off_t obj_offset,
|
||||
unsigned long *size,
|
||||
unsigned long *store_size,
|
||||
unsigned int *delta_chain_length,
|
||||
unsigned char *base_sha1)
|
||||
{
|
||||
struct pack_window *w_curs = NULL;
|
||||
unsigned long curpos, dummy;
|
||||
off_t curpos;
|
||||
unsigned long dummy;
|
||||
unsigned char *next_sha1;
|
||||
enum object_type type;
|
||||
|
||||
@@ -1210,6 +1233,7 @@ const char *packed_object_info_detail(struct packed_git *p,
|
||||
obj_offset = get_delta_base(p, &w_curs, &curpos, type, obj_offset);
|
||||
if (*delta_chain_length == 0) {
|
||||
/* TODO: find base_sha1 as pointed by curpos */
|
||||
hashclr(base_sha1);
|
||||
}
|
||||
break;
|
||||
case OBJ_REF_DELTA:
|
||||
@@ -1225,11 +1249,12 @@ const char *packed_object_info_detail(struct packed_git *p,
|
||||
}
|
||||
}
|
||||
|
||||
static int packed_object_info(struct packed_git *p, unsigned long obj_offset,
|
||||
static int packed_object_info(struct packed_git *p, off_t obj_offset,
|
||||
unsigned long *sizep)
|
||||
{
|
||||
struct pack_window *w_curs = NULL;
|
||||
unsigned long size, curpos = obj_offset;
|
||||
unsigned long size;
|
||||
off_t curpos = obj_offset;
|
||||
enum object_type type;
|
||||
|
||||
type = unpack_object_header(p, &w_curs, &curpos, &size);
|
||||
@@ -1257,7 +1282,7 @@ static int packed_object_info(struct packed_git *p, unsigned long obj_offset,
|
||||
|
||||
static void *unpack_compressed_entry(struct packed_git *p,
|
||||
struct pack_window **w_curs,
|
||||
unsigned long curpos,
|
||||
off_t curpos,
|
||||
unsigned long size)
|
||||
{
|
||||
int st;
|
||||
@@ -1288,20 +1313,22 @@ static void *unpack_compressed_entry(struct packed_git *p,
|
||||
|
||||
static void *unpack_delta_entry(struct packed_git *p,
|
||||
struct pack_window **w_curs,
|
||||
unsigned long curpos,
|
||||
off_t curpos,
|
||||
unsigned long delta_size,
|
||||
unsigned long obj_offset,
|
||||
off_t obj_offset,
|
||||
enum object_type *type,
|
||||
unsigned long *sizep)
|
||||
{
|
||||
void *delta_data, *result, *base;
|
||||
unsigned long base_size, base_offset;
|
||||
unsigned long base_size;
|
||||
off_t base_offset;
|
||||
|
||||
base_offset = get_delta_base(p, w_curs, &curpos, *type, obj_offset);
|
||||
base = unpack_entry(p, base_offset, type, &base_size);
|
||||
if (!base)
|
||||
die("failed to read delta base object at %lu from %s",
|
||||
base_offset, p->pack_name);
|
||||
die("failed to read delta base object"
|
||||
" at %"PRIuMAX" from %s",
|
||||
(uintmax_t)base_offset, p->pack_name);
|
||||
|
||||
delta_data = unpack_compressed_entry(p, w_curs, curpos, delta_size);
|
||||
result = patch_delta(base, base_size,
|
||||
@@ -1314,11 +1341,11 @@ static void *unpack_delta_entry(struct packed_git *p,
|
||||
return result;
|
||||
}
|
||||
|
||||
void *unpack_entry(struct packed_git *p, unsigned long obj_offset,
|
||||
void *unpack_entry(struct packed_git *p, off_t obj_offset,
|
||||
enum object_type *type, unsigned long *sizep)
|
||||
{
|
||||
struct pack_window *w_curs = NULL;
|
||||
unsigned long curpos = obj_offset;
|
||||
off_t curpos = obj_offset;
|
||||
void *data;
|
||||
|
||||
*type = unpack_object_header(p, &w_curs, &curpos, sizep);
|
||||
@@ -1341,23 +1368,23 @@ void *unpack_entry(struct packed_git *p, unsigned long obj_offset,
|
||||
return data;
|
||||
}
|
||||
|
||||
int num_packed_objects(const struct packed_git *p)
|
||||
uint32_t num_packed_objects(const struct packed_git *p)
|
||||
{
|
||||
/* See check_packed_git_idx() */
|
||||
return (p->index_size - 20 - 20 - 4*256) / 24;
|
||||
return (uint32_t)((p->index_size - 20 - 20 - 4*256) / 24);
|
||||
}
|
||||
|
||||
int nth_packed_object_sha1(const struct packed_git *p, int n,
|
||||
int nth_packed_object_sha1(const struct packed_git *p, uint32_t n,
|
||||
unsigned char* sha1)
|
||||
{
|
||||
void *index = p->index_base + 256;
|
||||
if (n < 0 || num_packed_objects(p) <= n)
|
||||
if (num_packed_objects(p) <= n)
|
||||
return -1;
|
||||
hashcpy(sha1, (unsigned char *) index + (24 * n) + 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long find_pack_entry_one(const unsigned char *sha1,
|
||||
off_t find_pack_entry_one(const unsigned char *sha1,
|
||||
struct packed_git *p)
|
||||
{
|
||||
uint32_t *level1_ofs = p->index_base;
|
||||
@@ -1399,7 +1426,7 @@ static int matches_pack_name(struct packed_git *p, const char *ig)
|
||||
static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e, const char **ignore_packed)
|
||||
{
|
||||
struct packed_git *p;
|
||||
unsigned long offset;
|
||||
off_t offset;
|
||||
|
||||
prepare_packed_git();
|
||||
|
||||
@@ -1565,7 +1592,7 @@ void *read_sha1_file(const unsigned char *sha1, enum object_type *type,
|
||||
return buf;
|
||||
map = map_sha1_file(sha1, &mapsize);
|
||||
if (map) {
|
||||
buf = unpack_sha1_file(map, mapsize, type, size);
|
||||
buf = unpack_sha1_file(map, mapsize, type, size, sha1);
|
||||
munmap(map, mapsize);
|
||||
return buf;
|
||||
}
|
||||
@@ -2066,11 +2093,10 @@ int index_pipe(unsigned char *sha1, int fd, const char *type, int write_object)
|
||||
int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object,
|
||||
enum object_type type, const char *path)
|
||||
{
|
||||
unsigned long size = st->st_size;
|
||||
void *buf;
|
||||
size_t size = xsize_t(st->st_size);
|
||||
void *buf = NULL;
|
||||
int ret, re_allocated = 0;
|
||||
|
||||
buf = "";
|
||||
if (size)
|
||||
buf = xmmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
close(fd);
|
||||
@@ -2110,6 +2136,7 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write
|
||||
{
|
||||
int fd;
|
||||
char *target;
|
||||
size_t len;
|
||||
|
||||
switch (st->st_mode & S_IFMT) {
|
||||
case S_IFREG:
|
||||
@@ -2122,16 +2149,17 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write
|
||||
path);
|
||||
break;
|
||||
case S_IFLNK:
|
||||
target = xmalloc(st->st_size+1);
|
||||
if (readlink(path, target, st->st_size+1) != st->st_size) {
|
||||
len = xsize_t(st->st_size);
|
||||
target = xmalloc(len + 1);
|
||||
if (readlink(path, target, len + 1) != st->st_size) {
|
||||
char *errstr = strerror(errno);
|
||||
free(target);
|
||||
return error("readlink(\"%s\"): %s", path,
|
||||
errstr);
|
||||
}
|
||||
if (!write_object)
|
||||
hash_sha1_file(target, st->st_size, blob_type, sha1);
|
||||
else if (write_sha1_file(target, st->st_size, blob_type, sha1))
|
||||
hash_sha1_file(target, len, blob_type, sha1);
|
||||
else if (write_sha1_file(target, len, blob_type, sha1))
|
||||
return error("%s: failed to insert into database",
|
||||
path);
|
||||
free(target);
|
||||
|
||||
14
sha1_name.c
14
sha1_name.c
@@ -76,10 +76,10 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne
|
||||
|
||||
prepare_packed_git();
|
||||
for (p = packed_git; p && found < 2; p = p->next) {
|
||||
unsigned num = num_packed_objects(p);
|
||||
unsigned first = 0, last = num;
|
||||
uint32_t num = num_packed_objects(p);
|
||||
uint32_t first = 0, last = num;
|
||||
while (first < last) {
|
||||
unsigned mid = (first + last) / 2;
|
||||
uint32_t mid = (first + last) / 2;
|
||||
unsigned char now[20];
|
||||
int cmp;
|
||||
|
||||
@@ -605,7 +605,7 @@ static int handle_one_ref(const char *path,
|
||||
int get_sha1_oneline(const char *prefix, unsigned char *sha1)
|
||||
{
|
||||
struct commit_list *list = NULL, *backup = NULL, *l;
|
||||
struct commit *commit;
|
||||
struct commit *commit = NULL;
|
||||
|
||||
if (prefix[0] == '!') {
|
||||
if (prefix[1] != '!')
|
||||
@@ -617,8 +617,12 @@ int get_sha1_oneline(const char *prefix, unsigned char *sha1)
|
||||
for_each_ref(handle_one_ref, &list);
|
||||
for (l = list; l; l = l->next)
|
||||
commit_list_insert(l->item, &backup);
|
||||
while ((commit = pop_most_recent_commit(&list, ONELINE_SEEN))) {
|
||||
while (list) {
|
||||
char *p;
|
||||
|
||||
commit = pop_most_recent_commit(&list, ONELINE_SEEN);
|
||||
if (!commit)
|
||||
break;
|
||||
parse_object(commit->object.sha1);
|
||||
if (!commit->buffer || !(p = strstr(commit->buffer, "\n\n")))
|
||||
continue;
|
||||
|
||||
@@ -114,7 +114,8 @@ test_expect_success \
|
||||
test_expect_success \
|
||||
'some edit' \
|
||||
'mv file file.orig &&
|
||||
sed -e "s/^3A/99/" -e "/^1A/d" < file.orig > file &&
|
||||
sed -e "s/^3A/99/" -e "/^1A/d" -e "/^incomplete/d" < file.orig > file &&
|
||||
echo "incomplete" | tr -d "\\012" >>file &&
|
||||
GIT_AUTHOR_NAME="D" git commit -a -m "edit"'
|
||||
|
||||
test_expect_success \
|
||||
|
||||
@@ -11,7 +11,7 @@ compare_diff_raw () {
|
||||
|
||||
sed -e "$sanitize_diff_raw" <"$1" >.tmp-1
|
||||
sed -e "$sanitize_diff_raw" <"$2" >.tmp-2
|
||||
diff -u .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
|
||||
git diff .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
|
||||
}
|
||||
|
||||
sanitize_diff_raw_z='/^:/s/ '"$_x40"' '"$_x40"' \([A-Z]\)[0-9]*$/ X X \1#/'
|
||||
@@ -23,7 +23,7 @@ compare_diff_raw_z () {
|
||||
|
||||
tr '\0' '\012' <"$1" | sed -e "$sanitize_diff_raw_z" >.tmp-1
|
||||
tr '\0' '\012' <"$2" | sed -e "$sanitize_diff_raw_z" >.tmp-2
|
||||
diff -u .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
|
||||
git diff .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
|
||||
}
|
||||
|
||||
compare_diff_patch () {
|
||||
@@ -37,5 +37,5 @@ compare_diff_patch () {
|
||||
/^[dis]*imilarity index [0-9]*%$/d
|
||||
/^index [0-9a-f]*\.\.[0-9a-f]/d
|
||||
' <"$2" >.tmp-2
|
||||
diff -u .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
|
||||
git diff .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
||||
|
||||
check_result () {
|
||||
git-ls-files --stage | sed -e 's/ '"$_x40"' / X /' >current &&
|
||||
diff -u expected current
|
||||
git diff expected current
|
||||
}
|
||||
|
||||
# This is done on an empty work directory, which is the normal
|
||||
|
||||
@@ -33,7 +33,7 @@ compare_change () {
|
||||
-e '/^--- /d; /^+++ /d; /^@@ /d;' \
|
||||
-e 's/^\([-+][0-7][0-7][0-7][0-7][0-7][0-7]\) '"$_x40"' /\1 X /p' \
|
||||
"$1"
|
||||
diff -u expected current
|
||||
git diff expected current
|
||||
}
|
||||
|
||||
check_cache_at () {
|
||||
@@ -86,7 +86,7 @@ test_expect_success \
|
||||
'rm -f .git/index &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >1-3.out &&
|
||||
diff -u M.out 1-3.out &&
|
||||
git diff M.out 1-3.out &&
|
||||
check_cache_at bozbar dirty &&
|
||||
check_cache_at frotz dirty &&
|
||||
check_cache_at nitfol dirty'
|
||||
@@ -101,7 +101,7 @@ test_expect_success \
|
||||
git-update-index --add yomin &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >4.out || return 1
|
||||
diff -u M.out 4.out >4diff.out
|
||||
git diff M.out 4.out >4diff.out
|
||||
compare_change 4diff.out expected &&
|
||||
check_cache_at yomin clean'
|
||||
|
||||
@@ -115,7 +115,7 @@ test_expect_success \
|
||||
echo yomin yomin >yomin &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >5.out || return 1
|
||||
diff -u M.out 5.out >5diff.out
|
||||
git diff M.out 5.out >5diff.out
|
||||
compare_change 5diff.out expected &&
|
||||
check_cache_at yomin dirty'
|
||||
|
||||
@@ -127,7 +127,7 @@ test_expect_success \
|
||||
git-update-index --add frotz &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >6.out &&
|
||||
diff -u M.out 6.out &&
|
||||
git diff M.out 6.out &&
|
||||
check_cache_at frotz clean'
|
||||
|
||||
test_expect_success \
|
||||
@@ -140,7 +140,7 @@ test_expect_success \
|
||||
echo frotz frotz >frotz &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >7.out &&
|
||||
diff -u M.out 7.out &&
|
||||
git diff M.out 7.out &&
|
||||
check_cache_at frotz dirty'
|
||||
|
||||
test_expect_success \
|
||||
@@ -171,7 +171,7 @@ test_expect_success \
|
||||
git-update-index --add rezrov &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >10.out &&
|
||||
diff -u M.out 10.out'
|
||||
git diff M.out 10.out'
|
||||
|
||||
test_expect_success \
|
||||
'11 - dirty path removed.' \
|
||||
@@ -216,7 +216,7 @@ test_expect_success \
|
||||
git-update-index --add nitfol &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >14.out || return 1
|
||||
diff -u M.out 14.out >14diff.out
|
||||
git diff M.out 14.out >14diff.out
|
||||
compare_change 14diff.out expected &&
|
||||
check_cache_at nitfol clean'
|
||||
|
||||
@@ -230,7 +230,7 @@ test_expect_success \
|
||||
echo nitfol nitfol nitfol >nitfol &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >15.out || return 1
|
||||
diff -u M.out 15.out >15diff.out
|
||||
git diff M.out 15.out >15diff.out
|
||||
compare_change 15diff.out expected &&
|
||||
check_cache_at nitfol dirty'
|
||||
|
||||
@@ -262,7 +262,7 @@ test_expect_success \
|
||||
git-update-index --add bozbar &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >18.out &&
|
||||
diff -u M.out 18.out &&
|
||||
git diff M.out 18.out &&
|
||||
check_cache_at bozbar clean'
|
||||
|
||||
test_expect_success \
|
||||
@@ -275,7 +275,7 @@ test_expect_success \
|
||||
echo gnusto gnusto >bozbar &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >19.out &&
|
||||
diff -u M.out 19.out &&
|
||||
git diff M.out 19.out &&
|
||||
check_cache_at bozbar dirty'
|
||||
|
||||
test_expect_success \
|
||||
@@ -287,7 +287,7 @@ test_expect_success \
|
||||
git-update-index --add bozbar &&
|
||||
read_tree_twoway $treeH $treeM &&
|
||||
git-ls-files --stage >20.out &&
|
||||
diff -u M.out 20.out &&
|
||||
git diff M.out 20.out &&
|
||||
check_cache_at bozbar dirty'
|
||||
|
||||
test_expect_success \
|
||||
@@ -337,7 +337,7 @@ test_expect_success \
|
||||
git-update-index --add DF &&
|
||||
read_tree_twoway $treeDF $treeDFDF &&
|
||||
git-ls-files --stage >DFDFcheck.out &&
|
||||
diff -u DFDF.out DFDFcheck.out &&
|
||||
git diff DFDF.out DFDFcheck.out &&
|
||||
check_cache_at DF/DF dirty &&
|
||||
:'
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ compare_change () {
|
||||
sed >current \
|
||||
-e '/^--- /d; /^+++ /d; /^@@ /d;' \
|
||||
-e 's/^\(.[0-7][0-7][0-7][0-7][0-7][0-7]\) '"$_x40"' /\1 X /' "$1"
|
||||
diff -u expected current
|
||||
git diff expected current
|
||||
}
|
||||
|
||||
check_cache_at () {
|
||||
|
||||
@@ -368,12 +368,12 @@ cat > expect << EOF
|
||||
weird
|
||||
EOF
|
||||
|
||||
test_expect_success "rename succeeded" "diff -u expect .git/config"
|
||||
test_expect_success "rename succeeded" "git diff expect .git/config"
|
||||
|
||||
test_expect_failure "rename non-existing section" \
|
||||
'git-config --rename-section branch."world domination" branch.drei'
|
||||
|
||||
test_expect_success "rename succeeded" "diff -u expect .git/config"
|
||||
test_expect_success "rename succeeded" "git diff expect .git/config"
|
||||
|
||||
test_expect_success "rename another section" \
|
||||
'git-config --rename-section branch."1 234 blabl/a" branch.drei'
|
||||
@@ -389,7 +389,23 @@ cat > expect << EOF
|
||||
weird
|
||||
EOF
|
||||
|
||||
test_expect_success "rename succeeded" "diff -u expect .git/config"
|
||||
test_expect_success "rename succeeded" "git diff expect .git/config"
|
||||
|
||||
cat >> .git/config << EOF
|
||||
[branch "zwei"] a = 1 [branch "vier"]
|
||||
EOF
|
||||
|
||||
test_expect_success "remove section" "git config --remove-section branch.zwei"
|
||||
|
||||
cat > expect << EOF
|
||||
# Hallo
|
||||
#Bello
|
||||
[branch "drei"]
|
||||
weird
|
||||
EOF
|
||||
|
||||
test_expect_success "section was removed properly" \
|
||||
"git diff -u expect .git/config"
|
||||
|
||||
test_expect_success numbers '
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ test_expect_success \
|
||||
--exclude-per-directory=.gitignore \
|
||||
--exclude-from=.git/ignore \
|
||||
>output &&
|
||||
diff -u expect output'
|
||||
git diff expect output'
|
||||
|
||||
# Test \r\n (MSDOS-like systems)
|
||||
printf '*.1\r\n/*.3\r\n!*.6\r\n' >.gitignore
|
||||
@@ -77,6 +77,6 @@ test_expect_success \
|
||||
--exclude-per-directory=.gitignore \
|
||||
--exclude-from=.git/ignore \
|
||||
>output &&
|
||||
diff -u expect output'
|
||||
git diff expect output'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -23,7 +23,7 @@ test_expect_success \
|
||||
test_expect_success \
|
||||
'git-ls-files without path restriction.' \
|
||||
'git-ls-files --others >output &&
|
||||
diff -u output - <<EOF
|
||||
git diff output - <<EOF
|
||||
--
|
||||
-foo
|
||||
output
|
||||
@@ -34,7 +34,7 @@ EOF
|
||||
test_expect_success \
|
||||
'git-ls-files with path restriction.' \
|
||||
'git-ls-files --others path0 >output &&
|
||||
diff -u output - <<EOF
|
||||
git diff output - <<EOF
|
||||
path0
|
||||
EOF
|
||||
'
|
||||
@@ -42,7 +42,7 @@ EOF
|
||||
test_expect_success \
|
||||
'git-ls-files with path restriction with --.' \
|
||||
'git-ls-files --others -- path0 >output &&
|
||||
diff -u output - <<EOF
|
||||
git diff output - <<EOF
|
||||
path0
|
||||
EOF
|
||||
'
|
||||
@@ -50,7 +50,7 @@ EOF
|
||||
test_expect_success \
|
||||
'git-ls-files with path restriction with -- --.' \
|
||||
'git-ls-files --others -- -- >output &&
|
||||
diff -u output - <<EOF
|
||||
git diff output - <<EOF
|
||||
--
|
||||
EOF
|
||||
'
|
||||
@@ -58,7 +58,7 @@ EOF
|
||||
test_expect_success \
|
||||
'git-ls-files with no path restriction.' \
|
||||
'git-ls-files --others -- >output &&
|
||||
diff -u output - <<EOF
|
||||
git diff output - <<EOF
|
||||
--
|
||||
-foo
|
||||
output
|
||||
|
||||
@@ -53,7 +53,7 @@ _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
|
||||
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
||||
test_output () {
|
||||
sed -e "s/ $_x40 / X /" <current >check
|
||||
diff -u expected check
|
||||
git diff expected check
|
||||
}
|
||||
|
||||
test_expect_success \
|
||||
|
||||
@@ -43,7 +43,7 @@ _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
|
||||
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
||||
test_output () {
|
||||
sed -e "s/ $_x40 / X /" <current >check
|
||||
diff -u expected check
|
||||
git diff expected check
|
||||
}
|
||||
|
||||
test_expect_success \
|
||||
|
||||
@@ -35,7 +35,7 @@ no-funny' >expected
|
||||
test_expect_success 'git-ls-files no-funny' \
|
||||
'git-update-index --add "$p0" "$p2" &&
|
||||
git-ls-files >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
t0=`git-write-tree`
|
||||
echo "$t0" >t0
|
||||
@@ -48,14 +48,14 @@ EOF
|
||||
test_expect_success 'git-ls-files with-funny' \
|
||||
'git-update-index --add "$p1" &&
|
||||
git-ls-files >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
echo 'just space
|
||||
no-funny
|
||||
tabs ," (dq) and spaces' >expected
|
||||
test_expect_success 'git-ls-files -z with-funny' \
|
||||
'git-ls-files -z | tr \\0 \\012 >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
t1=`git-write-tree`
|
||||
echo "$t1" >t1
|
||||
@@ -67,28 +67,28 @@ no-funny
|
||||
EOF
|
||||
test_expect_success 'git-ls-tree with funny' \
|
||||
'git-ls-tree -r $t1 | sed -e "s/^[^ ]* //" >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
cat > expected <<\EOF
|
||||
A "tabs\t,\" (dq) and spaces"
|
||||
EOF
|
||||
test_expect_success 'git-diff-index with-funny' \
|
||||
'git-diff-index --name-status $t0 >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
test_expect_success 'git-diff-tree with-funny' \
|
||||
'git-diff-tree --name-status $t0 $t1 >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
echo 'A
|
||||
tabs ," (dq) and spaces' >expected
|
||||
test_expect_success 'git-diff-index -z with-funny' \
|
||||
'git-diff-index -z --name-status $t0 | tr \\0 \\012 >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
test_expect_success 'git-diff-tree -z with-funny' \
|
||||
'git-diff-tree -z --name-status $t0 $t1 | tr \\0 \\012 >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
cat > expected <<\EOF
|
||||
CNUM no-funny "tabs\t,\" (dq) and spaces"
|
||||
@@ -96,7 +96,7 @@ EOF
|
||||
test_expect_success 'git-diff-tree -C with-funny' \
|
||||
'git-diff-tree -C --find-copies-harder --name-status \
|
||||
$t0 $t1 | sed -e 's/^C[0-9]*/CNUM/' >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
cat > expected <<\EOF
|
||||
RNUM no-funny "tabs\t,\" (dq) and spaces"
|
||||
@@ -105,7 +105,7 @@ test_expect_success 'git-diff-tree delete with-funny' \
|
||||
'git-update-index --force-remove "$p0" &&
|
||||
git-diff-index -M --name-status \
|
||||
$t0 | sed -e 's/^R[0-9]*/RNUM/' >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
cat > expected <<\EOF
|
||||
diff --git a/no-funny "b/tabs\t,\" (dq) and spaces"
|
||||
@@ -116,7 +116,7 @@ EOF
|
||||
test_expect_success 'git-diff-tree delete with-funny' \
|
||||
'git-diff-index -M -p $t0 |
|
||||
sed -e "s/index [0-9]*%/index NUM%/" >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
chmod +x "$p1"
|
||||
cat > expected <<\EOF
|
||||
@@ -130,7 +130,7 @@ EOF
|
||||
test_expect_success 'git-diff-tree delete with-funny' \
|
||||
'git-diff-index -M -p $t0 |
|
||||
sed -e "s/index [0-9]*%/index NUM%/" >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
cat >expected <<\EOF
|
||||
"tabs\t,\" (dq) and spaces"
|
||||
@@ -139,7 +139,7 @@ EOF
|
||||
test_expect_success 'git-diff-tree rename with-funny applied' \
|
||||
'git-diff-index -M -p $t0 |
|
||||
git-apply --stat | sed -e "s/|.*//" -e "s/ *\$//" >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
cat > expected <<\EOF
|
||||
no-funny
|
||||
@@ -149,12 +149,12 @@ EOF
|
||||
test_expect_success 'git-diff-tree delete with-funny applied' \
|
||||
'git-diff-index -p $t0 |
|
||||
git-apply --stat | sed -e "s/|.*//" -e "s/ *\$//" >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
test_expect_success 'git-apply non-git diff' \
|
||||
'git-diff-index -p $t0 |
|
||||
sed -ne "/^[-+@]/p" |
|
||||
git-apply --stat | sed -e "s/|.*//" -e "s/ *\$//" >current &&
|
||||
diff -u expected current'
|
||||
git diff expected current'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -9,7 +9,7 @@ test_description='commit and log output encodings'
|
||||
|
||||
compare_with () {
|
||||
git-show -s $1 | sed -e '1,/^$/d' -e 's/^ //' -e '$d' >current &&
|
||||
diff -u current "$2"
|
||||
git diff current "$2"
|
||||
}
|
||||
|
||||
test_expect_success setup '
|
||||
|
||||
@@ -38,7 +38,7 @@ echo ":100644 100755 X X M rezrov" >expected
|
||||
|
||||
test_expect_success \
|
||||
'verify' \
|
||||
'diff -u expected check'
|
||||
'git diff expected check'
|
||||
|
||||
test_done
|
||||
|
||||
|
||||
@@ -106,12 +106,12 @@ do
|
||||
echo "\$ git $cmd"
|
||||
git $cmd |
|
||||
sed -e "s/^\\(-*\\)$V\\(-*\\)\$/\\1g-i-t--v-e-r-s-i-o-n\2/" \
|
||||
-e "s/^\\( *boundary=\"-*\\)$V\\(-*\\)\"\$/\\1g-i-t--v-e-r-s-i-o-n\2\"/"
|
||||
-e "s/^\\(.*mixed; boundary=\"-*\\)$V\\(-*\\)\"\$/\\1g-i-t--v-e-r-s-i-o-n\2\"/"
|
||||
echo "\$"
|
||||
} >"$actual" &&
|
||||
if test -f "$expect"
|
||||
then
|
||||
diff -u "$expect" "$actual" &&
|
||||
git diff "$expect" "$actual" &&
|
||||
rm -f "$actual"
|
||||
else
|
||||
# this is to help developing new tests.
|
||||
@@ -238,6 +238,9 @@ format-patch --stdout initial..master
|
||||
format-patch --attach --stdout initial..side
|
||||
format-patch --attach --stdout initial..master^
|
||||
format-patch --attach --stdout initial..master
|
||||
format-patch --inline --stdout initial..side
|
||||
format-patch --inline --stdout initial..master^
|
||||
format-patch --inline --stdout initial..master
|
||||
|
||||
diff --abbrev initial..side
|
||||
diff -r initial..side
|
||||
|
||||
@@ -4,8 +4,7 @@ From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:01:00 +0000
|
||||
Subject: [PATCH] Second
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed;
|
||||
boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
@@ -21,11 +20,9 @@ This is the second commit.
|
||||
3 files changed, 5 insertions(+), 3 deletions(-)
|
||||
delete mode 100644 file2
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch;
|
||||
name="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
Content-Type: text/x-patch; name="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline;
|
||||
filename="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
Content-Disposition: attachment; filename="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 35d242b..8422d40 100644
|
||||
@@ -66,8 +63,7 @@ From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:02:00 +0000
|
||||
Subject: [PATCH] Third
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed;
|
||||
boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
@@ -80,11 +76,9 @@ Content-Transfer-Encoding: 8bit
|
||||
2 files changed, 5 insertions(+), 0 deletions(-)
|
||||
create mode 100644 file1
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch;
|
||||
name="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
Content-Type: text/x-patch; name="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline;
|
||||
filename="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
Content-Disposition: attachment; filename="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 8422d40..cead32e 100644
|
||||
@@ -115,8 +109,7 @@ From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:03:00 +0000
|
||||
Subject: [PATCH] Side
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed;
|
||||
boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
@@ -130,11 +123,9 @@ Content-Transfer-Encoding: 8bit
|
||||
3 files changed, 9 insertions(+), 0 deletions(-)
|
||||
create mode 100644 file3
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch;
|
||||
name="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
Content-Type: text/x-patch; name="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline;
|
||||
filename="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
Content-Disposition: attachment; filename="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 35d242b..7289e35 100644
|
||||
|
||||
@@ -4,8 +4,7 @@ From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:01:00 +0000
|
||||
Subject: [PATCH] Second
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed;
|
||||
boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
@@ -21,11 +20,9 @@ This is the second commit.
|
||||
3 files changed, 5 insertions(+), 3 deletions(-)
|
||||
delete mode 100644 file2
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch;
|
||||
name="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
Content-Type: text/x-patch; name="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline;
|
||||
filename="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
Content-Disposition: attachment; filename="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 35d242b..8422d40 100644
|
||||
@@ -66,8 +63,7 @@ From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:02:00 +0000
|
||||
Subject: [PATCH] Third
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed;
|
||||
boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
@@ -80,11 +76,9 @@ Content-Transfer-Encoding: 8bit
|
||||
2 files changed, 5 insertions(+), 0 deletions(-)
|
||||
create mode 100644 file1
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch;
|
||||
name="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
Content-Type: text/x-patch; name="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline;
|
||||
filename="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
Content-Disposition: attachment; filename="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 8422d40..cead32e 100644
|
||||
|
||||
@@ -4,8 +4,7 @@ From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:03:00 +0000
|
||||
Subject: [PATCH] Side
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed;
|
||||
boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
@@ -19,11 +18,9 @@ Content-Transfer-Encoding: 8bit
|
||||
3 files changed, 9 insertions(+), 0 deletions(-)
|
||||
create mode 100644 file3
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch;
|
||||
name="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
Content-Type: text/x-patch; name="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline;
|
||||
filename="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
Content-Disposition: attachment; filename="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 35d242b..7289e35 100644
|
||||
|
||||
164
t/t4013/diff.format-patch_--inline_--stdout_initial..master
Normal file
164
t/t4013/diff.format-patch_--inline_--stdout_initial..master
Normal file
@@ -0,0 +1,164 @@
|
||||
$ git format-patch --inline --stdout initial..master
|
||||
From 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 Mon Sep 17 00:00:00 2001
|
||||
From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:01:00 +0000
|
||||
Subject: [PATCH] Second
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/plain; charset=UTF-8; format=fixed
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
|
||||
This is the second commit.
|
||||
---
|
||||
dir/sub | 2 ++
|
||||
file0 | 3 +++
|
||||
file2 | 3 ---
|
||||
3 files changed, 5 insertions(+), 3 deletions(-)
|
||||
delete mode 100644 file2
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch; name="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline; filename="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 35d242b..8422d40 100644
|
||||
--- a/dir/sub
|
||||
+++ b/dir/sub
|
||||
@@ -1,2 +1,4 @@
|
||||
A
|
||||
B
|
||||
+C
|
||||
+D
|
||||
diff --git a/file0 b/file0
|
||||
index 01e79c3..b414108 100644
|
||||
--- a/file0
|
||||
+++ b/file0
|
||||
@@ -1,3 +1,6 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
+4
|
||||
+5
|
||||
+6
|
||||
diff --git a/file2 b/file2
|
||||
deleted file mode 100644
|
||||
index 01e79c3..0000000
|
||||
--- a/file2
|
||||
+++ /dev/null
|
||||
@@ -1,3 +0,0 @@
|
||||
-1
|
||||
-2
|
||||
-3
|
||||
|
||||
--------------g-i-t--v-e-r-s-i-o-n--
|
||||
|
||||
|
||||
|
||||
From 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 Mon Sep 17 00:00:00 2001
|
||||
From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:02:00 +0000
|
||||
Subject: [PATCH] Third
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/plain; charset=UTF-8; format=fixed
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
---
|
||||
dir/sub | 2 ++
|
||||
file1 | 3 +++
|
||||
2 files changed, 5 insertions(+), 0 deletions(-)
|
||||
create mode 100644 file1
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch; name="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline; filename="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 8422d40..cead32e 100644
|
||||
--- a/dir/sub
|
||||
+++ b/dir/sub
|
||||
@@ -2,3 +2,5 @@ A
|
||||
B
|
||||
C
|
||||
D
|
||||
+E
|
||||
+F
|
||||
diff --git a/file1 b/file1
|
||||
new file mode 100644
|
||||
index 0000000..b1e6722
|
||||
--- /dev/null
|
||||
+++ b/file1
|
||||
@@ -0,0 +1,3 @@
|
||||
+A
|
||||
+B
|
||||
+C
|
||||
|
||||
--------------g-i-t--v-e-r-s-i-o-n--
|
||||
|
||||
|
||||
|
||||
From c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a Mon Sep 17 00:00:00 2001
|
||||
From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:03:00 +0000
|
||||
Subject: [PATCH] Side
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/plain; charset=UTF-8; format=fixed
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
---
|
||||
dir/sub | 2 ++
|
||||
file0 | 3 +++
|
||||
file3 | 4 ++++
|
||||
3 files changed, 9 insertions(+), 0 deletions(-)
|
||||
create mode 100644 file3
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch; name="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline; filename="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 35d242b..7289e35 100644
|
||||
--- a/dir/sub
|
||||
+++ b/dir/sub
|
||||
@@ -1,2 +1,4 @@
|
||||
A
|
||||
B
|
||||
+1
|
||||
+2
|
||||
diff --git a/file0 b/file0
|
||||
index 01e79c3..f4615da 100644
|
||||
--- a/file0
|
||||
+++ b/file0
|
||||
@@ -1,3 +1,6 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
+A
|
||||
+B
|
||||
+C
|
||||
diff --git a/file3 b/file3
|
||||
new file mode 100644
|
||||
index 0000000..7289e35
|
||||
--- /dev/null
|
||||
+++ b/file3
|
||||
@@ -0,0 +1,4 @@
|
||||
+A
|
||||
+B
|
||||
+1
|
||||
+2
|
||||
|
||||
--------------g-i-t--v-e-r-s-i-o-n--
|
||||
|
||||
|
||||
$
|
||||
106
t/t4013/diff.format-patch_--inline_--stdout_initial..master^
Normal file
106
t/t4013/diff.format-patch_--inline_--stdout_initial..master^
Normal file
@@ -0,0 +1,106 @@
|
||||
$ git format-patch --inline --stdout initial..master^
|
||||
From 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 Mon Sep 17 00:00:00 2001
|
||||
From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:01:00 +0000
|
||||
Subject: [PATCH] Second
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/plain; charset=UTF-8; format=fixed
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
|
||||
This is the second commit.
|
||||
---
|
||||
dir/sub | 2 ++
|
||||
file0 | 3 +++
|
||||
file2 | 3 ---
|
||||
3 files changed, 5 insertions(+), 3 deletions(-)
|
||||
delete mode 100644 file2
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch; name="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline; filename="1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 35d242b..8422d40 100644
|
||||
--- a/dir/sub
|
||||
+++ b/dir/sub
|
||||
@@ -1,2 +1,4 @@
|
||||
A
|
||||
B
|
||||
+C
|
||||
+D
|
||||
diff --git a/file0 b/file0
|
||||
index 01e79c3..b414108 100644
|
||||
--- a/file0
|
||||
+++ b/file0
|
||||
@@ -1,3 +1,6 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
+4
|
||||
+5
|
||||
+6
|
||||
diff --git a/file2 b/file2
|
||||
deleted file mode 100644
|
||||
index 01e79c3..0000000
|
||||
--- a/file2
|
||||
+++ /dev/null
|
||||
@@ -1,3 +0,0 @@
|
||||
-1
|
||||
-2
|
||||
-3
|
||||
|
||||
--------------g-i-t--v-e-r-s-i-o-n--
|
||||
|
||||
|
||||
|
||||
From 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 Mon Sep 17 00:00:00 2001
|
||||
From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:02:00 +0000
|
||||
Subject: [PATCH] Third
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/plain; charset=UTF-8; format=fixed
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
---
|
||||
dir/sub | 2 ++
|
||||
file1 | 3 +++
|
||||
2 files changed, 5 insertions(+), 0 deletions(-)
|
||||
create mode 100644 file1
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch; name="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline; filename="9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 8422d40..cead32e 100644
|
||||
--- a/dir/sub
|
||||
+++ b/dir/sub
|
||||
@@ -2,3 +2,5 @@ A
|
||||
B
|
||||
C
|
||||
D
|
||||
+E
|
||||
+F
|
||||
diff --git a/file1 b/file1
|
||||
new file mode 100644
|
||||
index 0000000..b1e6722
|
||||
--- /dev/null
|
||||
+++ b/file1
|
||||
@@ -0,0 +1,3 @@
|
||||
+A
|
||||
+B
|
||||
+C
|
||||
|
||||
--------------g-i-t--v-e-r-s-i-o-n--
|
||||
|
||||
|
||||
$
|
||||
59
t/t4013/diff.format-patch_--inline_--stdout_initial..side
Normal file
59
t/t4013/diff.format-patch_--inline_--stdout_initial..side
Normal file
@@ -0,0 +1,59 @@
|
||||
$ git format-patch --inline --stdout initial..side
|
||||
From c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a Mon Sep 17 00:00:00 2001
|
||||
From: A U Thor <author@example.com>
|
||||
Date: Mon, 26 Jun 2006 00:03:00 +0000
|
||||
Subject: [PATCH] Side
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="------------g-i-t--v-e-r-s-i-o-n"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/plain; charset=UTF-8; format=fixed
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
---
|
||||
dir/sub | 2 ++
|
||||
file0 | 3 +++
|
||||
file3 | 4 ++++
|
||||
3 files changed, 9 insertions(+), 0 deletions(-)
|
||||
create mode 100644 file3
|
||||
--------------g-i-t--v-e-r-s-i-o-n
|
||||
Content-Type: text/x-patch; name="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-Disposition: inline; filename="c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a.diff"
|
||||
|
||||
diff --git a/dir/sub b/dir/sub
|
||||
index 35d242b..7289e35 100644
|
||||
--- a/dir/sub
|
||||
+++ b/dir/sub
|
||||
@@ -1,2 +1,4 @@
|
||||
A
|
||||
B
|
||||
+1
|
||||
+2
|
||||
diff --git a/file0 b/file0
|
||||
index 01e79c3..f4615da 100644
|
||||
--- a/file0
|
||||
+++ b/file0
|
||||
@@ -1,3 +1,6 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
+A
|
||||
+B
|
||||
+C
|
||||
diff --git a/file3 b/file3
|
||||
new file mode 100644
|
||||
index 0000000..7289e35
|
||||
--- /dev/null
|
||||
+++ b/file3
|
||||
@@ -0,0 +1,4 @@
|
||||
+A
|
||||
+B
|
||||
+1
|
||||
+2
|
||||
|
||||
--------------g-i-t--v-e-r-s-i-o-n--
|
||||
|
||||
|
||||
$
|
||||
@@ -43,13 +43,13 @@ index adf3937..6edc172 100644
|
||||
EOF
|
||||
|
||||
git-diff > out
|
||||
test_expect_success "Ray's example without options" 'diff -u expect out'
|
||||
test_expect_success "Ray's example without options" 'git diff expect out'
|
||||
|
||||
git-diff -w > out
|
||||
test_expect_success "Ray's example with -w" 'diff -u expect out'
|
||||
test_expect_success "Ray's example with -w" 'git diff expect out'
|
||||
|
||||
git-diff -b > out
|
||||
test_expect_success "Ray's example with -b" 'diff -u expect out'
|
||||
test_expect_success "Ray's example with -b" 'git diff expect out'
|
||||
|
||||
tr 'Q' '\015' << EOF > x
|
||||
whitespace at beginning
|
||||
@@ -90,14 +90,14 @@ index d99af23..8b32fb5 100644
|
||||
+CR at end
|
||||
EOF
|
||||
git-diff > out
|
||||
test_expect_success 'another test, without options' 'diff -u expect out'
|
||||
test_expect_success 'another test, without options' 'git diff expect out'
|
||||
|
||||
cat << EOF > expect
|
||||
diff --git a/x b/x
|
||||
index d99af23..8b32fb5 100644
|
||||
EOF
|
||||
git-diff -w > out
|
||||
test_expect_success 'another test, with -w' 'diff -u expect out'
|
||||
test_expect_success 'another test, with -w' 'git diff expect out'
|
||||
|
||||
tr 'Q' '\015' << EOF > expect
|
||||
diff --git a/x b/x
|
||||
@@ -115,6 +115,6 @@ index d99af23..8b32fb5 100644
|
||||
CR at endQ
|
||||
EOF
|
||||
git-diff -b > out
|
||||
test_expect_success 'another test, with -b' 'diff -u expect out'
|
||||
test_expect_success 'another test, with -b' 'git diff expect out'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -49,7 +49,7 @@ cat >expect <<\EOF
|
||||
EOF
|
||||
test_expect_success 'git diff --summary -M HEAD' '
|
||||
git diff --summary -M HEAD >actual &&
|
||||
diff -u expect actual
|
||||
git diff expect actual
|
||||
'
|
||||
|
||||
cat >expect <<\EOF
|
||||
@@ -64,7 +64,7 @@ cat >expect <<\EOF
|
||||
EOF
|
||||
test_expect_success 'git diff --stat -M HEAD' '
|
||||
git diff --stat -M HEAD >actual &&
|
||||
diff -u expect actual
|
||||
git diff expect actual
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -11,37 +11,37 @@ test_description='git-apply --stat --summary test.
|
||||
test_expect_success \
|
||||
'rename' \
|
||||
'git-apply --stat --summary <../t4100/t-apply-1.patch >current &&
|
||||
diff -u ../t4100/t-apply-1.expect current'
|
||||
git diff ../t4100/t-apply-1.expect current'
|
||||
|
||||
test_expect_success \
|
||||
'copy' \
|
||||
'git-apply --stat --summary <../t4100/t-apply-2.patch >current &&
|
||||
diff -u ../t4100/t-apply-2.expect current'
|
||||
git diff ../t4100/t-apply-2.expect current'
|
||||
|
||||
test_expect_success \
|
||||
'rewrite' \
|
||||
'git-apply --stat --summary <../t4100/t-apply-3.patch >current &&
|
||||
diff -u ../t4100/t-apply-3.expect current'
|
||||
git diff ../t4100/t-apply-3.expect current'
|
||||
|
||||
test_expect_success \
|
||||
'mode' \
|
||||
'git-apply --stat --summary <../t4100/t-apply-4.patch >current &&
|
||||
diff -u ../t4100/t-apply-4.expect current'
|
||||
git diff ../t4100/t-apply-4.expect current'
|
||||
|
||||
test_expect_success \
|
||||
'non git' \
|
||||
'git-apply --stat --summary <../t4100/t-apply-5.patch >current &&
|
||||
diff -u ../t4100/t-apply-5.expect current'
|
||||
git diff ../t4100/t-apply-5.expect current'
|
||||
|
||||
test_expect_success \
|
||||
'non git' \
|
||||
'git-apply --stat --summary <../t4100/t-apply-6.patch >current &&
|
||||
diff -u ../t4100/t-apply-6.expect current'
|
||||
git diff ../t4100/t-apply-6.expect current'
|
||||
|
||||
test_expect_success \
|
||||
'non git' \
|
||||
'git-apply --stat --summary <../t4100/t-apply-7.patch >current &&
|
||||
diff -u ../t4100/t-apply-7.expect current'
|
||||
git diff ../t4100/t-apply-7.expect current'
|
||||
|
||||
test_done
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@ do
|
||||
cat '"$kind-patch.$with"'
|
||||
(exit 1)
|
||||
} &&
|
||||
diff -u '"$kind"'-expect victim
|
||||
git diff '"$kind"'-expect victim
|
||||
'
|
||||
done
|
||||
done
|
||||
@@ -108,7 +108,7 @@ do
|
||||
cat '"$kind-ng.without"'
|
||||
(exit 1)
|
||||
} &&
|
||||
diff -u '"$kind"'-expect victim
|
||||
git diff '"$kind"'-expect victim
|
||||
'
|
||||
done
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ test_expect_success 'apply symlink patch' '
|
||||
git checkout side &&
|
||||
git apply patch &&
|
||||
git diff-files -p >patched &&
|
||||
diff -u patch patched
|
||||
git diff patch patched
|
||||
|
||||
'
|
||||
|
||||
@@ -49,7 +49,7 @@ test_expect_success 'apply --index symlink patch' '
|
||||
git checkout -f side &&
|
||||
git apply --index patch &&
|
||||
git diff-index --cached -p HEAD >patched &&
|
||||
diff -u patch patched
|
||||
git diff patch patched
|
||||
|
||||
'
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ test_expect_success 'apply in reverse' '
|
||||
git reset --hard second &&
|
||||
git apply --reverse --binary --index patch &&
|
||||
git diff >diff &&
|
||||
diff -u /dev/null diff
|
||||
git diff /dev/null diff
|
||||
|
||||
'
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ test_expect_success 'apply without --reject should fail' '
|
||||
exit 1
|
||||
fi
|
||||
|
||||
diff -u file1 saved.file1
|
||||
git diff file1 saved.file1
|
||||
'
|
||||
|
||||
test_expect_success 'apply without --reject should fail' '
|
||||
@@ -65,7 +65,7 @@ test_expect_success 'apply without --reject should fail' '
|
||||
exit 1
|
||||
fi
|
||||
|
||||
diff -u file1 saved.file1
|
||||
git diff file1 saved.file1
|
||||
'
|
||||
|
||||
test_expect_success 'apply with --reject should fail but update the file' '
|
||||
@@ -79,7 +79,7 @@ test_expect_success 'apply with --reject should fail but update the file' '
|
||||
exit 1
|
||||
fi
|
||||
|
||||
diff -u file1 expected &&
|
||||
git diff file1 expected &&
|
||||
|
||||
cat file1.rej &&
|
||||
|
||||
@@ -105,7 +105,7 @@ test_expect_success 'apply with --reject should fail but update the file' '
|
||||
echo "file1 still exists?"
|
||||
exit 1
|
||||
}
|
||||
diff -u file2 expected &&
|
||||
git diff file2 expected &&
|
||||
|
||||
cat file2.rej &&
|
||||
|
||||
@@ -132,7 +132,7 @@ test_expect_success 'the same test with --verbose' '
|
||||
echo "file1 still exists?"
|
||||
exit 1
|
||||
}
|
||||
diff -u file2 expected &&
|
||||
git diff file2 expected &&
|
||||
|
||||
cat file2.rej &&
|
||||
|
||||
@@ -151,7 +151,7 @@ test_expect_success 'apply cleanly with --verbose' '
|
||||
|
||||
git apply --verbose patch.1 &&
|
||||
|
||||
diff -u file1 clean
|
||||
git diff file1 clean
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -37,7 +37,7 @@ test_expect_success 'apply --numstat' '
|
||||
echo "0 1 file1" &&
|
||||
echo "0 1 file2"
|
||||
} >expect &&
|
||||
diff -u expect actual
|
||||
git diff expect actual
|
||||
|
||||
'
|
||||
|
||||
@@ -47,8 +47,8 @@ test_expect_success 'apply --apply' '
|
||||
cat file2.orig >file2 &&
|
||||
git update-index file1 file2 &&
|
||||
git apply --index diff.output &&
|
||||
diff -u file1.mods file1 &&
|
||||
diff -u file2.mods file2
|
||||
git diff file1.mods file1 &&
|
||||
git diff file2.mods file2
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -70,7 +70,7 @@ EOF
|
||||
|
||||
git rerere diff > out
|
||||
|
||||
test_expect_success 'rerere diff' 'diff -u expect out'
|
||||
test_expect_success 'rerere diff' 'git diff expect out'
|
||||
|
||||
cat > expect << EOF
|
||||
a1
|
||||
@@ -78,7 +78,7 @@ EOF
|
||||
|
||||
git rerere status > out
|
||||
|
||||
test_expect_success 'rerere status' 'diff -u expect out'
|
||||
test_expect_success 'rerere status' 'git diff expect out'
|
||||
|
||||
test_expect_success 'commit succeeds' \
|
||||
"git commit -q -a -m 'prefer first over second'"
|
||||
@@ -94,7 +94,7 @@ test_expect_failure 'another conflicting merge' 'git pull . first'
|
||||
git show first:a1 | sed 's/To die: t/To die! T/' > expect
|
||||
test_expect_success 'rerere kicked in' "! grep ======= a1"
|
||||
|
||||
test_expect_success 'rerere prefers first change' 'diff -u a1 expect'
|
||||
test_expect_success 'rerere prefers first change' 'git diff a1 expect'
|
||||
|
||||
rm $rr/postimage
|
||||
echo "$sha1 a1" | tr '\012' '\0' > .git/rr-cache/MERGE_RR
|
||||
|
||||
@@ -108,9 +108,9 @@ test_expect_success \
|
||||
cd victim &&
|
||||
git-config receive.denyNonFastforwards true &&
|
||||
cd .. &&
|
||||
git-update-ref refs/heads/master master^ &&
|
||||
git-send-pack --force ./victim/.git/ master &&
|
||||
! diff -u .git/refs/heads/master victim/.git/refs/heads/master
|
||||
git-update-ref refs/heads/master master^ || return 1
|
||||
git-send-pack --force ./victim/.git/ master && return 1
|
||||
! git diff .git/refs/heads/master victim/.git/refs/heads/master
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user