From: Derrick Stolee via GitGitGadget <hidden> Date: 2021-11-10 18:36:06
From: Derrick Stolee <redacted>
In eba1ba9 (maintenance: `git maintenance run` learned
`--scheduler=<scheduler>`, 2021-09-04), we introduced the ability to
specify a scheduler explicitly. This led to some extra checks around
whether an alternative scheduler was available. This added the
functionality of removing background maintenance from schedulers other
than the one selected.
On macOS, cron is technically available, but running 'crontab' triggers
a UI prompt asking for special permissions. This is the major reason why
launchctl is used as the default scheduler. The is_crontab_available()
method triggers this UI prompt, causing user disruption.
Remove this disruption by using an #ifdef to prevent running crontab
this way on macOS. This has the unfortunate downside that if a user
manually selects cron via the '--scheduler' option, then adjusting the
scheduler later will not remove the schedule from cron. The
'--scheduler' option ignores the is_available checks, which is how we
can get into this situation.
Extract the new check_crontab_process() method to avoid making the
'child' variable unused on macOS. The method is marked MAYBE_UNUSED
because it has no callers on macOS.
Signed-off-by: Derrick Stolee <redacted>
---
[For 2.34.0 Release] maintenance: disable cron on macOS
This one is really tricky because we can't notice anything is wrong
without running git maintenance start or git maintenance stop
interactively on macOS. The tests pass just fine because the UI alert
gets automatically ignored during the test suite.
This is a bit of a half-fix: it avoids the UI alert, but has a corner
case of not un-doing the cron schedule if a user manages to select it
(under suitable permissions such that it succeeds). For the purpose of
the timing of the release, I think this is an appropriate hedge.
Thanks! -Stolee
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1075%2Fderrickstolee%2Fmaintenance-cron-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1075/derrickstolee/maintenance-cron-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1075
builtin/gc.c | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
@@ -1999,15 +1999,11 @@ static int schtasks_update_schedule(int run_maintenance, int fd)returnschtasks_remove_tasks();}-staticintis_crontab_available(void)+MAYBE_UNUSED+staticintcheck_crontab_process(constchar*cmd){-constchar*cmd="crontab";-intis_available;structchild_processchild=CHILD_PROCESS_INIT;-if(get_schedule_cmd(&cmd,&is_available))-returnis_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)return1;}+staticintis_crontab_available(void)+{+constchar*cmd="crontab";+intis_available;++if(get_schedule_cmd(&cmd,&is_available))+returnis_available;++#ifdef __APPLE__+/*+*macOShascron,butitrequiresspecialpermissionsandwill+*createaUIalertwhenattemptingtorunthiscommand.+*/+return0;+#else+returncheck_crontab_process(cmd);+#endif+}+#define BEGIN_LINE "# BEGIN GIT MAINTENANCE SCHEDULE"#define END_LINE "# END GIT MAINTENANCE SCHEDULE"
From: Johannes Schindelin <hidden> Date: 2021-11-10 19:00:04
Hi Stolee,
On Wed, 10 Nov 2021, Derrick Stolee via GitGitGadget wrote:
From: Derrick Stolee <redacted>
In eba1ba9 (maintenance: `git maintenance run` learned
`--scheduler=<scheduler>`, 2021-09-04), we introduced the ability to
specify a scheduler explicitly. This led to some extra checks around
whether an alternative scheduler was available. This added the
functionality of removing background maintenance from schedulers other
than the one selected.
On macOS, cron is technically available, but running 'crontab' triggers
a UI prompt asking for special permissions. This is the major reason why
launchctl is used as the default scheduler. The is_crontab_available()
method triggers this UI prompt, causing user disruption.
Remove this disruption by using an #ifdef to prevent running crontab
this way on macOS. This has the unfortunate downside that if a user
manually selects cron via the '--scheduler' option, then adjusting the
scheduler later will not remove the schedule from cron. The
'--scheduler' option ignores the is_available checks, which is how we
can get into this situation.
Extract the new check_crontab_process() method to avoid making the
'child' variable unused on macOS. The method is marked MAYBE_UNUSED
because it has no callers on macOS.
Signed-off-by: Derrick Stolee <redacted>
---
[For 2.34.0 Release] maintenance: disable cron on macOS
This one is really tricky because we can't notice anything is wrong
without running git maintenance start or git maintenance stop
interactively on macOS. The tests pass just fine because the UI alert
gets automatically ignored during the test suite.
This is a bit of a half-fix: it avoids the UI alert, but has a corner
case of not un-doing the cron schedule if a user manages to select it
(under suitable permissions such that it succeeds). For the purpose of
the timing of the release, I think this is an appropriate hedge.
I agree.
We can revisit this once v2.34.0 is released, and then determine a better
layer to prevent this, or alternatively warn very loudly about it.
Thanks,
Dscho
@@ -1999,15 +1999,11 @@ static int schtasks_update_schedule(int run_maintenance, int fd)returnschtasks_remove_tasks();}-staticintis_crontab_available(void)+MAYBE_UNUSED+staticintcheck_crontab_process(constchar*cmd){-constchar*cmd="crontab";-intis_available;structchild_processchild=CHILD_PROCESS_INIT;-if(get_schedule_cmd(&cmd,&is_available))-returnis_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)return1;}+staticintis_crontab_available(void)+{+constchar*cmd="crontab";+intis_available;++if(get_schedule_cmd(&cmd,&is_available))+returnis_available;++#ifdef __APPLE__+/*+*macOShascron,butitrequiresspecialpermissionsandwill+*createaUIalertwhenattemptingtorunthiscommand.+*/+return0;+#else+returncheck_crontab_process(cmd);+#endif+}+#define BEGIN_LINE "# BEGIN GIT MAINTENANCE SCHEDULE"#define END_LINE "# END GIT MAINTENANCE SCHEDULE"
On Wed, Nov 10 2021, Derrick Stolee via GitGitGadget wrote:
quoted hunk
From: Derrick Stolee <redacted>
In eba1ba9 (maintenance: `git maintenance run` learned
`--scheduler=<scheduler>`, 2021-09-04), we introduced the ability to
specify a scheduler explicitly. This led to some extra checks around
whether an alternative scheduler was available. This added the
functionality of removing background maintenance from schedulers other
than the one selected.
On macOS, cron is technically available, but running 'crontab' triggers
a UI prompt asking for special permissions. This is the major reason why
launchctl is used as the default scheduler. The is_crontab_available()
method triggers this UI prompt, causing user disruption.
Remove this disruption by using an #ifdef to prevent running crontab
this way on macOS. This has the unfortunate downside that if a user
manually selects cron via the '--scheduler' option, then adjusting the
scheduler later will not remove the schedule from cron. The
'--scheduler' option ignores the is_available checks, which is how we
can get into this situation.
Extract the new check_crontab_process() method to avoid making the
'child' variable unused on macOS. The method is marked MAYBE_UNUSED
because it has no callers on macOS.
Signed-off-by: Derrick Stolee <redacted>
---
[For 2.34.0 Release] maintenance: disable cron on macOS
This one is really tricky because we can't notice anything is wrong
without running git maintenance start or git maintenance stop
interactively on macOS. The tests pass just fine because the UI alert
gets automatically ignored during the test suite.
This is a bit of a half-fix: it avoids the UI alert, but has a corner
case of not un-doing the cron schedule if a user manages to select it
(under suitable permissions such that it succeeds). For the purpose of
the timing of the release, I think this is an appropriate hedge.
Thanks! -Stolee
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1075%2Fderrickstolee%2Fmaintenance-cron-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1075/derrickstolee/maintenance-cron-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1075
builtin/gc.c | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
@@ -1999,15 +1999,11 @@ static int schtasks_update_schedule(int run_maintenance, int fd)returnschtasks_remove_tasks();}-staticintis_crontab_available(void)+MAYBE_UNUSED+staticintcheck_crontab_process(constchar*cmd){-constchar*cmd="crontab";-intis_available;structchild_processchild=CHILD_PROCESS_INIT;-if(get_schedule_cmd(&cmd,&is_available))-returnis_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)return1;}+staticintis_crontab_available(void)+{+constchar*cmd="crontab";+intis_available;++if(get_schedule_cmd(&cmd,&is_available))+returnis_available;++#ifdef __APPLE__+/*+*macOShascron,butitrequiresspecialpermissionsandwill+*createaUIalertwhenattemptingtorunthiscommand.+*/+return0;+#else+returncheck_crontab_process(cmd);+#endif+}+#define BEGIN_LINE "# BEGIN GIT MAINTENANCE SCHEDULE"#define END_LINE "# END GIT MAINTENANCE SCHEDULE"
I haven't tested, but isn't a smaller fix for this to just re-arrange
the array where we declare the methods to check to have "cron" come
after all the OS-specific ones, or at least after launchctl?
I.e. we already have an ifdef to pick launchctl and never cron for OSX
on "start", so this is only for the case where we loop through the array
looking for something to select.
That wouldn't work if that user can run cron, but can't use launchctl at
all, but in that case won't they be happy to get the prompt?
On 11/10/2021 3:56 PM, Ævar Arnfjörð Bjarmason wrote:
On Wed, Nov 10 2021, Derrick Stolee via GitGitGadget wrote:
quoted
From: Derrick Stolee <redacted>
In eba1ba9 (maintenance: `git maintenance run` learned
`--scheduler=<scheduler>`, 2021-09-04), we introduced the ability to
specify a scheduler explicitly. This led to some extra checks around
whether an alternative scheduler was available. This added the
functionality of removing background maintenance from schedulers other
than the one selected.
Note this last sentence.
I haven't tested, but isn't a smaller fix for this to just re-arrange
the array where we declare the methods to check to have "cron" come
after all the OS-specific ones, or at least after launchctl?
I.e. we already have an ifdef to pick launchctl and never cron for OSX
on "start", so this is only for the case where we loop through the array
looking for something to select.
That wouldn't work if that user can run cron, but can't use launchctl at
all, but in that case won't they be happy to get the prompt?
Your suggestion doesn't work because this isn't about picking cron
over launchctl, it's about disabling cron (and systemd or whatever is
available) when launchctl was selected.
Thanks,
-Stolee