function cvs.fetch_source(info, sourcename)
     local rc, re, e, src, cvsroot, workdir, argv
 
+    if scm.working_copy_available(info, sourcename) then
+        return true
+    end
+
     e = err.new("fetching source failed: %s", sourcename)
     src = source.sources[sourcename]
 
     e = err.new("updating source '%s' failed", sourcename)
     src = source.sources[sourcename]
 
+    rc, re = scm.working_copy_available(info, sourcename)
+    if not rc then
+        return false, e:cat(re)
+    end
+
     workdir = e2lib.join(info.root, src:get_working())
 
     argv = { "update", "-R" }
 
 function git.fetch_source(info, sourcename)
     local e, rc, re, src, git_dir, work_tree, id
 
+    if scm.working_copy_available(info, sourcename) then
+        return true
+    end
+
     src = source.sources[sourcename]
     e = err.new("fetching source failed: %s", sourcename)
 
 
 
     local e, rc, re, src, git_dir, work_tree, id
 
+    if scm.working_copy_available(info, sourcename) then
+        return true
+    end
+
     src = source.sources[sourcename]
     e = err.new("fetching source failed: %s", sourcename)
 
 
         return false, e:cat(re)
     end
 
+    if scm.working_copy_available(info, sourcename) then
+        return true
+    end
+
     local argv = { "checkout", svnurl, info.root .. "/" .. src:get_working() }
 
     rc, re = svn_tool(argv)