gwenhywfar  5.7.2
utils.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Mon Feb 08 2021
3  copyright : (C) 2021 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * Please see toplevel file COPYING for license details *
8  ***************************************************************************/
9 
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13 
14 
15 #include "utils.h"
16 
17 #include <gwenhywfar/debug.h>
18 #include <gwenhywfar/directory.h>
19 
20 #include <unistd.h>
21 #include <sys/types.h>
22 #include <sys/stat.h>
23 #include <time.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <errno.h>
27 
28 
29 
30 
31 static GWB_KEYVALUEPAIR_LIST *_generateInstallList(const GWB_FILE_LIST2 *fileList, const char *initialSourceDir);
32 static int _filesChanged(const char *fileName, GWEN_STRINGLIST *slFileNameList);
33 static GWEN_STRINGLIST *_readBuildFileList(const char *fileName);
34 static void _writeProjectNameAndVersionToXml(const GWB_PROJECT *project, GWEN_XMLNODE *xmlNode);
35 
36 
37 
38 
39 int GWB_Utils_WriteProjectFileList(const GWB_PROJECT *project, const char *fileName)
40 {
41  GWB_FILE_LIST2 *fileList;
42 
43  fileList=GWB_Project_GetFileList(project);
44  if (fileList) {
45  GWEN_XMLNODE *xmlNode;
46  GWEN_XMLNODE *xmlFileList;
47  int rv;
48 
49  xmlNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
50  xmlFileList=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "FileList");
51  GWB_File_List2_WriteXml(fileList, xmlFileList, "file");
52  GWEN_XMLNode_AddChild(xmlNode, xmlFileList);
53 
55  GWEN_XMLNode_free(xmlNode);
56  if (rv<0) {
57  DBG_ERROR(NULL, "Error writing FileList to file \"%s\" (%d)", fileName, rv);
58  return rv;
59  }
60 
61  }
62 
63  return 0;
64 }
65 
66 
67 
68 GWB_FILE_LIST2 *GWB_Utils_ReadFileList2(const char *fileName)
69 {
70  GWEN_XMLNODE *xmlRoot;
71  GWEN_XMLNODE *xmlFileList;
72  int rv;
73 
74  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
76  if (rv<0) {
77  DBG_ERROR(NULL, "Error reading build file list from \"%s\"", fileName);
78  GWEN_XMLNode_free(xmlRoot);
79  return NULL;
80  }
81 
82  xmlFileList=GWEN_XMLNode_FindFirstTag(xmlRoot, "FileList", NULL, NULL);
83  if (xmlFileList) {
84  GWB_FILE_LIST2 *fileList;
85 
86  fileList=GWB_File_List2_new();
87  GWB_File_List2_ReadXml(xmlFileList, "file", fileList);
88  if (GWB_File_List2_GetSize(fileList)==0) {
89  GWB_File_List2_free(fileList);
90  GWEN_XMLNode_free(xmlRoot);
91  return NULL;
92  }
93 
94  return fileList;
95  }
96 
97  GWEN_XMLNode_free(xmlRoot);
98  return NULL;
99 }
100 
101 
102 
103 int GWB_Utils_WriteBuildFileList(const GWENBUILD *gwenbuild, const char *fileName)
104 {
105  GWEN_STRINGLIST *sl;
106 
107  sl=GWBUILD_GetBuildFilenameList(gwenbuild);
108  if (sl) {
109  GWEN_XMLNODE *xmlRoot;
110  GWEN_XMLNODE *xmlFileList;
112  int rv;
113 
114  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
115  xmlFileList=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "BuildFiles");
116  GWEN_XMLNode_AddChild(xmlRoot, xmlFileList);
117 
119  while(se) {
120  const char *s;
121 
123  if (s && *s) {
124  GWEN_XMLNODE *xmlFile;
125  GWEN_XMLNODE *xmlFileName;
126 
127  xmlFile=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "File");
128  xmlFileName=GWEN_XMLNode_new(GWEN_XMLNodeTypeData, s);
129  GWEN_XMLNode_AddChild(xmlFile, xmlFileName);
130  GWEN_XMLNode_AddChild(xmlFileList, xmlFile);
131  }
132 
134  }
135 
137  GWEN_XMLNode_free(xmlRoot);
138  if (rv<0) {
139  DBG_ERROR(NULL, "Error writing build file list to file \"%s\" (%d)", fileName, rv);
140  return rv;
141  }
142  }
143 
144  return 0;
145 }
146 
147 
148 
149 int GWB_Utils_WriteInstallFileList(const GWB_PROJECT *project, const char *fileName)
150 {
151  GWB_KEYVALUEPAIR_LIST *genFileList;
152  const char *initialSourceDir;
153 
155 
156  genFileList=_generateInstallList(GWB_Project_GetFileList(project), initialSourceDir);
157  if (genFileList) {
158  GWB_KEYVALUEPAIR *kvp;
159  GWEN_XMLNODE *xmlRoot;
160  GWEN_XMLNODE *xmlFileList;
161  int rv;
162 
163  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
164  xmlFileList=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "InstallFiles");
165  GWEN_XMLNode_AddChild(xmlRoot, xmlFileList);
166 
167  kvp=GWB_KeyValuePair_List_First(genFileList);
168  while(kvp) {
169  const char *sDestPath;
170  const char *sSrcPath;
171 
172  sDestPath=GWB_KeyValuePair_GetKey(kvp);
173  sSrcPath=GWB_KeyValuePair_GetValue(kvp);
174  if (sDestPath && sSrcPath) {
175  GWEN_XMLNODE *xmlFile;
176 
177  xmlFile=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "InstallFile");
178  GWEN_XMLNode_SetCharValue(xmlFile, "destination", sDestPath);
179  GWEN_XMLNode_SetCharValue(xmlFile, "source", sSrcPath);
180  GWEN_XMLNode_AddChild(xmlFileList, xmlFile);
181  }
182 
183  kvp=GWB_KeyValuePair_List_Next(kvp);
184  }
185 
187  GWEN_XMLNode_free(xmlRoot);
188  if (rv<0) {
189  DBG_ERROR(NULL, "Error writing build file list to file \"%s\" (%d)", fileName, rv);
190  return rv;
191  }
192  }
193 
194  return 0;
195 }
196 
197 
198 
199 GWB_KEYVALUEPAIR_LIST *GWB_Utils_ReadInstallFileList(const char *fileName)
200 {
201  GWEN_XMLNODE *xmlRoot;
202  GWEN_XMLNODE *xmlFileList;
203  int rv;
204 
205  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
207  if (rv<0) {
208  DBG_ERROR(NULL, "Error reading build file list from \"%s\"", fileName);
209  GWEN_XMLNode_free(xmlRoot);
210  return NULL;
211  }
212 
213  xmlFileList=GWEN_XMLNode_FindFirstTag(xmlRoot, "InstallFiles", NULL, NULL);
214  if (xmlFileList) {
215  GWB_KEYVALUEPAIR_LIST *kvpList;
216  GWEN_XMLNODE *xmlFile;
217 
218  kvpList=GWB_KeyValuePair_List_new();
219  xmlFile=GWEN_XMLNode_FindFirstTag(xmlFileList, "InstallFile", NULL, NULL);
220  while(xmlFile) {
221  GWB_KEYVALUEPAIR *kvp;
222  const char *sDestPath;
223  const char *sSrcPath;
224 
225  sDestPath=GWEN_XMLNode_GetCharValue(xmlFile, "destination", NULL);
226  sSrcPath=GWEN_XMLNode_GetCharValue(xmlFile, "source", NULL);
227  kvp=GWB_KeyValuePair_new(sDestPath, sSrcPath);
228  GWB_KeyValuePair_List_Add(kvp, kvpList);
229 
230  xmlFile=GWEN_XMLNode_FindNextTag(xmlFile, "InstallFile", NULL, NULL);
231  }
232  GWEN_XMLNode_free(xmlRoot);
233 
234  if (GWB_KeyValuePair_List_GetCount(kvpList)==0) {
235  GWB_KeyValuePair_List_free(kvpList);
236  return NULL;
237  }
238 
239  return kvpList;
240  }
241 
242  GWEN_XMLNode_free(xmlRoot);
243  return NULL;
244 }
245 
246 
247 
248 GWB_KEYVALUEPAIR_LIST *_generateInstallList(const GWB_FILE_LIST2 *fileList, const char *initialSourceDir)
249 {
250  if (fileList) {
251  GWB_FILE_LIST2_ITERATOR *it;
252 
253  it=GWB_File_List2_First(fileList);
254  if (it) {
255  GWB_FILE *file;
256  GWB_KEYVALUEPAIR_LIST *kvpList;
257  GWEN_BUFFER *keyBuf;
258  GWEN_BUFFER *valueBuf;
259 
260  keyBuf=GWEN_Buffer_new(0, 256, 0, 1);
261  valueBuf=GWEN_Buffer_new(0, 256, 0, 1);
262  kvpList=GWB_KeyValuePair_List_new();
263  file=GWB_File_List2Iterator_Data(it);
264  while(file) {
266  const char *s;
267  GWB_KEYVALUEPAIR *kvp;
268 
269  s=GWB_File_GetInstallPath(file);
270  if (s && *s) {
271  GWEN_Buffer_AppendString(keyBuf, s);
274 
275  GWB_File_WriteFileNameToTopBuildDirString(file, initialSourceDir, valueBuf);
277  GWB_KeyValuePair_List_Add(kvp, kvpList);
278  GWEN_Buffer_Reset(valueBuf);
279  GWEN_Buffer_Reset(keyBuf);
280  }
281  }
282  file=GWB_File_List2Iterator_Next(it);
283  }
284  GWEN_Buffer_free(valueBuf);
285  GWEN_Buffer_free(keyBuf);
286  GWB_File_List2Iterator_free(it);
287  if (GWB_KeyValuePair_List_GetCount(kvpList)==0) {
288  GWB_KeyValuePair_List_free(kvpList);
289  return NULL;
290  }
291  return kvpList;
292  }
293  }
294 
295  return NULL;
296 }
297 
298 
299 
300 int GWB_Utils_BuildFilesChanged(const char *fileName)
301 {
302  GWEN_STRINGLIST *slFileNameList;
303 
304  slFileNameList=_readBuildFileList(fileName);
305  if (slFileNameList) {
306  if (_filesChanged(fileName, slFileNameList)) {
307  GWEN_StringList_free(slFileNameList);
308  return 1;
309  }
310  GWEN_StringList_free(slFileNameList);
311  }
312 
313  return 0;
314 }
315 
316 
317 
318 int _filesChanged(const char *fileName, GWEN_STRINGLIST *slFileNameList)
319 {
320  time_t mtSourceFile;
322 
323  mtSourceFile=GWBUILD_GetModificationTimeOfFile(fileName);
324  if (mtSourceFile==(time_t) 0) {
325  DBG_INFO(NULL, "here");
326  return 1; /* assume changed */
327  }
328 
329  se=GWEN_StringList_FirstEntry(slFileNameList);
330  while(se) {
331  const char *s;
332 
334  if (s && *s) {
335  time_t mt;
336 
338  if (mt!=(time_t) 0) {
339  if (difftime(mt, mtSourceFile)>0) {
340  DBG_ERROR(NULL, "File \"%s\" changed.", s);
341  return 1;
342  }
343  }
344  }
345 
347  }
348 
349  DBG_DEBUG(NULL, "Files unchanged since last setup.");
350  return 0;
351 }
352 
353 
354 
355 GWEN_STRINGLIST *_readBuildFileList(const char *fileName)
356 {
357  GWEN_XMLNODE *xmlRoot;
358  GWEN_XMLNODE *xmlFileList;
359  int rv;
360 
361  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
363  if (rv<0) {
364  DBG_ERROR(NULL, "Error reading build file list from \"%s\"", fileName);
365  GWEN_XMLNode_free(xmlRoot);
366  return NULL;
367  }
368 
369  xmlFileList=GWEN_XMLNode_FindFirstTag(xmlRoot, "BuildFiles", NULL, NULL);
370  if (xmlFileList) {
371  GWEN_STRINGLIST *sl;
372  GWEN_XMLNODE *xmlFile;
373 
374  sl=GWEN_StringList_new();
375  xmlFile=GWEN_XMLNode_FindFirstTag(xmlFileList, "File", NULL, NULL);
376  while(xmlFile) {
377  GWEN_XMLNODE *xmlFileName;
378 
379  xmlFileName=GWEN_XMLNode_GetFirstData(xmlFile);
380  if (xmlFileName) {
381  const char *s;
382 
383  s=GWEN_XMLNode_GetData(xmlFileName);
384  if (s && *s)
385  GWEN_StringList_AppendString(sl, s, 0, 1);
386  }
387 
388  xmlFile=GWEN_XMLNode_FindNextTag(xmlFile, "File", NULL, NULL);
389  }
390 
391  if (GWEN_StringList_Count(sl)==0) {
393  GWEN_XMLNode_free(xmlRoot);
394  return NULL;
395  }
396  GWEN_XMLNode_free(xmlRoot);
397  return sl;
398  }
399 
400  GWEN_XMLNode_free(xmlRoot);
401  return NULL;
402 }
403 
404 
405 
406 int GWB_Utils_WriteProjectToFile(const GWB_PROJECT *project, const char *fileName)
407 {
408  GWEN_XMLNODE *xmlRoot;
409  GWEN_XMLNODE *xmlProject;
410  int rv;
411 
412  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
413  xmlProject=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Project");
414  GWB_Project_toXml(project, xmlProject);
415  GWEN_XMLNode_AddChild(xmlRoot, xmlProject);
416 
418  GWEN_XMLNode_free(xmlRoot);
419  if (rv<0) {
420  DBG_ERROR(NULL, "Error writing project to file \"%s\" (%d)", fileName, rv);
421  return rv;
422  }
423 
424  return 0;
425 }
426 
427 
428 
429 int GWB_Utils_WriteContextTreeToFile(const GWB_CONTEXT *ctx, const char *fileName)
430 {
431  GWEN_XMLNODE *xmlRoot;
432  GWEN_XMLNODE *xmlContext;
433  int rv;
434 
435  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
436  xmlContext=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "ContextTree");
437  GWB_Context_toXml(ctx, xmlContext, 1);
438  GWEN_XMLNode_AddChild(xmlRoot, xmlContext);
439 
441  GWEN_XMLNode_free(xmlRoot);
442  if (rv<0) {
443  DBG_ERROR(NULL, "Error writing context tree to file \"%s\" (%d)", fileName, rv);
444  return rv;
445  }
446 
447  return 0;
448 }
449 
450 
451 
452 int GWB_Utils_CopyFile(const char *sSrcPath, const char *sDestPath)
453 {
454  int rv;
455  struct stat st;
456 
457  if (lstat(sSrcPath, &st)==-1) {
458  DBG_ERROR(NULL, "ERROR: stat(%s): %s", sSrcPath, strerror(errno));
459  return GWEN_ERROR_GENERIC;
460  }
461 
462  if ((st.st_mode & S_IFMT)==S_IFLNK) {
463  char *symlinkbuf;
464  int bufSizeNeeded;
465 
466  /* copy symlink */
467  if (st.st_size==0)
468  bufSizeNeeded=256;
469  else
470  bufSizeNeeded=st.st_size+1;
471  symlinkbuf=(char*) malloc(bufSizeNeeded);
472  assert(symlinkbuf);
473  rv=readlink(sSrcPath, symlinkbuf, bufSizeNeeded);
474  if (rv==-1) {
475  DBG_ERROR(NULL, "ERROR: readlink(%s): %s", sSrcPath, strerror(errno));
476  free(symlinkbuf);
477  return GWEN_ERROR_GENERIC;
478  }
479  else if (rv==bufSizeNeeded) {
480  DBG_ERROR(NULL, "Buffer too small (%d)", bufSizeNeeded);
481  free(symlinkbuf);
482  return GWEN_ERROR_GENERIC;
483  }
484 
485  rv=GWEN_Directory_GetPath(sDestPath,
489  if (rv<0) {
490  DBG_INFO(NULL, "here (%d)", rv);
491  free(symlinkbuf);
492  return rv;
493  }
494  unlink(sDestPath);
495  rv=symlink(symlinkbuf, sDestPath);
496  if (rv==-1) {
497  DBG_ERROR(NULL, "ERROR: symlink(%s): %s", sSrcPath, strerror(errno));
498  free(symlinkbuf);
499  return GWEN_ERROR_GENERIC;
500  }
501  }
502  else if ((st.st_mode & S_IFMT)==S_IFREG) {
503  mode_t newMode=0;
504 
505  rv=GWEN_Directory_GetPath(sDestPath,
509  if (rv<0) {
510  DBG_INFO(NULL, "here (%d)", rv);
511  return rv;
512  }
513 
514  rv=GWEN_SyncIo_Helper_CopyFile(sSrcPath, sDestPath);
515  if (rv<0) {
516  DBG_INFO(NULL, "here (%d)", rv);
517  return rv;
518  }
519 
520  newMode=S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
521  if (st.st_mode & S_IXUSR)
522  newMode|=S_IXUSR|S_IXGRP|S_IXOTH;
523  rv=chmod(sDestPath, newMode);
524  if (rv<0) {
525  DBG_ERROR(NULL, "ERROR: chmod(%s): %s", sSrcPath, strerror(errno));
526  return rv;
527  }
528  }
529  else {
530  DBG_ERROR(NULL, "Unhandled file type \"%s\"", sSrcPath);
531  }
532 
533  return 0;
534 }
535 
536 
537 
538 int GWB_Utils_WriteProjectInfoToFile(const GWB_PROJECT *project, const char *fileName)
539 {
540  GWB_CONTEXT *rootContext;
541  GWEN_XMLNODE *xmlRoot;
542  GWEN_XMLNODE *xmlProject;
543  const char *initialSourceDir;
544  int rv;
545 
546  rootContext=GWB_Project_GetRootContext(project);
547  initialSourceDir=GWB_Context_GetInitialSourceDir(rootContext);
548 
549  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
550  xmlProject=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "ProjectInfo");
551  if (initialSourceDir && *initialSourceDir)
552  GWEN_XMLNode_SetCharValue(xmlProject, "initialSourceDir", initialSourceDir);
553  _writeProjectNameAndVersionToXml(project, xmlProject);
554  GWEN_XMLNode_AddChild(xmlRoot, xmlProject);
555 
557  GWEN_XMLNode_free(xmlRoot);
558  if (rv<0) {
559  DBG_ERROR(NULL, "Error writing project to file \"%s\" (%d)", fileName, rv);
560  return rv;
561  }
562 
563  return 0;
564 }
565 
566 
567 
569 {
570  const char *s;
571  s=GWB_Project_GetProjectName(project);
572  if (s)
573  GWEN_XMLNode_SetCharValue(xmlNode, "projectName", s);
574  GWEN_XMLNode_SetIntValue(xmlNode, "versionMajor", GWB_Project_GetVersionMajor(project));
575  GWEN_XMLNode_SetIntValue(xmlNode, "versionMinor", GWB_Project_GetVersionMinor(project));
576  GWEN_XMLNode_SetIntValue(xmlNode, "versionPatchlevel", GWB_Project_GetVersionPatchlevel(project));
577  GWEN_XMLNode_SetIntValue(xmlNode, "versionBuild", GWB_Project_GetVersionBuild(project));
578  s=GWB_Project_GetVersionTag(project);
579  if (s)
580  GWEN_XMLNode_SetCharValue(xmlNode, "versionTag", s);
581 
582 }
583 
584 
585 
587 {
588  GWEN_XMLNODE *xmlRoot;
589  GWEN_XMLNODE *xmlProjectInfo;
590  int rv;
591 
592  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
594  if (rv<0) {
595  DBG_ERROR(NULL, "Error reading project info from \"%s\"", fileName);
596  GWEN_XMLNode_free(xmlRoot);
597  return NULL;
598  }
599 
600  xmlProjectInfo=GWEN_XMLNode_FindFirstTag(xmlRoot, "ProjectInfo", NULL, NULL);
601  if (xmlProjectInfo) {
602  GWEN_XMLNode_UnlinkChild(xmlRoot, xmlProjectInfo);
603  GWEN_XMLNode_free(xmlRoot);
604  return xmlProjectInfo;
605  }
606 
607  GWEN_XMLNode_free(xmlRoot);
608  return NULL;
609 }
610 
611 
612 
613 
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:117
int GWB_Utils_WriteInstallFileList(const GWB_PROJECT *project, const char *fileName)
Definition: utils.c:149
#define GWEN_DIR_SEPARATOR_S
#define GWEN_XML_FLAGS_SIMPLE
Definition: xml.h:89
const char * GWB_Project_GetVersionTag(const GWB_PROJECT *project)
Definition: project.c:136
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:794
int GWB_Utils_BuildFilesChanged(const char *fileName)
Definition: utils.c:300
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition: xml.c:724
struct GWB_FILE GWB_FILE
Definition: file.h:18
#define NULL
Definition: binreloc.c:300
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:1297
void GWB_File_List2_ReadXml(GWEN_XMLNODE *xmlNode, const char *groupName, GWB_FILE_LIST2 *destFileList)
Definition: file.c:669
struct GWB_PROJECT GWB_PROJECT
Definition: project.h:14
void GWEN_XMLNode_SetCharValue(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:897
GWEN_XMLNODE * GWB_Utils_ReadProjectInfoFromFile(const char *fileName)
Definition: utils.c:586
int GWB_Project_GetVersionBuild(const GWB_PROJECT *project)
Definition: project.c:129
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
#define GWB_FILE_FLAGS_INSTALL
Definition: file.h:22
#define GWEN_DIR_FLAGS_PUBLIC_PATH
Definition: directory.h:60
const char * GWB_File_GetInstallPath(const GWB_FILE *f)
Definition: file.c:187
int GWB_Project_GetVersionPatchlevel(const GWB_PROJECT *project)
Definition: project.c:122
const char * GWB_File_GetName(const GWB_FILE *f)
Definition: file.c:144
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
GWB_FILE_LIST2 * GWB_Utils_ReadFileList2(const char *fileName)
Definition: utils.c:68
GWB_FILE_LIST2 * GWB_Project_GetFileList(const GWB_PROJECT *project)
Definition: project.c:205
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
const char * GWB_Project_GetProjectName(const GWB_PROJECT *project)
Definition: project.c:77
#define GWEN_DIR_FLAGS_PUBLIC_NAME
Definition: directory.h:61
GWB_KEYVALUEPAIR_LIST * GWB_Utils_ReadInstallFileList(const char *fileName)
Definition: utils.c:199
int GWB_Utils_WriteProjectToFile(const GWB_PROJECT *project, const char *fileName)
Definition: utils.c:406
const char * GWEN_XMLNode_GetCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition: xml.c:812
const char * GWB_Context_GetInitialSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:285
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition: stringlist.c:245
int GWB_Utils_WriteProjectInfoToFile(const GWB_PROJECT *project, const char *fileName)
Definition: utils.c:538
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:209
int GWB_Project_GetVersionMajor(const GWB_PROJECT *project)
Definition: project.c:108
void GWB_Project_toXml(const GWB_PROJECT *project, GWEN_XMLNODE *xmlNode)
Definition: project.c:405
#define GWEN_PATH_FLAGS_VARIABLE
Definition: path.h:111
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
#define GWEN_ERROR_GENERIC
Definition: error.h:62
static GWB_KEYVALUEPAIR_LIST * _generateInstallList(const GWB_FILE_LIST2 *fileList, const char *initialSourceDir)
Definition: utils.c:248
GWENHYWFAR_API int GWEN_XMLNode_WriteFile(const GWEN_XMLNODE *n, const char *fname, uint32_t flags)
Definition: xmlrw.c:583
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
void GWEN_XMLNode_UnlinkChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:570
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
int GWB_Utils_CopyFile(const char *sSrcPath, const char *sDestPath)
Definition: utils.c:452
GWB_KEYVALUEPAIR * GWB_KeyValuePair_new(const char *key, const char *value)
Definition: keyvaluepair.c:34
#define GWEN_PATH_FLAGS_CHECKROOT
Definition: path.h:142
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:427
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
void GWB_File_List2_WriteXml(const GWB_FILE_LIST2 *fileList, GWEN_XMLNODE *xmlNode, const char *groupName)
Definition: file.c:646
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
int GWB_Utils_WriteContextTreeToFile(const GWB_CONTEXT *ctx, const char *fileName)
Definition: utils.c:429
int GWB_Project_GetVersionMinor(const GWB_PROJECT *project)
Definition: project.c:115
time_t GWBUILD_GetModificationTimeOfFile(const char *filename)
Definition: gwenbuild.c:882
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
struct GWB_KEYVALUEPAIR GWB_KEYVALUEPAIR
Definition: keyvaluepair.h:19
void GWB_File_WriteFileNameToTopBuildDirString(const GWB_FILE *file, const char *initialSourceDir, GWEN_BUFFER *fbuf)
Definition: file.c:452
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition: file.c:97
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:178
void GWB_Context_toXml(const GWB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode, int withDb)
Definition: context.c:512
GWENHYWFAR_API int GWEN_Directory_GetPath(const char *path, unsigned int flags)
int GWB_Utils_WriteProjectFileList(const GWB_PROJECT *project, const char *fileName)
Definition: utils.c:39
static void _writeProjectNameAndVersionToXml(const GWB_PROJECT *project, GWEN_XMLNODE *xmlNode)
Definition: utils.c:568
struct GWENBUILD GWENBUILD
Definition: gwenbuild.h:15
const char * GWB_KeyValuePair_GetValue(const GWB_KEYVALUEPAIR *kvp)
Definition: keyvaluepair.c:97
const char * GWB_KeyValuePair_GetKey(const GWB_KEYVALUEPAIR *kvp)
Definition: keyvaluepair.c:79
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition: stringlist.c:50
static GWEN_STRINGLIST * _readBuildFileList(const char *fileName)
Definition: utils.c:355
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
GWB_CONTEXT * GWB_Project_GetRootContext(const GWB_PROJECT *project)
Definition: project.c:226
GWEN_STRINGLIST * GWBUILD_GetBuildFilenameList(const GWENBUILD *gwenbuild)
Definition: gwenbuild.c:140
int GWEN_SyncIo_Helper_CopyFile(const char *srcPath, const char *destPath)
Definition: syncio.c:640
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
int GWB_Utils_WriteBuildFileList(const GWENBUILD *gwenbuild, const char *fileName)
Definition: utils.c:103
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:423
void GWEN_XMLNode_SetIntValue(GWEN_XMLNODE *n, const char *name, int value)
Definition: xml.c:940
static int _filesChanged(const char *fileName, GWEN_STRINGLIST *slFileNameList)
Definition: utils.c:318