You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@whimsical.apache.org by Craig Russell <ap...@gmail.com> on 2020/07/08 21:57:49 UTC

ASF::SVN.create_ method used in roster-emeritus

Hi Sebb,

Here's the code snippet from memstat.json.rb. 

  EMERITUS_REQUEST_URL = ASF::SVN.svnpath('emeritus-requests-received').untaint
  rc = ASF::SVN.create_(EMERITUS_REQUEST_URL, "#{USERID}.txt", signed_request, "Emeritus request from #{USERNAME}  (#{USERID}", env, _)
  if rc == 1 break # do nothing if there is already an emeritus request

I'm not sure about whether if rc==1 break is correct. There is nothing else to do if there is already a pending emeritus request... And there was already an exception if there was anything else amiss.

This is actually a lot more readable than I expected when I asked if there was a create_ function. 

Craig

> On Jul 8, 2020, at 12:39 PM, sebb <se...@gmail.com> wrote:
> 
> By all means test it.
> 
> I think it works, however it may be necessary to change the API or
> behaviour which is why it is marked as draft.
> 
> On Wed, 8 Jul 2020 at 19:46, Craig Russell <ap...@gmail.com> wrote:
>> 
>> Hi Sebb,
>> 
>> Is this ready for testing, or should I wait?
>> 
>> Thanks,
>> Craig
>> 
>>> Begin forwarded message:
>>> 
>>> From: sebb@apache.org
>>> Subject: [whimsy] branch master updated: += create_ metthod
>>> Date: July 7, 2020 at 4:07:34 AM PDT
>>> To: "commits@whimsical.apache.org" <co...@whimsical.apache.org>
>>> Reply-To: dev@whimsical.apache.org
>>> 
>>> This is an automated email from the ASF dual-hosted git repository.
>>> 
>>> sebb pushed a commit to branch master
>>> in repository https://gitbox.apache.org/repos/asf/whimsy.git
>>> 
>>> 
>>> The following commit(s) were added to refs/heads/master by this push:
>>>    new 4d3e6fc  += create_ metthod
>>> 4d3e6fc is described below
>>> 
>>> commit 4d3e6fc5da801224cda3421041a86750984dc711
>>> Author: Sebb <se...@apache.org>
>>> AuthorDate: Tue Jul 7 12:07:23 2020 +0100
>>> 
>>>   += create_ metthod
>>> ---
>>> lib/whimsy/asf/svn.rb | 31 ++++++++++++++++++++++++++++++-
>>> 1 file changed, 30 insertions(+), 1 deletion(-)
>>> 
>>> diff --git a/lib/whimsy/asf/svn.rb b/lib/whimsy/asf/svn.rb
>>> index 6c78056..0dfdb60 100644
>>> --- a/lib/whimsy/asf/svn.rb
>>> +++ b/lib/whimsy/asf/svn.rb
>>> @@ -717,7 +717,36 @@ module ASF
>>>        FileUtils.rm_rf tmpdir unless temp
>>>      end
>>>    end
>>> -
>>> +
>>> +    # DRAFT DRAFT
>>> +    # create a new file and fail if it already exists
>>> +    # Parameters:
>>> +    #  directory - parent directory as an SVN URL
>>> +    #  filename - name of file to create
>>> +    #  source - file to upload
>>> +    #  msg - commit message
>>> +    #  env - user/pass
>>> +    #  _ - wunderbar context
>>> +    # Returns:
>>> +    # 0 on success
>>> +    # 1 if the file exists
>>> +    # RuntimeError on unexpected error
>>> +    def self.create_(directory, filename, source, msg, env, _)
>>> +      parentrev, err = self.getInfoItem(directory, 'revision', env.user, env.password)
>>> +      unless parentrev
>>> +        throw RuntimeError.new("Failed to get revision for #{directory}: #{err}")
>>> +      end
>>> +      target = File.join(directory, filename)
>>> +      out, err = self.svn('list', target, {env: env})
>>> +      return 1 if out # already exists
>>> +      # Need to check for unexpected errors; the error message does not include the full repo URL
>>> +      unless err =~ %r{^svn: warning: W160013: Path '.+#{filename}' not found}
>>> +        throw RuntimeError.new("#{filename} already exists! #{err}")
>>> +      end
>>> +      commands = [['put', source, target]]
>>> +      self.svnmucc_(commands, msg, env, _, parentrev)
>>> +    end
>>> +
>>>    # DRAFT DRAFT DRAFT
>>>    # checkout file and update it using svnmucc put
>>>    # the block can return additional info, which is used
>>> 
>> 
>> Craig L Russell
>> clr@apache.org
>> 

