1 # Copyright (C) 2007, Thomas Leonard
2 # See the README file for details, or visit http://0install.net.
4 import os
, subprocess
, shutil
5 from zeroinstall
import SafeException
6 from zeroinstall
.injector
import model
7 from logging
import info
9 def check_call(*args
, **kwargs
):
10 exitstatus
= subprocess
.call(*args
, **kwargs
)
12 raise SafeException("Command %s failed with exit code %d" % (' '.join(args
), exitstatus
))
14 def show_and_run(cmd
, args
):
15 print "Executing: %s %s" % (cmd
, ' '.join("[%s]" % x
for x
in args
))
16 check_call(['sh', '-c', cmd
, '-'] + args
)
18 def suggest_release_version(snapshot_version
):
19 """Given a snapshot version, suggest a suitable release version.
20 >>> suggest_release_version('1.0-pre')
22 >>> suggest_release_version('0.9-post')
24 >>> suggest_release_version('3')
25 Traceback (most recent call last):
27 SafeException: Version '3' is not a snapshot version (should end in -pre or -post)
29 version
= model
.parse_version(snapshot_version
)
32 raise SafeException("Version '%s' is not a snapshot version (should end in -pre or -post)" % snapshot_version
)
34 # -post, so increment the number
36 version
[-1] = 0 # Remove the modifier
37 return model
.format_version(version
)
39 def publish(iface
, **kwargs
):
40 args
= [os
.environ
['0PUBLISH']]
44 args
+= ['--' + k
.replace('_', '-')]
45 elif value
is not None:
46 args
+= ['--' + k
.replace('_', '-'), value
]
48 info("Executing %s", args
)
51 def get_singleton_impl(iface
):
52 impls
= iface
.implementations
54 raise SafeException("Local feed '%s' contains %d versions! I need exactly one!" % (iface
.uri
, len(impls
)))
55 return impls
.values()[0]
57 def backup_if_exists(name
):
58 if not os
.path
.exists(name
):
61 if os
.path
.exists(backup
):
62 print "(deleting old backup %s)" % backup
63 if os
.path
.isdir(backup
):
67 os
.rename(name
, backup
)
68 print "(renamed old %s as %s; will delete on next run)" % (name
, backup
)
70 def get_choice(*options
):
72 choice
= raw_input('/'.join(options
) + ': ').lower()
73 if not choice
: continue
75 if o
.lower().startswith(choice
):
79 __slots__
= ['old_snapshot_version', 'release_version', 'head_before_release', 'new_snapshot_version', 'head_at_release', 'created_archive', 'tagged']
81 for name
in self
.__slots
__:
82 setattr(self
, name
, None)
84 if os
.path
.isfile(release_status_file
):
85 for line
in file(release_status_file
):
86 assert line
.endswith('\n')
88 name
, value
= line
.split('=')
89 setattr(self
, name
, value
)
90 info("Loaded status %s=%s", name
, value
)
93 tmp_name
= release_status_file
+ '.new'
94 tmp
= file(tmp_name
, 'w')
96 lines
= ["%s=%s\n" % (name
, getattr(self
, name
)) for name
in self
.__slots
__ if getattr(self
, name
)]
97 tmp
.write(''.join(lines
))
99 os
.rename(tmp_name
, release_status_file
)
100 info("Wrote status to %s", release_status_file
)