aboutsummaryrefslogtreecommitdiffstats
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
parenta4756f00b3823952580d1fee704675c6f813a248 (diff)
downloads6-rc-04186b51dfcada174b5372aab0c7e423a4ed3244.tar.gz
More progress: updated sync, nominal fix
-rw-r--r--.gitignore1
-rw-r--r--package/deps.mak18
-rw-r--r--package/modes1
-rw-r--r--package/targets.mak1
-rw-r--r--src/include/s6-rc/repo.h5
-rw-r--r--src/include/s6-rc/s6rc-utils.h1
-rw-r--r--src/libs6rc/deps-lib/s6rc4
-rw-r--r--src/libs6rc/s6rc_ls.c46
-rw-r--r--src/libs6rc/s6rc_repo_fix.c51
-rw-r--r--src/libs6rc/s6rc_repo_fixset.c1
-rw-r--r--src/libs6rc/s6rc_repo_list_sets.c15
-rw-r--r--src/libs6rc/s6rc_repo_listsub.c45
-rw-r--r--src/libs6rc/s6rc_repo_makesetbundles.c8
-rw-r--r--src/libs6rc/s6rc_repo_sync.c121
-rw-r--r--src/libs6rc/s6rc_repo_syncset.c16
-rw-r--r--src/libs6rc/s6rc_repo_syncset_tmp.c104
-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
19 files changed, 374 insertions, 158 deletions
diff --git a/.gitignore b/.gitignore
index 669c28a..6531dc2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
/s6-rc-oneshot-run
/s6-rc-format-upgrade
/s6-rc-repo-init
+/s6-rc-repo-sync
/s6-rc-repo-populate
/s6-rc-set-new
/s6-rc-set-copy
diff --git a/package/deps.mak b/package/deps.mak
index b8fe912..2f362ea 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -18,19 +18,22 @@ src/libs6rc/s6rc_livedir_create.o src/libs6rc/s6rc_livedir_create.lo: src/libs6r
src/libs6rc/s6rc_livedir_prefix.o src/libs6rc/s6rc_livedir_prefix.lo: src/libs6rc/s6rc_livedir_prefix.c src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_livedir_prefixsize.o src/libs6rc/s6rc_livedir_prefixsize.lo: src/libs6rc/s6rc_livedir_prefixsize.c src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_lock.o src/libs6rc/s6rc_lock.lo: src/libs6rc/s6rc_lock.c src/include/s6-rc/s6rc-utils.h
+src/libs6rc/s6rc_ls.o src/libs6rc/s6rc_ls.lo: src/libs6rc/s6rc_ls.c src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_nlto0.o src/libs6rc/s6rc_nlto0.lo: src/libs6rc/s6rc_nlto0.c src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_read_uint.o src/libs6rc/s6rc_read_uint.lo: src/libs6rc/s6rc_read_uint.c src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_repo_badsub.o src/libs6rc/s6rc_repo_badsub.lo: src/libs6rc/s6rc_repo_badsub.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_cleanup.o src/libs6rc/s6rc_repo_cleanup.lo: src/libs6rc/s6rc_repo_cleanup.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_compile.o src/libs6rc/s6rc_repo_compile.lo: src/libs6rc/s6rc_repo_compile.c src/include/s6-rc/config.h src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_fillset.o src/libs6rc/s6rc_repo_fillset.lo: src/libs6rc/s6rc_repo_fillset.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
+src/libs6rc/s6rc_repo_fix.o src/libs6rc/s6rc_repo_fix.lo: src/libs6rc/s6rc_repo_fix.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_fixset.o src/libs6rc/s6rc_repo_fixset.lo: src/libs6rc/s6rc_repo_fixset.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_flattenservices.o src/libs6rc/s6rc_repo_flattenservices.lo: src/libs6rc/s6rc_repo_flattenservices.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
+src/libs6rc/s6rc_repo_list_sets.o src/libs6rc/s6rc_repo_list_sets.lo: src/libs6rc/s6rc_repo_list_sets.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_repo_listalldeps.o src/libs6rc/s6rc_repo_listalldeps.lo: src/libs6rc/s6rc_repo_listalldeps.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_listcontents.o src/libs6rc/s6rc_repo_listcontents.lo: src/libs6rc/s6rc_repo_listcontents.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_repo_listdeps.o src/libs6rc/s6rc_repo_listdeps.lo: src/libs6rc/s6rc_repo_listdeps.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_listdeps_internal.o src/libs6rc/s6rc_repo_listdeps_internal.lo: src/libs6rc/s6rc_repo_listdeps_internal.c src/include/s6-rc/config.h src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
-src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_listsub.lo: src/libs6rc/s6rc_repo_listsub.c src/include/s6-rc/repo.h
+src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_listsub.lo: src/libs6rc/s6rc_repo_listsub.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_lock.lo: src/libs6rc/s6rc_repo_lock.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_makedefbundle.o src/libs6rc/s6rc_repo_makedefbundle.lo: src/libs6rc/s6rc_repo_makedefbundle.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_makesetbundles.o src/libs6rc/s6rc_repo_makesetbundles.lo: src/libs6rc/s6rc_repo_makesetbundles.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
@@ -43,6 +46,8 @@ src/libs6rc/s6rc_repo_subnames.o src/libs6rc/s6rc_repo_subnames.lo: src/libs6rc/
src/libs6rc/s6rc_repo_sv_bcmpr.o src/libs6rc/s6rc_repo_sv_bcmpr.lo: src/libs6rc/s6rc_repo_sv_bcmpr.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_sv_cmpr.o src/libs6rc/s6rc_repo_sv_cmpr.lo: src/libs6rc/s6rc_repo_sv_cmpr.c src/include/s6-rc/repo.h
src/libs6rc/s6rc_repo_sync.o src/libs6rc/s6rc_repo_sync.lo: src/libs6rc/s6rc_repo_sync.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
+src/libs6rc/s6rc_repo_syncset.o src/libs6rc/s6rc_repo_syncset.lo: src/libs6rc/s6rc_repo_syncset.c src/include/s6-rc/repo.h
+src/libs6rc/s6rc_repo_syncset_tmp.o src/libs6rc/s6rc_repo_syncset_tmp.lo: src/libs6rc/s6rc_repo_syncset_tmp.c src/include/s6-rc/repo.h src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_sanitize_dir.o src/libs6rc/s6rc_sanitize_dir.lo: src/libs6rc/s6rc_sanitize_dir.c src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_servicedir_block.o src/libs6rc/s6rc_servicedir_block.lo: src/libs6rc/s6rc_servicedir_block.c src/include/s6-rc/s6rc-servicedir.h
src/libs6rc/s6rc_servicedir_copy_offline.o src/libs6rc/s6rc_servicedir_copy_offline.lo: src/libs6rc/s6rc_servicedir_copy_offline.c src/include/s6-rc/s6rc-servicedir.h src/libs6rc/s6rc-servicedir-internal.h
@@ -54,6 +59,7 @@ src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_servicedir_unsupervis
src/libs6rc/s6rc_strrefcmp.o src/libs6rc/s6rc_strrefcmp.lo: src/libs6rc/s6rc_strrefcmp.c src/include/s6-rc/s6rc-utils.h
src/libs6rc/s6rc_type_check.o src/libs6rc/s6rc_type_check.lo: src/libs6rc/s6rc_type_check.c src/include/s6-rc/s6rc-utils.h
src/repo/s6-rc-repo-init.o src/repo/s6-rc-repo-init.lo: src/repo/s6-rc-repo-init.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h
+src/repo/s6-rc-repo-sync.o src/repo/s6-rc-repo-sync.lo: src/repo/s6-rc-repo-sync.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h
src/repo/s6-rc-set-changestate.o src/repo/s6-rc-set-changestate.lo: src/repo/s6-rc-set-changestate.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h
src/repo/s6-rc-set-commit.o src/repo/s6-rc-set-commit.lo: src/repo/s6-rc-set-commit.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h
src/repo/s6-rc-set-copy.o src/repo/s6-rc-set-copy.lo: src/repo/s6-rc-set-copy.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h
@@ -71,17 +77,19 @@ src/s6-rc/s6-rc-update.o src/s6-rc/s6-rc-update.lo: src/s6-rc/s6-rc-update.c src
src/s6-rc/s6-rc.o src/s6-rc/s6-rc.lo: src/s6-rc/s6-rc.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h
ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),)
-libs6rc.a.xyzzy: src/libs6rc/s6rc_db_check_depcycles.o src/libs6rc/s6rc_db_check_pipelines.o src/libs6rc/s6rc_db_check_revdeps.o src/libs6rc/s6rc_db_read.o src/libs6rc/s6rc_db_read_sizes.o src/libs6rc/s6rc_db_read_uint32.o src/libs6rc/s6rc_graph_closure.o src/libs6rc/s6rc_live_state_size.o src/libs6rc/s6rc_live_state_read.o src/libs6rc/s6rc_livedir_canon.o src/libs6rc/s6rc_livedir_create.o src/libs6rc/s6rc_livedir_prefix.o src/libs6rc/s6rc_livedir_prefixsize.o src/libs6rc/s6rc_lock.o src/libs6rc/s6rc_nlto0.o src/libs6rc/s6rc_read_uint.o src/libs6rc/s6rc_repo_badsub.o src/libs6rc/s6rc_repo_cleanup.o src/libs6rc/s6rc_repo_compile.o src/libs6rc/s6rc_repo_fillset.o src/libs6rc/s6rc_repo_fixset.o src/libs6rc/s6rc_repo_flattenservices.o src/libs6rc/s6rc_repo_listalldeps.o src/libs6rc/s6rc_repo_listcontents.o src/libs6rc/s6rc_repo_listdeps.o src/libs6rc/s6rc_repo_listdeps_internal.o src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_makedefbundle.o src/libs6rc/s6rc_repo_makesetbundles.o src/libs6rc/s6rc_repo_makesvlist.o src/libs6rc/s6rc_repo_makesvlist_byname.o src/libs6rc/s6rc_repo_moveservices.o src/libs6rc/s6rc_repo_refcompile.o src/libs6rc/s6rc_repo_setcompile.o src/libs6rc/s6rc_repo_subnames.o src/libs6rc/s6rc_repo_sv_bcmpr.o src/libs6rc/s6rc_repo_sv_cmpr.o src/libs6rc/s6rc_repo_sync.o src/libs6rc/s6rc_sanitize_dir.o src/libs6rc/s6rc_servicedir_internal.o src/libs6rc/s6rc_servicedir_block.o src/libs6rc/s6rc_servicedir_unblock.o src/libs6rc/s6rc_servicedir_copy_offline.o src/libs6rc/s6rc_servicedir_copy_online.o src/libs6rc/s6rc_servicedir_manage.o src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_strrefcmp.o src/libs6rc/s6rc_type_check.o
+libs6rc.a.xyzzy: src/libs6rc/s6rc_db_check_depcycles.o src/libs6rc/s6rc_db_check_pipelines.o src/libs6rc/s6rc_db_check_revdeps.o src/libs6rc/s6rc_db_read.o src/libs6rc/s6rc_db_read_sizes.o src/libs6rc/s6rc_db_read_uint32.o src/libs6rc/s6rc_graph_closure.o src/libs6rc/s6rc_live_state_size.o src/libs6rc/s6rc_live_state_read.o src/libs6rc/s6rc_livedir_canon.o src/libs6rc/s6rc_livedir_create.o src/libs6rc/s6rc_livedir_prefix.o src/libs6rc/s6rc_livedir_prefixsize.o src/libs6rc/s6rc_lock.o src/libs6rc/s6rc_ls.o src/libs6rc/s6rc_nlto0.o src/libs6rc/s6rc_read_uint.o src/libs6rc/s6rc_repo_badsub.o src/libs6rc/s6rc_repo_cleanup.o src/libs6rc/s6rc_repo_compile.o src/libs6rc/s6rc_repo_fillset.o src/libs6rc/s6rc_repo_fixset.o src/libs6rc/s6rc_repo_flattenservices.o src/libs6rc/s6rc_repo_list_sets.o src/libs6rc/s6rc_repo_listalldeps.o src/libs6rc/s6rc_repo_listcontents.o src/libs6rc/s6rc_repo_listdeps.o src/libs6rc/s6rc_repo_listdeps_internal.o src/libs6rc/s6rc_repo_listsub.o src/libs6rc/s6rc_repo_lock.o src/libs6rc/s6rc_repo_makedefbundle.o src/libs6rc/s6rc_repo_makesetbundles.o src/libs6rc/s6rc_repo_makesvlist.o src/libs6rc/s6rc_repo_makesvlist_byname.o src/libs6rc/s6rc_repo_moveservices.o src/libs6rc/s6rc_repo_refcompile.o src/libs6rc/s6rc_repo_setcompile.o src/libs6rc/s6rc_repo_subnames.o src/libs6rc/s6rc_repo_sv_bcmpr.o src/libs6rc/s6rc_repo_sv_cmpr.o src/libs6rc/s6rc_repo_sync.o src/libs6rc/s6rc_repo_syncset.o src/libs6rc/s6rc_repo_syncset_tmp.o src/libs6rc/s6rc_sanitize_dir.o src/libs6rc/s6rc_servicedir_internal.o src/libs6rc/s6rc_servicedir_block.o src/libs6rc/s6rc_servicedir_unblock.o src/libs6rc/s6rc_servicedir_copy_offline.o src/libs6rc/s6rc_servicedir_copy_online.o src/libs6rc/s6rc_servicedir_manage.o src/libs6rc/s6rc_servicedir_unsupervise.o src/libs6rc/s6rc_strrefcmp.o src/libs6rc/s6rc_type_check.o
else
-libs6rc.a.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_fixset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_makesvlist_byname.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
+libs6rc.a.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_ls.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_fixset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_list_sets.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_makesvlist_byname.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_repo_syncset.lo src/libs6rc/s6rc_repo_syncset_tmp.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
endif
libs6rc.pc: EXTRA_LIBS := -ls6 -lskarnet ${SPAWN_LIB}
libs6rc.so.xyzzy: EXTRA_LIBS := -ls6 -lskarnet ${SPAWN_LIB}
-libs6rc.so.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_fixset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_makesvlist_byname.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
+libs6rc.so.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_ls.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_fixset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_list_sets.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_makesvlist_byname.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_repo_syncset.lo src/libs6rc/s6rc_repo_syncset_tmp.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
libs6rc.dylib.xyzzy: EXTRA_LIBS := -ls6 -lskarnet ${SPAWN_LIB}
-libs6rc.dylib.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_fixset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_makesvlist_byname.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
+libs6rc.dylib.xyzzy:src/libs6rc/s6rc_db_check_depcycles.lo src/libs6rc/s6rc_db_check_pipelines.lo src/libs6rc/s6rc_db_check_revdeps.lo src/libs6rc/s6rc_db_read.lo src/libs6rc/s6rc_db_read_sizes.lo src/libs6rc/s6rc_db_read_uint32.lo src/libs6rc/s6rc_graph_closure.lo src/libs6rc/s6rc_live_state_size.lo src/libs6rc/s6rc_live_state_read.lo src/libs6rc/s6rc_livedir_canon.lo src/libs6rc/s6rc_livedir_create.lo src/libs6rc/s6rc_livedir_prefix.lo src/libs6rc/s6rc_livedir_prefixsize.lo src/libs6rc/s6rc_lock.lo src/libs6rc/s6rc_ls.lo src/libs6rc/s6rc_nlto0.lo src/libs6rc/s6rc_read_uint.lo src/libs6rc/s6rc_repo_badsub.lo src/libs6rc/s6rc_repo_cleanup.lo src/libs6rc/s6rc_repo_compile.lo src/libs6rc/s6rc_repo_fillset.lo src/libs6rc/s6rc_repo_fixset.lo src/libs6rc/s6rc_repo_flattenservices.lo src/libs6rc/s6rc_repo_list_sets.lo src/libs6rc/s6rc_repo_listalldeps.lo src/libs6rc/s6rc_repo_listcontents.lo src/libs6rc/s6rc_repo_listdeps.lo src/libs6rc/s6rc_repo_listdeps_internal.lo src/libs6rc/s6rc_repo_listsub.lo src/libs6rc/s6rc_repo_lock.lo src/libs6rc/s6rc_repo_makedefbundle.lo src/libs6rc/s6rc_repo_makesetbundles.lo src/libs6rc/s6rc_repo_makesvlist.lo src/libs6rc/s6rc_repo_makesvlist_byname.lo src/libs6rc/s6rc_repo_moveservices.lo src/libs6rc/s6rc_repo_refcompile.lo src/libs6rc/s6rc_repo_setcompile.lo src/libs6rc/s6rc_repo_subnames.lo src/libs6rc/s6rc_repo_sv_bcmpr.lo src/libs6rc/s6rc_repo_sv_cmpr.lo src/libs6rc/s6rc_repo_sync.lo src/libs6rc/s6rc_repo_syncset.lo src/libs6rc/s6rc_repo_syncset_tmp.lo src/libs6rc/s6rc_sanitize_dir.lo src/libs6rc/s6rc_servicedir_internal.lo src/libs6rc/s6rc_servicedir_block.lo src/libs6rc/s6rc_servicedir_unblock.lo src/libs6rc/s6rc_servicedir_copy_offline.lo src/libs6rc/s6rc_servicedir_copy_online.lo src/libs6rc/s6rc_servicedir_manage.lo src/libs6rc/s6rc_servicedir_unsupervise.lo src/libs6rc/s6rc_strrefcmp.lo src/libs6rc/s6rc_type_check.lo
s6-rc-repo-init: EXTRA_LIBS := ${SYSCLOCK_LIB}
s6-rc-repo-init: src/repo/s6-rc-repo-init.o ${LIBS6RC} -lskarnet
+s6-rc-repo-sync: EXTRA_LIBS := ${SYSCLOCK_LIB}
+s6-rc-repo-sync: src/repo/s6-rc-repo-sync.o ${LIBS6RC} -lskarnet
s6-rc-set-changestate: EXTRA_LIBS := ${SYSCLOCK_LIB}
s6-rc-set-changestate: src/repo/s6-rc-set-changestate.o ${LIBS6RC} -lskarnet
s6-rc-set-commit: EXTRA_LIBS := ${SYSCLOCK_LIB}
diff --git a/package/modes b/package/modes
index 8f37adb..f565295 100644
--- a/package/modes
+++ b/package/modes
@@ -9,6 +9,7 @@ s6-rc-fdholder-filler 0755
s6-rc-oneshot-run 0755
s6-rc-format-upgrade 0755
s6-rc-repo-init 0755
+s6-rc-repo-sync 0755
s6-rc-set-new 0755
s6-rc-set-copy 0755
s6-rc-set-delete 0755
diff --git a/package/targets.mak b/package/targets.mak
index da74098..feffc92 100644
--- a/package/targets.mak
+++ b/package/targets.mak
@@ -8,6 +8,7 @@ s6-rc \
s6-rc-update \
s6-rc-format-upgrade \
s6-rc-repo-init \
+s6-rc-repo-sync \
s6-rc-set-new \
s6-rc-set-copy \
s6-rc-set-delete \
diff --git a/src/include/s6-rc/repo.h b/src/include/s6-rc/repo.h
index a50309d..61a479f 100644
--- a/src/include/s6-rc/repo.h
+++ b/src/include/s6-rc/repo.h
@@ -24,7 +24,9 @@ extern char const s6rc_repo_subnames[4][7] ;
extern int s6rc_repo_fillset (char const *, char const *, char const *const *, uint32_t) ;
extern int s6rc_repo_cleanup (char const *) ;
-extern int s6rc_repo_sync (char const *, char const *const *, size_t, unsigned int, char const *) ;
+extern int s6rc_repo_sync (char const *, unsigned int, char const *) ;
+extern int s6rc_repo_syncset (char const *, char const *, unsigned int) ;
+extern int s6rc_repo_syncset_tmp (char const *, char const *, stralloc *, genalloc *ga, unsigned int) ;
extern int s6rc_repo_lock (char const *, int) ;
extern int s6rc_repo_makesetbundles (char const *, char const *, unsigned int) ;
@@ -35,6 +37,7 @@ extern int s6rc_repo_compile (char const *, char const *, char const *const *, u
extern int s6rc_repo_refcompile (char const *, char *, unsigned int, char const *) ;
extern int s6rc_repo_setcompile (char const *, char const *, char const *, char *, unsigned int, char const *) ;
+extern int s6rc_repo_list_sets (char const *, stralloc *, genalloc *) ;
extern int s6rc_repo_listsub (char const *, char const *, char const *, stralloc *, genalloc *) ;
extern int s6rc_repo_listcontents (char const *, char const *, stralloc *, genalloc *) ;
extern int s6rc_repo_listdeps (char const *, char const *, stralloc *, genalloc *, int) ;
diff --git a/src/include/s6-rc/s6rc-utils.h b/src/include/s6-rc/s6rc-utils.h
index 636a696..e1533dc 100644
--- a/src/include/s6-rc/s6rc-utils.h
+++ b/src/include/s6-rc/s6rc-utils.h
@@ -27,6 +27,7 @@ extern int s6rc_livedir_canon (char const **) ;
extern int s6rc_live_state_size (char const *, uint32_t *, uint32_t *) ;
extern int s6rc_live_state_read (char const *, unsigned char *, uint32_t) ;
+extern int s6rc_ls (char const *, stralloc *, genalloc *) ;
extern int s6rc_type_check (int, char const *) ;
extern int s6rc_nlto0 (char *, size_t, size_t, genalloc *) ;
diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc
index a4bb8bd..87feaee 100644
--- a/src/libs6rc/deps-lib/s6rc
+++ b/src/libs6rc/deps-lib/s6rc
@@ -12,6 +12,7 @@ s6rc_livedir_create.o
s6rc_livedir_prefix.o
s6rc_livedir_prefixsize.o
s6rc_lock.o
+s6rc_ls.o
s6rc_nlto0.o
s6rc_read_uint.o
s6rc_repo_badsub.o
@@ -20,6 +21,7 @@ s6rc_repo_compile.o
s6rc_repo_fillset.o
s6rc_repo_fixset.o
s6rc_repo_flattenservices.o
+s6rc_repo_list_sets.o
s6rc_repo_listalldeps.o
s6rc_repo_listcontents.o
s6rc_repo_listdeps.o
@@ -37,6 +39,8 @@ s6rc_repo_subnames.o
s6rc_repo_sv_bcmpr.o
s6rc_repo_sv_cmpr.o
s6rc_repo_sync.o
+s6rc_repo_syncset.o
+s6rc_repo_syncset_tmp.o
s6rc_sanitize_dir.o
s6rc_servicedir_internal.o
s6rc_servicedir_block.o
diff --git a/src/libs6rc/s6rc_ls.c b/src/libs6rc/s6rc_ls.c
new file mode 100644
index 0000000..75f90f2
--- /dev/null
+++ b/src/libs6rc/s6rc_ls.c
@@ -0,0 +1,46 @@
+/* ISC license. */
+
+#include <string.h>
+#include <errno.h>
+
+#include <skalibs/direntry.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/genalloc.h>
+
+#include <s6-rc/s6rc-utils.h>
+
+int s6rc_ls (char const *fn, stralloc *sa, genalloc *ga)
+{
+ size_t sabase = sa->len ;
+ size_t gabase = genalloc_len(size_t, ga) ;
+ int sawasnull = !sa->s ;
+ int gawasnull = !genalloc_s(size_t, ga) ;
+ int n = 0 ;
+
+ DIR *dir = opendir(fn) ;
+ if (!dir) return -1 ;
+ for (;;)
+ {
+ direntry *d ;
+ size_t len ;
+ errno = 0 ;
+ d = readdir(dir) ;
+ if (!d) break ;
+ if (d->d_name[0] == '.') continue ;
+ len = strlen(d->d_name) ;
+ if (!genalloc_catb(size_t, ga, &sa->len, 1)) goto err ;
+ if (!stralloc_catb(sa, d->d_name, len+1)) goto err ;
+ n++ ;
+ }
+ if (errno) goto err ;
+ dir_close(dir) ;
+ return n ;
+
+ err:
+ dir_close(dir) ;
+ if (gawasnull) genalloc_free(size_t, ga) ;
+ else genalloc_setlen(size_t, ga, gabase) ;
+ if (sawasnull) stralloc_free(sa) ;
+ else sa->len = sabase ;
+ return -1 ;
+}
diff --git a/src/libs6rc/s6rc_repo_fix.c b/src/libs6rc/s6rc_repo_fix.c
new file mode 100644
index 0000000..b379d30
--- /dev/null
+++ b/src/libs6rc/s6rc_repo_fix.c
@@ -0,0 +1,51 @@
+/* ISC license. */
+
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <skalibs/posixplz.h>
+#include <skalibs/direntry.h>
+#include <skalibs/strerr.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/genalloc.h>
+
+#include <s6-rc/repo.h>
+
+int s6rc_repo_fix (char const *repo, uint32_t options, unsigned int verbosity)
+{
+ stralloc sa = STRALLOC_ZERO ;
+ genalloc svlist = GENALLOC_ZERO ; /* s6rc_repo_sv */
+ genalloc badga = GENALLOC_ZERO ; /* uint32_t */
+ genalloc setind = GENALLOC_ZERO ; /* size_t */
+ int n ;
+
+ if (verbosity >= 3)
+ strerr_warni2x("checking set consistency in repository ", repo) ;
+
+ n = s6rc_repo_list_sets(repo, &sa, &setind) ;
+ if (n < 0)
+ {
+ strerr_warnfu1sys("list sets") ;
+ return 0 ;
+ }
+ for (uint32_t i = 0 ; i < nsets ; i++)
+ {
+ if (verbosity >= 3)
+ strerr_warni2x("checking set ", sa.s + genalloc_s(size_t, &setind)[i]) ;
+ if (!s6rc_repo_fixset(repo, sa.s + genalloc_s(size_t, &setind)[i], options, verbosity, &sa, &svlist, &badga)) goto err ;
+ }
+
+ genalloc_free(s6rc_repo_sv, &svlist) ;
+ genalloc_free(uint32_t, &badga) ;
+ genalloc_free(size_t, &setind) ;
+ stralloc_free(&sa) ;
+ return 1 ;
+
+ err:
+ genalloc_free(s6rc_repo_sv, &svlist) ;
+ genalloc_free(uint32_t, &badga) ;
+ genalloc_free(size_t, &setind) ;
+ stralloc_free(&sa) ;
+ return 0 ;
+}
diff --git a/src/libs6rc/s6rc_repo_fixset.c b/src/libs6rc/s6rc_repo_fixset.c
index efc6320..8ad64bc 100644
--- a/src/libs6rc/s6rc_repo_fixset.c
+++ b/src/libs6rc/s6rc_repo_fixset.c
@@ -5,7 +5,6 @@
#include <errno.h>
#include <skalibs/posixplz.h>
-#include <skalibs/direntry.h>
#include <skalibs/strerr.h>
#include <skalibs/stralloc.h>
#include <skalibs/genalloc.h>
diff --git a/src/libs6rc/s6rc_repo_list_sets.c b/src/libs6rc/s6rc_repo_list_sets.c
new file mode 100644
index 0000000..99f2162
--- /dev/null
+++ b/src/libs6rc/s6rc_repo_list_sets.c
@@ -0,0 +1,15 @@
+/* ISC license. */
+
+#include <string.h>
+
+#include <s6-rc/s6rc-utils.h>
+#include <s6-rc/repo.h>
+
+int s6rc_repo_list_sets (char const *repo, stralloc *sa, genalloc *ga)
+{
+ size_t repolen = strlen(repo) ;
+ char fn[repolen + 9] ;
+ memcpy(fn, repo, repolen) ;
+ memcpy(fn + repolen, "/sources", 9) ;
+ return s6rc_ls(fn, sa, ga) ;
+}
diff --git a/src/libs6rc/s6rc_repo_listsub.c b/src/libs6rc/s6rc_repo_listsub.c
index eef0a7c..eed5cb4 100644
--- a/src/libs6rc/s6rc_repo_listsub.c
+++ b/src/libs6rc/s6rc_repo_listsub.c
@@ -1,59 +1,20 @@
/* ISC license. */
#include <string.h>
-#include <errno.h>
-
-#include <skalibs/direntry.h>
-#include <skalibs/strerr.h>
-#include <skalibs/stralloc.h>
-#include <skalibs/genalloc.h>
+#include <s6-rc/s6rc-utils.h>
#include <s6-rc/repo.h>
int s6rc_repo_listsub (char const *repo, char const *set, char const *sub, stralloc *sa, genalloc *ga)
{
- size_t sabase = sa->len ;
- size_t gabase = genalloc_len(size_t, ga) ;
size_t repolen = strlen(repo) ;
size_t setlen = strlen(set) ;
size_t sublen = strlen(sub) ;
- int sawasnull = !sa->s ;
- int gawasnull = !genalloc_s(size_t, ga) ;
- int n = 0 ;
char fn[repolen + setlen + 10 + sublen] ;
memcpy(fn, repo, repolen) ;
memcpy(fn + repolen, "/sources/", 9) ;
memcpy(fn + repolen + 9, set, setlen) ;
- memcpy(fn + repolen + 9 + setlen, sub, sublen) ;
-
- DIR *dir = opendir(fn) ;
- if (!dir)
- {
- strerr_warnfu2sys("opendir ", fn) ;
- return -1 ;
- }
- for (;;)
- {
- direntry *d ;
- size_t len ;
- errno = 0 ;
- d = readdir(dir) ;
- if (!d) break ;
- if (d->d_name[0] == '.') continue ;
- len = strlen(d->d_name) ;
- if (!genalloc_catb(size_t, ga, &sa->len, 1)) goto err ;
- if (!stralloc_catb(sa, d->d_name, len+1)) goto err ;
- n++ ;
- }
- if (errno) goto err ;
- dir_close(dir) ;
- return n ;
+ memcpy(fn + repolen + 9 + setlen, sub, sublen + 1) ;
- err:
- dir_close(dir) ;
- if (gawasnull) genalloc_free(size_t, ga) ;
- else genalloc_setlen(size_t, ga, gabase) ;
- if (sawasnull) stralloc_free(sa) ;
- else sa->len = sabase ;
- return -1 ;
+ return s6rc_ls(fn, sa, ga) ;
}
diff --git a/src/libs6rc/s6rc_repo_makesetbundles.c b/src/libs6rc/s6rc_repo_makesetbundles.c
index 8fcf979..12d76b8 100644
--- a/src/libs6rc/s6rc_repo_makesetbundles.c
+++ b/src/libs6rc/s6rc_repo_makesetbundles.c
@@ -34,8 +34,12 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve
memcpy(src + repolen + 10, ".bundles", 9) ;
rm_rf_tmp(dst, &sa) ;
- n = s6rc_repo_listsub(repo, set, "masked", &sa, &ga) ;
- if (n < 0) goto err ;
+ n = s6rc_repo_listsub(repo, set, s6rc_repo_subnames[0], &sa, &ga) ;
+ if (n < 0)
+ {
+ strerr_warnfu6sys("list sub ", s6rc_repo_subnames[0], " of set ", set, " in repository ", repo) ;
+ goto err ;
+ }
if (n)
{
DIR *dir ;
diff --git a/src/libs6rc/s6rc_repo_sync.c b/src/libs6rc/s6rc_repo_sync.c
index cc4db03..8e5956b 100644
--- a/src/libs6rc/s6rc_repo_sync.c
+++ b/src/libs6rc/s6rc_repo_sync.c
@@ -8,6 +8,7 @@
#include <stdlib.h>
#include <errno.h>
+#include <skalibs/uint32.h>
#include <skalibs/direntry.h>
#include <skalibs/posixplz.h>
#include <skalibs/strerr.h>
@@ -27,98 +28,19 @@ static inline void cleanup (char const *ato, char const *bun)
errno = e ;
}
-static int unlink_stales_in_sub (char const *repo, char const *set, char const *sub, uint32_t where, stralloc *sa, genalloc *ga, unsigned int verbosity)
-{
- size_t repolen = strlen(repo) ;
- size_t setlen = strlen(set) ;
- size_t sublen = strlen(sub) ;
- size_t subfnlen = repolen + setlen + sublen + 10 ;
- char subfn[subfnlen + 1] ;
- memcpy(subfn, repo, repolen) ;
- memcpy(subfn + repolen, "/sources/", 9) ;
- memcpy(subfn + repolen + 9, set, setlen) ;
- subfn[repolen + 9 + setlen] = '/' ;
- memcpy(subfn + repolen + 10 + setlen, sub, sublen + 1) ;
- DIR *dir = opendir(subfn) ;
- if (!dir)
- {
- strerr_warnfu2sys("opendir ", subfn) ;
- return 0 ;
- }
- for (;;)
- {
- size_t len ;
- direntry *d ;
- errno = 0 ;
- d = readdir(dir) ;
- if (!d) break ;
- if (d->d_name[0] == '.') continue ;
- len = strlen(d->d_name) ;
- char fn[subfnlen + len + 2] ;
- memcpy(fn, subfn, sublen) ;
- fn[sublen] = '/' ;
- memcpy(fn + sublen + 1, d->d_name, len+1) ;
- if (access(fn, F_OK) == -1)
- {
- if (errno != ENOENT)
- {
- strerr_warnfu2sys("access ", fn) ;
- goto err ;
- }
- unlink_void(fn) ;
- if (verbosity >= 2)
- strerr_warni6x("service ", d->d_name, " does not exist anymore, removed from sub ", sub, " of set ", set) ;
- }
- else
- {
- if (!genalloc_append(size_t, ga, &sa->len)) goto err ;
- if (!stralloc_catb(sa, d->d_name, len+1)) goto err ;
- }
- }
- if (errno)
- {
- strerr_warnfu2sys("readdir ", subfn) ;
- goto err ;
- }
-
- dir_close(dir) ;
- return 1 ;
-
- err:
- dir_close(dir) ;
- return 0 ;
-}
-
-static inline int s6rc_repo_syncset (char const *repo, size_t repolen, char const *set, stralloc *sa, genalloc *ga, unsigned int verbosity)
-{
- for (unsigned int i = 0 ; i < 4 ; i++)
- if (unlink_stales_in_sub(repo, set, s6rc_repo_subnames[i], i, sa, ga, verbosity)) goto err ;
-
- {
- size_t n = genalloc_len(size_t, ga) ;
- char const *stillhere[n + !n] ;
- for (size_t i = 0 ; i < n ; i++) stillhere[i] = sa->s + genalloc_s(size_t, ga)[i] ;
- if (!s6rc_repo_fillset(repo, set, stillhere, n)) goto err ;
- }
-
- sa->len = 0 ;
- genalloc_setlen(size_t, ga, 0) ;
- return 1 ;
-
- err:
- sa->len = 0 ;
- genalloc_setlen(size_t, ga, 0) ;
- return 0 ;
-}
-
-int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sourceslen, unsigned int verbosity, char const *fdhuser)
+int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuser)
{
size_t repolen = strlen(repo) ;
+ char store[repolen + 17] ;
char ato[repolen + 26] ;
char bun[repolen + 26] ;
+ memcpy(store, repo, repolen) ;
+ memcpy(store + repolen, "/stores/", 8) ;
+ store[repolen + 16] = 0 ;
+
- /* Fill new .atomics/ and .bundles/ with symlinks to real sources */
+ /* Fill new .atomics/ and .bundles/ with symlinks to real stores */
memcpy(ato, repo, repolen) ;
memcpy(ato + repolen, "/sources/..atomics:XXXXXX", 26) ;
@@ -147,13 +69,15 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources
return 0 ;
}
- for (size_t i = 0 ; i < sourceslen ; i++)
+ for (uint32_t istore = 0 ;; istore++)
{
- size_t srclen = strlen(sources[i]) ;
- DIR *dir = opendir(sources[i]) ;
+ DIR *dir ;
+ uint320_xfmt(store + repolen + 8, istore, 8) ;
+ dir = opendir(store) ;
if (!dir)
{
- strerr_warnfu2sys("opendir ", sources[i]) ;
+ if (errno == ENOENT) break ;
+ strerr_warnfu2sys("opendir ", store) ;
goto err ;
}
for (;;)
@@ -168,10 +92,11 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources
{
char const *x ;
char dst[repolen + 28 + len] ;
- char src[srclen + len + 2] ;
- memcpy(src, sources[i], srclen) ;
- src[srclen] = '/' ;
- memcpy(src + srclen + 1, d->d_name, len+1) ;
+ char src[26 + len] ;
+ memcpy(src, "../../../stores/", 16) ;
+ memcpy(src + 16, store + repolen + 8, 8) ;
+ src[24] = '/' ;
+ memcpy(src + 25, d->d_name, len+1) ;
switch (s6rc_type_check(-1, src))
{
case 1 :
@@ -215,13 +140,13 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources
dir_close(dir) ;
if (errno)
{
- strerr_warnfu2sys("readdir ", sources[i]) ;
+ strerr_warnfu2sys("readdir ", store) ;
goto err ;
}
}
- /* Compile the reference db - also checks new sources consistency */
+ /* Compile the reference db - also checks consistency of new stores */
{
char const *subs[2] = { ato + repolen + 9, bun + repolen + 9 } ;
@@ -232,7 +157,7 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources
}
- /* Switch to the new sources, delete the old ones */
+ /* Switch, delete links to old stores */
{
char fn[repolen + 18] ;
@@ -278,7 +203,7 @@ int s6rc_repo_sync (char const *repo, char const *const *sources, size_t sources
d = readdir(dir) ;
if (!d) break ;
if (d->d_name[0] == '.') continue ;
- if (!s6rc_repo_syncset(repo, repolen, d->d_name, &sa, &ga, verbosity)) break ;
+ if (!s6rc_repo_syncset_tmp(repo, d->d_name, &sa, &ga, verbosity)) break ;
}
dir_close(dir) ;
genalloc_free(size_t, &ga) ;
diff --git a/src/libs6rc/s6rc_repo_syncset.c b/src/libs6rc/s6rc_repo_syncset.c
new file mode 100644
index 0000000..929d9c4
--- /dev/null
+++ b/src/libs6rc/s6rc_repo_syncset.c
@@ -0,0 +1,16 @@
+/* ISC license. */
+
+#include <skalibs/stralloc.h>
+#include <skalibs/genalloc.h>
+
+#include <s6-rc/repo.h>
+
+int s6rc_repo_syncset (char const *repo, char const *set, unsigned int verbosity)
+{
+ stralloc sa = STRALLOC_ZERO ;
+ genalloc ga = GENALLOC_ZERO ; /* size_t */
+ int r = s6rc_repo_syncset_tmp(repo, set, &sa, &ga, verbosity) ;
+ genalloc_free(&size_t, &ga) ;
+ stralloc_free(&sa) ;
+ return r ;
+}
diff --git a/src/libs6rc/s6rc_repo_syncset_tmp.c b/src/libs6rc/s6rc_repo_syncset_tmp.c
new file mode 100644
index 0000000..d9bb358
--- /dev/null
+++ b/src/libs6rc/s6rc_repo_syncset_tmp.c
@@ -0,0 +1,104 @@
+/* ISC license. */
+
+#include <skalibs/nonposix.h> /* mkdtemp */
+
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <skalibs/direntry.h>
+#include <skalibs/posixplz.h>
+#include <skalibs/strerr.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/genalloc.h>
+
+#include <s6-rc/s6rc-utils.h>
+#include <s6-rc/repo.h>
+
+static int unlink_stales_in_sub (char const *repo, size_t repolen, char const *set, char const *sub, uint32_t where, stralloc *sa, genalloc *ga, unsigned int verbosity)
+{
+ size_t setlen = strlen(set) ;
+ size_t sublen = strlen(sub) ;
+ size_t subfnlen = repolen + setlen + sublen + 10 ;
+ char subfn[subfnlen + 1] ;
+ memcpy(subfn, repo, repolen) ;
+ memcpy(subfn + repolen, "/sources/", 9) ;
+ memcpy(subfn + repolen + 9, set, setlen) ;
+ subfn[repolen + 9 + setlen] = '/' ;
+ memcpy(subfn + repolen + 10 + setlen, sub, sublen + 1) ;
+ DIR *dir = opendir(subfn) ;
+ if (!dir)
+ {
+ strerr_warnfu2sys("opendir ", subfn) ;
+ return 0 ;
+ }
+ for (;;)
+ {
+ size_t len ;
+ direntry *d ;
+ errno = 0 ;
+ d = readdir(dir) ;
+ if (!d) break ;
+ if (d->d_name[0] == '.') continue ;
+ len = strlen(d->d_name) ;
+ char fn[subfnlen + len + 2] ;
+ memcpy(fn, subfn, sublen) ;
+ fn[sublen] = '/' ;
+ memcpy(fn + sublen + 1, d->d_name, len+1) ;
+ if (access(fn, F_OK) == -1)
+ {
+ if (errno != ENOENT)
+ {
+ strerr_warnfu2sys("access ", fn) ;
+ goto err ;
+ }
+ unlink_void(fn) ;
+ if (verbosity >= 3)
+ strerr_warni6x("service ", d->d_name, " does not exist anymore, removed from sub ", sub, " of set ", set) ;
+ }
+ else
+ {
+ if (!genalloc_append(size_t, ga, &sa->len)) goto err ;
+ if (!stralloc_catb(sa, d->d_name, len+1)) goto err ;
+ }
+ }
+ if (errno)
+ {
+ strerr_warnfu2sys("readdir ", subfn) ;
+ goto err ;
+ }
+
+ dir_close(dir) ;
+ return 1 ;
+
+ err:
+ dir_close(dir) ;
+ return 0 ;
+}
+
+int s6rc_repo_syncset_tmp (char const *repo, char const *set, stralloc *sa, genalloc *ga, unsigned int verbosity)
+{
+ size_t repolen = strlen(repo) ;
+ size_t sabase = sa->len ;
+ size_t gabase = genalloc_len(size_t, ga) ;
+
+ for (unsigned int i = 0 ; i < 4 ; i++)
+ if (unlink_stales_in_sub(repo, repolen, set, s6rc_repo_subnames[i], i, sa, ga, verbosity)) goto err ;
+
+ {
+ uint32_t n = genalloc_len(size_t, ga) ;
+ char const *stillhere[n + !n] ;
+ for (uint32_t i = 0 ; i < n ; i++) stillhere[i] = sa->s + genalloc_s(size_t, ga)[i] ;
+ if (!s6rc_repo_fillset(repo, set, stillhere, n)) goto err ;
+ }
+
+ sa->len = sabase ;
+ genalloc_setlen(size_t, ga, gabase) ;
+ return 1 ;
+
+ err:
+ sa->len = sabase ;
+ genalloc_setlen(size_t, ga, gabase) ;
+ return 0 ;
+}
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) ;
+}