9front - general discussion about 9front
 help / color / mirror / Atom feed
From: Michael Forney <mforney@mforney.org>
To: 9front@9front.org
Subject: Re: [9front] git/pull: fetch all branches (please test)
Date: Tue, 19 Apr 2022 12:31:31 -0700	[thread overview]
Message-ID: <CAGw6cBsezD_G=xbvWBWGGUn5+Z_ZHbBf=xzPyN=ALoYBuqAKOQ@mail.gmail.com> (raw)
In-Reply-To: <404C9B5CFE08FE9146154E6D8964C191@eigenstate.org>

On 2022-04-11, ori@eigenstate.org <ori@eigenstate.org> wrote:
> diff 1d9d4ffef89e883949261ec9c56c57e0344726d7 uncommitted
> --- a/sys/src/cmd/git/fetch.c
> +++ b/sys/src/cmd/git/fetch.c
> @@ -180,12 +180,13 @@
>  int
>  fetchpack(Conn *c)
>  {
> -	char buf[Pktmax], *sp[3];
> +	char buf[Pktmax], *sp[3], *ep;
>  	char *packtmp, *idxtmp, **ref;
>  	Hash h, *have, *want;
>  	int nref, refsz, first;
> -	int i, n, req, pfd;
> +	int i, n, l, req, pfd;
>  	vlong packsz;
> +	Objset hadobj;
>  	Object *o;
>
>  	nref = 0;
> @@ -246,13 +247,19 @@
>  		req = 1;
>  	}
>  	flushpkt(c);
> +	osinit(&hadobj);
>  	for(i = 0; i < nref; i++){
> -		if(hasheq(&have[i], &Zhash))
> +		if(hasheq(&have[i], &Zhash) || oshas(&hadobj, have[i]))
>  			continue;
> +		if((o = readobject(have[i])) == nil)
> +			sysfatal("missing object we should have: %H", have[i]);
> +		osadd(&hadobj, o);
> +		unref(o);	
>  		n = snprint(buf, sizeof(buf), "have %H\n", have[i]);
>  		if(writepkt(c, buf, n + 1) == -1)
>  			sysfatal("could not send have for %H", have[i]);
>  	}
> +	osclear(&hadobj);

I've been looking over the http-protocol docs, and it describes an
algorithm involving a priority queue and commit graph traversal that
we don't seem to do.

How does this work when our refs have several local commits that the
server doesn't have?

>  	if(!req)
>  		flushpkt(c);
>
> @@ -260,7 +267,7 @@
>  	if(writepkt(c, buf, n) == -1)
>  		sysfatal("write: %r");
>  	if(!req)
> -		return 0;
> +		goto showrefs;
>  	if(readphase(c) == -1)
>  		sysfatal("read: %r");
>  	if((n = readpkt(c, buf, sizeof(buf))) == -1)
> @@ -277,7 +284,28 @@
>  		sysfatal("could not create %s: %r", packtmp);
>
>  	fprint(2, "fetching...\n");
> -	packsz = 0;
> +	/*
> +	 * Work around torvalds git bug: we get duplicate have lines

Do you mean duplicate ACK lines? From my reading of the protocol docs,
"have" lines are only sent by us (the client).

In fact, I don't really see much about ACK lines at all. Do you know
if this is described anywhere in the git docs?

> +	 * somtimes, even though the protocol is supposed to start the

Typo here.

> +	 * pack file immediately.
> +	 *
> +	 * Skip ahead until we read 'PACK' off the wire
> +	 */
> +	while(1){
> +		if(readn(c->rfd, buf, 4) != 4)
> +			sysfatal("fetch packfile: short read");
> +		buf[4] = 0;
> +		if(strncmp(buf, "PACK", 4) == 0)
> +			break;
> +		l = strtol(buf, &ep, 16);
> +		if(l == 0 || ep != buf + 4)
> +			sysfatal("fetch packfile: junk pktline");
> +		if(readn(c->rfd, buf, l) != l)
> +			sysfatal("fetch packfile: short read");
> +	}
> +	if(write(pfd, "PACK", 4) != 4)
> +		sysfatal("write pack header: %r");
> +	packsz = 4;
>  	while(1){
>  		n = read(c->rfd, buf, sizeof buf);
>  		if(n == 0)
> --- a/sys/src/cmd/git/pull
> +++ b/sys/src/cmd/git/pull
> @@ -7,13 +7,10 @@
>  	upstream=$2
>  	url=$3
>  	dir=$4
> -	bflag=()
>  	dflag=()
> -	if(! ~ $#branch 0)
> -		bflag=(-b $branch)
>  	if(! ~ $#debug 0)
>  		dflag='-d'
> -	{git/fetch $dflag $bflag -u $upstream $url >[2=3] || die $status} | awk '
> +	{git/fetch $dflag -u $upstream $url >[2=3] || die $status} | awk '
>  	/^remote/{
>  		if($2=="HEAD")
>  			next

Now that $branch is unused, I think you can remove the corresponding
positional parameter in the update function, as well as the git/pull
-a and -b options.

  reply	other threads:[~2022-04-19 19:33 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-11  3:19 ori
2022-04-11 21:32 ` ori
2022-04-12  2:55   ` ori
2022-04-19 19:31     ` Michael Forney [this message]
2022-04-20  3:42       ` ori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAGw6cBsezD_G=xbvWBWGGUn5+Z_ZHbBf=xzPyN=ALoYBuqAKOQ@mail.gmail.com' \
    --to=mforney@mforney.org \
    --cc=9front@9front.org \
    --subject='Re: [9front] git/pull: fetch all branches (please test)' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).