Skip to content

Commit

Permalink
Merge branch 'maint'
Browse files Browse the repository at this point in the history
* maint:
  gitweb: Fix 'history' view for deleted files with history
  Document that WebDAV doesn't need git on the server, and works over SSL
  git-remote: reject adding remotes with invalid names
  am: POSIX portability fix
  • Loading branch information
Junio C Hamano committed Apr 19, 2008
2 parents 9a49e00 + 5634cf2 commit d9f39d9
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 22 deletions.
45 changes: 33 additions & 12 deletions Documentation/howto/setup-git-server-over-http.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
From: Rutger Nijlunsing <rutger@nospam.com>
Subject: Setting up a git repository which can be pushed into and pulled from over HTTP.
Subject: Setting up a git repository which can be pushed into and pulled from over HTTP(S).
Date: Thu, 10 Aug 2006 22:00:26 +0200

Since Apache is one of those packages people like to compile
Expand Down Expand Up @@ -40,19 +40,23 @@ What's needed:

- have permissions to chown a directory

- have git installed at the server _and_ client
- have git installed on the client, and

In effect, this probably means you're going to be root.
- either have git installed on the server or have a webdav client on
the client.

In effect, this means you're going to be root, or that you're using a
preconfigured WebDAV server.


Step 1: setup a bare GIT repository
-----------------------------------

At the time of writing, git-http-push cannot remotely create a GIT
repository. So we have to do that at the server side with git. Another
option would be to generate an empty repository at the client and copy
it to the server with WebDAV. But then you're probably the first to
try that out :)
option is to generate an empty bare repository at the client and copy
it to the server with a WebDAV client (which is the only option if Git
is not installed on the server).

Create the directory under the DocumentRoot of the directories served
by Apache. As an example we take /usr/local/apache2, but try "grep
Expand Down Expand Up @@ -169,7 +173,9 @@ On Debian:

Most tests should pass.

A command line tool to test WebDAV is cadaver.
A command line tool to test WebDAV is cadaver. If you prefer GUIs, for
example, konqueror can open WebDAV URLs as "webdav://..." or
"webdavs://...".

If you're into Windows, from XP onwards Internet Explorer supports
WebDAV. For this, do Internet Explorer -> Open Location ->
Expand All @@ -179,8 +185,9 @@ http://<servername>/my-new-repo.git [x] Open as webfolder -> login .
Step 3: setup the client
------------------------

Make sure that you have HTTP support, i.e. your git was built with curl.
The easiest way to check is to look for the executable 'git-http-push'.
Make sure that you have HTTP support, i.e. your git was built with
curl (version more recent than 7.10). The command 'git http-push' with
no argument should display a usage message.

Then, add the following to your $HOME/.netrc (you can do without, but will be
asked to input your password a _lot_ of times):
Expand All @@ -197,10 +204,10 @@ instead of the server name.

To check whether all is OK, do:

curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/

...this should give a directory listing in HTML of /var/www/my-new-repo.git .
curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/HEAD

...this should give something like 'ref: refs/heads/master', which is
the content of the file HEAD on the server.

Now, add the remote in your existing repository which contains the project
you want to export:
Expand All @@ -225,6 +232,15 @@ want to export) to repository called 'upload', which we previously
defined with git-config.


Using a proxy:
--------------

If you have to access the WebDAV server from behind an HTTP(S) proxy,
set the variable 'all_proxy' to 'http://proxy-host.com:port', or
'http://login-on-proxy:passwd-on-proxy@proxy-host.com:port'. See 'man
curl' for details.


Troubleshooting:
----------------

Expand All @@ -248,9 +264,14 @@ Reading /usr/local/apache2/logs/error_log is often helpful.

On Debian: Read /var/log/apache2/error.log instead.

If you access HTTPS locations, git may fail verifying the SSL
certificate (this is return code 60). Setting http.sslVerify=false can
help diagnosing the problem, but removes security checks.


Debian References: http://www.debian-administration.org/articles/285

Authors
Johannes Schindelin <Johannes.Schindelin@gmx.de>
Rutger Nijlunsing <git@wingding.demon.nl>
Matthieu Moy <Matthieu.Moy@imag.fr>
10 changes: 7 additions & 3 deletions builtin-remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,18 +88,22 @@ static int add(int argc, const char **argv)
strbuf_init(&buf, 0);
strbuf_init(&buf2, 0);

strbuf_addf(&buf2, "refs/heads/test:refs/remotes/%s/test", name);
if (!valid_fetch_refspec(buf2.buf))
die("'%s' is not a valid remote name", name);

strbuf_addf(&buf, "remote.%s.url", name);
if (git_config_set(buf.buf, url))
return 1;

strbuf_reset(&buf);
strbuf_addf(&buf, "remote.%s.fetch", name);

if (track.nr == 0)
path_list_append("*", &track);
for (i = 0; i < track.nr; i++) {
struct path_list_item *item = track.items + i;

strbuf_reset(&buf);
strbuf_addf(&buf, "remote.%s.fetch", name);

strbuf_reset(&buf2);
if (mirror)
strbuf_addf(&buf2, "refs/%s:refs/%s",
Expand Down
2 changes: 1 addition & 1 deletion git-am.sh
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ do
SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$dotest/info")"
case "$keep_subject" in -k) SUBJECT="[PATCH] $SUBJECT" ;; esac

(echo "$SUBJECT" ; echo ; cat "$dotest/msg") |
(printf '%s\n\n' "$SUBJECT"; cat "$dotest/msg") |
git stripspace > "$dotest/msg-clean"
;;
esac
Expand Down
18 changes: 15 additions & 3 deletions gitweb/gitweb.perl
Original file line number Diff line number Diff line change
Expand Up @@ -5176,14 +5176,26 @@ sub git_history {
my $refs = git_get_references();
my $limit = sprintf("--max-count=%i", (100 * ($page+1)));

my @commitlist = parse_commits($hash_base, 101, (100 * $page),
$file_name, "--full-history");
if (!@commitlist) {
die_error('404 Not Found', "No such file or directory on given branch");
}

if (!defined $hash && defined $file_name) {
$hash = git_get_hash_by_path($hash_base, $file_name);
# some commits could have deleted file in question,
# and not have it in tree, but one of them has to have it
for (my $i = 0; $i <= @commitlist; $i++) {
$hash = git_get_hash_by_path($commitlist[$i]{'id'}, $file_name);
last if defined $hash;
}
}
if (defined $hash) {
$ftype = git_get_type($hash);
}

my @commitlist = parse_commits($hash_base, 101, (100 * $page), $file_name, "--full-history");
if (!defined $ftype) {
die_error(undef, "Unknown type of object");
}

my $paging_nav = '';
if ($page > 0) {
Expand Down
21 changes: 18 additions & 3 deletions remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ static void read_config(void)
alias_all_urls();
}

static struct refspec *parse_refspec_internal(int nr_refspec, const char **refspec, int fetch)
static struct refspec *parse_refspec_internal(int nr_refspec, const char **refspec, int fetch, int verify)
{
int i;
int st;
Expand Down Expand Up @@ -519,17 +519,32 @@ static struct refspec *parse_refspec_internal(int nr_refspec, const char **refsp
return rs;

invalid:
if (verify) {
free(rs);
return NULL;
}
die("Invalid refspec '%s'", refspec[i]);
}

int valid_fetch_refspec(const char *fetch_refspec_str)
{
const char *fetch_refspec[] = { fetch_refspec_str };
struct refspec *refspec;

refspec = parse_refspec_internal(1, fetch_refspec, 1, 1);
if (refspec)
free(refspec);
return !!refspec;
}

struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec)
{
return parse_refspec_internal(nr_refspec, refspec, 1);
return parse_refspec_internal(nr_refspec, refspec, 1, 0);
}

struct refspec *parse_push_refspec(int nr_refspec, const char **refspec)
{
return parse_refspec_internal(nr_refspec, refspec, 0);
return parse_refspec_internal(nr_refspec, refspec, 0, 0);
}

static int valid_remote_nick(const char *name)
Expand Down
1 change: 1 addition & 0 deletions remote.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ void free_refs(struct ref *ref);
*/
void ref_remove_duplicates(struct ref *ref_map);

int valid_fetch_refspec(const char *refspec);
struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec);
struct refspec *parse_push_refspec(int nr_refspec, const char **refspec);

Expand Down
6 changes: 6 additions & 0 deletions t/t5505-remote.sh
Original file line number Diff line number Diff line change
Expand Up @@ -253,4 +253,10 @@ test_expect_success '"remote show" does not show symbolic refs' '
'

test_expect_success 'reject adding remote with an invalid name' '
! git remote add some:url desired-name
'

test_done
16 changes: 16 additions & 0 deletions t/t9500-gitweb-standalone-no-errors.sh
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,22 @@ test_expect_success \
'gitweb_run "p=.git;a=history;f=file"'
test_debug 'cat gitweb.log'

test_expect_success \
'logs: history (implicit HEAD, non-existent file)' \
'gitweb_run "p=.git;a=history;f=non-existent"'
test_debug 'cat gitweb.log'

test_expect_success \
'logs: history (implicit HEAD, deleted file)' \
'git checkout master &&
echo "to be deleted" > deleted_file &&
git add deleted_file &&
git commit -m "Add file to be deleted" &&
git rm deleted_file &&
git commit -m "Delete file" &&
gitweb_run "p=.git;a=history;f=deleted_file"'
test_debug 'cat gitweb.log'

# ----------------------------------------------------------------------
# feed generation

Expand Down

0 comments on commit d9f39d9

Please sign in to comment.