mirror of
https://github.com/git/git.git
synced 2026-02-18 13:49:51 +00:00
Merge branch 'jk/version-string' into next
Leftover bits from the "git version" code restructuring, that give us an ability to expose the Git version over the wire in the protocol exchange. But we do so carefully only to the other end that understands it. * jk/version-string: do not send client agent unless server does first send-pack: fix capability-sending logic include agent identifier in capability string
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#include "remote.h"
|
||||
#include "run-command.h"
|
||||
#include "transport.h"
|
||||
#include "version.h"
|
||||
|
||||
static int transfer_unpack_limit = -1;
|
||||
static int fetch_unpack_limit = -1;
|
||||
@@ -18,6 +19,7 @@ static int prefer_ofs_delta = 1;
|
||||
static int no_done;
|
||||
static int fetch_fsck_objects = -1;
|
||||
static int transfer_fsck_objects = -1;
|
||||
static int agent_supported;
|
||||
static struct fetch_pack_args args = {
|
||||
/* .uploadpack = */ "git-upload-pack",
|
||||
};
|
||||
@@ -327,6 +329,8 @@ static int find_common(int fd[2], unsigned char *result_sha1,
|
||||
if (args.no_progress) strbuf_addstr(&c, " no-progress");
|
||||
if (args.include_tag) strbuf_addstr(&c, " include-tag");
|
||||
if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
|
||||
if (agent_supported) strbuf_addf(&c, " agent=%s",
|
||||
git_user_agent_sanitized());
|
||||
packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
|
||||
strbuf_release(&c);
|
||||
} else
|
||||
@@ -819,6 +823,9 @@ static struct ref *do_fetch_pack(int fd[2],
|
||||
fprintf(stderr, "Server supports ofs-delta\n");
|
||||
} else
|
||||
prefer_ofs_delta = 0;
|
||||
if (server_supports("agent"))
|
||||
agent_supported = 1;
|
||||
|
||||
if (everything_local(&ref, nr_match, match)) {
|
||||
packet_flush(fd[1]);
|
||||
goto all_done;
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "string-list.h"
|
||||
#include "sha1-array.h"
|
||||
#include "connected.h"
|
||||
#include "version.h"
|
||||
|
||||
static const char receive_pack_usage[] = "git receive-pack <git-dir>";
|
||||
|
||||
@@ -121,10 +122,11 @@ static void show_ref(const char *path, const unsigned char *sha1)
|
||||
if (sent_capabilities)
|
||||
packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
|
||||
else
|
||||
packet_write(1, "%s %s%c%s%s\n",
|
||||
packet_write(1, "%s %s%c%s%s agent=%s\n",
|
||||
sha1_to_hex(sha1), path, 0,
|
||||
" report-status delete-refs side-band-64k quiet",
|
||||
prefer_ofs_delta ? " ofs-delta" : "");
|
||||
prefer_ofs_delta ? " ofs-delta" : "",
|
||||
git_user_agent_sanitized());
|
||||
sent_capabilities = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "send-pack.h"
|
||||
#include "quote.h"
|
||||
#include "transport.h"
|
||||
#include "version.h"
|
||||
|
||||
static const char send_pack_usage[] =
|
||||
"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...]\n"
|
||||
@@ -251,6 +252,7 @@ int send_pack(struct send_pack_args *args,
|
||||
int status_report = 0;
|
||||
int use_sideband = 0;
|
||||
int quiet_supported = 0;
|
||||
int agent_supported = 0;
|
||||
unsigned cmds_sent = 0;
|
||||
int ret;
|
||||
struct async demux;
|
||||
@@ -266,6 +268,8 @@ int send_pack(struct send_pack_args *args,
|
||||
use_sideband = 1;
|
||||
if (server_supports("quiet"))
|
||||
quiet_supported = 1;
|
||||
if (server_supports("agent"))
|
||||
agent_supported = 1;
|
||||
|
||||
if (!remote_refs) {
|
||||
fprintf(stderr, "No refs in common and none specified; doing nothing.\n"
|
||||
@@ -305,12 +309,17 @@ int send_pack(struct send_pack_args *args,
|
||||
char *new_hex = sha1_to_hex(ref->new_sha1);
|
||||
int quiet = quiet_supported && (args->quiet || !args->progress);
|
||||
|
||||
if (!cmds_sent && (status_report || use_sideband || args->quiet)) {
|
||||
packet_buf_write(&req_buf, "%s %s %s%c%s%s%s",
|
||||
if (!cmds_sent && (status_report || use_sideband ||
|
||||
quiet || agent_supported)) {
|
||||
packet_buf_write(&req_buf,
|
||||
"%s %s %s%c%s%s%s%s%s",
|
||||
old_hex, new_hex, ref->name, 0,
|
||||
status_report ? " report-status" : "",
|
||||
use_sideband ? " side-band-64k" : "",
|
||||
quiet ? " quiet" : "");
|
||||
quiet ? " quiet" : "",
|
||||
agent_supported ? " agent=" : "",
|
||||
agent_supported ? git_user_agent_sanitized() : ""
|
||||
);
|
||||
}
|
||||
else
|
||||
packet_buf_write(&req_buf, "%s %s %s",
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "list-objects.h"
|
||||
#include "run-command.h"
|
||||
#include "sigchain.h"
|
||||
#include "version.h"
|
||||
|
||||
static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<n>] <dir>";
|
||||
|
||||
@@ -734,9 +735,11 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo
|
||||
}
|
||||
|
||||
if (capabilities)
|
||||
packet_write(1, "%s %s%c%s%s\n", sha1_to_hex(sha1), refname_nons,
|
||||
packet_write(1, "%s %s%c%s%s agent=%s\n",
|
||||
sha1_to_hex(sha1), refname_nons,
|
||||
0, capabilities,
|
||||
stateless_rpc ? " no-done" : "");
|
||||
stateless_rpc ? " no-done" : "",
|
||||
git_user_agent_sanitized());
|
||||
else
|
||||
packet_write(1, "%s %s\n", sha1_to_hex(sha1), refname_nons);
|
||||
capabilities = NULL;
|
||||
|
||||
21
version.c
21
version.c
@@ -1,5 +1,6 @@
|
||||
#include "git-compat-util.h"
|
||||
#include "version.h"
|
||||
#include "strbuf.h"
|
||||
|
||||
const char git_version_string[] = GIT_VERSION;
|
||||
|
||||
@@ -15,3 +16,23 @@ const char *git_user_agent(void)
|
||||
|
||||
return agent;
|
||||
}
|
||||
|
||||
const char *git_user_agent_sanitized(void)
|
||||
{
|
||||
static const char *agent = NULL;
|
||||
|
||||
if (!agent) {
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
int i;
|
||||
|
||||
strbuf_addstr(&buf, git_user_agent());
|
||||
strbuf_trim(&buf);
|
||||
for (i = 0; i < buf.len; i++) {
|
||||
if (buf.buf[i] <= 32 || buf.buf[i] >= 127)
|
||||
buf.buf[i] = '.';
|
||||
}
|
||||
agent = buf.buf;
|
||||
}
|
||||
|
||||
return agent;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user