Merge branch 'maint'
authorShawn O. Pearce <spearce@spearce.org>
Fri, 3 Oct 2008 01:16:22 +0000 (18:16 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Fri, 3 Oct 2008 01:16:22 +0000 (18:16 -0700)
* maint:
gitweb: Add path_info tests to t/t9500-gitweb-standalone-no-errors.sh
gitweb: Fix two 'uninitialized value' warnings in git_tree()
Solaris: Use OLD_ICONV to avoid compile warnings
gitweb: remove PATH_INFO from $my_url and $my_uri

1  2 
Makefile
gitweb/gitweb.perl
t/t9500-gitweb-standalone-no-errors.sh
diff --combined Makefile
index e0c03c3eecc26d995f8829429092e887df17489f,7fad9f7ff6df54435659ec96f9611008b21fe27f..15ca6599a7b665d5d4888c00b0fecd7bbde28879
+++ b/Makefile
@@@ -124,9 -124,6 +124,9 @@@ all:
  # Define USE_STDEV below if you want git to care about the underlying device
  # change being considered an inode change from the update-index perspective.
  #
 +# Define NO_ST_BLOCKS_IN_STRUCT_STAT if your platform does not have st_blocks
 +# field that counts the on-disk footprint in 512-byte blocks.
 +#
  # Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8
  #
  # Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72.
@@@ -294,8 -291,8 +294,8 @@@ PROGRAMS += git-mktag$
  PROGRAMS += git-mktree$X
  PROGRAMS += git-pack-redundant$X
  PROGRAMS += git-patch-id$X
 -PROGRAMS += git-receive-pack$X
  PROGRAMS += git-send-pack$X
 +PROGRAMS += git-shell$X
  PROGRAMS += git-show-index$X
  PROGRAMS += git-unpack-file$X
  PROGRAMS += git-update-server-info$X
@@@ -357,8 -354,6 +357,8 @@@ LIB_H += git-compat-util.
  LIB_H += graph.h
  LIB_H += grep.h
  LIB_H += hash.h
 +LIB_H += help.h
 +LIB_H += levenshtein.h
  LIB_H += list-objects.h
  LIB_H += ll-merge.h
  LIB_H += log-tree.h
@@@ -435,7 -430,6 +435,7 @@@ LIB_OBJS += hash.
  LIB_OBJS += help.o
  LIB_OBJS += ident.o
  LIB_OBJS += interpolate.o
 +LIB_OBJS += levenshtein.o
  LIB_OBJS += list-objects.o
  LIB_OBJS += ll-merge.o
  LIB_OBJS += lockfile.o
@@@ -443,7 -437,6 +443,7 @@@ LIB_OBJS += log-tree.
  LIB_OBJS += mailmap.o
  LIB_OBJS += match-trees.o
  LIB_OBJS += merge-file.o
 +LIB_OBJS += merge-recursive.o
  LIB_OBJS += name-hash.o
  LIB_OBJS += object.o
  LIB_OBJS += pack-check.o
@@@ -525,7 -518,6 +525,7 @@@ BUILTIN_OBJS += builtin-for-each-ref.
  BUILTIN_OBJS += builtin-fsck.o
  BUILTIN_OBJS += builtin-gc.o
  BUILTIN_OBJS += builtin-grep.o
 +BUILTIN_OBJS += builtin-help.o
  BUILTIN_OBJS += builtin-init-db.o
  BUILTIN_OBJS += builtin-log.o
  BUILTIN_OBJS += builtin-ls-files.o
@@@ -546,7 -538,6 +546,7 @@@ BUILTIN_OBJS += builtin-prune-packed.
  BUILTIN_OBJS += builtin-prune.o
  BUILTIN_OBJS += builtin-push.o
  BUILTIN_OBJS += builtin-read-tree.o
 +BUILTIN_OBJS += builtin-receive-pack.o
  BUILTIN_OBJS += builtin-reflog.o
  BUILTIN_OBJS += builtin-remote.o
  BUILTIN_OBJS += builtin-rerere.o
@@@ -584,11 -575,9 +584,11 @@@ EXTLIBS 
  
  ifeq ($(uname_S),Linux)
        NO_STRLCPY = YesPlease
 +      THREADED_DELTA_SEARCH = YesPlease
  endif
  ifeq ($(uname_S),GNU/kFreeBSD)
        NO_STRLCPY = YesPlease
 +      THREADED_DELTA_SEARCH = YesPlease
  endif
  ifeq ($(uname_S),UnixWare)
        CC = cc
@@@ -648,6 -637,7 +648,7 @@@ ifeq ($(uname_S),SunOS
        NO_MEMMEM = YesPlease
        NO_HSTRERROR = YesPlease
        NO_MKDTEMP = YesPlease
+       OLD_ICONV = UnfortunatelyYes
        ifeq ($(uname_R),5.8)
                NEEDS_LIBICONV = YesPlease
                NO_UNSETENV = YesPlease
@@@ -688,7 -678,6 +689,7 @@@ ifeq ($(uname_S),FreeBSD
        BASIC_CFLAGS += -I/usr/local/include
        BASIC_LDFLAGS += -L/usr/local/lib
        DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
 +      THREADED_DELTA_SEARCH = YesPlease
        COMPAT_CFLAGS += -Icompat/regex
        COMPAT_OBJS += compat/regex/regex.o
  endif
@@@ -698,15 -687,14 +699,15 @@@ ifeq ($(uname_S),OpenBSD
        NEEDS_LIBICONV = YesPlease
        BASIC_CFLAGS += -I/usr/local/include
        BASIC_LDFLAGS += -L/usr/local/lib
 +      THREADED_DELTA_SEARCH = YesPlease
  endif
  ifeq ($(uname_S),NetBSD)
        ifeq ($(shell expr "$(uname_R)" : '[01]\.'),2)
                NEEDS_LIBICONV = YesPlease
        endif
        BASIC_CFLAGS += -I/usr/pkg/include
 -      BASIC_LDFLAGS += -L/usr/pkg/lib
 -      ALL_LDFLAGS += -Wl,-rpath,/usr/pkg/lib
 +      BASIC_LDFLAGS += -L/usr/pkg/lib $(CC_LD_DYNPATH)/usr/pkg/lib
 +      THREADED_DELTA_SEARCH = YesPlease
  endif
  ifeq ($(uname_S),AIX)
        NO_STRCASESTR=YesPlease
@@@ -769,7 -757,6 +770,7 @@@ ifneq (,$(findstring MINGW,$(uname_S))
        NO_SVN_TESTS = YesPlease
        NO_PERL_MAKEMAKER = YesPlease
        NO_POSIX_ONLY_PROGRAMS = YesPlease
 +      NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
        COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/regex -Icompat/fnmatch
        COMPAT_CFLAGS += -DSNPRINTF_SIZE_CORR=1
        COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
@@@ -802,14 -789,12 +803,14 @@@ ifeq ($(uname_S),Darwin
        endif
  endif
  
 -ifdef NO_R_TO_GCC_LINKER
 -      # Some gcc does not accept and pass -R to the linker to specify
 -      # the runtime dynamic library path.
 -      CC_LD_DYNPATH = -Wl,-rpath=
 -else
 -      CC_LD_DYNPATH = -R
 +ifndef CC_LD_DYNPATH
 +      ifdef NO_R_TO_GCC_LINKER
 +              # Some gcc does not accept and pass -R to the linker to specify
 +              # the runtime dynamic library path.
 +              CC_LD_DYNPATH = -Wl,-rpath,
 +      else
 +              CC_LD_DYNPATH = -R
 +      endif
  endif
  
  ifdef NO_CURL
@@@ -845,6 -830,7 +846,6 @@@ EXTLIBS += -l
  ifndef NO_POSIX_ONLY_PROGRAMS
        PROGRAMS += git-daemon$X
        PROGRAMS += git-imap-send$X
 -      PROGRAMS += git-shell$X
  endif
  ifndef NO_OPENSSL
        OPENSSL_LIBSSL = -lssl
@@@ -885,9 -871,6 +886,9 @@@ endi
  ifdef NO_D_INO_IN_DIRENT
        BASIC_CFLAGS += -DNO_D_INO_IN_DIRENT
  endif
 +ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
 +      BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT
 +endif
  ifdef NO_C99_FORMAT
        BASIC_CFLAGS += -DNO_C99_FORMAT
  endif
@@@ -1116,7 -1099,7 +1117,7 @@@ git$X: git.o $(BUILTIN_OBJS) $(GITLIBS
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
                $(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
  
 -help.o: help.c common-cmds.h GIT-CFLAGS
 +builtin-help.o: builtin-help.c common-cmds.h GIT-CFLAGS
        $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) \
                '-DGIT_HTML_PATH="$(htmldir_SQ)"' \
                '-DGIT_MAN_PATH="$(mandir_SQ)"' \
@@@ -1243,9 -1226,7 +1244,9 @@@ endi
  git-%$X: %.o $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
  
 -git-imap-send$X: imap-send.o $(LIB_FILE)
 +git-imap-send$X: imap-send.o $(GITLIBS)
 +      $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
 +              $(LIBS) $(OPENSSL_LINK) $(OPENSSL_LIBSSL)
  
  http.o http-walker.o http-push.o transport.o: http.h
  
@@@ -1272,12 -1253,6 +1273,12 @@@ $(XDIFF_LIB): $(XDIFF_OBJS
  doc:
        $(MAKE) -C Documentation all
  
 +man:
 +      $(MAKE) -C Documentation man
 +
 +html:
 +      $(MAKE) -C Documentation html
 +
  info:
        $(MAKE) -C Documentation info
  
@@@ -1381,7 -1356,7 +1382,7 @@@ install: al
        $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
        $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
        $(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
 -      $(INSTALL) git$X git-upload-pack$X git-receive-pack$X git-upload-archive$X '$(DESTDIR_SQ)$(bindir_SQ)'
 +      $(INSTALL) git$X git-upload-pack$X git-receive-pack$X git-upload-archive$X git-shell$X git-cvsserver '$(DESTDIR_SQ)$(bindir_SQ)'
        $(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
        $(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
  ifndef NO_TCLTK
@@@ -1414,9 -1389,6 +1415,9 @@@ install-info
  quick-install-doc:
        $(MAKE) -C Documentation quick-install
  
 +quick-install-html:
 +      $(MAKE) -C Documentation quick-install-html
 +
  
  
  ### Maintainer's dist rules
diff --combined gitweb/gitweb.perl
index c2732b30053009e98b7d719237a863df8c6d6ecd,eae5084c669ecd5213e5a9b664662b234b5fff5f..83f810ad46cd2dfcea37308791ba64870ebfbd3c
@@@ -27,6 -27,13 +27,13 @@@ our $version = "++GIT_VERSION++"
  our $my_url = $cgi->url();
  our $my_uri = $cgi->url(-absolute => 1);
  
+ # if we're called with PATH_INFO, we have to strip that
+ # from the URL to find our real URL
+ if (my $path_info = $ENV{"PATH_INFO"}) {
+       $my_url =~ s,\Q$path_info\E$,,;
+       $my_uri =~ s,\Q$path_info\E$,,;
+ }
  # core git executable to use
  # this can just be "git" if your webserver has a sensible PATH
  our $GIT = "++GIT_BINDIR++/git";
@@@ -775,7 -782,7 +782,7 @@@ sub quot_cec 
        );
        my $chr = ( (exists $es{$cntrl})
                    ? $es{$cntrl}
 -                  : sprintf('\%03o', ord($cntrl)) );
 +                  : sprintf('\%2x', ord($cntrl)) );
        if ($opts{-nohtml}) {
                return $chr;
        } else {
@@@ -1090,23 -1097,13 +1097,23 @@@ sub format_log_line_html 
  }
  
  # format marker of refs pointing to given object
 +
 +# the destination action is chosen based on object type and current context:
 +# - for annotated tags, we choose the tag view unless it's the current view
 +#   already, in which case we go to shortlog view
 +# - for other refs, we keep the current view if we're in history, shortlog or
 +#   log view, and select shortlog otherwise
  sub format_ref_marker {
        my ($refs, $id) = @_;
        my $markers = '';
  
        if (defined $refs->{$id}) {
                foreach my $ref (@{$refs->{$id}}) {
 +                      # this code exploits the fact that non-lightweight tags are the
 +                      # only indirect objects, and that they are the only objects for which
 +                      # we want to use tag instead of shortlog as action
                        my ($type, $name) = qw();
 +                      my $indirect = ($ref =~ s/\^\{\}$//);
                        # e.g. tags/v2.6.11 or heads/next
                        if ($ref =~ m!^(.*?)s?/(.*)$!) {
                                $type = $1;
                                $name = $ref;
                        }
  
 -                      $markers .= " <span class=\"$type\" title=\"$ref\">" .
 -                                  esc_html($name) . "</span>";
 +                      my $class = $type;
 +                      $class .= " indirect" if $indirect;
 +
 +                      my $dest_action = "shortlog";
 +
 +                      if ($indirect) {
 +                              $dest_action = "tag" unless $action eq "tag";
 +                      } elsif ($action =~ /^(history|(short)?log)$/) {
 +                              $dest_action = $action;
 +                      }
 +
 +                      my $dest = "";
 +                      $dest .= "refs/" unless $ref =~ m!^refs/!;
 +                      $dest .= $ref;
 +
 +                      my $link = $cgi->a({
 +                              -href => href(
 +                                      action=>$dest_action,
 +                                      hash=>$dest
 +                              )}, $name);
 +
 +                      $markers .= " <span class=\"$class\" title=\"$ref\">" .
 +                              $link . "</span>";
                }
        }
  
@@@ -1949,7 -1925,7 +1956,7 @@@ sub git_get_references 
  
        while (my $line = <$fd>) {
                chomp $line;
 -              if ($line =~ m!^([0-9a-fA-F]{40})\srefs/($type/?[^^]+)!) {
 +              if ($line =~ m!^([0-9a-fA-F]{40})\srefs/($type.*)$!) {
                        if (defined $refs{$1}) {
                                push @{$refs{$1}}, $2;
                        } else {
@@@ -4070,10 -4046,10 +4077,10 @@@ sub git_summary 
  
        print "<div class=\"title\">&nbsp;</div>\n";
        print "<table class=\"projects_list\">\n" .
 -            "<tr><td>description</td><td>" . esc_html($descr) . "</td></tr>\n" .
 -            "<tr><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n";
 +            "<tr id=\"metadata_desc\"><td>description</td><td>" . esc_html($descr) . "</td></tr>\n" .
 +            "<tr id=\"metadata_owner\"><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n";
        if (defined $cd{'rfc2822'}) {
 -              print "<tr><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n";
 +              print "<tr id=\"metadata_lchange\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n";
        }
  
        # use per project git URL list in $projectroot/$project/cloneurl
        @url_list = map { "$_/$project" } @git_base_url_list unless @url_list;
        foreach my $git_url (@url_list) {
                next unless $git_url;
 -              print "<tr><td>$url_tag</td><td>$git_url</td></tr>\n";
 +              print "<tr class=\"metadata_url\"><td>$url_tag</td><td>$git_url</td></tr>\n";
                $url_tag = "";
        }
        print "</table>\n";
@@@ -4445,6 -4421,7 +4452,7 @@@ sub git_tree 
                        $hash = $hash_base;
                }
        }
+       die_error(404, "No such tree") unless defined($hash);
        $/ = "\0";
        open my $fd, "-|", git_cmd(), "ls-tree", '-z', $hash
                or die_error(500, "Open git-ls-tree failed");
                if ($basedir ne '' && substr($basedir, -1) ne '/') {
                        $basedir .= '/';
                }
+               git_print_page_path($file_name, 'tree', $hash_base);
        }
-       git_print_page_path($file_name, 'tree', $hash_base);
        print "<div class=\"page_body\">\n";
        print "<table class=\"tree\">\n";
        my $alternate = 1;
@@@ -5498,11 -5475,7 +5506,11 @@@ sub git_shortlog 
        }
        my $refs = git_get_references();
  
 -      my @commitlist = parse_commits($hash, 101, (100 * $page));
 +      my $commit_hash = $hash;
 +      if (defined $hash_parent) {
 +              $commit_hash = "$hash_parent..$hash";
 +      }
 +      my @commitlist = parse_commits($commit_hash, 101, (100 * $page));
  
        my $paging_nav = format_paging_nav('shortlog', $hash, $head, $page, $#commitlist >= 100);
        my $next_link = '';
index 07117a8b7d9cdd95ebf013e11b9474667ac0bfd3,d8f278ffee2f5c7ce2467fbecdbc28b8365a2789..64c4cce58b85e7948d5c3a769f437ebfda1daab7
@@@ -25,9 -25,9 +25,9 @@@ our \$site_name = "[localhost]"
  our \$site_header = "";
  our \$site_footer = "";
  our \$home_text = "indextext.html";
 -our @stylesheets = ("file:///$safe_pwd/../../gitweb/gitweb.css");
 -our \$logo = "file:///$safe_pwd/../../gitweb/git-logo.png";
 -our \$favicon = "file:///$safe_pwd/../../gitweb/git-favicon.png";
 +our @stylesheets = ("file:///$TEST_DIRECTORY/../gitweb/gitweb.css");
 +our \$logo = "file:///$TEST_DIRECTORY/../gitweb/git-logo.png";
 +our \$favicon = "file:///$TEST_DIRECTORY/../gitweb/git-favicon.png";
  our \$projects_list = "";
  our \$export_ok = "";
  our \$strict_export = "";
@@@ -54,9 -54,9 +54,9 @@@ gitweb_run () 
        # written to web server logs, so we are not interested in that:
        # we are interested only in properly formatted errors/warnings
        rm -f gitweb.log &&
 -      perl -- "$(pwd)/../../gitweb/gitweb.perl" \
 +      perl -- "$TEST_DIRECTORY/../gitweb/gitweb.perl" \
                >/dev/null 2>gitweb.log &&
 -      if grep -q -s "^[[]" gitweb.log >/dev/null; then false; else true; fi
 +      if grep "^[[]" gitweb.log >/dev/null 2>&1; then false; else true; fi
  
        # gitweb.log is left for debugging
  }
@@@ -502,6 -502,55 +502,55 @@@ test_expect_success 
         gitweb_run "p=.git;a=history;f=deleted_file"'
  test_debug 'cat gitweb.log'
  
+ # ----------------------------------------------------------------------
+ # path_info links
+ test_expect_success \
+       'path_info: project' \
+       'gitweb_run "" "/.git"'
+ test_debug 'cat gitweb.log'
+ test_expect_success \
+       'path_info: project/branch' \
+       'gitweb_run "" "/.git/b"'
+ test_debug 'cat gitweb.log'
+ test_expect_success \
+       'path_info: project/branch:file' \
+       'gitweb_run "" "/.git/master:file"'
+ test_debug 'cat gitweb.log'
+ test_expect_success \
+       'path_info: project/branch:dir/' \
+       'gitweb_run "" "/.git/master:foo/"'
+ test_debug 'cat gitweb.log'
+ test_expect_success \
+       'path_info: project/branch:file (non-existent)' \
+       'gitweb_run "" "/.git/master:non-existent"'
+ test_debug 'cat gitweb.log'
+ test_expect_success \
+       'path_info: project/branch:dir/ (non-existent)' \
+       'gitweb_run "" "/.git/master:non-existent/"'
+ test_debug 'cat gitweb.log'
+ test_expect_success \
+       'path_info: project/branch:/file' \
+       'gitweb_run "" "/.git/master:/file"'
+ test_debug 'cat gitweb.log'
+ test_expect_success \
+       'path_info: project/:/file (implicit HEAD)' \
+       'gitweb_run "" "/.git/:/file"'
+ test_debug 'cat gitweb.log'
+ test_expect_success \
+       'path_info: project/:/ (implicit HEAD, top tree)' \
+       'gitweb_run "" "/.git/:/"'
+ test_debug 'cat gitweb.log'
  # ----------------------------------------------------------------------
  # feed generation
  
@@@ -525,20 -574,20 +574,20 @@@ test_debug 'cat gitweb.log
  
  test_expect_success \
        'encode(commit): utf8' \
 -      '. ../t3901-utf8.txt &&
 +      '. "$TEST_DIRECTORY"/t3901-utf8.txt &&
         echo "UTF-8" >> file &&
         git add file &&
 -       git commit -F ../t3900/1-UTF-8.txt &&
 +       git commit -F "$TEST_DIRECTORY"/t3900/1-UTF-8.txt &&
         gitweb_run "p=.git;a=commit"'
  test_debug 'cat gitweb.log'
  
  test_expect_success \
        'encode(commit): iso-8859-1' \
 -      '. ../t3901-8859-1.txt &&
 +      '. "$TEST_DIRECTORY"/t3901-8859-1.txt &&
         echo "ISO-8859-1" >> file &&
         git add file &&
         git config i18n.commitencoding ISO-8859-1 &&
 -       git commit -F ../t3900/ISO-8859-1.txt &&
 +       git commit -F "$TEST_DIRECTORY"/t3900/ISO-8859-1.txt &&
         git config --unset i18n.commitencoding &&
         gitweb_run "p=.git;a=commit"'
  test_debug 'cat gitweb.log'