Allow the GIT ids to be more flexible
[stgit] / stgit / git.py
index 5d754b6..634a903 100644 (file)
@@ -356,6 +356,7 @@ def status(files = [], modified = False, new = False, deleted = False,
         if modified:
             filestat.append('M')
         if new:
+            filestat.append('A')
             filestat.append('N')
         if deleted:
             filestat.append('D')
@@ -371,15 +372,20 @@ def status(files = [], modified = False, new = False, deleted = False,
         else:
             print '%s' % fs[1]
 
-def diff(files = [], rev1 = 'HEAD', rev2 = None, out_fd = sys.stdout):
+def diff(files = [], rev1 = 'HEAD', rev2 = None, out_fd = None):
     """Show the diff between rev1 and rev2
     """
     os.system('git-update-cache --refresh > /dev/null')
 
     if rev2:
-        out_fd.write(_output(['git-diff-tree', '-p', rev1, rev2]+files))
+        diff_str = _output(['git-diff-tree', '-p', rev1, rev2] + files)
     else:
-        out_fd.write(_output(['git-diff-cache', '-p', rev1]+files))
+        diff_str = _output(['git-diff-cache', '-p', rev1] + files)
+
+    if out_fd:
+        out_fd.write(diff_str)
+    else:
+        return diff_str
 
 def diffstat(files = [], rev1 = 'HEAD', rev2 = None):
     """Return the diffstat between rev1 and rev2
@@ -433,3 +439,18 @@ def switch(tree_id):
     # checkout doesn't remove files
     for fs in to_delete:
         os.remove(fs[1])
+
+def fetch(location, head = None, tag = None):
+    """Fetch changes from the remote repository. At the moment, just
+    use the 'git fetch' scripts
+    """
+    args = [location]
+    if head:
+        args += [head]
+    elif tag:
+        args += ['tag', tag]
+
+    if __run('git fetch', args) != 0:
+        raise GitException, 'Failed "git fetch %s"' % location
+
+    return read_string(os.path.join(base_dir, 'FETCH_HEAD'))