Craig L Russell
clr@apache.org


Re: ASF::SVN.create_ method used in roster-emeritus

Posted by Craig Russell <ap...@gmail.com>.
Reducing the regular expression gets past this particular error. 

err =~ %r{^svn: warning: W160013:} # file does not exist error

How specific do we want to make this test? 

Thanks,
Craig

> On Jul 9, 2020, at 10:03 AM, Craig Russell <ap...@gmail.com> wrote:
> 
> Hi Sebb,
> 
> Maybe the regular expression is too strict or doesn't cover all the cases. The code expects not only to get an error but a very specific kind of error.
> 
>       # Need to check for unexpected errors; the error message does not include the full repo URL
> unless err =~ 
> %r{^svn: warning: W160013: Path '.+#{filename}' not found}
> throw RuntimeError.new("#{filename} already exists! #{err}")
> 
> Could you tell a bit more about what you are checking for here? 
> 
> Thanks,
> Craig
> 
>> On Jul 8, 2020, at 4:00 PM, Craig Russell <apache.clr@gmail.com <ma...@gmail.com>> wrote:
>> 
>> svn: warning: W160013: URL 'https://svn.apache.org/repos/private/documents/emeritus-requests-received/clr.txt <https://svn.apache.org/repos/private/documents/emeritus-requests-received/clr.txt>' non-existent in revision 98098\nsvn: E200009: Could not list all targets because some targets don't exist\n
> 
> Craig L Russell
> clr@apache.org <ma...@apache.org>
> 

Craig L Russell
clr@apache.org


Re: ASF::SVN.create_ method used in roster-emeritus

Posted by Craig Russell <ap...@gmail.com>.
Hi Sebb,

Maybe the regular expression is too strict or doesn't cover all the cases. The code expects not only to get an error but a very specific kind of error.

      # Need to check for unexpected errors; the error message does not include the full repo URL
unless err =~ 
%r{^svn: warning: W160013: Path '.+#{filename}' not found}
throw RuntimeError.new("#{filename} already exists! #{err}")

Could you tell a bit more about what you are checking for here? 

Thanks,
Craig

> On Jul 8, 2020, at 4:00 PM, Craig Russell <ap...@gmail.com> wrote:
> 
> svn: warning: W160013: URL 'https://svn.apache.org/repos/private/documents/emeritus-requests-received/clr.txt <https://svn.apache.org/repos/private/documents/emeritus-requests-received/clr.txt>' non-existent in revision 98098\nsvn: E200009: Could not list all targets because some targets don't exist\n

Craig L Russell
clr@apache.org


Re: ASF::SVN.create_ method used in roster-emeritus

Posted by sebb <se...@gmail.com>.
I don't have time to look at it now, but here is a sample way to test
the library code:

-- cut here --
#!/usr/bin/env ruby

$LOAD_PATH.unshift '/srv/whimsy/lib'
require 'whimsy/asf'
require 'wunderbar'

def env
  Struct.new(:user, :password).new('test', nil) # as needed for SVN repo
end

name=`date +'%H-%M.tmp'`.chomp # create a new name every minute
Wunderbar.json do |_|
    rc = ASF::SVN.create_('file:////var/tools/svnrep/test',name,__FILE__,'Test',
env, _)
   puts "rc = #{rc}"
end
-- cut here --

