List Info

Thread: Re: VCS Interface classes




Re: VCS Interface classes
country flaguser name
United States
2007-04-30 14:10:36
Andreas Pakulat wrote:
> On 30.04.07 12:06:55, Matthew Woehlke wrote:
>> Andreas Pakulat wrote:
>>> I present to you our new VCS interface classes
(that I finally managed
>>> to write up, based on the enourmus thread some
time ago).
>>>
>>> * major problems for a given system with the
proposed interface
>> IMO IBasicVCS is missing unedit(). Jakob already
pointed out the gaping 
>> flaw in commit() .
> 
> What should unedit() do? I mean, revert() reverses to
repository
> version, commit() checks in the local version into
repository. What else
> is needed?

unedit() clears the effect of edit() iff* diff(BASE,WORKING)
is empty, 
i.e. the file has been marked for edit but does not actually
differ from 
the repo copy.

(*"if and only if" for you non-math-types )

>> Come to think of it, it would rock if we handled
change sets... yes, 
>> this is harder to do in e.g. svn since the plug-in
would have to manage 
>> it rather than being able to leverage VCS
functionality, but I know /I/ 
>> at least would find it really nice to have change
sets in svn. 
> 
> Please feel free to present an interface for that. It
shouldn't be part
> of our basic - all vcs plugins have to do this -
interface, IMHO.

I'll need to think about it for a bit.  Perforce
almost has to have 
this. For VCS's that don't support it, it should be possible
to write a 
generic version that uses the local file system to provide
this 
functionality.

>> Is VCSState::Unknown equivalent to 'not under
version control', or 
>> should there be a seperate status (as I think there
is in 3.4) for 
>> 'unable to determine that information'? Or does
that only need to exist 
>> in the UI side?
> 
> I'm not sure, what is it used for in 3.4? I just took
the 3.4 VCSState
> and removed the stuff that is not of much interest or
just doesn't map
> to all vcs'es.

It is/would be used for "hasn't been queried yet"
(esp. with an async 
status()), or for things that the VCS plugin wasn't
consulted on, or 
didn't return an answer... I imagine the same cases would
apply, but as 
I said all of those seem to be statuses that only apply to
the UI, i.e. 
the VCS plugin would never return such a status.

>> VCSMapping is insufficient for perforce which needs
exclusion as well as 
>> inclusion rules. Is this just not available outside
of a private (i.e. 
>> not-matching-the-interface), perforce-specific
checkout()? (Or is it in 
>> the missing CliencMapping class? )
> 
> ClientMapping == VCSMapping, seems I forgot one or two
places to rename
> 
> 
> So what you need for Perforce is something like
> 
> class VCSMapping
> {
> 	addMapping( repoLocation, localLocation, recursive);
> 	addExclude( repoLocation, recursive);
> }
> 
> (ommitting the other methods, like excludes() and so
on), where the
> checkout would check out all mappings, unless a mapping
or part of it
> matches an exclude? I'm fine with adding that. But I
guess the VCS
> interface then needs a function like:
> 
> supportsExcludes();
> 
> which tells the client wether the exclude's will be
used or not. Because
> else this is hard to do in svn plugin.

Yes, you need some sort of 'what do you support' function.
IIRC we had 
originally talked about using flags for the mapping instead
of 'bool 
recursive'; you would then ask for supported flags. This
would be most 
extensible in case some VCS supports other things as well
as, or instead 
of, exclusions.

>>> * return types for the methods, we need a way
to communicate at least
>>>   errors back, but I'm not sure how to do that
best given that the 
>>>   methods should execute asynchronously
>> Change void to int, return 0 for success, <0 for
error (possibly allow 
>> the return code to be implementation defined?). Or
have an interface to 
>> retrieve an error.
> 
> Actually I think 2 signals:
> 
> finished( Command );
> error( Command, Message);
> 
> should be fine (command is an enum for the various
methods we have).

Hmm... ok, that makes sense, but what if you issue several
calls to 
status()? I think we should return something more like a pid
to use in 
the signal. In fact, that should work, because then all
methods can be 
made async() and we can add a wait() method. I'm not sure
how the 
scripting will work but it seems that it will be more common
for scripts 
to want to be synchronous because I would think they usually
rely on the 
previous command to complete before they can issue the next.
I'm not 
necessarily saying we should change anything, just something
to keep in 
mind.

>> I'm not sure about async, I would image async in a
script is not really 
>> what you want . Therefore
it seems like maybe we need both?
> 
> Yeah, I thought so to. For sync methods we'd return an
error code +
> message (like QPair<int,msg>) and for async there
are the two signals.

See above; we could use task ID's and wait(tid). Scripts can
either use 
this or we can somehow arrange a layer of indirection for
scripts.

>> Certainly I would guess there should be a
statusAsync() based on
>> previous discussion of svn in 3.4.
> 
> Well, checkout also falls into the category of async
methods, you don't
> really want to be interrupted hacking kdevelop just
because you check
> out kdelibs where you want to do something later on. 

Agreed. I never said status should be the *only* async
method.  Just 
that there should definately be an async status().

> I'd like to see
> mostly all things in an async way. Eric4 just gained
the possibility to
> have async commit() and that way you can initiate a
commit() and then go
> back to the IDE and look at the diff of your local
changes to write a
> proper commit message. Which IMO rocks. Not even
Eclipse has this, IIRC.

Isn't that just a matter of the pending commit() not
blocking the rest 
of the interface, and the dialog being non-modal? p4v (the
perforce gui) 
has been this way for I think as long as I have been using
it. Basically 
until you hit 'ok' you really haven't done anything. 'svn
ci' locks the 
list of files to commit but IMO we should take after p4v and
lift this 
restriction, i.e. allow you to change what files are being
committed as 
you are writing the message (this is one feature in p4v I
really miss in 
svn, even 'p4 submit' allows you to change your mind while
in the child 
editor process). p4v even updates the list of files that you
*might* 
commit in real time, i.e. if you start a commit and then
edit another 
file. I see no reason other plug-ins couldn't do this. (For
ones without 
an explicit 'edit', it's ok if they don't always get file
change 
notifications, but it's simple for edit() to add a file to
the list of 
might-commit.)

>> IMO it would be ideal if we can require plug-ins to
be thread safe and
>> have a generic async wrapper around whichever
plugin. Or just allow
>> inheriting a base class that uses the virtual
synchronous methods to
>> do async and allow a plug-in to overload as
needed?
> 
> Not sure I follow you here.

If we only have async methods (and a wait()) you can safely
ignore most 
of that, plug-ins will have to be thread-safe anyway. 

Basically, a plug-in has to support doing multiple instances
of any 
combination of synchronous operations at the same time. One
way to 
achieve this would be to only implement synchronous
operations that are 
thread-safe and reentrant-safe, and inherit a class that
wraps the 
synchronous calls around async invokers.

Does that make sense?

>> For move():
>>> * depending on the VCS, only preserves history
if copy preserves history
>> ...I thought I remember someone saying this is not
necessarily the case 
>> (as nonsensical as that seems), i.e. move might
preserve history while 
>> copy does not? Anyway that's just a doc nitpick.
> 
> I guess we should just add "might preserve history
or not, depending on
> the VCS" to both move and copy.

Right, something like that. 

>>> * Parameters for push/pull in the distributed
vcs iface, no idea whats
>>>   needed there
>>> * diff and log parameters, am not 100% sure
there
>> Should diff() pop up a UI, or return something
useful in scripts?
> 
> The first I think. Mainly because representing a diff
is not that easy.
> For example a diff on binary files is not possible with
svn, but might
> be with other VCS systems and then you can hardly
represent that
> in a meaningful way, except with a GUI. (I'm thinking
of KDE's commit
> digest which has visual diff for .ui files)

...but a .ui isn't a binary file . I guess
I can live with that, 
though. 

>>> * usage of simple QString's for any parameter
that can be a repository
>>>   url (anything that is always a local url
should stay KUrl), if a VCS
>>>   system can't use a url for describing a
repository location
>> ...if diff() takes a repo location shouldn't the
parameter be QString? 
> 
> Thats something I wasn't sure about, so I made my first
write-up easier
> by sticking to KUrl everywhere ;) The thing is I don't
know wether the
> "targeted" vcs systems (i.e. the ones we were
talking about here) really
> work with a url scheme. If not repo location needs to
turn into a
> QString and then we really need 2 different
interfaces.

Is 'svn+ssh://path/to/somewhere' a valid KUrl? (I guess if
'+' is 
allowed in a protocol name and the protocol doesn't need to
be known.) 
Perforce repo paths, however, look like
'//path/to/somewhere'. Of course 
if you needed to do something silly like use
'p4://path/to/somewhere' in 
all external code, I don't see a problem with that, the back
end can 
just strip the protocol.

-- 
Matthew
If you believe you received this e-mail in error, you are
probably sadly 
mistaken, but if not, aren't you lucky?


_______________________________________________
KDevelop-devel mailing list
KDevelop-develkdevelop.org
https://barney.cs.uni-potsdam.de/mailman/listinf
o/kdevelop-devel

[1]

about | contact  Other archives ( Real Estate discussion Medical topics )