Wiki

Ticket #12: cmdlnArgs.patch

File cmdlnArgs.patch, 5.5 KB (added by hopscc, 17 years ago)

patches for fix (pass1) to tkt12

  • Compiler.cobra

     
    392392                assert modules.count 
    393393                _modules.addRange(modules) 
    394394            return modules 
    395  
     395             
     396    # default invocation of runProcess - no explicit exeName and no argList 
    396397    def runProcess as Process 
     398        return .runProcess(nil, nil) 
     399     
     400    # runProcess passing optional explicit exeName and argList 
     401    def runProcess(exeName as String?, argList as IList<of String>?) as Process      
    397402        """ 
    398403        Returns a new Process with startInfo.fileName and p.startInfo.arguments set appropriately 
    399         for the produced executable and the current options. 
     404        for the produced executable and the current options and any provided arglist. 
    400405        """ 
    401         # TODO: support args to the program with a - or -- separator 
    402406        p = Process() 
     407        if exeName 
     408            baseExeFileName = exeName 
     409            fullExeFileName = exeName  
     410        else 
     411            baseExeFileName = .baseExeFileName 
     412            fullExeFileName = .fullExeFileName 
    403413        branch .platform 
    404414            on PlatformEnum.Microsoft 
    405                 p.startInfo.fileName = .baseExeFileName 
     415                p.startInfo.fileName = baseExeFileName 
    406416            on PlatformEnum.Novell 
     417                # fixup fullExeFileName 
     418                if not '.' in fullExeFileName  
     419                    fullExeFileName += '.exe'                    
    407420                p.startInfo.fileName = 'mono' 
    408421                args = '' 
    409422                # mono also needs --debug when running 
    410423                if .options.getDefault('debug', '') not in ['', '-'] 
    411424                    args += '--debug ' 
    412                 args += '"[.fullExeFileName]"' 
     425                args += '"[fullExeFileName]"' 
    413426                p.startInfo.arguments = args 
    414427            else 
    415428                throw FallThroughException(.platform) 
     429                 
     430        if argList 
     431            args = p.startInfo.arguments ? '' 
     432#           for a in argList  
     433#               args += ' [a]' 
     434            args += Utils.join(' ', argList) 
     435            p.startInfo.arguments = args 
     436         
    416437        return p 
    417438 
    418439    ## 
  • CommandLine.cobra

     
    195195        }, 
    196196        { 
    197197            'name': 'reference', 
    198             'synonyms': ['r'], 
     198            'synonyms': ['r'], # TODO: lose 'r' ->'Ref', 'R', something else 
    199199            'isAccumulator': true, 
    200200            'description': 'Add a DLL reference.', 
    201201            'args': 'Some.dll', 
     
    214214#           'args': ':Qualified.Type.Name', 
    215215#       }, 
    216216        { 
    217             'name': 'run', 
     217            'name': 'run',  # TODO: Synonym 'r' after change 'reference' switch 
    218218            'description': 'Runs the Cobra program. This is the default behavior if specify any Cobra source files.', 
    219219            'type': 'main', 
    220220        }, 
     221# 
     222        {        
     223            'name': 'exeArgs',  # TODO: -> 'run' after change 'run' to 'r' 
     224            'synonyms': ['X'], 
     225            'description': 'Remaining args are name of the file to run and args to pass to it.', 
     226            'eg':          '-X echo arg1 arg2 argThree', 
     227            'type': 'exeArgs', 
     228        }, 
     229# 
     230# 
     231        {        
     232            'name': 'runArgs', 
     233            'synonyms': ['-'],  #'--' 
     234            'description': 'Remaining args are to be passed to executable.', 
     235            'eg':          '-- arg1 arg2 argThree', 
     236            'type': 'runArgs', 
     237        }, 
     238#            
    221239        { 
    222240            'name': 'sharp-compiler', 
    223241            'description': 'Specify the path to the backend C# compiler.', 
     
    281299 
    282300    var _options = Options() 
    283301    var _pathList as List<of String>? 
     302    var _runArgs  as IList<of String>?  # nil or args set for running exe 
     303    var _exeFileName as String?         # Name specified for exe to run 
    284304    var _htmlWriter as HtmlWriter? 
    285305 
    286306    def init 
     
    395415        ensure 
    396416            options 
    397417            paths 
    398         body 
     418        body    # TODO: refactor to something more modular (i.e much < 200 lines long) 
    399419            optionPrefix = '-' 
    400420            valuePrefix = c':' 
    401421            if not args.count 
     
    432452            value = 'no-value' to dynamic 
    433453            mainOptions = List<of String>() 
    434454            didSpecify = Dictionary<of String, bool>()  # CC: could just be a Set 
     455            argn=0 
    435456            for arg in args 
     457                argn += 1   # next arg after current 
    436458                if arg.trim.length == 0 
    437459                    continue 
     460                     
    438461                if arg.startsWith(optionPrefix) 
    439462                    isOption = true 
    440463                    while arg.startsWith(optionPrefix) 
    441464                        arg = arg[1:] 
     465                    if not arg.length  # '--' 
     466                        arg='runArgs' 
    442467                else 
    443468                    isOption = false 
    444469                if isOption 
     
    489514                            if spec['type'] == 'main' 
    490515                                mainOptions.add(name) 
    491516                                value = true 
     517                            else if spec['type'] == 'runArgs' 
     518                                # remainder of args are for execution of exe file 
     519                                _runArgs = args[argn:] 
     520                                break 
     521                            else if spec['type'] == 'exeArgs' 
     522                                # remainder of args are exe file and then args for it 
     523                                if args.count <= argn 
     524                                    .error("exeArgs option must have at least one arg following") 
     525                                _exeFileName = args[argn] 
     526                                _runArgs = args[argn+1:] 
     527                                break 
    492528                            else 
    493529                                possible = .interpretValue(valueStr, spec) 
    494530                                if possible is not nil 
     
    584620            options['include-nil-checks'] = false 
    585621            options['include-tests'] = false 
    586622            options['optimize'] = true 
    587  
     623             
    588624    def interpretValue(valueStr as String, spec as Dictionary<of String, Object>) as dynamic? 
    589625        value as dynamic? 
    590626        branch spec['type'] to String 
     
    710746        if c.errors.count 
    711747            print 'Not running due to errors above.' 
    712748        else 
    713             p = c.runProcess 
     749            p = c.runProcess(_exeFileName, _runArgs) 
    714750            if _verbosity >= 1 
    715751                print 'Running: [p.startInfo.fileName] [p.startInfo.arguments]' 
    716752                print .verboseLineSeparator 
     
    821857                        first = false 
    822858                else 
    823859                    print '        Example: -[spec["name"]]:[spec["example"]]' 
     860            if spec.containsKey('eg') #Verbatim example line 
     861                print '        e.g. [spec["eg"]]' 
    824862 
    825863    def doAbout 
    826864        # CC: multiline string