internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: ESMCI/cime

Issue:
No archive entry found for components ESP on anlworkstation
After PR #2656 (Archive test refinement) was merged, a single
cime_developer test (e.g. SMS.T42_T42.S) fails during run.
```
Exception during run:
ERROR: No archive entry found for components: ['ESP']
Traceback (most recent call last):
  File "scripts/lib/CIME/SystemTests/system_tests_common.py", line 155, in run
    self._st_archive_case_test()
  File "scripts/lib/CIME/SystemTests/system_tests_common.py", line 286, in _st_archive_case_test
    result = self._case.test_env_archive()
  File "scripts/lib/CIME/case/case_st_archive.py", line 749, in test_env_archive
    expect(not components, "No archive entry found for components: {}".format(components))
  File "scripts/lib/CIME/utils.py", line 130, in expect
    raise exc_type(msg)
SystemExit: ERROR: No archive entry found for components: ['ESP']
```
If we remove the following line in system_tests_common.py the test can pass:
`self._st_archive_case_test()`

How to define archive entry for ESP on anlworkstation?


Discussion:
E3sm Should not look for an esp entry - I will fix this.

Resolving patch:
diff --git a/scripts/lib/CIME/case/case_st_archive.py b/scripts/lib/CIME/case/case_st_archive.py
--- a/scripts/lib/CIME/case/case_st_archive.py
+++ b/scripts/lib/CIME/case/case_st_archive.py
@@ -714,6 +714,8 @@ def test_env_archive(self, testdir="env_archive_test"):
         if (compname == 's'+comp.lower() or compname == 'x'+comp.lower()) and comp != 'ESP':
             logger.info("Not testing component {}".format(comp))
             components.remove(comp)
+        elif comp == 'ESP' and self.get_value('MODEL') == 'e3sm':
+            components.remove(comp)
         else:
             if compname == 'cpl':
                 compname = 'drv'


Test patch:
Repository: ESMCI/cime

Issue:
Issue downloading data (wildcards not supported in HTTP)
I was wanting to have a case download all of the data it needs. First create an empty tmp inputdata directory, set the DIN env vars.  However, I got error below which seems like a problem with wget and wildcards?

```
        Refcase not found in /global/cscratch1/sd/ndk/inputdata/e3sm_init/20171228.beta3rc13_1850.ne30_oECv3_ICG.edison/0331-01-01, will attempt to download from inputdata
          Model refcase missing file refdir = '/global/cscratch1/sd/ndk/inputdata/e3sm_init/20171228.beta3rc13_1850.ne30_oECv3_ICG.edison/0331-01-01/'
        wget failed with output:  and errput Warning: wildcards not supported in HTTP.
        --2018-06-29 14:11:00--  https://web.lcrc.anl.gov/public/e3sm/inputdata/e3sm_init/20171228.beta3rc13_1850.ne30_oECv3_ICG.edison/0331-01-01/*
        Resolving web.lcrc.anl.gov (web.lcrc.anl.gov)... 140.221.74.23
        Connecting to web.lcrc.anl.gov (web.lcrc.anl.gov)|140.221.74.23|:443... connected.
        HTTP request sent, awaiting response... 404 Not Found
        2018-06-29 14:11:00 ERROR 404: Not Found.
```

The test I was using: `SMS_Ld2.ne30_oECv3_ICG.A_WCYCL1850S_CMIP6.cori-knl_intel.allactive-v1cmip6`


Discussion:
The wget interface should recognize the path ends with a wildcard and use -r instead. 

Resolving patch:
diff --git a/scripts/lib/CIME/Servers/wget.py b/scripts/lib/CIME/Servers/wget.py
--- a/scripts/lib/CIME/Servers/wget.py
+++ b/scripts/lib/CIME/Servers/wget.py
@@ -46,7 +46,9 @@ def getfile(self, rel_path, full_path):
     def getdirectory(self, rel_path, full_path):
         full_url = os.path.join(self._server_loc, rel_path)
         stat, output, errput = \
-                run_cmd("wget  {} {} -P {}".format(self._args, full_url+os.sep+'*', full_path+os.sep))
+                run_cmd("wget  {} {} -r -N --no-directories ".format(self._args, full_url+os.sep), from_dir=full_path)
+        logger.debug(output)
+        logger.debug(errput)
         if (stat != 0):
             logging.warning("wget failed with output: {} and errput {}\n".format(output, errput))
             # wget puts an empty file if it fails.


