Skip to content

Commit

Permalink
Extend read_ref_at() to be usable from places other than sha1_name.
Browse files Browse the repository at this point in the history
You can pass an extra argument to the function to receive the
reflog message information.  Also when the log does not go back
beyond the point the user asked, the cut-off time and count are
given back to the caller for emitting the error messages as
appropriately.

We could later add configuration for get_sha1_basic() to make it
an error instead of it being just a warning.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Jan 20, 2007
1 parent e86eb66 commit 16d7cc9
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 13 deletions.
41 changes: 33 additions & 8 deletions refs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion refs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down
16 changes: 15 additions & 1 deletion sha1_name.c
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions t/t1400-update-ref.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 16d7cc9

Please sign in to comment.