aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/RelNotes/2.34.0.txt27
-rw-r--r--Documentation/rev-list-options.txt8
-rw-r--r--Documentation/technical/api-trace2.txt4
-rw-r--r--builtin/fsck.c3
-rw-r--r--builtin/gc.c27
-rw-r--r--builtin/pull.c29
-rw-r--r--compat/simple-ipc/ipc-unix-socket.c22
-rw-r--r--connected.c1
-rw-r--r--object-file.c5
-rw-r--r--revision.c9
-rw-r--r--t/lib-gpg.sh6
-rwxr-xr-xt/t1050-large.sh8
-rwxr-xr-xt/t6000-rev-list-misc.sh31
-rwxr-xr-xt/t7601-merge-pull-config.sh16
-rw-r--r--trace2/tr2_tgt_event.c2
15 files changed, 128 insertions, 70 deletions
diff --git a/Documentation/RelNotes/2.34.0.txt b/Documentation/RelNotes/2.34.0.txt
index effab2ea4b..7ba2a8cddc 100644
--- a/Documentation/RelNotes/2.34.0.txt
+++ b/Documentation/RelNotes/2.34.0.txt
@@ -77,7 +77,10 @@ UI, Workflows & Features
* "git fsck" has been taught to report mismatch between expected and
actual types of an object better.
- * Use ssh public crypto for object and push-cert signing.
+ * In addition to GnuPG, ssh public crypto can be used for object and
+ push-cert signing. Note that this feature cannot be used with
+ ssh-keygen from OpenSSH 8.7, whose support for it is broken. Avoid
+ using it unless you update to OpenSSH 8.8.
* "git log --grep=string --author=name" learns to highlight hits just
like "git grep string" does.
@@ -182,7 +185,7 @@ Performance, Internal Implementation, Development Support etc.
* Prevent "make sparse" from running for the source files that
haven't been modified.
- * The codepath to write a new version of .midx multi-pack index files
+ * The code path to write a new version of .midx multi-pack index files
has learned to release the mmaped memory holding the current
version of .midx before removing them from the disk, as some
platforms do not allow removal of a file that still has mapping.
@@ -260,12 +263,8 @@ Fixes since v2.33
* The output from "git fast-export", when its anonymization feature
is in use, showed an annotated tag incorrectly.
- * Doc update plus improved error reporting.
-
* Recent "diff -m" changes broke "gitk", which has been corrected.
- * Regression fix.
-
* The "git apply -3" code path learned not to bother the lower level
merge machinery when the three-way merge can be trivially resolved
without the content level merge. This fixes a regression caused by
@@ -405,9 +404,23 @@ Fixes since v2.33
(merge 47bfdfb3fd ar/fix-git-pull-no-verify later to maint).
* One CI task based on Fedora image noticed a not-quite-kosher
- consturct recently, which has been corrected.
+ construct recently, which has been corrected.
(merge 4b540cf913 vd/pthread-setspecific-g11-fix later to maint).
+ * "git pull --ff-only" and "git pull --rebase --ff-only" should make
+ it a no-op to attempt pulling from a remote that is behind us, but
+ instead the command errored out by saying it was impossible to
+ fast-forward, which may technically be true, but not a useful thing
+ to diagnose as an error. This has been corrected.
+ (merge 361cb52383 jc/fix-pull-ff-only-when-already-up-to-date later to maint).
+
+ * The way Cygwin emulates a unix-domain socket, on top of which the
+ simple-ipc mechanism is implemented, can race with the program on
+ the other side that wants to use the socket, and briefly make it
+ appear as a regular file before lstat(2) starts reporting it as a
+ socket. We now have a workaround on the side that connects to a
+ unix domain socket.
+
* Other code cleanup, docfix, build fix, etc.
(merge f188160be9 ab/bundle-remove-verbose-option later to maint).
(merge 8c6b4332b4 rs/close-pack-leakfix later to maint).
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index b7bd27e171..24569b06d1 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -968,11 +968,6 @@ list of the missing objects. Object IDs are prefixed with a ``?'' character.
objects.
endif::git-rev-list[]
---unsorted-input::
- Show commits in the order they were given on the command line instead
- of sorting them in reverse chronological order by commit time. Cannot
- be combined with `--no-walk` or `--no-walk=sorted`.
-
--no-walk[=(sorted|unsorted)]::
Only show the given commits, but do not traverse their ancestors.
This has no effect if a range is specified. If the argument
@@ -980,8 +975,7 @@ endif::git-rev-list[]
given on the command line. Otherwise (if `sorted` or no argument
was given), the commits are shown in reverse chronological order
by commit time.
- Cannot be combined with `--graph`. Cannot be combined with
- `--unsorted-input` if `sorted` or no argument was given.
+ Cannot be combined with `--graph`.
--do-walk::
Overrides a previous `--no-walk`.
diff --git a/Documentation/technical/api-trace2.txt b/Documentation/technical/api-trace2.txt
index ef7fe02a8f..bb13ca3db8 100644
--- a/Documentation/technical/api-trace2.txt
+++ b/Documentation/technical/api-trace2.txt
@@ -128,7 +128,7 @@ yields
------------
$ cat ~/log.event
-{"event":"version","sid":"sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.620713Z","file":"common-main.c","line":38,"evt":"2","exe":"2.20.1.155.g426c96fcdb"}
+{"event":"version","sid":"sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.620713Z","file":"common-main.c","line":38,"evt":"3","exe":"2.20.1.155.g426c96fcdb"}
{"event":"start","sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.621027Z","file":"common-main.c","line":39,"t_abs":0.001173,"argv":["git","version"]}
{"event":"cmd_name","sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.621122Z","file":"git.c","line":432,"name":"version","hierarchy":"version"}
{"event":"exit","sid":"20190408T191610.507018Z-H9b68c35f-P000059a8","thread":"main","time":"2019-01-16T17:28:42.621236Z","file":"git.c","line":662,"t_abs":0.001227,"code":0}
@@ -391,7 +391,7 @@ only present on the "start" and "atexit" events.
{
"event":"version",
...
- "evt":"2", # EVENT format version
+ "evt":"3", # EVENT format version
"exe":"2.20.1.155.g426c96fcdb" # git version
}
------------
diff --git a/builtin/fsck.c b/builtin/fsck.c
index d87c28a1cc..27b9e78094 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -605,7 +605,7 @@ static int fsck_loose(const struct object_id *oid, const char *path, void *data)
struct object *obj;
enum object_type type = OBJ_NONE;
unsigned long size;
- void *contents;
+ void *contents = NULL;
int eaten;
struct object_info oi = OBJECT_INFO_INIT;
struct object_id real_oid = *null_oid();
@@ -630,6 +630,7 @@ static int fsck_loose(const struct object_id *oid, const char *path, void *data)
path);
if (err < 0) {
errors_found |= ERROR_OBJECT;
+ free(contents);
return 0; /* keep checking other objects */
}
diff --git a/builtin/gc.c b/builtin/gc.c
index 2670931160..bcef6a4c8d 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -1999,15 +1999,11 @@ static int schtasks_update_schedule(int run_maintenance, int fd)
return schtasks_remove_tasks();
}
-static int is_crontab_available(void)
+MAYBE_UNUSED
+static int check_crontab_process(const char *cmd)
{
- const char *cmd = "crontab";
- int is_available;
struct child_process child = CHILD_PROCESS_INIT;
- if (get_schedule_cmd(&cmd, &is_available))
- return is_available;
-
strvec_split(&child.args, cmd);
strvec_push(&child.args, "-l");
child.no_stdin = 1;
@@ -2022,6 +2018,25 @@ static int is_crontab_available(void)
return 1;
}
+static int is_crontab_available(void)
+{
+ const char *cmd = "crontab";
+ int is_available;
+
+ if (get_schedule_cmd(&cmd, &is_available))
+ return is_available;
+
+#ifdef __APPLE__
+ /*
+ * macOS has cron, but it requires special permissions and will
+ * create a UI alert when attempting to run this command.
+ */
+ return 0;
+#else
+ return check_crontab_process(cmd);
+#endif
+}
+
#define BEGIN_LINE "# BEGIN GIT MAINTENANCE SCHEDULE"
#define END_LINE "# END GIT MAINTENANCE SCHEDULE"
diff --git a/builtin/pull.c b/builtin/pull.c
index efe4f4a81f..127798ba84 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -937,6 +937,33 @@ static int get_can_ff(struct object_id *orig_head,
return ret;
}
+/*
+ * Is orig_head a descendant of _all_ merge_heads?
+ * Unfortunately is_descendant_of() cannot be used as it asks
+ * if orig_head is a descendant of at least one of them.
+ */
+static int already_up_to_date(struct object_id *orig_head,
+ struct oid_array *merge_heads)
+{
+ int i;
+ struct commit *ours;
+
+ ours = lookup_commit_reference(the_repository, orig_head);
+ for (i = 0; i < merge_heads->nr; i++) {
+ struct commit_list *list = NULL;
+ struct commit *theirs;
+ int ok;
+
+ theirs = lookup_commit_reference(the_repository, &merge_heads->oid[i]);
+ commit_list_insert(theirs, &list);
+ ok = repo_is_descendant_of(the_repository, ours, list);
+ free_commit_list(list);
+ if (!ok)
+ return 0;
+ }
+ return 1;
+}
+
static void show_advice_pull_non_ff(void)
{
advise(_("You have divergent branches and need to specify how to reconcile them.\n"
@@ -1078,7 +1105,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
/* ff-only takes precedence over rebase */
if (opt_ff && !strcmp(opt_ff, "--ff-only")) {
- if (!can_ff)
+ if (!can_ff && !already_up_to_date(&orig_head, &merge_heads))
die_ff_impossible();
opt_rebase = REBASE_FALSE;
}
diff --git a/compat/simple-ipc/ipc-unix-socket.c b/compat/simple-ipc/ipc-unix-socket.c
index 4e28857a0a..28a79289d4 100644
--- a/compat/simple-ipc/ipc-unix-socket.c
+++ b/compat/simple-ipc/ipc-unix-socket.c
@@ -35,6 +35,28 @@ enum ipc_active_state ipc_get_active_state(const char *path)
}
}
+#ifdef __CYGWIN__
+ /*
+ * Cygwin emulates Unix sockets by writing special-crafted files whose
+ * `system` bit is set.
+ *
+ * If we are too fast, Cygwin might still be in the process of marking
+ * the underlying file as a system file. Until then, we will not see a
+ * Unix socket here, but a plain file instead. Just in case that this
+ * is happening, wait a little and try again.
+ */
+ {
+ static const int delay[] = { 1, 10, 20, 40, -1 };
+ int i;
+
+ for (i = 0; S_ISREG(st.st_mode) && delay[i] > 0; i++) {
+ sleep_millisec(delay[i]);
+ if (lstat(path, &st) == -1)
+ return IPC_STATE__INVALID_PATH;
+ }
+ }
+#endif
+
/* also complain if a plain file is in the way */
if ((st.st_mode & S_IFMT) != S_IFSOCK)
return IPC_STATE__INVALID_PATH;
diff --git a/connected.c b/connected.c
index cf68e37a97..35bd4a2638 100644
--- a/connected.c
+++ b/connected.c
@@ -107,7 +107,6 @@ no_promisor_pack_found:
if (opt->progress)
strvec_pushf(&rev_list.args, "--progress=%s",
_("Checking connectivity"));
- strvec_push(&rev_list.args, "--unsorted-input");
rev_list.git_cmd = 1;
rev_list.env = opt->env;
diff --git a/object-file.c b/object-file.c
index 02b7970274..c3d866a287 100644
--- a/object-file.c
+++ b/object-file.c
@@ -2557,10 +2557,9 @@ int read_loose_object(const char *path,
goto out;
}
if (check_object_signature(the_repository, expected_oid,
- *contents, *size, oi->type_name->buf, real_oid)) {
- free(*contents);
+ *contents, *size,
+ oi->type_name->buf, real_oid))
goto out;
- }
}
ret = 0; /* everything checks out */
diff --git a/revision.c b/revision.c
index ab7c135804..1981a0859f 100644
--- a/revision.c
+++ b/revision.c
@@ -2254,10 +2254,6 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
} else if (!strcmp(arg, "--author-date-order")) {
revs->sort_order = REV_SORT_BY_AUTHOR_DATE;
revs->topo_order = 1;
- } else if (!strcmp(arg, "--unsorted-input")) {
- if (revs->no_walk)
- die(_("--unsorted-input is incompatible with --no-walk"));
- revs->unsorted_input = 1;
} else if (!strcmp(arg, "--early-output")) {
revs->early_output = 100;
revs->topo_order = 1;
@@ -2651,13 +2647,8 @@ static int handle_revision_pseudo_opt(struct rev_info *revs,
} else if (!strcmp(arg, "--not")) {
*flags ^= UNINTERESTING | BOTTOM;
} else if (!strcmp(arg, "--no-walk")) {
- if (!revs->no_walk && revs->unsorted_input)
- die(_("--no-walk is incompatible with --unsorted-input"));
revs->no_walk = 1;
} else if (skip_prefix(arg, "--no-walk=", &optarg)) {
- if (!revs->no_walk && revs->unsorted_input)
- die(_("--no-walk is incompatible with --unsorted-input"));
-
/*
* Detached form ("--no-walk X" as opposed to "--no-walk=X")
* not allowed, since the argument is optional.
diff --git a/t/lib-gpg.sh b/t/lib-gpg.sh
index 1d8e5b5b7e..a3f285f515 100644
--- a/t/lib-gpg.sh
+++ b/t/lib-gpg.sh
@@ -104,6 +104,12 @@ test_lazy_prereq GPGSSH '
test $? != 127 || exit 1
echo $ssh_version | grep -q "find-principals:missing signature file"
test $? = 0 || exit 1;
+
+ # some broken versions of ssh-keygen segfault on find-principals;
+ # avoid testing with them.
+ ssh-keygen -Y find-principals -f /dev/null -s /dev/null
+ test $? = 139 && exit 1
+
mkdir -p "${GNUPGHOME}" &&
chmod 0700 "${GNUPGHOME}" &&
(setfacl -k "${GNUPGHOME}" 2>/dev/null || true) &&
diff --git a/t/t1050-large.sh b/t/t1050-large.sh
index 4bab6a513c..6bc1d76fb1 100755
--- a/t/t1050-large.sh
+++ b/t/t1050-large.sh
@@ -17,6 +17,14 @@ test_expect_success setup '
export GIT_ALLOC_LIMIT
'
+test_expect_success 'enter "large" codepath, with small core.bigFileThreshold' '
+ test_when_finished "rm -rf repo" &&
+
+ git init --bare repo &&
+ echo large | git -C repo hash-object -w --stdin &&
+ git -C repo -c core.bigfilethreshold=4 fsck
+'
+
# add a large file with different settings
while read expect config
do
diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh
index ef849e5bc8..12def7bcbf 100755
--- a/t/t6000-rev-list-misc.sh
+++ b/t/t6000-rev-list-misc.sh
@@ -169,35 +169,4 @@ test_expect_success 'rev-list --count --objects' '
test_line_count = $count actual
'
-test_expect_success 'rev-list --unsorted-input results in different sorting' '
- git rev-list --unsorted-input HEAD HEAD~ >first &&
- git rev-list --unsorted-input HEAD~ HEAD >second &&
- ! test_cmp first second &&
- sort first >first.sorted &&
- sort second >second.sorted &&
- test_cmp first.sorted second.sorted
-'
-
-test_expect_success 'rev-list --unsorted-input incompatible with --no-walk' '
- cat >expect <<-EOF &&
- fatal: --no-walk is incompatible with --unsorted-input
- EOF
- test_must_fail git rev-list --unsorted-input --no-walk HEAD 2>error &&
- test_cmp expect error &&
- test_must_fail git rev-list --unsorted-input --no-walk=sorted HEAD 2>error &&
- test_cmp expect error &&
- test_must_fail git rev-list --unsorted-input --no-walk=unsorted HEAD 2>error &&
- test_cmp expect error &&
-
- cat >expect <<-EOF &&
- fatal: --unsorted-input is incompatible with --no-walk
- EOF
- test_must_fail git rev-list --no-walk --unsorted-input HEAD 2>error &&
- test_cmp expect error &&
- test_must_fail git rev-list --no-walk=sorted --unsorted-input HEAD 2>error &&
- test_cmp expect error &&
- test_must_fail git rev-list --no-walk=unsorted --unsorted-input HEAD 2>error &&
- test_cmp expect error
-'
-
test_done
diff --git a/t/t7601-merge-pull-config.sh b/t/t7601-merge-pull-config.sh
index 1f652f433e..6275641b9c 100755
--- a/t/t7601-merge-pull-config.sh
+++ b/t/t7601-merge-pull-config.sh
@@ -2,7 +2,7 @@
test_description='git merge
-Testing pull.* configuration parsing.'
+Testing pull.* configuration parsing and other things.'
. ./test-lib.sh
@@ -387,6 +387,20 @@ test_expect_success 'pull prevents non-fast-forward with "only" in pull.ff' '
test_must_fail git pull . c3
'
+test_expect_success 'already-up-to-date pull succeeds with "only" in pull.ff' '
+ git reset --hard c1 &&
+ test_config pull.ff only &&
+ git pull . c0 &&
+ test "$(git rev-parse HEAD)" = "$(git rev-parse c1)"
+'
+
+test_expect_success 'already-up-to-date pull/rebase succeeds with "only" in pull.ff' '
+ git reset --hard c1 &&
+ test_config pull.ff only &&
+ git -c pull.rebase=true pull . c0 &&
+ test "$(git rev-parse HEAD)" = "$(git rev-parse c1)"
+'
+
test_expect_success 'merge c1 with c2 (ours in pull.twohead)' '
git reset --hard c1 &&
git config pull.twohead ours &&
diff --git a/trace2/tr2_tgt_event.c b/trace2/tr2_tgt_event.c
index 70cfc2f77c..3a0014417c 100644
--- a/trace2/tr2_tgt_event.c
+++ b/trace2/tr2_tgt_event.c
@@ -20,7 +20,7 @@ static struct tr2_dst tr2dst_event = { TR2_SYSENV_EVENT, 0, 0, 0, 0 };
* a new field to an existing event, do not require an increment to the EVENT
* format version.
*/
-#define TR2_EVENT_VERSION "2"
+#define TR2_EVENT_VERSION "3"
/*
* Region nesting limit for messages written to the event target.