mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-17 18:59:51 +00:00
Merge pull request #3333 from libgit2/cmn/for-v23
Maintenance updates for v0.23
This commit is contained in:
commit
6a0d569669
@ -143,10 +143,10 @@ int fetch(git_repository *repo, int argc, char **argv)
|
||||
* network.
|
||||
*/
|
||||
if (stats->local_objects > 0) {
|
||||
printf("\rReceived %d/%d objects in %zu bytes (used %d local objects)\n",
|
||||
printf("\rReceived %d/%d objects in %" PRIuZ " bytes (used %d local objects)\n",
|
||||
stats->indexed_objects, stats->total_objects, stats->received_bytes, stats->local_objects);
|
||||
} else{
|
||||
printf("\rReceived %d/%d objects in %zu bytes\n",
|
||||
printf("\rReceived %d/%d objects in %" PRIuZ "bytes\n",
|
||||
stats->indexed_objects, stats->total_objects, stats->received_bytes);
|
||||
}
|
||||
|
||||
|
@ -48,6 +48,7 @@ typedef enum {
|
||||
GIT_EEOF = -20, /**< Unexpected EOF */
|
||||
GIT_EINVALID = -21, /**< Invalid operation or input */
|
||||
GIT_EUNCOMMITTED = -22, /**< Uncommitted changes in index prevented operation */
|
||||
GIT_EDIRECTORY = -23, /**< The operation is not valid for a directory */
|
||||
|
||||
GIT_PASSTHROUGH = -30, /**< Internal only */
|
||||
GIT_ITEROVER = -31, /**< Signals end of iteration with iterator */
|
||||
|
@ -511,6 +511,14 @@ typedef enum {
|
||||
GIT_REMOTE_DOWNLOAD_TAGS_ALL,
|
||||
} git_remote_autotag_option_t;
|
||||
|
||||
/**
|
||||
* Fetch options structure.
|
||||
*
|
||||
* Zero out for defaults. Initialize with `GIT_FETCH_OPTIONS_INIT` macro to
|
||||
* correctly set the `version` field. E.g.
|
||||
*
|
||||
* git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;
|
||||
*/
|
||||
typedef struct {
|
||||
int version;
|
||||
|
||||
@ -739,7 +747,7 @@ GIT_EXTERN(int) git_remote_prune_refs(const git_remote *remote);
|
||||
* stored here for further processing by the caller. Always free this
|
||||
* strarray on successful return.
|
||||
* @param repo the repository in which to rename
|
||||
* @param name the current name of the reamote
|
||||
* @param name the current name of the remote
|
||||
* @param new_name the new name the remote should bear
|
||||
* @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code
|
||||
*/
|
||||
|
@ -304,21 +304,16 @@ static void blame_chunk(
|
||||
}
|
||||
|
||||
static int my_emit(
|
||||
xdfenv_t *xe,
|
||||
xdchange_t *xscr,
|
||||
xdemitcb_t *ecb,
|
||||
xdemitconf_t const *xecfg)
|
||||
long start_a, long count_a,
|
||||
long start_b, long count_b,
|
||||
void *cb_data)
|
||||
{
|
||||
xdchange_t *xch = xscr;
|
||||
GIT_UNUSED(xe);
|
||||
GIT_UNUSED(xecfg);
|
||||
while (xch) {
|
||||
blame_chunk_cb_data *d = ecb->priv;
|
||||
blame_chunk(d->blame, d->tlno, d->plno, xch->i2, d->target, d->parent);
|
||||
d->plno = xch->i1 + xch->chg1;
|
||||
d->tlno = xch->i2 + xch->chg2;
|
||||
xch = xch->next;
|
||||
}
|
||||
blame_chunk_cb_data *d = (blame_chunk_cb_data *)cb_data;
|
||||
|
||||
blame_chunk(d->blame, d->tlno, d->plno, start_b, d->target, d->parent);
|
||||
d->plno = start_a + count_a;
|
||||
d->tlno = start_b + count_b;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -352,7 +347,7 @@ static int diff_hunks(mmfile_t file_a, mmfile_t file_b, void *cb_data)
|
||||
xdemitconf_t xecfg = {0};
|
||||
xdemitcb_t ecb = {0};
|
||||
|
||||
xecfg.emit_func = (void(*)(void))my_emit;
|
||||
xecfg.hunk_func = my_emit;
|
||||
ecb.priv = cb_data;
|
||||
|
||||
trim_common_tail(&file_a, &file_b, 0);
|
||||
|
@ -185,6 +185,12 @@ int git_blob__create_from_paths(
|
||||
(error = git_repository_odb(&odb, repo)) < 0)
|
||||
goto done;
|
||||
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
giterr_set(GITERR_ODB, "cannot create blob from '%s'; it is a directory", content_path);
|
||||
error = GIT_EDIRECTORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (out_st)
|
||||
memcpy(out_st, &st, sizeof(st));
|
||||
|
||||
|
@ -50,16 +50,16 @@ void git_cache_dump_stats(git_cache *cache)
|
||||
if (kh_size(cache->map) == 0)
|
||||
return;
|
||||
|
||||
printf("Cache %p: %d items cached, %d bytes\n",
|
||||
cache, kh_size(cache->map), (int)cache->used_memory);
|
||||
printf("Cache %p: %d items cached, %"PRIdZ" bytes\n",
|
||||
cache, kh_size(cache->map), cache->used_memory);
|
||||
|
||||
kh_foreach_value(cache->map, object, {
|
||||
char oid_str[9];
|
||||
printf(" %s%c %s (%d)\n",
|
||||
printf(" %s%c %s (%"PRIuZ")\n",
|
||||
git_object_type2string(object->type),
|
||||
object->flags == GIT_CACHE_STORE_PARSED ? '*' : ' ',
|
||||
git_oid_tostr(oid_str, sizeof(oid_str), &object->oid),
|
||||
(int)object->size
|
||||
object->size
|
||||
);
|
||||
});
|
||||
}
|
||||
|
@ -1299,8 +1299,8 @@ static int checkout_get_actions(
|
||||
if (counts[CHECKOUT_ACTION__CONFLICT] > 0 &&
|
||||
(data->strategy & GIT_CHECKOUT_ALLOW_CONFLICTS) == 0)
|
||||
{
|
||||
giterr_set(GITERR_CHECKOUT, "%d %s checkout",
|
||||
(int)counts[CHECKOUT_ACTION__CONFLICT],
|
||||
giterr_set(GITERR_CHECKOUT, "%"PRIuZ" %s checkout",
|
||||
counts[CHECKOUT_ACTION__CONFLICT],
|
||||
counts[CHECKOUT_ACTION__CONFLICT] == 1 ?
|
||||
"conflict prevents" : "conflicts prevent");
|
||||
error = GIT_ECONFLICT;
|
||||
|
16
src/filter.c
16
src/filter.c
@ -947,18 +947,20 @@ int git_filter_list_stream_data(
|
||||
{
|
||||
git_vector filter_streams = GIT_VECTOR_INIT;
|
||||
git_writestream *stream_start;
|
||||
int error = 0;
|
||||
int error = 0, close_error;
|
||||
|
||||
git_buf_sanitize(data);
|
||||
|
||||
if ((error = stream_list_init(
|
||||
&stream_start, &filter_streams, filters, target)) == 0 &&
|
||||
(error =
|
||||
stream_start->write(stream_start, data->ptr, data->size)) == 0)
|
||||
error = stream_start->close(stream_start);
|
||||
if ((error = stream_list_init(&stream_start, &filter_streams, filters, target)) < 0)
|
||||
goto out;
|
||||
|
||||
error = stream_start->write(stream_start, data->ptr, data->size);
|
||||
|
||||
out:
|
||||
close_error = stream_start->close(stream_start);
|
||||
stream_list_free(&filter_streams);
|
||||
return error;
|
||||
/* propagate the stream init or write error */
|
||||
return error < 0 ? error : close_error;
|
||||
}
|
||||
|
||||
int git_filter_list_stream_blob(
|
||||
|
24
src/index.c
24
src/index.c
@ -1236,10 +1236,30 @@ int git_index_add_bypath(git_index *index, const char *path)
|
||||
|
||||
assert(index && path);
|
||||
|
||||
if ((ret = index_entry_init(&entry, index, path)) < 0 ||
|
||||
(ret = index_insert(index, &entry, 1, false)) < 0)
|
||||
if ((ret = index_entry_init(&entry, index, path)) == 0)
|
||||
ret = index_insert(index, &entry, 1, false);
|
||||
|
||||
/* If we were given a directory, let's see if it's a submodule */
|
||||
if (ret < 0 && ret != GIT_EDIRECTORY)
|
||||
return ret;
|
||||
|
||||
if (ret == GIT_EDIRECTORY) {
|
||||
git_submodule *sm;
|
||||
git_error_state err;
|
||||
|
||||
giterr_capture(&err, ret);
|
||||
|
||||
ret = git_submodule_lookup(&sm, INDEX_OWNER(index), path);
|
||||
if (ret == GIT_ENOTFOUND)
|
||||
return giterr_restore(&err);
|
||||
else
|
||||
git__free(err.error_msg.message);
|
||||
|
||||
ret = git_submodule_add_to_index(sm, false);
|
||||
git_submodule_free(sm);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Adding implies conflict was resolved, move conflict entries to REUC */
|
||||
if ((ret = index_conflict_to_reuc(index, path)) < 0 && ret != GIT_ENOTFOUND)
|
||||
return ret;
|
||||
|
@ -619,4 +619,4 @@ typedef const char *kh_cstr_t;
|
||||
#define KHASH_MAP_INIT_STR(name, khval_t) \
|
||||
KHASH_INIT(name, kh_cstr_t, khval_t, 1, kh_str_hash_func, kh_str_hash_equal)
|
||||
|
||||
#endif /* __AC_KHASH_H */
|
||||
#endif /* __AC_KHASH_H */
|
||||
|
@ -79,7 +79,7 @@ int merge_bases_many(git_commit_list **out, git_revwalk **walk_out, git_reposito
|
||||
unsigned int i;
|
||||
|
||||
if (length < 2) {
|
||||
giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %u.", length);
|
||||
giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %" PRIuZ ".", length);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -185,7 +185,7 @@ int git_merge_base_octopus(git_oid *out, git_repository *repo, size_t length, co
|
||||
assert(out && repo && input_array);
|
||||
|
||||
if (length < 2) {
|
||||
giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %u.", length);
|
||||
giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %" PRIuZ ".", length);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -2451,7 +2451,7 @@ int git_merge__check_result(git_repository *repo, git_index *index_new)
|
||||
goto done;
|
||||
|
||||
if ((conflicts = index_conflicts + wd_conflicts) > 0) {
|
||||
giterr_set(GITERR_MERGE, "%d uncommitted change%s would be overwritten by merge",
|
||||
giterr_set(GITERR_MERGE, "%" PRIuZ " uncommitted change%s would be overwritten by merge",
|
||||
conflicts, (conflicts != 1) ? "s" : "");
|
||||
error = GIT_ECONFLICT;
|
||||
}
|
||||
|
@ -324,7 +324,9 @@ int openssl_connect(git_stream *stream)
|
||||
|
||||
SSL_set_bio(st->ssl, bio, bio);
|
||||
/* specify the host in case SNI is needed */
|
||||
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
|
||||
SSL_set_tlsext_host_name(st->ssl, st->host);
|
||||
#endif
|
||||
|
||||
if ((ret = SSL_connect(st->ssl)) <= 0)
|
||||
return ssl_set_error(st->ssl, ret);
|
||||
|
11
src/path.c
11
src/path.c
@ -12,6 +12,7 @@
|
||||
#include "win32/posix.h"
|
||||
#include "win32/buffer.h"
|
||||
#include "win32/w32_util.h"
|
||||
#include "win32/version.h"
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
@ -1085,7 +1086,7 @@ int git_path_direach(
|
||||
#if defined(GIT_WIN32) && !defined(__MINGW32__)
|
||||
|
||||
/* Using _FIND_FIRST_EX_LARGE_FETCH may increase performance in Windows 7
|
||||
* and better. Prior versions will ignore this.
|
||||
* and better.
|
||||
*/
|
||||
#ifndef FIND_FIRST_EX_LARGE_FETCH
|
||||
# define FIND_FIRST_EX_LARGE_FETCH 2
|
||||
@ -1099,6 +1100,10 @@ int git_path_diriter_init(
|
||||
git_win32_path path_filter;
|
||||
git_buf hack = {0};
|
||||
|
||||
static int is_win7_or_later = -1;
|
||||
if (is_win7_or_later < 0)
|
||||
is_win7_or_later = git_has_win32_version(6, 1, 0);
|
||||
|
||||
assert(diriter && path);
|
||||
|
||||
memset(diriter, 0, sizeof(git_path_diriter));
|
||||
@ -1122,11 +1127,11 @@ int git_path_diriter_init(
|
||||
|
||||
diriter->handle = FindFirstFileExW(
|
||||
path_filter,
|
||||
FindExInfoBasic,
|
||||
is_win7_or_later ? FindExInfoBasic : FindExInfoStandard,
|
||||
&diriter->current,
|
||||
FindExSearchNameMatch,
|
||||
NULL,
|
||||
FIND_FIRST_EX_LARGE_FETCH);
|
||||
is_win7_or_later ? FIND_FIRST_EX_LARGE_FETCH : 0);
|
||||
|
||||
if (diriter->handle == INVALID_HANDLE_VALUE) {
|
||||
giterr_set(GITERR_OS, "Could not open directory '%s'", path);
|
||||
|
@ -436,7 +436,7 @@ static int rebase_setupfiles_merge(git_rebase *rebase)
|
||||
size_t i;
|
||||
int error = 0;
|
||||
|
||||
if ((error = rebase_setupfile(rebase, END_FILE, -1, "%d\n", git_array_size(rebase->operations))) < 0 ||
|
||||
if ((error = rebase_setupfile(rebase, END_FILE, -1, "%" PRIuZ "\n", git_array_size(rebase->operations))) < 0 ||
|
||||
(error = rebase_setupfile(rebase, ONTO_NAME_FILE, -1, "%s\n", rebase->onto_name)) < 0)
|
||||
goto done;
|
||||
|
||||
@ -789,7 +789,7 @@ static int rebase_next_merge(
|
||||
normalize_checkout_options_for_apply(&checkout_opts, rebase, current_commit);
|
||||
|
||||
if ((error = git_indexwriter_init_for_operation(&indexwriter, rebase->repo, &checkout_opts.checkout_strategy)) < 0 ||
|
||||
(error = rebase_setupfile(rebase, MSGNUM_FILE, -1, "%d\n", rebase->current+1)) < 0 ||
|
||||
(error = rebase_setupfile(rebase, MSGNUM_FILE, -1, "%" PRIuZ "\n", rebase->current+1)) < 0 ||
|
||||
(error = rebase_setupfile(rebase, CURRENT_FILE, -1, "%.*s\n", GIT_OID_HEXSZ, current_idstr)) < 0 ||
|
||||
(error = git_merge_trees(&index, rebase->repo, parent_tree, head_tree, current_tree, NULL)) < 0 ||
|
||||
(error = git_merge__check_result(rebase->repo, index)) < 0 ||
|
||||
|
@ -770,7 +770,7 @@ static int ensure_clean_index(git_repository *repo, git_index *index)
|
||||
goto done;
|
||||
|
||||
if (git_diff_num_deltas(index_diff) > 0) {
|
||||
giterr_set(GITERR_STASH, "%d uncommitted changes exist in the index",
|
||||
giterr_set(GITERR_STASH, "%" PRIuZ " uncommitted changes exist in the index",
|
||||
git_diff_num_deltas(index_diff));
|
||||
error = GIT_EUNCOMMITTED;
|
||||
}
|
||||
|
@ -781,11 +781,25 @@ const char *git_submodule_url(git_submodule *submodule)
|
||||
int git_submodule_resolve_url(git_buf *out, git_repository *repo, const char *url)
|
||||
{
|
||||
int error = 0;
|
||||
git_buf normalized = GIT_BUF_INIT;
|
||||
|
||||
assert(out && repo && url);
|
||||
|
||||
git_buf_sanitize(out);
|
||||
|
||||
if (strchr(url, '\\')) {
|
||||
char *p;
|
||||
if ((error = git_buf_puts(&normalized, url)) < 0)
|
||||
return error;
|
||||
|
||||
for (p = normalized.ptr; *p; p++) {
|
||||
if (*p == '\\')
|
||||
*p = '/';
|
||||
}
|
||||
|
||||
url = normalized.ptr;
|
||||
}
|
||||
|
||||
if (git_path_is_relative(url)) {
|
||||
if (!(error = get_url_base(out, repo)))
|
||||
error = git_path_apply_relative(out, url);
|
||||
@ -796,6 +810,7 @@ int git_submodule_resolve_url(git_buf *out, git_repository *repo, const char *ur
|
||||
error = -1;
|
||||
}
|
||||
|
||||
git_buf_free(&normalized);
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -1647,7 +1662,7 @@ static int submodule_load_from_config(
|
||||
} else {
|
||||
khiter_t pos;
|
||||
git_strmap *map = data->map;
|
||||
pos = git_strmap_lookup_index(map, name.ptr);
|
||||
pos = git_strmap_lookup_index(map, path ? path : name.ptr);
|
||||
if (git_strmap_valid_index(map, pos)) {
|
||||
sm = git_strmap_value_at(map, pos);
|
||||
} else {
|
||||
|
@ -8,7 +8,9 @@
|
||||
#include "thread-utils.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
# include <windows.h>
|
||||
#elif defined(hpux) || defined(__hpux) || defined(_hpux)
|
||||
# include <sys/pstat.h>
|
||||
|
@ -511,7 +511,7 @@ static int write_chunk(git_stream *io, const char *buffer, size_t len)
|
||||
git_buf buf = GIT_BUF_INIT;
|
||||
|
||||
/* Chunk header */
|
||||
git_buf_printf(&buf, "%X\r\n", (unsigned)len);
|
||||
git_buf_printf(&buf, "%" PRIxZ "\r\n", len);
|
||||
|
||||
if (git_buf_oom(&buf))
|
||||
return -1;
|
||||
|
@ -523,7 +523,7 @@ static int buffer_want_with_caps(const git_remote_head *head, transport_smart_ca
|
||||
|
||||
if (len > 0xffff) {
|
||||
giterr_set(GITERR_NET,
|
||||
"Tried to produce packet with invalid length %d", len);
|
||||
"Tried to produce packet with invalid length %" PRIuZ, len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -32,14 +32,14 @@ extern "C" {
|
||||
#define XDF_IGNORE_WHITESPACE (1 << 2)
|
||||
#define XDF_IGNORE_WHITESPACE_CHANGE (1 << 3)
|
||||
#define XDF_IGNORE_WHITESPACE_AT_EOL (1 << 4)
|
||||
#define XDF_PATIENCE_DIFF (1 << 5)
|
||||
#define XDF_HISTOGRAM_DIFF (1 << 6)
|
||||
#define XDF_WHITESPACE_FLAGS (XDF_IGNORE_WHITESPACE | XDF_IGNORE_WHITESPACE_CHANGE | XDF_IGNORE_WHITESPACE_AT_EOL)
|
||||
|
||||
#define XDL_PATCH_NORMAL '-'
|
||||
#define XDL_PATCH_REVERSE '+'
|
||||
#define XDL_PATCH_MODEMASK ((1 << 8) - 1)
|
||||
#define XDL_PATCH_IGNOREBSPACE (1 << 8)
|
||||
#define XDF_PATIENCE_DIFF (1 << 5)
|
||||
#define XDF_HISTOGRAM_DIFF (1 << 6)
|
||||
#define XDF_DIFF_ALGORITHM_MASK (XDF_PATIENCE_DIFF | XDF_HISTOGRAM_DIFF)
|
||||
#define XDF_DIFF_ALG(x) ((x) & XDF_DIFF_ALGORITHM_MASK)
|
||||
|
||||
#define XDF_IGNORE_BLANK_LINES (1 << 7)
|
||||
|
||||
#define XDL_EMIT_FUNCNAMES (1 << 0)
|
||||
#define XDL_EMIT_COMMON (1 << 1)
|
||||
@ -88,13 +88,17 @@ typedef struct s_xdemitcb {
|
||||
|
||||
typedef long (*find_func_t)(const char *line, long line_len, char *buffer, long buffer_size, void *priv);
|
||||
|
||||
typedef int (*xdl_emit_hunk_consume_func_t)(long start_a, long count_a,
|
||||
long start_b, long count_b,
|
||||
void *cb_data);
|
||||
|
||||
typedef struct s_xdemitconf {
|
||||
long ctxlen;
|
||||
long interhunkctxlen;
|
||||
unsigned long flags;
|
||||
find_func_t find_func;
|
||||
void *find_func_priv;
|
||||
void (*emit_func)(void);
|
||||
xdl_emit_hunk_consume_func_t hunk_func;
|
||||
} xdemitconf_t;
|
||||
|
||||
typedef struct s_bdiffparam {
|
||||
|
@ -328,10 +328,10 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
||||
xdalgoenv_t xenv;
|
||||
diffdata_t dd1, dd2;
|
||||
|
||||
if (xpp->flags & XDF_PATIENCE_DIFF)
|
||||
if (XDF_DIFF_ALG(xpp->flags) == XDF_PATIENCE_DIFF)
|
||||
return xdl_do_patience_diff(mf1, mf2, xpp, xe);
|
||||
|
||||
if (xpp->flags & XDF_HISTOGRAM_DIFF)
|
||||
if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF)
|
||||
return xdl_do_histogram_diff(mf1, mf2, xpp, xe);
|
||||
|
||||
if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0) {
|
||||
@ -394,6 +394,7 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
|
||||
xch->i2 = i2;
|
||||
xch->chg1 = chg1;
|
||||
xch->chg2 = chg2;
|
||||
xch->ignore = 0;
|
||||
|
||||
return xch;
|
||||
}
|
||||
@ -538,13 +539,51 @@ void xdl_free_script(xdchange_t *xscr) {
|
||||
}
|
||||
}
|
||||
|
||||
static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
||||
xdemitconf_t const *xecfg)
|
||||
{
|
||||
xdchange_t *xch, *xche;
|
||||
|
||||
(void)xe;
|
||||
|
||||
for (xch = xscr; xch; xch = xche->next) {
|
||||
xche = xdl_get_hunk(&xch, xecfg);
|
||||
if (!xch)
|
||||
break;
|
||||
if (xecfg->hunk_func(xch->i1, xche->i1 + xche->chg1 - xch->i1,
|
||||
xch->i2, xche->i2 + xche->chg2 - xch->i2,
|
||||
ecb->priv) < 0)
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void xdl_mark_ignorable(xdchange_t *xscr, xdfenv_t *xe, long flags)
|
||||
{
|
||||
xdchange_t *xch;
|
||||
|
||||
for (xch = xscr; xch; xch = xch->next) {
|
||||
int ignore = 1;
|
||||
xrecord_t **rec;
|
||||
long i;
|
||||
|
||||
rec = &xe->xdf1.recs[xch->i1];
|
||||
for (i = 0; i < xch->chg1 && ignore; i++)
|
||||
ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
|
||||
|
||||
rec = &xe->xdf2.recs[xch->i2];
|
||||
for (i = 0; i < xch->chg2 && ignore; i++)
|
||||
ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
|
||||
|
||||
xch->ignore = ignore;
|
||||
}
|
||||
}
|
||||
|
||||
int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
||||
xdemitconf_t const *xecfg, xdemitcb_t *ecb) {
|
||||
xdchange_t *xscr;
|
||||
xdfenv_t xe;
|
||||
emit_func_t ef = xecfg->emit_func ?
|
||||
(emit_func_t)xecfg->emit_func : xdl_emit_diff;
|
||||
emit_func_t ef = xecfg->hunk_func ? xdl_call_hunk_func : xdl_emit_diff;
|
||||
|
||||
if (xdl_do_diff(mf1, mf2, xpp, &xe) < 0) {
|
||||
|
||||
@ -558,6 +597,9 @@ int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
||||
return -1;
|
||||
}
|
||||
if (xscr) {
|
||||
if (xpp->flags & XDF_IGNORE_BLANK_LINES)
|
||||
xdl_mark_ignorable(xscr, &xe, xpp->flags);
|
||||
|
||||
if (ef(&xe, xscr, ecb, xecfg) < 0) {
|
||||
|
||||
xdl_free_script(xscr);
|
||||
|
@ -41,6 +41,7 @@ typedef struct s_xdchange {
|
||||
struct s_xdchange *next;
|
||||
long i1, i2;
|
||||
long chg1, chg2;
|
||||
int ignore;
|
||||
} xdchange_t;
|
||||
|
||||
|
||||
|
@ -56,16 +56,51 @@ static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *
|
||||
/*
|
||||
* Starting at the passed change atom, find the latest change atom to be included
|
||||
* inside the differential hunk according to the specified configuration.
|
||||
* Also advance xscr if the first changes must be discarded.
|
||||
*/
|
||||
xdchange_t *xdl_get_hunk(xdchange_t *xscr, xdemitconf_t const *xecfg) {
|
||||
xdchange_t *xch, *xchp;
|
||||
xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
|
||||
{
|
||||
xdchange_t *xch, *xchp, *lxch;
|
||||
long max_common = 2 * xecfg->ctxlen + xecfg->interhunkctxlen;
|
||||
long max_ignorable = xecfg->ctxlen;
|
||||
unsigned long ignored = 0; /* number of ignored blank lines */
|
||||
|
||||
for (xchp = xscr, xch = xscr->next; xch; xchp = xch, xch = xch->next)
|
||||
if (xch->i1 - (xchp->i1 + xchp->chg1) > max_common)
|
||||
/* remove ignorable changes that are too far before other changes */
|
||||
for (xchp = *xscr; xchp && xchp->ignore; xchp = xchp->next) {
|
||||
xch = xchp->next;
|
||||
|
||||
if (xch == NULL ||
|
||||
xch->i1 - (xchp->i1 + xchp->chg1) >= max_ignorable)
|
||||
*xscr = xch;
|
||||
}
|
||||
|
||||
if (*xscr == NULL)
|
||||
return NULL;
|
||||
|
||||
lxch = *xscr;
|
||||
|
||||
for (xchp = *xscr, xch = xchp->next; xch; xchp = xch, xch = xch->next) {
|
||||
long distance = xch->i1 - (xchp->i1 + xchp->chg1);
|
||||
if (distance > max_common)
|
||||
break;
|
||||
|
||||
return xchp;
|
||||
if (distance < max_ignorable && (!xch->ignore || lxch == xchp)) {
|
||||
lxch = xch;
|
||||
ignored = 0;
|
||||
} else if (distance < max_ignorable && xch->ignore) {
|
||||
ignored += xch->chg2;
|
||||
} else if (lxch != xchp &&
|
||||
xch->i1 + ignored - (lxch->i1 + lxch->chg1) > (unsigned long)max_common) {
|
||||
break;
|
||||
} else if (!xch->ignore) {
|
||||
lxch = xch;
|
||||
ignored = 0;
|
||||
} else {
|
||||
ignored += xch->chg2;
|
||||
}
|
||||
}
|
||||
|
||||
return lxch;
|
||||
}
|
||||
|
||||
|
||||
@ -144,7 +179,9 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
||||
return xdl_emit_common(xe, xscr, ecb, xecfg);
|
||||
|
||||
for (xch = xscr; xch; xch = xche->next) {
|
||||
xche = xdl_get_hunk(xch, xecfg);
|
||||
xche = xdl_get_hunk(&xch, xecfg);
|
||||
if (!xch)
|
||||
break;
|
||||
|
||||
s1 = XDL_MAX(xch->i1 - xecfg->ctxlen, 0);
|
||||
s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0);
|
||||
|
@ -27,7 +27,7 @@
|
||||
typedef int (*emit_func_t)(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
||||
xdemitconf_t const *xecfg);
|
||||
|
||||
xdchange_t *xdl_get_hunk(xdchange_t *xscr, xdemitconf_t const *xecfg);
|
||||
xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg);
|
||||
int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
||||
xdemitconf_t const *xecfg);
|
||||
|
||||
|
@ -258,7 +258,7 @@ static int fall_back_to_classic_diff(struct histindex *index,
|
||||
int line1, int count1, int line2, int count2)
|
||||
{
|
||||
xpparam_t xpp;
|
||||
xpp.flags = index->xpp->flags & ~XDF_HISTOGRAM_DIFF;
|
||||
xpp.flags = index->xpp->flags & ~XDF_DIFF_ALGORITHM_MASK;
|
||||
|
||||
return xdl_fall_back_diff(index->env, &xpp,
|
||||
line1, count1, line2, count2);
|
||||
|
@ -245,11 +245,11 @@ static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
|
||||
dest ? dest + size : NULL);
|
||||
/* Postimage from side #1 */
|
||||
if (m->mode & 1)
|
||||
size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
|
||||
size += xdl_recs_copy(xe1, m->i1, m->chg1, (m->mode & 2),
|
||||
dest ? dest + size : NULL);
|
||||
/* Postimage from side #2 */
|
||||
if (m->mode & 2)
|
||||
size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
|
||||
size += xdl_recs_copy(xe2, m->i2, m->chg2, 0,
|
||||
dest ? dest + size : NULL);
|
||||
} else
|
||||
continue;
|
||||
|
@ -288,7 +288,7 @@ static int fall_back_to_classic_diff(struct hashmap *map,
|
||||
int line1, int count1, int line2, int count2)
|
||||
{
|
||||
xpparam_t xpp;
|
||||
xpp.flags = map->xpp->flags & ~XDF_PATIENCE_DIFF;
|
||||
xpp.flags = map->xpp->flags & ~XDF_DIFF_ALGORITHM_MASK;
|
||||
|
||||
return xdl_fall_back_diff(map->env, &xpp,
|
||||
line1, count1, line2, count2);
|
||||
|
@ -181,7 +181,7 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
|
||||
if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *))))
|
||||
goto abort;
|
||||
|
||||
if (xpp->flags & XDF_HISTOGRAM_DIFF)
|
||||
if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF)
|
||||
hbits = hsize = 0;
|
||||
else {
|
||||
hbits = xdl_hashbits((unsigned int) narec);
|
||||
@ -209,8 +209,8 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
|
||||
crec->ha = hav;
|
||||
recs[nrec++] = crec;
|
||||
|
||||
if (!(xpp->flags & XDF_HISTOGRAM_DIFF) &&
|
||||
xdl_classify_record(pass, cf, rhash, hbits, crec) < 0)
|
||||
if ((XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF) &&
|
||||
xdl_classify_record(pass, cf, rhash, hbits, crec) < 0)
|
||||
goto abort;
|
||||
}
|
||||
}
|
||||
@ -273,16 +273,15 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
||||
* (nrecs) will be updated correctly anyway by
|
||||
* xdl_prepare_ctx().
|
||||
*/
|
||||
sample = xpp->flags & XDF_HISTOGRAM_DIFF ? XDL_GUESS_NLINES2 : XDL_GUESS_NLINES1;
|
||||
sample = (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF
|
||||
? XDL_GUESS_NLINES2 : XDL_GUESS_NLINES1);
|
||||
|
||||
enl1 = xdl_guess_lines(mf1, sample) + 1;
|
||||
enl2 = xdl_guess_lines(mf2, sample) + 1;
|
||||
|
||||
if (!(xpp->flags & XDF_HISTOGRAM_DIFF) &&
|
||||
xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0) {
|
||||
|
||||
if (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF &&
|
||||
xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (xdl_prepare_ctx(1, mf1, enl1, xpp, &cf, &xe->xdf1) < 0) {
|
||||
|
||||
@ -296,9 +295,9 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(xpp->flags & XDF_PATIENCE_DIFF) &&
|
||||
!(xpp->flags & XDF_HISTOGRAM_DIFF) &&
|
||||
xdl_optimize_ctxs(&cf, &xe->xdf1, &xe->xdf2) < 0) {
|
||||
if ((XDF_DIFF_ALG(xpp->flags) != XDF_PATIENCE_DIFF) &&
|
||||
(XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF) &&
|
||||
xdl_optimize_ctxs(&cf, &xe->xdf1, &xe->xdf2) < 0) {
|
||||
|
||||
xdl_free_ctx(&xe->xdf2);
|
||||
xdl_free_ctx(&xe->xdf1);
|
||||
|
@ -120,35 +120,6 @@ void *xdl_cha_alloc(chastore_t *cha) {
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void *xdl_cha_first(chastore_t *cha) {
|
||||
chanode_t *sncur;
|
||||
|
||||
if (!(cha->sncur = sncur = cha->head))
|
||||
return NULL;
|
||||
|
||||
cha->scurr = 0;
|
||||
|
||||
return (char *) sncur + sizeof(chanode_t) + cha->scurr;
|
||||
}
|
||||
|
||||
|
||||
void *xdl_cha_next(chastore_t *cha) {
|
||||
chanode_t *sncur;
|
||||
|
||||
if (!(sncur = cha->sncur))
|
||||
return NULL;
|
||||
cha->scurr += cha->isize;
|
||||
if (cha->scurr == sncur->icurr) {
|
||||
if (!(sncur = cha->sncur = sncur->next))
|
||||
return NULL;
|
||||
cha->scurr = 0;
|
||||
}
|
||||
|
||||
return (char *) sncur + sizeof(chanode_t) + cha->scurr;
|
||||
}
|
||||
|
||||
|
||||
long xdl_guess_lines(mmfile_t *mf, long sample) {
|
||||
long nl = 0, size, tsize = 0;
|
||||
char const *data, *cur, *top;
|
||||
@ -170,6 +141,19 @@ long xdl_guess_lines(mmfile_t *mf, long sample) {
|
||||
return nl + 1;
|
||||
}
|
||||
|
||||
int xdl_blankline(const char *line, long size, long flags)
|
||||
{
|
||||
long i;
|
||||
|
||||
if (!(flags & XDF_WHITESPACE_FLAGS))
|
||||
return (size <= 1);
|
||||
|
||||
for (i = 0; i < size && XDL_ISSPACE(line[i]); i++)
|
||||
;
|
||||
|
||||
return (i == size);
|
||||
}
|
||||
|
||||
int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags)
|
||||
{
|
||||
int i1, i2;
|
||||
|
@ -34,6 +34,7 @@ void *xdl_cha_alloc(chastore_t *cha);
|
||||
void *xdl_cha_first(chastore_t *cha);
|
||||
void *xdl_cha_next(chastore_t *cha);
|
||||
long xdl_guess_lines(mmfile_t *mf, long sample);
|
||||
int xdl_blankline(const char *line, long size, long flags);
|
||||
int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags);
|
||||
unsigned long xdl_hash_record(char const **data, char const *top, long flags);
|
||||
unsigned int xdl_hashbits(unsigned int size);
|
||||
|
@ -4,7 +4,7 @@ void hunk_message(size_t idx, const git_blame_hunk *hunk, const char *fmt, ...)
|
||||
{
|
||||
va_list arglist;
|
||||
|
||||
printf("Hunk %zd (line %d +%d): ", idx,
|
||||
printf("Hunk %"PRIuZ" (line %d +%d): ", idx,
|
||||
hunk->final_start_line_number, hunk->lines_in_hunk-1);
|
||||
|
||||
va_start(arglist, fmt);
|
||||
|
@ -483,8 +483,8 @@ void clar__assert_equal_file(
|
||||
for (pos = 0; pos < bytes && expected_data[pos] == buf[pos]; ++pos)
|
||||
/* find differing byte offset */;
|
||||
p_snprintf(
|
||||
buf, sizeof(buf), "file content mismatch at byte %d",
|
||||
(int)(total_bytes + pos));
|
||||
buf, sizeof(buf), "file content mismatch at byte %"PRIdZ,
|
||||
(ssize_t)(total_bytes + pos));
|
||||
p_close(fd);
|
||||
clar__fail(file, line, path, buf, 1);
|
||||
}
|
||||
|
35
tests/index/bypath.c
Normal file
35
tests/index/bypath.c
Normal file
@ -0,0 +1,35 @@
|
||||
#include "clar_libgit2.h"
|
||||
#include "repository.h"
|
||||
#include "../submodule/submodule_helpers.h"
|
||||
|
||||
static git_repository *g_repo;
|
||||
static git_index *g_idx;
|
||||
|
||||
void test_index_bypath__initialize(void)
|
||||
{
|
||||
g_repo = setup_fixture_submod2();
|
||||
cl_git_pass(git_repository_index__weakptr(&g_idx, g_repo));
|
||||
}
|
||||
|
||||
void test_index_bypath__cleanup(void)
|
||||
{
|
||||
g_repo = NULL;
|
||||
g_idx = NULL;
|
||||
}
|
||||
|
||||
void test_index_bypath__add_directory(void)
|
||||
{
|
||||
cl_git_fail_with(GIT_EDIRECTORY, git_index_add_bypath(g_idx, "just_a_dir"));
|
||||
}
|
||||
|
||||
void test_index_bypath__add_submodule(void)
|
||||
{
|
||||
unsigned int status;
|
||||
const char *sm_name = "sm_changed_head";
|
||||
|
||||
cl_git_pass(git_submodule_status(&status, g_repo, sm_name, 0));
|
||||
cl_assert_equal_i(GIT_SUBMODULE_STATUS_WD_MODIFIED, status & GIT_SUBMODULE_STATUS_WD_MODIFIED);
|
||||
cl_git_pass(git_index_add_bypath(g_idx, sm_name));
|
||||
cl_git_pass(git_submodule_status(&status, g_repo, sm_name, 0));
|
||||
cl_assert_equal_i(0, status & GIT_SUBMODULE_STATUS_WD_MODIFIED);
|
||||
}
|
@ -249,3 +249,42 @@ void test_merge_files__automerge_whitespace_change(void)
|
||||
|
||||
git_merge_file_result_free(&result);
|
||||
}
|
||||
|
||||
void test_merge_files__doesnt_add_newline(void)
|
||||
{
|
||||
git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT,
|
||||
ours = GIT_MERGE_FILE_INPUT_INIT,
|
||||
theirs = GIT_MERGE_FILE_INPUT_INIT;
|
||||
git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT;
|
||||
git_merge_file_result result = {0};
|
||||
const char *expected = "Zero\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\nTen";
|
||||
|
||||
ancestor.ptr = "0\n1\n2\n3\n4\n5 XXX\n6YYY\n7\n8\n9\n10";
|
||||
ancestor.size = strlen(ancestor.ptr);
|
||||
ancestor.path = "testfile.txt";
|
||||
ancestor.mode = 0100755;
|
||||
|
||||
ours.ptr = "Zero\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\n10";
|
||||
ours.size = strlen(ours.ptr);
|
||||
ours.path = "testfile.txt";
|
||||
ours.mode = 0100755;
|
||||
|
||||
theirs.ptr = "0\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\nTen";
|
||||
theirs.size = strlen(theirs.ptr);
|
||||
theirs.path = "testfile.txt";
|
||||
theirs.mode = 0100755;
|
||||
|
||||
opts.flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE;
|
||||
cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts));
|
||||
|
||||
cl_assert_equal_i(1, result.automergeable);
|
||||
|
||||
cl_assert_equal_s("testfile.txt", result.path);
|
||||
cl_assert_equal_i(0100755, result.mode);
|
||||
|
||||
cl_assert_equal_i(strlen(expected), result.len);
|
||||
cl_assert_equal_strn(expected, result.ptr, result.len);
|
||||
|
||||
git_merge_file_result_free(&result);
|
||||
}
|
||||
|
||||
|
@ -110,7 +110,7 @@ void merge__dump_index_entries(git_vector *index_entries)
|
||||
size_t i;
|
||||
const git_index_entry *index_entry;
|
||||
|
||||
printf ("\nINDEX [%d]:\n", (int)index_entries->length);
|
||||
printf ("\nINDEX [%"PRIuZ"]:\n", index_entries->length);
|
||||
for (i = 0; i < index_entries->length; i++) {
|
||||
index_entry = index_entries->contents[i];
|
||||
|
||||
|
@ -334,16 +334,18 @@ void test_revert_workdir__again_after_edit_two(void)
|
||||
cl_assert(merge_test_index(repo_index, merge_index_entries, 3));
|
||||
|
||||
cl_git_pass(git_futils_readbuffer(&diff_buf, "revert/file.txt"));
|
||||
cl_assert(strcmp(diff_buf.ptr, "a\n" \
|
||||
"<<<<<<< HEAD\n" \
|
||||
"=======\n" \
|
||||
"a\n" \
|
||||
">>>>>>> parent of 97e52d5... Revert me\n" \
|
||||
"a\n" \
|
||||
"a\n" \
|
||||
"a\n" \
|
||||
"a\n" \
|
||||
"ab\n") == 0);
|
||||
cl_assert_equal_s(
|
||||
"a\n" \
|
||||
"<<<<<<< HEAD\n" \
|
||||
"=======\n" \
|
||||
"a\n" \
|
||||
">>>>>>> parent of 97e52d5... Revert me\n" \
|
||||
"a\n" \
|
||||
"a\n" \
|
||||
"a\n" \
|
||||
"a\n" \
|
||||
"ab",
|
||||
diff_buf.ptr);
|
||||
|
||||
git_commit_free(revert_commit);
|
||||
git_commit_free(head_commit);
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "submodule_helpers.h"
|
||||
#include "config/config_helpers.h"
|
||||
#include "fileops.h"
|
||||
#include "repository.h"
|
||||
|
||||
static git_repository *g_repo = NULL;
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include "clar_libgit2.h"
|
||||
#include "submodule_helpers.h"
|
||||
#include "git2/sys/repository.h"
|
||||
#include "repository.h"
|
||||
#include "fileops.h"
|
||||
|
||||
static git_repository *g_repo = NULL;
|
||||
@ -103,10 +104,27 @@ static int sm_lookup_cb(git_submodule *sm, const char *name, void *payload)
|
||||
|
||||
void test_submodule_lookup__foreach(void)
|
||||
{
|
||||
git_config *cfg;
|
||||
sm_lookup_data data;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
cl_git_pass(git_submodule_foreach(g_repo, sm_lookup_cb, &data));
|
||||
cl_assert_equal_i(8, data.count);
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
|
||||
/* Change the path for a submodule so it doesn't match the name */
|
||||
cl_git_pass(git_config_open_ondisk(&cfg, "submod2/.gitmodules"));
|
||||
|
||||
cl_git_pass(git_config_set_string(cfg, "submodule.smchangedindex.path", "sm_changed_index"));
|
||||
cl_git_pass(git_config_set_string(cfg, "submodule.smchangedindex.url", "../submod2_target"));
|
||||
cl_git_pass(git_config_delete_entry(cfg, "submodule.sm_changed_index.path"));
|
||||
cl_git_pass(git_config_delete_entry(cfg, "submodule.sm_changed_index.url"));
|
||||
|
||||
git_config_free(cfg);
|
||||
|
||||
cl_git_pass(git_submodule_foreach(g_repo, sm_lookup_cb, &data));
|
||||
cl_assert_equal_i(8, data.count);
|
||||
}
|
||||
|
||||
void test_submodule_lookup__lookup_even_with_unborn_head(void)
|
||||
@ -133,6 +151,29 @@ void test_submodule_lookup__lookup_even_with_missing_index(void)
|
||||
test_submodule_lookup__simple_lookup(); /* baseline should still pass */
|
||||
}
|
||||
|
||||
void test_submodule_lookup__backslashes(void)
|
||||
{
|
||||
git_config *cfg;
|
||||
git_submodule *sm;
|
||||
git_repository *subrepo;
|
||||
git_buf buf = GIT_BUF_INIT;
|
||||
const char *backslashed_path = "..\\submod2_target";
|
||||
|
||||
cl_git_pass(git_config_open_ondisk(&cfg, "submod2/.gitmodules"));
|
||||
cl_git_pass(git_config_set_string(cfg, "submodule.sm_unchanged.url", backslashed_path));
|
||||
git_config_free(cfg);
|
||||
|
||||
cl_git_pass(git_submodule_lookup(&sm, g_repo, "sm_unchanged"));
|
||||
cl_assert_equal_s(backslashed_path, git_submodule_url(sm));
|
||||
cl_git_pass(git_submodule_open(&subrepo, sm));
|
||||
|
||||
cl_git_pass(git_submodule_resolve_url(&buf, g_repo, backslashed_path));
|
||||
|
||||
git_buf_free(&buf);
|
||||
git_submodule_free(sm);
|
||||
git_repository_free(subrepo);
|
||||
}
|
||||
|
||||
static void baseline_tests(void)
|
||||
{
|
||||
/* small baseline that should work even if we change the index or make
|
||||
|
Loading…
Reference in New Issue
Block a user