mirror of
https://github.com/git/git.git
synced 2024-11-24 02:17:02 +08:00
Merge branch 'rs/reflog-exists'
* rs/reflog-exists: checkout.c: use ref_exists instead of file_exist refs.c: add new functions reflog_exists and delete_reflog
This commit is contained in:
commit
f7f349e138
@ -651,12 +651,8 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
|
||||
}
|
||||
}
|
||||
if (old->path && old->name) {
|
||||
char log_file[PATH_MAX], ref_file[PATH_MAX];
|
||||
|
||||
git_snpath(log_file, sizeof(log_file), "logs/%s", old->path);
|
||||
git_snpath(ref_file, sizeof(ref_file), "%s", old->path);
|
||||
if (!file_exists(ref_file) && file_exists(log_file))
|
||||
remove_path(log_file);
|
||||
if (!ref_exists(old->path) && reflog_exists(old->path))
|
||||
delete_reflog(old->path);
|
||||
}
|
||||
}
|
||||
remove_branch_state();
|
||||
|
@ -369,7 +369,7 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
|
||||
if (!lock)
|
||||
return error("cannot lock ref '%s'", ref);
|
||||
log_file = git_pathdup("logs/%s", ref);
|
||||
if (!file_exists(log_file))
|
||||
if (!reflog_exists(ref))
|
||||
goto finish;
|
||||
if (!cmd->dry_run) {
|
||||
newlog_path = git_pathdup("logs/%s.lock", ref);
|
||||
|
21
refs.c
21
refs.c
@ -1999,7 +1999,6 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
|
||||
|
||||
*log = NULL;
|
||||
for (p = ref_rev_parse_rules; *p; p++) {
|
||||
struct stat st;
|
||||
unsigned char hash[20];
|
||||
char path[PATH_MAX];
|
||||
const char *ref, *it;
|
||||
@ -2008,12 +2007,9 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
|
||||
ref = resolve_ref_unsafe(path, hash, 1, NULL);
|
||||
if (!ref)
|
||||
continue;
|
||||
if (!stat(git_path("logs/%s", path), &st) &&
|
||||
S_ISREG(st.st_mode))
|
||||
if (reflog_exists(path))
|
||||
it = path;
|
||||
else if (strcmp(ref, path) &&
|
||||
!stat(git_path("logs/%s", ref), &st) &&
|
||||
S_ISREG(st.st_mode))
|
||||
else if (strcmp(ref, path) && reflog_exists(ref))
|
||||
it = ref;
|
||||
else
|
||||
continue;
|
||||
@ -3046,6 +3042,19 @@ int read_ref_at(const char *refname, unsigned long at_time, int cnt,
|
||||
return 1;
|
||||
}
|
||||
|
||||
int reflog_exists(const char *refname)
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
return !lstat(git_path("logs/%s", refname), &st) &&
|
||||
S_ISREG(st.st_mode);
|
||||
}
|
||||
|
||||
int delete_reflog(const char *refname)
|
||||
{
|
||||
return remove_path(git_path("logs/%s", refname));
|
||||
}
|
||||
|
||||
static int show_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn, void *cb_data)
|
||||
{
|
||||
unsigned char osha1[20], nsha1[20];
|
||||
|
6
refs.h
6
refs.h
@ -161,6 +161,12 @@ extern int read_ref_at(const char *refname, unsigned long at_time, int cnt,
|
||||
unsigned char *sha1, char **msg,
|
||||
unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);
|
||||
|
||||
/** Check if a particular reflog exists */
|
||||
extern int reflog_exists(const char *refname);
|
||||
|
||||
/** Delete a reflog */
|
||||
extern int delete_reflog(const char *refname);
|
||||
|
||||
/* iterate over reflog entries */
|
||||
typedef int each_reflog_ent_fn(unsigned char *osha1, unsigned char *nsha1, const char *, unsigned long, int, const char *, void *);
|
||||
int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data);
|
||||
|
@ -245,4 +245,12 @@ test_expect_success 'gc.reflogexpire=false' '
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'checkout should not delete log for packed ref' '
|
||||
test $(git reflog master | wc -l) = 4 &&
|
||||
git branch foo &&
|
||||
git pack-refs --all &&
|
||||
git checkout foo &&
|
||||
test $(git reflog master | wc -l) = 4
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user