aboutsummaryrefslogtreecommitdiffstats
path: root/src/repo
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-07-02 02:22:44 +0000
committerLaurent Bercot <ska@appnovation.com>2025-07-02 02:22:44 +0000
commit92051568ad7af0013dfd92b046b4f047ccbc2f04 (patch)
tree9181c015e1c654eedb35a4326598560cf014a303 /src/repo
parent6fdfa8c61f85639fa386017f2d3974d606c06864 (diff)
downloads6-rc-92051568ad7af0013dfd92b046b4f047ccbc2f04.tar.gz
Finish s6-rc-repo-init
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/repo')
-rw-r--r--src/repo/deps-exe/s6-rc-repo-init1
-rw-r--r--src/repo/deps-exe/s6-rc-repo-populate1
-rw-r--r--src/repo/s6-rc-repo-init.c80
-rw-r--r--src/repo/s6-rc-repo-populate.c72
4 files changed, 72 insertions, 82 deletions
diff --git a/src/repo/deps-exe/s6-rc-repo-init b/src/repo/deps-exe/s6-rc-repo-init
index e7187fe..152b051 100644
--- a/src/repo/deps-exe/s6-rc-repo-init
+++ b/src/repo/deps-exe/s6-rc-repo-init
@@ -1 +1,2 @@
+${LIBS6RC}
-lskarnet
diff --git a/src/repo/deps-exe/s6-rc-repo-populate b/src/repo/deps-exe/s6-rc-repo-populate
deleted file mode 100644
index e7187fe..0000000
--- a/src/repo/deps-exe/s6-rc-repo-populate
+++ /dev/null
@@ -1 +0,0 @@
--lskarnet
diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c
index 296216a..660b046 100644
--- a/src/repo/s6-rc-repo-init.c
+++ b/src/repo/s6-rc-repo-init.c
@@ -15,11 +15,12 @@
#include <skalibs/prog.h>
#include <skalibs/strerr.h>
#include <skalibs/djbunix.h>
+#include <skalibs/random.h>
#include <s6-rc/config.h>
#include <s6-rc/s6rc.h>
-#define USAGE "s6-rc-repo-init [ -r repo ]"
+#define USAGE "s6-rc-repo-init [ -r repo ] sources..."
#define dieusage() strerr_dieusage(100, USAGE)
static void cleanup (char const *fn)
@@ -29,6 +30,17 @@ static void cleanup (char const *fn)
errno = e ;
}
+enum golb_e
+{
+ GOLB_FORCE,
+ GOLB_N
+} ;
+
+static gol_bool const rgolb[1] =
+{
+ { .so = 'f', .lo = "force", .clear = 0, .set = 1 << GOLB_FORCE }
+} ;
+
static gol_arg const rgola[1] =
{
{ .so = 'r', .lo = "repodir", .i = 0 }
@@ -38,20 +50,26 @@ int main (int argc, char const *const *argv)
{
size_t repolen ;
char const *repo = S6RC_REPO_BASE ;
+ uint64_t wgolb = 0 ;
unsigned int golc ;
+ mode_t m ;
PROG = "s6-rc-repo-init" ;
- golc = gol_main(argc, argv, 0, 0, rgola, 1, 0, &repo) ;
+ golc = gol_main(argc, argv, rgolb, 1, rgola, 1, &wgolb, &repo) ;
argc -= golc ; argv += golc ;
+ if (!argc) dieusage() ;
if (repo[0] != '/')
strerr_dief2x(100, repo, " is not an absolute path") ;
+ for (unsigned int i = 0 ; i < argc ; i++)
+ if (argv[i][0] != '/')
+ strerr_dief2x(100, argv[i], " is not an absolute path") ;
repolen = strlen(repo) ;
char repotmp[repolen + 12] ;
char tmp[repolen + 39] ;
memcpy(repotmp, repo, repolen) ;
memcpy(repotmp + repolen, "-tmp.XXXXXX", 12) ;
- umask(0) ;
+ m = umask(0) ;
if (!mkdtemp(repotmp))
{
size_t i = repolen ;
@@ -62,7 +80,7 @@ int main (int argc, char const *const *argv)
if (mkdirp2(repotmp, 02755) == -1)
strerr_diefu2sys(111, "mkdir ", repotmp) ;
repotmp[i] = '/' ;
- memcpy(repotmp + repolen, "-tmp.XXXXXX", 12) ;
+ memcpy(repotmp + repolen, ":new:XXXXXX", 12) ;
if (!mkdtemp(repotmp))
strerr_diefu2sys(111, "mkdtemp ", repotmp) ;
}
@@ -71,26 +89,70 @@ int main (int argc, char const *const *argv)
memcpy(tmp + repolen + 12, "compiled", 9) ;
if (mkdir(tmp, 02755) == -1)
+ {
+ cleanup(repotmp) ;
strerr_diefu2sys(111, "mkdir ", tmp) ;
+ }
memcpy(tmp + repolen + 12, "source", 7) ;
if (mkdir(tmp, 02755) == -1)
+ {
+ cleanup(repotmp) ;
strerr_diefu2sys(111, "mkdir ", tmp) ;
+ }
- memcpy(tmp + repolen + 18, "/.everything-initial", 21) ;
+ memcpy(tmp + repolen + 18, "/.everything:initial", 21) ;
if (mkdir(tmp, 02755) == -1)
+ {
+ cleanup(repotmp) ;
strerr_diefu2sys(111, "mkdir ", tmp) ;
+ }
tmp[repolen + 30] = 0 ;
- if (symlink(".everything-initial", tmp) == -1)
- strerr_diefu4sys(111, "symlink ", ".everything-initial", " to ", tmp) ;
+ if (symlink(".everything:initial", tmp) == -1)
+ {
+ cleanup(repotmp) ;
+ strerr_diefu4sys(111, "symlink ", ".everything:initial", " to ", tmp) ;
+ }
+
+ umask(m) ;
+
+ if (!s6rc_repo_sync(repotmp, argv, argc))
+ {
+ cleanup(repotmp) ;
+ strerr_diefu2sys(111, "sync ", repotmp) ;
+ }
if (chmod(repotmp, 02755) == -1)
strerr_diefu2sys(111, "chmod ", repotmp) ;
if (rename(repotmp, repo) == -1)
{
- cleanup(repotmp) ;
- strerr_diefu4sys(111, "rename ", repotmp, " to ", repo) ;
+ if (errno != EEXIST || !(wgolb & 1 << GOLB_FORCE))
+ {
+ cleanup(repotmp) ;
+ strerr_diefu4sys(111, "rename ", repotmp, " to ", repo) ;
+ }
+ else
+ {
+ char oldrepo[repolen + 22] ;
+ memcpy(oldrepo, repo, repolen) ;
+ memcpy(oldrepo + repolen, ":old:", 5) ;
+ random_name(oldrepo + repolen + 5, 16) ;
+ if (rename(repo, oldrepo) == -1)
+ {
+ cleanup(repotmp) ;
+ strerr_diefu4sys(111, "rename ", repo, " to ", oldrepo) ;
+ }
+ if (rename(repotmp, repo) == -1)
+ {
+ int e = errno ;
+ if (rename(oldrepo, repo) == -1)
+ strerr_diefu7sys(111, "rename directories to ", repo, ": weird race happened. Old repository is at ", repotmp, " and new repository is at ", oldrepo, " - reported error was") ;
+ errno = e ;
+ cleanup(repotmp) ;
+ strerr_diefu4sys(111, "rename ", repotmp, " to ", repo) ;
+ }
+ }
}
return 0 ;
diff --git a/src/repo/s6-rc-repo-populate.c b/src/repo/s6-rc-repo-populate.c
deleted file mode 100644
index 7733a56..0000000
--- a/src/repo/s6-rc-repo-populate.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ISC license. */
-
-#include <skalibs/bsdsnowflake.h> /* stat */
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h> /* rename */
-#include <errno.h>
-
-#include <skalibs/stat.h>
-#include <skalibs/uint64.h>
-#include <skalibs/posixplz.h>
-#include <skalibs/gol.h>
-#include <skalibs/prog.h>
-#include <skalibs/strerr.h>
-#include <skalibs/djbunix.h>
-
-#include <s6-rc/config.h>
-#include <s6-rc/s6rc.h>
-
-#define USAGE "s6-rc-repo-populate [ -r repo ] sourcedirs..."
-#define dieusage() strerr_dieusage(100, USAGE)
-
-static void cleanup (char const *fn)
-{
- int e = errno ;
- rm_rf(fn) ;
- errno = e ;
-}
-
-enum golb_e
-{
- GOLB_FORCE,
- GOLB_N
-} ;
-
-static gol_bool const rgolb[1] =
-{
- { .so = 'f', .lo = "force", .clear = 0, .set = 1 << GOLB_FORCE }
-} ;
-
-static gol_arg const rgola[1] =
-{
- { .so = 'r', .lo = "repodir", .i = 0 }
-} ;
-
-int main (int argc, char const *const *argv)
-{
- size_t repolen ;
- char const *repo = S6RC_REPO_BASE ;
- uint64_t wgolb = 0 ;
- unsigned int golc ;
-
- PROG = "s6-rc-repo-populate" ;
- golc = gol_main(argc, argv, rgolb, 1, rgola, 1, &wgolb, &repo) ;
- argc -= golc ; argv += golc ;
- if (!argc) dieusage() ;
- if (repo[0] != '/')
- strerr_dief2x(100, repo, " is not an absolute path") ;
-
- repolen = strlen(repo) ;
- char sub[repolen + 30] ;
- memcpy(sub, repo, repolen) ;
- if (!(wgolb & 1 << GOLB_FORCE))
- {
- struct stat st ;
-
- }
- memcpy(sub + repolen, "/.everything-tmp.XXXXXX", 12) ;
-
- return 0 ;
-}