Hi Max
On 25/03/2024 08:36, Max Gautier wrote:
On Sun, Mar 24, 2024 at 03:45:45PM +0000, Phillip Wood wrote:
Hi Max
On 23/03/2024 11:07, Max Gautier wrote:
On Fri, Mar 22, 2024 at 11:11:09PM +0100, Max Gautier wrote:
+/*
+ * TODO: in the future (~2026 ?) remove this cleanup code
+ */
That is rather optimistic - users only run "git maintenance start" once so
any unit files that have been written in the past will exist well beyond
2026.
In that case, should we hook the cleanup (in it's final form) in more
place ? `git maintenance register` for instance ?
I'm not sure if that is needed if we leave the code to delete the unit
files in place.
Best Wishes
Phillip
+static void systemd_delete_user_unit(char const *unit)
+{
+ char const file_start_stale[] = "# This file was created and is"
+ " maintained by Git.";
+ char file_start_user[sizeof(file_start_stale)] = {'\0'};
+
+ char *filename = xdg_config_home_for("systemd/user", unit);
+ int handle = open(filename, O_RDONLY);
+
+ /*
+ * Check this is actually our file and we're not removing a legitimate
+ * user override.
+ */
+ if (handle == -1 && !is_missing_file_error(errno))
+ warning(_("failed to delete '%s'"), filename);
+ else {
+ read(handle, file_start_user, sizeof(file_start_stale) - 1);
Actually that fails -Werror because I don't check read return.
Alternative below (on top of this one), with one question:
Are VLA using size_t const OK ? It's folded to a constant array by gcc
but I don't know if that causes portability problem with other platforms
? I can always repeat the sizeof expr if it's a problematic construct.
I think it would be easier to use strbuf_read_file() instead - it is only a
small file so there is not really any advantage in just reading the first
line. Something like
static int systemd_delete_user_unit(const char* unit)
{
int ret = 0;
struct strbuf buf = STRBUF_INIT;
char *filename = xdg_config_home_for("systemd/user", unit);
if (strbuf_read_file(&buf, filename, 0) < 0) {
if (errno != ENOENT)
ret = error_errno(_("could not read '%s'", filename));
goto out;
}
if (starts_with(buf.buf,
"# This file was created and is maintained by git.\n") &&
unlink(filename))
ret = error_errno(_("could not remove '%s', filename));
out:
free(filename);
strbuf_release(&buf);
return ret;
}
Thanks, this is exactly what I needed, I looked at the strbuf API but
couldn't find this somehow.