return local
 
+srcrev_internal_call = False
+
 def get_srcrev(d):
     """
     Return the version string for the current package
     In the multi SCM case, we build a value based on SRCREV_FORMAT which must 
     have been set.
     """
+
+    #
+    # Ugly code alert. localpath in the fetchers will try to evaluate SRCREV which 
+    # could translate into a call to here. If it does, we need to catch this
+    # and provide some way so it knows get_srcrev is active instead of being
+    # some number etc. hence the srcrev_internal_call tracking and the magic  
+    # "SRCREVINACTION" return value.
+    #
+    # Neater solutions welcome!
+    #
+    if bb.fetch.srcrev_internal_call:
+        return "SRCREVINACTION"
+
     scms = []
     # Only call setup_localpath on URIs which suppports_srcrev() 
     urldata = init(bb.data.getVar('SRC_URI', d, 1).split(), d, False)
     def setup_localpath(self, d):
         self.setup = True
         if "localpath" in self.parm:
+            # if user sets localpath for file, use it instead.
             self.localpath = self.parm["localpath"]
         else:
+            bb.fetch.srcrev_internal_call = True
             self.localpath = self.method.localpath(self.url, self, d)
+            bb.fetch.srcrev_internal_call = False
         self.md5 = self.localpath + '.md5'
         self.lockfile = self.localpath + '.lock'
-        # if user sets localpath for file, use it instead.
 
 
 class Fetch(object):
 
         if 'rev' in ud.parm:
             ud.revision = ud.parm['rev']
         else:
-            # ***Nasty hack***
-            rev = data.getVar("SRCREV", d, 0)
-            if rev and "get_srcrev" in rev:
-                ud.revision = self.latest_revision(url, ud, d)
-            elif rev:
+            rev = data.getVar("SRCREV", d, 1)
+            if rev is "SRCREVINACTION":
+                rev = self.latest_revision(url, ud, d)
+            if rev:
                 ud.revision = rev
             else:
-                ud.revision = ""
+                ud.revision = ""       
 
-        
         ud.localfile = data.expand('bzr_%s_%s_%s.tar.gz' % (ud.host, ud.path.replace('/', '.'), ud.revision), d)
         
         return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile)
 
         if 'protocol' in ud.parm:
             ud.proto = ud.parm['protocol']
 
-        tag = data.getVar("SRCREV", d, 0)
+        tag = data.getVar("SRCREV", d, 1)
         if 'tag' in ud.parm:
             ud.tag = ud.parm['tag']
-        elif tag and "get_srcrev" not in tag and len(tag) == 40:
-            ud.tag = tag
+        elif tag is "SRCREVINACTION":
+            ud.tag = self.latest_revision(url, ud, d)
         else:
+            ud.tag = tag            
+
+        if ud.tag == "master":
             ud.tag = self.latest_revision(url, ud, d)
 
         ud.localfile = data.expand('git_%s%s_%s.tar.gz' % (ud.host, ud.path.replace('/', '.'), ud.tag), d)
         runfetchcmd("git pull --tags %s://%s%s" % (ud.proto, ud.host, ud.path), d)
         runfetchcmd("git prune-packed", d)
         runfetchcmd("git pack-redundant --all | xargs -r rm", d)
-        # old method of downloading tags
-        #runfetchcmd("rsync -a --verbose --stats --progress rsync://%s%s/ %s" % (ud.host, ud.path, os.path.join(repodir, ".git", "")), d)
 
         os.chdir(repodir)
-        bb.msg.note(1, bb.msg.domain.Fetcher, "Creating tarball of git repository")
-        runfetchcmd("tar -czf %s %s" % (repofile, os.path.join(".", ".git", "*") ), d)
+        mirror_tarballs = data.getVar("BB_GENERATE_MIRROR_TARBALLS", d, True)
+        if mirror_tarballs != "0": 
+            bb.msg.note(1, bb.msg.domain.Fetcher, "Creating tarball of git repository")
+            runfetchcmd("tar -czf %s %s" % (repofile, os.path.join(".", ".git", "*") ), d)
 
         if os.path.exists(codir):
             prunedir(codir)
 
 
         if 'rev' in ud.parm:
             ud.revision = ud.parm['rev']
-        else:
-            #
-            rev = data.getVar("SRCREV", d, 0)
-            if rev and "get_srcrev" in rev:
-                ud.revision = self.latest_revision(url, ud, d)
-            elif rev:
-                ud.revision = rev
-            else:
-                ud.revision = ""
+        #else:
+        #    rev = data.getVar("SRCREV", d, 1)
+        #    if rev is "SRCREVINACTION":
+        #        rev = self.latest_revision(url, ud, d)
+        #    if rev:
+        #        ud.revision = rev
+        #    else:
+        #        ud.revision = ""
 
         ud.localfile = data.expand('%s_%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.path.replace('/', '.'), ud.revision), d)
 
 
             ud.revision = ""
         else:
             #
-            # ***Nasty hacks***
+            # ***Nasty hack***
             # If DATE in unexpanded PV, use ud.date (which is set from SRCDATE)
-            # Will warn people to switch to SRCREV here
-            #
-            # How can we tell when a user has overriden SRCDATE? 
-            # check for "get_srcdate" in unexpanded SRCREV - ugly
+            # Should warn people to switch to SRCREV here
             #
             pv = data.getVar("PV", d, 0)
             if "DATE" in pv:
                 ud.revision = ""
             else:
-                rev = data.getVar("SRCREV", d, 0)
-                if rev and "get_srcrev" in rev:
-                    ud.revision = self.latest_revision(url, ud, d)
-                    ud.date = ""
-                elif rev:
+                rev = data.getVar("SRCREV", d, 1)
+                if rev is "SRCREVINACTION":
+                    rev = self.latest_revision(url, ud, d)
+                if rev:
                     ud.revision = rev
                     ud.date = ""
                 else: