mirror of
https://github.com/git/git.git
synced 2026-03-14 10:53:25 +01:00
Merge branch 'master' into next
* master: git-svn: add a message encouraging use of SVN::* libraries commit: fix a segfault when displaying a commit with unreachable parents git-svn: -h(elp) message formatting fixes Documentation/git-svn: document some of the newer features git-svn: log command fixes git-svn: multi-init saves and reuses --tags and --branches arguments atomic write for sideband remote messages
This commit is contained in:
@@ -37,7 +37,9 @@ COMMANDS
|
||||
'init'::
|
||||
Creates an empty git repository with additional metadata
|
||||
directories for git-svn. The Subversion URL must be specified
|
||||
as a command-line argument.
|
||||
as a command-line argument. Optionally, the target directory
|
||||
to operate on can be specified as a second argument. Normally
|
||||
this command initializes the current directory.
|
||||
|
||||
'fetch'::
|
||||
|
||||
@@ -63,7 +65,30 @@ manually joining branches on commit.
|
||||
This is advantageous over 'commit' (below) because it produces
|
||||
cleaner, more linear history.
|
||||
|
||||
'log'::
|
||||
This should make it easy to look up svn log messages when svn
|
||||
users refer to -r/--revision numbers.
|
||||
|
||||
The following features from `svn log' are supported:
|
||||
|
||||
--revision=<n>[:<n>] - is supported, non-numeric args are not:
|
||||
HEAD, NEXT, BASE, PREV, etc ...
|
||||
-v/--verbose - it's not completely compatible with
|
||||
the --verbose output in svn log, but
|
||||
reasonably close.
|
||||
--limit=<n> - is NOT the same as --max-count,
|
||||
doesn't count merged/excluded commits
|
||||
--incremental - supported
|
||||
|
||||
New features:
|
||||
|
||||
--show-commit - shows the git commit sha1, as well
|
||||
--oneline - our version of --pretty=oneline
|
||||
|
||||
Any other arguments are passed directly to `git log'
|
||||
|
||||
'commit'::
|
||||
You should consider using 'dcommit' instead of this command.
|
||||
Commit specified commit or tree objects to SVN. This relies on
|
||||
your imported fetch data being up-to-date. This makes
|
||||
absolutely no attempts to do patching when committing to SVN, it
|
||||
@@ -86,12 +111,49 @@ manually joining branches on commit.
|
||||
directories. The output is suitable for appending to
|
||||
the $GIT_DIR/info/exclude file.
|
||||
|
||||
'commit-diff'::
|
||||
Commits the diff of two tree-ish arguments from the
|
||||
command-line. This command is intended for interopability with
|
||||
git-svnimport and does not rely on being inside an git-svn
|
||||
init-ed repository. This command takes three arguments, (a) the
|
||||
original tree to diff against, (b) the new tree result, (c) the
|
||||
URL of the target Subversion repository. The final argument
|
||||
(URL) may be omitted if you are working from a git-svn-aware
|
||||
repository (that has been init-ed with git-svn).
|
||||
|
||||
'graft-branches'::
|
||||
This command attempts to detect merges/branches from already
|
||||
imported history. Techniques used currently include regexes,
|
||||
file copies, and tree-matches). This command generates (or
|
||||
modifies) the $GIT_DIR/info/grafts file. This command is
|
||||
considered experimental, and inherently flawed because
|
||||
merge-tracking in SVN is inherently flawed and inconsistent
|
||||
across different repositories.
|
||||
|
||||
'multi-init'::
|
||||
This command supports git-svnimport-like command-line syntax for
|
||||
importing repositories that are layed out as recommended by the
|
||||
SVN folks. This is a bit more tolerant than the git-svnimport
|
||||
command-line syntax and doesn't require the user to figure out
|
||||
where the repository URL ends and where the repository path
|
||||
begins.
|
||||
|
||||
'multi-fetch'::
|
||||
This runs fetch on all known SVN branches we're tracking. This
|
||||
will NOT discover new branches (unlike git-svnimport), so
|
||||
multi-init will need to be re-run (it's idempotent).
|
||||
|
||||
--
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
--
|
||||
|
||||
--shared::
|
||||
--template=<template_directory>::
|
||||
Only used with the 'init' command.
|
||||
These are passed directly to gitlink:git-init-db[1].
|
||||
|
||||
-r <ARG>::
|
||||
--revision <ARG>::
|
||||
|
||||
@@ -115,7 +177,7 @@ git-rev-list --pretty=oneline output can be used.
|
||||
|
||||
--rmdir::
|
||||
|
||||
Only used with the 'commit' command.
|
||||
Only used with the 'dcommit', 'commit' and 'commit-diff' commands.
|
||||
|
||||
Remove directories from the SVN tree if there are no files left
|
||||
behind. SVN can version empty directories, and they are not
|
||||
@@ -128,7 +190,7 @@ repo-config key: svn.rmdir
|
||||
-e::
|
||||
--edit::
|
||||
|
||||
Only used with the 'commit' command.
|
||||
Only used with the 'dcommit', 'commit' and 'commit-diff' commands.
|
||||
|
||||
Edit the commit message before committing to SVN. This is off by
|
||||
default for objects that are commits, and forced on when committing
|
||||
@@ -139,7 +201,7 @@ repo-config key: svn.edit
|
||||
-l<num>::
|
||||
--find-copies-harder::
|
||||
|
||||
Both of these are only used with the 'commit' command.
|
||||
Only used with the 'dcommit', 'commit' and 'commit-diff' commands.
|
||||
|
||||
They are both passed directly to git-diff-tree see
|
||||
gitlink:git-diff-tree[1] for more information.
|
||||
@@ -164,7 +226,26 @@ will abort operation. The user will then have to add the
|
||||
appropriate entry. Re-running the previous git-svn command
|
||||
after the authors-file is modified should continue operation.
|
||||
|
||||
repo-config key: svn.authors-file
|
||||
repo-config key: svn.authorsfile
|
||||
|
||||
-q::
|
||||
--quiet::
|
||||
Make git-svn less verbose. This only affects git-svn if you
|
||||
have the SVN::* libraries installed and are using them.
|
||||
|
||||
--repack[=<n>]::
|
||||
--repack-flags=<flags>
|
||||
These should help keep disk usage sane for large fetches
|
||||
with many revisions.
|
||||
|
||||
--repack takes an optional argument for the number of revisions
|
||||
to fetch before repacking. This defaults to repacking every
|
||||
1000 commits fetched if no argument is specified.
|
||||
|
||||
--repack-flags are passed directly to gitlink:git-repack[1].
|
||||
|
||||
repo-config key: svn.repack
|
||||
repo-config key: svn.repackflags
|
||||
|
||||
-m::
|
||||
--merge::
|
||||
@@ -215,6 +296,28 @@ section on
|
||||
'<<tracking-multiple-repos,Tracking Multiple Repositories or Branches>>'
|
||||
for more information on using GIT_SVN_ID.
|
||||
|
||||
--follow-parent::
|
||||
This is especially helpful when we're tracking a directory
|
||||
that has been moved around within the repository, or if we
|
||||
started tracking a branch and never tracked the trunk it was
|
||||
descended from.
|
||||
|
||||
This relies on the SVN::* libraries to work.
|
||||
|
||||
repo-config key: svn.followparent
|
||||
|
||||
--no-metadata::
|
||||
This gets rid of the git-svn-id: lines at the end of every commit.
|
||||
|
||||
With this, you lose the ability to use the rebuild command. If
|
||||
you ever lose your .git/svn/git-svn/.rev_db file, you won't be
|
||||
able to fetch again, either. This is fine for one-shot imports.
|
||||
|
||||
The 'git-svn log' command will not work on repositories using this,
|
||||
either.
|
||||
|
||||
repo-config key: svn.nometadata
|
||||
|
||||
--
|
||||
|
||||
COMPATIBILITY OPTIONS
|
||||
@@ -231,6 +334,9 @@ for tracking the remote.
|
||||
--no-ignore-externals::
|
||||
Only used with the 'fetch' and 'rebuild' command.
|
||||
|
||||
This command has no effect when you are using the SVN::*
|
||||
libraries with git, svn:externals are always avoided.
|
||||
|
||||
By default, git-svn passes --ignore-externals to svn to avoid
|
||||
fetching svn:external trees into git. Pass this flag to enable
|
||||
externals tracking directly via git.
|
||||
@@ -264,7 +370,7 @@ Basic Examples
|
||||
Tracking and contributing to an Subversion managed-project:
|
||||
|
||||
------------------------------------------------------------------------
|
||||
# Initialize a tree (like git init-db):
|
||||
# Initialize a repo (like git init-db):
|
||||
git-svn init http://svn.foo.org/project/trunk
|
||||
# Fetch remote revisions:
|
||||
git-svn fetch
|
||||
@@ -312,8 +418,8 @@ branches or directories in a Subversion repository, git-svn has a simple
|
||||
hack to allow it to track an arbitrary number of related _or_ unrelated
|
||||
SVN repositories via one git repository. Simply set the GIT_SVN_ID
|
||||
environment variable to a name other other than "git-svn" (the default)
|
||||
and git-svn will ignore the contents of the $GIT_DIR/git-svn directory
|
||||
and instead do all of its work in $GIT_DIR/$GIT_SVN_ID for that
|
||||
and git-svn will ignore the contents of the $GIT_DIR/svn/git-svn directory
|
||||
and instead do all of its work in $GIT_DIR/svn/$GIT_SVN_ID for that
|
||||
invocation. The interface branch will be remotes/$GIT_SVN_ID, instead of
|
||||
remotes/git-svn. Any remotes/$GIT_SVN_ID branch should never be modified
|
||||
by the user outside of git-svn commands.
|
||||
@@ -341,6 +447,9 @@ This allows you to tie unfetched SVN revision 375 to your current HEAD:
|
||||
|
||||
Advanced Example: Tracking a Reorganized Repository
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Note: this example is now obsolete if you have SVN::* libraries
|
||||
installed. Simply use --follow-parent when fetching.
|
||||
|
||||
If you're tracking a directory that has moved, or otherwise been
|
||||
branched or tagged off of another directory in the repository and you
|
||||
care about the full history of the project, then you can read this
|
||||
@@ -371,20 +480,18 @@ he needed to continue tracking /ufoai/trunk where /trunk left off.
|
||||
|
||||
BUGS
|
||||
----
|
||||
If somebody commits a conflicting changeset to SVN at a bad moment
|
||||
(right before you commit) causing a conflict and your commit to fail,
|
||||
your svn working tree ($GIT_DIR/git-svn/tree) may be dirtied. The
|
||||
easiest thing to do is probably just to rm -rf $GIT_DIR/git-svn/tree and
|
||||
run 'rebuild'.
|
||||
|
||||
If you are not using the SVN::* Perl libraries and somebody commits a
|
||||
conflicting changeset to SVN at a bad moment (right before you commit)
|
||||
causing a conflict and your commit to fail, your svn working tree
|
||||
($GIT_DIR/git-svn/tree) may be dirtied. The easiest thing to do is
|
||||
probably just to rm -rf $GIT_DIR/git-svn/tree and run 'rebuild'.
|
||||
|
||||
We ignore all SVN properties except svn:executable. Too difficult to
|
||||
map them since we rely heavily on git write-tree being _exactly_ the
|
||||
same on both the SVN and git working trees and I prefer not to clutter
|
||||
working trees with metadata files.
|
||||
|
||||
svn:keywords can't be ignored in Subversion (at least I don't know of
|
||||
a way to ignore them).
|
||||
|
||||
Renamed and copied directories are not detected by git and hence not
|
||||
tracked when committing to SVN. I do not plan on adding support for
|
||||
this as it's quite difficult and time-consuming to get working for all
|
||||
|
||||
@@ -75,7 +75,7 @@ static int run_remote_archiver(const char *remote, int argc,
|
||||
die("git-archive: expected a flush");
|
||||
|
||||
/* Now, start reading from fd[0] and spit it out to stdout */
|
||||
rv = recv_sideband("archive", fd[0], 1, 2, buf, sizeof(buf));
|
||||
rv = recv_sideband("archive", fd[0], 1, 2);
|
||||
close(fd[0]);
|
||||
rv |= finish_connect(pid);
|
||||
|
||||
|
||||
11
commit.c
11
commit.c
@@ -548,10 +548,13 @@ static int add_merge_info(enum cmit_fmt fmt, char *buf, const struct commit *com
|
||||
|
||||
while (parent) {
|
||||
struct commit *p = parent->item;
|
||||
const char *hex = abbrev
|
||||
? find_unique_abbrev(p->object.sha1, abbrev)
|
||||
: sha1_to_hex(p->object.sha1);
|
||||
const char *dots = (abbrev && strlen(hex) != 40) ? "..." : "";
|
||||
const char *hex = NULL;
|
||||
const char *dots;
|
||||
if (abbrev)
|
||||
hex = find_unique_abbrev(p->object.sha1, abbrev);
|
||||
if (!hex)
|
||||
hex = sha1_to_hex(p->object.sha1);
|
||||
dots = (abbrev && strlen(hex) != 40) ? "..." : "";
|
||||
parent = parent->next;
|
||||
|
||||
offset += sprintf(buf + offset, " %s%s", hex, dots);
|
||||
|
||||
@@ -115,12 +115,10 @@ static pid_t setup_sideband(int sideband, const char *me, int fd[2], int xd[2])
|
||||
die("%s: unable to fork off sideband demultiplexer", me);
|
||||
if (!side_pid) {
|
||||
/* subprocess */
|
||||
char buf[LARGE_PACKET_MAX];
|
||||
|
||||
close(fd[0]);
|
||||
if (xd[0] != xd[1])
|
||||
close(xd[1]);
|
||||
if (recv_sideband(me, xd[0], fd[1], 2, buf, sizeof(buf)))
|
||||
if (recv_sideband(me, xd[0], fd[1], 2))
|
||||
exit(1);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
68
git-svn.perl
68
git-svn.perl
@@ -40,8 +40,22 @@ memoize('cmt_metadata');
|
||||
memoize('get_commit_time');
|
||||
|
||||
my ($SVN_PATH, $SVN, $SVN_LOG, $_use_lib);
|
||||
|
||||
sub nag_lib {
|
||||
print STDERR <<EOF;
|
||||
! Please consider installing the SVN Perl libraries (version 1.1.0 or
|
||||
! newer). You will generally get better performance and fewer bugs,
|
||||
! especially if you:
|
||||
! 1) have a case-insensitive filesystem
|
||||
! 2) replace symlinks with files (and vice-versa) in commits
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
$_use_lib = 1 unless $ENV{GIT_SVN_NO_LIB};
|
||||
libsvn_load();
|
||||
nag_lib() unless $_use_lib;
|
||||
|
||||
my $_optimize_commits = 1 unless $ENV{GIT_SVN_NO_OPTIMIZE_COMMITS};
|
||||
my $sha1 = qr/[a-f\d]{40}/;
|
||||
my $sha1_short = qr/[a-f\d]{4,40}/;
|
||||
@@ -52,7 +66,7 @@ my ($_revision,$_stdin,$_no_ignore_ext,$_no_stop_copy,$_help,$_rmdir,$_edit,
|
||||
$_template, $_shared, $_no_default_regex, $_no_graft_copy,
|
||||
$_limit, $_verbose, $_incremental, $_oneline, $_l_fmt, $_show_commit,
|
||||
$_version, $_upgrade, $_authors, $_branch_all_refs, @_opt_m,
|
||||
$_merge, $_strategy, $_dry_run, $_ignore_nodate);
|
||||
$_merge, $_strategy, $_dry_run, $_ignore_nodate, $_non_recursive);
|
||||
my (@_branch_from, %tree_map, %users, %rusers, %equiv);
|
||||
my ($_svn_co_url_revs, $_svn_pg_peg_revs);
|
||||
my @repo_path_split_cache;
|
||||
@@ -114,6 +128,7 @@ my %cmd = (
|
||||
'incremental' => \$_incremental,
|
||||
'oneline' => \$_oneline,
|
||||
'show-commit' => \$_show_commit,
|
||||
'non-recursive' => \$_non_recursive,
|
||||
'authors-file|A=s' => \$_authors,
|
||||
} ],
|
||||
'commit-diff' => [ \&commit_diff, 'Commit a diff between two trees',
|
||||
@@ -168,11 +183,11 @@ Usage: $0 <command> [options] [arguments]\n
|
||||
|
||||
foreach (sort keys %cmd) {
|
||||
next if $cmd && $cmd ne $_;
|
||||
print $fd ' ',pack('A13',$_),$cmd{$_}->[1],"\n";
|
||||
print $fd ' ',pack('A17',$_),$cmd{$_}->[1],"\n";
|
||||
foreach (keys %{$cmd{$_}->[2]}) {
|
||||
# prints out arguments as they should be passed:
|
||||
my $x = s#[:=]s$## ? '<arg>' : s#[:=]i$## ? '<num>' : '';
|
||||
print $fd ' ' x 17, join(', ', map { length $_ > 1 ?
|
||||
print $fd ' ' x 21, join(', ', map { length $_ > 1 ?
|
||||
"--$_" : "-$_" }
|
||||
split /\|/,$_)," $x\n";
|
||||
}
|
||||
@@ -682,12 +697,17 @@ sub multi_init {
|
||||
}
|
||||
$_trunk = $url . $_trunk;
|
||||
}
|
||||
my $ch_id;
|
||||
if ($GIT_SVN eq 'git-svn') {
|
||||
print "GIT_SVN_ID set to 'trunk' for $_trunk\n";
|
||||
$ch_id = 1;
|
||||
$GIT_SVN = $ENV{GIT_SVN_ID} = 'trunk';
|
||||
}
|
||||
init_vars();
|
||||
init($_trunk);
|
||||
unless (-d $GIT_SVN_DIR) {
|
||||
print "GIT_SVN_ID set to 'trunk' for $_trunk\n" if $ch_id;
|
||||
init($_trunk);
|
||||
sys('git-repo-config', 'svn.trunk', $_trunk);
|
||||
}
|
||||
complete_url_ls_init($url, $_branches, '--branches/-b', '');
|
||||
complete_url_ls_init($url, $_tags, '--tags/-t', 'tags/');
|
||||
}
|
||||
@@ -747,13 +767,18 @@ sub show_log {
|
||||
# ignore
|
||||
} elsif (/^:\d{6} \d{6} $sha1_short/o) {
|
||||
push @{$c->{raw}}, $_;
|
||||
} elsif (/^[ACRMDT]\t/) {
|
||||
# we could add $SVN_PATH here, but that requires
|
||||
# remote access at the moment (repo_path_split)...
|
||||
s#^([ACRMDT])\t# $1 #;
|
||||
push @{$c->{changed}}, $_;
|
||||
} elsif (/^diff /) {
|
||||
$d = 1;
|
||||
push @{$c->{diff}}, $_;
|
||||
} elsif ($d) {
|
||||
push @{$c->{diff}}, $_;
|
||||
} elsif (/^ (git-svn-id:.+)$/) {
|
||||
(undef, $c->{r}, undef) = extract_metadata($1);
|
||||
($c->{url}, $c->{r}, undef) = extract_metadata($1);
|
||||
} elsif (s/^ //) {
|
||||
push @{$c->{l}}, $_;
|
||||
}
|
||||
@@ -845,7 +870,8 @@ sub git_svn_log_cmd {
|
||||
my ($r_min, $r_max) = @_;
|
||||
my @cmd = (qw/git-log --abbrev-commit --pretty=raw
|
||||
--default/, "refs/remotes/$GIT_SVN");
|
||||
push @cmd, '--summary' if $_verbose;
|
||||
push @cmd, '-r' unless $_non_recursive;
|
||||
push @cmd, qw/--raw --name-status/ if $_verbose;
|
||||
return @cmd unless defined $r_max;
|
||||
if ($r_max == $r_min) {
|
||||
push @cmd, '--max-count=1';
|
||||
@@ -856,7 +882,7 @@ sub git_svn_log_cmd {
|
||||
my ($c_min, $c_max);
|
||||
$c_max = revdb_get($REVDB, $r_max);
|
||||
$c_min = revdb_get($REVDB, $r_min);
|
||||
if ($c_min && $c_max) {
|
||||
if (defined $c_min && defined $c_max) {
|
||||
if ($r_max > $r_max) {
|
||||
push @cmd, "$c_min..$c_max";
|
||||
} else {
|
||||
@@ -937,16 +963,21 @@ sub complete_url_ls_init {
|
||||
print STDERR "W: Unrecognized URL: $u\n";
|
||||
die "This should never happen\n";
|
||||
}
|
||||
# don't try to init already existing refs
|
||||
my $id = $pfx.$1;
|
||||
print "init $u => $id\n";
|
||||
$GIT_SVN = $ENV{GIT_SVN_ID} = $id;
|
||||
init_vars();
|
||||
init($u);
|
||||
unless (-d $GIT_SVN_DIR) {
|
||||
print "init $u => $id\n";
|
||||
init($u);
|
||||
}
|
||||
}
|
||||
exit 0;
|
||||
}
|
||||
waitpid $pid, 0;
|
||||
croak $? if $?;
|
||||
my ($n) = ($switch =~ /^--(\w+)/);
|
||||
sys('git-repo-config', "svn.$n", $var);
|
||||
}
|
||||
|
||||
sub common_prefix {
|
||||
@@ -2551,6 +2582,12 @@ sub show_commit {
|
||||
}
|
||||
}
|
||||
|
||||
sub show_commit_changed_paths {
|
||||
my ($c) = @_;
|
||||
return unless $c->{changed};
|
||||
print "Changed paths:\n", @{$c->{changed}};
|
||||
}
|
||||
|
||||
sub show_commit_normal {
|
||||
my ($c) = @_;
|
||||
print '-' x72, "\nr$c->{r} | ";
|
||||
@@ -2560,7 +2597,8 @@ sub show_commit_normal {
|
||||
my $nr_line = 0;
|
||||
|
||||
if (my $l = $c->{l}) {
|
||||
while ($l->[$#$l] eq "\n" && $l->[($#$l - 1)] eq "\n") {
|
||||
while ($l->[$#$l] eq "\n" && $#$l > 0
|
||||
&& $l->[($#$l - 1)] eq "\n") {
|
||||
pop @$l;
|
||||
}
|
||||
$nr_line = scalar @$l;
|
||||
@@ -2572,11 +2610,15 @@ sub show_commit_normal {
|
||||
} else {
|
||||
$nr_line .= ' lines';
|
||||
}
|
||||
print $nr_line, "\n\n";
|
||||
print $nr_line, "\n";
|
||||
show_commit_changed_paths($c);
|
||||
print "\n";
|
||||
print $_ foreach @$l;
|
||||
}
|
||||
} else {
|
||||
print "1 line\n\n";
|
||||
print "1 line\n";
|
||||
show_commit_changed_paths($c);
|
||||
print "\n";
|
||||
|
||||
}
|
||||
foreach my $x (qw/raw diff/) {
|
||||
|
||||
28
sideband.c
28
sideband.c
@@ -11,10 +11,13 @@
|
||||
* stream, aka "verbose"). A message over band #3 is a signal that
|
||||
* the remote died unexpectedly. A flush() concludes the stream.
|
||||
*/
|
||||
int recv_sideband(const char *me, int in_stream, int out, int err, char *buf, int bufsz)
|
||||
int recv_sideband(const char *me, int in_stream, int out, int err)
|
||||
{
|
||||
char buf[7 + LARGE_PACKET_MAX + 1];
|
||||
strcpy(buf, "remote:");
|
||||
while (1) {
|
||||
int len = packet_read_line(in_stream, buf, bufsz);
|
||||
int band, len;
|
||||
len = packet_read_line(in_stream, buf+7, LARGE_PACKET_MAX);
|
||||
if (len == 0)
|
||||
break;
|
||||
if (len < 1) {
|
||||
@@ -22,25 +25,26 @@ int recv_sideband(const char *me, int in_stream, int out, int err, char *buf, in
|
||||
safe_write(err, buf, len);
|
||||
return SIDEBAND_PROTOCOL_ERROR;
|
||||
}
|
||||
band = buf[7] & 0xff;
|
||||
len--;
|
||||
switch (buf[0] & 0xFF) {
|
||||
switch (band) {
|
||||
case 3:
|
||||
safe_write(err, "remote: ", 8);
|
||||
safe_write(err, buf+1, len);
|
||||
safe_write(err, "\n", 1);
|
||||
buf[7] = ' ';
|
||||
buf[8+len] = '\n';
|
||||
safe_write(err, buf, 8+len+1);
|
||||
return SIDEBAND_REMOTE_ERROR;
|
||||
case 2:
|
||||
safe_write(err, "remote: ", 8);
|
||||
safe_write(err, buf+1, len);
|
||||
buf[7] = ' ';
|
||||
safe_write(err, buf, 8+len);
|
||||
continue;
|
||||
case 1:
|
||||
safe_write(out, buf+1, len);
|
||||
safe_write(out, buf+8, len);
|
||||
continue;
|
||||
default:
|
||||
len = sprintf(buf + 1,
|
||||
len = sprintf(buf,
|
||||
"%s: protocol error: bad band #%d\n",
|
||||
me, buf[0] & 0xFF);
|
||||
safe_write(err, buf+1, len);
|
||||
me, band);
|
||||
safe_write(err, buf, len);
|
||||
return SIDEBAND_PROTOCOL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#define DEFAULT_PACKET_MAX 1000
|
||||
#define LARGE_PACKET_MAX 65520
|
||||
|
||||
int recv_sideband(const char *me, int in_stream, int out, int err, char *, int);
|
||||
int recv_sideband(const char *me, int in_stream, int out, int err);
|
||||
ssize_t send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_max);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user