Merge branch 'ar/wildcardpush'
authorJunio C Hamano <gitster@pobox.com>
Sat, 9 Jun 2007 04:03:36 +0000 (21:03 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 9 Jun 2007 04:03:36 +0000 (21:03 -0700)
* ar/wildcardpush:
  Test wildcard push/fetch
  Fix push with refspecs containing wildcards

26 files changed:
builtin-branch.c
builtin-mailinfo.c
builtin-mailsplit.c
builtin-revert.c
builtin-stripspace.c
builtin.h
commit.c
commit.h
contrib/gitview/gitview
daemon.c
diff.c
diff.h
git-checkout.sh
git-clone.sh
git-cvsserver.perl
quote.c
quote.h
revision.c
revision.h
sha1_name.c
t/t5701-clone-local.sh [new file with mode: 0755]
t/t7201-co.sh
t/t9400-git-cvsserver-server.sh
upload-pack.c
wt-status.c
xdiff/xemit.c

index 67f46c1..da48051 100644 (file)
@@ -55,7 +55,7 @@ static int parse_branch_color_slot(const char *var, int ofs)
        die("bad config variable '%s'", var);
 }
 
-int git_branch_config(const char *var, const char *value)
+static int git_branch_config(const char *var, const char *value)
 {
        if (!strcmp(var, "color.branch")) {
                branch_use_color = git_config_colorbool(var, value);
@@ -72,7 +72,7 @@ int git_branch_config(const char *var, const char *value)
        return git_default_config(var, value);
 }
 
-const char *branch_get_color(enum color_branch ix)
+static const char *branch_get_color(enum color_branch ix)
 {
        if (branch_use_color)
                return branch_colors[ix];
index c95e477..489c2c5 100644 (file)
@@ -851,8 +851,8 @@ static void handle_info(void)
        fprintf(fout, "\n");
 }
 
-int mailinfo(FILE *in, FILE *out, int ks, const char *encoding,
-            const char *msg, const char *patch)
+static int mailinfo(FILE *in, FILE *out, int ks, const char *encoding,
+                   const char *msg, const char *patch)
 {
        keep_subject = ks;
        metainfo_charset = encoding;
index c938425..43fc373 100644 (file)
@@ -159,8 +159,8 @@ out:
        return ret;
 }
 
-int split_mbox(const char *file, const char *dir, int allow_bare,
-               int nr_prec, int skip)
+static int split_mbox(const char *file, const char *dir, int allow_bare,
+                     int nr_prec, int skip)
 {
        char name[PATH_MAX];
        int ret = -1;
index 80c348c..8f02ed7 100644 (file)
@@ -107,7 +107,7 @@ static char *get_oneline(const char *message)
        return result;
 }
 
-char *get_encoding(const char *message)
+static char *get_encoding(const char *message)
 {
        const char *p = message, *eol;
 
index f0d4d9e..62bd4b5 100644 (file)
@@ -26,7 +26,7 @@ static int cleanup(char *line)
        return 1;
 }
 
-void stripspace(FILE *in, FILE *out)
+static void stripspace(FILE *in, FILE *out)
 {
        int empties = -1;
        int incomplete = 0;
index 39290d1..da4834c 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -7,9 +7,6 @@ extern const char git_version_string[];
 extern const char git_usage_string[];
 
 extern void help_unknown_cmd(const char *cmd);
-extern int mailinfo(FILE *in, FILE *out, int ks, const char *encoding, const char *msg, const char *patch);
-extern int split_mbox(const char *file, const char *dir, int allow_bare, int nr_prec, int skip);
-extern void stripspace(FILE *in, FILE *out);
 extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
 extern void prune_packed_objects(int);
 
index 57b69ca..4ca4d44 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -1116,15 +1116,6 @@ struct commit *pop_commit(struct commit_list **stack)
        return item;
 }
 
-int count_parents(struct commit * commit)
-{
-        int count;
-        struct commit_list * parents = commit->parents;
-        for (count = 0; parents; parents = parents->next,count++)
-               ;
-        return count;
-}
-
 void topo_sort_default_setter(struct commit *c, void *data)
 {
        c->util = data;
index 75b43a5..a313b53 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -73,8 +73,6 @@ struct commit *pop_commit(struct commit_list **stack);
 
 void clear_commit_marks(struct commit *commit, unsigned int mark);
 
-int count_parents(struct commit * commit);
-
 /*
  * Performs an in-place topological sort of list supplied.
  *
index 3dc1ef5..098cb01 100755 (executable)
@@ -259,10 +259,13 @@ class CellRendererGraph(gtk.GenericCellRenderer):
                                self.set_colour(ctx, colour, 0.0, 0.5)
                        ctx.show_text(name)
 
-class Commit:
+class Commit(object):
        """ This represent a commit object obtained after parsing the git-rev-list
        output """
 
+       __slots__ = ['children_sha1', 'message', 'author', 'date', 'committer',
+                                'commit_date', 'commit_sha1', 'parent_sha1']
+
        children_sha1 = {}
 
        def __init__(self, commit_lines):
@@ -339,7 +342,7 @@ class Commit:
                fp.close()
                return diff
 
-class AnnotateWindow:
+class AnnotateWindow(object):
        """Annotate window.
        This object represents and manages a single window containing the
        annotate information of the file
@@ -519,7 +522,7 @@ class AnnotateWindow:
                self.io_watch_tag = gobject.io_add_watch(fp, gobject.IO_IN, self.data_ready)
 
 
-class DiffWindow:
+class DiffWindow(object):
        """Diff window.
        This object represents and manages a single window containing the
        differences between two revisions on a branch.
@@ -674,7 +677,7 @@ class DiffWindow:
                        fp.close()
                dialog.destroy()
 
-class GitView:
+class GitView(object):
        """ This is the main class
        """
        version = "0.9"
index 7779250..a3f2ac1 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -439,7 +439,7 @@ static void parse_extra_args(struct interp *table, char *extra_args, int buflen)
        }
 }
 
-void fill_in_extra_table_entries(struct interp *itable)
+static void fill_in_extra_table_entries(struct interp *itable)
 {
        char *hp;
 
diff --git a/diff.c b/diff.c
index cafa7de..1d234d3 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -2103,6 +2103,8 @@ static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *va
        return 1;
 }
 
+static int diff_scoreopt_parse(const char *opt);
+
 int diff_opt_parse(struct diff_options *options, const char **av, int ac)
 {
        const char *arg = av[0];
@@ -2274,7 +2276,7 @@ static int parse_num(const char **cp_p)
        return (int)((num >= scale) ? MAX_SCORE : (MAX_SCORE * num / scale));
 }
 
-int diff_scoreopt_parse(const char *opt)
+static int diff_scoreopt_parse(const char *opt)
 {
        int opt1, opt2, cmd;
 
diff --git a/diff.h b/diff.h
index 63738c1..a7ee6d8 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -155,8 +155,6 @@ extern void diff_unmerge(struct diff_options *,
                         unsigned mode,
                         const unsigned char *sha1);
 
-extern int diff_scoreopt_parse(const char *opt);
-
 #define DIFF_SETUP_REVERSE             1
 #define DIFF_SETUP_USE_CACHE           2
 #define DIFF_SETUP_USE_SIZE_CACHE      4
index d561c88..33f1e87 100755 (executable)
@@ -63,12 +63,13 @@ while [ "$#" != "0" ]; do
                                echo "unknown flag $arg"
                                exit 1
                        fi
-                       new="$rev"
                        new_name="$arg"
                        if git-show-ref --verify --quiet -- "refs/heads/$arg"
                        then
+                               rev=$(git-rev-parse --verify "refs/heads/$arg^0")
                                branch="$arg"
                        fi
+                       new="$rev"
                elif rev=$(git-rev-parse --verify "$arg^{tree}" 2>/dev/null)
                then
                        # checking out selected paths from a tree-ish.
index 5bfd8d1..3a41062 100755 (executable)
@@ -20,7 +20,7 @@ usage() {
 get_repo_base() {
        (
                cd "`/bin/pwd`" &&
-               cd "$1" &&
+               cd "$1" || cd "$1.git" &&
                {
                        cd .git
                        pwd
index 2b4825a..d41b29f 100755 (executable)
@@ -167,6 +167,17 @@ sub req_Root
     my ( $cmd, $data ) = @_;
     $log->debug("req_Root : $data");
 
+    unless ($data =~ m#^/#) {
+       print "error 1 Root must be an absolute pathname\n";
+       return 0;
+    }
+
+    if ($state->{CVSROOT}
+       && ($state->{CVSROOT} ne $data)) {
+       print "error 1 Conflicting roots specified\n";
+       return 0;
+    }
+
     $state->{CVSROOT} = $data;
 
     $ENV{GIT_DIR} = $state->{CVSROOT} . "/";
diff --git a/quote.c b/quote.c
index fb9e4ca..aa44009 100644 (file)
--- a/quote.c
+++ b/quote.c
@@ -20,7 +20,7 @@ static inline int need_bs_quote(char c)
        return (c == '\'' || c == '!');
 }
 
-size_t sq_quote_buf(char *dst, size_t n, const char *src)
+static size_t sq_quote_buf(char *dst, size_t n, const char *src)
 {
        char c;
        char *bp = dst;
@@ -62,18 +62,6 @@ void sq_quote_print(FILE *stream, const char *src)
        fputc('\'', stream);
 }
 
-char *sq_quote(const char *src)
-{
-       char *buf;
-       size_t cnt;
-
-       cnt = sq_quote_buf(NULL, 0, src) + 1;
-       buf = xmalloc(cnt);
-       sq_quote_buf(buf, cnt, src);
-
-       return buf;
-}
-
 char *sq_quote_argv(const char** argv, int count)
 {
        char *buf, *to;
diff --git a/quote.h b/quote.h
index bdc3610..8a59cc5 100644 (file)
--- a/quote.h
+++ b/quote.h
@@ -28,9 +28,7 @@
  * excluding the final null regardless of the buffer size.
  */
 
-extern char *sq_quote(const char *src);
 extern void sq_quote_print(FILE *stream, const char *src);
-extern size_t sq_quote_buf(char *dst, size_t n, const char *src);
 extern char *sq_quote_argv(const char** argv, int count);
 
 /*
index 0a29b53..b12c25e 100644 (file)
@@ -114,12 +114,7 @@ void mark_parents_uninteresting(struct commit *commit)
        }
 }
 
-void add_pending_object(struct rev_info *revs, struct object *obj, const char *name)
-{
-       add_pending_object_with_mode(revs, obj, name, S_IFINVALID);
-}
-
-void add_pending_object_with_mode(struct rev_info *revs, struct object *obj, const char *name, unsigned mode)
+static void add_pending_object_with_mode(struct rev_info *revs, struct object *obj, const char *name, unsigned mode)
 {
        if (revs->no_walk && (obj->flags & UNINTERESTING))
                die("object ranges do not make sense when not walking revisions");
@@ -129,6 +124,11 @@ void add_pending_object_with_mode(struct rev_info *revs, struct object *obj, con
                                (struct commit *)obj, name);
 }
 
+void add_pending_object(struct rev_info *revs, struct object *obj, const char *name)
+{
+       add_pending_object_with_mode(revs, obj, name, S_IFINVALID);
+}
+
 static struct object *get_reference(struct rev_info *revs, const char *name, const unsigned char *sha1, unsigned int flags)
 {
        struct object *object;
@@ -262,7 +262,7 @@ static void file_change(struct diff_options *options,
        options->has_changes = 1;
 }
 
-int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree *t2)
+static int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree *t2)
 {
        if (!t1)
                return REV_TREE_NEW;
@@ -276,7 +276,7 @@ int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree *t2)
        return tree_difference;
 }
 
-int rev_same_tree_as_empty(struct rev_info *revs, struct tree *t1)
+static int rev_same_tree_as_empty(struct rev_info *revs, struct tree *t1)
 {
        int retval;
        void *tree;
index 2845167..f46b4d5 100644 (file)
@@ -106,8 +106,6 @@ struct rev_info {
 #define REV_TREE_DIFFERENT     2
 
 /* revision.c */
-extern int rev_same_tree_as_empty(struct rev_info *, struct tree *t1);
-extern int rev_compare_tree(struct rev_info *, struct tree *t1, struct tree *t2);
 
 extern void init_revisions(struct rev_info *revs, const char *prefix);
 extern int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def);
@@ -131,6 +129,5 @@ extern void add_object(struct object *obj,
                       const char *name);
 
 extern void add_pending_object(struct rev_info *revs, struct object *obj, const char *name);
-extern void add_pending_object_with_mode(struct rev_info *revs, struct object *obj, const char *name, unsigned mode);
 
 #endif
index 7df01af..858f08c 100644 (file)
@@ -682,8 +682,6 @@ int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned *mode)
                namelen = namelen - (cp - name);
                if (!active_cache)
                        read_cache();
