mirror of
https://github.com/git/git.git
synced 2026-03-13 10:23:30 +01:00
Merge branch 'maint' of git://repo.or.cz/alt-git
This commit is contained in:
@@ -2,7 +2,7 @@ MAN1_TXT= \
|
||||
$(filter-out $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
|
||||
$(wildcard git-*.txt)) \
|
||||
gitk.txt
|
||||
MAN5_TXT=gitattributes.txt
|
||||
MAN5_TXT=gitattributes.txt gitignore.txt
|
||||
MAN7_TXT=git.txt
|
||||
|
||||
DOC_HTML=$(patsubst %.txt,%.html,$(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT))
|
||||
@@ -112,8 +112,7 @@ clean:
|
||||
%.html : %.txt
|
||||
rm -f $@+ $@
|
||||
$(ASCIIDOC) -b xhtml11 -d manpage -f asciidoc.conf \
|
||||
$(ASCIIDOC_EXTRA) -o - $< | \
|
||||
sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' >$@+
|
||||
$(ASCIIDOC_EXTRA) -agit_version=$(GIT_VERSION) -o $@+ $<
|
||||
mv $@+ $@
|
||||
|
||||
%.1 %.5 %.7 : %.xml
|
||||
@@ -122,8 +121,7 @@ clean:
|
||||
%.xml : %.txt
|
||||
rm -f $@+ $@
|
||||
$(ASCIIDOC) -b docbook -d manpage -f asciidoc.conf \
|
||||
$(ASCIIDOC_EXTRA) -o - $< | \
|
||||
sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' >$@+
|
||||
$(ASCIIDOC_EXTRA) -agit_version=$(GIT_VERSION) -o $@+ $<
|
||||
mv $@+ $@
|
||||
|
||||
user-manual.xml: user-manual.txt user-manual.conf
|
||||
|
||||
53
Documentation/RelNotes-1.5.2.1.txt
Normal file
53
Documentation/RelNotes-1.5.2.1.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
GIT v1.5.2.1 Release Notes
|
||||
==========================
|
||||
|
||||
Fixes since v1.5.2
|
||||
------------------
|
||||
|
||||
* Bugfixes
|
||||
|
||||
- Temporary files that are used when invoking external diff
|
||||
programs did not tolerate a long TMPDIR.
|
||||
|
||||
- git-daemon did not notice when it could not write into its
|
||||
pid file.
|
||||
|
||||
- git-status did not honor core.excludesFile configuration like
|
||||
git-add did.
|
||||
|
||||
- git-annotate did not work from a subdirectory while
|
||||
git-blame did.
|
||||
|
||||
- git-cvsserver should have disabled access to a repository
|
||||
with "gitcvs.pserver.enabled = false" set even when
|
||||
"gitcvs.enabled = true" was set at the same time. It
|
||||
didn't.
|
||||
|
||||
- git-cvsimport did not work correctly in a repository with
|
||||
its branch heads were packed with pack-refs.
|
||||
|
||||
- ident unexpansion to squash "$Id: xxx $" that is in the
|
||||
repository copy removed incorrect number of bytes.
|
||||
|
||||
- git-svn misbehaved when the subversion repository did not
|
||||
provide MD5 checksums for files.
|
||||
|
||||
- git rebase (and git am) misbehaved on commits that have '\n'
|
||||
(literally backslash and en, not a linefeed) in the title.
|
||||
|
||||
- code to decode base85 used in binary patches had one error
|
||||
return codepath wrong.
|
||||
|
||||
- RFC2047 Q encoding output by git-format-patch used '_' for a
|
||||
space, which is not understood by some programs. It uses =20
|
||||
which is safer.
|
||||
|
||||
- git-fastimport --import-marks was broken; fixed.
|
||||
|
||||
- A lot of documentation updates, clarifications and fixes.
|
||||
|
||||
--
|
||||
exec >/var/tmp/1
|
||||
O=v1.5.2-65-g996e2d6
|
||||
echo O=`git describe refs/heads/maint`
|
||||
git shortlog --no-merges $O..refs/heads/maint
|
||||
@@ -65,6 +65,19 @@ in templates/hooks--pre-commit. To help ensure this does not happen,
|
||||
run git diff --check on your changes before you commit.
|
||||
|
||||
|
||||
(1a) Try to be nice to older C compilers
|
||||
|
||||
We try to support wide range of C compilers to compile
|
||||
git with. That means that you should not use C99 initializers, even
|
||||
if a lot of compilers grok it.
|
||||
|
||||
Also, variables have to be declared at the beginning of the block
|
||||
(you can check this with gcc, using the -Wdeclaration-after-statement
|
||||
option).
|
||||
|
||||
Another thing: NULL pointers shall be written as NULL, not as 0.
|
||||
|
||||
|
||||
(2) Generate your patch using git tools out of your commits.
|
||||
|
||||
git based diff tools (git, Cogito, and StGIT included) generate
|
||||
|
||||
@@ -40,7 +40,7 @@ template::[header-declarations]
|
||||
<refentrytitle>{mantitle}</refentrytitle>
|
||||
<manvolnum>{manvolnum}</manvolnum>
|
||||
<refmiscinfo class="source">Git</refmiscinfo>
|
||||
<refmiscinfo class="version">@@GIT_VERSION@@</refmiscinfo>
|
||||
<refmiscinfo class="version">{git_version}</refmiscinfo>
|
||||
<refmiscinfo class="manual">Git Manual</refmiscinfo>
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
|
||||
@@ -263,6 +263,12 @@ You probably do not need to adjust this value.
|
||||
+
|
||||
Common unit suffixes of 'k', 'm', or 'g' are supported.
|
||||
|
||||
core.excludeFile::
|
||||
In addition to '.gitignore' (per-directory) and
|
||||
'.git/info/exclude', git looks into this file for patterns
|
||||
of files which are not meant to be tracked. See
|
||||
gitlink:gitignore[5].
|
||||
|
||||
alias.*::
|
||||
Command aliases for the gitlink:git[1] command wrapper - e.g.
|
||||
after defining "alias.last = cat-file commit HEAD", the invocation
|
||||
@@ -282,6 +288,13 @@ apply.whitespace::
|
||||
Tells `git-apply` how to handle whitespaces, in the same way
|
||||
as the '--whitespace' option. See gitlink:git-apply[1].
|
||||
|
||||
branch.autosetupmerge::
|
||||
Tells `git-branch` and `git-checkout` to setup new branches
|
||||
so that gitlink:git-pull[1] will appropriately merge from that
|
||||
remote branch. Note that even if this option is not set,
|
||||
this behavior can be chosen per-branch using the `--track`
|
||||
and `--no-track` options. This option defaults to false.
|
||||
|
||||
branch.<name>.remote::
|
||||
When in branch <name>, it tells `git fetch` which remote to fetch.
|
||||
If this option is not given, `git fetch` defaults to remote "origin".
|
||||
|
||||
@@ -9,15 +9,15 @@ git-config - Get and set repository or global options
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git-config' [--system | --global] [type] name [value [value_regex]]
|
||||
'git-config' [--system | --global] [type] --add name value
|
||||
'git-config' [--system | --global] [type] --replace-all name [value [value_regex]]
|
||||
'git-config' [--system | --global] name [value [value_regex]]
|
||||
'git-config' [--system | --global] --add name value
|
||||
'git-config' [--system | --global] --replace-all name [value [value_regex]]
|
||||
'git-config' [--system | --global] [type] --get name [value_regex]
|
||||
'git-config' [--system | --global] [type] --get-all name [value_regex]
|
||||
'git-config' [--system | --global] [type] --unset name [value_regex]
|
||||
'git-config' [--system | --global] [type] --unset-all name [value_regex]
|
||||
'git-config' [--system | --global] [type] --rename-section old_name new_name
|
||||
'git-config' [--system | --global] [type] --remove-section name
|
||||
'git-config' [--system | --global] --unset name [value_regex]
|
||||
'git-config' [--system | --global] --unset-all name [value_regex]
|
||||
'git-config' [--system | --global] --rename-section old_name new_name
|
||||
'git-config' [--system | --global] --remove-section name
|
||||
'git-config' [--system | --global] -l | --list
|
||||
|
||||
DESCRIPTION
|
||||
@@ -31,12 +31,13 @@ If you want to update or unset an option which can occur on multiple
|
||||
lines, a POSIX regexp `value_regex` needs to be given. Only the
|
||||
existing values that match the regexp are updated or unset. If
|
||||
you want to handle the lines that do *not* match the regex, just
|
||||
prepend a single exclamation mark in front (see EXAMPLES).
|
||||
prepend a single exclamation mark in front (see also <<EXAMPLES>>).
|
||||
|
||||
The type specifier can be either '--int' or '--bool', which will make
|
||||
'git-config' ensure that the variable(s) are of the given type and
|
||||
convert the value to the canonical form (simple decimal number for int,
|
||||
a "true" or "false" string for bool). If no type specifier is passed,
|
||||
a "true" or "false" string for bool). Type specifiers currently only
|
||||
take effect for reading operations. If no type specifier is passed,
|
||||
no checks or transformations are performed on the value.
|
||||
|
||||
This command will fail if:
|
||||
@@ -47,7 +48,7 @@ This command will fail if:
|
||||
. the section or key is invalid,
|
||||
. you try to unset an option which does not exist,
|
||||
. you try to unset/set an option for which multiple lines match, or
|
||||
. you use --global option without $HOME being properly set.
|
||||
. you use '--global' option without $HOME being properly set.
|
||||
|
||||
|
||||
OPTIONS
|
||||
@@ -74,11 +75,22 @@ OPTIONS
|
||||
Like --get-all, but interprets the name as a regular expression.
|
||||
|
||||
--global::
|
||||
Use global ~/.gitconfig file rather than the repository .git/config.
|
||||
For writing options: write to global ~/.gitconfig file rather than
|
||||
the repository .git/config.
|
||||
+
|
||||
For reading options: read only from global ~/.gitconfig rather than
|
||||
from all available files.
|
||||
+
|
||||
See also <<FILES>>.
|
||||
|
||||
--system::
|
||||
Use system-wide $(prefix)/etc/gitconfig rather than the repository
|
||||
.git/config.
|
||||
For writing options: write to system-wide $(prefix)/etc/gitconfig
|
||||
rather than the repository .git/config.
|
||||
+
|
||||
For reading options: read only from system-wide $(prefix)/etc/gitconfig
|
||||
rather than from all available files.
|
||||
+
|
||||
See also <<FILES>>.
|
||||
|
||||
--remove-section::
|
||||
Remove the given section from the configuration file.
|
||||
@@ -105,21 +117,64 @@ OPTIONS
|
||||
by 1024, 1048576, or 1073741824 prior to output.
|
||||
|
||||
|
||||
[[FILES]]
|
||||
FILES
|
||||
-----
|
||||
|
||||
There are three files where git-config will search for configuration
|
||||
options:
|
||||
|
||||
.git/config::
|
||||
Repository specific configuration file. (The filename is
|
||||
of course relative to the repository root, not the working
|
||||
directory.)
|
||||
|
||||
~/.gitconfig::
|
||||
User-specific configuration file. Also called "global"
|
||||
configuration file.
|
||||
|
||||
$(prefix)/etc/gitconfig::
|
||||
System-wide configuration file.
|
||||
|
||||
If no further options are given, all reading options will read all of these
|
||||
files that are available. If the global or the system-wide configuration
|
||||
file are not available they will be ignored. If the repository configuration
|
||||
file is not available or readable, git-config will exit with a non-zero
|
||||
error code. However, in neither case will an error message be issued.
|
||||
|
||||
All writing options will per default write to the repository specific
|
||||
configuration file. Note that this also affects options like '--replace-all'
|
||||
and '--unset'. *git-config will only ever change one file at a time*.
|
||||
|
||||
You can override these rules either by command line options or by environment
|
||||
variables. The '--global' and the '--system' options will limit the file used
|
||||
to the global or system-wide file respectively. The GIT_CONFIG environment
|
||||
variable has a similar effect, but you can specify any filename you want.
|
||||
|
||||
The GIT_CONFIG_LOCAL environment variable on the other hand only changes
|
||||
the name used instead of the repository configuration file. The global and
|
||||
the system-wide configuration files will still be read. (For writing options
|
||||
this will obviously result in the same behavior as using GIT_CONFIG.)
|
||||
|
||||
|
||||
ENVIRONMENT
|
||||
-----------
|
||||
|
||||
GIT_CONFIG::
|
||||
Take the configuration from the given file instead of .git/config.
|
||||
Using the "--global" option forces this to ~/.gitconfig.
|
||||
Using the "--global" option forces this to ~/.gitconfig. Using the
|
||||
"--system" option forces this to $(prefix)/etc/gitconfig.
|
||||
|
||||
GIT_CONFIG_LOCAL::
|
||||
Currently the same as $GIT_CONFIG; when Git will support global
|
||||
configuration files, this will cause it to take the configuration
|
||||
from the global configuration file in addition to the given file.
|
||||
Take the configuration from the given file instead if .git/config.
|
||||
Still read the global and the system-wide configuration files, though.
|
||||
|
||||
See also <<FILES>>.
|
||||
|
||||
|
||||
EXAMPLE
|
||||
-------
|
||||
[[EXAMPLES]]
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
Given a .git/config like this:
|
||||
|
||||
|
||||
@@ -46,16 +46,28 @@ INSTALLATION
|
||||
cvspserver stream tcp nowait nobody git-cvsserver pserver
|
||||
|
||||
------
|
||||
Note: In some cases, you need to pass the 'pserver' argument twice for
|
||||
git-cvsserver to see it. So the line would look like
|
||||
Note: Some inetd servers let you specify the name of the executable
|
||||
independently of the value of argv[0] (i.e. the name the program assumes
|
||||
it was executed with). In this case the correct line in /etc/inetd.conf
|
||||
looks like
|
||||
|
||||
------
|
||||
cvspserver stream tcp nowait nobody git-cvsserver pserver pserver
|
||||
cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver
|
||||
|
||||
------
|
||||
No special setup is needed for SSH access, other than having GIT tools
|
||||
in the PATH. If you have clients that do not accept the CVS_SERVER
|
||||
env variable, you can rename git-cvsserver to cvs.
|
||||
environment variable, you can rename git-cvsserver to cvs.
|
||||
|
||||
Note: Newer cvs versions (>= 1.12.11) also support specifying
|
||||
CVS_SERVER directly in CVSROOT like
|
||||
|
||||
------
|
||||
cvs -d ":ext;CVS_SERVER=git-cvsserver:user@server/path/repo.git" co <HEAD_name>
|
||||
------
|
||||
This has the advantage that it will be saved in your 'CVS/Root' files and
|
||||
you don't need to worry about always setting the correct environment
|
||||
variable.
|
||||
--
|
||||
2. For each repo that you want accessible from CVS you need to edit config in
|
||||
the repo and add the following section.
|
||||
@@ -74,7 +86,7 @@ write access to the log file and to the database (see
|
||||
SSH, the users of course also need write access to the git repository itself.
|
||||
|
||||
[[configaccessmethod]]
|
||||
All configuration variables can also be overriden for a specific method of
|
||||
All configuration variables can also be overridden for a specific method of
|
||||
access. Valid method names are "ext" (for SSH access) and "pserver". The
|
||||
following example configuration would disable pserver access while still
|
||||
allowing access over SSH.
|
||||
@@ -116,7 +128,7 @@ Database Backend
|
||||
|
||||
git-cvsserver uses one database per git head (i.e. CVS module) to
|
||||
store information about the repository for faster access. The
|
||||
database doesn't contain any persitent data and can be completly
|
||||
database doesn't contain any persistent data and can be completely
|
||||
regenerated from the git repository at any time. The database
|
||||
needs to be updated (i.e. written to) after every commit.
|
||||
|
||||
|
||||
@@ -124,7 +124,7 @@ which case it outputs:
|
||||
detailed information on unmerged paths.
|
||||
|
||||
For an unmerged path, instead of recording a single mode/SHA1 pair,
|
||||
the dircache records up to three such pairs; one from tree O in stage
|
||||
the index records up to three such pairs; one from tree O in stage
|
||||
1, A in stage 2, and B in stage 3. This information can be used by
|
||||
the user (or the porcelain) to see what should eventually be recorded at the
|
||||
path. (see git-read-tree for more information on state)
|
||||
@@ -139,46 +139,24 @@ Exclude Patterns
|
||||
|
||||
'git-ls-files' can use a list of "exclude patterns" when
|
||||
traversing the directory tree and finding files to show when the
|
||||
flags --others or --ignored are specified.
|
||||
flags --others or --ignored are specified. gitlink:gitignore[5]
|
||||
specifies the format of exclude patterns.
|
||||
|
||||
These exclude patterns come from these places:
|
||||
These exclude patterns come from these places, in order:
|
||||
|
||||
1. command line flag --exclude=<pattern> specifies a single
|
||||
pattern.
|
||||
1. The command line flag --exclude=<pattern> specifies a
|
||||
single pattern. Patterns are ordered in the same order
|
||||
they appear in the command line.
|
||||
|
||||
2. command line flag --exclude-from=<file> specifies a list of
|
||||
patterns stored in a file.
|
||||
2. The command line flag --exclude-from=<file> specifies a
|
||||
file containing a list of patterns. Patterns are ordered
|
||||
in the same order they appear in the file.
|
||||
|
||||
3. command line flag --exclude-per-directory=<name> specifies
|
||||
a name of the file in each directory 'git-ls-files'
|
||||
examines, and if exists, its contents are used as an
|
||||
additional list of patterns.
|
||||
|
||||
An exclude pattern file used by (2) and (3) contains one pattern
|
||||
per line. A line that starts with a '#' can be used as comment
|
||||
for readability.
|
||||
|
||||
There are three lists of patterns that are in effect at a given
|
||||
time. They are built and ordered in the following way:
|
||||
|
||||
* --exclude=<pattern> from the command line; patterns are
|
||||
ordered in the same order as they appear on the command line.
|
||||
|
||||
* lines read from --exclude-from=<file>; patterns are ordered
|
||||
in the same order as they appear in the file.
|
||||
|
||||
* When --exclude-per-directory=<name> is specified, upon
|
||||
entering a directory that has such a file, its contents are
|
||||
appended at the end of the current "list of patterns". They
|
||||
are popped off when leaving the directory.
|
||||
|
||||
Each pattern in the pattern list specifies "a match pattern" and
|
||||
optionally the fate; either a file that matches the pattern is
|
||||
considered excluded or included. A filename is matched against
|
||||
the patterns in the three lists; the --exclude-from list is
|
||||
checked first, then the --exclude-per-directory list, and then
|
||||
finally the --exclude list. The last match determines its fate.
|
||||
If there is no match in the three lists, the fate is "included".
|
||||
examines, normally `.gitignore`. Files in deeper
|
||||
directories take precedence. Patterns are ordered in the
|
||||
same order they appear in the files.
|
||||
|
||||
A pattern specified on the command line with --exclude or read
|
||||
from the file specified with --exclude-from is relative to the
|
||||
@@ -186,58 +164,9 @@ top of the directory tree. A pattern read from a file specified
|
||||
by --exclude-per-directory is relative to the directory that the
|
||||
pattern file appears in.
|
||||
|
||||
An exclude pattern is of the following format:
|
||||
|
||||
- an optional prefix '!' which means that the fate this pattern
|
||||
specifies is "include", not the usual "exclude"; the
|
||||
remainder of the pattern string is interpreted according to
|
||||
the following rules.
|
||||
|
||||
- if it does not contain a slash '/', it is a shell glob
|
||||
pattern and used to match against the filename without
|
||||
leading directories.
|
||||
|
||||
- otherwise, it is a shell glob pattern, suitable for
|
||||
consumption by fnmatch(3) with FNM_PATHNAME flag. I.e. a
|
||||
slash in the pattern must match a slash in the pathname.
|
||||
"Documentation/\*.html" matches "Documentation/git.html" but
|
||||
not "ppc/ppc.html". As a natural exception, "/*.c" matches
|
||||
"cat-file.c" but not "mozilla-sha1/sha1.c".
|
||||
|
||||
An example:
|
||||
|
||||
--------------------------------------------------------------
|
||||
$ cat .git/info/exclude
|
||||
# ignore objects and archives, anywhere in the tree.
|
||||
*.[oa]
|
||||
$ cat Documentation/.gitignore
|
||||
# ignore generated html files,
|
||||
*.html
|
||||
# except foo.html which is maintained by hand
|
||||
!foo.html
|
||||
$ git-ls-files --ignored \
|
||||
--exclude='Documentation/*.[0-9]' \
|
||||
--exclude-from=.git/info/exclude \
|
||||
--exclude-per-directory=.gitignore
|
||||
--------------------------------------------------------------
|
||||
|
||||
Another example:
|
||||
|
||||
--------------------------------------------------------------
|
||||
$ cat .gitignore
|
||||
vmlinux*
|
||||
$ ls arch/foo/kernel/vm*
|
||||
arch/foo/kernel/vmlinux.lds.S
|
||||
$ echo '!/vmlinux*' >arch/foo/kernel/.gitignore
|
||||
--------------------------------------------------------------
|
||||
|
||||
The second .gitignore keeps `arch/foo/kernel/vmlinux.lds.S` file
|
||||
from getting ignored.
|
||||
|
||||
|
||||
See Also
|
||||
--------
|
||||
gitlink:git-read-tree[1]
|
||||
gitlink:git-read-tree[1], gitlink:gitignore[5]
|
||||
|
||||
|
||||
Author
|
||||
@@ -246,7 +175,7 @@ Written by Linus Torvalds <torvalds@osdl.org>
|
||||
|
||||
Documentation
|
||||
--------------
|
||||
Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
|
||||
Documentation by David Greaves, Junio C Hamano, Josh Triplett, and the git-list <git@vger.kernel.org>.
|
||||
|
||||
GIT
|
||||
---
|
||||
|
||||
@@ -341,7 +341,8 @@ have finished your work-in-progress), attempt the merge again.
|
||||
|
||||
See Also
|
||||
--------
|
||||
gitlink:git-write-tree[1]; gitlink:git-ls-files[1]
|
||||
gitlink:git-write-tree[1]; gitlink:git-ls-files[1];
|
||||
gitlink:gitignore[5]
|
||||
|
||||
|
||||
Author
|
||||
|
||||
@@ -42,6 +42,9 @@ mean the same thing and the latter is kept for backward
|
||||
compatibility) and `color.status.<slot>` configuration variables
|
||||
to colorize its output.
|
||||
|
||||
See Also
|
||||
--------
|
||||
gitlink:gitignore[5]
|
||||
|
||||
Author
|
||||
------
|
||||
|
||||
116
Documentation/gitignore.txt
Normal file
116
Documentation/gitignore.txt
Normal file
@@ -0,0 +1,116 @@
|
||||
gitignore(5)
|
||||
============
|
||||
|
||||
NAME
|
||||
----
|
||||
gitignore - Specifies intentionally untracked files to ignore
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
$GIT_DIR/info/exclude, .gitignore
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
A `gitignore` file specifies intentionally untracked files that
|
||||
git should ignore. Each line in a `gitignore` file specifies a
|
||||
pattern.
|
||||
|
||||
When deciding whether to ignore a path, git normally checks
|
||||
`gitignore` patterns from multiple sources, with the following
|
||||
order of precedence:
|
||||
|
||||
* Patterns read from the file specified by the configuration
|
||||
variable 'core.excludesfile'.
|
||||
|
||||
* Patterns read from `$GIT_DIR/info/exclude`.
|
||||
|
||||
* Patterns read from a `.gitignore` file in the same directory
|
||||
as the path, or in any parent directory, ordered from the
|
||||
deepest such file to a file in the root of the repository.
|
||||
These patterns match relative to the location of the
|
||||
`.gitignore` file. A project normally includes such
|
||||
`.gitignore` files in its repository, containing patterns for
|
||||
files generated as part of the project build.
|
||||
|
||||
The underlying git plumbing tools, such as
|
||||
gitlink:git-ls-files[1] and gitlink:git-read-tree[1], read
|
||||
`gitignore` patterns specified by command-line options, or from
|
||||
files specified by command-line options. Higher-level git
|
||||
tools, such as gitlink:git-status[1] and gitlink:git-add[1],
|
||||
use patterns from the sources specified above.
|
||||
|
||||
Patterns have the following format:
|
||||
|
||||
- A blank line matches no files, so it can serve as a separator
|
||||
for readability.
|
||||
|
||||
- A line starting with # serves as a comment.
|
||||
|
||||
- An optional prefix '!' which negates the pattern; any
|
||||
matching file excluded by a previous pattern will become
|
||||
included again.
|
||||
|
||||
- If the pattern does not contain a slash '/', git treats it as
|
||||
a shell glob pattern and checks for a match against the
|
||||
pathname without leading directories.
|
||||
|
||||
- Otherwise, git treats the pattern as a shell glob suitable
|
||||
for consumption by fnmatch(3) with the FNM_PATHNAME flag:
|
||||
wildcards in the pattern will not match a / in the pathname.
|
||||
For example, "Documentation/\*.html" matches
|
||||
"Documentation/git.html" but not
|
||||
"Documentation/ppc/ppc.html". A leading slash matches the
|
||||
beginning of the pathname; for example, "/*.c" matches
|
||||
"cat-file.c" but not "mozilla-sha1/sha1.c".
|
||||
|
||||
An example:
|
||||
|
||||
--------------------------------------------------------------
|
||||
$ git-status
|
||||
[...]
|
||||
# Untracked files:
|
||||
[...]
|
||||
# Documentation/foo.html
|
||||
# Documentation/gitignore.html
|
||||
# file.o
|
||||
# lib.a
|
||||
# src/internal.o
|
||||
[...]
|
||||
$ cat .git/info/exclude
|
||||
# ignore objects and archives, anywhere in the tree.
|
||||
*.[oa]
|
||||
$ cat Documentation/.gitignore
|
||||
# ignore generated html files,
|
||||
*.html
|
||||
# except foo.html which is maintained by hand
|
||||
!foo.html
|
||||
$ git-status
|
||||
[...]
|
||||
# Untracked files:
|
||||
[...]
|
||||
# Documentation/foo.html
|
||||
[...]
|
||||
--------------------------------------------------------------
|
||||
|
||||
Another example:
|
||||
|
||||
--------------------------------------------------------------
|
||||
$ cat .gitignore
|
||||
vmlinux*
|
||||
$ ls arch/foo/kernel/vm*
|
||||
arch/foo/kernel/vmlinux.lds.S
|
||||
$ echo '!/vmlinux*' >arch/foo/kernel/.gitignore
|
||||
--------------------------------------------------------------
|
||||
|
||||
The second .gitignore prevents git from ignoring
|
||||
`arch/foo/kernel/vmlinux.lds.S`.
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
Documentation by David Greaves, Junio C Hamano, Josh Triplett,
|
||||
Frank Lichtenheld, and the git-list <git@vger.kernel.org>.
|
||||
|
||||
GIT
|
||||
---
|
||||
Part of the gitlink:git[7] suite
|
||||
@@ -10,7 +10,7 @@ GIT Glossary
|
||||
A bare repository is normally an appropriately
|
||||
named <<def_directory,directory>> with a `.git` suffix that does not
|
||||
have a locally checked-out copy of any of the files under
|
||||
<<def_revision,revision>> control. That is, all of the `git`
|
||||
revision control. That is, all of the `git`
|
||||
administrative and control files that would normally be present in the
|
||||
hidden `.git` sub-directory are directly present in the
|
||||
`repository.git` directory instead,
|
||||
@@ -37,7 +37,7 @@ GIT Glossary
|
||||
[[def_chain]]chain::
|
||||
A list of objects, where each <<def_object,object>> in the list contains
|
||||
a reference to its successor (for example, the successor of a
|
||||
<<def_commit,commit>> could be one of its parents).
|
||||
<<def_commit,commit>> could be one of its <<def_parent,parents>>).
|
||||
|
||||
[[def_changeset]]changeset::
|
||||
BitKeeper/cvsps speak for "<<def_commit,commit>>". Since git does not
|
||||
@@ -77,10 +77,10 @@ to point at the new commit.
|
||||
|
||||
[[def_commit_object]]commit object::
|
||||
An <<def_object,object>> which contains the information about a
|
||||
particular <<def_revision,revision>>, such as parents, committer,
|
||||
particular <<def_revision,revision>>, such as <<def_parent,parents>>, committer,
|
||||
author, date and the <<def_tree_object,tree object>> which corresponds
|
||||
to the top <<def_directory,directory>> of the stored
|
||||
<<def_revision,revision>>.
|
||||
revision.
|
||||
|
||||
[[def_core_git]]core git::
|
||||
Fundamental data structures and utilities of git. Exposes only limited
|
||||
@@ -101,19 +101,19 @@ to point at the new commit.
|
||||
|
||||
[[def_detached_HEAD]]detached HEAD::
|
||||
Normally the <<def_HEAD,HEAD>> stores the name of a
|
||||
<<def_branch,branch>>. However, git also allows you to check
|
||||
out an arbitrary commit that isn't necessarily the tip of any
|
||||
<<def_branch,branch>>. However, git also allows you to <<def_checkout,check out>>
|
||||
an arbitrary <<def_commit,commit>> that isn't necessarily the tip of any
|
||||
particular branch. In this case HEAD is said to be "detached".
|
||||
|
||||
[[def_dircache]]dircache::
|
||||
You are *waaaaay* behind.
|
||||
You are *waaaaay* behind. See <<def_index,index>>.
|
||||
|
||||
[[def_directory]]directory::
|
||||
The list you get with "ls" :-)
|
||||
|
||||
[[def_dirty]]dirty::
|
||||
A <<def_working_tree,working tree>> is said to be "dirty" if
|
||||
it contains modifications which have not been committed to the current
|
||||
it contains modifications which have not been <<def_commit,committed>> to the current
|
||||
<<def_branch,branch>>.
|
||||
|
||||
[[def_ent]]ent::
|
||||
@@ -121,6 +121,10 @@ to point at the new commit.
|
||||
`http://en.wikipedia.org/wiki/Ent_(Middle-earth)` for an in-depth
|
||||
explanation. Avoid this term, not to confuse people.
|
||||
|
||||
[[def_evil_merge]]evil merge::
|
||||
An evil merge is a <<def_merge,merge>> that introduces changes that
|
||||
do not appear in any <<def_parent,parent>>.
|
||||
|
||||
[[def_fast_forward]]fast forward::
|
||||
A fast-forward is a special type of <<def_merge,merge>> where you have a
|
||||
<<def_revision,revision>> and you are "merging" another
|
||||
@@ -149,7 +153,7 @@ to point at the new commit.
|
||||
[[def_grafts]]grafts::
|
||||
Grafts enables two otherwise different lines of development to be joined
|
||||
together by recording fake ancestry information for commits. This way
|
||||
you can make git pretend the set of parents a <<def_commit,commit>> has
|
||||
you can make git pretend the set of <<def_parent,parents>> a <<def_commit,commit>> has
|
||||
is different from what was recorded when the commit was
|
||||
created. Configured via the `.git/info/grafts` file.
|
||||
|
||||
@@ -157,13 +161,13 @@ to point at the new commit.
|
||||
In git's context, synonym to <<def_object_name,object name>>.
|
||||
|
||||
[[def_head]]head::
|
||||
A named reference to the <<def_commit,commit>> at the tip of a
|
||||
A <<def_ref,named reference>> to the <<def_commit,commit>> at the tip of a
|
||||
<<def_branch,branch>>. Heads are stored in
|
||||
`$GIT_DIR/refs/heads/`, except when using packed refs. (See
|
||||
gitlink:git-pack-refs[1].)
|
||||
|
||||
[[def_HEAD]]HEAD::
|
||||
The current branch. In more detail: Your <<def_working_tree,
|
||||
The current <<def_branch,branch>>. In more detail: Your <<def_working_tree,
|
||||
working tree>> is normally derived from the state of the tree
|
||||
referred to by HEAD. HEAD is a reference to one of the
|
||||
<<def_head,heads>> in your repository, except when using a
|
||||
@@ -179,15 +183,15 @@ to point at the new commit.
|
||||
checking. Typically, the hooks allow for a command to be pre-verified
|
||||
and potentially aborted, and allow for a post-notification after the
|
||||
operation is done. The hook scripts are found in the
|
||||
`$GIT_DIR/hooks/` <<def_directory,directory>>, and are enabled by simply
|
||||
`$GIT_DIR/hooks/` directory, and are enabled by simply
|
||||
making them executable.
|
||||
|
||||
[[def_index]]index::
|
||||
A collection of files with stat information, whose contents are stored
|
||||
as objects. The index is a stored version of your working
|
||||
<<def_tree,tree>>. Truth be told, it can also contain a second, and even
|
||||
a third version of a <<def_working_tree,working tree>>, which are used
|
||||
when merging.
|
||||
as objects. The index is a stored version of your
|
||||
<<def_working_tree,working tree>>. Truth be told, it can also contain a second, and even
|
||||
a third version of a working tree, which are used
|
||||
when <<def_merge,merging>>.
|
||||
|
||||
[[def_index_entry]]index entry::
|
||||
The information regarding a particular file, stored in the
|
||||
@@ -249,16 +253,16 @@ This commit is referred to as a "merge commit", or sometimes just a
|
||||
describing the type of an <<def_object,object>>.
|
||||
|
||||
[[def_octopus]]octopus::
|
||||
To <<def_merge,merge>> more than two branches. Also denotes an
|
||||
To <<def_merge,merge>> more than two <<def_branch,branches>>. Also denotes an
|
||||
intelligent predator.
|
||||
|
||||
[[def_origin]]origin::
|
||||
The default upstream <<def_repository,repository>>. Most projects have
|
||||
at least one upstream project which they track. By default
|
||||
'origin' is used for that purpose. New upstream updates
|
||||
will be fetched into remote tracking branches named
|
||||
will be fetched into remote <<def_tracking_branch,tracking branches>> named
|
||||
origin/name-of-upstream-branch, which you can see using
|
||||
"git <<def_branch,branch>> -r".
|
||||
"`git branch -r`".
|
||||
|
||||
[[def_pack]]pack::
|
||||
A set of objects which have been compressed into one file (to save space
|
||||
@@ -327,7 +331,7 @@ This commit is referred to as a "merge commit", or sometimes just a
|
||||
`$GIT_DIR/refs/`.
|
||||
|
||||
[[def_refspec]]refspec::
|
||||
A <<def_refspec,refspec>> is used by <<def_fetch,fetch>> and
|
||||
A "refspec" is used by <<def_fetch,fetch>> and
|
||||
<<def_push,push>> to describe the mapping between remote
|
||||
<<def_ref,ref>> and local ref. They are combined with a colon in
|
||||
the format <src>:<dst>, preceded by an optional plus sign, +.
|
||||
@@ -340,11 +344,12 @@ This commit is referred to as a "merge commit", or sometimes just a
|
||||
gitlink:git-push[1]
|
||||
|
||||
[[def_repository]]repository::
|
||||
A collection of refs together with an
|
||||
A collection of <<def_ref,refs>> together with an
|
||||
<<def_object_database,object database>> containing all objects
|
||||
which are <<def_reachable,reachable>> from the refs, possibly
|
||||
accompanied by meta data from one or more porcelains. A
|
||||
repository can share an object database with other repositories.
|
||||
accompanied by meta data from one or more <<def_porcelain,porcelains>>. A
|
||||
repository can share an object database with other repositories
|
||||
via <<def_alternate_object_database,alternates mechanism>>.
|
||||
|
||||
[[def_resolve]]resolve::
|
||||
The action of fixing up manually what a failed automatic
|
||||
@@ -366,8 +371,8 @@ This commit is referred to as a "merge commit", or sometimes just a
|
||||
Synonym for <<def_object_name,object name>>.
|
||||
|
||||
[[def_shallow_repository]]shallow repository::
|
||||
A shallow repository has an incomplete
|
||||
history some of whose commits have parents cauterized away (in other
|
||||
A shallow <<def_repository,repository>> has an incomplete
|
||||
history some of whose <<def_commit,commits>> have <<def_parent,parents>> cauterized away (in other
|
||||
words, git is told to pretend that these commits do not have the
|
||||
parents, even though they are recorded in the <<def_commit_object,commit
|
||||
object>>). This is sometimes useful when you are interested only in the
|
||||
@@ -385,7 +390,7 @@ This commit is referred to as a "merge commit", or sometimes just a
|
||||
command.
|
||||
|
||||
[[def_tag]]tag::
|
||||
A <<def_ref,ref>> pointing to a tag or
|
||||
A <<def_ref,ref>> pointing to a <<def_tag_object,tag>> or
|
||||
<<def_commit_object,commit object>>. In contrast to a <<def_head,head>>,
|
||||
a tag is not changed by a <<def_commit,commit>>. Tags (not
|
||||
<<def_tag_object,tag objects>>) are stored in `$GIT_DIR/refs/tags/`. A
|
||||
@@ -398,8 +403,7 @@ This commit is referred to as a "merge commit", or sometimes just a
|
||||
An <<def_object,object>> containing a <<def_ref,ref>> pointing to
|
||||
another object, which can contain a message just like a
|
||||
<<def_commit_object,commit object>>. It can also contain a (PGP)
|
||||
signature, in which case it is called a "signed <<def_tag_object,tag
|
||||
object>>".
|
||||
signature, in which case it is called a "signed tag object".
|
||||
|
||||
[[def_topic_branch]]topic branch::
|
||||
A regular git <<def_branch,branch>> that is used by a developer to
|
||||
@@ -418,7 +422,7 @@ This commit is referred to as a "merge commit", or sometimes just a
|
||||
|
||||
[[def_tree]]tree::
|
||||
Either a <<def_working_tree,working tree>>, or a <<def_tree_object,tree
|
||||
object>> together with the dependent blob and tree objects
|
||||
object>> together with the dependent <<def_blob_object,blob>> and tree objects
|
||||
(i.e. a stored representation of a working tree).
|
||||
|
||||
[[def_tree_object]]tree object::
|
||||
|
||||
@@ -155,8 +155,7 @@ info/exclude::
|
||||
exclude pattern list. `.gitignore` is the per-directory
|
||||
ignore file. `git status`, `git add`, `git rm` and `git
|
||||
clean` look at it but the core git commands do not look
|
||||
at it. See also: gitlink:git-ls-files[1] `--exclude-from`
|
||||
and `--exclude-per-directory`.
|
||||
at it. See also: gitlink:gitignore[5].
|
||||
|
||||
remotes::
|
||||
Stores shorthands to be used to give URL and default
|
||||
|
||||
@@ -872,7 +872,7 @@ Obviously, endless variations are possible; for example, to see all
|
||||
commits reachable from some head but not from any tag in the repository:
|
||||
|
||||
-------------------------------------------------
|
||||
$ gitk ($ git show-ref --heads ) --not $( git show-ref --tags )
|
||||
$ gitk $( git show-ref --heads ) --not $( git show-ref --tags )
|
||||
-------------------------------------------------
|
||||
|
||||
(See gitlink:git-rev-parse[1] for explanations of commit-selecting
|
||||
@@ -1103,12 +1103,12 @@ showing up in the output of "`git status`", etc.
|
||||
|
||||
Git therefore provides "exclude patterns" for telling git which files to
|
||||
actively ignore. Exclude patterns are thoroughly explained in the
|
||||
"Exclude Patterns" section of the gitlink:git-ls-files[1] manual page,
|
||||
but the heart of the concept is simply a list of files which git should
|
||||
ignore. Entries in the list may contain globs to specify multiple files,
|
||||
or may be prefixed by "`!`" to explicitly include (un-ignore) a previously
|
||||
excluded (ignored) file (i.e. later exclude patterns override earlier ones).
|
||||
The following example should illustrate such patterns:
|
||||
gitlink:gitignore[5] manual page, but the heart of the concept is simply
|
||||
a list of files which git should ignore. Entries in the list may contain
|
||||
globs to specify multiple files, or may be prefixed by "`!`" to
|
||||
explicitly include (un-ignore) a previously excluded (ignored) file
|
||||
(i.e. later exclude patterns override earlier ones). The following
|
||||
example should illustrate such patterns:
|
||||
|
||||
-------------------------------------------------
|
||||
# Lines starting with '#' are considered comments.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
GVF=GIT-VERSION-FILE
|
||||
DEF_VER=v1.5.2.GIT
|
||||
DEF_VER=v1.5.2.1.GIT
|
||||
|
||||
LF='
|
||||
'
|
||||
|
||||
4
Makefile
4
Makefile
@@ -235,7 +235,7 @@ endif
|
||||
|
||||
# ... and all the rest that could be moved out of bindir to gitexecdir
|
||||
PROGRAMS = \
|
||||
git-fetch-pack$X git-fsck$X \
|
||||
git-fetch-pack$X \
|
||||
git-hash-object$X git-index-pack$X git-local-fetch$X \
|
||||
git-fast-import$X \
|
||||
git-merge-index$X git-mktag$X git-mktree$X git-patch-id$X \
|
||||
@@ -244,7 +244,7 @@ PROGRAMS = \
|
||||
git-show-index$X git-ssh-fetch$X \
|
||||
git-ssh-upload$X git-unpack-file$X \
|
||||
git-update-server-info$X \
|
||||
git-upload-pack$X git-verify-pack$X \
|
||||
git-upload-pack$X \
|
||||
git-pack-redundant$X git-var$X \
|
||||
git-merge-tree$X \
|
||||
git-merge-recursive$X \
|
||||
|
||||
2
RelNotes
2
RelNotes
@@ -1 +1 @@
|
||||
Documentation/RelNotes-1.5.2.txt
|
||||
Documentation/RelNotes-1.5.2.1.txt
|
||||
2
base85.c
2
base85.c
@@ -66,7 +66,7 @@ int decode_85(char *dst, const char *buffer, int len)
|
||||
*/
|
||||
if (0x03030303 < acc ||
|
||||
0xffffffff - de < (acc *= 85))
|
||||
error("invalid base85 sequence %.5s", buffer-5);
|
||||
return error("invalid base85 sequence %.5s", buffer-5);
|
||||
acc += de;
|
||||
say1(" %08x", acc);
|
||||
|
||||
|
||||
@@ -623,9 +623,10 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
|
||||
(rename && force_create))
|
||||
usage(builtin_branch_usage);
|
||||
|
||||
head = xstrdup(resolve_ref("HEAD", head_sha1, 0, NULL));
|
||||
head = resolve_ref("HEAD", head_sha1, 0, NULL);
|
||||
if (!head)
|
||||
die("Failed to resolve HEAD as a valid ref.");
|
||||
head = xstrdup(head);
|
||||
if (!strcmp(head, "HEAD")) {
|
||||
detached = 1;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#include "tag.h"
|
||||
#include "refs.h"
|
||||
|
||||
#define CUTOFF_DATE_SLOP 86400 /* one day */
|
||||
|
||||
static const char name_rev_usage[] =
|
||||
"git-name-rev [--tags | --refs=<pattern>] ( --all | --stdin | committish [committish...] )\n";
|
||||
|
||||
@@ -208,6 +210,8 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
|
||||
add_object_array((struct object *)commit, *argv, &revs);
|
||||
}
|
||||
|
||||
if (cutoff)
|
||||
cutoff = cutoff - CUTOFF_DATE_SLOP;
|
||||
for_each_ref(name_ref, &data);
|
||||
|
||||
if (transform_stdin) {
|
||||
|
||||
4
cache.h
4
cache.h
@@ -360,8 +360,8 @@ extern int legacy_loose_object(unsigned char *);
|
||||
extern int has_pack_file(const unsigned char *sha1);
|
||||
extern int has_pack_index(const unsigned char *sha1);
|
||||
|
||||
extern signed char hexval_table[256];
|
||||
static inline unsigned int hexval(unsigned int c)
|
||||
extern const signed char hexval_table[256];
|
||||
static inline unsigned int hexval(unsigned char c)
|
||||
{
|
||||
return hexval_table[c];
|
||||
}
|
||||
|
||||
10
commit.c
10
commit.c
@@ -511,12 +511,16 @@ static int add_rfc2047(char *buf, const char *line, int len,
|
||||
bp += i;
|
||||
for (i = 0; i < len; i++) {
|
||||
unsigned ch = line[i] & 0xFF;
|
||||
if (is_rfc2047_special(ch)) {
|
||||
/*
|
||||
* We encode ' ' using '=20' even though rfc2047
|
||||
* allows using '_' for readability. Unfortunately,
|
||||
* many programs do not understand this and just
|
||||
* leave the underscore in place.
|
||||
*/
|
||||
if (is_rfc2047_special(ch) || ch == ' ') {
|
||||
sprintf(bp, "=%02X", ch);
|
||||
bp += 3;
|
||||
}
|
||||
else if (ch == ' ')
|
||||
*bp++ = '_';
|
||||
else
|
||||
*bp++ = ch;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#
|
||||
# bash completion support for core Git.
|
||||
#
|
||||
# Copyright (C) 2006,2007 Shawn Pearce
|
||||
# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
|
||||
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
|
||||
# Distributed under the GNU General Public License, version 2.0.
|
||||
#
|
||||
# The contained completion routines provide support for completing:
|
||||
#
|
||||
@@ -11,6 +12,7 @@
|
||||
# *) .git/remotes file names
|
||||
# *) git 'subcommands'
|
||||
# *) tree paths within 'ref:path/to/file' expressions
|
||||
# *) common --long-options
|
||||
#
|
||||
# To use these routines:
|
||||
#
|
||||
@@ -31,6 +33,17 @@
|
||||
# are currently in a git repository. The %s token will be
|
||||
# the name of the current branch.
|
||||
#
|
||||
# To submit patches:
|
||||
#
|
||||
# *) Read Documentation/SubmittingPatches
|
||||
# *) Send all patches to the current maintainer:
|
||||
#
|
||||
# "Shawn O. Pearce" <spearce@spearce.org>
|
||||
#
|
||||
# *) Always CC the Git mailing list:
|
||||
#
|
||||
# git@vger.kernel.org
|
||||
#
|
||||
|
||||
__gitdir ()
|
||||
{
|
||||
@@ -262,6 +275,7 @@ __git_commands ()
|
||||
applypatch) : ask gittus;;
|
||||
archimport) : import;;
|
||||
cat-file) : plumbing;;
|
||||
check-attr) : plumbing;;
|
||||
check-ref-format) : plumbing;;
|
||||
commit-tree) : plumbing;;
|
||||
convert-objects) : plumbing;;
|
||||
@@ -269,10 +283,15 @@ __git_commands ()
|
||||
cvsimport) : import;;
|
||||
cvsserver) : daemon;;
|
||||
daemon) : daemon;;
|
||||
diff-files) : plumbing;;
|
||||
diff-index) : plumbing;;
|
||||
diff-tree) : plumbing;;
|
||||
fast-import) : import;;
|
||||
fsck-objects) : plumbing;;
|
||||
fetch--tool) : plumbing;;
|
||||
fetch-pack) : plumbing;;
|
||||
fmt-merge-msg) : plumbing;;
|
||||
for-each-ref) : plumbing;;
|
||||
hash-object) : plumbing;;
|
||||
http-*) : transport;;
|
||||
index-pack) : plumbing;;
|
||||
@@ -573,13 +592,13 @@ _git_log ()
|
||||
__gitcomp "
|
||||
--max-count= --max-age= --since= --after=
|
||||
--min-age= --before= --until=
|
||||
--root --not --topo-order --date-order
|
||||
--root --topo-order --date-order --reverse
|
||||
--no-merges
|
||||
--abbrev-commit --abbrev=
|
||||
--relative-date
|
||||
--author= --committer= --grep=
|
||||
--all-match
|
||||
--pretty= --name-status --name-only
|
||||
--pretty= --name-status --name-only --raw
|
||||
--not --all
|
||||
"
|
||||
return
|
||||
@@ -745,9 +764,11 @@ _git_config ()
|
||||
case "$cur" in
|
||||
--*)
|
||||
__gitcomp "
|
||||
--global --list --replace-all
|
||||
--global --system
|
||||
--list --replace-all
|
||||
--get --get-all --get-regexp
|
||||
--add --unset --unset-all
|
||||
--remove-section --rename-section
|
||||
"
|
||||
return
|
||||
;;
|
||||
@@ -766,7 +787,10 @@ _git_config ()
|
||||
remote.*.*)
|
||||
local pfx="${cur%.*}."
|
||||
cur="${cur##*.}"
|
||||
__gitcomp "url fetch push" "$pfx" "$cur"
|
||||
__gitcomp "
|
||||
url fetch push skipDefaultUpdate
|
||||
receivepack uploadpack tagopt
|
||||
" "$pfx" "$cur"
|
||||
return
|
||||
;;
|
||||
remote.*)
|
||||
@@ -816,6 +840,9 @@ _git_config ()
|
||||
format.headers
|
||||
gitcvs.enabled
|
||||
gitcvs.logfile
|
||||
gitcvs.allbinary
|
||||
gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
|
||||
gc.packrefs
|
||||
gc.reflogexpire
|
||||
gc.reflogexpireunreachable
|
||||
gc.rerereresolved
|
||||
@@ -832,9 +859,11 @@ _git_config ()
|
||||
i18n.commitEncoding
|
||||
i18n.logOutputEncoding
|
||||
log.showroot
|
||||
merge.tool
|
||||
merge.summary
|
||||
merge.verbosity
|
||||
pack.window
|
||||
pack.depth
|
||||
pull.octopus
|
||||
pull.twohead
|
||||
repack.useDeltaBaseOffset
|
||||
@@ -858,13 +887,13 @@ _git_remote ()
|
||||
while [ $c -lt $COMP_CWORD ]; do
|
||||
i="${COMP_WORDS[c]}"
|
||||
case "$i" in
|
||||
add|show|prune) command="$i"; break ;;
|
||||
add|show|prune|update) command="$i"; break ;;
|
||||
esac
|
||||
c=$((++c))
|
||||
done
|
||||
|
||||
if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
|
||||
__gitcomp "add show prune"
|
||||
__gitcomp "add show prune update"
|
||||
return
|
||||
fi
|
||||
|
||||
@@ -872,6 +901,18 @@ _git_remote ()
|
||||
show|prune)
|
||||
__gitcomp "$(__git_remotes)"
|
||||
;;
|
||||
update)
|
||||
local i c='' IFS=$'\n'
|
||||
for i in $(git --git-dir="$(__gitdir)" config --list); do
|
||||
case "$i" in
|
||||
remotes.*)
|
||||
i="${i#remotes.}"
|
||||
c="$c ${i/=*/}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
__gitcomp "$c"
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=()
|
||||
;;
|
||||
@@ -890,6 +931,26 @@ _git_reset ()
|
||||
__gitcomp "$(__git_refs)"
|
||||
}
|
||||
|
||||
_git_shortlog ()
|
||||
{
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
case "$cur" in
|
||||
--*)
|
||||
__gitcomp "
|
||||
--max-count= --max-age= --since= --after=
|
||||
--min-age= --before= --until=
|
||||
--no-merges
|
||||
--author= --committer= --grep=
|
||||
--all-match
|
||||
--not --all
|
||||
--numbered --summary
|
||||
"
|
||||
return
|
||||
;;
|
||||
esac
|
||||
__git_complete_revlist
|
||||
}
|
||||
|
||||
_git_show ()
|
||||
{
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
@@ -947,7 +1008,6 @@ _git ()
|
||||
commit) _git_commit ;;
|
||||
config) _git_config ;;
|
||||
diff) _git_diff ;;
|
||||
diff-tree) _git_diff_tree ;;
|
||||
fetch) _git_fetch ;;
|
||||
format-patch) _git_format_patch ;;
|
||||
gc) _git_gc ;;
|
||||
@@ -962,6 +1022,7 @@ _git ()
|
||||
rebase) _git_rebase ;;
|
||||
remote) _git_remote ;;
|
||||
reset) _git_reset ;;
|
||||
shortlog) _git_shortlog ;;
|
||||
show) _git_show ;;
|
||||
show-branch) _git_log ;;
|
||||
whatchanged) _git_log ;;
|
||||
@@ -992,7 +1053,6 @@ complete -o default -o nospace -F _git_cherry git-cherry
|
||||
complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
|
||||
complete -o default -o nospace -F _git_commit git-commit
|
||||
complete -o default -o nospace -F _git_diff git-diff
|
||||
complete -o default -o nospace -F _git_diff_tree git-diff-tree
|
||||
complete -o default -o nospace -F _git_fetch git-fetch
|
||||
complete -o default -o nospace -F _git_format_patch git-format-patch
|
||||
complete -o default -o nospace -F _git_gc git-gc
|
||||
@@ -1008,6 +1068,7 @@ complete -o default -o nospace -F _git_rebase git-rebase
|
||||
complete -o default -o nospace -F _git_config git-config
|
||||
complete -o default -o nospace -F _git_remote git-remote
|
||||
complete -o default -o nospace -F _git_reset git-reset
|
||||
complete -o default -o nospace -F _git_shortlog git-shortlog
|
||||
complete -o default -o nospace -F _git_show git-show
|
||||
complete -o default -o nospace -F _git_log git-show-branch
|
||||
complete -o default -o nospace -F _git_log git-whatchanged
|
||||
@@ -1023,7 +1084,6 @@ complete -o default -o nospace -F _git git.exe
|
||||
complete -o default -o nospace -F _git_branch git-branch.exe
|
||||
complete -o default -o nospace -F _git_cherry git-cherry.exe
|
||||
complete -o default -o nospace -F _git_diff git-diff.exe
|
||||
complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
|
||||
complete -o default -o nospace -F _git_format_patch git-format-patch.exe
|
||||
complete -o default -o nospace -F _git_log git-log.exe
|
||||
complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
|
||||
@@ -1031,6 +1091,7 @@ complete -o default -o nospace -F _git_merge_base git-merge-base.exe
|
||||
complete -o default -o nospace -F _git_name_rev git-name-rev.exe
|
||||
complete -o default -o nospace -F _git_push git-push.exe
|
||||
complete -o default -o nospace -F _git_config git-config
|
||||
complete -o default -o nospace -F _git_shortlog git-shortlog.exe
|
||||
complete -o default -o nospace -F _git_show git-show.exe
|
||||
complete -o default -o nospace -F _git_log git-show-branch.exe
|
||||
complete -o default -o nospace -F _git_log git-whatchanged.exe
|
||||
|
||||
39
convert.c
39
convert.c
@@ -509,36 +509,71 @@ static char *ident_to_worktree(const char *path, const char *src, unsigned long
|
||||
|
||||
for (dst = buf; size; size--) {
|
||||
const char *cp;
|
||||
/* Fetch next source character, move the pointer on */
|
||||
char ch = *src++;
|
||||
/* Copy the current character to the destination */
|
||||
*dst++ = ch;
|
||||
/* If the current character is "$" or there are less than three
|
||||
* remaining bytes or the two bytes following this one are not
|
||||
* "Id", then simply read the next character */
|
||||
if ((ch != '$') || (size < 3) || memcmp("Id", src, 2))
|
||||
continue;
|
||||
/*
|
||||
* Here when
|
||||
* - There are more than 2 bytes remaining
|
||||
* - The current three bytes are "$Id"
|
||||
* with
|
||||
* - ch == "$"
|
||||
* - src[0] == "I"
|
||||
*/
|
||||
|
||||
/*
|
||||
* It's possible that an expanded Id has crept its way into the
|
||||
* repository, we cope with that by stripping the expansion out
|
||||
*/
|
||||
if (src[2] == ':') {
|
||||
/* Expanded keywords have "$Id:" at the front */
|
||||
|
||||
/* discard up to but not including the closing $ */
|
||||
unsigned long rem = size - 3;
|
||||
/* Point at first byte after the ":" */
|
||||
cp = src + 3;
|
||||
/*
|
||||
* Throw away characters until either
|
||||
* - we reach a "$"
|
||||
* - we run out of bytes (rem == 0)
|
||||
*/
|
||||
do {
|
||||
ch = *cp++;
|
||||
ch = *cp;
|
||||
if (ch == '$')
|
||||
break;
|
||||
cp++;
|
||||
rem--;
|
||||
} while (rem);
|
||||
/* If the above finished because it ran out of characters, then
|
||||
* this is an incomplete keyword, so don't run the expansion */
|
||||
if (!rem)
|
||||
continue;
|
||||
size -= (cp - src);
|
||||
} else if (src[2] == '$')
|
||||
cp = src + 2;
|
||||
else
|
||||
/* Anything other than "$Id:XXX$" or $Id$ and we skip the
|
||||
* expansion */
|
||||
continue;
|
||||
|
||||
/* cp is now pointing at the last $ of the keyword */
|
||||
|
||||
memcpy(dst, "Id: ", 4);
|
||||
dst += 4;
|
||||
memcpy(dst, sha1_to_hex(sha1), 40);
|
||||
dst += 40;
|
||||
*dst++ = ' ';
|
||||
|
||||
/* Adjust for the characters we've discarded */
|
||||
size -= (cp - src);
|
||||
src = cp;
|
||||
|
||||
/* Copy the final "$" */
|
||||
*dst++ = *src++;
|
||||
size--;
|
||||
}
|
||||
|
||||
4
daemon.c
4
daemon.c
@@ -970,8 +970,8 @@ static void store_pid(const char *path)
|
||||
FILE *f = fopen(path, "w");
|
||||
if (!f)
|
||||
die("cannot open pid file %s: %s", path, strerror(errno));
|
||||
fprintf(f, "%d\n", getpid());
|
||||
fclose(f);
|
||||
if (fprintf(f, "%d\n", getpid()) < 0 || fclose(f) != 0)
|
||||
die("failed to write pid file %s: %s", path, strerror(errno));
|
||||
}
|
||||
|
||||
static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t gid)
|
||||
|
||||
8
diff.c
8
diff.c
@@ -187,13 +187,11 @@ static const char *external_diff(void)
|
||||
return external_diff_cmd;
|
||||
}
|
||||
|
||||
#define TEMPFILE_PATH_LEN 50
|
||||
|
||||
static struct diff_tempfile {
|
||||
const char *name; /* filename external diff should read from */
|
||||
char hex[41];
|
||||
char mode[10];
|
||||
char tmp_path[TEMPFILE_PATH_LEN];
|
||||
char tmp_path[PATH_MAX];
|
||||
} diff_temp[2];
|
||||
|
||||
static int count_lines(const char *data, int size)
|
||||
@@ -1352,7 +1350,7 @@ void fill_filespec(struct diff_filespec *spec, const unsigned char *sha1,
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a name and sha1 pair, if the dircache tells us the file in
|
||||
* Given a name and sha1 pair, if the index tells us the file in
|
||||
* the work tree has that object contents, return true, so that
|
||||
* prepare_temp_file() does not have to inflate and extract.
|
||||
*/
|
||||
@@ -1562,7 +1560,7 @@ static void prep_temp_blob(struct diff_tempfile *temp,
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = git_mkstemp(temp->tmp_path, TEMPFILE_PATH_LEN, ".diff_XXXXXX");
|
||||
fd = git_mkstemp(temp->tmp_path, PATH_MAX, ".diff_XXXXXX");
|
||||
if (fd < 0)
|
||||
die("unable to create temp-file");
|
||||
if (write_in_full(fd, blob, size) != size)
|
||||
|
||||
@@ -1013,7 +1013,7 @@ static void load_tree(struct tree_entry *root)
|
||||
return;
|
||||
|
||||
myoe = find_object(sha1);
|
||||
if (myoe) {
|
||||
if (myoe && myoe->pack_id != MAX_PACK_ID) {
|
||||
if (myoe->type != OBJ_TREE)
|
||||
die("Not a tree: %s", sha1_to_hex(sha1));
|
||||
t->delta_depth = 0;
|
||||
@@ -1122,6 +1122,7 @@ static void store_tree(struct tree_entry *root)
|
||||
|| le->pack_id != pack_id) {
|
||||
lo.data = NULL;
|
||||
lo.depth = 0;
|
||||
lo.no_free = 0;
|
||||
} else {
|
||||
mktree(t, 0, &lo.len, &old_tree);
|
||||
lo.data = old_tree.buffer;
|
||||
@@ -1656,6 +1657,33 @@ static void file_change_deleteall(struct branch *b)
|
||||
load_tree(&b->branch_tree);
|
||||
}
|
||||
|
||||
static void cmd_from_commit(struct branch *b, char *buf, unsigned long size)
|
||||
{
|
||||
if (!buf || size < 46)
|
||||
die("Not a valid commit: %s", sha1_to_hex(b->sha1));
|
||||
if (memcmp("tree ", buf, 5)
|
||||
|| get_sha1_hex(buf + 5, b->branch_tree.versions[1].sha1))
|
||||
die("The commit %s is corrupt", sha1_to_hex(b->sha1));
|
||||
hashcpy(b->branch_tree.versions[0].sha1,
|
||||
b->branch_tree.versions[1].sha1);
|
||||
}
|
||||
|
||||
static void cmd_from_existing(struct branch *b)
|
||||
{
|
||||
if (is_null_sha1(b->sha1)) {
|
||||
hashclr(b->branch_tree.versions[0].sha1);
|
||||
hashclr(b->branch_tree.versions[1].sha1);
|
||||
} else {
|
||||
unsigned long size;
|
||||
char *buf;
|
||||
|
||||
buf = read_object_with_reference(b->sha1,
|
||||
commit_type, &size, b->sha1);
|
||||
cmd_from_commit(b, buf, size);
|
||||
free(buf);
|
||||
}
|
||||
}
|
||||
|
||||
static void cmd_from(struct branch *b)
|
||||
{
|
||||
const char *from;
|
||||
@@ -1681,40 +1709,19 @@ static void cmd_from(struct branch *b)
|
||||
} else if (*from == ':') {
|
||||
uintmax_t idnum = strtoumax(from + 1, NULL, 10);
|
||||
struct object_entry *oe = find_mark(idnum);
|
||||
unsigned long size;
|
||||
char *buf;
|
||||
if (oe->type != OBJ_COMMIT)
|
||||
die("Mark :%" PRIuMAX " not a commit", idnum);
|
||||
hashcpy(b->sha1, oe->sha1);
|
||||
buf = gfi_unpack_entry(oe, &size);
|
||||
if (!buf || size < 46)
|
||||
die("Not a valid commit: %s", from);
|
||||
if (memcmp("tree ", buf, 5)
|
||||
|| get_sha1_hex(buf + 5, b->branch_tree.versions[1].sha1))
|
||||
die("The commit %s is corrupt", sha1_to_hex(b->sha1));
|
||||
free(buf);
|
||||
hashcpy(b->branch_tree.versions[0].sha1,
|
||||
b->branch_tree.versions[1].sha1);
|
||||
} else if (!get_sha1(from, b->sha1)) {
|
||||
if (is_null_sha1(b->sha1)) {
|
||||
hashclr(b->branch_tree.versions[0].sha1);
|
||||
hashclr(b->branch_tree.versions[1].sha1);
|
||||
} else {
|
||||
if (oe->pack_id != MAX_PACK_ID) {
|
||||
unsigned long size;
|
||||
char *buf;
|
||||
|
||||
buf = read_object_with_reference(b->sha1,
|
||||
commit_type, &size, b->sha1);
|
||||
if (!buf || size < 46)
|
||||
die("Not a valid commit: %s", from);
|
||||
if (memcmp("tree ", buf, 5)
|
||||
|| get_sha1_hex(buf + 5, b->branch_tree.versions[1].sha1))
|
||||
die("The commit %s is corrupt", sha1_to_hex(b->sha1));
|
||||
char *buf = gfi_unpack_entry(oe, &size);
|
||||
cmd_from_commit(b, buf, size);
|
||||
free(buf);
|
||||
hashcpy(b->branch_tree.versions[0].sha1,
|
||||
b->branch_tree.versions[1].sha1);
|
||||
}
|
||||
} else
|
||||
} else
|
||||
cmd_from_existing(b);
|
||||
} else if (!get_sha1(from, b->sha1))
|
||||
cmd_from_existing(b);
|
||||
else
|
||||
die("Invalid ref name or SHA1 expression: %s", from);
|
||||
|
||||
read_next_command();
|
||||
|
||||
@@ -18,7 +18,7 @@ stop_here () {
|
||||
|
||||
stop_here_user_resolve () {
|
||||
if [ -n "$resolvemsg" ]; then
|
||||
echo "$resolvemsg"
|
||||
printf '%s\n' "$resolvemsg"
|
||||
stop_here $1
|
||||
fi
|
||||
cmdline=$(basename $0)
|
||||
@@ -146,7 +146,7 @@ do
|
||||
git_apply_opt="$git_apply_opt $1"; shift ;;
|
||||
|
||||
--resolvemsg=*)
|
||||
resolvemsg=$(echo "$1" | sed -e "s/^--resolvemsg=//"); shift ;;
|
||||
resolvemsg=${1#--resolvemsg=}; shift ;;
|
||||
|
||||
--)
|
||||
shift; break ;;
|
||||
@@ -331,7 +331,7 @@ do
|
||||
ADD_SIGNOFF=
|
||||
fi
|
||||
{
|
||||
echo "$SUBJECT"
|
||||
printf '%s\n' "$SUBJECT"
|
||||
if test -s "$dotest/msg-clean"
|
||||
then
|
||||
echo
|
||||
@@ -394,7 +394,7 @@ do
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Applying '$SUBJECT'"
|
||||
printf 'Applying %s\n' "$SUBJECT"
|
||||
echo
|
||||
|
||||
case "$resolved" in
|
||||
|
||||
@@ -376,12 +376,12 @@ t,)
|
||||
rm -f "$TMP_INDEX"
|
||||
fi || exit
|
||||
|
||||
echo "$commit_only" |
|
||||
printf '%s\n' "$commit_only" |
|
||||
GIT_INDEX_FILE="$TMP_INDEX" \
|
||||
git-update-index --add --remove --stdin &&
|
||||
|
||||
save_index &&
|
||||
echo "$commit_only" |
|
||||
printf '%s\n' "$commit_only" |
|
||||
(
|
||||
GIT_INDEX_FILE="$NEXT_INDEX"
|
||||
export GIT_INDEX_FILE
|
||||
@@ -432,7 +432,7 @@ fi
|
||||
|
||||
if test "$log_message" != ''
|
||||
then
|
||||
echo "$log_message"
|
||||
printf '%s\n' "$log_message"
|
||||
elif test "$logfile" != ""
|
||||
then
|
||||
if test "$logfile" = -
|
||||
@@ -475,7 +475,7 @@ if test -f "$GIT_DIR/MERGE_HEAD" && test -z "$no_edit"; then
|
||||
echo "#"
|
||||
echo "# It looks like you may be committing a MERGE."
|
||||
echo "# If this is not correct, please remove the file"
|
||||
echo "# $GIT_DIR/MERGE_HEAD"
|
||||
printf '%s\n' "# $GIT_DIR/MERGE_HEAD"
|
||||
echo "# and try again"
|
||||
echo "#"
|
||||
fi >>"$GIT_DIR"/COMMIT_EDITMSG
|
||||
|
||||
@@ -559,11 +559,6 @@ unless (-d $git_dir) {
|
||||
$last_branch = $opt_o;
|
||||
$orig_branch = "";
|
||||
} else {
|
||||
-f "$git_dir/refs/heads/$opt_o"
|
||||
or die "Branch '$opt_o' does not exist.\n".
|
||||
"Either use the correct '-o branch' option,\n".
|
||||
"or import to a new repository.\n";
|
||||
|
||||
open(F, "git-symbolic-ref HEAD |") or
|
||||
die "Cannot run git-symbolic-ref: $!\n";
|
||||
chomp ($last_branch = <F>);
|
||||
@@ -588,6 +583,11 @@ unless (-d $git_dir) {
|
||||
$branch_date{$head} = $1;
|
||||
}
|
||||
close(H);
|
||||
if (!exists $branch_date{$opt_o}) {
|
||||
die "Branch '$opt_o' does not exist.\n".
|
||||
"Either use the correct '-o branch' option,\n".
|
||||
"or import to a new repository.\n";
|
||||
}
|
||||
}
|
||||
|
||||
-d $git_dir
|
||||
|
||||
@@ -192,11 +192,9 @@ sub req_Root
|
||||
}
|
||||
}
|
||||
|
||||
unless ( ($cfg->{gitcvs}{$state->{method}}{enabled}
|
||||
and $cfg->{gitcvs}{$state->{method}}{enabled} =~ /^\s*(1|true|yes)\s*$/i)
|
||||
or ($cfg->{gitcvs}{enabled}
|
||||
and $cfg->{gitcvs}{enabled} =~ /^\s*(1|true|yes)\s*$/i) )
|
||||
{
|
||||
my $enabled = ($cfg->{gitcvs}{$state->{method}}{enabled}
|
||||
|| $cfg->{gitcvs}{enabled});
|
||||
unless ($enabled && $enabled =~ /^\s*(1|true|yes)\s*$/i) {
|
||||
print "E GITCVS emulation needs to be enabled on this repo\n";
|
||||
print "E the repo config file needs a [gitcvs] section added, and the parameter 'enabled' set to 1\n";
|
||||
print "E \n";
|
||||
|
||||
@@ -22,7 +22,7 @@ ifndef gitexecdir
|
||||
endif
|
||||
|
||||
ifndef sharedir
|
||||
sharedir := $(dir $(gitexecdir))/share
|
||||
sharedir := $(dir $(gitexecdir))share
|
||||
endif
|
||||
|
||||
ifndef INSTALL
|
||||
@@ -53,12 +53,19 @@ TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
|
||||
libdir ?= $(sharedir)/git-gui/lib
|
||||
libdir_SQ = $(subst ','\'',$(libdir))
|
||||
|
||||
exedir = $(dir $(gitexecdir))share/git-gui/lib
|
||||
exedir_SQ = $(subst ','\'',$(exedir))
|
||||
|
||||
$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
|
||||
$(QUIET_GEN)rm -f $@ $@+ && \
|
||||
if test '$(exedir_SQ)' = '$(libdir_SQ)'; then \
|
||||
GITGUI_RELATIVE=1; \
|
||||
fi && \
|
||||
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
|
||||
-e 's|^exec wish "$$0"|exec $(subst |,'\|',$(TCLTK_PATH_SQ)) "$$0"|' \
|
||||
-e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
|
||||
-e 's|@@GITGUI_LIBDIR@@|$(libdir_SQ)|' \
|
||||
-e 's|@@GITGUI_RELATIVE@@|'$$GITGUI_RELATIVE'|' \
|
||||
-e $$GITGUI_RELATIVE's|@@GITGUI_LIBDIR@@|$(libdir_SQ)|' \
|
||||
$@.sh >$@+ && \
|
||||
chmod +x $@+ && \
|
||||
mv $@+ $@
|
||||
@@ -88,6 +95,7 @@ TRACK_VARS = \
|
||||
$(subst ','\'',SHELL_PATH='$(SHELL_PATH_SQ)') \
|
||||
$(subst ','\'',TCL_PATH='$(TCL_PATH_SQ)') \
|
||||
$(subst ','\'',TCLTK_PATH='$(TCLTK_PATH_SQ)') \
|
||||
$(subst ','\'',gitexecdir='$(gitexecdir_SQ)') \
|
||||
$(subst ','\'',libdir='$(libdir_SQ)') \
|
||||
#end TRACK_VARS
|
||||
|
||||
|
||||
@@ -25,7 +25,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA}
|
||||
## configure our library
|
||||
|
||||
set oguilib {@@GITGUI_LIBDIR@@}
|
||||
if {[string match @@* $oguilib]} {
|
||||
set oguirel {@@GITGUI_RELATIVE@@}
|
||||
if {$oguirel eq {1}} {
|
||||
set oguilib [file dirname [file dirname [file normalize $argv0]]]
|
||||
set oguilib [file join $oguilib share git-gui lib]
|
||||
} elseif {[string match @@* $oguirel]} {
|
||||
set oguilib [file join [file dirname [file normalize $argv0]] lib]
|
||||
}
|
||||
set idx [file join $oguilib tclIndex]
|
||||
@@ -55,7 +59,7 @@ if {$idx ne {}} {
|
||||
} else {
|
||||
set auto_path [concat [list $oguilib] $auto_path]
|
||||
}
|
||||
unset -nocomplain fd idx
|
||||
unset -nocomplain oguilib oguirel idx fd
|
||||
|
||||
if {![catch {set _verbose $env(GITGUI_VERBOSE)}]} {
|
||||
unset _verbose
|
||||
@@ -1206,15 +1210,12 @@ foreach class {Button Checkbutton Entry Label
|
||||
}
|
||||
unset class
|
||||
|
||||
if {[is_Windows]} {
|
||||
set M1B Control
|
||||
set M1T Ctrl
|
||||
} elseif {[is_MacOSX]} {
|
||||
if {[is_MacOSX]} {
|
||||
set M1B M1
|
||||
set M1T Cmd
|
||||
} else {
|
||||
set M1B M1
|
||||
set M1T M1
|
||||
set M1B Control
|
||||
set M1T Ctrl
|
||||
}
|
||||
|
||||
proc apply_config {} {
|
||||
|
||||
@@ -328,7 +328,7 @@ f,*)
|
||||
then
|
||||
echo "Wonderful."
|
||||
result_commit=$(
|
||||
echo "$merge_msg" |
|
||||
printf '%s\n' "$merge_msg" |
|
||||
git-commit-tree $result_tree -p HEAD -p "$1"
|
||||
) || exit
|
||||
finish "$result_commit" "In-index merge"
|
||||
@@ -433,7 +433,7 @@ done
|
||||
if test '' != "$result_tree"
|
||||
then
|
||||
parents=$(git-show-branch --independent "$head" "$@" | sed -e 's/^/-p /')
|
||||
result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents) || exit
|
||||
result_commit=$(printf '%s\n' "$merge_msg" | git-commit-tree $result_tree $parents) || exit
|
||||
finish "$result_commit" "Merge made by $wt_strategy."
|
||||
dropsave
|
||||
exit 0
|
||||
@@ -472,7 +472,7 @@ else
|
||||
do
|
||||
echo $remote
|
||||
done >"$GIT_DIR/MERGE_HEAD"
|
||||
echo "$merge_msg" >"$GIT_DIR/MERGE_MSG"
|
||||
printf '%s\n' "$merge_msg" >"$GIT_DIR/MERGE_MSG"
|
||||
fi
|
||||
|
||||
if test "$merge_was_ok" = t
|
||||
|
||||
16
git-svn.perl
16
git-svn.perl
@@ -2472,12 +2472,16 @@ sub close_file {
|
||||
my $hash;
|
||||
my $path = $self->git_path($fb->{path});
|
||||
if (my $fh = $fb->{fh}) {
|
||||
seek($fh, 0, 0) or croak $!;
|
||||
my $md5 = Digest::MD5->new;
|
||||
$md5->addfile($fh);
|
||||
my $got = $md5->hexdigest;
|
||||
die "Checksum mismatch: $path\n",
|
||||
"expected: $exp\n got: $got\n" if ($got ne $exp);
|
||||
if (defined $exp) {
|
||||
seek($fh, 0, 0) or croak $!;
|
||||
my $md5 = Digest::MD5->new;
|
||||
$md5->addfile($fh);
|
||||
my $got = $md5->hexdigest;
|
||||
if ($got ne $exp) {
|
||||
die "Checksum mismatch: $path\n",
|
||||
"expected: $exp\n got: $got\n";
|
||||
}
|
||||
}
|
||||
sysseek($fh, 0, 0) or croak $!;
|
||||
if ($fb->{mode_b} == 120000) {
|
||||
sysread($fh, my $buf, 5) == 5 or croak $!;
|
||||
|
||||
@@ -126,7 +126,7 @@ if [ "$annotate" ]; then
|
||||
echo "#" ) > "$GIT_DIR"/TAG_EDITMSG
|
||||
${VISUAL:-${EDITOR:-vi}} "$GIT_DIR"/TAG_EDITMSG || exit
|
||||
else
|
||||
echo "$message" >"$GIT_DIR"/TAG_EDITMSG
|
||||
printf '%s\n' "$message" >"$GIT_DIR"/TAG_EDITMSG
|
||||
fi
|
||||
|
||||
grep -v '^#' <"$GIT_DIR"/TAG_EDITMSG |
|
||||
|
||||
2
git.c
2
git.c
@@ -229,7 +229,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
||||
int option;
|
||||
} commands[] = {
|
||||
{ "add", cmd_add, RUN_SETUP | NOT_BARE },
|
||||
{ "annotate", cmd_annotate, USE_PAGER },
|
||||
{ "annotate", cmd_annotate, RUN_SETUP | USE_PAGER },
|
||||
{ "apply", cmd_apply },
|
||||
{ "archive", cmd_archive },
|
||||
{ "blame", cmd_blame, RUN_SETUP },
|
||||
|
||||
1
object.c
1
object.c
@@ -176,6 +176,7 @@ struct object *parse_object(const unsigned char *sha1)
|
||||
if (buffer) {
|
||||
struct object *obj;
|
||||
if (check_sha1_signature(sha1, buffer, size, typename(type)) < 0) {
|
||||
free(buffer);
|
||||
error("sha1 mismatch %s\n", sha1_to_hex(sha1));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ const unsigned char null_sha1[20];
|
||||
|
||||
static unsigned int sha1_file_open_flag = O_NOATIME;
|
||||
|
||||
signed char hexval_table[256] = {
|
||||
const signed char hexval_table[256] = {
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* 00-07 */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* 08-0f */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* 10-17 */
|
||||
|
||||
@@ -45,4 +45,40 @@ test_expect_success check '
|
||||
test "z$id" = "z$embedded"
|
||||
'
|
||||
|
||||
# If an expanded ident ever gets into the repository, we want to make sure that
|
||||
# it is collapsed before being expanded again on checkout
|
||||
test_expect_success expanded_in_repo '
|
||||
{
|
||||
echo "File with expanded keywords"
|
||||
echo "\$Id\$"
|
||||
echo "\$Id:\$"
|
||||
echo "\$Id: 0000000000000000000000000000000000000000 \$"
|
||||
echo "\$Id: NoSpaceAtEnd\$"
|
||||
echo "\$Id:NoSpaceAtFront \$"
|
||||
echo "\$Id:NoSpaceAtEitherEnd\$"
|
||||
echo "\$Id: NoTerminatingSymbol"
|
||||
} > expanded-keywords &&
|
||||
|
||||
{
|
||||
echo "File with expanded keywords"
|
||||
echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$"
|
||||
echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$"
|
||||
echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$"
|
||||
echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$"
|
||||
echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$"
|
||||
echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$"
|
||||
echo "\$Id: NoTerminatingSymbol"
|
||||
} > expected-output &&
|
||||
|
||||
git add expanded-keywords &&
|
||||
git commit -m "File with keywords expanded" &&
|
||||
|
||||
echo "expanded-keywords ident" >> .gitattributes &&
|
||||
|
||||
rm -f expanded-keywords &&
|
||||
git checkout -- expanded-keywords &&
|
||||
cat expanded-keywords &&
|
||||
cmp expanded-keywords expected-output
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -436,6 +436,40 @@ test_expect_success numbers '
|
||||
test z1048576 = "z$m"
|
||||
'
|
||||
|
||||
cat > expect << EOF
|
||||
true
|
||||
false
|
||||
true
|
||||
false
|
||||
true
|
||||
false
|
||||
true
|
||||
false
|
||||
EOF
|
||||
|
||||
test_expect_success bool '
|
||||
|
||||
git-config bool.true1 01 &&
|
||||
git-config bool.true2 -1 &&
|
||||
git-config bool.true3 YeS &&
|
||||
git-config bool.true4 true &&
|
||||
git-config bool.false1 000 &&
|
||||
git-config bool.false2 "" &&
|
||||
git-config bool.false3 nO &&
|
||||
git-config bool.false4 FALSE &&
|
||||
rm -f result &&
|
||||
for i in 1 2 3 4
|
||||
do
|
||||
git-config --bool --get bool.true$i >>result
|
||||
git-config --bool --get bool.false$i >>result
|
||||
done &&
|
||||
cmp expect result'
|
||||
|
||||
test_expect_failure 'invalid bool' '
|
||||
|
||||
git-config bool.nobool foobar &&
|
||||
git-config --bool --get bool.nobool'
|
||||
|
||||
rm .git/config
|
||||
|
||||
git-config quote.leading " test"
|
||||
|
||||
@@ -79,4 +79,24 @@ test_expect_success \
|
||||
>output &&
|
||||
git diff expect output'
|
||||
|
||||
cat > excludes-file << EOF
|
||||
*.[1-8]
|
||||
e*
|
||||
EOF
|
||||
|
||||
git-config core.excludesFile excludes-file
|
||||
|
||||
git-runstatus | grep "^# " > output
|
||||
|
||||
cat > expect << EOF
|
||||
# .gitignore
|
||||
# a.6
|
||||
# one/
|
||||
# output
|
||||
# three/
|
||||
EOF
|
||||
|
||||
test_expect_success 'git-status honours core.excludesfile' \
|
||||
'diff -u expect output'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -13,7 +13,7 @@ check_encoding () {
|
||||
while test "$i" -le $cnt
|
||||
do
|
||||
git format-patch --encoding=UTF-8 --stdout HEAD~$i..HEAD~$j |
|
||||
grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD_=C3=B3=C3=BA?=" &&
|
||||
grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD=20=C3=B3=C3=BA?=" &&
|
||||
git-cat-file commit HEAD~$j |
|
||||
case "$header" in
|
||||
8859)
|
||||
@@ -73,9 +73,9 @@ test_expect_success 'format-patch output (ISO-8859-1)' '
|
||||
git format-patch --stdout master..HEAD^ >out-l1 &&
|
||||
git format-patch --stdout HEAD^ >out-l2 &&
|
||||
grep "^Content-Type: text/plain; charset=ISO-8859-1" out-l1 &&
|
||||
grep "^From: =?ISO-8859-1?q?=C1=E9=ED_=F3=FA?=" out-l1 &&
|
||||
grep "^From: =?ISO-8859-1?q?=C1=E9=ED=20=F3=FA?=" out-l1 &&
|
||||
grep "^Content-Type: text/plain; charset=ISO-8859-1" out-l2 &&
|
||||
grep "^From: =?ISO-8859-1?q?=C1=E9=ED_=F3=FA?=" out-l2
|
||||
grep "^From: =?ISO-8859-1?q?=C1=E9=ED=20=F3=FA?=" out-l2
|
||||
'
|
||||
|
||||
test_expect_success 'format-patch output (UTF-8)' '
|
||||
@@ -84,9 +84,9 @@ test_expect_success 'format-patch output (UTF-8)' '
|
||||
git format-patch --stdout master..HEAD^ >out-u1 &&
|
||||
git format-patch --stdout HEAD^ >out-u2 &&
|
||||
grep "^Content-Type: text/plain; charset=UTF-8" out-u1 &&
|
||||
grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD_=C3=B3=C3=BA?=" out-u1 &&
|
||||
grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD=20=C3=B3=C3=BA?=" out-u1 &&
|
||||
grep "^Content-Type: text/plain; charset=UTF-8" out-u2 &&
|
||||
grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD_=C3=B3=C3=BA?=" out-u2
|
||||
grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD=20=C3=B3=C3=BA?=" out-u2
|
||||
'
|
||||
|
||||
test_expect_success 'rebase (U/U)' '
|
||||
|
||||
@@ -16,16 +16,16 @@ test_expect_success setup '
|
||||
|
||||
for i in 1 2 5 6 A B C 7 8 9 10; do echo "$i"; done >file &&
|
||||
git update-index file &&
|
||||
git commit -m "Side change #1" &&
|
||||
git commit -m "Side changes #1" &&
|
||||
|
||||
for i in D E F; do echo "$i"; done >>file &&
|
||||
git update-index file &&
|
||||
git commit -m "Side change #2" &&
|
||||
git commit -m "Side changes #2" &&
|
||||
git tag C2 &&
|
||||
|
||||
for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >file &&
|
||||
git update-index file &&
|
||||
git commit -m "Side change #3" &&
|
||||
git commit -m "Side changes #3 with \\n backslash-n in it." &&
|
||||
|
||||
git checkout master &&
|
||||
git diff-tree -p C2 | git apply --index &&
|
||||
@@ -66,4 +66,23 @@ test_expect_success "format-patch --ignore-if-in-upstream result applies" '
|
||||
test $cnt = 2
|
||||
'
|
||||
|
||||
test_expect_success 'commit did not screw up the log message' '
|
||||
|
||||
git cat-file commit side | grep "^Side .* with .* backslash-n"
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'format-patch did not screw up the log message' '
|
||||
|
||||
grep "^Subject: .*Side changes #3 with .* backslash-n" patch0 &&
|
||||
grep "^Subject: .*Side changes #3 with .* backslash-n" patch1
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'replay did not screw up the log message' '
|
||||
|
||||
git cat-file commit rebuild-1 | grep "^Side .* with .* backslash-n"
|
||||
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
45
t/t9112-git-svn-md5less-file.sh
Executable file
45
t/t9112-git-svn-md5less-file.sh
Executable file
@@ -0,0 +1,45 @@
|
||||
test_description='test that git handles an svn repository with missing md5sums'
|
||||
|
||||
. ./lib-git-svn.sh
|
||||
|
||||
# Loading a node from a svn dumpfile without a Text-Content-Length
|
||||
# field causes svn to neglect to store or report an md5sum. (it will
|
||||
# calculate one if you had put Text-Content-Length: 0). This showed
|
||||
# up in a repository creted with cvs2svn.
|
||||
|
||||
cat > dumpfile.svn <<EOF
|
||||
SVN-fs-dump-format-version: 1
|
||||
|
||||
Revision-number: 1
|
||||
Prop-content-length: 98
|
||||
Content-length: 98
|
||||
|
||||
K 7
|
||||
svn:log
|
||||
V 0
|
||||
|
||||
K 10
|
||||
svn:author
|
||||
V 4
|
||||
test
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2007-05-06T12:37:01.153339Z
|
||||
PROPS-END
|
||||
|
||||
Node-path: md5less-file
|
||||
Node-kind: file
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Content-length: 10
|
||||
|
||||
PROPS-END
|
||||
|
||||
EOF
|
||||
|
||||
test_expect_success 'load svn dumpfile' "svnadmin load $rawsvnrepo < dumpfile.svn"
|
||||
|
||||
test_expect_success 'initialize git-svn' "git-svn init $svnrepo"
|
||||
test_expect_success 'fetch revisions from svn' 'git-svn fetch'
|
||||
test_done
|
||||
@@ -119,6 +119,35 @@ test_expect_success \
|
||||
</dev/null &&
|
||||
git diff -u expect marks.new'
|
||||
|
||||
test_tick
|
||||
cat >input <<INPUT_END
|
||||
commit refs/heads/verify--import-marks
|
||||
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
|
||||
data <<COMMIT
|
||||
recreate from :5
|
||||
COMMIT
|
||||
|
||||
from :5
|
||||
M 755 :2 copy-of-file2
|
||||
|
||||
INPUT_END
|
||||
test_expect_success \
|
||||
'A: verify marks import does not crash' \
|
||||
'git-fast-import --import-marks=marks.out <input &&
|
||||
git-whatchanged verify--import-marks'
|
||||
test_expect_success \
|
||||
'A: verify pack' \
|
||||
'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
|
||||
cat >expect <<EOF
|
||||
:000000 100755 0000000000000000000000000000000000000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 A copy-of-file2
|
||||
EOF
|
||||
git-diff-tree -M -r master verify--import-marks >actual
|
||||
test_expect_success \
|
||||
'A: verify diff' \
|
||||
'compare_diff_raw expect actual &&
|
||||
test `git-rev-parse --verify master:file2` \
|
||||
= `git-rev-parse --verify verify--import-marks:copy-of-file2`'
|
||||
|
||||
###
|
||||
### series B
|
||||
###
|
||||
|
||||
2
tag.c
2
tag.c
@@ -26,7 +26,7 @@ struct tag *lookup_tag(const unsigned char *sha1)
|
||||
if (!obj->type)
|
||||
obj->type = OBJ_TAG;
|
||||
if (obj->type != OBJ_TAG) {
|
||||
error("Object %s is a %s, not a tree",
|
||||
error("Object %s is a %s, not a tag",
|
||||
sha1_to_hex(sha1), typename(obj->type));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -414,10 +414,6 @@ static void verify_uptodate(struct cache_entry *ce,
|
||||
return;
|
||||
errno = 0;
|
||||
}
|
||||
if (o->reset) {
|
||||
ce->ce_flags |= htons(CE_UPDATE);
|
||||
return;
|
||||
}
|
||||
if (errno == ENOENT)
|
||||
return;
|
||||
die("Entry '%s' not uptodate. Cannot merge.", ce->name);
|
||||
|
||||
@@ -22,6 +22,7 @@ static const char use_add_rm_msg[] =
|
||||
"use \"git add/rm <file>...\" to update what will be committed";
|
||||
static const char use_add_to_include_msg[] =
|
||||
"use \"git add <file>...\" to include in what will be committed";
|
||||
static const char *excludes_file;
|
||||
|
||||
static int parse_status_slot(const char *var, int offset)
|
||||
{
|
||||
@@ -259,6 +260,8 @@ static void wt_status_print_untracked(struct wt_status *s)
|
||||
x = git_path("info/exclude");
|
||||
if (file_exists(x))
|
||||
add_excludes_from_file(&dir, x);
|
||||
if (excludes_file && file_exists(excludes_file))
|
||||
add_excludes_from_file(&dir, excludes_file);
|
||||
|
||||
read_directory(&dir, ".", "", 0, NULL);
|
||||
for(i = 0; i < dir.nr; i++) {
|
||||
@@ -356,5 +359,11 @@ int git_status_config(const char *k, const char *v)
|
||||
int slot = parse_status_slot(k, 13);
|
||||
color_parse(v, k, wt_status_colors[slot]);
|
||||
}
|
||||
if (!strcmp(k, "core.excludesfile")) {
|
||||
if (!v)
|
||||
die("core.excludesfile without value");
|
||||
excludes_file = xstrdup(v);
|
||||
return 0;
|
||||
}
|
||||
return git_default_config(k, v);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user