aboutsummaryrefslogtreecommitdiffstats
path: root/src/repo
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-09-24 06:59:18 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-09-24 06:59:18 +0000
commit04186b51dfcada174b5372aab0c7e423a4ed3244 (patch)
treed99d0b35c8c9c1af6b4e7826cd1d87e509895b9d /src/repo
parenta4756f00b3823952580d1fee704675c6f813a248 (diff)
downloads6-rc-04186b51dfcada174b5372aab0c7e423a4ed3244.tar.gz
More progress: updated sync, nominal fix
Diffstat (limited to 'src/repo')
-rw-r--r--src/repo/deps-exe/s6-rc-repo-sync3
-rw-r--r--src/repo/s6-rc-repo-init.c42
-rw-r--r--src/repo/s6-rc-repo-sync.c49
3 files changed, 85 insertions, 9 deletions
diff --git a/src/repo/deps-exe/s6-rc-repo-sync b/src/repo/deps-exe/s6-rc-repo-sync
new file mode 100644
index 0000000..6dd7af7
--- /dev/null
+++ b/src/repo/deps-exe/s6-rc-repo-sync
@@ -0,0 +1,3 @@
+${LIBS6RC}
+-lskarnet
+${SYSCLOCK_LIB}
diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c
index 971a00e..8c65203 100644
--- a/src/repo/s6-rc-repo-init.c
+++ b/src/repo/s6-rc-repo-init.c
@@ -9,6 +9,7 @@
#include <stdio.h> /* rename */
#include <errno.h>
+#include <skalibs/uint32.h>
#include <skalibs/stat.h>
#include <skalibs/posixplz.h>
#include <skalibs/gol.h>
@@ -21,7 +22,7 @@
#include <s6-rc/config.h>
#include <s6-rc/s6rc.h>
-#define USAGE "s6-rc-repo-init [ -v verbosity ] [ -r repo ] [ -h fdhuser ] sources..."
+#define USAGE "s6-rc-repo-init [ -v verbosity ] [ -r repo ] [ -h fdhuser ] [ -B ] [ -f ] stores..."
#define dieusage() strerr_dieusage(100, USAGE)
static void cleanup (char const *fn)
@@ -33,12 +34,14 @@ static void cleanup (char const *fn)
enum golb_e
{
- GOLB_FORCE = 0x01
+ GOLB_FORCE = 0x01,
+ GOLB_BARE = 0x02
} ;
static gol_bool const rgolb[] =
{
- { .so = 'f', .lo = "force", .clear = 0, .set = GOLB_FORCE }
+ { .so = 'f', .lo = "force", .clear = 0, .set = GOLB_FORCE },
+ { .so = 'S', .lo = "bare", .clear = 0, .set = GOLB_BARE }
} ;
enum gola_e
@@ -70,18 +73,22 @@ int main (int argc, char const *const *argv)
golc = GOL_main(argc, argv, rgolb, rgola, &wgolb, wgola) ;
argc -= golc ; argv += golc ;
+ if (!argc) dieusage() ;
if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &verbosity))
strerr_dief1x(100, "verbosity needs to be an unsigned integer") ;
for (unsigned int i = 0 ; i < argc ; i++)
+ {
if (argv[i][0] != '/')
strerr_dief2x(100, argv[i], " is not an absolute path") ;
- if (!argc) strerr_warnw1x("no source directories given, creating an empty repository") ;
+ if (strchr(argv[i], '\n'))
+ strerr_dief1x(100, "stores cannot contain newlines in their path") ;
+ }
tain_now_g() ;
repolen = strlen(wgola[GOLA_REPODIR]) ;
char repotmp[repolen + 12] ;
- char tmp[repolen + 21] ;
+ char tmp[repolen + 29] ;
memcpy(repotmp, wgola[GOLA_REPODIR], repolen) ;
- memcpy(repotmp + repolen, "-tmp.XXXXXX", 12) ;
+ memcpy(repotmp + repolen, ":new:XXXXXX", 12) ;
m = umask(0) ;
if (!mkdtemp(repotmp))
{
@@ -114,7 +121,24 @@ int main (int argc, char const *const *argv)
strerr_diefu2sys(111, "mkdir ", tmp) ;
}
+ memcpy(tmp + repolen + 12, "stores", 7) ;
+ if (mkdir(tmp, 02755) == -1)
+ {
+ cleanup(repotmp) ;
+ strerr_diefu2sys(111, "mkdir ", tmp) ;
+ }
umask(m) ;
+ tmp[repolen + 19] = '/' ;
+ for (unsigned int i = 0 ; i < argc ; i++)
+ {
+ uint320_xfmt(tmp + repolen + 20, i, 8) ;
+ tmp[repolen + 28] = 0 ;
+ if (symlink(argv[i], tmp) == -1)
+ {
+ cleanup(repotmp) ;
+ strerr_diefu4sys(111, "make a symlink from ", tmp, " to ", argv[i]) ;
+ }
+ }
memcpy(tmp + repolen + 12, "lock", 5) ;
if (!openwritenclose_unsafe5(tmp, "", 0, 0, 0))
@@ -123,10 +147,10 @@ int main (int argc, char const *const *argv)
strerr_diefu2sys(111, "create ", tmp) ;
}
- if (!s6rc_repo_sync(repotmp, argv, argc, verbosity, wgola[GOLA_FDHUSER]))
+ if (!(wgolb & GOLB_BARE) && !s6rc_repo_sync(repotmp, verbosity, wgola[GOLA_FDHUSER]))
{
cleanup(repotmp) ;
- return 111 ;
+ _exit(111) ;
}
if (chmod(repotmp, 02755) == -1)
@@ -161,5 +185,5 @@ int main (int argc, char const *const *argv)
}
}
- return 0 ;
+ _exit(0) ;
}
diff --git a/src/repo/s6-rc-repo-sync.c b/src/repo/s6-rc-repo-sync.c
new file mode 100644
index 0000000..f3768f7
--- /dev/null
+++ b/src/repo/s6-rc-repo-sync.c
@@ -0,0 +1,49 @@
+/* ISC license. */
+
+#include <unistd.h>
+
+#include <skalibs/gol.h>
+#include <skalibs/tai.h>
+#include <skalibs/prog.h>
+#include <skalibs/strerr.h>
+
+#include <s6-rc/config.h>
+#include <s6-rc/s6rc.h>
+
+#define USAGE "s6-rc-repo-sync [ -v verbosity ] [ -r repo ] [ -h fdhuser ]"
+#define dieusage() strerr_dieusage(100, USAGE)
+
+enum gola_e
+{
+ GOLA_VERBOSITY,
+ GOLA_REPODIR,
+ GOLA_FDHUSER,
+ GOLA_N
+} ;
+
+static gol_arg const rgola[] =
+{
+ { .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY },
+ { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR },
+ { .so = 'h', .lo = "fd-holder-user", .i = GOLA_FDHUSER }
+} ;
+
+int main (int argc, char const *const *argv)
+{
+ char const *wgola[GOLA_N] = { 0 } ;
+ unsigned int verbosity = 1 ;
+ unsigned int golc ;
+
+ PROG = "s6-rc-repo-sync" ;
+ wgola[GOLA_REPODIR] = S6RC_REPO_BASE ;
+
+ golc = gol_main(argc, argv, 0, 0, rgola, 3, 0, wgola) ;
+ argc -= golc ; argv += golc ;
+ if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &verbosity))
+ strerr_dief1x(100, "verbosity needs to be an unsigned integer") ;
+ tain_now_g() ;
+
+ if (!s6rc_repo_sync(wgola[GOLA_REPODIR], verbosity, wgola[GOLA_FDHUSER])) _exit(111) ;
+
+ _exit(0) ;
+}