mirror of
				https://github.com/f-droid/fdroidserver.git
				synced 2025-11-04 06:30:27 +03:00 
			
		
		
		
	metadata: remove git repo handling from metadata parsing
This is a vestige of implementing builds from a .fdroid.yml file directly in the app's source repo. It was never fully complete and seems to not be used in any apps in fdroiddata. This makes `fdroid build --all` runs much faster since it does not need to do any git handling for apps that do not have any new builds to run.4e8e29794948689281a4e431080e37be9b06e775d330c
This commit is contained in:
		
							parent
							
								
									598c87c78f
								
							
						
					
					
						commit
						dbf80ad771
					
				
					 4 changed files with 47 additions and 25 deletions
				
			
		| 
						 | 
				
			
			@ -21,12 +21,14 @@ def main():
 | 
			
		|||
    options = parser.parse_args()
 | 
			
		||||
    common.options = options
 | 
			
		||||
    pkgs = common.read_pkg_args(options.appid, True)
 | 
			
		||||
    allapps = metadata.read_metadata(pkgs, check_vcs=True)
 | 
			
		||||
    allapps = metadata.read_metadata(pkgs)
 | 
			
		||||
    apps = common.read_app_args(options.appid, allapps, True)
 | 
			
		||||
    srclib_dir = os.path.join('build', 'srclib')
 | 
			
		||||
    os.makedirs(srclib_dir, exist_ok=True)
 | 
			
		||||
    srclibpaths = []
 | 
			
		||||
    for appid, app in apps.items():
 | 
			
		||||
        vcs, _ignored = common.setup_vcs(app)
 | 
			
		||||
        vcs.gotorevision('HEAD', refresh=False)
 | 
			
		||||
        for build in app.get('Builds', []):
 | 
			
		||||
            for lib in build.srclibs:
 | 
			
		||||
                srclibpaths.append(common.getsrclib(lib, srclib_dir, build=build))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1012,7 +1012,7 @@ def main():
 | 
			
		|||
 | 
			
		||||
    # Read all app and srclib metadata
 | 
			
		||||
    pkgs = common.read_pkg_args(options.appid, True)
 | 
			
		||||
    allapps = metadata.read_metadata(pkgs, options.refresh, sort_by_time=True, check_vcs=True)
 | 
			
		||||
    allapps = metadata.read_metadata(pkgs, sort_by_time=True)
 | 
			
		||||
    apps = common.read_app_args(options.appid, allapps, True)
 | 
			
		||||
 | 
			
		||||
    for appid, app in list(apps.items()):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,7 @@
 | 
			
		|||
# You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
import git
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
import glob
 | 
			
		||||
| 
						 | 
				
			
			@ -541,7 +542,7 @@ def read_srclibs():
 | 
			
		|||
        srclibs[srclibname] = parse_yaml_srclib(metadatapath)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def read_metadata(appids={}, refresh=True, sort_by_time=False, check_vcs=False):
 | 
			
		||||
def read_metadata(appids={}, sort_by_time=False):
 | 
			
		||||
    """Return a list of App instances sorted newest first
 | 
			
		||||
 | 
			
		||||
    This reads all of the metadata files in a 'data' repository, then
 | 
			
		||||
| 
						 | 
				
			
			@ -597,7 +598,7 @@ def read_metadata(appids={}, refresh=True, sort_by_time=False, check_vcs=False):
 | 
			
		|||
        if appid in apps:
 | 
			
		||||
            _warn_or_exception(_("Found multiple metadata files for {appid}")
 | 
			
		||||
                               .format(appid=appid))
 | 
			
		||||
        app = parse_metadata(metadatapath, check_vcs, refresh)
 | 
			
		||||
        app = parse_metadata(metadatapath)
 | 
			
		||||
        check_metadata(app)
 | 
			
		||||
        apps[app.id] = app
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -730,15 +731,22 @@ def _decode_bool(s):
 | 
			
		|||
    _warn_or_exception(_("Invalid boolean '%s'") % s)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def parse_metadata(metadatapath, check_vcs=False, refresh=True):
 | 
			
		||||
    '''parse metadata file, optionally checking the git repo for metadata first'''
 | 
			
		||||
def parse_metadata(metadatapath):
 | 
			
		||||
    """parse metadata file, also checking the source repo for .fdroid.yml
 | 
			
		||||
 | 
			
		||||
    If this is a metadata file from fdroiddata, it will first load the
 | 
			
		||||
    source repo type and URL from fdroiddata, then read .fdroid.yml if
 | 
			
		||||
    it exists, then include the rest of the metadata as specified in
 | 
			
		||||
    fdroiddata, so that fdroiddata has precedence over the metadata in
 | 
			
		||||
    the source code.
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    app = App()
 | 
			
		||||
    app.metadatapath = metadatapath
 | 
			
		||||
    name, _ignored = fdroidserver.common.get_extension(os.path.basename(metadatapath))
 | 
			
		||||
    if name == '.fdroid':
 | 
			
		||||
        check_vcs = False
 | 
			
		||||
    else:
 | 
			
		||||
    metadata_file = os.path.basename(metadatapath)
 | 
			
		||||
    name, _ignored = fdroidserver.common.get_extension(metadata_file)
 | 
			
		||||
    if name != '.fdroid':
 | 
			
		||||
        app.id = name
 | 
			
		||||
 | 
			
		||||
    if metadatapath.endswith('.yml'):
 | 
			
		||||
