def get_package_root_path(directory_or_url): if is_non_svn_git(directory_or_url): # we do not have a svn url, so we need to walk up # the local path.. package root is where .git is if "://" in directory_or_url: raise UrlsNotSupported dir = directory_or_url while not os.path.exists(os.path.join(dir, ".git")): # remove last part from dir path dir = "/".join(dir.split("/")[:-1]) if dir == "": raise PackageRootNotFound return dir else: # we have svn url url_here = get_svn_url(directory_or_url) svn.check_project_layout(url_here) url_root = get_package_root_url(directory_or_url) url_rel = url_here[len(url_root) + 1 :].split("/") if url_rel[0] in ("trunk"): url_rel.pop(0) elif url_rel[0] in ("branches", "tags"): url_rel.pop(0) url_rel.pop(0) else: raise Exception("Confused: check your svn project layout") return os.path.abspath("../" * len(url_rel))
def get_info(self, package, force_reload=False, prompt=True): svn_url = PackageSourceMemory().guess_url(package, prompt=prompt) if not svn_url: return None data = self.get_cached_info(package) update = force_reload rev = self.get_revision_for(package) if not data: update = True elif rev > data["rev"]: update = True if update: svn.check_project_layout(svn_url) data = { "name": package, "tags": svn.get_existing_tags(svn_url), "newest_tag": "", "changes": False, "rev": rev, "url": svn_url, "history": None, } if data["tags"]: # find newest tag tags = [k for k, v in data["tags"].items()] tags.sort(lambda a, b: cmp(data["tags"][a], data["tags"][b])) tags.reverse() newest_tag = tags[0] data["newest_tag"] = newest_tag newest_tag_url = os.path.join(svn_url, "tags", newest_tag) trunk_url = os.path.join(svn_url, "trunk") rows = ( runcmd_with_exitcode( "svn diff %s %s --summarize" % (trunk_url, newest_tag_url), log=False, respond=True )[1] .strip() .split("\n") ) for row in rows: flag, url = re.split("\W*", row.strip(), maxsplit=1) url = url.strip() if ( url.startswith(os.path.join(trunk_url, package.replace(".", "/"))) and not url.endswith("version.txt") and not url.endswith(".mo") ): data["changes"] = True break else: data["changes"] = True self.set_cached_info(package, data) return data