зеркало из https://github.com/microsoft/git.git
Merge branch 'js/plug-leaks' into maint
Fix memory leaks pointed out by Coverity (and people). * js/plug-leaks: (26 commits) checkout: fix memory leak submodule_uses_worktrees(): plug memory leak show_worktree(): plug memory leak name-rev: avoid leaking memory in the `deref` case remote: plug memory leak in match_explicit() add_reflog_for_walk: avoid memory leak shallow: avoid memory leak line-log: avoid memory leak receive-pack: plug memory leak in update() fast-export: avoid leaking memory in handle_tag() mktree: plug memory leaks reported by Coverity pack-redundant: plug memory leak setup_discovered_git_dir(): plug memory leak setup_bare_git_dir(): help static analysis split_commit_in_progress(): simplify & fix memory leak checkout: fix memory leak cat-file: fix memory leak mailinfo & mailsplit: check for EOF while parsing status: close file descriptor after reading git-rebase-todo difftool: address a couple of resource/memory leaks ...
This commit is contained in:
Коммит
34bbe2edd4
15
builtin/am.c
15
builtin/am.c
|
@ -1351,19 +1351,16 @@ static int get_mail_commit_oid(struct object_id *commit_id, const char *mail)
|
|||
struct strbuf sb = STRBUF_INIT;
|
||||
FILE *fp = xfopen(mail, "r");
|
||||
const char *x;
|
||||
int ret = 0;
|
||||
|
||||
if (strbuf_getline_lf(&sb, fp))
|
||||
return -1;
|
||||
|
||||
if (!skip_prefix(sb.buf, "From ", &x))
|
||||
return -1;
|
||||
|
||||
if (get_oid_hex(x, commit_id) < 0)
|
||||
return -1;
|
||||
if (strbuf_getline_lf(&sb, fp) ||
|
||||
!skip_prefix(sb.buf, "From ", &x) ||
|
||||
get_oid_hex(x, commit_id) < 0)
|
||||
ret = -1;
|
||||
|
||||
strbuf_release(&sb);
|
||||
fclose(fp);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -165,6 +165,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
|
|||
die("git cat-file %s: bad file", obj_name);
|
||||
|
||||
write_or_die(1, buf, size);
|
||||
free(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -235,22 +235,24 @@ static int checkout_merged(int pos, const struct checkout *state)
|
|||
/*
|
||||
* NEEDSWORK:
|
||||
* There is absolutely no reason to write this as a blob object
|
||||
* and create a phony cache entry just to leak. This hack is
|
||||
* primarily to get to the write_entry() machinery that massages
|
||||
* the contents to work-tree format and writes out which only
|
||||
* allows it for a cache entry. The code in write_entry() needs
|
||||
* to be refactored to allow us to feed a <buffer, size, mode>
|
||||
* instead of a cache entry. Such a refactoring would help
|
||||
* merge_recursive as well (it also writes the merge result to the
|
||||
* object database even when it may contain conflicts).
|
||||
* and create a phony cache entry. This hack is primarily to get
|
||||
* to the write_entry() machinery that massages the contents to
|
||||
* work-tree format and writes out which only allows it for a
|
||||
* cache entry. The code in write_entry() needs to be refactored
|
||||
* to allow us to feed a <buffer, size, mode> instead of a cache
|
||||
* entry. Such a refactoring would help merge_recursive as well
|
||||
* (it also writes the merge result to the object database even
|
||||
* when it may contain conflicts).
|
||||
*/
|
||||
if (write_sha1_file(result_buf.ptr, result_buf.size,
|
||||
blob_type, oid.hash))
|
||||
die(_("Unable to add merge result for '%s'"), path);
|
||||
free(result_buf.ptr);
|
||||
ce = make_cache_entry(mode, oid.hash, path, 2, 0);
|
||||
if (!ce)
|
||||
die(_("make_cache_entry failed for path '%s'"), path);
|
||||
status = checkout_entry(ce, state, NULL);
|
||||
free(ce);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
|
@ -226,6 +226,7 @@ static void changed_files(struct hashmap *result, const char *index_path,
|
|||
hashmap_entry_init(entry, strhash(buf.buf));
|
||||
hashmap_add(result, entry);
|
||||
}
|
||||
fclose(fp);
|
||||
if (finish_command(&diff_files))
|
||||
die("diff-files did not exit properly");
|
||||
strbuf_release(&index_env);
|
||||
|
@ -439,8 +440,10 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
|
|||
}
|
||||
|
||||
if (lmode && status != 'C') {
|
||||
if (checkout_path(lmode, &loid, src_path, &lstate))
|
||||
return error("could not write '%s'", src_path);
|
||||
if (checkout_path(lmode, &loid, src_path, &lstate)) {
|
||||
ret = error("could not write '%s'", src_path);
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
|
||||
if (rmode && !S_ISLNK(rmode)) {
|
||||
|
@ -456,9 +459,12 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
|
|||
hashmap_add(&working_tree_dups, entry);
|
||||
|
||||
if (!use_wt_file(workdir, dst_path, &roid)) {
|
||||
if (checkout_path(rmode, &roid, dst_path, &rstate))
|
||||
return error("could not write '%s'",
|
||||
dst_path);
|
||||
if (checkout_path(rmode, &roid, dst_path,
|
||||
&rstate)) {
|
||||
ret = error("could not write '%s'",
|
||||
dst_path);
|
||||
goto finish;
|
||||
}
|
||||
} else if (!is_null_oid(&roid)) {
|
||||
/*
|
||||
* Changes in the working tree need special
|
||||
|
@ -473,10 +479,12 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
|
|||
ADD_CACHE_JUST_APPEND);
|
||||
|
||||
add_path(&rdir, rdir_len, dst_path);
|
||||
if (ensure_leading_directories(rdir.buf))
|
||||
return error("could not create "
|
||||
"directory for '%s'",
|
||||
dst_path);
|
||||
if (ensure_leading_directories(rdir.buf)) {
|
||||
ret = error("could not create "
|
||||
"directory for '%s'",
|
||||
dst_path);
|
||||
goto finish;
|
||||
}
|
||||
add_path(&wtdir, wtdir_len, dst_path);
|
||||
if (symlinks) {
|
||||
if (symlink(wtdir.buf, rdir.buf)) {
|
||||
|
@ -497,13 +505,15 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
|
|||
}
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
fp = NULL;
|
||||
if (finish_command(&child)) {
|
||||
ret = error("error occurred running diff --raw");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (!i)
|
||||
return 0;
|
||||
goto finish;
|
||||
|
||||
/*
|
||||
* Changes to submodules require special treatment.This loop writes a
|
||||
|
@ -626,6 +636,9 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
|
|||
exit_cleanup(tmpdir, rc);
|
||||
|
||||
finish:
|
||||
if (fp)
|
||||
fclose(fp);
|
||||
|
||||
free(lbase_dir);
|
||||
free(rbase_dir);
|
||||
strbuf_release(&ldir);
|
||||
|
|
|
@ -734,6 +734,7 @@ static void handle_tag(const char *name, struct tag *tag)
|
|||
oid_to_hex(&tag->object.oid));
|
||||
case DROP:
|
||||
/* Ignore this tag altogether */
|
||||
free(buf);
|
||||
return;
|
||||
case REWRITE:
|
||||
if (tagged->type != OBJ_COMMIT) {
|
||||
|
@ -765,6 +766,7 @@ static void handle_tag(const char *name, struct tag *tag)
|
|||
(int)(tagger_end - tagger), tagger,
|
||||
tagger == tagger_end ? "" : "\n",
|
||||
(int)message_size, (int)message_size, message ? message : "");
|
||||
free(buf);
|
||||
}
|
||||
|
||||
static struct commit *get_commit(struct rev_cmdline_entry *e, char *full_name)
|
||||
|
|
|
@ -232,6 +232,16 @@ static int split_mbox(const char *file, const char *dir, int allow_bare,
|
|||
|
||||
do {
|
||||
peek = fgetc(f);
|
||||
if (peek == EOF) {
|
||||
if (f == stdin)
|
||||
/* empty stdin is OK */
|
||||
ret = skip;
|
||||
else {
|
||||
fclose(f);
|
||||
error(_("empty mbox: '%s'"), file);
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
} while (isspace(peek));
|
||||
ungetc(peek, f);
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_miss
|
|||
unsigned mode;
|
||||
enum object_type mode_type; /* object type derived from mode */
|
||||
enum object_type obj_type; /* object type derived from sha */
|
||||
char *path;
|
||||
char *path, *to_free = NULL;
|
||||
unsigned char sha1[20];
|
||||
|
||||
ptr = buf;
|
||||
|
@ -102,7 +102,7 @@ static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_miss
|
|||
struct strbuf p_uq = STRBUF_INIT;
|
||||
if (unquote_c_style(&p_uq, path, NULL))
|
||||
die("invalid quoting");
|
||||
path = strbuf_detach(&p_uq, NULL);
|
||||
path = to_free = strbuf_detach(&p_uq, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -136,6 +136,7 @@ static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_miss
|
|||
}
|
||||
|
||||
append_to_tree(mode, sha1, path);
|
||||
free(to_free);
|
||||
}
|
||||
|
||||
int cmd_mktree(int ac, const char **av, const char *prefix)
|
||||
|
|
|
@ -28,6 +28,7 @@ static void name_rev(struct commit *commit,
|
|||
struct rev_name *name = (struct rev_name *)commit->util;
|
||||
struct commit_list *parents;
|
||||
int parent_number = 1;
|
||||
char *to_free = NULL;
|
||||
|
||||
parse_commit(commit);
|
||||
|
||||
|
@ -35,7 +36,7 @@ static void name_rev(struct commit *commit,
|
|||
return;
|
||||
|
||||
if (deref) {
|
||||
tip_name = xstrfmt("%s^0", tip_name);
|
||||
tip_name = to_free = xstrfmt("%s^0", tip_name);
|
||||
|
||||
if (generation)
|
||||
die("generation: %d, but deref?", generation);
|
||||
|
@ -53,8 +54,10 @@ copy_data:
|
|||
name->taggerdate = taggerdate;
|
||||
name->generation = generation;
|
||||
name->distance = distance;
|
||||
} else
|
||||
} else {
|
||||
free(to_free);
|
||||
return;
|
||||
}
|
||||
|
||||
for (parents = commit->parents;
|
||||
parents;
|
||||
|
|
|
@ -442,6 +442,7 @@ static void minimize(struct pack_list **min)
|
|||
/* return if there are no objects missing from the unique set */
|
||||
if (missing->size == 0) {
|
||||
*min = unique;
|
||||
free(missing);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -986,7 +986,8 @@ static const char *update(struct command *cmd, struct shallow_info *si)
|
|||
{
|
||||
const char *name = cmd->ref_name;
|
||||
struct strbuf namespaced_name_buf = STRBUF_INIT;
|
||||
const char *namespaced_name, *ret;
|
||||
static char *namespaced_name;
|
||||
const char *ret;
|
||||
struct object_id *old_oid = &cmd->old_oid;
|
||||
struct object_id *new_oid = &cmd->new_oid;
|
||||
|
||||
|
@ -997,6 +998,7 @@ static const char *update(struct command *cmd, struct shallow_info *si)
|
|||
}
|
||||
|
||||
strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
|
||||
free(namespaced_name);
|
||||
namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
|
||||
|
||||
if (is_ref_checked_out(namespaced_name)) {
|
||||
|
|
|
@ -414,9 +414,11 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
|
|||
find_unique_abbrev(wt->head_sha1, DEFAULT_ABBREV));
|
||||
if (wt->is_detached)
|
||||
strbuf_addstr(&sb, "(detached HEAD)");
|
||||
else if (wt->head_ref)
|
||||
strbuf_addf(&sb, "[%s]", shorten_unambiguous_ref(wt->head_ref, 0));
|
||||
else
|
||||
else if (wt->head_ref) {
|
||||
char *ref = shorten_unambiguous_ref(wt->head_ref, 0);
|
||||
strbuf_addf(&sb, "[%s]", ref);
|
||||
free(ref);
|
||||
} else
|
||||
strbuf_addstr(&sb, "(error)");
|
||||
}
|
||||
printf("%s\n", sb.buf);
|
||||
|
|
|
@ -961,8 +961,10 @@ static char **get_path_split(void)
|
|||
++n;
|
||||
}
|
||||
}
|
||||
if (!n)
|
||||
if (!n) {
|
||||
free(envpath);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ALLOC_ARRAY(path, n + 1);
|
||||
p = envpath;
|
||||
|
|
|
@ -105,6 +105,13 @@ static int is_console(int fd)
|
|||
if (!fd) {
|
||||
if (!GetConsoleMode(hcon, &mode))
|
||||
return 0;
|
||||
/*
|
||||
* This code path is only reached if there is no console
|
||||
* attached to stdout/stderr, i.e. we will not need to output
|
||||
* any text to any console, therefore we might just as well
|
||||
* use black as foreground color.
|
||||
*/
|
||||
sbi.wAttributes = 0;
|
||||
} else if (!GetConsoleScreenBufferInfo(hcon, &sbi))
|
||||
return 0;
|
||||
|
||||
|
@ -133,6 +140,11 @@ static void write_console(unsigned char *str, size_t len)
|
|||
|
||||
/* convert utf-8 to utf-16 */
|
||||
int wlen = xutftowcsn(wbuf, (char*) str, ARRAY_SIZE(wbuf), len);
|
||||
if (wlen < 0) {
|
||||
wchar_t *err = L"[invalid]";
|
||||
WriteConsoleW(console, err, wcslen(err), &dummy, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
/* write directly to console */
|
||||
WriteConsoleW(console, wbuf, wlen, &dummy, NULL);
|
||||
|
|
5
config.c
5
config.c
|
@ -2621,7 +2621,7 @@ int git_config_rename_section_in_file(const char *config_filename,
|
|||
struct lock_file *lock;
|
||||
int out_fd;
|
||||
char buf[1024];
|
||||
FILE *config_file;
|
||||
FILE *config_file = NULL;
|
||||
struct stat st;
|
||||
|
||||
if (new_name && !section_name_is_ok(new_name)) {
|
||||
|
@ -2703,11 +2703,14 @@ int git_config_rename_section_in_file(const char *config_filename,
|
|||
}
|
||||
}
|
||||
fclose(config_file);
|
||||
config_file = NULL;
|
||||
commit_and_out:
|
||||
if (commit_lock_file(lock) < 0)
|
||||
ret = error_errno("could not write config file %s",
|
||||
config_filename);
|
||||
out:
|
||||
if (config_file)
|
||||
fclose(config_file);
|
||||
rollback_lock_file(lock);
|
||||
out_no_rollback:
|
||||
free(filename_buf);
|
||||
|
|
|
@ -1125,6 +1125,7 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c
|
|||
changed = process_all_files(&parent_range, rev, &queue, range);
|
||||
if (parent)
|
||||
add_line_range(rev, parent, parent_range);
|
||||
free_line_log_data(parent_range);
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
|
|
@ -882,7 +882,10 @@ static int read_one_header_line(struct strbuf *line, FILE *in)
|
|||
for (;;) {
|
||||
int peek;
|
||||
|
||||
peek = fgetc(in); ungetc(peek, in);
|
||||
peek = fgetc(in);
|
||||
if (peek == EOF)
|
||||
break;
|
||||
ungetc(peek, in);
|
||||
if (peek != ' ' && peek != '\t')
|
||||
break;
|
||||
if (strbuf_getline_lf(&continuation, in))
|
||||
|
@ -1099,6 +1102,10 @@ int mailinfo(struct mailinfo *mi, const char *msg, const char *patch)
|
|||
|
||||
do {
|
||||
peek = fgetc(mi->input);
|
||||
if (peek == EOF) {
|
||||
fclose(cmitmsg);
|
||||
return error("empty patch: '%s'", patch);
|
||||
}
|
||||
} while (isspace(peek));
|
||||
ungetc(peek, mi->input);
|
||||
|
||||
|
|
|
@ -99,11 +99,12 @@ struct patch_id *has_commit_patch_id(struct commit *commit,
|
|||
struct patch_id *add_commit_patch_id(struct commit *commit,
|
||||
struct patch_ids *ids)
|
||||
{
|
||||
struct patch_id *key = xcalloc(1, sizeof(*key));
|
||||
struct patch_id *key;
|
||||
|
||||
if (!patch_id_defined(commit))
|
||||
return NULL;
|
||||
|
||||
key = xcalloc(1, sizeof(*key));
|
||||
if (init_patch_id_entry(key, commit, ids)) {
|
||||
free(key);
|
||||
return NULL;
|
||||
|
|
|
@ -183,7 +183,11 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
|
|||
if (!reflogs || reflogs->nr == 0) {
|
||||
struct object_id oid;
|
||||
char *b;
|
||||
if (dwim_log(branch, strlen(branch), oid.hash, &b) == 1) {
|
||||
int ret = dwim_log(branch, strlen(branch),
|
||||
oid.hash, &b);
|
||||
if (ret > 1)
|
||||
free(b);
|
||||
else if (ret == 1) {
|
||||
if (reflogs) {
|
||||
free(reflogs->ref);
|
||||
free(reflogs);
|
||||
|
@ -193,17 +197,27 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
|
|||
reflogs = read_complete_reflog(branch);
|
||||
}
|
||||
}
|
||||
if (!reflogs || reflogs->nr == 0)
|
||||
if (!reflogs || reflogs->nr == 0) {
|
||||
if (reflogs) {
|
||||
free(reflogs->ref);
|
||||
free(reflogs);
|
||||
}
|
||||
free(branch);
|
||||
return -1;
|
||||
}
|
||||
string_list_insert(&info->complete_reflogs, branch)->util
|
||||
= reflogs;
|
||||
}
|
||||
free(branch);
|
||||
|
||||
commit_reflog = xcalloc(1, sizeof(struct commit_reflog));
|
||||
if (recno < 0) {
|
||||
commit_reflog->recno = get_reflog_recno_by_time(reflogs, timestamp);
|
||||
if (commit_reflog->recno < 0) {
|
||||
free(branch);
|
||||
if (reflogs) {
|
||||
free(reflogs->ref);
|
||||
free(reflogs);
|
||||
}
|
||||
free(commit_reflog);
|
||||
return -1;
|
||||
}
|
||||
|
|
5
remote.c
5
remote.c
|
@ -1191,9 +1191,10 @@ static int match_explicit(struct ref *src, struct ref *dst,
|
|||
else if (is_null_oid(&matched_src->new_oid))
|
||||
error("unable to delete '%s': remote ref does not exist",
|
||||
dst_value);
|
||||
else if ((dst_guess = guess_ref(dst_value, matched_src)))
|
||||
else if ((dst_guess = guess_ref(dst_value, matched_src))) {
|
||||
matched_dst = make_linked_ref(dst_guess, dst_tail);
|
||||
else
|
||||
free(dst_guess);
|
||||
} else
|
||||
error("unable to push to unqualified destination: %s\n"
|
||||
"The destination refspec neither matches an "
|
||||
"existing ref on the remote nor\n"
|
||||
|
|
11
setup.c
11
setup.c
|
@ -703,11 +703,16 @@ static const char *setup_discovered_git_dir(const char *gitdir,
|
|||
|
||||
/* --work-tree is set without --git-dir; use discovered one */
|
||||
if (getenv(GIT_WORK_TREE_ENVIRONMENT) || git_work_tree_cfg) {
|
||||
char *to_free = NULL;
|
||||
const char *ret;
|
||||
|
||||
if (offset != cwd->len && !is_absolute_path(gitdir))
|
||||
gitdir = real_pathdup(gitdir, 1);
|
||||
gitdir = to_free = real_pathdup(gitdir, 1);
|
||||
if (chdir(cwd->buf))
|
||||
die_errno("Could not come back to cwd");
|
||||
return setup_explicit_git_dir(gitdir, cwd, nongit_ok);
|
||||
ret = setup_explicit_git_dir(gitdir, cwd, nongit_ok);
|
||||
free(to_free);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* #16.2, #17.2, #20.2, #21.2, #24, #25, #28, #29 (see t1510) */
|
||||
|
@ -748,7 +753,7 @@ static const char *setup_bare_git_dir(struct strbuf *cwd, int offset,
|
|||
|
||||
/* --work-tree is set without --git-dir; use discovered one */
|
||||
if (getenv(GIT_WORK_TREE_ENVIRONMENT) || git_work_tree_cfg) {
|
||||
const char *gitdir;
|
||||
static const char *gitdir;
|
||||
|
||||
gitdir = offset == cwd->len ? "." : xmemdupz(cwd->buf, offset);
|
||||
if (chdir(cwd->buf))
|
||||
|
|
|
@ -473,11 +473,15 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
|
|||
struct commit_list *head = NULL;
|
||||
int bitmap_nr = (info->nr_bits + 31) / 32;
|
||||
size_t bitmap_size = st_mult(sizeof(uint32_t), bitmap_nr);
|
||||
uint32_t *tmp = xmalloc(bitmap_size); /* to be freed before return */
|
||||
uint32_t *bitmap = paint_alloc(info);
|
||||
struct commit *c = lookup_commit_reference_gently(sha1, 1);
|
||||
uint32_t *tmp; /* to be freed before return */
|
||||
uint32_t *bitmap;
|
||||
|
||||
if (!c)
|
||||
return;
|
||||
|
||||
tmp = xmalloc(bitmap_size);
|
||||
bitmap = paint_alloc(info);
|
||||
memset(bitmap, 0, bitmap_size);
|
||||
bitmap[id / 32] |= (1U << (id % 32));
|
||||
commit_list_insert(c, &head);
|
||||
|
|
|
@ -399,6 +399,7 @@ int submodule_uses_worktrees(const char *path)
|
|||
|
||||
/* The env would be set for the superproject. */
|
||||
get_common_dir_noenv(&sb, submodule_gitdir);
|
||||
free(submodule_gitdir);
|
||||
|
||||
/*
|
||||
* The check below is only known to be good for repository format
|
||||
|
@ -418,7 +419,6 @@ int submodule_uses_worktrees(const char *path)
|
|||
/* See if there is any file inside the worktrees directory. */
|
||||
dir = opendir(sb.buf);
|
||||
strbuf_release(&sb);
|
||||
free(submodule_gitdir);
|
||||
|
||||
if (!dir)
|
||||
return 0;
|
||||
|
|
29
wt-status.c
29
wt-status.c
|
@ -1082,29 +1082,29 @@ static char *read_line_from_git_path(const char *filename)
|
|||
static int split_commit_in_progress(struct wt_status *s)
|
||||
{
|
||||
int split_in_progress = 0;
|
||||
char *head = read_line_from_git_path("HEAD");
|
||||
char *orig_head = read_line_from_git_path("ORIG_HEAD");
|
||||
char *rebase_amend = read_line_from_git_path("rebase-merge/amend");
|
||||
char *rebase_orig_head = read_line_from_git_path("rebase-merge/orig-head");
|
||||
char *head, *orig_head, *rebase_amend, *rebase_orig_head;
|
||||
|
||||
if (!head || !orig_head || !rebase_amend || !rebase_orig_head ||
|
||||
if ((!s->amend && !s->nowarn && !s->workdir_dirty) ||
|
||||
!s->branch || strcmp(s->branch, "HEAD"))
|
||||
return split_in_progress;
|
||||
return 0;
|
||||
|
||||
if (!strcmp(rebase_amend, rebase_orig_head)) {
|
||||
if (strcmp(head, rebase_amend))
|
||||
split_in_progress = 1;
|
||||
} else if (strcmp(orig_head, rebase_orig_head)) {
|
||||
head = read_line_from_git_path("HEAD");
|
||||
orig_head = read_line_from_git_path("ORIG_HEAD");
|
||||
rebase_amend = read_line_from_git_path("rebase-merge/amend");
|
||||
rebase_orig_head = read_line_from_git_path("rebase-merge/orig-head");
|
||||
|
||||
if (!head || !orig_head || !rebase_amend || !rebase_orig_head)
|
||||
; /* fall through, no split in progress */
|
||||
else if (!strcmp(rebase_amend, rebase_orig_head))
|
||||
split_in_progress = !!strcmp(head, rebase_amend);
|
||||
else if (strcmp(orig_head, rebase_orig_head))
|
||||
split_in_progress = 1;
|
||||
}
|
||||
|
||||
if (!s->amend && !s->nowarn && !s->workdir_dirty)
|
||||
split_in_progress = 0;
|
||||
|
||||
free(head);
|
||||
free(orig_head);
|
||||
free(rebase_amend);
|
||||
free(rebase_orig_head);
|
||||
|
||||
return split_in_progress;
|
||||
}
|
||||
|
||||
|
@ -1168,6 +1168,7 @@ static int read_rebase_todolist(const char *fname, struct string_list *lines)
|
|||
abbrev_sha1_in_line(&line);
|
||||
string_list_append(lines, line.buf);
|
||||
}
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче