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