On Thu, 9 Jul 2020 at 00:00, Craig Russell <ap...@gmail.com> wrote:
>
> I've pushed changes to roster-emeritus branch to:
> - enable sending email to secretary, cc member
> - enable creating the file emeritus-requests-received/member.txt
>
> There is a problem with the create_ function. [1]
>
> Any ideas?
>
> Thanks,
> Craig
>
> Line 83:
>   # Write the emeritus request to emeritus-requests-received
>   EMERITUS_REQUEST_URL = ASF::SVN.svnpath!('emeritus-requests-received').untaint
> 83=>  rc = ASF::SVN.create_(EMERITUS_REQUEST_URL, "#{USERID}.txt", signed_request, "Emeritus request from #{USERNAME}  (#{USERID}", env, _)
>
> [1] {
>   "exception": "#<UncaughtThrowError: uncaught throw #<RuntimeError: clr.txt already exists! svn: warning: W160013: URL 'https://svn.apache.org/repos/private/documents/emeritus-requests-received/clr.txt' non-existent in revision 98098\nsvn: E200009: Could not list all targets because some targets don't exist\n>>",
>   "backtrace": [
>     "/Users/clr/apache/git/whimsy/lib/whimsy/asf/svn.rb:757:in `throw'",
>     "/Users/clr/apache/git/whimsy/lib/whimsy/asf/svn.rb:757:in `create_'",
>     "/Users/clr/apache/git/whimsy/www/roster/views/actions/memstat.json.rb:83:in `_evaluate'",
>     "/Users/clr/apache/git/whimsy/www/roster/main.rb:204:in `block in <top (required)>'",
>     "/Users/clr/apache/git/whimsy/lib/whimsy/asf/rack.rb:225:in `call'",
>     "/Users/clr/apache/git/whimsy/lib/whimsy/asf/rack.rb:50:in `call'",
>     "/Users/clr/apache/git/whimsy/lib/whimsy/asf/rack.rb:202:in `call'",
>     "/Users/clr/apache/git/whimsy/lib/whimsy/asf/rack.rb:256:in `call'"
>   ]
> }
>
> > On Jul 8, 2020, at 2:57 PM, Craig Russell <ap...@gmail.com> wrote:
> >
> > Hi Sebb,
> >
> > Here's the code snippet from memstat.json.rb.
> >
> >   EMERITUS_REQUEST_URL = ASF::SVN.svnpath('emeritus-requests-received').untaint
> >   rc = ASF::SVN.create_(EMERITUS_REQUEST_URL, "#{USERID}.txt", signed_request, "Emeritus request from #{USERNAME}  (#{USERID}", env, _)
> >   if rc == 1 break # do nothing if there is already an emeritus request
> >
> > I'm not sure about whether if rc==1 break is correct. There is nothing else to do if there is already a pending emeritus request... And there was already an exception if there was anything else amiss.
> >
> > This is actually a lot more readable than I expected when I asked if there was a create_ function.
> >
> > Craig
> >
> >> On Jul 8, 2020, at 12:39 PM, sebb <sebbaz@gmail.com <ma...@gmail.com>> wrote:
> >>
> >> By all means test it.
> >>
> >> I think it works, however it may be necessary to change the API or
> >> behaviour which is why it is marked as draft.
> >>
> >> On Wed, 8 Jul 2020 at 19:46, Craig Russell <apache.clr@gmail.com <ma...@gmail.com>> wrote:
> >>>
> >>> Hi Sebb,
> >>>
> >>> Is this ready for testing, or should I wait?
> >>>
> >>> Thanks,
> >>> Craig
> >>>
> >>>> Begin forwarded message:
> >>>>
> >>>> From: sebb@apache.org <ma...@apache.org>
> >>>> Subject: [whimsy] branch master updated: += create_ metthod
> >>>> Date: July 7, 2020 at 4:07:34 AM PDT
> >>>> To: "commits@whimsical.apache.org <ma...@whimsical.apache.org>" <commits@whimsical.apache.org <ma...@whimsical.apache.org>>
> >>>> Reply-To: dev@whimsical.apache.org <ma...@whimsical.apache.org>
> >>>>
> >>>> This is an automated email from the ASF dual-hosted git repository.
> >>>>
> >>>> sebb pushed a commit to branch master
> >>>> in repository https://gitbox.apache.org/repos/asf/whimsy.git <https://gitbox.apache.org/repos/asf/whimsy.git>
> >>>>
> >>>>
> >>>> The following commit(s) were added to refs/heads/master by this push:
> >>>>    new 4d3e6fc  += create_ metthod
> >>>> 4d3e6fc is described below
> >>>>
> >>>> commit 4d3e6fc5da801224cda3421041a86750984dc711
> >>>> Author: Sebb <sebb@apache.org <ma...@apache.org>>
> >>>> AuthorDate: Tue Jul 7 12:07:23 2020 +0100
> >>>>
> >>>>   += create_ metthod
> >>>> ---
> >>>> lib/whimsy/asf/svn.rb | 31 ++++++++++++++++++++++++++++++-
> >>>> 1 file changed, 30 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/lib/whimsy/asf/svn.rb b/lib/whimsy/asf/svn.rb
> >>>> index 6c78056..0dfdb60 100644
> >>>> --- a/lib/whimsy/asf/svn.rb
> >>>> +++ b/lib/whimsy/asf/svn.rb
> >>>> @@ -717,7 +717,36 @@ module ASF
> >>>>        FileUtils.rm_rf tmpdir unless temp
> >>>>      end
> >>>>    end
> >>>> -
> >>>> +
> >>>> +    # DRAFT DRAFT
> >>>> +    # create a new file and fail if it already exists
> >>>> +    # Parameters:
> >>>> +    #  directory - parent directory as an SVN URL
> >>>> +    #  filename - name of file to create
> >>>> +    #  source - file to upload
> >>>> +    #  msg - commit message
> >>>> +    #  env - user/pass
> >>>> +    #  _ - wunderbar context
> >>>> +    # Returns:
> >>>> +    # 0 on success
> >>>> +    # 1 if the file exists
> >>>> +    # RuntimeError on unexpected error
> >>>> +    def self.create_(directory, filename, source, msg, env, _)
> >>>> +      parentrev, err = self.getInfoItem(directory, 'revision', env.user, env.password)
> >>>> +      unless parentrev
> >>>> +        throw RuntimeError.new("Failed to get revision for #{directory}: #{err}")
> >>>> +      end
> >>>> +      target = File.join(directory, filename)
> >>>> +      out, err = self.svn('list', target, {env: env})
> >>>> +      return 1 if out # already exists
> >>>> +      # Need to check for unexpected errors; the error message does not include the full repo URL
> >>>> +      unless err =~ %r{^svn: warning: W160013: Path '.+#{filename}' not found}
> >>>> +        throw RuntimeError.new("#{filename} already exists! #{err}")
> >>>> +      end
> >>>> +      commands = [['put', source, target]]
> >>>> +      self.svnmucc_(commands, msg, env, _, parentrev)
> >>>> +    end
> >>>> +
> >>>>    # DRAFT DRAFT DRAFT
> >>>>    # checkout file and update it using svnmucc put
> >>>>    # the block can return additional info, which is used
> >>>>
> >>>
> >>> Craig L Russell
> >>> clr@apache.org <ma...@apache.org>
> >>>
> >
> > Craig L Russell
> > clr@apache.org <ma...@apache.org>
> >
>
> Craig L Russell
> clr@apache.org
>

