t / t4100 / t-apply-5.patchon commit ref_transaction_commit(): fix atomicity and avoid fd exhaustion (cf018ee)
   1diff a/Documentation/git-rpull.txt b/Documentation/git-rpull.txt
   2--- a/Documentation/git-rpull.txt
   3+++ /dev/null
   4@@ -1,50 +0,0 @@
   5-git-rpull(1)
   6-============
   7-v0.1, May 2005
   8-
   9-NAME
  10-----
  11-git-rpull - Pulls from a remote repository over ssh connection
  12-
  13-
  14-
  15-SYNOPSIS
  16---------
  17-'git-rpull' [-c] [-t] [-a] [-d] [-v] [--recover] commit-id url
  18-
  19-DESCRIPTION
  20------------
  21-Pulls from a remote repository over ssh connection, invoking git-rpush on
  22-the other end.
  23-
  24-OPTIONS
  25--------
  26--c::
  27-       Get the commit objects.
  28--t::
  29-       Get trees associated with the commit objects.
  30--a::
  31-       Get all the objects.
  32--d::
  33-       Do not check for delta base objects (use this option
  34-       only when you know the remote repository is not
  35-       deltified).
  36---recover::
  37-       Check dependency of deltified object more carefully than
  38-       usual, to recover after earlier pull that was interrupted.
  39--v::
  40-       Report what is downloaded.
  41-
  42-
  43-Author
  44-------
  45-Written by Linus Torvalds <torvalds@osdl.org>
  46-
  47-Documentation
  48---------------
  49-Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
  50-
  51-GIT
  52----
  53-Part of the link:git.html[git] suite
  54-
  55diff a/Documentation/git-rpush.txt b/Documentation/git-rpush.txt
  56--- a/Documentation/git-rpush.txt
  57+++ /dev/null
  58@@ -1,30 +0,0 @@
  59-git-rpush(1)
  60-============
  61-v0.1, May 2005
  62-
  63-NAME
  64-----
  65-git-rpush - Helper "server-side" program used by git-rpull
  66-
  67-
  68-SYNOPSIS
  69---------
  70-'git-rpush'
  71-
  72-DESCRIPTION
  73------------
  74-Helper "server-side" program used by git-rpull.
  75-
  76-
  77-Author
  78-------
  79-Written by Linus Torvalds <torvalds@osdl.org>
  80-
  81-Documentation
  82---------------
  83-Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
  84-
  85-GIT
  86----
  87-Part of the link:git.html[git] suite
  88-
  89diff a/Documentation/git-ssh-pull.txt b/Documentation/git-ssh-pull.txt
  90--- /dev/null
  91+++ b/Documentation/git-ssh-pull.txt
  92@@ -0,0 +1,50 @@
  93+git-ssh-pull(1)
  94+===============
  95+v0.1, May 2005
  96+
  97+NAME
  98+----
  99+git-ssh-pull - Pulls from a remote repository over ssh connection
 100+
 101+
 102+
 103+SYNOPSIS
 104+--------
 105+'git-ssh-pull' [-c] [-t] [-a] [-d] [-v] [--recover] commit-id url
 106+
 107+DESCRIPTION
 108+-----------
 109+Pulls from a remote repository over ssh connection, invoking git-ssh-push
 110+on the other end.
 111+
 112+OPTIONS
 113+-------
 114+-c::
 115+       Get the commit objects.
 116+-t::
 117+       Get trees associated with the commit objects.
 118+-a::
 119+       Get all the objects.
 120+-d::
 121+       Do not check for delta base objects (use this option
 122+       only when you know the remote repository is not
 123+       deltified).
 124+--recover::
 125+       Check dependency of deltified object more carefully than
 126+       usual, to recover after earlier pull that was interrupted.
 127+-v::
 128+       Report what is downloaded.
 129+
 130+
 131+Author
 132+------
 133+Written by Linus Torvalds <torvalds@osdl.org>
 134+
 135+Documentation
 136+--------------
 137+Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
 138+
 139+GIT
 140+---
 141+Part of the link:git.html[git] suite
 142+
 143diff a/Documentation/git-ssh-push.txt b/Documentation/git-ssh-push.txt
 144--- /dev/null
 145+++ b/Documentation/git-ssh-push.txt
 146@@ -0,0 +1,30 @@
 147+git-ssh-push(1)
 148+===============
 149+v0.1, May 2005
 150+
 151+NAME
 152+----
 153+git-ssh-push - Helper "server-side" program used by git-ssh-pull
 154+
 155+
 156+SYNOPSIS
 157+--------
 158+'git-ssh-push'
 159+
 160+DESCRIPTION
 161+-----------
 162+Helper "server-side" program used by git-ssh-pull.
 163+
 164+
 165+Author
 166+------
 167+Written by Linus Torvalds <torvalds@osdl.org>
 168+
 169+Documentation
 170+--------------
 171+Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
 172+
 173+GIT
 174+---
 175+Part of the link:git.html[git] suite
 176+
 177diff a/Documentation/git.txt b/Documentation/git.txt
 178--- a/Documentation/git.txt
 179+++ b/Documentation/git.txt
 180@@ -148,7 +148,7 @@ link:git-resolve-script.html[git-resolve
 181 link:git-tag-script.html[git-tag-script]::
 182        An example script to create a tag object signed with GPG
 183 
 184-link:git-rpull.html[git-rpull]::
 185+link:git-ssh-pull.html[git-ssh-pull]::
 186        Pulls from a remote repository over ssh connection
 187 
 188 Interogators:
 189@@ -156,8 +156,8 @@ Interogators:
 190 link:git-diff-helper.html[git-diff-helper]::
 191        Generates patch format output for git-diff-*
 192 
 193-link:git-rpush.html[git-rpush]::
 194-       Helper "server-side" program used by git-rpull
 195+link:git-ssh-push.html[git-ssh-push]::
 196+       Helper "server-side" program used by git-ssh-pull
 197 
 198 
 199 
 200diff a/Makefile b/Makefile
 201--- a/Makefile
 202+++ b/Makefile
 203@@ -30,7 +30,7 @@ PROG=   git-update-index git-diff-files
 204        git-checkout-cache git-diff-tree git-rev-tree git-ls-files \
 205        git-check-files git-ls-tree git-merge-base git-merge-cache \
 206        git-unpack-file git-export git-diff-cache git-convert-cache \
 207-       git-http-pull git-rpush git-rpull git-rev-list git-mktag \
 208+       git-http-pull git-ssh-push git-ssh-pull git-rev-list git-mktag \
 209        git-diff-helper git-tar-tree git-local-pull git-write-blob \
 210        git-get-tar-commit-id git-mkdelta git-apply git-stripspace
 211 
 212@@ -105,8 +105,8 @@ git-diff-cache: diff-cache.c
 213 git-convert-cache: convert-cache.c
 214 git-http-pull: http-pull.c pull.c
 215 git-local-pull: local-pull.c pull.c
 216-git-rpush: rsh.c
 217-git-rpull: rsh.c pull.c
 218+git-ssh-push: rsh.c
 219+git-ssh-pull: rsh.c pull.c
 220 git-rev-list: rev-list.c
 221 git-mktag: mktag.c
 222 git-diff-helper: diff-helper.c
 223diff a/rpull.c b/rpull.c
 224--- a/rpull.c
 225+++ /dev/null
 226@@ -1,83 +0,0 @@
 227-#include "cache.h"
 228-#include "commit.h"
 229-#include "rsh.h"
 230-#include "pull.h"
 231-
 232-static int fd_in;
 233-static int fd_out;
 234-
 235-static unsigned char remote_version = 0;
 236-static unsigned char local_version = 1;
 237-
 238-int fetch(unsigned char *sha1)
 239-{
 240-       int ret;
 241-       signed char remote;
 242-       char type = 'o';
 243-       if (has_sha1_file(sha1))
 244-               return 0;
 245-       write(fd_out, &type, 1);
 246-       write(fd_out, sha1, 20);
 247-       if (read(fd_in, &remote, 1) < 1)
 248-               return -1;
 249-       if (remote < 0)
 250-               return remote;
 251-       ret = write_sha1_from_fd(sha1, fd_in);
 252-       if (!ret)
 253-               pull_say("got %s\n", sha1_to_hex(sha1));
 254-       return ret;
 255-}
 256-
 257-int get_version(void)
 258-{
 259-       char type = 'v';
 260-       write(fd_out, &type, 1);
 261-       write(fd_out, &local_version, 1);
 262-       if (read(fd_in, &remote_version, 1) < 1) {
 263-               return error("Couldn't read version from remote end");
 264-       }
 265-       return 0;
 266-}
 267-
 268-int main(int argc, char **argv)
 269-{
 270-       char *commit_id;
 271-       char *url;
 272-       int arg = 1;
 273-
 274-       while (arg < argc && argv[arg][0] == '-') {
 275-               if (argv[arg][1] == 't') {
 276-                       get_tree = 1;
 277-               } else if (argv[arg][1] == 'c') {
 278-                       get_history = 1;
 279-               } else if (argv[arg][1] == 'd') {
 280-                       get_delta = 0;
 281-               } else if (!strcmp(argv[arg], "--recover")) {
 282-                       get_delta = 2;
 283-               } else if (argv[arg][1] == 'a') {
 284-                       get_all = 1;
 285-                       get_tree = 1;
 286-                       get_history = 1;
 287-               } else if (argv[arg][1] == 'v') {
 288-                       get_verbosely = 1;
 289-               }
 290-               arg++;
 291-       }
 292-       if (argc < arg + 2) {
 293-               usage("git-rpull [-c] [-t] [-a] [-v] [-d] [--recover] commit-id url");
 294-               return 1;
 295-       }
 296-       commit_id = argv[arg];
 297-       url = argv[arg + 1];
 298-
 299-       if (setup_connection(&fd_in, &fd_out, "git-rpush", url, arg, argv + 1))
 300-               return 1;
 301-
 302-       if (get_version())
 303-               return 1;
 304-
 305-       if (pull(commit_id))
 306-               return 1;
 307-
 308-       return 0;
 309-}
 310diff a/rpush.c b/rpush.c
 311--- a/rpush.c
 312+++ /dev/null
 313@@ -1,104 +0,0 @@
 314-#include "cache.h"
 315-#include "rsh.h"
 316-#include <sys/socket.h>
 317-#include <errno.h>
 318-
 319-unsigned char local_version = 1;
 320-unsigned char remote_version = 0;
 321-
 322-int serve_object(int fd_in, int fd_out) {
 323-       ssize_t size;
 324-       int posn = 0;
 325-       char sha1[20];
 326-       unsigned long objsize;
 327-       void *buf;
 328-       signed char remote;
 329-       do {
 330-               size = read(fd_in, sha1 + posn, 20 - posn);
 331-               if (size < 0) {
 332-                       perror("git-rpush: read ");
 333-                       return -1;
 334-               }
 335-               if (!size)
 336-                       return -1;
 337-               posn += size;
 338-       } while (posn < 20);
 339-       
 340-       /* fprintf(stderr, "Serving %s\n", sha1_to_hex(sha1)); */
 341-       remote = 0;
 342-       
 343-       buf = map_sha1_file(sha1, &objsize);
 344-       
 345-       if (!buf) {
 346-               fprintf(stderr, "git-rpush: could not find %s\n", 
 347-                       sha1_to_hex(sha1));
 348-               remote = -1;
 349-       }
 350-       
 351-       write(fd_out, &remote, 1);
 352-       
 353-       if (remote < 0)
 354-               return 0;
 355-       
 356-       posn = 0;
 357-       do {
 358-               size = write(fd_out, buf + posn, objsize - posn);
 359-               if (size <= 0) {
 360-                       if (!size) {
 361-                               fprintf(stderr, "git-rpush: write closed");
 362-                       } else {
 363-                               perror("git-rpush: write ");
 364-                       }
 365-                       return -1;
 366-               }
 367-               posn += size;
 368-       } while (posn < objsize);
 369-       return 0;
 370-}
 371-
 372-int serve_version(int fd_in, int fd_out)
 373-{
 374-       if (read(fd_in, &remote_version, 1) < 1)
 375-               return -1;
 376-       write(fd_out, &local_version, 1);
 377-       return 0;
 378-}
 379-
 380-void service(int fd_in, int fd_out) {
 381-       char type;
 382-       int retval;
 383-       do {
 384-               retval = read(fd_in, &type, 1);
 385-               if (retval < 1) {
 386-                       if (retval < 0)
 387-                               perror("rpush: read ");
 388-                       return;
 389-               }
 390-               if (type == 'v' && serve_version(fd_in, fd_out))
 391-                       return;
 392-               if (type == 'o' && serve_object(fd_in, fd_out))
 393-                       return;
 394-       } while (1);
 395-}
 396-
 397-int main(int argc, char **argv)
 398-{
 399-       int arg = 1;
 400-        char *commit_id;
 401-        char *url;
 402-       int fd_in, fd_out;
 403-       while (arg < argc && argv[arg][0] == '-') {
 404-                arg++;
 405-        }
 406-        if (argc < arg + 2) {
 407-               usage("git-rpush [-c] [-t] [-a] commit-id url");
 408-                return 1;
 409-        }
 410-       commit_id = argv[arg];
 411-       url = argv[arg + 1];
 412-       if (setup_connection(&fd_in, &fd_out, "git-rpull", url, arg, argv + 1))
 413-               return 1;
 414-
 415-       service(fd_in, fd_out);
 416-       return 0;
 417-}
 418diff a/ssh-pull.c b/ssh-pull.c
 419--- /dev/null
 420+++ b/ssh-pull.c
 421@@ -0,0 +1,83 @@
 422+#include "cache.h"
 423+#include "commit.h"
 424+#include "rsh.h"
 425+#include "pull.h"
 426+
 427+static int fd_in;
 428+static int fd_out;
 429+
 430+static unsigned char remote_version = 0;
 431+static unsigned char local_version = 1;
 432+
 433+int fetch(unsigned char *sha1)
 434+{
 435+       int ret;
 436+       signed char remote;
 437+       char type = 'o';
 438+       if (has_sha1_file(sha1))
 439+               return 0;
 440+       write(fd_out, &type, 1);
 441+       write(fd_out, sha1, 20);
 442+       if (read(fd_in, &remote, 1) < 1)
 443+               return -1;
 444+       if (remote < 0)
 445+               return remote;
 446+       ret = write_sha1_from_fd(sha1, fd_in);
 447+       if (!ret)
 448+               pull_say("got %s\n", sha1_to_hex(sha1));
 449+       return ret;
 450+}
 451+
 452+int get_version(void)
 453+{
 454+       char type = 'v';
 455+       write(fd_out, &type, 1);
 456+       write(fd_out, &local_version, 1);
 457+       if (read(fd_in, &remote_version, 1) < 1) {
 458+               return error("Couldn't read version from remote end");
 459+       }
 460+       return 0;
 461+}
 462+
 463+int main(int argc, char **argv)
 464+{
 465+       char *commit_id;
 466+       char *url;
 467+       int arg = 1;
 468+
 469+       while (arg < argc && argv[arg][0] == '-') {
 470+               if (argv[arg][1] == 't') {
 471+                       get_tree = 1;
 472+               } else if (argv[arg][1] == 'c') {
 473+                       get_history = 1;
 474+               } else if (argv[arg][1] == 'd') {
 475+                       get_delta = 0;
 476+               } else if (!strcmp(argv[arg], "--recover")) {
 477+                       get_delta = 2;
 478+               } else if (argv[arg][1] == 'a') {
 479+                       get_all = 1;
 480+                       get_tree = 1;
 481+                       get_history = 1;
 482+               } else if (argv[arg][1] == 'v') {
 483+                       get_verbosely = 1;
 484+               }
 485+               arg++;
 486+       }
 487+       if (argc < arg + 2) {
 488+               usage("git-ssh-pull [-c] [-t] [-a] [-v] [-d] [--recover] commit-id url");
 489+               return 1;
 490+       }
 491+       commit_id = argv[arg];
 492+       url = argv[arg + 1];
 493+
 494+       if (setup_connection(&fd_in, &fd_out, "git-ssh-push", url, arg, argv + 1))
 495+               return 1;
 496+
 497+       if (get_version())
 498+               return 1;
 499+
 500+       if (pull(commit_id))
 501+               return 1;
 502+
 503+       return 0;
 504+}
 505diff a/ssh-push.c b/ssh-push.c
 506--- /dev/null
 507+++ b/ssh-push.c
 508@@ -0,0 +1,104 @@
 509+#include "cache.h"
 510+#include "rsh.h"
 511+#include <sys/socket.h>
 512+#include <errno.h>
 513+
 514+unsigned char local_version = 1;
 515+unsigned char remote_version = 0;
 516+
 517+int serve_object(int fd_in, int fd_out) {
 518+       ssize_t size;
 519+       int posn = 0;
 520+       char sha1[20];
 521+       unsigned long objsize;
 522+       void *buf;
 523+       signed char remote;
 524+       do {
 525+               size = read(fd_in, sha1 + posn, 20 - posn);
 526+               if (size < 0) {
 527+                       perror("git-ssh-push: read ");
 528+                       return -1;
 529+               }
 530+               if (!size)
 531+                       return -1;
 532+               posn += size;
 533+       } while (posn < 20);
 534+       
 535+       /* fprintf(stderr, "Serving %s\n", sha1_to_hex(sha1)); */
 536+       remote = 0;
 537+       
 538+       buf = map_sha1_file(sha1, &objsize);
 539+       
 540+       if (!buf) {
 541+               fprintf(stderr, "git-ssh-push: could not find %s\n", 
 542+                       sha1_to_hex(sha1));
 543+               remote = -1;
 544+       }
 545+       
 546+       write(fd_out, &remote, 1);
 547+       
 548+       if (remote < 0)
 549+               return 0;
 550+       
 551+       posn = 0;
 552+       do {
 553+               size = write(fd_out, buf + posn, objsize - posn);
 554+               if (size <= 0) {
 555+                       if (!size) {
 556+                               fprintf(stderr, "git-ssh-push: write closed");
 557+                       } else {
 558+                               perror("git-ssh-push: write ");
 559+                       }
 560+                       return -1;
 561+               }
 562+               posn += size;
 563+       } while (posn < objsize);
 564+       return 0;
 565+}
 566+
 567+int serve_version(int fd_in, int fd_out)
 568+{
 569+       if (read(fd_in, &remote_version, 1) < 1)
 570+               return -1;
 571+       write(fd_out, &local_version, 1);
 572+       return 0;
 573+}
 574+
 575+void service(int fd_in, int fd_out) {
 576+       char type;
 577+       int retval;
 578+       do {
 579+               retval = read(fd_in, &type, 1);
 580+               if (retval < 1) {
 581+                       if (retval < 0)
 582+                               perror("git-ssh-push: read ");
 583+                       return;
 584+               }
 585+               if (type == 'v' && serve_version(fd_in, fd_out))
 586+                       return;
 587+               if (type == 'o' && serve_object(fd_in, fd_out))
 588+                       return;
 589+       } while (1);
 590+}
 591+
 592+int main(int argc, char **argv)
 593+{
 594+       int arg = 1;
 595+        char *commit_id;
 596+        char *url;
 597+       int fd_in, fd_out;
 598+       while (arg < argc && argv[arg][0] == '-') {
 599+                arg++;
 600+        }
 601+        if (argc < arg + 2) {
 602+               usage("git-ssh-push [-c] [-t] [-a] commit-id url");
 603+                return 1;
 604+        }
 605+       commit_id = argv[arg];
 606+       url = argv[arg + 1];
 607+       if (setup_connection(&fd_in, &fd_out, "git-ssh-pull", url, arg, argv + 1))
 608+               return 1;
 609+
 610+       service(fd_in, fd_out);
 611+       return 0;
 612+}