File: rename_version.py

package info (click to toggle)
drslib 0.3.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,596 kB
  • sloc: python: 6,119; xml: 988; makefile: 128; sh: 121
file content (129 lines) | stat: -rwxr-xr-x 5,875 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env python
"""
Rename a DRS version to another version number.

This operation is unsafe as it will affect the contents of a version,
however it is necessary to fix certain inconcistencies at BADC
therefore is included here for convenience.

Usage: rename_version.py <drs_root> <dataset-id> oldversion newversion

"""

import sys
import os
import os.path as op
from glob import glob
import shutil

from drslib.drs_command import main as drstool_main
from drslib.drs import DRS, path_to_drs, drs_to_path

def main(argv=sys.argv):

    #drs_root, dataset_id, old_version, new_version = argv[1:]
    #old_version = int(old_version)
    #new_version = int(new_version)

    drs_root, = argv[1:]
    for dataset_id, (old_version, new_version) in fixes:
        fix_dataset(drs_root, dataset_id, old_version, new_version)

def fix_dataset(drs_root, dataset_id, old_version, new_version):

    drs = DRS.from_dataset_id(dataset_id)
    dataset_dir = drs_to_path(drs_root, drs)

    # First run drs_tool fix what we can
    drstool_main(['drs_tool', 'fix', '-R', drs_root, dataset_id])

    # Report the status
    drstool_main(['drs_tool', 'list', '-R', drs_root, dataset_id])

    if old_version:
        if new_version:
            # Remove the destination version
            new_version_dir = op.join(dataset_dir, 'v%d' % new_version)
            if op.exists(new_version_dir):
                _safe_rmtree(new_version_dir)

            # Now rename all file/*_<version>
            rename_files(dataset_dir, old_version, new_version)

        # Remove the version directory of the old version
        old_version_dir = op.join(dataset_dir, 'v%d' % old_version)
        if op.exists(old_version_dir):
            _safe_rmtree(old_version_dir)

        # Now you must run drs_tool
        drstool_main(['drs_tool', 'fix', '-R', drs_root, dataset_id])

        # Report the status
        drstool_main(['drs_tool', 'list', '-R', drs_root, dataset_id])
    


def _safe_rmtree(directory):
    for dirpath, dirnames, filenames in os.walk(directory):
        for filename in filenames:
            fpath = op.join(dirpath, filename)
            if fpath[0] == '.':
                continue
            if not op.islink(fpath):
                raise RuntimeError("Directory %s is not empty" % fpath)

    shutil.rmtree(directory)

def rename_files(dataset_dir, old_version, new_version):
    for fpath in glob(op.join(dataset_dir, 'files', '*_%d' % old_version)):
        fpath_prefix, fpath_version = fpath.split('_')
        assert int(fpath_version) == old_version

        new_fpath = '%s_%d' % (fpath_prefix, new_version)

        print '%s --> %s' % (fpath, new_fpath)
        os.rename(fpath, new_fpath)

fixes = [
    ('cmip5.output1.MOHC.HadGEM2-A.amip.3hr.atmos.cf3hr.r1i1p1', (None, None)),
    ('cmip5.output1.MOHC.HadGEM2-A.amip.mon.atmos.cfOff.r1i1p1', (20111015, 20111017)),
    ('cmip5.output1.MOHC.HadGEM2-CC.piControl.day.atmos.day.r1i1p1', (20111109, 20111115)),
    ('cmip5.output1.MOHC.HadGEM2-CC.piControl.day.land.day.r1i1p1', (20111109, 20111115)),
    ('cmip5.output1.MOHC.HadGEM2-CC.piControl.day.landIce.day.r1i1p1', (20111109, 20111115)),
    ('cmip5.output1.MOHC.HadGEM2-CC.piControl.day.ocean.day.r1i1p1', (20111109, 20111115)),
    ('cmip5.output1.MOHC.HadGEM2-CC.rcp85.mon.ocnBgchem.Omon.r2i1p1', (20111120, 20111121)), # !
    ('cmip5.output1.MOHC.HadGEM2-ES.abrupt4xCO2.day.atmos.day.r2i1p1', (20111209, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.abrupt4xCO2.day.ocean.day.r2i1p1', (20111209, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.abrupt4xCO2.mon.aerosol.aero.r2i1p1', (20111209, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.abrupt4xCO2.mon.atmos.Amon.r2i1p1', (20111209, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.abrupt4xCO2.mon.landIce.LImon.r2i1p1', (20111209, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.abrupt4xCO2.mon.land.Lmon.r2i1p1', (20111209, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.abrupt4xCO2.mon.ocean.Omon.r2i1p1', (20111209, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.abrupt4xCO2.mon.ocnBgchem.Omon.r2i1p1', (20111209, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.abrupt4xCO2.mon.seaIce.OImon.r2i1p1', (20111209, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.historical.day.land.day.r1i1p1', (20110131, 20111212)),
    ('cmip5.output1.MOHC.HadGEM2-ES.historical.day.seaIce.day.r1i1p1', (20110217, 20111214)),
    ('cmip5.output1.MOHC.HadGEM2-ES.piControl.day.land.day.r1i1p1', (20110202, 20111212)), # !
    ('cmip5.output1.MOHC.HadGEM2-ES.piControl.mon.aerosol.aero.r1i1p1', (20110524, 20111216)),
    #!CHECKME -- to orphaned versions
    ('cmip5.output1.MOHC.HadGEM2-ES.piControl.mon.ocnBgchem.Omon.r1i1p1', (20110928, 20111222)),
    ('cmip5.output1.MOHC.HadGEM2-ES.piControl.mon.seaIce.OImon.r1i1p1', (20110928, 20111222)),
    ('cmip5.output1.MOHC.HadGEM2-ES.piControl.yr.ocnBgchem.Oyr.r1i1p1', (20110928, 20111222)),
    ('cmip5.output1.MOHC.HadGEM2-ES.rcp85.day.landIce.day.r1i1p1', (20110912, 20111212)),
    #!CHECKME -- latest version contains mixture of links and files
    ('cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.aerosol.aero.r1i1p1', (None, None)), # !
    #!CHECKME -- and this one
    ('cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.atmos.Amon.r1i1p1', (None, None)), # !
    ('cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.atmos.Amon.r3i1p1', (None, None)),
    ('cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.landIce.LImon.r1i1p1', (20111125, 20111215)), # !
    ('cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.land.Lmon.r1i1p1', (None, None)), # !
    ('cmip5.output2.MOHC.HadGEM2-ES.abrupt4xCO2.mon.ocean.Omon.r2i1p1', (20111209, 20111212)),
    ('cmip5.output2.MOHC.HadGEM2-ES.piControl.mon.ocean.Omon.r1i1p1', ( 20110920, 20111222)),
    ('cmip5.output2.MOHC.HadGEM2-ES.piControl.yr.ocnBgchem.Oyr.r1i1p1', (20110920, 20111222)),
]    


if __name__ == '__main__':
    main()