Git 2.29-rc1
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE4fA2sf7nIh/HeOzvsLXohpav5ssFAl9/7WYACgkQsLXohpav 5svR8hAA4Nl1pAudCyXGHr9tWO91wt6zFLAMMFDLsjAGhq4IRK9l/XyPO3QBrac2 3nvcDUS+wIFLWC7O92QJXbxtANlJsH0sTr99DkjY/c38WqY9JSoUtxsyxp0xJ0R4 kMlzPQXopbu8xIJtlhLfaj7hD4C9YcVoGKkLNZin0vAiwpfCxDNHBH29txQmKWuk sX3K7yS6ZoL93DKSt1+dUiFc+Kn6dEc/x5QAeNYiIE5JENcEdNdn6ecwOGVH3Y5C 2P393QNcZqKw4OB2FPJYUOvXcbjzn7DTUVh40yrKplgTxCqKiuog13Iotd7cM4Bk 1Gk1n2KNVPTnMv7WXPi1aWOXEpNjEENJOPBsZzQjQoDnu+2OWf38URuMXSy9NOQP ZQj67x0tixVfp2Zfg9gv+XPHAvfX4tN3qWEjlowOLZhhXBmwTJzfPWSOuPueRt91 tLJe/9Bw/gOY4omgLuUSUZ3XGI7MxJV66nqqV329cGaWOaWuhsV6bp0ZvQGCFl18 fjLh1e/XZn/6S+GvrSBR0Ky0YqYcyF7dw1zU+hdCnOBv6FWBXLMWbSCn3gpD638S CPihupHLo5Qy/R5J3R6BItb+IYSUvpHVfaDRa3pcD/RHEnbO5KpETaq813BXU7Vw SzhpnhjqronTlPE8hhBSSq83IFUZ0t3AWvFHHjewz6FPfXq4r14= =NqjO -----END PGP SIGNATURE----- Merge tag 'v2.29.0-rc1' of github.com:git/git Git 2.29-rc1 * tag 'v2.29.0-rc1' of github.com:git/git: Git 2.29-rc1 doc: fix the bnf like style of some commands doc: git-remote fix ups doc: use linkgit macro where needed. git-bisect-lk2009: make continuation of list indented ci: do not skip tagged revisions in GitHub workflows ci: skip GitHub workflow runs for already-tested commits/trees tests: avoid using the branch name `main` t1415: avoid using `main` as ref name Makefile: ASCII-sort += lists help: do not expect built-in commands to be hardlinked index-pack: make get_base_data() comment clearer index-pack: drop type_cas mutex index-pack: restore "resolving deltas" progress meter compat/mingw.h: drop extern from function declaration GitHub workflow: automatically follow minor updates of setup-msbuild t5534: split stdout and stderr redirectionmaint
commit
b4a48be10c
|
@ -9,7 +9,7 @@ jobs:
|
|||
ci-config:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
enabled: ${{ steps.check-ref.outputs.enabled }}
|
||||
enabled: ${{ steps.check-ref.outputs.enabled }}${{ steps.skip-if-redundant.outputs.enabled }}
|
||||
steps:
|
||||
- name: try to clone ci-config branch
|
||||
run: |
|
||||
|
@ -34,6 +34,43 @@ jobs:
|
|||
enabled=no
|
||||
fi
|
||||
echo "::set-output name=enabled::$enabled"
|
||||
- name: skip if the commit or tree was already tested
|
||||
id: skip-if-redundant
|
||||
uses: actions/github-script@v3
|
||||
if: steps.check-ref.outputs.enabled == 'yes'
|
||||
with:
|
||||
github-token: ${{secrets.GITHUB_TOKEN}}
|
||||
script: |
|
||||
// Figure out workflow ID, commit and tree
|
||||
const { data: run } = await github.actions.getWorkflowRun({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: context.runId,
|
||||
});
|
||||
const workflow_id = run.workflow_id;
|
||||
const head_sha = run.head_sha;
|
||||
const tree_id = run.head_commit.tree_id;
|
||||
|
||||
// See whether there is a successful run for that commit or tree
|
||||
const { data: runs } = await github.actions.listWorkflowRuns({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
per_page: 500,
|
||||
status: 'success',
|
||||
workflow_id,
|
||||
});
|
||||
for (const run of runs.workflow_runs) {
|
||||
if (head_sha === run.head_sha) {
|
||||
core.warning(`Successful run for the commit ${head_sha}: ${run.html_url}`);
|
||||
core.setOutput('enabled', ' but skip');
|
||||
break;
|
||||
}
|
||||
if (tree_id === run.head_commit.tree_id) {
|
||||
core.warning(`Successful run for the tree ${tree_id}: ${run.html_url}`);
|
||||
core.setOutput('enabled', ' but skip');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
windows-build:
|
||||
needs: ci-config
|
||||
|
@ -154,7 +191,7 @@ jobs:
|
|||
Expand-Archive compat.zip -DestinationPath . -Force
|
||||
Remove-Item compat.zip
|
||||
- name: add msbuild to PATH
|
||||
uses: microsoft/setup-msbuild@v1.0.0
|
||||
uses: microsoft/setup-msbuild@v1
|
||||
- name: copy dlls to root
|
||||
shell: powershell
|
||||
run: |
|
||||
|
|
|
@ -156,7 +156,7 @@ Performance, Internal Implementation, Development Support etc.
|
|||
barrier to adoption.
|
||||
|
||||
* The final leg of SHA-256 transition plus doc updates. Note that
|
||||
there is no inter-operability between SHA-1 and SHA-256
|
||||
there is no interoperability between SHA-1 and SHA-256
|
||||
repositories yet.
|
||||
|
||||
* CMake support to build with MSVC for Windows bypassing the Makefile.
|
||||
|
@ -184,10 +184,6 @@ Performance, Internal Implementation, Development Support etc.
|
|||
the ref backend in use, as its format is much richer than the
|
||||
normal refs, and written directly by "git fetch" as a plain file..
|
||||
|
||||
* A handful of places in in-tree code still relied on being able to
|
||||
execute the git subcommands, especially built-ins, in "git-foo"
|
||||
form, which have been corrected.
|
||||
|
||||
* An unused binary has been discarded, and and a bunch of commands
|
||||
have been turned into into built-in.
|
||||
|
||||
|
@ -216,10 +212,25 @@ Performance, Internal Implementation, Development Support etc.
|
|||
* "diff-highlight" (in contrib/) had a logic to flush its output upon
|
||||
seeing a blank line but the way it detected a blank line was broken.
|
||||
|
||||
* The logic to skip testing on the tagged commit and the tag itself
|
||||
was not quite consistent which led to failure of Windows test
|
||||
tasks. It has been revamped to consistently skip revisions that
|
||||
have already been tested, based on the tree object of the revision.
|
||||
|
||||
|
||||
Fixes since v2.28
|
||||
-----------------
|
||||
|
||||
* The "mediawiki" remote backend which lives in contrib/mw-to-git/
|
||||
and is not built with git by default, had an RCE bug allowing a
|
||||
malicious MediaWiki server operator to inject arbitrary commands
|
||||
for execution by a cloning client. This has been fixed.
|
||||
|
||||
The bug was discovered and reported by Joern Schneeweisz of GitLab
|
||||
to the git-security mailing list. Its practical impact due to the
|
||||
obscurity of git-remote-mediawiki was deemed small enough to forgo
|
||||
a dedicated security release.
|
||||
|
||||
* "git clone --separate-git-dir=$elsewhere" used to stomp on the
|
||||
contents of the existing directory $elsewhere, which has been
|
||||
taught to fail when $elsewhere is not an empty directory.
|
||||
|
@ -355,16 +366,13 @@ Fixes since v2.28
|
|||
"git log --tags=no-tag-matches-this-pattern" does.
|
||||
(merge 04a0e98515 jk/rev-input-given-fix later to maint).
|
||||
|
||||
* Various callers of run_command API has been modernized.
|
||||
* Various callers of run_command API have been modernized.
|
||||
(merge afbdba391e jc/run-command-use-embedded-args later to maint).
|
||||
|
||||
* List of options offered and accepted by "git add -i/-p" were
|
||||
inconsistent, which have been corrected.
|
||||
(merge ce910287e7 pw/add-p-allowed-options-fix later to maint).
|
||||
|
||||
* Various callers of run_command API has been modernized.
|
||||
(merge afbdba391e jc/run-command-use-embedded-args later to maint).
|
||||
|
||||
* "git diff --stat -w" showed 0-line changes for paths whose changes
|
||||
were only whitespaces, which was not intuitive. We now omit such
|
||||
paths from the stat output.
|
||||
|
@ -381,7 +389,7 @@ Fixes since v2.28
|
|||
information (e.g. "@{u}" does not record what branch the user was
|
||||
on hence which branch 'the upstream' needs to be computed, and even
|
||||
if the record were available, the relationship between branches may
|
||||
have changed), at least hide the error to allow "status" show its
|
||||
have changed), at least hide the error and allow "status" to show its
|
||||
output.
|
||||
|
||||
* "git status --short" quoted a path with SP in it when tracked, but
|
||||
|
@ -398,7 +406,7 @@ Fixes since v2.28
|
|||
(merge 378fe5fc3d mt/config-fail-nongit-early later to maint).
|
||||
|
||||
* There is a logic to estimate how many objects are in the
|
||||
repository, which is mean to run once per process invocation, but
|
||||
repository, which is meant to run once per process invocation, but
|
||||
it ran every time the estimated value was requested.
|
||||
(merge 67bb65de5d jk/dont-count-existing-objects-twice later to maint).
|
||||
|
||||
|
@ -411,8 +419,8 @@ Fixes since v2.28
|
|||
which has been corrected.
|
||||
(merge 4e735c1326 ar/fetch-ipversion-in-all later to maint).
|
||||
|
||||
* The "unshelve" subcommand of "git p4" used incorrectly used
|
||||
commit^N where it meant to say commit~N to name the Nth generation
|
||||
* The "unshelve" subcommand of "git p4" incorrectly used commit^N
|
||||
where it meant to say commit~N to name the Nth generation
|
||||
ancestor, which has been corrected.
|
||||
(merge 0acbf5997f ld/p4-unshelve-fix later to maint).
|
||||
|
||||
|
|
|
@ -473,7 +473,7 @@ Z-Z
|
|||
-------------
|
||||
|
||||
2) starting from the "good" ends of the graph, associate to each
|
||||
commit the number of ancestors it has plus one
|
||||
commit the number of ancestors it has plus one
|
||||
|
||||
For example with the following graph where H is the "bad" commit and A
|
||||
and D are some parents of some "good" commits:
|
||||
|
@ -514,7 +514,7 @@ D---E
|
|||
-------------
|
||||
|
||||
4) the best bisection point is the commit with the highest associated
|
||||
number
|
||||
number
|
||||
|
||||
So in the above example the best bisection point is commit C.
|
||||
|
||||
|
@ -580,8 +580,8 @@ good or a bad commit does not give more or less information).
|
|||
|
||||
Let's also suppose that we have a cleaned up graph like one after step
|
||||
1) in the bisection algorithm above. This means that we can measure
|
||||
the information we get in terms of number of commit we can remove from
|
||||
the graph..
|
||||
the information we get in terms of number of commit we can remove
|
||||
from the graph..
|
||||
|
||||
And let's take a commit X in the graph.
|
||||
|
||||
|
@ -689,18 +689,18 @@ roughly the following steps:
|
|||
6) sort the commit by decreasing associated value
|
||||
|
||||
7) if the first commit has not been skipped, we can return it and stop
|
||||
here
|
||||
here
|
||||
|
||||
8) otherwise filter out all the skipped commits in the sorted list
|
||||
|
||||
9) use a pseudo random number generator (PRNG) to generate a random
|
||||
number between 0 and 1
|
||||
number between 0 and 1
|
||||
|
||||
10) multiply this random number with its square root to bias it toward
|
||||
0
|
||||
0
|
||||
|
||||
11) multiply the result by the number of commits in the filtered list
|
||||
to get an index into this list
|
||||
to get an index into this list
|
||||
|
||||
12) return the commit at the computed index
|
||||
|
||||
|
|
|
@ -209,7 +209,7 @@ providing this option will cause it to die.
|
|||
Use \0 as the delimiter for pathnames in the output, and print
|
||||
them verbatim. Without this option, pathnames with "unusual"
|
||||
characters are quoted as explained for the configuration
|
||||
variable core.quotePath (see git-config(1)).
|
||||
variable core.quotePath (see linkgit:git-config[1]).
|
||||
|
||||
-o::
|
||||
--only-matching::
|
||||
|
|
|
@ -70,7 +70,7 @@ repository.
|
|||
+
|
||||
If this is reinitialization, the repository will be moved to the specified path.
|
||||
|
||||
-b <branch-name::
|
||||
-b <branch-name>::
|
||||
--initial-branch=<branch-name>::
|
||||
|
||||
Use the specified name for the initial branch in the newly created repository.
|
||||
|
|
|
@ -10,7 +10,7 @@ SYNOPSIS
|
|||
--------
|
||||
[verse]
|
||||
'git remote' [-v | --verbose]
|
||||
'git remote add' [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
|
||||
'git remote add' [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=(fetch|push)] <name> <url>
|
||||
'git remote rename' <old> <new>
|
||||
'git remote remove' <name>
|
||||
'git remote set-head' <name> (-a | --auto | -d | --delete | <branch>)
|
||||
|
@ -35,7 +35,7 @@ OPTIONS
|
|||
-v::
|
||||
--verbose::
|
||||
Be a little more verbose and show remote url after name.
|
||||
NOTE: This must be placed between `remote` and `subcommand`.
|
||||
NOTE: This must be placed between `remote` and subcommand.
|
||||
|
||||
|
||||
COMMANDS
|
||||
|
@ -46,7 +46,7 @@ subcommands are available to perform operations on the remotes.
|
|||
|
||||
'add'::
|
||||
|
||||
Adds a remote named <name> for the repository at
|
||||
Add a remote named <name> for the repository at
|
||||
<url>. The command `git fetch <name>` can then be used to create and
|
||||
update remote-tracking branches <name>/<branch>.
|
||||
+
|
||||
|
@ -109,13 +109,13 @@ With `-d` or `--delete`, the symbolic ref `refs/remotes/<name>/HEAD` is deleted.
|
|||
+
|
||||
With `-a` or `--auto`, the remote is queried to determine its `HEAD`, then the
|
||||
symbolic-ref `refs/remotes/<name>/HEAD` is set to the same branch. e.g., if the remote
|
||||
`HEAD` is pointed at `next`, "`git remote set-head origin -a`" will set
|
||||
`HEAD` is pointed at `next`, `git remote set-head origin -a` will set
|
||||
the symbolic-ref `refs/remotes/origin/HEAD` to `refs/remotes/origin/next`. This will
|
||||
only work if `refs/remotes/origin/next` already exists; if not it must be
|
||||
fetched first.
|
||||
+
|
||||
Use `<branch>` to set the symbolic-ref `refs/remotes/<name>/HEAD` explicitly. e.g., "git
|
||||
remote set-head origin master" will set the symbolic-ref `refs/remotes/origin/HEAD` to
|
||||
Use `<branch>` to set the symbolic-ref `refs/remotes/<name>/HEAD` explicitly. e.g., `git
|
||||
remote set-head origin master` will set the symbolic-ref `refs/remotes/origin/HEAD` to
|
||||
`refs/remotes/origin/master`. This will only work if
|
||||
`refs/remotes/origin/master` already exists; if not it must be fetched first.
|
||||
+
|
||||
|
@ -127,7 +127,7 @@ This can be used to track a subset of the available remote branches
|
|||
after the initial setup for a remote.
|
||||
+
|
||||
The named branches will be interpreted as if specified with the
|
||||
`-t` option on the 'git remote add' command line.
|
||||
`-t` option on the `git remote add` command line.
|
||||
+
|
||||
With `--add`, instead of replacing the list of currently tracked
|
||||
branches, adds to that list.
|
||||
|
@ -181,16 +181,16 @@ fetch --prune <name>`, except that no new references will be fetched.
|
|||
See the PRUNING section of linkgit:git-fetch[1] for what it'll prune
|
||||
depending on various configuration.
|
||||
+
|
||||
With `--dry-run` option, report what branches will be pruned, but do not
|
||||
With `--dry-run` option, report what branches would be pruned, but do not
|
||||
actually prune them.
|
||||
|
||||
'update'::
|
||||
|
||||
Fetch updates for remotes or remote groups in the repository as defined by
|
||||
remotes.<group>. If neither group nor remote is specified on the command line,
|
||||
`remotes.<group>`. If neither group nor remote is specified on the command line,
|
||||
the configuration parameter remotes.default will be used; if
|
||||
remotes.default is not defined, all remotes which do not have the
|
||||
configuration parameter remote.<name>.skipDefaultUpdate set to true will
|
||||
configuration parameter `remote.<name>.skipDefaultUpdate` set to true will
|
||||
be updated. (See linkgit:git-config[1]).
|
||||
+
|
||||
With `--prune` option, run pruning against all the remotes that are updated.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
GVF=GIT-VERSION-FILE
|
||||
DEF_VER=v2.29.0-rc0
|
||||
DEF_VER=v2.29.0-rc1
|
||||
|
||||
LF='
|
||||
'
|
||||
|
|
10
Makefile
10
Makefile
|
@ -820,8 +820,8 @@ TEST_SHELL_PATH = $(SHELL_PATH)
|
|||
LIB_FILE = libgit.a
|
||||
XDIFF_LIB = xdiff/lib.a
|
||||
|
||||
GENERATED_H += config-list.h
|
||||
GENERATED_H += command-list.h
|
||||
GENERATED_H += config-list.h
|
||||
|
||||
LIB_H := $(sort $(patsubst ./%,%,$(shell git ls-files '*.h' ':!t/' ':!Documentation/' 2>/dev/null || \
|
||||
$(FIND) . \
|
||||
|
@ -998,9 +998,9 @@ LIB_OBJS += sigchain.o
|
|||
LIB_OBJS += split-index.o
|
||||
LIB_OBJS += stable-qsort.o
|
||||
LIB_OBJS += strbuf.o
|
||||
LIB_OBJS += strvec.o
|
||||
LIB_OBJS += streaming.o
|
||||
LIB_OBJS += string-list.o
|
||||
LIB_OBJS += strvec.o
|
||||
LIB_OBJS += sub-process.o
|
||||
LIB_OBJS += submodule-config.o
|
||||
LIB_OBJS += submodule.o
|
||||
|
@ -1066,15 +1066,15 @@ BUILTIN_OBJS += builtin/checkout-index.o
|
|||
BUILTIN_OBJS += builtin/checkout.o
|
||||
BUILTIN_OBJS += builtin/clean.o
|
||||
BUILTIN_OBJS += builtin/clone.o
|
||||
BUILTIN_OBJS += builtin/credential-cache.o
|
||||
BUILTIN_OBJS += builtin/credential-cache--daemon.o
|
||||
BUILTIN_OBJS += builtin/credential-store.o
|
||||
BUILTIN_OBJS += builtin/column.o
|
||||
BUILTIN_OBJS += builtin/commit-graph.o
|
||||
BUILTIN_OBJS += builtin/commit-tree.o
|
||||
BUILTIN_OBJS += builtin/commit.o
|
||||
BUILTIN_OBJS += builtin/config.o
|
||||
BUILTIN_OBJS += builtin/count-objects.o
|
||||
BUILTIN_OBJS += builtin/credential-cache--daemon.o
|
||||
BUILTIN_OBJS += builtin/credential-cache.o
|
||||
BUILTIN_OBJS += builtin/credential-store.o
|
||||
BUILTIN_OBJS += builtin/credential.o
|
||||
BUILTIN_OBJS += builtin/describe.o
|
||||
BUILTIN_OBJS += builtin/diff-files.o
|
||||
|
|
|
@ -159,10 +159,6 @@ static pthread_mutex_t deepest_delta_mutex;
|
|||
#define deepest_delta_lock() lock_mutex(&deepest_delta_mutex)
|
||||
#define deepest_delta_unlock() unlock_mutex(&deepest_delta_mutex)
|
||||
|
||||
static pthread_mutex_t type_cas_mutex;
|
||||
#define type_cas_lock() lock_mutex(&type_cas_mutex)
|
||||
#define type_cas_unlock() unlock_mutex(&type_cas_mutex)
|
||||
|
||||
static pthread_key_t key;
|
||||
|
||||
static inline void lock_mutex(pthread_mutex_t *mutex)
|
||||
|
@ -186,7 +182,6 @@ static void init_thread(void)
|
|||
init_recursive_mutex(&read_mutex);
|
||||
pthread_mutex_init(&counter_mutex, NULL);
|
||||
pthread_mutex_init(&work_mutex, NULL);
|
||||
pthread_mutex_init(&type_cas_mutex, NULL);
|
||||
if (show_stat)
|
||||
pthread_mutex_init(&deepest_delta_mutex, NULL);
|
||||
pthread_key_create(&key, NULL);
|
||||
|
@ -209,7 +204,6 @@ static void cleanup_thread(void)
|
|||
pthread_mutex_destroy(&read_mutex);
|
||||
pthread_mutex_destroy(&counter_mutex);
|
||||
pthread_mutex_destroy(&work_mutex);
|
||||
pthread_mutex_destroy(&type_cas_mutex);
|
||||
if (show_stat)
|
||||
pthread_mutex_destroy(&deepest_delta_mutex);
|
||||
for (i = 0; i < nr_threads; i++)
|
||||
|
@ -894,18 +888,15 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
|
|||
}
|
||||
|
||||
/*
|
||||
* Walk from current node up
|
||||
* to top parent if necessary to deflate the node. In normal
|
||||
* situation, its parent node would be already deflated, so it just
|
||||
* needs to apply delta.
|
||||
* Ensure that this node has been reconstructed and return its contents.
|
||||
*
|
||||
* In the worst case scenario, parent node is no longer deflated because
|
||||
* we're running out of delta_base_cache_limit; we need to re-deflate
|
||||
* parents, possibly up to the top base.
|
||||
*
|
||||
* All deflated objects here are subject to be freed if we exceed
|
||||
* delta_base_cache_limit, just like in find_unresolved_deltas(), we
|
||||
* just need to make sure the last node is not freed.
|
||||
* In the typical and best case, this node would already be reconstructed
|
||||
* (through the invocation to resolve_delta() in threaded_second_pass()) and it
|
||||
* would not be pruned. However, if pruning of this node was necessary due to
|
||||
* reaching delta_base_cache_limit, this function will find the closest
|
||||
* ancestor with reconstructed data that has not been pruned (or if there is
|
||||
* none, the ultimate base object), and reconstruct each node in the delta
|
||||
* chain in order to generate the reconstructed data for this node.
|
||||
*/
|
||||
static void *get_base_data(struct base_data *c)
|
||||
{
|
||||
|
@ -1028,6 +1019,10 @@ static void *threaded_second_pass(void *data)
|
|||
struct object_entry *child_obj;
|
||||
struct base_data *child;
|
||||
|
||||
counter_lock();
|
||||
display_progress(progress, nr_resolved_deltas);
|
||||
counter_unlock();
|
||||
|
||||
work_lock();
|
||||
if (list_empty(&work_head)) {
|
||||
/*
|
||||
|
|
|
@ -1308,7 +1308,7 @@ static int module_summary(int argc, const char **argv, const char *prefix)
|
|||
};
|
||||
|
||||
const char *const git_submodule_helper_usage[] = {
|
||||
N_("git submodule--helper summary [<options>] [commit] [--] [<path>]"),
|
||||
N_("git submodule--helper summary [<options>] [<commit>] [--] [<path>]"),
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
@ -149,6 +149,7 @@ then
|
|||
CI_REPO_SLUG="$GITHUB_REPOSITORY"
|
||||
CI_JOB_ID="$GITHUB_RUN_ID"
|
||||
CC="${CC:-gcc}"
|
||||
DONT_SKIP_TAGS=t
|
||||
|
||||
cache_dir="$HOME/none"
|
||||
|
||||
|
@ -167,6 +168,7 @@ good_trees_file="$cache_dir/good-trees"
|
|||
|
||||
mkdir -p "$cache_dir"
|
||||
|
||||
test -n "${DONT_SKIP_TAGS-}" ||
|
||||
skip_branch_tip_with_tag
|
||||
skip_good_tree
|
||||
|
||||
|
|
|
@ -606,7 +606,7 @@ int main(int argc, const char **argv);
|
|||
* Call this function to open a new MinTTY (this assumes you are in Git for
|
||||
* Windows' SDK) with a GDB that attaches to the current process right away.
|
||||
*/
|
||||
extern void open_in_gdb(void);
|
||||
void open_in_gdb(void);
|
||||
|
||||
/*
|
||||
* Used by Pthread API implementation for Windows
|
||||
|
|
19
git.c
19
git.c
|
@ -638,6 +638,25 @@ static void list_builtins(struct string_list *out, unsigned int exclude_option)
|
|||
}
|
||||
}
|
||||
|
||||
void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
|
||||
{
|
||||
const char *name;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Callers can ask for a subset of the commands based on a certain
|
||||
* prefix, which is then dropped from the added names. The names in
|
||||
* the `commands[]` array do not have the `git-` prefix, though,
|
||||
* therefore we must expect the `prefix` to at least start with `git-`.
|
||||
*/
|
||||
if (!skip_prefix(prefix, "git-", &prefix))
|
||||
BUG("prefix '%s' must start with 'git-'", prefix);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(commands); i++)
|
||||
if (skip_prefix(commands[i].cmd, prefix, &name))
|
||||
add_cmdname(cmds, name, strlen(name));
|
||||
}
|
||||
|
||||
#ifdef STRIP_EXTENSION
|
||||
static void strip_extension(const char **argv)
|
||||
{
|
||||
|
|
2
help.c
2
help.c
|
@ -263,6 +263,8 @@ void load_command_list(const char *prefix,
|
|||
const char *env_path = getenv("PATH");
|
||||
const char *exec_path = git_exec_path();
|
||||
|
||||
load_builtin_commands(prefix, main_cmds);
|
||||
|
||||
if (exec_path) {
|
||||
list_commands_in_dir(main_cmds, exec_path, prefix);
|
||||
QSORT(main_cmds->names, main_cmds->cnt, cmdname_compare);
|
||||
|
|
1
help.h
1
help.h
|
@ -32,6 +32,7 @@ const char *help_unknown_cmd(const char *cmd);
|
|||
void load_command_list(const char *prefix,
|
||||
struct cmdnames *main_cmds,
|
||||
struct cmdnames *other_cmds);
|
||||
void load_builtin_commands(const char *prefix, struct cmdnames *cmds);
|
||||
void add_cmdname(struct cmdnames *cmds, const char *name, int len);
|
||||
/* Here we require that excludes is a sorted list. */
|
||||
void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes);
|
||||
|
|
|
@ -76,24 +76,24 @@ test_expect_success 'reflog of worktrees/xx/HEAD' '
|
|||
test_cmp expected actual.wt2
|
||||
'
|
||||
|
||||
test_expect_success 'for-each-ref from main repo' '
|
||||
test_expect_success 'for-each-ref from main worktree' '
|
||||
mkdir fer1 &&
|
||||
git -C fer1 init repo &&
|
||||
test_commit -C fer1/repo initial &&
|
||||
git -C fer1/repo worktree add ../second &&
|
||||
git -C fer1/repo update-ref refs/bisect/main HEAD &&
|
||||
git -C fer1/repo update-ref refs/rewritten/main HEAD &&
|
||||
git -C fer1/repo update-ref refs/worktree/main HEAD &&
|
||||
git -C fer1/repo for-each-ref --format="%(refname)" | grep main >actual &&
|
||||
git -C fer1/repo update-ref refs/bisect/first HEAD &&
|
||||
git -C fer1/repo update-ref refs/rewritten/first HEAD &&
|
||||
git -C fer1/repo update-ref refs/worktree/first HEAD &&
|
||||
git -C fer1/repo for-each-ref --format="%(refname)" | grep first >actual &&
|
||||
cat >expected <<-\EOF &&
|
||||
refs/bisect/main
|
||||
refs/rewritten/main
|
||||
refs/worktree/main
|
||||
refs/bisect/first
|
||||
refs/rewritten/first
|
||||
refs/worktree/first
|
||||
EOF
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
test_expect_success 'for-each-ref from linked repo' '
|
||||
test_expect_success 'for-each-ref from linked worktree' '
|
||||
mkdir fer2 &&
|
||||
git -C fer2 init repo &&
|
||||
test_commit -C fer2/repo initial &&
|
||||
|
|
|
@ -277,4 +277,11 @@ test_expect_success 'index-pack --fsck-objects also warns upon missing tagger in
|
|||
grep "^warning:.* expected .tagger. line" err
|
||||
'
|
||||
|
||||
test_expect_success 'index-pack -v --stdin produces progress for both phases' '
|
||||
pack=$(git pack-objects --all pack </dev/null) &&
|
||||
GIT_PROGRESS_DELAY=0 git index-pack -v --stdin <pack-$pack.pack 2>err &&
|
||||
test_i18ngrep "Receiving objects" err &&
|
||||
test_i18ngrep "Resolving deltas" err
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
|
@ -282,10 +282,9 @@ test_expect_success GPG 'failed atomic push does not execute GPG' '
|
|||
EOF
|
||||
test_must_fail env PATH="$TRASH_DIRECTORY:$PATH" git push \
|
||||
--signed --atomic --porcelain \
|
||||
dst noop ff noff >out 2>&1 &&
|
||||
dst noop ff noff >out 2>err &&
|
||||
|
||||
test_i18ngrep ! "gpg failed to sign" out &&
|
||||
sed -n -e "/^To dst/,$ p" out >actual &&
|
||||
test_i18ngrep ! "gpg failed to sign" err &&
|
||||
cat >expect <<-EOF &&
|
||||
To dst
|
||||
= refs/heads/noop:refs/heads/noop [up to date]
|
||||
|
@ -293,7 +292,7 @@ test_expect_success GPG 'failed atomic push does not execute GPG' '
|
|||
! refs/heads/noff:refs/heads/noff [rejected] (non-fast-forward)
|
||||
Done
|
||||
EOF
|
||||
test_i18ncmp expect actual
|
||||
test_cmp expect out
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
|
@ -171,7 +171,7 @@ test_expect_success '--full-diff is not affected by --parents' '
|
|||
test_expect_success 'rebuild repo' '
|
||||
rm -rf .git * &&
|
||||
git init &&
|
||||
git switch -c main &&
|
||||
git switch -c topic &&
|
||||
|
||||
echo base >file &&
|
||||
git add file &&
|
||||
|
@ -186,7 +186,7 @@ test_expect_success 'rebuild repo' '
|
|||
git add file &&
|
||||
test_commit B &&
|
||||
|
||||
git switch main &&
|
||||
git switch topic &&
|
||||
test_must_fail git merge -m "M" B &&
|
||||
echo A >file &&
|
||||
echo B >>file &&
|
||||
|
@ -207,7 +207,7 @@ test_expect_success 'rebuild repo' '
|
|||
git merge -m R -Xtheirs X &&
|
||||
note R &&
|
||||
|
||||
git switch main &&
|
||||
git switch topic &&
|
||||
git merge -m N R &&
|
||||
note N &&
|
||||
|
||||
|
@ -221,7 +221,7 @@ test_expect_success 'rebuild repo' '
|
|||
git add z &&
|
||||
test_commit Z &&
|
||||
|
||||
git switch main &&
|
||||
git switch topic &&
|
||||
git merge -m O Z &&
|
||||
note O &&
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@ test_expect_success 'Simple merge in repo with interesting pathnames' '
|
|||
git add . &&
|
||||
git commit -m initial &&
|
||||
|
||||
git branch main &&
|
||||
git branch topic &&
|
||||
git branch other &&
|
||||
|
||||
git checkout other &&
|
||||
|
@ -132,10 +132,10 @@ test_expect_success 'Simple merge in repo with interesting pathnames' '
|
|||
git add -u &&
|
||||
git commit -m other &&
|
||||
|
||||
git checkout main &&
|
||||
echo main >foo/bar/baz &&
|
||||
git checkout topic &&
|
||||
echo topic >foo/bar/baz &&
|
||||
git add -u &&
|
||||
git commit -m main &&
|
||||
git commit -m topic &&
|
||||
|
||||
git merge other &&
|
||||
git ls-files -s >out &&
|
||||
|
|
|
@ -35,11 +35,11 @@ test_expect_success 'setup branch sub' '
|
|||
test_commit foo
|
||||
'
|
||||
|
||||
test_expect_success 'setup branch main' '
|
||||
git checkout -b main master &&
|
||||
test_expect_success 'setup topic branch' '
|
||||
git checkout -b topic master &&
|
||||
git merge -s ours --no-commit --allow-unrelated-histories sub &&
|
||||
git read-tree --prefix=dir/ -u sub &&
|
||||
git commit -m "initial merge of sub into main" &&
|
||||
git commit -m "initial merge of sub into topic" &&
|
||||
test_path_is_file dir/foo.t &&
|
||||
test_path_is_file hello
|
||||
'
|
||||
|
@ -49,9 +49,9 @@ test_expect_success 'update branch sub' '
|
|||
test_commit bar
|
||||
'
|
||||
|
||||
test_expect_success 'update branch main' '
|
||||
git checkout main &&
|
||||
git merge -s subtree sub -m "second merge of sub into main" &&
|
||||
test_expect_success 'update topic branch' '
|
||||
git checkout topic &&
|
||||
git merge -s subtree sub -m "second merge of sub into topic" &&
|
||||
test_path_is_file dir/bar.t &&
|
||||
test_path_is_file dir/foo.t &&
|
||||
test_path_is_file hello
|
||||
|
|
|
@ -663,7 +663,7 @@ test_expect_failure 'merge-recursive rename vs. rename/symlink' '
|
|||
|
||||
test_expect_success 'merging with triple rename across D/F conflict' '
|
||||
git reset --hard HEAD &&
|
||||
git checkout -b main &&
|
||||
git checkout -b topic &&
|
||||
git rm -rf . &&
|
||||
|
||||
echo "just a file" >sub1 &&
|
||||
|
@ -682,7 +682,7 @@ test_expect_success 'merging with triple rename across D/F conflict' '
|
|||
test_tick &&
|
||||
git commit -a -m changesimplefile &&
|
||||
|
||||
git checkout main &&
|
||||
git checkout topic &&
|
||||
git rm sub1 &&
|
||||
git mv sub2 sub1 &&
|
||||
test_tick &&
|
||||
|
|
Loading…
Reference in New Issue