-               if (active_nr < 0)
-                       return -1;
                pos = cache_name_pos(cp, namelen);
                if (pos < 0)
                        pos = -pos - 1;
diff --git a/t/t5701-clone-local.sh b/t/t5701-clone-local.sh
new file mode 100755 (executable)
index 0000000..b093327
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+test_description='test local clone'
+. ./test-lib.sh
+
+D=`pwd`
+
+test_expect_success 'preparing origin repository' '
+       : >file && git add . && git commit -m1 &&
+       git clone --bare . a.git &&
+       git clone --bare . x
+'
+
+test_expect_success 'local clone without .git suffix' '
+       cd "$D" &&
+       git clone -l -s a b &&
+       cd b &&
+       git fetch
+'
+
+test_expect_success 'local clone with .git suffix' '
+       cd "$D" &&
+       git clone -l -s a.git c &&
+       cd c &&
+       git fetch
+'
+
+test_expect_success 'local clone from x' '
+       cd "$D" &&
+       git clone -l -s x y &&
+       cd y &&
+       git fetch
+'
+
+test_expect_success 'local clone from x.git that does not exist' '
+       cd "$D" &&
+       if git clone -l -s x.git z
+       then
+               echo "Oops, should have failed"
+               false
+       else
+               echo happy
+       fi
+'
+
+test_done
index 5fa6a45..ed2e9ee 100755 (executable)
@@ -190,4 +190,44 @@ test_expect_success 'checkout to detach HEAD with HEAD^0' '
        fi
 '
 
+test_expect_success 'checkout with ambiguous tag/branch names' '
+
+       git tag both side &&
+       git branch both master &&
+       git reset --hard &&
+       git checkout master &&
+
+       git checkout both &&
+       H=$(git rev-parse --verify HEAD) &&
+       M=$(git show-ref -s --verify refs/heads/master) &&
+       test "z$H" = "z$M" &&
+       name=$(git symbolic-ref HEAD 2>/dev/null) &&
+       test "z$name" = zrefs/heads/both
+
+'
+
+test_expect_success 'checkout with ambiguous tag/branch names' '
+
+       git reset --hard &&
+       git checkout master &&
+
+       git tag frotz side &&
+       git branch frotz master &&
+       git reset --hard &&
+       git checkout master &&
+
+       git checkout tags/frotz &&
+       H=$(git rev-parse --verify HEAD) &&
+       S=$(git show-ref -s --verify refs/heads/side) &&
+       test "z$H" = "z$S" &&
+       if name=$(git symbolic-ref HEAD 2>/dev/null)
+       then
+               echo "Bad -- should have detached"
+               false
+       else
+               : happy
+       fi
+
+'
+
 test_done
index e9ef315..41dcf64 100755 (executable)
@@ -110,6 +110,40 @@ test_expect_success 'pserver authentication failure (login/non-anonymous user)'
    tail -n1 log | grep -q "^I HATE YOU$"'
 
 
+# misuse pserver authentication for testing of req_Root
+
+cat >request-relative  <<EOF
+BEGIN AUTH REQUEST
+gitcvs.git
+anonymous
+
+END AUTH REQUEST
+EOF
+
+cat >request-conflict  <<EOF
+BEGIN AUTH REQUEST
+$SERVERDIR
+anonymous
+
+END AUTH REQUEST
+Root $WORKDIR
+EOF
+
+test_expect_success 'req_Root failure (relative pathname)' \
+  'if cat request-relative | git-cvsserver pserver >log 2>&1
+   then
+       echo unexpected success
+       false
+   else
+       true
+   fi &&
+   tail log | grep -q "^error 1 Root must be an absolute pathname$"'
+
+test_expect_success 'req_Root failure (conflicting roots)' \
+  'cat request-conflict | git-cvsserver pserver >log 2>&1 &&
+   tail log | grep -q "^error 1 Conflicting roots specified$"'
+
+
 #--------------
 # CONFIG TESTS
 #--------------
index 0e881c8..fe96ef1 100644 (file)
@@ -62,7 +62,7 @@ static ssize_t send_client_data(int fd, const char *data, ssize_t sz)
        return safe_write(fd, data, sz);
 }
 
-FILE *pack_pipe = NULL;
+static FILE *pack_pipe = NULL;
 static void show_commit(struct commit *commit)
 {
        if (commit->object.flags & BOUNDARY)
index 4bfe8f1..5205420 100644 (file)
@@ -198,7 +198,7 @@ static void wt_read_cache(struct wt_status *s)
        read_cache();
 }
 
-void wt_status_print_initial(struct wt_status *s)
+static void wt_status_print_initial(struct wt_status *s)
 {
        int i;
        char buf[PATH_MAX];
index 78b1d4b..4b6e639 100644 (file)
@@ -99,8 +99,8 @@ static void xdl_find_func(xdfile_t *xf, long i, char *buf, long sz, long *ll) {
 }
 
 
-int xdl_emit_common(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
-                   xdemitconf_t const *xecfg) {
+static int xdl_emit_common(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
+                           xdemitconf_t const *xecfg) {
        xdfile_t *xdf = &xe->xdf1;
        const char *rchg = xdf->rchg;
        long ix;