]> TLD Linux GIT Repositories - tld-ftp-admin.git/blob - bin/pfa-mvpkg
- non-integer releases are ok in TLD
[tld-ftp-admin.git] / bin / pfa-mvpkg
1 #!/usr/bin/env python3
2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
4 from __future__ import print_function
5
6 import sys, os
7 sys.path.insert(0, os.environ['HOME']+'/tld-ftp-admin/modules')
8 import ftptree
9 from common import checkdir
10 import ftpio
11 from mailer import Message
12 from config import archived_trees, logs_list
13
14 os.umask(0o022)
15
16 nocheckbuild = False
17 if len(sys.argv) > 4 and sys.argv[1] == '-nb':
18     nocheckbuild = True
19     sys.argv = sys.argv[1:]
20
21 if len(sys.argv) < 4:
22     print("ERR: not enough parameters given", file=sys.stderr)
23     print("move.py [options] src-tree dst-tree package [package2 package3 ...]", file=sys.stderr)
24     print("\nOptions:", file=sys.stderr)
25     print("      -nb    Do not check if builds are finished.\n", file=sys.stderr)
26     sys.exit(1)
27
28 checkdir(sys.argv[1])
29 checkdir(sys.argv[2])
30
31 if sys.argv[2] in archived_trees:
32     archivetreename = ".archive/" + sys.argv[2]
33     checkdir(archivetreename)
34 else:
35     archivetreename = None
36
37 ftpio.connect('move')
38
39 if not ftpio.lock(sys.argv[1], True):
40     print("ERR: %s tree already locked" % sys.argv[1], file=sys.stderr)
41     sys.exit(1)
42
43 if not ftpio.lock(sys.argv[2], True):
44     ftpio.unlock(sys.argv[1])
45     print("ERR: %s tree already locked" % sys.argv[2], file=sys.stderr)
46     sys.exit(1)
47
48 if archivetreename != None and archivetreename != sys.argv[1] and not ftpio.lock(archivetreename, True):
49     ftpio.unlock(sys.argv[2])
50     ftpio.unlock(sys.argv[1])
51     print("ERR: %s tree already locked" % archivetreename, file=sys.stderr)
52     sys.exit(1)
53
54 try:
55     srctree = ftptree.FtpTree(sys.argv[1], loadall = True)
56     dsttree = ftptree.FtpTree(sys.argv[2])
57     if archivetreename != None:
58         archivetree = ftptree.FtpTree(archivetreename)
59     else:
60         archivetree = None
61     if nocheckbuild:
62         srctree.do_checkbuild = False
63     pkgs = list(set(sys.argv[3:]))
64     srctree.mark4moving(pkgs)
65
66     srctree.movepkgs(dsttree, archivetree = archivetree)
67 except ftptree.SomeError:
68     # In case of problems we need to unlock the trees before exiting
69     ftpio.unlock(sys.argv[1])
70     ftpio.unlock(sys.argv[2])
71     if archivetreename != None:
72         ftpio.unlock(archivetreename)
73     sys.exit(1)
74
75 ftpio.unlock(sys.argv[1])
76 ftpio.unlock(sys.argv[2])
77 if archivetreename != None and archivetreename != sys.argv[1]:
78     ftpio.unlock(archivetreename)
79
80 if logs_list == None:
81     sys.exit(0)
82
83 print('Sending mail notification to %s...' % logs_list)
84
85 pkgs = {}
86
87 for pkg in srctree.marked4moving:
88     requesters = []
89     for bid in pkg.build.keys():
90         if pkg.build[bid].requester not in requesters:
91             requesters.append(pkg.build[bid].requester)
92     pkgs[pkg.nvr] = requesters
93
94 ftpadmin = "(unknown)"
95 try:
96     ftpadmin = os.environ['FTPADM']
97 except KeyError as e:
98     pass
99 m = Message()
100 m.set_headers(
101         to = logs_list,
102         subject = 'MOVED: %s => %s... %d packages' % (sys.argv[1], sys.argv[2], len(pkgs))
103 )
104
105 m.write(
106     (
107         'FTP admin %(ftpadmin)s moved from *%(srctree)s* to *%(dsttree)s* %(count)d packages\n\n' +
108         '---- Package name ---- Package built by:\n\n'
109     ) % {
110         'ftpadmin' : ftpadmin,
111         'srctree' : sys.argv[1],
112         'dsttree' : sys.argv[2],
113         'count' : len(pkgs),
114     }
115 )
116
117 for nvr in sorted(pkgs.keys()):
118     m.write_line('%s ---- %s' % (nvr, ', '.join(pkgs[nvr])))
119
120 m.send()
121
122 print('done.')