diff options
-rw-r--r-- | refs.c | 41 | ||||
-rw-r--r-- | refs.h | 2 | ||||
-rw-r--r-- | sha1_name.c | 16 | ||||
-rwxr-xr-x | t/t1400-update-ref.sh | 6 |
4 files changed, 52 insertions, 13 deletions
@@ -1017,7 +1017,21 @@ int write_ref_sha1(struct ref_lock *lock, return 0; } -int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1) +static char *ref_msg(const char *line, const char *endp) +{ + const char *ep; + char *msg; + + line += 82; + for (ep = line; ep < endp && *ep != '\n'; ep++) + ; + msg = xmalloc(ep - line + 1); + memcpy(msg, line, ep - line); + msg[ep - line] = 0; + return msg; +} + +int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1, char **msg, unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt) { const char *logfile, *logdata, *logend, *rec, *lastgt, *lastrec; char *tz_c; @@ -1054,6 +1068,14 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char * die("Log %s is corrupt.", logfile); date = strtoul(lastgt + 1, &tz_c, 10); if (date <= at_time || cnt == 0) { + if (msg) + *msg = ref_msg(rec, logend); + if (cutoff_time) + *cutoff_time = date; + if (cutoff_tz) + *cutoff_tz = tz; + if (cutoff_cnt) + *cutoff_cnt = reccnt; if (lastrec) { if (get_sha1_hex(lastrec, logged_sha1)) die("Log %s is corrupt.", logfile); @@ -1097,14 +1119,17 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char * tz = strtoul(tz_c, NULL, 10); if (get_sha1_hex(logdata, sha1)) die("Log %s is corrupt.", logfile); + if (msg) + *msg = ref_msg(logdata, logend); munmap(log_mapped, st.st_size); - if (at_time) - fprintf(stderr, "warning: Log %s only goes back to %s.\n", - logfile, show_rfc2822_date(date, tz)); - else - fprintf(stderr, "warning: Log %s only has %d entries.\n", - logfile, reccnt); - return 0; + + if (cutoff_time) + *cutoff_time = date; + if (cutoff_tz) + *cutoff_tz = tz; + if (cutoff_cnt) + *cutoff_cnt = reccnt; + return 1; } int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data) @@ -42,7 +42,7 @@ extern void unlock_ref(struct ref_lock *lock); extern int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1, const char *msg); /** Reads log for the value of ref during at_time. **/ -extern int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1); +extern int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1, char **msg, unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt); /* iterate over reflog entries */ typedef int each_reflog_ent_fn(unsigned char *osha1, unsigned char *nsha1, const char *, unsigned long, int, const char *, void *); diff --git a/sha1_name.c b/sha1_name.c index ae31851900..9dfb3ac574 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -304,6 +304,9 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) /* Is it asking for N-th entry, or approxidate? */ int nth, i; unsigned long at_time; + unsigned long co_time; + int co_tz, co_cnt; + for (i = nth = 0; 0 <= nth && i < reflog_len; i++) { char ch = str[at+2+i]; if ('0' <= ch && ch <= '9') @@ -315,7 +318,18 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) at_time = 0; else at_time = approxidate(str + at + 2); - read_ref_at(real_ref, at_time, nth, sha1); + if (read_ref_at(real_ref, at_time, nth, sha1, NULL, + &co_time, &co_tz, &co_cnt)) { + if (at_time) + fprintf(stderr, + "warning: Log for '%.*s' only goes " + "back to %s.\n", len, str, + show_rfc2822_date(co_time, co_tz)); + else + fprintf(stderr, + "warning: Log for '%.*s' only has " + "%d entries.\n", len, str, co_cnt); + } } free(real_ref); diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index 5637cb5eac..e48e2b7189 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -138,19 +138,19 @@ test_expect_success \ 'rm -f o e git-rev-parse --verify "master@{May 25 2005}" >o 2>e && test '"$C"' = $(cat o) && - test "warning: Log .git/logs/'"$m only goes back to $ed"'." = "$(cat e)"' + test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"' test_expect_success \ "Query master@{2005-05-25} (before history)" \ 'rm -f o e git-rev-parse --verify master@{2005-05-25} >o 2>e && test '"$C"' = $(cat o) && - echo test "warning: Log .git/logs/'"$m only goes back to $ed"'." = "$(cat e)"' + echo test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"' test_expect_success \ 'Query "master@{May 26 2005 23:31:59}" (1 second before history)' \ 'rm -f o e git-rev-parse --verify "master@{May 26 2005 23:31:59}" >o 2>e && test '"$C"' = $(cat o) && - test "warning: Log .git/logs/'"$m only goes back to $ed"'." = "$(cat e)"' + test "warning: Log for '\''master'\'' only goes back to $ed." = "$(cat e)"' test_expect_success \ 'Query "master@{May 26 2005 23:32:00}" (exactly history start)' \ 'rm -f o e |