Test patch:
Repository: ESMCI/cime

Issue:
Reorg of CIME  documentation content
Based on discussion during March 21 CIME telecon.

**Reorg part 2: advanced topics**

1.  Master config file

1.  All about compsets

1.  All about grids

1. Defining the machine
    machine, compiler ,batch

1. Controlling threads and processors
a.   How config_pes works.
b.   threading control
c.   layouts and load balancing.
d.   SMT.

1.  Porting CIME
list of steps
up to user if they put new config in main files or their cime/config


**Organize "USER Tools"** 
case tools
script tools
testing tools
misc tools

**XML Files**
add names of files
add another level of contents
move model-specific files to bottom.

Remove separate python Tools listing.  From the .py files in scripts/Tools

Index:  mostly a repeat of python module info.  Already available.  Improve?  Delete?


Discussion:

Resolving patch:
diff --git a/scripts/lib/CIME/XML/compilerblock.py b/scripts/lib/CIME/XML/compilerblock.py
--- a/scripts/lib/CIME/XML/compilerblock.py
+++ b/scripts/lib/CIME/XML/compilerblock.py
@@ -191,6 +191,7 @@ def _elem_to_setting(self, elem):
         append = self._db.name(elem) == "append" or (self._db.name(elem) == "base" and self._compiler and self._db.compiler != self._compiler)
         setting = ValueSetting(value_text, append,
                                conditions, set_up, tear_down, force_no_append=self._db.name(elem) == "base")
+
         return (setting, depends)
 
     def _add_elem_to_lists(self, name, elem, value_lists):
diff --git a/scripts/lib/CIME/case/case_run.py b/scripts/lib/CIME/case/case_run.py
--- a/scripts/lib/CIME/case/case_run.py
+++ b/scripts/lib/CIME/case/case_run.py
@@ -159,8 +159,6 @@ def _run_model_impl(case, lid, skip_pnl=False, da_cycle=0):
             # We failed and we're not restarting
             expect(False, "RUN FAIL: Command '{}' failed\nSee log file for details: {}".format(cmd, model_logfile))
 
-    logger.debug("{} MODEL EXECUTION HAS FINISHED".format(time.strftime("%Y-%m-%d %H:%M:%S")))
-
     logger.debug("{} POST_RUN_CHECK BEGINS HERE".format(time.strftime("%Y-%m-%d %H:%M:%S")))
     _post_run_check(case, lid)
     logger.debug("{} POST_RUN_CHECK HAS FINISHED".format(time.strftime("%Y-%m-%d %H:%M:%S")))