| 
						 | 
				
			
			@ -748,16 +756,15 @@ def parse_metadata(metadatapath, check_vcs=False, refresh=True):
 | 
			
		|||
        _warn_or_exception(_('Unknown metadata format: {path} (use: *.yml)')
 | 
			
		||||
                           .format(path=metadatapath))
 | 
			
		||||
 | 
			
		||||
    if check_vcs and app.Repo:
 | 
			
		||||
    if metadata_file != '.fdroid.yml' and app.Repo:
 | 
			
		||||
        build_dir = fdroidserver.common.get_build_dir(app)
 | 
			
		||||
        metadata_in_repo = os.path.join(build_dir, '.fdroid.yml')
 | 
			
		||||
        if not os.path.isfile(metadata_in_repo):
 | 
			
		||||
            vcs, build_dir = fdroidserver.common.setup_vcs(app)
 | 
			
		||||
            if isinstance(vcs, fdroidserver.common.vcs_git):
 | 
			
		||||
                vcs.gotorevision('HEAD', refresh)  # HEAD since we can't know where else to go
 | 
			
		||||
        if os.path.isfile(metadata_in_repo):
 | 
			
		||||
            logging.debug('Including metadata from ' + metadata_in_repo)
 | 
			
		||||
            # do not include fields already provided by main metadata file
 | 
			
		||||
            try:
 | 
			
		||||
                commit_id = fdroidserver.common.get_head_commit_id(git.repo.Repo(build_dir))
 | 
			
		||||
                logging.debug(_('Including metadata from %s@%s') % (metadata_in_repo, commit_id))
 | 
			
		||||
            except git.exc.InvalidGitRepositoryError:
 | 
			
		||||
                logging.debug(_('Including metadata from {path}').format(metadata_in_repo))
 | 
			
		||||
            app_in_repo = parse_metadata(metadata_in_repo)
 | 
			
		||||
            for k, v in app_in_repo.items():
 | 
			
		||||
                if k not in app:
 | 
			
		||||
| 
						 | 
				
			
			@ -779,6 +786,17 @@ def parse_metadata(metadatapath, check_vcs=False, refresh=True):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
def parse_yaml_metadata(mf, app):
 | 
			
		||||
    """Parse the .yml file and post-process it
 | 
			
		||||
 | 
			
		||||
    Clean metadata .yml files can be used directly, but in order to
 | 
			
		||||
    make a better user experience for people editing .yml files, there
 | 
			
		||||
    is post processing.  .fdroid.yml is embedded in the app's source
 | 
			
		||||
    repo, so it is "user-generated".  That means that it can have
 | 
			
		||||
    weird things in it that need to be removed so they don't break the
 | 
			
		||||
    overall process.
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        yamldata = yaml.load(mf, Loader=SafeLoader)
 | 
			
		||||
    except yaml.YAMLError as e:
 | 
			
		||||
| 
						 | 
				
			
			@ -791,13 +809,15 @@ def parse_yaml_metadata(mf, app):
 | 
			
		|||
    deprecated_in_yaml = ['Provides']
 | 
			
		||||
 | 
			
		||||
    if yamldata:
 | 
			
		||||
        for field in yamldata:
 | 
			
		||||
            if field not in yaml_app_fields:
 | 
			
		||||
                if field not in deprecated_in_yaml:
 | 
			
		||||
                    _warn_or_exception(_("Unrecognised app field "
 | 
			
		||||
                                         "'{fieldname}' in '{path}'")
 | 
			
		||||
                                       .format(fieldname=field,
 | 
			
		||||
                                               path=mf.name))
 | 
			
		||||
        for field in tuple(yamldata.keys()):
 | 
			
		||||
            if field not in yaml_app_fields + deprecated_in_yaml:
 | 
			
		||||
                msg = (_("Unrecognised app field '{fieldname}' in '{path}'")
 | 
			
		||||
                       .format(fieldname=field, path=mf.name))
 | 
			
		||||
                if os.path.basename(mf.name) == '.fdroid.yml':
 | 
			
		||||
                    logging.error(msg)
 | 
			
		||||
                    del yamldata[field]
 | 
			
		||||
                else:
 | 
			
		||||
                    _warn_or_exception(msg)
 | 
			
		||||
 | 
			
		||||
        for deprecated_field in deprecated_in_yaml:
 | 
			
		||||
            if deprecated_field in yamldata:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -289,7 +289,7 @@ class IndexTest(unittest.TestCase):
 | 
			
		|||
            'timestamp': datetime.datetime.now(),
 | 
			
		||||
            'version': 12,
 | 
			
		||||
        }
 | 
			
		||||
        app = fdroidserver.metadata.parse_metadata(metadatafile, False, False)
 | 
			
		||||
        app = fdroidserver.metadata.parse_metadata(metadatafile)
 | 
			
		||||
        app['icon'] = 'info.zwanenburg.caffeinetile.4.xml'
 | 
			
		||||
        app['CurrentVersionCode'] = '4'
 | 
			
		||||
        apps = {app.id: app}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue