Merge branch 'maint'
* 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
This commit is contained in:
commit
d9f39d9838
@ -1,5 +1,5 @@
|
|||||||
From: Rutger Nijlunsing <rutger@nospam.com>
|
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
|
Date: Thu, 10 Aug 2006 22:00:26 +0200
|
||||||
|
|
||||||
Since Apache is one of those packages people like to compile
|
Since Apache is one of those packages people like to compile
|
||||||
@ -40,9 +40,13 @@ What's needed:
|
|||||||
|
|
||||||
- have permissions to chown a directory
|
- 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
|
Step 1: setup a bare GIT repository
|
||||||
@ -50,9 +54,9 @@ Step 1: setup a bare GIT repository
|
|||||||
|
|
||||||
At the time of writing, git-http-push cannot remotely create a GIT
|
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
|
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
|
option is to generate an empty bare repository at the client and copy
|
||||||
it to the server with WebDAV. But then you're probably the first to
|
it to the server with a WebDAV client (which is the only option if Git
|
||||||
try that out :)
|
is not installed on the server).
|
||||||
|
|
||||||
Create the directory under the DocumentRoot of the directories served
|
Create the directory under the DocumentRoot of the directories served
|
||||||
by Apache. As an example we take /usr/local/apache2, but try "grep
|
by Apache. As an example we take /usr/local/apache2, but try "grep
|
||||||
@ -169,7 +173,9 @@ On Debian:
|
|||||||
|
|
||||||
Most tests should pass.
|
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
|
If you're into Windows, from XP onwards Internet Explorer supports
|
||||||
WebDAV. For this, do Internet Explorer -> Open Location ->
|
WebDAV. For this, do Internet Explorer -> Open Location ->
|
||||||
@ -179,8 +185,9 @@ http://<servername>/my-new-repo.git [x] Open as webfolder -> login .
|
|||||||
Step 3: setup the client
|
Step 3: setup the client
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
Make sure that you have HTTP support, i.e. your git was built with curl.
|
Make sure that you have HTTP support, i.e. your git was built with
|
||||||
The easiest way to check is to look for the executable 'git-http-push'.
|
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
|
Then, add the following to your $HOME/.netrc (you can do without, but will be
|
||||||
asked to input your password a _lot_ of times):
|
asked to input your password a _lot_ of times):
|
||||||
@ -197,10 +204,10 @@ instead of the server name.
|
|||||||
|
|
||||||
To check whether all is OK, do:
|
To check whether all is OK, do:
|
||||||
|
|
||||||
curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/
|
curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/HEAD
|
||||||
|
|
||||||
...this should give a directory listing in HTML of /var/www/my-new-repo.git .
|
|
||||||
|
|
||||||
|
...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
|
Now, add the remote in your existing repository which contains the project
|
||||||
you want to export:
|
you want to export:
|
||||||
@ -225,6 +232,15 @@ want to export) to repository called 'upload', which we previously
|
|||||||
defined with git-config.
|
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:
|
Troubleshooting:
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
@ -248,9 +264,14 @@ Reading /usr/local/apache2/logs/error_log is often helpful.
|
|||||||
|
|
||||||
On Debian: Read /var/log/apache2/error.log instead.
|
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
|
Debian References: http://www.debian-administration.org/articles/285
|
||||||
|
|
||||||
Authors
|
Authors
|
||||||
Johannes Schindelin <Johannes.Schindelin@gmx.de>
|
Johannes Schindelin <Johannes.Schindelin@gmx.de>
|
||||||
Rutger Nijlunsing <git@wingding.demon.nl>
|
Rutger Nijlunsing <git@wingding.demon.nl>
|
||||||
|
Matthieu Moy <Matthieu.Moy@imag.fr>
|
||||||
|
@ -88,18 +88,22 @@ static int add(int argc, const char **argv)
|
|||||||
strbuf_init(&buf, 0);
|
strbuf_init(&buf, 0);
|
||||||
strbuf_init(&buf2, 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);
|
strbuf_addf(&buf, "remote.%s.url", name);
|
||||||
if (git_config_set(buf.buf, url))
|
if (git_config_set(buf.buf, url))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
strbuf_reset(&buf);
|
||||||
|
strbuf_addf(&buf, "remote.%s.fetch", name);
|
||||||
|
|
||||||
if (track.nr == 0)
|
if (track.nr == 0)
|
||||||
path_list_append("*", &track);
|
path_list_append("*", &track);
|
||||||
for (i = 0; i < track.nr; i++) {
|
for (i = 0; i < track.nr; i++) {
|
||||||
struct path_list_item *item = track.items + i;
|
struct path_list_item *item = track.items + i;
|
||||||
|
|
||||||
strbuf_reset(&buf);
|
|
||||||
strbuf_addf(&buf, "remote.%s.fetch", name);
|
|
||||||
|
|
||||||
strbuf_reset(&buf2);
|
strbuf_reset(&buf2);
|
||||||
if (mirror)
|
if (mirror)
|
||||||
strbuf_addf(&buf2, "refs/%s:refs/%s",
|
strbuf_addf(&buf2, "refs/%s:refs/%s",
|
||||||
|
@ -330,7 +330,7 @@ do
|
|||||||
SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$dotest/info")"
|
SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$dotest/info")"
|
||||||
case "$keep_subject" in -k) SUBJECT="[PATCH] $SUBJECT" ;; esac
|
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"
|
git stripspace > "$dotest/msg-clean"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
@ -5176,14 +5176,26 @@ sub git_history {
|
|||||||
my $refs = git_get_references();
|
my $refs = git_get_references();
|
||||||
my $limit = sprintf("--max-count=%i", (100 * ($page+1)));
|
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) {
|
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) {
|
if (defined $hash) {
|
||||||
$ftype = git_get_type($hash);
|
$ftype = git_get_type($hash);
|
||||||
}
|
}
|
||||||
|
if (!defined $ftype) {
|
||||||
my @commitlist = parse_commits($hash_base, 101, (100 * $page), $file_name, "--full-history");
|
die_error(undef, "Unknown type of object");
|
||||||
|
}
|
||||||
|
|
||||||
my $paging_nav = '';
|
my $paging_nav = '';
|
||||||
if ($page > 0) {
|
if ($page > 0) {
|
||||||
|
21
remote.c
21
remote.c
@ -409,7 +409,7 @@ static void read_config(void)
|
|||||||
alias_all_urls();
|
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 i;
|
||||||
int st;
|
int st;
|
||||||
@ -519,17 +519,32 @@ static struct refspec *parse_refspec_internal(int nr_refspec, const char **refsp
|
|||||||
return rs;
|
return rs;
|
||||||
|
|
||||||
invalid:
|
invalid:
|
||||||
|
if (verify) {
|
||||||
|
free(rs);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
die("Invalid refspec '%s'", refspec[i]);
|
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)
|
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)
|
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)
|
static int valid_remote_nick(const char *name)
|
||||||
|
1
remote.h
1
remote.h
@ -67,6 +67,7 @@ void free_refs(struct ref *ref);
|
|||||||
*/
|
*/
|
||||||
void ref_remove_duplicates(struct ref *ref_map);
|
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_fetch_refspec(int nr_refspec, const char **refspec);
|
||||||
struct refspec *parse_push_refspec(int nr_refspec, const char **refspec);
|
struct refspec *parse_push_refspec(int nr_refspec, const char **refspec);
|
||||||
|
|
||||||
|
@ -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
|
test_done
|
||||||
|
@ -483,6 +483,22 @@ test_expect_success \
|
|||||||
'gitweb_run "p=.git;a=history;f=file"'
|
'gitweb_run "p=.git;a=history;f=file"'
|
||||||
test_debug 'cat gitweb.log'
|
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
|
# feed generation
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user