How to assign a priority number to "update-alternatives --config gdm3.css" in a single cmdline?

Solution 1:

Based on @PRATAP comment, I have developed this python3.6 solution to my question. It worked on my Ubuntu 18.04 system. I hope it can benefit others with the same need.

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from subprocess import run, PIPE
from pathlib import Path
import mimetypes

class CSSFileTypeError(Exception):
    pass

class GDM3_alternatives:
    '''Class to query and configure gdm3.css.

    Argument:
      mytheme - path to my gnome-shell theme .css file.

    Attributes:
      mytheme - path to my gnome-shell theme .css file.
      query   - stdout from "update-alternatives --query gdm3.css" store in a list
      link    - gdm3.css path
      best    - gdm3.css alternative path selected by auto mode 
      value   - current gdm3.css alternative path 
      status  - whether gdm3.css is selected by manual or automatic mode 
      max     - maximum Priority value of all the installed gdm3.css alternatives

    Methods:
      exist()     - determines whether "mytheme" is installed as a gdm3.css alternative.
      configure() - configure "mytheme" file as a gdm3.css alternative.
    '''
    def __init__( self, mytheme=None ):       
        def _get( qvalue ):
            return [ line[ line.index('/') : ] for line in self.query if qvalue in line ][0]
        self.mytheme = mytheme
        self.query = run( [ 'update-alternatives', '--query', 'gdm3.css' ],
                          stdout=PIPE, encoding="utf-8" ).stdout.splitlines()
        self.link   = _get( 'Link:' )
        self.best   = _get( 'Best:' )
        self.value  = _get( 'Value:' )
        self.status = [ line[ line.index(':')+2 : ] for line in self.query if 'Status:' in line ][0]
        self.max = max( [ int( line[ line.index(':')+1 : ] ) for line in self.query if 'Priority:' in line ] )
        #print( f'self.query = {self.query}' )  #For debugging
        #print( f'self.link  = {self.link}' )   #For debugging
        #print( f'self.best  = {self.best}' )   #For debugging
        #print( f'self.value = {self.value}' )  #For debugging
        #print( f'self.status= {self.status}' ) #For debugging
        #print( f'self.max   = {self.max}' )    #For debugging

    def exist( self ):
        '''Method that determines whether "mytheme.css" is installed as a gdm3.css alternative. '''
        if self.mytheme == None:
            raise TypeError( '.css file was not defined.' ) 
        if not Path( self.mytheme ).exists():
            raise FileNotFoundError( f'{self.mytheme} does not exist.' )
        if 'css' not in mimetypes.guess_type( self.mytheme )[0] :
            raise CSSFileTypeError( f'{self.mytheme} is not a css file.' )
        return True in [ True for line in self.query if self.mytheme in line ]

    def configure( self ):
        '''Method to configure my theme ".css" file as a gdm3.css alternative.'''
        def _config():
            if 'auto' not in self.status:
                run( [ 'update-alternatives', '--auto', 'gdm3.css' ] ) #Ensure auto mode is used
            run( [ 'update-alternatives', '--install', self.link, 'gdm3.css', self.mytheme, str(self.max + 1) ] )
            print( f'Configured {self.mytheme} as gdm3.css alternative.' )

        if not self.exist():
            _config()
        elif self.value in self.mytheme:
            print( f'{self.mytheme} is already gdm3.css alternative.' )
        else:
            run( [ 'update-alternatives', '--remove', 'gdm3.css', self.mytheme ] )
            self.__init__( self.mytheme )
            _config()

if __name__ == '__main__':
    #mytheme = '/usr/share/gnome-shell/theme/mytheme/mytheme.css' 
    mytheme = '/usr/share/gnome-shell/theme/mytheme/mytheme.css' #Change this to your theme
    gdm3 = GDM3_alternatives( mytheme )
    gdm3.configure()

## This script needs to be executed by sudo. ## 

How to use this script:

  1. Save it to a file with .py extension, e.g. myscript.py.
  2. Change line mytheme = '/usr/share/gnome-shell/theme/mytheme/mytheme.css' to show your theme's .css path.
  3. Run the script on terminal with sudo permission, i.e. type sudo python3.6 myscript.py. Or open your python IDLE using sudo permission and run this python script.

The version of the update-alternatives on my Ubuntu 18.04 system is:

$ update-alternatives --version
Debian update-alternatives version 1.19.0.5.

This is free software; see the GNU General Public License version 2 or
later for copying conditions. There is NO warranty.