gwenhywfar  5.10.1
c_dist.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 "c_dist.h"
16 #include "utils.h"
17 #include "gwenbuild/filenames.h"
18 
19 #include <gwenhywfar/debug.h>
20 #include <gwenhywfar/directory.h>
21 
22 #include <unistd.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <time.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <errno.h>
29 
30 
31 
32 static int _writeDistFiles(const char *initialSourceDir, const GWB_FILE_LIST2 *fileList, const char *folder);
33 
34 
35 
36 
38 {
39  GWB_FILE_LIST2 *projectFileList;
40  GWEN_XMLNODE *xmlProjectInfo;
41  GWEN_BUFFER *nameBuf;
42  const char *initialSourceDir;
43  const char *projectName;
44  int versionMajor;
45  int versionMinor;
46  int versionPatchlevel;
47  int versionBuild;
48  const char *versionTag;
49  int rv;
50 
52  if (projectFileList==NULL) {
53  DBG_ERROR(NULL, "No file list read.");
54  return GWEN_ERROR_GENERIC;
55  }
56 
58  if (xmlProjectInfo==NULL) {
59  DBG_ERROR(NULL, "Error reading project info.");
60  GWB_File_List2_free(projectFileList);
61  return GWEN_ERROR_GENERIC;
62  }
63 
64  initialSourceDir=GWEN_XMLNode_GetCharValue(xmlProjectInfo, "initialSourceDir", NULL);
65  projectName=GWEN_XMLNode_GetCharValue(xmlProjectInfo, "projectName", NULL);
66  versionMajor=GWEN_XMLNode_GetIntValue(xmlProjectInfo, "versionMajor", 0);
67  versionMinor=GWEN_XMLNode_GetIntValue(xmlProjectInfo, "versionMinor", 0);
68  versionPatchlevel=GWEN_XMLNode_GetIntValue(xmlProjectInfo, "versionPatchlevel", 0);
69  versionBuild=GWEN_XMLNode_GetIntValue(xmlProjectInfo, "versionBuild", 0);
70  versionTag=GWEN_XMLNode_GetCharValue(xmlProjectInfo, "versionTag", NULL);
71  if (!(projectName && *projectName)) {
72  DBG_ERROR(NULL, "Missing project name in project info file");
73  GWEN_XMLNode_free(xmlProjectInfo);
74  GWB_File_List2_free(projectFileList);
75  return GWEN_ERROR_GENERIC;
76  }
77 
78  nameBuf=GWEN_Buffer_new(0, 256, 0, 1);
79  if (versionBuild>0)
80  GWEN_Buffer_AppendArgs(nameBuf,
81  "%s-%d.%d.%d.%d%s",
82  projectName,
83  versionMajor, versionMinor, versionPatchlevel, versionBuild,
84  versionTag?versionTag:"");
85  else
86  GWEN_Buffer_AppendArgs(nameBuf,
87  "%s-%d.%d.%d%s",
88  projectName,
89  versionMajor, versionMinor, versionPatchlevel,
90  versionTag?versionTag:"");
91 
92  rv=_writeDistFiles(initialSourceDir, projectFileList, GWEN_Buffer_GetStart(nameBuf));
93  if (rv<0) {
94  DBG_ERROR(NULL, "Error copying files into dist folder \"%s\"",
95  GWEN_Buffer_GetStart(nameBuf));
96  GWEN_Buffer_free(nameBuf);
97  GWEN_XMLNode_free(xmlProjectInfo);
98  GWB_File_List2_free(projectFileList);
99  return rv;
100  }
101  GWEN_Buffer_free(nameBuf);
102  GWEN_XMLNode_free(xmlProjectInfo);
103  GWB_File_List2_free(projectFileList);
104 
105 
106  return 0;
107 }
108 
109 
110 
111 int _writeDistFiles(const char *initialSourceDir,
112  const GWB_FILE_LIST2 *fileList,
113  const char *folder)
114 {
115  GWB_FILE_LIST2_ITERATOR *it;
116 
117  it=GWB_File_List2_First(fileList);
118  if (it) {
119  GWB_FILE *file;
120  GWEN_BUFFER *sourceNameBuf;
121  GWEN_BUFFER *destNameBuf;
122 
123  sourceNameBuf=GWEN_Buffer_new(0, 256, 0, 1);
124  destNameBuf=GWEN_Buffer_new(0, 256, 0, 1);
125  file=GWB_File_List2Iterator_Data(it);
126  while(file) {
127  uint32_t flags;
128  const char *s;
129 
130  flags=GWB_File_GetFlags(file);
131  if (flags & GWB_FILE_FLAGS_DIST) {
132  int rv;
133 
134  /* generate source path */
135  if (!(flags & GWB_FILE_FLAGS_GENERATED)) {
136  GWEN_Buffer_AppendString(sourceNameBuf, initialSourceDir);
138  }
139  s=GWB_File_GetFolder(file);
140  if (s && *s) {
141  GWEN_Buffer_AppendString(sourceNameBuf, s);
143  }
144  GWEN_Buffer_AppendString(sourceNameBuf, GWB_File_GetName(file));
145 
146  /* generate target path */
147  GWEN_Buffer_AppendString(destNameBuf, folder);
149  if (s && *s) {
150  GWEN_Buffer_AppendString(destNameBuf, s);
152  }
153  GWEN_Buffer_AppendString(destNameBuf, GWB_File_GetName(file));
154 
155  fprintf(stdout, "Moving file '%s' into dist folder\n", GWEN_Buffer_GetStart(sourceNameBuf));
156  rv=GWB_Utils_CopyFile(GWEN_Buffer_GetStart(sourceNameBuf), GWEN_Buffer_GetStart(destNameBuf));
157  if (rv<0) {
158  DBG_ERROR(NULL, "Error copying \"%s\" into dist folder (%d)",
159  GWEN_Buffer_GetStart(sourceNameBuf), rv);
160  GWEN_Buffer_free(sourceNameBuf);
161  GWEN_Buffer_free(destNameBuf);
162  return rv;
163  }
164 
165  GWEN_Buffer_Reset(sourceNameBuf);
166  GWEN_Buffer_Reset(destNameBuf);
167  }
168 
169  file=GWB_File_List2Iterator_Next(it);
170  }
171  GWEN_Buffer_free(sourceNameBuf);
172  GWEN_Buffer_free(destNameBuf);
173  GWB_File_List2Iterator_free(it);
174  }
175 
176  return 0;
177 
178 }
179 
180 
181 
182 
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
#define GWEN_DIR_SEPARATOR_S
struct GWB_FILE GWB_FILE
Definition: file.h:18
#define NULL
Definition: binreloc.c:300
GWEN_XMLNODE * GWB_Utils_ReadProjectInfoFromFile(const char *fileName)
Definition: utils.c:602
#define GWBUILD_FILE_PROJECTINFO
Definition: filenames.h:17
#define GWB_FILE_FLAGS_DIST
Definition: file.h:21
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
int GWEN_XMLNode_GetIntValue(const GWEN_XMLNODE *n, const char *name, int defValue)
Definition: xml.c:923
const char * GWB_File_GetFolder(const GWB_FILE *f)
Definition: file.c:127
const char * GWB_File_GetName(const GWB_FILE *f)
Definition: file.c:146
GWB_FILE_LIST2 * GWB_Utils_ReadFileList2(const char *fileName)
Definition: utils.c:71
const char * GWEN_XMLNode_GetCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition: xml.c:812
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition: buffer.c:1084
#define GWEN_ERROR_GENERIC
Definition: error.h:62
#define GWBUILD_FILE_FILES
Definition: filenames.h:16
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
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:460
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
int GWB_MkDist()
Definition: c_dist.c:37
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition: file.c:99
static int _writeDistFiles(const char *initialSourceDir, const GWB_FILE_LIST2 *fileList, const char *folder)
Definition: c_dist.c:111
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
#define GWB_FILE_FLAGS_GENERATED
Definition: file.h:23
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989