That clarifies it, thank you. My only remaining comment is that I find these commands clearly defined and consistent with the rest of the darcs UI, but at the same time I consider them to have a niche usefulness. I do not find a use for them in my workflows, but I'm sure other people will. Now regarding if there is a better alternative to them, I do not know. Since I do not see a use for them myself, I cannot imagine a better way of doing something I do not do ;). This proposal seems reasonable to me.

On 24 Nov 2009, at 17:33, Florent Becker wrote:

--nextPart1323724.XxME5LlBlx
Content-Type: Text/Plain;
 charset="iso-8859-15"
Content-Transfer-Encoding: quoted-printable

Hi list, hi Dan,

and thanks for the review. Here come my answers.

The executive version is: fetch is for retrieving and *naming* a set
of patches into a file without applying them. You can then inspect them in =
a=20
text editor, as you would with a sent bundle, and apply them, not necessari=
ly=20
all at once.


If you're interested, I'll start be requesting on list that you serve
as Grumpy Old Man for Florent's recent patch39.


Since you asked, I will not leave you empty handed, so I will give my =20 input on patch39. Again I cannot read haskell code, so what I say is =20
entirely based on the comments that accompanied the code.

Ok

I agree with Florent that fetch and unapply are 2 commands that are =20 easily learnt and with clear semantics. From this point of view I see =20
no reason against them.=20

Good

But from the user perspective, while Florent =20
calls them "very useful", I could not imagine a single use case for =20 them. Maybe if I'm told one, I will have an a-ha moment and see the =20
light. But right now I do not really understand how fetch can be =20
useful. There is no description how one can inspect a patch that was =20 fetched to _darcs/pacthes but it was not applied. Even right now I =20
still have patches that are in _darcs/patches but I cannot access =20
(patches I unrecorded/obliterated/amend-recorded). Or maybe he plans =20
to store them in a different place.=20

Yes, that is the point, which i'm sorry if I did not make clear enough, the=
y=20
are stored in a bundle file, not in _darcs/patches.

Contrarily to hg's and git's(?) fetch, darcs fetch gives you the patches in=
a=20
simple bundle in the current directory (as does send -o),
*not in _darcs/patches*. This means that it does not modify the state
of the local repository. It offers you the patches for inspection by puttin=
g=20
them into a file with the name of your liking.

You can then inspect that bundle using a text editor or whatever tool
you want. You can also keep it for later application, maybe in some other=20
related repository, maybe not applying the patches all at once.

But then how is this different =20
than having a patch cache. Right now I can pull a patch, then inspect =20 it with darcs diff or darcs changes, then obliterate it. Next time I =20 pull it it will take it from the cache so no extra download will be =20
necessary. How does darcs fetch improve on this?

It does not improve download performance at all! (Even if doing a darcs fet=
ch=20
has the desirable side-effect of putting the patches in cache, that's not t=
he=20
point of the command). However, you can fetch
several patches at once, and give a name to that set of patches. Suppose fo=
r=20
instance that you want to port a feature from David's darcs to your own dar=
cs=20
repository. The two repositories may have diverged, so the merge is going t=
o=20
be a bit complicated. Currently, you have three solutions: either you do a=
=20
pull, select all the relevant patches and then you have to solve all the me=
rge=20
problems at once. Or you pull the patches one by one, but you need to have=
=20
network connectivity for each patch, so you can't do that on a train, and y=
ou=20
have to redo the work of sorting the remote patches every time. Finally, yo=
u=20
can get your own repository into a new copy, pull all the remote patches in=
to=20
that copy, then pull from the copy to your work repo. Then you have to use=
=20
darcs changes to review the patches, and you have one more repository. If t=
he=20
patches are small with respect to the size of the project, you use more dis=
k-
space than you really should. With fetch, you just fetch, select the patche=
s=20
you want, then use darcs apply -i fetched-patches.dpatch at your leisure. I=
t's=20
like the last use case, except that it's more lightweight.=20

