<br><br><div class="gmail_quote">On Sun, Jun 8, 2008 at 6:27 PM, Marco Pesenti Gritti &lt;<a href="mailto:mpgritti@gmail.com">mpgritti@gmail.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Some quic<br>
<br>
* The patch does not apply cleanly to sugar-toolkit master.</blockquote><div><br>I&#39;ll be more careful with my git diff.<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
* Do you actually need to move the imports in activitybundle for<br>
Develop or is it just a cleanup?</blockquote><div><br>No, removed.<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
+IGNORE_DIRS=[&#39;dist&#39;, &#39;.git&#39;],<br>
+IGNORE_FILES=[&#39;.gitignore&#39;, &#39;MANIFEST&#39;, &#39;*.pyc&#39;, &#39;*~&#39;, &#39;*.bak&#39;]<br>
+<br>
<br>
Keep these in the class they are used by.<br>
</blockquote><div><br>check<br>&nbsp;<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
-<br>
+<br>
<br>
You are adding spaces there, please remove.<br>
<div class="Ih2E3d"><br>
 &nbsp; &nbsp; &nbsp; &nbsp; for f in files:<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ignore_files and f not in ignore_files:<br>
</div>+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if not (ignore_files and<br>
<div class="Ih2E3d">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[True for pat in ignore_files if fnmatch(f,pat)]):<br>
</div>+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#not (result matches a pattern in ignore_files, ignore it)<br>
<br>
This was really hard to parse for me. It should be simpler if you just<br>
build the list of files with something like &quot;files = [n for n in names<br>
if fnmatch(n, pattern)]&quot; and then iterate over it.</blockquote><div><br>check. I could also change the &quot;for ..:.. append&quot; to a &quot;..+= [..for..] if you want<br>&nbsp;<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<div class="Ih2E3d"><br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dirs.remove(ignore)<br>
-<br>
 &nbsp; &nbsp; return result<br>
<br>
</div>No need to remove the \n &nbsp;there.&nbsp;</blockquote><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
+ &nbsp; &nbsp;def __init__(self, source_dir=None, dist_path = &quot;&quot;):<br>
<br>
The dist_path split is really confusing, better to pass in both a<br>
dist_dir and xo_name.<br>
In the implementation please use an if instead of the or (like I did<br>
for source_dir). The or is more compact but imo makes the thing harder<br>
to read.</blockquote><div><br>check.<br>&nbsp;<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#list files<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;allfiles = list_files(source_dir, ignore_dirs=IGNORE_DIRS,<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ignore_files=IGNORE_FILES)<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#add them to internal copy of MANIFEST<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#note: duplicates/invalids already removed when creating bundle object<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;for path in allfiles:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if path not in manifest:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;manifest.append(path)<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#write internal copy to disk<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;manifestfile = open(os.path.join(source_dir,&quot;MANIFEST&quot;),&quot;wb&quot;)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;for line in manifest:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;manifestfile.write(line + &quot;\n&quot;)<br>
<br>
All the comments in this block are redundant, the code is clear enough.</blockquote><div><br>The thing about duplicate/invalid actually matters, leaving just that.<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;if git_ls.wait():<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#fall back to MANIFEST<br>
<div class="Ih2E3d">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return BuildPackager.get_files(self)<br>
<br>
</div>Fallback to MANIFEST doesn&#39;t make sense. We should fallback to the<br>
list_files which you are removing instead.</blockquote><div><br>check<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#cleanup and return<br>
<br>
Please avoid this kind of comments, they don&#39;t add anything.</blockquote><div><br>check. <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;return [file.strip() for file in files if not file.startswith(&#39;.&#39;)]<br>
<br>
What&#39;s the reason to skip &nbsp;.* ?</blockquote><div><br>This is the logic from the old version of bundlebuilder. No preference, myself. I suspect that it is for .gitignore .<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#we can either do<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#pyXXXXlint: disable-msg=W0201<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#disables &quot;Attribute %r defined outside __init__&quot; msg.<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#(remove XXXX to enable), or we can do:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;self.manifest = None #which is meaningless but shuts pylint up.<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;self.read_manifest()<br>
<br>
Setting it to None is fine, remove the comments.</blockquote><div><br>I left just one comment.<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<div class="Ih2E3d"><br>
+ &nbsp; &nbsp; &nbsp; &nbsp;try:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f = self.get_file(&quot;MANIFEST&quot;)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;except IOError:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f = None<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;if not f:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;logging.warning(&quot;Activity directory lacks a MANIFEST file.&quot;)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return []<br>
<br>
</div>This should be a None check... see previous review for the reasoning.</blockquote><div><br>check.<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;for num, line in enumerate(manifestlines):<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if line:<br>
<br>
s/manifestlines/lines, it&#39;s clear from the context.</blockquote><div><br>check.<br>&nbsp;<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
Can line ever be None there? I haven&#39;t checked by I&#39;d not expect<br>
readlines() to return Nones.</blockquote><div><br>Not None; &quot;&quot;, which is also false.<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#check...<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if line.endswith(&quot;/&quot;):<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#...dirs...<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if not self.is_dir(line):<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;manifestlines[num] = &quot;&quot;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;logging.warning(&quot;Bundle %s: invalid dir &quot;<br>
<div class="Ih2E3d">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;entry in MANIFEST: %s&quot;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;%(self._name,line))<br>
<br>
</div>Do we require a trailing / for directories?<br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#remove trailing newlines - unlike internal newlines,<br>
<div class="Ih2E3d">+ &nbsp; &nbsp; &nbsp; &nbsp;# &nbsp;they do not help keep absolute position<br>
</div>+ &nbsp; &nbsp; &nbsp; &nbsp;while manifestlines and manifestlines[-1] == &quot;&quot;:<br>
<div class="Ih2E3d">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;manifestlines = manifestlines[:-1]<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;self.manifest = manifestlines<br>
<br>
</div>Can you explain the absolute position comment?</blockquote><div><br>It is for version control.<br>Version x: [&quot;activity/<a href="http://activity.info">activity.info</a>&quot;, &quot;main.py&quot;, &quot;extra.py&quot;, &quot;sillyname.py&quot;]<br>
...<br>rm extra.py; mv sillyname.py bettername.py<br>...<br>version x+1: [&quot;activity/<a href="http://activity.info">activity.info</a>&quot;, &quot;main.py&quot;, &quot;&quot;, &quot;bettername.py&quot;]<br><br>thus the &quot;&quot; in the middle is useful. &quot;&quot; on the end, however, is not.<br>
&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
+ &nbsp; &nbsp;def unpack(self, install_dir, strict_manifest=False):<br>
<br>
What is the use case of strict_manifest?</blockquote><div><br>Intended to be turned on by default later, once current activities are fixed. It will encourages proper use of MANIFEST. The principle is SPOT - single point of truth - and it will reduce the amount of fix_manifest I have to do in Develop to avoid data loss. fix_manifest too often defeats the purpose of MANIFEST, we might as well be including implicitly.<br>
&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#check installed files against the MANIFEST<br>
<div class="Ih2E3d">+ &nbsp; &nbsp; &nbsp; &nbsp;manifestfiles = self.get_files(self._raw_manifest())<br>
</div>+ &nbsp; &nbsp; &nbsp; &nbsp;paths &nbsp;= []<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;for root, dirs, files in os.walk(install_path):<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for f in files:<br>
<div class="Ih2E3d">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rel_path = root[len(base_dir) + 1:]<br>
</div>+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;paths.append(os.path.join(rel_path, f))<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;for path in paths:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if path in manifestfiles:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;manifestfiles.remove(path)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;elif path != &quot;MANIFEST&quot;:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;logging.warning(&quot;Bundle %s: %s not in MANIFEST&quot;%<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(self._name,path))<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if strict_manifest:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;os.remove(os.path.join(install_path, path))<br>
<br>
Some \n please :)<br>
<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;#create empty directories<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;for adir in self.get_dirs():<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dirpath = os.path.join(install_path, adir)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if os.path.isdir(dirpath):<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;logging.warning(&quot;Bunldle %s: non-empty dir %s in MANIFEST&quot;%<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (self._name,dirpath))<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else:<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;os.makedirs(dirpath)<br>
<br>
Can you explain the reason of this?</blockquote><div><br>On second thought, there is no good reason. Removed.<br><br>&gt; Also, you left this in.<br>
&gt; <br>&gt; + &nbsp; &nbsp; &nbsp; &nbsp;print path<br><br>fixed<br><br>Here is the new version of the patch. Tell me if there are any problems applying it cleanly, and I will fix.<br><br>Jameson<br></div></div><br>