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"); | 