Re: ASF::SVN.create_ method used in roster-emeritus

Posted by Craig Russell <ap...@gmail.com>.
I've pushed changes to roster-emeritus branch to:
- enable sending email to secretary, cc member
- enable creating the file emeritus-requests-received/member.txt

There is a problem with the create_ function. [1]

Any ideas?

Thanks,
Craig

Line 83: 
  # Write the emeritus request to emeritus-requests-received
  EMERITUS_REQUEST_URL = ASF::SVN.svnpath!('emeritus-requests-received').untaint
83=>  rc = ASF::SVN.create_(EMERITUS_REQUEST_URL, "#{USERID}.txt", signed_request, "Emeritus request from #{USERNAME}  (#{USERID}", env, _)

[1] {
  "exception": "#<UncaughtThrowError: uncaught throw #<RuntimeError: clr.txt already exists! svn: warning: W160013: URL 'https://svn.apache.org/repos/private/documents/emeritus-requests-received/clr.txt' non-existent in revision 98098\nsvn: E200009: Could not list all targets because some targets don't exist\n>>",
  "backtrace": [
    "/Users/clr/apache/git/whimsy/lib/whimsy/asf/svn.rb:757:in `throw'",
    "/Users/clr/apache/git/whimsy/lib/whimsy/asf/svn.rb:757:in `create_'",
    "/Users/clr/apache/git/whimsy/www/roster/views/actions/memstat.json.rb:83:in `_evaluate'",
    "/Users/clr/apache/git/whimsy/www/roster/main.rb:204:in `block in <top (required)>'",
    "/Users/clr/apache/git/whimsy/lib/whimsy/asf/rack.rb:225:in `call'",
    "/Users/clr/apache/git/whimsy/lib/whimsy/asf/rack.rb:50:in `call'",
    "/Users/clr/apache/git/whimsy/lib/whimsy/asf/rack.rb:202:in `call'",
    "/Users/clr/apache/git/whimsy/lib/whimsy/asf/rack.rb:256:in `call'"
  ]
}