It scales better (at least for me) to have throwaway bundles for sets of=20 patches which I may or may not want to apply than to have throwaway repos f=
or=20
each such set of changes. Our workflow where we review sent bundles is doab=
le=20
because we have send, and with fetch, we can extend it to pull- requests: if=
I=20
want to examine a set of patches from someone's repo, i'd much rather have =
a=20
bundle representing exactly the patches i want to pull than either have to =
do=20
remote invocations of darcs changes before i pull or having to create a ful=
l=20
repo every time. If I use the cache for that purpose, then I lose track of =
the=20
set of patches I'm working with everytime (what if they don't have a cohere=
nt=20
naming?)

I see a similar problem with unapply. What is the reason to preserve =20 the patch in _darcs/patches if I do not have a way to inspect it? Also =20 what is the reason to preserve it in _darcs/patches if it is preserved =20 in the cache anyway? Maybe there is something obvious I'm missing, but =20
the description I red didn't mention anything about this. Even if =20
there is a way to inspect the patches, how do these commands improve =20
over the existing obliterate + patch preserved in the cache.

They allow the user to be unaware of the cache (or not to have one). The=20 patches are given to you in a named bundle. That way, you keep them togethe=
r=20
for later use. For instance, suppose you implement some feature in a serie =
of=20
10 patches. Then you realize that it has a problem which makes the feature=
=20
undesirable for the moment (say, you have to wait for a new version of libf=
oo=20
so that some function there is fixed before your feature works at all). You=
can=20
then unapply the 10 patches to get a feature-waiting-for- libfoo.dpatch bund=
le.=20
You keep this bundle and apply it whenever libfoo2 gets released. Without=20 unapply, you need to keep a full repository feature-waiting-for- libfoo. You=
=20
might even want a repository without-feature-waiting-for-libfoo so that you=
=20
can use pull --complement to get exactly the right set of patches. That's t=
wo=20
full repositories versus a bundle with 10 patches. Another example would be=
if=20
you wanted to keep the patches for reference, for example as an explanation=
as=20
to why some thing is not doable. In that case too, it saves you from keepin=
g=20
two repositories, and the bundle shows you where exactly the problem is (ju=
st=20
open it in your text-editor).

What I would really find useful however would be a darcs diff -- patch =20 "title" remote-repo, i.e. a way to see a patch that is in a remote =20 repository. I prefer diff over whatsnew or changes --verbose, because =20 I can get a unified or context diff that shows me the context around =20 the change. whatsnew or changes --verbose are harder to read in the =20 context. darcs changes already can do this with the --repo argument. =20 So maybe if we could add the --repo argument to diff then we would get =20 the ability to check remote patches and something like fetch/ unapply =20
may become unnecessary.

I think these are orthogonal, and we should try to make changes -i a supers=
et=20
of diff in that case.

P.S. keep in mind that I say all this because I do not see any obvious =20 use for these two commands, that I cannot already do using the cache. =20
Maybe I'm just missing the obvious.

Note also that these commands allow the user to be unaware of the cache, wh=
ich=20
is a good thing. The cache is currently overloaded between download- speed=20 improvement and a collection of unapplied patches. This means that erasing =
the=20
cache can destroy valuable information, which is not what a cache is suppos=
ed=20
to do. If you use fetch and unapply consistently rather than relying on the=
=20
cache, then you can always get rid of your cache, should you need to. There=
's=20
no reason I should have to keep every patch i have ever downloaded, so that=
I=20
can keep some patches which I do not want to see applied yet.

Hope this helps,

=46lorent

--nextPart1323724.XxME5LlBlx
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEABECAAYFAksL/J0ACgkQTCPcDztjGo7eogCeMeaTDT5pUn0DXqqEKTEi9jtt
aCQAn2X/UpncO4+G9t1CIi5vh98+Ubv/
=Jo+M
-----END PGP SIGNATURE-----

--nextPart1323724.XxME5LlBlx--
_______________________________________________
darcs-users mailing list
[email protected]
http://lists.osuosl.org/mailman/listinfo/darcs-users


--
Dan



_______________________________________________
darcs-users mailing list
[email protected]
http://lists.osuosl.org/mailman/listinfo/darcs-users

Reply via email to