From: W. Trevor King <wking@drexel.edu>
Date: Wed, 27 Jan 2010 21:50:34 +0000 (-0500)
Subject: Implement Arch._vcs_path()
X-Git-Tag: 1.0.0~59^2~31
X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=9b42ab6d3e2372c2c0f26a0788f8b84d1d346171;p=be.git

Implement Arch._vcs_path()

Fixes VersionedStorage_commit_TestCase.test_get_previous_children.
Should have fixed
  VersionedStorage_commit_TestCase.test_get_previous_version
too, but 'tla file-find' is buggy:
  https://bugs.launchpad.net/ubuntu/+source/tla/+bug/513472

Also:
  * sort children in test_get_previous_children, since we shouldn't
    require a particular child order
  * unescape filenames in Arch._diff()
  * remove debugging prints from Arch._parse_diff()
  * remove silly blank line in git.py I'd stumbled across ;).
---

diff --git a/libbe/storage/base.py b/libbe/storage/base.py
index ade6587..ad6b291 100644
--- a/libbe/storage/base.py
+++ b/libbe/storage/base.py
@@ -994,7 +994,7 @@ if TESTING == True:
                 cur_children.append(new_child)
                 children.append(list(cur_children))
             for i in range(10):
-                ret = self.s.children('parent', revision=revs[i])
+                ret = sorted(self.s.children('parent', revision=revs[i]))
                 self.failUnless(ret == children[i],
                                 "%s.get() returned %s not %s for revision %s"
                                 % (vars(self.Class)['name'], ret,
diff --git a/libbe/storage/vcs/arch.py b/libbe/storage/vcs/arch.py
index 2b305ea..38b1d02 100644
--- a/libbe/storage/vcs/arch.py
+++ b/libbe/storage/vcs/arch.py
@@ -24,6 +24,7 @@ GNU Arch (tla) backend.
 
 import codecs
 import os
+import os.path
 import re
 import shutil
 import sys
@@ -33,6 +34,7 @@ import libbe
 import libbe.ui.util.user
 import libbe.storage.util.config
 from libbe.util.id import uuid_gen
+from libbe.util.subproc import CommandError
 import base
 
 if libbe.TESTING == True:
@@ -301,15 +303,37 @@ class Arch(base.VCS):
         if revision == None:
             return base.VCS._vcs_get_file_contents(self, path, revision)
         else:
+            relpath = self._file_find(path, revision, relpath=True)
+            return base.VCS._vcs_get_file_contents(self, relpath)
+
+    def _file_find(self, path, revision, relpath=False):
+        try:
             status,output,error = \
                 self._invoke_client(
                 'file-find', '--unescaped', path, revision)
-            relpath = output.rstrip('\n').splitlines()[-1]
-            return base.VCS._vcs_get_file_contents(self, relpath)
+            path = output.rstrip('\n').splitlines()[-1]
+        except CommandError, e:
+            if e.status == 2 \
+                    and 'illegally formed changeset index' in e.stderr:
+                raise NotImplementedError(
+"""Outstanding tla bug, see
+  https://bugs.launchpad.net/ubuntu/+source/tla/+bug/513472
+""")
+            raise
+        if relpath == True:
+            return path
+        return os.path.abspath(os.path.join(self.repo, path))
 
     def _vcs_path(self, id, revision):
-        raise NotImplementedError(
-            'Too little Arch understanding at the moment...')
+        return self._u_find_id(id, revision)
+
+    def _vcs_isdir(self, path, revision):
+        abspath = self._file_find(path, revision)
+        return os.path.isdir(abspath)
+
+    def _vcs_listdir(self, path, revision):
+        abspath = self._file_find(path, revision)
+        return [p for p in os.listdir(abspath) if self._vcs_is_versioned(p)]
 
     def _vcs_commit(self, commitfile, allow_empty=False):
         if allow_empty == False:
@@ -359,7 +383,7 @@ class Arch(base.VCS):
 
     def _diff(self, revision):
         status,output,error = self._u_invoke_client(
-            'diff', '--summary', revision, expect=(0,1))
+            'diff', '--summary', '--unescaped', revision, expect=(0,1))
         return output
     
     def _parse_diff(self, diff_text):
@@ -390,7 +414,6 @@ class Arch(base.VCS):
             if line.startswith('* ') or '/.arch-ids/' in line:
                 continue
             change,file = line.split('  ',1)
-            print '"%s" "%s"' % (change, file)
             if  file.startswith('{arch}/'):
                 continue
             if change == 'A':
@@ -399,7 +422,6 @@ class Arch(base.VCS):
                 modified.append(file)
             elif change == 'D':
                 removed.append(file)
-        print new, modified, removed
         return (new,modified,removed)
 
     def _vcs_changed(self, revision):
diff --git a/libbe/storage/vcs/git.py b/libbe/storage/vcs/git.py
index e2c1b83..c6638bc 100644
--- a/libbe/storage/vcs/git.py
+++ b/libbe/storage/vcs/git.py
@@ -118,7 +118,6 @@ class Git(base.VCS):
             status,output,error = self._u_invoke_client('show', arg)
             return output
 
-
     def _vcs_path(self, id, revision):
         return self._u_find_id(id, revision)