static void read_props(void) { uint32_t len; uint32_t key = ~0; char *val = NULL; char *t; while ((t = buffer_read_line()) && strcmp(t, "PROPS-END")) { if (!strncmp(t, "K ", 2)) { len = atoi(&t[2]); key = pool_intern(buffer_read_string(len)); buffer_read_line(); } else if (!strncmp(t, "V ", 2)) { len = atoi(&t[2]); val = buffer_read_string(len); if (key == keys.svn_log) { /* Value length excludes terminating nul. */ rev_ctx.log = log_copy(len + 1, val); } else if (key == keys.svn_author) { rev_ctx.author = pool_intern(val); } else if (key == keys.svn_date) { if (parse_date_basic(val, &rev_ctx.timestamp, NULL)) fprintf(stderr, "Invalid timestamp: %s\n", val); } else if (key == keys.svn_executable) { node_ctx.type = REPO_MODE_EXE; } else if (key == keys.svn_special) { node_ctx.type = REPO_MODE_LNK; } key = ~0; buffer_read_line(); } } }
int parse_date(const char *date, char *result, int maxlen) { unsigned long timestamp; int offset; if (parse_date_basic(date, ×tamp, &offset)) return -1; return date_string(timestamp, offset, result, maxlen); }
int parse_date(const char *date, struct strbuf *result) { unsigned long timestamp; int offset; if (parse_date_basic(date, ×tamp, &offset)) return -1; date_string(timestamp, offset, result); return 0; }
unsigned long approxidate_relative(const char *date, const struct timeval *tv) { unsigned long timestamp; int offset; int errors = 0; if (!parse_date_basic(date, ×tamp, &offset)) return timestamp; return approxidate_str(date, tv, &errors); }
static void handle_property(const struct strbuf *key_buf, struct strbuf *val, uint32_t *type_set) { const char *key = key_buf->buf; size_t keylen = key_buf->len; switch (keylen + 1) { case sizeof("svn:log"): if (constcmp(key, "svn:log")) break; if (!val) die("invalid dump: unsets svn:log"); strbuf_swap(&rev_ctx.log, val); break; case sizeof("svn:author"): if (constcmp(key, "svn:author")) break; if (!val) strbuf_reset(&rev_ctx.author); else strbuf_swap(&rev_ctx.author, val); break; case sizeof("svn:date"): if (constcmp(key, "svn:date")) break; if (!val) die("invalid dump: unsets svn:date"); if (parse_date_basic(val->buf, &rev_ctx.timestamp, NULL)) warning("invalid timestamp: %s", val->buf); break; case sizeof("svn:executable"): case sizeof("svn:special"): if (keylen == strlen("svn:executable") && constcmp(key, "svn:executable")) break; if (keylen == strlen("svn:special") && constcmp(key, "svn:special")) break; if (*type_set) { if (!val) return; die("invalid dump: sets type twice"); } if (!val) { node_ctx.type = REPO_MODE_BLB; return; } *type_set = 1; node_ctx.type = keylen == strlen("svn:executable") ? REPO_MODE_EXE : REPO_MODE_LNK; } }
int git__date_parse(git_time_t *out, const char *date) { struct timeval tv; git_time_t timestamp; int offset, error_ret=0; if (!parse_date_basic(date, ×tamp, &offset)) { *out = timestamp; return 0; } p_gettimeofday(&tv, NULL); *out = approxidate_str(date, &tv, &error_ret); return error_ret; }
int approxidate(const char *date, struct timeval *tv) { int offset; if (!parse_date_basic(date, tv, &offset)) { return 0; } gettimeofday(tv, NULL); if (!approxidate_str(date, tv)) { return 0; } return -1; }
unsigned long approxidate_careful(const char *date, int *error_ret) { struct timeval tv; unsigned long timestamp; int offset; int dummy = 0; if (!error_ret) error_ret = &dummy; if (!parse_date_basic(date, ×tamp, &offset)) { *error_ret = 0; return timestamp; } gettimeofday(&tv, NULL); return approxidate_str(date, &tv, error_ret); }
int git__date_parse(git_time_t *out, const char *date) { time_t time_sec; git_time_t timestamp; int offset, error_ret=0; if (!parse_date_basic(date, ×tamp, &offset)) { *out = timestamp; return 0; } if (time(&time_sec) == -1) return -1; *out = approxidate_str(date, time_sec, &error_ret); return error_ret; }