Git 1.7.10-rc1
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQIcBAABAgAGBQJPYSAWAAoJELC16IaWr+bLmQoQAIumrgZlezaE49Y08TPVjNzI BtZ2et503qpHCyIWhn68rgiDWuZL1OKfCXAPcptuqb92Fk0TlRshEGjg8aMPAIdT CxtQPde0d+t60l961s9kyNxeSuYFWqNjB9GtO/AvY8kpfZ+FTZTS7UA5OdMBgTdm IQBQMvf02tT68EvPZoZ1wqddU8KLiimbxvrzaMYrO1CjYvKUUSLmzxNbIUNhF/B1 +r6RsFl8gnUfxa3+HEv1WFeKoBTSoPix6e+odF9tTekB+Fza8n9cH7qxXsgtnOAu 3KsAa+K24tOFR8OEBzUNdRYk4fJs5dmZB/kIEiiU2CVvAqpTy58imdk9d0OmKhSR kBQVcATbgz5aUQtlvuoYaV//aiSAA0eGvGgRP47a9he935wkfbmfFQonuUxgGvI4 zMMa7N6oLko0P9IN/DgLyz/D+LwMyjqpTxLVt2CrEMh68nTAU0prnEy/gxIdwRUJ 9Jv4BkNBudqj8jbIpkU0+iI598yCCOh9aw7begEYed84wcceMzPlAtC7rwROYhtw lf0P/pxWAfj3iOtESFVmSkWMz+MYOWA2fr5wxX8FtWDBFZ2W2mnSy1kNkHNMLo/j 4QvIsRqxS661WOzDIehNh8F2Mng1bxy08vLR4LaEhIVy+Qb07ziZcUkIFYdhMblf d3x9jhNo36QSk8gWhVxE =TGu1 -----END PGP SIGNATURE----- Merge v1.7.10-rc0 for git l10n update
This commit is contained in:
commit
d90b16ed42
@ -25,6 +25,10 @@ Compatibility Notes
|
|||||||
"git merge" command if you know everybody who uses your script has
|
"git merge" command if you know everybody who uses your script has
|
||||||
Git v1.7.8 or newer.
|
Git v1.7.8 or newer.
|
||||||
|
|
||||||
|
* The "--binary/-b" options to "git am" have been a no-op for quite a
|
||||||
|
while and were deprecated in mid 2008 (v1.6.0). When you give these
|
||||||
|
options to "git am", it will now warn and ask you not to use them.
|
||||||
|
|
||||||
|
|
||||||
Updates since v1.7.9
|
Updates since v1.7.9
|
||||||
--------------------
|
--------------------
|
||||||
@ -43,20 +47,23 @@ UI, Workflows & Features
|
|||||||
|
|
||||||
* A content filter (clean/smudge) used to be just a way to make the
|
* A content filter (clean/smudge) used to be just a way to make the
|
||||||
recorded contents "more useful", and allowed to fail; a filter can
|
recorded contents "more useful", and allowed to fail; a filter can
|
||||||
new optionally be marked as "required".
|
now optionally be marked as "required".
|
||||||
|
|
||||||
* Options whose names begin with "--no-" (e.g. the "--no-verify"
|
* Options whose names begin with "--no-" (e.g. the "--no-verify"
|
||||||
option of the "git commit" command) can be negated by omitting
|
option of the "git commit" command) can be negated by omitting
|
||||||
"no-" from its name, e.g. "git commit --verify".
|
"no-" from its name, e.g. "git commit --verify".
|
||||||
|
|
||||||
* "git am" learned to pass "-b" option to underlying "git mailinfo", so
|
* "git am" learned to pass "-b" option to underlying "git mailinfo", so
|
||||||
that bracketed string other than "PATCH" at the beginning can be kept.
|
that a bracketed string other than "PATCH" at the beginning can be kept.
|
||||||
|
|
||||||
* "git clone" learned "--single-branch" option to limit cloning to a
|
* "git clone" learned "--single-branch" option to limit cloning to a
|
||||||
single branch (surprise!).
|
single branch (surprise!); tags that do not point into the history
|
||||||
|
of the branch are not fetched.
|
||||||
|
|
||||||
* "git clone" learned to detach the HEAD in the resulting repository
|
* "git clone" learned to detach the HEAD in the resulting repository
|
||||||
when the source repository's HEAD does not point to a branch.
|
when the user specifies a tag with "--branch" (e.g., "--branch=v1.0").
|
||||||
|
Clone also learned to print the usual "detached HEAD" advice in such
|
||||||
|
a case, similar to "git checkout v1.0".
|
||||||
|
|
||||||
* When showing a patch while ignoring whitespace changes, the context
|
* When showing a patch while ignoring whitespace changes, the context
|
||||||
lines are taken from the postimage, in order to make it easier to
|
lines are taken from the postimage, in order to make it easier to
|
||||||
@ -71,9 +78,12 @@ UI, Workflows & Features
|
|||||||
* "fsck" learned "--no-dangling" option to omit dangling object
|
* "fsck" learned "--no-dangling" option to omit dangling object
|
||||||
information.
|
information.
|
||||||
|
|
||||||
* "git log -G" learned to pay attention to the "-i" option and can
|
* "git log -G" and "git log -S" learned to pay attention to the "-i"
|
||||||
find patch hunks that introduce or remove a string that matches the
|
option. With "-i", "log -G" ignores the case when finding patch
|
||||||
given pattern ignoring the case.
|
hunks that introduce or remove a string that matches the given
|
||||||
|
pattern. Similarly with "-i", "log -S" ignores the case when
|
||||||
|
finding the commit the given block of text appears or disappears
|
||||||
|
from the file.
|
||||||
|
|
||||||
* "git merge" in an interactive session learned to spawn the editor
|
* "git merge" in an interactive session learned to spawn the editor
|
||||||
by default to let the user edit the auto-generated merge message,
|
by default to let the user edit the auto-generated merge message,
|
||||||
@ -82,12 +92,15 @@ UI, Workflows & Features
|
|||||||
Both "git merge" and "git pull" can be given --no-edit from the
|
Both "git merge" and "git pull" can be given --no-edit from the
|
||||||
command line to accept the auto-generated merge message.
|
command line to accept the auto-generated merge message.
|
||||||
|
|
||||||
* The advise message given when the user didn't give enough clue on
|
* The advice message given when the user didn't give enough clue on
|
||||||
what to merge to "git pull" and "git merge" has been updated to
|
what to merge to "git pull" and "git merge" has been updated to
|
||||||
be more concise and easier to understand.
|
be more concise and easier to understand.
|
||||||
|
|
||||||
* "git push" learned the "--prune" option, similar to "git fetch".
|
* "git push" learned the "--prune" option, similar to "git fetch".
|
||||||
|
|
||||||
|
* The whole directory that houses a top-level superproject managed by
|
||||||
|
"git submodule" can be moved to another place.
|
||||||
|
|
||||||
* "git symbolic-ref" learned the "--short" option to abbreviate the
|
* "git symbolic-ref" learned the "--short" option to abbreviate the
|
||||||
refname it shows unambiguously.
|
refname it shows unambiguously.
|
||||||
|
|
||||||
@ -95,7 +108,7 @@ UI, Workflows & Features
|
|||||||
output to those that point at the given object.
|
output to those that point at the given object.
|
||||||
|
|
||||||
* "gitweb" allows intermediate entries in the directory hierarchy
|
* "gitweb" allows intermediate entries in the directory hierarchy
|
||||||
that leads to a projects to be clicked, which in turn shows the
|
that leads to a project to be clicked, which in turn shows the
|
||||||
list of projects inside that directory.
|
list of projects inside that directory.
|
||||||
|
|
||||||
* "gitweb" learned to read various pieces of information for the
|
* "gitweb" learned to read various pieces of information for the
|
||||||
@ -106,6 +119,10 @@ UI, Workflows & Features
|
|||||||
* Project search in "gitweb" shows the substring that matched in the
|
* Project search in "gitweb" shows the substring that matched in the
|
||||||
project name and description highlighted.
|
project name and description highlighted.
|
||||||
|
|
||||||
|
* A new script "diffall" is added to contrib/; it drives an
|
||||||
|
external tool to perform a directory diff of two Git revisions
|
||||||
|
in one go, unlike "difftool" that compares one file at a time.
|
||||||
|
|
||||||
Foreign Interface
|
Foreign Interface
|
||||||
|
|
||||||
* Improved handling of views, labels and branches in "git-p4" (in contrib).
|
* Improved handling of views, labels and branches in "git-p4" (in contrib).
|
||||||
@ -149,6 +166,10 @@ Internal Implementation (please report possible regressions)
|
|||||||
* The code to check if a path points at a file beyond a symbolic link
|
* The code to check if a path points at a file beyond a symbolic link
|
||||||
has been restructured to be thread-safe.
|
has been restructured to be thread-safe.
|
||||||
|
|
||||||
|
* When pruning directories that has become empty during "git prune"
|
||||||
|
and "git prune-packed", call closedir() that iterates over a
|
||||||
|
directory before rmdir() it.
|
||||||
|
|
||||||
Also contains minor documentation updates and code clean-ups.
|
Also contains minor documentation updates and code clean-ups.
|
||||||
|
|
||||||
|
|
||||||
@ -159,21 +180,17 @@ Unless otherwise noted, all the fixes since v1.7.9 in the maintenance
|
|||||||
releases are contained in this release (see release notes to them for
|
releases are contained in this release (see release notes to them for
|
||||||
details).
|
details).
|
||||||
|
|
||||||
* "git bundle" did not record boundary commits correctly when there
|
* The "remaining" subcommand to "git rerere" was not documented.
|
||||||
are many of them.
|
(merge 3e7a1df ph/rerere-doc later to maint).
|
||||||
(merge efe4be1 tr/maint-bundle-boundary later to maint).
|
|
||||||
|
|
||||||
* "git diff-index" and its friends at the plumbing level showed the
|
* "git tag -s" honored "gpg.program" configuration variable since
|
||||||
"diff --git" header and nothing else for a path whose cached stat
|
1.7.9, but "git tag -v" and "git verify-tag" didn't.
|
||||||
info is dirty without actual difference when asked to produce a
|
(merge a2c2506 az/verify-tag-use-gpg-config later to maint).
|
||||||
patch. This was a longstanding bug that we could have fixed long
|
|
||||||
time ago.
|
|
||||||
(merge b3f01ff jc/maint-diff-patch-header later to maint).
|
|
||||||
|
|
||||||
* The code to synthesize the fake ancestor tree used by 3-way merge
|
* When "git config" diagnoses an error in a configuration file and
|
||||||
fallback in "git am" was not prepared to read a patch created with
|
shows the line number for the offending line, it miscounted if the
|
||||||
a non-standard -p<num> value.
|
error was at the end of line.
|
||||||
(merge a61ba26 jc/am-3-nonstandard-popt later to maint).
|
(merge 4b34059 ms/maint-config-error-at-eol-linecount later to maint).
|
||||||
|
|
||||||
* "gitweb" used to drop warnings in the log file when "heads" view is
|
* "gitweb" used to drop warnings in the log file when "heads" view is
|
||||||
accessed in a repository whose HEAD does not point at a valid
|
accessed in a repository whose HEAD does not point at a valid
|
||||||
@ -181,7 +198,7 @@ details).
|
|||||||
|
|
||||||
---
|
---
|
||||||
exec >/var/tmp/1
|
exec >/var/tmp/1
|
||||||
O=v1.7.9.3-366-g1e4d087
|
O=v1.7.10-rc0-50-gd973dc0
|
||||||
echo O=$(git describe)
|
echo O=$(git describe)
|
||||||
git log --first-parent --oneline ^maint $O..
|
git log --first-parent --oneline ^maint $O..
|
||||||
echo
|
echo
|
||||||
|
24
Documentation/RelNotes/1.7.9.4.txt
Normal file
24
Documentation/RelNotes/1.7.9.4.txt
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
Git v1.7.9.4 Release Notes
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Fixes since v1.7.9.3
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
* The code to synthesize the fake ancestor tree used by 3-way merge
|
||||||
|
fallback in "git am" was not prepared to read a patch created with
|
||||||
|
a non-standard -p<num> value.
|
||||||
|
|
||||||
|
* "git bundle" did not record boundary commits correctly when there
|
||||||
|
are many of them.
|
||||||
|
|
||||||
|
* "git diff-index" and its friends at the plumbing level showed the
|
||||||
|
"diff --git" header and nothing else for a path whose cached stat
|
||||||
|
info is dirty without actual difference when asked to produce a
|
||||||
|
patch. This was a longstanding bug that we could have fixed long
|
||||||
|
time ago.
|
||||||
|
|
||||||
|
* "gitweb" did use quotemeta() to prepare search string when asked to
|
||||||
|
do a fixed-string project search, but did not use it by mistake and
|
||||||
|
used the user-supplied string instead.
|
||||||
|
|
||||||
|
Also contains minor fixes and documentation updates.
|
@ -24,8 +24,8 @@ be highlighted with an asterisk. Option `-r` causes the remote-tracking
|
|||||||
branches to be listed, and option `-a` shows both. This list mode is also
|
branches to be listed, and option `-a` shows both. This list mode is also
|
||||||
activated by the `--list` option (see below).
|
activated by the `--list` option (see below).
|
||||||
<pattern> restricts the output to matching branches, the pattern is a shell
|
<pattern> restricts the output to matching branches, the pattern is a shell
|
||||||
wildcard (i.e., matched using fnmatch(3))
|
wildcard (i.e., matched using fnmatch(3)).
|
||||||
Multiple patterns may be given; if any of them matches, the tag is shown.
|
Multiple patterns may be given; if any of them matches, the branch is shown.
|
||||||
|
|
||||||
With `--contains`, shows only the branches that contain the named commit
|
With `--contains`, shows only the branches that contain the named commit
|
||||||
(in other words, the branches whose tip commits are descendants of the
|
(in other words, the branches whose tip commits are descendants of the
|
||||||
@ -49,7 +49,7 @@ the remote-tracking branch. This behavior may be changed via the global
|
|||||||
overridden by using the `--track` and `--no-track` options, and
|
overridden by using the `--track` and `--no-track` options, and
|
||||||
changed later using `git branch --set-upstream`.
|
changed later using `git branch --set-upstream`.
|
||||||
|
|
||||||
With a '-m' or '-M' option, <oldbranch> will be renamed to <newbranch>.
|
With a `-m` or `-M` option, <oldbranch> will be renamed to <newbranch>.
|
||||||
If <oldbranch> had a corresponding reflog, it is renamed to match
|
If <oldbranch> had a corresponding reflog, it is renamed to match
|
||||||
<newbranch>, and a reflog entry is created to remember the branch
|
<newbranch>, and a reflog entry is created to remember the branch
|
||||||
renaming. If <newbranch> exists, -M must be used to force the rename
|
renaming. If <newbranch> exists, -M must be used to force the rename
|
||||||
@ -59,7 +59,7 @@ With a `-d` or `-D` option, `<branchname>` will be deleted. You may
|
|||||||
specify more than one branch for deletion. If the branch currently
|
specify more than one branch for deletion. If the branch currently
|
||||||
has a reflog then the reflog will also be deleted.
|
has a reflog then the reflog will also be deleted.
|
||||||
|
|
||||||
Use -r together with -d to delete remote-tracking branches. Note, that it
|
Use `-r` together with `-d` to delete remote-tracking branches. Note, that it
|
||||||
only makes sense to delete remote-tracking branches if they no longer exist
|
only makes sense to delete remote-tracking branches if they no longer exist
|
||||||
in the remote repository or if 'git fetch' was configured not to fetch
|
in the remote repository or if 'git fetch' was configured not to fetch
|
||||||
them again. See also the 'prune' subcommand of linkgit:git-remote[1] for a
|
them again. See also the 'prune' subcommand of linkgit:git-remote[1] for a
|
||||||
@ -154,17 +154,18 @@ start-point is either a local or remote-tracking branch.
|
|||||||
branch.autosetupmerge configuration variable is true.
|
branch.autosetupmerge configuration variable is true.
|
||||||
|
|
||||||
--set-upstream::
|
--set-upstream::
|
||||||
If specified branch does not exist yet or if '--force' has been
|
If specified branch does not exist yet or if `--force` has been
|
||||||
given, acts exactly like '--track'. Otherwise sets up configuration
|
given, acts exactly like `--track`. Otherwise sets up configuration
|
||||||
like '--track' would when creating the branch, except that where
|
like `--track` would when creating the branch, except that where
|
||||||
branch points to is not changed.
|
branch points to is not changed.
|
||||||
|
|
||||||
--edit-description::
|
--edit-description::
|
||||||
Open an editor and edit the text to explain what the branch is
|
Open an editor and edit the text to explain what the branch is
|
||||||
for, to be used by various other commands (e.g. `request-pull`).
|
for, to be used by various other commands (e.g. `request-pull`).
|
||||||
|
|
||||||
--contains <commit>::
|
--contains [<commit>]::
|
||||||
Only list branches which contain the specified commit.
|
Only list branches which contain the specified commit (HEAD
|
||||||
|
if not specified).
|
||||||
|
|
||||||
--merged [<commit>]::
|
--merged [<commit>]::
|
||||||
Only list branches whose tips are reachable from the
|
Only list branches whose tips are reachable from the
|
||||||
|
@ -8,7 +8,7 @@ git-rerere - Reuse recorded resolution of conflicted merges
|
|||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
[verse]
|
[verse]
|
||||||
'git rerere' ['clear'|'forget' <pathspec>|'diff'|'status'|'gc']
|
'git rerere' ['clear'|'forget' <pathspec>|'diff'|'remaining'|'status'|'gc']
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
@ -37,30 +37,35 @@ its working state.
|
|||||||
|
|
||||||
'clear'::
|
'clear'::
|
||||||
|
|
||||||
This resets the metadata used by rerere if a merge resolution is to be
|
Reset the metadata used by rerere if a merge resolution is to be
|
||||||
aborted. Calling 'git am [--skip|--abort]' or 'git rebase [--skip|--abort]'
|
aborted. Calling 'git am [--skip|--abort]' or 'git rebase [--skip|--abort]'
|
||||||
will automatically invoke this command.
|
will automatically invoke this command.
|
||||||
|
|
||||||
'forget' <pathspec>::
|
'forget' <pathspec>::
|
||||||
|
|
||||||
This resets the conflict resolutions which rerere has recorded for the current
|
Reset the conflict resolutions which rerere has recorded for the current
|
||||||
conflict in <pathspec>.
|
conflict in <pathspec>.
|
||||||
|
|
||||||
'diff'::
|
'diff'::
|
||||||
|
|
||||||
This displays diffs for the current state of the resolution. It is
|
Display diffs for the current state of the resolution. It is
|
||||||
useful for tracking what has changed while the user is resolving
|
useful for tracking what has changed while the user is resolving
|
||||||
conflicts. Additional arguments are passed directly to the system
|
conflicts. Additional arguments are passed directly to the system
|
||||||
'diff' command installed in PATH.
|
'diff' command installed in PATH.
|
||||||
|
|
||||||
'status'::
|
'status'::
|
||||||
|
|
||||||
Like 'diff', but this only prints the filenames that will be tracked
|
Print paths with conflicts whose merge resolution rerere will record.
|
||||||
for resolutions.
|
|
||||||
|
'remaining'::
|
||||||
|
|
||||||
|
Print paths with conflicts that have not been autoresolved by rerere.
|
||||||
|
This includes paths whose resolutions cannot be tracked by rerere,
|
||||||
|
such as conflicting submodules.
|
||||||
|
|
||||||
'gc'::
|
'gc'::
|
||||||
|
|
||||||
This prunes records of conflicted merges that
|
Prune records of conflicted merges that
|
||||||
occurred a long time ago. By default, unresolved conflicts older
|
occurred a long time ago. By default, unresolved conflicts older
|
||||||
than 15 days and resolved conflicts older than 60
|
than 15 days and resolved conflicts older than 60
|
||||||
days are pruned. These defaults are controlled via the
|
days are pruned. These defaults are controlled via the
|
||||||
|
@ -44,9 +44,10 @@ 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.9.3/git.html[documentation for release 1.7.9.3]
|
* link:v1.7.9.4/git.html[documentation for release 1.7.9.4]
|
||||||
|
|
||||||
* release notes for
|
* release notes for
|
||||||
|
link:RelNotes/1.7.9.4.txt[1.7.9.4],
|
||||||
link:RelNotes/1.7.9.3.txt[1.7.9.3],
|
link:RelNotes/1.7.9.3.txt[1.7.9.3],
|
||||||
link:RelNotes/1.7.9.2.txt[1.7.9.2],
|
link:RelNotes/1.7.9.2.txt[1.7.9.2],
|
||||||
link:RelNotes/1.7.9.1.txt[1.7.9.1],
|
link:RelNotes/1.7.9.1.txt[1.7.9.1],
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
GVF=GIT-VERSION-FILE
|
GVF=GIT-VERSION-FILE
|
||||||
DEF_VER=v1.7.10-rc0
|
DEF_VER=v1.7.10-rc1
|
||||||
|
|
||||||
LF='
|
LF='
|
||||||
'
|
'
|
||||||
|
@ -35,8 +35,6 @@ static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts)
|
|||||||
unlink_or_warn(pathname);
|
unlink_or_warn(pathname);
|
||||||
display_progress(progress, i + 1);
|
display_progress(progress, i + 1);
|
||||||
}
|
}
|
||||||
pathname[len] = 0;
|
|
||||||
rmdir(pathname);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void prune_packed_objects(int opts)
|
void prune_packed_objects(int opts)
|
||||||
@ -65,6 +63,8 @@ void prune_packed_objects(int opts)
|
|||||||
continue;
|
continue;
|
||||||
prune_dir(i, d, pathname, len + 3, opts);
|
prune_dir(i, d, pathname, len + 3, opts);
|
||||||
closedir(d);
|
closedir(d);
|
||||||
|
pathname[len + 2] = '\0';
|
||||||
|
rmdir(pathname);
|
||||||
}
|
}
|
||||||
stop_progress(&progress);
|
stop_progress(&progress);
|
||||||
}
|
}
|
||||||
|
@ -85,9 +85,9 @@ static int prune_dir(int i, char *path)
|
|||||||
}
|
}
|
||||||
fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name);
|
fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name);
|
||||||
}
|
}
|
||||||
|
closedir(dir);
|
||||||
if (!show_only)
|
if (!show_only)
|
||||||
rmdir(path);
|
rmdir(path);
|
||||||
closedir(dir);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,6 +58,14 @@ static int verify_tag(const char *name, int verbose)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int git_verify_tag_config(const char *var, const char *value, void *cb)
|
||||||
|
{
|
||||||
|
int status = git_gpg_config(var, value, cb);
|
||||||
|
if (status)
|
||||||
|
return status;
|
||||||
|
return git_default_config(var, value, cb);
|
||||||
|
}
|
||||||
|
|
||||||
int cmd_verify_tag(int argc, const char **argv, const char *prefix)
|
int cmd_verify_tag(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int i = 1, verbose = 0, had_error = 0;
|
int i = 1, verbose = 0, had_error = 0;
|
||||||
@ -66,7 +74,7 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)
|
|||||||
OPT_END()
|
OPT_END()
|
||||||
};
|
};
|
||||||
|
|
||||||
git_config(git_default_config, NULL);
|
git_config(git_verify_tag_config, NULL);
|
||||||
|
|
||||||
argc = parse_options(argc, argv, prefix, verify_tag_options,
|
argc = parse_options(argc, argv, prefix, verify_tag_options,
|
||||||
verify_tag_usage, PARSE_OPT_KEEP_ARGV0);
|
verify_tag_usage, PARSE_OPT_KEEP_ARGV0);
|
||||||
|
13
config.c
13
config.c
@ -196,8 +196,10 @@ static char *parse_value(void)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
int c = get_next_char();
|
int c = get_next_char();
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
if (quote)
|
if (quote) {
|
||||||
|
cf->linenr--;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return cf->value.buf;
|
return cf->value.buf;
|
||||||
}
|
}
|
||||||
if (comment)
|
if (comment)
|
||||||
@ -287,7 +289,7 @@ static int get_extended_base_var(char *name, int baselen, int c)
|
|||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
return -1;
|
goto error_incomplete_line;
|
||||||
c = get_next_char();
|
c = get_next_char();
|
||||||
} while (isspace(c));
|
} while (isspace(c));
|
||||||
|
|
||||||
@ -299,13 +301,13 @@ static int get_extended_base_var(char *name, int baselen, int c)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
int c = get_next_char();
|
int c = get_next_char();
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
return -1;
|
goto error_incomplete_line;
|
||||||
if (c == '"')
|
if (c == '"')
|
||||||
break;
|
break;
|
||||||
if (c == '\\') {
|
if (c == '\\') {
|
||||||
c = get_next_char();
|
c = get_next_char();
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
return -1;
|
goto error_incomplete_line;
|
||||||
}
|
}
|
||||||
name[baselen++] = c;
|
name[baselen++] = c;
|
||||||
if (baselen > MAXNAME / 2)
|
if (baselen > MAXNAME / 2)
|
||||||
@ -316,6 +318,9 @@ static int get_extended_base_var(char *name, int baselen, int c)
|
|||||||
if (get_next_char() != ']')
|
if (get_next_char() != ']')
|
||||||
return -1;
|
return -1;
|
||||||
return baselen;
|
return baselen;
|
||||||
|
error_incomplete_line:
|
||||||
|
cf->linenr--;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_base_var(char *name)
|
static int get_base_var(char *name)
|
||||||
|
@ -380,7 +380,9 @@ do
|
|||||||
-i|--interactive)
|
-i|--interactive)
|
||||||
interactive=t ;;
|
interactive=t ;;
|
||||||
-b|--binary)
|
-b|--binary)
|
||||||
: ;;
|
echo >&2 "The $1 option has been a no-op for long time, and"
|
||||||
|
echo >&2 "it will be removed. Please do not use it anymore."
|
||||||
|
;;
|
||||||
-3|--3way)
|
-3|--3way)
|
||||||
threeway=t ;;
|
threeway=t ;;
|
||||||
-s|--signoff)
|
-s|--signoff)
|
||||||
|
@ -21,7 +21,7 @@ GIT_INTERNAL_GETTEXT_SH_SCHEME=fallthrough
|
|||||||
if test -n "@@USE_GETTEXT_SCHEME@@"
|
if test -n "@@USE_GETTEXT_SCHEME@@"
|
||||||
then
|
then
|
||||||
GIT_INTERNAL_GETTEXT_SH_SCHEME="@@USE_GETTEXT_SCHEME@@"
|
GIT_INTERNAL_GETTEXT_SH_SCHEME="@@USE_GETTEXT_SCHEME@@"
|
||||||
elif test -n "@@USE_FALLTHROUGH_GETTEXT_SCHEME@@$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS"
|
elif test -n "$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS"
|
||||||
then
|
then
|
||||||
: no probing necessary
|
: no probing necessary
|
||||||
elif test -n "$GIT_GETTEXT_POISON"
|
elif test -n "$GIT_GETTEXT_POISON"
|
||||||
|
@ -132,46 +132,46 @@ module_clone()
|
|||||||
gitdir_base=
|
gitdir_base=
|
||||||
name=$(module_name "$path" 2>/dev/null)
|
name=$(module_name "$path" 2>/dev/null)
|
||||||
test -n "$name" || name="$path"
|
test -n "$name" || name="$path"
|
||||||
base_path=$(dirname "$path")
|
base_name=$(dirname "$name")
|
||||||
|
|
||||||
gitdir=$(git rev-parse --git-dir)
|
gitdir=$(git rev-parse --git-dir)
|
||||||
gitdir_base="$gitdir/modules/$base_path"
|
gitdir_base="$gitdir/modules/$base_name"
|
||||||
gitdir="$gitdir/modules/$path"
|
gitdir="$gitdir/modules/$name"
|
||||||
|
|
||||||
case $gitdir in
|
|
||||||
/*)
|
|
||||||
a="$(cd_to_toplevel && pwd)/"
|
|
||||||
b=$gitdir
|
|
||||||
while [ "$b" ] && [ "${a%%/*}" = "${b%%/*}" ]
|
|
||||||
do
|
|
||||||
a=${a#*/} b=${b#*/};
|
|
||||||
done
|
|
||||||
|
|
||||||
rel="$a$name"
|
|
||||||
rel=`echo $rel | sed -e 's|[^/]*|..|g'`
|
|
||||||
rel_gitdir="$rel/$b"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
rel=`echo $name | sed -e 's|[^/]*|..|g'`
|
|
||||||
rel_gitdir="$rel/$gitdir"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -d "$gitdir"
|
if test -d "$gitdir"
|
||||||
then
|
then
|
||||||
mkdir -p "$path"
|
mkdir -p "$path"
|
||||||
echo "gitdir: $rel_gitdir" >"$path/.git"
|
|
||||||
rm -f "$gitdir/index"
|
rm -f "$gitdir/index"
|
||||||
else
|
else
|
||||||
mkdir -p "$gitdir_base"
|
mkdir -p "$gitdir_base"
|
||||||
if test -n "$reference"
|
git clone $quiet -n ${reference:+"$reference"} \
|
||||||
then
|
--separate-git-dir "$gitdir" "$url" "$path" ||
|
||||||
git-clone $quiet "$reference" -n "$url" "$path" --separate-git-dir "$gitdir"
|
|
||||||
else
|
|
||||||
git-clone $quiet -n "$url" "$path" --separate-git-dir "$gitdir"
|
|
||||||
fi ||
|
|
||||||
die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"
|
die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
a=$(cd "$gitdir" && pwd)/
|
||||||
|
b=$(cd "$path" && pwd)/
|
||||||
|
# normalize Windows-style absolute paths to POSIX-style absolute paths
|
||||||
|
case $a in [a-zA-Z]:/*) a=/${a%%:*}${a#*:} ;; esac
|
||||||
|
case $b in [a-zA-Z]:/*) b=/${b%%:*}${b#*:} ;; esac
|
||||||
|
# Remove all common leading directories after a sanity check
|
||||||
|
if test "${a#$b}" != "$a" || test "${b#$a}" != "$b"; then
|
||||||
|
die "$(eval_gettext "Gitdir '\$a' is part of the submodule path '\$b' or vice versa")"
|
||||||
|
fi
|
||||||
|
while test "${a%%/*}" = "${b%%/*}"
|
||||||
|
do
|
||||||
|
a=${a#*/}
|
||||||
|
b=${b#*/}
|
||||||
|
done
|
||||||
|
# Now chop off the trailing '/'s that were added in the beginning
|
||||||
|
a=${a%/}
|
||||||
|
b=${b%/}
|
||||||
|
|
||||||
|
rel=$(echo $b | sed -e 's|[^/]*|..|g')
|
||||||
|
echo "gitdir: $rel/$a" >"$path/.git"
|
||||||
|
|
||||||
|
rel=$(echo $a | sed -e 's|[^/]*|..|g')
|
||||||
|
(clear_local_git_env; cd "$path" && GIT_WORK_TREE=. git config core.worktree "$rel/$b")
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -3073,15 +3073,15 @@ sub filter_forks_from_projects_list {
|
|||||||
sub search_projects_list {
|
sub search_projects_list {
|
||||||
my ($projlist, %opts) = @_;
|
my ($projlist, %opts) = @_;
|
||||||
my $tagfilter = $opts{'tagfilter'};
|
my $tagfilter = $opts{'tagfilter'};
|
||||||
my $searchtext = $opts{'searchtext'};
|
my $search_re = $opts{'search_regexp'};
|
||||||
|
|
||||||
return @$projlist
|
return @$projlist
|
||||||
unless ($tagfilter || $searchtext);
|
unless ($tagfilter || $search_re);
|
||||||
|
|
||||||
# searching projects require filling to be run before it;
|
# searching projects require filling to be run before it;
|
||||||
fill_project_list_info($projlist,
|
fill_project_list_info($projlist,
|
||||||
$tagfilter ? 'ctags' : (),
|
$tagfilter ? 'ctags' : (),
|
||||||
$searchtext ? ('path', 'descr') : ());
|
$search_re ? ('path', 'descr') : ());
|
||||||
my @projects;
|
my @projects;
|
||||||
PROJECT:
|
PROJECT:
|
||||||
foreach my $pr (@$projlist) {
|
foreach my $pr (@$projlist) {
|
||||||
@ -3092,10 +3092,10 @@ sub search_projects_list {
|
|||||||
grep { lc($_) eq lc($tagfilter) } keys %{$pr->{'ctags'}};
|
grep { lc($_) eq lc($tagfilter) } keys %{$pr->{'ctags'}};
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($searchtext) {
|
if ($search_re) {
|
||||||
next unless
|
next unless
|
||||||
$pr->{'path'} =~ /$searchtext/ ||
|
$pr->{'path'} =~ /$search_re/ ||
|
||||||
$pr->{'descr_long'} =~ /$searchtext/;
|
$pr->{'descr_long'} =~ /$search_re/;
|
||||||
}
|
}
|
||||||
|
|
||||||
push @projects, $pr;
|
push @projects, $pr;
|
||||||
@ -5484,16 +5484,16 @@ sub git_project_list_body {
|
|||||||
my $show_ctags = gitweb_check_feature('ctags');
|
my $show_ctags = gitweb_check_feature('ctags');
|
||||||
my $tagfilter = $show_ctags ? $input_params{'ctag'} : undef;
|
my $tagfilter = $show_ctags ? $input_params{'ctag'} : undef;
|
||||||
$check_forks = undef
|
$check_forks = undef
|
||||||
if ($tagfilter || $searchtext);
|
if ($tagfilter || $search_regexp);
|
||||||
|
|
||||||
# filtering out forks before filling info allows to do less work
|
# filtering out forks before filling info allows to do less work
|
||||||
@projects = filter_forks_from_projects_list(\@projects)
|
@projects = filter_forks_from_projects_list(\@projects)
|
||||||
if ($check_forks);
|
if ($check_forks);
|
||||||
# search_projects_list pre-fills required info
|
# search_projects_list pre-fills required info
|
||||||
@projects = search_projects_list(\@projects,
|
@projects = search_projects_list(\@projects,
|
||||||
'searchtext' => $searchtext,
|
'search_regexp' => $search_regexp,
|
||||||
'tagfilter' => $tagfilter)
|
'tagfilter' => $tagfilter)
|
||||||
if ($tagfilter || $searchtext);
|
if ($tagfilter || $search_regexp);
|
||||||
# fill the rest
|
# fill the rest
|
||||||
@projects = fill_project_list_info(\@projects);
|
@projects = fill_project_list_info(\@projects);
|
||||||
|
|
||||||
|
@ -38,4 +38,18 @@ test_expect_success 'test_export works with weird vars' '
|
|||||||
test "$bar" = "weird # variable"
|
test "$bar" = "weird # variable"
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_perf 'important variables available in subshells' '
|
||||||
|
test -n "$HOME" &&
|
||||||
|
test -n "$TEST_DIRECTORY" &&
|
||||||
|
test -n "$TRASH_DIRECTORY" &&
|
||||||
|
test -n "$GIT_BUILD_DIR"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_perf 'test-lib-functions correctly loaded in subshells' '
|
||||||
|
: >a &&
|
||||||
|
test_path_is_file a &&
|
||||||
|
: >b &&
|
||||||
|
test_cmp a b
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -7,7 +7,7 @@ test_description="Tests diff generation performance"
|
|||||||
test_perf_default_repo
|
test_perf_default_repo
|
||||||
|
|
||||||
test_perf 'log -3000 (baseline)' '
|
test_perf 'log -3000 (baseline)' '
|
||||||
git log -1000 >/dev/null
|
git log -3000 >/dev/null
|
||||||
'
|
'
|
||||||
|
|
||||||
test_perf 'log --raw -3000 (tree-only)' '
|
test_perf 'log --raw -3000 (tree-only)' '
|
||||||
|
@ -45,6 +45,10 @@ TEST_NO_CREATE_REPO=t
|
|||||||
|
|
||||||
. ../test-lib.sh
|
. ../test-lib.sh
|
||||||
|
|
||||||
|
# Variables from test-lib that are normally internal to the tests; we
|
||||||
|
# need to export them for test_perf subshells
|
||||||
|
export TEST_DIRECTORY TRASH_DIRECTORY GIT_BUILD_DIR GIT_TEST_CMP
|
||||||
|
|
||||||
perf_results_dir=$TEST_OUTPUT_DIRECTORY/test-results
|
perf_results_dir=$TEST_OUTPUT_DIRECTORY/test-results
|
||||||
mkdir -p "$perf_results_dir"
|
mkdir -p "$perf_results_dir"
|
||||||
rm -f "$perf_results_dir"/$(basename "$0" .sh).subtests
|
rm -f "$perf_results_dir"/$(basename "$0" .sh).subtests
|
||||||
@ -119,7 +123,7 @@ test_run_perf_ () {
|
|||||||
test_export_="test_cleanup"
|
test_export_="test_cleanup"
|
||||||
export test_cleanup test_export_
|
export test_cleanup test_export_
|
||||||
/usr/bin/time -f "%E %U %S" -o test_time.$i "$SHELL" -c '
|
/usr/bin/time -f "%E %U %S" -o test_time.$i "$SHELL" -c '
|
||||||
. '"$TEST_DIRECTORY"/../test-lib-functions.sh'
|
. '"$TEST_DIRECTORY"/test-lib-functions.sh'
|
||||||
test_export () {
|
test_export () {
|
||||||
[ $# != 0 ] || return 0
|
[ $# != 0 ] || return 0
|
||||||
test_export_="$test_export_\\|$1"
|
test_export_="$test_export_\\|$1"
|
||||||
|
@ -7,6 +7,10 @@ test_description="Gettext reencoding of our *.po/*.mo files works"
|
|||||||
|
|
||||||
. ./lib-gettext.sh
|
. ./lib-gettext.sh
|
||||||
|
|
||||||
|
# The constants used in a tricky observation for undefined behaviour
|
||||||
|
RUNES="TILRAUN: ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ"
|
||||||
|
PUNTS="TILRAUN: ?? ???? ??? ?? ???? ?? ??? ????? ??????????? ??? ?? ????"
|
||||||
|
MSGKEY="TEST: Old English Runes"
|
||||||
|
|
||||||
test_expect_success GETTEXT_LOCALE 'gettext: Emitting UTF-8 from our UTF-8 *.mo files / Icelandic' '
|
test_expect_success GETTEXT_LOCALE 'gettext: Emitting UTF-8 from our UTF-8 *.mo files / Icelandic' '
|
||||||
printf "TILRAUN: Halló Heimur!" >expect &&
|
printf "TILRAUN: Halló Heimur!" >expect &&
|
||||||
@ -15,8 +19,8 @@ test_expect_success GETTEXT_LOCALE 'gettext: Emitting UTF-8 from our UTF-8 *.mo
|
|||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success GETTEXT_LOCALE 'gettext: Emitting UTF-8 from our UTF-8 *.mo files / Runes' '
|
test_expect_success GETTEXT_LOCALE 'gettext: Emitting UTF-8 from our UTF-8 *.mo files / Runes' '
|
||||||
printf "TILRAUN: ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ" >expect &&
|
printf "%s" "$RUNES" >expect &&
|
||||||
LANGUAGE=is LC_ALL="$is_IS_locale" gettext "TEST: Old English Runes" >actual &&
|
LANGUAGE=is LC_ALL="$is_IS_locale" gettext "$MSGKEY" >actual &&
|
||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
@ -26,18 +30,23 @@ test_expect_success GETTEXT_ISO_LOCALE 'gettext: Emitting ISO-8859-1 from our UT
|
|||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success GETTEXT_ISO_LOCALE 'gettext: Emitting ISO-8859-1 from our UTF-8 *.mo files / Runes' '
|
test_expect_success GETTEXT_ISO_LOCALE 'gettext: impossible ISO-8859-1 output' '
|
||||||
LANGUAGE=is LC_ALL="$is_IS_iso_locale" gettext "TEST: Old English Runes" >runes &&
|
LANGUAGE=is LC_ALL="$is_IS_iso_locale" gettext "$MSGKEY" >runes &&
|
||||||
|
case "$(cat runes)" in
|
||||||
if grep "^TEST: Old English Runes$" runes
|
"$MSGKEY")
|
||||||
then
|
say "Your system gives back the key to message catalog"
|
||||||
say "Your system can not handle this complexity and returns the string as-is"
|
;;
|
||||||
else
|
"$PUNTS")
|
||||||
# Both Solaris and GNU libintl will return this stream of
|
say "Your system replaces an impossible character with ?"
|
||||||
# question marks, so it is s probably portable enough
|
;;
|
||||||
printf "TILRAUN: ?? ???? ??? ?? ???? ?? ??? ????? ??????????? ??? ?? ????" >runes-expect &&
|
"$RUNES")
|
||||||
test_cmp runes-expect runes
|
say "Your system gives back the raw message for an impossible request"
|
||||||
fi
|
;;
|
||||||
|
*)
|
||||||
|
say "We never saw the error behaviour your system exhibits"
|
||||||
|
false
|
||||||
|
;;
|
||||||
|
esac
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success GETTEXT_LOCALE 'gettext: Fetching a UTF-8 msgid -> UTF-8' '
|
test_expect_success GETTEXT_LOCALE 'gettext: Fetching a UTF-8 msgid -> UTF-8' '
|
||||||
|
@ -985,4 +985,35 @@ test_expect_success 'git config --edit respects core.editor' '
|
|||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
# malformed configuration files
|
||||||
|
test_expect_success 'barf on syntax error' '
|
||||||
|
cat >.git/config <<-\EOF &&
|
||||||
|
# broken section line
|
||||||
|
[section]
|
||||||
|
key garbage
|
||||||
|
EOF
|
||||||
|
test_must_fail git config --get section.key >actual 2>error &&
|
||||||
|
grep " line 3 " error
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'barf on incomplete section header' '
|
||||||
|
cat >.git/config <<-\EOF &&
|
||||||
|
# broken section line
|
||||||
|
[section
|
||||||
|
key = value
|
||||||
|
EOF
|
||||||
|
test_must_fail git config --get section.key >actual 2>error &&
|
||||||
|
grep " line 2 " error
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'barf on incomplete string' '
|
||||||
|
cat >.git/config <<-\EOF &&
|
||||||
|
# broken section line
|
||||||
|
[section]
|
||||||
|
key = "value string
|
||||||
|
EOF
|
||||||
|
test_must_fail git config --get section.key >actual 2>error &&
|
||||||
|
grep " line 3 " error
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -79,6 +79,15 @@ test_expect_success 'submodule add' '
|
|||||||
cd addtest &&
|
cd addtest &&
|
||||||
git submodule add -q "$submodurl" submod >actual &&
|
git submodule add -q "$submodurl" submod >actual &&
|
||||||
test ! -s actual &&
|
test ! -s actual &&
|
||||||
|
echo "gitdir: ../.git/modules/submod" >expect &&
|
||||||
|
test_cmp expect submod/.git &&
|
||||||
|
(
|
||||||
|
cd submod &&
|
||||||
|
git config core.worktree >actual &&
|
||||||
|
echo "../../../submod" >expect &&
|
||||||
|
test_cmp expect actual &&
|
||||||
|
rm -f actual expect
|
||||||
|
) &&
|
||||||
git submodule init
|
git submodule init
|
||||||
) &&
|
) &&
|
||||||
|
|
||||||
@ -498,4 +507,17 @@ test_expect_success 'relative path works with user@host:path' '
|
|||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'moving the superproject does not break submodules' '
|
||||||
|
(
|
||||||
|
cd addtest &&
|
||||||
|
git submodule status >expect
|
||||||
|
)
|
||||||
|
mv addtest addtest2 &&
|
||||||
|
(
|
||||||
|
cd addtest2 &&
|
||||||
|
git submodule status >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -619,4 +619,21 @@ test_expect_success 'submodule add properly re-creates deeper level submodules'
|
|||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'submodule update properly revives a moved submodule' '
|
||||||
|
(cd super &&
|
||||||
|
git commit -am "pre move" &&
|
||||||
|
git status >expect&&
|
||||||
|
H=$(cd submodule2; git rev-parse HEAD) &&
|
||||||
|
git rm --cached submodule2 &&
|
||||||
|
rm -rf submodule2 &&
|
||||||
|
mkdir -p "moved/sub module" &&
|
||||||
|
git update-index --add --cacheinfo 160000 $H "moved/sub module" &&
|
||||||
|
git config -f .gitmodules submodule.submodule2.path "moved/sub module"
|
||||||
|
git commit -am "post move" &&
|
||||||
|
git submodule update &&
|
||||||
|
git status >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user