aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTharre <tharre3@gmail.com>2014-11-11 13:45:14 +0100
committerTharre <tharre3@gmail.com>2014-11-11 14:03:32 +0100
commit56f3fa373a76842275b199c9ce14fd8e626bd909 (patch)
tree3ef552a3041afe97686532a8bec492e2c786505d
parenta07239b0d220fb04dadd6422fd75defa13ee50b9 (diff)
downloadredo-56f3fa373a76842275b199c9ce14fd8e626bd909.tar.gz
redo-56f3fa373a76842275b199c9ce14fd8e626bd909.tar.xz
redo-56f3fa373a76842275b199c9ce14fd8e626bd909.zip
Some refactoring and small fixes.
-rw-r--r--src/build.c38
-rw-r--r--src/build.h1
-rw-r--r--src/dbg.h4
-rw-r--r--src/filepath.c10
-rw-r--r--src/filepath.h2
-rw-r--r--src/redo-ifchange.c8
-rw-r--r--src/redo.c13
7 files changed, 48 insertions, 28 deletions
diff --git a/src/build.c b/src/build.c
index 7bbf809..19c06f5 100644
--- a/src/build.c
+++ b/src/build.c
@@ -58,7 +58,7 @@ int build_target(const char *target) {
free_do_attr(dofiles);
return 0;
}
- log_err("%s couldn't be built because no "
+ log_err("'%s' couldn't be built because no "
"suitable do-file exists\n", target);
free_do_attr(dofiles);
return 1;
@@ -168,7 +168,7 @@ int build_target(const char *target) {
static char **parse_shebang(char *target, char *dofile, char *temp_output) {
FILE *fp = fopen(dofile, "rb");
if (!fp)
- fatal(ERRM_FOPEN, dofile)
+ fatal(ERRM_FOPEN, dofile);
char buf[1024];
@@ -348,7 +348,7 @@ void add_dep(const char *target, const char *parent, int ident) {
}
/* Hash target, storing the result in hash. */
-static void hash_file(const char *target, unsigned char (*hash)[HASHSIZE]) {
+static void hash_file(const char *target, unsigned char *hash) {
FILE *in = fopen(target, "rb");
if (!in)
fatal(ERRM_FOPEN, target);
@@ -363,7 +363,7 @@ static void hash_file(const char *target, unsigned char (*hash)[HASHSIZE]) {
if (ferror(in))
fatal(ERRM_FREAD, target);
- SHA1_Final(*hash, &context);
+ SHA1_Final(hash, &context);
fclose(in);
}
@@ -374,7 +374,7 @@ static void write_dep_hash(const char *target) {
unsigned char hash[HASHSIZE];
unsigned magic = atoi(getenv("REDO_MAGIC"));
- hash_file(target, &hash);
+ hash_file(target, hash);
char *dep_path = get_dep_path(target);
int out = open(dep_path, O_WRONLY | O_CREAT, 0644);
@@ -399,20 +399,20 @@ static bool dependencies_changed(char buf[], size_t read) {
char *ptr = buf;
for (size_t i = 0; i < read; ++i) {
- if (!buf[i]) {
- if (is_absolute(&ptr[1])) {
- if (has_changed(&ptr[1], ptr[0], true))
- return true;
- } else {
- char *abs = concat(3, root, "/", &ptr[1]);
- if (has_changed(abs, ptr[0], true)) {
- free(abs);
- return true;
- }
+ if (buf[i])
+ continue;
+ if (is_absolute(&ptr[1])) {
+ if (has_changed(&ptr[1], ptr[0], true))
+ return true;
+ } else {
+ char *abs = concat(3, root, "/", &ptr[1]);
+ if (has_changed(abs, ptr[0], true)) {
free(abs);
+ return true;
}
- ptr = &buf[i+1];
+ free(abs);
}
+ ptr = &buf[i+1];
}
return false;
}
@@ -449,7 +449,7 @@ bool has_changed(const char *target, int ident, bool is_sub_dependency) {
return is_sub_dependency;
unsigned char hash[HASHSIZE];
- hash_file(target, &hash);
+ hash_file(target, hash);
if (memcmp(hash, buf+sizeof(unsigned), HASHSIZE)) {
/*debug("Hash doesn't match for %s\n", target);*/
return true;
@@ -475,3 +475,7 @@ bool has_changed(const char *target, int ident, bool is_sub_dependency) {
exit(EXIT_FAILURE);
}
}
+
+bool environment_sane() {
+ return getenv("REDO_ROOT") && getenv("REDO_PARENT_TARGET") && getenv("REDO_MAGIC");
+}
diff --git a/src/build.h b/src/build.h
index c4a6aeb..8a5f072 100644
--- a/src/build.h
+++ b/src/build.h
@@ -14,5 +14,6 @@
extern void add_dep(const char *target, const char *parent, int ident);
extern bool has_changed(const char *target, int ident, bool is_sub_dependency);
extern int build_target(const char *target);
+extern bool environment_sane();
#endif
diff --git a/src/dbg.h b/src/dbg.h
index a992cb8..afbb21f 100644
--- a/src/dbg.h
+++ b/src/dbg.h
@@ -34,9 +34,9 @@
#define log_err(...) LOG_HELPER(_FILENAME, __LINE__, __VA_ARGS__)
#define fatal(...) \
- {FATAL_HELPER(__VA_ARGS__, strerror(errno)); exit(EXIT_FAILURE);}
+ ({FATAL_HELPER(__VA_ARGS__, strerror(errno)); exit(EXIT_FAILURE);})
#define fatal_(f,l,...) \
- {FATAL_HELPER_(f, l, __VA_ARGS__, strerror(errno)); exit(EXIT_FAILURE);}
+ ({FATAL_HELPER_(f, l, __VA_ARGS__, strerror(errno)); exit(EXIT_FAILURE);})
#define assert_str_equal(a,b) ({ \
if (strcmp(a, b)) { \
diff --git a/src/filepath.c b/src/filepath.c
index d31a008..ff1b476 100644
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -128,20 +128,26 @@ off_t fsize(const char *fn) {
return st.st_size;
}
-/* Create the directory dir, while removing other 'files' with the same name. */
-void mkdirp(const char *dir) {
+/* Create the directory dir, while removing other 'files' with the same name.
+ Returns true if the directory had to be created or false if it existed */
+// TODO: fix confusing name
+bool mkdirp(const char *dir) {
struct stat st;
if (stat(dir, &st)) {
+ /* dir doesn't exist or stat failed */
if (errno != ENOENT)
fatal(ERRM_STAT, dir);
if (mkdir(dir, 0755))
fatal(ERRM_MKDIR, dir);
+ return 1;
} else {
if (!S_ISDIR(st.st_mode)) {
if (remove(dir))
fatal(ERRM_REMOVE, dir);
if (mkdir(dir, 0755))
fatal(ERRM_MKDIR, dir);
+ return 1;
}
+ return 0;
}
}
diff --git a/src/filepath.h b/src/filepath.h
index fd80768..3eb68ba 100644
--- a/src/filepath.h
+++ b/src/filepath.h
@@ -19,6 +19,6 @@ extern char *transform_path(const char *target);
extern char *xbasename(const char *path);
extern bool fexists(const char *target);
extern off_t fsize(const char *fn);
-extern void mkdirp(const char *dir);
+extern bool mkdirp(const char *dir);
#endif
diff --git a/src/redo-ifchange.c b/src/redo-ifchange.c
index e95e92e..75bd984 100644
--- a/src/redo-ifchange.c
+++ b/src/redo-ifchange.c
@@ -13,6 +13,12 @@
#include "dbg.h"
int main(int argc, char *argv[]) {
+ if (!environment_sane()) {
+ fprintf(stderr, "redo: environment variables are missing, \
+ please use %s only in do scripts.\n", argv[0]);
+ exit(1);
+ }
+
for (int i = 1; i < argc; ++i) {
/*debug("Testing if %s is up-to-date ...\n", argv[i]);*/
if (has_changed(argv[i], 'c', false)) {
@@ -23,4 +29,6 @@ int main(int argc, char *argv[]) {
}
add_dep(argv[i], NULL, 'c');
}
+
+ return 0;
}
diff --git a/src/redo.c b/src/redo.c
index cb6ad19..a178edb 100644
--- a/src/redo.c
+++ b/src/redo.c
@@ -26,10 +26,10 @@ static inline unsigned digits(unsigned n) {
return n ? 1 + digits(n/10) : n;
}
-int main(int argc, char *argv[]) {
+void prepare_env() {
/* create the dependency store if it doesn't already exist */
- mkdirp(".redo");
- mkdirp(".redo/deps");
+ if (mkdirp(".redo") && mkdirp(".redo/deps"))
+ fprintf(stderr, "redo: creating dependency store ...\n");
/* set REDO_ROOT */
char *cwd = getcwd(NULL, 0);
@@ -43,11 +43,12 @@ int main(int argc, char *argv[]) {
srand(time(NULL));
char magic_str[digits(UINT_MAX) + 1];
sprintf(magic_str, "%u", rand());
-
- debug("magic number: %s\n", magic_str);
-
if (setenv("REDO_MAGIC", magic_str, 0))
fatal("setenv()");
+}
+
+int main(int argc, char *argv[]) {
+ prepare_env();
if (argc < 2) {
build_target("all");