From f8924f9eaf71e9f8fbeb6bfca722a9eb602128ae Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sun, 24 Feb 2019 03:22:38 +1100
Subject: [PATCH] add db_write_master

---
 src/lib66/db_cmd_master.c | 75 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 74 insertions(+), 1 deletion(-)

diff --git a/src/lib66/db_cmd_master.c b/src/lib66/db_cmd_master.c
index 21c67294..f03a30a6 100644
--- a/src/lib66/db_cmd_master.c
+++ b/src/lib66/db_cmd_master.c
@@ -38,7 +38,7 @@
 #include <66/utils.h>
 #include <66/graph.h>
 
-//#include <stdio.h>
+#include <stdio.h>
 //USAGE "db_update_start [ -v verbosity ] [ -a add ] [ -d delete ] [ -c copy to ] [ -B bundle ] [ -D directory ] service"
 // -c -> copy the contents file to the given directory, in this case service is not mandatory
 int db_update_master(int argc, char const *const *argv)
@@ -350,3 +350,76 @@ int db_write_contents(genalloc *ga, char const *bundle,char const *dir)
 		stralloc_free(&in) ;
 		return 0 ;
 }
+
+int db_write_master(ssexec_t *info, genalloc *ga, char const *dir)
+{
+	int r ;
+	
+	stralloc in = STRALLOC_ZERO ;
+	stralloc inres = STRALLOC_ZERO ;
+	ss_resolve_t res = RESOLVE_ZERO ;
+	
+	size_t dirlen = strlen(dir) ;
+	
+	char runat[info->livetree.len + 1 + info->treename.len + SS_SVDIRS_LEN + SS_MASTER_LEN + 1] ;
+	memcpy(runat,info->livetree.s,info->livetree.len) ;
+	runat[info->livetree.len] = '/' ;
+	memcpy(runat + info->livetree.len + 1,info->treename.s,info->treename.len) ;
+	memcpy(runat + info->livetree.len + 1 + info->treename.len, SS_SVDIRS,SS_SVDIRS_LEN) ;
+	memcpy(runat + info->livetree.len + 1 + info->treename.len + SS_SVDIRS_LEN, SS_MASTER, SS_MASTER_LEN) ;
+	runat[info->livetree.len + 1 + info->treename.len + SS_SVDIRS_LEN + SS_MASTER_LEN] = 0 ;
+	
+	char dst[dirlen + SS_DB_LEN + SS_SRC_LEN + SS_MASTER_LEN + 1] ;
+	memcpy(dst, dir, dirlen) ;
+	memcpy(dst + dirlen, SS_DB, SS_DB_LEN) ;
+	memcpy(dst + dirlen + SS_DB_LEN, SS_SRC, SS_SRC_LEN) ;
+	memcpy(dst + dirlen + SS_DB_LEN + SS_SRC_LEN, SS_MASTER, SS_MASTER_LEN) ;
+	dst[dirlen + SS_DB_LEN + SS_SRC_LEN + SS_MASTER_LEN] = 0 ;
+	
+	for (unsigned int i = 0 ; i < genalloc_len(stralist,ga); i++)
+	{
+		
+		if (!stralloc_cats(&in,gaistr(ga,i))) goto err ;
+		if (!stralloc_cats(&in,"\n")) goto err ;
+	
+		if (!stralloc_cats(&inres,gaistr(ga,i))) goto err ;
+		if (!stralloc_cats(&inres," ")) goto err ;
+	}
+	inres.len--;
+	if (!stralloc_0(&inres)) goto err ;
+	
+	r = file_write_unsafe(dst,SS_CONTENTS,in.s,in.len) ;
+	if (!r) 
+	{ 
+		VERBO3 strerr_warnwu3sys("write: ",dst,"contents") ;
+		goto err ;
+	}
+	
+	ss_resolve_init(&res) ;
+	res.name = ss_resolve_add_string(&res,"Master") ;
+	res.description = ss_resolve_add_string(&res,"inner bundle - do not use it") ;
+	res.treename = ss_resolve_add_string(&res,info->treename.s) ;
+	res.tree = ss_resolve_add_string(&res,info->tree.s) ;
+	res.type = BUNDLE ;
+	res.deps = ss_resolve_add_string(&res,inres.s) ;
+	res.ndeps = genalloc_len(stralist,ga) ;
+	res.runat = ss_resolve_add_string(&res,runat) ;	
+	res.disen = 1 ;
+	res.init = 0 ;
+	res.unsupervise = 0 ;
+	res.reload = 0 ;
+	
+	if (!ss_resolve_write(&res,dir,"Master")) goto err ;
+	
+	stralloc_free(&in) ;
+	stralloc_free(&inres) ;
+	ss_resolve_free(&res) ;
+	
+	return 1 ;
+	
+	err:
+		ss_resolve_free(&res) ;
+		stralloc_free(&in) ;
+		stralloc_free(&inres) ;
+		return 0 ;
+}
-- 
GitLab