Merge branch 'jc/reflog' into lj/refs

* jc/reflog:
  sha1_name.c: avoid compilation warnings.
  ref-log: allow ref@{count} syntax.
This commit is contained in:
Junio C Hamano 2006-10-26 18:48:30 -07:00
commit 2e6d8f181d
3 changed files with 32 additions and 20 deletions

6
refs.c
View File

@ -806,7 +806,7 @@ int write_ref_sha1(struct ref_lock *lock,
return 0; return 0;
} }
int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1) int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1)
{ {
const char *logfile, *logdata, *logend, *rec, *lastgt, *lastrec; const char *logfile, *logdata, *logend, *rec, *lastgt, *lastrec;
char *tz_c; char *tz_c;
@ -839,7 +839,7 @@ int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1)
if (!lastgt) if (!lastgt)
die("Log %s is corrupt.", logfile); die("Log %s is corrupt.", logfile);
date = strtoul(lastgt + 1, &tz_c, 10); date = strtoul(lastgt + 1, &tz_c, 10);
if (date <= at_time) { if (date <= at_time || cnt == 0) {
if (lastrec) { if (lastrec) {
if (get_sha1_hex(lastrec, logged_sha1)) if (get_sha1_hex(lastrec, logged_sha1))
die("Log %s is corrupt.", logfile); die("Log %s is corrupt.", logfile);
@ -870,6 +870,8 @@ int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1)
return 0; return 0;
} }
lastrec = rec; lastrec = rec;
if (cnt > 0)
cnt--;
} }
rec = logdata; rec = logdata;

2
refs.h
View File

@ -39,7 +39,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); 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. **/ /** Reads log for the value of ref during at_time. **/
extern int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1); extern int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1);
/** Returns 0 if target has the right format for a ref. **/ /** Returns 0 if target has the right format for a ref. **/
extern int check_ref_format(const char *target); extern int check_ref_format(const char *target);

View File

@ -249,26 +249,25 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
static const char *warning = "warning: refname '%.*s' is ambiguous.\n"; static const char *warning = "warning: refname '%.*s' is ambiguous.\n";
const char **p, *ref; const char **p, *ref;
char *real_ref = NULL; char *real_ref = NULL;
int refs_found = 0, am; int refs_found = 0;
unsigned long at_time = (unsigned long)-1; int at, reflog_len;
unsigned char *this_result; unsigned char *this_result;
unsigned char sha1_from_ref[20]; unsigned char sha1_from_ref[20];
if (len == 40 && !get_sha1_hex(str, sha1)) if (len == 40 && !get_sha1_hex(str, sha1))
return 0; return 0;
/* At a given period of time? "@{2 hours ago}" */ /* basic@{time or number} format to query ref-log */
for (am = 1; am < len - 1; am++) { reflog_len = at = 0;
if (str[am] == '@' && str[am+1] == '{' && str[len-1] == '}') { if (str[len-1] == '}') {
int date_len = len - am - 3; for (at = 1; at < len - 1; at++) {
char *date_spec = xmalloc(date_len + 1); if (str[at] == '@' && str[at+1] == '{') {
strlcpy(date_spec, str + am + 2, date_len + 1); reflog_len = (len-1) - (at+2);
at_time = approxidate(date_spec); len = at;
free(date_spec);
len = am;
break; break;
} }
} }
}
/* Accept only unambiguous ref paths. */ /* Accept only unambiguous ref paths. */
if (ambiguous_path(str, len)) if (ambiguous_path(str, len))
@ -291,11 +290,22 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
if (warn_ambiguous_refs && refs_found > 1) if (warn_ambiguous_refs && refs_found > 1)
fprintf(stderr, warning, len, str); fprintf(stderr, warning, len, str);
if (at_time != (unsigned long)-1) { if (reflog_len) {
read_ref_at( /* Is it asking for N-th entry, or approxidate? */
real_ref, int nth, i;
at_time, unsigned long at_time;
sha1); for (i = nth = 0; 0 <= nth && i < reflog_len; i++) {
char ch = str[at+2+i];
if ('0' <= ch && ch <= '9')
nth = nth * 10 + ch - '0';
else
nth = -1;
}
if (0 <= nth)
at_time = 0;
else
at_time = approxidate(str + at + 2);
read_ref_at(real_ref, at_time, nth, sha1);
} }
free(real_ref); free(real_ref);