> On Jul 8, 2020, at 2:57 PM, Craig Russell <ap...@gmail.com> wrote:
> 
> Hi Sebb,
> 
> Here's the code snippet from memstat.json.rb. 
> 
>   EMERITUS_REQUEST_URL = ASF::SVN.svnpath('emeritus-requests-received').untaint
>   rc = ASF::SVN.create_(EMERITUS_REQUEST_URL, "#{USERID}.txt", signed_request, "Emeritus request from #{USERNAME}  (#{USERID}", env, _)
>   if rc == 1 break # do nothing if there is already an emeritus request
> 
> I'm not sure about whether if rc==1 break is correct. There is nothing else to do if there is already a pending emeritus request... And there was already an exception if there was anything else amiss.
> 
> This is actually a lot more readable than I expected when I asked if there was a create_ function. 
> 
> Craig
> 
>> On Jul 8, 2020, at 12:39 PM, sebb <sebbaz@gmail.com <ma...@gmail.com>> wrote:
>> 
>> By all means test it.
>> 
>> I think it works, however it may be necessary to change the API or
>> behaviour which is why it is marked as draft.
>> 
>> On Wed, 8 Jul 2020 at 19:46, Craig Russell <apache.clr@gmail.com <ma...@gmail.com>> wrote:
>>> 
>>> Hi Sebb,
>>> 
>>> Is this ready for testing, or should I wait?
>>> 
>>> Thanks,
>>> Craig
>>> 
>>>> Begin forwarded message:
>>>> 
>>>> From: sebb@apache.org <ma...@apache.org>
>>>> Subject: [whimsy] branch master updated: += create_ metthod
>>>> Date: July 7, 2020 at 4:07:34 AM PDT
>>>> To: "commits@whimsical.apache.org <ma...@whimsical.apache.org>" <commits@whimsical.apache.org <ma...@whimsical.apache.org>>
>>>> Reply-To: dev@whimsical.apache.org <ma...@whimsical.apache.org>
>>>> 
>>>> This is an automated email from the ASF dual-hosted git repository.
>>>> 
>>>> sebb pushed a commit to branch master
>>>> in repository https://gitbox.apache.org/repos/asf/whimsy.git <https://gitbox.apache.org/repos/asf/whimsy.git>
>>>> 
>>>> 
>>>> The following commit(s) were added to refs/heads/master by this push:
>>>>    new 4d3e6fc  += create_ metthod
>>>> 4d3e6fc is described below
>>>> 
>>>> commit 4d3e6fc5da801224cda3421041a86750984dc711
>>>> Author: Sebb <sebb@apache.org <ma...@apache.org>>
>>>> AuthorDate: Tue Jul 7 12:07:23 2020 +0100
>>>> 
>>>>   += create_ metthod
>>>> ---
>>>> lib/whimsy/asf/svn.rb | 31 ++++++++++++++++++++++++++++++-
>>>> 1 file changed, 30 insertions(+), 1 deletion(-)
>>>> 
>>>> diff --git a/lib/whimsy/asf/svn.rb b/lib/whimsy/asf/svn.rb
>>>> index 6c78056..0dfdb60 100644
>>>> --- a/lib/whimsy/asf/svn.rb
>>>> +++ b/lib/whimsy/asf/svn.rb
>>>> @@ -717,7 +717,36 @@ module ASF
>>>>        FileUtils.rm_rf tmpdir unless temp
>>>>      end
>>>>    end
>>>> -
>>>> +
>>>> +    # DRAFT DRAFT
>>>> +    # create a new file and fail if it already exists
>>>> +    # Parameters:
>>>> +    #  directory - parent directory as an SVN URL
>>>> +    #  filename - name of file to create
>>>> +    #  source - file to upload
>>>> +    #  msg - commit message
>>>> +    #  env - user/pass
>>>> +    #  _ - wunderbar context
>>>> +    # Returns:
>>>> +    # 0 on success
>>>> +    # 1 if the file exists
>>>> +    # RuntimeError on unexpected error
>>>> +    def self.create_(directory, filename, source, msg, env, _)
>>>> +      parentrev, err = self.getInfoItem(directory, 'revision', env.user, env.password)
>>>> +      unless parentrev
>>>> +        throw RuntimeError.new("Failed to get revision for #{directory}: #{err}")
>>>> +      end
>>>> +      target = File.join(directory, filename)
>>>> +      out, err = self.svn('list', target, {env: env})
>>>> +      return 1 if out # already exists
>>>> +      # Need to check for unexpected errors; the error message does not include the full repo URL
>>>> +      unless err =~ %r{^svn: warning: W160013: Path '.+#{filename}' not found}
>>>> +        throw RuntimeError.new("#{filename} already exists! #{err}")
>>>> +      end
>>>> +      commands = [['put', source, target]]
>>>> +      self.svnmucc_(commands, msg, env, _, parentrev)
>>>> +    end
>>>> +
>>>>    # DRAFT DRAFT DRAFT
>>>>    # checkout file and update it using svnmucc put
>>>>    # the block can return additional info, which is used
>>>> 
>>> 
>>> Craig L Russell
>>> clr@apache.org <ma...@apache.org>
>>> 
> 
> Craig L Russell
> clr@apache.org <ma...@apache.org>
> 

Craig L Russell
clr@apache.org