anatoly techtonik wrote: >> -__version__ = '2012.05.24' > > Because svnlook.py is used in hook scripts, it is usually copied > out of revision control. Version is useful to track new changes.
That makes sense. I'm not sure what to put in the __version__ string, but the most common way to identify the version of other scripts in the 'tools' directory in our repository seems to be by adding these three lines: # $HeadURL$ # $LastChangedDate$ # $LastChangedRevision$ Would you be happy with this? I've committed that in r1541878, but am happy to change it. >> @@ -76,7 +74,7 @@ class SVNLook(object): >> self.txn_ptr = None >> if rev is None: >> rev = fs.youngest_rev(self.fs_ptr) >> - self.rev = int(rev) >> + self.rev = rev > > I believe that this is critical for some API calls and arithmetic that > self.rev is not a string. OK, so this is basically for the convenience of callers that might want to pass a string. I'll do it like this: # if set, txn takes precendence if txn: self.txn_ptr = fs.open_txn(self.fs_ptr, txn) else: self.txn_ptr = None if rev is None: rev = fs.youngest_rev(self.fs_ptr) + else: + rev = int(rev) self.rev = rev Also related to revision numbers, I noticed that the 'changed' and 'dirs-changed' and 'diff' commands would fail with rev=0, because they tried to set base_rev=-1. To fix those, I'll add: def _walk_tree(self, e_factory, base_rev=None, pass_root=0, callback=None): if base_rev is None: # a specific base rev was not provided. use the transaction base, # or the previous revision if self.txn_ptr: base_rev = fs.txn_base_revision(self.txn_ptr) + elif self.rev == 0: + base_rev = 0 else: base_rev = self.rev - 1 (With the current code, a 'return' statement would be equivalent, but this way avoids making assumptions.) I committed these two changes (and a tweak to the doc string) in revision 1541873. >> def cmd_date(self): >> - # duplicate original svnlook format, which is >> - # 2010-02-08 21:53:15 +0200 (Mon, 08 Feb 2010) >> secs = self.get_date(unixtime=True) >> - # convert to tuple, detect time zone and format >> - stamp = time.localtime(secs) >> - isdst = stamp.tm_isdst >> - utcoffset = -(time.altzone if (time.daylight and isdst) else > time.timezone) // 60 >> - >> - suffix = "%+03d%02d" % (utcoffset // 60, abs(utcoffset) % 60) >> - outstr = time.strftime('%Y-%m-%d %H:%M:%S ', stamp) + suffix >> - outstr += time.strftime(' (%a, %d %b %Y)', stamp) >> - print(outstr) >> + if secs is None: >> + print("") >> + else: >> + # assume secs in local TZ, convert to tuple, and format >> + ### we don't really know the TZ, do we? >> + print(time.strftime('%Y-%m-%d %H:%M', time.localtime(secs))) > > I believe that svnlook.py output was different than of svnlook, but I may > mistake. Anyway, this change seems ok. You are right that the output was (and is) different. I am happy to change the format to be the same as 'svnlook'); the only problems were (1) it was an unrelated change and (2) it broke if a revision had no date property. I have added "if secs is None: print('')" to fix the latter, and committed it as revision 1541877. >> def get_date(self, unixtime=False): >> """return commit timestamp in RFC 3339 format > (2010-02-08T20:37:25.195000Z) >> if unixtime is True, return unix timestamp >> - return None if date is not set (txn properties) >> + return None for a txn, or if date property is not set > > What are other cases when date may be empty? It's possible for a committed revision to not have a svn:date property. Although the property is always created on commit, it can be removed by "svn propdel --revprop -r X svn:date". > Anyway, LGTM without any more fixes. Thanks. Let me know if you would like any more changes. - Julian