Compare commits
59 Commits
Author | SHA1 | Date | |
---|---|---|---|
fcd424011b | |||
c512b03555 | |||
d8c416b251 | |||
54fd955c21 | |||
408dee5222 | |||
daaf2e8892 | |||
326bea47cb | |||
fe7e37235d | |||
2e5a40f0b5 | |||
581b26c82d | |||
5d4bd79d80 | |||
e80014a13e | |||
2870695be0 | |||
e3163c7515 | |||
936db184f0 | |||
4c35f0dbc4 | |||
c8a97906ba | |||
8e50175d94 | |||
2be10bb5c1 | |||
970957dbad | |||
4318d3ba8f | |||
2170422790 | |||
21e403a7b9 | |||
7a49c254cd | |||
e4762865c8 | |||
09f53b16bc | |||
852f098c06 | |||
da1fbed3ff | |||
657ab61efa | |||
e07665e524 | |||
cc64c6970a | |||
4c367c6ae9 | |||
42accaec01 | |||
bb6ad28c23 | |||
0ce142c944 | |||
a757c646ee | |||
0476228de5 | |||
bcbbe4f9d9 | |||
7b676b1bb5 | |||
5856b5f568 | |||
44211e8c2e | |||
846b8f681a | |||
4916c8f953 | |||
1fb5fdd25f | |||
08bb03e475 | |||
14cd458126 | |||
3aff874af2 | |||
e01de1c912 | |||
b75aea8f5b | |||
29209cbe58 | |||
0d7c2430ab | |||
8b124135a9 | |||
59f5ced65b | |||
c1376c12b7 | |||
51667147be | |||
24ff4d56cf | |||
9b25949a07 | |||
1e7ef746d3 | |||
81f45e7dc4 |
3
.mailmap
3
.mailmap
@ -5,6 +5,7 @@
|
|||||||
# same person appearing not to be so.
|
# same person appearing not to be so.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
Alex Bennée <kernel-hacker@bennee.com>
|
||||||
Alexander Gavrilov <angavrilov@gmail.com>
|
Alexander Gavrilov <angavrilov@gmail.com>
|
||||||
Aneesh Kumar K.V <aneesh.kumar@gmail.com>
|
Aneesh Kumar K.V <aneesh.kumar@gmail.com>
|
||||||
Brian M. Carlson <sandals@crustytoothpaste.ath.cx>
|
Brian M. Carlson <sandals@crustytoothpaste.ath.cx>
|
||||||
@ -15,6 +16,7 @@ Daniel Barkalow <barkalow@iabervon.org>
|
|||||||
David D. Kilzer <ddkilzer@kilzer.net>
|
David D. Kilzer <ddkilzer@kilzer.net>
|
||||||
David Kågedal <davidk@lysator.liu.se>
|
David Kågedal <davidk@lysator.liu.se>
|
||||||
David S. Miller <davem@davemloft.net>
|
David S. Miller <davem@davemloft.net>
|
||||||
|
Deskin Miller <deskinm@umich.edu>
|
||||||
Dirk Süsserott <newsletter@dirk.my1.cc>
|
Dirk Süsserott <newsletter@dirk.my1.cc>
|
||||||
Fredrik Kuivinen <freku045@student.liu.se>
|
Fredrik Kuivinen <freku045@student.liu.se>
|
||||||
H. Peter Anvin <hpa@bonde.sc.orionmulti.com>
|
H. Peter Anvin <hpa@bonde.sc.orionmulti.com>
|
||||||
@ -60,6 +62,7 @@ Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
|
|||||||
Uwe Kleine-König <uzeisberger@io.fsforth.de>
|
Uwe Kleine-König <uzeisberger@io.fsforth.de>
|
||||||
Uwe Kleine-König <zeisberg@informatik.uni-freiburg.de>
|
Uwe Kleine-König <zeisberg@informatik.uni-freiburg.de>
|
||||||
Ville Skyttä <scop@xemacs.org>
|
Ville Skyttä <scop@xemacs.org>
|
||||||
|
Vitaly "_Vi" Shukela <public_vi@tut.by>
|
||||||
William Pursell <bill.pursell@gmail.com>
|
William Pursell <bill.pursell@gmail.com>
|
||||||
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
|
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
|
||||||
anonymous <linux@horizon.com>
|
anonymous <linux@horizon.com>
|
||||||
|
27
Documentation/RelNotes-1.7.0.4.txt
Normal file
27
Documentation/RelNotes-1.7.0.4.txt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
Git v1.7.0.4 Release Notes
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Fixes since v1.7.0.3
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
* Optimized ntohl/htonl on big-endian machines were broken.
|
||||||
|
|
||||||
|
* Color values given to "color.<cmd>.<slot>" configuration can now have
|
||||||
|
more than one attributes (e.g. "bold ul").
|
||||||
|
|
||||||
|
* "git add -u nonexistent-path" did not complain.
|
||||||
|
|
||||||
|
* "git apply --whitespace=fix" didn't work well when an early patch in
|
||||||
|
a patch series adds trailing blank lines and a later one depended on
|
||||||
|
such a block of blank lines at the end.
|
||||||
|
|
||||||
|
* "git fast-export" didn't check error status and stop when marks file
|
||||||
|
cannot be opened.
|
||||||
|
|
||||||
|
* "git format-patch --ignore-if-in-upstream" gave unwarranted errors
|
||||||
|
when the range was empty, instead of silently finishing.
|
||||||
|
|
||||||
|
* "git remote prune" did not detect remote tracking refs that became
|
||||||
|
dangling correctly.
|
||||||
|
|
||||||
|
And other minor fixes and documentation updates.
|
26
Documentation/RelNotes-1.7.0.5.txt
Normal file
26
Documentation/RelNotes-1.7.0.5.txt
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
Git v1.7.0.5 Release Notes
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Fixes since v1.7.0.4
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
* "git daemon" failed to compile on platforms without sockaddr_storage type.
|
||||||
|
|
||||||
|
* Output from "git rev-list --pretty=oneline" was unparsable when a
|
||||||
|
commit did not have any message, which is abnormal but possible in a
|
||||||
|
repository converted from foreign scm.
|
||||||
|
|
||||||
|
* "git stash show <commit-that-is-not-a-stash>" gave an error message
|
||||||
|
that was not so useful. Reworded the message to "<it> is not a
|
||||||
|
stash".
|
||||||
|
|
||||||
|
* Python scripts in contrib/ area now start with "#!/usr/bin/env python"
|
||||||
|
to honor user's PATH.
|
||||||
|
|
||||||
|
* "git imap-send" used to mistake any line that begins with "From " as a
|
||||||
|
message separator in format-patch output.
|
||||||
|
|
||||||
|
* Smart http server backend failed to report an internal server error and
|
||||||
|
infinitely looped instead after output pipe was closed.
|
||||||
|
|
||||||
|
And other minor fixes and documentation updates.
|
@ -79,14 +79,15 @@ of lines before or after the line given by <start>.
|
|||||||
of the --date option at linkgit:git-log[1].
|
of the --date option at linkgit:git-log[1].
|
||||||
|
|
||||||
-M|<num>|::
|
-M|<num>|::
|
||||||
Detect moving lines in the file as well. When a commit
|
Detect moved or copied lines within a file. When a commit
|
||||||
moves a block of lines in a file (e.g. the original file
|
moves or copies a block of lines (e.g. the original file
|
||||||
has A and then B, and the commit changes it to B and
|
has A and then B, and the commit changes it to B and then
|
||||||
then A), the traditional 'blame' algorithm typically blames
|
A), the traditional 'blame' algorithm notices only half of
|
||||||
the lines that were moved up (i.e. B) to the parent and
|
the movement and typically blames the lines that were moved
|
||||||
assigns blame to the lines that were moved down (i.e. A)
|
up (i.e. B) to the parent and assigns blame to the lines that
|
||||||
to the child commit. With this option, both groups of lines
|
were moved down (i.e. A) to the child commit. With this
|
||||||
are blamed on the parent.
|
option, both groups of lines are blamed on the parent by
|
||||||
|
running extra passes of inspection.
|
||||||
+
|
+
|
||||||
<num> is optional but it is the lower bound on the number of
|
<num> is optional but it is the lower bound on the number of
|
||||||
alphanumeric characters that git must detect as moving
|
alphanumeric characters that git must detect as moving
|
||||||
@ -94,7 +95,7 @@ within a file for it to associate those lines with the parent
|
|||||||
commit.
|
commit.
|
||||||
|
|
||||||
-C|<num>|::
|
-C|<num>|::
|
||||||
In addition to `-M`, detect lines copied from other
|
In addition to `-M`, detect lines moved or copied from other
|
||||||
files that were modified in the same commit. This is
|
files that were modified in the same commit. This is
|
||||||
useful when you reorganize your program and move code
|
useful when you reorganize your program and move code
|
||||||
around across files. When this option is given twice,
|
around across files. When this option is given twice,
|
||||||
|
@ -72,6 +72,8 @@ OPTIONS
|
|||||||
Create the branch's reflog. This activates recording of
|
Create the branch's reflog. This activates recording of
|
||||||
all changes made to the branch ref, enabling use of date
|
all changes made to the branch ref, enabling use of date
|
||||||
based sha1 expressions such as "<branchname>@\{yesterday}".
|
based sha1 expressions such as "<branchname>@\{yesterday}".
|
||||||
|
Note that in non-bare repositories, reflogs are usually
|
||||||
|
enabled by default by the `core.logallrefupdates` config option.
|
||||||
|
|
||||||
-f::
|
-f::
|
||||||
--force::
|
--force::
|
||||||
|
@ -105,6 +105,9 @@ The number of additional commits is the number
|
|||||||
of commits which would be displayed by "git log v1.0.4..parent".
|
of commits which would be displayed by "git log v1.0.4..parent".
|
||||||
The hash suffix is "-g" + 7-char abbreviation for the tip commit
|
The hash suffix is "-g" + 7-char abbreviation for the tip commit
|
||||||
of parent (which was `2414721b194453f058079d897d13c4e377f92dc6`).
|
of parent (which was `2414721b194453f058079d897d13c4e377f92dc6`).
|
||||||
|
The "g" prefix stands for "git" and is used to allow describing the version of
|
||||||
|
a software depending on the SCM the software is managed with. This is useful
|
||||||
|
in an environment where people may use different SCMs.
|
||||||
|
|
||||||
Doing a 'git describe' on a tag-name will just show the tag name:
|
Doing a 'git describe' on a tag-name will just show the tag name:
|
||||||
|
|
||||||
|
@ -8,13 +8,13 @@ git-fetch - Download objects and refs from another repository
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
'git fetch' <options> <repository> <refspec>...
|
'git fetch' [<options>] [<repository> [<refspec>...]]
|
||||||
|
|
||||||
'git fetch' <options> <group>
|
'git fetch' [<options>] <group>
|
||||||
|
|
||||||
'git fetch' --multiple <options> [<repository> | <group>]...
|
'git fetch' --multiple [<options>] [<repository> | <group>]...
|
||||||
|
|
||||||
'git fetch' --all <options>
|
'git fetch' --all [<options>]
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
@ -35,7 +35,7 @@ These services can be enabled/disabled using the per-repository
|
|||||||
configuration file:
|
configuration file:
|
||||||
|
|
||||||
http.getanyfile::
|
http.getanyfile::
|
||||||
This serves older Git clients which are unable to use the
|
This serves Git clients older than version 1.6.6 that are unable to use the
|
||||||
upload pack service. When enabled, clients are able to read
|
upload pack service. When enabled, clients are able to read
|
||||||
any file within the repository, including objects that are
|
any file within the repository, including objects that are
|
||||||
no longer reachable from a branch but are still present.
|
no longer reachable from a branch but are still present.
|
||||||
|
@ -16,7 +16,9 @@ DESCRIPTION
|
|||||||
This command uploads a mailbox generated with 'git format-patch'
|
This command uploads a mailbox generated with 'git format-patch'
|
||||||
into an IMAP drafts folder. This allows patches to be sent as
|
into an IMAP drafts folder. This allows patches to be sent as
|
||||||
other email is when using mail clients that cannot read mailbox
|
other email is when using mail clients that cannot read mailbox
|
||||||
files directly.
|
files directly. The command also works with any general mailbox
|
||||||
|
in which emails have the fields "From", "Date", and "Subject" in
|
||||||
|
that order.
|
||||||
|
|
||||||
Typical usage is something like:
|
Typical usage is something like:
|
||||||
|
|
||||||
@ -118,12 +120,6 @@ Thunderbird in particular is known to be problematic. Thunderbird
|
|||||||
users may wish to visit this web page for more information:
|
users may wish to visit this web page for more information:
|
||||||
http://kb.mozillazine.org/Plain_text_e-mail_-_Thunderbird#Completely_plain_email
|
http://kb.mozillazine.org/Plain_text_e-mail_-_Thunderbird#Completely_plain_email
|
||||||
|
|
||||||
|
|
||||||
BUGS
|
|
||||||
----
|
|
||||||
Doesn't handle lines starting with "From " in the message body.
|
|
||||||
|
|
||||||
|
|
||||||
Author
|
Author
|
||||||
------
|
------
|
||||||
Derived from isync 1.0.1 by Mike McCormack.
|
Derived from isync 1.0.1 by Mike McCormack.
|
||||||
|
@ -11,7 +11,7 @@ SYNOPSIS
|
|||||||
[verse]
|
[verse]
|
||||||
'git push' [--all | --mirror | --tags] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
|
'git push' [--all | --mirror | --tags] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
|
||||||
[--repo=<repository>] [-f | --force] [-v | --verbose] [-u | --set-upstream]
|
[--repo=<repository>] [-f | --force] [-v | --verbose] [-u | --set-upstream]
|
||||||
[<repository> <refspec>...]
|
[<repository> [<refspec>...]]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
|
@ -10,7 +10,7 @@ SYNOPSIS
|
|||||||
[verse]
|
[verse]
|
||||||
'git show-ref' [-q|--quiet] [--verify] [--head] [-d|--dereference]
|
'git show-ref' [-q|--quiet] [--verify] [--head] [-d|--dereference]
|
||||||
[-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags]
|
[-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags]
|
||||||
[--heads] [--] <pattern>...
|
[--heads] [--] [<pattern>...]
|
||||||
'git show-ref' --exclude-existing[=<pattern>] < ref-list
|
'git show-ref' --exclude-existing[=<pattern>] < ref-list
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
@ -43,9 +43,11 @@ unreleased) version of git, that is available from 'master'
|
|||||||
branch of the `git.git` repository.
|
branch of the `git.git` repository.
|
||||||
Documentation for older releases are available here:
|
Documentation for older releases are available here:
|
||||||
|
|
||||||
* link:v1.7.0.3/git.html[documentation for release 1.7.0.3]
|
* link:v1.7.0.5/git.html[documentation for release 1.7.0.5]
|
||||||
|
|
||||||
* release notes for
|
* release notes for
|
||||||
|
link:RelNotes-1.7.0.5.txt[1.7.0.5],
|
||||||
|
link:RelNotes-1.7.0.4.txt[1.7.0.4],
|
||||||
link:RelNotes-1.7.0.3.txt[1.7.0.3],
|
link:RelNotes-1.7.0.3.txt[1.7.0.3],
|
||||||
link:RelNotes-1.7.0.2.txt[1.7.0.2],
|
link:RelNotes-1.7.0.2.txt[1.7.0.2],
|
||||||
link:RelNotes-1.7.0.1.txt[1.7.0.1],
|
link:RelNotes-1.7.0.1.txt[1.7.0.1],
|
||||||
|
@ -36,7 +36,7 @@ Git Transport
|
|||||||
|
|
||||||
The Git transport starts off by sending the command and repository
|
The Git transport starts off by sending the command and repository
|
||||||
on the wire using the pkt-line format, followed by a NUL byte and a
|
on the wire using the pkt-line format, followed by a NUL byte and a
|
||||||
hostname paramater, terminated by a NUL byte.
|
hostname parameter, terminated by a NUL byte.
|
||||||
|
|
||||||
0032git-upload-pack /project.git\0host=myserver.com\0
|
0032git-upload-pack /project.git\0host=myserver.com\0
|
||||||
|
|
||||||
@ -331,7 +331,7 @@ An incremental update (fetch) response might look like this:
|
|||||||
|
|
||||||
C: 0009done\n
|
C: 0009done\n
|
||||||
|
|
||||||
S: 003aACK 74730d410fcb6603ace96f1dc55ea6196122532d\n
|
S: 0031ACK 74730d410fcb6603ace96f1dc55ea6196122532d\n
|
||||||
S: [PACKFILE]
|
S: [PACKFILE]
|
||||||
----
|
----
|
||||||
|
|
||||||
@ -488,7 +488,7 @@ An example client/server communication might look like this:
|
|||||||
C: 0000
|
C: 0000
|
||||||
C: [PACKDATA]
|
C: [PACKDATA]
|
||||||
|
|
||||||
S: 000aunpack ok\n
|
S: 000eunpack ok\n
|
||||||
S: 0014ok refs/heads/debug\n
|
S: 0018ok refs/heads/debug\n
|
||||||
S: 0026ng refs/heads/master non-fast-forward\n
|
S: 002ang refs/heads/master non-fast-forward\n
|
||||||
----
|
----
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
GVF=GIT-VERSION-FILE
|
GVF=GIT-VERSION-FILE
|
||||||
DEF_VER=v1.7.0.3
|
DEF_VER=v1.7.0.5
|
||||||
|
|
||||||
LF='
|
LF='
|
||||||
'
|
'
|
||||||
|
3
Makefile
3
Makefile
@ -831,6 +831,7 @@ ifeq ($(uname_S),FreeBSD)
|
|||||||
NO_UINTMAX_T = YesPlease
|
NO_UINTMAX_T = YesPlease
|
||||||
NO_STRTOUMAX = YesPlease
|
NO_STRTOUMAX = YesPlease
|
||||||
endif
|
endif
|
||||||
|
PYTHON_PATH = /usr/local/bin/python
|
||||||
endif
|
endif
|
||||||
ifeq ($(uname_S),OpenBSD)
|
ifeq ($(uname_S),OpenBSD)
|
||||||
NO_STRCASESTR = YesPlease
|
NO_STRCASESTR = YesPlease
|
||||||
@ -886,6 +887,7 @@ ifeq ($(uname_S),IRIX)
|
|||||||
SNPRINTF_RETURNS_BOGUS = YesPlease
|
SNPRINTF_RETURNS_BOGUS = YesPlease
|
||||||
SHELL_PATH = /usr/gnu/bin/bash
|
SHELL_PATH = /usr/gnu/bin/bash
|
||||||
NEEDS_LIBGEN = YesPlease
|
NEEDS_LIBGEN = YesPlease
|
||||||
|
NEEDS_LIBICONV = YesPlease
|
||||||
endif
|
endif
|
||||||
ifeq ($(uname_S),IRIX64)
|
ifeq ($(uname_S),IRIX64)
|
||||||
NO_SETENV=YesPlease
|
NO_SETENV=YesPlease
|
||||||
@ -904,6 +906,7 @@ ifeq ($(uname_S),IRIX64)
|
|||||||
SNPRINTF_RETURNS_BOGUS = YesPlease
|
SNPRINTF_RETURNS_BOGUS = YesPlease
|
||||||
SHELL_PATH=/usr/gnu/bin/bash
|
SHELL_PATH=/usr/gnu/bin/bash
|
||||||
NEEDS_LIBGEN = YesPlease
|
NEEDS_LIBGEN = YesPlease
|
||||||
|
NEEDS_LIBICONV = YesPlease
|
||||||
endif
|
endif
|
||||||
ifeq ($(uname_S),HP-UX)
|
ifeq ($(uname_S),HP-UX)
|
||||||
NO_IPV6=YesPlease
|
NO_IPV6=YesPlease
|
||||||
|
2
RelNotes
2
RelNotes
@ -1 +1 @@
|
|||||||
Documentation/RelNotes-1.7.0.3.txt
|
Documentation/RelNotes-1.7.0.5.txt
|
2
branch.c
2
branch.c
@ -198,7 +198,7 @@ void create_branch(const char *head,
|
|||||||
log_all_ref_updates = 1;
|
log_all_ref_updates = 1;
|
||||||
|
|
||||||
if (forcing)
|
if (forcing)
|
||||||
snprintf(msg, sizeof msg, "branch: Reset from %s",
|
snprintf(msg, sizeof msg, "branch: Reset to %s",
|
||||||
start_name);
|
start_name);
|
||||||
else if (!dont_change_ref)
|
else if (!dont_change_ref)
|
||||||
snprintf(msg, sizeof msg, "branch: Created from %s",
|
snprintf(msg, sizeof msg, "branch: Created from %s",
|
||||||
|
@ -117,7 +117,19 @@ static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
|
static char *find_used_pathspec(const char **pathspec)
|
||||||
|
{
|
||||||
|
char *seen;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; pathspec[i]; i++)
|
||||||
|
; /* just counting */
|
||||||
|
seen = xcalloc(i, 1);
|
||||||
|
fill_pathspec_matches(pathspec, seen, i);
|
||||||
|
return seen;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
|
||||||
{
|
{
|
||||||
char *seen;
|
char *seen;
|
||||||
int i, specs;
|
int i, specs;
|
||||||
@ -137,13 +149,7 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
|
|||||||
}
|
}
|
||||||
dir->nr = dst - dir->entries;
|
dir->nr = dst - dir->entries;
|
||||||
fill_pathspec_matches(pathspec, seen, specs);
|
fill_pathspec_matches(pathspec, seen, specs);
|
||||||
|
return seen;
|
||||||
for (i = 0; i < specs; i++) {
|
|
||||||
if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i]))
|
|
||||||
die("pathspec '%s' did not match any files",
|
|
||||||
pathspec[i]);
|
|
||||||
}
|
|
||||||
free(seen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void treat_gitlinks(const char **pathspec)
|
static void treat_gitlinks(const char **pathspec)
|
||||||
@ -359,6 +365,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
|||||||
int flags;
|
int flags;
|
||||||
int add_new_files;
|
int add_new_files;
|
||||||
int require_pathspec;
|
int require_pathspec;
|
||||||
|
char *seen = NULL;
|
||||||
|
|
||||||
git_config(add_config, NULL);
|
git_config(add_config, NULL);
|
||||||
|
|
||||||
@ -418,7 +425,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
|||||||
/* This picks up the paths that are not tracked */
|
/* This picks up the paths that are not tracked */
|
||||||
baselen = fill_directory(&dir, pathspec);
|
baselen = fill_directory(&dir, pathspec);
|
||||||
if (pathspec)
|
if (pathspec)
|
||||||
prune_directory(&dir, pathspec, baselen);
|
seen = prune_directory(&dir, pathspec, baselen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refresh_only) {
|
if (refresh_only) {
|
||||||
@ -426,6 +433,19 @@ int cmd_add(int argc, const char **argv, const char *prefix)
|
|||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pathspec) {
|
||||||
|
int i;
|
||||||
|
if (!seen)
|
||||||
|
seen = find_used_pathspec(pathspec);
|
||||||
|
for (i = 0; pathspec[i]; i++) {
|
||||||
|
if (!seen[i] && pathspec[i][0]
|
||||||
|
&& !file_exists(pathspec[i]))
|
||||||
|
die("pathspec '%s' did not match any files",
|
||||||
|
pathspec[i]);
|
||||||
|
}
|
||||||
|
free(seen);
|
||||||
|
}
|
||||||
|
|
||||||
exit_status |= add_files_to_cache(prefix, pathspec, flags);
|
exit_status |= add_files_to_cache(prefix, pathspec, flags);
|
||||||
|
|
||||||
if (add_new_files)
|
if (add_new_files)
|
||||||
|
190
builtin-apply.c
190
builtin-apply.c
@ -1854,33 +1854,76 @@ static int match_fragment(struct image *img,
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *fixed_buf, *buf, *orig, *target;
|
char *fixed_buf, *buf, *orig, *target;
|
||||||
|
int preimage_limit;
|
||||||
|
|
||||||
if (preimage->nr + try_lno > img->nr)
|
if (preimage->nr + try_lno <= img->nr) {
|
||||||
|
/*
|
||||||
|
* The hunk falls within the boundaries of img.
|
||||||
|
*/
|
||||||
|
preimage_limit = preimage->nr;
|
||||||
|
if (match_end && (preimage->nr + try_lno != img->nr))
|
||||||
|
return 0;
|
||||||
|
} else if (ws_error_action == correct_ws_error &&
|
||||||
|
(ws_rule & WS_BLANK_AT_EOF) && match_end) {
|
||||||
|
/*
|
||||||
|
* This hunk that matches at the end extends beyond
|
||||||
|
* the end of img, and we are removing blank lines
|
||||||
|
* at the end of the file. This many lines from the
|
||||||
|
* beginning of the preimage must match with img, and
|
||||||
|
* the remainder of the preimage must be blank.
|
||||||
|
*/
|
||||||
|
preimage_limit = img->nr - try_lno;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* The hunk extends beyond the end of the img and
|
||||||
|
* we are not removing blanks at the end, so we
|
||||||
|
* should reject the hunk at this position.
|
||||||
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (match_beginning && try_lno)
|
if (match_beginning && try_lno)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (match_end && preimage->nr + try_lno != img->nr)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Quick hash check */
|
/* Quick hash check */
|
||||||
for (i = 0; i < preimage->nr; i++)
|
for (i = 0; i < preimage_limit; i++)
|
||||||
if (preimage->line[i].hash != img->line[try_lno + i].hash)
|
if (preimage->line[i].hash != img->line[try_lno + i].hash)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
if (preimage_limit == preimage->nr) {
|
||||||
* Do we have an exact match? If we were told to match
|
/*
|
||||||
* at the end, size must be exactly at try+fragsize,
|
* Do we have an exact match? If we were told to match
|
||||||
* otherwise try+fragsize must be still within the preimage,
|
* at the end, size must be exactly at try+fragsize,
|
||||||
* and either case, the old piece should match the preimage
|
* otherwise try+fragsize must be still within the preimage,
|
||||||
* exactly.
|
* and either case, the old piece should match the preimage
|
||||||
*/
|
* exactly.
|
||||||
if ((match_end
|
*/
|
||||||
? (try + preimage->len == img->len)
|
if ((match_end
|
||||||
: (try + preimage->len <= img->len)) &&
|
? (try + preimage->len == img->len)
|
||||||
!memcmp(img->buf + try, preimage->buf, preimage->len))
|
: (try + preimage->len <= img->len)) &&
|
||||||
return 1;
|
!memcmp(img->buf + try, preimage->buf, preimage->len))
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* The preimage extends beyond the end of img, so
|
||||||
|
* there cannot be an exact match.
|
||||||
|
*
|
||||||
|
* There must be one non-blank context line that match
|
||||||
|
* a line before the end of img.
|
||||||
|
*/
|
||||||
|
char *buf_end;
|
||||||
|
|
||||||
|
buf = preimage->buf;
|
||||||
|
buf_end = buf;
|
||||||
|
for (i = 0; i < preimage_limit; i++)
|
||||||
|
buf_end += preimage->line[i].len;
|
||||||
|
|
||||||
|
for ( ; buf < buf_end; buf++)
|
||||||
|
if (!isspace(*buf))
|
||||||
|
break;
|
||||||
|
if (buf == buf_end)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No exact match. If we are ignoring whitespace, run a line-by-line
|
* No exact match. If we are ignoring whitespace, run a line-by-line
|
||||||
@ -1891,7 +1934,10 @@ static int match_fragment(struct image *img,
|
|||||||
size_t imgoff = 0;
|
size_t imgoff = 0;
|
||||||
size_t preoff = 0;
|
size_t preoff = 0;
|
||||||
size_t postlen = postimage->len;
|
size_t postlen = postimage->len;
|
||||||
for (i = 0; i < preimage->nr; i++) {
|
size_t extra_chars;
|
||||||
|
char *preimage_eof;
|
||||||
|
char *preimage_end;
|
||||||
|
for (i = 0; i < preimage_limit; i++) {
|
||||||
size_t prelen = preimage->line[i].len;
|
size_t prelen = preimage->line[i].len;
|
||||||
size_t imglen = img->line[try_lno+i].len;
|
size_t imglen = img->line[try_lno+i].len;
|
||||||
|
|
||||||
@ -1905,20 +1951,36 @@ static int match_fragment(struct image *img,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ok, the preimage matches with whitespace fuzz. Update it and
|
* Ok, the preimage matches with whitespace fuzz.
|
||||||
* the common postimage lines to use the same whitespace as the
|
*
|
||||||
* target. imgoff now holds the true length of the target that
|
* imgoff now holds the true length of the target that
|
||||||
* matches the preimage, and we need to update the line lengths
|
* matches the preimage before the end of the file.
|
||||||
* of the preimage to match the target ones.
|
*
|
||||||
|
* Count the number of characters in the preimage that fall
|
||||||
|
* beyond the end of the file and make sure that all of them
|
||||||
|
* are whitespace characters. (This can only happen if
|
||||||
|
* we are removing blank lines at the end of the file.)
|
||||||
*/
|
*/
|
||||||
fixed_buf = xmalloc(imgoff);
|
buf = preimage_eof = preimage->buf + preoff;
|
||||||
memcpy(fixed_buf, img->buf + try, imgoff);
|
for ( ; i < preimage->nr; i++)
|
||||||
for (i = 0; i < preimage->nr; i++)
|
preoff += preimage->line[i].len;
|
||||||
preimage->line[i].len = img->line[try_lno+i].len;
|
preimage_end = preimage->buf + preoff;
|
||||||
|
for ( ; buf < preimage_end; buf++)
|
||||||
|
if (!isspace(*buf))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the preimage buffer and the postimage context lines.
|
* Update the preimage and the common postimage context
|
||||||
|
* lines to use the same whitespace as the target.
|
||||||
|
* If whitespace is missing in the target (i.e.
|
||||||
|
* if the preimage extends beyond the end of the file),
|
||||||
|
* use the whitespace from the preimage.
|
||||||
*/
|
*/
|
||||||
|
extra_chars = preimage_end - preimage_eof;
|
||||||
|
fixed_buf = xmalloc(imgoff + extra_chars);
|
||||||
|
memcpy(fixed_buf, img->buf + try, imgoff);
|
||||||
|
memcpy(fixed_buf + imgoff, preimage_eof, extra_chars);
|
||||||
|
imgoff += extra_chars;
|
||||||
update_pre_post_images(preimage, postimage,
|
update_pre_post_images(preimage, postimage,
|
||||||
fixed_buf, imgoff, postlen);
|
fixed_buf, imgoff, postlen);
|
||||||
return 1;
|
return 1;
|
||||||
@ -1932,12 +1994,16 @@ static int match_fragment(struct image *img,
|
|||||||
* it might with whitespace fuzz. We haven't been asked to
|
* it might with whitespace fuzz. We haven't been asked to
|
||||||
* ignore whitespace, we were asked to correct whitespace
|
* ignore whitespace, we were asked to correct whitespace
|
||||||
* errors, so let's try matching after whitespace correction.
|
* errors, so let's try matching after whitespace correction.
|
||||||
|
*
|
||||||
|
* The preimage may extend beyond the end of the file,
|
||||||
|
* but in this loop we will only handle the part of the
|
||||||
|
* preimage that falls within the file.
|
||||||
*/
|
*/
|
||||||
fixed_buf = xmalloc(preimage->len + 1);
|
fixed_buf = xmalloc(preimage->len + 1);
|
||||||
buf = fixed_buf;
|
buf = fixed_buf;
|
||||||
orig = preimage->buf;
|
orig = preimage->buf;
|
||||||
target = img->buf + try;
|
target = img->buf + try;
|
||||||
for (i = 0; i < preimage->nr; i++) {
|
for (i = 0; i < preimage_limit; i++) {
|
||||||
size_t fixlen; /* length after fixing the preimage */
|
size_t fixlen; /* length after fixing the preimage */
|
||||||
size_t oldlen = preimage->line[i].len;
|
size_t oldlen = preimage->line[i].len;
|
||||||
size_t tgtlen = img->line[try_lno + i].len;
|
size_t tgtlen = img->line[try_lno + i].len;
|
||||||
@ -1977,6 +2043,29 @@ static int match_fragment(struct image *img,
|
|||||||
target += tgtlen;
|
target += tgtlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now handle the lines in the preimage that falls beyond the
|
||||||
|
* end of the file (if any). They will only match if they are
|
||||||
|
* empty or only contain whitespace (if WS_BLANK_AT_EOL is
|
||||||
|
* false).
|
||||||
|
*/
|
||||||
|
for ( ; i < preimage->nr; i++) {
|
||||||
|
size_t fixlen; /* length after fixing the preimage */
|
||||||
|
size_t oldlen = preimage->line[i].len;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
/* Try fixing the line in the preimage */
|
||||||
|
fixlen = ws_fix_copy(buf, orig, oldlen, ws_rule, NULL);
|
||||||
|
|
||||||
|
for (j = 0; j < fixlen; j++)
|
||||||
|
if (!isspace(buf[j]))
|
||||||
|
goto unmatch_exit;
|
||||||
|
|
||||||
|
orig += oldlen;
|
||||||
|
buf += fixlen;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Yes, the preimage is based on an older version that still
|
* Yes, the preimage is based on an older version that still
|
||||||
* has whitespace breakages unfixed, and fixing them makes the
|
* has whitespace breakages unfixed, and fixing them makes the
|
||||||
@ -2002,9 +2091,6 @@ static int find_pos(struct image *img,
|
|||||||
unsigned long backwards, forwards, try;
|
unsigned long backwards, forwards, try;
|
||||||
int backwards_lno, forwards_lno, try_lno;
|
int backwards_lno, forwards_lno, try_lno;
|
||||||
|
|
||||||
if (preimage->nr > img->nr)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If match_beginning or match_end is specified, there is no
|
* If match_beginning or match_end is specified, there is no
|
||||||
* point starting from a wrong line that will never match and
|
* point starting from a wrong line that will never match and
|
||||||
@ -2015,7 +2101,12 @@ static int find_pos(struct image *img,
|
|||||||
else if (match_end)
|
else if (match_end)
|
||||||
line = img->nr - preimage->nr;
|
line = img->nr - preimage->nr;
|
||||||
|
|
||||||
if (line > img->nr)
|
/*
|
||||||
|
* Because the comparison is unsigned, the following test
|
||||||
|
* will also take care of a negative line number that can
|
||||||
|
* result when match_end and preimage is larger than the target.
|
||||||
|
*/
|
||||||
|
if ((size_t) line > img->nr)
|
||||||
line = img->nr;
|
line = img->nr;
|
||||||
|
|
||||||
try = 0;
|
try = 0;
|
||||||
@ -2091,12 +2182,26 @@ static void update_image(struct image *img,
|
|||||||
int i, nr;
|
int i, nr;
|
||||||
size_t remove_count, insert_count, applied_at = 0;
|
size_t remove_count, insert_count, applied_at = 0;
|
||||||
char *result;
|
char *result;
|
||||||
|
int preimage_limit;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we are removing blank lines at the end of img,
|
||||||
|
* the preimage may extend beyond the end.
|
||||||
|
* If that is the case, we must be careful only to
|
||||||
|
* remove the part of the preimage that falls within
|
||||||
|
* the boundaries of img. Initialize preimage_limit
|
||||||
|
* to the number of lines in the preimage that falls
|
||||||
|
* within the boundaries.
|
||||||
|
*/
|
||||||
|
preimage_limit = preimage->nr;
|
||||||
|
if (preimage_limit > img->nr - applied_pos)
|
||||||
|
preimage_limit = img->nr - applied_pos;
|
||||||
|
|
||||||
for (i = 0; i < applied_pos; i++)
|
for (i = 0; i < applied_pos; i++)
|
||||||
applied_at += img->line[i].len;
|
applied_at += img->line[i].len;
|
||||||
|
|
||||||
remove_count = 0;
|
remove_count = 0;
|
||||||
for (i = 0; i < preimage->nr; i++)
|
for (i = 0; i < preimage_limit; i++)
|
||||||
remove_count += img->line[applied_pos + i].len;
|
remove_count += img->line[applied_pos + i].len;
|
||||||
insert_count = postimage->len;
|
insert_count = postimage->len;
|
||||||
|
|
||||||
@ -2113,8 +2218,8 @@ static void update_image(struct image *img,
|
|||||||
result[img->len] = '\0';
|
result[img->len] = '\0';
|
||||||
|
|
||||||
/* Adjust the line table */
|
/* Adjust the line table */
|
||||||
nr = img->nr + postimage->nr - preimage->nr;
|
nr = img->nr + postimage->nr - preimage_limit;
|
||||||
if (preimage->nr < postimage->nr) {
|
if (preimage_limit < postimage->nr) {
|
||||||
/*
|
/*
|
||||||
* NOTE: this knows that we never call remove_first_line()
|
* NOTE: this knows that we never call remove_first_line()
|
||||||
* on anything other than pre/post image.
|
* on anything other than pre/post image.
|
||||||
@ -2122,10 +2227,10 @@ static void update_image(struct image *img,
|
|||||||
img->line = xrealloc(img->line, nr * sizeof(*img->line));
|
img->line = xrealloc(img->line, nr * sizeof(*img->line));
|
||||||
img->line_allocated = img->line;
|
img->line_allocated = img->line;
|
||||||
}
|
}
|
||||||
if (preimage->nr != postimage->nr)
|
if (preimage_limit != postimage->nr)
|
||||||
memmove(img->line + applied_pos + postimage->nr,
|
memmove(img->line + applied_pos + postimage->nr,
|
||||||
img->line + applied_pos + preimage->nr,
|
img->line + applied_pos + preimage_limit,
|
||||||
(img->nr - (applied_pos + preimage->nr)) *
|
(img->nr - (applied_pos + preimage_limit)) *
|
||||||
sizeof(*img->line));
|
sizeof(*img->line));
|
||||||
memcpy(img->line + applied_pos,
|
memcpy(img->line + applied_pos,
|
||||||
postimage->line,
|
postimage->line,
|
||||||
@ -2321,7 +2426,7 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
|
|||||||
|
|
||||||
if (applied_pos >= 0) {
|
if (applied_pos >= 0) {
|
||||||
if (new_blank_lines_at_end &&
|
if (new_blank_lines_at_end &&
|
||||||
preimage.nr + applied_pos == img->nr &&
|
preimage.nr + applied_pos >= img->nr &&
|
||||||
(ws_rule & WS_BLANK_AT_EOF) &&
|
(ws_rule & WS_BLANK_AT_EOF) &&
|
||||||
ws_error_action != nowarn_ws_error) {
|
ws_error_action != nowarn_ws_error) {
|
||||||
record_ws_error(WS_BLANK_AT_EOF, "+", 1, frag->linenr);
|
record_ws_error(WS_BLANK_AT_EOF, "+", 1, frag->linenr);
|
||||||
@ -2719,11 +2824,8 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
|
|||||||
if (stat_ret < 0) {
|
if (stat_ret < 0) {
|
||||||
struct checkout costate;
|
struct checkout costate;
|
||||||
/* checkout */
|
/* checkout */
|
||||||
|
memset(&costate, 0, sizeof(costate));
|
||||||
costate.base_dir = "";
|
costate.base_dir = "";
|
||||||
costate.base_dir_len = 0;
|
|
||||||
costate.force = 0;
|
|
||||||
costate.quiet = 0;
|
|
||||||
costate.not_new = 0;
|
|
||||||
costate.refresh_cache = 1;
|
costate.refresh_cache = 1;
|
||||||
if (checkout_entry(*ce, &costate, NULL) ||
|
if (checkout_entry(*ce, &costate, NULL) ||
|
||||||
lstat(old_name, st))
|
lstat(old_name, st))
|
||||||
|
@ -503,7 +503,7 @@ static void export_marks(char *file)
|
|||||||
|
|
||||||
f = fopen(file, "w");
|
f = fopen(file, "w");
|
||||||
if (!f)
|
if (!f)
|
||||||
error("Unable to open marks file %s for writing.", file);
|
die_errno("Unable to open marks file %s for writing.", file);
|
||||||
|
|
||||||
for (i = 0; i < idnums.size; i++) {
|
for (i = 0; i < idnums.size; i++) {
|
||||||
if (deco->base && deco->base->type == 1) {
|
if (deco->base && deco->base->type == 1) {
|
||||||
|
@ -13,10 +13,10 @@
|
|||||||
#include "sigchain.h"
|
#include "sigchain.h"
|
||||||
|
|
||||||
static const char * const builtin_fetch_usage[] = {
|
static const char * const builtin_fetch_usage[] = {
|
||||||
"git fetch [options] [<repository> <refspec>...]",
|
"git fetch [<options>] [<repository> [<refspec>...]]",
|
||||||
"git fetch [options] <group>",
|
"git fetch [<options>] <group>",
|
||||||
"git fetch --multiple [options] [<repository> | <group>]...",
|
"git fetch --multiple [<options>] [<repository> | <group>]...",
|
||||||
"git fetch --all [options]",
|
"git fetch --all [<options>]",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1106,8 +1106,15 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ignore_if_in_upstream)
|
if (ignore_if_in_upstream) {
|
||||||
|
/* Don't say anything if head and upstream are the same. */
|
||||||
|
if (rev.pending.nr == 2) {
|
||||||
|
struct object_array_entry *o = rev.pending.objects;
|
||||||
|
if (hashcmp(o[0].item->sha1, o[1].item->sha1) == 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
get_patch_ids(&rev, &ids, prefix);
|
get_patch_ids(&rev, &ids, prefix);
|
||||||
|
}
|
||||||
|
|
||||||
if (!use_stdout)
|
if (!use_stdout)
|
||||||
realstdout = xfdopen(xdup(1), "w");
|
realstdout = xfdopen(xdup(1), "w");
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
|
|
||||||
static const char * const push_usage[] = {
|
static const char * const push_usage[] = {
|
||||||
"git push [<options>] [<repository> <refspec>...]",
|
"git push [<options>] [<repository> [<refspec>...]]",
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@
|
|||||||
|
|
||||||
static const char * const git_reset_usage[] = {
|
static const char * const git_reset_usage[] = {
|
||||||
"git reset [--mixed | --soft | --hard | --merge] [-q] [<commit>]",
|
"git reset [--mixed | --soft | --hard | --merge] [-q] [<commit>]",
|
||||||
"git reset [--mixed] <commit> [--] <paths>...",
|
"git reset [-q] <commit> [--] <paths>...",
|
||||||
|
"git reset --patch [<commit>] [--] [<paths>...]",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -133,9 +133,12 @@ static void show_commit(struct commit *commit, void *data)
|
|||||||
*/
|
*/
|
||||||
if (graph_show_remainder(revs->graph))
|
if (graph_show_remainder(revs->graph))
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
|
if (revs->commit_format == CMIT_FMT_ONELINE)
|
||||||
|
putchar('\n');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (buf.len)
|
if (revs->commit_format != CMIT_FMT_USERFORMAT ||
|
||||||
|
buf.len)
|
||||||
printf("%s%c", buf.buf, info->hdr_termination);
|
printf("%s%c", buf.buf, info->hdr_termination);
|
||||||
}
|
}
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
|
24
color.c
24
color.c
@ -47,7 +47,7 @@ void color_parse_mem(const char *value, int value_len, const char *var,
|
|||||||
{
|
{
|
||||||
const char *ptr = value;
|
const char *ptr = value;
|
||||||
int len = value_len;
|
int len = value_len;
|
||||||
int attr = -1;
|
unsigned int attr = 0;
|
||||||
int fg = -2;
|
int fg = -2;
|
||||||
int bg = -2;
|
int bg = -2;
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ void color_parse_mem(const char *value, int value_len, const char *var,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* [fg [bg]] [attr] */
|
/* [fg [bg]] [attr]... */
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
const char *word = ptr;
|
const char *word = ptr;
|
||||||
int val, wordlen = 0;
|
int val, wordlen = 0;
|
||||||
@ -85,19 +85,27 @@ void color_parse_mem(const char *value, int value_len, const char *var,
|
|||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
val = parse_attr(word, wordlen);
|
val = parse_attr(word, wordlen);
|
||||||
if (val < 0 || attr != -1)
|
if (0 <= val)
|
||||||
|
attr |= (1 << val);
|
||||||
|
else
|
||||||
goto bad;
|
goto bad;
|
||||||
attr = val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attr >= 0 || fg >= 0 || bg >= 0) {
|
if (attr || fg >= 0 || bg >= 0) {
|
||||||
int sep = 0;
|
int sep = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
*dst++ = '\033';
|
*dst++ = '\033';
|
||||||
*dst++ = '[';
|
*dst++ = '[';
|
||||||
if (attr >= 0) {
|
|
||||||
*dst++ = '0' + attr;
|
for (i = 0; attr; i++) {
|
||||||
sep++;
|
unsigned bit = (1 << i);
|
||||||
|
if (!(attr & bit))
|
||||||
|
continue;
|
||||||
|
attr &= ~bit;
|
||||||
|
if (sep++)
|
||||||
|
*dst++ = ';';
|
||||||
|
*dst++ = '0' + i;
|
||||||
}
|
}
|
||||||
if (fg >= 0) {
|
if (fg >= 0) {
|
||||||
if (sep++)
|
if (sep++)
|
||||||
|
16
color.h
16
color.h
@ -1,8 +1,20 @@
|
|||||||
#ifndef COLOR_H
|
#ifndef COLOR_H
|
||||||
#define COLOR_H
|
#define COLOR_H
|
||||||
|
|
||||||
/* "\033[1;38;5;2xx;48;5;2xxm\0" is 23 bytes */
|
/* 2 + (2 * num_attrs) + 8 + 1 + 8 + 'm' + NUL */
|
||||||
#define COLOR_MAXLEN 24
|
/* "\033[1;2;4;5;7;38;5;2xx;48;5;2xxm\0" */
|
||||||
|
/*
|
||||||
|
* The maximum length of ANSI color sequence we would generate:
|
||||||
|
* - leading ESC '[' 2
|
||||||
|
* - attr + ';' 2 * 8 (e.g. "1;")
|
||||||
|
* - fg color + ';' 9 (e.g. "38;5;2xx;")
|
||||||
|
* - fg color + ';' 9 (e.g. "48;5;2xx;")
|
||||||
|
* - terminating 'm' NUL 2
|
||||||
|
*
|
||||||
|
* The above overcounts attr (we only use 5 not 8) and one semicolon
|
||||||
|
* but it is close enough.
|
||||||
|
*/
|
||||||
|
#define COLOR_MAXLEN 40
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMPORTANT: Due to the way these color codes are emulated on Windows,
|
* IMPORTANT: Due to the way these color codes are emulated on Windows,
|
||||||
|
@ -17,6 +17,8 @@ static inline uint32_t default_swab32(uint32_t val)
|
|||||||
((val & 0x000000ff) << 24));
|
((val & 0x000000ff) << 24));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef bswap32
|
||||||
|
|
||||||
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
|
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
|
||||||
|
|
||||||
#define bswap32(x) ({ \
|
#define bswap32(x) ({ \
|
||||||
|
@ -259,8 +259,17 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
|
|||||||
int fh, rc;
|
int fh, rc;
|
||||||
|
|
||||||
/* must have write permission */
|
/* must have write permission */
|
||||||
if ((fh = open(file_name, O_RDWR | O_BINARY)) < 0)
|
DWORD attrs = GetFileAttributes(file_name);
|
||||||
return -1;
|
if (attrs != INVALID_FILE_ATTRIBUTES &&
|
||||||
|
(attrs & FILE_ATTRIBUTE_READONLY)) {
|
||||||
|
/* ignore errors here; open() will report them */
|
||||||
|
SetFileAttributes(file_name, attrs & ~FILE_ATTRIBUTE_READONLY);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((fh = open(file_name, O_RDWR | O_BINARY)) < 0) {
|
||||||
|
rc = -1;
|
||||||
|
goto revert_attrs;
|
||||||
|
}
|
||||||
|
|
||||||
time_t_to_filetime(times->modtime, &mft);
|
time_t_to_filetime(times->modtime, &mft);
|
||||||
time_t_to_filetime(times->actime, &aft);
|
time_t_to_filetime(times->actime, &aft);
|
||||||
@ -270,6 +279,13 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
|
|||||||
} else
|
} else
|
||||||
rc = 0;
|
rc = 0;
|
||||||
close(fh);
|
close(fh);
|
||||||
|
|
||||||
|
revert_attrs:
|
||||||
|
if (attrs != INVALID_FILE_ATTRIBUTES &&
|
||||||
|
(attrs & FILE_ATTRIBUTE_READONLY)) {
|
||||||
|
/* ignore errors again */
|
||||||
|
SetFileAttributes(file_name, attrs);
|
||||||
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
## zip archive frontend for git-fast-import
|
## zip archive frontend for git-fast-import
|
||||||
##
|
##
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#! /usr/bin/python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
""" hg-to-git.py - A Mercurial to GIT converter
|
""" hg-to-git.py - A Mercurial to GIT converter
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/env python
|
||||||
#
|
#
|
||||||
# This tool is copyright (c) 2006, Sean Estabrooks.
|
# This tool is copyright (c) 2006, Sean Estabrooks.
|
||||||
# It is released under the Gnu Public License, version 2.
|
# It is released under the Gnu Public License, version 2.
|
||||||
|
11
daemon.c
11
daemon.c
@ -590,14 +590,17 @@ static int execute(struct sockaddr *addr)
|
|||||||
static int addrcmp(const struct sockaddr_storage *s1,
|
static int addrcmp(const struct sockaddr_storage *s1,
|
||||||
const struct sockaddr_storage *s2)
|
const struct sockaddr_storage *s2)
|
||||||
{
|
{
|
||||||
if (s1->ss_family != s2->ss_family)
|
const struct sockaddr *sa1 = (const struct sockaddr*) s1;
|
||||||
return s1->ss_family - s2->ss_family;
|
const struct sockaddr *sa2 = (const struct sockaddr*) s2;
|
||||||
if (s1->ss_family == AF_INET)
|
|
||||||
|
if (sa1->sa_family != sa2->sa_family)
|
||||||
|
return sa1->sa_family - sa2->sa_family;
|
||||||
|
if (sa1->sa_family == AF_INET)
|
||||||
return memcmp(&((struct sockaddr_in *)s1)->sin_addr,
|
return memcmp(&((struct sockaddr_in *)s1)->sin_addr,
|
||||||
&((struct sockaddr_in *)s2)->sin_addr,
|
&((struct sockaddr_in *)s2)->sin_addr,
|
||||||
sizeof(struct in_addr));
|
sizeof(struct in_addr));
|
||||||
#ifndef NO_IPV6
|
#ifndef NO_IPV6
|
||||||
if (s1->ss_family == AF_INET6)
|
if (sa1->sa_family == AF_INET6)
|
||||||
return memcmp(&((struct sockaddr_in6 *)s1)->sin6_addr,
|
return memcmp(&((struct sockaddr_in6 *)s1)->sin6_addr,
|
||||||
&((struct sockaddr_in6 *)s2)->sin6_addr,
|
&((struct sockaddr_in6 *)s2)->sin6_addr,
|
||||||
sizeof(struct in6_addr));
|
sizeof(struct in6_addr));
|
||||||
|
41
diff.c
41
diff.c
@ -14,6 +14,7 @@
|
|||||||
#include "userdiff.h"
|
#include "userdiff.h"
|
||||||
#include "sigchain.h"
|
#include "sigchain.h"
|
||||||
#include "submodule.h"
|
#include "submodule.h"
|
||||||
|
#include "ll-merge.h"
|
||||||
|
|
||||||
#ifdef NO_FAST_WORKING_DIRECTORY
|
#ifdef NO_FAST_WORKING_DIRECTORY
|
||||||
#define FAST_WORKING_DIRECTORY 0
|
#define FAST_WORKING_DIRECTORY 0
|
||||||
@ -1370,37 +1371,32 @@ static void free_diffstat_info(struct diffstat_t *diffstat)
|
|||||||
struct checkdiff_t {
|
struct checkdiff_t {
|
||||||
const char *filename;
|
const char *filename;
|
||||||
int lineno;
|
int lineno;
|
||||||
|
int conflict_marker_size;
|
||||||
struct diff_options *o;
|
struct diff_options *o;
|
||||||
unsigned ws_rule;
|
unsigned ws_rule;
|
||||||
unsigned status;
|
unsigned status;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int is_conflict_marker(const char *line, unsigned long len)
|
static int is_conflict_marker(const char *line, int marker_size, unsigned long len)
|
||||||
{
|
{
|
||||||
char firstchar;
|
char firstchar;
|
||||||
int cnt;
|
int cnt;
|
||||||
|
|
||||||
if (len < 8)
|
if (len < marker_size + 1)
|
||||||
return 0;
|
return 0;
|
||||||
firstchar = line[0];
|
firstchar = line[0];
|
||||||
switch (firstchar) {
|
switch (firstchar) {
|
||||||
case '=': case '>': case '<':
|
case '=': case '>': case '<': case '|':
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
for (cnt = 1; cnt < 7; cnt++)
|
for (cnt = 1; cnt < marker_size; cnt++)
|
||||||
if (line[cnt] != firstchar)
|
if (line[cnt] != firstchar)
|
||||||
return 0;
|
return 0;
|
||||||
/* line[0] thru line[6] are same as firstchar */
|
/* line[1] thru line[marker_size-1] are same as firstchar */
|
||||||
if (firstchar == '=') {
|
if (len < marker_size + 1 || !isspace(line[marker_size]))
|
||||||
/* divider between ours and theirs? */
|
|
||||||
if (len != 8 || line[7] != '\n')
|
|
||||||
return 0;
|
|
||||||
} else if (len < 8 || !isspace(line[7])) {
|
|
||||||
/* not divider before ours nor after theirs */
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1408,6 +1404,7 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)
|
|||||||
{
|
{
|
||||||
struct checkdiff_t *data = priv;
|
struct checkdiff_t *data = priv;
|
||||||
int color_diff = DIFF_OPT_TST(data->o, COLOR_DIFF);
|
int color_diff = DIFF_OPT_TST(data->o, COLOR_DIFF);
|
||||||
|
int marker_size = data->conflict_marker_size;
|
||||||
const char *ws = diff_get_color(color_diff, DIFF_WHITESPACE);
|
const char *ws = diff_get_color(color_diff, DIFF_WHITESPACE);
|
||||||
const char *reset = diff_get_color(color_diff, DIFF_RESET);
|
const char *reset = diff_get_color(color_diff, DIFF_RESET);
|
||||||
const char *set = diff_get_color(color_diff, DIFF_FILE_NEW);
|
const char *set = diff_get_color(color_diff, DIFF_FILE_NEW);
|
||||||
@ -1416,7 +1413,7 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)
|
|||||||
if (line[0] == '+') {
|
if (line[0] == '+') {
|
||||||
unsigned bad;
|
unsigned bad;
|
||||||
data->lineno++;
|
data->lineno++;
|
||||||
if (is_conflict_marker(line + 1, len - 1)) {
|
if (is_conflict_marker(line + 1, marker_size, len - 1)) {
|
||||||
data->status |= 1;
|
data->status |= 1;
|
||||||
fprintf(data->o->file,
|
fprintf(data->o->file,
|
||||||
"%s:%d: leftover conflict marker\n",
|
"%s:%d: leftover conflict marker\n",
|
||||||
@ -1860,6 +1857,7 @@ static void builtin_checkdiff(const char *name_a, const char *name_b,
|
|||||||
data.lineno = 0;
|
data.lineno = 0;
|
||||||
data.o = o;
|
data.o = o;
|
||||||
data.ws_rule = whitespace_rule(attr_path);
|
data.ws_rule = whitespace_rule(attr_path);
|
||||||
|
data.conflict_marker_size = ll_merge_marker_size(attr_path);
|
||||||
|
|
||||||
if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
|
if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
|
||||||
die("unable to read files to diff");
|
die("unable to read files to diff");
|
||||||
@ -3865,6 +3863,7 @@ static char *run_textconv(const char *pgm, struct diff_filespec *spec,
|
|||||||
const char **arg = argv;
|
const char **arg = argv;
|
||||||
struct child_process child;
|
struct child_process child;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
temp = prepare_temp_file(spec->path, spec);
|
temp = prepare_temp_file(spec->path, spec);
|
||||||
*arg++ = pgm;
|
*arg++ = pgm;
|
||||||
@ -3875,16 +3874,20 @@ static char *run_textconv(const char *pgm, struct diff_filespec *spec,
|
|||||||
child.use_shell = 1;
|
child.use_shell = 1;
|
||||||
child.argv = argv;
|
child.argv = argv;
|
||||||
child.out = -1;
|
child.out = -1;
|
||||||
if (start_command(&child) != 0 ||
|
if (start_command(&child)) {
|
||||||
strbuf_read(&buf, child.out, 0) < 0 ||
|
|
||||||
finish_command(&child) != 0) {
|
|
||||||
close(child.out);
|
|
||||||
strbuf_release(&buf);
|
|
||||||
remove_tempfile();
|
remove_tempfile();
|
||||||
error("error running textconv command '%s'", pgm);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strbuf_read(&buf, child.out, 0) < 0)
|
||||||
|
err = error("error reading from textconv command '%s'", pgm);
|
||||||
close(child.out);
|
close(child.out);
|
||||||
|
|
||||||
|
if (finish_command(&child) || err) {
|
||||||
|
strbuf_release(&buf);
|
||||||
|
remove_tempfile();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
remove_tempfile();
|
remove_tempfile();
|
||||||
|
|
||||||
return strbuf_detach(&buf, outsize);
|
return strbuf_detach(&buf, outsize);
|
||||||
|
20
dir.c
20
dir.c
@ -594,13 +594,29 @@ static int simplify_away(const char *path, int pathlen, const struct path_simpli
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int in_pathspec(const char *path, int len, const struct path_simplify *simplify)
|
/*
|
||||||
|
* This function tells us whether an excluded path matches a
|
||||||
|
* list of "interesting" pathspecs. That is, whether a path matched
|
||||||
|
* by any of the pathspecs could possibly be ignored by excluding
|
||||||
|
* the specified path. This can happen if:
|
||||||
|
*
|
||||||
|
* 1. the path is mentioned explicitly in the pathspec
|
||||||
|
*
|
||||||
|
* 2. the path is a directory prefix of some element in the
|
||||||
|
* pathspec
|
||||||
|
*/
|
||||||
|
static int exclude_matches_pathspec(const char *path, int len,
|
||||||
|
const struct path_simplify *simplify)
|
||||||
{
|
{
|
||||||
if (simplify) {
|
if (simplify) {
|
||||||
for (; simplify->path; simplify++) {
|
for (; simplify->path; simplify++) {
|
||||||
if (len == simplify->len
|
if (len == simplify->len
|
||||||
&& !memcmp(path, simplify->path, len))
|
&& !memcmp(path, simplify->path, len))
|
||||||
return 1;
|
return 1;
|
||||||
|
if (len < simplify->len
|
||||||
|
&& simplify->path[len] == '/'
|
||||||
|
&& !memcmp(path, simplify->path, len))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -678,7 +694,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir,
|
|||||||
{
|
{
|
||||||
int exclude = excluded(dir, path, &dtype);
|
int exclude = excluded(dir, path, &dtype);
|
||||||
if (exclude && (dir->flags & DIR_COLLECT_IGNORED)
|
if (exclude && (dir->flags & DIR_COLLECT_IGNORED)
|
||||||
&& in_pathspec(path, *len, simplify))
|
&& exclude_matches_pathspec(path, *len, simplify))
|
||||||
dir_add_ignored(dir, path, *len);
|
dir_add_ignored(dir, path, *len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -78,11 +78,13 @@ sub generate_command
|
|||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
if ($arg eq '-g' || $arg eq '--gui') {
|
if ($arg eq '-g' || $arg eq '--gui') {
|
||||||
my $tool = Git::command_oneline('config',
|
eval {
|
||||||
'diff.guitool');
|
my $tool = Git::command_oneline('config',
|
||||||
if (length($tool)) {
|
'diff.guitool');
|
||||||
$ENV{GIT_DIFF_TOOL} = $tool;
|
if (length($tool)) {
|
||||||
}
|
$ENV{GIT_DIFF_TOOL} = $tool;
|
||||||
|
}
|
||||||
|
};
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
if ($arg eq '-y' || $arg eq '--no-prompt') {
|
if ($arg eq '-y' || $arg eq '--no-prompt') {
|
||||||
|
@ -162,9 +162,12 @@ my $compose_filename;
|
|||||||
|
|
||||||
# Handle interactive edition of files.
|
# Handle interactive edition of files.
|
||||||
my $multiedit;
|
my $multiedit;
|
||||||
my $editor = Git::command_oneline('var', 'GIT_EDITOR');
|
my $editor;
|
||||||
|
|
||||||
sub do_edit {
|
sub do_edit {
|
||||||
|
if (!defined($editor)) {
|
||||||
|
$editor = Git::command_oneline('var', 'GIT_EDITOR');
|
||||||
|
}
|
||||||
if (defined($multiedit) && !$multiedit) {
|
if (defined($multiedit) && !$multiedit) {
|
||||||
map {
|
map {
|
||||||
system('sh', '-c', $editor.' "$@"', $editor, $_);
|
system('sh', '-c', $editor.' "$@"', $editor, $_);
|
||||||
|
@ -210,14 +210,18 @@ list_stash () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
show_stash () {
|
show_stash () {
|
||||||
|
have_stash || die 'No stash found'
|
||||||
|
|
||||||
flags=$(git rev-parse --no-revs --flags "$@")
|
flags=$(git rev-parse --no-revs --flags "$@")
|
||||||
if test -z "$flags"
|
if test -z "$flags"
|
||||||
then
|
then
|
||||||
flags=--stat
|
flags=--stat
|
||||||
fi
|
fi
|
||||||
|
|
||||||
w_commit=$(git rev-parse --verify --default $ref_stash "$@") &&
|
w_commit=$(git rev-parse --quiet --verify --default $ref_stash "$@") &&
|
||||||
b_commit=$(git rev-parse --verify "$w_commit^") &&
|
b_commit=$(git rev-parse --quiet --verify "$w_commit^") ||
|
||||||
|
die "'$*' is not a stash"
|
||||||
|
|
||||||
git diff $flags $b_commit $w_commit
|
git diff $flags $b_commit $w_commit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,11 @@ pysetupfile:=setup.py
|
|||||||
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
|
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
|
||||||
|
|
||||||
ifndef PYTHON_PATH
|
ifndef PYTHON_PATH
|
||||||
PYTHON_PATH = /usr/bin/python
|
ifeq ($(uname_S),FreeBSD)
|
||||||
|
PYTHON_PATH = /usr/local/bin/python
|
||||||
|
else
|
||||||
|
PYTHON_PATH = /usr/bin/python
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
ifndef prefix
|
ifndef prefix
|
||||||
prefix = $(HOME)
|
prefix = $(HOME)
|
||||||
|
@ -2209,8 +2209,7 @@ sub config_to_multi {
|
|||||||
sub git_get_project_config {
|
sub git_get_project_config {
|
||||||
my ($key, $type) = @_;
|
my ($key, $type) = @_;
|
||||||
|
|
||||||
# do we have project
|
return unless defined $git_dir;
|
||||||
return unless (defined $project && defined $git_dir);
|
|
||||||
|
|
||||||
# key sanity check
|
# key sanity check
|
||||||
return unless ($key);
|
return unless ($key);
|
||||||
|
@ -538,15 +538,19 @@ static void service_rpc(char *service_name)
|
|||||||
|
|
||||||
static NORETURN void die_webcgi(const char *err, va_list params)
|
static NORETURN void die_webcgi(const char *err, va_list params)
|
||||||
{
|
{
|
||||||
char buffer[1000];
|
static int dead;
|
||||||
|
|
||||||
http_status(500, "Internal Server Error");
|
if (!dead) {
|
||||||
hdr_nocache();
|
char buffer[1000];
|
||||||
end_headers();
|
dead = 1;
|
||||||
|
|
||||||
vsnprintf(buffer, sizeof(buffer), err, params);
|
vsnprintf(buffer, sizeof(buffer), err, params);
|
||||||
fprintf(stderr, "fatal: %s\n", buffer);
|
fprintf(stderr, "fatal: %s\n", buffer);
|
||||||
exit(0);
|
http_status(500, "Internal Server Error");
|
||||||
|
hdr_nocache();
|
||||||
|
end_headers();
|
||||||
|
}
|
||||||
|
exit(0); /* we successfully reported a failure ;-) */
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* getdir(void)
|
static char* getdir(void)
|
||||||
|
@ -1306,8 +1306,14 @@ static int count_messages(struct msg_data *msg)
|
|||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (!prefixcmp(p, "From ")) {
|
if (!prefixcmp(p, "From ")) {
|
||||||
|
p = strstr(p+5, "\nFrom: ");
|
||||||
|
if (!p) break;
|
||||||
|
p = strstr(p+7, "\nDate: ");
|
||||||
|
if (!p) break;
|
||||||
|
p = strstr(p+7, "\nSubject: ");
|
||||||
|
if (!p) break;
|
||||||
|
p += 10;
|
||||||
count++;
|
count++;
|
||||||
p += 5;
|
|
||||||
}
|
}
|
||||||
p = strstr(p+5, "\nFrom ");
|
p = strstr(p+5, "\nFrom ");
|
||||||
if (!p)
|
if (!p)
|
||||||
|
11
refs.c
11
refs.c
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
/* ISSYMREF=01 and ISPACKED=02 are public interfaces */
|
/* ISSYMREF=01 and ISPACKED=02 are public interfaces */
|
||||||
#define REF_KNOWS_PEELED 04
|
#define REF_KNOWS_PEELED 04
|
||||||
|
#define REF_BROKEN 010
|
||||||
|
|
||||||
struct ref_list {
|
struct ref_list {
|
||||||
struct ref_list *next;
|
struct ref_list *next;
|
||||||
@ -275,8 +276,10 @@ static struct ref_list *get_ref_dir(const char *base, struct ref_list *list)
|
|||||||
list = get_ref_dir(ref, list);
|
list = get_ref_dir(ref, list);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!resolve_ref(ref, sha1, 1, &flag))
|
if (!resolve_ref(ref, sha1, 1, &flag)) {
|
||||||
hashclr(sha1);
|
hashclr(sha1);
|
||||||
|
flag |= REF_BROKEN;
|
||||||
|
}
|
||||||
list = add_ref(ref, sha1, flag, list, NULL);
|
list = add_ref(ref, sha1, flag, list, NULL);
|
||||||
}
|
}
|
||||||
free(ref);
|
free(ref);
|
||||||
@ -539,10 +542,10 @@ static int do_one_ref(const char *base, each_ref_fn fn, int trim,
|
|||||||
{
|
{
|
||||||
if (strncmp(base, entry->name, trim))
|
if (strncmp(base, entry->name, trim))
|
||||||
return 0;
|
return 0;
|
||||||
/* Is this a "negative ref" that represents a deleted ref? */
|
|
||||||
if (is_null_sha1(entry->sha1))
|
|
||||||
return 0;
|
|
||||||
if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
|
if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
|
||||||
|
if (entry->flag & REF_BROKEN)
|
||||||
|
return 0; /* ignore dangling symref */
|
||||||
if (!has_sha1_file(entry->sha1)) {
|
if (!has_sha1_file(entry->sha1)) {
|
||||||
error("%s does not point to a valid object!", entry->name);
|
error("%s does not point to a valid object!", entry->name);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -108,13 +108,17 @@ $test_case 'merge (case change)' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
$test_case 'add (with different case)' '
|
|
||||||
|
|
||||||
|
test_expect_failure 'add (with different case)' '
|
||||||
|
|
||||||
git reset --hard initial &&
|
git reset --hard initial &&
|
||||||
rm camelcase &&
|
rm camelcase &&
|
||||||
echo 1 >CamelCase &&
|
echo 1 >CamelCase &&
|
||||||
git add CamelCase &&
|
git add CamelCase &&
|
||||||
test $(git ls-files | grep -i camelcase | wc -l) = 1
|
camel=$(git ls-files | grep -i camelcase) &&
|
||||||
|
test $(echo "$camel" | wc -l) = 1 &&
|
||||||
|
test "z$(git cat-file blob :$camel)" = z1
|
||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
@ -176,4 +176,9 @@ test_expect_success 'add -u resolves unmerged paths' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '"add -u non-existent" should fail' '
|
||||||
|
test_must_fail git add -u non-existent &&
|
||||||
|
! (git ls-files | grep "non-existent")
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
79
t/t2204-add-ignored.sh
Executable file
79
t/t2204-add-ignored.sh
Executable file
@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='giving ignored paths to git add'
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_expect_success setup '
|
||||||
|
mkdir sub dir dir/sub &&
|
||||||
|
echo sub >.gitignore &&
|
||||||
|
echo ign >>.gitignore &&
|
||||||
|
for p in . sub dir dir/sub
|
||||||
|
do
|
||||||
|
>"$p/ign" &&
|
||||||
|
>"$p/file" || exit 1
|
||||||
|
done
|
||||||
|
'
|
||||||
|
|
||||||
|
for i in file dir/file dir 'd*'
|
||||||
|
do
|
||||||
|
test_expect_success "no complaints for unignored $i" '
|
||||||
|
rm -f .git/index &&
|
||||||
|
git add "$i" &&
|
||||||
|
git ls-files "$i" >out &&
|
||||||
|
test -s out
|
||||||
|
'
|
||||||
|
done
|
||||||
|
|
||||||
|
for i in ign dir/ign dir/sub dir/sub/*ign sub/file sub sub/*
|
||||||
|
do
|
||||||
|
test_expect_success "complaints for ignored $i" '
|
||||||
|
rm -f .git/index &&
|
||||||
|
test_must_fail git add "$i" 2>err &&
|
||||||
|
git ls-files "$i" >out &&
|
||||||
|
! test -s out &&
|
||||||
|
grep -e "Use -f if" err &&
|
||||||
|
cat err
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success "complaints for ignored $i with unignored file" '
|
||||||
|
rm -f .git/index &&
|
||||||
|
test_must_fail git add "$i" file 2>err &&
|
||||||
|
git ls-files "$i" >out &&
|
||||||
|
! test -s out &&
|
||||||
|
grep -e "Use -f if" err &&
|
||||||
|
cat err
|
||||||
|
'
|
||||||
|
done
|
||||||
|
|
||||||
|
for i in sub sub/*
|
||||||
|
do
|
||||||
|
test_expect_success "complaints for ignored $i in dir" '
|
||||||
|
rm -f .git/index &&
|
||||||
|
(
|
||||||
|
cd dir &&
|
||||||
|
test_must_fail git add "$i" 2>err &&
|
||||||
|
git ls-files "$i" >out &&
|
||||||
|
! test -s out &&
|
||||||
|
grep -e "Use -f if" err &&
|
||||||
|
cat err
|
||||||
|
)
|
||||||
|
'
|
||||||
|
done
|
||||||
|
|
||||||
|
for i in ign file
|
||||||
|
do
|
||||||
|
test_expect_success "complaints for ignored $i in sub" '
|
||||||
|
rm -f .git/index &&
|
||||||
|
(
|
||||||
|
cd sub &&
|
||||||
|
test_must_fail git add "$i" 2>err &&
|
||||||
|
git ls-files "$i" >out &&
|
||||||
|
! test -s out &&
|
||||||
|
grep -e "Use -f if" err &&
|
||||||
|
cat err
|
||||||
|
)
|
||||||
|
'
|
||||||
|
done
|
||||||
|
|
||||||
|
test_done
|
126
t/t3417-rebase-whitespace-fix.sh
Executable file
126
t/t3417-rebase-whitespace-fix.sh
Executable file
@ -0,0 +1,126 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='git rebase --whitespace=fix
|
||||||
|
|
||||||
|
This test runs git rebase --whitespace=fix and make sure that it works.
|
||||||
|
'
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
# prepare initial revision of "file" with a blank line at the end
|
||||||
|
cat >file <<EOF
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# expected contents in "file" after rebase
|
||||||
|
cat >expect-first <<EOF
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# prepare second revision of "file"
|
||||||
|
cat >second <<EOF
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
|
||||||
|
d
|
||||||
|
e
|
||||||
|
f
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# expected contents in second revision after rebase
|
||||||
|
cat >expect-second <<EOF
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
|
||||||
|
d
|
||||||
|
e
|
||||||
|
f
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'blank line at end of file; extend at end of file' '
|
||||||
|
git commit --allow-empty -m "Initial empty commit" &&
|
||||||
|
git add file && git commit -m first &&
|
||||||
|
mv second file &&
|
||||||
|
git add file && git commit -m second &&
|
||||||
|
git rebase --whitespace=fix HEAD^^ &&
|
||||||
|
git diff --exit-code HEAD^:file expect-first &&
|
||||||
|
test_cmp file expect-second
|
||||||
|
'
|
||||||
|
|
||||||
|
# prepare third revision of "file"
|
||||||
|
sed -e's/Z//' >third <<EOF
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
|
||||||
|
d
|
||||||
|
e
|
||||||
|
f
|
||||||
|
Z
|
||||||
|
Z
|
||||||
|
h
|
||||||
|
i
|
||||||
|
j
|
||||||
|
k
|
||||||
|
l
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sed -e's/ //g' <third >expect-third
|
||||||
|
|
||||||
|
test_expect_success 'two blanks line at end of file; extend at end of file' '
|
||||||
|
cp third file && git add file && git commit -m third &&
|
||||||
|
git rebase --whitespace=fix HEAD^^ &&
|
||||||
|
git diff --exit-code HEAD^:file expect-second &&
|
||||||
|
test_cmp file expect-third
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'same, but do not remove trailing spaces' '
|
||||||
|
git config core.whitespace "-blank-at-eol" &&
|
||||||
|
git reset --hard HEAD^ &&
|
||||||
|
cp third file && git add file && git commit -m third &&
|
||||||
|
git rebase --whitespace=fix HEAD^^
|
||||||
|
git diff --exit-code HEAD^:file expect-second &&
|
||||||
|
test_cmp file third
|
||||||
|
'
|
||||||
|
|
||||||
|
sed -e's/Z//' >beginning <<EOF
|
||||||
|
a
|
||||||
|
Z
|
||||||
|
Z
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat >expect-beginning <<EOF
|
||||||
|
a
|
||||||
|
|
||||||
|
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'at beginning of file' '
|
||||||
|
git config core.whitespace "blank-at-eol" &&
|
||||||
|
cp beginning file &&
|
||||||
|
git commit -m beginning file &&
|
||||||
|
for i in 1 2 3 4 5; do
|
||||||
|
echo $i
|
||||||
|
done >> file &&
|
||||||
|
git commit -m more file &&
|
||||||
|
git rebase --whitespace=fix HEAD^^ &&
|
||||||
|
test_cmp file expect-beginning
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
@ -255,4 +255,9 @@ test_expect_success 'git add to resolve conflicts on otherwise ignored path' '
|
|||||||
git add track-this
|
git add track-this
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '"add non-existent" should fail' '
|
||||||
|
test_must_fail git add non-existent &&
|
||||||
|
! (git ls-files | grep "non-existent")
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -557,4 +557,8 @@ test_expect_success 'format-patch -- <path>' '
|
|||||||
! grep "Use .--" error
|
! grep "Use .--" error
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'format-patch --ignore-if-in-upstream HEAD' '
|
||||||
|
git format-patch --ignore-if-in-upstream HEAD
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -120,7 +120,6 @@ test_expect_success '--check with --no-pager returns 2 for dirty difference' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
|
||||||
test_expect_success 'check should test not just the last line' '
|
test_expect_success 'check should test not just the last line' '
|
||||||
echo "" >>a &&
|
echo "" >>a &&
|
||||||
git --no-pager diff --check
|
git --no-pager diff --check
|
||||||
@ -142,4 +141,26 @@ test_expect_success 'check detects leftover conflict markers' '
|
|||||||
git reset --hard
|
git reset --hard
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'check honors conflict marker length' '
|
||||||
|
git reset --hard &&
|
||||||
|
echo ">>>>>>> boo" >>b &&
|
||||||
|
echo "======" >>a &&
|
||||||
|
git diff --check a &&
|
||||||
|
(
|
||||||
|
git diff --check b
|
||||||
|
test $? = 2
|
||||||
|
) &&
|
||||||
|
git reset --hard &&
|
||||||
|
echo ">>>>>>>> boo" >>b &&
|
||||||
|
echo "========" >>a &&
|
||||||
|
git diff --check &&
|
||||||
|
echo "b conflict-marker-size=8" >.gitattributes &&
|
||||||
|
(
|
||||||
|
git diff --check b
|
||||||
|
test $? = 2
|
||||||
|
) &&
|
||||||
|
git diff --check a &&
|
||||||
|
git reset --hard
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -8,14 +8,13 @@ test_description='Test diff/status color escape codes'
|
|||||||
|
|
||||||
color()
|
color()
|
||||||
{
|
{
|
||||||
git config diff.color.new "$1" &&
|
actual=$(git config --get-color no.such.slot "$1") &&
|
||||||
test "`git config --get-color diff.color.new`" = "$2"
|
test "$actual" = "$2"
|
||||||
}
|
}
|
||||||
|
|
||||||
invalid_color()
|
invalid_color()
|
||||||
{
|
{
|
||||||
git config diff.color.new "$1" &&
|
test_must_fail git config --get-color no.such.slot "$1"
|
||||||
test -z "`git config --get-color diff.color.new 2>/dev/null`"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test_expect_success 'reset' '
|
test_expect_success 'reset' '
|
||||||
@ -42,6 +41,14 @@ test_expect_success 'fg bg attr' '
|
|||||||
color "blue red ul" "[4;34;41m"
|
color "blue red ul" "[4;34;41m"
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'fg bg attr...' '
|
||||||
|
color "blue bold dim ul blink reverse" "[1;2;4;5;7;34m"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'long color specification' '
|
||||||
|
color "254 255 bold dim ul blink reverse" "[1;2;4;5;7;38;5;254;48;5;255m"
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success '256 colors' '
|
test_expect_success '256 colors' '
|
||||||
color "254 bold 255" "[1;38;5;254;48;5;255m"
|
color "254 bold 255" "[1;38;5;254;48;5;255m"
|
||||||
'
|
'
|
||||||
|
@ -134,4 +134,13 @@ test_expect_success 'two lines' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'apply patch with 3 context lines matching at end' '
|
||||||
|
{ echo a; echo b; echo c; echo d; } >file &&
|
||||||
|
git add file &&
|
||||||
|
echo e >>file &&
|
||||||
|
git diff >patch &&
|
||||||
|
>file &&
|
||||||
|
test_must_fail git apply patch
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -261,4 +261,174 @@ test_expect_success 'blank but not empty at EOF' '
|
|||||||
grep "new blank line at EOF" error
|
grep "new blank line at EOF" error
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'applying beyond EOF requires one non-blank context line' '
|
||||||
|
{ echo; echo; echo; echo; } >one &&
|
||||||
|
git add one &&
|
||||||
|
{ echo b; } >>one &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
|
||||||
|
git checkout one &&
|
||||||
|
{ echo a; echo; } >one &&
|
||||||
|
cp one expect &&
|
||||||
|
test_must_fail git apply --whitespace=fix patch &&
|
||||||
|
test_cmp one expect &&
|
||||||
|
test_must_fail git apply --ignore-space-change --whitespace=fix patch &&
|
||||||
|
test_cmp one expect
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'tons of blanks at EOF should not apply' '
|
||||||
|
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; do
|
||||||
|
echo; echo; echo; echo;
|
||||||
|
done >one &&
|
||||||
|
git add one &&
|
||||||
|
echo a >>one &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
|
||||||
|
>one &&
|
||||||
|
test_must_fail git apply --whitespace=fix patch &&
|
||||||
|
test_must_fail git apply --ignore-space-change --whitespace=fix patch
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'missing blank line at end with --whitespace=fix' '
|
||||||
|
echo a >one &&
|
||||||
|
echo >>one &&
|
||||||
|
git add one &&
|
||||||
|
echo b >>one &&
|
||||||
|
cp one expect &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
echo a >one &&
|
||||||
|
cp one saved-one &&
|
||||||
|
test_must_fail git apply patch &&
|
||||||
|
git apply --whitespace=fix patch &&
|
||||||
|
test_cmp one expect &&
|
||||||
|
mv saved-one one &&
|
||||||
|
git apply --ignore-space-change --whitespace=fix patch &&
|
||||||
|
test_cmp one expect
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'two missing blank lines at end with --whitespace=fix' '
|
||||||
|
{ echo a; echo; echo b; echo c; } >one &&
|
||||||
|
cp one no-blank-lines &&
|
||||||
|
{ echo; echo; } >>one &&
|
||||||
|
git add one &&
|
||||||
|
echo d >>one &&
|
||||||
|
cp one expect &&
|
||||||
|
echo >>one &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
cp no-blank-lines one &&
|
||||||
|
test_must_fail git apply patch &&
|
||||||
|
git apply --whitespace=fix patch &&
|
||||||
|
test_cmp one expect &&
|
||||||
|
mv no-blank-lines one &&
|
||||||
|
test_must_fail git apply patch &&
|
||||||
|
git apply --ignore-space-change --whitespace=fix patch &&
|
||||||
|
test_cmp one expect
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'shrink file with tons of missing blanks at end of file' '
|
||||||
|
{ echo a; echo b; echo c; } >one &&
|
||||||
|
cp one no-blank-lines &&
|
||||||
|
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; do
|
||||||
|
echo; echo; echo; echo;
|
||||||
|
done >>one &&
|
||||||
|
git add one &&
|
||||||
|
echo a >one &&
|
||||||
|
cp one expect &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
cp no-blank-lines one &&
|
||||||
|
test_must_fail git apply patch &&
|
||||||
|
git apply --whitespace=fix patch &&
|
||||||
|
test_cmp one expect &&
|
||||||
|
mv no-blank-lines one &&
|
||||||
|
git apply --ignore-space-change --whitespace=fix patch &&
|
||||||
|
test_cmp one expect
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'missing blanks at EOF must only match blank lines' '
|
||||||
|
{ echo a; echo b; } >one &&
|
||||||
|
git add one &&
|
||||||
|
{ echo c; echo d; } >>one &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
|
||||||
|
echo a >one &&
|
||||||
|
test_must_fail git apply patch
|
||||||
|
test_must_fail git apply --whitespace=fix patch &&
|
||||||
|
test_must_fail git apply --ignore-space-change --whitespace=fix patch
|
||||||
|
'
|
||||||
|
|
||||||
|
sed -e's/Z//' >one <<EOF
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
Z
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'missing blank line should match context line with spaces' '
|
||||||
|
git add one &&
|
||||||
|
echo d >>one &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
{ echo a; echo b; echo c; } >one &&
|
||||||
|
cp one expect &&
|
||||||
|
{ echo; echo d; } >>expect &&
|
||||||
|
git add one &&
|
||||||
|
|
||||||
|
git apply --whitespace=fix patch &&
|
||||||
|
test_cmp one expect
|
||||||
|
'
|
||||||
|
|
||||||
|
sed -e's/Z//' >one <<EOF
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
Z
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'same, but with the --ignore-space-option' '
|
||||||
|
git add one &&
|
||||||
|
echo d >>one &&
|
||||||
|
cp one expect &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
{ echo a; echo b; echo c; } >one &&
|
||||||
|
git add one &&
|
||||||
|
|
||||||
|
git checkout-index -f one &&
|
||||||
|
git apply --ignore-space-change --whitespace=fix patch &&
|
||||||
|
test_cmp one expect
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'same, but with CR-LF line endings && cr-at-eol set' '
|
||||||
|
git config core.whitespace cr-at-eol &&
|
||||||
|
printf "a\r\n" >one &&
|
||||||
|
printf "b\r\n" >>one &&
|
||||||
|
printf "c\r\n" >>one &&
|
||||||
|
cp one save-one &&
|
||||||
|
printf " \r\n" >>one
|
||||||
|
git add one &&
|
||||||
|
printf "d\r\n" >>one &&
|
||||||
|
cp one expect &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
mv save-one one &&
|
||||||
|
|
||||||
|
git apply --ignore-space-change --whitespace=fix patch &&
|
||||||
|
test_cmp one expect
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'same, but with CR-LF line endings && cr-at-eol unset' '
|
||||||
|
git config --unset core.whitespace &&
|
||||||
|
printf "a\r\n" >one &&
|
||||||
|
printf "b\r\n" >>one &&
|
||||||
|
printf "c\r\n" >>one &&
|
||||||
|
cp one save-one &&
|
||||||
|
printf " \r\n" >>one
|
||||||
|
git add one &&
|
||||||
|
cp one expect &&
|
||||||
|
printf "d\r\n" >>one &&
|
||||||
|
git diff -- one >patch &&
|
||||||
|
mv save-one one &&
|
||||||
|
echo d >>expect &&
|
||||||
|
|
||||||
|
git apply --ignore-space-change --whitespace=fix patch &&
|
||||||
|
test_cmp one expect
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -507,15 +507,15 @@ test_expect_success 'remote prune to cause a dangling symref' '
|
|||||||
(
|
(
|
||||||
cd seven &&
|
cd seven &&
|
||||||
git remote prune origin
|
git remote prune origin
|
||||||
) 2>err &&
|
) >err 2>&1 &&
|
||||||
grep "has become dangling" err &&
|
grep "has become dangling" err &&
|
||||||
|
|
||||||
: And the dangling symref will not cause other annoying errors
|
: And the dangling symref will not cause other annoying errors &&
|
||||||
(
|
(
|
||||||
cd seven &&
|
cd seven &&
|
||||||
git branch -a
|
git branch -a
|
||||||
) 2>err &&
|
) 2>err &&
|
||||||
! grep "points nowhere" err
|
! grep "points nowhere" err &&
|
||||||
(
|
(
|
||||||
cd seven &&
|
cd seven &&
|
||||||
test_must_fail git branch nomore origin
|
test_must_fail git branch nomore origin
|
||||||
|
@ -209,4 +209,13 @@ test_expect_success '%gd shortens ref name' '
|
|||||||
test_cmp expect.gd-short actual.gd-short
|
test_cmp expect.gd-short actual.gd-short
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'oneline with empty message' '
|
||||||
|
git commit -m "dummy" --allow-empty &&
|
||||||
|
git commit -m "dummy" --allow-empty &&
|
||||||
|
git filter-branch --msg-filter "sed -e s/dummy//" HEAD^^.. &&
|
||||||
|
git rev-list --oneline HEAD > /tmp/test.txt &&
|
||||||
|
test $(git rev-list --oneline HEAD | wc -l) -eq 5 &&
|
||||||
|
test $(git rev-list --oneline --graph HEAD | wc -l) -eq 5
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -92,6 +92,15 @@ test_expect_success 'difftool honors --gui' '
|
|||||||
restore_test_defaults
|
restore_test_defaults
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'difftool --gui works without configured diff.guitool' '
|
||||||
|
git config diff.tool test-tool &&
|
||||||
|
|
||||||
|
diff=$(git difftool --no-prompt --gui branch) &&
|
||||||
|
test "$diff" = "branch" &&
|
||||||
|
|
||||||
|
restore_test_defaults
|
||||||
|
'
|
||||||
|
|
||||||
# Specify the diff tool using $GIT_DIFF_TOOL
|
# Specify the diff tool using $GIT_DIFF_TOOL
|
||||||
test_expect_success 'GIT_DIFF_TOOL variable' '
|
test_expect_success 'GIT_DIFF_TOOL variable' '
|
||||||
git config --unset diff.tool
|
git config --unset diff.tool
|
||||||
|
@ -150,20 +150,22 @@ test_expect_success 'setup submodule' '
|
|||||||
|
|
||||||
git checkout -f master &&
|
git checkout -f master &&
|
||||||
mkdir sub &&
|
mkdir sub &&
|
||||||
cd sub &&
|
(
|
||||||
git init &&
|
cd sub &&
|
||||||
echo test file > file &&
|
git init &&
|
||||||
git add file &&
|
echo test file > file &&
|
||||||
git commit -m sub_initial &&
|
git add file &&
|
||||||
cd .. &&
|
git commit -m sub_initial
|
||||||
|
) &&
|
||||||
git submodule add "`pwd`/sub" sub &&
|
git submodule add "`pwd`/sub" sub &&
|
||||||
git commit -m initial &&
|
git commit -m initial &&
|
||||||
test_tick &&
|
test_tick &&
|
||||||
cd sub &&
|
(
|
||||||
echo more data >> file &&
|
cd sub &&
|
||||||
git add file &&
|
echo more data >> file &&
|
||||||
git commit -m sub_second &&
|
git add file &&
|
||||||
cd .. &&
|
git commit -m sub_second
|
||||||
|
) &&
|
||||||
git add sub &&
|
git add sub &&
|
||||||
git commit -m second
|
git commit -m second
|
||||||
|
|
||||||
@ -264,19 +266,20 @@ test_expect_success 'cope with tagger-less tags' '
|
|||||||
|
|
||||||
test_expect_success 'setup for limiting exports by PATH' '
|
test_expect_success 'setup for limiting exports by PATH' '
|
||||||
mkdir limit-by-paths &&
|
mkdir limit-by-paths &&
|
||||||
cd limit-by-paths &&
|
(
|
||||||
git init &&
|
cd limit-by-paths &&
|
||||||
echo hi > there &&
|
git init &&
|
||||||
git add there &&
|
echo hi > there &&
|
||||||
git commit -m "First file" &&
|
git add there &&
|
||||||
echo foo > bar &&
|
git commit -m "First file" &&
|
||||||
git add bar &&
|
echo foo > bar &&
|
||||||
git commit -m "Second file" &&
|
git add bar &&
|
||||||
git tag -a -m msg mytag &&
|
git commit -m "Second file" &&
|
||||||
echo morefoo >> bar &&
|
git tag -a -m msg mytag &&
|
||||||
git add bar &&
|
echo morefoo >> bar &&
|
||||||
git commit -m "Change to second file" &&
|
git add bar &&
|
||||||
cd ..
|
git commit -m "Change to second file"
|
||||||
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
cat > limit-by-paths/expected << EOF
|
cat > limit-by-paths/expected << EOF
|
||||||
@ -297,10 +300,11 @@ M 100644 :1 there
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
test_expect_success 'dropping tag of filtered out object' '
|
test_expect_success 'dropping tag of filtered out object' '
|
||||||
|
(
|
||||||
cd limit-by-paths &&
|
cd limit-by-paths &&
|
||||||
git fast-export --tag-of-filtered-object=drop mytag -- there > output &&
|
git fast-export --tag-of-filtered-object=drop mytag -- there > output &&
|
||||||
test_cmp output expected &&
|
test_cmp output expected
|
||||||
cd ..
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
cat >> limit-by-paths/expected << EOF
|
cat >> limit-by-paths/expected << EOF
|
||||||
@ -313,10 +317,11 @@ msg
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
test_expect_success 'rewriting tag of filtered out object' '
|
test_expect_success 'rewriting tag of filtered out object' '
|
||||||
|
(
|
||||||
cd limit-by-paths &&
|
cd limit-by-paths &&
|
||||||
git fast-export --tag-of-filtered-object=rewrite mytag -- there > output &&
|
git fast-export --tag-of-filtered-object=rewrite mytag -- there > output &&
|
||||||
test_cmp output expected &&
|
test_cmp output expected
|
||||||
cd ..
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
cat > limit-by-paths/expected << EOF
|
cat > limit-by-paths/expected << EOF
|
||||||
@ -343,13 +348,13 @@ M 100644 :2 there
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
test_expect_failure 'no exact-ref revisions included' '
|
test_expect_failure 'no exact-ref revisions included' '
|
||||||
cd limit-by-paths &&
|
(
|
||||||
git fast-export master~2..master~1 > output &&
|
cd limit-by-paths &&
|
||||||
test_cmp output expected &&
|
git fast-export master~2..master~1 > output &&
|
||||||
cd ..
|
test_cmp output expected
|
||||||
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
|
||||||
test_expect_success 'set-up a few more tags for tag export tests' '
|
test_expect_success 'set-up a few more tags for tag export tests' '
|
||||||
git checkout -f master &&
|
git checkout -f master &&
|
||||||
HEAD_TREE=`git show -s --pretty=raw HEAD | grep tree | sed "s/tree //"` &&
|
HEAD_TREE=`git show -s --pretty=raw HEAD | grep tree | sed "s/tree //"` &&
|
||||||
|
Reference in New Issue
Block a user