Test patch:
diff --git a/config/e3sm/tests.py b/config/e3sm/tests.py
--- a/config/e3sm/tests.py
+++ b/config/e3sm/tests.py
@@ -34,6 +34,7 @@
 
     "e3sm_atm_integration" : (None, None,
                               ("ERP_Ln9.ne4_ne4.FC5AV1C-L-AQUAP",
+                              ("SMS_Ld1.ne4_ne4.FC5AV1C-L-AQUAP","cam-clubb_only"),
                                ("PET_Ln5.ne4_ne4.FC5AV1C-L","allactive-mach-pet"),
                                "PEM_Ln5.ne4_ne4.FC5AV1C-L",
                                ("SMS_D_Ln5.ne4_ne4.FC5AV1C-L", "cam-cosplite_nhtfrq5"),
Repository: ESMCI/cime

Issue:
Warning message about config_compilers.xml version < 2.0 should be more clear
The current message is: 
ERROR: No longer supported
it should be more verbose
ERROR: config_compilers.xml version < 2.0 is no longer supported


Discussion:
Who is still trying to use 1.0?
The point is that the message was unnecessarily difficult to track down.

Resolving patch:
diff --git a/scripts/lib/CIME/XML/compilers.py b/scripts/lib/CIME/XML/compilers.py
--- a/scripts/lib/CIME/XML/compilers.py
+++ b/scripts/lib/CIME/XML/compilers.py
@@ -142,7 +142,7 @@ def get_value(self, name, attribute=None, resolved=True, subgroup=None):
 
     def write_macros_file(self, macros_file="Macros.make", output_format="make", xml=None):
         if self._version <= 1.0:
-            expect(False, "No longer supported")
+            expect(False, "config_compilers.xml version '{}' is no longer supported".format(self._version))
         else:
             if output_format == "make":
                 format_ = "Makefile"


Test patch:
Repository: ESMCI/cime

Issue:
Change DIN_LOC_ROOT_CLMFORC on cheyenne
We need to change DIN_LOC_ROOT_CLMFORC on cheyenne to /glade/p/cgd/tss/CTSM_datm_forcing_data


Discussion:

Resolving patch:
diff --git a/scripts/lib/CIME/case/case.py b/scripts/lib/CIME/case/case.py
--- a/scripts/lib/CIME/case/case.py
+++ b/scripts/lib/CIME/case/case.py
@@ -123,6 +123,7 @@ def __init__(self, case_root=None, read_only=True):
         self.spare_nodes = None
         self.tasks_per_numa = None
         self.cores_per_task = None
+        self.srun_binding = None
 
         # check if case has been configured and if so initialize derived
         if self.get_value("CASEROOT") is not None:
@@ -178,6 +179,8 @@ def initialize_derived_attributes(self):
 
         os.environ["OMP_NUM_THREADS"] = str(self.thread_count)
 
+        self.srun_binding = smt_factor*max_mpitasks_per_node / self.tasks_per_node
+
     # Define __enter__ and __exit__ so that we can use this as a context manager
     # and force a flush on exit.
     def __enter__(self):
@@ -1041,6 +1044,16 @@ def _create_caseroot_tools(self):
             else:
                 safe_copy(os.path.join(machines_dir, "syslog.noop"), os.path.join(casetools, "mach_syslog"))
 
+        # add archive_metadata to the CASEROOT but only for CESM
+        if get_model() == "cesm":
+            try:
+                exefile = os.path.join(toolsdir, "archive_metadata")
+                destfile = os.path.join(self._caseroot,os.path.basename(exefile))
+                os.symlink(exefile, destfile)
+            except Exception as e:
+                logger.warning("FAILED to set up exefiles: {}".format(str(e)))
+
+
     def _create_caseroot_sourcemods(self):
         components = self.get_compset_components()
         components.extend(['share', 'drv'])
diff --git a/scripts/lib/CIME/utils.py b/scripts/lib/CIME/utils.py
--- a/scripts/lib/CIME/utils.py
+++ b/scripts/lib/CIME/utils.py
@@ -1352,6 +1352,35 @@ def does_file_have_string(filepath, text):
     """
     return os.path.isfile(filepath) and text in open(filepath).read()
 
+
+def is_last_process_complete(filepath, expect_text, fail_text ):
+    """
+    Search the filepath in reverse order looking for expect_text
+    before finding fail_text.
+    """
+    complete = False
+    fh = open(filepath, 'r')
+    fb = fh.readlines()
+
+    rfb = ''.join(reversed(fb))
+
+    findex = re.search(fail_text, rfb)
+    if findex is None:
+        findex = 0
+    else:
+        findex = findex.start()
+
+    eindex = re.search(expect_text, rfb)
+    if eindex is None:
+        eindex = 0
+    else:
+        eindex = eindex.start()
+
+    if findex > eindex:
+        complete = True
+
+    return complete
+
 def transform_vars(text, case=None, subgroup=None, overrides=None, default=None):
     """
     Do the variable substitution for any variables that need transforms


Test patch:
Repository: ESMCI/cime

Issue:
accidentally setting NTASKS=0 is allowed, unrecoverable
I accidentaly set NTASKS=0 instead of ROOTPE=0, now I can't do anything with my case

./create_newcase --case C1 --compset X --res ne4_ne4
./xmlchange NTASKS=0
./xmlchange NTASKS=1
ERROR: totaltasks > 0 expected, totaltasks = 0
./xmlquery NTASKS
ERROR: totaltasks > 0 expected, totaltasks = 0
./case.setup
ERROR: totaltasks > 0 expected, totaltasks = 0




Discussion:

Resolving patch:
diff --git a/scripts/lib/CIME/XML/env_mach_pes.py b/scripts/lib/CIME/XML/env_mach_pes.py
--- a/scripts/lib/CIME/XML/env_mach_pes.py
+++ b/scripts/lib/CIME/XML/env_mach_pes.py
@@ -59,6 +59,9 @@ def set_value(self, vid, value, subgroup=None, ignore_type=False):
                 ninst = self.get_value("NINST_{}".format(comp))
                 expect(ninst == ninst_max,
                        "All components must have the same NINST value in multi_driver mode.  NINST_{}={} shoud be {}".format(comp,ninst,ninst_max))
+        if "NTASKS" in vid or "NTHRDS" in vid:
+            expect(value != 0, "Cannot set NTASKS or NTHRDS to 0")
+
 
         return EnvBase.set_value(self, vid, value, subgroup=subgroup, ignore_type=ignore_type)
 


Test patch:
Repository: ESMCI/cime

Issue:
BFAIL incorrectly generated if a test is missing files
If a test has both (a) a missing file in the baseline that is present in the test, and (b) a missing file in the test that is present in the baseline, this is currently reported as a BFAIL rather than a true failure.

I have a fix incoming.


Discussion:

Resolving patch:
diff --git a/scripts/lib/CIME/hist_utils.py b/scripts/lib/CIME/hist_utils.py
--- a/scripts/lib/CIME/hist_utils.py
+++ b/scripts/lib/CIME/hist_utils.py
@@ -10,9 +10,17 @@
 logger = logging.getLogger(__name__)
 
 BLESS_LOG_NAME = "bless_log"
+
 NO_COMPARE     = "had no compare counterpart"
 NO_ORIGINAL    = "had no original counterpart"
 DIFF_COMMENT   = "did NOT match"
+# COMPARISON_COMMENT_OPTIONS should include all of the above: these are any of the special
+# comment strings that describe the reason for a comparison failure
+COMPARISON_COMMENT_OPTIONS = set([NO_COMPARE,
+                                  NO_ORIGINAL,
+                                  DIFF_COMMENT])
+# Comments that indicate a true baseline comparison problem - not simply a BFAIL
+NON_BFAIL_COMMENT_OPTIONS = COMPARISON_COMMENT_OPTIONS - set([NO_COMPARE])
 
 def _iter_model_file_substrs(case):
     models = case.get_compset_components()
@@ -492,6 +500,8 @@ def get_ts_synopsis(comments):
     'DIFF'
     >>> get_ts_synopsis('stuff\n    File foo did NOT match bar with suffix baz\n    File foo had no compare counterpart in bar with suffix baz\nPass\n')
     'DIFF'
+    >>> get_ts_synopsis('File foo had no compare counterpart in bar with suffix baz\n File foo had no original counterpart in bar with suffix baz\n')
+    'DIFF'
     """
     if not comments:
         return ""
@@ -503,8 +513,9 @@ def get_ts_synopsis(comments):
         for line in comments.splitlines():
             if NO_COMPARE in line:
                 has_bfails = True
-            elif DIFF_COMMENT in line:
-                has_real_fails = True
+            for non_bfail_comment in NON_BFAIL_COMMENT_OPTIONS:
+                if non_bfail_comment in line:
+                    has_real_fails = True
 
         if has_real_fails:
             return "DIFF"


Test patch:
Repository: ESMCI/cime

Issue:
allow --debug option to propagate to queue dependent jobs
If you submit a case using "case.submit --debug" and DOUT_S=TRUE, it would be
helpful to propagate the debug argument to the case.st_archive call. Likewise,
if DOUT_L_MS=TRUE then the --debug argument should be applied to the case.lt_archive arg list.


Discussion:
I'm removing this from the cesm2 milestone, because other things seem higher priority. If others disagree, feel free to re-add it to that milestone.

Resolving patch:
diff --git a/scripts/lib/CIME/XML/env_batch.py b/scripts/lib/CIME/XML/env_batch.py
--- a/scripts/lib/CIME/XML/env_batch.py
+++ b/scripts/lib/CIME/XML/env_batch.py
@@ -4,7 +4,7 @@
 
 from CIME.XML.standard_module_setup import *
 from CIME.XML.env_base import EnvBase
-from CIME.utils import transform_vars, get_cime_root, convert_to_seconds, format_time, get_cime_config, get_batch_script_for_job
+from CIME.utils import transform_vars, get_cime_root, convert_to_seconds, format_time, get_cime_config, get_batch_script_for_job, get_logging_options
 
 from collections import OrderedDict
 import stat, re, math
@@ -546,8 +546,9 @@ def _build_run_args_str(self, job, no_batch, **run_args):
         """
         args = self._build_run_args(job, no_batch, **run_args)
         run_args_str = " ".join(param for _, param in args.values())
-        if run_args_str is None:
-            return ""
+        logging_options = get_logging_options()
+        if logging_options:
+            run_args_str += " {}".format(logging_options)
 
         batch_env_flag = self.get_value("batch_env", subgroup=None)
         if not batch_env_flag:


Test patch:
Repository: ESMCI/cime

Issue:
floating point mpiprocs when running ./case.setup with python3
I noticed that when running with python3, mpiprocs is set to be a float, i.e.,

$ python3 ./case.setup # will create the following in .case.run:
#PBS  -l select=5:ncpus=36:mpiprocs=36.0:ompthreads=1

$ python2 ./case.setup # will create the following .case.run:
#PBS  -l select=5:ncpus=36:mpiprocs=36:ompthreads=1

NOTE: You'll need to rm .case.run, in between ./case.setup executions to see the difference.

I haven't looked this into depth, but I bet it has to do with "true division" that comes with python3.


Discussion:

Resolving patch:
diff --git a/scripts/lib/CIME/XML/env_mach_pes.py b/scripts/lib/CIME/XML/env_mach_pes.py
--- a/scripts/lib/CIME/XML/env_mach_pes.py
+++ b/scripts/lib/CIME/XML/env_mach_pes.py
@@ -103,7 +103,7 @@ def get_total_tasks(self, comp_classes):
 
     def get_tasks_per_node(self, total_tasks, max_thread_count):
         expect(total_tasks > 0,"totaltasks > 0 expected, totaltasks = {}".format(total_tasks))
-        tasks_per_node = min(self.get_value("MAX_TASKS_PER_NODE")/ max_thread_count,
+        tasks_per_node = min(self.get_value("MAX_TASKS_PER_NODE")// max_thread_count,
                              self.get_value("MAX_MPITASKS_PER_NODE"), total_tasks)
         return tasks_per_node if tasks_per_node > 0 else 1
 


Test patch:
Repository: ESMCI/cime

Issue:
floating point mpiprocs when running ./case.setup with python3
I noticed that when running with python3, mpiprocs is set to be a float, i.e.,

$ python3 ./case.setup # will create the following in .case.run:
#PBS  -l select=5:ncpus=36:mpiprocs=36.0:ompthreads=1

$ python2 ./case.setup # will create the following .case.run:
#PBS  -l select=5:ncpus=36:mpiprocs=36:ompthreads=1

NOTE: You'll need to rm .case.run, in between ./case.setup executions to see the difference.

I haven't looked this into depth, but I bet it has to do with "true division" that comes with python3.


Discussion:

Resolving patch:
diff --git a/scripts/lib/CIME/XML/env_mach_pes.py b/scripts/lib/CIME/XML/env_mach_pes.py
--- a/scripts/lib/CIME/XML/env_mach_pes.py
+++ b/scripts/lib/CIME/XML/env_mach_pes.py
@@ -94,7 +94,7 @@ def get_total_tasks(self, comp_classes):
 
     def get_tasks_per_node(self, total_tasks, max_thread_count):
         expect(total_tasks > 0,"totaltasks > 0 expected, totaltasks = {}".format(total_tasks))
-        tasks_per_node = min(self.get_value("MAX_TASKS_PER_NODE")/ max_thread_count,
+        tasks_per_node = min(self.get_value("MAX_TASKS_PER_NODE")// max_thread_count,
                              self.get_value("MAX_MPITASKS_PER_NODE"), total_tasks)
         return tasks_per_node if tasks_per_node > 0 else 1
 


Test patch:
Repository: ESMCI/cime

Issue:
xmlchange MPI_RUN_COMMAND does not properly insert ${EXEROOT}
This a buglet against the version of CIME that is in E3SM master.

There are times when it is necessary to override the mpirun command on a per case basis. For example, use the Intel VTune profiler to gather performance data on a workload. In such instances, you need to modify the mpirun command with extra long arguments. For example:
```
./xmlchange MPI_RUN_COMMAND='mpirun -n 16 -gtool "amplxe-cl -collect hpc-performance -knob sampling-interval=10 -knob enable-stack-collection=true -knob collect-memory-band
width=false -knob analyze-openmp=true -r nstep20:0"' 
```
However, this does not properly substitute the value of `${EXEROOT}` into the submission script. The result shown by `preview_run` is:
```
MPIRUN:
  mpirun -n 16 -gtool "amplxe-cl -collect hpc-performance -knob sampling-interval=10 -knob enable-stack-collection=true -knob collect-memory-bandwidth=false -knob analyze-openmp=true -r nstep20:0" ${EXEROOT}/e3sm.exe   >> e3sm.log.$LID 2>&1 
```
The workaround that @amametjanov came up with is to edit the env_mach_specific.xml to change run_exe from `${EXEROOT}/e3sm.exe` to `$SHELL{./xmlquery EXEROOT --value}/e3sm.exe` 




Discussion:

Resolving patch:
diff --git a/scripts/lib/CIME/case/case.py b/scripts/lib/CIME/case/case.py
--- a/scripts/lib/CIME/case/case.py
+++ b/scripts/lib/CIME/case/case.py
@@ -1257,7 +1257,7 @@ def get_mpirun_cmd(self, job=None, allow_unresolved_envvars=True):
 
         mpirun_cmd_override = self.get_value("MPI_RUN_COMMAND")
         if mpirun_cmd_override not in ["", None, "UNSET"]:
-            return mpirun_cmd_override + " " + run_exe + " " + run_misc_suffix
+            return self.get_resolved_value(mpirun_cmd_override + " " + run_exe + " " + run_misc_suffix)
 
         # Things that will have to be matched against mpirun element attributes
         mpi_attribs = {


Test patch:
Repository: ESMCI/cime

Issue:
create_newcase and trailing '/' on case name
Hi all,

  This came up during some testing the other day - apparently creating a case with a trailing slash works fine (during create_newcase), but running a ./case.build on the created case will fail with the error:

ERROR: No default value found for case_name.

  Example:
create_newcase --case /home/foo/testcase_fails/ --compset B1850
...
./case.setup
...
./case.build
...
ERROR: No default value found for case_name._

  Is it worth adding a check to create_newcase for trailing slashes? 

  Thanks,
  - Brian


Discussion:

Resolving patch:
diff --git a/scripts/lib/CIME/utils.py b/scripts/lib/CIME/utils.py
--- a/scripts/lib/CIME/utils.py
+++ b/scripts/lib/CIME/utils.py
@@ -151,11 +151,15 @@ def check_name(fullname, additional_chars=None, fullpath=False):
     False
     >>> check_name("mycase*mods")
     False
+    >>> check_name("/some/full/path/name/")
+    False
     """
 
     chars = '+*?<>/{}[\]~`@:' # pylint: disable=anomalous-backslash-in-string
     if additional_chars is not None:
         chars += additional_chars
+    if fullname.endswith('/'):
+        return False
     if fullpath:
         _, name = os.path.split(fullname)
     else:


Test patch:
Repository: ESMCI/cime

Issue:
create_newcase and trailing '/' on case name
Hi all,

  This came up during some testing the other day - apparently creating a case with a trailing slash works fine (during create_newcase), but running a ./case.build on the created case will fail with the error:

ERROR: No default value found for case_name.

  Example:
create_newcase --case /home/foo/testcase_fails/ --compset B1850
...
./case.setup
...
./case.build
...
ERROR: No default value found for case_name._

  Is it worth adding a check to create_newcase for trailing slashes? 

  Thanks,
  - Brian


Discussion:

Resolving patch:
diff --git a/scripts/lib/CIME/utils.py b/scripts/lib/CIME/utils.py
--- a/scripts/lib/CIME/utils.py
+++ b/scripts/lib/CIME/utils.py
@@ -158,11 +158,15 @@ def check_name(fullname, additional_chars=None, fullpath=False):
     False
     >>> check_name("mycase*mods")
     False
+    >>> check_name("/some/full/path/name/")
+    False
     """
 
     chars = '+*?<>/{}[\]~`@:' # pylint: disable=anomalous-backslash-in-string
     if additional_chars is not None:
         chars += additional_chars
+    if fullname.endswith('/'):
+        return False
     if fullpath:
         _, name = os.path.split(fullname)
     else:


Test patch: