diff options
author | Tharre <tharre3@gmail.com> | 2014-11-11 13:45:14 +0100 |
---|---|---|
committer | Tharre <tharre3@gmail.com> | 2014-11-11 14:03:32 +0100 |
commit | 56f3fa373a76842275b199c9ce14fd8e626bd909 (patch) | |
tree | 3ef552a3041afe97686532a8bec492e2c786505d | |
parent | a07239b0d220fb04dadd6422fd75defa13ee50b9 (diff) | |
download | redo-56f3fa373a76842275b199c9ce14fd8e626bd909.tar.gz redo-56f3fa373a76842275b199c9ce14fd8e626bd909.tar.xz redo-56f3fa373a76842275b199c9ce14fd8e626bd909.zip |
Some refactoring and small fixes.
-rw-r--r-- | src/build.c | 38 | ||||
-rw-r--r-- | src/build.h | 1 | ||||
-rw-r--r-- | src/dbg.h | 4 | ||||
-rw-r--r-- | src/filepath.c | 10 | ||||
-rw-r--r-- | src/filepath.h | 2 | ||||
-rw-r--r-- | src/redo-ifchange.c | 8 | ||||
-rw-r--r-- | src/redo.c | 13 |
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 @@ -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; } @@ -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"); |