Merge branch 'import-tweaks-and-tests' into 'master'

Import tweaks and tests

This makes the code for `fdroid import` a bit more flexible and adds tests for the first time.  It also comments out options in `examples/config.py` that just mirror the defaults to make it clear that they are defaults, and help illustrate other options (this is standard procedure in default config files).

More details in the commit messages.

See merge request !76
This commit is contained in:
Daniel Martí 2015-09-11 00:23:42 +00:00
commit 13b5966062
5 changed files with 171 additions and 84 deletions

View file

@ -70,71 +70,47 @@ config = None
options = None
def main():
global config, options
# Parse command line...
parser = ArgumentParser()
parser.add_argument("-v", "--verbose", action="store_true", default=False,
help="Spew out even more information than normal")
parser.add_argument("-q", "--quiet", action="store_true", default=False,
help="Restrict output to warnings and errors")
parser.add_argument("-u", "--url", default=None,
help="Project URL to import from.")
parser.add_argument("-s", "--subdir", default=None,
help="Path to main android project subdirectory, if not in root.")
parser.add_argument("--rev", default=None,
help="Allows a different revision (or git branch) to be specified for the initial import")
options = parser.parse_args()
config = common.read_config(options)
if not options.url:
logging.error("Specify project url.")
sys.exit(1)
url = options.url
def get_metadata_from_url(app, url):
tmp_dir = 'tmp'
if not os.path.isdir(tmp_dir):
logging.info("Creating temporary directory")
os.makedirs(tmp_dir)
# Get all apps...
apps = metadata.read_metadata()
# Figure out what kind of project it is...
projecttype = None
issuetracker = None
license = None
website = url # by default, we might override it
app['Web Site'] = url # by default, we might override it
if url.startswith('git://'):
projecttype = 'git'
repo = url
repotype = 'git'
sourcecode = ""
website = ""
app['Source Code'] = ""
app['Web Site'] = ""
elif url.startswith('https://github.com'):
projecttype = 'github'
repo = url
repotype = 'git'
sourcecode = url
issuetracker = url + '/issues'
website = ""
app['Source Code'] = url
app['issuetracker'] = url + '/issues'
app['Web Site'] = ""
elif url.startswith('https://gitlab.com/'):
projecttype = 'gitlab'
repo = url
# git can be fussy with gitlab URLs unless they end in .git
if url.endswith('.git'):
repo = url
else:
repo = url + '.git'
repotype = 'git'
sourcecode = url + '/tree/HEAD'
issuetracker = url + '/issues'
app['Source Code'] = url + '/tree/HEAD'
app['issuetracker'] = url + '/issues'
elif url.startswith('https://bitbucket.org/'):
if url.endswith('/'):
url = url[:-1]
projecttype = 'bitbucket'
sourcecode = url + '/src'
issuetracker = url + '/issues'
app['Source Code'] = url + '/src'
app['issuetracker'] = url + '/issues'
# Figure out the repo type and adddress...
repotype, repo = getrepofrompage(sourcecode)
repotype, repo = getrepofrompage(app['Source Code'])
if not repotype:
logging.error("Unable to determine vcs type. " + repo)
sys.exit(1)
@ -166,6 +142,49 @@ def main():
else:
root_dir = src_dir
app['Repo Type'] = repotype
app['Repo'] = repo
return root_dir, src_dir
config = None
options = None
def main():
global config, options
# Parse command line...
parser = ArgumentParser()
parser.add_argument("-v", "--verbose", action="store_true", default=False,
help="Spew out even more information than normal")
parser.add_argument("-q", "--quiet", action="store_true", default=False,
help="Restrict output to warnings and errors")
parser.add_argument("-u", "--url", default=None,
help="Project URL to import from.")
parser.add_argument("-s", "--subdir", default=None,
help="Path to main android project subdirectory, if not in root.")
parser.add_argument("--rev", default=None,
help="Allows a different revision (or git branch) to be specified for the initial import")
options = parser.parse_args()
config = common.read_config(options)
apps = metadata.read_metadata()
package, app = metadata.get_default_app_info_list(apps)
app['Update Check Mode'] = "Tags"
if os.path.isdir('.git'):
if options.url:
app['Web Site'] = options.url
elif options.url:
root_dir, src_dir = get_metadata_from_url(app, options.url)
else:
logging.error("Specify project url.")
sys.exit(1)
# Extract some information...
paths = common.manifest_paths(root_dir, [])
if paths:
@ -197,18 +216,6 @@ def main():
logging.error("Package " + package + " already exists")
sys.exit(1)
# Construct the metadata...
app = metadata.parse_txt_metadata(None)[1]
app['Web Site'] = website
app['Source Code'] = sourcecode
if issuetracker:
app['Issue Tracker'] = issuetracker
if license:
app['License'] = license
app['Repo Type'] = repotype
app['Repo'] = repo
app['Update Check Mode'] = "Tags"
# Create a build line...
build = {}
build['version'] = version or '?'
@ -230,9 +237,10 @@ def main():
# Keep the repo directory to save bandwidth...
if not os.path.exists('build'):
os.mkdir('build')
shutil.move(src_dir, os.path.join('build', package))
if src_dir is not None:
shutil.move(src_dir, os.path.join('build', package))
with open('build/.fdroidvcs-' + package, 'w') as f:
f.write(repotype + ' ' + repo)
f.write(app['Repo Type'] + ' ' + app['Repo'])
metadatapath = os.path.join('metadata', package + '.txt')
metadata.write_metadata(metadatapath, app)

View file

@ -579,8 +579,11 @@ def split_list_values(s):
return [v for v in l if v]
def get_default_app_info_list(apps, metadatapath):
appid = os.path.splitext(os.path.basename(metadatapath))[0]
def get_default_app_info_list(apps, metadatapath=None):
if metadatapath is None:
appid = None
else:
appid = os.path.splitext(os.path.basename(metadatapath))[0]
if appid in apps:
logging.critical("'%s' is a duplicate! '%s' is already provided by '%s'"
% (metadatapath, appid, apps[appid]['metadatapath']))