Am 22.10.2010 um 02:11 schrieb Pavel Sanda:

> Stephan Witt wrote:
>> I made a new patch to implement getDiff() and use it to avoid the query for 
>> log message
>> before checkIn() is done and the confirmation on revert when no diff is 
>> found.
> 
> thanks for your patience, i went closely through the patch now and generally 
> liked the approach.
> 
>> +FileName const CVS::getDiff(OperationMode opmode)
>> +{
>> +    FileName tmpf = FileName::tempName("lyxvcout");
>> +    if (tmpf.empty()) {
>> +            LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
>> +            return tmpf;
>> +    }
>> +
>> +    doVCCommand("cvs diff " + getTarget(opmode)
>> +            + " > " + quoteName(tmpf.toFilesystemEncoding()),
>> +            FileName(owner_->filePath()), false);
>> +    return tmpf;
>> +}
> 
> the error case is suspicious. if tempName fails or "cvs diff" fails how you 
> detect
> this on a higher stage? cmiiw but if something fails you identify it with 
> having
> empty diff, which looks wrong, even more if you release lock automatically in 
> such
> a case...

Your right. I'll try to come up with a better solution.
BTW, I copied the tmpf allocation code sequence.
I think the debug message does not need to print the empty tmpf.

But I've found another way to solve the same goal - using "cvs status".
Checking for the diff is not good enough.

While doing some "stress test" with checkIn() I found the error message when 
merge is needed
"Something's wrong with cvs commit" not acceptable. Then I tried to change that 
and failed to
solve it because of the stderr output of the VC command is lost silently. So I 
came to the
idea to implement getStatus() and use the result accordingly.

The result would be one out of
* uptodate
* locally modified
* needs checkout
* needs merge
* no cvs file

The checkInWithMessage() implementation would be then
{ return getStatus() == LocallyModified; }
And the checkIn() would do a switch on the getStatus() and
raise more descriptive error messages according the status.

> 
>> +int CVS::update(OperationMode opmode, FileName const tmpf)
> 
> unless you want to mix this with repoupdate why is opmode here?

Yes. That's the plan.

>> +    // should a log message provided for next checkin?
>> +    virtual bool checkInWithMessage() { return true; }
> 
>> +    // should a confirmation before revert requested?
>> +    virtual bool revertWithConfirmation() { return true; }
> 
> i would change naming, so its clear what the function really does.
> for example isCheckinWithConfirmation...

Ok.

> 
>> private:
>>      support::FileName file_;
>>      // revision number from scanMaster
>>      std::string version_;
>>      /// The user currently keeping the lock on the VC file.
>>      std::string locker_;
>> +
>> +    virtual std::string const getTarget(OperationMode opmode);
>> +    virtual support::FileName const getDiff(OperationMode opmode);
>> +    virtual int edit();
>> +    virtual int unedit();
>> +    virtual int update(OperationMode opmode, support::FileName const tmpf);
>> +    virtual bool const hasDiff(OperationMode opmode);
>> +    virtual bool const hasDiff() { return hasDiff(File); }
>> };
> 
> comments missing

Ok.

> 
>> --- src/LyXVC.cpp    (Revision 35732)
>> +++ src/LyXVC.cpp    (Arbeitskopie)
>> @@ -163,9 +163,10 @@
>>      docstring empty(_("(no log message)"));
>>      docstring response;
>>      string log;
>> -    bool ok = Alert::askForText(response, _("LyX VC: Log Message"));
>> +    bool dolog = vcs->checkInWithMessage();
>> +    bool ok = !dolog || Alert::askForText(response, _("LyX VC: Log 
>> Message"));
> 
> hmm, but if !dolog then user automatically gets "cancel" message?

You mean the user should have the option to cancel the operation if the file is 
up-to-date?
Seems reasonable.

> 
>>      if (ok) {
>> -            if (response.empty())
>> +            if (dolog && response.empty())
>>                      response = empty;
> 
> why response=empty harms in !nodolog?

It doesn't harm. It wastes CPU cycles to set response when !nodolog.

> 
>> @@ -212,8 +213,9 @@
>>      docstring text = bformat(_("Reverting to the stored version of the "
>>                              "document %1$s will lose all current 
>> changes.\n\n"
>>                              "Do you want to revert to the older version?"), 
>> file);
>> -    int const ret = Alert::prompt(_("Revert to stored version of 
>> document?"),
>> -            text, 0, 1, _("&Revert"), _("&Cancel"));
>> +    bool const doask = vcs->revertWithConfirmation();
> 
> i would need to check whats above this function in guiview but isn't possible 
> that we will skip
> reverting in case the document is edited but not saved?

Yes, so it is. Then reverting should be guarded with revertEnabled() too?

> 
>> +    int const ret = doask ? Alert::prompt(_("Revert to stored version of 
>> document?"),
>> +            text, 0, 1, _("&Revert"), _("&Cancel")) : 0;
> 
> correspondingly to your previous coding style one would expect ret = doask && 
> prompt ;  ;)

I don't think so. The first is bool and the second is int.
But I can change the style to be more verbose if you like.
E. g.

        if (vcs->checkInWithMessage()) {
                log = vcs->checkIn(to_utf8(empty));
                // Reserve empty string for cancel button
                if (log.empty())
                        log = to_utf8(empty);
        } else if (Alert::askForText(response, _("LyX VC: Log Message"))) {
                if (response.empty())
                        response = empty;
                log = vcs->checkIn(to_utf8(response));
                // Reserve empty string for cancel button
                if (log.empty())
                        log = to_utf8(empty);
        } else {
                LYXERR(Debug::LYXVC, "LyXVC: user cancelled");
        }

BTW, I have the problem that returning strings as result code is strange.
And SVN::checkOut() implementation returns the a non empty string on error
when the temporary log file name cannot be generated.

Stephan

Reply via email to