* [PATCH 18/21] Convert refresh_index to take struct pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:21 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/add.c | 14 ++++++--------
builtin/commit.c | 2 +-
builtin/rm.c | 2 +-
cache.h | 2 +-
read-cache.c | 5 +++--
5 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/builtin/add.c b/builtin/add.c
index af36bc4..623f167 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -180,19 +180,17 @@ static void treat_gitlinks(const char **pathspec)
}
}
-static void refresh(int verbose, const char **pathspec)
+static void refresh(int verbose, const struct pathspec *pathspec)
{
char *seen;
- int i, specs;
+ int i;
- for (specs = 0; pathspec[specs]; specs++)
- /* nothing */;
- seen = xcalloc(specs, 1);
+ seen = xcalloc(pathspec->nr, 1);
refresh_index(&the_index, verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET,
pathspec, seen, _("Unstaged changes after refreshing the index:"));
- for (i = 0; i < specs; i++) {
+ for (i = 0; i < pathspec->nr; i++) {
if (!seen[i])
- die(_("pathspec '%s' did not match any files"), pathspec[i]);
+ die(_("pathspec '%s' did not match any files"), pathspec->raw[i]);
}
free(seen);
}
@@ -437,7 +435,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
}
if (refresh_only) {
- refresh(verbose, pathspec.raw);
+ refresh(verbose, &pathspec);
goto finish;
}
diff --git a/builtin/commit.c b/builtin/commit.c
index 71c5afb..193a37e 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -1208,7 +1208,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
parse_pathspec(&s.pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
read_cache_preload(&s.pathspec);
- refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec.raw, NULL, NULL);
+ refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &s.pathspec, NULL, NULL);
fd = hold_locked_index(&index_lock, 0);
if (0 <= fd)
diff --git a/builtin/rm.c b/builtin/rm.c
index d719d95..b5edde8 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -250,7 +250,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
}
parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
- refresh_index(&the_index, REFRESH_QUIET, pathspec.raw, NULL, NULL);
+ refresh_index(&the_index, REFRESH_QUIET, &pathspec, NULL, NULL);
seen = NULL;
seen = xcalloc(pathspec.nr, 1);
diff --git a/cache.h b/cache.h
index 3c34ef5..41e1421 100644
--- a/cache.h
+++ b/cache.h
@@ -511,7 +511,7 @@ extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st);
#define REFRESH_IGNORE_MISSING 0x0008 /* ignore non-existent */
#define REFRESH_IGNORE_SUBMODULES 0x0010 /* ignore submodules */
#define REFRESH_IN_PORCELAIN 0x0020 /* user friendly output, not "needs update" */
-extern int refresh_index(struct index_state *, unsigned int flags, const char **pathspec, char *seen, const char *header_msg);
+extern int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg);
struct lock_file {
struct lock_file *next;
diff --git a/read-cache.c b/read-cache.c
index fda78bc..dec2ba6 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1093,7 +1093,8 @@ static void show_file(const char * fmt, const char * name, int in_porcelain,
printf(fmt, name);
}
-int refresh_index(struct index_state *istate, unsigned int flags, const char **pathspec,
+int refresh_index(struct index_state *istate, unsigned int flags,
+ const struct pathspec *pathspec,
char *seen, const char *header_msg)
{
int i;
@@ -1128,7 +1129,7 @@ int refresh_index(struct index_state *istate, unsigned int flags, const char **p
continue;
if (pathspec &&
- !match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, seen))
+ !match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, seen))
filtered = 1;
if (ce_stage(ce)) {
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 17/21] Convert report_path_error to take struct pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:21 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/checkout.c | 2 +-
builtin/commit.c | 14 ++++++--------
builtin/ls-files.c | 14 ++++++++------
cache.h | 2 +-
4 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index a7ddb35..648768e 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -273,7 +273,7 @@ static int checkout_paths(const struct checkout_opts *opts,
match_pathspec_depth(&opts->pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
}
- if (report_path_error(ps_matched, opts->pathspec.raw, opts->prefix))
+ if (report_path_error(ps_matched, &opts->pathspec, opts->prefix))
return 1;
/* "checkout -m path" to recreate conflicted state */
diff --git a/builtin/commit.c b/builtin/commit.c
index 7b5f123..71c5afb 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -181,20 +181,18 @@ static int commit_index_files(void)
* and return the paths that match the given pattern in list.
*/
static int list_paths(struct string_list *list, const char *with_tree,
- const char *prefix, const char **pattern)
+ const char *prefix, const struct pathspec *pattern)
{
int i;
char *m;
- if (!pattern)
+ if (!pattern->nr)
return 0;
- for (i = 0; pattern[i]; i++)
- ;
- m = xcalloc(1, i);
+ m = xcalloc(1, pattern->nr);
if (with_tree) {
- char *max_prefix = common_prefix(pattern);
+ char *max_prefix = common_prefix(pattern->raw);
overlay_tree_on_cache(with_tree, max_prefix ? max_prefix : prefix);
free(max_prefix);
}
@@ -205,7 +203,7 @@ static int list_paths(struct string_list *list, const char *with_tree,
if (ce->ce_flags & CE_UPDATE)
continue;
- if (!match_pathspec(pattern, ce->name, ce_namelen(ce), 0, m))
+ if (!match_pathspec_depth(pattern, ce->name, ce_namelen(ce), 0, m))
continue;
item = string_list_insert(list, ce->name);
if (ce_skip_worktree(ce))
@@ -396,7 +394,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
memset(&partial, 0, sizeof(partial));
partial.strdup_strings = 1;
- if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec.raw))
+ if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec))
exit(1);
discard_cache();
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 9336abd..be6e05d 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -349,7 +349,9 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix)
}
}
-int report_path_error(const char *ps_matched, const char **pathspec, const char *prefix)
+int report_path_error(const char *ps_matched,
+ const struct pathspec *pathspec,
+ const char *prefix)
{
/*
* Make sure all pathspec matched; otherwise it is an error.
@@ -357,7 +359,7 @@ int report_path_error(const char *ps_matched, const char **pathspec, const char
struct strbuf sb = STRBUF_INIT;
const char *name;
int num, errors = 0;
- for (num = 0; pathspec[num]; num++) {
+ for (num = 0; num < pathspec->nr; num++) {
int other, found_dup;
if (ps_matched[num])
@@ -367,11 +369,11 @@ int report_path_error(const char *ps_matched, const char **pathspec, const char
* twice. Do not barf on such a mistake.
*/
for (found_dup = other = 0;
- !found_dup && pathspec[other];
+ !found_dup && pathspec->raw[other];
other++) {
if (other == num || !ps_matched[other])
continue;
- if (!strcmp(pathspec[other], pathspec[num]))
+ if (!strcmp(pathspec->raw[other], pathspec->raw[num]))
/*
* Ok, we have a match already.
*/
@@ -380,7 +382,7 @@ int report_path_error(const char *ps_matched, const char **pathspec, const char
if (found_dup)
continue;
- name = quote_path_relative(pathspec[num], -1, &sb, prefix);
+ name = quote_path_relative(pathspec->raw[num], -1, &sb, prefix);
error("pathspec '%s' did not match any file(s) known to git.",
name);
errors++;
@@ -572,7 +574,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
if (ps_matched) {
int bad;
- bad = report_path_error(ps_matched, pathspec.raw, prefix);
+ bad = report_path_error(ps_matched, &pathspec, prefix);
if (bad)
fprintf(stderr, "Did you forget to 'git add'?\n");
diff --git a/cache.h b/cache.h
index 7871cd1..3c34ef5 100644
--- a/cache.h
+++ b/cache.h
@@ -1258,7 +1258,7 @@ extern int ws_blank_line(const char *line, int len, unsigned ws_rule);
#define ws_tab_width(rule) ((rule) & WS_TAB_WIDTH_MASK)
/* ls-files */
-int report_path_error(const char *ps_matched, const char **pathspec, const char *prefix);
+int report_path_error(const char *ps_matched, const struct pathspec *pathspec, const char *prefix);
void overlay_tree_on_cache(const char *tree_name, const char *prefix);
char *alias_lookup(const char *alias);
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 16/21] checkout: convert read_tree_some to take struct pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:21 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/checkout.c | 9 +++------
tree.c | 4 ++--
tree.h | 2 +-
3 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index aa399d6..a7ddb35 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -82,12 +82,9 @@ static int update_some(const unsigned char *sha1, const char *base, int baselen,
return 0;
}
-static int read_tree_some(struct tree *tree, const char **pathspec)
+static int read_tree_some(struct tree *tree, const struct pathspec *pathspec)
{
- struct pathspec ps;
- init_pathspec(&ps, pathspec);
- read_tree_recursive(tree, "", 0, 0, &ps, update_some, NULL);
- free_pathspec(&ps);
+ read_tree_recursive(tree, "", 0, 0, pathspec, update_some, NULL);
/* update the index with the given tree's info
* for all args, expanding wildcards, and exit
@@ -265,7 +262,7 @@ static int checkout_paths(const struct checkout_opts *opts,
return error(_("corrupt index file"));
if (opts->source_tree)
- read_tree_some(opts->source_tree, opts->pathspec.raw);
+ read_tree_some(opts->source_tree, &opts->pathspec);
ps_matched = xcalloc(1, opts->pathspec.nr);
diff --git a/tree.c b/tree.c
index 62fed63..ff72f67 100644
--- a/tree.c
+++ b/tree.c
@@ -47,7 +47,7 @@ static int read_one_entry_quick(const unsigned char *sha1, const char *base, int
}
static int read_tree_1(struct tree *tree, struct strbuf *base,
- int stage, struct pathspec *pathspec,
+ int stage, const struct pathspec *pathspec,
read_tree_fn_t fn, void *context)
{
struct tree_desc desc;
@@ -116,7 +116,7 @@ static int read_tree_1(struct tree *tree, struct strbuf *base,
int read_tree_recursive(struct tree *tree,
const char *base, int baselen,
- int stage, struct pathspec *pathspec,
+ int stage, const struct pathspec *pathspec,
read_tree_fn_t fn, void *context)
{
struct strbuf sb = STRBUF_INIT;
diff --git a/tree.h b/tree.h
index 69bcb5e..9dc90ba 100644
--- a/tree.h
+++ b/tree.h
@@ -25,7 +25,7 @@ typedef int (*read_tree_fn_t)(const unsigned char *, const char *, int, const ch
extern int read_tree_recursive(struct tree *tree,
const char *base, int baselen,
- int stage, struct pathspec *pathspec,
+ int stage, const struct pathspec *pathspec,
read_tree_fn_t fn, void *context);
extern int read_tree(struct tree *tree, int stage, struct pathspec *pathspec);
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 15/21] Convert unmerge_cache to take struct pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:21 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/checkout.c | 2 +-
rerere.c | 2 +-
resolve-undo.c | 4 ++--
resolve-undo.h | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 00910dc..aa399d6 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -281,7 +281,7 @@ static int checkout_paths(const struct checkout_opts *opts,
/* "checkout -m path" to recreate conflicted state */
if (opts->merge)
- unmerge_cache(opts->pathspec.raw);
+ unmerge_cache(&opts->pathspec);
/* Any unmerged paths? */
for (pos = 0; pos < active_nr; pos++) {
diff --git a/rerere.c b/rerere.c
index f8ddf85..9d149fa 100644
--- a/rerere.c
+++ b/rerere.c
@@ -666,7 +666,7 @@ int rerere_forget(struct pathspec *pathspec)
fd = setup_rerere(&merge_rr, RERERE_NOAUTOUPDATE);
- unmerge_cache(pathspec->raw);
+ unmerge_cache(pathspec);
find_conflict(&conflict);
for (i = 0; i < conflict.nr; i++) {
struct string_list_item *it = &conflict.items[i];
diff --git a/resolve-undo.c b/resolve-undo.c
index 72b4612..1bfece2 100644
--- a/resolve-undo.c
+++ b/resolve-undo.c
@@ -156,7 +156,7 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
return unmerge_index_entry_at(istate, pos);
}
-void unmerge_index(struct index_state *istate, const char **pathspec)
+void unmerge_index(struct index_state *istate, const struct pathspec *pathspec)
{
int i;
@@ -165,7 +165,7 @@ void unmerge_index(struct index_state *istate, const char **pathspec)
for (i = 0; i < istate->cache_nr; i++) {
struct cache_entry *ce = istate->cache[i];
- if (!match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL))
+ if (!match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, NULL))
continue;
i = unmerge_index_entry_at(istate, i);
}
diff --git a/resolve-undo.h b/resolve-undo.h
index 8458769..81e8803 100644
--- a/resolve-undo.h
+++ b/resolve-undo.h
@@ -11,6 +11,6 @@ extern void resolve_undo_write(struct strbuf *, struct string_list *);
extern struct string_list *resolve_undo_read(const char *, unsigned long);
extern void resolve_undo_clear_index(struct index_state *);
extern int unmerge_index_entry_at(struct index_state *, int);
-extern void unmerge_index(struct index_state *, const char **);
+extern void unmerge_index(struct index_state *, const struct pathspec *);
#endif
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 14/21] Convert read_cache_preload() to take struct pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:21 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/checkout.c | 2 +-
builtin/commit.c | 4 ++--
builtin/diff-files.c | 2 +-
builtin/diff-index.c | 2 +-
builtin/diff.c | 4 ++--
cache.h | 4 +++-
preload-index.c | 20 +++++++++++---------
7 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index da25298..00910dc 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -261,7 +261,7 @@ static int checkout_paths(const struct checkout_opts *opts,
lock_file = xcalloc(1, sizeof(struct lock_file));
newfd = hold_locked_index(lock_file, 1);
- if (read_cache_preload(opts->pathspec.raw) < 0)
+ if (read_cache_preload(&opts->pathspec) < 0)
return error(_("corrupt index file"));
if (opts->source_tree)
diff --git a/builtin/commit.c b/builtin/commit.c
index b706ebb..7b5f123 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -288,7 +288,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
else
memset(&pathspec, 0, sizeof(pathspec));
- if (read_cache_preload(pathspec.raw) < 0)
+ if (read_cache_preload(&pathspec) < 0)
die(_("index file corrupt"));
if (interactive) {
@@ -1209,7 +1209,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
if (*argv)
parse_pathspec(&s.pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
- read_cache_preload(s.pathspec.raw);
+ read_cache_preload(&s.pathspec);
refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec.raw, NULL, NULL);
fd = hold_locked_index(&index_lock, 0);
diff --git a/builtin/diff-files.c b/builtin/diff-files.c
index 46085f8..9200069 100644
--- a/builtin/diff-files.c
+++ b/builtin/diff-files.c
@@ -61,7 +61,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
(rev.diffopt.output_format & DIFF_FORMAT_PATCH))
rev.combine_merges = rev.dense_combined_merges = 1;
- if (read_cache_preload(rev.diffopt.pathspec.raw) < 0) {
+ if (read_cache_preload(&rev.diffopt.pathspec) < 0) {
perror("read_cache_preload");
return -1;
}
diff --git a/builtin/diff-index.c b/builtin/diff-index.c
index 1c737f7..ce15b23 100644
--- a/builtin/diff-index.c
+++ b/builtin/diff-index.c
@@ -43,7 +43,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
usage(diff_cache_usage);
if (!cached) {
setup_work_tree();
- if (read_cache_preload(rev.diffopt.pathspec.raw) < 0) {
+ if (read_cache_preload(&rev.diffopt.pathspec) < 0) {
perror("read_cache_preload");
return -1;
}
diff --git a/builtin/diff.c b/builtin/diff.c
index 8c2af6c..62bdc4d 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -140,7 +140,7 @@ static int builtin_diff_index(struct rev_info *revs,
usage(builtin_diff_usage);
if (!cached) {
setup_work_tree();
- if (read_cache_preload(revs->diffopt.pathspec.raw) < 0) {
+ if (read_cache_preload(&revs->diffopt.pathspec) < 0) {
perror("read_cache_preload");
return -1;
}
@@ -240,7 +240,7 @@ static int builtin_diff_files(struct rev_info *revs, int argc, const char **argv
revs->combine_merges = revs->dense_combined_merges = 1;
setup_work_tree();
- if (read_cache_preload(revs->diffopt.pathspec.raw) < 0) {
+ if (read_cache_preload(&revs->diffopt.pathspec) < 0) {
perror("read_cache_preload");
return -1;
}
diff --git a/cache.h b/cache.h
index 890d89b..7871cd1 100644
--- a/cache.h
+++ b/cache.h
@@ -182,6 +182,8 @@ struct cache_entry {
#error "CE_EXTENDED_FLAGS out of range"
#endif
+struct pathspec;
+
/*
* Copy the sha1 and stat state of a cache entry from one to
* another. But we never change the name, or the hash state!
@@ -433,7 +435,7 @@ extern int init_db(const char *template_dir, unsigned int flags);
/* Initialize and use the cache information */
extern int read_index(struct index_state *);
-extern int read_index_preload(struct index_state *, const char **pathspec);
+extern int read_index_preload(struct index_state *, const struct pathspec *pathspec);
extern int read_index_from(struct index_state *, const char *path);
extern int is_index_unborn(struct index_state *);
extern int read_index_unmerged(struct index_state *);
diff --git a/preload-index.c b/preload-index.c
index 49cb08d..91f27f7 100644
--- a/preload-index.c
+++ b/preload-index.c
@@ -4,7 +4,8 @@
#include "cache.h"
#ifdef NO_PTHREADS
-static void preload_index(struct index_state *index, const char **pathspec)
+static void preload_index(struct index_state *index,
+ const struct pathspec *pathspec)
{
; /* nothing */
}
@@ -24,7 +25,7 @@ static void preload_index(struct index_state *index, const char **pathspec)
struct thread_data {
pthread_t pthread;
struct index_state *index;
- const char **pathspec;
+ struct pathspec pathspec;
int offset, nr;
};
@@ -35,9 +36,7 @@ static void *preload_thread(void *_data)
struct index_state *index = p->index;
struct cache_entry **cep = index->cache + p->offset;
struct cache_def cache;
- struct pathspec pathspec;
- init_pathspec(&pathspec, p->pathspec);
memset(&cache, 0, sizeof(cache));
nr = p->nr;
if (nr + p->offset > index->cache_nr)
@@ -53,7 +52,7 @@ static void *preload_thread(void *_data)
continue;
if (ce_uptodate(ce))
continue;
- if (!ce_path_match(ce, &pathspec))
+ if (!ce_path_match(ce, &p->pathspec))
continue;
if (threaded_has_symlink_leading_path(&cache, ce->name, ce_namelen(ce)))
continue;
@@ -63,11 +62,11 @@ static void *preload_thread(void *_data)
continue;
ce_mark_uptodate(ce);
} while (--nr > 0);
- free_pathspec(&pathspec);
return NULL;
}
-static void preload_index(struct index_state *index, const char **pathspec)
+static void preload_index(struct index_state *index,
+ const struct pathspec *pathspec)
{
int threads, i, work, offset;
struct thread_data data[MAX_PARALLEL];
@@ -82,10 +81,12 @@ static void preload_index(struct index_state *index, const char **pathspec)
threads = MAX_PARALLEL;
offset = 0;
work = DIV_ROUND_UP(index->cache_nr, threads);
+ memset(&data, 0, sizeof(data));
for (i = 0; i < threads; i++) {
struct thread_data *p = data+i;
p->index = index;
- p->pathspec = pathspec;
+ if (pathspec)
+ p->pathspec = *pathspec;
p->offset = offset;
p->nr = work;
offset += work;
@@ -100,7 +101,8 @@ static void preload_index(struct index_state *index, const char **pathspec)
}
#endif
-int read_index_preload(struct index_state *index, const char **pathspec)
+int read_index_preload(struct index_state *index,
+ const struct pathspec *pathspec)
{
int retval = read_index(index);
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 13/21] add: convert to use parse_pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:21 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/add.c | 57 ++++++++++++++++++++++++++++-----------------------------
1 file changed, 28 insertions(+), 29 deletions(-)
diff --git a/builtin/add.c b/builtin/add.c
index e664100..af36bc4 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -197,21 +197,18 @@ static void refresh(int verbose, const char **pathspec)
free(seen);
}
-static const char **validate_pathspec(int argc, const char **argv, const char *prefix)
+static void validate_pathspec(const char **pathspec, const char *prefix)
{
- const char **pathspec = get_pathspec(prefix, argv);
-
- if (pathspec) {
- const char **p;
- for (p = pathspec; *p; p++) {
- if (has_symlink_leading_path(*p, strlen(*p))) {
- int len = prefix ? strlen(prefix) : 0;
- die(_("'%s' is beyond a symbolic link"), *p + len);
- }
+ const char **p;
+ if (!pathspec)
+ return;
+
+ for (p = pathspec; *p; p++) {
+ if (has_symlink_leading_path(*p, strlen(*p))) {
+ int len = prefix ? strlen(prefix) : 0;
+ die(_("'%s' is beyond a symbolic link"), *p + len);
}
}
-
- return pathspec;
}
int run_add_interactive(const char *revision, const char *patch_mode,
@@ -248,7 +245,8 @@ int interactive_add(int argc, const char **argv, const char *prefix, int patch)
const char **pathspec = NULL;
if (argc) {
- pathspec = validate_pathspec(argc, argv, prefix);
+ pathspec = get_pathspec(prefix, argv);
+ validate_pathspec(pathspec, prefix);
if (!pathspec)
return -1;
}
@@ -367,7 +365,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
{
int exit_status = 0;
int newfd;
- const char **pathspec;
+ struct pathspec pathspec;
struct dir_struct dir;
int flags;
int add_new_files;
@@ -415,11 +413,12 @@ int cmd_add(int argc, const char **argv, const char *prefix)
fprintf(stderr, _("Maybe you wanted to say 'git add .'?\n"));
return 0;
}
- pathspec = validate_pathspec(argc, argv, prefix);
+ parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
+ validate_pathspec(pathspec.raw, prefix);
if (read_cache() < 0)
die(_("index file corrupt"));
- treat_gitlinks(pathspec);
+ treat_gitlinks(pathspec.raw);
if (add_new_files) {
int baselen;
@@ -432,33 +431,33 @@ int cmd_add(int argc, const char **argv, const char *prefix)
}
/* This picks up the paths that are not tracked */
- baselen = fill_directory(&dir, pathspec);
- if (pathspec)
- seen = prune_directory(&dir, pathspec, baselen);
+ baselen = fill_directory(&dir, pathspec.raw);
+ if (pathspec.nr)
+ seen = prune_directory(&dir, pathspec.raw, baselen);
}
if (refresh_only) {
- refresh(verbose, pathspec);
+ refresh(verbose, pathspec.raw);
goto finish;
}
- if (pathspec) {
+ if (pathspec.nr) {
int i;
struct path_exclude_check check;
path_exclude_check_init(&check, &dir);
if (!seen)
- seen = find_used_pathspec(pathspec);
- for (i = 0; pathspec[i]; i++) {
- if (!seen[i] && pathspec[i][0]
- && !file_exists(pathspec[i])) {
+ seen = find_used_pathspec(pathspec.raw);
+ for (i = 0; pathspec.raw[i]; i++) {
+ if (!seen[i] && pathspec.raw[i][0]
+ && !file_exists(pathspec.raw[i])) {
if (ignore_missing) {
int dtype = DT_UNKNOWN;
- if (path_excluded(&check, pathspec[i], -1, &dtype))
- dir_add_ignored(&dir, pathspec[i], strlen(pathspec[i]));
+ if (path_excluded(&check, pathspec.raw[i], -1, &dtype))
+ dir_add_ignored(&dir, pathspec.raw[i], strlen(pathspec.raw[i]));
} else
die(_("pathspec '%s' did not match any files"),
- pathspec[i]);
+ pathspec.raw[i]);
}
}
free(seen);
@@ -467,7 +466,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
plug_bulk_checkin();
- exit_status |= add_files_to_cache(prefix, pathspec, flags);
+ exit_status |= add_files_to_cache(prefix, pathspec.raw, flags);
if (add_new_files)
exit_status |= add_files(&dir, flags);
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 12/21] archive: convert to use parse_pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
archive.c | 10 ++++------
archive.h | 2 +-
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/archive.c b/archive.c
index 4666404..530badb 100644
--- a/archive.c
+++ b/archive.c
@@ -150,7 +150,6 @@ int write_archive_entries(struct archiver_args *args,
struct archiver_context context;
struct unpack_trees_options opts;
struct tree_desc t;
- struct pathspec pathspec;
int err;
if (args->baselen > 0 && args->base[args->baselen - 1] == '/') {
@@ -185,10 +184,8 @@ int write_archive_entries(struct archiver_args *args,
git_attr_set_direction(GIT_ATTR_INDEX, &the_index);
}
- init_pathspec(&pathspec, args->pathspec);
- err = read_tree_recursive(args->tree, "", 0, 0, &pathspec,
+ err = read_tree_recursive(args->tree, "", 0, 0, &args->pathspec,
write_archive_entry, &context);
- free_pathspec(&pathspec);
if (err == READ_TREE_RECURSIVE)
err = 0;
return err;
@@ -230,8 +227,9 @@ static int path_exists(struct tree *tree, const char *path)
static void parse_pathspec_arg(const char **pathspec,
struct archiver_args *ar_args)
{
- ar_args->pathspec = pathspec = get_pathspec("", pathspec);
- if (pathspec) {
+ parse_pathspec(&ar_args->pathspec, PATHSPEC_FROMTOP, 0, "", pathspec);
+ if (ar_args->pathspec.nr) {
+ pathspec = ar_args->pathspec.raw;
while (*pathspec) {
if (!path_exists(ar_args->tree, *pathspec))
die("path not found: %s", *pathspec);
diff --git a/archive.h b/archive.h
index 895afcd..a98c49e 100644
--- a/archive.h
+++ b/archive.h
@@ -8,7 +8,7 @@ struct archiver_args {
const unsigned char *commit_sha1;
const struct commit *commit;
time_t time;
- const char **pathspec;
+ struct pathspec pathspec;
unsigned int verbose : 1;
unsigned int worktree_attributes : 1;
unsigned int convert : 1;
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 11/21] ls-files: convert to use parse_pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/ls-files.c | 42 +++++++++++-------------------------------
cache.h | 1 +
dir.c | 20 ++++++++++++++++++++
3 files changed, 32 insertions(+), 31 deletions(-)
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 4a9ee69..9336abd 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -30,7 +30,7 @@ static int debug_mode;
static const char *prefix;
static int max_prefix_len;
static int prefix_len;
-static const char **pathspec;
+static struct pathspec pathspec;
static int error_unmatch;
static char *ps_matched;
static const char *with_tree;
@@ -58,7 +58,7 @@ static void show_dir_entry(const char *tag, struct dir_entry *ent)
if (len >= ent->len)
die("git ls-files: internal error - directory entry not superset of prefix");
- if (!match_pathspec(pathspec, ent->name, ent->len, len, ps_matched))
+ if (!match_pathspec_depth(&pathspec, ent->name, ent->len, len, ps_matched))
return;
fputs(tag, stdout);
@@ -133,7 +133,7 @@ static void show_ce_entry(const char *tag, struct cache_entry *ce)
if (len >= ce_namelen(ce))
die("git ls-files: internal error - cache entry not superset of prefix");
- if (!match_pathspec(pathspec, ce->name, ce_namelen(ce), len, ps_matched))
+ if (!match_pathspec_depth(&pathspec, ce->name, ce_namelen(ce), len, ps_matched))
return;
if (tag && *tag && show_valid_bit &&
@@ -187,7 +187,7 @@ static void show_ru_info(void)
len = strlen(path);
if (len < max_prefix_len)
continue; /* outside of the prefix */
- if (!match_pathspec(pathspec, path, len, max_prefix_len, ps_matched))
+ if (!match_pathspec_depth(&pathspec, path, len, max_prefix_len, ps_matched))
continue; /* uninterested */
for (i = 0; i < 3; i++) {
if (!ui->mode[i])
@@ -216,7 +216,7 @@ static void show_files(struct dir_struct *dir)
/* For cached/deleted files we don't need to even do the readdir */
if (show_others || show_killed) {
- fill_directory(dir, pathspec);
+ fill_directory(dir, pathspec.raw);
if (show_others)
show_other_files(dir);
if (show_killed)
@@ -287,21 +287,6 @@ static void prune_cache(const char *prefix)
active_nr = last;
}
-static void strip_trailing_slash_from_submodules(void)
-{
- const char **p;
-
- for (p = pathspec; *p != NULL; p++) {
- int len = strlen(*p), pos;
-
- if (len < 1 || (*p)[len - 1] != '/')
- continue;
- pos = cache_name_pos(*p, len - 1);
- if (pos >= 0 && S_ISGITLINK(active_cache[pos]->ce_mode))
- *p = xstrndup(*p, len - 1);
- }
-}
-
/*
* Read the tree specified with --with-tree option
* (typically, HEAD) into stage #1 and then
@@ -549,23 +534,18 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
if (require_work_tree && !is_inside_work_tree())
setup_work_tree();
- pathspec = get_pathspec(prefix, argv);
+ parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
/* be nice with submodule paths ending in a slash */
- if (pathspec)
- strip_trailing_slash_from_submodules();
+ strip_trailing_slash_from_submodules(&pathspec);
/* Find common prefix for all pathspec's */
- max_prefix = common_prefix(pathspec);
+ max_prefix = common_prefix(pathspec.raw);
max_prefix_len = max_prefix ? strlen(max_prefix) : 0;
/* Treat unmatching pathspec elements as errors */
- if (pathspec && error_unmatch) {
- int num;
- for (num = 0; pathspec[num]; num++)
- ;
- ps_matched = xcalloc(1, num);
- }
+ if (pathspec.nr && error_unmatch)
+ ps_matched = xcalloc(1, pathspec.nr);
if ((dir.flags & DIR_SHOW_IGNORED) && !exc_given)
die("ls-files --ignored needs some exclude pattern");
@@ -592,7 +572,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
if (ps_matched) {
int bad;
- bad = report_path_error(ps_matched, pathspec, prefix);
+ bad = report_path_error(ps_matched, pathspec.raw, prefix);
if (bad)
fprintf(stderr, "Did you forget to 'git add'?\n");
diff --git a/cache.h b/cache.h
index e52365d..890d89b 100644
--- a/cache.h
+++ b/cache.h
@@ -493,6 +493,7 @@ extern int init_pathspec(struct pathspec *, const char **);
extern void parse_pathspec(struct pathspec *pathspec, unsigned magic,
unsigned flags, const char *prefix,
const char **args);
+void strip_trailing_slash_from_submodules(struct pathspec *pathspec);
extern void free_pathspec(struct pathspec *);
extern int ce_path_match(const struct cache_entry *ce, const struct pathspec *pathspec);
diff --git a/dir.c b/dir.c
index 31f0995..11e8c1d 100644
--- a/dir.c
+++ b/dir.c
@@ -1440,6 +1440,26 @@ int init_pathspec(struct pathspec *pathspec, const char **paths)
return 0;
}
+void strip_trailing_slash_from_submodules(struct pathspec *pathspec)
+{
+ int i;
+ for (i = 0; i < pathspec->nr; i++) {
+ const char *p = pathspec->raw[i];
+ int len = strlen(p), pos;
+
+ if (len < 1 || p[len - 1] != '/')
+ continue;
+ pos = cache_name_pos(p, len - 1);
+ if (pos >= 0 && S_ISGITLINK(active_cache[pos]->ce_mode)) {
+ pathspec->raw[i] = xstrndup(p, len - 1);
+ pathspec->items[i].len--;
+ pathspec->items[i].match =
+ xstrndup(pathspec->items[i].match,
+ pathspec->items[i].len);
+ }
+ }
+}
+
void free_pathspec(struct pathspec *pathspec)
{
free(pathspec->items);
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 10/21] rm: convert to use parse_pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/rm.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/builtin/rm.c b/builtin/rm.c
index dabfcf6..d719d95 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -216,7 +216,7 @@ static struct option builtin_rm_options[] = {
int cmd_rm(int argc, const char **argv, const char *prefix)
{
int i, newfd;
- const char **pathspec;
+ struct pathspec pathspec;
char *seen;
git_config(git_default_config, NULL);
@@ -249,27 +249,25 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
}
}
- pathspec = get_pathspec(prefix, argv);
- refresh_index(&the_index, REFRESH_QUIET, pathspec, NULL, NULL);
+ parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
+ refresh_index(&the_index, REFRESH_QUIET, pathspec.raw, NULL, NULL);
seen = NULL;
- for (i = 0; pathspec[i] ; i++)
- /* nothing */;
- seen = xcalloc(i, 1);
+ seen = xcalloc(pathspec.nr, 1);
for (i = 0; i < active_nr; i++) {
struct cache_entry *ce = active_cache[i];
- if (!match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, seen))
+ if (!match_pathspec_depth(&pathspec, ce->name, ce_namelen(ce), 0, seen))
continue;
ALLOC_GROW(list.entry, list.nr + 1, list.alloc);
list.entry[list.nr].name = ce->name;
list.entry[list.nr++].is_submodule = S_ISGITLINK(ce->ce_mode);
}
- if (pathspec) {
+ if (pathspec.nr) {
const char *match;
int seen_any = 0;
- for (i = 0; (match = pathspec[i]) != NULL ; i++) {
+ for (i = 0; (match = pathspec.raw[i]) != NULL ; i++) {
if (!seen[i]) {
if (!ignore_unmatch) {
die(_("pathspec '%s' did not match any files"),
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 09/21] checkout: convert to use parse_pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/checkout.c | 30 ++++++++++++++----------------
1 file changed, 14 insertions(+), 16 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index a9c1b5a..da25298 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -45,7 +45,7 @@ struct checkout_opts {
int branch_exists;
const char *prefix;
- const char **pathspec;
+ struct pathspec pathspec;
struct tree *source_tree;
};
@@ -256,39 +256,37 @@ static int checkout_paths(const struct checkout_opts *opts,
if (opts->patch_mode)
return run_add_interactive(revision, "--patch=checkout",
- opts->pathspec);
+ opts->pathspec.raw);
lock_file = xcalloc(1, sizeof(struct lock_file));
newfd = hold_locked_index(lock_file, 1);
- if (read_cache_preload(opts->pathspec) < 0)
+ if (read_cache_preload(opts->pathspec.raw) < 0)
return error(_("corrupt index file"));
if (opts->source_tree)
- read_tree_some(opts->source_tree, opts->pathspec);
+ read_tree_some(opts->source_tree, opts->pathspec.raw);
- for (pos = 0; opts->pathspec[pos]; pos++)
- ;
- ps_matched = xcalloc(1, pos);
+ ps_matched = xcalloc(1, opts->pathspec.nr);
for (pos = 0; pos < active_nr; pos++) {
struct cache_entry *ce = active_cache[pos];
if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
continue;
- match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
+ match_pathspec_depth(&opts->pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
}
- if (report_path_error(ps_matched, opts->pathspec, opts->prefix))
+ if (report_path_error(ps_matched, opts->pathspec.raw, opts->prefix))
return 1;
/* "checkout -m path" to recreate conflicted state */
if (opts->merge)
- unmerge_cache(opts->pathspec);
+ unmerge_cache(opts->pathspec.raw);
/* Any unmerged paths? */
for (pos = 0; pos < active_nr; pos++) {
struct cache_entry *ce = active_cache[pos];
- if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
+ if (match_pathspec_depth(&opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
if (!ce_stage(ce))
continue;
if (opts->force) {
@@ -315,7 +313,7 @@ static int checkout_paths(const struct checkout_opts *opts,
struct cache_entry *ce = active_cache[pos];
if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
continue;
- if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
+ if (match_pathspec_depth(&opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
if (!ce_stage(ce)) {
errs |= checkout_entry(ce, &state, NULL);
continue;
@@ -960,7 +958,7 @@ static int switch_unborn_to_new_branch(const struct checkout_opts *opts)
static int checkout_branch(struct checkout_opts *opts,
struct branch_info *new)
{
- if (opts->pathspec)
+ if (opts->pathspec.nr)
die(_("paths cannot be used with switching branches"));
if (opts->patch_mode)
@@ -1110,9 +1108,9 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
}
if (argc) {
- opts.pathspec = get_pathspec(prefix, argv);
+ parse_pathspec(&opts.pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
- if (!opts.pathspec)
+ if (!opts.pathspec.nr)
die(_("invalid path specification"));
/*
@@ -1144,7 +1142,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
strbuf_release(&buf);
}
- if (opts.patch_mode || opts.pathspec)
+ if (opts.patch_mode || opts.pathspec.nr)
return checkout_paths(&opts, new.name);
else
return checkout_branch(&opts, &new);
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 08/21] rerere: convert to use parse_pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/rerere.c | 6 +++---
rerere.c | 8 ++++----
rerere.h | 4 +++-
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/builtin/rerere.c b/builtin/rerere.c
index dc1708e..a573c4a 100644
--- a/builtin/rerere.c
+++ b/builtin/rerere.c
@@ -68,11 +68,11 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
return rerere(flags);
if (!strcmp(argv[0], "forget")) {
- const char **pathspec;
+ struct pathspec pathspec;
if (argc < 2)
warning("'git rerere forget' without paths is deprecated");
- pathspec = get_pathspec(prefix, argv + 1);
- return rerere_forget(pathspec);
+ parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, argv + 1);
+ return rerere_forget(&pathspec);
}
fd = setup_rerere(&merge_rr, flags);
diff --git a/rerere.c b/rerere.c
index a6a5cd5..f8ddf85 100644
--- a/rerere.c
+++ b/rerere.c
@@ -655,7 +655,7 @@ static int rerere_forget_one_path(const char *path, struct string_list *rr)
return 0;
}
-int rerere_forget(const char **pathspec)
+int rerere_forget(struct pathspec *pathspec)
{
int i, fd;
struct string_list conflict = STRING_LIST_INIT_DUP;
@@ -666,12 +666,12 @@ int rerere_forget(const char **pathspec)
fd = setup_rerere(&merge_rr, RERERE_NOAUTOUPDATE);
- unmerge_cache(pathspec);
+ unmerge_cache(pathspec->raw);
find_conflict(&conflict);
for (i = 0; i < conflict.nr; i++) {
struct string_list_item *it = &conflict.items[i];
- if (!match_pathspec(pathspec, it->string, strlen(it->string),
- 0, NULL))
+ if (!match_pathspec_depth(pathspec, it->string, strlen(it->string),
+ 0, NULL))
continue;
rerere_forget_one_path(it->string, &merge_rr);
}
diff --git a/rerere.h b/rerere.h
index 156d2aa..4aa06c9 100644
--- a/rerere.h
+++ b/rerere.h
@@ -3,6 +3,8 @@
#include "string-list.h"
+struct pathspec;
+
#define RERERE_AUTOUPDATE 01
#define RERERE_NOAUTOUPDATE 02
@@ -16,7 +18,7 @@ extern void *RERERE_RESOLVED;
extern int setup_rerere(struct string_list *, int);
extern int rerere(int);
extern const char *rerere_path(const char *hex, const char *file);
-extern int rerere_forget(const char **);
+extern int rerere_forget(struct pathspec *);
extern int rerere_remaining(struct string_list *);
extern void rerere_clear(struct string_list *);
extern void rerere_gc(struct string_list *);
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 07/21] status: convert to use parse_pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/commit.c | 6 +++---
wt-status.c | 17 +++++++----------
wt-status.h | 2 +-
3 files changed, 11 insertions(+), 14 deletions(-)
diff --git a/builtin/commit.c b/builtin/commit.c
index 8410617..b706ebb 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -1207,10 +1207,10 @@ int cmd_status(int argc, const char **argv, const char *prefix)
if (show_ignored_in_status)
s.show_ignored_files = 1;
if (*argv)
- s.pathspec = get_pathspec(prefix, argv);
+ parse_pathspec(&s.pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
- read_cache_preload(s.pathspec);
- refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec, NULL, NULL);
+ read_cache_preload(s.pathspec.raw);
+ refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, s.pathspec.raw, NULL, NULL);
fd = hold_locked_index(&index_lock, 0);
if (0 <= fd)
diff --git a/wt-status.c b/wt-status.c
index 2a9658b..13e6aba 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -434,7 +434,7 @@ static void wt_status_collect_changes_worktree(struct wt_status *s)
}
rev.diffopt.format_callback = wt_status_collect_changed_cb;
rev.diffopt.format_callback_data = s;
- init_pathspec(&rev.prune_data, s->pathspec);
+ rev.prune_data = s->pathspec;
run_diff_files(&rev, 0);
}
@@ -459,22 +459,20 @@ static void wt_status_collect_changes_index(struct wt_status *s)
rev.diffopt.detect_rename = 1;
rev.diffopt.rename_limit = 200;
rev.diffopt.break_opt = 0;
- init_pathspec(&rev.prune_data, s->pathspec);
+ rev.prune_data = s->pathspec;
run_diff_index(&rev, 1);
}
static void wt_status_collect_changes_initial(struct wt_status *s)
{
- struct pathspec pathspec;
int i;
- init_pathspec(&pathspec, s->pathspec);
for (i = 0; i < active_nr; i++) {
struct string_list_item *it;
struct wt_status_change_data *d;
struct cache_entry *ce = active_cache[i];
- if (!ce_path_match(ce, &pathspec))
+ if (!ce_path_match(ce, &s->pathspec))
continue;
it = string_list_insert(&s->change, ce->name);
d = it->util;
@@ -489,7 +487,6 @@ static void wt_status_collect_changes_initial(struct wt_status *s)
else
d->index_status = DIFF_STATUS_ADDED;
}
- free_pathspec(&pathspec);
}
static void wt_status_collect_untracked(struct wt_status *s)
@@ -505,11 +502,11 @@ static void wt_status_collect_untracked(struct wt_status *s)
DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES;
setup_standard_excludes(&dir);
- fill_directory(&dir, s->pathspec);
+ fill_directory(&dir, s->pathspec.raw);
for (i = 0; i < dir.nr; i++) {
struct dir_entry *ent = dir.entries[i];
if (cache_name_is_other(ent->name, ent->len) &&
- match_pathspec(s->pathspec, ent->name, ent->len, 0, NULL))
+ match_pathspec_depth(&s->pathspec, ent->name, ent->len, 0, NULL))
string_list_insert(&s->untracked, ent->name);
free(ent);
}
@@ -517,11 +514,11 @@ static void wt_status_collect_untracked(struct wt_status *s)
if (s->show_ignored_files) {
dir.nr = 0;
dir.flags = DIR_SHOW_IGNORED | DIR_SHOW_OTHER_DIRECTORIES;
- fill_directory(&dir, s->pathspec);
+ fill_directory(&dir, s->pathspec.raw);
for (i = 0; i < dir.nr; i++) {
struct dir_entry *ent = dir.entries[i];
if (cache_name_is_other(ent->name, ent->len) &&
- match_pathspec(s->pathspec, ent->name, ent->len, 0, NULL))
+ match_pathspec_depth(&s->pathspec, ent->name, ent->len, 0, NULL))
string_list_insert(&s->ignored, ent->name);
free(ent);
}
diff --git a/wt-status.h b/wt-status.h
index 236b41f..dd8df41 100644
--- a/wt-status.h
+++ b/wt-status.h
@@ -44,7 +44,7 @@ struct wt_status {
int is_initial;
char *branch;
const char *reference;
- const char **pathspec;
+ struct pathspec pathspec;
int verbose;
int amend;
enum commit_whence whence;
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 06/21] commit: convert to use parse_pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/commit.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/builtin/commit.c b/builtin/commit.c
index d6dd3df..8410617 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -277,17 +277,18 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
{
int fd;
struct string_list partial;
- const char **pathspec = NULL;
+ struct pathspec pathspec;
char *old_index_env = NULL;
int refresh_flags = REFRESH_QUIET;
if (is_status)
refresh_flags |= REFRESH_UNMERGED;
-
if (*argv)
- pathspec = get_pathspec(prefix, argv);
+ parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
+ else
+ memset(&pathspec, 0, sizeof(pathspec));
- if (read_cache_preload(pathspec) < 0)
+ if (read_cache_preload(pathspec.raw) < 0)
die(_("index file corrupt"));
if (interactive) {
@@ -329,9 +330,9 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
* (A) if all goes well, commit the real index;
* (B) on failure, rollback the real index.
*/
- if (all || (also && pathspec && *pathspec)) {
+ if (all || (also && pathspec.nr)) {
fd = hold_locked_index(&index_lock, 1);
- add_files_to_cache(also ? prefix : NULL, pathspec, 0);
+ add_files_to_cache(also ? prefix : NULL, pathspec.raw, 0);
refresh_cache_or_die(refresh_flags);
update_main_cache_tree(WRITE_TREE_SILENT);
if (write_cache(fd, active_cache, active_nr) ||
@@ -350,7 +351,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
* and create commit from the_index.
* We still need to refresh the index here.
*/
- if (!only && (!pathspec || !*pathspec)) {
+ if (!only && !pathspec.nr) {
fd = hold_locked_index(&index_lock, 1);
refresh_cache_or_die(refresh_flags);
if (active_cache_changed) {
@@ -395,7 +396,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
memset(&partial, 0, sizeof(partial));
partial.strdup_strings = 1;
- if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec))
+ if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec.raw))
exit(1);
discard_cache();
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 05/21] clean: convert to use parse_pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/clean.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/builtin/clean.c b/builtin/clean.c
index 69c1cda..788ad8c 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -42,7 +42,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
int rm_flags = REMOVE_DIR_KEEP_NESTED_GIT;
struct strbuf directory = STRBUF_INIT;
struct dir_struct dir;
- static const char **pathspec;
+ struct pathspec pathspec;
struct strbuf buf = STRBUF_INIT;
struct string_list exclude_list = STRING_LIST_INIT_NODUP;
const char *qname;
@@ -101,12 +101,12 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
add_exclude(exclude_list.items[i].string, "", 0,
&dir.exclude_list[EXC_CMDL]);
- pathspec = get_pathspec(prefix, argv);
+ parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, argv);
- fill_directory(&dir, pathspec);
+ fill_directory(&dir, pathspec.raw);
- if (pathspec)
- seen = xmalloc(argc > 0 ? argc : 1);
+ if (pathspec.nr)
+ seen = xmalloc(pathspec.nr);
for (i = 0; i < dir.nr; i++) {
struct dir_entry *ent = dir.entries[i];
@@ -141,10 +141,10 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
if (lstat(ent->name, &st))
continue;
- if (pathspec) {
- memset(seen, 0, argc > 0 ? argc : 1);
- matches = match_pathspec(pathspec, ent->name, len,
- 0, seen);
+ if (pathspec.nr) {
+ memset(seen, 0, pathspec.nr);
+ matches = match_pathspec_depth(&pathspec, ent->name, len,
+ 0, seen);
}
if (S_ISDIR(st.st_mode)) {
@@ -169,7 +169,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
}
strbuf_reset(&directory);
} else {
- if (pathspec && !matches)
+ if (pathspec.nr && !matches)
continue;
qname = quote_path_relative(ent->name, -1, &buf, prefix);
if (show_only) {
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 04/21] Export parse_pathspec() and convert some get_pathspec() calls
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
These call sites follow the pattern:
paths = get_pathspec(prefix, argv);
init_pathspec(&pathspec, paths);
which can be converted into a single parse_pathspec() call.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/grep.c | 4 +---
builtin/ls-tree.c | 2 +-
builtin/update-index.c | 3 +--
cache.h | 6 ++++++
revision.c | 4 ++--
setup.c | 6 +++---
6 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/builtin/grep.c b/builtin/grep.c
index 0e1b6c8..705f9ff 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -630,7 +630,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
const char *show_in_pager = NULL, *default_pager = "dummy";
struct grep_opt opt;
struct object_array list = OBJECT_ARRAY_INIT;
- const char **paths = NULL;
struct pathspec pathspec;
struct string_list path_list = STRING_LIST_INIT_NODUP;
int i;
@@ -857,8 +856,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
verify_filename(prefix, argv[j], j == i);
}
- paths = get_pathspec(prefix, argv + i);
- init_pathspec(&pathspec, paths);
+ parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, argv + i);
pathspec.max_depth = opt.max_depth;
pathspec.recursive = 1;
diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c
index fb76e38..a78ba53 100644
--- a/builtin/ls-tree.c
+++ b/builtin/ls-tree.c
@@ -166,7 +166,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
if (get_sha1(argv[0], sha1))
die("Not a valid object name %s", argv[0]);
- init_pathspec(&pathspec, get_pathspec(prefix, argv + 1));
+ parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, argv + 1);
for (i = 0; i < pathspec.nr; i++)
pathspec.items[i].nowildcard_len = pathspec.items[i].len;
pathspec.has_wildcard = 0;
diff --git a/builtin/update-index.c b/builtin/update-index.c
index ada1dff..6728e59 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -546,10 +546,9 @@ static int do_reupdate(int ac, const char **av,
*/
int pos;
int has_head = 1;
- const char **paths = get_pathspec(prefix, av + 1);
struct pathspec pathspec;
- init_pathspec(&pathspec, paths);
+ parse_pathspec(&pathspec, PATHSPEC_FROMTOP, 0, prefix, av + 1);
if (read_ref("HEAD", head_sha1))
/* If there is no HEAD, that means it is an initial
diff --git a/cache.h b/cache.h
index 9304d91..e52365d 100644
--- a/cache.h
+++ b/cache.h
@@ -473,6 +473,9 @@ extern int index_name_is_other(const struct index_state *, const char *, int);
extern int ie_match_stat(const struct index_state *, struct cache_entry *, struct stat *, unsigned int);
extern int ie_modified(const struct index_state *, struct cache_entry *, struct stat *, unsigned int);
+/* Pathspec magic */
+#define PATHSPEC_FROMTOP (1<<0)
+
struct pathspec {
const char **raw; /* get_pathspec() result, not freed by free_pathspec() */
int nr;
@@ -487,6 +490,9 @@ struct pathspec {
};
extern int init_pathspec(struct pathspec *, const char **);
+extern void parse_pathspec(struct pathspec *pathspec, unsigned magic,
+ unsigned flags, const char *prefix,
+ const char **args);
extern void free_pathspec(struct pathspec *);
extern int ce_path_match(const struct cache_entry *ce, const struct pathspec *pathspec);
diff --git a/revision.c b/revision.c
index 95d21e6..a044242 100644
--- a/revision.c
+++ b/revision.c
@@ -1851,8 +1851,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
*/
ALLOC_GROW(prune_data.path, prune_data.nr+1, prune_data.alloc);
prune_data.path[prune_data.nr++] = NULL;
- init_pathspec(&revs->prune_data,
- get_pathspec(revs->prefix, prune_data.path));
+ parse_pathspec(&revs->prune_data, PATHSPEC_FROMTOP, 0,
+ revs->prefix, prune_data.path);
}
if (revs->def == NULL)
diff --git a/setup.c b/setup.c
index 573ef79..cd6680e 100644
--- a/setup.c
+++ b/setup.c
@@ -268,9 +268,9 @@ static int pathspec_item_cmp(const void *a_, const void *b_)
* Given command line arguments and a prefix, convert the input to
* pathspec. die() if any magic other than ones in magic_mask.
*/
-static void parse_pathspec(struct pathspec *pathspec,
- unsigned magic_mask, unsigned flags,
- const char *prefix, const char **argv)
+void parse_pathspec(struct pathspec *pathspec,
+ unsigned magic_mask, unsigned flags,
+ const char *prefix, const char **argv)
{
struct pathspec_item *item;
const char *entry = *argv;
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 03/21] pathspec: make sure the prefix part is wildcard-clean
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Prefix is the result of Git moving back from current directory to
worktree's top directory and it has to prepend all user provided paths
so that they become relative to the new current directory. Any
wildcards in the prefix should not be treated as such because it's not
the user intention. Make sure all wildcards in the prefix part is
disabled.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
setup.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/setup.c b/setup.c
index 4fcdae6..573ef79 100644
--- a/setup.c
+++ b/setup.c
@@ -250,6 +250,8 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
*raw = item->match;
item->len = strlen(item->match);
item->nowildcard_len = simple_length(item->match);
+ if (item->nowildcard_len < prefixlen)
+ item->nowildcard_len = prefixlen;
return magic;
}
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 02/21] Add parse_pathspec() that converts cmdline args to struct pathspec
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
Currently to fill a struct pathspec, we do:
const char **paths;
paths = get_pathspec(prefix, argv);
...
init_pathspec(&pathspec, paths);
"paths" can only carry bare strings, which loses information from
command line arguments such as pathspec magic or the prefix part's
length for each argument.
parse_pathspec() is introduced to combine the two calls into one. The
plan is gradually replace all get_pathspec() and init_pathspec() with
parse_pathspec(). get_pathspec() now becomes a thin wrapper of
parse_pathspec().
parse_pathspec() allows the caller to reject the pathspec magics that
it does not support. When a new pathspec magic is introduced, we can
enable it per command after making sure that all underlying code has no
problem with the new magic.
"flags" parameter is currently unused. But it would allow callers to
pass certain instructions to parse_pathspec, for example forcing
literal pathspec when no magic is used.
With the introduction of parse_pathspec, there are now two functions
that can initialize struct pathspec: init_pathspec and
parse_pathspec. Any semantic changes in struct pathspec must be
reflected in both functions. init_pathspec() will be phased out in
favor of parse_pathspec().
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
dir.c | 2 +-
dir.h | 1 +
setup.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++----------------
3 files changed, 77 insertions(+), 25 deletions(-)
diff --git a/dir.c b/dir.c
index c391d46..31f0995 100644
--- a/dir.c
+++ b/dir.c
@@ -291,7 +291,7 @@ int match_pathspec_depth(const struct pathspec *ps,
/*
* Return the length of the "simple" part of a path match limiter.
*/
-static int simple_length(const char *match)
+int simple_length(const char *match)
{
int len = -1;
diff --git a/dir.h b/dir.h
index f5c89e3..1d4888b 100644
--- a/dir.h
+++ b/dir.h
@@ -66,6 +66,7 @@ struct dir_struct {
#define MATCHED_RECURSIVELY 1
#define MATCHED_FNMATCH 2
#define MATCHED_EXACTLY 3
+extern int simple_length(const char *match);
extern char *common_prefix(const char **pathspec);
extern int match_pathspec(const char **pathspec, const char *name, int namelen, int prefix, char *seen);
extern int match_pathspec_depth(const struct pathspec *pathspec,
diff --git a/setup.c b/setup.c
index f108c4b..4fcdae6 100644
--- a/setup.c
+++ b/setup.c
@@ -174,7 +174,7 @@ static struct pathspec_magic {
/*
* Take an element of a pathspec and check for magic signatures.
- * Append the result to the prefix.
+ * Append the result to the prefix. Return the magic bitmap.
*
* For now, we only parse the syntax and throw out anything other than
* "top" magic.
@@ -185,7 +185,10 @@ static struct pathspec_magic {
* the prefix part must always match literally, and a single stupid
* string cannot express such a case.
*/
-static const char *prefix_pathspec(const char *prefix, int prefixlen, const char *elt)
+static unsigned prefix_pathspec(struct pathspec_item *item,
+ const char **raw,
+ const char *prefix, int prefixlen,
+ const char *elt)
{
unsigned magic = 0;
const char *copyfrom = elt;
@@ -241,39 +244,87 @@ static const char *prefix_pathspec(const char *prefix, int prefixlen, const char
}
if (magic & PATHSPEC_FROMTOP)
- return xstrdup(copyfrom);
+ item->match = xstrdup(copyfrom);
else
- return prefix_path(prefix, prefixlen, copyfrom);
+ item->match = prefix_path(prefix, prefixlen, copyfrom);
+ *raw = item->match;
+ item->len = strlen(item->match);
+ item->nowildcard_len = simple_length(item->match);
+ return magic;
}
-const char **get_pathspec(const char *prefix, const char **pathspec)
+static int pathspec_item_cmp(const void *a_, const void *b_)
{
- const char *entry = *pathspec;
- const char **src, **dst;
- int prefixlen;
+ struct pathspec_item *a, *b;
- if (!prefix && !entry)
- return NULL;
+ a = (struct pathspec_item *)a_;
+ b = (struct pathspec_item *)b_;
+ return strcmp(a->match, b->match);
+}
+
+/*
+ * Given command line arguments and a prefix, convert the input to
+ * pathspec. die() if any magic other than ones in magic_mask.
+ */
+static void parse_pathspec(struct pathspec *pathspec,
+ unsigned magic_mask, unsigned flags,
+ const char *prefix, const char **argv)
+{
+ struct pathspec_item *item;
+ const char *entry = *argv;
+ int i, n, prefixlen;
+
+ memset(pathspec, 0, sizeof(*pathspec));
+
+ /* No arguments, no prefix -> no pathspec */
+ if (!entry && !prefix)
+ return;
+ /* No arguments with prefix -> prefix pathspec */
if (!entry) {
- static const char *spec[2];
- spec[0] = prefix;
- spec[1] = NULL;
- return spec;
+ static const char *raw[2];
+
+ pathspec->items = item = xmalloc(sizeof(*item));
+ item->match = prefix;
+ item->nowildcard_len = item->len = strlen(prefix);
+ raw[0] = prefix;
+ raw[1] = NULL;
+ pathspec->nr = 1;
+ pathspec->raw = raw;
+ return;
}
- /* Otherwise we have to re-write the entries.. */
- src = pathspec;
- dst = pathspec;
+ n = 0;
+ while (argv[n])
+ n++;
+
+ pathspec->nr = n;
+ pathspec->items = item = xmalloc(sizeof(*item) * n);
+ pathspec->raw = argv;
prefixlen = prefix ? strlen(prefix) : 0;
- while (*src) {
- *(dst++) = prefix_pathspec(prefix, prefixlen, *src);
- src++;
+
+ for (i = 0; i < n; i++) {
+ unsigned applied_magic;
+ const char *arg = argv[i];
+
+ applied_magic = prefix_pathspec(item + i, argv + i,
+ prefix, prefixlen, arg);
+ if (applied_magic & ~magic_mask)
+ die(_("pathspec magic in '%s' is not supported"
+ " by this command"), arg);
+ if (item[i].nowildcard_len < item[i].len)
+ pathspec->has_wildcard = 1;
}
- *dst = NULL;
- if (!*pathspec)
- return NULL;
- return pathspec;
+
+ qsort(pathspec->items, pathspec->nr,
+ sizeof(struct pathspec_item), pathspec_item_cmp);
+}
+
+const char **get_pathspec(const char *prefix, const char **pathspec)
+{
+ struct pathspec ps;
+ parse_pathspec(&ps, PATHSPEC_FROMTOP, 0, prefix, pathspec);
+ return ps.raw;
}
/*
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 01/21] pathspec: save the non-wildcard length part
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy, Junio C Hamano
In-Reply-To: <1357453268-12543-1-git-send-email-pclouds@gmail.com>
We mark pathspec with wildcards with the field use_wildcard. We
could do better by saving the length of the non-wildcard part, which
can be used for optimizations such as f9f6e2c (exclude: do strcmp as
much as possible before fnmatch - 2012-06-07).
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
builtin/ls-files.c | 2 +-
builtin/ls-tree.c | 2 +-
cache.h | 2 +-
dir.c | 6 +++---
tree-walk.c | 4 ++--
5 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index b5434af..4a9ee69 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -337,7 +337,7 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix)
matchbuf[0] = prefix;
matchbuf[1] = NULL;
init_pathspec(&pathspec, matchbuf);
- pathspec.items[0].use_wildcard = 0;
+ pathspec.items[0].nowildcard_len = pathspec.items[0].len;
} else
init_pathspec(&pathspec, NULL);
if (read_tree(tree, 1, &pathspec))
diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c
index 235c17c..fb76e38 100644
--- a/builtin/ls-tree.c
+++ b/builtin/ls-tree.c
@@ -168,7 +168,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
init_pathspec(&pathspec, get_pathspec(prefix, argv + 1));
for (i = 0; i < pathspec.nr; i++)
- pathspec.items[i].use_wildcard = 0;
+ pathspec.items[i].nowildcard_len = pathspec.items[i].len;
pathspec.has_wildcard = 0;
tree = parse_tree_indirect(sha1);
if (!tree)
diff --git a/cache.h b/cache.h
index 2b192d2..9304d91 100644
--- a/cache.h
+++ b/cache.h
@@ -482,7 +482,7 @@ struct pathspec {
struct pathspec_item {
const char *match;
int len;
- unsigned int use_wildcard:1;
+ int nowildcard_len;
} *items;
};
diff --git a/dir.c b/dir.c
index 5a83aa7..c391d46 100644
--- a/dir.c
+++ b/dir.c
@@ -230,7 +230,7 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix,
return MATCHED_RECURSIVELY;
}
- if (item->use_wildcard && !fnmatch(match, name, 0))
+ if (item->nowildcard_len < item->len && !fnmatch(match, name, 0))
return MATCHED_FNMATCH;
return 0;
@@ -1429,8 +1429,8 @@ int init_pathspec(struct pathspec *pathspec, const char **paths)
item->match = path;
item->len = strlen(path);
- item->use_wildcard = !no_wildcard(path);
- if (item->use_wildcard)
+ item->nowildcard_len = simple_length(path);
+ if (item->nowildcard_len < item->len)
pathspec->has_wildcard = 1;
}
diff --git a/tree-walk.c b/tree-walk.c
index 3f54c02..af871c5 100644
--- a/tree-walk.c
+++ b/tree-walk.c
@@ -626,7 +626,7 @@ enum interesting tree_entry_interesting(const struct name_entry *entry,
&never_interesting))
return entry_interesting;
- if (item->use_wildcard) {
+ if (item->nowildcard_len < item->len) {
if (!fnmatch(match + baselen, entry->path, 0))
return entry_interesting;
@@ -642,7 +642,7 @@ enum interesting tree_entry_interesting(const struct name_entry *entry,
}
match_wildcards:
- if (!item->use_wildcard)
+ if (item->nowildcard_len == item->len)
continue;
/*
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply related
* [PATCH 00/21] "struct pathspec" conversion
From: Nguyễn Thái Ngọc Duy @ 2013-01-06 6:20 UTC (permalink / raw)
To: git; +Cc: Nguyễn Thái Ngọc Duy
This is another step towards the pathspec unification. This series
introduces a get_pathspec() alternative: parse_pathspec(). The new
function intializes struct pathspec directly. Many builtin commands
(except mv) are converted to use this function. As a result, struct
pathspec is used from the start for many commands.
The next step would be dealing with pathspec manipulation code blocks
that use "raw" field, init_pathspec or get_pathspec(). add.c, dir.c,
rm.c and mv.c are hot places. And perhaps move pathspec code from
dir.c and setup.c to pathspec.c after as/check-ignore enters "master".
This series shares a patch (the first one) with nd/pathspec-wildcard. I
put the patch in the series to avoid dependency.
This series also disables wildcards in the prefix part, but it's only
effective in combination with nd/pathspec-wildcard. And of course it's
not fully effective until all "raw" use is eliminated.
Nguyễn Thái Ngọc Duy (21):
pathspec: save the non-wildcard length part
Add parse_pathspec() that converts cmdline args to struct pathspec
pathspec: make sure the prefix part is wildcard-clean
Export parse_pathspec() and convert some get_pathspec() calls
clean: convert to use parse_pathspec
commit: convert to use parse_pathspec
status: convert to use parse_pathspec
rerere: convert to use parse_pathspec
checkout: convert to use parse_pathspec
rm: convert to use parse_pathspec
ls-files: convert to use parse_pathspec
archive: convert to use parse_pathspec
add: convert to use parse_pathspec
Convert read_cache_preload() to take struct pathspec
Convert unmerge_cache to take struct pathspec
checkout: convert read_tree_some to take struct pathspec
Convert report_path_error to take struct pathspec
Convert refresh_index to take struct pathspec
Convert {read,fill}_directory to take struct pathspec
Convert add_files_to_cache to take struct pathspec
Convert more init_pathspec() to parse_pathspec()
archive.c | 12 +++---
archive.h | 2 +-
builtin/add.c | 75 ++++++++++++++++++------------------
builtin/checkout.c | 37 ++++++++----------
builtin/clean.c | 20 +++++-----
builtin/commit.c | 35 +++++++++--------
builtin/diff-files.c | 2 +-
builtin/diff-index.c | 2 +-
builtin/diff.c | 4 +-
builtin/grep.c | 6 +--
builtin/log.c | 2 +-
builtin/ls-files.c | 64 +++++++++++--------------------
builtin/ls-tree.c | 4 +-
builtin/rerere.c | 6 +--
builtin/rm.c | 16 ++++----
builtin/update-index.c | 3 +-
cache.h | 19 +++++++---
diff-lib.c | 2 +-
dir.c | 38 ++++++++++++++-----
dir.h | 5 ++-
merge-recursive.c | 2 +-
preload-index.c | 20 +++++-----
read-cache.c | 5 ++-
rerere.c | 6 +--
rerere.h | 4 +-
resolve-undo.c | 4 +-
resolve-undo.h | 2 +-
revision.c | 4 +-
setup.c | 101 +++++++++++++++++++++++++++++++++++++------------
tree-walk.c | 4 +-
tree.c | 4 +-
tree.h | 2 +-
wt-status.c | 17 ++++-----
wt-status.h | 2 +-
34 files changed, 291 insertions(+), 240 deletions(-)
--
1.8.0.rc2.23.g1fb49df
^ permalink raw reply
* Re: Version 1.8.1 does not compile on Cygwin 1.7.14
From: Stephen & Linda Smith @ 2013-01-06 6:20 UTC (permalink / raw)
To: git, jpyeron
In-Reply-To: <2491041.bQ51Qu8HcA@thunderbird>
> Was it the commit before
> 9fca6cffc05321445b59c91e8f8d308f41588b53 that compiles or was
> it 9fca6cffc05321445b59c91e8f8d308f41588b53 that compiled? I
> am doing a cygwin update presently to look at it.
Since the email earlier today, I had blown away the directory. I just now
did the following
git clone https://github.com/git/git.git git-src && cd git-src && make all
... The make errored out as before
git co 9fca6c && make all
... The make errored out as before
git co 9fca6c^ && make all
... and this compiles to completion
CYGWIN_NT-5.1 WINXPMACHINE 1.7.14(0.260/5/3) 2012-04-24 17:22 i686 Cygwin
What else can I do to test this out (I will get a current cygwin tomorrow to
use in a test).
^ permalink raw reply
* Re: Trying to understand the web dav details
From: Jeff King @ 2013-01-06 5:38 UTC (permalink / raw)
To: Pyeron, Jason J CTR (US); +Cc: 'git'
In-Reply-To: <871B6C10EBEFE342A772D1159D1320853A011871@umechphj.easf.csd.disa.mil>
On Sun, Jan 06, 2013 at 04:49:57AM +0000, Pyeron, Jason J CTR (US) wrote:
> > > How does the ?service=xxxx get translated in to the action
> > > performed on the web server?
> >
> > If you are using the git-http-backend CGI, it will interpret the
> > service
>
> No, using plain jane http and webdav. This server is not "allowed" to
> use cgi processes.
Then the service parameter should be ignored by your webserver, and it
should just serve the info/refs file from the repository on the
filesystem. And you are stuck using WebDAV for push.
> > GET /git/project-x/info/refs HTTP/1.1
> [...]
> * The requested URL returned error: 404 Not Found
Does the info/refs file exist in the project-x repository?
> fatal: https://server/git/project-x/info/refs not found: did you run git update-server-info on the server?
Did you?
If you can't run any git programs on the server at all (and it sounds
like that may be the case), you'll need to run it locally before putting
the repository data on the server.
Once you have WebDAV set up for pushing, it will update the info/refs
file for each push. But if you are initially seeding the server with
rsync or a tarfile, you'll want to make sure it has an up-to-date
info/refs file.
-Peff
^ permalink raw reply
* Re: [PATCH] Alphabetize the fast-import options, following a suggestion on the list.
From: Eric S. Raymond @ 2013-01-06 5:13 UTC (permalink / raw)
To: Jonathan Nieder; +Cc: git, David Michael Barr, Pete Wyckoff
In-Reply-To: <20130105231151.GD3247@elie.Belkin>
Jonathan Nieder <jrnieder@gmail.com>:
> But in fact the current options list doesn't seem to be well organized at all.
I agree.
> What do you think would be a logical way to group these?
>
> Features of input syntax
>
> --date-format
> --done
>
> Verbosity
>
> --quiet
> --stats
>
> Marks handling (checkpoint/restore)
>
> --import-marks
> --import-marks-if-exists
> --export-marks
> --relative-marks
>
> Semantics of execution
>
> --dry-run
> --force
> --cat-blob-fd
> --export-pack-edges
>
> Tuning
>
> --active-branches
> --max-pack-size
> --big-file-threshold
> --depth
That would work as well or better than any other organization I can
think of. Um, which is significant because my work on surgery tools
and exporters means I've had to consult this page a *lot*.
--
<a href="http://www.catb.org/~esr/">Eric S. Raymond</a>
^ permalink raw reply
* RE: Trying to understand the web dav details
From: Pyeron, Jason J CTR (US) @ 2013-01-06 4:49 UTC (permalink / raw)
To: 'git'
In-Reply-To: <20130106041942.GB4879@sigill.intra.peff.net>
[-- Attachment #1: Type: text/plain, Size: 11629 bytes --]
> -----Original Message-----
> From: Jeff King
> Sent: Saturday, January 05, 2013 11:20 PM
>
> On Sat, Jan 05, 2013 at 08:32:09PM -0500, Jason Pyeron wrote:
>
> > When doing a clone by https (reverse proxied to http) the first
> request is
> >
> > GET /git/project/info/refs?service=git-upload-pack
> >
> > How does the ?service=xxxx get translated in to the action performed
> on the web
> > server?
>
> If you are using the git-http-backend CGI, it will interpret the
> service
No, using plain jane http and webdav. This server is not "allowed" to use cgi processes.
> tag and start smart-http. See "git help http-backend" for details on
> plugging it into Apache.
>
> Cloning/fetching does not use DAV at all; it is only for non-smart
> pushing (and I would not recommend setting it up; the smart protocol
> spoken by git-http-backend does pushing much more efficiently, and is
> better maintained).
>
> > I ask because I have 2 projects, one works the other does not.
Should have said I get a 404 versus 200, see below.
> >
> > I am using httpd-2.0.52-49.ent.centos4 and git-1.7.9.6-1.
> >
> > I am not even sure what to tell more about or where to look next.
>
> If you haven't set up git-http-backend, then git is just going to fetch
> the remote repo's data directly over http. So the usual advice for
> accessing something via http would apply (check the server's access and
> error logs, try hitting it with a web browser, etc).
>
> If you set GIT_CURL_VERBOSE=1 in your environment, git will spew a lot
That’s what I did before mailing out the first time. I tried to summarize the contents, but I will paste the relevant portions below.
> of debugging information about what http requests it is making. That
> might give you a clue (you haven't said anything about what does not
> work, so I can't be more specific).
Below are two traces, the first one is the one that does not work, the second does. I cannot see any differences on the web server for the two directory trees.
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
jason.pyeron@localhost ~/tmp
$ GIT_TRACE=1 GIT_CURL_VERBOSE=1 git clone https://server/git/project-x
trace: built-in: git 'clone' 'https://server/git/project-x'
Cloning into 'project-x'...
trace: run_command: 'git-remote-https' 'origin' 'https://server/git/project-x'
* Couldn't find host server in the .netrc file; using defaults
* About to connect() to proxy 214.36.0.135 port 8080 (#0)
* Trying 214.36.0.135...
* 0x80076a48 is at send pipe head!
* STATE: CONNECT => WAITCONNECT handle 0x8007f3c0; (connection #0)
* Connected to 214.36.0.135 (214.36.0.135) port 8080 (#0)
* Connected to 214.36.0.135 (214.36.0.135) port 8080 (#0)
* Establish HTTP proxy tunnel to server:443
> CONNECT server:443 HTTP/1.1
Host: server:443
User-Agent: git/1.7.9
Proxy-Connection: Keep-Alive
Pragma: no-cache
* STATE: WAITCONNECT => WAITPROXYCONNECT handle 0x8007f3c0; (connection #0)
* Multi mode finished polling for response from proxy CONNECT
< HTTP/1.1 200 Connection established
<
* Proxy replied OK to CONNECT request
* successfully set certificate verify locations:
* CAfile: /usr/ssl/certs/ca-bundle.crt
CApath: none
* STATE: WAITPROXYCONNECT => WAITCONNECT handle 0x8007f3c0; (connection #0)
* STATE: WAITCONNECT => PROTOCONNECT handle 0x8007f3c0; (connection #0)
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
* subject: C=US; ST=Maryland; O=PD Inc; OU=Intranet; CN=server; emailAddress=security@pdinc.us
* start date: 201
* expire date: 201
* issuer: C=U
* SSL certificate verify result: self signed certificate in certificate chain (19), continuing anyway.
* STATE: PROTOCONNECT => DO handle 0x8007f3c0; (connection #0)
> GET /git/project-x/info/refs?service=git-upload-pack HTTP/1.1
User-Agent: git/1.7.9
Host: server
Accept: */*
Pragma: no-cache
* STATE: DO => DO_DONE handle 0x8007f3c0; (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x8007f3c0; (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x8007f3c0; (connection #0)
* additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0
* additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0
* The requested URL returned error: 404 Not Found
* Closing connection #0
* Couldn't find host server in the .netrc file; using defaults
* About to connect() to proxy 214.36.0.135 port 8080 (#0)
* Trying 214.36.0.135...
* 0x80076a48 is at send pipe head!
* STATE: CONNECT => WAITCONNECT handle 0x80139640; (connection #0)
* Connected to 214.36.0.135 (214.36.0.135) port 8080 (#0)
* Connected to 214.36.0.135 (214.36.0.135) port 8080 (#0)
* Establish HTTP proxy tunnel to server:443
> CONNECT server:443 HTTP/1.1
Host: server:443
User-Agent: git/1.7.9
Proxy-Connection: Keep-Alive
Pragma: no-cache
* STATE: WAITCONNECT => WAITPROXYCONNECT handle 0x80139640; (connection #0)
* Multi mode finished polling for response from proxy CONNECT
< HTTP/1.1 200 Connection established
<
* Proxy replied OK to CONNECT request
* successfully set certificate verify locations:
* CAfile: /usr/ssl/certs/ca-bundle.crt
CApath: none
* SSL re-using session ID
* STATE: WAITPROXYCONNECT => WAITCONNECT handle 0x80139640; (connection #0)
* STATE: WAITCONNECT => PROTOCONNECT handle 0x80139640; (connection #0)
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
* subject: C=US; ST=Maryland; O=PD Inc; OU=Intranet; CN=server; emailAddress=security@pdinc.us
* start date: 201
* expire date: 201
* issuer: C=U
* SSL certificate verify result: self signed certificate in certificate chain (19), continuing anyway.
* STATE: PROTOCONNECT => DO handle 0x80139640; (connection #0)
> GET /git/project-x/info/refs HTTP/1.1
User-Agent: git/1.7.9
Host: server
Accept: */*
Pragma: no-cache
* STATE: DO => DO_DONE handle 0x80139640; (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x80139640; (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x80139640; (connection #0)
* additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0
* additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0
* additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0
* additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0
* additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0
* The requested URL returned error: 404 Not Found
* Closing connection #0
fatal: https://server/git/project-x/info/refs not found: did you run git update-server-info on the server?
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
jason.pyeron@localhost ~/tmp
$ GIT_TRACE=1 GIT_CURL_VERBOSE=1 git clone https://server/git/test
trace: built-in: git 'clone' 'https://server/git/test'
Cloning into 'test'...
trace: run_command: 'git-remote-https' 'origin' 'https://server/git/test'
* Couldn't find host server in the .netrc file; using defaults
* About to connect() to proxy 214.36.0.135 port 8080 (#0)
* Trying 214.36.0.135...
* 0x80076968 is at send pipe head!
* STATE: CONNECT => WAITCONNECT handle 0x8007f2c8; (connection #0)
* Connected to 214.36.0.135 (214.36.0.135) port 8080 (#0)
* Connected to 214.36.0.135 (214.36.0.135) port 8080 (#0)
* Establish HTTP proxy tunnel to server:443
> CONNECT server:443 HTTP/1.1
Host: server:443
User-Agent: git/1.7.9
Proxy-Connection: Keep-Alive
Pragma: no-cache
* STATE: WAITCONNECT => WAITPROXYCONNECT handle 0x8007f2c8; (connection #0)
* Multi mode finished polling for response from proxy CONNECT
< HTTP/1.1 200 Connection established
<
* Proxy replied OK to CONNECT request
* successfully set certificate verify locations:
* CAfile: /usr/ssl/certs/ca-bundle.crt
CApath: none
* STATE: WAITPROXYCONNECT => WAITCONNECT handle 0x8007f2c8; (connection #0)
* STATE: WAITCONNECT => PROTOCONNECT handle 0x8007f2c8; (connection #0)
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
* subject: C=US; ST=Maryland; O=PD Inc; OU=Intranet; CN=server; emailAddress=security@pdinc.us
* start date: 201
* expire date: 201
* issuer: C=U
* SSL certificate verify result: self signed certificate in certificate chain (19), continuing anyway.
* STATE: PROTOCONNECT => DO handle 0x8007f2c8; (connection #0)
> GET /git/test/info/refs?service=git-upload-pack HTTP/1.1
User-Agent: git/1.7.9
Host: server
Accept: */*
Pragma: no-cache
* STATE: DO => DO_DONE handle 0x8007f2c8; (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x8007f2c8; (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x8007f2c8; (connection #0)
* additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0
* additional stuff not fine /usr/src/ports/curl/curl-7.27.0-1/src/curl-7.27.0/lib/transfer.c:1037: 0 0
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Date: Sun, 06 Jan 2013 04:26:14 GMT
< Server: Apache/2.0.52 (CentOS)
< Last-Modified: Fri, 02 Nov 2012 05:05:55 GMT
< ETag: "714064-3b-172852c0"
< Accept-Ranges: bytes
< Content-Length: 59
< Content-Type: text/plain; charset=UTF-8
< Connection: close
<
* STATE: PERFORM => DONE handle 0x8007f2c8; (connection #0)
* Closing connection #0
* Couldn't find host server in the .netrc file; using defaults
* About to connect() to proxy 214.36.0.135 port 8080 (#0)
* Trying 214.36.0.135...
* 0x80076968 is at send pipe head!
* STATE: CONNECT => WAITCONNECT handle 0x801395e8; (connection #0)
* Connected to 214.36.0.135 (214.36.0.135) port 8080 (#0)
* Connected to 214.36.0.135 (214.36.0.135) port 8080 (#0)
* Establish HTTP proxy tunnel to server:443
> CONNECT server:443 HTTP/1.1
Host: server:443
User-Agent: git/1.7.9
Proxy-Connection: Keep-Alive
Pragma: no-cache
* STATE: WAITCONNECT => WAITPROXYCONNECT handle 0x801395e8; (connection #0)
* Multi mode finished polling for response from proxy CONNECT
< HTTP/1.1 200 Connection established
<
* Proxy replied OK to CONNECT request
* successfully set certificate verify locations:
* CAfile: /usr/ssl/certs/ca-bundle.crt
CApath: none
* SSL re-using session ID
* STATE: WAITPROXYCONNECT => WAITCONNECT handle 0x801395e8; (connection #0)
* STATE: WAITCONNECT => PROTOCONNECT handle 0x801395e8; (connection #0)
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
* subject: C=US; ST=Maryland; O=PD Inc; OU=Intranet; CN=server; emailAddress=security@pdinc.us
* start date: 201
* expire date: 201
* issuer: C=U
* SSL certificate verify result: self signed certificate in certificate chain (19), continuing anyway.
* STATE: PROTOCONNECT => DO handle 0x801395e8; (connection #0)
> GET /git/test/HEAD HTTP/1.1
[-- Attachment #2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 5615 bytes --]
^ permalink raw reply
* RE: Version 1.8.1 does not compile on Cygwin 1.7.14
From: Jason Pyeron @ 2013-01-06 4:22 UTC (permalink / raw)
To: git
In-Reply-To: <F09573B23A5F449BBB6364F4D84D077D@black>
> -----Original Message-----
> From: Jason Pyeron
> Sent: Saturday, January 05, 2013 22:38
>
>
> > Stephen & Linda Smith
> > Sent: Saturday, January 05, 2013 21:05
> >
> > Commit 9fca6cffc05321445b59c91e8f8d308f41588b53 message
> states that
> > the macro was being renamed for clarity. The patch also changes a
> > define.
>
> Was it the commit before
> 9fca6cffc05321445b59c91e8f8d308f41588b53 that compiles or was
> it 9fca6cffc05321445b59c91e8f8d308f41588b53 that compiled? I
> am doing a cygwin update presently to look at it.
>
> >
> > This change causes the code to not compile on cygwin 1.7.14.
> >
> > I narrowed the problem to this patch by bisecting commits between
> > v1.8.0 and
> > 1.8.1
> >
> > Here is the error sequence:
Cannot reproduce on head and current cygwin, more details please.
> >
> > CC compat/cygwin.o
> > In file included from compat/../git-compat-util.h:90,
> > from compat/cygwin.c:9:
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:103:2:
> > warning: #warning "fd_set and associated macros have been
> > defined in sys/types.
> > This may cause runtime problems with W32 sockets"
> > In file included from /usr/include/sys/socket.h:16,
> > from compat/../git-compat-util.h:131,
> > from compat/cygwin.c:9:
> > /usr/include/cygwin/socket.h:29: error: redefinition of `struct
> > sockaddr'
> > /usr/include/cygwin/socket.h:41: error: redefinition of `struct
> > sockaddr_storage'
> > In file included from /usr/include/sys/socket.h:16,
> > from compat/../git-compat-util.h:131,
> > from compat/cygwin.c:9:
> > /usr/include/cygwin/socket.h:59: error: redefinition of `struct
> > linger'
> > In file included from compat/../git-compat-util.h:131,
> > from compat/cygwin.c:9:
> > /usr/include/sys/socket.h:30: error: conflicting types for 'accept'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:536:
> > error: previous declaration of 'accept' was here
> > /usr/include/sys/socket.h:30: error: conflicting types for 'accept'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:536:
jpyeron@porsche /projects/git/git
$ make && uname -a && git status && git log --oneline | head -n1
GEN perl/PM.stamp
SUBDIR gitweb
SUBDIR ../
make[2]: `GIT-VERSION-FILE' is up to date.
GEN git-instaweb
BUILTIN all
SUBDIR git-gui
SUBDIR gitk-git
make[1]: Nothing to be done for `all'.
SUBDIR perl
SUBDIR git_remote_helpers
SUBDIR templates
CYGWIN_NT-5.2-WOW64 porsche 1.7.17(0.262/5/3) 2012-10-19 14:39 i686 Cygwin
# On branch master
nothing to commit (working directory clean)
3e293fb Update draft release notes to 1.8.2
> > error: previous declaration of 'accept' was here
> > /usr/include/sys/socket.h:32: error: conflicting types for 'bind'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:537:
> > error: previous declaration of 'bind' was here
> > /usr/include/sys/socket.h:32: error: conflicting types for 'bind'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:537:
> > error: previous declaration of 'bind' was here
> > /usr/include/sys/socket.h:33: error: conflicting types for 'connect'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:539:
> > error: previous declaration of 'connect' was here
> > /usr/include/sys/socket.h:33: error: conflicting types for 'connect'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:539:
> > error: previous declaration of 'connect' was here
> > /usr/include/sys/socket.h:34: error: conflicting types for
> > 'getpeername'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:541:
> > error: previous declaration of 'getpeername' was here
> > /usr/include/sys/socket.h:34: error: conflicting types for
> > 'getpeername'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:541:
> > error: previous declaration of 'getpeername' was here
> > /usr/include/sys/socket.h:35: error: conflicting types for
> > 'getsockname'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:542:
> > error: previous declaration of 'getsockname' was here
> > /usr/include/sys/socket.h:35: error: conflicting types for
> > 'getsockname'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:542:
> > error: previous declaration of 'getsockname' was here
> > /usr/include/sys/socket.h:36: error: conflicting types for 'listen'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:546:
> > error: previous declaration of 'listen' was here
> > /usr/include/sys/socket.h:36: error: conflicting types for 'listen'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:546:
> > error: previous declaration of 'listen' was here
> > /usr/include/sys/socket.h:37: error: conflicting types for 'recv'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:547:
> > error: previous declaration of 'recv' was here
> > /usr/include/sys/socket.h:37: error: conflicting types for 'recv'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:547:
> > error: previous declaration of 'recv' was here
> > /usr/include/sys/socket.h:39: error: conflicting types for
> 'recvfrom'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:548:
> > error: previous declaration of 'recvfrom' was here
> > /usr/include/sys/socket.h:39: error: conflicting types for
> 'recvfrom'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:548:
> > error: previous declaration of 'recvfrom' was here
> > /usr/include/sys/socket.h:41: error: conflicting types for 'send'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:549:
> > error: previous declaration of 'send' was here
> > /usr/include/sys/socket.h:41: error: conflicting types for 'send'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:549:
> > error: previous declaration of 'send' was here
> > /usr/include/sys/socket.h:44: error: conflicting types for 'sendto'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:550:
> > error: previous declaration of 'sendto' was here
> > /usr/include/sys/socket.h:44: error: conflicting types for 'sendto'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:550:
> > error: previous declaration of 'sendto' was here
> > /usr/include/sys/socket.h:46: error: conflicting types for
> > 'setsockopt'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:551:
> > error: previous declaration of 'setsockopt' was here
> > /usr/include/sys/socket.h:46: error: conflicting types for
> > 'setsockopt'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:551:
> > error: previous declaration of 'setsockopt' was here
> > /usr/include/sys/socket.h:48: error: conflicting types for
> > 'getsockopt'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:543:
> > error: previous declaration of 'getsockopt' was here
> > /usr/include/sys/socket.h:48: error: conflicting types for
> > 'getsockopt'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:543:
> > error: previous declaration of 'getsockopt' was here
> > /usr/include/sys/socket.h:49: error: conflicting types for
> 'shutdown'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:552:
> > error: previous declaration of 'shutdown' was here
> > /usr/include/sys/socket.h:49: error: conflicting types for
> 'shutdown'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:552:
> > error: previous declaration of 'shutdown' was here
> > /usr/include/sys/socket.h:50: error: conflicting types for 'socket'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:553:
> > error: previous declaration of 'socket' was here
> > /usr/include/sys/socket.h:50: error: conflicting types for 'socket'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:553:
> > error: previous declaration of 'socket' was here
> > /usr/include/sys/socket.h:53: error: conflicting types for
> > 'getservbyname'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:557:
> > error: previous declaration of 'getservbyname' was here
> > /usr/include/sys/socket.h:53: error: conflicting types for
> > 'getservbyname'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:557:
> > error: previous declaration of 'getservbyname' was here In file
> > included from compat/../git-compat-util.h:135,
> > from compat/cygwin.c:9:
> > /usr/include/sys/select.h:31: error: conflicting types for 'select'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:632:
> > error: previous declaration of 'select' was here
> > /usr/include/sys/select.h:31: error: conflicting types for 'select'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:632:
> > error: previous declaration of 'select' was here In file
> included from
> > /usr/include/netinet/in.h:14,
> > from compat/../git-compat-util.h:137,
> > from compat/cygwin.c:9:
> > /usr/include/cygwin/in.h:30: error: parse error before numeric
> > constant
> > /usr/include/cygwin/in.h:35: error: parse error before numeric
> > constant
> > /usr/include/cygwin/in.h:37: error: parse error before numeric
> > constant
> > /usr/include/cygwin/in.h:76: error: parse error before numeric
> > constant
> > /usr/include/cygwin/in.h:115: error: redefinition of
> `struct in_addr'
> > /usr/include/cygwin/in.h:116: error: parse error before '.' token
> > /usr/include/cygwin/in.h:184: error: redefinition of `struct
> > sockaddr_in'
> > In file included from /usr/include/cygwin/in.h:250,
> > from /usr/include/netinet/in.h:14,
> > from compat/../git-compat-util.h:137,
> > from compat/cygwin.c:9:
> > /usr/include/asm/byteorder.h:26: error: conflicting types
> for 'ntohl'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:629:
> > error: previous declaration of 'ntohl' was here
> > /usr/include/asm/byteorder.h:26: error: conflicting types
> for 'ntohl'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:629:
> > error: previous declaration of 'ntohl' was here
> > /usr/include/asm/byteorder.h:27: error: conflicting types
> for 'ntohs'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:631:
> > error: previous declaration of 'ntohs' was here
> > /usr/include/asm/byteorder.h:27: error: conflicting types
> for 'ntohs'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:631:
> > error: previous declaration of 'ntohs' was here
> > /usr/include/asm/byteorder.h:28: error: conflicting types
> for 'htonl'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:628:
> > error: previous declaration of 'htonl' was here
> > /usr/include/asm/byteorder.h:28: error: conflicting types
> for 'htonl'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:628:
> > error: previous declaration of 'htonl' was here
> > /usr/include/asm/byteorder.h:29: error: conflicting types
> for 'htons'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:630:
> > error: previous declaration of 'htons' was here
> > /usr/include/asm/byteorder.h:29: error: conflicting types
> for 'htons'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:630:
> > error: previous declaration of 'htons' was here In file
> included from
> > compat/../git-compat-util.h:139,
> > from compat/cygwin.c:9:
> > /usr/include/arpa/inet.h:22: error: conflicting types for
> 'inet_addr'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:544:
> > error: previous declaration of 'inet_addr' was here
> > /usr/include/arpa/inet.h:22: error: conflicting types for
> 'inet_addr'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:544:
> > error: previous declaration of 'inet_addr' was here
> > /usr/include/arpa/inet.h:28: error: conflicting types for
> 'inet_ntoa'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:545:
> > error: previous declaration of 'inet_ntoa' was here
> > /usr/include/arpa/inet.h:28: error: conflicting types for
> 'inet_ntoa'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:545:
> > error: previous declaration of 'inet_ntoa' was here In file
> included
> > from compat/../git-compat-util.h:140,
> > from compat/cygwin.c:9:
> > /usr/include/netdb.h:79: error: redefinition of `struct hostent'
> > /usr/include/netdb.h:93: error: redefinition of `struct netent'
> > /usr/include/netdb.h:100: error: redefinition of `struct servent'
> > /usr/include/netdb.h:108: error: redefinition of `struct protoent'
> > /usr/include/netdb.h:139: error: conflicting types for
> > 'WSAGetLastError'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:594:
> > error: previous declaration of 'WSAGetLastError' was here
> > /usr/include/netdb.h:139: error: conflicting types for
> > 'WSAGetLastError'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:594:
> > error: previous declaration of 'WSAGetLastError' was here
> > /usr/include/netdb.h:192: error: conflicting types for
> 'gethostbyaddr'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:554:
> > error: previous declaration of 'gethostbyaddr' was here
> > /usr/include/netdb.h:192: error: conflicting types for
> 'gethostbyaddr'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:554:
> > error: previous declaration of 'gethostbyaddr' was here
> > /usr/include/netdb.h:193: error: conflicting types for
> 'gethostbyname'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:555:
> > error: previous declaration of 'gethostbyname' was here
> > /usr/include/netdb.h:193: error: conflicting types for
> 'gethostbyname'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:555:
> > error: previous declaration of 'gethostbyname' was here
> > /usr/include/netdb.h:199: error: conflicting types for
> > 'getprotobyname'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:559:
> > error: previous declaration of 'getprotobyname' was here
> > /usr/include/netdb.h:199: error: conflicting types for
> > 'getprotobyname'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:559:
> > error: previous declaration of 'getprotobyname' was here
> > /usr/include/netdb.h:200: error: conflicting types for
> > 'getprotobynumber'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:558:
> > error: previous declaration of 'getprotobynumber' was here
> > /usr/include/netdb.h:200: error: conflicting types for
> > 'getprotobynumber'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:558:
> > error: previous declaration of 'getprotobynumber' was here
> > /usr/include/netdb.h:203: error: conflicting types for
> 'getservbyport'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:556:
> > error: previous declaration of 'getservbyport' was here
> > /usr/include/netdb.h:203: error: conflicting types for
> 'getservbyport'
> > /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/w
> insock2.h:556:
> > error: previous declaration of 'getservbyport' was here
> > Makefile:2384: recipe for target `compat/cygwin.o' failed
> > make: *** [compat/cygwin.o] Error 1
> > --
> > To unsubscribe from this list: send the line "unsubscribe
> git" in the
> > body of a message to majordomo@vger.kernel.org More
> majordomo info at
> > http://vger.kernel.org/majordomo-info.html
> >
--
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- -
- Jason Pyeron PD Inc. http://www.pdinc.us -
- Principal Consultant 10 West 24th Street #100 -
- +1 (443) 269-1555 x333 Baltimore, Maryland 21218 -
- -
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
This message is copyright PD Inc, subject to license 20080407P00.
^ permalink raw reply
* Re: Trying to understand the web dav details
From: Jeff King @ 2013-01-06 4:19 UTC (permalink / raw)
To: Jason Pyeron; +Cc: 'git'
In-Reply-To: <151C51E6FBD848739A43A2C17D78DD68@black>
On Sat, Jan 05, 2013 at 08:32:09PM -0500, Jason Pyeron wrote:
> When doing a clone by https (reverse proxied to http) the first request is
>
> GET /git/project/info/refs?service=git-upload-pack
>
> How does the ?service=xxxx get translated in to the action performed on the web
> server?
If you are using the git-http-backend CGI, it will interpret the service
tag and start smart-http. See "git help http-backend" for details on
plugging it into Apache.
Cloning/fetching does not use DAV at all; it is only for non-smart
pushing (and I would not recommend setting it up; the smart protocol
spoken by git-http-backend does pushing much more efficiently, and is
better maintained).
> I ask because I have 2 projects, one works the other does not.
>
> I am using httpd-2.0.52-49.ent.centos4 and git-1.7.9.6-1.
>
> I am not even sure what to tell more about or where to look next.
If you haven't set up git-http-backend, then git is just going to fetch
the remote repo's data directly over http. So the usual advice for
accessing something via http would apply (check the server's access and
error logs, try hitting it with a web browser, etc).
If you set GIT_CURL_VERBOSE=1 in your environment, git will spew a lot
of debugging information about what http requests it is making. That
might give you a clue (you haven't said anything about what does not
work, so I can't be more specific).
-Peff
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox